From 49c1e7837fcc496b1edc0aa93f6aeace622e6c5d Mon Sep 17 00:00:00 2001 From: Pickacat Date: Sun, 12 Mar 2017 18:04:44 +0800 Subject: [PATCH 001/552] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=EF=BC=8C=E8=BF=AD=E4=BB=A3?= =?UTF-8?q?=E5=99=A8=E8=BF=98=E6=B2=A1=E5=81=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/xiaol/study/ArrayList.java | 94 +++++++ .../src/com/xiaol/study/ArrayListTest.java | 82 ++++++ .../src/com/xiaol/study/BinaryTreeNode.java | 59 +++++ .../com/xiaol/study/BinaryTreeNodeTest.java | 82 ++++++ .../src/com/xiaol/study/Iterator.java | 12 + .../src/com/xiaol/study/LinkedList.java | 237 ++++++++++++++++++ .../src/com/xiaol/study/LinkedListTest.java | 131 ++++++++++ .../src/com/xiaol/study/List.java | 13 + .../src/com/xiaol/study/Queue.java | 41 +++ .../src/com/xiaol/study/QueueTest.java | 64 +++++ .../src/com/xiaol/study/Stack.java | 49 ++++ .../src/com/xiaol/study/StackTest.java | 68 +++++ 12 files changed, 932 insertions(+) create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/List.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Queue.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Stack.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java new file mode 100644 index 0000000000..53fec62e67 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java @@ -0,0 +1,94 @@ +package com.xiaol.study; + +/** + * @Description TODO + * @date 创建时间:2017年3月4日 下午11:03:26 + */ +public class ArrayList implements List { + + // 记录有多少元素 + private int size = 0; + + // 存放元素的数组 + private Object[] elementData = new Object[10]; + + // 添加元素 + public void add(Object o) { + checkSizeAndGrow(); + elementData[size++] = o; + } + + // 检查数组容量大小,不足就扩容 + private void checkSizeAndGrow() { + if (size >= elementData.length) { + Object[] oldData = elementData; + elementData = new Object[size * 2]; + System.arraycopy(oldData, 0, elementData, 0, size); + } + } + + // 在指定位置添加元素 + public void add(int index, Object o) { + checkIndex(index); + checkSizeAndGrow(); + // 把index位置的元素往后移一位 + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + // 检查插入元素的位置是否非法 + private void checkIndex(int index) { + if (index < 0 || index > size) { + throw new RuntimeException("参数非法"); + } + } + + // 获取指定位置元素 + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + // 移除指定位置元素 + public Object remove(int index) { + checkIndex(index); + Object returnVal = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return returnVal; + } + + // 获取ArrayList元素数量 + public int size() { + return size; + } + + // 获取迭代器 + public Iterator iterator() { + return new ArrayListIterator(); + } + + // 尽量实现迭代器 + private class ArrayListIterator implements Iterator { + + ArrayList list = null; + + @Override + public boolean hasNext() { + + return false; + } + + @Override + public Object next() { + return null; + } + + public Object remove() { + return null; + } + + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java new file mode 100644 index 0000000000..fc54a78e47 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java @@ -0,0 +1,82 @@ +package com.xiaol.study; + +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ArrayListTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddObject() { + ArrayList list = new ArrayList(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + list.add("e"); + list.add("f"); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + assertEquals(12, list.size()); + } + + @Test + public void testAddIntObject() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(0, 3); + assertEquals(3, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(2, list.get(2)); + assertEquals(3, list.size()); + } + + @Test + public void testGet() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(0, 3); + assertEquals(3, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(2, list.get(2)); + assertEquals(3, list.size()); + } + + @Test + public void testRemove() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(0, 3); + assertEquals(3, list.remove(0)); + assertEquals(1, list.remove(0)); + assertEquals(2, list.remove(0)); + assertEquals(0, list.size()); + } + + @Test + public void testSize() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(0, 3); + assertEquals(3, list.size()); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java new file mode 100644 index 0000000000..7572a945df --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java @@ -0,0 +1,59 @@ +package com.xiaol.study; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午12:57:18 + */ +public class BinaryTreeNode { + // 要求,左节点比父节点小,右节点比父节点大 + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode insert(Object o) { + // 当前没有数据就放入当前节点 + if (data == null) { + this.data = o; + } else if ((int) data >= (int) o) {// 放入左节点 + if (left == null) { + left = new BinaryTreeNode(); + left.setData(o); + } else { + left.insert(o); + } + } else if ((int) data < (int) o) {// 放入右节点 + if (right == null) { + right = new BinaryTreeNode(); + right.setData(o); + } else { + right.insert(o); + } + } + return this; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..7e028ac8a5 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java @@ -0,0 +1,82 @@ +package com.xiaol.study; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class BinaryTreeNodeTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testInsert() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + btn.insert(2); + btn.insert(0); + btn.insert(3); + assertEquals(0, btn.getLeft().getData()); + assertEquals(1, btn.getData()); + assertEquals(2, btn.getRight().getData()); + assertEquals(3, btn.getRight().getRight().getData()); + } + + @Test + public void testGetData() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + assertEquals(1, btn.getData()); + } + + @Test + public void testSetData() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.setData(1); + assertEquals(1, btn.getData()); + } + + @Test + public void testGetLeft() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + btn.insert(0); + assertEquals(0, btn.getLeft().getData()); + } + + @Test + public void testSetLeft() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + BinaryTreeNode left = new BinaryTreeNode(); + left.setData(2); + btn.setLeft(left); + assertEquals(2, btn.getLeft().getData()); + } + + @Test + public void testGetRight() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + btn.insert(2); + assertEquals(2, btn.getRight().getData()); + } + + @Test + public void testSetRight() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + BinaryTreeNode right = new BinaryTreeNode(); + right.setData(2); + btn.setRight(right); + assertEquals(2, btn.getRight().getData()); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java b/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java new file mode 100644 index 0000000000..3f9192d422 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java @@ -0,0 +1,12 @@ +package com.xiaol.study; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午1:12:05 + */ +public interface Iterator { + + public boolean hasNext(); + + public Object next(); +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java new file mode 100644 index 0000000000..d60ede59a1 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java @@ -0,0 +1,237 @@ +package com.xiaol.study; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午12:30:18 + */ +public class LinkedList implements List { + + // 头指针 + private Node head; + + // 最后一个节点 + private Node lastNode; + + // 链表长度 + private int size; + + // 添加元素到最后一个节点 + public void add(Object o) { + if (null == head) { + head = new Node(o); + head.next = null; + lastNode = head; + size++; + } else { + lastNode.next = new Node(o); + lastNode = getLastNode(); + size++; + } + } + + // 获取最后一个节点 + private Node getLastNode() { + Node last = head; + while (last.next != null) { + last = last.next; + } + return last; + } + + // 获取指定位置的Node + private Node getIndexNode(int index) { + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node; + } + + // 添加元素到指定位置 + public void add(int index, Object o) { + checkIndex(index); + if (index == 0) { + // 将head暂存为headNext + Node headNext = head; + // 创建新的head + Node newHead = new Node(o); + head = newHead; + head.next = headNext; + } else { + // 获取第index-1个位置的Node + Node node = getIndexNode(index - 1); + // 暂存index位置的Node + Node nodeNext = node.next; + // 向index位置插入数据 + node.next = new Node(o); + node.next.next = nodeNext; + } + size++; + } + + // 获取指定位置元素 + public Object get(int index) { + checkIndex(index); + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + private void checkIndex(int index) { + if (index < 0 || index > size) { + throw new RuntimeException("非法参数"); + } + } + + // 移除指定位置元素 + public Object remove(int index) { + checkIndex(index); + Object data = null; + if (index == 0) { + // 新的head + Node newHead = head.next; + // 获取移除元素 + data = head.data; + // 将newHead设为head + head = newHead; + } else { + // 获取第index-1个位置的Node + Node node = getIndexNode(index - 1); + // 获取返回的元素 + data = node.next.data; + // 将index位置从链表删除 + node.next = node.next.next; + } + size--; + return data; + } + + // 获取链表长度 + public int size() { + return size; + } + + // 添加元素到第一个节点 + public void addFirst(Object o) { + add(0, o); + } + + public void addLast(Object o) { + Node lastNode = getLastNode(); + lastNode.next = new Node(o); + size++; + } + + // 移除第一个元素 + public Object removeFirst() { + return remove(0); + } + + // 移除最后一个元素 + public Object removeLast() { + Node lastNode = getLastNode(); + Object data = lastNode.data; + lastNode = null; + size--; + return data; + } + + public Iterator iterator() { + return null; + } + + // 用于存储数据的节点 + private static class Node { + Object data; + Node next; + + // 无参构造 + private Node() { + + } + + // 有参构造 + private Node(Object o) { + this.data = o; + } + } + + //---------------下面的方法暂时先不实现 + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java new file mode 100644 index 0000000000..f6399c1a1a --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java @@ -0,0 +1,131 @@ +package com.xiaol.study; + +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class LinkedListTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddObject() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(3, ll.get(2)); + } + + @Test + public void testAddIntObject() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(3, 0); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(3, ll.get(2)); + assertEquals(0, ll.get(3)); + assertEquals(4, ll.size()); + } + + @Test + public void testGet() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(3, 0); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(3, ll.get(2)); + assertEquals(0, ll.get(3)); + assertEquals(4, ll.size()); + } + + @Test + public void testRemove() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(0, 0); + ll.remove(0); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(3, ll.get(2)); + } + + @Test + public void testSize() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(0, 0); + assertEquals(4, ll.size()); + } + + @Test + public void testAddFirst() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.addFirst(001); + ll.addFirst(002); + assertEquals(002, ll.get(0)); + assertEquals(001, ll.get(1)); + assertEquals(1, ll.get(2)); + assertEquals(2, ll.get(3)); + } + + @Test + public void testAddLast() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.addLast(001); + ll.addLast(002); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(001, ll.get(2)); + assertEquals(002, ll.get(3)); + } + + @Test + public void testRemoveFirst() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.removeFirst(); + ll.removeFirst(); + assertEquals(3, ll.get(0)); + assertEquals(1, ll.size()); + } + + @Test + public void testRemoveLast() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.removeLast(); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(2, ll.size()); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/List.java b/group23/381519422/DataStructure/src/com/xiaol/study/List.java new file mode 100644 index 0000000000..870635c7bb --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/List.java @@ -0,0 +1,13 @@ +package com.xiaol.study; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java b/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java new file mode 100644 index 0000000000..6a18fe5c4e --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java @@ -0,0 +1,41 @@ +package com.xiaol.study; + +import java.util.LinkedList; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午12:51:34 + */ +public class Queue { + + // 队列 + private LinkedList elementData = new LinkedList(); + // 队列长度 + private int size; + + // 添加元素到队列尾 + public void enQueue(Object o) { + elementData.add(o); + size++; + } + + // 移除队列头的元素 + public Object deQueue() { + Object data = elementData.removeLast(); + size--; + return data; + } + + // 队列是否为空 + public boolean isEmpty() { + if (size == 0) { + return true; + } + return false; + } + + // 队列长度 + public int size() { + return size; + } +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java new file mode 100644 index 0000000000..a89e8840ce --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java @@ -0,0 +1,64 @@ +package com.xiaol.study; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class QueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEnQueue() { + Queue q = new Queue(); + assertEquals(0, q.size()); + q.enQueue(1); + q.enQueue(2); + assertEquals(2, q.size()); + } + + @Test + public void testDeQueue() { + Queue q = new Queue(); + assertEquals(0, q.size()); + q.enQueue(1); + q.enQueue(2); + assertEquals(2, q.size()); + q.deQueue(); + q.deQueue(); + assertEquals(0, q.size()); + } + + @Test + public void testIsEmpty() { + Queue q = new Queue(); + assertEquals(true, q.isEmpty()); + q.enQueue(1); + q.enQueue(2); + assertEquals(false, q.isEmpty()); + q.deQueue(); + q.deQueue(); + assertEquals(true, q.isEmpty()); + } + + @Test + public void testSize() { + Queue q = new Queue(); + assertEquals(0, q.size()); + q.enQueue(1); + q.enQueue(2); + assertEquals(2, q.size()); + q.deQueue(); + q.deQueue(); + assertEquals(0, q.size()); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java b/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java new file mode 100644 index 0000000000..6e1eaf2cf8 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java @@ -0,0 +1,49 @@ +package com.xiaol.study; + +import java.util.ArrayList; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午12:47:15 + */ +public class Stack { + // 存数据的List + private ArrayList elementData = new ArrayList(); + + // 栈元素数量 + private int size; + + // 压栈 + public void push(Object o) { + elementData.add(o); + size++; + } + + // 弹出栈顶元素 + public Object pop() { + if (size == 0) { + throw new RuntimeException("Stack is Empty"); + } + Object data = elementData.remove(size - 1); + size--; + return data; + } + + // 获取栈顶元素 + public Object peek() { + return elementData.get(size - 1); + } + + // 是否为空 + public boolean isEmpty() { + if (size == 0) { + return true; + } + return false; + } + + // 栈大小 + public int size() { + return size; + } +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java new file mode 100644 index 0000000000..90eae7470d --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java @@ -0,0 +1,68 @@ +package com.xiaol.study; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class StackTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPush() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + assertEquals(3, s.size()); + } + + @Test + public void testPop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + assertEquals(3, s.pop()); + assertEquals(2, s.pop()); + assertEquals(1, s.pop()); + assertEquals(0, s.size()); + } + + @Test + public void testPeek() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + assertEquals(3, s.peek()); + } + + @Test + public void testIsEmpty() { + Stack s = new Stack(); + assertEquals(true, s.isEmpty()); + s.push(1); + s.push(2); + s.push(3); + assertEquals(false, s.isEmpty()); + } + + @Test + public void testSize() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + assertEquals(3, s.size()); + } + +} From b3f08719cb9f97d20fa922dffe14816c0c7aa4ef Mon Sep 17 00:00:00 2001 From: tanghaojie Date: Wed, 15 Mar 2017 21:06:48 +0800 Subject: [PATCH 002/552] week3 --- .../Code/src/week3/DownloadThread.java | 20 ++++++ .../Code/src/week3/FileDownloader.java | 72 +++++++++++++++++++ .../Code/src/week3/FileDownloaderTest.java | 61 ++++++++++++++++ .../Code/src/week3/api/Connection.java | 23 ++++++ .../src/week3/api/ConnectionException.java | 5 ++ .../Code/src/week3/api/ConnectionManager.java | 10 +++ .../Code/src/week3/api/DownloadListener.java | 5 ++ .../Code/src/week3/impl/ConnectionImpl.java | 26 +++++++ .../src/week3/impl/ConnectionManagerImpl.java | 18 +++++ 9 files changed, 240 insertions(+) create mode 100644 group12/495473393/Code/src/week3/DownloadThread.java create mode 100644 group12/495473393/Code/src/week3/FileDownloader.java create mode 100644 group12/495473393/Code/src/week3/FileDownloaderTest.java create mode 100644 group12/495473393/Code/src/week3/api/Connection.java create mode 100644 group12/495473393/Code/src/week3/api/ConnectionException.java create mode 100644 group12/495473393/Code/src/week3/api/ConnectionManager.java create mode 100644 group12/495473393/Code/src/week3/api/DownloadListener.java create mode 100644 group12/495473393/Code/src/week3/impl/ConnectionImpl.java create mode 100644 group12/495473393/Code/src/week3/impl/ConnectionManagerImpl.java diff --git a/group12/495473393/Code/src/week3/DownloadThread.java b/group12/495473393/Code/src/week3/DownloadThread.java new file mode 100644 index 0000000000..53d7ed3101 --- /dev/null +++ b/group12/495473393/Code/src/week3/DownloadThread.java @@ -0,0 +1,20 @@ +package week3; + +import week3.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} diff --git a/group12/495473393/Code/src/week3/FileDownloader.java b/group12/495473393/Code/src/week3/FileDownloader.java new file mode 100644 index 0000000000..7a6b104245 --- /dev/null +++ b/group12/495473393/Code/src/week3/FileDownloader.java @@ -0,0 +1,72 @@ +package week3; + +import week3.api.Connection; +import week3.api.ConnectionException; +import week3.api.ConnectionManager; +import week3.api.DownloadListener; + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group12/495473393/Code/src/week3/FileDownloaderTest.java b/group12/495473393/Code/src/week3/FileDownloaderTest.java new file mode 100644 index 0000000000..b6ddb18069 --- /dev/null +++ b/group12/495473393/Code/src/week3/FileDownloaderTest.java @@ -0,0 +1,61 @@ +package week3; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import week3.api.ConnectionManager; +import week3.api.DownloadListener; +import week3.impl.ConnectionManagerImpl; + + + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group12/495473393/Code/src/week3/api/Connection.java b/group12/495473393/Code/src/week3/api/Connection.java new file mode 100644 index 0000000000..bba3230710 --- /dev/null +++ b/group12/495473393/Code/src/week3/api/Connection.java @@ -0,0 +1,23 @@ +package week3.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group12/495473393/Code/src/week3/api/ConnectionException.java b/group12/495473393/Code/src/week3/api/ConnectionException.java new file mode 100644 index 0000000000..e760e23ddb --- /dev/null +++ b/group12/495473393/Code/src/week3/api/ConnectionException.java @@ -0,0 +1,5 @@ +package week3.api; + +public class ConnectionException extends Exception { + +} diff --git a/group12/495473393/Code/src/week3/api/ConnectionManager.java b/group12/495473393/Code/src/week3/api/ConnectionManager.java new file mode 100644 index 0000000000..9b20c0177b --- /dev/null +++ b/group12/495473393/Code/src/week3/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package week3.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group12/495473393/Code/src/week3/api/DownloadListener.java b/group12/495473393/Code/src/week3/api/DownloadListener.java new file mode 100644 index 0000000000..da4eb7abc3 --- /dev/null +++ b/group12/495473393/Code/src/week3/api/DownloadListener.java @@ -0,0 +1,5 @@ +package week3.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group12/495473393/Code/src/week3/impl/ConnectionImpl.java b/group12/495473393/Code/src/week3/impl/ConnectionImpl.java new file mode 100644 index 0000000000..e354f10029 --- /dev/null +++ b/group12/495473393/Code/src/week3/impl/ConnectionImpl.java @@ -0,0 +1,26 @@ +package week3.impl; + +import java.io.IOException; +import week3.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/group12/495473393/Code/src/week3/impl/ConnectionManagerImpl.java b/group12/495473393/Code/src/week3/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..d58a2b600d --- /dev/null +++ b/group12/495473393/Code/src/week3/impl/ConnectionManagerImpl.java @@ -0,0 +1,18 @@ +package week3.impl; + +import java.net.HttpURLConnection; +import java.net.URL; + +import week3.api.Connection; +import week3.api.ConnectionException; +import week3.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} From c5b690dc9e147e0cc771ed4f6785c597e6bf39aa Mon Sep 17 00:00:00 2001 From: Pickacat Date: Sun, 19 Mar 2017 18:54:38 +0800 Subject: [PATCH 003/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A0array=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group23/381519422/array/.classpath | 7 + group23/381519422/array/.gitignore | 1 + group23/381519422/array/.project | 17 + .../381519422/array/src/array/ArrayUtil.java | 354 ++++++++++++++++++ .../array/src/array/ArrayUtilTest.java | 116 ++++++ 5 files changed, 495 insertions(+) create mode 100644 group23/381519422/array/.classpath create mode 100644 group23/381519422/array/.gitignore create mode 100644 group23/381519422/array/.project create mode 100644 group23/381519422/array/src/array/ArrayUtil.java create mode 100644 group23/381519422/array/src/array/ArrayUtilTest.java diff --git a/group23/381519422/array/.classpath b/group23/381519422/array/.classpath new file mode 100644 index 0000000000..3e0fb272a8 --- /dev/null +++ b/group23/381519422/array/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/group23/381519422/array/.gitignore b/group23/381519422/array/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/group23/381519422/array/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/group23/381519422/array/.project b/group23/381519422/array/.project new file mode 100644 index 0000000000..ef3cae8954 --- /dev/null +++ b/group23/381519422/array/.project @@ -0,0 +1,17 @@ + + + array + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group23/381519422/array/src/array/ArrayUtil.java b/group23/381519422/array/src/array/ArrayUtil.java new file mode 100644 index 0000000000..cb1d3f49dc --- /dev/null +++ b/group23/381519422/array/src/array/ArrayUtil.java @@ -0,0 +1,354 @@ +package array; + +import java.util.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (origin == null || origin.length <= 1) { + return; + } + //第1和第length互换位置,第2和第length-1互换,以此类推 + for (int i = 0; i < origin.length / 2; i++) { + int temp = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray) { + // 判断非法输入 + if (oldArray == null || oldArray.length == 0) { + return null; + } + + // 创建临时数组,长度与原oldArray一样长 + int[] temp = new int[oldArray.length]; + int tempCount = 0; + for (int i = 0; i < oldArray.length; i++) { + // 判断元素是0跳过 + if (oldArray[i] == 0) { + continue; + } else {// 非零放入临时数组,计数器加1 + temp[tempCount++] = oldArray[i]; + } + } + + // 如果计数器与原数组长度一致,直接返回临时数组 + if (tempCount == oldArray.length) { + return temp; + } else {// 否则返回长度为tempCount的数组 + int[] retVal = new int[tempCount]; + System.arraycopy(temp, 0, retVal, 0, tempCount); + return retVal; + } + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + public int[] merge(int[] array1, int[] array2) { + // 创建临时数组,长度为array1+array2的长度 + int[] temp = new int[array1.length + array2.length]; + int index = 0;// temp的下标 + int i = 0;// array1的下标 + int j = 0;// array2的下标 + int count = 0;// temp存放元素的计数器 + + while (true) { + + if (i == array1.length) {// 当array1已经全部添加到temp,就把array2剩余的放入temp + for (int l = j; l < array2.length; l++) { + temp[index++] = array2[l]; + count++; + } + break; + } else if (j == array2.length) {// 当array2已经全部添加到temp,就把array1剩余的放入temp + for (int l = i; l < array1.length; l++) { + temp[index++] = array1[l]; + count++; + } + break; + } + + // 取array1第i和array2第j个元素比较。如果array1[i]的小于array2[j],则array1[i]放入temp + // 同时i++,使得下次为i+1和j个元素比较。 + // 如果array1第i和array2第j个元素相等。则array1[i]放入temp + // 同时i++,j++,使得下次为i+1和j+1个元素比较。 + if (array1[i] < array2[j]) { + temp[index++] = array1[i++]; + count++; + } else if (array1[i] > array2[j]) { + temp[index++] = array2[j++]; + count++; + } else { + temp[index++] = array1[i]; + i++; + j++; + count++; + } + } + + // 如果计数器和temp.length相等,直接返回 + if (count == temp.length) { + return temp; + } else {// 否则创建长度为count的新数组返回 + int[] retVal = new int[count]; + System.arraycopy(temp, 0, retVal, 0, count); + return retVal; + } + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + // 参数校验 + if (size < 0) { + throw new RuntimeException("非法参数"); + } + if (size == 0) { + return oldArray; + } + + // 扩容 + int[] retVal = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + retVal[i] = oldArray[i]; + } + return retVal; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max) { + // 0直接返回空数组 + if (max == 1) { + return new int[0]; + } + + int retVal = 0;// 每一轮循环的斐波那契数 + int i = 1;// 获取第几个斐波那契数 + ArrayList list = new ArrayList();// 用于暂时保存斐波那契数 + while (retVal < max) {// 获取所有小于max的斐波那契数 + retVal = getFibonacci(i++); + if (retVal < max) { + list.add(retVal); + } else { + break; + } + } + + // 将arraylist转为array + int[] retArray = new int[list.size()]; + for (int j = 0; j < list.size(); j++) { + retArray[j] = list.get(j); + } + return retArray; + } + + /** + * 循环获取第N个斐波那契数 + * @param index + * @return + */ + private int getFibonacci(int index) { + if (index < 1) { + throw new RuntimeException("非法参数"); + } + if (index == 1 || index == 2) { + return 1; + } + + int first = 1; + int second = 1; + int retVal = 0; + for (int i = 3; i <= index; i++) { + retVal = first + second; + first = second; + second = retVal; + } + return retVal; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) { + // 排除非法参数 + if (max < 0) { + throw new RuntimeException("非法参数"); + } + + // 小于2没有素数 + if (max <= 1) { + return new int[0]; + } + + ArrayList list = new ArrayList(); + // 取出每个数判断是不是素数,是就放入arraylist + for (int i = 2; i < max; i++) { + boolean primes = isPrimes(i); + if (primes) { + list.add(i); + } + } + + int[] retArray = new int[list.size()]; + // 将ArrayList转为数组返回 + for (int i = 0; i < list.size(); i++) { + retArray[i] = list.get(i); + } + return retArray; + } + + /** + * 判断输入的数字是不是素数 + * @param num + * @return + */ + private boolean isPrimes(int num) { + // 排除非法参数 + if (num <= 0) { + throw new RuntimeException("非法参数"); + } + + // 小于2没有素数 + if (num == 1) { + return false; + } + + // 2是素数,但是2%2==0为true,所以单独列出 + if (num == 2) { + return true; + } + + // num依次从2到num的平方根取余数,如果余数为零说明不是素数 + for (int i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if (max < 0) { + throw new RuntimeException("非法参数"); + } + if (max <= 2) { + return new int[0]; + } + + // 获取小于max 的所有完数 + ArrayList list = new ArrayList(); + for (int i = 1; i < max; i++) { + if (isPerfectNumber(i)) { + list.add(i); + } + } + + // 将ArrayList转为array返回 + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } + + /** + * 判断输入的数是不是完美数 + * @param num + * @return + */ + private boolean isPerfectNumber(int num) { + if (num <= 0) { + throw new RuntimeException("非法参数"); + } + + // 放置num的所有约数 + ArrayList divisorList = new ArrayList(); + for (int i = 1; i < num; i++) { + if (num % i == 0) { + divisorList.add(i); + } + } + + // 所有因数相加是否等于num,是就是完美数 + int count = 0; + for (int i = 0; i < divisorList.size(); i++) { + count += divisorList.get(i); + } + if (count == num) { + return true; + } else { + return false; + } + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + // 检查非法输入 + if (array == null) { + return null; + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + if (i == array.length - 1) {// 最后一个元素后面不拼接- + sb.append(array[i]); + } else { + sb.append(array[i]); + sb.append("-"); + } + } + return sb.toString(); + } + + +} \ No newline at end of file diff --git a/group23/381519422/array/src/array/ArrayUtilTest.java b/group23/381519422/array/src/array/ArrayUtilTest.java new file mode 100644 index 0000000000..a202afdb20 --- /dev/null +++ b/group23/381519422/array/src/array/ArrayUtilTest.java @@ -0,0 +1,116 @@ +package array; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverseArray() { + int[] a = { 7, 9, 30, 3, 4 }; + int[] expecteds = { 4, 3, 30, 9, 7 }; + ArrayUtil util = new ArrayUtil(); + util.reverseArray(a); + assertArrayEquals(expecteds, a); + } + + @Test + public void testRemoveZero() { + int[] oldArr = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; + int[] expecteds = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }; + ArrayUtil util = new ArrayUtil(); + int[] removeZero = util.removeZero(oldArr); + assertArrayEquals(expecteds, removeZero); + } + + @Test + public void testMerge() { + int[] a1 = { 3, 5, 7, 8 }; + int[] a2 = { 4, 5, 6, 7 }; + ArrayUtil util = new ArrayUtil(); + int[] merge = util.merge(a1, a2); + int[] expecteds = { 3, 4, 5, 6, 7, 8 }; + assertArrayEquals(expecteds, merge); + } + + @Test + public void testGrow() { + int[] oldArray = { 2, 3, 6 }; + int size = 3; + int[] expecteds = { 2, 3, 6, 0, 0, 0 }; + ArrayUtil util = new ArrayUtil(); + int[] grow = util.grow(oldArray, size); + assertArrayEquals(expecteds, grow); + } + + @Test + public void testFibonacci() { + int max1 = 15; + int[] expecteds1 = { 1, 1, 2, 3, 5, 8, 13 }; + ArrayUtil util = new ArrayUtil(); + int[] fibonacci1 = util.fibonacci(max1); + assertArrayEquals(expecteds1, fibonacci1); + + int max2 = 1; + int[] expecteds2 = {}; + int[] fibonacci2 = util.fibonacci(max2); + assertArrayEquals(expecteds2, fibonacci2); + } + + @Test + public void testGetPrimes() { + int max1 = 23; + int[] expecteds1 = { 2, 3, 5, 7, 11, 13, 17, 19 }; + ArrayUtil util = new ArrayUtil(); + int[] primes1 = util.getPrimes(max1); + assertArrayEquals(expecteds1, primes1); + + int max2 = 2; + int[] expecteds2 = {}; + int[] primes2 = util.getPrimes(max2); + assertArrayEquals(expecteds2, primes2); + } + + @Test + public void testGetPerfectNumbers() { + int max1 = 2; + int[] expecteds1 = {}; + ArrayUtil util = new ArrayUtil(); + int[] perfectNumbers1 = util.getPerfectNumbers(max1); + assertArrayEquals(expecteds1, perfectNumbers1); + + // 6=1+2+3 + int max2 = 7; + int[] expecteds2 = { 6 }; + int[] perfectNumbers2 = util.getPerfectNumbers(max2); + assertArrayEquals(expecteds2, perfectNumbers2); + + // 28=1+2+4+7+14 + int max3 = 30; + int[] expecteds3 = { 6, 28 }; + int[] perfectNumbers3 = util.getPerfectNumbers(max3); + assertArrayEquals(expecteds3, perfectNumbers3); + } + + @Test + public void testJoin() { + int[] array = { 3, 8, 9 }; + String seperator = "-"; + String expecteds = "3-8-9"; + ArrayUtil util = new ArrayUtil(); + String join = util.join(array, seperator); + assertEquals(expecteds, join); + } + +} From 35f923f1369b84b9ac4874750329e2c0677c5a80 Mon Sep 17 00:00:00 2001 From: Pickacat Date: Sun, 19 Mar 2017 23:48:02 +0800 Subject: [PATCH 004/552] =?UTF-8?q?=E5=AE=8C=E6=88=90struts=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E4=B8=94=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xiaol/study/LoginAction.java | 36 ++++ .../src/main/java/com/xiaol/study/Struts.java | 176 ++++++++++++++++++ .../main/java/com/xiaol/study/StrutsTest.java | 43 +++++ .../src/main/java/com/xiaol/study/View.java | 26 +++ .../litestruts/src/main/resources/struts.xml | 24 +++ 5 files changed, 305 insertions(+) create mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java create mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java create mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java create mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java create mode 100644 group23/381519422/litestruts/src/main/resources/struts.xml diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java new file mode 100644 index 0000000000..d31d404165 --- /dev/null +++ b/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java @@ -0,0 +1,36 @@ +package com.xiaol.study; + +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java new file mode 100644 index 0000000000..5adabb38ad --- /dev/null +++ b/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java @@ -0,0 +1,176 @@ +package com.xiaol.study; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.management.RuntimeErrorException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + + + +public class Struts { + + // 每一个action的信息存放到一个Map里 + // 所有的Map放到rootMap方便统一管理 + private static HashMap> rootMap = new HashMap>(); + + public static View runAction(String actionName, Map parameters) { + View view = new View(); + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + try { + // 1、初始化读取配置文件 + init(); + + // 2、获取根据参数获取对应的class的名字 + Map actionMap = rootMap.get(actionName); + String className = actionMap.get("class"); + // 3、根据名字获取Class对象 + Class clazzType = Class.forName(className); + // 4、通过无参构造获取一个对象 + Object newInstance = clazzType.getConstructor(new Class[] {}).newInstance(new Object[] {}); + // 5、调用set方法,把("name"="test" , "password"="1234")值set进去 + Set> entrySet = parameters.entrySet(); + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Entry next = iterator.next(); + String key = next.getKey(); + String value = next.getValue(); + String setMethodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + Field declaredField = clazzType.getDeclaredField(key); + Method setMehtod = clazzType.getDeclaredMethod(setMethodName, new Class[] { declaredField.getType() }); + setMehtod.invoke(newInstance, value); + } + // 6、执行execute方法 + String executeMethodName = "execute"; + Method executeMethod = clazzType.getDeclaredMethod(executeMethodName); + Object resultString = (String) executeMethod.invoke(newInstance); + + // 7、通过反射获取message信息 + String getMethodName = "getMessage"; + Field declaredField = clazzType.getDeclaredField("message"); + Method getMehtod = clazzType.getDeclaredMethod(getMethodName); + String message = (String) getMehtod.invoke(newInstance); + + // 8\ + String jsp = actionMap.get(resultString); + view.setJsp(jsp); + Map hashMap = new HashMap<>(); + hashMap.put("message", message); + view.setParameters(hashMap); + } catch (Exception e) { + e.printStackTrace(); + throw new ExceptionInInitializerError(); + } + return view; + } + + public static void init() throws Exception { + + // 1、获取工厂实例 + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + // 2、获取dom解析器 + DocumentBuilder db = dbf.newDocumentBuilder(); + // 3、解析xml文档,获取document对象(根节点) + // 也可以获取流使用db.parse(InputStream) + // InputStream is = + // this.getClass().getResourceAsStream("D:\\GitHub\\coding2017\\group23\\381519422\\litestruts\\src\\main\\resources\\struts.xml"); + Document document = db.parse( + new File("D:\\GitHub\\coding2017\\group23\\381519422\\litestruts\\src\\main\\resources\\struts.xml")); + NodeList list = document.getElementsByTagName("action"); + + /* + * 开始循环list,list中每一个元素结构如下 + * + /jsp/homepage.jsp + /jsp/showLogin.jsp + + */ + for (int i = 0; i < list.getLength(); i++) { + Map actionMap = new HashMap(); + // 注意:使用的都是org.w3c.dom包下的 + Element element = (Element) list.item(i); + // 获取中 name对应的属性值 + String actionAttributeName = element.getAttribute("name"); + String className = element.getAttribute("class"); + actionMap.put("class", className); + + // 读取第一个action + NamedNodeMap nnm = element.getElementsByTagName("result").item(0).getAttributes(); + // 获取的属性 name + // String nodeName = nnm.item(0).getNodeName(); + // element.getElementsByTagName("result").item(0) + // 是/jsp/homepage.jsp + // getFirstChild().getNodeValue() 是获取上面内容的/jsp/homepage.jsp + String context = element.getElementsByTagName("result").item(0).getTextContent(); + // 获取的属性 name对应的值success + String nodeValue = nnm.item(0).getNodeValue(); + actionMap.put(nodeValue, context); + + // 读取第二个action + nnm = element.getElementsByTagName("result").item(1).getAttributes(); + // 获取的属性 name + // nodeName = nnm.item(0).getNodeName(); + context = element.getElementsByTagName("result").item(1).getFirstChild().getNodeValue(); + // 获取的属性 name对应的值success + nodeValue = nnm.item(0).getNodeValue(); + actionMap.put(nodeValue, context); + + rootMap.put(actionAttributeName, actionMap); + } + } + + public static void main(String[] args) { + try { + init(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + // 内部类用于存放从配置文件读取的数据 + class StrutsMap { + private HashMap map; + + public String get(String key) { + return map.get(key); + } + + public void set(String key, String value) { + map.put(key, value); + } + } +} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java new file mode 100644 index 0000000000..53c1e7187c --- /dev/null +++ b/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java @@ -0,0 +1,43 @@ +package com.xiaol.study; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java new file mode 100644 index 0000000000..41999670b8 --- /dev/null +++ b/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java @@ -0,0 +1,26 @@ +package com.xiaol.study; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/381519422/litestruts/src/main/resources/struts.xml b/group23/381519422/litestruts/src/main/resources/struts.xml new file mode 100644 index 0000000000..32cf9d90c4 --- /dev/null +++ b/group23/381519422/litestruts/src/main/resources/struts.xml @@ -0,0 +1,24 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + + + + + + + + + + + + + + \ No newline at end of file From a1658ba81bd99aaeac4c62112e87163404b85f16 Mon Sep 17 00:00:00 2001 From: em14Vito Date: Wed, 22 Mar 2017 22:24:03 +0800 Subject: [PATCH 005/552] add homework3 demo --- .../DataStruct/LinkedList.java | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 group23/729693763/Third_Homework3/DataStruct/LinkedList.java diff --git a/group23/729693763/Third_Homework3/DataStruct/LinkedList.java b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java new file mode 100644 index 0000000000..09fe0a8ff3 --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java @@ -0,0 +1,122 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} From 39332434a49fb4b0a114a61ea7ee32d18f929152 Mon Sep 17 00:00:00 2001 From: em14Vito Date: Wed, 22 Mar 2017 22:24:37 +0800 Subject: [PATCH 006/552] add homework3 demo --- .../Third_Homework3/download/.classpath | 5 ++ .../Third_Homework3/download/.project | 17 +++++ .../download/DownloadThread.java | 20 +++++ .../download/FileDownloader.java | 73 +++++++++++++++++++ .../download/FileDownloaderTest.java | 59 +++++++++++++++ .../download/api/Connection.java | 23 ++++++ .../download/api/ConnectionException.java | 5 ++ .../download/api/ConnectionManager.java | 10 +++ .../download/api/DownloadListener.java | 5 ++ .../download/impl/ConnectionImpl.java | 27 +++++++ .../download/impl/ConnectionManagerImpl.java | 15 ++++ 11 files changed, 259 insertions(+) create mode 100644 group23/729693763/Third_Homework3/download/.classpath create mode 100644 group23/729693763/Third_Homework3/download/.project create mode 100644 group23/729693763/Third_Homework3/download/DownloadThread.java create mode 100644 group23/729693763/Third_Homework3/download/FileDownloader.java create mode 100644 group23/729693763/Third_Homework3/download/FileDownloaderTest.java create mode 100644 group23/729693763/Third_Homework3/download/api/Connection.java create mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionException.java create mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionManager.java create mode 100644 group23/729693763/Third_Homework3/download/api/DownloadListener.java create mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java create mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java diff --git a/group23/729693763/Third_Homework3/download/.classpath b/group23/729693763/Third_Homework3/download/.classpath new file mode 100644 index 0000000000..ac37fb2e4b --- /dev/null +++ b/group23/729693763/Third_Homework3/download/.classpath @@ -0,0 +1,5 @@ + + + + + diff --git a/group23/729693763/Third_Homework3/download/.project b/group23/729693763/Third_Homework3/download/.project new file mode 100644 index 0000000000..9360f320db --- /dev/null +++ b/group23/729693763/Third_Homework3/download/.project @@ -0,0 +1,17 @@ + + + download + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/group23/729693763/Third_Homework3/download/DownloadThread.java b/group23/729693763/Third_Homework3/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} diff --git a/group23/729693763/Third_Homework3/download/FileDownloader.java b/group23/729693763/Third_Homework3/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/group23/729693763/Third_Homework3/download/FileDownloader.java @@ -0,0 +1,73 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/729693763/Third_Homework3/download/api/Connection.java b/group23/729693763/Third_Homework3/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionException.java b/group23/729693763/Third_Homework3/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/729693763/Third_Homework3/download/api/DownloadListener.java b/group23/729693763/Third_Homework3/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.coderising.download.impl; + +import java.io.IOException; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coderising.download.impl; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} From 7f30f8eb9cda2ec124a44aeb9634381c3e5b1b59 Mon Sep 17 00:00:00 2001 From: em14Vito Date: Thu, 23 Mar 2017 12:35:52 +0800 Subject: [PATCH 007/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../download/DownloadThread.java | 37 +++++++- .../download/FileDownloader.java | 85 ++++++++++++------- .../download/FileDownloaderTest.java | 23 +++-- .../download/api/Connection.java | 4 +- .../download/api/ConnectionException.java | 2 +- .../download/api/ConnectionManager.java | 2 +- .../download/api/DownloadListener.java | 2 +- .../download/impl/ConnectionImpl.java | 69 +++++++++++++-- .../download/impl/ConnectionManagerImpl.java | 24 ++++-- 9 files changed, 182 insertions(+), 66 deletions(-) diff --git a/group23/729693763/Third_Homework3/download/DownloadThread.java b/group23/729693763/Third_Homework3/download/DownloadThread.java index 900a3ad358..3ab337e352 100644 --- a/group23/729693763/Third_Homework3/download/DownloadThread.java +++ b/group23/729693763/Third_Homework3/download/DownloadThread.java @@ -1,20 +1,49 @@ -package com.coderising.download; +package com.zhous.download; -import com.coderising.download.api.Connection; +import com.zhous.download.api.Connection; +import com.zhous.download.api.DownloadListener; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; public class DownloadThread extends Thread{ Connection conn; int startPos; int endPos; + File targetFile; + DownloadListener downloadListener; - public DownloadThread( Connection conn, int startPos, int endPos){ + public DownloadThread( Connection conn, int startPos, int endPos,File targetFile,DownloadListener downloadListener){ this.conn = conn; this.startPos = startPos; this.endPos = endPos; + this.targetFile = targetFile; + this.downloadListener = downloadListener; } public void run(){ - + try { + //读取到指定长度的二进制数据 + System.out.println(this.getName()+"开始下载"); + byte[] data = conn.read(startPos,endPos); + + //插入的file中去 + RandomAccessFile raFile = new RandomAccessFile(this.targetFile,"rw"); + raFile.seek(startPos); + raFile.write(data,0,endPos-startPos ); + + raFile.close(); + //做完了 + if(FileDownloader.isDownloadFinish() ){ + downloadListener.notifyFinished(); + System.out.println(this.getName()+"完成最后的下载,并写入文件"); + } + + + }catch (IOException e){ + + } } } diff --git a/group23/729693763/Third_Homework3/download/FileDownloader.java b/group23/729693763/Third_Homework3/download/FileDownloader.java index c3c8a3f27d..098f9408f0 100644 --- a/group23/729693763/Third_Homework3/download/FileDownloader.java +++ b/group23/729693763/Third_Homework3/download/FileDownloader.java @@ -1,25 +1,30 @@ -package com.coderising.download; +package com.zhous.download; -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; +import com.zhous.download.api.Connection; +import com.zhous.download.api.ConnectionException; +import com.zhous.download.api.ConnectionManager; +import com.zhous.download.api.DownloadListener; + +import java.io.File; +import java.util.Set; public class FileDownloader { - - String url; - + + String url="https://image.baidu.com/search/down?tn=download&word=download&ie=utf8&fr=detail&url=https%3A%2F%2Ftimgsa.baidu.com%2Ftimg%3Fimage%26quality%3D80%26size%3Db9999_10000%26sec%3D1490203615530%26di%3D2b1827956a01011d3634f3e04b01b15c%26imgtype%3D0%26src%3Dhttp%253A%252F%252Fimg15.3lian.com%252F2015%252Fh1%252F338%252Fd%252F157.jpg&thumburl=https%3A%2F%2Fss1.bdstatic.com%2F70cFvXSh_Q1YnxGkpoWK1HF6hhy%2Fit%2Fu%3D2613489365%2C2336631324%26fm%3D23%26gp%3D0.jpg"; + private static int threadNum = 5; + private static int threadCount = 0; + int avgBytes = 0; + DownloadListener listener; - ConnectionManager cm; - + File file = null; - public FileDownloader(String _url) { + public FileDownloader(String _url,String fileName) { this.url = _url; - + this.file = new File(fileName); } - + public void execute(){ // 在这里实现你的代码, 注意: 需要用多线程实现下载 // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 @@ -32,42 +37,60 @@ public void execute(){ // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 // 3. 把byte数组写入到文件中 // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 Connection conn = null; try { - + conn = cm.open(this.url); - - int length = conn.getContentLength(); - - new DownloadThread(conn,0,length-1).start(); - - } catch (ConnectionException e) { + int length = conn.getContentLength(); + avgBytes = length / threadNum; + //使用5个线程去下载; + for (int i = 0; i < threadNum; i++) { + int startPos = i*avgBytes; + int endPos = startPos + avgBytes - 1; + if(i == threadNum -1) { + endPos = length; + } + + Connection c = cm.open(this.url); + DownloadThread thread = new DownloadThread(c,startPos,endPos,file,this.getListener()); + thread.setName("Thread"+(i+1) ); + thread.start(); + } + + } catch (ConnectionException e) { e.printStackTrace(); }finally{ if(conn != null){ conn.close(); } } - - - - + + + + } - - public void setListener(DownloadListener listener) { + + + + public void setListener (DownloadListener listener){ this.listener = listener; } - - + public synchronized static boolean isDownloadFinish(){ + threadCount++; + return threadCount == threadNum; + } + + + public void setConnectionManager(ConnectionManager ucm){ this.cm = ucm; } - + public DownloadListener getListener(){ return this.listener; } - + } diff --git a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java index 4ff7f46ae0..ca8817ba88 100644 --- a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java +++ b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java @@ -1,12 +1,12 @@ -package com.coderising.download; +package com.zhous.download; import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; -import com.coderising.download.impl.ConnectionManagerImpl; +import com.zhous.download.api.ConnectionManager; +import com.zhous.download.api.DownloadListener; +import com.zhous.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { boolean downloadFinished = false; @@ -20,11 +20,12 @@ public void tearDown() throws Exception { @Test public void testDownload() { - - String url = "http://localhost:8080/test.jpg"; - - FileDownloader downloader = new FileDownloader(url); + String url="http://www.mydeskcity.com//upload/pc/112/960x600/1351650816239.jpg"; + String github = "https://github.com/em14Vito/coding2017/archive/master.zip"; + +// FileDownloader downloader = new FileDownloader(url,"Data23.jpg"); + FileDownloader downloader = new FileDownloader(github,"github.zip"); ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); @@ -36,17 +37,15 @@ public void notifyFinished() { } }); - - downloader.execute(); - + // 等待多线程下载程序执行完毕 while (!downloadFinished) { try { System.out.println("还没有下载完成,休眠五秒"); //休眠5秒 Thread.sleep(5000); - } catch (InterruptedException e) { + } catch (InterruptedException e) { e.printStackTrace(); } } diff --git a/group23/729693763/Third_Homework3/download/api/Connection.java b/group23/729693763/Third_Homework3/download/api/Connection.java index 0957eaf7f4..170791e8ba 100644 --- a/group23/729693763/Third_Homework3/download/api/Connection.java +++ b/group23/729693763/Third_Homework3/download/api/Connection.java @@ -1,4 +1,4 @@ -package com.coderising.download.api; +package com.zhous.download.api; import java.io.IOException; @@ -9,7 +9,7 @@ public interface Connection { * @param endPos 结束位置 * @return */ - public byte[] read(int startPos,int endPos) throws IOException; + public byte[] read(int startPos, int endPos) throws IOException; /** * 得到数据内容的长度 * @return diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionException.java b/group23/729693763/Third_Homework3/download/api/ConnectionException.java index 1551a80b3d..925368135d 100644 --- a/group23/729693763/Third_Homework3/download/api/ConnectionException.java +++ b/group23/729693763/Third_Homework3/download/api/ConnectionException.java @@ -1,4 +1,4 @@ -package com.coderising.download.api; +package com.zhous.download.api; public class ConnectionException extends Exception { diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java index ce045393b1..b331ee7f1f 100644 --- a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java +++ b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java @@ -1,4 +1,4 @@ -package com.coderising.download.api; +package com.zhous.download.api; public interface ConnectionManager { /** diff --git a/group23/729693763/Third_Homework3/download/api/DownloadListener.java b/group23/729693763/Third_Homework3/download/api/DownloadListener.java index bf9807b307..07b1a950ce 100644 --- a/group23/729693763/Third_Homework3/download/api/DownloadListener.java +++ b/group23/729693763/Third_Homework3/download/api/DownloadListener.java @@ -1,4 +1,4 @@ -package com.coderising.download.api; +package com.zhous.download.api; public interface DownloadListener { public void notifyFinished(); diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java index 36a9d2ce15..6a4b98fe06 100644 --- a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java +++ b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java @@ -1,27 +1,80 @@ -package com.coderising.download.impl; +package com.zhous.download.impl; +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; -import com.coderising.download.api.Connection; +import com.zhous.download.api.*; public class ConnectionImpl implements Connection{ + + InputStream is = null; + URL url = null; + HttpURLConnection http = null; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + //构造方法: + public ConnectionImpl() { + } + + //打开url并且创建连接 + public ConnectionImpl(String url) { + try { + this.url = new URL(url); + http = (HttpURLConnection) this.url.openConnection(); + //设置超时 + http.setConnectTimeout(5000); + http.setReadTimeout(5000); + + } catch (IOException e) { + e.printStackTrace(); + } + } + @Override public byte[] read(int startPos, int endPos) throws IOException { - - return null; + + //指定http中读取一定长度的byte + http.setRequestProperty("Range","bytes= "+Integer.toString(startPos)+"-"+Integer.toString(endPos)); + http.connect(); + + //读取输入流到其中 + is = http.getInputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while( (len = is.read(buffer) ) != -1) { + + bos.write(buffer, 0, len); + } + + //关闭所有流,每次read的时候自动关闭。 + close(); + return bos.toByteArray(); } @Override public int getContentLength() { - - return 0; + return http.getContentLength(); } @Override public void close() { - - + try { + bos.close(); + if(is != null) { + is.close(); + } + http.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + } } } diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java index 172371dd55..28af08a0cd 100644 --- a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java +++ b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java @@ -1,15 +1,27 @@ -package com.coderising.download.impl; +package com.zhous.download.impl; -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; +import com.zhous.download.api.*; + +import java.net.MalformedURLException; +import java.net.URL; public class ConnectionManagerImpl implements ConnectionManager { + + @Override public Connection open(String url) throws ConnectionException { - - return null; + Connection ct = null; + URL u = null; + try { + u = new URL(url); + ct = new ConnectionImpl(url); + } catch (MalformedURLException e) { + e.printStackTrace(); + } finally { + //URL类不需要关闭 + } + return ct; } } From 349cd580aadfa428182d59f3e8f68d6fd33dbb47 Mon Sep 17 00:00:00 2001 From: em14Vito Date: Sat, 25 Mar 2017 11:12:51 +0800 Subject: [PATCH 008/552] finish hw3 --- .../Third_Homework3/DataStruct/Iterator.java | 6 + .../DataStruct/LinkedList.java | 255 ++++++++++++++++-- .../Third_Homework3/DataStruct/List.java | 10 + 3 files changed, 246 insertions(+), 25 deletions(-) create mode 100644 group23/729693763/Third_Homework3/DataStruct/Iterator.java create mode 100644 group23/729693763/Third_Homework3/DataStruct/List.java diff --git a/group23/729693763/Third_Homework3/DataStruct/Iterator.java b/group23/729693763/Third_Homework3/DataStruct/Iterator.java new file mode 100644 index 0000000000..2ca354f82a --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/Iterator.java @@ -0,0 +1,6 @@ +package com.zhous.DataStruct; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/729693763/Third_Homework3/DataStruct/LinkedList.java b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java index 09fe0a8ff3..2a6663a3ba 100644 --- a/group23/729693763/Third_Homework3/DataStruct/LinkedList.java +++ b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java @@ -1,42 +1,152 @@ -package com.coding.basic; +package com.zhous.DataStruct; + +import javafx.beans.binding.ObjectExpression; + + public class LinkedList implements List { - private Node head; - + private Node head = null; + private int size = 0; + public void add(Object o){ - + addLast(o); + this.size++; + } + + //内部调用的方法: + //2 返回添加到哪个Node + private Node findBeforeInsertNode(int needInsertIndex){ + Node findGetNode = this.head; + for ( int i=0; i< needInsertIndex - 1; i++ ) { + findGetNode = findGetNode.next; + } + return findGetNode; } + //3 + private void checkPositionIndex(int index) { + if ( !( index >= 0 && index <= size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + //4 + private void addBeforeNode(int index, Object o) { + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + + Node beforeInserNode = this.head; + + + beforeInserNode = findBeforeInsertNode(index); + + newNode.next = beforeInserNode.next; + beforeInserNode.next = newNode; + + } + //5 + private Node findIndexNode(int index){ + Node findGetNode = this.head; + for ( int i=0; i< index; i++ ) { + findGetNode = findGetNode.next; + } + return findGetNode; + } + + public void add(int index , Object o){ - + checkPositionIndex(index); + if( index == size()){ + addLast(o); + } else if ( index == 0 ) { + addFirst(o); + } else{ + addBeforeNode(index,o); + } + this.size++; } + + + + public Object get(int index){ - return null; + checkElementIndex(index); + return findIndexNode(index); } public Object remove(int index){ - return null; + checkElementIndex(index); + Object deleteData = null; + + if(index == 0){ + deleteData = removeFirst(); + } else if(index == (size() - 1) ){ + deleteData = removeLast(); + } else { + Node temp = findBeforeInsertNode(index); + Node tempNext = temp.next; + deleteData = tempNext.data; + + temp.next = tempNext.next; + tempNext = null; + } + + return deleteData; } - + + //6 + private void checkElementIndex(int index) { + if ( !( index >= 0 && index < size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + public int size(){ - return -1; + return this.size; } public void addFirst(Object o){ - + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + if ( this.head == null ) { + this.head = newNode; + } else { + newNode.next = this.head; + this.head = newNode; + } } - public void addLast(Object o){ - + private void addLast(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + if ( head == null ) { + head = newNode; + } else{ + findBeforeInsertNode(this.size).next = newNode; + } } public Object removeFirst(){ - return null; + Object data; + Node newHead = new Node(); + newHead = this.head; + this.head = newHead.next; + + data = newHead.data; + newHead = null; + return data; } public Object removeLast(){ - return null; + Object data; + Node last = findIndexNode(this.size() -1); + data = last.data; + last = null; + + return data; } - public Iterator iterator(){ - return null; + public Iterator iterator() + { + return new LinkedListIterator(); } - + private static class Node{ Object data; @@ -49,7 +159,17 @@ private static class Node{ * 例如链表为 3->7->10 , 逆置后变为 10->7->3 */ public void reverse(){ - + Node first ; + int currentIndex = 1; + this.head = findIndexNode(this.size - 1); + if(this.size() <= 1){ + return; + } + while(currentIndex < this.size() ){ + first = findIndexNode(this.size() - currentIndex); + first.next = findIndexNode(this.size - currentIndex - 1); + currentIndex++; + } } /** @@ -59,16 +179,35 @@ public void reverse(){ */ public void removeFirstHalf(){ - + checkElementIndex(this.size()); + + int mid = this.size / 2; + Node temp = this.head; + this.head = findIndexNode(mid); + for (int i = 0; i < mid; i++) { + Node T = temp.next; + temp = null; + temp = T; + } + } /** * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i + * @param index * @param length */ - public void remove(int i, int length){ - + public void remove(int index, int length){ + checkElementIndex(length + index ); + + Node before = findBeforeInsertNode(index); + Node temp = findIndexNode(index); + for (int i= 0; i < length; i++) { + Node T = temp.next; + temp = null; + temp = T; + } + before.next = temp; } /** * 假定当前链表和listB均包含已升序排列的整数 @@ -79,7 +218,17 @@ public void remove(int i, int length){ * @param list */ public int[] getElements(LinkedList list){ - return null; + Node listNode = list.head; + Node myNode = this.head; + int[] data = new int[list.size()]; + for (int i = 0; i < this.size(); i++) { + if(i == (Integer) listNode.data){ + data[i] = (Integer)myNode.data; + } + myNode = myNode.next; + } + + return data; } /** @@ -90,12 +239,22 @@ public int[] getElements(LinkedList list){ */ public void subtract(LinkedList list){ - + + int[] data = new int[list.size()]; + for (int i = 0,j = 0; i < this.size(); i++) { + for (; j < list.size(); j++) { + if(this.get(i).equals(list.get(j))){ + this.remove(i); + break; + } + } + } } /** * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + * (选做) */ public void removeDuplicateValues(){ @@ -106,6 +265,7 @@ public void removeDuplicateValues(){ * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) * @param min * @param max + * (选做) */ public void removeRange(int min, int max){ @@ -117,6 +277,51 @@ public void removeRange(int min, int max){ * @param list */ public LinkedList intersection( LinkedList list){ - return null; + LinkedList listC = new LinkedList(); + + for (int i = 0,j = 0; i < this.size(); i++) { + for (; j < list.size(); j++) { + if(this.get(i).equals(list.get(j))){ + listC.add(this.get(i)); + break; + } + } + } + + + + return listC; + } + + + + /************Iterator**************/ + private class LinkedListIterator implements Iterator{ + private Node currentNode; + private int currentIndex; + + public LinkedListIterator() { + // TODO Auto-generated constructor stub + this.currentIndex = 0; + this.currentNode = new Node(); + } + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return currentIndex < size(); + } + + @Override + public Object next() { + // TODO Auto-generated method stub + checkElementIndex(currentIndex); + if ( currentNode.data == null ) { + this.currentNode = findIndexNode(currentIndex); + } + Object value = currentNode.data; + currentNode = currentNode.next; + currentIndex++; + return value; + } } } diff --git a/group23/729693763/Third_Homework3/DataStruct/List.java b/group23/729693763/Third_Homework3/DataStruct/List.java new file mode 100644 index 0000000000..aa8b039453 --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/List.java @@ -0,0 +1,10 @@ +package com.zhous.DataStruct; + +public interface List { + void add(Object o); + void add(int index, Object o); + Object get(int index); + Object remove(int index); + int size(); + Iterator iterator(); +} From db064f3ad635f5ad51fa8e164232f4f237e35015 Mon Sep 17 00:00:00 2001 From: em14Vito Date: Sun, 26 Mar 2017 23:36:14 +0800 Subject: [PATCH 009/552] add blog --- group23/729693763/readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/group23/729693763/readme.md b/group23/729693763/readme.md index 7e7fac06ae..89b8633e07 100644 --- a/group23/729693763/readme.md +++ b/group23/729693763/readme.md @@ -8,4 +8,5 @@ http://www.cnblogs.com/CodeSaveMe/p/6523745.html Add Blog link: http://www.cnblogs.com/CodeSaveMe/p/6523745.html Add week2 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6571621.html ->>>>>>> my + +Add week3 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6624431.html From 24175890636de64823a385af322bd282af466a4a Mon Sep 17 00:00:00 2001 From: Pickacat Date: Mon, 27 Mar 2017 00:50:27 +0800 Subject: [PATCH 010/552] =?UTF-8?q?LinkedList=E5=AE=8C=E6=88=90=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=96=B9=E6=B3=95=EF=BC=8C=E5=A4=9A=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E8=BF=98=E6=B2=A1=E5=81=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/xiaol/study/LinkedList.java | 24 ++++- .../com/xiaol/download/DownloadThread.java | 20 ++++ .../com/xiaol/download/FileDownloader.java | 91 +++++++++++++++++++ .../xiaol/download/FileDownloaderTest.java | 60 ++++++++++++ .../com/xiaol/download/api/Connection.java | 23 +++++ .../download/api/ConnectionException.java | 5 + .../xiaol/download/api/ConnectionManager.java | 10 ++ .../xiaol/download/api/DownloadListener.java | 5 + .../xiaol/download/impl/ConnectionImpl.java | 27 ++++++ .../download/impl/ConnectionManagerImpl.java | 14 +++ 10 files changed, 275 insertions(+), 4 deletions(-) create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java index d60ede59a1..2b3104756e 100644 --- a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java +++ b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java @@ -159,6 +159,7 @@ private Node(Object o) { } //---------------下面的方法暂时先不实现 + // removeDuplicateValues(),removeRange()可以不实现 /** * 把该链表逆置 @@ -182,8 +183,16 @@ public void removeFirstHalf(){ * @param i * @param length */ - public void remove(int i, int length){ - + public void remove(int i, int length) { + if (i < 0) { + throw new RuntimeException("非法参数"); + } + Node indexNode = getIndexNode(i); + Node nextNode = getIndexNode(i); + for (int j = 0; j < length; j++) { + nextNode = nextNode.next; + } + indexNode.next = nextNode; } /** @@ -194,8 +203,15 @@ public void remove(int i, int length){ * 返回的结果应该是[101,301,401,601] * @param list */ - public int[] getElements(LinkedList list){ - return null; + public int[] getElements(LinkedList list) { + int[] retVal = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + int index = (int) list.get(i); + Node indexNode = getIndexNode(index); + int data = (int) indexNode.data; + retVal[i] = data; + } + return retVal; } /** diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java new file mode 100644 index 0000000000..a038d0da37 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.xiaol.download; + +import com.xiaol.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java new file mode 100644 index 0000000000..cd0b433843 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java @@ -0,0 +1,91 @@ +package com.xiaol.download; + +import com.xiaol.download.api.Connection; +import com.xiaol.download.api.ConnectionException; +import com.xiaol.download.api.ConnectionManager; +import com.xiaol.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 +// Connection conn = null; +// try { +// +// conn = cm.open(this.url); +// +// int length = conn.getContentLength(); +// +// new DownloadThread(conn,0,length-1).start(); +// +// } catch (ConnectionException e) { +// e.printStackTrace(); +// }finally{ +// if(conn != null){ +// conn.close(); +// } +// } + + + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java new file mode 100644 index 0000000000..f76ba7ff38 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java @@ -0,0 +1,60 @@ +package com.xiaol.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.xiaol.download.api.ConnectionManager; +import com.xiaol.download.api.DownloadListener; +import com.xiaol.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + +// String url = "http://localhost:8080/test.jpg"; + String url = "http://img4.duitang.com/uploads/item/201411/09/20141109224803_GXSri.jpeg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java new file mode 100644 index 0000000000..425fe784a7 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.xiaol.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java new file mode 100644 index 0000000000..83cbd33c7e --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.xiaol.download.api; + +public class ConnectionException extends Exception { + +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java new file mode 100644 index 0000000000..fcd90b77da --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.xiaol.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java new file mode 100644 index 0000000000..549a36e478 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.xiaol.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..3cc898e626 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.xiaol.download.impl; + +import java.io.IOException; + +import com.xiaol.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..d8bd4c5a34 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,14 @@ +package com.xiaol.download.impl; +import com.xiaol.download.api.Connection; +import com.xiaol.download.api.ConnectionException; +import com.xiaol.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} \ No newline at end of file From fa4f699d6fbca186a2affeaf6a2232a903344a7f Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Mon, 27 Mar 2017 12:44:14 +0800 Subject: [PATCH 011/552] LinkedList homework LinkedList homework --- .../src/com/coding/basic/LinkedList.java | 183 ++++++++++++++++-- 1 file changed, 169 insertions(+), 14 deletions(-) diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java index 5e241db172..b88654c9a8 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java @@ -67,7 +67,7 @@ public Object get(int index) { pos++; } while (pos != index); } - return cur; + return cur.data; } public Object remove(int index) { @@ -87,7 +87,7 @@ public Object remove(int index) { prev.next = cur.next; } size--; - return cur; + return cur.data; } public int size() { @@ -122,7 +122,7 @@ public Object removeFirst() { Node ret = head; head = head.next; size--; - return ret; + return ret.data; } public Object removeLast() { @@ -143,7 +143,7 @@ public Object removeLast() { prev.next = null; } size--; - return ret; + return ret.data; } public Iterator iterator() { @@ -167,7 +167,20 @@ public Node(Object data, Node next) { * 例如链表为 3->7->10 , 逆置后变为 10->7->3 */ public void reverse() { - + if(size == 0 || size == 1){ + return ; + } + Node node = head; + Node nextNode = head.next; + Node tmp; + node.next = null; + do{ + tmp = nextNode.next; + nextNode.next = node; + node = nextNode; + nextNode = tmp; + }while(nextNode != null); + head = node; } /** @@ -176,9 +189,19 @@ public void reverse() { * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 */ public void removeFirstHalf() { - + if(size == 0 || size == 1){ + return ; + } + int num = size / 2; + size -= num; + Node node = head; + while(num > 0){ + node = node.next; + num--; + } + head = node; } - + /** * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 * @@ -186,7 +209,28 @@ public void removeFirstHalf() { * @param length */ public void remove(int i, int length) { - + checkMinBound(i); + checkMaxBound(i + length, size); + Node prev = null; + Node node = head; + int index = 0; + while(index < i){ + prev = node; + node = node.next; + index++; + } + Node nextNode = node.next; + while(index < (i + length - 1)){ + nextNode = nextNode.next; + index++; + } + size -= length; + if(i == 0){ + head = nextNode; + }else{ + prev.next = nextNode; + head = prev; + } } /** @@ -198,8 +242,26 @@ public void remove(int i, int length) { * * @param list */ - public static int[] getElements(LinkedList list) { - return null; + public int[] getElements(LinkedList list) { + int[] ret = new int[list.size()]; + if(ret.length == 0){ + return ret; + } + int index; + int j = 0; + Node node = head; + for(int i=0;i min){ + foundMin = true; + } + if((int)node.data > max){ + break; + } + if(foundMin == false){ + prev = node; + }else{ + size -= 1; + } + node = node.next; + }while(node != null); + if(prev == null){ + head = node; + }else{ + prev.next = node; + } } /** @@ -239,6 +356,44 @@ public void removeRange(int min, int max) { * @param list */ public LinkedList intersection(LinkedList list) { - return null; + LinkedList ret = new LinkedList(); + Node node = head; + int nodeValue; + int elementValue; + for(int i=0;i elementValue){ + break; + } + node = node.next; + } + } + } + return ret; + } + + public String toString(){ + Node node = head; + StringBuilder sb = new StringBuilder(); + if(node == null){ + return ""; + }else{ + sb.append(head.data); + while((node = node.next) != null){ + sb.append(",").append(node.data); + } + return sb.toString(); + } } } From 4a36e78d2c1a9c27a3fb2d769974e2b40dc278d8 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Mon, 27 Mar 2017 12:56:39 +0800 Subject: [PATCH 012/552] LinkedList homework update LinkedList homework update --- .../src/com/coding/basic/LinkedList.java | 2 +- .../test/com/coding/basic/TestLinkedList.java | 176 ++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestLinkedList.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java index b88654c9a8..eb41670f82 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java @@ -332,7 +332,7 @@ public void removeRange(int min, int max) { if(!foundMin && (int)node.data > min){ foundMin = true; } - if((int)node.data > max){ + if(foundMin && (int)node.data > max){ break; } if(foundMin == false){ diff --git a/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestLinkedList.java b/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestLinkedList.java new file mode 100644 index 0000000000..39b41c1317 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestLinkedList.java @@ -0,0 +1,176 @@ +package test.com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Test; + +import com.coding.basic.LinkedList; + +public class TestLinkedList { + + @Test + public void testReverse(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.reverse(); + Assert.assertEquals("10,7,3", list.toString()); + Assert.assertEquals("10", list.get(0).toString()); + } + + @Test + public void testRemoveFirstHalf(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.add(12); + list.add(15); + list.removeFirstHalf(); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,12,15", list.toString()); + Assert.assertEquals(3, list.size()); + } + + @Test + public void testRemoveByLength(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.add(12); + list.add(15); + list.remove(0, 2); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,12,15", list.toString()); + Assert.assertEquals(3, list.size()); + + list.remove(1, 1); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,15", list.toString()); + Assert.assertEquals(2, list.size()); + } + + @Test + public void testGetElements(){ + LinkedList list = new LinkedList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + + LinkedList indices = new LinkedList(); + indices.add(1); + indices.add(3); + indices.add(4); + indices.add(6); + int[] elements = list.getElements(indices); + StringBuilder sb = new StringBuilder(); + for(int i=0;i Date: Mon, 27 Mar 2017 16:15:32 +0800 Subject: [PATCH 013/552] FileDownload FileDownload --- .../coderising/download/DownloadThread.java | 31 ++++++ .../coderising/download/FileDownloader.java | 98 +++++++++++++++++++ .../download/FileDownloaderTest.java | 59 +++++++++++ .../coderising/download/api/Connection.java | 26 +++++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 ++ .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 62 ++++++++++++ .../download/impl/ConnectionManagerImpl.java | 26 +++++ 9 files changed, 322 insertions(+) create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/DownloadThread.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/Connection.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/DownloadThread.java b/group23/1028361767/Week1DataStructure/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..8cf0ae1e42 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,31 @@ +package com.coderising.download; + +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + try { + byte[] bytes = conn.read(startPos, endPos); + RandomAccessFile file = new RandomAccessFile("/Users/jie/Desktop/test.png", "rw"); + file.seek(startPos); + file.write(bytes); + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java b/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..a5b8aac78e --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,98 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + int size = length / 3; + int remain = length - size; + + Thread[] threads = new Thread[3]; + for(int i=0;i<3;i++){ + conn = cm.open(this.url); + int startPos = i*size; + int endPos = (i+1) * size - 1; + if(i == 2){ + endPos = (i+1) * size - 1 + remain; + } + threads[i] = new DownloadThread(conn,startPos,endPos); + threads[i].start(); + } + boolean finish; + do{ + finish = true; + for(int i=0;i Date: Mon, 27 Mar 2017 16:26:24 +0800 Subject: [PATCH 014/552] FileDownloader update FileDownloader update --- .../coderising/download/FileDownloader.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java b/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java index a5b8aac78e..1fe4ebb159 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java +++ b/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java @@ -14,6 +14,8 @@ public class FileDownloader { ConnectionManager cm; + Thread[] threads = new Thread[3]; + public FileDownloader(String _url) { this.url = _url; @@ -44,7 +46,6 @@ public void execute(){ int size = length / 3; int remain = length - size; - Thread[] threads = new Thread[3]; for(int i=0;i<3;i++){ conn = cm.open(this.url); int startPos = i*size; @@ -55,18 +56,23 @@ public void execute(){ threads[i] = new DownloadThread(conn,startPos,endPos); threads[i].start(); } - boolean finish; - do{ - finish = true; - for(int i=0;i Date: Mon, 27 Mar 2017 17:29:27 +0800 Subject: [PATCH 015/552] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E5=91=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 65 ++++++++ .../coderising/download/FileDownloader.java | 89 +++++++++++ .../download/FileDownloaderTest.java | 58 +++++++ .../coderising/download/api/Connection.java | 24 +++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 ++ .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 143 ++++++++++++++++++ .../download/impl/ConnectionManagerImpl.java | 16 ++ .../src/junit/test/ConnectionImplTest.java | 92 +++++++++++ .../junit/test/ConnectionManagerImplTest.java | 31 ++++ .../src/junit/test/DownloadThreadTest.java | 77 ++++++++++ 12 files changed, 615 insertions(+) create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionImplTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..66024b0ccf --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,65 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + private Connection conn; + private int startPos; + private int endPos; + private byte[] b = null; + private static Lock lock = new ReentrantLock(); + private static int index=0; + + static FileOutputStream file = null; + static{ + try { + file = new FileOutputStream(new File("e://readme.txt")); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + try { + this.b = conn.read(startPos, endPos); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new RuntimeException(); + }finally{ + conn.close(); + } + + } + public void run(){ + if(lock.tryLock()){ + if(index==startPos){ + try { + if (file!=null) { + file.write(b); + } + index=endPos+1; + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(); + } + + }else{ + lock.unlock(); + } + } + } +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..ed4a1cf9a1 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,89 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + if(length%3==0){ + for(int i=1;i<=3;i++){ + int startPos = length/3*i-1; + int endPos = length/3*(i-1); + new DownloadThread(conn, endPos, startPos).start(); + } + }else{ + for(int i=1;i<=2;i++){ + + int startPos = length/3*(i-1); + int endPos = length/3*i-1; + new DownloadThread(conn, startPos, endPos).start(); + } + int startPos = length/3*2; + new DownloadThread(conn, startPos, length).start(); + } + + listener.notifyFinished(); + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..ce99026d2b --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,58 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..3982b8e310 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java @@ -0,0 +1,24 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + * + */ + public void close(); +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..ae639d2651 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,143 @@ +package com.coderising.download.impl; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + private String url = null; + private InputStream in = null; + + + public ConnectionImpl(String url) { + this.url = url; + + + } + + public byte[] read(int startPos, int endPos) throws IOException { + + try { + if(url==null||url.trim()==""){ + return null; + } + + URL u = new URL(url); + in = u.openStream(); + + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if(in==null){ + return null; + } + byte[] read = insert(startPos, endPos); + + return read; + } + + private byte[] insert(int startPos, int endPos) throws IOException { + byte[] b = new byte[1024]; + int len = 0; + int index = 0; + byte[] read = new byte[endPos-startPos+1]; + + while((len=in.read(b))>0){ + if((index+1024)<=startPos){ + index+=1024; + continue; + } + + if(index<=startPos&&startPos<(index+1024)){ + + if(endPos<(index+1024)){ + for(int i=0,j=startPos-index;i0){ + count+=len; + } + Assert.assertEquals(count, conn.getContentLength()); + + } + + + @Test + public void testClose() { + conn.close(); + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java new file mode 100644 index 0000000000..589c1bf1d2 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java @@ -0,0 +1,31 @@ +package junit.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.impl.ConnectionImpl; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class ConnectionManagerImplTest { + + @Before + public void setUp() throws Exception { + } + + + @Test + public void testOpen() throws ConnectionException { + ConnectionManager cm = new ConnectionManagerImpl(); + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + Connection conn = cm.open(url); + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java new file mode 100644 index 0000000000..5ae230e97b --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java @@ -0,0 +1,77 @@ +package junit.test; + +import static org.junit.Assert.*; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; + + + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.DownloadThread; +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class DownloadThreadTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void testRun() throws ConnectionException, IOException { + ConnectionManager cm = new ConnectionManagerImpl(); + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + Connection conn = cm.open(url); + DownloadThread dt = new DownloadThread(conn, 0, conn.getContentLength()); + dt.start(); + + File file = new File("e://readme.txt"); + FileInputStream in = new FileInputStream(file); + byte[] b = new byte[10]; + int len = 0; + ArrayList a = new ArrayList(); + while((len=in.read(b))>0){ + a.add(b); + } + + int length = conn.getContentLength(); + if(length%3==0){ + for(int i=1;i<=3;i++){ + int startPos = length/3*i-1; + int endPos = length/3*(i-1); + new DownloadThread(conn, endPos, startPos).start(); + } + }else{ + for(int i=1;i<=2;i++){ + + int startPos = length/3*(i-1); + int endPos = length/3*i-1; + new DownloadThread(conn, startPos, endPos).start(); + } + int startPos = length/3*2; + new DownloadThread(conn, startPos, length).start(); + } + + file = new File("e://readme.txt"); + in = new FileInputStream(file); + b = new byte[10]; + len = 0; + ArrayList a1 = new ArrayList(); + while((len=in.read(b))>0){ + a1.add(b); + } + for(int i = 0;i Date: Tue, 28 Mar 2017 09:43:48 +0800 Subject: [PATCH 016/552] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构数据结构项目 --- .../coderising/download/DownloadThread.java | 31 ++ .../coderising/download/FileDownloader.java | 104 +++++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 26 ++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 62 +++ .../download/impl/ConnectionManagerImpl.java | 26 ++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 181 ++++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coding/basic/BinaryTreeNode.java | 97 +++++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/List.java | 13 + .../src/com/coding/basic/Queue.java | 24 ++ .../src/com/coding/basic/Stack.java | 37 ++ .../src/com/coding/basic/array/ArrayList.java | 83 ++++ .../src/com/coding/basic/array/ArrayUtil.java | 210 +++++++++ .../com/coding/basic/linklist/LinkedList.java | 402 ++++++++++++++++++ 21 files changed, 1488 insertions(+) create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/Connection.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/Struts.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/View.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Iterator.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/List.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Queue.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Stack.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LinkedList.java diff --git a/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java b/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..8cf0ae1e42 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,31 @@ +package com.coderising.download; + +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + try { + byte[] bytes = conn.read(startPos, endPos); + RandomAccessFile file = new RandomAccessFile("/Users/jie/Desktop/test.png", "rw"); + file.seek(startPos); + file.write(bytes); + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java b/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..1fe4ebb159 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,104 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + Thread[] threads = new Thread[3]; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + int size = length / 3; + int remain = length - size; + + for(int i=0;i<3;i++){ + conn = cm.open(this.url); + int startPos = i*size; + int endPos = (i+1) * size - 1; + if(i == 2){ + endPos = (i+1) * size - 1 + remain; + } + threads[i] = new DownloadThread(conn,startPos,endPos); + threads[i].start(); + } + + new Thread(new Runnable(){ + public void run(){ + boolean finish; + do{ + finish = true; + for(int i=0;i actions = new HashMap(); + + @SuppressWarnings("rawtypes") + public static View runAction(String actionName, Map parameters) throws Exception { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + //读取xml,把xml信息放到actions + readStrutsXML(); + + Action action = actions.get(actionName); + View view = new View(); + if(action != null){ + Class clazz = Class.forName(action.getClassName()); + Object obj = clazz.newInstance(); + + //根据parameters调用set方法 + initClass(clazz, obj, action, parameters); + + //调用execute方法 + String result = execute(clazz, obj); + //调用所有get方法 + Map resultParameters = getResultParameters(clazz, obj); + + view.setJsp(action.getResults().get(result)); + view.setParameters(resultParameters); + } + + return view; + } + + @SuppressWarnings("rawtypes") + private static Map getResultParameters(Class clazz, Object obj) throws Exception { + Map resultParameters = new HashMap(); + Method[] methods = clazz.getMethods(); + String methodName; + String propName; + String propValue; + for(Method method : methods){ + methodName = method.getName(); + if(methodName.startsWith("get") && !"getClass".equals(methodName)){ + propName = firstLetterLowerCase(methodName.substring(3, methodName.length())); + propValue = (String) method.invoke(obj); + resultParameters.put(propName, propValue); + } + } + return resultParameters; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static String execute(Class clazz, Object obj) throws Exception{ + Method method = clazz.getMethod("execute"); + return (String)method.invoke(obj); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static void initClass(Class clazz, Object obj, Action action, Map parameters) throws Exception { + String setMethodName; + Method method = null; + for (String parameter : parameters.keySet()) { + setMethodName = "set" + firstLetterUpperCase(parameter); + method = clazz.getMethod(setMethodName, String.class); + method.invoke(obj, parameters.get(parameter)); + } + } + + private static String firstLetterLowerCase(String string){ + char[] cs = string.toCharArray(); + cs[0] += 32; + return String.valueOf(cs); + } + + private static String firstLetterUpperCase(String string){ + char[] cs = string.toCharArray(); + cs[0] -= 32; + return String.valueOf(cs); + } + + @SuppressWarnings("unchecked") + private static void readStrutsXML() { + SAXReader saxReader = new SAXReader(); + Document document; + try { + document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml")); + } catch (DocumentException e) { + System.out.println("error:file not found"); + return ; + } + Element root = document.getRootElement(); + Iterator actionItr = root.elementIterator(); + Element action; + Action act; + Iterator resultItr; + Element result; + Map results; + while(actionItr.hasNext()){ + action = actionItr.next(); + + resultItr = action.elementIterator(); + results = new HashMap(); + while(resultItr.hasNext()){ + result = resultItr.next(); + results.put(result.attributeValue("name"), result.getStringValue()); + } + + act = new Action(); + act.setName(action.attributeValue("name")); + act.setClassName(action.attributeValue("class")); + act.setResults(results); + + actions.put(act.getName(), act); + } + } + + static class Action { + + private String name; + + private String className; + + private Map results = new HashMap<>(); + + public Map getResults() { + return results; + } + + public void setResults(Map results) { + this.results = results; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + } + +} diff --git a/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..92a6758a69 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java b/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..dced34e873 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,97 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode parent; + + public BinaryTreeNode(Object data) { + this.data = data; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public void setParent(BinaryTreeNode parent) { + this.parent = parent; + } + + public BinaryTreeNode getParent() { + return parent; + } + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode newNode = new BinaryTreeNode(o); + BinaryTreeNode root = findRoot(this); + if (root.data == null) { + root.data = newNode; + } else { + int newVal = getNodeIntVal(newNode); + insert(root, newNode, newVal); + } + return newNode; + } + + private void insert(BinaryTreeNode node, BinaryTreeNode newNode, int newVal) { + int nodeVal = getNodeIntVal(node); + if (newVal < nodeVal) { + if (node.left == null) { + newNode.parent = node; + node.left = newNode; + } else { + insert(node.left, newNode, newVal); + } + } else { + if (node.right == null) { + newNode.parent = node; + node.right = newNode; + } else { + insert(node.right, newNode, newVal); + } + } + } + + private BinaryTreeNode findRoot(BinaryTreeNode binaryTreeNode) { + while (binaryTreeNode.parent != null) { + binaryTreeNode = binaryTreeNode.parent; + } + return binaryTreeNode; + } + + private int getNodeIntVal(BinaryTreeNode node) { + if (node.data instanceof Integer) { + return ((Integer) node.data).intValue(); + } + return 0; + } + + public int getDataIntVal() { + if (data instanceof Integer) { + return ((Integer) data).intValue(); + } + return 0; + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java b/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..96adcd6d3a --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/List.java b/group23/1028361767/data-structure/src/com/coding/basic/List.java new file mode 100644 index 0000000000..01398944e6 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Queue.java b/group23/1028361767/data-structure/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..ddd1b74d90 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/Queue.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +import com.coding.basic.linklist.LinkedList; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o) { + linkedList.add(o); + } + + public Object deQueue() { + return linkedList.removeFirst(); + } + + public boolean isEmpty() { + return linkedList.size() == 0; + } + + public int size() { + return linkedList.size(); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Stack.java b/group23/1028361767/data-structure/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a98f5d76a5 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/Stack.java @@ -0,0 +1,37 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +import com.coding.basic.array.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + checkBound(); + return elementData.get(size() - 1); + } + + public Object peek() { + checkBound(); + return elementData.remove(size() - 1); + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return elementData.size(); + } + + private void checkBound() { + if (isEmpty()) { + throw new EmptyStackException(); + } + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..43bdae82fa --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java @@ -0,0 +1,83 @@ +package com.coding.basic.array; + +import java.util.Arrays; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + + private int HALF_MAX_VALUE = Integer.MAX_VALUE; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + if (noSpace()) { + elementData = grow(); + } + elementData[size++] = o; + } + + public void add(int index, Object o) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > size) { + throw new IndexOutOfBoundsException("size is" + size); + } + if (noSpace()) { + elementData = grow(); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[size++] = o; + } + + public Object get(int index) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > (size - 1)) { + throw new IndexOutOfBoundsException("size is" + size); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > (size - 1)) { + throw new IndexOutOfBoundsException("size is" + size); + } + Object obj = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index); + elementData[size-1] = null; + size--; + return obj; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + + private boolean noSpace() { + return size == elementData.length; + } + + private Object[] grow() { + int newSize; + if (size < HALF_MAX_VALUE) { + newSize = size * 2; + } else { + newSize = Integer.MAX_VALUE; + } + return Arrays.copyOf(elementData, newSize); + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java new file mode 100644 index 0000000000..8e1b170dc0 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java @@ -0,0 +1,210 @@ +package com.coding.basic.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + int len = origin.length; + int[] ret = new int[len]; + for(int i=0;i len1 && i2 > len2){ + break; + }else if(i1 > len1){ + ret[i++] = array2[i2++]; + }else{ + ret[i++] = array1[i1++]; + } + } + + } + if(sameNum > 0){ + ret = Arrays.copyOf(ret, ret.length - sameNum); + } + return ret; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return Arrays.copyOf(oldArray, oldArray.length + size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max == 1){ + return new int[0]; + }else{ + int[] tmp = new int[max + 1]; + int x1 = 1, x2 = 1; + int i = 1, j = 0; + tmp[j++] = x1; + tmp[j++] = x2; + while(true){ + i = x1 + x2; + if(i > max){ + break; + } + x1 = x2; + x2 = i; + tmp[j++] = i; + } + return Arrays.copyOf(tmp, j); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] tmp = new int[max/2 + 1]; + boolean isPrime; + int k = 0; + for(int i=2;i max) { + throw new IndexOutOfBoundsException(); + } + } + + + public Object get(int index) { + checkMinBound(index); + checkMaxBound(index, size - 1); + Node cur = head; + if (index != 0) { + int pos = 0; + do { + cur = cur.next; + pos++; + } while (pos != index); + } + return cur.data; + } + + public Object remove(int index) { + checkMinBound(index); + checkMaxBound(index, size - 1); + Node cur = head; + if (index == 0) { + head = cur.next; + } else { + int pos = 1; + Node prev = cur; + while (pos != index) { + prev = prev.next; + pos++; + } + cur = prev.next; + prev.next = cur.next; + } + size--; + return cur.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o, null); + newNode.next = head; + head = newNode; + size++; + } + + public void addLast(Object o) { + Node newNode = new Node(o, null); + if (head == null) { + head = newNode; + } else { + Node tmp = head; + while (tmp.next != null) { + tmp = tmp.next; + } + tmp.next = newNode; + } + size++; + } + + public Object removeFirst() { + if (head == null) { + throw new NoSuchElementException(); + } + Node ret = head; + head = head.next; + size--; + return ret.data; + } + + public Object removeLast() { + if (head == null) { + throw new NoSuchElementException(); + } + Node ret; + if (head.next == null) { + ret = head; + head = null; + } else { + Node prev = head; + ret = head.next; + while (ret.next != null) { + prev = ret; + ret = ret.next; + } + prev.next = null; + } + size--; + return ret.data; + } + + public Iterator iterator() { + return null; + } + + + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + if(size == 0 || size == 1){ + return ; + } + Node node = head; + Node nextNode = head.next; + Node tmp; + node.next = null; + do{ + tmp = nextNode.next; + nextNode.next = node; + node = nextNode; + nextNode = tmp; + }while(nextNode != null); + head = node; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf() { + if(size == 0 || size == 1){ + return ; + } + int num = size / 2; + size -= num; + Node node = head; + while(num > 0){ + node = node.next; + num--; + } + head = node; + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + checkMinBound(i); + checkMaxBound(i + length, size); + Node prev = null; + Node node = head; + int index = 0; + while(index < i){ + prev = node; + node = node.next; + index++; + } + Node nextNode = node.next; + while(index < (i + length - 1)){ + nextNode = nextNode.next; + index++; + } + size -= length; + if(i == 0){ + head = nextNode; + }else{ + prev.next = nextNode; + head = prev; + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + public int[] getElements(LinkedList list) { + int[] ret = new int[list.size()]; + if(ret.length == 0){ + return ret; + } + int index; + int j = 0; + Node node = head; + for(int i=0;i min){ + foundMin = true; + } + if(foundMin && (int)node.data > max){ + break; + } + if(foundMin == false){ + prev = node; + }else{ + size -= 1; + } + node = node.next; + }while(node != null); + if(prev == null){ + head = node; + }else{ + prev.next = node; + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * + * @param list + */ + public LinkedList intersection(LinkedList list) { + LinkedList ret = new LinkedList(); + Node node = head; + int nodeValue; + int elementValue; + for(int i=0;i elementValue){ + break; + } + node = node.next; + } + } + } + return ret; + } + + public String toString(){ + Node node = head; + StringBuilder sb = new StringBuilder(); + if(node == null){ + return ""; + }else{ + sb.append(head.data); + while((node = node.next) != null){ + sb.append(",").append(node.data); + } + return sb.toString(); + } + } +} From 54532084198069eaab425ef3b76c48df05310e21 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Tue, 28 Mar 2017 09:49:18 +0800 Subject: [PATCH 017/552] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 项目重构 --- .../bin/com/coderising/litestruts/struts.xml | 11 - .../src/com/coderising/array/ArrayUtil.java | 210 --------- .../coderising/download/DownloadThread.java | 31 -- .../coderising/download/FileDownloader.java | 104 ----- .../download/FileDownloaderTest.java | 59 --- .../coderising/download/api/Connection.java | 26 -- .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 62 --- .../download/impl/ConnectionManagerImpl.java | 26 -- .../coderising/litestruts/LoginAction.java | 39 -- .../src/com/coderising/litestruts/Struts.java | 181 -------- .../com/coderising/litestruts/StrutsTest.java | 43 -- .../src/com/coderising/litestruts/View.java | 23 - .../src/com/coderising/litestruts/struts.xml | 11 - .../src/com/coding/basic/ArrayList.java | 80 ---- .../src/com/coding/basic/BinaryTreeNode.java | 97 ----- .../src/com/coding/basic/Iterator.java | 8 - .../src/com/coding/basic/LinkedList.java | 399 ------------------ .../src/com/coding/basic/List.java | 13 - .../src/com/coding/basic/Queue.java | 22 - .../src/com/coding/basic/Stack.java | 35 -- .../src/com/coding/me/Palindrome.java | 82 ++++ .../test/com/coding/basic/TestArrayList.java | 3 +- .../com/coding/basic/TestBinaryTreeNode.java | 0 .../test/com/coding/basic/TestLinkedList.java | 4 +- 27 files changed, 86 insertions(+), 1503 deletions(-) delete mode 100644 group23/1028361767/Week1DataStructure/bin/com/coderising/litestruts/struts.xml delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/Connection.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/LoginAction.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/Struts.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/struts.xml delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java delete mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/Palindrome.java rename group23/1028361767/{Week1DataStructure => data-structure}/src/test/com/coding/basic/TestArrayList.java (97%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/test/com/coding/basic/TestBinaryTreeNode.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/test/com/coding/basic/TestLinkedList.java (97%) diff --git a/group23/1028361767/Week1DataStructure/bin/com/coderising/litestruts/struts.xml b/group23/1028361767/Week1DataStructure/bin/com/coderising/litestruts/struts.xml deleted file mode 100644 index e5d9aebba8..0000000000 --- a/group23/1028361767/Week1DataStructure/bin/com/coderising/litestruts/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java b/group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java deleted file mode 100644 index e497a8e251..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.coderising.array; - -import java.util.Arrays; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public int[] reverseArray(int[] origin){ - int len = origin.length; - int[] ret = new int[len]; - for(int i=0;i len1 && i2 > len2){ - break; - }else if(i1 > len1){ - ret[i++] = array2[i2++]; - }else{ - ret[i++] = array1[i1++]; - } - } - - } - if(sameNum > 0){ - ret = Arrays.copyOf(ret, ret.length - sameNum); - } - return ret; - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - return Arrays.copyOf(oldArray, oldArray.length + size); - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max){ - if(max == 1){ - return new int[0]; - }else{ - int[] tmp = new int[max + 1]; - int x1 = 1, x2 = 1; - int i = 1, j = 0; - tmp[j++] = x1; - tmp[j++] = x2; - while(true){ - i = x1 + x2; - if(i > max){ - break; - } - x1 = x2; - x2 = i; - tmp[j++] = i; - } - return Arrays.copyOf(tmp, j); - } - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - int[] tmp = new int[max/2 + 1]; - boolean isPrime; - int k = 0; - for(int i=2;i actions = new HashMap(); - - @SuppressWarnings("rawtypes") - public static View runAction(String actionName, Map parameters) throws Exception { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - //读取xml,把xml信息放到actions - readStrutsXML(); - - Action action = actions.get(actionName); - View view = new View(); - if(action != null){ - Class clazz = Class.forName(action.getClassName()); - Object obj = clazz.newInstance(); - - //根据parameters调用set方法 - initClass(clazz, obj, action, parameters); - - //调用execute方法 - String result = execute(clazz, obj); - //调用所有get方法 - Map resultParameters = getResultParameters(clazz, obj); - - view.setJsp(action.getResults().get(result)); - view.setParameters(resultParameters); - } - - return view; - } - - @SuppressWarnings("rawtypes") - private static Map getResultParameters(Class clazz, Object obj) throws Exception { - Map resultParameters = new HashMap(); - Method[] methods = clazz.getMethods(); - String methodName; - String propName; - String propValue; - for(Method method : methods){ - methodName = method.getName(); - if(methodName.startsWith("get") && !"getClass".equals(methodName)){ - propName = firstLetterLowerCase(methodName.substring(3, methodName.length())); - propValue = (String) method.invoke(obj); - resultParameters.put(propName, propValue); - } - } - return resultParameters; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static String execute(Class clazz, Object obj) throws Exception{ - Method method = clazz.getMethod("execute"); - return (String)method.invoke(obj); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static void initClass(Class clazz, Object obj, Action action, Map parameters) throws Exception { - String setMethodName; - Method method = null; - for (String parameter : parameters.keySet()) { - setMethodName = "set" + firstLetterUpperCase(parameter); - method = clazz.getMethod(setMethodName, String.class); - method.invoke(obj, parameters.get(parameter)); - } - } - - private static String firstLetterLowerCase(String string){ - char[] cs = string.toCharArray(); - cs[0] += 32; - return String.valueOf(cs); - } - - private static String firstLetterUpperCase(String string){ - char[] cs = string.toCharArray(); - cs[0] -= 32; - return String.valueOf(cs); - } - - @SuppressWarnings("unchecked") - private static void readStrutsXML() { - SAXReader saxReader = new SAXReader(); - Document document; - try { - document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml")); - } catch (DocumentException e) { - System.out.println("error:file not found"); - return ; - } - Element root = document.getRootElement(); - Iterator actionItr = root.elementIterator(); - Element action; - Action act; - Iterator resultItr; - Element result; - Map results; - while(actionItr.hasNext()){ - action = actionItr.next(); - - resultItr = action.elementIterator(); - results = new HashMap(); - while(resultItr.hasNext()){ - result = resultItr.next(); - results.put(result.attributeValue("name"), result.getStringValue()); - } - - act = new Action(); - act.setName(action.attributeValue("name")); - act.setClassName(action.attributeValue("class")); - act.setResults(results); - - actions.put(act.getName(), act); - } - } - - static class Action { - - private String name; - - private String className; - - private Map results = new HashMap<>(); - - public Map getResults() { - return results; - } - - public void setResults(Map results) { - this.results = results; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - } - -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java b/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index 92a6758a69..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() throws Exception { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() throws Exception { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java b/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/struts.xml b/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/struts.xml deleted file mode 100644 index e5d9aebba8..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java deleted file mode 100644 index da0237bdf7..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private int HALF_MAX_VALUE = Integer.MAX_VALUE; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - if (noSpace()) { - elementData = grow(); - } - elementData[size++] = o; - } - - public void add(int index, Object o) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > size) { - throw new IndexOutOfBoundsException("size is" + size); - } - if (noSpace()) { - elementData = grow(); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[size++] = o; - } - - public Object get(int index) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > (size - 1)) { - throw new IndexOutOfBoundsException("size is" + size); - } - return elementData[index]; - } - - public Object remove(int index) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > (size - 1)) { - throw new IndexOutOfBoundsException("size is" + size); - } - Object obj = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index); - elementData[size-1] = null; - size--; - return obj; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return null; - } - - private boolean noSpace() { - return size == elementData.length; - } - - private Object[] grow() { - int newSize; - if (size < HALF_MAX_VALUE) { - newSize = size * 2; - } else { - newSize = Integer.MAX_VALUE; - } - return Arrays.copyOf(elementData, newSize); - } - -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index dced34e873..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode parent; - - public BinaryTreeNode(Object data) { - this.data = data; - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public void setParent(BinaryTreeNode parent) { - this.parent = parent; - } - - public BinaryTreeNode getParent() { - return parent; - } - - public BinaryTreeNode insert(Object o) { - BinaryTreeNode newNode = new BinaryTreeNode(o); - BinaryTreeNode root = findRoot(this); - if (root.data == null) { - root.data = newNode; - } else { - int newVal = getNodeIntVal(newNode); - insert(root, newNode, newVal); - } - return newNode; - } - - private void insert(BinaryTreeNode node, BinaryTreeNode newNode, int newVal) { - int nodeVal = getNodeIntVal(node); - if (newVal < nodeVal) { - if (node.left == null) { - newNode.parent = node; - node.left = newNode; - } else { - insert(node.left, newNode, newVal); - } - } else { - if (node.right == null) { - newNode.parent = node; - node.right = newNode; - } else { - insert(node.right, newNode, newVal); - } - } - } - - private BinaryTreeNode findRoot(BinaryTreeNode binaryTreeNode) { - while (binaryTreeNode.parent != null) { - binaryTreeNode = binaryTreeNode.parent; - } - return binaryTreeNode; - } - - private int getNodeIntVal(BinaryTreeNode node) { - if (node.data instanceof Integer) { - return ((Integer) node.data).intValue(); - } - return 0; - } - - public int getDataIntVal() { - if (data instanceof Integer) { - return ((Integer) data).intValue(); - } - return 0; - } -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java deleted file mode 100644 index 96adcd6d3a..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - - public Object next(); - -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java deleted file mode 100644 index eb41670f82..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,399 +0,0 @@ -package com.coding.basic; - - -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private Node head; - private int size; - - public void add(Object o) { - Node newNode = new Node(o, null); - if (head == null) { - head = newNode; - } else { - Node tmp = head; - while (tmp.next != null) { - tmp = tmp.next; - } - tmp.next = newNode; - } - size++; - } - - public void add(int index, Object o) { - checkMinBound(index); - checkMaxBound(index, size); - Node newNode = new Node(o, null); - if (index == 0) { - newNode.next = head; - head = newNode; - } else { - int pos = 1; - Node tmp = head; - while (pos != index) { - tmp = tmp.next; - pos++; - } - newNode.next = tmp.next; - tmp.next = newNode; - } - size++; - - } - - private void checkMinBound(int index) { - if (index < 0) { - throw new IllegalArgumentException(); - } - } - - private void checkMaxBound(int index, int max) { - if (index > max) { - throw new IndexOutOfBoundsException(); - } - } - - - public Object get(int index) { - checkMinBound(index); - checkMaxBound(index, size - 1); - Node cur = head; - if (index != 0) { - int pos = 0; - do { - cur = cur.next; - pos++; - } while (pos != index); - } - return cur.data; - } - - public Object remove(int index) { - checkMinBound(index); - checkMaxBound(index, size - 1); - Node cur = head; - if (index == 0) { - head = cur.next; - } else { - int pos = 1; - Node prev = cur; - while (pos != index) { - prev = prev.next; - pos++; - } - cur = prev.next; - prev.next = cur.next; - } - size--; - return cur.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newNode = new Node(o, null); - newNode.next = head; - head = newNode; - size++; - } - - public void addLast(Object o) { - Node newNode = new Node(o, null); - if (head == null) { - head = newNode; - } else { - Node tmp = head; - while (tmp.next != null) { - tmp = tmp.next; - } - tmp.next = newNode; - } - size++; - } - - public Object removeFirst() { - if (head == null) { - throw new NoSuchElementException(); - } - Node ret = head; - head = head.next; - size--; - return ret.data; - } - - public Object removeLast() { - if (head == null) { - throw new NoSuchElementException(); - } - Node ret; - if (head.next == null) { - ret = head; - head = null; - } else { - Node prev = head; - ret = head.next; - while (ret.next != null) { - prev = ret; - ret = ret.next; - } - prev.next = null; - } - size--; - return ret.data; - } - - public Iterator iterator() { - return null; - } - - - private static class Node { - Object data; - Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse() { - if(size == 0 || size == 1){ - return ; - } - Node node = head; - Node nextNode = head.next; - Node tmp; - node.next = null; - do{ - tmp = nextNode.next; - nextNode.next = node; - node = nextNode; - nextNode = tmp; - }while(nextNode != null); - head = node; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - */ - public void removeFirstHalf() { - if(size == 0 || size == 1){ - return ; - } - int num = size / 2; - size -= num; - Node node = head; - while(num > 0){ - node = node.next; - num--; - } - head = node; - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * - * @param i - * @param length - */ - public void remove(int i, int length) { - checkMinBound(i); - checkMaxBound(i + length, size); - Node prev = null; - Node node = head; - int index = 0; - while(index < i){ - prev = node; - node = node.next; - index++; - } - Node nextNode = node.next; - while(index < (i + length - 1)){ - nextNode = nextNode.next; - index++; - } - size -= length; - if(i == 0){ - head = nextNode; - }else{ - prev.next = nextNode; - head = prev; - } - } - - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * - * @param list - */ - public int[] getElements(LinkedList list) { - int[] ret = new int[list.size()]; - if(ret.length == 0){ - return ret; - } - int index; - int j = 0; - Node node = head; - for(int i=0;i min){ - foundMin = true; - } - if(foundMin && (int)node.data > max){ - break; - } - if(foundMin == false){ - prev = node; - }else{ - size -= 1; - } - node = node.next; - }while(node != null); - if(prev == null){ - head = node; - }else{ - prev.next = node; - } - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * - * @param list - */ - public LinkedList intersection(LinkedList list) { - LinkedList ret = new LinkedList(); - Node node = head; - int nodeValue; - int elementValue; - for(int i=0;i elementValue){ - break; - } - node = node.next; - } - } - } - return ret; - } - - public String toString(){ - Node node = head; - StringBuilder sb = new StringBuilder(); - if(node == null){ - return ""; - }else{ - sb.append(head.data); - while((node = node.next) != null){ - sb.append(",").append(node.data); - } - return sb.toString(); - } - } -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java deleted file mode 100644 index 01398944e6..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java deleted file mode 100644 index bb24e2132e..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o) { - linkedList.add(o); - } - - public Object deQueue() { - return linkedList.removeFirst(); - } - - public boolean isEmpty() { - return linkedList.size() == 0; - } - - public int size() { - return linkedList.size(); - } -} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java deleted file mode 100644 index 55c96985a9..0000000000 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - checkBound(); - return elementData.get(size() - 1); - } - - public Object peek() { - checkBound(); - return elementData.remove(size() - 1); - } - - public boolean isEmpty() { - return size() == 0; - } - - public int size() { - return elementData.size(); - } - - private void checkBound() { - if (isEmpty()) { - throw new EmptyStackException(); - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java b/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java new file mode 100644 index 0000000000..2de0c4370d --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java @@ -0,0 +1,82 @@ +package com.coding.me; + +/** + * 回文 + * + */ +public class Palindrome { + + private static String oddCase(char[] chars, int index) { + int maxLength = 1; + int i = 1; + while((index - i) >= 0 && (index + i) < chars.length - 1){ + if(chars[index - i] != chars[index + i]){ + break; + } + maxLength += 2; + i++; + } + return String.valueOf(chars, index + 1 - i, maxLength); + } + + private static String evenCase(char[] chars, int index) { + int maxLength = 0; + int i = 0; + while((index - i) >= 0 && (index + 1 + i) <= chars.length - 1){ + if(chars[index - i] != chars[index + 1 + i]){ + break; + } + i++; + maxLength += 2; + } + return String.valueOf(chars, index + 1 - i, maxLength); + } + + public static String findLongestPalindrome(String s){ + char[] chars = s.toCharArray(); + String longestPalindrome = ""; + String tmp = ""; + for(int i=0;i Date: Tue, 28 Mar 2017 10:12:58 +0800 Subject: [PATCH 018/552] gitignore --- .gitignore | 22 ++ .../src/com/skomefen/list/ArrayList.java | 83 ----- .../com/skomefen/list/ArrayListIterator.java | 25 -- .../src/com/skomefen/list/BinaryTreeNode.java | 32 -- .../src/com/skomefen/list/Iterator.java | 7 - .../src/com/skomefen/list/LinkedList.java | 252 -------------- .../com/skomefen/list/LinkedListiterator.java | 25 -- .../day3-11/src/com/skomefen/list/List.java | 9 - .../day3-11/src/com/skomefen/list/Queue.java | 26 -- .../day3-11/src/com/skomefen/list/Stack.java | 28 -- .../day3-11/src/com/skomefen/test/test.java | 109 ------ .../src/com/coderising/array/ArrayUtil.java | 117 ------- .../com/coderising/litestruts/StrutsTest.java | 54 --- .../src/com/coding/datastructs/ArrayList.java | 98 ------ .../src/com/coding/datastructs/Iterator.java | 7 - .../com/coding/datastructs/LinkedList.java | 229 ------------ .../src/com/coding/datastructs/List.java | 9 - .../com/coding/datastructs/MyIterator.java | 35 -- .../src/com/coding/datastructs/Queue.java | 30 -- .../src/com/coding/datastructs/Stack.java | 33 -- .../src/com/coding/test/ArrayListTest.java | 32 -- .../src/com/coding/test/LinkedListTest.java | 28 -- .../src/com/coding/test/QueueTest.java | 22 -- .../src/com/coding/test/StackTest.java | 25 -- .../com/coding/datastructs/ArrayUtil.java" | 141 -------- .../src/com/coding/test/ArrayUtilTest.java" | 86 ----- .../WebContent/WEB-INF/etc/struts.xml" | 11 - .../coderising/litestruts/LoginAction.java" | 35 -- .../com/coderising/litestruts/Struts.java" | 122 ------- .../coderising/litestruts/StrutsTest.java" | 43 --- .../src/com/coderising/litestruts/Test.java" | 94 ----- .../src/com/coderising/litestruts/View.java" | 23 -- .../src/com/coderising/array/ArrayUtil.java | 96 ----- .../coderising/download/DownloadThread.java | 20 -- .../coderising/download/FileDownloader.java | 73 ---- .../download/FileDownloaderTest.java | 59 ---- .../coderising/download/api/Connection.java | 23 -- .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 27 -- .../download/impl/ConnectionManagerImpl.java | 15 - .../coderising/litestruts/LoginAction.java | 39 --- .../src/com/coderising/litestruts/Struts.java | 37 -- .../com/coderising/litestruts/StrutsTest.java | 43 --- .../src/com/coderising/litestruts/View.java | 23 -- .../src/com/coderising/litestruts/struts.xml | 11 - .../src/com/coding/basic/ArrayList.java | 32 -- .../src/com/coding/basic/BinaryTreeNode.java | 32 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 122 ------- .../565832157/src/com/coding/basic/List.java | 9 - .../565832157/src/com/coding/basic/Queue.java | 19 - .../565832157/src/com/coding/basic/Stack.java | 22 -- group23/601689050/ArrayList.java | 58 ---- group23/601689050/BinaryTreeNode.java | 50 --- group23/601689050/Iterator.java | 7 - group23/601689050/LinkedList.java | 117 ------- group23/601689050/List.java | 10 - group23/601689050/Queue.java | 45 --- group23/601689050/Stack.java | 39 --- group23/609041842/.classpath | 10 - group23/609041842/.gitignore | 1 - group23/609041842/.project | 17 - .../.settings/org.eclipse.jdt.ui.prefs | 60 ---- .../src/com/homework01/ArrayList.java | 49 --- .../src/com/homework01/LinkedList.java | 87 ----- .../609041842/src/com/homework01/Queue.java | 17 - .../609041842/src/com/homework01/Stack.java | 30 -- group23/609041842/src/test.java | 9 - .../com/basic/datastructure/ArrayList.java | 64 ---- .../com/basic/datastructure/LinkedList.java | 98 ------ .../com/basic/datastructure/List.java | 9 - .../com/basic/datastructure/Queue.java | 23 -- .../com/basic/datastructure/Stack.java | 29 -- .../datastructure/TestDataStructure.java | 27 -- .../basic/week2/datastructure/ArrayTest.java | 50 --- .../basic/week2/datastructure/ArrayUtil.java | 228 ------------ group23/729693763/First_Homework1/.classpath | 7 - group23/729693763/First_Homework1/.project | 17 - .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 11 - group23/729693763/First_Homework1/readme.md | 2 - .../src/com/danny/hw1/ArrayList.java | 117 ------- .../src/com/danny/hw1/BinaryTreeNode.java | 101 ------ .../src/com/danny/hw1/Iterator.java | 6 - .../src/com/danny/hw1/LinkedList.java | 296 ---------------- .../src/com/danny/hw1/List.java | 10 - .../src/com/danny/hw1/Queue.java | 25 -- .../src/com/danny/hw1/Stack.java | 40 --- .../src/com/danny/hw1/test/ArrayListTest.java | 80 ----- .../danny/hw1/test/BinaryTreeNodeTest.java | 48 --- .../com/danny/hw1/test/LinkedListTest.java | 86 ----- .../src/com/danny/hw1/test/QueueTest.java | 47 --- .../src/com/danny/hw1/test/StackTest.java | 54 --- .../src/com/danny/hw1/test/SuitTest.java | 17 - group23/729693763/Second_Homework2/.classpath | 9 - group23/729693763/Second_Homework2/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 11 - .../src/com/danny/hw2/ArrayUtil.java | 221 ------------ .../src/com/danny/hw2/LoginAction.java | 39 --- .../src/com/danny/hw2/Struts.java | 163 --------- .../src/com/danny/hw2/View.java | 23 -- .../src/com/danny/hw2/test/ArrayUtilTest.java | 95 ----- .../src/com/danny/hw2/test/StrutsTest.java | 46 --- .../Second_Homework2/xmlFolder/struts.xml | 11 - .../729693763/homework1_demo/ArrayList.java | 32 -- .../homework1_demo/BinaryTreeNode.java | 32 -- .../729693763/homework1_demo/Iterator.java | 7 - .../729693763/homework1_demo/LinkedList.java | 124 ------- group23/729693763/homework1_demo/List.java | 9 - group23/729693763/homework1_demo/Queue.java | 19 - group23/729693763/homework1_demo/Stack.java | 22 -- group23/769232552/coding/pom.xml | 47 --- .../src/main/java/code01/ArrayList.java | 138 -------- .../src/main/java/code01/BinaryTree.java | 97 ------ .../coding/src/main/java/code01/Iterator.java | 7 - .../src/main/java/code01/LinkedList.java | 327 ------------------ .../coding/src/main/java/code01/List.java | 9 - .../coding/src/main/java/code01/Queue.java | 24 -- .../coding/src/main/java/code01/Stack.java | 31 -- .../src/main/java/code02/ArrayUtil.java | 257 -------------- .../java/code02/litestruts/ActionConfig.java | 28 -- .../java/code02/litestruts/Configuration.java | 64 ---- .../java/code02/litestruts/LoginAction.java | 39 --- .../code02/litestruts/ReflectionUtil.java | 119 ------- .../main/java/code02/litestruts/Struts.java | 76 ---- .../src/main/java/code02/litestruts/View.java | 23 -- .../src/main/java/code03/DownloadThread.java | 47 --- .../src/main/java/code03/FileDownloader.java | 109 ------ .../src/main/java/code03/api/Connection.java | 23 -- .../java/code03/api/ConnectionException.java | 9 - .../java/code03/api/ConnectionManager.java | 10 - .../java/code03/api/DownloadListener.java | 5 - .../main/java/code03/impl/ConnectionImpl.java | 107 ------ .../code03/impl/ConnectionManagerImpl.java | 36 -- .../coding/src/main/resources/struts.xml | 11 - .../src/test/java/code01/ArrayListTest.java | 67 ---- .../src/test/java/code01/BinaryTreeTest.java | 27 -- .../src/test/java/code01/LinkedListTest.java | 174 ---------- .../src/test/java/code01/QueueTest.java | 24 -- .../src/test/java/code01/StackTest.java | 27 -- .../src/test/java/code02/ArrayUtilTest.java | 73 ---- .../java/code02/litestruts/StrutsTest.java | 43 --- .../test/java/code03/FileDownloaderTest.java | 59 ---- group23/810181789/.classpath | 6 - group23/810181789/.gitignore | 1 - group23/810181789/.project | 17 - .../810181789/src/firstday/ArrayListt.java | 86 ----- group23/810181789/src/firstday/LinkListt.java | 167 --------- group23/810181789/src/firstday/Queue.java | 43 --- group23/810181789/src/firstday/Stack.java | 43 --- 152 files changed, 22 insertions(+), 8079 deletions(-) delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayList.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/BinaryTreeNode.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Iterator.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedList.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/List.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Queue.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Stack.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/test/test.java delete mode 100644 group23/1072760797-skomefen/day3-19/src/com/coderising/array/ArrayUtil.java delete mode 100644 group23/1072760797-skomefen/day3-19/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/ArrayList.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/Iterator.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/LinkedList.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/List.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/MyIterator.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/Queue.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/Stack.java delete mode 100644 group23/1246614258/src/com/coding/test/ArrayListTest.java delete mode 100644 group23/1246614258/src/com/coding/test/LinkedListTest.java delete mode 100644 group23/1246614258/src/com/coding/test/QueueTest.java delete mode 100644 group23/1246614258/src/com/coding/test/StackTest.java delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/test/ArrayUtilTest.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/WebContent/WEB-INF/etc/struts.xml" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/LoginAction.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Struts.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" delete mode 100644 group23/565832157/src/com/coderising/array/ArrayUtil.java delete mode 100644 group23/565832157/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/565832157/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/565832157/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/565832157/src/com/coderising/download/api/Connection.java delete mode 100644 group23/565832157/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/565832157/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/565832157/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/LoginAction.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/Struts.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/View.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/struts.xml delete mode 100644 group23/565832157/src/com/coding/basic/ArrayList.java delete mode 100644 group23/565832157/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group23/565832157/src/com/coding/basic/Iterator.java delete mode 100644 group23/565832157/src/com/coding/basic/LinkedList.java delete mode 100644 group23/565832157/src/com/coding/basic/List.java delete mode 100644 group23/565832157/src/com/coding/basic/Queue.java delete mode 100644 group23/565832157/src/com/coding/basic/Stack.java delete mode 100644 group23/601689050/ArrayList.java delete mode 100644 group23/601689050/BinaryTreeNode.java delete mode 100644 group23/601689050/Iterator.java delete mode 100644 group23/601689050/LinkedList.java delete mode 100644 group23/601689050/List.java delete mode 100644 group23/601689050/Queue.java delete mode 100644 group23/601689050/Stack.java delete mode 100644 group23/609041842/.classpath delete mode 100644 group23/609041842/.gitignore delete mode 100644 group23/609041842/.project delete mode 100644 group23/609041842/.settings/org.eclipse.jdt.ui.prefs delete mode 100644 group23/609041842/src/com/homework01/ArrayList.java delete mode 100644 group23/609041842/src/com/homework01/LinkedList.java delete mode 100644 group23/609041842/src/com/homework01/Queue.java delete mode 100644 group23/609041842/src/com/homework01/Stack.java delete mode 100644 group23/609041842/src/test.java delete mode 100644 group23/632678665/com/basic/datastructure/ArrayList.java delete mode 100644 group23/632678665/com/basic/datastructure/LinkedList.java delete mode 100644 group23/632678665/com/basic/datastructure/List.java delete mode 100644 group23/632678665/com/basic/datastructure/Queue.java delete mode 100644 group23/632678665/com/basic/datastructure/Stack.java delete mode 100644 group23/632678665/com/basic/datastructure/TestDataStructure.java delete mode 100644 group23/632678665/com/basic/week2/datastructure/ArrayTest.java delete mode 100644 group23/632678665/com/basic/week2/datastructure/ArrayUtil.java delete mode 100644 group23/729693763/First_Homework1/.classpath delete mode 100644 group23/729693763/First_Homework1/.project delete mode 100644 group23/729693763/First_Homework1/.settings/org.eclipse.core.resources.prefs delete mode 100644 group23/729693763/First_Homework1/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group23/729693763/First_Homework1/readme.md delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/List.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java delete mode 100644 group23/729693763/Second_Homework2/.classpath delete mode 100644 group23/729693763/Second_Homework2/.project delete mode 100644 group23/729693763/Second_Homework2/.settings/org.eclipse.jdt.core.prefs delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/View.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java delete mode 100644 group23/729693763/Second_Homework2/xmlFolder/struts.xml delete mode 100644 group23/729693763/homework1_demo/ArrayList.java delete mode 100644 group23/729693763/homework1_demo/BinaryTreeNode.java delete mode 100644 group23/729693763/homework1_demo/Iterator.java delete mode 100644 group23/729693763/homework1_demo/LinkedList.java delete mode 100644 group23/729693763/homework1_demo/List.java delete mode 100644 group23/729693763/homework1_demo/Queue.java delete mode 100644 group23/729693763/homework1_demo/Stack.java delete mode 100644 group23/769232552/coding/pom.xml delete mode 100644 group23/769232552/coding/src/main/java/code01/ArrayList.java delete mode 100644 group23/769232552/coding/src/main/java/code01/BinaryTree.java delete mode 100644 group23/769232552/coding/src/main/java/code01/Iterator.java delete mode 100644 group23/769232552/coding/src/main/java/code01/LinkedList.java delete mode 100644 group23/769232552/coding/src/main/java/code01/List.java delete mode 100644 group23/769232552/coding/src/main/java/code01/Queue.java delete mode 100644 group23/769232552/coding/src/main/java/code01/Stack.java delete mode 100644 group23/769232552/coding/src/main/java/code02/ArrayUtil.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/Struts.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/View.java delete mode 100644 group23/769232552/coding/src/main/java/code03/DownloadThread.java delete mode 100644 group23/769232552/coding/src/main/java/code03/FileDownloader.java delete mode 100644 group23/769232552/coding/src/main/java/code03/api/Connection.java delete mode 100644 group23/769232552/coding/src/main/java/code03/api/ConnectionException.java delete mode 100644 group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java delete mode 100644 group23/769232552/coding/src/main/java/code03/api/DownloadListener.java delete mode 100644 group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java delete mode 100644 group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java delete mode 100644 group23/769232552/coding/src/main/resources/struts.xml delete mode 100644 group23/769232552/coding/src/test/java/code01/ArrayListTest.java delete mode 100644 group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java delete mode 100644 group23/769232552/coding/src/test/java/code01/LinkedListTest.java delete mode 100644 group23/769232552/coding/src/test/java/code01/QueueTest.java delete mode 100644 group23/769232552/coding/src/test/java/code01/StackTest.java delete mode 100644 group23/769232552/coding/src/test/java/code02/ArrayUtilTest.java delete mode 100644 group23/769232552/coding/src/test/java/code02/litestruts/StrutsTest.java delete mode 100644 group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java delete mode 100644 group23/810181789/.classpath delete mode 100644 group23/810181789/.gitignore delete mode 100644 group23/810181789/.project delete mode 100644 group23/810181789/src/firstday/ArrayListt.java delete mode 100644 group23/810181789/src/firstday/LinkListt.java delete mode 100644 group23/810181789/src/firstday/Queue.java delete mode 100644 group23/810181789/src/firstday/Stack.java diff --git a/.gitignore b/.gitignore index 825a471a70..95026b5340 100644 --- a/.gitignore +++ b/.gitignore @@ -287,3 +287,25 @@ target liuxin/.DS_Store liuxin/src/.DS_Store + +group23/729693763/* + +group23/1072760797-skomefen/* + +group23/609041842/* + +group23/810181789/* + +group23/1246614258/* + +group23/565832157/* + +group23/601689050/* + +group23/632678665/* + +group23/769232552/* + + + + diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayList.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayList.java deleted file mode 100644 index 2567132d2a..0000000000 --- a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayList.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.skomefen.list; - -public class ArrayList implements List { - - - private int size = 0; - - private Object[] elementData = new Object[100]; - - private Iterator iterator ; - - public void add(Object o){ - - if(sizesize||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - - if(sizesize||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - - return elementData[index]; - - } - - public Object remove(int index){ - if(index>size||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - Object revalue = elementData[index]; - Object[] dest = new Object[elementData.length]; - System.arraycopy(elementData, 0, dest, 0, index); - System.arraycopy(elementData, index+1, dest, index, elementData.length-1-index); - elementData = dest; - size--; - return revalue; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - iterator = new ArrayListIterator(this); - return iterator; - } - -} diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java deleted file mode 100644 index 345d620c0e..0000000000 --- a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.skomefen.list; - -public class ArrayListIterator implements Iterator { - private ArrayList array = null; - private int index = 0; - public ArrayListIterator(ArrayList array) { - this.array = array; - } - public boolean hasNext() { - if(array==null){ - return false; - } - if(indexsize||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - insertoflist(index, o); - - - } - public Object get(int index){ - if(index>=size||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - if(head==null){ - return null; - } - if(index==point){ - return node.data; - } - this.point=0; - node = head; - while(index>=this.point){ - - if(index==point){ - return node.data; - } - point++; - node = node.next; - } - return null; - } - public Object remove(int index){ - if(index>=size||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - size--; - if(index==(this.point+1)){ - Object o =node.next.data; - node.next = node.next.next; - return o; - } - this.point = 0; - if(index==0){ - head = head.next; - Object o =head.data; - node = head; - return o; - } - - Object o = null; - while(index<=(this.point+1)){ - if(index==(this.point+1)){ - o =node.next.data; - node.next = node.next.next; - - } - point++; - node = node.next; - } - return o; - } - - public int size(){ - - return size; - } - - public void addFirst(Object o){ - add(0,o); - } - public void addLast(Object o){ - add(size,o); - } - public Object removeFirst(){ - if(head==null){ - return null; - } - remove(0); - return null; - } - public Object removeLast(){ - if(head==null){ - return null; - } - remove(size-1); - return null; - } - public Iterator iterator(){ - iterator = new LinkedListiterator(this); - return iterator; - } - - - private static class Node{ - private Object data; - private Node next; - - - } - - private void insertoflist(int index,Object o){ - - if(index>size||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - - if(head==null){ - head = new Node(); - head.data=o; - head.next=new Node(); - size++; - node = head; - this.point = 0; - return; - } - if(index==(this.point+1)){ - pointlast(index, o); - return; - } - //head不等于空,先从head顺序往下找 - this.point = 0; - if(index == this.point){ - Node next = head; - head = new Node(); - head.next = next; - head.data = o; - node = head;//当前节点为head - this.point = index; - size++; - return; - } - do{ - if(index==(this.point+1)){ - pointlast(index, o); - return; - } - node = node.next; - this.point++; - }while(index>(this.point+1)); - - } - - private void pointlast(int index, Object o) { - if(index==(this.point+1)){ - if(index==size){//index插入List结尾 - this.point = this.point+1; - node = node.next; - node.data=o; - node.next = new Node(); - size++; - return; - } - this.point = this.point+1; - Node next = node.next;//从上一个node获取下一个node - node.next = new Node();//上一个节点指向新建节点 - node = node.next;//获取新建节点 - node.data=o;//新建节点获取值 - node.next = next;//新建节点指向下一个节点 - size++; - return; - } - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java deleted file mode 100644 index c04de32a93..0000000000 --- a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.skomefen.list; - -public class LinkedListiterator implements Iterator { - - private LinkedList link = null; - private int index = 0; - public LinkedListiterator(LinkedList link) { - this.link = link; - } - public boolean hasNext() { - if(link==null){ - return false; - } - if(index params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - - View view = Struts.runAction(actionName,params); - - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一�? - - - View view = Struts.runAction(actionName,params); - - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/1246614258/src/com/coding/datastructs/ArrayList.java b/group23/1246614258/src/com/coding/datastructs/ArrayList.java deleted file mode 100644 index bf8da9cccc..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/ArrayList.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.coding.datastructs; - -import java.util.ConcurrentModificationException; -import java.util.NoSuchElementException; - - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = null; - - public ArrayList(){ - size=0; - elementData=new Object[10]; - } - - public void add(Object o){ - size(); - elementData=grow(elementData,1); - elementData[size] = o; - } - public void add(int index, Object o){ - size(); - if (index >size || index < 0||index == size) - throw new IndexOutOfBoundsException( - "Index: "+index+", Size: "+size); - Object temp = elementData; - elementData=grow(elementData,1); // Increments modCount!! - System.arraycopy(temp, index, elementData, index + 1, - size - index); - elementData[index] = o; - } - - public Object get(int index){ - size(); - if (index > size || index < 0 ||index == size) - throw new IndexOutOfBoundsException( - "Index: "+index+", Size: "+size); - return elementData[index]; - } - - public Object remove(int index){ - size(); - if (index > size || index < 0 ||index == size) - throw new IndexOutOfBoundsException( - "Index: "+index+", Size: "+size); - Object tempData = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, - size - index); - return tempData; - } - - public int size(){ - for(int i=0;i= size) - throw new NoSuchElementException(); - Object[] elementData = ArrayList.this.elementData; - if (i >= elementData.length) - throw new ConcurrentModificationException(); - cursor = i + 1; - return elementData[lastRet = i]; - } - - -} - - - -} diff --git a/group23/1246614258/src/com/coding/datastructs/Iterator.java b/group23/1246614258/src/com/coding/datastructs/Iterator.java deleted file mode 100644 index 56acec15a3..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.datastructs; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/1246614258/src/com/coding/datastructs/LinkedList.java b/group23/1246614258/src/com/coding/datastructs/LinkedList.java deleted file mode 100644 index cd5de44121..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/LinkedList.java +++ /dev/null @@ -1,229 +0,0 @@ -package com.coding.datastructs; - -public class LinkedList implements List{ - - private Node head; - private int size ; - - public LinkedList() { - size = 0; - head=new Node(); - } - - public void add(Object o) { - Node pnew = new Node(); - pnew.setData(o); - pnew.next = null; - if(null==head.getNext()){ - head.setNext(pnew); - return; - } - Node ptr = head.getNext(); - Node ptr1 = new Node(); - - while (ptr != null) { - ptr1 = ptr; - ptr = ptr.getNext(); - } - ptr1.next = pnew; - - } - - public void add(int index, Object o) { - size(); - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - Node ptr; - Node ptemp = new Node(); - ; - Node pnew;// ʵ½ڵ - ptr = head.getNext(); - int i = 0; - if (ptr == null && size == 0) { - System.out.println("ʧܣ"); - } - while (ptr != null) { - ptemp = ptr; - if (index == 0) { - pnew = new Node(); - pnew.setData(o); - pnew.setNext(ptr); - head.setNext(pnew); - break; - } - if (index == i && index > 0) { - ptemp = getNode(i-1); - pnew = new Node(); - pnew.setData(o); - pnew.setNext(ptr); - ptemp.setNext(pnew);// - System.out.println("" + o + "ɹ"); - break; - } - ptr = ptr.getNext(); - i++; - } - if (ptr == null && size > 0) { - pnew = new Node(); - pnew.setData(o); - pnew.setNext(null); - ptemp.setNext(pnew);// - System.out.println("" + o + "ɹ"); - } - - } - - public Object get(int index) { - size(); - if (index > size || index < 0 || index == size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - Node ptr = head.getNext(); - Object tempData = null; - int i = 0; - while (ptr != null) { - if (index == i) { - tempData = ptr.getData(); - } - ptr = ptr.getNext(); - i++; - } - - return tempData; - } - - public Node getNode(int index) { - size(); - if (index > size || index < 0 || index == size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - Node ptr = head.getNext(); - Node tempData = null; - int i = 0; - while (ptr != null) { - if (index == i) { - tempData = ptr; - } - ptr = ptr.getNext(); - i++; - } - - return tempData; - } - - public Object remove(int index) { - size(); - if(size()==0){ - throw new NullPointerException("listڲΪգɾ"); - } - if (index > size || index < 0 || index == size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - Node ptr = head.getNext(); - Node ptrNext = new Node(); - Object tempData = null; - int i = 0; - while (ptr != null) { - if (index == 0) { - ptrNext = ptr.getNext(); - head.setNext(ptrNext); - break; - } - if (index == i && index > 0) { - Node ptrprevious = getNode(i - 1); - tempData = ptr.getData(); - ptrprevious.setNext(ptr.getNext()); - break; - } - ptr = ptr.getNext(); - i++; - } - return tempData; - } - - public int size() { - int i = 0; - Node ptr = head.getNext(); - while (ptr != null) { - ptr = ptr.getNext(); - i++; - } - size = i; - return size; - } - - public void addFirst(Object o) { - add(0,o); - - } - - public void addLast(Object o) { - /*Node ptr = head.getNext(); - Node pnew = new Node(); - pnew.setData(o); - Node ptemp = new Node(); - if (ptr == null) { - head.setNext(pnew); - } else { - while (ptr != null) { - ptemp = ptr; - ptr = ptr.getNext(); - } - if (ptr == null) { - ptemp.setNext(pnew); - } - }*/ - add(size(),o); - - } - - public Object removeFirst() { - Node ptr = head.getNext(); - Object temp = null; - if (ptr == null) { - throw new NullPointerException("LinkedListݣܽɾ"); - } else { - temp = ptr.getData(); - remove(0); - } - - return temp; - } - - public Object removeLast() { - size(); - Node ptr = head.getNext(); - Object temp = null; - if (ptr == null) { - throw new NullPointerException("LinkedListݣܽɾ"); - } else { - temp = remove(size - 1); - } - - return temp; - } - - private static class Node { - Object data; - Node next; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public Node getNext() { - return next; - } - - public void setNext(Node next) { - this.next = next; - } - - } - -} diff --git a/group23/1246614258/src/com/coding/datastructs/List.java b/group23/1246614258/src/com/coding/datastructs/List.java deleted file mode 100644 index 35ece31ca6..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.datastructs; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/1246614258/src/com/coding/datastructs/MyIterator.java b/group23/1246614258/src/com/coding/datastructs/MyIterator.java deleted file mode 100644 index be827a7875..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/MyIterator.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.datastructs; - -import java.util.Iterator; - -public class MyIterator { - public Iterator iterator(){ - return null; - } - private class Itera implements Iterator{ - int cursor; - int lastRet = -1; - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return false; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - return null; - } - - @Override - public void remove() { - // TODO Auto-generated method stub - - } - - - - } - -} diff --git a/group23/1246614258/src/com/coding/datastructs/Queue.java b/group23/1246614258/src/com/coding/datastructs/Queue.java deleted file mode 100644 index 4e36db418a..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/Queue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.datastructs; - public class Queue{ - private LinkedList list = new LinkedList(); - - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - if (list.size()<=0) { - throw new NullPointerException("Queueݣܽɾ"); - } - Object o = list.get(0); - list.removeFirst(); - return o; - } - - public boolean isEmpty(){ - int count = size(); - if(count<0){ - return true; - } - return false; - } - - public int size(){ - return list.size(); - } - } - diff --git a/group23/1246614258/src/com/coding/datastructs/Stack.java b/group23/1246614258/src/com/coding/datastructs/Stack.java deleted file mode 100644 index 269f3c900e..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/Stack.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.coding.datastructs; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (elementData.size()<=0) { - throw new NullPointerException("Stackݣܽɾ"); - } - Object data = elementData.get(elementData.size()-1); - elementData.remove(size()-1); - return data; - } - - public Object peek(){ - Object data = elementData.get(elementData.size()-1); - return data; - } - public boolean isEmpty(){ - if(elementData.size()>0){ - return false; - }else{ - return false; - } - } - public int size(){ - return elementData.size(); - } -} diff --git a/group23/1246614258/src/com/coding/test/ArrayListTest.java b/group23/1246614258/src/com/coding/test/ArrayListTest.java deleted file mode 100644 index 76ba571c78..0000000000 --- a/group23/1246614258/src/com/coding/test/ArrayListTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.test; -import com.coding.datastructs.ArrayList; -import com.coding.datastructs.Iterator; - - -public class ArrayListTest { - - /** - *

Description:

- * @param args - * @author:Wilson huang - * @date 2017-3-1212:08:10 - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - ArrayList aa = new ArrayList(); - aa.add("aa"); - aa.add("bb"); - aa.add("cc"); - //aa.remove(3); - aa.add(2, "44"); - for(int i=0;iDescription:

- * @param args - * @author:Wilson huang - * @date 2017-3-121:45:58 - */ - - public static void main(String[] args) { - // TODO Auto-generated method stub - LinkedList list = new LinkedList(); - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - list.removeLast(); - for(int i=0;iDescription:

- * @param args - * @author:Wilson huang - * @date 2017-3-122:42:15 - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - Queue q = new Queue(); - q.enQueue("a"); - q.enQueue("b"); - System.out.println(q.deQueue()); - - } - -} diff --git a/group23/1246614258/src/com/coding/test/StackTest.java b/group23/1246614258/src/com/coding/test/StackTest.java deleted file mode 100644 index 41f2a15b5b..0000000000 --- a/group23/1246614258/src/com/coding/test/StackTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.test; -import com.coding.datastructs.Stack; - - -public class StackTest { - - /** - *

Description:

- * @param args - * @author:Wilson huang - * @date 2017-3-122:34:15 - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - Stack a = new Stack(); - a.push("a"); - a.push("b"); - a.push("c"); - System.out.println(a.isEmpty()); - System.out.println(a.peek()); - System.out.println(a.pop()); - - } - -} diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" deleted file mode 100644 index ff773dffcc..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" +++ /dev/null @@ -1,141 +0,0 @@ -/** - * - */ -package com.coding.datastructs; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - - -public class ArrayUtil { - - - public void reverseArray(int[] origin){ - for (int i=0; i temp = new HashSet(); - for(Integer i : newArray) - temp.add(i); - for (int i = 0; i < temp.size(); i++) { - newArray[i]=(int)temp.toArray()[i]; - } - Arrays.sort(Arrays.copyOfRange(newArray, 0, temp.size())); - return Arrays.copyOfRange(newArray, 0, temp.size()); - } - - public int[] grow(int [] oldArray, int size){ - int[] target = new int[oldArray.length+size]; - System.arraycopy(oldArray, 0, target, 0, oldArray.length); - return target; - } - - - public int[] fibonacci(int max){ - ArrayList list = new ArrayList(); - list.add(1); - list.add(1); - if(max<=1){ - return new int[0]; - } - for (int i = 2; i < max; i++) { - int a = list.get(i-1)+list.get(i-2); - if(a list = new ArrayList(); - int j=1; - for(int i=2;i<100;i++){ - j=i; - while(j>0){ - if(i%j==0&&i!=j&&j!=1){ - break; - }else{ - j--; - } - } - if(j==0){ - list.add(i); - } - } - int[] newArray = new int[list.size()]; - for(int i=0;i list = new ArrayList(); - for(int i = 1; i < max; i++) - { - int sum = 0; - for(int j = 1; j < i; j++) - { - if(i % j == 0) - { - sum = sum + j; - } - } - if(sum == i) - { - list.add(i); - } - } - int[] newArray = new int[list.size()]; - for(int i=0;i - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/LoginAction.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/LoginAction.java" deleted file mode 100644 index 07d16b45d3..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/LoginAction.java" +++ /dev/null @@ -1,35 +0,0 @@ -package com.coderising.litestruts; - - -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Struts.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Struts.java" deleted file mode 100644 index bdcafdff8a..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Struts.java" +++ /dev/null @@ -1,122 +0,0 @@ -package com.coderising.litestruts; - -import java.io.File; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.jdom.Document; -import org.jdom.Element; -import org.jdom.input.SAXBuilder; - -public class Struts { - - public static View runAction(String actionName, - Map parameters) { - - - View view = new View(); - Map> array = new HashMap>(); - Map params = new HashMap(); - Map classData = new HashMap(); - try { - analysisXml(classData,array); - Map jspData = array.get(actionName); - String s = "ԲݹactionNameûжӦclass࣬Ҫ´"; - if (!classData.containsKey(actionName)) { - throw new ClassNotFoundException(s); - } - - Class class1 = Class.forName(classData.get(actionName)); - LoginAction login = (LoginAction) class1.newInstance(); - for (String ss : parameters.keySet()) { - Method[] methos1 = class1.getMethods(); - for (int i = 0; i < methos1.length; i++) { - if (("set" + ss.substring(0, 1).toUpperCase() + ss - .substring(1)).equals(methos1[i].getName())) { - methos1[i].invoke(login, parameters.get(ss)); - break; - - } - } - } - - Method method1 = class1.getMethod("execute"); - String result = (String) method1.invoke(login); - if(null!=result){ - view.setJsp(jspData.get(result)); - } - Method[] methos2 = class1.getMethods(); - for (int i = 0; i < methos2.length; i++) { - if(methos2[i].getName().substring(0, 3).equals("get")){ - Object value1 = (Object) (methos2[i].invoke(login)); - String name1 = methos2[i].getName(); - params.put(name1.substring(3, 4).toLowerCase()+name1.substring(4), value1); - } - } - view.setParameters(params); - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - return view; - } - - - public static void analysisXml(Map xmlData,Map> array) { - try { - - String dirpath = System.getProperty("user.dir"); - String xmlFile = dirpath + "/WebContent/WEB-INF/etc/struts.xml"; - SAXBuilder builder = new SAXBuilder(); - Document doc = builder.build(new File(xmlFile)); - Element xRoot = doc.getRootElement(); - List actions = getChildren(xRoot, "action"); - for (int i = 0; i < actions.size(); i++) { - Element e = (Element) actions.get(i); - String actionName1 = getAttributeValue(e, "name"); - String className = getAttributeValue(e, "class"); - xmlData.put(actionName1, className); - List results = getChildren(e, "result"); - Map jspData = new HashMap(); - for (int j = 0; j < results.size(); j++) { - Element result = (Element) results.get(j); - String jspUrl = getValue(result); - String resultName = getAttributeValue(result, "name"); - jspData.put(resultName, jspUrl); - array.put(actionName1, jspData); - } - } - - // /StrutsDemo/WebContent/WEB-INF/etc/struts.xml - } catch (Exception e) { - e.printStackTrace(); - } - } - - - public static Element getChild(Element element, String sonMark) { - return element == null ? null : element.getChild(sonMark); - } - - - public static List getChildren(Element element, String sonMark) { - return element == null ? null : element.getChildren(sonMark); - } - - - public static String getValue(Element element) { - return element == null ? "" : element.getValue(); - } - - - public static String getAttributeValue(Element element, String attribute) { - return element == null ? null : element.getAttributeValue(attribute); - } - -} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" deleted file mode 100644 index 52f08f3652..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //ԤIJһ - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" deleted file mode 100644 index d7bcd36d42..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" +++ /dev/null @@ -1,94 +0,0 @@ -/** - * - */ -package com.coderising.litestruts; - -import java.io.BufferedReader; -import java.io.File; -import java.io.StringReader; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.jdom.Document; -import org.jdom.Element; -import org.jdom.input.SAXBuilder; - -/** - * Title: - * Description: - * @author HuangLiang - * @201731710:55:39 - * - */ -public class Test { - - /**Description: - * @param args - * @author HuangLiang 2017317 10:55:39 - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - String name1 = "getName"; - System.out.println(name1.substring(3, 4).toLowerCase()+name1.substring(4)); - try { - Class class1 = Class.forName("com.coderising.litestruts.LoginAction"); - Method[] methos1 = class1.getMethods(); - for(int i=0;i para[] = methos1[i].getParameterTypes(); - throw new ClassNotFoundException(); - } - System.out.println(""); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - /** - * ȡXMLӱǩ - * - * @param element - * ǩڵ - * @param sonMark - * ӱǩ - * @return - */ - public static Element getChild(Element element, String sonMark) { - return element == null ? null : element.getChild(sonMark); - } - - /** - * ȡXMLӱǩ - * - * @param element - * ǩڵ - * @param sonMark - * ӱǩ - * @return - */ - public static List getChildren(Element element, String sonMark) { - return element == null ? null : element.getChildren(sonMark); - } - - /** - * s ȡXMLǩֵ - * - * @param element - * @return - */ - public static String getValue(Element element) { - return element == null ? "" : element.getValue(); - } - /** - * s ȡXMLֵ - * - * @param element - * @return - */ - public static String getAttributeValue(Element element, String attribute) { - return element == null ? null : element.getAttributeValue(attribute); - } - -} diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" deleted file mode 100644 index f68a8c438b..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} \ No newline at end of file diff --git a/group23/565832157/src/com/coderising/array/ArrayUtil.java b/group23/565832157/src/com/coderising/array/ArrayUtil.java deleted file mode 100644 index e5ddb476a6..0000000000 --- a/group23/565832157/src/com/coderising/array/ArrayUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.coderising.array; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin){ - - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray){ - return null; - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2){ - return null; - } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - return null; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max){ - return null; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - return null; - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max){ - return null; - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator){ - return null; - } - - -} diff --git a/group23/565832157/src/com/coderising/download/DownloadThread.java b/group23/565832157/src/com/coderising/download/DownloadThread.java deleted file mode 100644 index 900a3ad358..0000000000 --- a/group23/565832157/src/com/coderising/download/DownloadThread.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - - public DownloadThread( Connection conn, int startPos, int endPos){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - public void run(){ - - } -} diff --git a/group23/565832157/src/com/coderising/download/FileDownloader.java b/group23/565832157/src/com/coderising/download/FileDownloader.java deleted file mode 100644 index c3c8a3f27d..0000000000 --- a/group23/565832157/src/com/coderising/download/FileDownloader.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; - - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String _url) { - this.url = _url; - - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - try { - - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - new DownloadThread(conn,0,length-1).start(); - - } catch (ConnectionException e) { - e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } - } - - - - - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - -} diff --git a/group23/565832157/src/com/coderising/download/FileDownloaderTest.java b/group23/565832157/src/com/coderising/download/FileDownloaderTest.java deleted file mode 100644 index 4ff7f46ae0..0000000000 --- a/group23/565832157/src/com/coderising/download/FileDownloaderTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.coderising.download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; -import com.coderising.download.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url = "http://localhost:8080/test.jpg"; - - FileDownloader downloader = new FileDownloader(url); - - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); - - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} diff --git a/group23/565832157/src/com/coderising/download/api/Connection.java b/group23/565832157/src/com/coderising/download/api/Connection.java deleted file mode 100644 index 0957eaf7f4..0000000000 --- a/group23/565832157/src/com/coderising/download/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.download.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group23/565832157/src/com/coderising/download/api/ConnectionException.java b/group23/565832157/src/com/coderising/download/api/ConnectionException.java deleted file mode 100644 index 1551a80b3d..0000000000 --- a/group23/565832157/src/com/coderising/download/api/ConnectionException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public class ConnectionException extends Exception { - -} diff --git a/group23/565832157/src/com/coderising/download/api/ConnectionManager.java b/group23/565832157/src/com/coderising/download/api/ConnectionManager.java deleted file mode 100644 index ce045393b1..0000000000 --- a/group23/565832157/src/com/coderising/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderising.download.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group23/565832157/src/com/coderising/download/api/DownloadListener.java b/group23/565832157/src/com/coderising/download/api/DownloadListener.java deleted file mode 100644 index bf9807b307..0000000000 --- a/group23/565832157/src/com/coderising/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java b/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java deleted file mode 100644 index 36a9d2ce15..0000000000 --- a/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.download.impl; - -import java.io.IOException; - -import com.coderising.download.api.Connection; - -public class ConnectionImpl implements Connection{ - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - - return null; - } - - @Override - public int getContentLength() { - - return 0; - } - - @Override - public void close() { - - - } - -} diff --git a/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java deleted file mode 100644 index 172371dd55..0000000000 --- a/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.coderising.download.impl; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; - -public class ConnectionManagerImpl implements ConnectionManager { - - @Override - public Connection open(String url) throws ConnectionException { - - return null; - } - -} diff --git a/group23/565832157/src/com/coderising/litestruts/LoginAction.java b/group23/565832157/src/com/coderising/litestruts/LoginAction.java deleted file mode 100644 index dcdbe226ed..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.litestruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/group23/565832157/src/com/coderising/litestruts/Struts.java b/group23/565832157/src/com/coderising/litestruts/Struts.java deleted file mode 100644 index 6df190d484..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/Struts.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.litestruts; - -import java.lang.reflect.Method; -import java.util.Map; - - - -public class Struts { - - - public static View runAction(String actionName, Map parameters) { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - - return null; - } - -} diff --git a/group23/565832157/src/com/coderising/litestruts/StrutsTest.java b/group23/565832157/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index b8c81faf3c..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/565832157/src/com/coderising/litestruts/View.java b/group23/565832157/src/com/coderising/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/565832157/src/com/coderising/litestruts/struts.xml b/group23/565832157/src/com/coderising/litestruts/struts.xml deleted file mode 100644 index e5d9aebba8..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group23/565832157/src/com/coding/basic/ArrayList.java b/group23/565832157/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 1f185736f9..0000000000 --- a/group23/565832157/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group23/565832157/src/com/coding/basic/BinaryTreeNode.java b/group23/565832157/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group23/565832157/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group23/565832157/src/com/coding/basic/Iterator.java b/group23/565832157/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group23/565832157/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/565832157/src/com/coding/basic/LinkedList.java b/group23/565832157/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 09fe0a8ff3..0000000000 --- a/group23/565832157/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group23/565832157/src/com/coding/basic/List.java b/group23/565832157/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group23/565832157/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/565832157/src/com/coding/basic/Queue.java b/group23/565832157/src/com/coding/basic/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group23/565832157/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group23/565832157/src/com/coding/basic/Stack.java b/group23/565832157/src/com/coding/basic/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group23/565832157/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group23/601689050/ArrayList.java b/group23/601689050/ArrayList.java deleted file mode 100644 index 5a4169dc9b..0000000000 --- a/group23/601689050/ArrayList.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.bjsxd.test; - -public class ArrayList implements List { - private Object[] elementData = new Object[100]; - private int size = 0; - Object[] temp = null; - - public void add(Object o) { - if (size < elementData.length) { - size++; - Object[] target = new Object[elementData.length + size]; - System.arraycopy(elementData, 0, target, 0, elementData.length); - elementData[size] = o; - } - } - - public void add(int index, Object o) { - if (index < 0 || o == null) { - throw new IllegalArgumentException("��Ӷ������"); - } else if (index <= elementData.length) { - add(o); - } else if (index > elementData.length) { - throw new IllegalArgumentException("��Ӷ���Խ��"); - } - - if (size <= elementData.length) { - this.size++; - } - Object[] target = new Object[this.size]; - System.arraycopy(elementData, 0, target, 0, index); - target[index] = o; - System.arraycopy(elementData, index, target, index + 1, elementData.length - index); - } - - public Object get(int index) { - if (index < 0 || index >= elementData.length) { - return false; - } else { - return elementData[index]; - } - } - - public Object remove(int index) { - if (index < 0 || index >= elementData.length) { - throw new IllegalArgumentException("ɾ�����󲻴���"); - } else { - for (int i = index; i < elementData.length; i++) { - elementData[i] = elementData[i + 1]; - } - return elementData[index]; - } - } - - public int size() { - return this.size; - } - -} diff --git a/group23/601689050/BinaryTreeNode.java b/group23/601689050/BinaryTreeNode.java deleted file mode 100644 index 3687306f5e..0000000000 --- a/group23/601689050/BinaryTreeNode.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.bjsxd.test; - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode root; - - public BinaryTreeNode(BinaryTreeNode root){ - this.root = root; - - } - - public BinaryTreeNode(BinaryTreeNode left,BinaryTreeNode right,Object data){ - this.left = left; - this.right = right; - this.data = data; - } - - public void buildTree(){ - - } - - public BinaryTreeNode(Object data){ - this(null,null,data); - } - public Object getData(){ - return data; - } - public void setData(Object data){ - this.data = data; - } - public BinaryTreeNode getLeft(){ - return left; - } - public void setLeft(BinaryTreeNode left){ - this.left = left; - - } - public BinaryTreeNode getRight(){ - return right; - } - public void setRight(BinaryTreeNode right){ - this.right = right; - } - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group23/601689050/Iterator.java b/group23/601689050/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group23/601689050/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/601689050/LinkedList.java b/group23/601689050/LinkedList.java deleted file mode 100644 index ee173bec67..0000000000 --- a/group23/601689050/LinkedList.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.bjsxd.test; - -public class LinkedList implements List{ - private static class Node{ - Object data; - Node next; - } - private Node head; - private Node last; - public void add (Object o){ - if (head == null){ - head = new Node(); - head.data = o; - head.next = null; - }else{ - Node MyNode = new Node(); - MyNode = head; - while (MyNode.next != null){ - MyNode = MyNode.next; - } - Node AddNode = new Node(); - MyNode.next = AddNode; - AddNode.data = o; - } - } - public void add(int index,Object o){ - if(index<0 || o ==null){ - throw new IllegalArgumentException("ӶλóҲΪ"); - }else if (index == 0 && head == null){ - head = new Node(); - head.data = o; - head.next = null; - }else if (index > 0 && head == null){ - throw new IllegalArgumentException("Ӷλó"); - }else{ - Node SrcNode = new Node(); - Node AddNode = new Node(); - Node SrcNode2 = new Node(); - SrcNode = head; - for(int i=0;i<=index;i++){ - SrcNode = SrcNode.next; - } - AddNode.next = SrcNode; - AddNode.data = o; - for (int i=0;i size){ - throw new IllegalArgumentException("ɾλó"); - }else{ - for (int i=0;i front){ - return rear - front; - }else - return Q.length-1; - } - -} diff --git a/group23/601689050/Stack.java b/group23/601689050/Stack.java deleted file mode 100644 index 106d2ecc7d..0000000000 --- a/group23/601689050/Stack.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.bjsxd.test; - -public class Stack { - private int top = -1; - private Object[] elements; - private int size = 0; - public Stack(){ - elements = new Object[100]; - } - public void push (Object o){ - elements[this.size] = o; - this.size++; - } - public Object pop(){ - if (this.size != 0){ - Object temp = elements[size-1]; - elements[size-1]=0; - size--; - return temp; - }else{ - System.out.println("ջ"); - return 0; - } - } - public Object peek(){ - if(!this.isEmpty()){ - Object temp = elements[this.size-1]; - elements[this.size-1] = 0; - this.size--; - return temp; - }else{ - System.out.println("ջ"); - return 0; - } - } - public boolean isEmpty(){ - return this.size == 0; - } -} diff --git a/group23/609041842/.classpath b/group23/609041842/.classpath deleted file mode 100644 index 4449a3dae9..0000000000 --- a/group23/609041842/.classpath +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/group23/609041842/.gitignore b/group23/609041842/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group23/609041842/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group23/609041842/.project b/group23/609041842/.project deleted file mode 100644 index b2b4094e01..0000000000 --- a/group23/609041842/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - 609041842coding - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group23/609041842/.settings/org.eclipse.jdt.ui.prefs b/group23/609041842/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index b6ec1a71fb..0000000000 --- a/group23/609041842/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,60 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_type_arguments=true -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true -sp_cleanup.use_type_arguments=false diff --git a/group23/609041842/src/com/homework01/ArrayList.java b/group23/609041842/src/com/homework01/ArrayList.java deleted file mode 100644 index 1feb6162ad..0000000000 --- a/group23/609041842/src/com/homework01/ArrayList.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.homework01; - -import java.util.Arrays; - -public class ArrayList { - - private Object[] obj = new Object[0]; - - public void add(Object o) { - Object[] tar = new Object[obj.length + 1]; - System.arraycopy(obj, 0, tar, 0, obj.length); - tar[tar.length - 1] = o; - obj = tar; - System.out.println(Arrays.toString(obj)); - } - - public void add(int index, Object o) { - Object[] tar = new Object[obj.length + 1]; - System.arraycopy(obj, 0, tar, 0, index); - tar[index] = o; - System.arraycopy(obj, index, tar, index + 1, obj.length - index); - obj = tar; - } - - public Object get(int index) { - return obj[index]; - } - - public int size(){ - return obj.length; - } - - public Object remove(int index){ - Object[] tar = new Object[obj.length-1]; - System.arraycopy(obj, 0, tar, 0, index); - System.arraycopy(obj, index+1, tar, index, obj.length-index-1); - Object o = obj[index]; - obj = tar; - return o;//���ر�ɾԪ�� - } - public static void main(String[] args) { - ArrayList al = new ArrayList(); - al.add("hello"); - al.add("java"); - al.add(2, "addm"); - System.out.println(al.remove(1)); - } - -} diff --git a/group23/609041842/src/com/homework01/LinkedList.java b/group23/609041842/src/com/homework01/LinkedList.java deleted file mode 100644 index f18c110c7c..0000000000 --- a/group23/609041842/src/com/homework01/LinkedList.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.homework01; - -public class LinkedList { - private static Node head; - private Node last; - public int size; - - public void add(Object o) { - Node l = last; - Node newNode = new Node(l, o, null); - last = newNode; - if (head == null) { - head = newNode; - size = 1; - } else { - l.next = newNode; - size++; - } - } - - public void add(int index, Object o) { - Node n = node(index); - System.out.println(n.data); - Node pred = n.prev; - Node newNode = new Node(pred, o, n); - if (pred == null) { - head = newNode; - } else { - pred.next = newNode; - } - size++; - } - - - public Node get(int index){ - return node(index); - } - public Node node(int index) { - Node n = head; - for (int i = 0; i < index; i++) { - n = n.next; - } - return n; - } - - public Node remove(int index){ - Node del = node(index); - Node after = del.next; - Node before = del.prev; - before.next = after; - after.prev = before; - size--; - return del; - } - private static class Node { - Node next; - Object data; - Node prev; - - private Node(Node prev, Object data, Node next) { - this.data = data; - this.next = next; - this.prev = prev; - } - } - - public static void main(String[] arg) { - LinkedList ll = new LinkedList(); - ll.add("hello"); - ll.add("java"); - ll.add("jvm"); - ll.add("jvmd"); - // System.out.println(ll.get(2)); -// ll.add(1, "ds"); - System.out.println(ll.get(0).data); - System.out.println(ll.get(1).data); - System.out.println(ll.get(2).data); - System.out.println(ll.get(3).data); - System.out.println(ll.size); - System.out.println(ll.remove(1).data); - System.out.println(ll.get(0).data); - System.out.println(ll.get(1).data); - System.out.println(ll.get(2).data); - System.out.println(ll.size); - } - -} diff --git a/group23/609041842/src/com/homework01/Queue.java b/group23/609041842/src/com/homework01/Queue.java deleted file mode 100644 index afc54a2dda..0000000000 --- a/group23/609041842/src/com/homework01/Queue.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.homework01; - -public class Queue { - - private LinkedList lk = new LinkedList(); - public void enQueue(Object o){ - lk.add(o); - } - public void deQueue(){ - lk.remove(lk.size-1); - } - public boolean isEmpty(){ - if(lk.size == 0) - return true; - return false; - } -} diff --git a/group23/609041842/src/com/homework01/Stack.java b/group23/609041842/src/com/homework01/Stack.java deleted file mode 100644 index a5bc4488af..0000000000 --- a/group23/609041842/src/com/homework01/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.homework01; - -public class Stack { - - private ArrayList array = new ArrayList(); - - public void push(Object o){ - array.add(o); - } - public Object pop(){ - return array.remove(array.size()-1); - } - - public boolean isEmpty(){ - if(array.size()<=0) - return true; - return false; - } - - public int size(){ - return array.size(); - } - public static void main(String[] args) { - Stack sc = new Stack(); - sc.push("hello world"); - sc.push("java"); - sc.push("jvm"); - } - -} diff --git a/group23/609041842/src/test.java b/group23/609041842/src/test.java deleted file mode 100644 index 931a307711..0000000000 --- a/group23/609041842/src/test.java +++ /dev/null @@ -1,9 +0,0 @@ -import org.junit.Test; - -public class test { - - @Test - public void test(){ - System.out.println("Heool"); - } -} diff --git a/group23/632678665/com/basic/datastructure/ArrayList.java b/group23/632678665/com/basic/datastructure/ArrayList.java deleted file mode 100644 index 35fb185737..0000000000 --- a/group23/632678665/com/basic/datastructure/ArrayList.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.basic.datastructure; - -import java.util.Arrays; - -import org.junit.Test; - -public class ArrayList implements List{ - private Object [] array =new Object [15]; - private int size=0; - private int aindex=0; - @Override - public void add(Object o) { - if(aindex>(int)(array.length/3*2)){ - array=autoGrew(array); - } - array[aindex]=o; - size++; - aindex++; - } - - @Override - public void add(int index, Object o) { - if(index>=array.length){ - throw new IndexOutOfBoundsException(); - } - array[index]=o; - size++; - aindex=index; - } - - @Override - public Object get(int index) { - if(index>=array.length){ - throw new IndexOutOfBoundsException(); - } - return array[index]; - } - - @Override - public Object remove(int index) { - if(index>=array.length){ - throw new IndexOutOfBoundsException(); - } - Object o=array[index]; - for(int i=index;iarray=new ArrayList (); - int from; - int to; - for(int i=0;i list=new ArrayList(); - for(int i=0;i set=new HashSet(); - set.addAll(list); - Object[] array=set.toArray(); - int [] arrayInt=new int [array.length]; - for(int i=0;ilist=new ArrayList(); - list.add(front); - list.add(behind); - while(true){ - result=front+behind; - if(max list=new ArrayList(); - int num=3; - list.add(2); - boolean flag=true; - while(true){ - flag=true; - for(int i=2;i list=new ArrayList(); - Set temp=new HashSet(); - int num=1; - int result=0; - while(true){ - for(int i=1;imax){ - break; - } - if(num==result){ - list.add(num); - } - temp.clear(); - result=0; - num++; - } - int [] array=new int [list.size()]; - for(int i=0;i list=new ArrayList(); - for(int i=0;i - - - - - - diff --git a/group23/729693763/First_Homework1/.project b/group23/729693763/First_Homework1/.project deleted file mode 100644 index 5022bfb83c..0000000000 --- a/group23/729693763/First_Homework1/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - First_Homework1 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group23/729693763/First_Homework1/.settings/org.eclipse.core.resources.prefs b/group23/729693763/First_Homework1/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203..0000000000 --- a/group23/729693763/First_Homework1/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/group23/729693763/First_Homework1/.settings/org.eclipse.jdt.core.prefs b/group23/729693763/First_Homework1/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group23/729693763/First_Homework1/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group23/729693763/First_Homework1/readme.md b/group23/729693763/First_Homework1/readme.md deleted file mode 100644 index 219dee010b..0000000000 --- a/group23/729693763/First_Homework1/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -It contain source code and Test file by JUnit, -you can run SuitTest for testing whole file. diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java b/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java deleted file mode 100644 index ccb3bcb12c..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.danny.hw1; - -import java.lang.reflect.Array; -import java.util.Arrays; - -import javax.print.attribute.Size2DSyntax; - -public class ArrayList implements List{ - //ArrayList Size - private int size=0; - private int array_len=2; - - //total element in here - private Object[] elementData = new Object[array_len]; - - @Override - public void add(Object o) { - // TODO Auto-generated method stub - adjustCapacity(); - this.elementData[size++] = o; - } - - @Override - public void add(int index, Object o) { - // TODO Auto-generated method stub - //Check range. if index is invalid,then would not add anythings - rangeCheckForAdd(index); - - adjustCapacity(); - System.arraycopy(elementData, index, elementData, - index + 1,size - index); - this.elementData[index] = o; - this.size++; - - } - - @Override - public Object get(int index) { - // TODO Auto-generated method stub - rangeCheckExist(index); - - return elementData[index]; - - } - - @Override - public Object remove(int index) { - // TODO Auto-generated method stub - rangeCheckExist(index); - - Object oldValue = elementData[index]; - //deal with copy operation - int moveStep = size - index - 1; - if ( moveStep > 0 ) - System.arraycopy(elementData, index+1, elementData, index,moveStep); - elementData[--size] = null; // clear to let GC do its work - - return oldValue; - - } - - @Override - public int size() { - // TODO Auto-generated method stub - return this.size; - } - - //Get Iterator - public Iterator iterator() { - return new ArrayListIterator(); - } - - /******* Iterator *******/ - private class ArrayListIterator implements Iterator{ - - private int currentIndex = 0; - - @Override - public boolean hasNext() { - return currentIndex < size(); - } - - @Override - public Object next() { - rangeCheckExist(currentIndex); - - return elementData[currentIndex++]; - } - } - - - /*******Inner function*******/ - //Increase arraylist size - private void adjustCapacity(){ - //array length can not satisfy data size; - if ( this.array_len < size() + 1 ) { - this.array_len *= 2; - this.elementData = Arrays.copyOf(elementData, array_len); - } else { - return ; - } - } - - private void rangeCheckForAdd(int index) { - //Add operation is allow to add value in [ size() ] even if [ size() ] has not data - if ( index > size() || index < 0 ) - throw new IndexOutOfBoundsException("Invalid Adding Index:"+index); - } - private void rangeCheckExist(int index) { - if ( index >= size() || index < 0 ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java b/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java deleted file mode 100644 index 8e3178b50b..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.danny.hw1; - -import java.util.Map; -import java.util.TreeMap; - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode insert(Object o){ - if ( this.data == null && left == null && right == null ) { - this.data = o; - return this; - } else { - BinaryTreeNode temp = findNode(this, o); - - BinaryTreeNode newNode = new BinaryTreeNode(); - newNode.data = o; - //assert more than one null node in the temp(left,right,or both); - if ( temp.compareTo(o) >= 0 ) { - temp.left = newNode; - } else { - temp.right = newNode; - } - return newNode; - } - } - - public BinaryTreeNode() { - // TODO Auto-generated constructor stub - data=null; - left =null; - right = null; - - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - private int compareTo(Object o){ - // o1 > o2 == 1; o1 = o2 == 0 ; o1 < o2 == -1 - //假设这个比较现在只用在数字上 - return Integer.parseInt(this.data.toString()) - Integer.parseInt(o.toString()); - } - - private static BinaryTreeNode findNode(BinaryTreeNode root,Object o){ - if ( root.left == null && root.right == null || - ( root.compareTo(o) < 0 && root.right == null) || - ( root.compareTo(o) >= 0 && root.left == null) ){ - return root; - } else if ( root.compareTo(o) >= 0 ) { - //root data is bigger than object - return findNode(root.left, o); - } else { - return findNode(root.right, o); - } -// else if(root.compareTo(o) < 0 ){ -// return findNode(root.right, o); -// } -// - } - - //For Test value - private Map teMap = new TreeMap<>(); - public void printWholeTree(BinaryTreeNode root,int layer){ - if(root == null) { - return ; - } - teMap.put(root.data,layer); - - layer++; - printWholeTree(root.left,layer); - printWholeTree(root.right,layer); - - } - - public Map getTeMap() { - return teMap; - } - - public void setTeMap(Map teMap) { - this.teMap = teMap; - } -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java deleted file mode 100644 index b1ff654263..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.danny.hw1; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java b/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java deleted file mode 100644 index 64c9b9bbca..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java +++ /dev/null @@ -1,296 +0,0 @@ -package com.danny.hw1; - -public class LinkedList implements List{ - - private Node Head = null; - private Node Tail = null; - private int size = 0; - - @Override - public void add(Object o) { - // TODO Auto-generated method stub - addLastNode(o); - } - - @Override - public void add(int index, Object o) { - // TODO Auto-generated method stub - checkPositionIndex(index); - - if ( index == size() ){ - addLastNode(o); - } else { - addBeforeNode(index,o); - } - } - - @Override - public Object get(int index) { - // TODO Auto-generated method stub - checkElementIndex(index); - - Node findGetNode = findIndexNode(index); - return findGetNode.data; - } - - @Override - public Object remove(int index) { - // TODO Auto-generated method stub - checkElementIndex(index); - Node deleteNode = null; - - //delete all node - if ( size() == 1 ) { - deleteNode = this.Head; - this.Head = null; - this.Tail = null; - } else if ( index == 0 ) { - //Remove Head - deleteNode = this.Head; - this.Head = this.Head.next; - } else if ( index == size() - 1) { - //Remove Tail - deleteNode = this.Tail; - Node findDeleteNode = findIndexNode(index - 1); - findDeleteNode.next = null; - this.Tail = findDeleteNode; - } else { - //Remove Mid - Node findDeleteNode = findIndexNode(index - 1); - deleteNode = findDeleteNode.next; - findDeleteNode.next = findDeleteNode.next.next; - } - this.size--; - return deleteNode.data; - } - - @Override - public int size() { - // TODO Auto-generated method stub - return this.size; - } - - @Override - public Iterator iterator(){ - return new LinkedListIterator(); - } - - /************Other function (without Interface function)**************/ - - public void addFirst(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = this.Head; - this.Head = newNode; - } - - public Object removeFirst(){ - checkElementIndex(0); - - Node deleteNode = this.Head; - this.Head = this.Head.next; - - this.size--; - return deleteNode.data; - } - - public Object removeLast(){ - checkElementIndex(size() - 1); - - Node deleteNode = this.Tail; - if ( this.Head == this.Tail ) { - this.Head = this.Tail = null; - } else { - this.Tail = findIndexNode(size() - 2); - } - this.size--; - return deleteNode.data; - - } - /************Iterator**************/ - private class LinkedListIterator implements Iterator{ - private Node currentNode; - private int currentIndex; - - public LinkedListIterator() { - // TODO Auto-generated constructor stub - this.currentIndex = 0; - this.currentNode = new Node(); - } - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return currentIndex < size(); - } - - @Override - public Object next() { - // TODO Auto-generated method stub - checkElementIndex(currentIndex); - if ( currentNode.data == null ) { - this.currentNode = findIndexNode(currentIndex); - } - Object value = currentNode.data; - currentNode = currentNode.next; - currentIndex++; - return value; - } - } - - /************Node class for supporting LinkedList**************/ - private static class Node{ - Object data ; - Node next ; - public Node() { - // TODO Auto-generated constructor stub - data = null; - next = null; - } - } - - /************Inner function **************/ - private void checkPositionIndex(int index){ - if ( !( index >= 0 && index <= size ) ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - private void checkElementIndex(int index){ - if ( !( index >= 0 && index < size ) ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - private void addLastNode(Object o){ - Node newNode = new Node(); - newNode.data = o; - - if ( this.Head == null ) { - this.Head = newNode; - this.Tail = newNode; - } else { - if(this.Head == this.Tail ){ - this.Tail = newNode; - this.Head.next = this.Tail; - } - else{ - //Tail and Head are different Object, - this.Tail.next = newNode; - this.Tail = newNode; - } - } - this.size++; - } - - private void addBeforeNode(int index,Object o){ - Node newNode = new Node(); - Node beforeInserNode = this.Head; - newNode.data = o; - - // if index is in Head - if ( index == 0 ) { - newNode.next = this.Head; - this.Head = newNode; - } else { - for (int i=0; i7->10 , 逆置后变为 10->7->3 -// */ -//public void reverse(){ -// -//} -// -///** -// * 删除一个单链表的前半部分 -// * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 -// * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 -// -// */ -//public void removeFirstHalf(){ -// -//} -// -///** -// * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 -// * @param i -// * @param length -// */ -//public void remove(int i, int length){ -// -//} -///** -// * 假定当前链表和list均包含已升序排列的整数 -// * 从当前链表中取出那些list所指定的元素 -// * 例如当前链表 = 11->101->201->301->401->501->601->701 -// * listB = 1->3->4->6 -// * 返回的结果应该是[101,301,401,601] -// * @param list -// */ -//public static int[] getElements(LinkedList list){ -// return null; -//} -// -///** -// * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 -// * 从当前链表中中删除在list中出现的元素 -// -// * @param list -// */ -// -//public void subtract(LinkedList list){ -// -//} -// -///** -// * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 -// * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) -// */ -//public void removeDuplicateValues(){ -// -//} -// -///** -// * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 -// * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) -// * @param min -// * @param max -// */ -//public void removeRange(int min, int max){ -// -//} -// -///** -// * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) -// * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 -// * @param list -// */ -//public LinkedList intersection( LinkedList list){ -// return null; -//} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/List.java b/group23/729693763/First_Homework1/src/com/danny/hw1/List.java deleted file mode 100644 index e71a86c78d..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.danny.hw1; - -public interface List { - void add(Object o); - void add(int index,Object o); - Object get(int index); - Object remove(int index); - int size(); - Iterator iterator(); -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java deleted file mode 100644 index 58f957dd31..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.danny.hw1; - -public class Queue { - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - if ( size() > 0 ) { - return elementData.remove(0); - } else { - throw new IndexOutOfBoundsException("Queue is Null"); - } - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java deleted file mode 100644 index 165387695b..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.danny.hw1; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - this.elementData.add(o); - - } - - public Object pop(){ - int size = this.elementData.size(); - - if ( size > 0 ) { - return this.elementData.remove(size - 1 ); - } else{ - throw new IndexOutOfBoundsException("Stack is empty"); - } - } - - public Object peek(){ - - if ( size() > 0 ) { - return this.elementData.get(size() - 1 ); - } else{ - throw new IndexOutOfBoundsException("Stack is empty"); - } - } - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return this.elementData.size(); - } - - public Stack() { - // TODO Auto-generated constructor stub - } -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java deleted file mode 100644 index de4c734eb8..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import java.lang.reflect.Array; -import java.lang.reflect.Parameter; -import java.util.Arrays; -import java.util.Collection; - -import javax.print.attribute.standard.RequestingUserName; -import javax.xml.crypto.Data; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; - -import com.danny.hw1.ArrayList; -import com.danny.hw1.Iterator; -import com.danny.hw1.test_al; - -import junit.extensions.TestSetup; - - -public class ArrayListTest { - - static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; - ArrayList test; - @Before - public void setUp() throws Exception{ - test = new ArrayList(); - for(Object data: Data){ - test.add(data); - } - } - - @Test - public void testAddObject() { - int len = test.size(); - test.add(10); - assertEquals(len, test.size()-1); - } - - @Test - public void testAddIntObject() { - int len = test.size(); - test.add(len, 10); - - assertEquals(len, test.size()-1); - } - - @Test - public void testGet() { - assertEquals(Data[3], test.get(3)); - } - - @Test - public void testRemove() { - assertEquals(Data[4], test.remove(4)); - assertEquals(Data.length-1, test.size()); - } - - @Test - public void testSize() { - assertEquals(Data.length, test.size()); - } - - @Test - public void testIterator() { - Iterator iterator =test.iterator(); - for(Object i:Data){ - if(iterator.hasNext()){ - assertEquals(i,iterator.next()); - } - } - } - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java deleted file mode 100644 index 2d99534098..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.danny.hw1.BinaryTreeNode; -import com.danny.hw1.LinkedList; - -public class BinaryTreeNodeTest { - - static Object[] Data = new Object[]{5,10,3,2,15,12,56,8}; - BinaryTreeNode test; - @Before - public void setUp() throws Exception{ - test = new BinaryTreeNode(); - for(Object data: Data){ - test.insert(data); - - } - } - @Test - public void testPrintWholeTree(){ - test.printWholeTree(test, 1); - int layer = 1; - int printNum = 0; - System.out.println("var {5,10,3,2,15,12,56,8} insert tree\n"+"Print binary tree:"); - while(true){ - if(printNum == test.getTeMap().size()) break; - for (Object key : test.getTeMap().keySet()) { - Integer value = test.getTeMap().get(key); - - if (value.intValue() == layer){ - System.out.print(key.toString()+" "); - printNum++; - } - - } - System.out.println(""); - layer++; - } - - - } - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java deleted file mode 100644 index ab49d2823c..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.danny.hw1.ArrayList; -import com.danny.hw1.Iterator; -import com.danny.hw1.LinkedList; - -public class LinkedListTest { - - static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; - LinkedList test; - @Before - public void setUp() throws Exception{ - test = new LinkedList(); - for(Object data: Data){ - test.add(data); - } - } - - @Test - public void testAddObject() { - int len = test.size(); - test.add(10); - assertEquals(len, test.size()-1); - } - - @Test - public void testAddIntObject() { - int len = test.size(); - test.add(len, 10); - - assertEquals(len, test.size()-1); - } - - @Test - public void testGet() { - assertEquals(Data[3], test.get(3)); - } - - @Test - public void testRemove() { - System.out.println(Data[4]); - assertEquals(Data[4], test.remove(4)); - assertEquals(Data.length -1, test.size()); - } - - @Test - public void testSize() { - assertEquals(Data.length, test.size()); - } - - @Test - public void testIterator() { - Iterator iterator =test.iterator(); - for(Object i:Data){ - if(iterator.hasNext()){ - assertEquals(i,iterator.next()); - } - } - } - - @Test - public void testAddFirst() { - test.addFirst(10); - assertEquals(10, test.get(0)); - } - - @Test - public void testRemoveFirst() { - Object ans=test.get(0); - assertEquals(ans,test.removeFirst()); - assertEquals(Data.length-1,test.size()); - } - - @Test - public void testRemoveLast() { - Object ans=test.get(Data.length - 1); - assertEquals(ans,test.removeLast()); - assertEquals(Data.length-1,test.size()); - } - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java deleted file mode 100644 index 7292129e95..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.danny.hw1.LinkedList; -import com.danny.hw1.Queue; - -public class QueueTest { - - static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; - Queue test; - @Before - public void setUp() throws Exception{ - test = new Queue(); - for(Object data: Data){ - test.enQueue(data); - } - } - - @Test - public void testEnQueue() { - Object t=10; - test.enQueue(t); - assertEquals(Data.length+1,test.size()); - } - - @Test - public void testDeQueue() { - Object t=test.deQueue(); - assertEquals(Data.length-1,test.size()); - assertEquals(Data[0], t); - } - @Test - public void testIsEmpty() { - assertFalse(test.isEmpty()); - } - - @Test - public void testSize() { - assertEquals(Data.length,test.size()); - } - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java deleted file mode 100644 index 11484c0043..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.danny.hw1.Queue; -import com.danny.hw1.Stack; - -public class StackTest { - - static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; - Stack test; - @Before - public void setUp() throws Exception{ - test = new Stack(); - for(Object data: Data){ - test.push(data); - } - } - - @Test - public void testPush() { - Object t=10; - test.push(t); - assertEquals(Data.length+1,test.size()); - } - - @Test - public void testPop() { - assertEquals(Data[Data.length-1], test.pop()); - assertEquals(Data.length-1, test.size()); - } - - @Test - public void testPeek() { - assertEquals(Data[Data.length-1], test.peek()); - assertEquals(Data.length, test.size()); - } - - @Test - public void testIsEmpty() { - assertFalse(test.isEmpty()); - } - - @Test - public void testSize() { - assertEquals(Data.length, test.size()); - } - - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java deleted file mode 100644 index 25eb57411b..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ArrayListTest.class,BinaryTreeNodeTest.class, - LinkedListTest.class,QueueTest.class,StackTest.class - }) -public class SuitTest { - -} diff --git a/group23/729693763/Second_Homework2/.classpath b/group23/729693763/Second_Homework2/.classpath deleted file mode 100644 index aa7b00d27d..0000000000 --- a/group23/729693763/Second_Homework2/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/group23/729693763/Second_Homework2/.project b/group23/729693763/Second_Homework2/.project deleted file mode 100644 index fb7175dae6..0000000000 --- a/group23/729693763/Second_Homework2/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Second_Homework2 - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group23/729693763/Second_Homework2/.settings/org.eclipse.jdt.core.prefs b/group23/729693763/Second_Homework2/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 3a21537071..0000000000 --- a/group23/729693763/Second_Homework2/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java deleted file mode 100644 index af11509593..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.danny.hw2; - -import java.util.Arrays; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = - * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * - * @param origin - * @return - */ - public void reverseArray(int[] origin) { - int size = origin.length; - int[] temp = new int[size]; - - for(int i=0;i < size; i++){ - temp[i] = origin[size-i-1]; - } - - for(int i=0;i array2[index2] ){ - result[resultIndex++] = array2[index2++]; - break; - } - } else{ - result[resultIndex++] = array1[index1++]; - } - } - System.out.println(resultIndex); - return Arrays.copyOf(result, resultIndex); - - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * - * @param oldArray - * @param size - * @return - */ - public int[] grow(int[] oldArray, int size) { - int oldSize = oldArray.length; - int[] newArray= new int[oldSize+size]; - - for ( int i = 0; i < newArray.length; i++) { - if ( i < oldSize ) { - newArray[i] = oldArray[i]; - } else{ - newArray[i] = 0; - } - } - return newArray; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , - * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] - * - * @param max - * @return - */ - public int[] fibonacci(int max) { - if(max == 1){ - return new int[0]; - } - - int maxIndex = 1000; - int realIndex = 0; - int[] array=new int[maxIndex]; - for (; realIndex <= array.length; realIndex++) { - int fibonacciNum = getFibonacciArray(realIndex+1); - if(fibonacciNum > max){ - break; - } - array[realIndex] = fibonacciNum; - } - - - - return Arrays.copyOf(array, realIndex); - } - - - private int getFibonacciArray(int index){ - - if(index == 0 || index == 1){ - return index; - } - return getFibonacciArray(index - 1) + getFibonacciArray(index - 2); - } - /** - * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * - * @param max - * @return - */ - public int[] getPrimes(int max) { - int maxIndex = 1000; - int realSize = 0; - int[] array = new int[maxIndex]; - for (int i = 0; i < max; i++) { - if(isPrimers(i)){ - array[realSize++] = i; - } - } - return Arrays.copyOf(array, realSize); - } - private static boolean isPrimers(int n){ - if (n <= 3) { - return n > 1; - } - - for(int i=2;i<=Math.sqrt(n);i++){ - if(n%i == 0) - return false; - } - return true; - } - - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) { - int maxIndex = 1000; - int realIndex = 0; - int[] array = new int[maxIndex]; - int sum = 0; - - for (int i = 1; i < max /2 +1; i++) { - if(max % i == 0){ - sum += i; - array[realIndex++] = i; - } - } - if(sum == max){ - return Arrays.copyOf(array, realIndex); - }else{ - return new int[0]; - } - - } - - /** - * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" - * - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator) { - String result=""; - for (int i = 0; i < array.length; i++) { - result+= String.valueOf(array[i]) + seperator; - } - //去掉多余的一个seperator - return result.substring(0, result.length()-1); - } - - - - -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java deleted file mode 100644 index 340d542dec..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.danny.hw2; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java deleted file mode 100644 index 6e1cb4ba96..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.danny.hw2; - -import java.io.File; -import java.lang.invoke.CallSite; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import org.jaxen.*; - -public class Struts { - - private static Document file = null; - private static String file_path = - new File("").getAbsolutePath()+".\\xmlFolder\\struts.xml"; - - private static String viewPath="com.danny.hw2.View"; - - //0. 读取配置文件struts.xml - private static Document parse(String path){ - SAXReader reader = new SAXReader(); - Document document = null; - try { - document = reader.read(path); - } catch (DocumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return document; - } - - private static Element getAction(Document document,String name){ - - List lElement = (List) file.selectObject("/struts/action"); - Element actionElement = null; - for(Element e:lElement){ - if(e.attributeValue("name").equals(name)){ - actionElement = e; - break; - } - } - return actionElement; - } - - public static View runAction(String actionName, Map parameters) { - - file = parse(file_path); - - //返回的class View; - Object viewClass = null; - - - //0 Get Action Element - Element actionElement = getAction(file, actionName); - - - String actionClassPath = actionElement.attributeValue("class"); - System.out.println(actionClassPath); - - Object action = null; - - try { - /* - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - */ - action = Class.forName(actionClassPath).newInstance(); - - Method setName = action.getClass().getMethod("setName",String.class); - setName.invoke(action, parameters.get("name")); - - Method setPassword = action.getClass().getMethod("setPassword",String.class); - setPassword.invoke(action, parameters.get("password")); - - - //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - Method execute = action.getClass().getMethod("execute", null); - Object status = execute.invoke(action); - - System.out.println(status.toString()); - - - //3获得所有的Getter字段 - Field[] files = action.getClass().getDeclaredFields(); - - HashMap save = new HashMap<>(); - - //找到需要的数据,线存到save中 - for (int i = 0; i < files.length; i++) { - String name = files[i].getName(); - name = "get" + name.substring(0,1).toUpperCase() + - name.substring(1); - - - Method getter = action.getClass().getMethod(name,null); - save.put(files[i].getName(), (String) getter.invoke(action)); - - } - //塞进viewClass里面 - viewClass = Class.forName(viewPath).newInstance(); - Method setParameters = viewClass.getClass().getMethod("setParameters", Map.class); - setParameters.invoke(viewClass, save); - - - - //4将jsp放进去 - List resultElement = actionElement.selectNodes("result"); - for(Element e:resultElement){ - if(e.attributeValue("name").equals(status.toString())){ - String jspFields= e.getStringValue(); - viewClass.getClass().getMethod("setJsp", String.class). - invoke(viewClass, jspFields); - } - - } - - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - - throw new RuntimeException(e.getMessage()); - } - - - - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - - return (View) viewClass; - } - - -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java deleted file mode 100644 index 67ff0a061b..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.danny.hw2; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java deleted file mode 100644 index a7fce5320a..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.danny.hw2.test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import com.danny.hw2.ArrayUtil; - -public class ArrayUtilTest { - - @Test - public void testReverseArray() { -// * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = -// * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - int[] testData = new int[]{7,9,30,3}; - int[] ans = new int[]{3,30,9,7}; - new ArrayUtil().reverseArray(testData); - - for (int i = 0; i < ans.length; i++) { - assertEquals(ans[i], testData[i]); - } - } - - @Test - public void testRemoveZero() { - int[] testData = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; - int[] ans = new int[]{1,3,4,5,6,6,5,4,7,6,7,5}; - - int[] test = new ArrayUtil().removeZero(testData); - for (int i = 0; i < ans.length; i++) { - assertEquals(ans[i], test[i]); - } - } - - @Test - public void testMerge() { -// * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = -// * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - int[] a1 = new int[]{3, 5, 7,8}; - int[] a2 = new int[]{4,5,6,7}; - - int[] ans = new int[]{3,4,5,6,7,8}; - - int[] test = new ArrayUtil().merge(a1, a2); - - for (int i = 0; i < test.length; i++) { - assertEquals(ans[i], test[i]); - } - - } - - @Test - public void testGrow() { -// 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size -// * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 -// * [2,3,6,0,0,0] - - int size = 3; - int[] testData = new int[]{2,3,6}; - int[] test = new ArrayUtil().grow(testData, size); - assertEquals(testData.length+size, test.length); - - } - - @Test - public void testFibonacci() { - int[] ans = new int[]{1,1,2,3,5,8,13}; - int[] array = new ArrayUtil().fibonacci(15); - for (int i = 0; i < ans.length; i++) { - assertEquals(ans[i], array[i]); - } - - } - - @Test - public void testGetPerfectNumbers() { - - int[] ans=new int[]{1,2,4,7,14}; - int[] array=new ArrayUtil().getPerfectNumbers(28); - for (int i = 0; i < array.length; i++) { - assertEquals(ans[i], array[i]); - } - } - - @Test - public void testJoin() { - //* 用seperator 把数组 array给连接起来 例如array= [3,8,9], - //seperator = "-" 则返回值为"3-8-9" - int[] test = new int[]{3,8,9}; - - String test1 = new ArrayUtil().join(test, "-"); - assertEquals("3-8-9", test1); - } - -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java deleted file mode 100644 index 49b770f015..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.danny.hw2.test; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - -import com.danny.hw2.Struts; -import com.danny.hw2.View; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/729693763/Second_Homework2/xmlFolder/struts.xml b/group23/729693763/Second_Homework2/xmlFolder/struts.xml deleted file mode 100644 index 8a788e9b1f..0000000000 --- a/group23/729693763/Second_Homework2/xmlFolder/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group23/729693763/homework1_demo/ArrayList.java b/group23/729693763/homework1_demo/ArrayList.java deleted file mode 100644 index 1f185736f9..0000000000 --- a/group23/729693763/homework1_demo/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group23/729693763/homework1_demo/BinaryTreeNode.java b/group23/729693763/homework1_demo/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group23/729693763/homework1_demo/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group23/729693763/homework1_demo/Iterator.java b/group23/729693763/homework1_demo/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group23/729693763/homework1_demo/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/729693763/homework1_demo/LinkedList.java b/group23/729693763/homework1_demo/LinkedList.java deleted file mode 100644 index 4fdb03db8a..0000000000 --- a/group23/729693763/homework1_demo/LinkedList.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.coding.basic; - - - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public static int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在list中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group23/729693763/homework1_demo/List.java b/group23/729693763/homework1_demo/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group23/729693763/homework1_demo/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/729693763/homework1_demo/Queue.java b/group23/729693763/homework1_demo/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group23/729693763/homework1_demo/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group23/729693763/homework1_demo/Stack.java b/group23/729693763/homework1_demo/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group23/729693763/homework1_demo/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group23/769232552/coding/pom.xml b/group23/769232552/coding/pom.xml deleted file mode 100644 index 5b9701ed4d..0000000000 --- a/group23/769232552/coding/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - com.coding - coding2017 - 1.0-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.6 - 1.6 - - - - - - - - ch.qos.logback - logback-classic - 1.1.1 - - - dom4j - dom4j - 1.6.1 - - - junit - junit - 4.12 - test - - - commons-lang - commons-lang - 2.6 - - - - \ No newline at end of file diff --git a/group23/769232552/coding/src/main/java/code01/ArrayList.java b/group23/769232552/coding/src/main/java/code01/ArrayList.java deleted file mode 100644 index 6746de2a50..0000000000 --- a/group23/769232552/coding/src/main/java/code01/ArrayList.java +++ /dev/null @@ -1,138 +0,0 @@ -package code01; - -/** - * Created by yaoyuan on 2017/3/6. - */ -public class ArrayList implements List { - - private int max_size = 0;//总长度 - private int current_size = 0; //当前长度 - private float extendPercent = 2; //扩展系数 - - private Object[] elementData; - - /** - * 默认构造函数,初始化数组长度为100 - */ - public ArrayList(){ - this.elementData = new Object[100]; - this.max_size = 100; - } - /** - * 构造函数 - * @param size,初始化数组长度 - */ - public ArrayList(int size){ - this.elementData = new Object[size]; - this.max_size = size; - } - - /** - * 顺序添加元素,超出原始界限时,数组自动扩展 - */ - public void add(Object o) { - //如果越界了,需要复制原有的数组到扩充后的数组中 - if(this.current_size + 1 > this.max_size) { - this.max_size = (int) Math.floor(this.max_size * this.extendPercent); - this.elementData = copyToNew(this.elementData,this.max_size); - } - this.elementData[this.current_size] = o; - this.current_size ++; - - } - - /** - * 指定位置添加元素 - * 一种是在中间,一种是当前插入的位置尾部(如果超过尾部则默认添加到尾部) - */ - public void add(int index, Object o){ - assert(index>=0); - //如果越界了,需要复制原有的数组到扩充后的数组中 - if(this.current_size + 1 > this.max_size) { - //如果越界了,需要复制原有的数组到扩充后的数组中 - this.max_size = (int) Math.floor(this.max_size * this.extendPercent); - this.elementData = copyToNew(this.elementData,this.max_size); - } - //数组中间插入 - if(index < this.current_size){ - //需要把当前位置的元素往后移动 - for (int i = this.current_size - 1; i >= index; i--) { - this.elementData[i+1] = this.elementData[i]; - } - this.elementData[index] = o; - }else { - //后面加入 - this.elementData[this.current_size] = o; - } - this.current_size ++; - } - - public Object get(int index){ - if(index >= 0 && index <= this.current_size-1){ - return this.elementData[index]; - }else { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - /** - * 删除指定位置的元素 - * @param index - * @return - */ - public Object remove(int index){ - Object result = null; - if(index >= 0 && index <= current_size-1){ - result = elementData[index]; - //删除操作 - if(index == current_size - 1){ - elementData[index] = null; - }else { - //需要把当前位置后面的元素往前移动 - for (int i = index; i < this.current_size-1 ; i++) { - this.elementData[i] = this.elementData[i+1]; - } - this.elementData[this.current_size-1] = null; - } - this.current_size --; - }else { - throw new ArrayIndexOutOfBoundsException(index); - } - return result; - } - - public int size(){ - return this.current_size; - } - - public Iterator iterator(){ - return new Iterator() { - int next_pos = 0; - int pos = -1; - public boolean hasNext() { - if(max_size <= 0){ - return false; - } - return next_pos < ArrayList.this.size(); - } - - public Object next() { - Object next = ArrayList.this.get(next_pos); - pos = next_pos ++; - return next; - } - public void remove(){ - ArrayList.this.remove(pos); - } - }; - } - - private Object[] copyToNew(Object[] oldArray, int extendSize){ - Object[] newArray = new Object[extendSize]; - for (int i = 0; i < size(); i++) { - newArray[i] = oldArray[i]; - } - return newArray; - } - -} \ No newline at end of file diff --git a/group23/769232552/coding/src/main/java/code01/BinaryTree.java b/group23/769232552/coding/src/main/java/code01/BinaryTree.java deleted file mode 100644 index b29fb960cb..0000000000 --- a/group23/769232552/coding/src/main/java/code01/BinaryTree.java +++ /dev/null @@ -1,97 +0,0 @@ -package code01; - -/** - * Created by yaoyuan on 2017/3/10. - */ -public class BinaryTree>{ - - private BinaryTreeNode root = null; - private int size = 0; - - public BinaryTreeNode createBinaryTree(T[] array){ - for(T data : array){ - this.insert(data); - } - return this.root; - } - - // recursive way, - // t is the node that roots the subtree. - public BinaryTreeNode insert(T data, BinaryTreeNode t){ - if(t == null){ - return new BinaryTreeNode(data); - } - int comparator = ((T) t.data).compareTo(data); - if(comparator > 0){ - t.left = insert(data,t.right); - }else if(comparator < 0){ - t.right = insert(data,t.left); - }else { - // do nothing - } - return t; - - } - - - //loop way - public void insert(T data){ - if(this.root == null){ - BinaryTreeNode node = new BinaryTreeNode(data); - this.root = node; - this.size ++; - return; - } - BinaryTreeNode cursor = this.root; - while (cursor != null){ - if(data.compareTo((T) cursor.data) <= 0){ - if(cursor.left == null) { - cursor.left = new BinaryTreeNode(data); - return; - } - cursor = cursor.left; - } - if(data.compareTo((T) cursor.data) > 0){ - if(cursor.right == null) { - cursor.right = new BinaryTreeNode(data); - return; - } - cursor = cursor.right; - } - } - this.size ++; - } - - public void leftOrderScan(BinaryTreeNode cursor){ - if(cursor == null){ - return; - } - leftOrderScan(cursor.left); - System.out.println(cursor.data.toString() + " "); - leftOrderScan(cursor.right); - } - - public BinaryTreeNode getRoot(){ - return this.root; - } - - class BinaryTreeNode { - - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(T data, BinaryTreeNode left, BinaryTreeNode right) { - this.left = right; - this.right = left; - this.data = data; - } - - public BinaryTreeNode(T data) { - this.left = null; - this.right = null; - this.data = data; - } - - } -} diff --git a/group23/769232552/coding/src/main/java/code01/Iterator.java b/group23/769232552/coding/src/main/java/code01/Iterator.java deleted file mode 100644 index b4074067bb..0000000000 --- a/group23/769232552/coding/src/main/java/code01/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package code01; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - public void remove(); -} diff --git a/group23/769232552/coding/src/main/java/code01/LinkedList.java b/group23/769232552/coding/src/main/java/code01/LinkedList.java deleted file mode 100644 index f7bbc970a9..0000000000 --- a/group23/769232552/coding/src/main/java/code01/LinkedList.java +++ /dev/null @@ -1,327 +0,0 @@ -package code01; - - -public class LinkedList implements List { - - private Node head; - private Node tail; //指向链表最后一个元素的引用 - - private int size; //总长度 - - public LinkedList() { - this.head = null; - this.tail = null; - this.size = 0; - } - - /** - * 新增顺序添加一个元素 - * @param o - */ - public void add(Object o){ - Node node = new Node(); - node.data = o; - node.next = null; - //空链表 - if(head == null){ - this.head = node; - this.tail = node; - }else { //非空链表,要先找到链表尾部,再加入新解答 - this.tail.next = node; - this.tail = node; - } - this.size ++; - } - - /** - * 指定索引处添加node - */ - public void add(int index, Object o) { - assert(index >= 0); - Node node = new Node(); - node.data = o; - node.next = null; - - if(index == 0){ - //添加在头部 - node.next = head; - head = node; - }else if(index >= this.size){ - //添加在尾部 - this.tail.next = node; - }else { - //添加在中间 - Node cursor = this.head; - for (int i = 0; i < index - 1; i++) { - cursor = cursor.next; - } - node.next = cursor.next; - cursor.next = node; - } - this.size ++; - } - - public Object get(int index){ - assert(index < this.size); - Node cursor = this.head; - for (int i = 0; i < index; i++) { - cursor = cursor.next; - } - return cursor.data; - } - - public Object remove(int index){ - assert(index >= 0 && index < this.size); - Object result = null; - //删除的是链表尾部的元素 - if(index == this.size - 1){ - Node cursor = this.head; - for (int i = 0; i < index - 1; i++) { - cursor = cursor.next; - } - result = cursor.next.data; - tail = cursor; - cursor.next = null; - }else if(index == 0){ - //删除的是头部元素 - result = head.data; - head = head.next; - }else { - //删除的是链表中间的元素 - Node cursor = this.head; - for (int i = 0; i < index - 1; i++) { - cursor = cursor.next; - } - result = cursor.next.data; - cursor.next = cursor.next.next; - } - this.size --; - return result; - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - Node node = new Node(); - node.data = o; - node.next = null; - if(this.head == null){ - this.head = node; - this.tail = node; - }else { - node.next = head; - this.head = node; - } - this.size ++; - } - public void addLast(Object o){ - Node node = new Node(); - node.data = o; - node.next = null; - if(this.head == null){ - this.head = node; - this.tail = node; - }else { - this.tail.next = node; - this.tail = node; - } - this.size ++; - } - - public Object removeFirst(){ - Object first = null; - if(this.head != null){ - first = this.head.data; - head = head.next; - this.size --; - } - return first; - } - - public Object removeLast(){ - Object last = null; - if(this.tail != null){ - if(this.head != this.tail){ - Node cursor; - for (cursor = head;cursor.next!=tail;cursor=cursor.next); - last = this.tail.data; - this.tail = cursor; - this.tail.next = null; - }else { - last = this.tail.data; - this.head = null; - this.tail = null; - } - this.size --; - } - return last; - } - public Iterator iterator(){ - return null; - } - - /** - * 节点类 - */ - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - if(this.head == null || this.head == this.tail){ - return; - } - - Node pre_cursor = null; - Node cursor = this.head; - Node after_cursor = cursor.next; - - while(cursor != null){ - cursor.next = pre_cursor; - pre_cursor = cursor; - cursor = after_cursor; - if(after_cursor != null){ - after_cursor = after_cursor.next; - } - } - - Node tmpNode = this.head; - this.head = this.tail; - this.tail = tmpNode; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - if(this.head == null || this.head.next == null){ - return; - } - if(this.head.next.next == null){ - this.head = this.head.next; - } - - Node stepOne = this.head; - Node stepTwo = this.head; - - while (stepTwo.next != null){ - stepOne = stepOne.next; - stepTwo = stepTwo.next.next; - } - this.head = stepOne; - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - Node current = head; - Node firstHalf = null; - for (int k = 0; k < i; k ++){ - if(current == null){ - return; - } - firstHalf = current; //记录待删除节点的前一个节点 - current = current.next; - } - - //移动length长度 - for (int j = 0; j < length; j++) { - if(current == null){ - return; - } - current = current.next; - } - - if(i == 0){ - head = current; - }else { - firstHalf.next = current; - } - } - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public static int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在list中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - if(this.head == null){ - return; - } - Node current = this.head; - Node current_next = this.head; - while (current_next != null){ - current_next = current_next.next; //如果放到下个while循环后面写,就需要判断一次current_next是不是null了 - while(current_next != null && current_next.data.equals(current.data)){ - //删除重复节点 - current.next = current_next.next; - current_next = current_next.next; - } - current = current_next; - } - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - //怎么才能高效呢 - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } - - /** - * 遍历列表 - */ - public void printList(){ - System.out.println(); - for (Node cursor = this.head;cursor!=null;cursor=cursor.next){ - System.out.print(cursor.data+" "); - } - } -} diff --git a/group23/769232552/coding/src/main/java/code01/List.java b/group23/769232552/coding/src/main/java/code01/List.java deleted file mode 100644 index 95bc37d172..0000000000 --- a/group23/769232552/coding/src/main/java/code01/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package code01; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/769232552/coding/src/main/java/code01/Queue.java b/group23/769232552/coding/src/main/java/code01/Queue.java deleted file mode 100644 index d9956deb9a..0000000000 --- a/group23/769232552/coding/src/main/java/code01/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package code01; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o){ - linkedList.addFirst(o); - } - - public Object deQueue(){ - Object result = linkedList.removeLast(); - return result; - } - - public boolean isEmpty(){ - return linkedList.size() == 0; - } - - public int size(){ - return linkedList.size(); - } - -} diff --git a/group23/769232552/coding/src/main/java/code01/Stack.java b/group23/769232552/coding/src/main/java/code01/Stack.java deleted file mode 100644 index dbaeb91a48..0000000000 --- a/group23/769232552/coding/src/main/java/code01/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package code01; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - Object result = null; - if(elementData.size()!=0) { - result = elementData.remove(elementData.size() - 1); - } - return result; - } - - public Object peek(){ - Object result = null; - if(elementData.size()!=0) { - result = elementData.get(elementData.size() - 1); - } - return result; - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group23/769232552/coding/src/main/java/code02/ArrayUtil.java b/group23/769232552/coding/src/main/java/code02/ArrayUtil.java deleted file mode 100644 index 23055ef138..0000000000 --- a/group23/769232552/coding/src/main/java/code02/ArrayUtil.java +++ /dev/null @@ -1,257 +0,0 @@ -package code02; -import org.apache.commons.lang.ArrayUtils; -import java.util.ArrayList; -import java.util.List; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin){ - if (origin == null || origin.length <= 1){ - return; - } - - int head = 0; - int tail = origin.length - 1; - int tmp; - while (head != tail){ - //调换位置 - tmp = origin[head]; - origin[head] = origin[tail]; - origin[tail] = tmp; - - head ++; - tail --; - } - - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - public int[] removeZero(int[] oldArray){ - if (oldArray == null || oldArray.length < 1){ - return null; - } - - List newList = new ArrayList(); - for(int number : oldArray){ - if(number != 0){ - newList.add(number); - } - } - - Integer[] result = new Integer[newList.size()]; - result = (Integer[]) newList.toArray(result); - return ArrayUtils.toPrimitive(result); - - - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2){ - if(array1 == null && array2 == null){ - return null; - } - if(array1 == null){ - return array2; - } - if(array2 == null){ - return array1; - } - int[] newArray = new int[array1.length + array2.length]; - int m = 0,n = 0, k = 0; - while (m < array1.length && n < array2.length){ - if(array1[m] <= array2[n]){ - newArray[k++] = array1[m++]; - }else { - newArray[k++] = array2[n++]; - } - } - if(m >= array1.length){ - while (n < array2.length){ - newArray[k++] = array2[n++]; - } - } - if(n >= array2.length){ - while (m < array1.length){ - newArray[k++] = array1[m++]; - } - } - return newArray; - } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - int[] newArray = new int[oldArray.length + size]; - int i = 0; - for (; i < oldArray.length; i++) { - newArray[i] = oldArray[i]; - } - for (int j = 0; j < size; j++){ - newArray[i++] = 0; - } - return newArray; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - //也就是需要生成一个小于max值的fibonacci数组 - public int[] fibonacci(int max){ - if(max < 2){ - return new int[]{}; - } - if(max < 3){ - return new int[]{1,1}; - } - List list = new ArrayList(); - list.add(0,1); - list.add(1,1); - int i=0; - while (list.get(i) + list.get(i+1) < max){ - list.add(i+2,list.get(i) + list.get(i+1)); - i++; - } - - int[] newArray = new int[list.size()]; - for (int j = 0; j < list.size(); j++) { - newArray[j] = list.get(j).intValue(); - } - return newArray; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - * - * 原理: - * 1,判断一个数字是否为素数,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n) - * 2,当i是素数的时候,i的所有的倍数必然是合数。 - */ - public int[] getPrimes(int max){ - - if(max <= 2){ - return null; - } - boolean[] prime = new boolean[max + 1]; - for (int i = 2; i <= max; i++) { - if(i%2 == 0){ - prime[i] = false; //偶数 - }else { - prime[i] = true; - } - } - - for (int i = 2; i <= Math.sqrt(max) ; i++) { - if(prime[i]){//奇数 - //如果i是素数,那么把i的倍数标记为非素数 - for(int j = i+i; j <= max; j += i){ - prime[j] = false; - } - } - } - - List num = new ArrayList(); - for (int i = 2; i <= max; i++) { - if(prime[i]){ - num.add(i); - } - } - - Integer[] result = new Integer[num.size()]; - result = (Integer[]) num.toArray(result); - return ArrayUtils.toPrimitive(result); - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max){ - - if(max < 6){ - return null; - } - - List perfectNumlist = new ArrayList(); - - for (int j = 6;j <= max; j++){ - List factorNumlist = new ArrayList(); - factorNumlist.add(1); - for (int i = 2; i < j; i++) { - if(j % i == 0){ - factorNumlist.add(i); - } - } - int sum = 0; - for(Integer num : factorNumlist){ - sum += num; - } - - if(sum == j){ - perfectNumlist.add(j); - } - } - Integer[] result = new Integer[perfectNumlist.size()]; - result = (Integer[]) perfectNumlist.toArray(result); - return ArrayUtils.toPrimitive(result); - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param seperator - * @return - */ - public String join(int[] array, String seperator){ - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < array.length - 1; i++) { - sb.append(array[i]); - sb.append(seperator); - } - sb.append(array[array.length - 1]); - return sb.toString(); - } - - public void printArr(int[] array){ - for(int num : array){ - System.out.print(num + " "); - } - } - -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java b/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java deleted file mode 100644 index b5e077e7a5..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package code02.litestruts; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by yaoyuan on 2017/3/22. - */ -public class ActionConfig { - String name; - String clzName; - Map viewResult = new HashMap(); - - - public ActionConfig(String actionName, String clzName) { - this.name = actionName; - this.clzName = clzName; - } - public String getClassName(){ - return clzName; - } - public void addViewResult(String name, String viewName){ - viewResult.put(name, viewName); - } - public String getViewName(String resultName){ - return viewResult.get(resultName); - } -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java b/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java deleted file mode 100644 index 85d3d98a1f..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java +++ /dev/null @@ -1,64 +0,0 @@ -package code02.litestruts; - -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import java.io.File; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -/** - * Created by yaoyuan on 2017/3/21. - */ -public class Configuration { - - - private String path; - private final Map actionMap = new HashMap(); - - Configuration(String path){ - parseXML(path); - } - - //解析xml文件 - private void parseXML(String path){ - //读取文件 - File file = new File(path); - SAXReader reader = new SAXReader(); - Document document = null; - try { - document = reader.read(file); - } catch (DocumentException e) { - e.printStackTrace(); - } - Element root = document.getRootElement(); - - for (Iterator iterator = root.elementIterator("action"); iterator.hasNext();) { - Element e = iterator.next(); - String actionName = e.attributeValue("name"); - String clazName = e.attributeValue("class"); - ActionConfig actionConfig = new ActionConfig(actionName,clazName); - for(Iterator childIterator = e.elementIterator();childIterator.hasNext();){ - Element child = childIterator.next(); - String jspKey = child.attributeValue("name"); - String jspValue = child.getTextTrim(); - actionConfig.addViewResult(jspKey,jspValue); - } - actionMap.put(actionName,actionConfig); - } - } - - public String getView(String actionName, String result){ - String jspKey = actionName + "." + result; - return actionMap.get(actionName).getViewName(result); - } - - - public Map getActionMap() { - return actionMap; - } - -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java b/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java deleted file mode 100644 index 0799eae71a..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package code02.litestruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java b/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java deleted file mode 100644 index 2a499f104b..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java +++ /dev/null @@ -1,119 +0,0 @@ -package code02.litestruts; - -import org.slf4j.LoggerFactory; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by yaoyuan on 2017/3/21. - */ -public class ReflectionUtil { - private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ReflectionUtil.class); - - private static final Map> clazzMap = new HashMap>(); - - //加载xml文件中的类 - public void initiateClazz(Configuration cfg){ - Map actionMap = cfg.getActionMap(); - - for (Map.Entry entry : actionMap.entrySet()) { - String actionName = entry.getKey(); //login - ActionConfig actionConfig =entry.getValue(); - String className = actionConfig.getClassName(); //code02.litestruts.LoginAction - Class cls; - try { - cls = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); - clazzMap.put(actionName,cls); - } catch (Exception e) { - logger.warn("加载类 " + className + "出错!"); - } - } - } - - - //返回实例对象 - public Object getInstance(String actionName){ - Object instance = null; - for (Map.Entry> entry : clazzMap.entrySet()) { - String action = entry.getKey(); //login - Class cls = entry.getValue(); //code02.litestruts.LoginAction.class - if(actionName.equals(action)){ - try { - instance = cls.newInstance(); - } catch (Exception e) { - logger.error("生成实例出错!", e); - throw new RuntimeException(e); - } - } - } - return instance; - } - - - //参数赋值 - public void setParameters(Object o, Map params) { - - List methods = getSetterMethods(o.getClass()); - for (String name : params.keySet()) { - String methodName = "set" + name; - for (Method m : methods) { - if (m.getName().equalsIgnoreCase(methodName)) { - try { - m.invoke(o, params.get(name)); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - } - } - - //运行无参方法 - public Object runMethodWithoutParams(Object o , String methodName){ - Class clz = o.getClass(); - Object result = null; - try { - Method method = clz.getDeclaredMethod(methodName); - try { - result = method.invoke(o); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - return result; - } - - //返回以set开头的方法 - public List getSetterMethods(Object o){ - return getMethods(o.getClass(),"set"); - } - - //返回以get开头的方法 - public List getGetterMethods(Object o){ - return getMethods(o.getClass(),"get"); - } - - private List getMethods(Class clz, String startWithName){ - List methodsList = new ArrayList(); - Method[] methods = clz.getDeclaredMethods(); - for (int i = 0; i < methods.length; i++) { - String methodName = methods[i].getName(); - if(methodName.startsWith(startWithName)){ - methodsList.add(methods[i]); - } - } - return methodsList; - } - -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java b/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java deleted file mode 100644 index b954f25bd5..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java +++ /dev/null @@ -1,76 +0,0 @@ -package code02.litestruts; - -import org.slf4j.LoggerFactory; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -public class Struts { - private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Struts.class); - /* - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - - - - */ - public static View runAction(String actionName, Map parameters) { - View view = new View(); - Configuration cfg = new Configuration("src/main/resources/struts.xml"); - ReflectionUtil reflectionUtil = new ReflectionUtil(); - reflectionUtil.initiateClazz(cfg); - /* 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象)*/ - Object o = reflectionUtil.getInstance(actionName); - /*2. 根据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") ,那就应该调用 setName和setPassword方法*/ - reflectionUtil.setParameters(o,parameters); - /*3. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success"*/ - String result = (String) reflectionUtil.runMethodWithoutParams(o,"execute"); - /* 4. 通过反射找到对象的所有getter方法(例如 getMessage),通过反射来调用, - 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,放到View对象的parameters*/ - Map params = new HashMap(); - List methods = reflectionUtil.getGetterMethods(o); - for(Method method : methods){ - String key = method.getName().substring(3); - String value = null; - try { - value = (String) method.invoke(o); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - params.put(key,value); - } - /*5. 根据struts.xml中的 配置,以及execute的返回值,确定哪一个jsp,放到View对象的jsp字段中。*/ - String jsp = cfg.getView(actionName,result); - view.setParameters(params); - view.setJsp(jsp); - - return view; - } - - public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { - - String actionName = "login"; - HashMap params = new HashMap(); - params.put("name","test"); - params.put("password","12345"); - - View view = Struts.runAction(actionName,params); - System.out.println(view.getJsp()); - System.out.println(view.getParameters()); - - - } - -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/View.java b/group23/769232552/coding/src/main/java/code02/litestruts/View.java deleted file mode 100644 index c7e630587c..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package code02.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/769232552/coding/src/main/java/code03/DownloadThread.java b/group23/769232552/coding/src/main/java/code03/DownloadThread.java deleted file mode 100644 index 7bf8a8e765..0000000000 --- a/group23/769232552/coding/src/main/java/code03/DownloadThread.java +++ /dev/null @@ -1,47 +0,0 @@ -package code03; - -import code03.api.Connection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.*; - -/** - * 定义线程类 - */ - - -public class DownloadThread extends Thread{ - - private static final Logger logger = LoggerFactory.getLogger(DownloadThread.class); - - private Connection conn; - private int startPos; - private int endPos; - private static final String fileName = "D://test.png"; - - - public DownloadThread(Connection conn, int startPos, int endPos){ - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - - @Override - public void run(){ - logger.debug("thread {} begin to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos); - - try { - byte[] data = conn.read(startPos,endPos); - RandomAccessFile rfile = new RandomAccessFile(fileName,"rw"); - rfile.seek(startPos); - rfile.write(data,0,data.length); - rfile.close(); - } catch (IOException e) { - e.printStackTrace(); - } - logger.debug("thread {} end to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos); - - - } -} diff --git a/group23/769232552/coding/src/main/java/code03/FileDownloader.java b/group23/769232552/coding/src/main/java/code03/FileDownloader.java deleted file mode 100644 index 6814c49f9c..0000000000 --- a/group23/769232552/coding/src/main/java/code03/FileDownloader.java +++ /dev/null @@ -1,109 +0,0 @@ -package code03; - -import code03.api.Connection; -import code03.api.ConnectionException; -import code03.api.ConnectionManager; -import code03.api.DownloadListener; -import code03.impl.ConnectionManagerImpl; - -import java.util.ArrayList; -import java.util.List; - -/** - * 线程启动类 - */ - -public class FileDownloader { - - private String url; - private DownloadListener listener; - private ConnectionManager cm; - private static boolean downloadFinished = false; - - private final static int THREAD_NUM = 5; - - public FileDownloader(String _url) { - this.url = _url; - } - - /* - (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。*/ - public void execute(){ - Connection conn = null; - try { - //启动线程 - int startPos = 0, endPos = 0; - List threads = new ArrayList(); - for (int i = 0; i < THREAD_NUM; i++) { - conn = cm.open(this.url); //每次都要重新获取一个connection.imputstream - int length = conn.getContentLength(); - startPos = length/THREAD_NUM * i; - endPos = length/THREAD_NUM * (i + 1)- 1; - DownloadThread downloadThread = new DownloadThread(conn,startPos,endPos); - threads.add(downloadThread); - downloadThread.start(); - } - - //调用join方法,确保所有线程的工作已经完成 - for (int i = 0; i < THREAD_NUM; i++) { - try { - threads.get(i).join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - listener.notifyFinished(); - } catch (ConnectionException e) { - e.printStackTrace(); - } finally { - if(conn != null){ - conn.close(); - } - } - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - - - public static void main(String[] args) { - - String url = "http://litten.me/assets/blogImg/litten.png"; - FileDownloader fileDownloader = new FileDownloader(url); - ConnectionManager cm = new ConnectionManagerImpl(); - fileDownloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - }); - fileDownloader.setConnectionManager(cm); - fileDownloader.execute(); - - - while (!downloadFinished){ - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("download finished ! "); - - - } - -} diff --git a/group23/769232552/coding/src/main/java/code03/api/Connection.java b/group23/769232552/coding/src/main/java/code03/api/Connection.java deleted file mode 100644 index 1f2e4e1d39..0000000000 --- a/group23/769232552/coding/src/main/java/code03/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package code03.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java b/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java deleted file mode 100644 index 77e886e987..0000000000 --- a/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java +++ /dev/null @@ -1,9 +0,0 @@ -package code03.api; - -public class ConnectionException extends Exception { - - public ConnectionException(String message,Throwable e){ - super(message,e); - } - -} diff --git a/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java b/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java deleted file mode 100644 index 4cbd46445a..0000000000 --- a/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package code03.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java b/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java deleted file mode 100644 index f5e7e146a7..0000000000 --- a/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package code03.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java deleted file mode 100644 index 069f21625b..0000000000 --- a/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java +++ /dev/null @@ -1,107 +0,0 @@ -package code03.impl; - -import code03.api.Connection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLConnection; - - -public class ConnectionImpl implements Connection{ - - private static final Logger logger = LoggerFactory.getLogger(ConnectionImpl.class); - - - private URLConnection urlConnection; - private int length = -1; - - public ConnectionImpl(URLConnection urlConnection){ - this.urlConnection = urlConnection; - } - - /** - * 读取urlConnection.getInputStream()中的数据,返回byte[] - */ - @Override - public byte[] read(int startPos, int endPos) throws IOException { - int contentLength = getContentLength(); - if(startPos < 0 || endPos > contentLength || contentLength <= 0){ - logger.info("index out of range !"); - return null; - } - - InputStream raw = null; - BufferedInputStream in = null; - int size = endPos - startPos + 1; - - byte[] data = new byte[size]; - try{ - raw = urlConnection.getInputStream(); - in = new BufferedInputStream(raw); - in.skip(startPos); - - int offset = 0; - while(offset < size){ - int bytesRead = in.read(data, offset, size - offset); - while (bytesRead == -1){break;} - offset += bytesRead; - } - } catch (IOException e) { - e.printStackTrace(); - }finally { - raw.close(); - in.close(); - } - return data; - } - - @Override - public int getContentLength() { - if(length != -1){ - return length; - } - length = urlConnection.getContentLength(); - - //if without content-length header - if(length == -1) { - int offset = 0; - InputStream raws = null; - BufferedInputStream ins = null; - try { - raws = urlConnection.getInputStream(); - ins = new BufferedInputStream(raws); - - int max_size = 1024 * 1024;//1M - byte[] data = new byte[max_size]; - - int bytesRead = 0; - while (bytesRead != -1) { - ins.read(data, offset, max_size - offset); - offset += bytesRead; - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - raws.close(); - ins.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - length = offset; - } - return length; - } - - @Override - public void close() { - if(urlConnection != null){ - urlConnection = null; - } - } - -} diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java deleted file mode 100644 index 5078c7608c..0000000000 --- a/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package code03.impl; - -import code03.api.Connection; -import code03.api.ConnectionException; -import code03.api.ConnectionManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -/** - * 获取Connection实例 - */ - -public class ConnectionManagerImpl implements ConnectionManager { - private static final Logger logger = LoggerFactory.getLogger(ConnectionManagerImpl.class); - - @Override - public Connection open(String url) throws ConnectionException { - Connection connection = null; - try { - URL _url = new URL(url); - URLConnection urlConnection = _url.openConnection(); - connection = new ConnectionImpl(urlConnection); - } catch (MalformedURLException e) { - logger.error("url {} format error",url); - } catch (IOException e) { - e.printStackTrace(); - } - return connection; - } - -} diff --git a/group23/769232552/coding/src/main/resources/struts.xml b/group23/769232552/coding/src/main/resources/struts.xml deleted file mode 100644 index fd71dc16ff..0000000000 --- a/group23/769232552/coding/src/main/resources/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/ArrayListTest.java b/group23/769232552/coding/src/test/java/code01/ArrayListTest.java deleted file mode 100644 index 2bfd7f52e1..0000000000 --- a/group23/769232552/coding/src/test/java/code01/ArrayListTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package code01; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by yaoyuan on 2017/3/8. - */ -public class ArrayListTest { - ArrayList arrayList; - @Before - public void setUp(){ - arrayList = new ArrayList(); - } - - @Test - public void testAdd() throws Exception { - - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - arrayList.add(str); - } - - // size() - Assert.assertEquals(array.length,arrayList.size()); - - //add(),get() - for (int i = 0; i < arrayList.size(); i++){ - Assert.assertEquals(array[i],arrayList.get(i)); - } - } - - @Test - public void testAddWithIndex() throws Exception { - ArrayList arrayList2 = new ArrayList(3);//自动扩容 - String[] array = new String[]{"a","b","c","d","e"}; - for (int i = 0; i < array.length; i++){ - arrayList2.add(i,array[i]); - } - //add(),get() - for (int i = 0; i < arrayList2.size(); i++){ - Assert.assertEquals(array[i],arrayList2.get(i)); - } - arrayList2.add(3,"new"); - Assert.assertEquals("new",arrayList2.get(3)); - - - } - - @Test - public void testRemove() throws Exception { - - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - arrayList.add(str); - } - arrayList.remove(0); - arrayList.remove(0); - - - for (int i = 0; i < arrayList.size(); i++) { - Assert.assertEquals(array[i+2],arrayList.get(i)); - } - - } -} \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java b/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java deleted file mode 100644 index 8c1f4e8e09..0000000000 --- a/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package code01; - -import org.junit.Test; - -/** - * Created by yaoyuan on 2017/3/10. - */ -public class BinaryTreeTest { - - @Test - public void testCreateBinaryTree(){ - - BinaryTree binaryTree1 = new BinaryTree(); - BinaryTree binaryTree2 = new BinaryTree(); - Integer[] array1 = new Integer[]{3,4,1,2,5}; - Integer[] array2 = new Integer[]{3,1,4,5,2}; - binaryTree1.createBinaryTree(array1); - binaryTree2.createBinaryTree(array2); - binaryTree1.leftOrderScan(binaryTree1.getRoot()); - binaryTree2.leftOrderScan(binaryTree2.getRoot()); - } - - @Test - public void testInsert(){ - BinaryTree binaryTree3 = new BinaryTree(); - } -} \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/LinkedListTest.java b/group23/769232552/coding/src/test/java/code01/LinkedListTest.java deleted file mode 100644 index 5481783932..0000000000 --- a/group23/769232552/coding/src/test/java/code01/LinkedListTest.java +++ /dev/null @@ -1,174 +0,0 @@ -package code01; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by yaoyuan on 2017/3/8. - */ -public class LinkedListTest { - - @Test - public void testAdd() throws Exception { - - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - - // size() - Assert.assertEquals(array.length,linklist.size()); - - //add(),get() - for (int i = 0; i < linklist.size(); i++){ - Assert.assertEquals(array[i],linklist.get(i)); - } - - } - - @Test - public void testAddWithIndex() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - - //add(),get() - for (int i = 0; i < linklist.size(); i++){ - Assert.assertEquals(array[i],linklist.get(i)); - } - - String str = "new"; - linklist.add(0,str); - Assert.assertEquals(str,linklist.get(0)); - - linklist.add(3,str); - Assert.assertEquals(str,linklist.get(3)); - - linklist.add(linklist.size() ,str); - Assert.assertEquals(str,linklist.get(linklist.size()-1)); - } - - @Test - public void testRemove() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - - //remove(),get() - Assert.assertEquals(linklist.remove(0),array[0]); - Assert.assertEquals(linklist.size(),array.length - 1); - - Assert.assertEquals(linklist.remove(linklist.size() - 1),array[array.length-1]); - Assert.assertEquals(linklist.size(),array.length - 2); - - } - - @Test - public void testAddFirst() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - //addFirst(),get() - String str = "new"; - linklist.addFirst(str); - Assert.assertEquals(str,linklist.get(0)); - Assert.assertEquals(linklist.size(),array.length + 1); - } - - @Test - public void testAddLast() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - //addLast(),get() - String str = "new"; - linklist.addLast(str); - Assert.assertEquals(str,linklist.get(linklist.size()-1)); - Assert.assertEquals(linklist.size(),array.length + 1); - } - - @Test - public void testRemoveFirst() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - //removeFirst(),get() - Assert.assertEquals(linklist.removeFirst(),array[0]); - Assert.assertEquals(linklist.size(),array.length - 1); - } - - @Test - public void testRemoveLast() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - //removeLast(),get() - Assert.assertEquals(linklist.removeLast(),array[array.length-1]); - Assert.assertEquals(linklist.size(),array.length - 1); - - } - - @Test - public void testReverse(){ - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - linklist.reverse(); - for(int i=0; i params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("Message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("Message")); - } -} diff --git a/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java b/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java deleted file mode 100644 index cdc58d24b3..0000000000 --- a/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package code03; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import code03.api.ConnectionManager; -import code03.api.DownloadListener; -import code03.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url = "http://litten.me/assets/blogImg/litten.png"; - - FileDownloader downloader = new FileDownloader(url); - - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); - - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} diff --git a/group23/810181789/.classpath b/group23/810181789/.classpath deleted file mode 100644 index fb5011632c..0000000000 --- a/group23/810181789/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/group23/810181789/.gitignore b/group23/810181789/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group23/810181789/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group23/810181789/.project b/group23/810181789/.project deleted file mode 100644 index d78dba00af..0000000000 --- a/group23/810181789/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - basicstructure - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group23/810181789/src/firstday/ArrayListt.java b/group23/810181789/src/firstday/ArrayListt.java deleted file mode 100644 index 229c588f33..0000000000 --- a/group23/810181789/src/firstday/ArrayListt.java +++ /dev/null @@ -1,86 +0,0 @@ -package firstday; - -import java.util.Arrays; - -public class ArrayListt { - private Object arr[]=new Object[10]; - private int pos=0; - public boolean add(Object o) - { - if(pos=arr.length) - { - arr=Arrays.copyOf(arr, arr.length+1); - arr[pos] = o; - pos++; - return true; - } - return false; - } - public boolean add(Object o, int index) - { - if(pos=arr.length) - { - arr=Arrays.copyOf(arr, arr.length+1); - for(int i=arr.length-2;i>=index;i--) - { - arr[i+1] = arr[i]; - } - arr[index] = o; - return true; - } - return false; - } - public Object get(int i) - { - Object o = arr[i]; - return o; - } - public Object remove(int index) - { - Object var=arr[index]; - for(int i=index+1;i Date: Tue, 28 Mar 2017 10:13:15 +0800 Subject: [PATCH 019/552] gitignore --- group23/729693763/readme.md | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 group23/729693763/readme.md diff --git a/group23/729693763/readme.md b/group23/729693763/readme.md deleted file mode 100644 index 7e7fac06ae..0000000000 --- a/group23/729693763/readme.md +++ /dev/null @@ -1,11 +0,0 @@ -Data Struct contain: ArrayList, LinkedList, BinaryTreeNode, Stack, Queue, Iterator -<<<<<<< HEAD ---- --- -Add Blog link: -http://www.cnblogs.com/CodeSaveMe/p/6523745.html -======= ---- --- -Add Blog link: http://www.cnblogs.com/CodeSaveMe/p/6523745.html - -Add week2 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6571621.html ->>>>>>> my From 4bd0af32356399a10b2985081426f2b060248f46 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Tue, 28 Mar 2017 10:54:48 +0800 Subject: [PATCH 020/552] delete leetcode --- .../src/com/github/problems/AddTwoNums.java | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 group23/1028361767/LeetCodeProblems/src/com/github/problems/AddTwoNums.java diff --git a/group23/1028361767/LeetCodeProblems/src/com/github/problems/AddTwoNums.java b/group23/1028361767/LeetCodeProblems/src/com/github/problems/AddTwoNums.java deleted file mode 100644 index 946eee43c1..0000000000 --- a/group23/1028361767/LeetCodeProblems/src/com/github/problems/AddTwoNums.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.github.problems; - -public class AddTwoNums { - - public ListNode addTwoNumbers(ListNode l1, ListNode l2) { - int carry = 0; - ListNode ret = null; - ListNode first = null; - while(l1 != null || l2 != null){ - int i = l1 == null?0 : l1.val; - int j = l2 == null?0 : l2.val; - int sum = i + j + carry; - if(sum >= 10){ - carry = 1; - sum -= 10; - }else{ - carry = 0; - } - if(ret == null){ - ret = new ListNode(sum); - first = ret; - }else{ - ret.next = new ListNode(sum); - ret = ret.next; - } - if(l1 != null){ - l1 = l1.next; - } - if(l2 != null){ - l2 = l2.next; - } - } - if(carry > 0){ - ret.next = new ListNode(carry); - } - return first; - } - - public static void main(String[] args) { - ListNode l11 = new ListNode(2); - ListNode l12 = new ListNode(4); - ListNode l13 = new ListNode(3); - l11.next = l12; - l12.next = l13; - - ListNode l21 = new ListNode(5); - ListNode l22 = new ListNode(6); - ListNode l23 = new ListNode(4); - l21.next = l22; - l22.next = l23; - - ListNode ret = new AddTwoNums().addTwoNumbers(l11, l21); - while(ret != null){ - System.out.println(ret.val); - ret = ret.next; - } - } -} - -class ListNode { - int val; - ListNode next; - ListNode(int x) { val = x; } -} From 9960ec50fb4d28a61f76d65a43b0fbb556d914b5 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Tue, 28 Mar 2017 12:36:17 +0800 Subject: [PATCH 021/552] LRU LRU --- .../coding/basic/linklist/LRUPageFrame.java | 62 +++++++++++++++++-- .../basic/linklist/LRUPageFrameTest.java | 28 ++++++++- 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java index a4f2c14606..50bfb30412 100644 --- a/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java @@ -13,7 +13,8 @@ private static class Node { Node next; int pageNum; - Node() { + Node(int pageNum) { + this.pageNum = pageNum; } } @@ -22,6 +23,8 @@ private static class Node { private Node first;// 链表头 private Node last;// 链表尾 + + private int size; public LRUPageFrame(int capacity) { @@ -37,19 +40,68 @@ public LRUPageFrame(int capacity) { * @return */ public void access(int pageNum) { - - + /** + * 1、链表为空,直接插入first + * 2、链表未满,往链尾追加 + * 3、链表已满,判断链表中是否存在pageNum,若存在,把pageNum,移到链尾;若不存在,把链头删除,把pageNum追加到链尾 + */ + Node newNode = new Node(pageNum); + if(size < capacity){ + if(size == 0){ + first = newNode; + }else{ + last.next = newNode; + newNode.prev = last; + } + last = newNode; + size++; + return ; + } + Node existNode = null; + Node tmp = first; + do{ + if(tmp.pageNum == pageNum){ + existNode = tmp; + } + tmp = tmp.next; + }while(tmp != null); + if(existNode == null || existNode == first){ + tmp = first.next; + tmp.prev = null; + first = tmp;//链首变为链首后一个节点 + last.next = newNode; + newNode.prev = last; + last = newNode;//链尾追加新节点 + }else if(existNode == last){ + return ; + }else{ + /** + * 已存在节点的上一个节点的下一个节点指向已存在节点的下一个节点 + * + */ + Node prev = existNode.prev; + Node next = existNode.next; + prev.next = next; + next.prev = prev; + if(prev.prev == null){ + first = prev; + } + newNode.prev = last; + last.next = newNode; + last = newNode; + existNode = null; + } } public String toString(){ StringBuilder buffer = new StringBuilder(); - Node node = first; + Node node = last; while(node != null){ buffer.append(node.pageNum); - node = node.next; + node = node.prev; if(node != null){ buffer.append(","); } diff --git a/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java index 67cf36067b..c4645c6869 100644 --- a/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -27,5 +27,31 @@ public void testAccess() { frame.access(4); Assert.assertEquals("4,0,3", frame.toString()); } - + + @Test + public void testAccessCustom() { + LRUPageFrame frame = new LRUPageFrame(5); + frame.access(7); + frame.access(0); + frame.access(1); + frame.access(5); + frame.access(3); + Assert.assertEquals("3,5,1,0,7", frame.toString()); + frame.access(2); + Assert.assertEquals("2,3,5,1,0", frame.toString()); + frame.access(0); + Assert.assertEquals("0,2,3,5,1", frame.toString()); + frame.access(0); + Assert.assertEquals("0,2,3,5,1", frame.toString()); + frame.access(3); + Assert.assertEquals("3,0,2,5,1", frame.toString()); + frame.access(0); + Assert.assertEquals("0,3,2,5,1", frame.toString()); + frame.access(4); + Assert.assertEquals("4,0,3,2,5", frame.toString()); + frame.access(5); + Assert.assertEquals("5,4,0,3,2", frame.toString()); + frame.access(2); + Assert.assertEquals("2,5,4,0,3", frame.toString()); + } } From 3089712e230e387ecbd794700b28982bf0bb3311 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Tue, 28 Mar 2017 13:52:43 +0800 Subject: [PATCH 022/552] gitingnore --- .gitignore | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/.gitignore b/.gitignore index 95026b5340..506d40056e 100644 --- a/.gitignore +++ b/.gitignore @@ -288,23 +288,6 @@ liuxin/.DS_Store liuxin/src/.DS_Store -group23/729693763/* - -group23/1072760797-skomefen/* - -group23/609041842/* - -group23/810181789/* - -group23/1246614258/* - -group23/565832157/* - -group23/601689050/* - -group23/632678665/* - -group23/769232552/* From 49c6f2f4e855c96051460567cc6d399bc2adcd2d Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Tue, 28 Mar 2017 14:49:49 +0800 Subject: [PATCH 023/552] classLoader classLoader --- .../jvm/loader/ClassFileLoader.java | 54 ++++++++++++++++--- .../jvm/test/ClassFileloaderTest.java | 4 +- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java index d1cebad9d1..e9f6541cc1 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -1,6 +1,11 @@ package com.coderising.jvm.loader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @@ -10,21 +15,56 @@ public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - - return null; - - + className = castClassName(className); + File file = null; + FileInputStream fis = null; + for(String clzPath : clzPaths){ + file = new File((clzPath + className)); + try { + fis = new FileInputStream(file); + byte[] bytes = new byte[2048]; + int i = 0; + int sum = 0; + while((i = fis.read(bytes)) != -1){ + sum += i; + } + fis.close(); + return Arrays.copyOf(bytes, sum); + } catch (FileNotFoundException e) { + continue; + } catch (IOException e) { + e.printStackTrace(); + } + } + return new byte[0]; } - + private String castClassName(String className) { + String[] packs = className.split("\\."); + StringBuilder sb = new StringBuilder("/"); + for(int i=0;i Date: Tue, 28 Mar 2017 17:04:46 +0800 Subject: [PATCH 024/552] =?UTF-8?q?20170328=5F1702=203.26=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/linklist/LRUPageFrame.java | 133 ++++++++ .../basic/linklist/LRUPageFrameTest.java | 29 ++ .../coding2017/basic/linklist/LinkedList.java | 290 ++++++++++++++++++ .../jvm/loader/ClassFileLoader.java | 51 +++ .../jvm/test/ClassFileloaderTest.java | 85 +++++ .../coding2017/jvm/test/EmployeeV1.java | 26 ++ 6 files changed, 614 insertions(+) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrameTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LinkedList.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/test/ClassFileloaderTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..3240f2558c --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java @@ -0,0 +1,133 @@ +package com.github.orajavac.coding2017.basic.linklist; + +public class LRUPageFrame { +private static class Node { + + Node prev; + Node next; + int pageNum=10000; + String flag; + + Node() { + } + } + + private int capacity; + private int length; + + + private Node first;// 链表头 + private Node last;// 链表尾 + + + public LRUPageFrame(int capacity) { + + this.capacity = capacity; + + first = new Node(); + last = new Node(); + last.flag = "last"; //用来标识最后一个节点是链表尾,在这里链表尾并不算做内存页 + first.flag = "first"; //用来标识链表头,在这里链表头并不算做内存页 + first.next = last; + last.prev=first; + } + + /** + * 获取缓存中对象 + * + * @param key + * @return + */ + public void access(int pageNum) { + if(lookup(pageNum)){ + ; + }else{ + if (lengthlen||index<=0){ + throw new RuntimeException("下标不存在"+index); + } + Node e = head; + int i=0; + while (e.next != null){ + i++; + if (i == index){ + return e.next.data; + } + e=e.next; + } + return null; + } + + public Object remove(int index){ + int len=Integer.parseInt(head.data.toString()); + if (index>len||index<=0){ + throw new RuntimeException("下标不存在"+index); + } + Node e = head; + Object data = null; + int i=0; + while (e.next != null){ + i++; + if (i == index){ + len--; + head.data = len; + data = e.next.data; + e.next = e.next.next; + return data; + } + e=e.next; + } + return null; + } + + public Object removeFirst(){ + return remove(1); + } + + public Object removeLast(){ + return remove(Integer.parseInt(head.data.toString())); + } + + public void addFirst(Object o){ + Node e = head.next; + Node n = new Node(); + n.data=o; + n.next=e; + size++; + head.next=n; + head.data=size; + } + + public void addLast(Object o){ + add(o); + } + + public int size(){ + return Integer.parseInt(head.data.toString()); + } + + public void listNode(){ + Node n = head; + StringBuffer buffer = new StringBuffer(); + while (n.next!=null){ + buffer.append(n.next.data + " -> "); + n=n.next; + } + if(buffer.length()>0){ + System.out.print(buffer.substring(0,buffer.length()-3)); + System.out.println(); + } + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + if (i <= 0 || length<=0){ + throw new RuntimeException("起始值、结束值都不能小于0等于"); + } + int len = length + i; + if (len > size){ + throw new RuntimeException("删除索引长度超过了链表长度"); + } + Node e = head; + int y = 0; + while (e.next != null){ + y++; + if (y == i){ + Node n = e.next; + while (n!=null){ + n = n.next; + if (y == length){ + break; + } + y++; + n=n.next; + } + } + e=e.next; + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + if (list==null||list.head==null){ + throw new RuntimeException("集合没有初始化"); + } + int[] elements = new int[Integer.parseInt(list.head.data.toString())]; + Node l = list.head; + Node n = head; + int len = 0; + int i = 0; + while (l.next!=null){ + len = 0; + n=head; + while(n.next!=null){ + len++; + if(len==Integer.parseInt(l.next.data.toString())){ + elements[i]=Integer.parseInt(n.next.data.toString()); + i++; + break; + } + n=n.next; + } + l = l.next; + } + return elements; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + if (list==null||list.head==null){ + throw new RuntimeException("集合没有初始化"); + } + Node l = list.head; + Node n = head; + int i = 0; + while (l.next!=null){ + n=head; + i=0; + while(n.next!=null){ + i++; + if(n.next.data.equals(l.next.data)){ + remove(i); + break; + } + n=n.next; + } + l = l.next; + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * 11->101->201->301->401->501->601->701 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + if (min<=0||max<=0||min>max){ + throw new RuntimeException("录入不正确:"+min+","+max+" 应该大于min且小于max的元素"); + } + Node n = head; + int data = 0; + Node p = null; + while(n.next != null){ + data=Integer.parseInt(n.next.data.toString()); //11 + if(data>min&&data clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + byte[] b = null; + try{ + File clfile = new File(packageToPath(className)); + @SuppressWarnings("resource") + BufferedInputStream in = new BufferedInputStream(new FileInputStream(clfile)); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); + byte[] buffer = new byte[1024]; + int size = 0; + while ((size = in.read(buffer)) != -1) { + out.write(buffer, 0, size); + } + b = out.toByteArray(); + }catch(Exception e){ + e.printStackTrace(); + } + return b; + } + + + public void addClassPath(String path) { + clzPaths.add(path); + } + + + + public String getClassPath(){ + StringBuffer buffer = new StringBuffer(); + for (int i=0;i Date: Wed, 29 Mar 2017 00:07:49 +0800 Subject: [PATCH 025/552] 111 --- group23/1028361767/1028361767.md | 1 - .../coderising/download/DownloadThread.java | 31 -- .../coderising/download/FileDownloader.java | 104 ----- .../download/FileDownloaderTest.java | 59 --- .../coderising/download/api/Connection.java | 26 -- .../download/api/ConnectionException.java | 8 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 62 --- .../download/impl/ConnectionManagerImpl.java | 26 -- .../coderising/litestruts/LoginAction.java | 39 -- .../src/com/coderising/litestruts/Struts.java | 181 -------- .../com/coderising/litestruts/StrutsTest.java | 43 -- .../src/com/coderising/litestruts/View.java | 23 - .../src/com/coding/basic/BinaryTreeNode.java | 97 ----- .../src/com/coding/basic/Iterator.java | 8 - .../src/com/coding/basic/List.java | 13 - .../src/com/coding/basic/Queue.java | 24 -- .../src/com/coding/basic/Stack.java | 37 -- .../src/com/coding/basic/array/ArrayList.java | 83 ---- .../src/com/coding/basic/array/ArrayUtil.java | 210 --------- .../coding/basic/linklist/LRUPageFrame.java | 112 ----- .../basic/linklist/LRUPageFrameTest.java | 57 --- .../com/coding/basic/linklist/LinkedList.java | 402 ------------------ .../src/com/coding/me/Palindrome.java | 82 ---- .../com/coding/me/leetcode/AddTwoNums.java | 84 ---- .../test/com/coding/basic/TestArrayList.java | 61 --- .../com/coding/basic/TestBinaryTreeNode.java | 37 -- .../test/com/coding/basic/TestLinkedList.java | 176 -------- .../jvm/loader/ClassFileLoader.java | 74 ---- .../jvm/test/ClassFileloaderTest.java | 92 ---- .../com/coderising/jvm/test/EmployeeV1.java | 28 -- .../coderising/download/DownloadThread.java | 65 --- .../coderising/download/FileDownloader.java | 89 ---- .../download/FileDownloaderTest.java | 58 --- .../coderising/download/api/Connection.java | 24 -- .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 143 ------- .../download/impl/ConnectionManagerImpl.java | 16 - .../src/junit/test/ConnectionImplTest.java | 92 ---- .../junit/test/ConnectionManagerImplTest.java | 31 -- .../src/junit/test/DownloadThreadTest.java | 77 ---- group23/609041842/src/code/ArrayList.java | 49 --- group23/609041842/src/code/LinkedList.java | 87 ---- group23/609041842/src/code/Queue.java | 17 - group23/609041842/src/code/Stack.java | 30 -- .../Third_Homework3/DataStruct/Iterator.java | 6 - .../DataStruct/LinkedList.java | 327 -------------- .../Third_Homework3/DataStruct/List.java | 10 - .../Third_Homework3/download/.classpath | 5 - .../Third_Homework3/download/.project | 17 - .../download/DownloadThread.java | 49 --- .../download/FileDownloader.java | 96 ----- .../download/FileDownloaderTest.java | 58 --- .../download/api/Connection.java | 23 - .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 80 ---- .../download/impl/ConnectionManagerImpl.java | 27 -- group23/group23.md | 1 - 63 files changed, 3812 deletions(-) delete mode 100644 group23/1028361767/1028361767.md delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/Connection.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/LoginAction.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/Struts.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/View.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Iterator.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/List.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Queue.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Stack.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LinkedList.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/Palindrome.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/AddTwoNums.java delete mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java delete mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java delete mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionImplTest.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java delete mode 100644 group23/609041842/src/code/ArrayList.java delete mode 100644 group23/609041842/src/code/LinkedList.java delete mode 100644 group23/609041842/src/code/Queue.java delete mode 100644 group23/609041842/src/code/Stack.java delete mode 100644 group23/729693763/Third_Homework3/DataStruct/Iterator.java delete mode 100644 group23/729693763/Third_Homework3/DataStruct/LinkedList.java delete mode 100644 group23/729693763/Third_Homework3/DataStruct/List.java delete mode 100644 group23/729693763/Third_Homework3/download/.classpath delete mode 100644 group23/729693763/Third_Homework3/download/.project delete mode 100644 group23/729693763/Third_Homework3/download/DownloadThread.java delete mode 100644 group23/729693763/Third_Homework3/download/FileDownloader.java delete mode 100644 group23/729693763/Third_Homework3/download/FileDownloaderTest.java delete mode 100644 group23/729693763/Third_Homework3/download/api/Connection.java delete mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionException.java delete mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionManager.java delete mode 100644 group23/729693763/Third_Homework3/download/api/DownloadListener.java delete mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java delete mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/group23.md diff --git a/group23/1028361767/1028361767.md b/group23/1028361767/1028361767.md deleted file mode 100644 index 741976ad6e..0000000000 --- a/group23/1028361767/1028361767.md +++ /dev/null @@ -1 +0,0 @@ -This is 1028361767's project. \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java b/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java deleted file mode 100644 index 8cf0ae1e42..0000000000 --- a/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.download; - -import java.io.IOException; -import java.io.RandomAccessFile; - -import com.coderising.download.api.Connection; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - - public DownloadThread( Connection conn, int startPos, int endPos){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - public void run(){ - try { - byte[] bytes = conn.read(startPos, endPos); - RandomAccessFile file = new RandomAccessFile("/Users/jie/Desktop/test.png", "rw"); - file.seek(startPos); - file.write(bytes); - file.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java b/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java deleted file mode 100644 index 1fe4ebb159..0000000000 --- a/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; - - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - Thread[] threads = new Thread[3]; - - - public FileDownloader(String _url) { - this.url = _url; - - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - try { - - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - int size = length / 3; - int remain = length - size; - - for(int i=0;i<3;i++){ - conn = cm.open(this.url); - int startPos = i*size; - int endPos = (i+1) * size - 1; - if(i == 2){ - endPos = (i+1) * size - 1 + remain; - } - threads[i] = new DownloadThread(conn,startPos,endPos); - threads[i].start(); - } - - new Thread(new Runnable(){ - public void run(){ - boolean finish; - do{ - finish = true; - for(int i=0;i actions = new HashMap(); - - @SuppressWarnings("rawtypes") - public static View runAction(String actionName, Map parameters) throws Exception { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - //读取xml,把xml信息放到actions - readStrutsXML(); - - Action action = actions.get(actionName); - View view = new View(); - if(action != null){ - Class clazz = Class.forName(action.getClassName()); - Object obj = clazz.newInstance(); - - //根据parameters调用set方法 - initClass(clazz, obj, action, parameters); - - //调用execute方法 - String result = execute(clazz, obj); - //调用所有get方法 - Map resultParameters = getResultParameters(clazz, obj); - - view.setJsp(action.getResults().get(result)); - view.setParameters(resultParameters); - } - - return view; - } - - @SuppressWarnings("rawtypes") - private static Map getResultParameters(Class clazz, Object obj) throws Exception { - Map resultParameters = new HashMap(); - Method[] methods = clazz.getMethods(); - String methodName; - String propName; - String propValue; - for(Method method : methods){ - methodName = method.getName(); - if(methodName.startsWith("get") && !"getClass".equals(methodName)){ - propName = firstLetterLowerCase(methodName.substring(3, methodName.length())); - propValue = (String) method.invoke(obj); - resultParameters.put(propName, propValue); - } - } - return resultParameters; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static String execute(Class clazz, Object obj) throws Exception{ - Method method = clazz.getMethod("execute"); - return (String)method.invoke(obj); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static void initClass(Class clazz, Object obj, Action action, Map parameters) throws Exception { - String setMethodName; - Method method = null; - for (String parameter : parameters.keySet()) { - setMethodName = "set" + firstLetterUpperCase(parameter); - method = clazz.getMethod(setMethodName, String.class); - method.invoke(obj, parameters.get(parameter)); - } - } - - private static String firstLetterLowerCase(String string){ - char[] cs = string.toCharArray(); - cs[0] += 32; - return String.valueOf(cs); - } - - private static String firstLetterUpperCase(String string){ - char[] cs = string.toCharArray(); - cs[0] -= 32; - return String.valueOf(cs); - } - - @SuppressWarnings("unchecked") - private static void readStrutsXML() { - SAXReader saxReader = new SAXReader(); - Document document; - try { - document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml")); - } catch (DocumentException e) { - System.out.println("error:file not found"); - return ; - } - Element root = document.getRootElement(); - Iterator actionItr = root.elementIterator(); - Element action; - Action act; - Iterator resultItr; - Element result; - Map results; - while(actionItr.hasNext()){ - action = actionItr.next(); - - resultItr = action.elementIterator(); - results = new HashMap(); - while(resultItr.hasNext()){ - result = resultItr.next(); - results.put(result.attributeValue("name"), result.getStringValue()); - } - - act = new Action(); - act.setName(action.attributeValue("name")); - act.setClassName(action.attributeValue("class")); - act.setResults(results); - - actions.put(act.getName(), act); - } - } - - static class Action { - - private String name; - - private String className; - - private Map results = new HashMap<>(); - - public Map getResults() { - return results; - } - - public void setResults(Map results) { - this.results = results; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - } - -} diff --git a/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index 92a6758a69..0000000000 --- a/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() throws Exception { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() throws Exception { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java b/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index dced34e873..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode parent; - - public BinaryTreeNode(Object data) { - this.data = data; - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public void setParent(BinaryTreeNode parent) { - this.parent = parent; - } - - public BinaryTreeNode getParent() { - return parent; - } - - public BinaryTreeNode insert(Object o) { - BinaryTreeNode newNode = new BinaryTreeNode(o); - BinaryTreeNode root = findRoot(this); - if (root.data == null) { - root.data = newNode; - } else { - int newVal = getNodeIntVal(newNode); - insert(root, newNode, newVal); - } - return newNode; - } - - private void insert(BinaryTreeNode node, BinaryTreeNode newNode, int newVal) { - int nodeVal = getNodeIntVal(node); - if (newVal < nodeVal) { - if (node.left == null) { - newNode.parent = node; - node.left = newNode; - } else { - insert(node.left, newNode, newVal); - } - } else { - if (node.right == null) { - newNode.parent = node; - node.right = newNode; - } else { - insert(node.right, newNode, newVal); - } - } - } - - private BinaryTreeNode findRoot(BinaryTreeNode binaryTreeNode) { - while (binaryTreeNode.parent != null) { - binaryTreeNode = binaryTreeNode.parent; - } - return binaryTreeNode; - } - - private int getNodeIntVal(BinaryTreeNode node) { - if (node.data instanceof Integer) { - return ((Integer) node.data).intValue(); - } - return 0; - } - - public int getDataIntVal() { - if (data instanceof Integer) { - return ((Integer) data).intValue(); - } - return 0; - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java b/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java deleted file mode 100644 index 96adcd6d3a..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - - public Object next(); - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/List.java b/group23/1028361767/data-structure/src/com/coding/basic/List.java deleted file mode 100644 index 01398944e6..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Queue.java b/group23/1028361767/data-structure/src/com/coding/basic/Queue.java deleted file mode 100644 index ddd1b74d90..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -import com.coding.basic.linklist.LinkedList; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o) { - linkedList.add(o); - } - - public Object deQueue() { - return linkedList.removeFirst(); - } - - public boolean isEmpty() { - return linkedList.size() == 0; - } - - public int size() { - return linkedList.size(); - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Stack.java b/group23/1028361767/data-structure/src/com/coding/basic/Stack.java deleted file mode 100644 index a98f5d76a5..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coding.basic; - -import java.util.EmptyStackException; - -import com.coding.basic.array.ArrayList; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - checkBound(); - return elementData.get(size() - 1); - } - - public Object peek() { - checkBound(); - return elementData.remove(size() - 1); - } - - public boolean isEmpty() { - return size() == 0; - } - - public int size() { - return elementData.size(); - } - - private void checkBound() { - if (isEmpty()) { - throw new EmptyStackException(); - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java deleted file mode 100644 index 43bdae82fa..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.coding.basic.array; - -import java.util.Arrays; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class ArrayList implements List { - - private int size = 0; - - private int HALF_MAX_VALUE = Integer.MAX_VALUE; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - if (noSpace()) { - elementData = grow(); - } - elementData[size++] = o; - } - - public void add(int index, Object o) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > size) { - throw new IndexOutOfBoundsException("size is" + size); - } - if (noSpace()) { - elementData = grow(); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[size++] = o; - } - - public Object get(int index) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > (size - 1)) { - throw new IndexOutOfBoundsException("size is" + size); - } - return elementData[index]; - } - - public Object remove(int index) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > (size - 1)) { - throw new IndexOutOfBoundsException("size is" + size); - } - Object obj = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index); - elementData[size-1] = null; - size--; - return obj; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return null; - } - - private boolean noSpace() { - return size == elementData.length; - } - - private Object[] grow() { - int newSize; - if (size < HALF_MAX_VALUE) { - newSize = size * 2; - } else { - newSize = Integer.MAX_VALUE; - } - return Arrays.copyOf(elementData, newSize); - } - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java deleted file mode 100644 index 8e1b170dc0..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.coding.basic.array; - -import java.util.Arrays; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public int[] reverseArray(int[] origin){ - int len = origin.length; - int[] ret = new int[len]; - for(int i=0;i len1 && i2 > len2){ - break; - }else if(i1 > len1){ - ret[i++] = array2[i2++]; - }else{ - ret[i++] = array1[i1++]; - } - } - - } - if(sameNum > 0){ - ret = Arrays.copyOf(ret, ret.length - sameNum); - } - return ret; - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - return Arrays.copyOf(oldArray, oldArray.length + size); - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max){ - if(max == 1){ - return new int[0]; - }else{ - int[] tmp = new int[max + 1]; - int x1 = 1, x2 = 1; - int i = 1, j = 0; - tmp[j++] = x1; - tmp[j++] = x2; - while(true){ - i = x1 + x2; - if(i > max){ - break; - } - x1 = x2; - x2 = i; - tmp[j++] = i; - } - return Arrays.copyOf(tmp, j); - } - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - int[] tmp = new int[max/2 + 1]; - boolean isPrime; - int k = 0; - for(int i=2;i max) { - throw new IndexOutOfBoundsException(); - } - } - - - public Object get(int index) { - checkMinBound(index); - checkMaxBound(index, size - 1); - Node cur = head; - if (index != 0) { - int pos = 0; - do { - cur = cur.next; - pos++; - } while (pos != index); - } - return cur.data; - } - - public Object remove(int index) { - checkMinBound(index); - checkMaxBound(index, size - 1); - Node cur = head; - if (index == 0) { - head = cur.next; - } else { - int pos = 1; - Node prev = cur; - while (pos != index) { - prev = prev.next; - pos++; - } - cur = prev.next; - prev.next = cur.next; - } - size--; - return cur.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newNode = new Node(o, null); - newNode.next = head; - head = newNode; - size++; - } - - public void addLast(Object o) { - Node newNode = new Node(o, null); - if (head == null) { - head = newNode; - } else { - Node tmp = head; - while (tmp.next != null) { - tmp = tmp.next; - } - tmp.next = newNode; - } - size++; - } - - public Object removeFirst() { - if (head == null) { - throw new NoSuchElementException(); - } - Node ret = head; - head = head.next; - size--; - return ret.data; - } - - public Object removeLast() { - if (head == null) { - throw new NoSuchElementException(); - } - Node ret; - if (head.next == null) { - ret = head; - head = null; - } else { - Node prev = head; - ret = head.next; - while (ret.next != null) { - prev = ret; - ret = ret.next; - } - prev.next = null; - } - size--; - return ret.data; - } - - public Iterator iterator() { - return null; - } - - - private static class Node { - Object data; - Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse() { - if(size == 0 || size == 1){ - return ; - } - Node node = head; - Node nextNode = head.next; - Node tmp; - node.next = null; - do{ - tmp = nextNode.next; - nextNode.next = node; - node = nextNode; - nextNode = tmp; - }while(nextNode != null); - head = node; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - */ - public void removeFirstHalf() { - if(size == 0 || size == 1){ - return ; - } - int num = size / 2; - size -= num; - Node node = head; - while(num > 0){ - node = node.next; - num--; - } - head = node; - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * - * @param i - * @param length - */ - public void remove(int i, int length) { - checkMinBound(i); - checkMaxBound(i + length, size); - Node prev = null; - Node node = head; - int index = 0; - while(index < i){ - prev = node; - node = node.next; - index++; - } - Node nextNode = node.next; - while(index < (i + length - 1)){ - nextNode = nextNode.next; - index++; - } - size -= length; - if(i == 0){ - head = nextNode; - }else{ - prev.next = nextNode; - head = prev; - } - } - - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * - * @param list - */ - public int[] getElements(LinkedList list) { - int[] ret = new int[list.size()]; - if(ret.length == 0){ - return ret; - } - int index; - int j = 0; - Node node = head; - for(int i=0;i min){ - foundMin = true; - } - if(foundMin && (int)node.data > max){ - break; - } - if(foundMin == false){ - prev = node; - }else{ - size -= 1; - } - node = node.next; - }while(node != null); - if(prev == null){ - head = node; - }else{ - prev.next = node; - } - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * - * @param list - */ - public LinkedList intersection(LinkedList list) { - LinkedList ret = new LinkedList(); - Node node = head; - int nodeValue; - int elementValue; - for(int i=0;i elementValue){ - break; - } - node = node.next; - } - } - } - return ret; - } - - public String toString(){ - Node node = head; - StringBuilder sb = new StringBuilder(); - if(node == null){ - return ""; - }else{ - sb.append(head.data); - while((node = node.next) != null){ - sb.append(",").append(node.data); - } - return sb.toString(); - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java b/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java deleted file mode 100644 index 2de0c4370d..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.coding.me; - -/** - * 回文 - * - */ -public class Palindrome { - - private static String oddCase(char[] chars, int index) { - int maxLength = 1; - int i = 1; - while((index - i) >= 0 && (index + i) < chars.length - 1){ - if(chars[index - i] != chars[index + i]){ - break; - } - maxLength += 2; - i++; - } - return String.valueOf(chars, index + 1 - i, maxLength); - } - - private static String evenCase(char[] chars, int index) { - int maxLength = 0; - int i = 0; - while((index - i) >= 0 && (index + 1 + i) <= chars.length - 1){ - if(chars[index - i] != chars[index + 1 + i]){ - break; - } - i++; - maxLength += 2; - } - return String.valueOf(chars, index + 1 - i, maxLength); - } - - public static String findLongestPalindrome(String s){ - char[] chars = s.toCharArray(); - String longestPalindrome = ""; - String tmp = ""; - for(int i=0;i= 10){ - carry = 1; - sum -= 10; - }else{ - carry = 0; - } - if(ret == null){ - ret = new ListNode(sum); - first = ret; - }else{ - ret.next = new ListNode(sum); - ret = ret.next; - } - if(l1 != null){ - l1 = l1.next; - } - if(l2 != null){ - l2 = l2.next; - } - } - if(carry > 0){ - ret.next = new ListNode(carry); - } - return first; - } - - public ListNode leetcodeSolution(ListNode l1, ListNode l2) { - ListNode dummyHead = new ListNode(0); - ListNode p = l1, q = l2, curr = dummyHead; - int carry = 0; - while (p != null || q != null) { - int x = (p != null) ? p.val : 0; - int y = (q != null) ? q.val : 0; - int sum = carry + x + y; - carry = sum / 10; - curr.next = new ListNode(sum % 10); - curr = curr.next; - if (p != null) p = p.next; - if (q != null) q = q.next; - } - if (carry > 0) { - curr.next = new ListNode(carry); - } - return dummyHead.next; - } - - public static void main(String[] args) { - ListNode l11 = new ListNode(2); - ListNode l12 = new ListNode(4); - ListNode l13 = new ListNode(3); - l11.next = l12; - l12.next = l13; - - ListNode l21 = new ListNode(5); - ListNode l22 = new ListNode(6); - ListNode l23 = new ListNode(4); - l21.next = l22; - l22.next = l23; - - ListNode ret = new AddTwoNums().mySolution(l11, l21); - while(ret != null){ - System.out.println(ret.val); - ret = ret.next; - } - } -} - -class ListNode { - int val; - ListNode next; - ListNode(int x) { val = x; } -} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java deleted file mode 100644 index 791157d0d6..0000000000 --- a/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java +++ /dev/null @@ -1,61 +0,0 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Test; - -import com.coding.basic.array.ArrayList; - -public class TestArrayList { - - @Test - public void testAdd() { - ArrayList list = new ArrayList(); - int i = 0; - for (; i < 1000; i++) { - list.add(new Object()); - } - Assert.assertTrue(list.size() == i); - } - - @Test - public void testGet() { - ArrayList list = new ArrayList(); - int i = 0; - for (; i < 10; i++) { - list.add(new Object()); - } - Assert.assertFalse(list.get(5) == null); - try { - list.get(10); - Assert.assertTrue(false); - } catch (IndexOutOfBoundsException e) { - Assert.assertTrue(true); - } - } - - @Test - public void testAddWithIndex() { - ArrayList list = new ArrayList(); - int i = 0; - for (; i < 10; i++) { - list.add(new Object()); - } - Object obj = list.get(5); - list.add(5, new Object()); - Assert.assertTrue(list.size() == (i + 1)); - Assert.assertTrue(obj == list.get(6)); - } - - @Test - public void testRemove() { - ArrayList list = new ArrayList(); - int i = 0; - for (; i < 10; i++) { - list.add(i); - } - Object tempObj = list.get(5); - Assert.assertTrue(tempObj == list.remove(5)); - Assert.assertTrue(list.size() == (i - 1)); - Assert.assertTrue((int) list.get(list.size() - 1) == (i - 1)); - } -} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java deleted file mode 100644 index a137ceffb8..0000000000 --- a/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java +++ /dev/null @@ -1,37 +0,0 @@ -package test.com.coding.basic; - -import com.coding.basic.BinaryTreeNode; -import org.junit.Test; - -public class TestBinaryTreeNode { - - @Test - public void testInsert() { - BinaryTreeNode binaryTree = new BinaryTreeNode(5); - binaryTree.insert(2); - binaryTree.insert(7); - binaryTree.insert(1); - binaryTree.insert(6); - - printNode(binaryTree); - - binaryTree.insert(4); - binaryTree.insert(8); - - System.out.println("*************************"); - printNode(binaryTree); - } - - private void printNode(BinaryTreeNode node) { - System.out.print("node's data is " + node.getDataIntVal()); - System.out.println(" ,node's parent' data is " + (node.getParent() == null ? "null" : node.getParent().getDataIntVal())); - if (node.getLeft() != null) { - System.out.println("find left child node."); - printNode(node.getLeft()); - } - if (node.getRight() != null) { - System.out.println("find right child node."); - printNode(node.getRight()); - } - } -} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java deleted file mode 100644 index 3a4a79ba0d..0000000000 --- a/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java +++ /dev/null @@ -1,176 +0,0 @@ -package test.com.coding.basic; - -import static org.junit.Assert.fail; - -import org.junit.Assert; -import org.junit.Test; - -import com.coding.basic.linklist.LinkedList; - -public class TestLinkedList { - - @Test - public void testReverse(){ - LinkedList list = new LinkedList(); - list.add(3); - list.add(7); - list.add(10); - list.reverse(); - Assert.assertEquals("10,7,3", list.toString()); - Assert.assertEquals("10", list.get(0).toString()); - } - - @Test - public void testRemoveFirstHalf(){ - LinkedList list = new LinkedList(); - list.add(3); - list.add(7); - list.add(10); - list.add(12); - list.add(15); - list.removeFirstHalf(); - Assert.assertEquals("10", list.get(0).toString()); - Assert.assertEquals("10,12,15", list.toString()); - Assert.assertEquals(3, list.size()); - } - - @Test - public void testRemoveByLength(){ - LinkedList list = new LinkedList(); - list.add(3); - list.add(7); - list.add(10); - list.add(12); - list.add(15); - list.remove(0, 2); - Assert.assertEquals("10", list.get(0).toString()); - Assert.assertEquals("10,12,15", list.toString()); - Assert.assertEquals(3, list.size()); - - list.remove(1, 1); - Assert.assertEquals("10", list.get(0).toString()); - Assert.assertEquals("10,15", list.toString()); - Assert.assertEquals(2, list.size()); - } - - @Test - public void testGetElements(){ - LinkedList list = new LinkedList(); - list.add(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - list.add(6); - - LinkedList indices = new LinkedList(); - indices.add(1); - indices.add(3); - indices.add(4); - indices.add(6); - int[] elements = list.getElements(indices); - StringBuilder sb = new StringBuilder(); - for(int i=0;i clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - className = castClassName(className); - File file = null; - FileInputStream fis = null; - for(String clzPath : clzPaths){ - file = new File((clzPath + className)); - try { - fis = new FileInputStream(file); - byte[] bytes = new byte[2048]; - int i = 0; - int sum = 0; - while((i = fis.read(bytes)) != -1){ - sum += i; - } - fis.close(); - return Arrays.copyOf(bytes, sum); - } catch (FileNotFoundException e) { - continue; - } catch (IOException e) { - e.printStackTrace(); - } - } - return new byte[0]; - } - - private String castClassName(String className) { - String[] packs = className.split("\\."); - StringBuilder sb = new StringBuilder("/"); - for(int i=0;i0){ - if((index+1024)<=startPos){ - index+=1024; - continue; - } - - if(index<=startPos&&startPos<(index+1024)){ - - if(endPos<(index+1024)){ - for(int i=0,j=startPos-index;i0){ - count+=len; - } - Assert.assertEquals(count, conn.getContentLength()); - - } - - - @Test - public void testClose() { - conn.close(); - } - -} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java deleted file mode 100644 index 589c1bf1d2..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package junit.test; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.impl.ConnectionImpl; -import com.coderising.download.impl.ConnectionManagerImpl; - -public class ConnectionManagerImplTest { - - @Before - public void setUp() throws Exception { - } - - - @Test - public void testOpen() throws ConnectionException { - ConnectionManager cm = new ConnectionManagerImpl(); - String url = "http://localhost:8080/TimeCapsule/readme.txt"; - Connection conn = cm.open(url); - } - -} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java deleted file mode 100644 index 5ae230e97b..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package junit.test; - -import static org.junit.Assert.*; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; - - - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.download.DownloadThread; -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.impl.ConnectionManagerImpl; - -public class DownloadThreadTest { - - @Before - public void setUp() throws Exception { - } - - @Test - public void testRun() throws ConnectionException, IOException { - ConnectionManager cm = new ConnectionManagerImpl(); - String url = "http://localhost:8080/TimeCapsule/readme.txt"; - Connection conn = cm.open(url); - DownloadThread dt = new DownloadThread(conn, 0, conn.getContentLength()); - dt.start(); - - File file = new File("e://readme.txt"); - FileInputStream in = new FileInputStream(file); - byte[] b = new byte[10]; - int len = 0; - ArrayList a = new ArrayList(); - while((len=in.read(b))>0){ - a.add(b); - } - - int length = conn.getContentLength(); - if(length%3==0){ - for(int i=1;i<=3;i++){ - int startPos = length/3*i-1; - int endPos = length/3*(i-1); - new DownloadThread(conn, endPos, startPos).start(); - } - }else{ - for(int i=1;i<=2;i++){ - - int startPos = length/3*(i-1); - int endPos = length/3*i-1; - new DownloadThread(conn, startPos, endPos).start(); - } - int startPos = length/3*2; - new DownloadThread(conn, startPos, length).start(); - } - - file = new File("e://readme.txt"); - in = new FileInputStream(file); - b = new byte[10]; - len = 0; - ArrayList a1 = new ArrayList(); - while((len=in.read(b))>0){ - a1.add(b); - } - for(int i = 0;i= 0 && index <= size ) ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - //4 - private void addBeforeNode(int index, Object o) { - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - - Node beforeInserNode = this.head; - - - beforeInserNode = findBeforeInsertNode(index); - - newNode.next = beforeInserNode.next; - beforeInserNode.next = newNode; - - } - //5 - private Node findIndexNode(int index){ - Node findGetNode = this.head; - for ( int i=0; i< index; i++ ) { - findGetNode = findGetNode.next; - } - return findGetNode; - } - - - public void add(int index , Object o){ - checkPositionIndex(index); - if( index == size()){ - addLast(o); - } else if ( index == 0 ) { - addFirst(o); - } else{ - addBeforeNode(index,o); - } - this.size++; - } - - - - - public Object get(int index){ - checkElementIndex(index); - return findIndexNode(index); - } - public Object remove(int index){ - checkElementIndex(index); - Object deleteData = null; - - if(index == 0){ - deleteData = removeFirst(); - } else if(index == (size() - 1) ){ - deleteData = removeLast(); - } else { - Node temp = findBeforeInsertNode(index); - Node tempNext = temp.next; - deleteData = tempNext.data; - - temp.next = tempNext.next; - tempNext = null; - } - - return deleteData; - } - - //6 - private void checkElementIndex(int index) { - if ( !( index >= 0 && index < size ) ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - if ( this.head == null ) { - this.head = newNode; - } else { - newNode.next = this.head; - this.head = newNode; - } - } - private void addLast(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - if ( head == null ) { - head = newNode; - } else{ - findBeforeInsertNode(this.size).next = newNode; - } - } - public Object removeFirst(){ - Object data; - Node newHead = new Node(); - newHead = this.head; - this.head = newHead.next; - - data = newHead.data; - newHead = null; - return data; - } - public Object removeLast(){ - Object data; - Node last = findIndexNode(this.size() -1); - data = last.data; - last = null; - - return data; - } - public Iterator iterator() - { - return new LinkedListIterator(); - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - Node first ; - int currentIndex = 1; - this.head = findIndexNode(this.size - 1); - if(this.size() <= 1){ - return; - } - while(currentIndex < this.size() ){ - first = findIndexNode(this.size() - currentIndex); - first.next = findIndexNode(this.size - currentIndex - 1); - currentIndex++; - } - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - checkElementIndex(this.size()); - - int mid = this.size / 2; - Node temp = this.head; - this.head = findIndexNode(mid); - for (int i = 0; i < mid; i++) { - Node T = temp.next; - temp = null; - temp = T; - } - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param index - * @param length - */ - public void remove(int index, int length){ - checkElementIndex(length + index ); - - Node before = findBeforeInsertNode(index); - Node temp = findIndexNode(index); - for (int i= 0; i < length; i++) { - Node T = temp.next; - temp = null; - temp = T; - } - before.next = temp; - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - Node listNode = list.head; - Node myNode = this.head; - int[] data = new int[list.size()]; - for (int i = 0; i < this.size(); i++) { - if(i == (Integer) listNode.data){ - data[i] = (Integer)myNode.data; - } - myNode = myNode.next; - } - - return data; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - int[] data = new int[list.size()]; - for (int i = 0,j = 0; i < this.size(); i++) { - for (; j < list.size(); j++) { - if(this.get(i).equals(list.get(j))){ - this.remove(i); - break; - } - } - } - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - * (选做) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - * (选做) - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - LinkedList listC = new LinkedList(); - - for (int i = 0,j = 0; i < this.size(); i++) { - for (; j < list.size(); j++) { - if(this.get(i).equals(list.get(j))){ - listC.add(this.get(i)); - break; - } - } - } - - - - return listC; - } - - - - /************Iterator**************/ - private class LinkedListIterator implements Iterator{ - private Node currentNode; - private int currentIndex; - - public LinkedListIterator() { - // TODO Auto-generated constructor stub - this.currentIndex = 0; - this.currentNode = new Node(); - } - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return currentIndex < size(); - } - - @Override - public Object next() { - // TODO Auto-generated method stub - checkElementIndex(currentIndex); - if ( currentNode.data == null ) { - this.currentNode = findIndexNode(currentIndex); - } - Object value = currentNode.data; - currentNode = currentNode.next; - currentIndex++; - return value; - } - } -} diff --git a/group23/729693763/Third_Homework3/DataStruct/List.java b/group23/729693763/Third_Homework3/DataStruct/List.java deleted file mode 100644 index aa8b039453..0000000000 --- a/group23/729693763/Third_Homework3/DataStruct/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.zhous.DataStruct; - -public interface List { - void add(Object o); - void add(int index, Object o); - Object get(int index); - Object remove(int index); - int size(); - Iterator iterator(); -} diff --git a/group23/729693763/Third_Homework3/download/.classpath b/group23/729693763/Third_Homework3/download/.classpath deleted file mode 100644 index ac37fb2e4b..0000000000 --- a/group23/729693763/Third_Homework3/download/.classpath +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/group23/729693763/Third_Homework3/download/.project b/group23/729693763/Third_Homework3/download/.project deleted file mode 100644 index 9360f320db..0000000000 --- a/group23/729693763/Third_Homework3/download/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - download - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group23/729693763/Third_Homework3/download/DownloadThread.java b/group23/729693763/Third_Homework3/download/DownloadThread.java deleted file mode 100644 index 3ab337e352..0000000000 --- a/group23/729693763/Third_Homework3/download/DownloadThread.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.zhous.download; - -import com.zhous.download.api.Connection; -import com.zhous.download.api.DownloadListener; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - File targetFile; - DownloadListener downloadListener; - - public DownloadThread( Connection conn, int startPos, int endPos,File targetFile,DownloadListener downloadListener){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - this.targetFile = targetFile; - this.downloadListener = downloadListener; - } - public void run(){ - try { - //读取到指定长度的二进制数据 - System.out.println(this.getName()+"开始下载"); - byte[] data = conn.read(startPos,endPos); - - //插入的file中去 - RandomAccessFile raFile = new RandomAccessFile(this.targetFile,"rw"); - raFile.seek(startPos); - raFile.write(data,0,endPos-startPos ); - - raFile.close(); - //做完了 - if(FileDownloader.isDownloadFinish() ){ - downloadListener.notifyFinished(); - System.out.println(this.getName()+"完成最后的下载,并写入文件"); - } - - - }catch (IOException e){ - - } - } -} diff --git a/group23/729693763/Third_Homework3/download/FileDownloader.java b/group23/729693763/Third_Homework3/download/FileDownloader.java deleted file mode 100644 index 098f9408f0..0000000000 --- a/group23/729693763/Third_Homework3/download/FileDownloader.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.zhous.download; - -import com.zhous.download.api.Connection; -import com.zhous.download.api.ConnectionException; -import com.zhous.download.api.ConnectionManager; -import com.zhous.download.api.DownloadListener; - -import java.io.File; -import java.util.Set; - - -public class FileDownloader { - - String url="https://image.baidu.com/search/down?tn=download&word=download&ie=utf8&fr=detail&url=https%3A%2F%2Ftimgsa.baidu.com%2Ftimg%3Fimage%26quality%3D80%26size%3Db9999_10000%26sec%3D1490203615530%26di%3D2b1827956a01011d3634f3e04b01b15c%26imgtype%3D0%26src%3Dhttp%253A%252F%252Fimg15.3lian.com%252F2015%252Fh1%252F338%252Fd%252F157.jpg&thumburl=https%3A%2F%2Fss1.bdstatic.com%2F70cFvXSh_Q1YnxGkpoWK1HF6hhy%2Fit%2Fu%3D2613489365%2C2336631324%26fm%3D23%26gp%3D0.jpg"; - private static int threadNum = 5; - private static int threadCount = 0; - int avgBytes = 0; - - DownloadListener listener; - ConnectionManager cm; - File file = null; - - public FileDownloader(String _url,String fileName) { - this.url = _url; - this.file = new File(fileName); - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - try { - - conn = cm.open(this.url); - int length = conn.getContentLength(); - avgBytes = length / threadNum; - //使用5个线程去下载; - for (int i = 0; i < threadNum; i++) { - int startPos = i*avgBytes; - int endPos = startPos + avgBytes - 1; - if(i == threadNum -1) { - endPos = length; - } - - Connection c = cm.open(this.url); - DownloadThread thread = new DownloadThread(c,startPos,endPos,file,this.getListener()); - thread.setName("Thread"+(i+1) ); - thread.start(); - } - - } catch (ConnectionException e) { - e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } - } - - - - - } - - - - public void setListener (DownloadListener listener){ - this.listener = listener; - } - - public synchronized static boolean isDownloadFinish(){ - threadCount++; - return threadCount == threadNum; - } - - - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - -} diff --git a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java deleted file mode 100644 index ca8817ba88..0000000000 --- a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.zhous.download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.zhous.download.api.ConnectionManager; -import com.zhous.download.api.DownloadListener; -import com.zhous.download.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url="http://www.mydeskcity.com//upload/pc/112/960x600/1351650816239.jpg"; - String github = "https://github.com/em14Vito/coding2017/archive/master.zip"; - -// FileDownloader downloader = new FileDownloader(url,"Data23.jpg"); - FileDownloader downloader = new FileDownloader(github,"github.zip"); - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} diff --git a/group23/729693763/Third_Homework3/download/api/Connection.java b/group23/729693763/Third_Homework3/download/api/Connection.java deleted file mode 100644 index 170791e8ba..0000000000 --- a/group23/729693763/Third_Homework3/download/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zhous.download.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos, int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionException.java b/group23/729693763/Third_Homework3/download/api/ConnectionException.java deleted file mode 100644 index 925368135d..0000000000 --- a/group23/729693763/Third_Homework3/download/api/ConnectionException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.zhous.download.api; - -public class ConnectionException extends Exception { - -} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java deleted file mode 100644 index b331ee7f1f..0000000000 --- a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.zhous.download.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group23/729693763/Third_Homework3/download/api/DownloadListener.java b/group23/729693763/Third_Homework3/download/api/DownloadListener.java deleted file mode 100644 index 07b1a950ce..0000000000 --- a/group23/729693763/Third_Homework3/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.zhous.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java deleted file mode 100644 index 6a4b98fe06..0000000000 --- a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.zhous.download.impl; - -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -import com.zhous.download.api.*; - -public class ConnectionImpl implements Connection{ - - - InputStream is = null; - URL url = null; - HttpURLConnection http = null; - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - //构造方法: - public ConnectionImpl() { - } - - //打开url并且创建连接 - public ConnectionImpl(String url) { - try { - this.url = new URL(url); - http = (HttpURLConnection) this.url.openConnection(); - //设置超时 - http.setConnectTimeout(5000); - http.setReadTimeout(5000); - - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - - //指定http中读取一定长度的byte - http.setRequestProperty("Range","bytes= "+Integer.toString(startPos)+"-"+Integer.toString(endPos)); - http.connect(); - - //读取输入流到其中 - is = http.getInputStream(); - byte[] buffer = new byte[1024]; - int len = 0; - while( (len = is.read(buffer) ) != -1) { - - bos.write(buffer, 0, len); - } - - //关闭所有流,每次read的时候自动关闭。 - close(); - return bos.toByteArray(); - } - - @Override - public int getContentLength() { - return http.getContentLength(); - } - - @Override - public void close() { - try { - bos.close(); - if(is != null) { - is.close(); - } - http.disconnect(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println(e.getMessage()); - } - } - -} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java deleted file mode 100644 index 28af08a0cd..0000000000 --- a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.zhous.download.impl; - -import com.zhous.download.api.*; - -import java.net.MalformedURLException; -import java.net.URL; - -public class ConnectionManagerImpl implements ConnectionManager { - - - - @Override - public Connection open(String url) throws ConnectionException { - Connection ct = null; - URL u = null; - try { - u = new URL(url); - ct = new ConnectionImpl(url); - } catch (MalformedURLException e) { - e.printStackTrace(); - } finally { - //URL类不需要关闭 - } - return ct; - } - -} diff --git a/group23/group23.md b/group23/group23.md deleted file mode 100644 index 8b13789179..0000000000 --- a/group23/group23.md +++ /dev/null @@ -1 +0,0 @@ - From 58c9aadcc78e12681e40651d81bd79e1d64074c5 Mon Sep 17 00:00:00 2001 From: chk Date: Wed, 29 Mar 2017 00:11:28 +0800 Subject: [PATCH 026/552] 222 --- group23/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 group23/.DS_Store diff --git a/group23/.DS_Store b/group23/.DS_Store deleted file mode 100644 index 7e3e6cfac417bbd05dee75c3fbd8899a17aaca99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHLK}th05S`I3if+1enIrfWtjkcoC+G!)e$a)bUD$mt=+0Ys3E#_%@;{9r2qH2A znKwyhlIeq=WGW)MIt-o2LPX|hM5WOX4mYPx+<6Any2iEKNGD6^Wn-bgIKD z1Guv(^K-+{!9Xw&416-c^C6)Tvtu!=M+a0b0f2l)SAor1f-%W4I~GICK-5Bk7OGxi zsD)!ZxnFiHh88aB#fSRNAH|E--LZbE?xNW+bTAMMOc^+}?t=IK9X^?6kv|QIUN8_0 z{4)l0)~|d1b>(;K(a+;uo6zpjDD*2dAh0Ko0CaecT+~UMPqg8e9g87X;dl)P#zUYI L5-J$@1qR*$%DN@j From 189f74d2acd199bfa7546ca8ba24d8b8735f6d21 Mon Sep 17 00:00:00 2001 From: chk Date: Wed, 29 Mar 2017 00:20:04 +0800 Subject: [PATCH 027/552] 33 --- group23/1028361767/1028361767.md | 1 + .../src/com/coderising/array/ArrayUtil.java | 210 +++++++++ .../coderising/download/DownloadThread.java | 31 ++ .../coderising/download/FileDownloader.java | 104 +++++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 26 ++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 62 +++ .../download/impl/ConnectionManagerImpl.java | 26 ++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 181 ++++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coding/basic/ArrayList.java | 80 ++++ .../src/com/coding/basic/BinaryTreeNode.java | 97 +++++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/LinkedList.java | 399 ++++++++++++++++++ .../src/com/coding/basic/List.java | 13 + .../src/com/coding/basic/Queue.java | 22 + .../src/com/coding/basic/Stack.java | 35 ++ .../test/com/coding/basic/TestArrayList.java | 60 +++ .../com/coding/basic/TestBinaryTreeNode.java | 37 ++ .../test/com/coding/basic/TestLinkedList.java | 176 ++++++++ .../src/com/skomefen/list/ArrayList.java | 83 ++++ .../com/skomefen/list/ArrayListIterator.java | 25 ++ .../src/com/skomefen/list/BinaryTreeNode.java | 32 ++ .../src/com/skomefen/list/Iterator.java | 7 + .../src/com/skomefen/list/LinkedList.java | 252 +++++++++++ .../com/skomefen/list/LinkedListiterator.java | 25 ++ .../day3-11/src/com/skomefen/list/List.java | 9 + .../day3-11/src/com/skomefen/list/Queue.java | 26 ++ .../day3-11/src/com/skomefen/list/Stack.java | 28 ++ .../day3-11/src/com/skomefen/test/test.java | 109 +++++ .../src/com/coderising/array/ArrayUtil.java | 117 +++++ .../com/coderising/litestruts/StrutsTest.java | 54 +++ .../coderising/download/DownloadThread.java | 65 +++ .../coderising/download/FileDownloader.java | 89 ++++ .../download/FileDownloaderTest.java | 58 +++ .../coderising/download/api/Connection.java | 24 ++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 143 +++++++ .../download/impl/ConnectionManagerImpl.java | 16 + .../src/junit/test/ConnectionImplTest.java | 92 ++++ .../junit/test/ConnectionManagerImplTest.java | 31 ++ .../src/junit/test/DownloadThreadTest.java | 77 ++++ .../src/com/coding/datastructs/ArrayList.java | 98 +++++ .../src/com/coding/datastructs/Iterator.java | 7 + .../com/coding/datastructs/LinkedList.java | 229 ++++++++++ .../src/com/coding/datastructs/List.java | 9 + .../com/coding/datastructs/MyIterator.java | 35 ++ .../src/com/coding/datastructs/Queue.java | 30 ++ .../src/com/coding/datastructs/Stack.java | 33 ++ .../src/com/coding/test/ArrayListTest.java | 32 ++ .../src/com/coding/test/LinkedListTest.java | 28 ++ .../src/com/coding/test/QueueTest.java | 22 + .../src/com/coding/test/StackTest.java | 25 ++ .../com/coding/datastructs/ArrayUtil.java" | 141 +++++++ .../src/com/coding/test/ArrayUtilTest.java" | 86 ++++ .../coderising/litestruts/LoginAction.java" | 35 ++ .../com/coderising/litestruts/Struts.java" | 122 ++++++ .../coderising/litestruts/StrutsTest.java" | 43 ++ .../src/com/coderising/litestruts/Test.java" | 94 +++++ .../src/com/coderising/litestruts/View.java" | 23 + .../src/com/coderising/array/ArrayUtil.java | 96 +++++ .../coderising/download/DownloadThread.java | 20 + .../coderising/download/FileDownloader.java | 73 ++++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 ++ .../download/impl/ConnectionManagerImpl.java | 15 + .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 37 ++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coding/basic/ArrayList.java | 32 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 122 ++++++ .../565832157/src/com/coding/basic/List.java | 9 + .../565832157/src/com/coding/basic/Queue.java | 19 + .../565832157/src/com/coding/basic/Stack.java | 22 + group23/601689050/ArrayList.java | 58 +++ group23/601689050/BinaryTreeNode.java | 50 +++ group23/601689050/Iterator.java | 7 + group23/601689050/LinkedList.java | 117 +++++ group23/601689050/List.java | 10 + group23/601689050/Queue.java | 45 ++ group23/601689050/Stack.java | 39 ++ group23/609041842/src/code/ArrayList.java | 49 +++ group23/609041842/src/code/LinkedList.java | 87 ++++ group23/609041842/src/code/Queue.java | 17 + group23/609041842/src/code/Stack.java | 30 ++ .../src/com/homework01/ArrayList.java | 49 +++ .../src/com/homework01/LinkedList.java | 87 ++++ .../609041842/src/com/homework01/Queue.java | 17 + .../609041842/src/com/homework01/Stack.java | 30 ++ group23/609041842/src/test.java | 9 + .../com/basic/datastructure/ArrayList.java | 64 +++ .../com/basic/datastructure/LinkedList.java | 98 +++++ .../com/basic/datastructure/List.java | 9 + .../com/basic/datastructure/Queue.java | 23 + .../com/basic/datastructure/Stack.java | 29 ++ .../datastructure/TestDataStructure.java | 27 ++ .../basic/week2/datastructure/ArrayTest.java | 50 +++ .../basic/week2/datastructure/ArrayUtil.java | 228 ++++++++++ group23/729693763/First_Homework1/readme.md | 2 + .../src/com/danny/hw1/ArrayList.java | 117 +++++ .../src/com/danny/hw1/BinaryTreeNode.java | 101 +++++ .../src/com/danny/hw1/Iterator.java | 6 + .../src/com/danny/hw1/LinkedList.java | 296 +++++++++++++ .../src/com/danny/hw1/List.java | 10 + .../src/com/danny/hw1/Queue.java | 25 ++ .../src/com/danny/hw1/Stack.java | 40 ++ .../src/com/danny/hw1/test/ArrayListTest.java | 80 ++++ .../danny/hw1/test/BinaryTreeNodeTest.java | 48 +++ .../com/danny/hw1/test/LinkedListTest.java | 86 ++++ .../src/com/danny/hw1/test/QueueTest.java | 47 +++ .../src/com/danny/hw1/test/StackTest.java | 54 +++ .../src/com/danny/hw1/test/SuitTest.java | 17 + .../src/com/danny/hw2/ArrayUtil.java | 221 ++++++++++ .../src/com/danny/hw2/LoginAction.java | 39 ++ .../src/com/danny/hw2/Struts.java | 163 +++++++ .../src/com/danny/hw2/View.java | 23 + .../src/com/danny/hw2/test/ArrayUtilTest.java | 95 +++++ .../src/com/danny/hw2/test/StrutsTest.java | 46 ++ .../Third_Homework3/DataStruct/Iterator.java | 6 + .../DataStruct/LinkedList.java | 327 ++++++++++++++ .../Third_Homework3/DataStruct/List.java | 10 + .../download/DownloadThread.java | 49 +++ .../download/FileDownloader.java | 96 +++++ .../download/FileDownloaderTest.java | 58 +++ .../download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 80 ++++ .../download/impl/ConnectionManagerImpl.java | 27 ++ .../729693763/homework1_demo/ArrayList.java | 32 ++ .../homework1_demo/BinaryTreeNode.java | 32 ++ .../729693763/homework1_demo/Iterator.java | 7 + .../729693763/homework1_demo/LinkedList.java | 124 ++++++ group23/729693763/homework1_demo/List.java | 9 + group23/729693763/homework1_demo/Queue.java | 19 + group23/729693763/homework1_demo/Stack.java | 22 + group23/729693763/readme.md | 12 + .../src/main/java/code01/ArrayList.java | 138 ++++++ .../src/main/java/code01/BinaryTree.java | 97 +++++ .../coding/src/main/java/code01/Iterator.java | 7 + .../src/main/java/code01/LinkedList.java | 327 ++++++++++++++ .../coding/src/main/java/code01/List.java | 9 + .../coding/src/main/java/code01/Queue.java | 24 ++ .../coding/src/main/java/code01/Stack.java | 31 ++ .../src/main/java/code02/ArrayUtil.java | 257 +++++++++++ .../java/code02/litestruts/ActionConfig.java | 28 ++ .../java/code02/litestruts/Configuration.java | 64 +++ .../java/code02/litestruts/LoginAction.java | 39 ++ .../code02/litestruts/ReflectionUtil.java | 119 ++++++ .../main/java/code02/litestruts/Struts.java | 76 ++++ .../src/main/java/code02/litestruts/View.java | 23 + .../src/main/java/code03/DownloadThread.java | 47 +++ .../src/main/java/code03/FileDownloader.java | 109 +++++ .../src/main/java/code03/api/Connection.java | 23 + .../java/code03/api/ConnectionException.java | 9 + .../java/code03/api/ConnectionManager.java | 10 + .../java/code03/api/DownloadListener.java | 5 + .../main/java/code03/impl/ConnectionImpl.java | 107 +++++ .../code03/impl/ConnectionManagerImpl.java | 36 ++ .../src/test/java/code01/ArrayListTest.java | 67 +++ .../src/test/java/code01/BinaryTreeTest.java | 27 ++ .../src/test/java/code01/LinkedListTest.java | 174 ++++++++ .../src/test/java/code01/QueueTest.java | 24 ++ .../src/test/java/code01/StackTest.java | 27 ++ .../src/test/java/code02/ArrayUtilTest.java | 73 ++++ .../java/code02/litestruts/StrutsTest.java | 43 ++ .../test/java/code03/FileDownloaderTest.java | 59 +++ .../810181789/src/firstday/ArrayListt.java | 86 ++++ group23/810181789/src/firstday/LinkListt.java | 167 ++++++++ group23/810181789/src/firstday/Queue.java | 43 ++ group23/810181789/src/firstday/Stack.java | 43 ++ group23/group23.md | 1 + 187 files changed, 11061 insertions(+) create mode 100644 group23/1028361767/1028361767.md create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/DownloadThread.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/Connection.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/Struts.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java create mode 100644 group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java create mode 100644 group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestArrayList.java create mode 100644 group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestBinaryTreeNode.java create mode 100644 group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestLinkedList.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayList.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/BinaryTreeNode.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Iterator.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedList.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/List.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Queue.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Stack.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/test/test.java create mode 100644 group23/1072760797-skomefen/day3-19/src/com/coderising/array/ArrayUtil.java create mode 100644 group23/1072760797-skomefen/day3-19/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionImplTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java create mode 100644 group23/1246614258/src/com/coding/datastructs/ArrayList.java create mode 100644 group23/1246614258/src/com/coding/datastructs/Iterator.java create mode 100644 group23/1246614258/src/com/coding/datastructs/LinkedList.java create mode 100644 group23/1246614258/src/com/coding/datastructs/List.java create mode 100644 group23/1246614258/src/com/coding/datastructs/MyIterator.java create mode 100644 group23/1246614258/src/com/coding/datastructs/Queue.java create mode 100644 group23/1246614258/src/com/coding/datastructs/Stack.java create mode 100644 group23/1246614258/src/com/coding/test/ArrayListTest.java create mode 100644 group23/1246614258/src/com/coding/test/LinkedListTest.java create mode 100644 group23/1246614258/src/com/coding/test/QueueTest.java create mode 100644 group23/1246614258/src/com/coding/test/StackTest.java create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/test/ArrayUtilTest.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/LoginAction.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Struts.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" create mode 100644 group23/565832157/src/com/coderising/array/ArrayUtil.java create mode 100644 group23/565832157/src/com/coderising/download/DownloadThread.java create mode 100644 group23/565832157/src/com/coderising/download/FileDownloader.java create mode 100644 group23/565832157/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/565832157/src/com/coderising/download/api/Connection.java create mode 100644 group23/565832157/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/565832157/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/565832157/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/565832157/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/565832157/src/com/coderising/litestruts/Struts.java create mode 100644 group23/565832157/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/565832157/src/com/coderising/litestruts/View.java create mode 100644 group23/565832157/src/com/coding/basic/ArrayList.java create mode 100644 group23/565832157/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/565832157/src/com/coding/basic/Iterator.java create mode 100644 group23/565832157/src/com/coding/basic/LinkedList.java create mode 100644 group23/565832157/src/com/coding/basic/List.java create mode 100644 group23/565832157/src/com/coding/basic/Queue.java create mode 100644 group23/565832157/src/com/coding/basic/Stack.java create mode 100644 group23/601689050/ArrayList.java create mode 100644 group23/601689050/BinaryTreeNode.java create mode 100644 group23/601689050/Iterator.java create mode 100644 group23/601689050/LinkedList.java create mode 100644 group23/601689050/List.java create mode 100644 group23/601689050/Queue.java create mode 100644 group23/601689050/Stack.java create mode 100644 group23/609041842/src/code/ArrayList.java create mode 100644 group23/609041842/src/code/LinkedList.java create mode 100644 group23/609041842/src/code/Queue.java create mode 100644 group23/609041842/src/code/Stack.java create mode 100644 group23/609041842/src/com/homework01/ArrayList.java create mode 100644 group23/609041842/src/com/homework01/LinkedList.java create mode 100644 group23/609041842/src/com/homework01/Queue.java create mode 100644 group23/609041842/src/com/homework01/Stack.java create mode 100644 group23/609041842/src/test.java create mode 100644 group23/632678665/com/basic/datastructure/ArrayList.java create mode 100644 group23/632678665/com/basic/datastructure/LinkedList.java create mode 100644 group23/632678665/com/basic/datastructure/List.java create mode 100644 group23/632678665/com/basic/datastructure/Queue.java create mode 100644 group23/632678665/com/basic/datastructure/Stack.java create mode 100644 group23/632678665/com/basic/datastructure/TestDataStructure.java create mode 100644 group23/632678665/com/basic/week2/datastructure/ArrayTest.java create mode 100644 group23/632678665/com/basic/week2/datastructure/ArrayUtil.java create mode 100644 group23/729693763/First_Homework1/readme.md create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/List.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/View.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java create mode 100644 group23/729693763/Third_Homework3/DataStruct/Iterator.java create mode 100644 group23/729693763/Third_Homework3/DataStruct/LinkedList.java create mode 100644 group23/729693763/Third_Homework3/DataStruct/List.java create mode 100644 group23/729693763/Third_Homework3/download/DownloadThread.java create mode 100644 group23/729693763/Third_Homework3/download/FileDownloader.java create mode 100644 group23/729693763/Third_Homework3/download/FileDownloaderTest.java create mode 100644 group23/729693763/Third_Homework3/download/api/Connection.java create mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionException.java create mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionManager.java create mode 100644 group23/729693763/Third_Homework3/download/api/DownloadListener.java create mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java create mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java create mode 100644 group23/729693763/homework1_demo/ArrayList.java create mode 100644 group23/729693763/homework1_demo/BinaryTreeNode.java create mode 100644 group23/729693763/homework1_demo/Iterator.java create mode 100644 group23/729693763/homework1_demo/LinkedList.java create mode 100644 group23/729693763/homework1_demo/List.java create mode 100644 group23/729693763/homework1_demo/Queue.java create mode 100644 group23/729693763/homework1_demo/Stack.java create mode 100644 group23/729693763/readme.md create mode 100644 group23/769232552/coding/src/main/java/code01/ArrayList.java create mode 100644 group23/769232552/coding/src/main/java/code01/BinaryTree.java create mode 100644 group23/769232552/coding/src/main/java/code01/Iterator.java create mode 100644 group23/769232552/coding/src/main/java/code01/LinkedList.java create mode 100644 group23/769232552/coding/src/main/java/code01/List.java create mode 100644 group23/769232552/coding/src/main/java/code01/Queue.java create mode 100644 group23/769232552/coding/src/main/java/code01/Stack.java create mode 100644 group23/769232552/coding/src/main/java/code02/ArrayUtil.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/Struts.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/View.java create mode 100644 group23/769232552/coding/src/main/java/code03/DownloadThread.java create mode 100644 group23/769232552/coding/src/main/java/code03/FileDownloader.java create mode 100644 group23/769232552/coding/src/main/java/code03/api/Connection.java create mode 100644 group23/769232552/coding/src/main/java/code03/api/ConnectionException.java create mode 100644 group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java create mode 100644 group23/769232552/coding/src/main/java/code03/api/DownloadListener.java create mode 100644 group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java create mode 100644 group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java create mode 100644 group23/769232552/coding/src/test/java/code01/ArrayListTest.java create mode 100644 group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java create mode 100644 group23/769232552/coding/src/test/java/code01/LinkedListTest.java create mode 100644 group23/769232552/coding/src/test/java/code01/QueueTest.java create mode 100644 group23/769232552/coding/src/test/java/code01/StackTest.java create mode 100644 group23/769232552/coding/src/test/java/code02/ArrayUtilTest.java create mode 100644 group23/769232552/coding/src/test/java/code02/litestruts/StrutsTest.java create mode 100644 group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java create mode 100644 group23/810181789/src/firstday/ArrayListt.java create mode 100644 group23/810181789/src/firstday/LinkListt.java create mode 100644 group23/810181789/src/firstday/Queue.java create mode 100644 group23/810181789/src/firstday/Stack.java create mode 100644 group23/group23.md diff --git a/group23/1028361767/1028361767.md b/group23/1028361767/1028361767.md new file mode 100644 index 0000000000..741976ad6e --- /dev/null +++ b/group23/1028361767/1028361767.md @@ -0,0 +1 @@ +This is 1028361767's project. \ No newline at end of file diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java b/group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..e497a8e251 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,210 @@ +package com.coderising.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + int len = origin.length; + int[] ret = new int[len]; + for(int i=0;i len1 && i2 > len2){ + break; + }else if(i1 > len1){ + ret[i++] = array2[i2++]; + }else{ + ret[i++] = array1[i1++]; + } + } + + } + if(sameNum > 0){ + ret = Arrays.copyOf(ret, ret.length - sameNum); + } + return ret; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return Arrays.copyOf(oldArray, oldArray.length + size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max == 1){ + return new int[0]; + }else{ + int[] tmp = new int[max + 1]; + int x1 = 1, x2 = 1; + int i = 1, j = 0; + tmp[j++] = x1; + tmp[j++] = x2; + while(true){ + i = x1 + x2; + if(i > max){ + break; + } + x1 = x2; + x2 = i; + tmp[j++] = i; + } + return Arrays.copyOf(tmp, j); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] tmp = new int[max/2 + 1]; + boolean isPrime; + int k = 0; + for(int i=2;i actions = new HashMap(); + + @SuppressWarnings("rawtypes") + public static View runAction(String actionName, Map parameters) throws Exception { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + //读取xml,把xml信息放到actions + readStrutsXML(); + + Action action = actions.get(actionName); + View view = new View(); + if(action != null){ + Class clazz = Class.forName(action.getClassName()); + Object obj = clazz.newInstance(); + + //根据parameters调用set方法 + initClass(clazz, obj, action, parameters); + + //调用execute方法 + String result = execute(clazz, obj); + //调用所有get方法 + Map resultParameters = getResultParameters(clazz, obj); + + view.setJsp(action.getResults().get(result)); + view.setParameters(resultParameters); + } + + return view; + } + + @SuppressWarnings("rawtypes") + private static Map getResultParameters(Class clazz, Object obj) throws Exception { + Map resultParameters = new HashMap(); + Method[] methods = clazz.getMethods(); + String methodName; + String propName; + String propValue; + for(Method method : methods){ + methodName = method.getName(); + if(methodName.startsWith("get") && !"getClass".equals(methodName)){ + propName = firstLetterLowerCase(methodName.substring(3, methodName.length())); + propValue = (String) method.invoke(obj); + resultParameters.put(propName, propValue); + } + } + return resultParameters; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static String execute(Class clazz, Object obj) throws Exception{ + Method method = clazz.getMethod("execute"); + return (String)method.invoke(obj); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static void initClass(Class clazz, Object obj, Action action, Map parameters) throws Exception { + String setMethodName; + Method method = null; + for (String parameter : parameters.keySet()) { + setMethodName = "set" + firstLetterUpperCase(parameter); + method = clazz.getMethod(setMethodName, String.class); + method.invoke(obj, parameters.get(parameter)); + } + } + + private static String firstLetterLowerCase(String string){ + char[] cs = string.toCharArray(); + cs[0] += 32; + return String.valueOf(cs); + } + + private static String firstLetterUpperCase(String string){ + char[] cs = string.toCharArray(); + cs[0] -= 32; + return String.valueOf(cs); + } + + @SuppressWarnings("unchecked") + private static void readStrutsXML() { + SAXReader saxReader = new SAXReader(); + Document document; + try { + document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml")); + } catch (DocumentException e) { + System.out.println("error:file not found"); + return ; + } + Element root = document.getRootElement(); + Iterator actionItr = root.elementIterator(); + Element action; + Action act; + Iterator resultItr; + Element result; + Map results; + while(actionItr.hasNext()){ + action = actionItr.next(); + + resultItr = action.elementIterator(); + results = new HashMap(); + while(resultItr.hasNext()){ + result = resultItr.next(); + results.put(result.attributeValue("name"), result.getStringValue()); + } + + act = new Action(); + act.setName(action.attributeValue("name")); + act.setClassName(action.attributeValue("class")); + act.setResults(results); + + actions.put(act.getName(), act); + } + } + + static class Action { + + private String name; + + private String className; + + private Map results = new HashMap<>(); + + public Map getResults() { + return results; + } + + public void setResults(Map results) { + this.results = results; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + } + +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java b/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..92a6758a69 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java b/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..da0237bdf7 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java @@ -0,0 +1,80 @@ +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private int HALF_MAX_VALUE = Integer.MAX_VALUE; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + if (noSpace()) { + elementData = grow(); + } + elementData[size++] = o; + } + + public void add(int index, Object o) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > size) { + throw new IndexOutOfBoundsException("size is" + size); + } + if (noSpace()) { + elementData = grow(); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[size++] = o; + } + + public Object get(int index) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > (size - 1)) { + throw new IndexOutOfBoundsException("size is" + size); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > (size - 1)) { + throw new IndexOutOfBoundsException("size is" + size); + } + Object obj = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index); + elementData[size-1] = null; + size--; + return obj; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + + private boolean noSpace() { + return size == elementData.length; + } + + private Object[] grow() { + int newSize; + if (size < HALF_MAX_VALUE) { + newSize = size * 2; + } else { + newSize = Integer.MAX_VALUE; + } + return Arrays.copyOf(elementData, newSize); + } + +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..dced34e873 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,97 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode parent; + + public BinaryTreeNode(Object data) { + this.data = data; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public void setParent(BinaryTreeNode parent) { + this.parent = parent; + } + + public BinaryTreeNode getParent() { + return parent; + } + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode newNode = new BinaryTreeNode(o); + BinaryTreeNode root = findRoot(this); + if (root.data == null) { + root.data = newNode; + } else { + int newVal = getNodeIntVal(newNode); + insert(root, newNode, newVal); + } + return newNode; + } + + private void insert(BinaryTreeNode node, BinaryTreeNode newNode, int newVal) { + int nodeVal = getNodeIntVal(node); + if (newVal < nodeVal) { + if (node.left == null) { + newNode.parent = node; + node.left = newNode; + } else { + insert(node.left, newNode, newVal); + } + } else { + if (node.right == null) { + newNode.parent = node; + node.right = newNode; + } else { + insert(node.right, newNode, newVal); + } + } + } + + private BinaryTreeNode findRoot(BinaryTreeNode binaryTreeNode) { + while (binaryTreeNode.parent != null) { + binaryTreeNode = binaryTreeNode.parent; + } + return binaryTreeNode; + } + + private int getNodeIntVal(BinaryTreeNode node) { + if (node.data instanceof Integer) { + return ((Integer) node.data).intValue(); + } + return 0; + } + + public int getDataIntVal() { + if (data instanceof Integer) { + return ((Integer) data).intValue(); + } + return 0; + } +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..96adcd6d3a --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); + +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..eb41670f82 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java @@ -0,0 +1,399 @@ +package com.coding.basic; + + +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private Node head; + private int size; + + public void add(Object o) { + Node newNode = new Node(o, null); + if (head == null) { + head = newNode; + } else { + Node tmp = head; + while (tmp.next != null) { + tmp = tmp.next; + } + tmp.next = newNode; + } + size++; + } + + public void add(int index, Object o) { + checkMinBound(index); + checkMaxBound(index, size); + Node newNode = new Node(o, null); + if (index == 0) { + newNode.next = head; + head = newNode; + } else { + int pos = 1; + Node tmp = head; + while (pos != index) { + tmp = tmp.next; + pos++; + } + newNode.next = tmp.next; + tmp.next = newNode; + } + size++; + + } + + private void checkMinBound(int index) { + if (index < 0) { + throw new IllegalArgumentException(); + } + } + + private void checkMaxBound(int index, int max) { + if (index > max) { + throw new IndexOutOfBoundsException(); + } + } + + + public Object get(int index) { + checkMinBound(index); + checkMaxBound(index, size - 1); + Node cur = head; + if (index != 0) { + int pos = 0; + do { + cur = cur.next; + pos++; + } while (pos != index); + } + return cur.data; + } + + public Object remove(int index) { + checkMinBound(index); + checkMaxBound(index, size - 1); + Node cur = head; + if (index == 0) { + head = cur.next; + } else { + int pos = 1; + Node prev = cur; + while (pos != index) { + prev = prev.next; + pos++; + } + cur = prev.next; + prev.next = cur.next; + } + size--; + return cur.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o, null); + newNode.next = head; + head = newNode; + size++; + } + + public void addLast(Object o) { + Node newNode = new Node(o, null); + if (head == null) { + head = newNode; + } else { + Node tmp = head; + while (tmp.next != null) { + tmp = tmp.next; + } + tmp.next = newNode; + } + size++; + } + + public Object removeFirst() { + if (head == null) { + throw new NoSuchElementException(); + } + Node ret = head; + head = head.next; + size--; + return ret.data; + } + + public Object removeLast() { + if (head == null) { + throw new NoSuchElementException(); + } + Node ret; + if (head.next == null) { + ret = head; + head = null; + } else { + Node prev = head; + ret = head.next; + while (ret.next != null) { + prev = ret; + ret = ret.next; + } + prev.next = null; + } + size--; + return ret.data; + } + + public Iterator iterator() { + return null; + } + + + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + if(size == 0 || size == 1){ + return ; + } + Node node = head; + Node nextNode = head.next; + Node tmp; + node.next = null; + do{ + tmp = nextNode.next; + nextNode.next = node; + node = nextNode; + nextNode = tmp; + }while(nextNode != null); + head = node; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf() { + if(size == 0 || size == 1){ + return ; + } + int num = size / 2; + size -= num; + Node node = head; + while(num > 0){ + node = node.next; + num--; + } + head = node; + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + checkMinBound(i); + checkMaxBound(i + length, size); + Node prev = null; + Node node = head; + int index = 0; + while(index < i){ + prev = node; + node = node.next; + index++; + } + Node nextNode = node.next; + while(index < (i + length - 1)){ + nextNode = nextNode.next; + index++; + } + size -= length; + if(i == 0){ + head = nextNode; + }else{ + prev.next = nextNode; + head = prev; + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + public int[] getElements(LinkedList list) { + int[] ret = new int[list.size()]; + if(ret.length == 0){ + return ret; + } + int index; + int j = 0; + Node node = head; + for(int i=0;i min){ + foundMin = true; + } + if(foundMin && (int)node.data > max){ + break; + } + if(foundMin == false){ + prev = node; + }else{ + size -= 1; + } + node = node.next; + }while(node != null); + if(prev == null){ + head = node; + }else{ + prev.next = node; + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * + * @param list + */ + public LinkedList intersection(LinkedList list) { + LinkedList ret = new LinkedList(); + Node node = head; + int nodeValue; + int elementValue; + for(int i=0;i elementValue){ + break; + } + node = node.next; + } + } + } + return ret; + } + + public String toString(){ + Node node = head; + StringBuilder sb = new StringBuilder(); + if(node == null){ + return ""; + }else{ + sb.append(head.data); + while((node = node.next) != null){ + sb.append(",").append(node.data); + } + return sb.toString(); + } + } +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java new file mode 100644 index 0000000000..01398944e6 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..bb24e2132e --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o) { + linkedList.add(o); + } + + public Object deQueue() { + return linkedList.removeFirst(); + } + + public boolean isEmpty() { + return linkedList.size() == 0; + } + + public int size() { + return linkedList.size(); + } +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..55c96985a9 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java @@ -0,0 +1,35 @@ +package com.coding.basic; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + checkBound(); + return elementData.get(size() - 1); + } + + public Object peek() { + checkBound(); + return elementData.remove(size() - 1); + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return elementData.size(); + } + + private void checkBound() { + if (isEmpty()) { + throw new EmptyStackException(); + } + } +} diff --git a/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestArrayList.java b/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestArrayList.java new file mode 100644 index 0000000000..61562d2a39 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestArrayList.java @@ -0,0 +1,60 @@ +package test.com.coding.basic; + +import com.coding.basic.ArrayList; +import org.junit.Assert; +import org.junit.Test; + +public class TestArrayList { + + @Test + public void testAdd() { + ArrayList list = new ArrayList(); + int i = 0; + for (; i < 1000; i++) { + list.add(new Object()); + } + Assert.assertTrue(list.size() == i); + } + + @Test + public void testGet() { + ArrayList list = new ArrayList(); + int i = 0; + for (; i < 10; i++) { + list.add(new Object()); + } + Assert.assertFalse(list.get(5) == null); + try { + list.get(10); + Assert.assertTrue(false); + } catch (IndexOutOfBoundsException e) { + Assert.assertTrue(true); + } + } + + @Test + public void testAddWithIndex() { + ArrayList list = new ArrayList(); + int i = 0; + for (; i < 10; i++) { + list.add(new Object()); + } + Object obj = list.get(5); + list.add(5, new Object()); + Assert.assertTrue(list.size() == (i + 1)); + Assert.assertTrue(obj == list.get(6)); + } + + @Test + public void testRemove() { + ArrayList list = new ArrayList(); + int i = 0; + for (; i < 10; i++) { + list.add(i); + } + Object tempObj = list.get(5); + Assert.assertTrue(tempObj == list.remove(5)); + Assert.assertTrue(list.size() == (i - 1)); + Assert.assertTrue((int) list.get(list.size() - 1) == (i - 1)); + } +} diff --git a/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestBinaryTreeNode.java b/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestBinaryTreeNode.java new file mode 100644 index 0000000000..a137ceffb8 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestBinaryTreeNode.java @@ -0,0 +1,37 @@ +package test.com.coding.basic; + +import com.coding.basic.BinaryTreeNode; +import org.junit.Test; + +public class TestBinaryTreeNode { + + @Test + public void testInsert() { + BinaryTreeNode binaryTree = new BinaryTreeNode(5); + binaryTree.insert(2); + binaryTree.insert(7); + binaryTree.insert(1); + binaryTree.insert(6); + + printNode(binaryTree); + + binaryTree.insert(4); + binaryTree.insert(8); + + System.out.println("*************************"); + printNode(binaryTree); + } + + private void printNode(BinaryTreeNode node) { + System.out.print("node's data is " + node.getDataIntVal()); + System.out.println(" ,node's parent' data is " + (node.getParent() == null ? "null" : node.getParent().getDataIntVal())); + if (node.getLeft() != null) { + System.out.println("find left child node."); + printNode(node.getLeft()); + } + if (node.getRight() != null) { + System.out.println("find right child node."); + printNode(node.getRight()); + } + } +} diff --git a/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestLinkedList.java b/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestLinkedList.java new file mode 100644 index 0000000000..39b41c1317 --- /dev/null +++ b/group23/1028361767/Week1DataStructure/src/test/com/coding/basic/TestLinkedList.java @@ -0,0 +1,176 @@ +package test.com.coding.basic; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Test; + +import com.coding.basic.LinkedList; + +public class TestLinkedList { + + @Test + public void testReverse(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.reverse(); + Assert.assertEquals("10,7,3", list.toString()); + Assert.assertEquals("10", list.get(0).toString()); + } + + @Test + public void testRemoveFirstHalf(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.add(12); + list.add(15); + list.removeFirstHalf(); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,12,15", list.toString()); + Assert.assertEquals(3, list.size()); + } + + @Test + public void testRemoveByLength(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.add(12); + list.add(15); + list.remove(0, 2); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,12,15", list.toString()); + Assert.assertEquals(3, list.size()); + + list.remove(1, 1); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,15", list.toString()); + Assert.assertEquals(2, list.size()); + } + + @Test + public void testGetElements(){ + LinkedList list = new LinkedList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + + LinkedList indices = new LinkedList(); + indices.add(1); + indices.add(3); + indices.add(4); + indices.add(6); + int[] elements = list.getElements(indices); + StringBuilder sb = new StringBuilder(); + for(int i=0;isize||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + + if(sizesize||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + + return elementData[index]; + + } + + public Object remove(int index){ + if(index>size||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + Object revalue = elementData[index]; + Object[] dest = new Object[elementData.length]; + System.arraycopy(elementData, 0, dest, 0, index); + System.arraycopy(elementData, index+1, dest, index, elementData.length-1-index); + elementData = dest; + size--; + return revalue; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + iterator = new ArrayListIterator(this); + return iterator; + } + +} diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java new file mode 100644 index 0000000000..345d620c0e --- /dev/null +++ b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java @@ -0,0 +1,25 @@ +package com.skomefen.list; + +public class ArrayListIterator implements Iterator { + private ArrayList array = null; + private int index = 0; + public ArrayListIterator(ArrayList array) { + this.array = array; + } + public boolean hasNext() { + if(array==null){ + return false; + } + if(indexsize||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + insertoflist(index, o); + + + } + public Object get(int index){ + if(index>=size||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + if(head==null){ + return null; + } + if(index==point){ + return node.data; + } + this.point=0; + node = head; + while(index>=this.point){ + + if(index==point){ + return node.data; + } + point++; + node = node.next; + } + return null; + } + public Object remove(int index){ + if(index>=size||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + size--; + if(index==(this.point+1)){ + Object o =node.next.data; + node.next = node.next.next; + return o; + } + this.point = 0; + if(index==0){ + head = head.next; + Object o =head.data; + node = head; + return o; + } + + Object o = null; + while(index<=(this.point+1)){ + if(index==(this.point+1)){ + o =node.next.data; + node.next = node.next.next; + + } + point++; + node = node.next; + } + return o; + } + + public int size(){ + + return size; + } + + public void addFirst(Object o){ + add(0,o); + } + public void addLast(Object o){ + add(size,o); + } + public Object removeFirst(){ + if(head==null){ + return null; + } + remove(0); + return null; + } + public Object removeLast(){ + if(head==null){ + return null; + } + remove(size-1); + return null; + } + public Iterator iterator(){ + iterator = new LinkedListiterator(this); + return iterator; + } + + + private static class Node{ + private Object data; + private Node next; + + + } + + private void insertoflist(int index,Object o){ + + if(index>size||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + + if(head==null){ + head = new Node(); + head.data=o; + head.next=new Node(); + size++; + node = head; + this.point = 0; + return; + } + if(index==(this.point+1)){ + pointlast(index, o); + return; + } + //head不等于空,先从head顺序往下找 + this.point = 0; + if(index == this.point){ + Node next = head; + head = new Node(); + head.next = next; + head.data = o; + node = head;//当前节点为head + this.point = index; + size++; + return; + } + do{ + if(index==(this.point+1)){ + pointlast(index, o); + return; + } + node = node.next; + this.point++; + }while(index>(this.point+1)); + + } + + private void pointlast(int index, Object o) { + if(index==(this.point+1)){ + if(index==size){//index插入List结尾 + this.point = this.point+1; + node = node.next; + node.data=o; + node.next = new Node(); + size++; + return; + } + this.point = this.point+1; + Node next = node.next;//从上一个node获取下一个node + node.next = new Node();//上一个节点指向新建节点 + node = node.next;//获取新建节点 + node.data=o;//新建节点获取值 + node.next = next;//新建节点指向下一个节点 + size++; + return; + } + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java new file mode 100644 index 0000000000..c04de32a93 --- /dev/null +++ b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java @@ -0,0 +1,25 @@ +package com.skomefen.list; + +public class LinkedListiterator implements Iterator { + + private LinkedList link = null; + private int index = 0; + public LinkedListiterator(LinkedList link) { + this.link = link; + } + public boolean hasNext() { + if(link==null){ + return false; + } + if(index params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + + View view = Struts.runAction(actionName,params); + + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一�? + + + View view = Struts.runAction(actionName,params); + + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..66024b0ccf --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,65 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + private Connection conn; + private int startPos; + private int endPos; + private byte[] b = null; + private static Lock lock = new ReentrantLock(); + private static int index=0; + + static FileOutputStream file = null; + static{ + try { + file = new FileOutputStream(new File("e://readme.txt")); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + try { + this.b = conn.read(startPos, endPos); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new RuntimeException(); + }finally{ + conn.close(); + } + + } + public void run(){ + if(lock.tryLock()){ + if(index==startPos){ + try { + if (file!=null) { + file.write(b); + } + index=endPos+1; + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(); + } + + }else{ + lock.unlock(); + } + } + } +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..ed4a1cf9a1 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,89 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + if(length%3==0){ + for(int i=1;i<=3;i++){ + int startPos = length/3*i-1; + int endPos = length/3*(i-1); + new DownloadThread(conn, endPos, startPos).start(); + } + }else{ + for(int i=1;i<=2;i++){ + + int startPos = length/3*(i-1); + int endPos = length/3*i-1; + new DownloadThread(conn, startPos, endPos).start(); + } + int startPos = length/3*2; + new DownloadThread(conn, startPos, length).start(); + } + + listener.notifyFinished(); + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..ce99026d2b --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,58 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..3982b8e310 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java @@ -0,0 +1,24 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + * + */ + public void close(); +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..ae639d2651 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,143 @@ +package com.coderising.download.impl; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + private String url = null; + private InputStream in = null; + + + public ConnectionImpl(String url) { + this.url = url; + + + } + + public byte[] read(int startPos, int endPos) throws IOException { + + try { + if(url==null||url.trim()==""){ + return null; + } + + URL u = new URL(url); + in = u.openStream(); + + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if(in==null){ + return null; + } + byte[] read = insert(startPos, endPos); + + return read; + } + + private byte[] insert(int startPos, int endPos) throws IOException { + byte[] b = new byte[1024]; + int len = 0; + int index = 0; + byte[] read = new byte[endPos-startPos+1]; + + while((len=in.read(b))>0){ + if((index+1024)<=startPos){ + index+=1024; + continue; + } + + if(index<=startPos&&startPos<(index+1024)){ + + if(endPos<(index+1024)){ + for(int i=0,j=startPos-index;i0){ + count+=len; + } + Assert.assertEquals(count, conn.getContentLength()); + + } + + + @Test + public void testClose() { + conn.close(); + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java new file mode 100644 index 0000000000..589c1bf1d2 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java @@ -0,0 +1,31 @@ +package junit.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.impl.ConnectionImpl; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class ConnectionManagerImplTest { + + @Before + public void setUp() throws Exception { + } + + + @Test + public void testOpen() throws ConnectionException { + ConnectionManager cm = new ConnectionManagerImpl(); + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + Connection conn = cm.open(url); + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java new file mode 100644 index 0000000000..5ae230e97b --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java @@ -0,0 +1,77 @@ +package junit.test; + +import static org.junit.Assert.*; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; + + + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.DownloadThread; +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class DownloadThreadTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void testRun() throws ConnectionException, IOException { + ConnectionManager cm = new ConnectionManagerImpl(); + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + Connection conn = cm.open(url); + DownloadThread dt = new DownloadThread(conn, 0, conn.getContentLength()); + dt.start(); + + File file = new File("e://readme.txt"); + FileInputStream in = new FileInputStream(file); + byte[] b = new byte[10]; + int len = 0; + ArrayList a = new ArrayList(); + while((len=in.read(b))>0){ + a.add(b); + } + + int length = conn.getContentLength(); + if(length%3==0){ + for(int i=1;i<=3;i++){ + int startPos = length/3*i-1; + int endPos = length/3*(i-1); + new DownloadThread(conn, endPos, startPos).start(); + } + }else{ + for(int i=1;i<=2;i++){ + + int startPos = length/3*(i-1); + int endPos = length/3*i-1; + new DownloadThread(conn, startPos, endPos).start(); + } + int startPos = length/3*2; + new DownloadThread(conn, startPos, length).start(); + } + + file = new File("e://readme.txt"); + in = new FileInputStream(file); + b = new byte[10]; + len = 0; + ArrayList a1 = new ArrayList(); + while((len=in.read(b))>0){ + a1.add(b); + } + for(int i = 0;isize || index < 0||index == size) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + Object temp = elementData; + elementData=grow(elementData,1); // Increments modCount!! + System.arraycopy(temp, index, elementData, index + 1, + size - index); + elementData[index] = o; + } + + public Object get(int index){ + size(); + if (index > size || index < 0 ||index == size) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + return elementData[index]; + } + + public Object remove(int index){ + size(); + if (index > size || index < 0 ||index == size) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + Object tempData = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, + size - index); + return tempData; + } + + public int size(){ + for(int i=0;i= size) + throw new NoSuchElementException(); + Object[] elementData = ArrayList.this.elementData; + if (i >= elementData.length) + throw new ConcurrentModificationException(); + cursor = i + 1; + return elementData[lastRet = i]; + } + + +} + + + +} diff --git a/group23/1246614258/src/com/coding/datastructs/Iterator.java b/group23/1246614258/src/com/coding/datastructs/Iterator.java new file mode 100644 index 0000000000..56acec15a3 --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.datastructs; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/1246614258/src/com/coding/datastructs/LinkedList.java b/group23/1246614258/src/com/coding/datastructs/LinkedList.java new file mode 100644 index 0000000000..cd5de44121 --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/LinkedList.java @@ -0,0 +1,229 @@ +package com.coding.datastructs; + +public class LinkedList implements List{ + + private Node head; + private int size ; + + public LinkedList() { + size = 0; + head=new Node(); + } + + public void add(Object o) { + Node pnew = new Node(); + pnew.setData(o); + pnew.next = null; + if(null==head.getNext()){ + head.setNext(pnew); + return; + } + Node ptr = head.getNext(); + Node ptr1 = new Node(); + + while (ptr != null) { + ptr1 = ptr; + ptr = ptr.getNext(); + } + ptr1.next = pnew; + + } + + public void add(int index, Object o) { + size(); + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + Node ptr; + Node ptemp = new Node(); + ; + Node pnew;// ʵ½ڵ + ptr = head.getNext(); + int i = 0; + if (ptr == null && size == 0) { + System.out.println("ʧܣ"); + } + while (ptr != null) { + ptemp = ptr; + if (index == 0) { + pnew = new Node(); + pnew.setData(o); + pnew.setNext(ptr); + head.setNext(pnew); + break; + } + if (index == i && index > 0) { + ptemp = getNode(i-1); + pnew = new Node(); + pnew.setData(o); + pnew.setNext(ptr); + ptemp.setNext(pnew);// + System.out.println("" + o + "ɹ"); + break; + } + ptr = ptr.getNext(); + i++; + } + if (ptr == null && size > 0) { + pnew = new Node(); + pnew.setData(o); + pnew.setNext(null); + ptemp.setNext(pnew);// + System.out.println("" + o + "ɹ"); + } + + } + + public Object get(int index) { + size(); + if (index > size || index < 0 || index == size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + Node ptr = head.getNext(); + Object tempData = null; + int i = 0; + while (ptr != null) { + if (index == i) { + tempData = ptr.getData(); + } + ptr = ptr.getNext(); + i++; + } + + return tempData; + } + + public Node getNode(int index) { + size(); + if (index > size || index < 0 || index == size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + Node ptr = head.getNext(); + Node tempData = null; + int i = 0; + while (ptr != null) { + if (index == i) { + tempData = ptr; + } + ptr = ptr.getNext(); + i++; + } + + return tempData; + } + + public Object remove(int index) { + size(); + if(size()==0){ + throw new NullPointerException("listڲΪգɾ"); + } + if (index > size || index < 0 || index == size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + Node ptr = head.getNext(); + Node ptrNext = new Node(); + Object tempData = null; + int i = 0; + while (ptr != null) { + if (index == 0) { + ptrNext = ptr.getNext(); + head.setNext(ptrNext); + break; + } + if (index == i && index > 0) { + Node ptrprevious = getNode(i - 1); + tempData = ptr.getData(); + ptrprevious.setNext(ptr.getNext()); + break; + } + ptr = ptr.getNext(); + i++; + } + return tempData; + } + + public int size() { + int i = 0; + Node ptr = head.getNext(); + while (ptr != null) { + ptr = ptr.getNext(); + i++; + } + size = i; + return size; + } + + public void addFirst(Object o) { + add(0,o); + + } + + public void addLast(Object o) { + /*Node ptr = head.getNext(); + Node pnew = new Node(); + pnew.setData(o); + Node ptemp = new Node(); + if (ptr == null) { + head.setNext(pnew); + } else { + while (ptr != null) { + ptemp = ptr; + ptr = ptr.getNext(); + } + if (ptr == null) { + ptemp.setNext(pnew); + } + }*/ + add(size(),o); + + } + + public Object removeFirst() { + Node ptr = head.getNext(); + Object temp = null; + if (ptr == null) { + throw new NullPointerException("LinkedListݣܽɾ"); + } else { + temp = ptr.getData(); + remove(0); + } + + return temp; + } + + public Object removeLast() { + size(); + Node ptr = head.getNext(); + Object temp = null; + if (ptr == null) { + throw new NullPointerException("LinkedListݣܽɾ"); + } else { + temp = remove(size - 1); + } + + return temp; + } + + private static class Node { + Object data; + Node next; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public Node getNext() { + return next; + } + + public void setNext(Node next) { + this.next = next; + } + + } + +} diff --git a/group23/1246614258/src/com/coding/datastructs/List.java b/group23/1246614258/src/com/coding/datastructs/List.java new file mode 100644 index 0000000000..35ece31ca6 --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/List.java @@ -0,0 +1,9 @@ +package com.coding.datastructs; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/1246614258/src/com/coding/datastructs/MyIterator.java b/group23/1246614258/src/com/coding/datastructs/MyIterator.java new file mode 100644 index 0000000000..be827a7875 --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/MyIterator.java @@ -0,0 +1,35 @@ +package com.coding.datastructs; + +import java.util.Iterator; + +public class MyIterator { + public Iterator iterator(){ + return null; + } + private class Itera implements Iterator{ + int cursor; + int lastRet = -1; + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void remove() { + // TODO Auto-generated method stub + + } + + + + } + +} diff --git a/group23/1246614258/src/com/coding/datastructs/Queue.java b/group23/1246614258/src/com/coding/datastructs/Queue.java new file mode 100644 index 0000000000..4e36db418a --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/Queue.java @@ -0,0 +1,30 @@ +package com.coding.datastructs; + public class Queue{ + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + if (list.size()<=0) { + throw new NullPointerException("Queueݣܽɾ"); + } + Object o = list.get(0); + list.removeFirst(); + return o; + } + + public boolean isEmpty(){ + int count = size(); + if(count<0){ + return true; + } + return false; + } + + public int size(){ + return list.size(); + } + } + diff --git a/group23/1246614258/src/com/coding/datastructs/Stack.java b/group23/1246614258/src/com/coding/datastructs/Stack.java new file mode 100644 index 0000000000..269f3c900e --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/Stack.java @@ -0,0 +1,33 @@ +package com.coding.datastructs; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (elementData.size()<=0) { + throw new NullPointerException("Stackݣܽɾ"); + } + Object data = elementData.get(elementData.size()-1); + elementData.remove(size()-1); + return data; + } + + public Object peek(){ + Object data = elementData.get(elementData.size()-1); + return data; + } + public boolean isEmpty(){ + if(elementData.size()>0){ + return false; + }else{ + return false; + } + } + public int size(){ + return elementData.size(); + } +} diff --git a/group23/1246614258/src/com/coding/test/ArrayListTest.java b/group23/1246614258/src/com/coding/test/ArrayListTest.java new file mode 100644 index 0000000000..76ba571c78 --- /dev/null +++ b/group23/1246614258/src/com/coding/test/ArrayListTest.java @@ -0,0 +1,32 @@ +package com.coding.test; +import com.coding.datastructs.ArrayList; +import com.coding.datastructs.Iterator; + + +public class ArrayListTest { + + /** + *

Description:

+ * @param args + * @author:Wilson huang + * @date 2017-3-1212:08:10 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + ArrayList aa = new ArrayList(); + aa.add("aa"); + aa.add("bb"); + aa.add("cc"); + //aa.remove(3); + aa.add(2, "44"); + for(int i=0;iDescription:

+ * @param args + * @author:Wilson huang + * @date 2017-3-121:45:58 + */ + + public static void main(String[] args) { + // TODO Auto-generated method stub + LinkedList list = new LinkedList(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + list.removeLast(); + for(int i=0;iDescription:

+ * @param args + * @author:Wilson huang + * @date 2017-3-122:42:15 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + Queue q = new Queue(); + q.enQueue("a"); + q.enQueue("b"); + System.out.println(q.deQueue()); + + } + +} diff --git a/group23/1246614258/src/com/coding/test/StackTest.java b/group23/1246614258/src/com/coding/test/StackTest.java new file mode 100644 index 0000000000..41f2a15b5b --- /dev/null +++ b/group23/1246614258/src/com/coding/test/StackTest.java @@ -0,0 +1,25 @@ +package com.coding.test; +import com.coding.datastructs.Stack; + + +public class StackTest { + + /** + *

Description:

+ * @param args + * @author:Wilson huang + * @date 2017-3-122:34:15 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + Stack a = new Stack(); + a.push("a"); + a.push("b"); + a.push("c"); + System.out.println(a.isEmpty()); + System.out.println(a.peek()); + System.out.println(a.pop()); + + } + +} diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" new file mode 100644 index 0000000000..ff773dffcc --- /dev/null +++ "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" @@ -0,0 +1,141 @@ +/** + * + */ +package com.coding.datastructs; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + + +public class ArrayUtil { + + + public void reverseArray(int[] origin){ + for (int i=0; i temp = new HashSet(); + for(Integer i : newArray) + temp.add(i); + for (int i = 0; i < temp.size(); i++) { + newArray[i]=(int)temp.toArray()[i]; + } + Arrays.sort(Arrays.copyOfRange(newArray, 0, temp.size())); + return Arrays.copyOfRange(newArray, 0, temp.size()); + } + + public int[] grow(int [] oldArray, int size){ + int[] target = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, target, 0, oldArray.length); + return target; + } + + + public int[] fibonacci(int max){ + ArrayList list = new ArrayList(); + list.add(1); + list.add(1); + if(max<=1){ + return new int[0]; + } + for (int i = 2; i < max; i++) { + int a = list.get(i-1)+list.get(i-2); + if(a list = new ArrayList(); + int j=1; + for(int i=2;i<100;i++){ + j=i; + while(j>0){ + if(i%j==0&&i!=j&&j!=1){ + break; + }else{ + j--; + } + } + if(j==0){ + list.add(i); + } + } + int[] newArray = new int[list.size()]; + for(int i=0;i list = new ArrayList(); + for(int i = 1; i < max; i++) + { + int sum = 0; + for(int j = 1; j < i; j++) + { + if(i % j == 0) + { + sum = sum + j; + } + } + if(sum == i) + { + list.add(i); + } + } + int[] newArray = new int[list.size()]; + for(int i=0;i parameters) { + + + View view = new View(); + Map> array = new HashMap>(); + Map params = new HashMap(); + Map classData = new HashMap(); + try { + analysisXml(classData,array); + Map jspData = array.get(actionName); + String s = "ԲݹactionNameûжӦclass࣬Ҫ´"; + if (!classData.containsKey(actionName)) { + throw new ClassNotFoundException(s); + } + + Class class1 = Class.forName(classData.get(actionName)); + LoginAction login = (LoginAction) class1.newInstance(); + for (String ss : parameters.keySet()) { + Method[] methos1 = class1.getMethods(); + for (int i = 0; i < methos1.length; i++) { + if (("set" + ss.substring(0, 1).toUpperCase() + ss + .substring(1)).equals(methos1[i].getName())) { + methos1[i].invoke(login, parameters.get(ss)); + break; + + } + } + } + + Method method1 = class1.getMethod("execute"); + String result = (String) method1.invoke(login); + if(null!=result){ + view.setJsp(jspData.get(result)); + } + Method[] methos2 = class1.getMethods(); + for (int i = 0; i < methos2.length; i++) { + if(methos2[i].getName().substring(0, 3).equals("get")){ + Object value1 = (Object) (methos2[i].invoke(login)); + String name1 = methos2[i].getName(); + params.put(name1.substring(3, 4).toLowerCase()+name1.substring(4), value1); + } + } + view.setParameters(params); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return view; + } + + + public static void analysisXml(Map xmlData,Map> array) { + try { + + String dirpath = System.getProperty("user.dir"); + String xmlFile = dirpath + "/WebContent/WEB-INF/etc/struts.xml"; + SAXBuilder builder = new SAXBuilder(); + Document doc = builder.build(new File(xmlFile)); + Element xRoot = doc.getRootElement(); + List actions = getChildren(xRoot, "action"); + for (int i = 0; i < actions.size(); i++) { + Element e = (Element) actions.get(i); + String actionName1 = getAttributeValue(e, "name"); + String className = getAttributeValue(e, "class"); + xmlData.put(actionName1, className); + List results = getChildren(e, "result"); + Map jspData = new HashMap(); + for (int j = 0; j < results.size(); j++) { + Element result = (Element) results.get(j); + String jspUrl = getValue(result); + String resultName = getAttributeValue(result, "name"); + jspData.put(resultName, jspUrl); + array.put(actionName1, jspData); + } + } + + // /StrutsDemo/WebContent/WEB-INF/etc/struts.xml + } catch (Exception e) { + e.printStackTrace(); + } + } + + + public static Element getChild(Element element, String sonMark) { + return element == null ? null : element.getChild(sonMark); + } + + + public static List getChildren(Element element, String sonMark) { + return element == null ? null : element.getChildren(sonMark); + } + + + public static String getValue(Element element) { + return element == null ? "" : element.getValue(); + } + + + public static String getAttributeValue(Element element, String attribute) { + return element == null ? null : element.getAttributeValue(attribute); + } + +} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" new file mode 100644 index 0000000000..52f08f3652 --- /dev/null +++ "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" new file mode 100644 index 0000000000..d7bcd36d42 --- /dev/null +++ "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" @@ -0,0 +1,94 @@ +/** + * + */ +package com.coderising.litestruts; + +import java.io.BufferedReader; +import java.io.File; +import java.io.StringReader; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.input.SAXBuilder; + +/** + * Title: + * Description: + * @author HuangLiang + * @201731710:55:39 + * + */ +public class Test { + + /**Description: + * @param args + * @author HuangLiang 2017317 10:55:39 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + String name1 = "getName"; + System.out.println(name1.substring(3, 4).toLowerCase()+name1.substring(4)); + try { + Class class1 = Class.forName("com.coderising.litestruts.LoginAction"); + Method[] methos1 = class1.getMethods(); + for(int i=0;i para[] = methos1[i].getParameterTypes(); + throw new ClassNotFoundException(); + } + System.out.println(""); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + /** + * ȡXMLӱǩ + * + * @param element + * ǩڵ + * @param sonMark + * ӱǩ + * @return + */ + public static Element getChild(Element element, String sonMark) { + return element == null ? null : element.getChild(sonMark); + } + + /** + * ȡXMLӱǩ + * + * @param element + * ǩڵ + * @param sonMark + * ӱǩ + * @return + */ + public static List getChildren(Element element, String sonMark) { + return element == null ? null : element.getChildren(sonMark); + } + + /** + * s ȡXMLǩֵ + * + * @param element + * @return + */ + public static String getValue(Element element) { + return element == null ? "" : element.getValue(); + } + /** + * s ȡXMLֵ + * + * @param element + * @return + */ + public static String getAttributeValue(Element element, String attribute) { + return element == null ? null : element.getAttributeValue(attribute); + } + +} diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" new file mode 100644 index 0000000000..f68a8c438b --- /dev/null +++ "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group23/565832157/src/com/coderising/array/ArrayUtil.java b/group23/565832157/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..e5ddb476a6 --- /dev/null +++ b/group23/565832157/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/group23/565832157/src/com/coderising/download/DownloadThread.java b/group23/565832157/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} diff --git a/group23/565832157/src/com/coderising/download/FileDownloader.java b/group23/565832157/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/group23/565832157/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,73 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/565832157/src/com/coderising/download/FileDownloaderTest.java b/group23/565832157/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/565832157/src/com/coderising/download/api/Connection.java b/group23/565832157/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/565832157/src/com/coderising/download/api/ConnectionException.java b/group23/565832157/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group23/565832157/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/565832157/src/com/coderising/download/api/ConnectionManager.java b/group23/565832157/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/565832157/src/com/coderising/download/api/DownloadListener.java b/group23/565832157/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java b/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.coderising.download.impl; + +import java.io.IOException; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coderising.download.impl; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} diff --git a/group23/565832157/src/com/coderising/litestruts/LoginAction.java b/group23/565832157/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group23/565832157/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group23/565832157/src/com/coderising/litestruts/Struts.java b/group23/565832157/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..6df190d484 --- /dev/null +++ b/group23/565832157/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,37 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Method; +import java.util.Map; + + + +public class Struts { + + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + + return null; + } + +} diff --git a/group23/565832157/src/com/coderising/litestruts/StrutsTest.java b/group23/565832157/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group23/565832157/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/565832157/src/com/coderising/litestruts/View.java b/group23/565832157/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/565832157/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/565832157/src/com/coding/basic/ArrayList.java b/group23/565832157/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/ArrayList.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group23/565832157/src/com/coding/basic/BinaryTreeNode.java b/group23/565832157/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/565832157/src/com/coding/basic/Iterator.java b/group23/565832157/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/565832157/src/com/coding/basic/LinkedList.java b/group23/565832157/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..09fe0a8ff3 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/LinkedList.java @@ -0,0 +1,122 @@ +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/565832157/src/com/coding/basic/List.java b/group23/565832157/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/565832157/src/com/coding/basic/Queue.java b/group23/565832157/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group23/565832157/src/com/coding/basic/Stack.java b/group23/565832157/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group23/565832157/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group23/601689050/ArrayList.java b/group23/601689050/ArrayList.java new file mode 100644 index 0000000000..5a4169dc9b --- /dev/null +++ b/group23/601689050/ArrayList.java @@ -0,0 +1,58 @@ +package com.bjsxd.test; + +public class ArrayList implements List { + private Object[] elementData = new Object[100]; + private int size = 0; + Object[] temp = null; + + public void add(Object o) { + if (size < elementData.length) { + size++; + Object[] target = new Object[elementData.length + size]; + System.arraycopy(elementData, 0, target, 0, elementData.length); + elementData[size] = o; + } + } + + public void add(int index, Object o) { + if (index < 0 || o == null) { + throw new IllegalArgumentException("��Ӷ������"); + } else if (index <= elementData.length) { + add(o); + } else if (index > elementData.length) { + throw new IllegalArgumentException("��Ӷ���Խ��"); + } + + if (size <= elementData.length) { + this.size++; + } + Object[] target = new Object[this.size]; + System.arraycopy(elementData, 0, target, 0, index); + target[index] = o; + System.arraycopy(elementData, index, target, index + 1, elementData.length - index); + } + + public Object get(int index) { + if (index < 0 || index >= elementData.length) { + return false; + } else { + return elementData[index]; + } + } + + public Object remove(int index) { + if (index < 0 || index >= elementData.length) { + throw new IllegalArgumentException("ɾ�����󲻴���"); + } else { + for (int i = index; i < elementData.length; i++) { + elementData[i] = elementData[i + 1]; + } + return elementData[index]; + } + } + + public int size() { + return this.size; + } + +} diff --git a/group23/601689050/BinaryTreeNode.java b/group23/601689050/BinaryTreeNode.java new file mode 100644 index 0000000000..3687306f5e --- /dev/null +++ b/group23/601689050/BinaryTreeNode.java @@ -0,0 +1,50 @@ +package com.bjsxd.test; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode root; + + public BinaryTreeNode(BinaryTreeNode root){ + this.root = root; + + } + + public BinaryTreeNode(BinaryTreeNode left,BinaryTreeNode right,Object data){ + this.left = left; + this.right = right; + this.data = data; + } + + public void buildTree(){ + + } + + public BinaryTreeNode(Object data){ + this(null,null,data); + } + public Object getData(){ + return data; + } + public void setData(Object data){ + this.data = data; + } + public BinaryTreeNode getLeft(){ + return left; + } + public void setLeft(BinaryTreeNode left){ + this.left = left; + + } + public BinaryTreeNode getRight(){ + return right; + } + public void setRight(BinaryTreeNode right){ + this.right = right; + } + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/601689050/Iterator.java b/group23/601689050/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/601689050/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/601689050/LinkedList.java b/group23/601689050/LinkedList.java new file mode 100644 index 0000000000..ee173bec67 --- /dev/null +++ b/group23/601689050/LinkedList.java @@ -0,0 +1,117 @@ +package com.bjsxd.test; + +public class LinkedList implements List{ + private static class Node{ + Object data; + Node next; + } + private Node head; + private Node last; + public void add (Object o){ + if (head == null){ + head = new Node(); + head.data = o; + head.next = null; + }else{ + Node MyNode = new Node(); + MyNode = head; + while (MyNode.next != null){ + MyNode = MyNode.next; + } + Node AddNode = new Node(); + MyNode.next = AddNode; + AddNode.data = o; + } + } + public void add(int index,Object o){ + if(index<0 || o ==null){ + throw new IllegalArgumentException("ӶλóҲΪ"); + }else if (index == 0 && head == null){ + head = new Node(); + head.data = o; + head.next = null; + }else if (index > 0 && head == null){ + throw new IllegalArgumentException("Ӷλó"); + }else{ + Node SrcNode = new Node(); + Node AddNode = new Node(); + Node SrcNode2 = new Node(); + SrcNode = head; + for(int i=0;i<=index;i++){ + SrcNode = SrcNode.next; + } + AddNode.next = SrcNode; + AddNode.data = o; + for (int i=0;i size){ + throw new IllegalArgumentException("ɾλó"); + }else{ + for (int i=0;i front){ + return rear - front; + }else + return Q.length-1; + } + +} diff --git a/group23/601689050/Stack.java b/group23/601689050/Stack.java new file mode 100644 index 0000000000..106d2ecc7d --- /dev/null +++ b/group23/601689050/Stack.java @@ -0,0 +1,39 @@ +package com.bjsxd.test; + +public class Stack { + private int top = -1; + private Object[] elements; + private int size = 0; + public Stack(){ + elements = new Object[100]; + } + public void push (Object o){ + elements[this.size] = o; + this.size++; + } + public Object pop(){ + if (this.size != 0){ + Object temp = elements[size-1]; + elements[size-1]=0; + size--; + return temp; + }else{ + System.out.println("ջ"); + return 0; + } + } + public Object peek(){ + if(!this.isEmpty()){ + Object temp = elements[this.size-1]; + elements[this.size-1] = 0; + this.size--; + return temp; + }else{ + System.out.println("ջ"); + return 0; + } + } + public boolean isEmpty(){ + return this.size == 0; + } +} diff --git a/group23/609041842/src/code/ArrayList.java b/group23/609041842/src/code/ArrayList.java new file mode 100644 index 0000000000..8acbfe7de5 --- /dev/null +++ b/group23/609041842/src/code/ArrayList.java @@ -0,0 +1,49 @@ +package code; + +import java.util.Arrays; + +public class ArrayList { + + private Object[] obj = new Object[0]; + + public void add(Object o) { + Object[] tar = new Object[obj.length + 1]; + System.arraycopy(obj, 0, tar, 0, obj.length); + tar[tar.length - 1] = o; + obj = tar; + System.out.println(Arrays.toString(obj)); + } + + public void add(int index, Object o) { + Object[] tar = new Object[obj.length + 1]; + System.arraycopy(obj, 0, tar, 0, index); + tar[index] = o; + System.arraycopy(obj, index, tar, index + 1, obj.length - index); + obj = tar; + } + + public Object get(int index) { + return obj[index]; + } + + public int size(){ + return obj.length; + } + + public Object remove(int index){ + Object[] tar = new Object[obj.length-1]; + System.arraycopy(obj, 0, tar, 0, index); + System.arraycopy(obj, index+1, tar, index, obj.length-index-1); + Object o = obj[index]; + obj = tar; + return o;//رɾԪ + } + public static void main(String[] args) { + ArrayList al = new ArrayList(); + al.add("hello"); + al.add("java"); + al.add(2, "addm"); + System.out.println(al.remove(1)); + } + +} diff --git a/group23/609041842/src/code/LinkedList.java b/group23/609041842/src/code/LinkedList.java new file mode 100644 index 0000000000..e42138022e --- /dev/null +++ b/group23/609041842/src/code/LinkedList.java @@ -0,0 +1,87 @@ +package code; + +public class LinkedList { + private static Node head; + private Node last; + public int size; + + public void add(Object o) { + Node l = last; + Node newNode = new Node(l, o, null); + last = newNode; + if (head == null) { + head = newNode; + size = 1; + } else { + l.next = newNode; + size++; + } + } + + public void add(int index, Object o) { + Node n = node(index); + System.out.println(n.data); + Node pred = n.prev; + Node newNode = new Node(pred, o, n); + if (pred == null) { + head = newNode; + } else { + pred.next = newNode; + } + size++; + } + + + public Node get(int index){ + return node(index); + } + public Node node(int index) { + Node n = head; + for (int i = 0; i < index; i++) { + n = n.next; + } + return n; + } + + public Node remove(int index){ + Node del = node(index); + Node after = del.next; + Node before = del.prev; + before.next = after; + after.prev = before; + size--; + return del; + } + private static class Node { + Node next; + Object data; + Node prev; + + private Node(Node prev, Object data, Node next) { + this.data = data; + this.next = next; + this.prev = prev; + } + } + + public static void main(String[] arg) { + LinkedList ll = new LinkedList(); + ll.add("hello"); + ll.add("java"); + ll.add("jvm"); + ll.add("jvmd"); + // System.out.println(ll.get(2)); +// ll.add(1, "ds"); + System.out.println(ll.get(0).data); + System.out.println(ll.get(1).data); + System.out.println(ll.get(2).data); + System.out.println(ll.get(3).data); + System.out.println(ll.size); + System.out.println(ll.remove(1).data); + System.out.println(ll.get(0).data); + System.out.println(ll.get(1).data); + System.out.println(ll.get(2).data); + System.out.println(ll.size); + } + +} diff --git a/group23/609041842/src/code/Queue.java b/group23/609041842/src/code/Queue.java new file mode 100644 index 0000000000..d4f70c2125 --- /dev/null +++ b/group23/609041842/src/code/Queue.java @@ -0,0 +1,17 @@ +package code; + +public class Queue { + + private LinkedList lk = new LinkedList(); + public void enQueue(Object o){ + lk.add(o); + } + public void deQueue(){ + lk.remove(lk.size-1); + } + public boolean isEmpty(){ + if(lk.size == 0) + return true; + return false; + } +} diff --git a/group23/609041842/src/code/Stack.java b/group23/609041842/src/code/Stack.java new file mode 100644 index 0000000000..7226d4d403 --- /dev/null +++ b/group23/609041842/src/code/Stack.java @@ -0,0 +1,30 @@ +package code; + +public class Stack { + + private ArrayList array = new ArrayList(); + + public void push(Object o){ + array.add(o); + } + public Object pop(){ + return array.remove(array.size()-1); + } + + public boolean isEmpty(){ + if(array.size()<=0) + return true; + return false; + } + + public int size(){ + return array.size(); + } + public static void main(String[] args) { + Stack sc = new Stack(); + sc.push("hello world"); + sc.push("java"); + sc.push("jvm"); + } + +} diff --git a/group23/609041842/src/com/homework01/ArrayList.java b/group23/609041842/src/com/homework01/ArrayList.java new file mode 100644 index 0000000000..1702690ae7 --- /dev/null +++ b/group23/609041842/src/com/homework01/ArrayList.java @@ -0,0 +1,49 @@ +package com.homework01; + +import java.util.Arrays; + +public class ArrayList { + + private Object[] obj = new Object[0]; + + public void add(Object o) { + Object[] tar = new Object[obj.length + 1]; + System.arraycopy(obj, 0, tar, 0, obj.length); + tar[tar.length - 1] = o; + obj = tar; + System.out.println(Arrays.toString(obj)); + } + + public void add(int index, Object o) { + Object[] tar = new Object[obj.length + 1]; + System.arraycopy(obj, 0, tar, 0, index); + tar[index] = o; + System.arraycopy(obj, index, tar, index + 1, obj.length - index); + obj = tar; + } + + public Object get(int index) { + return obj[index]; + } + + public int size(){ + return obj.length; + } + + public Object remove(int index){ + Object[] tar = new Object[obj.length-1]; + System.arraycopy(obj, 0, tar, 0, index); + System.arraycopy(obj, index+1, tar, index, obj.length-index-1); + Object o = obj[index]; + obj = tar; + return o;//���ر�ɾԪ�� + } + public static void main(String[] args) { + ArrayList al = new ArrayList(); + al.add("hello"); + al.add("java"); + al.add(2, "addm"); + System.out.println(al.remove(1)); + } + +} diff --git a/group23/609041842/src/com/homework01/LinkedList.java b/group23/609041842/src/com/homework01/LinkedList.java new file mode 100644 index 0000000000..cc72fc2e4c --- /dev/null +++ b/group23/609041842/src/com/homework01/LinkedList.java @@ -0,0 +1,87 @@ +package com.homework01; + +public class LinkedList { + private static Node head; + private Node last; + public int size; + + public void add(Object o) { + Node l = last; + Node newNode = new Node(l, o, null); + last = newNode; + if (head == null) { + head = newNode; + size = 1; + } else { + l.next = newNode; + size++; + } + } + + public void add(int index, Object o) { + Node n = node(index); + System.out.println(n.data); + Node pred = n.prev; + Node newNode = new Node(pred, o, n); + if (pred == null) { + head = newNode; + } else { + pred.next = newNode; + } + size++; + } + + + public Node get(int index){ + return node(index); + } + public Node node(int index) { + Node n = head; + for (int i = 0; i < index; i++) { + n = n.next; + } + return n; + } + + public Node remove(int index){ + Node del = node(index); + Node after = del.next; + Node before = del.prev; + before.next = after; + after.prev = before; + size--; + return del; + } + private static class Node { + Node next; + Object data; + Node prev; + + private Node(Node prev, Object data, Node next) { + this.data = data; + this.next = next; + this.prev = prev; + } + } + + public static void main(String[] arg) { + LinkedList ll = new LinkedList(); + ll.add("hello"); + ll.add("java"); + ll.add("jvm"); + ll.add("jvmd"); + // System.out.println(ll.get(2)); +// ll.add(1, "ds"); + System.out.println(ll.get(0).data); + System.out.println(ll.get(1).data); + System.out.println(ll.get(2).data); + System.out.println(ll.get(3).data); + System.out.println(ll.size); + System.out.println(ll.remove(1).data); + System.out.println(ll.get(0).data); + System.out.println(ll.get(1).data); + System.out.println(ll.get(2).data); + System.out.println(ll.size); + } + +} diff --git a/group23/609041842/src/com/homework01/Queue.java b/group23/609041842/src/com/homework01/Queue.java new file mode 100644 index 0000000000..db8fb359b5 --- /dev/null +++ b/group23/609041842/src/com/homework01/Queue.java @@ -0,0 +1,17 @@ +package com.homework01; + +public class Queue { + + private LinkedList lk = new LinkedList(); + public void enQueue(Object o){ + lk.add(o); + } + public void deQueue(){ + lk.remove(lk.size-1); + } + public boolean isEmpty(){ + if(lk.size == 0) + return true; + return false; + } +} diff --git a/group23/609041842/src/com/homework01/Stack.java b/group23/609041842/src/com/homework01/Stack.java new file mode 100644 index 0000000000..ee5d71d830 --- /dev/null +++ b/group23/609041842/src/com/homework01/Stack.java @@ -0,0 +1,30 @@ +package com.homework01; + +public class Stack { + + private ArrayList array = new ArrayList(); + + public void push(Object o){ + array.add(o); + } + public Object pop(){ + return array.remove(array.size()-1); + } + + public boolean isEmpty(){ + if(array.size()<=0) + return true; + return false; + } + + public int size(){ + return array.size(); + } + public static void main(String[] args) { + Stack sc = new Stack(); + sc.push("hello world"); + sc.push("java"); + sc.push("jvm"); + } + +} diff --git a/group23/609041842/src/test.java b/group23/609041842/src/test.java new file mode 100644 index 0000000000..931a307711 --- /dev/null +++ b/group23/609041842/src/test.java @@ -0,0 +1,9 @@ +import org.junit.Test; + +public class test { + + @Test + public void test(){ + System.out.println("Heool"); + } +} diff --git a/group23/632678665/com/basic/datastructure/ArrayList.java b/group23/632678665/com/basic/datastructure/ArrayList.java new file mode 100644 index 0000000000..35fb185737 --- /dev/null +++ b/group23/632678665/com/basic/datastructure/ArrayList.java @@ -0,0 +1,64 @@ +package com.basic.datastructure; + +import java.util.Arrays; + +import org.junit.Test; + +public class ArrayList implements List{ + private Object [] array =new Object [15]; + private int size=0; + private int aindex=0; + @Override + public void add(Object o) { + if(aindex>(int)(array.length/3*2)){ + array=autoGrew(array); + } + array[aindex]=o; + size++; + aindex++; + } + + @Override + public void add(int index, Object o) { + if(index>=array.length){ + throw new IndexOutOfBoundsException(); + } + array[index]=o; + size++; + aindex=index; + } + + @Override + public Object get(int index) { + if(index>=array.length){ + throw new IndexOutOfBoundsException(); + } + return array[index]; + } + + @Override + public Object remove(int index) { + if(index>=array.length){ + throw new IndexOutOfBoundsException(); + } + Object o=array[index]; + for(int i=index;iarray=new ArrayList (); + int from; + int to; + for(int i=0;i list=new ArrayList(); + for(int i=0;i set=new HashSet(); + set.addAll(list); + Object[] array=set.toArray(); + int [] arrayInt=new int [array.length]; + for(int i=0;ilist=new ArrayList(); + list.add(front); + list.add(behind); + while(true){ + result=front+behind; + if(max list=new ArrayList(); + int num=3; + list.add(2); + boolean flag=true; + while(true){ + flag=true; + for(int i=2;i list=new ArrayList(); + Set temp=new HashSet(); + int num=1; + int result=0; + while(true){ + for(int i=1;imax){ + break; + } + if(num==result){ + list.add(num); + } + temp.clear(); + result=0; + num++; + } + int [] array=new int [list.size()]; + for(int i=0;i list=new ArrayList(); + for(int i=0;i 0 ) + System.arraycopy(elementData, index+1, elementData, index,moveStep); + elementData[--size] = null; // clear to let GC do its work + + return oldValue; + + } + + @Override + public int size() { + // TODO Auto-generated method stub + return this.size; + } + + //Get Iterator + public Iterator iterator() { + return new ArrayListIterator(); + } + + /******* Iterator *******/ + private class ArrayListIterator implements Iterator{ + + private int currentIndex = 0; + + @Override + public boolean hasNext() { + return currentIndex < size(); + } + + @Override + public Object next() { + rangeCheckExist(currentIndex); + + return elementData[currentIndex++]; + } + } + + + /*******Inner function*******/ + //Increase arraylist size + private void adjustCapacity(){ + //array length can not satisfy data size; + if ( this.array_len < size() + 1 ) { + this.array_len *= 2; + this.elementData = Arrays.copyOf(elementData, array_len); + } else { + return ; + } + } + + private void rangeCheckForAdd(int index) { + //Add operation is allow to add value in [ size() ] even if [ size() ] has not data + if ( index > size() || index < 0 ) + throw new IndexOutOfBoundsException("Invalid Adding Index:"+index); + } + private void rangeCheckExist(int index) { + if ( index >= size() || index < 0 ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java b/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java new file mode 100644 index 0000000000..8e3178b50b --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java @@ -0,0 +1,101 @@ +package com.danny.hw1; + +import java.util.Map; +import java.util.TreeMap; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode insert(Object o){ + if ( this.data == null && left == null && right == null ) { + this.data = o; + return this; + } else { + BinaryTreeNode temp = findNode(this, o); + + BinaryTreeNode newNode = new BinaryTreeNode(); + newNode.data = o; + //assert more than one null node in the temp(left,right,or both); + if ( temp.compareTo(o) >= 0 ) { + temp.left = newNode; + } else { + temp.right = newNode; + } + return newNode; + } + } + + public BinaryTreeNode() { + // TODO Auto-generated constructor stub + data=null; + left =null; + right = null; + + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + private int compareTo(Object o){ + // o1 > o2 == 1; o1 = o2 == 0 ; o1 < o2 == -1 + //假设这个比较现在只用在数字上 + return Integer.parseInt(this.data.toString()) - Integer.parseInt(o.toString()); + } + + private static BinaryTreeNode findNode(BinaryTreeNode root,Object o){ + if ( root.left == null && root.right == null || + ( root.compareTo(o) < 0 && root.right == null) || + ( root.compareTo(o) >= 0 && root.left == null) ){ + return root; + } else if ( root.compareTo(o) >= 0 ) { + //root data is bigger than object + return findNode(root.left, o); + } else { + return findNode(root.right, o); + } +// else if(root.compareTo(o) < 0 ){ +// return findNode(root.right, o); +// } +// + } + + //For Test value + private Map teMap = new TreeMap<>(); + public void printWholeTree(BinaryTreeNode root,int layer){ + if(root == null) { + return ; + } + teMap.put(root.data,layer); + + layer++; + printWholeTree(root.left,layer); + printWholeTree(root.right,layer); + + } + + public Map getTeMap() { + return teMap; + } + + public void setTeMap(Map teMap) { + this.teMap = teMap; + } +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java new file mode 100644 index 0000000000..b1ff654263 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java @@ -0,0 +1,6 @@ +package com.danny.hw1; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java b/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java new file mode 100644 index 0000000000..64c9b9bbca --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java @@ -0,0 +1,296 @@ +package com.danny.hw1; + +public class LinkedList implements List{ + + private Node Head = null; + private Node Tail = null; + private int size = 0; + + @Override + public void add(Object o) { + // TODO Auto-generated method stub + addLastNode(o); + } + + @Override + public void add(int index, Object o) { + // TODO Auto-generated method stub + checkPositionIndex(index); + + if ( index == size() ){ + addLastNode(o); + } else { + addBeforeNode(index,o); + } + } + + @Override + public Object get(int index) { + // TODO Auto-generated method stub + checkElementIndex(index); + + Node findGetNode = findIndexNode(index); + return findGetNode.data; + } + + @Override + public Object remove(int index) { + // TODO Auto-generated method stub + checkElementIndex(index); + Node deleteNode = null; + + //delete all node + if ( size() == 1 ) { + deleteNode = this.Head; + this.Head = null; + this.Tail = null; + } else if ( index == 0 ) { + //Remove Head + deleteNode = this.Head; + this.Head = this.Head.next; + } else if ( index == size() - 1) { + //Remove Tail + deleteNode = this.Tail; + Node findDeleteNode = findIndexNode(index - 1); + findDeleteNode.next = null; + this.Tail = findDeleteNode; + } else { + //Remove Mid + Node findDeleteNode = findIndexNode(index - 1); + deleteNode = findDeleteNode.next; + findDeleteNode.next = findDeleteNode.next.next; + } + this.size--; + return deleteNode.data; + } + + @Override + public int size() { + // TODO Auto-generated method stub + return this.size; + } + + @Override + public Iterator iterator(){ + return new LinkedListIterator(); + } + + /************Other function (without Interface function)**************/ + + public void addFirst(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = this.Head; + this.Head = newNode; + } + + public Object removeFirst(){ + checkElementIndex(0); + + Node deleteNode = this.Head; + this.Head = this.Head.next; + + this.size--; + return deleteNode.data; + } + + public Object removeLast(){ + checkElementIndex(size() - 1); + + Node deleteNode = this.Tail; + if ( this.Head == this.Tail ) { + this.Head = this.Tail = null; + } else { + this.Tail = findIndexNode(size() - 2); + } + this.size--; + return deleteNode.data; + + } + /************Iterator**************/ + private class LinkedListIterator implements Iterator{ + private Node currentNode; + private int currentIndex; + + public LinkedListIterator() { + // TODO Auto-generated constructor stub + this.currentIndex = 0; + this.currentNode = new Node(); + } + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return currentIndex < size(); + } + + @Override + public Object next() { + // TODO Auto-generated method stub + checkElementIndex(currentIndex); + if ( currentNode.data == null ) { + this.currentNode = findIndexNode(currentIndex); + } + Object value = currentNode.data; + currentNode = currentNode.next; + currentIndex++; + return value; + } + } + + /************Node class for supporting LinkedList**************/ + private static class Node{ + Object data ; + Node next ; + public Node() { + // TODO Auto-generated constructor stub + data = null; + next = null; + } + } + + /************Inner function **************/ + private void checkPositionIndex(int index){ + if ( !( index >= 0 && index <= size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + private void checkElementIndex(int index){ + if ( !( index >= 0 && index < size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + private void addLastNode(Object o){ + Node newNode = new Node(); + newNode.data = o; + + if ( this.Head == null ) { + this.Head = newNode; + this.Tail = newNode; + } else { + if(this.Head == this.Tail ){ + this.Tail = newNode; + this.Head.next = this.Tail; + } + else{ + //Tail and Head are different Object, + this.Tail.next = newNode; + this.Tail = newNode; + } + } + this.size++; + } + + private void addBeforeNode(int index,Object o){ + Node newNode = new Node(); + Node beforeInserNode = this.Head; + newNode.data = o; + + // if index is in Head + if ( index == 0 ) { + newNode.next = this.Head; + this.Head = newNode; + } else { + for (int i=0; i7->10 , 逆置后变为 10->7->3 +// */ +//public void reverse(){ +// +//} +// +///** +// * 删除一个单链表的前半部分 +// * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 +// * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 +// +// */ +//public void removeFirstHalf(){ +// +//} +// +///** +// * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 +// * @param i +// * @param length +// */ +//public void remove(int i, int length){ +// +//} +///** +// * 假定当前链表和list均包含已升序排列的整数 +// * 从当前链表中取出那些list所指定的元素 +// * 例如当前链表 = 11->101->201->301->401->501->601->701 +// * listB = 1->3->4->6 +// * 返回的结果应该是[101,301,401,601] +// * @param list +// */ +//public static int[] getElements(LinkedList list){ +// return null; +//} +// +///** +// * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 +// * 从当前链表中中删除在list中出现的元素 +// +// * @param list +// */ +// +//public void subtract(LinkedList list){ +// +//} +// +///** +// * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 +// * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) +// */ +//public void removeDuplicateValues(){ +// +//} +// +///** +// * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 +// * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) +// * @param min +// * @param max +// */ +//public void removeRange(int min, int max){ +// +//} +// +///** +// * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) +// * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 +// * @param list +// */ +//public LinkedList intersection( LinkedList list){ +// return null; +//} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/List.java b/group23/729693763/First_Homework1/src/com/danny/hw1/List.java new file mode 100644 index 0000000000..e71a86c78d --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/List.java @@ -0,0 +1,10 @@ +package com.danny.hw1; + +public interface List { + void add(Object o); + void add(int index,Object o); + Object get(int index); + Object remove(int index); + int size(); + Iterator iterator(); +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java new file mode 100644 index 0000000000..58f957dd31 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java @@ -0,0 +1,25 @@ +package com.danny.hw1; + +public class Queue { + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + if ( size() > 0 ) { + return elementData.remove(0); + } else { + throw new IndexOutOfBoundsException("Queue is Null"); + } + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java new file mode 100644 index 0000000000..165387695b --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java @@ -0,0 +1,40 @@ +package com.danny.hw1; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + this.elementData.add(o); + + } + + public Object pop(){ + int size = this.elementData.size(); + + if ( size > 0 ) { + return this.elementData.remove(size - 1 ); + } else{ + throw new IndexOutOfBoundsException("Stack is empty"); + } + } + + public Object peek(){ + + if ( size() > 0 ) { + return this.elementData.get(size() - 1 ); + } else{ + throw new IndexOutOfBoundsException("Stack is empty"); + } + } + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return this.elementData.size(); + } + + public Stack() { + // TODO Auto-generated constructor stub + } +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java new file mode 100644 index 0000000000..de4c734eb8 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java @@ -0,0 +1,80 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import java.lang.reflect.Array; +import java.lang.reflect.Parameter; +import java.util.Arrays; +import java.util.Collection; + +import javax.print.attribute.standard.RequestingUserName; +import javax.xml.crypto.Data; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import com.danny.hw1.ArrayList; +import com.danny.hw1.Iterator; +import com.danny.hw1.test_al; + +import junit.extensions.TestSetup; + + +public class ArrayListTest { + + static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; + ArrayList test; + @Before + public void setUp() throws Exception{ + test = new ArrayList(); + for(Object data: Data){ + test.add(data); + } + } + + @Test + public void testAddObject() { + int len = test.size(); + test.add(10); + assertEquals(len, test.size()-1); + } + + @Test + public void testAddIntObject() { + int len = test.size(); + test.add(len, 10); + + assertEquals(len, test.size()-1); + } + + @Test + public void testGet() { + assertEquals(Data[3], test.get(3)); + } + + @Test + public void testRemove() { + assertEquals(Data[4], test.remove(4)); + assertEquals(Data.length-1, test.size()); + } + + @Test + public void testSize() { + assertEquals(Data.length, test.size()); + } + + @Test + public void testIterator() { + Iterator iterator =test.iterator(); + for(Object i:Data){ + if(iterator.hasNext()){ + assertEquals(i,iterator.next()); + } + } + } + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..2d99534098 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java @@ -0,0 +1,48 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.danny.hw1.BinaryTreeNode; +import com.danny.hw1.LinkedList; + +public class BinaryTreeNodeTest { + + static Object[] Data = new Object[]{5,10,3,2,15,12,56,8}; + BinaryTreeNode test; + @Before + public void setUp() throws Exception{ + test = new BinaryTreeNode(); + for(Object data: Data){ + test.insert(data); + + } + } + @Test + public void testPrintWholeTree(){ + test.printWholeTree(test, 1); + int layer = 1; + int printNum = 0; + System.out.println("var {5,10,3,2,15,12,56,8} insert tree\n"+"Print binary tree:"); + while(true){ + if(printNum == test.getTeMap().size()) break; + for (Object key : test.getTeMap().keySet()) { + Integer value = test.getTeMap().get(key); + + if (value.intValue() == layer){ + System.out.print(key.toString()+" "); + printNum++; + } + + } + System.out.println(""); + layer++; + } + + + } + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java new file mode 100644 index 0000000000..ab49d2823c --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java @@ -0,0 +1,86 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.danny.hw1.ArrayList; +import com.danny.hw1.Iterator; +import com.danny.hw1.LinkedList; + +public class LinkedListTest { + + static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; + LinkedList test; + @Before + public void setUp() throws Exception{ + test = new LinkedList(); + for(Object data: Data){ + test.add(data); + } + } + + @Test + public void testAddObject() { + int len = test.size(); + test.add(10); + assertEquals(len, test.size()-1); + } + + @Test + public void testAddIntObject() { + int len = test.size(); + test.add(len, 10); + + assertEquals(len, test.size()-1); + } + + @Test + public void testGet() { + assertEquals(Data[3], test.get(3)); + } + + @Test + public void testRemove() { + System.out.println(Data[4]); + assertEquals(Data[4], test.remove(4)); + assertEquals(Data.length -1, test.size()); + } + + @Test + public void testSize() { + assertEquals(Data.length, test.size()); + } + + @Test + public void testIterator() { + Iterator iterator =test.iterator(); + for(Object i:Data){ + if(iterator.hasNext()){ + assertEquals(i,iterator.next()); + } + } + } + + @Test + public void testAddFirst() { + test.addFirst(10); + assertEquals(10, test.get(0)); + } + + @Test + public void testRemoveFirst() { + Object ans=test.get(0); + assertEquals(ans,test.removeFirst()); + assertEquals(Data.length-1,test.size()); + } + + @Test + public void testRemoveLast() { + Object ans=test.get(Data.length - 1); + assertEquals(ans,test.removeLast()); + assertEquals(Data.length-1,test.size()); + } + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java new file mode 100644 index 0000000000..7292129e95 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java @@ -0,0 +1,47 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.danny.hw1.LinkedList; +import com.danny.hw1.Queue; + +public class QueueTest { + + static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; + Queue test; + @Before + public void setUp() throws Exception{ + test = new Queue(); + for(Object data: Data){ + test.enQueue(data); + } + } + + @Test + public void testEnQueue() { + Object t=10; + test.enQueue(t); + assertEquals(Data.length+1,test.size()); + } + + @Test + public void testDeQueue() { + Object t=test.deQueue(); + assertEquals(Data.length-1,test.size()); + assertEquals(Data[0], t); + } + @Test + public void testIsEmpty() { + assertFalse(test.isEmpty()); + } + + @Test + public void testSize() { + assertEquals(Data.length,test.size()); + } + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java new file mode 100644 index 0000000000..11484c0043 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java @@ -0,0 +1,54 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.danny.hw1.Queue; +import com.danny.hw1.Stack; + +public class StackTest { + + static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; + Stack test; + @Before + public void setUp() throws Exception{ + test = new Stack(); + for(Object data: Data){ + test.push(data); + } + } + + @Test + public void testPush() { + Object t=10; + test.push(t); + assertEquals(Data.length+1,test.size()); + } + + @Test + public void testPop() { + assertEquals(Data[Data.length-1], test.pop()); + assertEquals(Data.length-1, test.size()); + } + + @Test + public void testPeek() { + assertEquals(Data[Data.length-1], test.peek()); + assertEquals(Data.length, test.size()); + } + + @Test + public void testIsEmpty() { + assertFalse(test.isEmpty()); + } + + @Test + public void testSize() { + assertEquals(Data.length, test.size()); + } + + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java new file mode 100644 index 0000000000..25eb57411b --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java @@ -0,0 +1,17 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ArrayListTest.class,BinaryTreeNodeTest.class, + LinkedListTest.class,QueueTest.class,StackTest.class + }) +public class SuitTest { + +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java new file mode 100644 index 0000000000..af11509593 --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java @@ -0,0 +1,221 @@ +package com.danny.hw2; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int size = origin.length; + int[] temp = new int[size]; + + for(int i=0;i < size; i++){ + temp[i] = origin[size-i-1]; + } + + for(int i=0;i array2[index2] ){ + result[resultIndex++] = array2[index2++]; + break; + } + } else{ + result[resultIndex++] = array1[index1++]; + } + } + System.out.println(resultIndex); + return Arrays.copyOf(result, resultIndex); + + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int oldSize = oldArray.length; + int[] newArray= new int[oldSize+size]; + + for ( int i = 0; i < newArray.length; i++) { + if ( i < oldSize ) { + newArray[i] = oldArray[i]; + } else{ + newArray[i] = 0; + } + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if(max == 1){ + return new int[0]; + } + + int maxIndex = 1000; + int realIndex = 0; + int[] array=new int[maxIndex]; + for (; realIndex <= array.length; realIndex++) { + int fibonacciNum = getFibonacciArray(realIndex+1); + if(fibonacciNum > max){ + break; + } + array[realIndex] = fibonacciNum; + } + + + + return Arrays.copyOf(array, realIndex); + } + + + private int getFibonacciArray(int index){ + + if(index == 0 || index == 1){ + return index; + } + return getFibonacciArray(index - 1) + getFibonacciArray(index - 2); + } + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int maxIndex = 1000; + int realSize = 0; + int[] array = new int[maxIndex]; + for (int i = 0; i < max; i++) { + if(isPrimers(i)){ + array[realSize++] = i; + } + } + return Arrays.copyOf(array, realSize); + } + private static boolean isPrimers(int n){ + if (n <= 3) { + return n > 1; + } + + for(int i=2;i<=Math.sqrt(n);i++){ + if(n%i == 0) + return false; + } + return true; + } + + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int maxIndex = 1000; + int realIndex = 0; + int[] array = new int[maxIndex]; + int sum = 0; + + for (int i = 1; i < max /2 +1; i++) { + if(max % i == 0){ + sum += i; + array[realIndex++] = i; + } + } + if(sum == max){ + return Arrays.copyOf(array, realIndex); + }else{ + return new int[0]; + } + + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + String result=""; + for (int i = 0; i < array.length; i++) { + result+= String.valueOf(array[i]) + seperator; + } + //去掉多余的一个seperator + return result.substring(0, result.length()-1); + } + + + + +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java new file mode 100644 index 0000000000..340d542dec --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java @@ -0,0 +1,39 @@ +package com.danny.hw2; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java new file mode 100644 index 0000000000..6e1cb4ba96 --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java @@ -0,0 +1,163 @@ +package com.danny.hw2; + +import java.io.File; +import java.lang.invoke.CallSite; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import org.jaxen.*; + +public class Struts { + + private static Document file = null; + private static String file_path = + new File("").getAbsolutePath()+".\\xmlFolder\\struts.xml"; + + private static String viewPath="com.danny.hw2.View"; + + //0. 读取配置文件struts.xml + private static Document parse(String path){ + SAXReader reader = new SAXReader(); + Document document = null; + try { + document = reader.read(path); + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return document; + } + + private static Element getAction(Document document,String name){ + + List lElement = (List) file.selectObject("/struts/action"); + Element actionElement = null; + for(Element e:lElement){ + if(e.attributeValue("name").equals(name)){ + actionElement = e; + break; + } + } + return actionElement; + } + + public static View runAction(String actionName, Map parameters) { + + file = parse(file_path); + + //返回的class View; + Object viewClass = null; + + + //0 Get Action Element + Element actionElement = getAction(file, actionName); + + + String actionClassPath = actionElement.attributeValue("class"); + System.out.println(actionClassPath); + + Object action = null; + + try { + /* + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + */ + action = Class.forName(actionClassPath).newInstance(); + + Method setName = action.getClass().getMethod("setName",String.class); + setName.invoke(action, parameters.get("name")); + + Method setPassword = action.getClass().getMethod("setPassword",String.class); + setPassword.invoke(action, parameters.get("password")); + + + //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method execute = action.getClass().getMethod("execute", null); + Object status = execute.invoke(action); + + System.out.println(status.toString()); + + + //3获得所有的Getter字段 + Field[] files = action.getClass().getDeclaredFields(); + + HashMap save = new HashMap<>(); + + //找到需要的数据,线存到save中 + for (int i = 0; i < files.length; i++) { + String name = files[i].getName(); + name = "get" + name.substring(0,1).toUpperCase() + + name.substring(1); + + + Method getter = action.getClass().getMethod(name,null); + save.put(files[i].getName(), (String) getter.invoke(action)); + + } + //塞进viewClass里面 + viewClass = Class.forName(viewPath).newInstance(); + Method setParameters = viewClass.getClass().getMethod("setParameters", Map.class); + setParameters.invoke(viewClass, save); + + + + //4将jsp放进去 + List resultElement = actionElement.selectNodes("result"); + for(Element e:resultElement){ + if(e.attributeValue("name").equals(status.toString())){ + String jspFields= e.getStringValue(); + viewClass.getClass().getMethod("setJsp", String.class). + invoke(viewClass, jspFields); + } + + } + + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + + throw new RuntimeException(e.getMessage()); + } + + + + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + + return (View) viewClass; + } + + +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java new file mode 100644 index 0000000000..67ff0a061b --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java @@ -0,0 +1,23 @@ +package com.danny.hw2; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java new file mode 100644 index 0000000000..a7fce5320a --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java @@ -0,0 +1,95 @@ +package com.danny.hw2.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.danny.hw2.ArrayUtil; + +public class ArrayUtilTest { + + @Test + public void testReverseArray() { +// * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = +// * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + int[] testData = new int[]{7,9,30,3}; + int[] ans = new int[]{3,30,9,7}; + new ArrayUtil().reverseArray(testData); + + for (int i = 0; i < ans.length; i++) { + assertEquals(ans[i], testData[i]); + } + } + + @Test + public void testRemoveZero() { + int[] testData = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] ans = new int[]{1,3,4,5,6,6,5,4,7,6,7,5}; + + int[] test = new ArrayUtil().removeZero(testData); + for (int i = 0; i < ans.length; i++) { + assertEquals(ans[i], test[i]); + } + } + + @Test + public void testMerge() { +// * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = +// * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + int[] a1 = new int[]{3, 5, 7,8}; + int[] a2 = new int[]{4,5,6,7}; + + int[] ans = new int[]{3,4,5,6,7,8}; + + int[] test = new ArrayUtil().merge(a1, a2); + + for (int i = 0; i < test.length; i++) { + assertEquals(ans[i], test[i]); + } + + } + + @Test + public void testGrow() { +// 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size +// * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 +// * [2,3,6,0,0,0] + + int size = 3; + int[] testData = new int[]{2,3,6}; + int[] test = new ArrayUtil().grow(testData, size); + assertEquals(testData.length+size, test.length); + + } + + @Test + public void testFibonacci() { + int[] ans = new int[]{1,1,2,3,5,8,13}; + int[] array = new ArrayUtil().fibonacci(15); + for (int i = 0; i < ans.length; i++) { + assertEquals(ans[i], array[i]); + } + + } + + @Test + public void testGetPerfectNumbers() { + + int[] ans=new int[]{1,2,4,7,14}; + int[] array=new ArrayUtil().getPerfectNumbers(28); + for (int i = 0; i < array.length; i++) { + assertEquals(ans[i], array[i]); + } + } + + @Test + public void testJoin() { + //* 用seperator 把数组 array给连接起来 例如array= [3,8,9], + //seperator = "-" 则返回值为"3-8-9" + int[] test = new int[]{3,8,9}; + + String test1 = new ArrayUtil().join(test, "-"); + assertEquals("3-8-9", test1); + } + +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java new file mode 100644 index 0000000000..49b770f015 --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java @@ -0,0 +1,46 @@ +package com.danny.hw2.test; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.danny.hw2.Struts; +import com.danny.hw2.View; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/729693763/Third_Homework3/DataStruct/Iterator.java b/group23/729693763/Third_Homework3/DataStruct/Iterator.java new file mode 100644 index 0000000000..2ca354f82a --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/Iterator.java @@ -0,0 +1,6 @@ +package com.zhous.DataStruct; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/729693763/Third_Homework3/DataStruct/LinkedList.java b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java new file mode 100644 index 0000000000..2a6663a3ba --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java @@ -0,0 +1,327 @@ +package com.zhous.DataStruct; + +import javafx.beans.binding.ObjectExpression; + + + +public class LinkedList implements List { + + private Node head = null; + private int size = 0; + + public void add(Object o){ + addLast(o); + this.size++; + } + + //内部调用的方法: + //2 返回添加到哪个Node + private Node findBeforeInsertNode(int needInsertIndex){ + Node findGetNode = this.head; + for ( int i=0; i< needInsertIndex - 1; i++ ) { + findGetNode = findGetNode.next; + } + return findGetNode; + } + //3 + private void checkPositionIndex(int index) { + if ( !( index >= 0 && index <= size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + //4 + private void addBeforeNode(int index, Object o) { + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + + Node beforeInserNode = this.head; + + + beforeInserNode = findBeforeInsertNode(index); + + newNode.next = beforeInserNode.next; + beforeInserNode.next = newNode; + + } + //5 + private Node findIndexNode(int index){ + Node findGetNode = this.head; + for ( int i=0; i< index; i++ ) { + findGetNode = findGetNode.next; + } + return findGetNode; + } + + + public void add(int index , Object o){ + checkPositionIndex(index); + if( index == size()){ + addLast(o); + } else if ( index == 0 ) { + addFirst(o); + } else{ + addBeforeNode(index,o); + } + this.size++; + } + + + + + public Object get(int index){ + checkElementIndex(index); + return findIndexNode(index); + } + public Object remove(int index){ + checkElementIndex(index); + Object deleteData = null; + + if(index == 0){ + deleteData = removeFirst(); + } else if(index == (size() - 1) ){ + deleteData = removeLast(); + } else { + Node temp = findBeforeInsertNode(index); + Node tempNext = temp.next; + deleteData = tempNext.data; + + temp.next = tempNext.next; + tempNext = null; + } + + return deleteData; + } + + //6 + private void checkElementIndex(int index) { + if ( !( index >= 0 && index < size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + if ( this.head == null ) { + this.head = newNode; + } else { + newNode.next = this.head; + this.head = newNode; + } + } + private void addLast(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + if ( head == null ) { + head = newNode; + } else{ + findBeforeInsertNode(this.size).next = newNode; + } + } + public Object removeFirst(){ + Object data; + Node newHead = new Node(); + newHead = this.head; + this.head = newHead.next; + + data = newHead.data; + newHead = null; + return data; + } + public Object removeLast(){ + Object data; + Node last = findIndexNode(this.size() -1); + data = last.data; + last = null; + + return data; + } + public Iterator iterator() + { + return new LinkedListIterator(); + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + Node first ; + int currentIndex = 1; + this.head = findIndexNode(this.size - 1); + if(this.size() <= 1){ + return; + } + while(currentIndex < this.size() ){ + first = findIndexNode(this.size() - currentIndex); + first.next = findIndexNode(this.size - currentIndex - 1); + currentIndex++; + } + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + checkElementIndex(this.size()); + + int mid = this.size / 2; + Node temp = this.head; + this.head = findIndexNode(mid); + for (int i = 0; i < mid; i++) { + Node T = temp.next; + temp = null; + temp = T; + } + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param index + * @param length + */ + public void remove(int index, int length){ + checkElementIndex(length + index ); + + Node before = findBeforeInsertNode(index); + Node temp = findIndexNode(index); + for (int i= 0; i < length; i++) { + Node T = temp.next; + temp = null; + temp = T; + } + before.next = temp; + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + Node listNode = list.head; + Node myNode = this.head; + int[] data = new int[list.size()]; + for (int i = 0; i < this.size(); i++) { + if(i == (Integer) listNode.data){ + data[i] = (Integer)myNode.data; + } + myNode = myNode.next; + } + + return data; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + int[] data = new int[list.size()]; + for (int i = 0,j = 0; i < this.size(); i++) { + for (; j < list.size(); j++) { + if(this.get(i).equals(list.get(j))){ + this.remove(i); + break; + } + } + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + * (选做) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + * (选做) + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + LinkedList listC = new LinkedList(); + + for (int i = 0,j = 0; i < this.size(); i++) { + for (; j < list.size(); j++) { + if(this.get(i).equals(list.get(j))){ + listC.add(this.get(i)); + break; + } + } + } + + + + return listC; + } + + + + /************Iterator**************/ + private class LinkedListIterator implements Iterator{ + private Node currentNode; + private int currentIndex; + + public LinkedListIterator() { + // TODO Auto-generated constructor stub + this.currentIndex = 0; + this.currentNode = new Node(); + } + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return currentIndex < size(); + } + + @Override + public Object next() { + // TODO Auto-generated method stub + checkElementIndex(currentIndex); + if ( currentNode.data == null ) { + this.currentNode = findIndexNode(currentIndex); + } + Object value = currentNode.data; + currentNode = currentNode.next; + currentIndex++; + return value; + } + } +} diff --git a/group23/729693763/Third_Homework3/DataStruct/List.java b/group23/729693763/Third_Homework3/DataStruct/List.java new file mode 100644 index 0000000000..aa8b039453 --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/List.java @@ -0,0 +1,10 @@ +package com.zhous.DataStruct; + +public interface List { + void add(Object o); + void add(int index, Object o); + Object get(int index); + Object remove(int index); + int size(); + Iterator iterator(); +} diff --git a/group23/729693763/Third_Homework3/download/DownloadThread.java b/group23/729693763/Third_Homework3/download/DownloadThread.java new file mode 100644 index 0000000000..3ab337e352 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/DownloadThread.java @@ -0,0 +1,49 @@ +package com.zhous.download; + +import com.zhous.download.api.Connection; +import com.zhous.download.api.DownloadListener; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + File targetFile; + DownloadListener downloadListener; + + public DownloadThread( Connection conn, int startPos, int endPos,File targetFile,DownloadListener downloadListener){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.targetFile = targetFile; + this.downloadListener = downloadListener; + } + public void run(){ + try { + //读取到指定长度的二进制数据 + System.out.println(this.getName()+"开始下载"); + byte[] data = conn.read(startPos,endPos); + + //插入的file中去 + RandomAccessFile raFile = new RandomAccessFile(this.targetFile,"rw"); + raFile.seek(startPos); + raFile.write(data,0,endPos-startPos ); + + raFile.close(); + //做完了 + if(FileDownloader.isDownloadFinish() ){ + downloadListener.notifyFinished(); + System.out.println(this.getName()+"完成最后的下载,并写入文件"); + } + + + }catch (IOException e){ + + } + } +} diff --git a/group23/729693763/Third_Homework3/download/FileDownloader.java b/group23/729693763/Third_Homework3/download/FileDownloader.java new file mode 100644 index 0000000000..098f9408f0 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/FileDownloader.java @@ -0,0 +1,96 @@ +package com.zhous.download; + +import com.zhous.download.api.Connection; +import com.zhous.download.api.ConnectionException; +import com.zhous.download.api.ConnectionManager; +import com.zhous.download.api.DownloadListener; + +import java.io.File; +import java.util.Set; + + +public class FileDownloader { + + String url="https://image.baidu.com/search/down?tn=download&word=download&ie=utf8&fr=detail&url=https%3A%2F%2Ftimgsa.baidu.com%2Ftimg%3Fimage%26quality%3D80%26size%3Db9999_10000%26sec%3D1490203615530%26di%3D2b1827956a01011d3634f3e04b01b15c%26imgtype%3D0%26src%3Dhttp%253A%252F%252Fimg15.3lian.com%252F2015%252Fh1%252F338%252Fd%252F157.jpg&thumburl=https%3A%2F%2Fss1.bdstatic.com%2F70cFvXSh_Q1YnxGkpoWK1HF6hhy%2Fit%2Fu%3D2613489365%2C2336631324%26fm%3D23%26gp%3D0.jpg"; + private static int threadNum = 5; + private static int threadCount = 0; + int avgBytes = 0; + + DownloadListener listener; + ConnectionManager cm; + File file = null; + + public FileDownloader(String _url,String fileName) { + this.url = _url; + this.file = new File(fileName); + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + int length = conn.getContentLength(); + avgBytes = length / threadNum; + //使用5个线程去下载; + for (int i = 0; i < threadNum; i++) { + int startPos = i*avgBytes; + int endPos = startPos + avgBytes - 1; + if(i == threadNum -1) { + endPos = length; + } + + Connection c = cm.open(this.url); + DownloadThread thread = new DownloadThread(c,startPos,endPos,file,this.getListener()); + thread.setName("Thread"+(i+1) ); + thread.start(); + } + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + + + public void setListener (DownloadListener listener){ + this.listener = listener; + } + + public synchronized static boolean isDownloadFinish(){ + threadCount++; + return threadCount == threadNum; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java new file mode 100644 index 0000000000..ca8817ba88 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java @@ -0,0 +1,58 @@ +package com.zhous.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.zhous.download.api.ConnectionManager; +import com.zhous.download.api.DownloadListener; +import com.zhous.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url="http://www.mydeskcity.com//upload/pc/112/960x600/1351650816239.jpg"; + String github = "https://github.com/em14Vito/coding2017/archive/master.zip"; + +// FileDownloader downloader = new FileDownloader(url,"Data23.jpg"); + FileDownloader downloader = new FileDownloader(github,"github.zip"); + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/729693763/Third_Homework3/download/api/Connection.java b/group23/729693763/Third_Homework3/download/api/Connection.java new file mode 100644 index 0000000000..170791e8ba --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.zhous.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos, int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionException.java b/group23/729693763/Third_Homework3/download/api/ConnectionException.java new file mode 100644 index 0000000000..925368135d --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.zhous.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java new file mode 100644 index 0000000000..b331ee7f1f --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.zhous.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/729693763/Third_Homework3/download/api/DownloadListener.java b/group23/729693763/Third_Homework3/download/api/DownloadListener.java new file mode 100644 index 0000000000..07b1a950ce --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.zhous.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..6a4b98fe06 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java @@ -0,0 +1,80 @@ +package com.zhous.download.impl; + +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +import com.zhous.download.api.*; + +public class ConnectionImpl implements Connection{ + + + InputStream is = null; + URL url = null; + HttpURLConnection http = null; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + //构造方法: + public ConnectionImpl() { + } + + //打开url并且创建连接 + public ConnectionImpl(String url) { + try { + this.url = new URL(url); + http = (HttpURLConnection) this.url.openConnection(); + //设置超时 + http.setConnectTimeout(5000); + http.setReadTimeout(5000); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + //指定http中读取一定长度的byte + http.setRequestProperty("Range","bytes= "+Integer.toString(startPos)+"-"+Integer.toString(endPos)); + http.connect(); + + //读取输入流到其中 + is = http.getInputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while( (len = is.read(buffer) ) != -1) { + + bos.write(buffer, 0, len); + } + + //关闭所有流,每次read的时候自动关闭。 + close(); + return bos.toByteArray(); + } + + @Override + public int getContentLength() { + return http.getContentLength(); + } + + @Override + public void close() { + try { + bos.close(); + if(is != null) { + is.close(); + } + http.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + } + } + +} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..28af08a0cd --- /dev/null +++ b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,27 @@ +package com.zhous.download.impl; + +import com.zhous.download.api.*; + +import java.net.MalformedURLException; +import java.net.URL; + +public class ConnectionManagerImpl implements ConnectionManager { + + + + @Override + public Connection open(String url) throws ConnectionException { + Connection ct = null; + URL u = null; + try { + u = new URL(url); + ct = new ConnectionImpl(url); + } catch (MalformedURLException e) { + e.printStackTrace(); + } finally { + //URL类不需要关闭 + } + return ct; + } + +} diff --git a/group23/729693763/homework1_demo/ArrayList.java b/group23/729693763/homework1_demo/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group23/729693763/homework1_demo/ArrayList.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group23/729693763/homework1_demo/BinaryTreeNode.java b/group23/729693763/homework1_demo/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group23/729693763/homework1_demo/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/729693763/homework1_demo/Iterator.java b/group23/729693763/homework1_demo/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/729693763/homework1_demo/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/729693763/homework1_demo/LinkedList.java b/group23/729693763/homework1_demo/LinkedList.java new file mode 100644 index 0000000000..4fdb03db8a --- /dev/null +++ b/group23/729693763/homework1_demo/LinkedList.java @@ -0,0 +1,124 @@ +package com.coding.basic; + + + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public static int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/729693763/homework1_demo/List.java b/group23/729693763/homework1_demo/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group23/729693763/homework1_demo/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/729693763/homework1_demo/Queue.java b/group23/729693763/homework1_demo/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group23/729693763/homework1_demo/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group23/729693763/homework1_demo/Stack.java b/group23/729693763/homework1_demo/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group23/729693763/homework1_demo/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group23/729693763/readme.md b/group23/729693763/readme.md new file mode 100644 index 0000000000..89b8633e07 --- /dev/null +++ b/group23/729693763/readme.md @@ -0,0 +1,12 @@ +Data Struct contain: ArrayList, LinkedList, BinaryTreeNode, Stack, Queue, Iterator +<<<<<<< HEAD +--- --- +Add Blog link: +http://www.cnblogs.com/CodeSaveMe/p/6523745.html +======= +--- --- +Add Blog link: http://www.cnblogs.com/CodeSaveMe/p/6523745.html + +Add week2 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6571621.html + +Add week3 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6624431.html diff --git a/group23/769232552/coding/src/main/java/code01/ArrayList.java b/group23/769232552/coding/src/main/java/code01/ArrayList.java new file mode 100644 index 0000000000..6746de2a50 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/ArrayList.java @@ -0,0 +1,138 @@ +package code01; + +/** + * Created by yaoyuan on 2017/3/6. + */ +public class ArrayList implements List { + + private int max_size = 0;//总长度 + private int current_size = 0; //当前长度 + private float extendPercent = 2; //扩展系数 + + private Object[] elementData; + + /** + * 默认构造函数,初始化数组长度为100 + */ + public ArrayList(){ + this.elementData = new Object[100]; + this.max_size = 100; + } + /** + * 构造函数 + * @param size,初始化数组长度 + */ + public ArrayList(int size){ + this.elementData = new Object[size]; + this.max_size = size; + } + + /** + * 顺序添加元素,超出原始界限时,数组自动扩展 + */ + public void add(Object o) { + //如果越界了,需要复制原有的数组到扩充后的数组中 + if(this.current_size + 1 > this.max_size) { + this.max_size = (int) Math.floor(this.max_size * this.extendPercent); + this.elementData = copyToNew(this.elementData,this.max_size); + } + this.elementData[this.current_size] = o; + this.current_size ++; + + } + + /** + * 指定位置添加元素 + * 一种是在中间,一种是当前插入的位置尾部(如果超过尾部则默认添加到尾部) + */ + public void add(int index, Object o){ + assert(index>=0); + //如果越界了,需要复制原有的数组到扩充后的数组中 + if(this.current_size + 1 > this.max_size) { + //如果越界了,需要复制原有的数组到扩充后的数组中 + this.max_size = (int) Math.floor(this.max_size * this.extendPercent); + this.elementData = copyToNew(this.elementData,this.max_size); + } + //数组中间插入 + if(index < this.current_size){ + //需要把当前位置的元素往后移动 + for (int i = this.current_size - 1; i >= index; i--) { + this.elementData[i+1] = this.elementData[i]; + } + this.elementData[index] = o; + }else { + //后面加入 + this.elementData[this.current_size] = o; + } + this.current_size ++; + } + + public Object get(int index){ + if(index >= 0 && index <= this.current_size-1){ + return this.elementData[index]; + }else { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + /** + * 删除指定位置的元素 + * @param index + * @return + */ + public Object remove(int index){ + Object result = null; + if(index >= 0 && index <= current_size-1){ + result = elementData[index]; + //删除操作 + if(index == current_size - 1){ + elementData[index] = null; + }else { + //需要把当前位置后面的元素往前移动 + for (int i = index; i < this.current_size-1 ; i++) { + this.elementData[i] = this.elementData[i+1]; + } + this.elementData[this.current_size-1] = null; + } + this.current_size --; + }else { + throw new ArrayIndexOutOfBoundsException(index); + } + return result; + } + + public int size(){ + return this.current_size; + } + + public Iterator iterator(){ + return new Iterator() { + int next_pos = 0; + int pos = -1; + public boolean hasNext() { + if(max_size <= 0){ + return false; + } + return next_pos < ArrayList.this.size(); + } + + public Object next() { + Object next = ArrayList.this.get(next_pos); + pos = next_pos ++; + return next; + } + public void remove(){ + ArrayList.this.remove(pos); + } + }; + } + + private Object[] copyToNew(Object[] oldArray, int extendSize){ + Object[] newArray = new Object[extendSize]; + for (int i = 0; i < size(); i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + +} \ No newline at end of file diff --git a/group23/769232552/coding/src/main/java/code01/BinaryTree.java b/group23/769232552/coding/src/main/java/code01/BinaryTree.java new file mode 100644 index 0000000000..b29fb960cb --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/BinaryTree.java @@ -0,0 +1,97 @@ +package code01; + +/** + * Created by yaoyuan on 2017/3/10. + */ +public class BinaryTree>{ + + private BinaryTreeNode root = null; + private int size = 0; + + public BinaryTreeNode createBinaryTree(T[] array){ + for(T data : array){ + this.insert(data); + } + return this.root; + } + + // recursive way, + // t is the node that roots the subtree. + public BinaryTreeNode insert(T data, BinaryTreeNode t){ + if(t == null){ + return new BinaryTreeNode(data); + } + int comparator = ((T) t.data).compareTo(data); + if(comparator > 0){ + t.left = insert(data,t.right); + }else if(comparator < 0){ + t.right = insert(data,t.left); + }else { + // do nothing + } + return t; + + } + + + //loop way + public void insert(T data){ + if(this.root == null){ + BinaryTreeNode node = new BinaryTreeNode(data); + this.root = node; + this.size ++; + return; + } + BinaryTreeNode cursor = this.root; + while (cursor != null){ + if(data.compareTo((T) cursor.data) <= 0){ + if(cursor.left == null) { + cursor.left = new BinaryTreeNode(data); + return; + } + cursor = cursor.left; + } + if(data.compareTo((T) cursor.data) > 0){ + if(cursor.right == null) { + cursor.right = new BinaryTreeNode(data); + return; + } + cursor = cursor.right; + } + } + this.size ++; + } + + public void leftOrderScan(BinaryTreeNode cursor){ + if(cursor == null){ + return; + } + leftOrderScan(cursor.left); + System.out.println(cursor.data.toString() + " "); + leftOrderScan(cursor.right); + } + + public BinaryTreeNode getRoot(){ + return this.root; + } + + class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data, BinaryTreeNode left, BinaryTreeNode right) { + this.left = right; + this.right = left; + this.data = data; + } + + public BinaryTreeNode(T data) { + this.left = null; + this.right = null; + this.data = data; + } + + } +} diff --git a/group23/769232552/coding/src/main/java/code01/Iterator.java b/group23/769232552/coding/src/main/java/code01/Iterator.java new file mode 100644 index 0000000000..b4074067bb --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/Iterator.java @@ -0,0 +1,7 @@ +package code01; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + public void remove(); +} diff --git a/group23/769232552/coding/src/main/java/code01/LinkedList.java b/group23/769232552/coding/src/main/java/code01/LinkedList.java new file mode 100644 index 0000000000..f7bbc970a9 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/LinkedList.java @@ -0,0 +1,327 @@ +package code01; + + +public class LinkedList implements List { + + private Node head; + private Node tail; //指向链表最后一个元素的引用 + + private int size; //总长度 + + public LinkedList() { + this.head = null; + this.tail = null; + this.size = 0; + } + + /** + * 新增顺序添加一个元素 + * @param o + */ + public void add(Object o){ + Node node = new Node(); + node.data = o; + node.next = null; + //空链表 + if(head == null){ + this.head = node; + this.tail = node; + }else { //非空链表,要先找到链表尾部,再加入新解答 + this.tail.next = node; + this.tail = node; + } + this.size ++; + } + + /** + * 指定索引处添加node + */ + public void add(int index, Object o) { + assert(index >= 0); + Node node = new Node(); + node.data = o; + node.next = null; + + if(index == 0){ + //添加在头部 + node.next = head; + head = node; + }else if(index >= this.size){ + //添加在尾部 + this.tail.next = node; + }else { + //添加在中间 + Node cursor = this.head; + for (int i = 0; i < index - 1; i++) { + cursor = cursor.next; + } + node.next = cursor.next; + cursor.next = node; + } + this.size ++; + } + + public Object get(int index){ + assert(index < this.size); + Node cursor = this.head; + for (int i = 0; i < index; i++) { + cursor = cursor.next; + } + return cursor.data; + } + + public Object remove(int index){ + assert(index >= 0 && index < this.size); + Object result = null; + //删除的是链表尾部的元素 + if(index == this.size - 1){ + Node cursor = this.head; + for (int i = 0; i < index - 1; i++) { + cursor = cursor.next; + } + result = cursor.next.data; + tail = cursor; + cursor.next = null; + }else if(index == 0){ + //删除的是头部元素 + result = head.data; + head = head.next; + }else { + //删除的是链表中间的元素 + Node cursor = this.head; + for (int i = 0; i < index - 1; i++) { + cursor = cursor.next; + } + result = cursor.next.data; + cursor.next = cursor.next.next; + } + this.size --; + return result; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node node = new Node(); + node.data = o; + node.next = null; + if(this.head == null){ + this.head = node; + this.tail = node; + }else { + node.next = head; + this.head = node; + } + this.size ++; + } + public void addLast(Object o){ + Node node = new Node(); + node.data = o; + node.next = null; + if(this.head == null){ + this.head = node; + this.tail = node; + }else { + this.tail.next = node; + this.tail = node; + } + this.size ++; + } + + public Object removeFirst(){ + Object first = null; + if(this.head != null){ + first = this.head.data; + head = head.next; + this.size --; + } + return first; + } + + public Object removeLast(){ + Object last = null; + if(this.tail != null){ + if(this.head != this.tail){ + Node cursor; + for (cursor = head;cursor.next!=tail;cursor=cursor.next); + last = this.tail.data; + this.tail = cursor; + this.tail.next = null; + }else { + last = this.tail.data; + this.head = null; + this.tail = null; + } + this.size --; + } + return last; + } + public Iterator iterator(){ + return null; + } + + /** + * 节点类 + */ + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + if(this.head == null || this.head == this.tail){ + return; + } + + Node pre_cursor = null; + Node cursor = this.head; + Node after_cursor = cursor.next; + + while(cursor != null){ + cursor.next = pre_cursor; + pre_cursor = cursor; + cursor = after_cursor; + if(after_cursor != null){ + after_cursor = after_cursor.next; + } + } + + Node tmpNode = this.head; + this.head = this.tail; + this.tail = tmpNode; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + if(this.head == null || this.head.next == null){ + return; + } + if(this.head.next.next == null){ + this.head = this.head.next; + } + + Node stepOne = this.head; + Node stepTwo = this.head; + + while (stepTwo.next != null){ + stepOne = stepOne.next; + stepTwo = stepTwo.next.next; + } + this.head = stepOne; + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + Node current = head; + Node firstHalf = null; + for (int k = 0; k < i; k ++){ + if(current == null){ + return; + } + firstHalf = current; //记录待删除节点的前一个节点 + current = current.next; + } + + //移动length长度 + for (int j = 0; j < length; j++) { + if(current == null){ + return; + } + current = current.next; + } + + if(i == 0){ + head = current; + }else { + firstHalf.next = current; + } + } + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public static int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + if(this.head == null){ + return; + } + Node current = this.head; + Node current_next = this.head; + while (current_next != null){ + current_next = current_next.next; //如果放到下个while循环后面写,就需要判断一次current_next是不是null了 + while(current_next != null && current_next.data.equals(current.data)){ + //删除重复节点 + current.next = current_next.next; + current_next = current_next.next; + } + current = current_next; + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + //怎么才能高效呢 + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } + + /** + * 遍历列表 + */ + public void printList(){ + System.out.println(); + for (Node cursor = this.head;cursor!=null;cursor=cursor.next){ + System.out.print(cursor.data+" "); + } + } +} diff --git a/group23/769232552/coding/src/main/java/code01/List.java b/group23/769232552/coding/src/main/java/code01/List.java new file mode 100644 index 0000000000..95bc37d172 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/List.java @@ -0,0 +1,9 @@ +package code01; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/769232552/coding/src/main/java/code01/Queue.java b/group23/769232552/coding/src/main/java/code01/Queue.java new file mode 100644 index 0000000000..d9956deb9a --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/Queue.java @@ -0,0 +1,24 @@ +package code01; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o){ + linkedList.addFirst(o); + } + + public Object deQueue(){ + Object result = linkedList.removeLast(); + return result; + } + + public boolean isEmpty(){ + return linkedList.size() == 0; + } + + public int size(){ + return linkedList.size(); + } + +} diff --git a/group23/769232552/coding/src/main/java/code01/Stack.java b/group23/769232552/coding/src/main/java/code01/Stack.java new file mode 100644 index 0000000000..dbaeb91a48 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/Stack.java @@ -0,0 +1,31 @@ +package code01; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object result = null; + if(elementData.size()!=0) { + result = elementData.remove(elementData.size() - 1); + } + return result; + } + + public Object peek(){ + Object result = null; + if(elementData.size()!=0) { + result = elementData.get(elementData.size() - 1); + } + return result; + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group23/769232552/coding/src/main/java/code02/ArrayUtil.java b/group23/769232552/coding/src/main/java/code02/ArrayUtil.java new file mode 100644 index 0000000000..23055ef138 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/ArrayUtil.java @@ -0,0 +1,257 @@ +package code02; +import org.apache.commons.lang.ArrayUtils; +import java.util.ArrayList; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if (origin == null || origin.length <= 1){ + return; + } + + int head = 0; + int tail = origin.length - 1; + int tmp; + while (head != tail){ + //调换位置 + tmp = origin[head]; + origin[head] = origin[tail]; + origin[tail] = tmp; + + head ++; + tail --; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray){ + if (oldArray == null || oldArray.length < 1){ + return null; + } + + List newList = new ArrayList(); + for(int number : oldArray){ + if(number != 0){ + newList.add(number); + } + } + + Integer[] result = new Integer[newList.size()]; + result = (Integer[]) newList.toArray(result); + return ArrayUtils.toPrimitive(result); + + + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + if(array1 == null && array2 == null){ + return null; + } + if(array1 == null){ + return array2; + } + if(array2 == null){ + return array1; + } + int[] newArray = new int[array1.length + array2.length]; + int m = 0,n = 0, k = 0; + while (m < array1.length && n < array2.length){ + if(array1[m] <= array2[n]){ + newArray[k++] = array1[m++]; + }else { + newArray[k++] = array2[n++]; + } + } + if(m >= array1.length){ + while (n < array2.length){ + newArray[k++] = array2[n++]; + } + } + if(n >= array2.length){ + while (m < array1.length){ + newArray[k++] = array1[m++]; + } + } + return newArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + int i = 0; + for (; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + for (int j = 0; j < size; j++){ + newArray[i++] = 0; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + //也就是需要生成一个小于max值的fibonacci数组 + public int[] fibonacci(int max){ + if(max < 2){ + return new int[]{}; + } + if(max < 3){ + return new int[]{1,1}; + } + List list = new ArrayList(); + list.add(0,1); + list.add(1,1); + int i=0; + while (list.get(i) + list.get(i+1) < max){ + list.add(i+2,list.get(i) + list.get(i+1)); + i++; + } + + int[] newArray = new int[list.size()]; + for (int j = 0; j < list.size(); j++) { + newArray[j] = list.get(j).intValue(); + } + return newArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + * + * 原理: + * 1,判断一个数字是否为素数,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n) + * 2,当i是素数的时候,i的所有的倍数必然是合数。 + */ + public int[] getPrimes(int max){ + + if(max <= 2){ + return null; + } + boolean[] prime = new boolean[max + 1]; + for (int i = 2; i <= max; i++) { + if(i%2 == 0){ + prime[i] = false; //偶数 + }else { + prime[i] = true; + } + } + + for (int i = 2; i <= Math.sqrt(max) ; i++) { + if(prime[i]){//奇数 + //如果i是素数,那么把i的倍数标记为非素数 + for(int j = i+i; j <= max; j += i){ + prime[j] = false; + } + } + } + + List num = new ArrayList(); + for (int i = 2; i <= max; i++) { + if(prime[i]){ + num.add(i); + } + } + + Integer[] result = new Integer[num.size()]; + result = (Integer[]) num.toArray(result); + return ArrayUtils.toPrimitive(result); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + if(max < 6){ + return null; + } + + List perfectNumlist = new ArrayList(); + + for (int j = 6;j <= max; j++){ + List factorNumlist = new ArrayList(); + factorNumlist.add(1); + for (int i = 2; i < j; i++) { + if(j % i == 0){ + factorNumlist.add(i); + } + } + int sum = 0; + for(Integer num : factorNumlist){ + sum += num; + } + + if(sum == j){ + perfectNumlist.add(j); + } + } + Integer[] result = new Integer[perfectNumlist.size()]; + result = (Integer[]) perfectNumlist.toArray(result); + return ArrayUtils.toPrimitive(result); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length - 1; i++) { + sb.append(array[i]); + sb.append(seperator); + } + sb.append(array[array.length - 1]); + return sb.toString(); + } + + public void printArr(int[] array){ + for(int num : array){ + System.out.print(num + " "); + } + } + +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java b/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java new file mode 100644 index 0000000000..b5e077e7a5 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java @@ -0,0 +1,28 @@ +package code02.litestruts; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by yaoyuan on 2017/3/22. + */ +public class ActionConfig { + String name; + String clzName; + Map viewResult = new HashMap(); + + + public ActionConfig(String actionName, String clzName) { + this.name = actionName; + this.clzName = clzName; + } + public String getClassName(){ + return clzName; + } + public void addViewResult(String name, String viewName){ + viewResult.put(name, viewName); + } + public String getViewName(String resultName){ + return viewResult.get(resultName); + } +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java b/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java new file mode 100644 index 0000000000..85d3d98a1f --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java @@ -0,0 +1,64 @@ +package code02.litestruts; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * Created by yaoyuan on 2017/3/21. + */ +public class Configuration { + + + private String path; + private final Map actionMap = new HashMap(); + + Configuration(String path){ + parseXML(path); + } + + //解析xml文件 + private void parseXML(String path){ + //读取文件 + File file = new File(path); + SAXReader reader = new SAXReader(); + Document document = null; + try { + document = reader.read(file); + } catch (DocumentException e) { + e.printStackTrace(); + } + Element root = document.getRootElement(); + + for (Iterator iterator = root.elementIterator("action"); iterator.hasNext();) { + Element e = iterator.next(); + String actionName = e.attributeValue("name"); + String clazName = e.attributeValue("class"); + ActionConfig actionConfig = new ActionConfig(actionName,clazName); + for(Iterator childIterator = e.elementIterator();childIterator.hasNext();){ + Element child = childIterator.next(); + String jspKey = child.attributeValue("name"); + String jspValue = child.getTextTrim(); + actionConfig.addViewResult(jspKey,jspValue); + } + actionMap.put(actionName,actionConfig); + } + } + + public String getView(String actionName, String result){ + String jspKey = actionName + "." + result; + return actionMap.get(actionName).getViewName(result); + } + + + public Map getActionMap() { + return actionMap; + } + +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java b/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java new file mode 100644 index 0000000000..0799eae71a --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package code02.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java b/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java new file mode 100644 index 0000000000..2a499f104b --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java @@ -0,0 +1,119 @@ +package code02.litestruts; + +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by yaoyuan on 2017/3/21. + */ +public class ReflectionUtil { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ReflectionUtil.class); + + private static final Map> clazzMap = new HashMap>(); + + //加载xml文件中的类 + public void initiateClazz(Configuration cfg){ + Map actionMap = cfg.getActionMap(); + + for (Map.Entry entry : actionMap.entrySet()) { + String actionName = entry.getKey(); //login + ActionConfig actionConfig =entry.getValue(); + String className = actionConfig.getClassName(); //code02.litestruts.LoginAction + Class cls; + try { + cls = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); + clazzMap.put(actionName,cls); + } catch (Exception e) { + logger.warn("加载类 " + className + "出错!"); + } + } + } + + + //返回实例对象 + public Object getInstance(String actionName){ + Object instance = null; + for (Map.Entry> entry : clazzMap.entrySet()) { + String action = entry.getKey(); //login + Class cls = entry.getValue(); //code02.litestruts.LoginAction.class + if(actionName.equals(action)){ + try { + instance = cls.newInstance(); + } catch (Exception e) { + logger.error("生成实例出错!", e); + throw new RuntimeException(e); + } + } + } + return instance; + } + + + //参数赋值 + public void setParameters(Object o, Map params) { + + List methods = getSetterMethods(o.getClass()); + for (String name : params.keySet()) { + String methodName = "set" + name; + for (Method m : methods) { + if (m.getName().equalsIgnoreCase(methodName)) { + try { + m.invoke(o, params.get(name)); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + } + } + + //运行无参方法 + public Object runMethodWithoutParams(Object o , String methodName){ + Class clz = o.getClass(); + Object result = null; + try { + Method method = clz.getDeclaredMethod(methodName); + try { + result = method.invoke(o); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + return result; + } + + //返回以set开头的方法 + public List getSetterMethods(Object o){ + return getMethods(o.getClass(),"set"); + } + + //返回以get开头的方法 + public List getGetterMethods(Object o){ + return getMethods(o.getClass(),"get"); + } + + private List getMethods(Class clz, String startWithName){ + List methodsList = new ArrayList(); + Method[] methods = clz.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + String methodName = methods[i].getName(); + if(methodName.startsWith(startWithName)){ + methodsList.add(methods[i]); + } + } + return methodsList; + } + +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java b/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java new file mode 100644 index 0000000000..b954f25bd5 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java @@ -0,0 +1,76 @@ +package code02.litestruts; + +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class Struts { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Struts.class); + /* + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + + + + */ + public static View runAction(String actionName, Map parameters) { + View view = new View(); + Configuration cfg = new Configuration("src/main/resources/struts.xml"); + ReflectionUtil reflectionUtil = new ReflectionUtil(); + reflectionUtil.initiateClazz(cfg); + /* 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象)*/ + Object o = reflectionUtil.getInstance(actionName); + /*2. 根据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") ,那就应该调用 setName和setPassword方法*/ + reflectionUtil.setParameters(o,parameters); + /*3. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success"*/ + String result = (String) reflectionUtil.runMethodWithoutParams(o,"execute"); + /* 4. 通过反射找到对象的所有getter方法(例如 getMessage),通过反射来调用, + 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,放到View对象的parameters*/ + Map params = new HashMap(); + List methods = reflectionUtil.getGetterMethods(o); + for(Method method : methods){ + String key = method.getName().substring(3); + String value = null; + try { + value = (String) method.invoke(o); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + params.put(key,value); + } + /*5. 根据struts.xml中的 配置,以及execute的返回值,确定哪一个jsp,放到View对象的jsp字段中。*/ + String jsp = cfg.getView(actionName,result); + view.setParameters(params); + view.setJsp(jsp); + + return view; + } + + public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { + + String actionName = "login"; + HashMap params = new HashMap(); + params.put("name","test"); + params.put("password","12345"); + + View view = Struts.runAction(actionName,params); + System.out.println(view.getJsp()); + System.out.println(view.getParameters()); + + + } + +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/View.java b/group23/769232552/coding/src/main/java/code02/litestruts/View.java new file mode 100644 index 0000000000..c7e630587c --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/View.java @@ -0,0 +1,23 @@ +package code02.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/769232552/coding/src/main/java/code03/DownloadThread.java b/group23/769232552/coding/src/main/java/code03/DownloadThread.java new file mode 100644 index 0000000000..7bf8a8e765 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/DownloadThread.java @@ -0,0 +1,47 @@ +package code03; + +import code03.api.Connection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; + +/** + * 定义线程类 + */ + + +public class DownloadThread extends Thread{ + + private static final Logger logger = LoggerFactory.getLogger(DownloadThread.class); + + private Connection conn; + private int startPos; + private int endPos; + private static final String fileName = "D://test.png"; + + + public DownloadThread(Connection conn, int startPos, int endPos){ + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + + @Override + public void run(){ + logger.debug("thread {} begin to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos); + + try { + byte[] data = conn.read(startPos,endPos); + RandomAccessFile rfile = new RandomAccessFile(fileName,"rw"); + rfile.seek(startPos); + rfile.write(data,0,data.length); + rfile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + logger.debug("thread {} end to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos); + + + } +} diff --git a/group23/769232552/coding/src/main/java/code03/FileDownloader.java b/group23/769232552/coding/src/main/java/code03/FileDownloader.java new file mode 100644 index 0000000000..6814c49f9c --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/FileDownloader.java @@ -0,0 +1,109 @@ +package code03; + +import code03.api.Connection; +import code03.api.ConnectionException; +import code03.api.ConnectionManager; +import code03.api.DownloadListener; +import code03.impl.ConnectionManagerImpl; + +import java.util.ArrayList; +import java.util.List; + +/** + * 线程启动类 + */ + +public class FileDownloader { + + private String url; + private DownloadListener listener; + private ConnectionManager cm; + private static boolean downloadFinished = false; + + private final static int THREAD_NUM = 5; + + public FileDownloader(String _url) { + this.url = _url; + } + + /* + (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。*/ + public void execute(){ + Connection conn = null; + try { + //启动线程 + int startPos = 0, endPos = 0; + List threads = new ArrayList(); + for (int i = 0; i < THREAD_NUM; i++) { + conn = cm.open(this.url); //每次都要重新获取一个connection.imputstream + int length = conn.getContentLength(); + startPos = length/THREAD_NUM * i; + endPos = length/THREAD_NUM * (i + 1)- 1; + DownloadThread downloadThread = new DownloadThread(conn,startPos,endPos); + threads.add(downloadThread); + downloadThread.start(); + } + + //调用join方法,确保所有线程的工作已经完成 + for (int i = 0; i < THREAD_NUM; i++) { + try { + threads.get(i).join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + listener.notifyFinished(); + } catch (ConnectionException e) { + e.printStackTrace(); + } finally { + if(conn != null){ + conn.close(); + } + } + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + + + public static void main(String[] args) { + + String url = "http://litten.me/assets/blogImg/litten.png"; + FileDownloader fileDownloader = new FileDownloader(url); + ConnectionManager cm = new ConnectionManagerImpl(); + fileDownloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + }); + fileDownloader.setConnectionManager(cm); + fileDownloader.execute(); + + + while (!downloadFinished){ + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("download finished ! "); + + + } + +} diff --git a/group23/769232552/coding/src/main/java/code03/api/Connection.java b/group23/769232552/coding/src/main/java/code03/api/Connection.java new file mode 100644 index 0000000000..1f2e4e1d39 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/api/Connection.java @@ -0,0 +1,23 @@ +package code03.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java b/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java new file mode 100644 index 0000000000..77e886e987 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java @@ -0,0 +1,9 @@ +package code03.api; + +public class ConnectionException extends Exception { + + public ConnectionException(String message,Throwable e){ + super(message,e); + } + +} diff --git a/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java b/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java new file mode 100644 index 0000000000..4cbd46445a --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package code03.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java b/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java new file mode 100644 index 0000000000..f5e7e146a7 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java @@ -0,0 +1,5 @@ +package code03.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java new file mode 100644 index 0000000000..069f21625b --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java @@ -0,0 +1,107 @@ +package code03.impl; + +import code03.api.Connection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLConnection; + + +public class ConnectionImpl implements Connection{ + + private static final Logger logger = LoggerFactory.getLogger(ConnectionImpl.class); + + + private URLConnection urlConnection; + private int length = -1; + + public ConnectionImpl(URLConnection urlConnection){ + this.urlConnection = urlConnection; + } + + /** + * 读取urlConnection.getInputStream()中的数据,返回byte[] + */ + @Override + public byte[] read(int startPos, int endPos) throws IOException { + int contentLength = getContentLength(); + if(startPos < 0 || endPos > contentLength || contentLength <= 0){ + logger.info("index out of range !"); + return null; + } + + InputStream raw = null; + BufferedInputStream in = null; + int size = endPos - startPos + 1; + + byte[] data = new byte[size]; + try{ + raw = urlConnection.getInputStream(); + in = new BufferedInputStream(raw); + in.skip(startPos); + + int offset = 0; + while(offset < size){ + int bytesRead = in.read(data, offset, size - offset); + while (bytesRead == -1){break;} + offset += bytesRead; + } + } catch (IOException e) { + e.printStackTrace(); + }finally { + raw.close(); + in.close(); + } + return data; + } + + @Override + public int getContentLength() { + if(length != -1){ + return length; + } + length = urlConnection.getContentLength(); + + //if without content-length header + if(length == -1) { + int offset = 0; + InputStream raws = null; + BufferedInputStream ins = null; + try { + raws = urlConnection.getInputStream(); + ins = new BufferedInputStream(raws); + + int max_size = 1024 * 1024;//1M + byte[] data = new byte[max_size]; + + int bytesRead = 0; + while (bytesRead != -1) { + ins.read(data, offset, max_size - offset); + offset += bytesRead; + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + raws.close(); + ins.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + length = offset; + } + return length; + } + + @Override + public void close() { + if(urlConnection != null){ + urlConnection = null; + } + } + +} diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..5078c7608c --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java @@ -0,0 +1,36 @@ +package code03.impl; + +import code03.api.Connection; +import code03.api.ConnectionException; +import code03.api.ConnectionManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +/** + * 获取Connection实例 + */ + +public class ConnectionManagerImpl implements ConnectionManager { + private static final Logger logger = LoggerFactory.getLogger(ConnectionManagerImpl.class); + + @Override + public Connection open(String url) throws ConnectionException { + Connection connection = null; + try { + URL _url = new URL(url); + URLConnection urlConnection = _url.openConnection(); + connection = new ConnectionImpl(urlConnection); + } catch (MalformedURLException e) { + logger.error("url {} format error",url); + } catch (IOException e) { + e.printStackTrace(); + } + return connection; + } + +} diff --git a/group23/769232552/coding/src/test/java/code01/ArrayListTest.java b/group23/769232552/coding/src/test/java/code01/ArrayListTest.java new file mode 100644 index 0000000000..2bfd7f52e1 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code01/ArrayListTest.java @@ -0,0 +1,67 @@ +package code01; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by yaoyuan on 2017/3/8. + */ +public class ArrayListTest { + ArrayList arrayList; + @Before + public void setUp(){ + arrayList = new ArrayList(); + } + + @Test + public void testAdd() throws Exception { + + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + arrayList.add(str); + } + + // size() + Assert.assertEquals(array.length,arrayList.size()); + + //add(),get() + for (int i = 0; i < arrayList.size(); i++){ + Assert.assertEquals(array[i],arrayList.get(i)); + } + } + + @Test + public void testAddWithIndex() throws Exception { + ArrayList arrayList2 = new ArrayList(3);//自动扩容 + String[] array = new String[]{"a","b","c","d","e"}; + for (int i = 0; i < array.length; i++){ + arrayList2.add(i,array[i]); + } + //add(),get() + for (int i = 0; i < arrayList2.size(); i++){ + Assert.assertEquals(array[i],arrayList2.get(i)); + } + arrayList2.add(3,"new"); + Assert.assertEquals("new",arrayList2.get(3)); + + + } + + @Test + public void testRemove() throws Exception { + + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + arrayList.add(str); + } + arrayList.remove(0); + arrayList.remove(0); + + + for (int i = 0; i < arrayList.size(); i++) { + Assert.assertEquals(array[i+2],arrayList.get(i)); + } + + } +} \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java b/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java new file mode 100644 index 0000000000..8c1f4e8e09 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java @@ -0,0 +1,27 @@ +package code01; + +import org.junit.Test; + +/** + * Created by yaoyuan on 2017/3/10. + */ +public class BinaryTreeTest { + + @Test + public void testCreateBinaryTree(){ + + BinaryTree binaryTree1 = new BinaryTree(); + BinaryTree binaryTree2 = new BinaryTree(); + Integer[] array1 = new Integer[]{3,4,1,2,5}; + Integer[] array2 = new Integer[]{3,1,4,5,2}; + binaryTree1.createBinaryTree(array1); + binaryTree2.createBinaryTree(array2); + binaryTree1.leftOrderScan(binaryTree1.getRoot()); + binaryTree2.leftOrderScan(binaryTree2.getRoot()); + } + + @Test + public void testInsert(){ + BinaryTree binaryTree3 = new BinaryTree(); + } +} \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/LinkedListTest.java b/group23/769232552/coding/src/test/java/code01/LinkedListTest.java new file mode 100644 index 0000000000..5481783932 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code01/LinkedListTest.java @@ -0,0 +1,174 @@ +package code01; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by yaoyuan on 2017/3/8. + */ +public class LinkedListTest { + + @Test + public void testAdd() throws Exception { + + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + + // size() + Assert.assertEquals(array.length,linklist.size()); + + //add(),get() + for (int i = 0; i < linklist.size(); i++){ + Assert.assertEquals(array[i],linklist.get(i)); + } + + } + + @Test + public void testAddWithIndex() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + + //add(),get() + for (int i = 0; i < linklist.size(); i++){ + Assert.assertEquals(array[i],linklist.get(i)); + } + + String str = "new"; + linklist.add(0,str); + Assert.assertEquals(str,linklist.get(0)); + + linklist.add(3,str); + Assert.assertEquals(str,linklist.get(3)); + + linklist.add(linklist.size() ,str); + Assert.assertEquals(str,linklist.get(linklist.size()-1)); + } + + @Test + public void testRemove() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + + //remove(),get() + Assert.assertEquals(linklist.remove(0),array[0]); + Assert.assertEquals(linklist.size(),array.length - 1); + + Assert.assertEquals(linklist.remove(linklist.size() - 1),array[array.length-1]); + Assert.assertEquals(linklist.size(),array.length - 2); + + } + + @Test + public void testAddFirst() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + //addFirst(),get() + String str = "new"; + linklist.addFirst(str); + Assert.assertEquals(str,linklist.get(0)); + Assert.assertEquals(linklist.size(),array.length + 1); + } + + @Test + public void testAddLast() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + //addLast(),get() + String str = "new"; + linklist.addLast(str); + Assert.assertEquals(str,linklist.get(linklist.size()-1)); + Assert.assertEquals(linklist.size(),array.length + 1); + } + + @Test + public void testRemoveFirst() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + //removeFirst(),get() + Assert.assertEquals(linklist.removeFirst(),array[0]); + Assert.assertEquals(linklist.size(),array.length - 1); + } + + @Test + public void testRemoveLast() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + //removeLast(),get() + Assert.assertEquals(linklist.removeLast(),array[array.length-1]); + Assert.assertEquals(linklist.size(),array.length - 1); + + } + + @Test + public void testReverse(){ + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + linklist.reverse(); + for(int i=0; i params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("Message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("Message")); + } +} diff --git a/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java b/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java new file mode 100644 index 0000000000..cdc58d24b3 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package code03; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import code03.api.ConnectionManager; +import code03.api.DownloadListener; +import code03.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://litten.me/assets/blogImg/litten.png"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/810181789/src/firstday/ArrayListt.java b/group23/810181789/src/firstday/ArrayListt.java new file mode 100644 index 0000000000..229c588f33 --- /dev/null +++ b/group23/810181789/src/firstday/ArrayListt.java @@ -0,0 +1,86 @@ +package firstday; + +import java.util.Arrays; + +public class ArrayListt { + private Object arr[]=new Object[10]; + private int pos=0; + public boolean add(Object o) + { + if(pos=arr.length) + { + arr=Arrays.copyOf(arr, arr.length+1); + arr[pos] = o; + pos++; + return true; + } + return false; + } + public boolean add(Object o, int index) + { + if(pos=arr.length) + { + arr=Arrays.copyOf(arr, arr.length+1); + for(int i=arr.length-2;i>=index;i--) + { + arr[i+1] = arr[i]; + } + arr[index] = o; + return true; + } + return false; + } + public Object get(int i) + { + Object o = arr[i]; + return o; + } + public Object remove(int index) + { + Object var=arr[index]; + for(int i=index+1;i Date: Wed, 29 Mar 2017 00:39:41 +0800 Subject: [PATCH 028/552] 111111 --- .../com/basic/datastructure/ArrayList.java | 2 - .../basic/week2/litestruts/LoginAction.java | 39 ++ .../com/basic/week2/litestruts/Struts.java | 35 ++ .../basic/week2/litestruts/StrutsTest.java | 43 ++ .../com/basic/week2/litestruts/View.java | 24 + .../basic/week3/datastructure/LinkedList.java | 440 ++++++++++++++++++ 6 files changed, 581 insertions(+), 2 deletions(-) create mode 100644 group23/632678665/com/basic/week2/litestruts/LoginAction.java create mode 100644 group23/632678665/com/basic/week2/litestruts/Struts.java create mode 100644 group23/632678665/com/basic/week2/litestruts/StrutsTest.java create mode 100644 group23/632678665/com/basic/week2/litestruts/View.java create mode 100644 group23/632678665/com/basic/week3/datastructure/LinkedList.java diff --git a/group23/632678665/com/basic/datastructure/ArrayList.java b/group23/632678665/com/basic/datastructure/ArrayList.java index 35fb185737..7669e8fba0 100644 --- a/group23/632678665/com/basic/datastructure/ArrayList.java +++ b/group23/632678665/com/basic/datastructure/ArrayList.java @@ -2,7 +2,6 @@ import java.util.Arrays; -import org.junit.Test; public class ArrayList implements List{ private Object [] array =new Object [15]; @@ -60,5 +59,4 @@ public int size() { Object [] newArray; return newArray=Arrays.copyOf(o, (int) (o.length*1.5)); } - } diff --git a/group23/632678665/com/basic/week2/litestruts/LoginAction.java b/group23/632678665/com/basic/week2/litestruts/LoginAction.java new file mode 100644 index 0000000000..80133805ac --- /dev/null +++ b/group23/632678665/com/basic/week2/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.basic.week2.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group23/632678665/com/basic/week2/litestruts/Struts.java b/group23/632678665/com/basic/week2/litestruts/Struts.java new file mode 100644 index 0000000000..0b1a7c03f0 --- /dev/null +++ b/group23/632678665/com/basic/week2/litestruts/Struts.java @@ -0,0 +1,35 @@ +package com.basic.week2.litestruts; + + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group23/632678665/com/basic/week2/litestruts/StrutsTest.java b/group23/632678665/com/basic/week2/litestruts/StrutsTest.java new file mode 100644 index 0000000000..5549100269 --- /dev/null +++ b/group23/632678665/com/basic/week2/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.basic.week2.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/632678665/com/basic/week2/litestruts/View.java b/group23/632678665/com/basic/week2/litestruts/View.java new file mode 100644 index 0000000000..7260afd69b --- /dev/null +++ b/group23/632678665/com/basic/week2/litestruts/View.java @@ -0,0 +1,24 @@ +package com.basic.week2.litestruts; + + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/632678665/com/basic/week3/datastructure/LinkedList.java b/group23/632678665/com/basic/week3/datastructure/LinkedList.java new file mode 100644 index 0000000000..569831704d --- /dev/null +++ b/group23/632678665/com/basic/week3/datastructure/LinkedList.java @@ -0,0 +1,440 @@ +package com.basic.week3.datastructure; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private int size = 0; + // 头结点 + private Node head; + // 尾结点 + private Node tail; + + private void rangeCheck(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + } + +// public void add(Object o) { +// Node node = new Node(o, null); +// if (head == null) { +// head = tail = node; +// } +// Node oldTail = tail; +// tail = node; +// oldTail.next = tail; +// size++; +// } + + public void add(int index, Object o) { + rangeCheck(index); + if (index == size) { + this.add(o); + } else { + // 保存index处节点 + Node x = head; + // 保存index-1处的节点 + Node y = null; + for (int i = 0; i < index; i++) { + y = x; + x = x.next; + } + Node node = new Node(o, x); + y.next = node; + size++; + } + } + + public Object get(int index) { + rangeCheck(index); + Node x = head; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x.data; + } + + public Object remove(int index) { + rangeCheck(index); + Object removeData; + if (index == 0) { + removeData = removeFirst(); + } else if (index == size - 1) { + removeData = removeLast(); + } else { + Node x = head; + Node y = head; + for (int i = 0; i < index; i++) { + y = x; + x = x.next; + } + y.next = x.next; + size--; + removeData = x.data; + } + return removeData; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o) { + Node oldHead = head; + head = new Node(o, oldHead); + size++; + } + + public void addLast(Object o) { + Node oldTail = tail; + tail = new Node(o, null); + oldTail.next = tail; + size++; + } + + public Object removeFirst() { + Node next = head.next; + Object data = head.data; + head.data = null; + head.next = null; + head = next; + size--; + return data; + } + + public Object removeLast() { + Node oldTail = tail; + Node temp = head; + for (int i = 0; i < size - 2; i++) { + temp = temp.next; + } + tail = temp; + size--; + return oldTail.data; + } + + public void clear() { + for (Node x = head; x != null;) { + Node next = x.next; + x.data = null; + x.next = null; + x = next; + } + head = tail = null; + size = 0; + } + + public Object getTail() { + Node l = tail; + // 如果链表为空 + if (l == null) { + throw new NoSuchElementException(); + } + return l.data; + } + + public Object getHead() { + Node l = head; + // 如果链表为空 + if (l == null) { + throw new NoSuchElementException(); + } + return l.data; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + } + + private class LinkedListIterator implements Iterator { + Node x = head; + + @Override + public boolean hasNext() { + return x != null; + } + + @Override + public Object next() { + Object data = x.data; + x = x.next; + return data; + } + + } + + /** + * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + Object[] temp = new Object[size]; + for (int i = 0; i < size; i++) { + temp[i] = this.get(i); + } + this.clear(); + for (int i = temp.length - 1; i >= 0; i--) { + this.add(temp[i]); + } + } + + /** + * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 + * ,删除以后的值为7,8,10 + * + */ + public void removeFirstHalf() { + int s = size; + for (int i = 0; i < s / 2; i++) { + this.removeFirst(); + } + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + * @throws Exception + */ + public void remove(int i, int length) throws Exception { + if (i + length > size) { + throw new Exception(); + } + for (int j = i; j < i + length; j++) { + this.remove(i); + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = + * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + * @throws Exception + */ + public int[] getElements(LinkedList list) throws Exception { + if ((int) list.getTail() > this.size()) { + throw new Exception(); + } + int[] temp = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + temp[i] = (int) this.get((int) list.get(i)); + } + return temp; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 从当前链表中中删除在list中出现的元素 + * + * @param list + */ + + public void subtract(LinkedList list) { + Node x = head; + Node y = list.head; + while (x != null && y != null) { + if ((int) x.data < (int) y.data) { + x = x.next; + continue; + } + if ((int) x.data == (int) y.data) { + Node next = x.next; + continue; + } + if ((int) x.data > (int) y.data) { + y = y.next; + continue; + } + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() { + for (Node x = head; x != null;) { + Node next = x.next; + if (next == null) { + return; + } + if (x.data == next.data) { + x.next = next.next; + size--; + } else { + x = x.next; + } + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * + * @param min + * @param max + */ + public void removeRange(int min, int max) { + if ((int) this.getTail() < min) { + this.clear(); + } + + if ((int) this.getHead() > max) { + return; + } + + for (Node x = head; x != null; x = x.next) { + if ((int) x.data <= min) { + continue; + } + + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * + * @param list + */ + public LinkedList intersection(LinkedList list) { + LinkedList linkedList = new LinkedList(); + Node x = head; + Node y = list.head; + while (x != null && y != null) { + if ((int) x.data < (int) y.data) { + x = x.next; + continue; + } + if ((int) x.data == (int) y.data) { + linkedList.add(x.data); + x = x.next; + y = y.next; + continue; + } + if ((int) x.data > (int) y.data) { + y = y.next; + continue; + } + } + return linkedList; + } + + @Override + public boolean isEmpty() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean contains(Object o) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object[] toArray() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object[] toArray(Object[] a) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean remove(Object o) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean containsAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addAll(int index, Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean removeAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean retainAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object set(int index, Object element) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int indexOf(Object o) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int lastIndexOf(Object o) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public ListIterator listIterator() { + // TODO Auto-generated method stub + return null; + } + + @Override + public ListIterator listIterator(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public List subList(int fromIndex, int toIndex) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean add(Object e) { + // TODO Auto-generated method stub + return false; + } +} From d8915f69eb62ca46dd06f58b3cc25bf60ec887b1 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Wed, 29 Mar 2017 09:08:00 +0800 Subject: [PATCH 029/552] leetcode leetcode --- .../me/leetcode/algorithms/AddTwoNums.java | 84 +++++++ ...stSubstringWithoutRepeatingCharacters.java | 229 ++++++++++++++++++ .../coding/me/leetcode/algorithms/TwoSum.java | 81 +++++++ 3 files changed, 394 insertions(+) create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/AddTwoNums.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestSubstringWithoutRepeatingCharacters.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/AddTwoNums.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/AddTwoNums.java new file mode 100644 index 0000000000..0ac6d7419f --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/AddTwoNums.java @@ -0,0 +1,84 @@ +package com.coding.me.leetcode.algorithms; + +public class AddTwoNums { + + public ListNode mySolution(ListNode l1, ListNode l2) { + int carry = 0; + ListNode ret = null; + ListNode first = null; + while(l1 != null || l2 != null){ + int i = l1 == null?0 : l1.val; + int j = l2 == null?0 : l2.val; + int sum = i + j + carry; + if(sum >= 10){ + carry = 1; + sum -= 10; + }else{ + carry = 0; + } + if(ret == null){ + ret = new ListNode(sum); + first = ret; + }else{ + ret.next = new ListNode(sum); + ret = ret.next; + } + if(l1 != null){ + l1 = l1.next; + } + if(l2 != null){ + l2 = l2.next; + } + } + if(carry > 0){ + ret.next = new ListNode(carry); + } + return first; + } + + public ListNode leetcodeSolution(ListNode l1, ListNode l2) { + ListNode dummyHead = new ListNode(0); + ListNode p = l1, q = l2, curr = dummyHead; + int carry = 0; + while (p != null || q != null) { + int x = (p != null) ? p.val : 0; + int y = (q != null) ? q.val : 0; + int sum = carry + x + y; + carry = sum / 10; + curr.next = new ListNode(sum % 10); + curr = curr.next; + if (p != null) p = p.next; + if (q != null) q = q.next; + } + if (carry > 0) { + curr.next = new ListNode(carry); + } + return dummyHead.next; + } + + public static void main(String[] args) { + ListNode l11 = new ListNode(2); + ListNode l12 = new ListNode(4); + ListNode l13 = new ListNode(3); + l11.next = l12; + l12.next = l13; + + ListNode l21 = new ListNode(5); + ListNode l22 = new ListNode(6); + ListNode l23 = new ListNode(4); + l21.next = l22; + l22.next = l23; + + ListNode ret = new AddTwoNums().mySolution(l11, l21); + while(ret != null){ + System.out.println(ret.val); + ret = ret.next; + } + } +} + +class ListNode { + int val; + ListNode next; + ListNode(int x) { val = x; } +} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestSubstringWithoutRepeatingCharacters.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestSubstringWithoutRepeatingCharacters.java new file mode 100644 index 0000000000..4cc3a5667b --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestSubstringWithoutRepeatingCharacters.java @@ -0,0 +1,229 @@ +package com.coding.me.leetcode.algorithms; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Given a string, find the length of the longest substring without repeating + * characters. + * + * Examples: + * + * Given "abcabcbb", the answer is "abc", which the length is 3. + * + * Given "bbbbb", the answer is "b", with the length of 1. + * + * Given "pwwkew", the answer is "wke", with the length of 3. Note that the + * answer must be a substring, "pwke" is a subsequence and not a substring. + * + * @author hewj + * + */ +public class LongestSubstringWithoutRepeatingCharacters { + + public int mySolution(String s) { + if(s == null){ + return 0; + }else if(s.length() <= 1){ + return s.length(); + } + char[] chars = s.toCharArray(); + char[] tmp = new char[chars.length]; + int maxLength = 1; + int length, k; + for(int i=0;i set = new HashSet<>(); + for (int i = start; i < end; i++) { + Character ch = s.charAt(i); + if (set.contains(ch)) return false; + set.add(ch); + } + return true; + } + + /** + * Sliding Window + * The naive approach is very straightforward. But it is too slow. So how + * can we optimize it? + * + * In the naive approaches, we repeatedly check a substring to see if it has + * duplicate character. But it is unnecessary. If a substring S​ij ​​ from + * index i i to j 1 j−1 is already checked to have no duplicate characters. + * We only need to check if s[j] is already in the substring S​ij ​​ . + * + * To check if a character is already in the substring, we can scan the + * substring, which leads to an O(n^2) algorithm. But we can do better. + * + * By using HashSet as a sliding window, checking if a character in the + * current can be done in O 1 O(1). + * + * A sliding window is an abstract concept commonly used in array/string + * problems. A window is a range of elements in the array/string which + * usually defined by the start and end indices, i.e. i j [i,j) + * (left-closed, right-open). A sliding window is a window "slides" its two + * boundaries to the certain direction. For example, if we slide i j [i,j) + * to the right by 1 1 element, then it becomes i 1 j 1 [i+1,j+1) + * (left-closed, right-open). + * + * Back to our problem. We use HashSet to store the characters in current + * window i j [i,j) ( j i j=i initially). Then we slide the index j j to the + * right. If it is not in the HashSet, we slide j j further. Doing so until + * s[j] is already in the HashSet. At this point, we found the maximum size + * of substrings without duplicate characters start with index i i. If we do + * this for all i i, we get our answer. + * + * Time complexity : O(2n)=O(n). In the worst case each character will be + * visited twice by i and j. + * + * Space complexity : O(min(m,n)). Same as the previous approach. We need + * O(k) space for the sliding window, where k is the size of the Set. The + * size of the Set is upper bounded by the size of the string n n and the + * size of the charset/alphabet m m. + * + * @param s + * @return + */ + public int leetcodeSolution2(String s) { + int n = s.length(); + Set set = new HashSet<>(); + int ans = 0, i = 0, j = 0; + while (i < n && j < n) { + // try to extend the range [i, j] + if (!set.contains(s.charAt(j))){ + set.add(s.charAt(j++)); + ans = Math.max(ans, j - i); + } + else { + set.remove(s.charAt(i++)); + } + } + return ans; + } + + /** + * Sliding Window Optimized + * + * The above solution requires at most 2n steps. In fact, it could be + * optimized to require only n steps. Instead of using a set to tell if a + * character exists or not, we could define a mapping of the characters to + * its index. Then we can skip the characters immediately when we found a + * repeated character. + * + * The reason is that if s[j] have a duplicate in the range [i,j) + * with index j ​′ ​​ , we don't need to increase i little by little. + * We can skip all the elements in the range [i,j ​′ ​​ ] and let i i + * to be j ​′+1 directly. + * + * @param s + * @return + */ + public int leetCodeSolution3(String s){ + int n = s.length(), ans = 0; + Map map = new HashMap<>(); // current index of character + // try to extend the range [i, j] + for (int j = 0, i = 0; j < n; j++) { + if (map.containsKey(s.charAt(j))) { + i = Math.max(map.get(s.charAt(j)), i); + } + ans = Math.max(ans, j - i + 1); + map.put(s.charAt(j), j + 1); + } + return ans; + } + + /** + * Java (Assuming ASCII 128) + * + * The previous implements all have no assumption on the charset of the + * string s. + * + * If we know that the charset is rather small, we can replace the Map with + * an integer array as direct access table. + * + * Commonly used tables are: + * + * int[26] for Letters 'a' - 'z' or 'A' - 'Z' + * int[128] for ASCII + * int[256] for Extended ASCII + * + * @param s + * @return + */ + public int leetCodeSolution4(String s) { + int n = s.length(), ans = 0; + int[] index = new int[128]; // current index of character + // try to extend the range [i, j] + for (int j = 0, i = 0; j < n; j++) { + i = Math.max(index[s.charAt(j)], i); + ans = Math.max(ans, j - i + 1); + index[s.charAt(j)] = j + 1; + } + return ans; + } + + + private LongestSubstringWithoutRepeatingCharacters lswrc; + @Before + public void setup(){ + lswrc = new LongestSubstringWithoutRepeatingCharacters(); + } + + @Test + public void testMySolution(){ + Assert.assertEquals(3, lswrc.mySolution("abcabcbb")); + Assert.assertEquals(4, lswrc.mySolution("abcdabcdbbd")); + } + + @Test + public void testLeetcodeSolution3(){ + Assert.assertEquals(3, lswrc.leetCodeSolution3("abcabcbb")); + Assert.assertEquals(4, lswrc.leetCodeSolution3("abcdabcdbbd")); + } + + @Test + public void testLeetcodeSolution4(){ + Assert.assertEquals(3, lswrc.leetCodeSolution4("abcabcbb")); +// Assert.assertEquals(4, lswrc.leetCodeSolution4("abcdabcdbbd")); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java new file mode 100644 index 0000000000..45e4727ec7 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java @@ -0,0 +1,81 @@ +package com.coding.me.leetcode.algorithms; + +import java.util.HashMap; +import java.util.Map; + +/** + * Given an array of integers, return indices of the two numbers such that + * they add up to a specific target. + * + * You may assume that each input would have exactly one solution, and you + * may not use the same element twice. + * + * Example: Given nums = [2, 7, 11, 15], target = 9, + * + * Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. Subscribe to see + * which companies asked this question. + */ +public class TwoSum { + /** + * Time complexity : O(n^2) + * Space complexity : O(1) + * @param nums + * @param target + * @return + */ + public int[] mySolution(int[] nums, int target) { + int[] ret = new int[2]; + for(int i=0;i map = new HashMap<>(); + for (int i = 0; i < nums.length; i++) { + map.put(nums[i], i); + } + for (int i = 0; i < nums.length; i++) { + int complement = target - nums[i]; + if (map.containsKey(complement) && map.get(complement) != i) { + return new int[] { i, map.get(complement) }; + } + } + throw new IllegalArgumentException("No two sum solution"); + } + + /** + * one pass hash table + * Time complexity : O(n) + * Space complexity : O(n) + * @param nums + * @param target + * @return + */ + public int[] leetCodeSolution2(int[] nums, int target) { + Map map = new HashMap<>(); + for (int i = 0; i < nums.length; i++) { + int complement = target - nums[i]; + if (map.containsKey(complement)) { + return new int[] { map.get(complement), i }; + } + map.put(nums[i], i); + } + throw new IllegalArgumentException("No two sum solution"); + } +} From f18705fc174cc3e4ee74668b63c6b21a3ef03ae0 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Wed, 29 Mar 2017 09:32:31 +0800 Subject: [PATCH 030/552] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=AC=A1merge?= =?UTF-8?q?=E5=90=8E=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第三次merge后提交 --- .../coderising/download/DownloadThread.java | 0 .../coderising/download/FileDownloader.java | 0 .../download/FileDownloaderTest.java | 0 .../coderising/download/api/Connection.java | 0 .../download/api/ConnectionException.java | 5 +- .../download/api/ConnectionManager.java | 0 .../download/api/DownloadListener.java | 0 .../download/impl/ConnectionImpl.java | 0 .../download/impl/ConnectionManagerImpl.java | 0 .../coderising/litestruts/LoginAction.java | 0 .../src/com/coderising/litestruts/Struts.java | 0 .../com/coderising/litestruts/StrutsTest.java | 0 .../src/com/coderising/litestruts/View.java | 0 .../src/com/coding/basic/BinaryTreeNode.java | 0 .../src/com/coding/basic/Iterator.java | 0 .../src/com/coding/basic/List.java | 0 .../src/com/coding/basic/Queue.java | 2 + .../src/com/coding/basic/Stack.java | 2 + .../com/coding/basic/array}/ArrayList.java | 5 +- .../com/coding/basic}/array/ArrayUtil.java | 2 +- .../coding/basic/linklist/LRUPageFrame.java | 112 ++++++++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 57 +++++++++ .../coding/basic/linklist}/LinkedList.java | 5 +- .../src/com/coding/me/Palindrome.java | 82 +++++++++++++ .../algorithms/MedianOfTwoSortedArrays.java | 74 ++++++++++++ .../test/com/coding/basic/TestArrayList.java | 3 +- .../com/coding/basic/TestBinaryTreeNode.java | 0 .../test/com/coding/basic/TestLinkedList.java | 4 +- .../jvm/loader/ClassFileLoader.java | 74 ++++++++++++ .../jvm/test/ClassFileloaderTest.java | 92 ++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 +++++ 31 files changed, 540 insertions(+), 7 deletions(-) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/DownloadThread.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/FileDownloader.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/FileDownloaderTest.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/api/Connection.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/api/ConnectionException.java (61%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/api/ConnectionManager.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/api/DownloadListener.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/impl/ConnectionImpl.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/download/impl/ConnectionManagerImpl.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/litestruts/LoginAction.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/litestruts/Struts.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/litestruts/StrutsTest.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coderising/litestruts/View.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coding/basic/BinaryTreeNode.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coding/basic/Iterator.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coding/basic/List.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coding/basic/Queue.java (89%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/com/coding/basic/Stack.java (94%) rename group23/1028361767/{Week1DataStructure/src/com/coding/basic => data-structure/src/com/coding/basic/array}/ArrayList.java (95%) rename group23/1028361767/{Week1DataStructure/src/com/coderising => data-structure/src/com/coding/basic}/array/ArrayUtil.java (99%) create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java rename group23/1028361767/{Week1DataStructure/src/com/coding/basic => data-structure/src/com/coding/basic/linklist}/LinkedList.java (98%) create mode 100644 group23/1028361767/data-structure/src/com/coding/me/Palindrome.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java rename group23/1028361767/{Week1DataStructure => data-structure}/src/test/com/coding/basic/TestArrayList.java (97%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/test/com/coding/basic/TestBinaryTreeNode.java (100%) rename group23/1028361767/{Week1DataStructure => data-structure}/src/test/com/coding/basic/TestLinkedList.java (97%) create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/DownloadThread.java b/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/DownloadThread.java rename to group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java b/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloader.java rename to group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloaderTest.java b/group23/1028361767/data-structure/src/com/coderising/download/FileDownloaderTest.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/FileDownloaderTest.java rename to group23/1028361767/data-structure/src/com/coderising/download/FileDownloaderTest.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/api/Connection.java b/group23/1028361767/data-structure/src/com/coderising/download/api/Connection.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/api/Connection.java rename to group23/1028361767/data-structure/src/com/coderising/download/api/Connection.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionException.java b/group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionException.java similarity index 61% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionException.java rename to group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionException.java index 1551a80b3d..112d1156e8 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionException.java +++ b/group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionException.java @@ -1,5 +1,8 @@ package com.coderising.download.api; public class ConnectionException extends Exception { - + + public ConnectionException(Exception e){ + super(e); + } } diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionManager.java b/group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionManager.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/api/ConnectionManager.java rename to group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionManager.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/api/DownloadListener.java b/group23/1028361767/data-structure/src/com/coderising/download/api/DownloadListener.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/api/DownloadListener.java rename to group23/1028361767/data-structure/src/com/coderising/download/api/DownloadListener.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionImpl.java b/group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionImpl.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionImpl.java rename to group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionImpl.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionManagerImpl.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/download/impl/ConnectionManagerImpl.java rename to group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/LoginAction.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/LoginAction.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/LoginAction.java rename to group23/1028361767/data-structure/src/com/coderising/litestruts/LoginAction.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/Struts.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/Struts.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/Struts.java rename to group23/1028361767/data-structure/src/com/coderising/litestruts/Struts.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/StrutsTest.java rename to group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coderising/litestruts/View.java rename to group23/1028361767/data-structure/src/com/coderising/litestruts/View.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java b/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coding/basic/BinaryTreeNode.java rename to group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java b/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coding/basic/Iterator.java rename to group23/1028361767/data-structure/src/com/coding/basic/Iterator.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java b/group23/1028361767/data-structure/src/com/coding/basic/List.java similarity index 100% rename from group23/1028361767/Week1DataStructure/src/com/coding/basic/List.java rename to group23/1028361767/data-structure/src/com/coding/basic/List.java diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java b/group23/1028361767/data-structure/src/com/coding/basic/Queue.java similarity index 89% rename from group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java rename to group23/1028361767/data-structure/src/com/coding/basic/Queue.java index bb24e2132e..ddd1b74d90 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Queue.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/Queue.java @@ -1,5 +1,7 @@ package com.coding.basic; +import com.coding.basic.linklist.LinkedList; + public class Queue { private LinkedList linkedList = new LinkedList(); diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java b/group23/1028361767/data-structure/src/com/coding/basic/Stack.java similarity index 94% rename from group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java rename to group23/1028361767/data-structure/src/com/coding/basic/Stack.java index 55c96985a9..a98f5d76a5 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/Stack.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/Stack.java @@ -2,6 +2,8 @@ import java.util.EmptyStackException; +import com.coding.basic.array.ArrayList; + public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java similarity index 95% rename from group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java rename to group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java index da0237bdf7..43bdae82fa 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/ArrayList.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java @@ -1,7 +1,10 @@ -package com.coding.basic; +package com.coding.basic.array; import java.util.Arrays; +import com.coding.basic.Iterator; +import com.coding.basic.List; + public class ArrayList implements List { private int size = 0; diff --git a/group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java similarity index 99% rename from group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java rename to group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java index e497a8e251..8e1b170dc0 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coderising/array/ArrayUtil.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java @@ -1,4 +1,4 @@ -package com.coderising.array; +package com.coding.basic.array; import java.util.Arrays; diff --git a/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..50bfb30412 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,112 @@ +package com.coding.basic.linklist; + +/** + * 用双向链表实现LRU算法 + * @author liuxin + * + */ +public class LRUPageFrame { + + private static class Node { + + Node prev; + Node next; + int pageNum; + + Node(int pageNum) { + this.pageNum = pageNum; + } + } + + private int capacity; + + + private Node first;// 链表头 + private Node last;// 链表尾 + + private int size; + + + public LRUPageFrame(int capacity) { + + this.capacity = capacity; + + } + + /** + * 获取缓存中对象 + * + * @param key + * @return + */ + public void access(int pageNum) { + /** + * 1、链表为空,直接插入first + * 2、链表未满,往链尾追加 + * 3、链表已满,判断链表中是否存在pageNum,若存在,把pageNum,移到链尾;若不存在,把链头删除,把pageNum追加到链尾 + */ + Node newNode = new Node(pageNum); + if(size < capacity){ + if(size == 0){ + first = newNode; + }else{ + last.next = newNode; + newNode.prev = last; + } + last = newNode; + size++; + return ; + } + Node existNode = null; + Node tmp = first; + do{ + if(tmp.pageNum == pageNum){ + existNode = tmp; + } + tmp = tmp.next; + }while(tmp != null); + if(existNode == null || existNode == first){ + tmp = first.next; + tmp.prev = null; + first = tmp;//链首变为链首后一个节点 + last.next = newNode; + newNode.prev = last; + last = newNode;//链尾追加新节点 + }else if(existNode == last){ + return ; + }else{ + /** + * 已存在节点的上一个节点的下一个节点指向已存在节点的下一个节点 + * + */ + Node prev = existNode.prev; + Node next = existNode.next; + prev.next = next; + next.prev = prev; + if(prev.prev == null){ + first = prev; + } + newNode.prev = last; + last.next = newNode; + last = newNode; + existNode = null; + } + } + + + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + Node node = last; + while(node != null){ + buffer.append(node.pageNum); + + node = node.prev; + if(node != null){ + buffer.append(","); + } + } + return buffer.toString(); + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..c4645c6869 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,57 @@ +package com.coding.basic.linklist; + +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()); + } + + @Test + public void testAccessCustom() { + LRUPageFrame frame = new LRUPageFrame(5); + frame.access(7); + frame.access(0); + frame.access(1); + frame.access(5); + frame.access(3); + Assert.assertEquals("3,5,1,0,7", frame.toString()); + frame.access(2); + Assert.assertEquals("2,3,5,1,0", frame.toString()); + frame.access(0); + Assert.assertEquals("0,2,3,5,1", frame.toString()); + frame.access(0); + Assert.assertEquals("0,2,3,5,1", frame.toString()); + frame.access(3); + Assert.assertEquals("3,0,2,5,1", frame.toString()); + frame.access(0); + Assert.assertEquals("0,3,2,5,1", frame.toString()); + frame.access(4); + Assert.assertEquals("4,0,3,2,5", frame.toString()); + frame.access(5); + Assert.assertEquals("5,4,0,3,2", frame.toString()); + frame.access(2); + Assert.assertEquals("2,5,4,0,3", frame.toString()); + } +} diff --git a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LinkedList.java similarity index 98% rename from group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java rename to group23/1028361767/data-structure/src/com/coding/basic/linklist/LinkedList.java index eb41670f82..b6f57e977d 100644 --- a/group23/1028361767/Week1DataStructure/src/com/coding/basic/LinkedList.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/linklist/LinkedList.java @@ -1,8 +1,11 @@ -package com.coding.basic; +package com.coding.basic.linklist; import java.util.NoSuchElementException; +import com.coding.basic.Iterator; +import com.coding.basic.List; + public class LinkedList implements List { private Node head; diff --git a/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java b/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java new file mode 100644 index 0000000000..2de0c4370d --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java @@ -0,0 +1,82 @@ +package com.coding.me; + +/** + * 回文 + * + */ +public class Palindrome { + + private static String oddCase(char[] chars, int index) { + int maxLength = 1; + int i = 1; + while((index - i) >= 0 && (index + i) < chars.length - 1){ + if(chars[index - i] != chars[index + i]){ + break; + } + maxLength += 2; + i++; + } + return String.valueOf(chars, index + 1 - i, maxLength); + } + + private static String evenCase(char[] chars, int index) { + int maxLength = 0; + int i = 0; + while((index - i) >= 0 && (index + 1 + i) <= chars.length - 1){ + if(chars[index - i] != chars[index + 1 + i]){ + break; + } + i++; + maxLength += 2; + } + return String.valueOf(chars, index + 1 - i, maxLength); + } + + public static String findLongestPalindrome(String s){ + char[] chars = s.toCharArray(); + String longestPalindrome = ""; + String tmp = ""; + for(int i=0;i clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + className = castClassName(className); + File file = null; + FileInputStream fis = null; + for(String clzPath : clzPaths){ + file = new File((clzPath + className)); + try { + fis = new FileInputStream(file); + byte[] bytes = new byte[2048]; + int i = 0; + int sum = 0; + while((i = fis.read(bytes)) != -1){ + sum += i; + } + fis.close(); + return Arrays.copyOf(bytes, sum); + } catch (FileNotFoundException e) { + continue; + } catch (IOException e) { + e.printStackTrace(); + } + } + return new byte[0]; + } + + private String castClassName(String className) { + String[] packs = className.split("\\."); + StringBuilder sb = new StringBuilder("/"); + for(int i=0;i Date: Wed, 29 Mar 2017 13:18:25 +0800 Subject: [PATCH 031/552] update update --- .../main/java/code03/impl/ConnectionImpl.java | 1 - .../src/main/java/code04/LRUPageFrame.java | 162 ++++++++++++++++++ .../java/mini_jvm/loader/ClassFileLoader.java | 108 ++++++++++++ .../test/java/code04/LRUPageFrameTest.java | 38 ++++ .../java/mini_jvm/ClassFileloaderTest.java | 71 ++++++++ .../src/test/java/mini_jvm/EmployeeV1.java | 28 +++ 6 files changed, 407 insertions(+), 1 deletion(-) create mode 100644 group23/769232552/coding/src/main/java/code04/LRUPageFrame.java create mode 100644 group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java create mode 100644 group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java create mode 100644 group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java create mode 100644 group23/769232552/coding/src/test/java/mini_jvm/EmployeeV1.java diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java index 069f21625b..ce69eceb99 100644 --- a/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java +++ b/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java @@ -36,7 +36,6 @@ public byte[] read(int startPos, int endPos) throws IOException { InputStream raw = null; BufferedInputStream in = null; int size = endPos - startPos + 1; - byte[] data = new byte[size]; try{ raw = urlConnection.getInputStream(); diff --git a/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java b/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java new file mode 100644 index 0000000000..0ffce58b83 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java @@ -0,0 +1,162 @@ +package code04; + +/** + * 用双向链表实现LRU算法 + */ +public class LRUPageFrame { + + private class Node { + + Node prev; + Node next; + int pageNum; + Node() { + } + } + + private int size; + private int capacity; + + private Node first;// 链表头 + private Node last;// 链表尾 + + public LRUPageFrame(int capacity) { + this.capacity = capacity; + this.size = 0; + } + + /** + * 获取缓存中对象 + * 1、如果缓存中不存在,则直接加入表头 + * 2、如果缓存中存在,则把该对象移动到表头 + * @param pageNum + * @return + */ + public void access(int pageNum) { + Node node = hasContains(pageNum); + if(node != null){ + moveToHead(node); + }else { + addToHead(pageNum); + } + + } + + /** + * 对象是否存在缓存中,如存在则返回该对象在链表中的位置,否则返回null + * @return + */ + private Node hasContains(int key){ + Node node = this.first; + while (node != null){ + if(node.pageNum == key){ + return node; + } + node = node.next; + } + return node; + } + + /** + * 对象加入表头,先先判断缓存是否已经满了 + * @return + */ + private void addToHead(int key){ + Node node = new Node(); + node.pageNum = key; + if(size < capacity){ + addFirst(node); + }else { + removeLast(); + addFirst(node); + } + + } + + + /** + * 对象移动到表头 + * @return + */ + private void moveToHead(Node node){ + if(node == first){ + return; + } + if(node == last){ + node.next = first; + first.prev = node; + first = node; + last = node.prev; + last.next = null; + node.prev = null; + return; + } + node.prev.next = node.next; + node.next.prev = node.prev; + node.next = first; + node.prev = null; + first.prev = node; + first = node; + } + + /** + * 删除表尾 + * @return + */ + private void removeLast(){ + if(last != null){ + Node newLast = last.prev; + last.prev = null; + last = newLast; + last.next = null; + size --; + } + } + /** + * 添加元素到表头 + * @return + */ + private void addFirst(Node node){ + //0个节点 + if(first == null){ + first = node; + last = node; + size ++; + return; + } + //一个节点 + else if(first == last){ + first = node; + first.next = last; + last.prev = first; + size ++; + return; + }else { + node.next = first; + first.prev = node; + first = node; + size ++; + } + } + /** + * 当前链表空间 + * @return + */ + public int getSize() { + return size; + } + + 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/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java b/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..81e6973856 --- /dev/null +++ b/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java @@ -0,0 +1,108 @@ +package mini_jvm.loader; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + + + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + /** + * 读取class文件的二进制代码 + * @param className + * @return + */ + public byte[] readBinaryCode(String className) { + String clazzPath = getClassPath(className); + BufferedInputStream bins = null; + ByteArrayOutputStream bouts = new ByteArrayOutputStream(); + try { + bins = new BufferedInputStream(new FileInputStream(new File(clazzPath))); + byte[] buffer = new byte[1024]; + int length = -1; + while((length = bins.read(buffer)) != -1){ + bouts.write(buffer, 0, length); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + byte[] codes = bouts.toByteArray(); + //关闭流 + try { + if(bins != null){ + //调用外层流的close方法就关闭其装饰的内层流 + bins.close(); + } + if(bouts != null){ + bouts.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return codes; + } + + /** + * 从扫描根目录,获取指定类的绝对路径 + * @param className + * @return + */ + private String getClassPath(String className){ + String clazzPath = null; + //遍历clzPaths中所有路径 + for (String path : this.clzPaths){ + File file = new File(path); + clazzPath = getClassPath(className,file); + if(clazzPath!=null) break; + } + return clazzPath; + } + + private String getClassPath(String className, File file){ + String clazzPath = null; + if(file.exists()){ + //如果是目录,则遍历所有目录下的文件 + if(file.isDirectory()){ + File[] fs = file.listFiles(); + for (File f : fs){ + clazzPath = getClassPath(className,f); + } + }else { + //检查是否是该类对应的class文件 + if(isClazzFile(file.getName(),className)){ + clazzPath = file.getAbsolutePath(); + } + } + } + return clazzPath; + } + + private boolean isClazzFile(String filename , String className){ + String fileClazzName = null; + String [] names = filename.split("\\."); + if(names.length > 0){ + fileClazzName = names[0]; + } + return className.endsWith(fileClazzName); + } + + public void addClassPath(String path) { + clzPaths.add(path); + } + + public String getClassPath(){ + StringBuilder sb = new StringBuilder(); + int i = 0; + for (; i < clzPaths.size() - 1; i++) { + sb.append(clzPaths.get(i)); + sb.append(";"); + } + sb.append(clzPaths.get(i)); + return sb.toString(); + } +} diff --git a/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java b/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java new file mode 100644 index 0000000000..7448e3ee56 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java @@ -0,0 +1,38 @@ +package code04; + +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); + //1,0,7 + Assert.assertEquals("1,0,7", frame.toString()); + frame.access(2); + //2,1,0 + Assert.assertEquals("2,1,0", frame.toString()); + frame.access(0); + //0,2,1 + Assert.assertEquals("0,2,1", frame.toString()); + frame.access(0); + //0,2,1 + Assert.assertEquals("0,2,1", frame.toString()); + frame.access(3); + //3,0,2 + Assert.assertEquals("3,0,2", frame.toString()); + frame.access(0); + //0,3,2 + Assert.assertEquals("0,3,2", frame.toString()); + frame.access(4); + //4,0,3 + Assert.assertEquals("4,0,3", frame.toString()); + } + +} diff --git a/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java b/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java new file mode 100644 index 0000000000..9602743b02 --- /dev/null +++ b/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java @@ -0,0 +1,71 @@ +package mini_jvm; + +import mini_jvm.loader.ClassFileLoader; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ClassFileloaderTest { + + + static String path1 = "D:\\worksapce\\gitRepo\\java_coding2017\\coding2017\\group23\\769232552\\coding\\target\\classes"; + static String path2 = "D:\\worksapce\\gitRepo\\java_coding2017\\coding2017\\group23\\769232552\\coding\\target\\test-classes"; + + + ClassFileLoader loader = new ClassFileLoader(); + + @Before + public void setUp() throws Exception { + loader.addClassPath(path1); + loader.addClassPath(path2); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + String clzPath = loader.getClassPath(); + Assert.assertEquals(path1+";"+path2,clzPath); + } + + @Test + public void testClassFileLength() { + String className = "mini_jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + Assert.assertEquals(1026, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + String className = "mini_jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + String acctualValue = this.byteToHexString(codes); + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Wed, 29 Mar 2017 15:19:35 +0800 Subject: [PATCH 032/552] week3 --- .../basic/week3/datastructure/LinkedList.java | 6 ++ .../com/basic/week3/download/Demo.java | 36 +++++++ .../basic/week3/download/DownloadThread.java | 31 ++++++ .../basic/week3/download/FileDownloader.java | 97 +++++++++++++++++++ .../week3/download/FileDownloaderTest.java | 59 +++++++++++ .../basic/week3/download/api/Connection.java | 24 +++++ .../download/api/ConnectionException.java | 12 +++ .../week3/download/api/ConnectionManager.java | 10 ++ .../week3/download/api/DownloadListener.java | 5 + .../week3/download/impl/ConnectionImpl.java | 59 +++++++++++ .../download/impl/ConnectionManagerImpl.java | 35 +++++++ 11 files changed, 374 insertions(+) create mode 100644 group23/632678665/com/basic/week3/download/Demo.java create mode 100644 group23/632678665/com/basic/week3/download/DownloadThread.java create mode 100644 group23/632678665/com/basic/week3/download/FileDownloader.java create mode 100644 group23/632678665/com/basic/week3/download/FileDownloaderTest.java create mode 100644 group23/632678665/com/basic/week3/download/api/Connection.java create mode 100644 group23/632678665/com/basic/week3/download/api/ConnectionException.java create mode 100644 group23/632678665/com/basic/week3/download/api/ConnectionManager.java create mode 100644 group23/632678665/com/basic/week3/download/api/DownloadListener.java create mode 100644 group23/632678665/com/basic/week3/download/impl/ConnectionImpl.java create mode 100644 group23/632678665/com/basic/week3/download/impl/ConnectionManagerImpl.java diff --git a/group23/632678665/com/basic/week3/datastructure/LinkedList.java b/group23/632678665/com/basic/week3/datastructure/LinkedList.java index 569831704d..09b08dd25f 100644 --- a/group23/632678665/com/basic/week3/datastructure/LinkedList.java +++ b/group23/632678665/com/basic/week3/datastructure/LinkedList.java @@ -178,6 +178,12 @@ public Object next() { return data; } + @Override + public void remove() { + // TODO Auto-generated method stub + + } + } /** diff --git a/group23/632678665/com/basic/week3/download/Demo.java b/group23/632678665/com/basic/week3/download/Demo.java new file mode 100644 index 0000000000..f4dc344cb5 --- /dev/null +++ b/group23/632678665/com/basic/week3/download/Demo.java @@ -0,0 +1,36 @@ +package com.basic.week3.download; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintStream; +import java.io.RandomAccessFile; +import java.net.URL; + +public class Demo { + + public static void main(String[] args) throws Exception { +// File f=new File("E://123.txt"); +// InputStream ii=new FileInputStream(f); +// byte [] b=new byte [2]; +// int j; +// while(true){ +// if(ii.read(b)==0){ +// System.out.println("1111"); +// } +// if(ii.read(b)==-1){ +// System.out.println("3333"); +// } +// } + URL url=new URL("Http://localhsot:8080/123.txt"); + String [] s=url.toString().split("/"); + for(String str:s){ + + } + } + +} diff --git a/group23/632678665/com/basic/week3/download/DownloadThread.java b/group23/632678665/com/basic/week3/download/DownloadThread.java new file mode 100644 index 0000000000..89b7fdc3f5 --- /dev/null +++ b/group23/632678665/com/basic/week3/download/DownloadThread.java @@ -0,0 +1,31 @@ +package com.basic.week3.download; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.basic.week3.download.api.Connection; + +public class DownloadThread extends Thread{ + public static int count=0; + Connection conn; + int startPos; + int endPos; + + public DownloadThread(Connection conn, int startPos, int endPos){ + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + try { + count++; + conn.read(startPos, endPos); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally{ + count--; + } + } +} diff --git a/group23/632678665/com/basic/week3/download/FileDownloader.java b/group23/632678665/com/basic/week3/download/FileDownloader.java new file mode 100644 index 0000000000..d32975f4b5 --- /dev/null +++ b/group23/632678665/com/basic/week3/download/FileDownloader.java @@ -0,0 +1,97 @@ +package com.basic.week3.download; + +import com.basic.week3.download.api.Connection; +import com.basic.week3.download.api.ConnectionException; +import com.basic.week3.download.api.ConnectionManager; +import com.basic.week3.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + Connection conn; + + DownloadThread dt; + + private static final int THREAD_NUM=4; + public FileDownloader(String _url) { + this.url = _url; + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + /*Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + }*/ + try { + //打开url + conn=cm.open(url); + //判断资源长度 + int length=conn.getContentLength(); + //每个线程所占的资源 + int off=(int)(length/3); + int start=0; + for(int i=0;i Date: Wed, 29 Mar 2017 22:23:52 +0800 Subject: [PATCH 033/552] =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=B8=8B=E8=BD=BDDEM?= =?UTF-8?q?O=E5=AE=8C=E6=88=90=EF=BC=8C=E5=A4=9A=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E8=BF=98=E6=9C=89=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xiaol/download/DownloadDemo.java | 53 +++++++ .../com/xiaol/download/DownloadThread.java | 29 +++- .../com/xiaol/download/FileDownloader.java | 144 +++++++++++------- .../xiaol/download/FileDownloaderTest.java | 4 +- .../xiaol/download/impl/ConnectionImpl.java | 47 +++++- .../download/impl/ConnectionManagerImpl.java | 5 +- 6 files changed, 214 insertions(+), 68 deletions(-) create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java new file mode 100644 index 0000000000..d1ed7bb700 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java @@ -0,0 +1,53 @@ +package com.xiaol.download; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +/** + * 下载DEMO + * @author ShawnLin + */ +public class DownloadDemo { + + public void download(String url) { + URL u; + try { + u = new URL(url); + HttpURLConnection httpURLConnection = (HttpURLConnection) u.openConnection(); + int contentLength = httpURLConnection.getContentLength(); + httpURLConnection.connect(); + InputStream inputStream = httpURLConnection.getInputStream(); + File file = new File(getFileName(url)); + RandomAccessFile raf = new RandomAccessFile(file, "rwd"); + byte[] read = new byte[1024]; + int length = 0; + while ((length = inputStream.read(read)) != -1) { + raf.write(read, 0, length); + } + inputStream.close(); + raf.close(); + System.out.println("下载完毕,位置[" + file.getAbsolutePath() + "]"); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + public String getFileName(String path) { + int index = path.lastIndexOf("/"); + return path.substring(index + 1); + } + + public static void main(String[] args) { + DownloadDemo dd = new DownloadDemo(); + String url = "http://ww3.sinaimg.cn/large/729119fdgw1f0nnftw3hij21kw11x4qp.jpg"; + dd.download(url); + } +} diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java index a038d0da37..cc2da86116 100644 --- a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java +++ b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java @@ -1,20 +1,37 @@ package com.xiaol.download; +import java.io.IOException; +import java.io.RandomAccessFile; + import com.xiaol.download.api.Connection; +import com.xiaol.download.api.DownloadListener; -public class DownloadThread extends Thread{ +public class DownloadThread extends Thread { Connection conn; int startPos; int endPos; + RandomAccessFile randomAccessFile; + DownloadListener listener; - public DownloadThread( Connection conn, int startPos, int endPos){ - - this.conn = conn; + public DownloadThread(Connection conn, int startPos, int endPos, RandomAccessFile randomAccessFile) { + this.randomAccessFile = randomAccessFile; + this.conn = conn; this.startPos = startPos; this.endPos = endPos; } - public void run(){ - + + @Override + public void run() { + try { + byte[] read = conn.read(startPos, endPos); + randomAccessFile.seek(startPos); + randomAccessFile.write(read, 0, endPos - startPos); + System.out.println(this.getName() + "完成下载,从" + startPos + "到" + endPos + "共" + (endPos - startPos)); + conn.close(); + FileDownloader.finishCount(); + } catch (IOException e) { + e.printStackTrace(); + } } } \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java index cd0b433843..ced422ed96 100644 --- a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java +++ b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java @@ -1,91 +1,133 @@ package com.xiaol.download; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + import com.xiaol.download.api.Connection; import com.xiaol.download.api.ConnectionException; import com.xiaol.download.api.ConnectionManager; import com.xiaol.download.api.DownloadListener; - public class FileDownloader { - + String url; - + DownloadListener listener; - + ConnectionManager cm; - + private static int count = 0; public FileDownloader(String _url) { this.url = _url; - + } - - public void execute(){ + + public void execute() { // 在这里实现你的代码, 注意: 需要用多线程实现下载 // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, + // endPos来指定) // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 1. 需要调用ConnectionManager的open方法打开连接, + // 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 // 3. 把byte数组写入到文件中 // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 -// Connection conn = null; -// try { -// -// conn = cm.open(this.url); -// -// int length = conn.getContentLength(); -// -// new DownloadThread(conn,0,length-1).start(); -// -// } catch (ConnectionException e) { -// e.printStackTrace(); -// }finally{ -// if(conn != null){ -// conn.close(); -// } -// } - - + // Connection conn = null; + // try { + // + // conn = cm.open(this.url); + // + // int length = conn.getContentLength(); + // + // new DownloadThread(conn,0,length-1).start(); + // + // } catch (ConnectionException e) { + // e.printStackTrace(); + // }finally{ + // if(conn != null){ + // conn.close(); + // } + // } + Connection conn = null; try { - + + File file = new File(getFileName(url)); + RandomAccessFile raf = new RandomAccessFile(file, "rwd"); + System.out.println("文件下载位置:[" + file.getAbsolutePath() + "]"); + int threadNum = 3; conn = cm.open(this.url); - - int length = conn.getContentLength(); - - new DownloadThread(conn,0,length-1).start(); - - } catch (ConnectionException e) { + int length = conn.getContentLength(); + int avg = length / threadNum; + for (int i = 0; i < threadNum; i++) { + Connection cTemp = cm.open(this.url); + int start = i * avg; + int end = start + avg - 1; + if (i == threadNum - 1) { + end = length - 1; + } + new DownloadThread(cTemp, start, end, raf).start(); + } + + while (true) { + if (threadNum == getFinishCount()) { + listener.notifyFinished(); + try { + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + break; + } + } + } catch (ConnectionException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { e.printStackTrace(); - }finally{ - if(conn != null){ + } finally { + if (conn != null) { conn.close(); } } - - - - + } - + + /** + * 获取文件名 + * + * @param path + * @return + */ + public String getFileName(String path) { + int index = path.lastIndexOf("/"); + return path.substring(index + 1); + } + public void setListener(DownloadListener listener) { this.listener = listener; } - - - public void setConnectionManager(ConnectionManager ucm){ + public void setConnectionManager(ConnectionManager ucm) { this.cm = ucm; } - - public DownloadListener getListener(){ + + public DownloadListener getListener() { return this.listener; } - + + public static void finishCount() { + count++; + } + + public int getFinishCount() { + return count; + } } \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java index f76ba7ff38..3656f4a7da 100644 --- a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java +++ b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java @@ -22,7 +22,7 @@ public void tearDown() throws Exception { public void testDownload() { // String url = "http://localhost:8080/test.jpg"; - String url = "http://img4.duitang.com/uploads/item/201411/09/20141109224803_GXSri.jpeg"; + String url = "http://ww3.sinaimg.cn/large/729119fdgw1f0nnftw3hij21kw11x4qp.jpg"; FileDownloader downloader = new FileDownloader(url); @@ -46,7 +46,7 @@ public void notifyFinished() { try { System.out.println("还没有下载完成,休眠五秒"); //休眠5秒 - Thread.sleep(5000); + Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java index 3cc898e626..8f19cb40e8 100644 --- a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java +++ b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java @@ -1,27 +1,60 @@ package com.xiaol.download.impl; import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; import com.xiaol.download.api.Connection; -public class ConnectionImpl implements Connection{ +public class ConnectionImpl implements Connection { + + private HttpURLConnection httpURLConnection; + + public ConnectionImpl(String url) { + try { + this.httpURLConnection = (HttpURLConnection) new URL(url).openConnection(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } @Override public byte[] read(int startPos, int endPos) throws IOException { - - return null; + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.setConnectTimeout(5000); + httpURLConnection.setReadTimeout(5000); + httpURLConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + httpURLConnection.connect(); + List list = new ArrayList<>(); + byte[] byteArray = null; + byte[] read = new byte[1024]; + int length = 0; + if (httpURLConnection.getResponseCode() == 206) { + InputStream inputStream = httpURLConnection.getInputStream(); + byteArray = new byte[endPos - startPos + 1]; + while ((length = inputStream.read(byteArray)) != -1) { + + } + inputStream.close(); + } + close(); + return byteArray; } @Override public int getContentLength() { - - return 0; + return httpURLConnection.getContentLength(); } @Override public void close() { - - + httpURLConnection.disconnect(); } } \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java index d8bd4c5a34..77fc547e6e 100644 --- a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java +++ b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java @@ -1,4 +1,5 @@ package com.xiaol.download.impl; + import com.xiaol.download.api.Connection; import com.xiaol.download.api.ConnectionException; import com.xiaol.download.api.ConnectionManager; @@ -7,8 +8,8 @@ public class ConnectionManagerImpl implements ConnectionManager { @Override public Connection open(String url) throws ConnectionException { - - return null; + Connection connection = new ConnectionImpl(url); + return connection; } } \ No newline at end of file From 417bb58e661739375912f3e1ebfa236e14b3d0d4 Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Fri, 31 Mar 2017 11:11:03 +0800 Subject: [PATCH 034/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E8=A1=A5?= =?UTF-8?q?=E4=BA=A4=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C=E4=B8=9A!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../big_work/01_temp/src/main/Test.java | 5 + .../big_work/02_temp/src/main/Test.java | 5 + .../01_DataStructure/src/main/ArrayList.java | 82 +++++++++++ .../src/main/BinaryTreeNode.java | 65 +++++++++ .../01_DataStructure/src/main/Iterator.java | 6 + .../01_DataStructure/src/main/LinkedList.java | 114 +++++++++++++++ .../01_DataStructure/src/main/List.java | 9 ++ .../01_DataStructure/src/main/Queue.java | 22 +++ .../01_DataStructure/src/main/Stack.java | 25 ++++ .../src/test/ArrayListTest.java | 133 ++++++++++++++++++ .../src/test/BinaryTreeNodeTest.java | 25 ++++ .../src/test/LinkedListTest.java | 126 +++++++++++++++++ .../01_DataStructure/src/test/QueueTest.java | 50 +++++++ .../01_DataStructure/src/test/StackTest.java | 67 +++++++++ .../01_DataStructure/src/utils/ListUtils.java | 11 ++ .../ordinary_work/02_temp/src/main/Test.java | 5 + 16 files changed, 750 insertions(+) create mode 100644 group23/1323434545/big_work/01_temp/src/main/Test.java create mode 100644 group23/1323434545/big_work/02_temp/src/main/Test.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/main/BinaryTreeNode.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/main/Iterator.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/main/LinkedList.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/main/List.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/main/Queue.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/main/Stack.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/test/BinaryTreeNodeTest.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/test/LinkedListTest.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/test/QueueTest.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/test/StackTest.java create mode 100644 group23/1323434545/ordinary_work/01_DataStructure/src/utils/ListUtils.java create mode 100644 group23/1323434545/ordinary_work/02_temp/src/main/Test.java diff --git a/group23/1323434545/big_work/01_temp/src/main/Test.java b/group23/1323434545/big_work/01_temp/src/main/Test.java new file mode 100644 index 0000000000..e4585146a0 --- /dev/null +++ b/group23/1323434545/big_work/01_temp/src/main/Test.java @@ -0,0 +1,5 @@ +package main; + +public class Test { + +} diff --git a/group23/1323434545/big_work/02_temp/src/main/Test.java b/group23/1323434545/big_work/02_temp/src/main/Test.java new file mode 100644 index 0000000000..e4585146a0 --- /dev/null +++ b/group23/1323434545/big_work/02_temp/src/main/Test.java @@ -0,0 +1,5 @@ +package main; + +public class Test { + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java b/group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java new file mode 100644 index 0000000000..14548a000e --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java @@ -0,0 +1,82 @@ +package main; + +import java.util.Arrays; + +import utils.ListUtils; + +public class ArrayList implements List { + private Object[] elementData = new Object[10]; + private int size; + + @Override + public void add(Object o) { + add(size, o); + + } + + @Override + public void add(int index, Object o) { + //检查是否越界 + ListUtils.CheckIndexInRange(0, size, index); + if (size == elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length + 10); + } + if (index < size) { + for (int i = size; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + } + elementData[index] = o; + size++; + } + + @Override + public Object remove(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Object tag = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size - 1] = null; + size--; + return tag; + + } + + @Override + public Object get(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + return elementData[index]; + + } + + @Override + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + private int cursor; + + @Override + public boolean hasNext() { + if (size > 0) { + return cursor < size; + } else { + return false; + } + + } + + @Override + public Object next() { + Object tag = get(cursor); + cursor++; + return tag; + } + }; + + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/BinaryTreeNode.java b/group23/1323434545/ordinary_work/01_DataStructure/src/main/BinaryTreeNode.java new file mode 100644 index 0000000000..3192984cdc --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/main/BinaryTreeNode.java @@ -0,0 +1,65 @@ +package main; + +public class BinaryTreeNode { + @SuppressWarnings("rawtypes") + private Comparable data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + @SuppressWarnings("rawtypes") + public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) { + this.data = data; + this.left = left; + this.right = right; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public BinaryTreeNode insert(Comparable o) { + int result = o.compareTo(data); + if (0 == result) { + return this; + } else if (0 < result) { + if (null == this.right) { + BinaryTreeNode node = new BinaryTreeNode(o, null, null); + this.right = node; + return node; + } + return this.right.insert(o); + } else { + if (null == this.left) { + BinaryTreeNode node = new BinaryTreeNode(o, null, null); + this.left = node; + return node; + } + return this.left.insert(o); + } + + } + + @SuppressWarnings("rawtypes") + public Comparable getData() { + return data; + } + + @SuppressWarnings("rawtypes") + public void setData(Comparable data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/Iterator.java b/group23/1323434545/ordinary_work/01_DataStructure/src/main/Iterator.java new file mode 100644 index 0000000000..4a052a8646 --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/main/Iterator.java @@ -0,0 +1,6 @@ +package main; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/LinkedList.java b/group23/1323434545/ordinary_work/01_DataStructure/src/main/LinkedList.java new file mode 100644 index 0000000000..bc142a6b06 --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/main/LinkedList.java @@ -0,0 +1,114 @@ +package main; + +import utils.ListUtils; + +public class LinkedList implements List { + private Node head; + private int size; + + private static class Node { + private Object data; + private Node next; + } + + @Override + public void add(Object o) { + add(size, o); + } + + @Override + public void add(int index, Object o) { + ListUtils.CheckIndexInRange(0, size, index); + if (0==size) { + head = new Node(); + head.data = o; + size++; + return; + } + if (0 == index) { + Node node = new Node(); + node.data = o; + node.next = head; + head = node; + size++; + return; + } + if (index == size) { + Node node = head; + while (null != node.next) { + node = node.next; + } + Node addNode = new Node(); + addNode.data = o; + node.next = addNode; + size++; + return; + } + Node node = head; + for (int i = 0; i < index - 1; i++) { + node = node.next; + } + Node addNode = new Node(); + addNode.data = o; + addNode.next = node.next; + node.next = addNode; + size++; + } + + @Override + public Object remove(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Node node = head; + if (0 == index) { + head = head.next; + size--; + return node.data; + } + for (int i = 0; i < index - 1; i++) { + node = node.next; + } + Node removeNode = node.next; + node.next = removeNode.next; + size--; + return removeNode.data; + } + + @Override + public Object get(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + @Override + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + private int cursor; + + @Override + public boolean hasNext() { + if (size > 0) { + return cursor < size; + } else { + return false; + } + + } + + @Override + public Object next() { + Object tag = get(cursor); + cursor++; + return tag; + } + }; + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/List.java b/group23/1323434545/ordinary_work/01_DataStructure/src/main/List.java new file mode 100644 index 0000000000..f5825a0ea6 --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/main/List.java @@ -0,0 +1,9 @@ +package main; + +public interface List { + public void add(Object o); + public void add(int index,Object o); + public Object remove(int index); + public Object get(int index); + public int size(); +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/Queue.java b/group23/1323434545/ordinary_work/01_DataStructure/src/main/Queue.java new file mode 100644 index 0000000000..76d80e419c --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/main/Queue.java @@ -0,0 +1,22 @@ +package main; + +public class Queue { + private LinkedList list = new LinkedList(); + + public void enQueue(Object o) { + list.add(o); + } + + public Object deQueue() { + return list.remove(0); + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/Stack.java b/group23/1323434545/ordinary_work/01_DataStructure/src/main/Stack.java new file mode 100644 index 0000000000..bd489f7a98 --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/main/Stack.java @@ -0,0 +1,25 @@ +package main; + +public class Stack { + private ArrayList list = new ArrayList(); + + public void push(Object o) { + list.add(o); + } + + public Object pop() { + return list.remove(list.size() - 1); + } + + public Object peek() { + return list.get(list.size() - 1); + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java b/group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java new file mode 100644 index 0000000000..ee2ca2afd7 --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java @@ -0,0 +1,133 @@ +package test; + + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + + +import main.ArrayList; +import main.Iterator; + +public class ArrayListTest { + ArrayList list; + + @Before + public void init() { + list = new ArrayList(); + } + + @Test + public void testAddObject() { + list.add(0); + list.add(1); + list.add(2); + assertEquals(0, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(2, list.get(2)); + + } + + @Test + public void testAddIntObject() { + list.add("b"); + list.add("d"); + list.add("e"); + list.add(0, "a"); + list.add(2, "c"); + list.add(5, "f"); + assertEquals("a", list.get(0)); + assertEquals("c", list.get(2)); + assertEquals("f", list.get(5)); + try { + list.add(-1, "hh"); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.add(7, "xx"); + fail("index should <=size"); + } catch (Exception e) { + } + + } + + @Test + public void testRemove() { + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + assertEquals("d", list.remove(3)); + assertEquals("a", list.remove(0)); + assertEquals("c", list.remove(1)); + try { + list.remove(-1); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.remove(1); + fail("index should <=size"); + } catch (Exception e) { + } + + } + + @Test + public void testGet() { + + list.add("a"); + assertEquals("a", list.get(0)); + + try { + list.get(-1); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.get(1); + fail("index should <=size"); + } catch (Exception e) { + } + + } + + @Test + public void testSize() { + list.add("a"); + assertEquals(1, list.size()); + list.remove(0); + assertEquals(0, list.size()); + } + + @Test + public void testIterator() { + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + Iterator i = list.iterator(); + assertTrue(i.hasNext()); + assertEquals("a", i.next()); + assertTrue(i.hasNext()); + assertEquals("b", i.next()); + assertTrue(i.hasNext()); + assertEquals("c", i.next()); + assertTrue(i.hasNext()); + assertEquals("d", i.next()); + assertFalse(i.hasNext()); + + try { + i.next(); + fail("index should <=size"); + } catch (Exception e) { + } + + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/BinaryTreeNodeTest.java b/group23/1323434545/ordinary_work/01_DataStructure/src/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..b52f06d70d --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/test/BinaryTreeNodeTest.java @@ -0,0 +1,25 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import main.BinaryTreeNode; + +public class BinaryTreeNodeTest { + + @Test + public void testInsert() { + BinaryTreeNode node = new BinaryTreeNode(5, null,null); + node.insert(2); + node.insert(7); + node.insert(7); + node.insert(1); + node.insert(6); + node.insert(4); + node.insert(8); + assertEquals(8, node.getRight().getRight().getData()); + assertEquals(4, node.getLeft().getRight().getData()); + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/LinkedListTest.java b/group23/1323434545/ordinary_work/01_DataStructure/src/test/LinkedListTest.java new file mode 100644 index 0000000000..56f6b0bad9 --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/test/LinkedListTest.java @@ -0,0 +1,126 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import main.Iterator; +import main.LinkedList; + +public class LinkedListTest { + private LinkedList list; + + @Before + public void init(){ + list = new LinkedList(); + } + + @Test + public void testAddObject() { + list.add(0); + list.add(1); + list.add(2); + assertEquals(0, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(2, list.get(2)); + } + + @Test + public void testAddIntObject() { + list.add("b"); + list.add("d"); + list.add("e"); + list.add(0, "a"); + list.add(2, "c"); + list.add(5, "f"); + assertEquals("a", list.get(0)); + assertEquals("c", list.get(2)); + assertEquals("f", list.get(5)); + try { + list.add(-1, "hh"); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.add(7, "xx"); + fail("index should <=size"); + } catch (Exception e) {} + } + + @Test + public void testRemove() { + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + assertEquals("d", list.remove(3)); + assertEquals("a", list.remove(0)); + assertEquals("c", list.remove(1)); + try { + list.remove(-1); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.remove(1); + fail("index should <=size"); + } catch (Exception e) { + } + + } + + @Test + public void testGet() { + + list.add("a"); + assertEquals("a", list.get(0)); + + try { + list.get(-1); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.get(1); + fail("index should <=size"); + } catch (Exception e) { + } + } + + @Test + public void testSize() { + list.add("a"); + assertEquals(1, list.size()); + list.remove(0); + assertEquals(0, list.size()); + } + + @Test + public void testIterator() { + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + Iterator i = list.iterator(); + assertTrue(i.hasNext()); + assertEquals("a", i.next()); + assertTrue(i.hasNext()); + assertEquals("b", i.next()); + assertTrue(i.hasNext()); + assertEquals("c", i.next()); + assertTrue(i.hasNext()); + assertEquals("d", i.next()); + assertFalse(i.hasNext()); + + try { + i.next(); + fail("index should <=size"); + } catch (Exception e) { + } + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/QueueTest.java b/group23/1323434545/ordinary_work/01_DataStructure/src/test/QueueTest.java new file mode 100644 index 0000000000..ca085df0c8 --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/test/QueueTest.java @@ -0,0 +1,50 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import main.Queue; + +public class QueueTest { + private Queue queue; + + @Before + public void init(){ + queue = new Queue(); + } + + @Test + public void testEnQueue() { + } + + @Test + public void testDeQueue() { + try{ + queue.deQueue(); + fail("empty queue hasn't element"); + }catch (Exception e) { + } + queue.enQueue("a"); + queue.enQueue("b"); + assertEquals("a", queue.deQueue()); + assertEquals("b", queue.deQueue()); + } + + @Test + public void testIsEmpty() { + assertTrue(queue.isEmpty()); + queue.enQueue("a"); + assertFalse(queue.isEmpty()); + } + + @Test + public void testSize() { + assertEquals(0, queue.size()); + queue.enQueue("a"); + queue.enQueue("a"); + assertEquals(2, queue.size()); + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/StackTest.java b/group23/1323434545/ordinary_work/01_DataStructure/src/test/StackTest.java new file mode 100644 index 0000000000..00c3d23a5e --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/test/StackTest.java @@ -0,0 +1,67 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import main.Stack; + +public class StackTest { + private Stack stack; + + @Before + public void init(){ + stack = new Stack(); + } + + @Test + public void testPush() { + stack.push("a"); + assertEquals("a", stack.peek()); + stack.push("b"); + assertEquals("b", stack.peek()); + } + + @Test + public void testPop() { + try{ + stack.pop(); + fail("empty stack hasn't element"); + }catch (Exception e) { + } + stack.push("a"); + stack.push("b"); + stack.push("c"); + assertEquals("c", stack.pop()); + assertEquals("b", stack.pop()); + assertEquals("a", stack.pop()); + } + + @Test + public void testPeek() { + } + + @Test + public void testIsEmpty() { + assertTrue(stack.isEmpty()); + stack.push("a"); + stack.push("b"); + assertFalse(stack.isEmpty()); + stack.pop(); + assertFalse(stack.isEmpty()); + stack.pop(); + assertTrue(stack.isEmpty()); + + + } + + @Test + public void testSize() { + assertEquals(0, stack.size()); + stack.push("a"); + stack.push("b"); + assertEquals(2, stack.size()); + } + +} diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/utils/ListUtils.java b/group23/1323434545/ordinary_work/01_DataStructure/src/utils/ListUtils.java new file mode 100644 index 0000000000..82b62d462c --- /dev/null +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/utils/ListUtils.java @@ -0,0 +1,11 @@ +package utils; + +public class ListUtils { + public static boolean CheckIndexInRange(int start, int end, int index) { + if (index >= start && index <= end) { + return true; + } + throw new IndexOutOfBoundsException(); + } + +} diff --git a/group23/1323434545/ordinary_work/02_temp/src/main/Test.java b/group23/1323434545/ordinary_work/02_temp/src/main/Test.java new file mode 100644 index 0000000000..e4585146a0 --- /dev/null +++ b/group23/1323434545/ordinary_work/02_temp/src/main/Test.java @@ -0,0 +1,5 @@ +package main; + +public class Test { + +} From 0e158b1cccd7e2f46d20c633ed687455c3e1b45c Mon Sep 17 00:00:00 2001 From: mengxz <82427129@qq.com> Date: Sat, 1 Apr 2017 09:42:36 +0800 Subject: [PATCH 035/552] update .gitignore file --- group17/82427129/.gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/group17/82427129/.gitignore b/group17/82427129/.gitignore index 090f729088..35cadcc5f6 100644 --- a/group17/82427129/.gitignore +++ b/group17/82427129/.gitignore @@ -14,4 +14,6 @@ .project -Test.java \ No newline at end of file +Test.java + +Algorithms/ \ No newline at end of file From f07aab905a5e281d075eb8749e2c3f30d2feef47 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sat, 1 Apr 2017 20:47:54 +0800 Subject: [PATCH 036/552] =?UTF-8?q?LRU=E7=AE=97=E6=B3=95=E7=9A=84=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E7=AE=80=E5=8D=95=E5=AE=9E=E7=8E=B0=EF=BC=8C=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=95=A5=E5=A4=A7=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/linklist/LRUPageFrame.java | 130 ++++++++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 41 ++++++ 2 files changed, 171 insertions(+) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..10393b6d89 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java @@ -0,0 +1,130 @@ +package com.github.miniyk2012.coding2017.basic.linklist; + +/** + * 用双向链表实现LRU算法 + * @author liuxin + * + */ +public class LRUPageFrame { + + private static class Node { + + Node prev; + Node next; + int pageNum; + + Node() { + } + + Node(int pageNum) { + this.pageNum = pageNum; + } + } + + private int capacity; + private int size; + + private Node first;// 链表头 + private Node last;// 链表尾 + + + public LRUPageFrame(int capacity) { + + this.capacity = capacity; + + } + + /** + * 获取缓存中对象 + * + * @param pageNum: page值 + * @return + */ + public void access(int pageNum) { + Node hitNode = get(pageNum); + if (null == hitNode) { + hitNode = new Node(pageNum); + addTop(hitNode); + if (size > capacity) { + delBottom(); + } + } else { + switchTop(hitNode); + } + } + + /** + * 获取值为pageNum的Node,如果没有返回null + * @param pageNum + * @return + */ + private Node get(int pageNum) { + Node currentNode = first; + while (currentNode != null) { + if (currentNode.pageNum == pageNum) return currentNode; + currentNode = currentNode.next; + } + return null; + } + + /** + * 往顶部放一个Node + * @param node + */ + private void addTop(Node node) { + size++; + if (first == null) { + first = last = node; + } else { + node.next = first; + first.prev = node; + first = node; + } + } + + /** + * 把node和顶部做交换 + * @param node + */ + private void switchTop(Node node) { + if (node == first) return; + Node preNode = node.prev; + Node nextNode = node.next; + preNode.next = nextNode; + if (nextNode != null) { + nextNode.prev = preNode; + } else { + last = preNode; + } + node.next = node.prev = null; + addTop(node); + size--; + } + + /** + * 把底部的踢掉 + */ + private void delBottom() { + size--; + if (last == first) first = null; + Node temp = last; + last = last.prev; + temp.prev = null; + last.next = 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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..5949586262 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,41 @@ +package com.github.miniyk2012.coding2017.basic.linklist; + +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(4); + Assert.assertEquals("4,0,3", frame.toString()); + frame.access(4); + Assert.assertEquals("4,0,3", frame.toString()); + frame.access(0); + Assert.assertEquals("0,4,3", frame.toString()); + frame.access(7); + Assert.assertEquals("7,0,4", frame.toString()); + frame.access(4); + Assert.assertEquals("4,7,0", frame.toString()); + } + +} From ab0cda6ecd7f316641187a83c69d17177e14fbc3 Mon Sep 17 00:00:00 2001 From: tanghaojie Date: Sat, 1 Apr 2017 21:55:10 +0800 Subject: [PATCH 037/552] t --- .../src/week2/litestruts/Configuration.java | 113 ++++++++++++++++++ .../litestruts/ConfigurationException.java | 21 ++++ .../week2/litestruts/ConfigurationTest.java | 41 +++++++ .../src/week2/litestruts/LoginAction.java | 1 - .../src/week2/litestruts/ReflectionUtil.java | 83 +++++++++++++ .../week2/litestruts/ReflectionUtilTest.java | 108 +++++++++++++++++ .../Code/src/week2/litestruts/Struts.java | 30 ++++- .../Code/src/week2/litestruts/StrutsTest.java | 4 - .../Code/src/week2/litestruts/struts.xml | 10 +- 9 files changed, 397 insertions(+), 14 deletions(-) create mode 100644 group12/495473393/Code/src/week2/litestruts/Configuration.java create mode 100644 group12/495473393/Code/src/week2/litestruts/ConfigurationException.java create mode 100644 group12/495473393/Code/src/week2/litestruts/ConfigurationTest.java create mode 100644 group12/495473393/Code/src/week2/litestruts/ReflectionUtil.java create mode 100644 group12/495473393/Code/src/week2/litestruts/ReflectionUtilTest.java diff --git a/group12/495473393/Code/src/week2/litestruts/Configuration.java b/group12/495473393/Code/src/week2/litestruts/Configuration.java new file mode 100644 index 0000000000..990df538f9 --- /dev/null +++ b/group12/495473393/Code/src/week2/litestruts/Configuration.java @@ -0,0 +1,113 @@ +package week2.litestruts; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; + +public class Configuration { + + Map actions = new HashMap<>(); + + public Configuration(String fileName) { + + String packageName = this.getClass().getPackage().getName(); + + packageName = packageName.replace('.', '/'); + + InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); + + parseXML(is); + + try { + is.close(); + } catch (IOException e) { + throw new ConfigurationException(e); + } + } + + private void parseXML(InputStream is){ + + SAXBuilder builder = new SAXBuilder(); + + try { + + Document doc = builder.build(is); + + Element root = doc.getRootElement(); + + for(Element actionElement : root.getChildren("action")){ + + String actionName = actionElement.getAttributeValue("name"); + String clzName = actionElement.getAttributeValue("class"); + + ActionConfig ac = new ActionConfig(actionName, clzName); + + for(Element resultElement : actionElement.getChildren("result")){ + + String resultName = resultElement.getAttributeValue("name"); + String viewName = resultElement.getText().trim(); + + ac.addViewResult(resultName, viewName); + + } + + this.actions.put(actionName, ac); + } + + + } catch (JDOMException e) { + throw new ConfigurationException(e); + + } catch (IOException e) { + throw new ConfigurationException(e); + + } + + + } + + public String getClassName(String action) { + ActionConfig ac = this.actions.get(action); + if(ac == null){ + return null; + } + return ac.getClassName(); + } + + public String getResultView(String action, String resultName) { + ActionConfig ac = this.actions.get(action); + if(ac == null){ + return null; + } + return ac.getViewName(resultName); + } + + private static class ActionConfig{ + + String name; + String clzName; + Map viewResult = new HashMap<>(); + + + public ActionConfig(String actionName, String clzName) { + this.name = actionName; + this.clzName = clzName; + } + public String getClassName(){ + return clzName; + } + public void addViewResult(String name, String viewName){ + viewResult.put(name, viewName); + } + public String getViewName(String resultName){ + return viewResult.get(resultName); + } + } + +} diff --git a/group12/495473393/Code/src/week2/litestruts/ConfigurationException.java b/group12/495473393/Code/src/week2/litestruts/ConfigurationException.java new file mode 100644 index 0000000000..943454e813 --- /dev/null +++ b/group12/495473393/Code/src/week2/litestruts/ConfigurationException.java @@ -0,0 +1,21 @@ +package week2.litestruts; + +import java.io.IOException; + +import org.jdom2.JDOMException; + +public class ConfigurationException extends RuntimeException { + + public ConfigurationException(String msg) { + super(msg); + } + + public ConfigurationException(JDOMException e) { + super(e); + } + + public ConfigurationException(IOException e) { + super(e); + } + +} diff --git a/group12/495473393/Code/src/week2/litestruts/ConfigurationTest.java b/group12/495473393/Code/src/week2/litestruts/ConfigurationTest.java new file mode 100644 index 0000000000..d07f9945fe --- /dev/null +++ b/group12/495473393/Code/src/week2/litestruts/ConfigurationTest.java @@ -0,0 +1,41 @@ +package week2.litestruts; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ConfigurationTest { + Configuration cfg = new Configuration("struts.xml"); + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testGetClassName() { + String clzName = cfg.getClassName("login"); + Assert.assertEquals("com.coderising.litestruts.LoginAction", clzName); + clzName = cfg.getClassName("logout"); + Assert.assertEquals("com.coderising.litestruts.LogoutAction", clzName); + } + + @Test + public void testGetResultView() { + String jsp = cfg.getResultView("login", "success"); + Assert.assertEquals("/jsp/homepage.jsp", jsp); + + jsp = cfg.getResultView("login", "fail"); + Assert.assertEquals("/jsp/showLogin.jsp", jsp); + + jsp = cfg.getResultView("logout", "success"); + Assert.assertEquals("/jsp/welcome.jsp", jsp); + + jsp = cfg.getResultView("logout", "error"); + Assert.assertEquals("/jsp/error.jsp", jsp); + } +} diff --git a/group12/495473393/Code/src/week2/litestruts/LoginAction.java b/group12/495473393/Code/src/week2/litestruts/LoginAction.java index d8daf1c835..b4e7662119 100644 --- a/group12/495473393/Code/src/week2/litestruts/LoginAction.java +++ b/group12/495473393/Code/src/week2/litestruts/LoginAction.java @@ -2,7 +2,6 @@ /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin * */ public class LoginAction{ diff --git a/group12/495473393/Code/src/week2/litestruts/ReflectionUtil.java b/group12/495473393/Code/src/week2/litestruts/ReflectionUtil.java new file mode 100644 index 0000000000..917edfb1f9 --- /dev/null +++ b/group12/495473393/Code/src/week2/litestruts/ReflectionUtil.java @@ -0,0 +1,83 @@ +package week2.litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ReflectionUtil { + + public static List getSetterMethods(Class clz) { + return getMethods(clz, "set"); + } + + public static void setParameters(Object o, Map params) { + List methods = getSetterMethods(o.getClass()); + for (String name : params.keySet()) { + String methodName = "set" + name; + for (Method m : methods) { + if (m.getName().equalsIgnoreCase(methodName)) { + try { + m.invoke(o, params.get(name)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + } + } + } + + public static List getGetterMethods(Class clz) { + return getMethods(clz, "get"); + } + + private static List getMethods(Class clz, String startWithName) { + List methods = new ArrayList<>(); + for (Method m : clz.getDeclaredMethods()) { + if (m.getName().startsWith(startWithName)) { + methods.add(m); + } + } + return methods; + } + + public static Map getParamterMap(Object o) { + Map params = new HashMap<>(); + List methods = getGetterMethods(o.getClass()); + for (Method m : methods) { + String methodName = m.getName(); + String name = methodName.replaceFirst("get", "").toLowerCase(); + try { + Object value = m.invoke(o); + params.put(name, value); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + return params; + } + + //////////////////////// Backup /////////////////////////////////// + + public static List getGetterMethods_V1(Class clz) { + List methods = new ArrayList<>(); + for (Method m : clz.getDeclaredMethods()) { + if (m.getName().startsWith("get")) { + methods.add(m); + } + } + return methods; + } + + public static List getSetterMethods_V1(Class clz) { + List methods = new ArrayList<>(); + for (Method m : clz.getDeclaredMethods()) { + if (m.getName().startsWith("set")) { + methods.add(m); + } + } + return methods; + } +} diff --git a/group12/495473393/Code/src/week2/litestruts/ReflectionUtilTest.java b/group12/495473393/Code/src/week2/litestruts/ReflectionUtilTest.java new file mode 100644 index 0000000000..c112ef9a38 --- /dev/null +++ b/group12/495473393/Code/src/week2/litestruts/ReflectionUtilTest.java @@ -0,0 +1,108 @@ +package week2.litestruts; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ReflectionUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testGetSetterMethod() throws Exception { + + String name = "com.coderising.litestruts.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getSetterMethods(clz); + + Assert.assertEquals(2, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("setName"); + expectedNames.add("setPassword"); + + Set acctualNames = new HashSet<>(); + for(Method m : methods){ + acctualNames.add(m.getName()); + } + + Assert.assertTrue(acctualNames.containsAll(expectedNames)); + } + + @Test + public void testSetParameters() throws Exception{ + + String name = "com.coderising.litestruts.LoginAction"; + Class clz = Class.forName(name); + Object o = clz.newInstance(); + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + ReflectionUtil.setParameters(o,params); + + + + Field f = clz.getDeclaredField("name"); + f.setAccessible(true); + Assert.assertEquals("test", f.get(o)); + + f = clz.getDeclaredField("password"); + f.setAccessible(true); + Assert.assertEquals("1234", f.get(o)); + } + @Test + public void testGetGetterMethod() throws Exception{ + String name = "com.coderising.litestruts.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getGetterMethods(clz); + + Assert.assertEquals(3, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("getMessage"); + expectedNames.add("getName"); + expectedNames.add("getPassword"); + + Set acctualNames = new HashSet<>(); + for(Method m : methods){ + acctualNames.add(m.getName()); + } + + Assert.assertTrue(acctualNames.containsAll(expectedNames)); + } + + @Test + public void testGetParamters() throws Exception{ + String name = "com.coderising.litestruts.LoginAction"; + Class clz = Class.forName(name); + LoginAction action = (LoginAction)clz.newInstance(); + action.setName("test"); + action.setPassword("123456"); + + Map params = ReflectionUtil.getParamterMap(action); + + Assert.assertEquals(3, params.size()); + + Assert.assertEquals(null, params.get("messaage") ); + Assert.assertEquals("test", params.get("name") ); + Assert.assertEquals("123456", params.get("password") ); + } +} diff --git a/group12/495473393/Code/src/week2/litestruts/Struts.java b/group12/495473393/Code/src/week2/litestruts/Struts.java index bafaaafd8c..e240afc83b 100644 --- a/group12/495473393/Code/src/week2/litestruts/Struts.java +++ b/group12/495473393/Code/src/week2/litestruts/Struts.java @@ -1,11 +1,12 @@ package week2.litestruts; +import java.lang.reflect.Method; import java.util.Map; - - public class Struts { + private final static Configuration cfg = new Configuration("struts.xml"); + public static View runAction(String actionName, Map parameters) { /* @@ -27,8 +28,29 @@ public static View runAction(String actionName, Map parameters) { 放到View对象的jsp字段中。 */ - + + String clzName = cfg.getClassName(actionName); + if(clzName == null){ + return null; + } + try { + Class clz = Class.forName(clzName); + Object action = clz.newInstance(); + + ReflectionUtil.setParameters(action, parameters); + + Method m = clz.getDeclaredMethod("execute"); + String resultName = (String)m.invoke(action); + + Map params = ReflectionUtil.getParamterMap(action); + String resultView = cfg.getResultView(actionName, resultName); + View view = new View(); + view.setParameters(params); + view.setJsp(resultView); + return view; + } catch (Exception e) { + e.printStackTrace(); + } return null; } - } diff --git a/group12/495473393/Code/src/week2/litestruts/StrutsTest.java b/group12/495473393/Code/src/week2/litestruts/StrutsTest.java index 9187ef02f2..e048bf9d6e 100644 --- a/group12/495473393/Code/src/week2/litestruts/StrutsTest.java +++ b/group12/495473393/Code/src/week2/litestruts/StrutsTest.java @@ -6,10 +6,6 @@ import org.junit.Assert; import org.junit.Test; - - - - public class StrutsTest { @Test diff --git a/group12/495473393/Code/src/week2/litestruts/struts.xml b/group12/495473393/Code/src/week2/litestruts/struts.xml index a6cfe43e6c..638a5f1f15 100644 --- a/group12/495473393/Code/src/week2/litestruts/struts.xml +++ b/group12/495473393/Code/src/week2/litestruts/struts.xml @@ -1,11 +1,11 @@ - + - + /jsp/homepage.jsp /jsp/showLogin.jsp - - /jsp/welcome.jsp - /jsp/error.jsp + + /jsp/welcome.jsp + /jsp/error.jsp \ No newline at end of file From bce169aae0bc64fc4d6dc2894f84748dd702cc75 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sat, 1 Apr 2017 21:56:06 +0800 Subject: [PATCH 038/552] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8B=A5=E5=B9=B2?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/linklist/LRUPageFrame.java | 18 ++++++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 21 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java index 10393b6d89..b29b385d31 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java @@ -126,5 +126,23 @@ public String toString(){ } return buffer.toString(); } + + /** + * 测试双向链表逆序输出 + * @return + */ + public String lastToString(){ + StringBuilder buffer = new StringBuilder(); + Node node = last; + while(node != null){ + buffer.append(node.pageNum); + + node = node.prev; + if(node != null){ + buffer.append(","); + } + } + return buffer.toString(); + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java index 5949586262..9f93ca8fc6 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java @@ -12,30 +12,51 @@ public void testAccess() { LRUPageFrame frame = new LRUPageFrame(3); frame.access(7); frame.access(0); + Assert.assertEquals("0,7", frame.toString()); + Assert.assertEquals("7,0", frame.lastToString()); frame.access(1); Assert.assertEquals("1,0,7", frame.toString()); + Assert.assertEquals("7,0,1", frame.lastToString()); frame.access(2); Assert.assertEquals("2,1,0", frame.toString()); + Assert.assertEquals("0,1,2", frame.lastToString()); frame.access(0); Assert.assertEquals("0,2,1", frame.toString()); + Assert.assertEquals("1,2,0", frame.lastToString()); frame.access(0); Assert.assertEquals("0,2,1", frame.toString()); + Assert.assertEquals("1,2,0", frame.lastToString()); frame.access(3); Assert.assertEquals("3,0,2", frame.toString()); + Assert.assertEquals("2,0,3", frame.lastToString()); frame.access(0); Assert.assertEquals("0,3,2", frame.toString()); + Assert.assertEquals("2,3,0", frame.lastToString()); frame.access(4); Assert.assertEquals("4,0,3", frame.toString()); + Assert.assertEquals("3,0,4", frame.lastToString()); frame.access(4); Assert.assertEquals("4,0,3", frame.toString()); + Assert.assertEquals("3,0,4", frame.lastToString()); frame.access(4); Assert.assertEquals("4,0,3", frame.toString()); + Assert.assertEquals("3,0,4", frame.lastToString()); frame.access(0); Assert.assertEquals("0,4,3", frame.toString()); + Assert.assertEquals("3,4,0", frame.lastToString()); frame.access(7); Assert.assertEquals("7,0,4", frame.toString()); + Assert.assertEquals("4,0,7", frame.lastToString()); frame.access(4); Assert.assertEquals("4,7,0", frame.toString()); + Assert.assertEquals("0,7,4", frame.lastToString()); + + LRUPageFrame frame2 = new LRUPageFrame(1); + Assert.assertEquals("", frame2.toString()); + frame2.access(7); + Assert.assertEquals("7", frame2.toString()); + frame2.access(0); + Assert.assertEquals("0", frame2.toString()); } } From dbd80bdcec21c8259cfeb5267b70fb5c30d1ec72 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sun, 2 Apr 2017 20:10:05 +0800 Subject: [PATCH 039/552] Mini-jvm first step --- .../jvm/loader/ClassFileLoader.java | 51 +++++++++++ .../jvm/test/ClassFileloaderTest.java | 84 +++++++++++++++++++ .../coderising/jvm/test/EmployeeV1.java | 28 +++++++ 3 files changed, 163 insertions(+) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..d143302ed4 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,51 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.loader; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + InputStream is = null; + ByteArrayOutputStream bas = null; + byte[] ret = null; + try { + is = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream(className)); + bas = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int bytesRead = 0; + while ((bytesRead = is.read(buf)) != -1) { + bas.write(buf, 0, bytesRead); + } + ret = bas.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + if (bas != null) + bas.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return ret; + } + + public void addClassPath(String path) { + clzPaths.add(path); + } + + public String getClassPath(){ + StringBuilder sb = new StringBuilder(); + for (String path : clzPaths){ + sb.append(path).append(";"); + } + return sb.substring(0, sb.length()-1); + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..f1c0d93cca --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,84 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.test; + +import com.github.miniyk2012.coding2017.coderising.jvm.loader.ClassFileLoader; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + + + + +public class ClassFileloaderTest { + + + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "jvm/EmployeeV1.class"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1114, byteCodes.length); + + } + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "jvm/EmployeeV1.class"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Sun, 2 Apr 2017 20:23:16 +0800 Subject: [PATCH 040/552] no message --- group02/812350401/pom.xml | 10 ++++++++++ .../coderising/jvm/test/ClassFileloaderTest.java | 9 +++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/group02/812350401/pom.xml b/group02/812350401/pom.xml index 9a637781ce..a837755a4e 100644 --- a/group02/812350401/pom.xml +++ b/group02/812350401/pom.xml @@ -32,6 +32,16 @@ dom4j 1.6.1 + + org.jetbrains + annotations + RELEASE + + + coding2017 + 812350401 + 1.0-SNAPSHOT + diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java index f1c0d93cca..a7fd9df5e9 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java @@ -7,15 +7,11 @@ import org.junit.Test; - - - - public class ClassFileloaderTest { - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path2 = "C:\temp"; + static String path1 = "haha"; + static String path2 = "nana"; @Before public void setUp() throws Exception { @@ -67,6 +63,7 @@ public void testMagicNumber(){ Assert.assertEquals("cafebabe", acctualValue); } + @org.jetbrains.annotations.NotNull private String byteToHexString(byte[] codes ){ StringBuffer buffer = new StringBuffer(); for(int i=0;i Date: Mon, 3 Apr 2017 12:37:56 +0800 Subject: [PATCH 041/552] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E8=8B=A5=E5=B9=B2?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group02/812350401/pom.xml | 6 +---- .../coderising/litestruts/Struts.java | 25 +++++++++++-------- .../coderising/litestruts/struts.xml | 11 -------- .../miniyk2012/coding2017/basic/ListTest.java | 6 +++++ .../coderising/litestruts/StrutsTest.java | 8 +++--- 5 files changed, 25 insertions(+), 31 deletions(-) delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml diff --git a/group02/812350401/pom.xml b/group02/812350401/pom.xml index a837755a4e..06f43adeb1 100644 --- a/group02/812350401/pom.xml +++ b/group02/812350401/pom.xml @@ -7,6 +7,7 @@ coding2017 812350401 1.0-SNAPSHOT + jar @@ -37,11 +38,6 @@ annotations RELEASE - - coding2017 - 812350401 - 1.0-SNAPSHOT - diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java index 54e8468077..ad61829987 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java @@ -1,5 +1,7 @@ package com.github.miniyk2012.coding2017.coderising.litestruts; +import java.net.URISyntaxException; +import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -25,7 +27,7 @@ public class Struts { private static View view; private static final Logger logger = Logger.getLogger(Struts.class.getName()); - public static View runAction(String actionName, Map parameters) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public static View runAction(String actionName, Map parameters) throws Exception { /* @@ -93,10 +95,9 @@ private static Map getFields() return map; } - private static void readXml() throws DocumentException { - String fileName = Thread.currentThread().getContextClassLoader().getResource("").getPath() - + "com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml"; - File aFile = new File(fileName); + private static void readXml() throws DocumentException, URISyntaxException { + URL url = Struts.class.getClassLoader().getResource("struts/struts.xml"); + File aFile = new File(url.toURI()); SAXReader xmlReader = new SAXReader(); doc = xmlReader.read(aFile); } @@ -161,13 +162,15 @@ private static void generateObject(String actionName) } - public static void main(String args[]) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException + public static void main(String args[]) throws Exception { - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - View view = runAction("login", params); - logger.info(view.toString()); +// Map params = new HashMap(); +// params.put("name","test"); +// params.put("password","1234"); +// View view = runAction("login", params); +// logger.info(view.toString()); + System.out.println(Struts.class.getResource("")); + System.out.println(Struts.class.getClassLoader().getResource("")); } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml deleted file mode 100644 index 0d3fd6495f..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/ListTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/ListTest.java index 87a8cdddb3..102a002754 100644 --- a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/ListTest.java +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/ListTest.java @@ -14,6 +14,7 @@ public class ListTest { @Test public void testFunctional() { + if (getClass() == ListTest.class) return; aList.add(1); aList.add(2); assertEquals(1, aList.get(0)); @@ -38,6 +39,7 @@ public void testFunctional() { @Test public void testAdd() { + if (getClass() == ListTest.class) return; for (int i=0; i<100; i++) aList.add(i); assertEquals(0, aList.get(0)); @@ -47,6 +49,7 @@ public void testAdd() { @Test public void testRemove() { + if (getClass() == ListTest.class) return; aList.add(1); aList.add(2); aList.add(3); @@ -70,6 +73,7 @@ public void testRemove() { @Test public void testSize() { + if (getClass() == ListTest.class) return; for (int i=0; i<10; i++) aList.add(i*2); assertEquals(10, aList.size()); @@ -80,6 +84,7 @@ public void testSize() { @Test public void testException() { + if (getClass() == ListTest.class) return; expectedEx.expect(Exception.class); aList.remove(1); @@ -89,6 +94,7 @@ public void testException() { @Test public void testIterator() { + if (getClass() == ListTest.class) return; Iterator it = aList.iterator(); assertEquals(false, it.hasNext()); diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java index 15e569a766..f183d9a778 100644 --- a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java @@ -13,7 +13,7 @@ public class StrutsTest { @Test - public void testLoginActionSuccess() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public void testLoginActionSuccess() throws Exception { String actionName = "login"; @@ -29,7 +29,7 @@ public void testLoginActionSuccess() throws DocumentException, InstantiationExce } @Test - public void testLoginActionFailed() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public void testLoginActionFailed() throws Exception { String actionName = "login"; Map params = new HashMap(); params.put("name","test"); @@ -42,7 +42,7 @@ public void testLoginActionFailed() throws DocumentException, InstantiationExcep } @Test - public void testLogoutActionSuccess() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public void testLogoutActionSuccess() throws Exception { String actionName = "logout"; @@ -58,7 +58,7 @@ public void testLogoutActionSuccess() throws DocumentException, InstantiationExc } @Test - public void testLogoutActionFailed() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public void testLogoutActionFailed() throws Exception { String actionName = "logout"; Map params = new HashMap(); params.put("name","test"); From cf238403421ca214775f19f38e62983d35ac3af6 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 3 Apr 2017 12:42:59 +0800 Subject: [PATCH 042/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group02/812350401/.gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 0a2df7bbee..d62bd72d2e 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -1,4 +1,3 @@ target/ .idea/ -src/main/java/train/ -src/main/resources/ \ No newline at end of file +src/main/java/train/ \ No newline at end of file From 49d2ca4ee7cd1273d66a97461d82e836559dae01 Mon Sep 17 00:00:00 2001 From: Harry Date: Mon, 3 Apr 2017 12:50:10 +0800 Subject: [PATCH 043/552] add jvm_1 of week 6 --- .../jvm/loader/ClassFileLoader.java | 74 +++++++++++ .../jvm/test/ClassFileloaderTest.java | 88 +++++++++++++ .../coding2017/jvm/test/EmployeeV1.java | 28 ++++ .../coding2017/linklist/LRUPageFrame.java | 124 ++++++++++++++++++ .../coding2017/linklist/LRUPageFrameTest.java | 35 +++++ .../com/coding/basic/linklist/LinkedList.java | 12 +- 6 files changed, 356 insertions(+), 5 deletions(-) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..5c52c492a3 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java @@ -0,0 +1,74 @@ +package com.github.HarryHook.coding2017.jvm.loader; + + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + + + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + + + String fileName = clzPaths.get(0) + File.separatorChar + + className.replace('.', File.separatorChar) + ".class"; + + InputStream in = null; + try { + in = new FileInputStream(fileName); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); + + byte[] buffer = new byte[1024]; + int length = 0; + while((length = in.read(buffer)) != -1) { + out.write(buffer, 0, length); + } + return out.toByteArray(); + } catch(IOException e) { + e.printStackTrace(); + } finally { + if(in != null) { + try{ + in.close(); + }catch(IOException e) { + e.printStackTrace(); + } + } + } + return null; + + } + + + public void addClassPath(String path) { + + this.clzPaths.add(path); + } + + + + public String getClassPath(){ + + StringBuilder buffer = new StringBuilder(); + + for(int i=0; i capacity) { + last = last.prev; + last.next = null; + } + }else { + moveToFirst(iteratorNode); + } + } + } + } + // 将节点/缓存页添加到fitrst + public void addToFirst(int pageNum) { + Node node = new Node(); + node.pageNum = pageNum; + node.prev = null; + node.next = first; + first.prev = node; + first = node; + currentSize++; + } + //将last节点移动到first + public void moveLastToFirst() { + last.next = first; + first.prev = last; + first = last; + last = last.prev; + last.next = null; + first.prev = null; + } + //将最近使用的已有缓存页移动到first + public void moveToFirst(Node iteratorNode) { + iteratorNode.prev.next = iteratorNode.next; + iteratorNode.next.prev = iteratorNode.prev; + iteratorNode.prev = null; + iteratorNode.next = first; + first.prev = iteratorNode; + first = iteratorNode; + } + + 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/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..004b99eac4 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java @@ -0,0 +1,35 @@ +package com.github.HarryHook.coding2017.linklist; + +import org.junit.Assert; + +import org.junit.Test; + + +public class LRUPageFrameTest { + + @Test + public void testAccess() { + LRUPageFrame frame = new LRUPageFrame(3); + frame.access(7); + Assert.assertEquals("7", frame.toString()); + frame.access(0); + Assert.assertEquals("0,7", frame.toString()); + frame.access(7); + Assert.assertEquals("7,0", frame.toString()); + frame.access(1); + Assert.assertEquals("1,7,0", frame.toString()); + frame.access(2); + Assert.assertEquals("2,1,7", 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()); + } + +} diff --git a/liuxin/data-structure/src/com/coding/basic/linklist/LinkedList.java b/liuxin/data-structure/src/com/coding/basic/linklist/LinkedList.java index f4c7556a2e..9a408dc46d 100644 --- a/liuxin/data-structure/src/com/coding/basic/linklist/LinkedList.java +++ b/liuxin/data-structure/src/com/coding/basic/linklist/LinkedList.java @@ -6,6 +6,12 @@ public class LinkedList implements List { private Node head; + + private static class Node{ + Object data; + Node next; + + } public void add(Object o){ @@ -41,11 +47,7 @@ public Iterator iterator(){ } - private static class Node{ - Object data; - Node next; - - } + /** * 把该链表逆置 From 3de14afea9ecfedcb2f3c57a4e743a384fea1839 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 3 Apr 2017 13:10:23 +0800 Subject: [PATCH 044/552] Modify gitignore --- group02/812350401/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index d62bd72d2e..16c41c3498 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -1,3 +1,4 @@ target/ .idea/ -src/main/java/train/ \ No newline at end of file +src/main/java/train/ +!src/main/resources/ \ No newline at end of file From ab37abf1bdb8c854af027b28e428565e743b30a1 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 3 Apr 2017 13:14:53 +0800 Subject: [PATCH 045/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A0gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group02/812350401/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 16c41c3498..07ac925398 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -1,4 +1,4 @@ target/ .idea/ src/main/java/train/ -!src/main/resources/ \ No newline at end of file +!src/main/resources/ From e424f89a20b3448368a19e0d43bb94b3f6f58ccc Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 3 Apr 2017 13:16:47 +0800 Subject: [PATCH 046/552] gitignore modify --- group02/812350401/.gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 07ac925398..307aa641b5 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -2,3 +2,6 @@ target/ .idea/ src/main/java/train/ !src/main/resources/ +!src/main/resources/*.class +!src/main/resources/*.xml + From bb8fcb9c698ab8b0589636da98fc552d6b9762dc Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 3 Apr 2017 13:42:41 +0800 Subject: [PATCH 047/552] Gitignore modify --- group02/812350401/.gitignore | 6 ++---- .../src/main/resources/jvm/EmployeeV1.class | Bin 0 -> 1114 bytes .../src/main/resources/struts/struts.xml | 11 +++++++++++ 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 group02/812350401/src/main/resources/jvm/EmployeeV1.class create mode 100644 group02/812350401/src/main/resources/struts/struts.xml diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 307aa641b5..86b837863d 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -1,7 +1,5 @@ target/ .idea/ src/main/java/train/ -!src/main/resources/ -!src/main/resources/*.class -!src/main/resources/*.xml - +!src/main/resources/**/*.class +!src/main/resources/**/*.xml diff --git a/group02/812350401/src/main/resources/jvm/EmployeeV1.class b/group02/812350401/src/main/resources/jvm/EmployeeV1.class new file mode 100644 index 0000000000000000000000000000000000000000..868b919f935c8fd60539f9584b841d6e06740a9a GIT binary patch literal 1114 zcmbtST~8B16g^YgZo90Owzh(R)bCP|1w?t!V2II3QqcrMLVTK*Nm<+v(%q8uXK4Z? zn)n0!QN}aVYDMtLw7EO?&dj;zoVnkBeE9}o4Nq*0<8B@n?&)wpj|ZsdFmI!Q1q+Kg zJhWL~(!sT`ERYUmpae?ILwPJ+UxpobC+T`&=c&M$>~KqL31pvnp_gn3RO=THZq4r! z=S8&7!-b|7s_kCTQr-8mjWgrjr9N7T9dIqrmNW$w9B>25iy)xVpTu z>b9eOGT?GuFICrznYxF^ft#o}abE^Ue$-cLcZDRaSS8y=L*)`~np&18Hnoy;-B8WN zvj1B7enf?J!#$8*sI`5#D9-H5Zij5kmu%CXBLRCS>UG=dm8S(4M)a1nsSYME{kmSWu;$<~CIz1Vr%jZ;8SeKrlcIxZ%m_@3 z-urFqP_>hDrJa79sDS=NJ#JJ6ws?{Ij+2paK9me-ec51~FY`f;^dUdQEe_c@$1=qq z)teO!;5P$yLy@t>Y>)e6{1zH#5RHWsq#83P82e-{lo?A%Gv*m>#&Npn;2JBn!8KG+ zWkvwgMwpdulwyPHm>jm*Fhqc?X)!{#S=V + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file From ce2c2ef2658114fbdaa77681b308b2cc6426fe89 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 3 Apr 2017 17:28:36 +0800 Subject: [PATCH 048/552] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E8=8B=A5=E5=B9=B2?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/litestruts/Struts.java | 1 + .../src/main/resources/downloads/test.png | Bin 0 -> 100384 bytes .../download/FileDownloaderTest.java | 13 +++---------- 3 files changed, 4 insertions(+), 10 deletions(-) create mode 100644 group02/812350401/src/main/resources/downloads/test.png diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java index ad61829987..42584af1e3 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/Struts.java @@ -170,6 +170,7 @@ public static void main(String args[]) throws Exception // View view = runAction("login", params); // logger.info(view.toString()); System.out.println(Struts.class.getResource("")); + System.out.println(Struts.class.getResource("/")); System.out.println(Struts.class.getClassLoader().getResource("")); } diff --git a/group02/812350401/src/main/resources/downloads/test.png b/group02/812350401/src/main/resources/downloads/test.png new file mode 100644 index 0000000000000000000000000000000000000000..40c982a45cc70d81071ffcee052e71bf6a5f52cc GIT binary patch literal 100384 zcmb5VXHXN~6D}OOARR&t9U)X{(S+iU8X)u%I!KceiUg#Cf}m)GK@*^ zw+gTTaI$l7ak@6%&(^IU^?}tppMilh>42 zQc+b?SCf>}($NCzoB^wW|7V1Si;Iir6psiGj|f;wObYz}EdK@oLZ{f?u>sjw6alP4 zENnt7|Aqh{0DzV4WVbAU|6kZSSlKvP09>a|w3dPZRu(okRt{DUcEHJGJJ3Eip2ly|6eNr z04yhqvY%)ah5kPU8-R`FfAfFBBE))PoXyNdL{TpY{ci=pd!k?!ViN-V2SA0%|IVb| z3{Ibq&xDiZOZ@P_zP>LS)DpUEc+%ysb{F(Xh4htA+E#_bWCA~}-vTTRslf!Pda-8hR5I6Pc) zeWcdX)L?>Q#1P$3;-~?JBR)P}bbY z2l!gg5fG9nbGN!hj;pGJ$Y4#dgfG1x*+Bb>07y@O z(1ZeZfem#0SK~iWwDKn`t*fs~I24D#j{zU^?D&*965gc3M!z-azAE**NrDSEk08if z^0)~(ZU!F5cC+RTWBE}I;*M@C3e~gc(d5W{O8`mvEAwe2j84eD;6v!>0Yp_bn_gto zW!qwQAWQcGWz-$w43kO5pzQ)$(RR+ADB1KmX?LGB(dc-Y+8WK(cqp@b9Y@!Gd~Y6U zJ09U>ev0WAR}VA@7`elrM>P65Z3B~U-Pl@^T2bCvFygo#twgUW53pZVknr1^1{ zto0{5pI51yDnwhp9=AD6WHf+|t~)*Lz6pgWeBJsaQD5ZuFkg&#&@M6JgG-XJB}+Rb zj?BB*vb?=T+;-~@YZWf&i)5&5Z_00CJQIv~Lm;rwJ&O;KJ~Xh^X#`_?D!$P~*SX`- zN{=E&sB{yka3^lGd(UD*4Ml#)xCcC`46SfPgk}9?F)&Uwf9t{B3(6dBY zzc2b0gq;#NwC2{ad%5p**gpVGC)*Y_c@4#RZbar?cj$=HH!`>1Z%<0LniA&Nwx{P= ziN%jPW^cNJW@Kc^{GqS&y2_LR0)+7o?`e0~$l8RGIPcza%Qo$32_05zeip;EUT)J* z$?8QH>;Ia0p=-KQ&^;mjBm}7Hoh1tT#-WcbQzOKS&i)wJ!_yQl)Uqh{07pv*e;IxI zH{iE@TJb|y!GS-$=z8H8+idcSA>>L+8n10xlu{9jsl;IE&vV_H*p53HA2AE3qz zh1Ht{4EAzzESwb7<5Gy<#I=d}^Jx;7lsBp(yp`SThF-pgL>t}z^~+PQ`_RHp))%*c zw~8s-a=(-Xh(&2uI7PJebOV?NT$_a$u^rb59NK+E5o|@ zoB~={N@G7aSzi@B3*#!KG1bTeB2*V#!TxXeOxl$v5ajK;RjhZ zicJ`KG~MRS158ki;J|1Nm!1FX`X>vpKL)#}1|+H8p1|O6Pe-G_1UFwJAd*X>wp2bE z=b1`Icy57ZIQTRrqGv8EW-r_*PK0gein&V|)b3hHLPb|>E0kp;Ga2Ug``e{ni?P1- z9O8U~(LBTz!8J@j*z^wtu47C0`Jg)i@PZpM_$EJs&Ce)wi%LIBz$ixS@Vl7xpuGqCurl^W_<4Gicu{A4EjIf?t6 z=;xGr=ZgvawqI+WWv^iFAK-;5Wsg=$Lf%)a7Jb^I`)gJaczDchn;P_|0>HWEa4R>d zt(hX$rzn(_Cr}3!Z8Wcm#tT2wcfLgV{SuA;bobEJ?uKNGK@P}WVhg=+6NllqvJJ7T zDsz$FCWo>Aa<@wuYY@B<3!6k;jRQ@eRiNBy|Ky=0lK4S`(S3mNVxvK%`(V!^%Lb2*!GCS}VUug~~oOid7_(~mH(TU{ICIHYYrO-p}ee1Qh9TiGv zL4eD?H+kF_Zj6tN31a~vKdaXsSSe|%4ds>OZqm4}=bel!7o3;WSvEm9>wH zyzX%}Jzb<97I8TYcXU8FQfd55sb+V&*HOn)?6EA0?DRs2>~T*O7#)Gn0jvbvrHgE&7K+n8PY zCP%v{{IdtB(5w#~j<6+Onglm8Vse;>9=2w_4{oNbPQd{lqZDKnq*wGPHy_00tsQ*i9%UTtWTdzuPo1#T(xpPR+FMR;1 ziB27?`+SL0x7HWx%)(pQ&;Ce6zJGip>Zw6o0zzM)cNOT?vONIwr;62gejSMj23vZb z>*m6+4?Jhmy2LgwJ4RZ)ln*2NpIS0gxoei#u8T88R9~rCNi1x(*|xj?e7A=9SY5|4 z(s<>1tA%-gt@J;Dfl_3vc*`!Z#mw0Cwzlnmz|ptCQ9k_0=Ztdsz| zP{k)lTYcO3nDUuF5`ifhY*A02U)6ULI-tu#?Z39VjBzzwINmMUn-y?r31O3LG}!g2 z4gKWn1T`=!nP#ke$TUW(e6$jMlD4&2cKv^eHb2d>D{7@Z76h@aAbIcbdSte?7yfeJ z?49b9wc{g}r8`d;ZXsFC*SHvJMi&Y=o~mmLa+!)#GlpM+ko=L_X~C!IrZt_Kka%gYY9YnMmVyos1m1Z>+L%D5D^mle)k8 zy(X~WwxsCf@_+LRsF4xY$1~wHAvxA3F9AfcH3hRl(p1t+$rK_e6Z|2{=$guDsR`nW zjHzs&MuoVd*$86FD!%&nd_fWbYV6X$F;4R;ar5?MEt*RCu*?Ny$?)8T+}8qkyMLq9 zKXuN-Tb!#s_s6|I#`L@eye{?A=?fgVju+33eBGMlk1gLprL|G{3P+ovQEA zm?JrV`yjwR?W7Cg;ItU1;n9E6q?bPPb%Wp@-Q-;=(-Dz1f|;Gux}Y=QcJaA_1>U#5 zfT9<9ZxqO0FoRSIu{vUK4i5hu>0 zfnkJ5)V;|9*A_FHQ}!(|t~OabM|W;e!n)mMQbqeW-A@mL1^lSJVZ-cAN z&ilQsX_FnETYP`O-J9>TJtYQ>k<;|5V|H^Hn%`YkOi&?>FK*CU24#9lW`(TH;j8~q zl)WV$Wxm<7YW4gIHxrllqfU#{QGY^t@2V&ENOLP^LWoDO4&tyZLANy@&pC80K4fdw zF23jjIIw_)LnojdYkuPL{ALsZ&Tfn?wR8TnIvX%L9O&!W6@o9CF9lPyFGK0v%0v8o zJd<9(809}&KJw{xgbh^31ZfUz{%G*%T+2Ta72$(3~MXR#(=oD!3~K1XQWDGxzX#TtZ%%PNms zScjW1oUv&bb)#rzkt{?x7~7S5Om{TOY!H364&pCm!WBArF^>)a=m~FSFV+gb(DR%R zBnq^)cq6v_pA~!Svff)A&(h!yX#poInWRuvOIEIz2h>57moQ{3jAA^8&n?EgJse-{ z<2E23w~VQ_*IbImFm7+(<27q(Vu(D2026EsgwtJ;cF=USfQC z>$%AEjQoy)@<@qygGFo%V|cVe_J}xR_C>OO+Qru870RCIANX%i^6cM%3kFZ&U{T_I%3mTC}=N2Je;NW9k(vBtfoc?g`|7Yw+BSv;zhJPuKRBU z75c1Y_n>_x(;qd^D=L5zTncmFn-J%leZ-sZ8Ul7|WRhf7)W%SD@Hw#kZ2GUFx@~Il zUz4heroRo1p+)>Cul`MEn3DXo$Xd8E-bHIr(*dcxg%$YKm40|?*up%X9O+$w_A#)yP$<3#h<37pDGo?14Ep!PAom$n%LRv+{7@NeF@3BV!A{Nd;-{%xZU3(jK0e!$- z7dkpvvr{ndoE5jJ1U&u+5KKXEUtVE?e|KjLoFng>r4&A2`0B%Zp1&rpX%#&Rz(0M_ z3jGnCRA|y`JI$7T=z>|sjh4k(`~1Xzhq*mZa<(liNoEpQ#h6`h*zB9H)T^H zNU5-|JmGnwt*0J8cJs_&;Nb`Phnag-KZ(KX2`Ym7{z9IA)^Cn}u z{F!-G$3-Tq{67FmGYrP8o-H<9h=#lR^CoZKNR5wh{UJNQaTPVx_h4y0b_XJist@_a zpsBzpuj2Ww9AG1&q3F=G8z?JM*lTPVn@|AS@gG3ICEeNT0wfYa-o&WOnSop$)h%HrV#F`3J1ad~A9vOt&Sc~g7DbE?txdXs zP9+`l1)Sv$1BW&56eOYNC7*Ws*>?>$&NEYgEJ%5^t*oEj|hK_1vy9oTn@X}=y| zi?NdE=bWtE7%kmP(p{pl6z<54N=P)YDU2H>`2@#v z8+ApaZWE@R$*3RqPlOI^jETedNtne%Rp&PK*8e*@-6*oU-J zGZk!WESL66Tq4I^#Srin+ceTcHDW>8aBB5dp)v!*t}M$LajPcIT69=Cqw2nuv`oEw zV1hYVw+Pl!kIdf2k4I)t@E%ZP%Tz5taDt_mKR=m?byig=*%c0d4>g=(4^TC1 z`8NH>D_1pt(my=plN1}naZ1{#N4$$Zt$E3m1E%sotJ{8)z{vHrX6+5dULB8Bg5N2X z6y?QdD6H6QN`tlv@zbd+c@SMxwy6uI?`)`$H+#Xn^=$lwqw-HSIR`U-FRK06Xucr) zTBYeEV4E5R-NN};vA0@aS|pq3w4$3|6AG39H}^3Y44iB7EGD4E^TwTkOg|~h9MDH~^O#qRMbcc(KBoJwOtFoZ4JIIL!5@ z(f1D|R$IyAJVd9mY~jt`SDJN zUhj{h8r<5sDh0p2se;M38QnhxKgq0Q`_xZ-qLVJLplC{XsQFSx!DuGWIeWx?nqUycR z)MdTk3@bV=I&MC@p*Z-W)hOkI?sUjXpYc_>y|RxN0z{Po5VGRp^F`Q#L1& zy<~3egNpUiOwspAquF0~;-z_?ENV!XwwpmvJHVh@*!h~ZBjVRBLrqV z4dh1+K*=MLQ;>*4W|P^iiA2S*+Hy@oA~4uA0XN%(VCD*g+iI-s8At@968~N}5RLyP zqh3+MO4esKTbL-3ftI8Mv#~4s?zB-=%mg{Q^3`Cg^ROTO*tXaE;f_hf(v~#bhUA;2 zs*2C?+n0&rBiL$lSe?2Wsk-^?+-$^ZR8=LD2$>dg?`sR2u(20N+wDa_+8`A)if?uP75N~C?vusV^C zKv*Qn7LPQW`qTane>I5TMR~SDN_#3m7;>y!I|LQ+@$ynT4~lrV^6jGut*+qLE`KBD zW2h&%pcGQ(2UY3G@-(yD@4~!F@%qJ%45eV=vdLfgY3H+w?W&6Haj?y86d34tg{;bx zrBz=pS9g-~-FSkor=t%Bd ztvoROd)hcV+e5KV@auN1J9%KjNUWMa2k728a6}T(hsw^o`5E%EMm{ND206Q~gw+aZ zD<>2T-ziL5MZ7Ch{&GieeX7M5$FP4AMHfssEq^G-3-f24(0#_>Sezo3m`%5bE zb2+<^_0UTcyd5sp@mFwWgOPYq(F$hudJZ!g8MX6xQQUp(hd$88fo?V!CGrOKj0z4O+(zYRF6I7|Q zF;hNwQukrj+k*u1jYVQ8t1p9(`d^#Qm9R+6tLWf)<3hl+9nRL| ztk(wsXHAFG@n3Zd@v>jvD?IKf7#t!t#tu?+d|2E*IfLA9SJ$q&C-^5|Zpkx>CsF)a zI9$LwM|u(*C2?n17a7e#`LnUeuZwf7ewBT{*3sJQW_hUgNH zVM1}5N7j`N=hgPPV!~cg>^T18k(`_C^OdS$ zTUAJ`m2K|4u@J{^y0@8(sL<oTrTk-d|_j+pW5+{%*qug1k->C|V zEwQYu|IMF0ynj!5lUZZX-|DH_?56dMeto$5aq4*);=vj+>~yN07bnW^?1J~Jn^36B zzN@&Ya6*oIz4>dwcQaS{Q{{Pz9}@auY%BdHnPQ8HgMaq+D=JvBY~gPhh3JbK2YTl> zC108U$VX%ud7d3pec$hG?T1W{Ad73F15QP~T*@S5xMw_>v4U>b-mU^8LJE^n>PGP% zx323lj%(*l_kC`$nsS-B=^o^xEzhw~{C_SKd4HEPP{u~|cu5KEB4oyDwy!yHw%}4~ zUPVFFLU4!fGRu2(k+!P&|KzI}^5pKtMtT=$k>b!tC%+n~zSLoaP4KyyFM_m-?H*;l zc^5((B4E{Wo#S-v172A}$;y6#?%C@58`}k)g~rU=ogKoUE<|woyBrCSdloS<7;c2= zD`iE`KFPr&J>M3^N97ZbYp)kWfnv8GT~~LmJ+S4%I4`ukjMs4ey1a#Hec>{!ZvSQV zoGwNoCS_1`V<4}(LlH8{%5?d}|aF+2FOx($FY zl&(PkgLvKby`%Ti284`^>cAvl5EU{v5Uum1LG)v@*hFu)rs|=QjFJLQ=w3iZKEnlruS!_O7s2YZQ$=B&WAE+1N^SDG z-^pdMMpR0pE!(6iT^5CXHiyrJPWRHiDmB{+ex>7oesFj=YaC~@-EZ3u*U{Q#TObgwc8lixD^a|CfWi>)V>Jl?Uo@fA2z)|q^7(tYj@ z?9M1x+VIL`%tvdOd1`Z5`RW$0TB%1dhdl3$?Nl1Cjd{+#hn0@f(!#Qs#8HbFL{xs0 z3xAicx`&Ax*nzc%N3>)xG*iviouY#&PdmkRC|%NC&tB>teV>KrA`_ng9xW zjzpvQ4wLxMT4I~ZmqRz(dV$|TV~@{Z&FCrTrcb&`cDxA;cUdO~D_xc81XpipP1(aI zzYhGvjL^-TO!g@8DLcT^9QokQ;;7|KJlT(*CRWtWENa_X?=I&1 zWu_|QL^JJ#^QHQy^5_`-p1oh?r~?jX&p+$a@#gWoYx}TBvuU1lw~p=DN#UQF-gz!n z?(}qm{qZeZ74sCikNug<)63c|K*=NvxgZ99XEk1Kbv^gSTjlE!5wy&YHfJ89y~ieA zF{1b$7TfGF36U$7MdtOMgKX7Jc0T`g-J7`VG9Ds&XLw=eUPJ&yOF>!eL+w4E+(JNN zjWN7HyJ}3TykyC3kuG<>GVP(d5=N1!FGm_=PoLfaZpRFdL6m`m0er3^f}G7-*qeE_ zIyAQz&q^P9jxifUa1&@k$-dthNiAdkQtA%rqNQe2DFnx1N z)`r>qB_0l_k6YQeLY9sbm;khnj+kmNMlHE~j&0kN2*;GQ`JO4d*@zsZ{JGAtC(abc z*&`3zK!(R{@!)cK#S7Ckbu_nB7?A~ndh z5A9rrz}~GL3guBZ1ufF2pvW8iv?E6>8L4o+s zCpYIx%FzKy&889-8w#;ktR4#!nKyf!dj|IyE@U0cNqxJIFJ7!Kw^Z}>-_v@z^ubA@ zx&D5HLIJYBS}mYNs!m(LY{cNN%C~JYhhOyrnos-53sQEDbMjG;uHN(I4|RW@?%sJq z*TG#U@Z>s>G!}s(@lH@CRk@AwRR;nrh-<%@{D#w3wOVEZao!u~&+l^6?3*ZmU95J~ z+pc)acwQa1>+rO&1`)xmOd~jJD}cpJ*pG9t_3{**D?wWxH+Br3nt-1!yNk@;)iC7z z4A*yAA3UJDzqEEN+t?(Nw6v-mJhlk@^WG&~z=h?l0P<~zF6KSr$Psf8Rrl3Hx{yPR$K=B*<~E(^K)?a zdJ;YwSmP=BkBRM@LDLv9tHkIM&ocwD^W1(#j%plTonIXDiD)b>dm%;vvm=yt??P>A z^U*`&)jGHA^+%6e@T>lW{X!G;M8a-Vd~xLaJr+)Y@!TPIIpp+oA~7i*UL34YCNs9@ zW9MCDU2c-@5kx9JTfU0Eu8vk9RF1f+_aOooC0z28YM9+R9S^tiRrtj2N)!rNw)yJ- zvbZHp-s|ibTU2bDDFmdpRWSoJ4n?dvChtFa#~*;U6n0AsYb<0j1;!*d$wz(@vgJ_1W(qmCwVHjEa_^Zckp^Z08$<8f0)+?&Ik?eQ^fH4 z0ia~kaGZcBPgmHdv}441_A9OK_!Af>RSD-BEP9CiH0~jt9Qc)TMh0ye%brMi%}Eq^ zp^ASD)nB=dfdt|8z}BMGGsCPH1@V=ZF9Yvqt5X_{M$IB0}CAPA&VQI=jZSVvSgG#O{nj1li^q?wA zZOk`yu*Ew1)EG#Lxq(+d$A$$Xq~^h}n9?rRdl#nrA|(A{M-aCloh!?trq1FRLWXP) z`NbYq1Kjzc2y759t&CUvbf(}Gxn!YK_Y!mx?Gkw#bW}4M3gj$`Gh*cSc)YiGfu61X z5`z1C!pe!>Ccc+0ghV^vgn`^c{6{b$?8XVM?zj-p{DDkuvrvMc?rc@qiw)Pkd8jfz zPzg#=y>SdeF0K;N1e z1#=~`XbUfe8v@k0Ni*uKlY!wT!{ir(S>Peh!GW^3k;lKgs%s7#IqiR#1r^Qa9Z>=@ z|F+x(Iv45E6TMhbcHFA$-~Lw+khKWyG@=Xe|IH-Hs0!3lx}nDw2|;mv4i>o z4ZI%%%5;2n!!14etwQ+wu}FTwOnJ`>k7G?VCk&cCq(TNzJW<52Es=p4 zJfANoxW^8*{HU5Qm47x_fvrtBF+K2)fORQK6I1v9>L=)&1W1?LNyZ)l~_- ztfcsSCj%Y!^N1ZE8PT2%#y8=#>BglAn^BgDQ!m!7BtT)6!|~9j-w7<&`N8ilbM>Lz zBQ`O@Z!!6p!c7*52@Z6;cl!ee4cW4>Ej;IDGK0@6^p#&w@4h)N0Us0#m8e17m;_V9 zR@5z652k#Y2iRKF&7G|TG!m(o9^(@&ilNo(^9jE}Ta zxgo9Wx_2jW2cvFBb55-$_OSnUzkhvA4CK}uVd@;|-*Lx2W1pf+H@i}uKtTE;DYqNg zk16FF;mx)gGiPZmhU)YCSNbM6jCXftQMWWHU|Vi>=51V0^;;-sX{#~8lRZ}!bys-= zQ8#hs@exVd4BfGvFCHR8K2^!MF{sQoK(U;A|C8K7&kI zJqTHW$4E+XLwV25w?Dh}gX;%`fj#5b0Nl3R_30Sxxb!jQgaETNu=!^?Y4^$D?5)y9 zmsw(Ng{d4OjB;MnNey$b%s6mStzVEJtEec^t{9HrZyv3AyH+P3mUD>cgqt<3-n2NY zFMmDF6L<4N`n1qg&p*H(e8AHn)2l?D59blh`q*<0`A85(R3iXYWx!fPQtGzc6MWzi z#Yd5eX9j;zhlmZVSzLN7*0ou65R^|rw+oMXl_AcY$^nEF9W(DbU$=#spoDFwuThTV zU)ZYh7~%;NpldceJ&;CGgSRf%j}7!=dAzY2wWigNWHTwPCem;FBW-#)09`&i_q!U& z9k`K_f=^3G4UztU04_iGissSbQ~%Mg*iWYT@lfZ6xqz?DH&azNP8#9ddYR#D%(_7? zHjFG>eutfBqg%6kKn_)0;B7Ggk5Ufi*}?va@{O-W4*%(>jdCHh{s+O<(=-&AjxmV* zUkBc2jE`FDP%C~V14%4iMtd-=w?X-Us601mcXfYoQuGyLhJD_8PYsm)&?TD1ox0O! zwN8AZ!&(ax!3b?#I3C^FE)4}xJsbW;K#5#r>hG5VX|6GYjrzziM+a+yYdN>cMc}Jt zm76fK8jPa+x&`h2lnrtX3Uc>PSSfARO9&v}Xmx*JT@Dz*SxiKW#_7ThMxAI#11gp_ zQM&*TLFzI|X!)@bAHHqHhyJ*ObrRoT&HXM<*3e*Lr08HFXZNS>X%`Lk<65_>j-g5} zW8|B7NA+s7$G~ZbI&l>J$z}4nwc^jznwAPo@uRaKq=OQ~eFCeF);{#MDOKqOSsSF} zonUj;rzUk>-GmFemGC7kVz(o{SAXQ!H%H1#N5F?aNPQ><$)Ot09lBn8OAeT~lMm4K z-~)Uk*;fuT(39}V1b)cXby_cs$@YUoHd~xM;iT%DJD0F)C9_pwFd!GXTyupHR zZ{Xo~RMYp@Ye_I&TW_CI#o(IfH~bFqZYFQS6)SAxKcpHX&HYMn=2DC4CnTsW2Kp!Y z()fwYYA`&NBsmx_-Yj^T zjlaIQCS*9JR%w*XTYmLNO~AWWbCmWLK}y!#$W^%f{Z!iZms`gaiC>;&S$mEOlphj` z)Y8!OlcTX!MXkrit06-Djwn0{vvNGTa=n4Ibw2kY3!LiXhVRM z5d{34H5n9$G?|Hdca?v(?ol?#NBz;J$yhUUh&@Ce{FU@mg7pliUL`2(9#on?ZSfH{ z9_HI2GJN59sndFV$m=(93As15(y*O<)cUi5?PheL4c$F7gu&3(*114%=6v6^ng7e( zky&}`k4DJ>vg4yKgC86f-V>OX?Z4*n?N)uma!}2y z5y$s$?c~p=yYr1>8oP|YM7d258vXgnur1=<8VuobA0Lv8L_?fo--u0Nf#c zXY=x~M#`hcH|;jYu5ES^TPz>Ze!W%r!cxEc`PMY5n-E>x8%N#4(?|5GICxp>rf8XC+`^L?h#0PFxt@gg8F#rQf$68wbI=G*M~VKq`6_ik{-58-9Pnc%9NU;_lLvSdyU>5n_rlm9X8_3f zv3v%o2*9n1=d|8YBx#i3h1TYTUv13CE>Rf8Db(C_GNP+Es;02d>mWU8{TUh}3d9UBd+0)a?Lg1T66P#%_riw#c)@Ctw*Zz2s z3-7C(`+$nyTyz-id#gmI484Q}FtmnNJxjbVi=+%1_-3}#`=(H5<_he8_S|UuW3sF2 zVypOKtUGbzTPx1zd)1x~gEyUZ=l%AbS;&v*L|9X+^t3cf9%{a_Zns>#znS>0erByW z#W=aC{H`kVqPm&Hq?I8&3>1EW`AEIJvF%=*5)I_X8z}6cHg_tpI=l@+x;~$2GMT;@ z33<_&r#TWq1&MCVJjl~+4~DAJ+|;S%@}L~d0>D-05{y{!P1-MeOh&DF;M7a~RZ`gH z(313pS~T!J}_=cE#K#MjozT|3YbEYa20J`J2GWj%7d8 zb?LZ96L=lR=6UUn49`iGgHWvtOER_~{i@fj_3QGHWx4!Q3KD>1s@<+eW0@c4)F)5t zjF&n(8mjfH6H!E8hq$*Sba6jpc0F)QY!edkeExCJmx#uXUXAR*#l*dTfUfHi-K4Sc z@DCcUclb9$FYO`6q`rZir^kwQz_?-)3&k$UBt?qh;wALbfpc(H9H8b~=!R=miL_IF zTfZ(o0!xop`v*wucoOF23#ytw{1ZL7=&++#`7-PN_+AYl^JMw;D?JtJt7>;<_6}U0vb=-3;Vm9}`Zb{VW3W%Wgw#4i^yyE}D5S>nOcJ^Cd9{6m3KQkg>uvlLT1 zeSP=+rR{D7P4w)YE*eY@w19XwHVls%(3d@Wc3OLcmp!U!R2e^ZmIJQiphx!@q>aw=oSc2R49LIJT;fss;PY7NshKtIv`sNeo zrqda?$3?SWw%Vyn6%$ED8C58rI(C{qtuTU}q0}YGf~Jd02|`Jl6j0!HlUDXbVu)}$ zBWIW;deZ=LpX#B^)5n*%dBn&uetVT+w6@boJ##TlVx+{~##YUQ!!>@1`kV5FJ`oAy z0TE^vW^R^=JOUxXm3we+Z53Ce1bdzpzFDA*o|Sl1@Z>T8ILW8$uV;6wrl(6f+X(Xw zH0K~^Tcy!(iDMp{gq!VxEyS=jM2hnzuy{SI4)()#e{Y_|Ra>c67!>6dT`*I^eTXbC ztG8iyHO#tq6~ExMqFAll=(l(^C1J0+Tujm6{gj`Zf+UanMz0Q_an0z|A2yZVj8Lrs zX*Kr|fr0w?FECPt()@_e2wYzB)|T^^c$*X7ozg9R;L<2?(KSkHg)2~Acc2zn=hCT! z=eJ?tupL%CUOh@G58Vi3UAr2HkKC}W2MKtUFPo`nA{}1lfuz*3TfB1wbqmujswF`= z@7&w2;e}go1bS*n-#E|dFsNe-$@|;*zLmQRd|C~JTUummQ#`HhqE6kU``59UHrv=|>F7Fv^cOA5 zJ*=FCiE@}kz~BxWFlk-_DbaGnauV*8wx zp?JY`thM0#=Ck5|fD~baw@Rf&1J@{j*c9}1*+B~y{&Nd&?@bh@QR9Z<`4V=|Yix=5KnxmiDT8*=_v7`y0 zXqh~0ycvxBW~G8VA)4v)U#xKUh>(%@qjhfr0o&IvIste(IfDm;=$eEWDXX3npOY_$Qt^Lfw5a!? zF8@nJ7-)v4<<)KKo4Kuf5}ZV~zw@DiT>z=fm}(h|+}1gtgZ?IoOoGCn2xq>Rryo-Nm`XAfwCU6kn&yk;fN@szdE zZMWWID48nEDvMsJ4%}f@{`5jG)QYP%h}Ndxi8FGBvy|jG#fC^sswIHANH)Us{fW4d zDFiIe5TH@zRbq6tWwH;u2u7N8AtZU=FwLmwX3k~2y=`c zzd>H{tqbDGUJEYt$~a-j93iT)Iw+<|K}^x?bg^t|UFhEk*wjGdjmlrHJ@*(9%c~_T z6;q=SJcCbplz$dR@d=s+@#GI2v*9J0@+cdg>Wu4Rm&V4%sQ5sU{BTiW_+U1-hYcw6 zlJx)(f~kjb6|QFyz&~nvNy4x+cD4i@VKLQD%0yH6Z-5f%!!I|qU z>LJi68lU#Px7TL`yf;MbnJn&t-7RC?2Ux>xg8kh4Md4B7VH0$=L&yFZG2|=4PPV-~ ziz8yY;L#uZM@vnk%20Apq??z1-4Gc73n;bJ04l>-1tmR8RtK9a=^Gz3*9 za)ulN1E(5ky;tIBsyHt-ym{pb}LW&pjJdLNSL$OthG}Z|@eq)Wy zF+f=no~ORPf!pbk_#7tH(yjK)qY0F_E?a4qjsvcm2cey{CJA9YT^vu)Bn1{~m5V>47fvq$+>s`dr>JC!( z=@r7`s@UdGo-QJcN}GzY za*Z(PwBC2<1sIE-gHHgndrCatJVjP%9Ioi{(uKHk z-~5gFvgJ0cW-F!JbZ~Kjf@Mt9D){p-G$8a2*v264zoIAcVoGyKNW1jpW&dbJp^BsFJ%rU`V zq z9@zhjkx@eQ{J81faKaS2QSe;JG2qPO7Z`VJ!TL|4t&DF%rmy)^g13<=Y?GBKf@mA2S zVy$u=yR;KGwQ&ejz7f}B1sXxFN^>6+b9BWF5msluva1KSu1Ghq%JIF_kTXM31P+0W zR+EhPhPF`*6M!TecS=D`J)l7MoUzvxonxrds2Fuo5O{&s+bKlfE3i4i3AIa-Lh~2( zU_3t?y54O!doTSFX#gRe*|(trw@U_PnScW)^8WK-q{$UvABqgeNwQJueqJFIyyQ%0 zbOe{0cOzrRDV&GijzFYeU(?Wlou_9&&;&P|ob_5eV@lM8?Q0pC_q#LOtW0QpjCNKuNk%V()lQM_%5v#6f{_YBWz59rfOPEulz5Yn$!m>OHZoA=y)%vg*Ek z-u!Ya37DIn<~GrfHEa4a4vvxlRbJoPCz^~@u3;Nl*#Z7p50JKxIkU@s7x@DHvh=)~ zD#@`AOSnnSouMglW& zUiXmwgw)XEKg-f3>1$!!knCKwZ+!paktm82?bnaRSN5l#@B$v%uF5fs=hA{h?3PlR z-kggo4E{@^z{MTsmPrhkxLJ}B9CApb95C0!9QOz}>fBe*)_!*4U!f9bl-)%w`feY~ zfA23`6c~PFD>_XRVhFmm4bcdqt*rd#i%Hb`PaLn;eNqzhTkEo=<7~b~+hPLuVTf+j z7l^CQgP)p8BSLdYs$}G*L4^@vvPc5!9rGJW9UzJ%n1s&z?YLXnoBF;?gLP8 z?%SJai;2y8NV@k*3>3NkH5zgRyX%J@J!X1R18g}nQrR1>9>AQ)mQlp}j&)WW~PK-OFr_XQ+-Y*QqQ7|q}# zYEJfIxhy}_3m5ArSnq__^eiCLc<{248!cUCxlG5-7xF}7N4tnd<_9A|$MC@ydvQj2 zrpH^ReVlbH8cpleE@DN`^*G07MSpf~7QMS{X6`cA)o3+FC6Vgp)OAR58|l)pS&ywO z>agL)tpdF+yYluIQ% z>wr@4T-ODLQaYO03WdB;&hf%9)Io%{=|`@={*pwxR~Q!}7LFk*a!QRBeS zJIFk>@|tZNT7g}+3*W0Mbn*c&#A8J{6* zS>?t1?1u3_OxP<|p@ervg5^%GslOoamwp;9ZD^O<_Nur)k#$>818fYY)aXR)yDzzW za8Mf@8-~Y9_*MUpY+-EBsp+m@RCC>nK%n4P0446ke_>qO*~%!`*}5Y^r;VfXQ?P6Z z>P#qR{Uz$~-PifPTm^VjpZemG2uQ?e(UNOhMTRI|>@^M*vSOPyp;Xsl6YRULlm?S8 zp>mCh>wQ3TldBo z5#HOu?_K|0EwjjcyLxhscd$0CzXs(O8*j48BNuf*27I1>mQ~+<%&Cbxq$)hpsbxD9 z0YO$dCF4x86jmDD@hbaUjgqprZS;vRDHkVO4OH65bpZ}`J^`hf)$I+pvXn~~8|i_Z z(cUZd4J~@~p}G`?YxgOSHJ#SpL`r*b*SLc;p`Tugr{ELn zl?!)~?|=5dpWH9P-vgg`|ITg$#q$dH`f+HV@m ze@^rkzy&aDzE5Q{EYTxltUlFn*;(8m$os7>zrXRW$99Unk{9p$g%cVZQ9BMB#(7sWZqv331oMcfrZO*<^lewfM7H59kh)hV>h91t9DRo4mQCGZDzqCH@e$2z-+SIwz{SEx{7JNyct7vcQLut(>4GcOd&r~wwc$5Vq92wy8 zpY>ZtA4=hdHshCYwH_VL17qz_zhPQZ=nXGR&RNfneoZ^kH1NyQeFA}d_XH31x#GMf zj4!b$GvMz1Roinv@ZNr&migwS2vU7sl6(O|FS3lbQVByb4=GlVz%s!wsP5nF-$boD zJMgr_4RfG(bBu1Zs^#mr52BfCKF}I5`-c&Y1uwP=U)*d%p+QA^HB#fM*7;w3BRni( zXa#^NtMQ};ics>0;JS=g=`AIQ?2RsEnUs`yc6W`tT|r^KONfzor{VWTQZ5+f{T>=%XB7@@qM=$_H6?xOD;A-6=UR*>@&|we! zc=ePhSb@H3cpVE5`h03rOrdXzG!K2982!)pAj{O(kDCl_|ZkFI^~mr7>!F=s&#ZXE239qjvONHB(VT$ArG#pZNcObHh8nGMb6(rQ}*h zgKZ=%#)ApVFdX}KLe`@Fn%QVXC?Q^SKL1TsUQ!R{B@zzqFbWgbZ>bho{IrlQW|tE5 zl$!l#^e$SAOdM5FJ4|1Zk=O*7udcv*=NgmpnT^D`7h=1KA7H@py`MNADxa0^yRv7g zuY^VyR`l!T`sm_Dy?bH;VvbDTcuR#=bAFJHqwne=S+F6s8Rj^+-X-$d{qDCjD zm{VkjIrc>PrF_fDxBkRGL-l6~@NVTPWU=t6>evKjbC8s~cS7R6-x#3FJx*k)u-!DF zo8uFXzroR7z>f-FNq$*=tnJqXS8UsfYHV3|UV1=8!Y!VBkQ+Bc>^LKC&>_RaE#r52 zQCK@dmkvnkF$fVA_<_xtkf?=zt%P=oEQc+Eo&9^Y?{WL&fIe+N<= z19!RkYe4Hq+RBvO!2&*j#39RAPGnATs4|Nx{(EOrL*4)Opw+-aW zZ^yUT7^RmtY zH{1xSsOg#9Zt-oDkPUf_ZMSA4+zspuKXNF|G?m~30M&Nu0ERx`c)FIai_c+=z^1S1 z)|l=AJpxms*o6Axq3occ+X#3$ZF~h?Ky#sG{1v#@`Hmjpo5Ts}H)`X~vmJ?M0)l!B zUn4Dzawx%8_WL$2op^W7Y0(2QO@ec0f@KP9FI`klOFG|Yz?@w;tC&o1s~W6Px`-|B z(ac8hkx3-7DuHI}iYXov-(l??!qspRc2Tmb3xBlVB^(7JZ#kp zEm*7(EbR_4@JV0gtG7{b(?wdQj!fv+-C3izu^4(otLY%EW<{yeR};$8NuMQZ6Uv=c zP&5A#_ndRG_J-{i`KWYeIt=Q2nxu6rI0*ou9539iRVWVo@&NQLpg2vb@lImm7bVyO zpr^UI@?Dg_zuN?vcbVhCH+G>g8wT&KuE_7c-vaGC1SnqqqZQkR9Vvr& zq!6e?Q;LwR|F-q&hLw38VFd5ty)@>mIPN%JDjH@a1rANmO~w6g`H)7aY!1%qv9fL% zIS%EUpUqJz;k`BH`$Uf55Q2YsAXnqaZ>=g^o)V?VUia^(<#X}Y6g9zh%^eH#s)6Rz ziYbxHt>vDfM>WkJa${s1e=HF7t%hiE)38yOYW_lIhAf8YilH!;~KYK)QE zy~r`xi_U=N#pIK@XJal3@yZL0T|&zL9jIP^nCb0~X|gH&Re9EVVPR|hyPxu*DDD22 zuF%KzS&OM{A0&uhzVZCF@YW<^Ub@-GA9J&nTHU@MDOl>!?Yo$?^LMyB5$BsF$F;xL z?6O({Rq|S?pzOwLbviz6K?u73g;$FdLPxTZtUT0?+#pjX5SZMOjt*5wIrvOozBY~E zeR56pshH#D&~L9wF=8Dpvg?MnskOJG@HZqi}%T}@xZ zeII&-9nTjZV6A&PQpSiUjwlZw5cd3>`T^uK^fnba)us%RaP+fAZ9z)F$h9Pij3SW< zxVQd}zsVCEDT1A7O$*ebN*JaK_SdYkHwvZtuGp{x7i)ITul_)m)fHaBXxlnq`+d|RE;)uv6ckhi$oZNdKt&E(fO-s-0g{_ zt>sSjjcp7*Gzpc6uWr`ey8_V)nrD0lnW`+#y$`|6zZiJ;=93L)-SwlQqFSnQc_q%u z!bAO{9h;;d#Q@YDe`ZEIdU%0R$^qW>YpVF;*k14FZ#u|+Bh80Eo0m=Z6H`Wb3l2e^ zqsV5v_xhiL^1FZX^zt0!SdL@sw$|h?oWY-!ZX{R;)*|A5>$^D4nq^s*QSTQFA0JQ= zXU`d^fX&VJV+3i3%1R?hA?tU$z|Qz{PlSi7`VR+{kR&s4UkH7cHm6O?bsa zkTDIMezWw6#4~rN5Q8Q!^I#L@EFDh{NMbWQgj1l|14_1&M+m%PDS(!~?)eyE=~J0@ zA~=^mYw;+R;}?E|RT-W_nKv5taopjsVFv1+6;mm;qG#Ae$(z`$y_MM=&kCyrpor}U zSU1q%T8NGw&8(a)KIO>VbQ#+6QlMK(lT2B_|T6IUQt*MR(&fIRuAO6Pat3#s(!yK#gID1l$$Ou_}CHS#)`F^4} z^{*p%H`xpl)i)p_F^W`5qL;&CO~+F6^HpA8j^VN~0`2%6Dkc+KVC4&_3?xCf$;R_( zCI)Vh3XnpT&h+kMxwI;-_A>PSN~rd0se>mwx0~4>G*&=>XSqsLbfe80Q=8>)Vy#`g z7*NTiNPwgW(G0nt2j;wZM96Dcowea&5{q=VLtFmZfs>#a#)N!&a?V3B>(k*-CJ@R! z<2725{L1_wRIef3?f61R6CrZ-cHzPbOKX(^Mvb^F$fO3V{jA!KOOtv`mrhBtM3OaG5-yrT7%!l8)Br};}N#aml7ugI0-6)tqq3L9}pNyMM~KpCu=aC55h zWutj(J!eDEHVUU0Lx_r`cCaXi<|@*Y)4bx^NPVRzu!>_NFQDoCHObj(NUjT;97lAi z1Mmzc-Vv|;toMB_7Jxumb)=ly#iOu+g}@emnnRGZu0mFRl^MMQWm-P@M)8u!hiCLZ zckZG}BkS9smwl@D16lI~$OhUsQk8W&aulylZ82xACV6j)Ze#nUK)aj5W{BT{TweM9 z14Dp+olXXi$$6a+Oe?K&TT{``-reSw8mr7=v{7ESk8eofAYH)VO5{LaZ?b@HJNc2o z;Y^o8CY6P2sOXDN!*mK8_+q&kj+U6xU__tLn&MLKz;K6xjjk+$8J~BdJHqIPDY5D? z-fouf$%b;<(S-V?^rw(ikgl`1M}dz!ld|&1Xw4O)Co5bm2gLag^0E8=p}f+I*EqAtHx5EhIOAlS`j$=Im}7e>hMS`yhGOmQOcSd3^Ik9w2`>{eioQ z`pPecoBy=}#Pf!@=noyER1K4p8N1wZ0FtfY>QQT(bZjcr&MRl*gXOseplQ*tJ2MYi z1*&!ge)Am(6u8Jj^aTh#sF=<89~tjlX`*itv>1r)!#f%jXB$4hPA6VM1w4u9iZJYU zZ`g%~p1)x92kbycQmq7U9>w!u{gyZDX?wL~8^mNw^-qmYuyXe}4lHt2c{}+U*kQo2 zS^5MmFkSbpL=4vAJ4*vN!MTtHjk>e3!z})}h1Lnh68DkgTmfsVHo2ER_)hmTqH9)-4~qu>Qce2$qQO3!1|h%R4l-^|0vD%$kK|b;g44 z@f^*~z_tSyhvBv`kfE%X4bQEX6G^#Bu!MqH2Fw(y^Bk+PQ5{>dNiQ+QyPkc_b-fJCm7Y`1ZzhDbX zjBfcrNL?8bsjR4XS9oECA|S+iOGQ;Lj*V*j$a0t*x{oB2v)%&V{s`JF*V4*L+Guw$ z*k%1Hz!`MK7ASzp0Y=i0q?5AefQ|l}+ssx1=W$1n@fu!3>QfE0YhF>JDqOCo)(r6uPbw|m^zG9WNZ!G{XD`dnb$HJWdf-@(os+15A zeN^$LEjU7;FQE!N|G8tFm$+^D=3!2V!92XsSd>7eQ)9djoRnfzKoyn+*kuu~Rm|BF zhMM(9o4zkK1(R(x+}SmQR`u$j!)wDPDz58_;abToCe1bH3wZ_($5yq}QTTjb>`bBL z!tp~m%RTD8rrP7F7r7z1om^{OYkzZf5SL|A&g>E^#Su?LU$wi(r&N{GWCq)GHoChz zQE%b;d)Dd~9LMar^C=;0Q*%tX1!v383qqO%&(qx^L-R&DvHKY|!K+3g4r;=GKj1gf-|U{qKcz( zOd>_y_kx_FQ7(6gv5T*PaZ7w5@TRV?dxR4jj$s%`v4f;+O5~xw3t)whyLm-r-UkNx zibNXHUDk=QwjE#%{2Fx0)<^I6EJ}qC>1eyU9xiIMbYU4$;_wmKrIG^pZ+%k}s9Fr1zTf2f3h;chlX^Ix&MbH$ObEbfw=*eyJZe%j&BwT3h7G>U-ob z?3Wn-`H)7%YCu3UM);$bd4#)iTw_Gdfvof#Pum(`DF)gwjW_%1%;I%x@3Bi*`PCJV zG%291H8fbhb5jX9x+}q(Fyo@U&}-#;S;}=8Hmwv9FL6I0)d{YFF#< zm554bGy}sGbU0Oe2@$BxE1Hx-GZ`W4_Fwq%UO=rhTeL(K`yaJI22vqSMjvUd+8}&=jRLM_x z9c!fk)gpZZ*!a7eK>cLXyg}&C0|RMKOg;VQ&HcN;t+=VF)!54lX^-uYmI$1OR|pTG zjyU9XWOPdGED13RsEZB)CEPO@BOiNudA1OuBmg7aHG5ZR9GLmEU}q7(swIx@2|IRv zBG65a`%fV1Ewr$3O*t0j(!Sk2-i<-b-I-9HBN!c_q*M&n&#xx^y>5KVv68 zzedd834w!ugi5q`&xTCaX(y@?ZoEO%MZjjfdQFr zJ*uEFb+NJzhChupXooOQ(w(@ukS5hLdbr!5_O_m;+)iIl)pc<$!K?e6K#uf;4+)p9 zv(CFl9vPjmJ>xkl3r8=$Gf+96tPUs0EdXfB><{qzlJX|LQj#pd5POWnBaa|+Mh1ve z@{W5eb36?9q4%MKYc@QGzjVp)`lkf5gh`XMHEL{QHFuw5vZ{w--9?d+LFDyd?!!(W z2;o>L;0$BYJues&dK51KBXWOj4E>%mJQ^oroGdQW@Z%qM@z-r{i3`}Ap*11(^PP16Q3wI>U{#~!pwkPVUm+*5({V9azu@f%U`_0pXow7 z_|L_vaG5c+%jfi@_?Wq17JEDr&iL?$uXp~da^&Kin50tE{fy1{z*Y-63f2KD8Ej+B zbD(wPHYN6Ipg{!Xnd27Ia>7^m1uHEPl3o9+ks<~9#JF!%RIqTw@A5+H7iE;O)eG|H zKouP{Hph!D{h`yEc&l*rlU?!^KL+9yA<;x%XYt*{II#O`{ItZ-MLD8@+*QXrr^6`_ zk3G(wCDC#6XYZ)eU2+9PNc; zFkv*pdTHIh7wDuI@ab|{O8*faJFHA5OD*T>)iHDcpL~oy(<319Ou)gd%g_+>p-`R4 ziAt{wHR?w~=NH3J;LE9R;tL7McAKb%>MNheclk?4S$kYMJtIT51u35TTlzz2%7TvD zIz57(VTlKYAGvm!i{d7{jtoyL%V!_!f6gh_ zs5rh-H=vJ(4RbU#sf&)TKIj&8?A0cbl>aapN3fd z+anyvZDx^FQZUM}mmpq7>oMCp>ONnZHQzg46NP(TB2H_}TQ)5k68e$P)~U4%oXTIa z%D0_>x;+yHc7kzIb}{}gbxqOiQ6n%#2}VoWg{%}PcfJZ5r#t`!v8BuKdVfmBXEgyH zq3Sjb_$vgHd0tsOn$+L6>Ki8_wsSwNPi``~S<=mZ)mLjUtpLEjQQz+mwVKs616J+I z7OP1B-#wNrq>c?EsM-AO^5zhvV-&rZ0K-$x>q(se2cr+Ha?j@D@aYS)&lVqfN7kuL zBktclBRkf)=fQ19d90%+a?lb$9u>>%J|*a}apgwmMFAfx1(oy``Tj-k7ohgF)0vm}}@HS|mcSRd+DJrqWgq zD=p0lRd}MDmEEg}W`Mi+Cz8UdNiR2#a|}b@GflCpPt9{(CMdSD~$?ka2yI2oLe>@I)5-OQRJ1UgL$vN&2 z=7HGeYzZoKBVc#v{O;b?a1@@?1q@Z&Igo0Ja+hFY)WuSziWh0w%~wWzWxq}Md-~4; zs!NIgIhKYQ+Uq~T7(RN8cwT7n*NW;@2HElGEvmx`Z}eZw6c7mCz_AHuGk9GKml_gK z!qqfxpz_dtk4@xKII?tZf!oopDD@3bfi5Q$b_hwFigrN^hsH;Mte1_ls(Q}KC`lap zdjpfxe%}`aC=Y>!mklDIjANY9Zr;7&x+O(<_4$~}=KNwk&b_V`W6gY4rK-?Hywv48 zD~wAs^o`N(b*s%Aj^!~a*VP1+*w(u<%j|^JS`xd9&sF5O4=1? zQS&^mFP7D>FI-U!He8_YI49!{mVjV}Ypc*0JqN$qPh`EEb@Xt3uvIhvnj94>uirF> zj4b=g)XHF+g8*sk-em5rn_K;@2kN7|D~y>j#2v)y8QXk5w*BjCR1yr()c2w;oSU89 zn>g9A!E6sht+Yw(M##Inf+ALMBR+JTla*shKsmKUUq@IerTthZHL7h4K#ay4G5o^}wQ7fG8np|6z3b8*hS^9( z;EmXmuqS`H67Pd;O9VqK?aX@kD?Yh~JXFYs3FENd4-0}A08}3IddN0%6tlAc8Ta8$ zL*vVpOnwlGv0|D2%MOir*&-mX9Vl2=k~GAhbJ(4;=9O6RbjL~woRmT}8WFq?sq&d*w?P>yH}=c`E=zwq9(SorR;*?TKfxF#=W@LuX6P? z#2GozW#h-1&I+#AKdXvC?0!Ltr6jWYaf11Da9sOJ{KIdO50SVu8CoyxH1f5jaMEX@ z#ZKCBZ8qv=0TymcmlBx^gS^|kyp6v3WApUj_J@(ny;{DX(o~IH71K2GW{A?GH{ww< z4gj-EOwm5c#7j!hw4S@@BF#l9Wm>5eMKU-FY9@K~zboc8wl8hC38QWuLmi<{j4<5s z3QVb~W}7cjdC`)w_sFWtxxIX+G|$Q75CU{^m&~e4eV954vG}d<$33xR0owq|(GVE0 z6APj3H^PBdB ziJ)3`LyPz7b_!c27^k?Z7#MA9Ik`#a1)GDnN>$n#KKxz$T@b3v9WHFP4DaVwjn~nQ zFB1+yy%T92`lCEt9ynlww^*WBLG98nkaKKAGijexwaXfpBJiei)~8&wx7Wd*G#;b+ zIgGeCIT$-v-f5F=srH4Ch%VgrMv)%xXoF4<*gEJDqSRKg+%K`z+GK_x*4L|aYCWo; z)YPPOUn8n=<$q)$Ly-O$+Ra%d_g_}i{&r^Pf;+RzA>x$*)&UM$gYBrY&zIKeHR_9> zKFaQJ4QQQAf-P=yS!V2gXbF2*oVE}75DofCpo3h8jrl_gBg6h zi|5*W*OijmV5i!3V|k`ZPcROzxl`bjD;?J&eD0-=?Q0S>Va@cmb`Dp7pl33I-UAM9 z=XylW*jaXLj(D)H`epxhSgs%BTuHc}QYq+RcbJad?`a*rglUrVQM-A(-%NYH!aTSA z-*Vk6q3A==KmK96iJcDbe(i*qdu?|V>J4kr`0LgBsWO>BI@_f+#U&oPc>)=!Y4JP? zh;y;0_3VZ96g@OTw9!r1tw9`6&oOz})C)4UjUHv5atr;Y-GK^&i)HM}w+}!WC{Ap* zxmTMLXgLNz>`2od*%VUrQ`yrfTORGIn2H_<4pr1Y*{jh}@_LGpo8VaN*H7U)b>gmJ9jVPmVKA;C1_>@rwXqeja53euyN-lLfSlk`@Ta^dG&%C zAhwd55=&T#V{^QC8gt5C>+N_Z8mM9Tu=pt-+M2*sD9~rca1e4emEA@i)ytPf8GaH=l zIh$av-MShZGii;F-_4MZVFrMJzw->1>*FoZ4O`NCCJywW)GHnuGja)i-n9hxlwH#i z)G?JGQTk)`+VLBzkgbitYs6S)h(1Hn9Dsf^mtRes@T=Li{e)UIa;C%Im6Jj?jIlyF z5h5E2FU)iRoXzynn&U1zi)^@@A2hzT=z%Uk3Xk$U;ce=RDJ4l|#>Hl$)cHm^07*Es z;90dLaS`I~16B}PuIwt&jfpYORk;XyoDV1Y7%wl(`XzW(=ENEwTjR*KDZ3N6`dtpN@itC7}bPvsu=3g#kxP$_SQT2$aOnWfun=A|sDmT|q6 z(qwcY+5%_jE2zl_uLn~URnw}!S?T6>apKa*_(t$m_g7@YWL1h7Pq z=&kS3byRbgj4qeIoXNyjCi22wI=wzMaE*?ccgo zp%a;V@tA43{(k%Cx{c;bE6TGytQAh4bQFhso>WQLne{`f$0I(V2pf(s`W&U;`P;Lh zhUmqAo_XPo{I4+C0!l40&3}FB)5~6={A(QC5>%}o4DktslC}=YudF}?0u?aGM^vPA zi6VKT#B9YXfs@LkIY`d;wYzGI|04CK`+(!n&wxU&^a&-r@IpG6ZvB}*=WiW&NPWt~ zgHd(kLF7tU>LoU|+K%@&g^4V7Ht2Uu9nz%1vi?7do#nLGqE4Frr;liZz z<3$dGtCQ=85M_II_{#LvW6R zYS5VKq*C)RExhT2MP`H~0Ews3orAv^HyktctpnG!o@PlM!jpglIn2cXrnarGCsUQpUg%dxsZBGCZ$a~e?Kj-nxMjw)AF~4ZN>9g0n;cuC2;_TsSM4pXRo^c{A zUJ*I>my7ch_;yS9#YC>wFAey>5ql$duI>Exzywv7$rX?%SOQRom}V*n9p6MfqwiiW zahFOuF7KR9*{7MoaT@5{D~e^zzpdH(yH8{Q8XH|GsQ&{P$$KfLb)S`X^>ic0D2$dW zZ?%?D&=VYD{8-k*x%&T+{@k@!KAZ=30Zu`lu1pZ^_LTJKX@pH%yaK8_NCQOi*@N7! zZH7nui1W!r{Fox@>ca^dv+_LAOa^v+V89k8t9uo-)jyO4uo|U|y|=pO1K{Iw-xf`d zIMQdVkZAudk^VrEA@b{6(XGTscBiEmTD+OlOaSQTQZjPY9^*wxvzkBFkDX+#*65gH z)01Uiy$xEV1$X?ai8#>QxKsXBz-fCx9)1fMra~^l z@Hai(!B^8byaqk?jQV+(A*Gk3d^8C9Fe@IOmzmhdM!8X|xqV?U&R_Ab0rrPWY&oDN zZyb>%vKQp^gow$$hbk|_v+4Dm+I~!Nx;cWgGgA7%4#h>a%UeMl~~UD zxjvC43n3K{&sEqlzsek{6S~3gL?*UQ=q3AO-lmhzNX=HJtT-8M&VCoN1YOl!8EuQ0 zsI%~(7*L(c;&~KAhP-aHrc9KW%2?^IZWDL_t+RYet^F3f97@Z#D1Sy82(tA*YMTC3 zQWKv{|L*H|pEn7@j&7&k`M2n(pB(ZR9!PUy2C{p1$@!~^g!JeX5Ut3KC0hOs`upDE zySSAuVG@YHz9p|Oh?N>^JCJ_y$zv7d?i4r)2V6H@)tqZTfKZU#)I}~cPmsH>zIrEv zthFm65~TH1uYu*?WMOo)2L!c#-{S>W4os^4bR=rV*|c8uY~_`)=xg};1QjWeMoAH3 zvSTJ&z7148NPCebM+kl8h<@Mp)Rl}^iQr5VLM4*?xL}C9fj@{M(&l=GQCF1 zS}_T++m(;p2nMT4lob__&yj`?BiuubgK55Bj)OG+-0mzAoEe~N=$n}VBItEB4`V93 ze?_ZZSV$Ln`+2wSqSc2tej-sL%@^I>0G>NLHz3>H}O4c}W-5 z9Yf{`w=@l|-$-~}=ArfelIQSfGLiAkRjnk~$+vsc!^Bu(s@>QldD$zdT$cPa?LUO# zSyIAm#L%%WZaV=@#N0|6mm-~=vdSbrloY|UDk#h}#D>_YXoA+M9hr|_cflocf%NbX zieq|XVHSXB0|0n2q)>NCx<+lyQB6DZz~!_3EI6*vMajJ&UA!U3;6Oz?S)b|G`6aLDi9+Y z#B#kbhCP5T8HF{i&7gaFf9e}O>0L3Ypb^iOH}NI{)}IcuG&T(C3zt=fM)_jziX~7| zEvV2=@El+zG=n}<6b;|8vwRI(4F;p){DMpsmP)jSX*Tkqb6zfDy914Pjie&aN1t>k zk~*ILl(7oWm1yeg3DPm7jb^_;-wE*GugV!i(el5_^lPr()l;1_x!fzz49zJwgIFP0 zI?f29#sNbpu^@Xr0M;3}rE`f&PSl95WbA$8UPEcWuH`-ziku60wQ~bh?IyXJTNzyO zm6)6?-%38WBpc1T%?kohQXT*_MGWXD&QWMeigi9M81p4}x4mM~aeOyImS-fv!M;h? zv9TH!W;+Z}&C?!dHZ9OkS*g$gAz@M)owYVN_DXK-mpmBpb4Ln~_%APwfksKFS7yxP zt(4xSC&MX-H&thy%hvg92Lf2DSFsTUDeP5Qy5RrFpyrE~yhcnLuaNma7bd=IQej+b z<$mV!$vXQl2Dm^gJ6-h&kAjD!#8AiP80^l?a4Mx$HRU0_te;>~4B>9bJyI!aqWLDG z8uC|q*ka5d?Z|U5^olAR>a^qmrfU@s*Zz|c)wo3u5Jvl3l^1*&VX;4Z{7`>~98ZIu9JC z_D&ob1)Ug{ciwhUkLGMTvgBGbjX!_pX4zRN?5g;(y*5~4Mnp|)Jzt!52G;U6GpptH z^E`BjuCCgs1&6=^(6ThE;9F>yto46KndmU{BR=lDx~ztCEK4hjxn20c@ETXJmXfEA-mf@@ z>j`LtaZ^A20yOywlgY$KbJQqf#*E}#l#}M$9m=O2JXFzxp|3HAd{+?h)mO}?-#Eu1 zdB#SuF@$%|H`Wc*{N^`qd4JM(LZizQlaqh)=I^i#RZ8a+Y}G8&Zw737o+B6M8M^I5 z4v#c_pkjBZZvQT86Q3~GkI&jlJ>y*Y!7{Bp$Mqz>Y8$iC_iu#~=Ln1&sg0c8ZLXnW zwZ5vqZ=UWUf~$F@ZPAW;#n>q~l_x5$XSz84AU|#fRP3yIysuGDheSQwORuy6^Y+$I z=ETTTsL-hiuTz97TTb3`H#oLT&-$-|h%V@7gPUp!Zq;&**YIb zwA;xU40LVz8&#XN)z_Ns_X4cYoIT8oy&(L$qPn>)j%R6~hKO=+1 zj?s=lxkG=sTd8tj*Yf&i2gdD$`Kmal$cEM$_wEl~-NNQxGh}en9eTFBQ2uNX0VIq$zI@S{{D7cO+b_BHtY4awk_j$VK3e@$ z-W0j0?)-s9u3az;m1n>v#*IYfzVF-W5U_rYjz8+5^3KS9q$$(np$4nhwW&1sNH}wm zb)~3E>?BrUg~A2Y4rl4l3zS7|hF&~}=${2p zFG}uPL=7TN)$-`iKSsstnUiz=CaU{?kPY zg7Sur+xSLVbFbG?5cX)6P z)hevZ-r#CS+Ny0hS;5zh)tXBw-Bep>5qDCVLiVc}(AX!qrelqn`0hj8PPe(Zu97u1*Ka363mIVdz) zW7E;-fPM5vXT5)MFvs?NG8s<>rHZbB zmAySGsIAUu)qs&!#U9hmN8{F!74823-8r{Gjs_?=lmZ1G66ArdJa`^-kg!_E78d5m61*lPJ32&`d<7rOP^NrpW=tP zaI6&-iRp}SQ<~;H5)*Ddde9M;cV{oPGu5c2d&o?S6G`el6-`+3tRS+fVn0!#M9@NW z8aC!Q+(#r*tw#Cha-6Dz!ivt7x3_XhFc?u7@82|+RVQXa$>$mERy?gAT$vbpQ?ie9 zR;8QI99i`-&VDGZW&+bk{{W+wX7xGGC$&%k^BO`<^WL0KZX!bh;{)5KYKON7h4H|l zDzLg9U|C0`oK}MJ4Uq+05&YI_7}t7xj%oe0;#+eLeQGn4-lWUxY9x@B7#%2E7B=J# z)X!T_G6}md=9OE@vL*=i4l!7pf4Z;a}J$qs|k!u26&^Vbt|-ih8!AG zAFM^T<|hQI_2QXn*G5Q#bNke_XjH`ex%A{3Tc)`|x2m5105l`j!vllXp@Om=InHV^ zoM#=X_`#MnC#^_IIA9o6EJ=6IVN-{rDCjCO-~xIR#UXS*@Im(#Q6HC)QjdsKAA0i; z6P}eI&OMC?YBlhUhp!r=x!YtJ@h zR0Ed(097&+XD6pxkXFXvPc=V2D2UuferuAlfN(N8W`enk(YTIBOqvS+0L3iK$VVNj zaTeGY>K%q3qu#0VK|MNDqq!%XQ4z3q_M{Wv>1!b*F9)28 zOMRs>!d@|wr>A<|66n)HaMC_fL+keDczEiTEexw3>FJZ~-|L-A6)Kc9H|P z-ErQRM{6~_m>}crMqt*$3Ad=)deN`~O(N5B02QRumNSCxbM~!jF|@O37lq9b`c~!1 zTyfk}T{dNoA-FC*@lw9Mi(x8%YR#rItEa^i5&$2y7XnAq0)f1|+}L0BMQO1-o}vy7 zWvXQi2>9DY{uz~M%`V3Z3F|~(po%>ERgCFTTy?3ctu31Li3p-$n6MmiLrW+6O$(Ac zQ8JK4Q@CRX6kCZ@i=Ndafmw1zai>%~)Ef089cc20#a+$11?fw}A{+|s?f(Fn*awOY zSi58cMz!OIwsH&uS6xh@2+b#sS3&VqT-`fo6jLJECChO~*-Az^topNV=8m+RYmAy@ z7nZsP%8byOf)Y6CQnQd19M!ih3UgY&7@tW*S!|k{MloESxi~nX)@I$!W5vC4=G$@} zD<`g56Tr=V0t`tI$fSD3x)aizQoel_p2QrC*Q;9%vJiN$R$AB6gbE)Y{=F!afNkkj znNxolKmN+JOaSTydObYoG$N#mt5BBVKs zQw&B8X7w8JX=jmHI?^pd9p?hPFG*VDb9t|dH&lV3wJLcOU;!7ftG19jP#4ma=~u)c zNHf=(CK0%bQ)e5=CTl@!5Jkxp!B@c^K;nvI8!^+YL~xL+*ZTWMl+lWp}+#T z_aV5=c}Zi6&Y%})WH<(?f*q&cocRM8B7wUr7JF7}Q7{J3E5I!Q9o9)1&0LPn$Tccu z3gy5ekBj7FP&Vy=2?WvcfJWqR+PysdaO>*L*!vFE;=zH)#c|p2PQi*D(cV>MlM#=p zG1vF4GPRc&Ac7BU(9*Pd`}4u6N#x;&C5XocmiYn*mN6m1pQxOYD6J(ZF4&2=s#)Y5 z9!U4Do46U)GIlZPo~F2M-<%d<*R5vKqkMxbcp1$HadONEOy{;}xxD-kPz-d(S`nke z12AAaW2vB*d7qnyM{Ii@^*L|EDnNuhodVJK5tN6~u?utulaHEBdSinP<^l8ijTER` zxo3@~x=$kq8+xDGl}~c-bQT!PO5aMJiaW8ZFRy?juqT7p28mT$J7$^GnH*sI)=Wrg z{$yixnA~@?p7`xgLU}gOo-o5aeA2rKT1yBFzO9US9B^peMpkEwXAv>&*iu2=E(>)4 z)psfX0Hz8%(HejOGEW%AQZi99?Lsbe+aiCeA_7sfoMhs<=se^Y;2Nm05-|2AgcDMe zbTfm_dRB5bF-Q(^p0x8)U?Kt)oeQo9TJj!;=B{y-IO~dn8*-zJVuzi#F-7a~MIbvAXP)#R7?qry zVDU;1bo(R6awr>7y+=67%O84;+=R&IJ*c}#h>cW?WMt70`(?`U&{GK1VL%ui%@1z9 z1rxX^JoK#xCtw&VR4|dLl4jw3>IAc7s_tXZRc{tqUgkx}=$Xw)$C>AFV@xk%YQyOn zW0O))IV)Xg!5*dqtogtGioT|ZTd-~x?<*9Wb5TE#qj9ANgOx4K=$ ztj1Ur?D(NJ_SY)ugN)IN%0LZRO+NXuGDu;;4O)8}-!VWWX16OQbH=i%#|=wvE!Z!q zcYKOt8{_Rn1q>@#Aw9G>IT^)0uv{qSg)oBL8a~D>uoPc}!LC_T1pfdOy6RcwBw&GB z8*3GH3`Kh4$y9U|&b1laOICITt68O6ji?A1q;uvXFa~o@w24jzYMza15G--hJ$7bg z+Mm50CBYHWsX>xLO;)pnky^XH=I5F{2#I}I#T3dEbfr3pb_G_mnB02i@B%<0g@1e(q_zK?84R2lZE+}r@THGC0mi;@o%pHYyb`fzJ|>CStpl=C`O zYYxWblT^Vu#&*?)?K98)Xln)s*qj_tHz3OV0&`H7@ehCZU54s4Y??IU$Sls@L9bB} z>Ja0C1$u%pZpdtws}1+3tp)gYEy=3phX9J*bH&o?JdvJg8;h2cr+TU5s3^hWv#m&} z?b*&r=A{%2D98}8#!X7C#>H{t* z<=lcek3Fk7EWzi&T=#^9+^=%MrzLvA5yZA$T_EW(R9rw(35g5eXB*pX_})oP19^n zIIO;@J2PXoHq`Dw$ju;>`Hk;Yra2HJ1${vKQ;QV^fM&q=G#;03T2Z_oDDp_H9j&q~ zY+nUOIU|u<{Cw*@+;w1WtAl~@SH`6VdsjjHwPXaVbgL9GQbOm7^f>)R+jqqd`=c59 zhI>@ZXUsc}6!orbUU8r1rGX@r9G!$35r}h_J80>EJOPTN#;3T+qL30gFX-L#ih;dg zF}ai4u9_byw>+MnyM3r-3U@N9JD!EQ3dS{wwa1!348Z(Vb26#UOE?%A?NrZk<@99- zx#@#T=bf-{!27xBMw}6OG;qW+%4BcWX&cHKM=UpFa!+q+^~1cRG5SI3dwr_N(0N6% z>CSS0RT@d6wlAqXvz)A86knP%Q=Iw3XeBoS@TOQ`E11Jg3YRIC_(kervKvNvxS8YjEe!mrD3&9!YxWEN9 zDx6Y~*v}MPZ;(D|a2>@GjfYk1k_$3c-{!h3 zeOs}X`&EleWRhu4*q3U9fCWV~>6ntulkrZ{0TBd%Jr7=6i|s|LI~|eEx2UCAH7UM z%e1H`{?%d9S?%`V41-XD<7}Qx>%r*6aZawF1#)@!pd_{g5sZp4Xe+HM2^r);hGE)< zf;Y904sqIi9ns0M>5plp2j`CwOVF{(v z-%T;b(~o+#%X>aeX4=%}4Yc@*;h6NMQe7%X^FTyMT8UO;(yheovowvIab5Duj+M|t zeL}nVg;UKKv^&`c7{ylwpo#btXt_b&pwg)YffcN0L@6RXcc5pq5}uV@m#Bb-a0sCe zu^RPZL6WbU%tnU-lw4bq_*~J4SXVe5=<5)&^NwoRcEV4^=molPy~_Iy$?7^p%qd? zj;ltuTAWxWjB8cF4^A;gtRo!axOf$B#e_$hSpqxM9&AC8T(SGF3~%RHFXpV*ovhYSzU8Y<&Fk^)UQd? zHcDFqCbXKB+Q`QpGgVoD4r-=D-6>Wm>ies_Ct3ha<)Fn=B<4<|inLe*QMfGRWY@H~ zq>@C>O!J>=xLSGAWb~(ceYivlRY?0*x#vZ=BHGwQS7Mw~6gyYcE6^cT1ZJ&mt`6=E zdSr07UMj4DgP6+`hK%|_=O?vT;o@=X1R8{gb9#!A@k)*@%uk)mLfp?7KAeH^T#_~A zk;mGqk%3L31;Og%(MqXrBN)b8?^XUN$S|q4t7~=Tn2tTDd8b75AYy&{R&>aW(I8^a zG0u7uLrE&H5x=Y0RWnGhA@dhG>0Xe>Zx%=ccNxWI)|AVIC7%p>(6OwO$%1yqJL9j~ zj4cchBS@e-jmWvlBiztGjAozAJODWO`&LRS+r)K5h zLfr_#$7+(hdy@oL4o*oMD0Gxb^!-HQht?7U1o~WZvw3od!3V$1TXw+_CQ`tY$KH^>=3(`F3>scte5Hyr zlfpwk{;YKrECB9SLNW1BL=P{D)Uv! zFyLplYD&A~wM%v!d{kuPiuN)NYEDka89faL5j*kIHFG}oE7RJBV~4=bI#iypQ1=Yv zbT|~^G6#BDXt?Ej(|tbJyn&fZA8%@87N>0+%{K#uG};Y4SbCQOJ!s2lgg{|HIQF6j zM^0;a&bbAoN(RzE9jfyZfsh4p71?+MRJ^$X%Njx$+t#4Y6m_fFRE~31Neu3{j6g`K#OvVY<+g@z~^4m#|5r$UKktOW6vOo}#T;cW}4_ zS09!cH6>?}(y4e<^BKXSij3EqH3J}XK?YQgy?yG)csQaG0OO}M<%4T_g-Luofl`sN zQUhvbPwhiCU9svX;<3|F*$5n(Z{hbIVC_o(01EHWaZNPXS`stGVW#TVMOgaPhH*%3 zE)N4VzWI}>4Od9PI~Y;7%FAOVwBixiKXb5=>I3{vae zQ(}@T!|Yo!N1g=>J>nqhDaCnM$dQ48O!h5he+4rAbxXx0ZSh+fU{X4BL&;{Rs)~F^lL>upWhCbVy)Jt+ z$1VQraj03w0pk^n*5SrN5)Zv|>zrEUQKr1?F)6P?w~5Cid3Y>H5D~JU~$JZG>FXk z0;sT*u*EvFhs?!MP;kWcZ@GV)YY-I4t=)N9`CO52f;N=lBjGb+`jZYg4~?UHvILh>PqKP zRTvolC|A2(n~F0Ga0hy%-r7Z(5;v0>3z31ES0((?A5IVxShcAP-r^yGaI#~NJ5aM- zM8v$TSPtE(NfH-eSdw|-x{;S*yb^$9iWHf#atO_6HE+tD8>lDw z6prRK-6l6=^sJCr^P}>|3P8v0Ph`1vR0XoVar;t8a27JX0U*(~Ze))qp*&QKSnfc* z$f{uUx$Ft4;Db`xoc{p2lan^>n@$vQS0e6TdJPz440?N0YdHNRkU6Ob52gCG)f??y)g1JbQX z!mcV@sHK%sDMdSRp4AQ+dG_Y7IAO@Vd(dpV)EIX89%GJptsRw^jYi>`=hIP4c4$U+iiEbiSB?!lNP*xCSEjWE zd92~m8#vrZH+$3g!P(M=NaKl#uE}_doG=)vYqww(Al7#3B{Lk+*E*8tnn$SLsL9C9 zRw<^IwsE!z0MmPWWsP_ktbUoRWr*ERQ&&(ikw>U~(`k`{oKidCChiSQ^^kHm3LH*u zTY@o8tV-6_S-PBxzHKuoK@?q(5k;Df?xK*P=bDfI02yn&3MnNdfKSM#`Y(s!jHzV? zgOgTCBtHKD0-0Lsy8zln8wOUU%F;Mg1praIKoyveT|tbVXr$KSW%_{q>GFfdnOw}V zgOk#LI<#xXX%@4pZqJv^B8KisB=zw}lAM0q3!C_+UT|p@?W{AtM*^U)wR4^*E33E3 z^61@aL9pAyZ`@VJ<}tz=%-m0M*v3w1n^_r8tn*AYrnSSkr*N3jJwyt`wx})sk_jEC zYt4RnQxOawVOoq|ZScOgPOi1;`K7E{rP8yrp1fD77}~>P-eyQWxTbL10KAGZ<5=6R zQ7yutBO;@q?;!o zurmIjjnkfnuG91_>J01{=O8aX?w)zQRcBi6A+6)UVB5d3PuoP*1iy zQi(4vM&jFC_Ur{_^wuYHaHG-`06nM+o8(Rpf98d{{7anV9mlt7rbR`_QMvoE?OC+Q z)9&DVj>;dgUA1&SpWXj-raqUD&aIxB3 zxKWuK3_d;Sdn&s^i2Jg*Km4jUQ?4ZdO)24(7WeB%Y-sap~<)2OBFZ1zdBQD%2HV zG3lYavw%^qD%}7pg205u8sIPhw+F}UYa!)kIBvx(Y@_N#qw}1>}aZF=h z%K!{e_!!`D4k)ElwXxS6QXR(#bI?@nNoHYHftZIpj@3JM^2sOKq_RR)Tkk=f=i}Om zo%0K~Q`;3l_O(7)p99J$Fc|>EHwsIkjTRhbc+shRh&tq9HZ&Za8{Zu@X zda!y_p;0V?COA@hjK3fzLw(Zmp84u5Lv#8?75Q3#t!&o$Nrb6Q{;qi2y_Wb2Z1SDr!b zRXG82aZymkfx?lRrc)+BToycis_qXcGURlsk~Spn%KLrlO3E;Nf^s^Kdg8N4*(}oE~REFeHrDj!+Vm<4OgQz{IbR&`P+O9xVPjON}WH|PtAzj0R zoK+E!&Q}@5H`DAq;k`EkJ?OU+mY$q3a@Ay(tX#*B6syvD-$hOH=V2q?Nbpn(mz??a3R%9P>Ttl5IZZk(`gU83vysCx70xeo`ptDyal)af*CLlP>yvk{_u3g;^ewP;NQRX{~M0 zKRsxhh-2H@nac94e6Yv{)y^oLH%$_--U-iIYc0B*;-z5TT*KO|8XHp5qKXVg2O_d^ zY1eM#ChoQL^BPZzHs4OS5tFoLw>f8P;_~SihCzbgHKEZo4WoR({`IxIvbT;y(wE*& zsD)$3dsCRTN*jAovybAvL8Xk-<<8^HdWEJJx`-JizlzV@>jjvq(KnHhO(mAqo*!MJK)`624?L=GKfH)F?^LC?bjuD8{^r zp||pY1XD@zVms|lGjJrji zLZ4Bfr#!RCAXq{w52=p;P&X+g(g?il9{WdX@k8bU<=AJ9-}tK-GL4XdmN{}ee)Sjz zMu}uA%dp_*wR&Ji#Lf#az!XeSl`N0}mgS^+h_}Q|BNAUZ&)R~nHY+T}m-5i#??GG- zHsyC8StR4yiu_7$5Dr<}b7!~OsWBPkmPE*8Y+!p)OOOqdDIgAUQl2m_dE| zQsAz7)t8dvoPuae8f8`y%f@;dU3%MRcu5$?2eo!`C0w?6>q1`6vRg*O>jZ=HDn$~O zjz@@`ZyCp6YO{j5URVrbuDXoe0kq-N)FZZbAh5+rPnO0a$~irAQ&kHH2e-8vVgfw3 z(mK^no5pdp3Q`e*Fnd+9sCGa}$3PEClu?WhHxWb_)W``LH6?M|hLJJRJJSgEv_6y2 z`&BB+9|3sA4H8fou^$5&q%0n&)Q+8M%XclDoDXXCz8`4ETHqL&hko@XgD6G@bJnDm#Pt4QTnKS&&! zb49Fu(n&iaq89f6W}4Y(Q%n`uGN(?J^eas&%FqK0M|L?a)X=wctP!>qaq@aq; z@F~_)FO@hP`_Sq+-u#yOMmVoDpyVkad)2X+q>TuW9lUTl(vb2&z;l9m2imH3aHX@D z$5Tu&m?7A4&`{HC5aE>Iu;g?VAml@EJ!gV3(v?XRmQVS4Xperlqoj>@6(<ZCL!L#l=)Ko@OI6Vz<$CmiW-T#`))331^I{01jzg#kxpyjL>gz{>Hr&@|GE1E0pQe#~_8% zmCgv_i?-8IPIlF{(&2Jer#7P;W1I@@%yYCp;h5kq>i3z`#fsZyxngF4A$*idEXY^{JKaq0)ex z%ZQq~Nr+MfDZJiKd{t?YP1WH}Qn_t>>{MWitiT_rqirleU`gV!CDy$!h|4!~ieUw# z9#1vcJh+q$QL$V{irz7(2uhxnFTgp&Q zm4Dijc#FkRK&%%z&0$}}lHJ^TH*L*huCcy(-><1bucEjBj8W70o+XFU{QG9UZ>I^a zFvJ>r9+f4^f&Tz%IqufF;zw`%ULJA=?zq6FT3zbhg?*?00L@j{_*rwgm(}h?KC;o4 z*bL&jdvo+Y%>GvZSE$QGL_#>PQ|&X-#IA6CsAFh==M;V0q-6BX4;-7m^@AOP6&T2- zkV3c^p<#4PwK{K%Yqep(y0J45)DAo-fS*SN^6mh4KGGuzZFFD z9+|BK?yj@asETZw9#%Q13AUVZnxdnobR!3XYId=e27R3u?D@7|SOnD*lVo8KKNi^sWlm%;7tOD^rFa9LSd zMP{`M?qh*>G|whImy&)cP4hV+6e#K!+wV-KQRqb(BbN3Q6rx77^LPGXeToN6&|HpX zAV7yZPUdnbE9ZV51Npj z9zwJ3Ql63ex(eNBmkROb77yIFxv!a9@GvpQUU|i7{5O2C%n{paHv=aW$}DZ>nb>e~ zS?ym+zrTF`C1XH1K)ru@E?fBW0=Nth2R&+wtxQJ~5hhp;fbc1`NM4$4t)zL86{q1t zxX2mnf@)8xLk7^2A|MzTAM~%B_`6=!?{CuH(FjJ)#1F^GG_yw2b?^nxyyKrCCjww!;Wd)^-X(Jh>POqP+nmRjsP(#WLYJYlJ zS!s68%pEqbRd0Gf@hW2=HcFnDr83U0WO$W88~{DN>f33C&8f=))Y6PY?O^er_1=lL zF@#{aR_avH@T%i0+*fZlhyxG!fN)p6AY4+Uh{>LNam{vSD6N1TmG9b=L8yKz5@U_w zo+Ii;7(e~hmh(#>^FRy<ue+Jv$-BvU&pH+((`Q9#?qS;lflwQ96@$`B$d5RO&3%@*RsZJ_kzf@zJl zpkwSR)?|zlKn8%DTZY__cs0-KbJxRWvrKgr0RTgRip$=3tw14qk7@;cQ6!Clnl?q2 z{cR_a)-n`|%Ii~HF(FAGBCog9q@6**=By;UW!L>xJcF zeABqRwFlA%%~dpszZ-xRo7Kj%1IMPUxGedm_Lh)C7~6nA>q6T)t(jPGaW7e?n$X@ezeAceY@Qtc#T-GeZL1LpMb)fEJDt3x%3-62^ zP`4-_pstoP3sFHnp`ogEI+DK6qJ zbDV)$_N^-?0mjbnBFag?&g zNj-%ryYUH_6;{W{p{&w5iK>RQ9U19ez@F zteMR^CoiYZuEggX!Tsu(brg~KZk6*LHtuO#mnNUunRpIPXW>S(hHFo}+A**3N%X99E+=nB0z=OB~<|cVv;q zfr(WosOwqVIL!A&$^5vFBe67enyOn85l3FVd9J*(PUMlu{Jx{0$6B08fwQwPC-AUP@0|WHbZs8hGWR*AH8jauP>!kBVz>UFgZ2YtWE*BQjBohbD!p` z(9&H(VR>-j$NtP+0{pdGajQi%#bRLU30#h>M+E(|QeSiBLN?Z7pe3;OnCuk&dRtSLnM6*kuND-|Cb4sjtBL+i|aqmOj#LZ}l z({zKSL2jc4Si+1T>+)*9#f|YoNog4I@lq10oyx=1zM-0giJU+Ab*m+re-gOvzqL_w zDUGE=%I9$SpuksZ1ChoXk(ymI5uMysw^D8-lgGUSb2!=VYn`nJo^rdpp422$`LLMe z<398~?2Kb#rvy+D%I(2C)J@`mE&`3i=8d-twLnG6{{S?;+F}Bga0u=1My1$nhFl+T zDTrKXtaym8eCMrNkqq&;d}gb+k=S}8Es8A0R079tYiznAF)$?Hp47?>j*6skyq}s1 z-ah5G{F)^LfcOWIf$d0kSy>`d00Si83KB#T7L#@e8KU(tPJ zCgt*#hhDXBlnXlJD#I0cjRwHqr=c}|!4UQK6sBtHP1`ne)1j)~J%|b9=AYa~lCdgC z$o;4(p#cu=eriD#@IePWV-+2Qqipx9MX?7U`f59jPt(2#p#|n5SPn?VS-;PL6}>GP z+=tlI<|0L79ymFm!~UVr(NI;_FCx}twz)=Fath0wDXkJpZeYT{C#s)n&srfDpB9Xm$2N}g9v4-H@OLHy6s2|i>TLe|7A4*H<8c`pRtIsT700BkZ-C>q8 zN2{`)O?>{_TuWqV?efnjp-T*wZ)$Df%f+|UC6evb-WJBjIof@zUQFX}rCAv*MDxk8 zIXg=ZNUL5nw{lRi$>g4u3v1{^D9tD`{VqEOHOVg(Vv&H#o`CfxmPf~OppC=~)t4$H zE3vW&#~rB@mkKesV~(EGMXkvTxk%6W=aWhuCA&0CWg8bbG7fh9(v`T9*HCC~2}Ez9 z*Q0#Xl)Yd8BoO=+_NwNBIZ%fg=O7;6YKA4f<-m3fr|EH147)-%868Kx0-LP~F_7qb z#!pY0_noJNH$thVaAM>wuR9np7!NE{l3 zw(>u|D;L{9wM|nBK*=D$u95EU8txe{iw1#8Bs;#u)BYJz*EN&EO+C-C(N^$c| z;n4yRc8}t;T6K?=7z7;q(JrA*06bOVw5khbfkyyP_jgK}0-4;zU0WH+rK3rCUnQ$H zR;3H)yRKDD12fK8;Sbvtva{1tIPgFkEu9pe?4A&?|2EqGQt9;O^eQn%gwq z-%|!WW11#ArE$olzuIMmSgf3nb4qS6Ztb6LIQOkuGk!Ib2-sv04I%LZTtxx$PD%E! zX!rBnzS&~W$*lplickZND4x}rz-eOgYm7*&RMYvi$xInc=CpBI+uQn;K&hLEhDKJQ zubgTcb>q2HxDJ@54dJFNe8TPTUsJhwTxS5EiqBt874Q`G>?pq5ontR$;Xuumk98gY z0O4|&+aBMXR=-P#nD=6cnK|Z+9#x#vv`2`kIV5+dhTc^`t5>X>N5G+OwMf&e4l7W7 zSeDX8t)8?nxhnW>C@YO;%=E^1_n{r$U#B@WYQvY*Q3os!??X?o#}Z{+aoaSKdpVqN z8#D}>G}0ee6k4Y~&IgLr6Vz9!0Mk+&hLmUKy;#>@7+rIGks&134_mx@tFmx*XBBPz z^G`O>(xVa*pb^D%$31$WWLKtEX#gCPR)VSCuhPVGP6;@{qMbOsK z=XYSLquic?v)YEeqg~uX1+B!BG`SH-BR*7wb;EQuP4G=hVg2SrytIh!hQ$F`f&Tz0 z2kSq6D*MSl9|A!p1Ssn2h&F}VasUIMt!p?{e;TmuyC!6t%^}HUjg{6czOFSlYC3;T1+%@z)i(K;IE~si17Y`(gkH*WCOH zOQS<|tK7B5r7&2TiQO+#j@6mB)opLDB$69>WJNn#XYcT$na8Q^j#rV`l13DCRrVEm zFBZF7*JL*G*y#jC8u2{u=?J2g+Uj9#6vmQBNWfs5LHm4GD^>9Y_3hcVuu$ypm~Fty zgZ@$)lKbH=Wb;|RGs zk0iBlzTg$f!O6uXSy>wgB+)H#B9#gC9;EwKrv;OVl@Ne)n(Hz~ts*z(bjkOj%ACi8 z>VD(33o&JI8|Vl5qSYaj%C2%rKoDc()GjW3(4gQQxHKy`+A~$K55@-J(zB-(NiU$O z>}gHR+>xASjK9i02YzWi>!~W;`Wg#|t8YG%DlvsTfl!Na&JP`ltKvaFoG40Sccv0T(|O@1R-y|85r6@^7e|{3v9gCIS;i*U^>yNInPo(>(EAafZSLZWKuyQs*xcaoYp${ z)FH9dUgqgyDt4YpHK1S;J;#uG=e=ii+d~eZM4*B`pPF?$pDgEr+OsdF=y@(J?b=(d ztYk&}wd@bQ1L3(YH4RExq?c<*K_rf7gosZd2b2dH_ouO{rB-H~y0Gh+ovpg5-Atu&mGY%)zmwOb>oK*4t6LjrOAu zB~CtZT7wkXUda$%a>FIJa!IC1A(cZZAfBHTq=XKv2i4SjQF?PK$WHRg#*m%tWy&(B zS=03o)G89on9^OD!(qp9^G4n#_>Kk+GNzP9?Y+}}-NOc&7D*~Jt%Him14C z1W~62?g#3whW;pM-;QXgmpGuUjxfzmblA@I$68$ifyts$@5*7c^H{a18u&JZ&w8*r zj-*yD>%;~q$>)!1MRDU{8*OELpK8aGeipuxwubs_E)6`>^dS=Z&}Ok-4e=Cng(Zk@ zn)-E>@=k*US6*_t^{_K(`&ZJmvhLC2$;E3I3@g$>9Ew8<)r@QB&nqJkP?4G@CRV}4 zY39;lEs(Un`pqFjh5rCmj~1suQ;=~;wXHf^k4{bxwK|C4@m7^Ccokz>%US3u8!ibn z#VjL>je?)SW?vXuENQu3l=zF*kz2tS8QKLC=0_i}tFK`e;kf3rnvLN=cJgTJ(w@z( zE>V<#z*1YHjMz9m^I6SC`d2Nta-Vtz!shO4kfrjUdgXd_oM*Q4PEfcY159O|k$4od zOw4eCYRlWT10VILS@UN9Rfl z;H_B}ni(?rs^oRD&ePN0wF5y62?}L+A9|{CtT-aGjjKx_^bFUn-s)E6P7Nyz?p2vi z%1b7dJg!M62DA`H(cm!a?^aw)ktrtw6&YD}(cTfbf@9qZJq zdqed!_l#UM+`b|nn6bkHG3tRmlD5GMsD!6r49^h4n&?{znWCt|< z$e_S;fk3P%oGOZi#HKXktwYsn5#nohj2}w^4m;P)d`+f3+}9BZkCb}-t4*ie$j^dL zG)>wppsTKP)YGFMFiRJL&0&r`ktYL;3Q=_dA6|O!E9)0pYD;WU6a@o;idiRz;TFDR zsu|A;2>*d+;s-Z1Pslk6$7+Ze(ls8V_$>yP_aUroHRoVBgHN(mu8K4`c! zT}-JBWM+cgHsY(+L-SfqK3`#hoC>;oWiD5%jt_Dun=Lj-(VU?G zd;8NMuOvmKE;~_{w&B?4t}{@EH&t@Lu6^jWB|so!6oq?o0}cjpL2617`0w7BO`Vt& z1k_)<Ck&3PnhmPR0 z5d1GnxngrPVm>4HYBgA`^;s8~!*lciWn{2L0C(Av%3Lwd{7sBqy;-pi0 zhw&a~>gw3;XnEpkL44qzv|Oy%QpwaDn(F6ZZMg@fDiIP^Mo9-9jV#pd@OQ<}y*s-g z%yK!U_p!8Vx-+?Z)@dh<6OP9{>f+*&`lZtS13+irUEn-lHJ^ z?KuiN3Rh)n(a$j>(oX`ltc=q~_WNZ>GOB%FCY@T$(n>tWEadu_($VEc=pS)nzMZ3^ zQ8sE;RV+xyCb~+^HhYd)cAsHa+e#w0To0u5&%G{J4?aNpjb2$}Ay|4?<236nJab~- z2blB4Ai81aGe$@Ra*CM@&J^fgSw;ja3K?}G&DV<8 znDK1ozC~P?6te30O^`4}Bx%c!s=TaMoY8yJIfKywZq&}!-A^=%DV#9JG}arviIQ=} zQ>d&rP?7R6Ltko8TOlssd-GXsTf_{qc~G3O_N5Zp-)alGMj=l;n$_wF&-HGv;#lXn zDGO$k$t04#NZ`{8Zw@817k*DuOZ7XLB9zA)ay_e;S6w-nwU#G~5-R83hp@9zaCY)D zOOo(P`!{6wrj`@O52&%tWZh}uwjnW`P{j*S#a!30(+JyfB{ZYhPXwI1QU`1v%;qVrm*WeB(w8M8~4-0P7`msf^o z+Z!owihZYUF>Ya9BNnT*(x6uaAp28z?NL+!pnZi(-(Wv9L14Kg@mj`ot5ZQ7Ssg`V zHJj-IF~_F18kNdU<~7C#&1L*U97}3K72ViSb%K3KjI2gNgIC#V_?!cpv}vs*5{J(3m`l&scM($6{w7znd6#s;mcSf z)4?qpGjq5OO-Zu1(rs@dSt4Y0`5cP%A&D*^1X{{f4>%R-b%%s3jz=|MizIMsL2+cL zNyRUl5uTkWD=jSdE=L%n(%)bipzUuJR|I0ccdI0Q4QdKxHlVK=RYhm*wKlq&YKm~S z(#)I+wP0(z1MCYHUUf0*c zF?I}Tw9r}HTQ{2$Fg-yXYvVd*r+*c|D$MDh;=YZh>PAQuJ8jK$=cYR6628&2yJ-ZL z_HnGImS9gl)TZ&!oqz&zPZY;jygRmoo;ak->OQaLy7I!Oj53}xiWXJifzp_^2nq)j zB)|fA7!-gm#{z?tD(@h2-RQf6xZrR;C>xGD=Cge@3#UG+7DYXF(GsC9PEG|uvU^rY zP~86j+KYgudQ^7q?b5n1IO*~zLigb4rm#dxgSYps^BJi} zyJ=pZVbY3<5V&FqZs)nG)ma-nVyu!wwBX>LzZI~tTW(#jG1yUP0gW3xvCb)cHnQD? zRLGC@H@z`<_H9wvVxdxSi79R5%6j$+D9BZn3ww9@rLo!rBfO_`6VM;xnxXR3Z`4T1 z%}K=EKxQOIj=jx!Jw&cTs~qz~O?B%e`ht!JU}#HqmF3+l5Hpf0Mwd?nj7H#n#Y1Ym zMX{6E`%s468e-WciQrMnq9s*41~n8^s7H&bBee+>@**-4eJ2Aw=#oD=MpKRm&#|g* z6c=1^#Ys!e>Bf2MwySHEYf#X)D&D0%MMmW}ra{9mLMSVUmPLy%wm{o~UWEMn)lj>& zj&K=xd{7dhUKnLhQ&L-kj8;*D&@k^;ZVWi)gwNeTRhw=Ko|LLpD*nc_cT2WHdwWug zxWR5Z_N-Xcp!3Hjp(ZvOlbSj8r+^%!xXO;NHGSZwy zIyeMp0G^yxDzUSQ)pHSS9n^Q=(UfDLIOe?yuEZ$YhTaVu!i;u2*J)gUC9zpq$;cfs zU6^kQ7-T8_D4>0K_Z7>Sl^QUwyUZTl54Bpc%T(LB6NA=t|yj z;g2{F=^MK6^qqpI_x%{B&UyvdIl&ouf=wTe6r z02HLiw(;^ntj@oy-DhR89jA@LnMH!UXX5y@yEz$U{LFAG9pH)Xub`V!zh-GCVpUH- zD+l8wy^{7cyk>m2`mOebDnnreOTkqc0-Dz`JKr|bP%j^IoOU!)>XJ*w!U*>1MM)fY z0a^NrF2>r}zR|(&n#a;3K#<57nufHcjzut!@b;<|U3oajrVFPm>KKqkGm)|L+m)4m zoz#Aj;oH4PD`r9a*1mljBpcgl0*(hMk@7c6|BR+9$;klz>ySLO|Gt8uW z6N>q+pKC3&r_Gg^bmZ4>ZlsRkL`*|_16(KMvDf_NeR-j=g4NnHk&ZqoR)wK9seLT+ z?iTCxlg4Nt2)vquM{ajFP1&!f+rb@`n2sn%9WD`IwW16m6rd0g;F!?OSJGJR*B`DB-jJ04;jHf|^aeP79NY0&8vEtB_rX;I}nzocp*V70y>orL);K(mGOW-9A&?;uEUlQ07<3q@wX$~=oVW1= zOm_K!NI1nak5bPdhW+boh?2@O4ir_E>-cguj+F?n5wW|9BYbVt)q(4qmUYJzmgr2` z+PM_u#}jk9tVD!$!KcSl4RHjl$8>Be2HT7=HMG3^FjJ5#D}N&S*pC<{i_RHTE|VOw zMr%$fIvTM#v)0O4fX1UR9CO{5J@}VfQsXM#NjV5sWI2YSpVo zqtY=-^)wQ0!Ry+Y&JEU9W7M~5uNmagmoZ_9BY{FV01^)szFDf>w(vU8(h-WhgUAsG zK<29rCqclX6FA8j`KeWw=#cV9G{q+*4nRKwfsBPCJdb=)(GYn*Pr0qeYSFof`Jz%Z z&L0&*Tm{JspPtohZ1^(CfV~uB{nnWsB!^^h!c;DLbg7h6=?5$h20PUjAzc0-s}Q-` zKgj<8;=LS?3~tUxpCITt*eXK|I|8Z?Qy)_rz+s6P`%w1rGpH`avvXaN+({!54}-w4nW5Q9xB_xxmB~Yh9~SQgC_0^Ztt2kDR_k35r-W)q0@YM zQ<`961cn6Wsk=;|WI18hqz2)D869a|@2F%C;*Xev!5H_YSE(Xkfe^T^$)#vN67=*r4F*G zT(2YEqOxSK`Nddd zAbeJUt>Buz52zXrKUNJJ2h7WRpxh!PAkRhL&mZd912B8s6x-dhJ5^ zAGH+{>lV?)Zg#E@u&-L;w?XXEMsmy)$-j_Pn9NOAF1d?bLu*NI&960JUbxJ(=yVH#^BHI1AE=VN* z0EFAmOo3fF_UG53q6n5eumB1}sp|1WN?Q*#$6-!2JvQq4KPex|jP)bhtD#2U)W9jQo=V>qIm$!R(vQZw8REA9549kT@NjYqKyQPeyqV=CjJJn{u= z!_l3`%dDhnq5?2npK8=-J`=sXV=V5_#qv3=UYp_T4Js|_fuA|}6h+F5f#8%Ns~5~6H#Vw5 zk)6KAj=%8pKdq3~eBe-H4Z--O_f3*jm;gUkYbd8y76d?>B^^#HBYQ5j=Q_(IjqV0$ zk-t&Dyq?P0iIQY3{wirkr>@(yC2fa24J6ZaT|(v`I#^^Zf69Qoj6rZ>ybl`Zk_K^E z#-=rz4bAM6U^qy}Jc?nc%{<_bGdMj#s=O~?b$CQ}Pv$7->&Nq2M*f~$;4qp*&p8Jo zj|#k`VD4d< z9QZoQ3mb6w21fq?RiK^s=CP5HB3l+!}>gvuu zNM1^>&RDHlOV^!NgTmy&r*^({$_eROf~uAFuTE)X@{&&moXc#^#FhY1 z(%FE7lb?#LOx@5fIR|k+>X+Ou4l%`OX0_<}_u`S=M#{tVlg>UWhy>~1f$c)DKYC*< zLkdsSXc^lF9qV8mh)Fr(gp>iE^jw9AAQAh}lMGgAff_b7Q9;qV)$fzfYN@)^m4!V) zuWq^=!L`q`914(JeF{guYS^MDf!3@@#L_U#*jM&iG9A(|4bWF%hi(h5;(e&tq6C*Q zd1^kK9#73`GO|1>l?tST!S*yzjogR0lY4ei&{bB-sgsP8%@Msx+5j!z9lrITn?II- z1NKovC^AYx=sKFQl*rjq0*wBm}7BV?LVf1xJVF(Qjfas!B-p@ZYl z10(XZ>frBDibtv2?K|T*1GQ$D2JHzM>c!y}|vcyJjHrX^?5Omt>MRRVHHULmCZSo#W=LQ=9?Xw8*GQ`_VCA@On^i zk`5@y#UMfrziK+y{ZI-HI#KqYO6Ig0jRGZUS8)IXTbntAU@0JDn)$RB9!lgLri+77 zxj#v6y=xZXoa^aw6p|827{@h&*FO*EF~-n6>qVx_@>v#92@D`_F>Q-VU z=)7XN*Ny@x+Tt^X&S^DJ^uiFQ%lEF6AWZm$^2hzi+0mnPSD6ZX1aLz zvA$2SrOZ+;RfqFaR#V(y`&Yp_S?zkBKPcTW8r&`65h%`5EL(9DDply`b?9> z3YKyJp>4&^sXycmkdCZs+bsrZw#leS0*}*2-dx9J0gl)OP&(G6->!NGQ@@8vjK;EV zkPg+DH+R>w77`Gr=M@XKS+5#t*b&y3YMSCj7n5SF(h-b-(wka~^`SquVY~V~Pvbg<1 zn8kZ@rboEBnl=4P)P3tyrfz(`3E)ABO1@!=*_%je>C>b zO^FnFkpo?8kcT`}PNu2U)sZioO}0G{3JP5|FVj<-RFBK_zdqCydWm=R^sCbLB0FCy zq{vk9$f}<8aq2kx)lI2HGnNA$=B+bUkQnkXYHmWN1tz-IVpbq9A2mX22b_o&5h02yGwnz}e*Rt&034|ByaE{;w|2CXIKexxt3sD=fFTv%fYa6Rj6 ztpm$Vs&SFadsVRoh76H}>Iv%KCa8_$P+9WC90fhiS1f|^P_oA50m;F@`&0(P-g!WZ zHuX5@0PjTHN)E)$#Eq8GlYzP)YOu8^JfVfmQl`I zx%aOhF(gC(021NO)Liffb4A<3h~8)PsOo+yg`FANR6(3=L+w&PZA-utsNm!M)ymjH zkb{%Pe&&Tw%2wK=d-KW3t8|$$6U}qN=hD6CNy=6^3^wXc-%By>Xn4u>$Z*?^(edwA zM9nlzGfZ<34cdJkY+5y~zVyc!9iorPNIH;iNt%hE6{;Eg*83&P6fXWL4 z_o#;0aQXeKBqXd=unFRZxsV*G>)wdE&T^+BfVnwenks;1P)WxW6D|*0BH^)toY0JU z;<;ByqU2}Zpa$gUs5N9c+k;9I3BwO+E;2eC`hTl!dM@|vW10Ke-1XySy^4!Q<80}rZwH8+SQIacN zrfF~G0~zNSBerXruAa{kSt2-IthJ7#Qsd^a>spDJM2PM)fH96Mf1v5X(ImV~G3?dL zTRlA$S}+M5@;L^Z!qGbYL+zU9&o)-N>wQ5J-$QKySQU8SU{+#j9(mqtf;l(Ubuo@qB4bk=I|g(n=4!liMk>5+P8k}f~y zrgE($O-*KPjTDKVq>d>@q2ckVO3VOoeT`{OyQ7&_IKneAz~hR2YYmu>dW2r|vAD?i zd&2(!g)14!U!K*kd!0K&iB-ypk3}4@tS^uM0H{{_8W?PfwAjW+CpClc&ZVeo_tWZn zgsfvD(v*45Tby;*y88XjzVoqnaT0c4YR&6@CAVh~B%rzZ>qsWlKN4CXCT-d+i1g+l^piwjhZ`4 z*h(|0$mia*W{qIKxJ{@B7OF^I3l874DM)TsM{9=MdvS_+spwMJ-aPh1u6mTJZ2tfe zb17Lt!i*ADvD9yyh4!Byka5&fW{Ppn z(~h-w-ujDdwa%xbS|MAVV;bM)aYtH-0RmMd{{R*A z4R1|k2V`AGYQSG57IN3 zurc2Gt~|ktdu8~4EH+01hSPjH^Wonh{p(L>;j~b`V`uGHoVs464Qa9PQ87nqcRp60 zQcp^;0lw7Q*Gou7I{eUAmXY0DkmyPw;2xOwt;pwV8+!9xKbaCNP!Y9qGFu(#O~e2( zEajW$wQcWWjxR0{7oVX;Wv^}H5;M+OVoc|61)8+U9LQIXF?V}V+;;=^qNI-?o_6Pk zsx}PclTk+salx(?1HLNHLUDtd=qkgNsVV`1;-s$1NIccOK9Nxf3H4T>t}KTjDak#k zsFB$7)b{qOk(EA?l4!_S5;t`3S_vd7PEV!rRupG; znm;Bih0a;K0ai>F*2#9qzC*%~Z)%t~0TY*wAe`>0Bbe%wRx&E?ilDemtg#1B?Beq@4 z#{`-!SlMYes~k*>S0v;d)%W*Gmh201MSTAN#5zW&X9CS5lsplG#ZJy^`84o^mX)~8 zX7p!2vj@GmfU`{atlp*K8Gjg$r->R2;jvmY@X(soMDj6_xnNB-vhd}Vygpj57_9AY zVJ*LmqgYi;a(TGq5m39=ZnX%CMp_8ZQ(9PjH)?Xr8k5}OguC$KOxr_{pBz<{Y#`ID z$wq5<{KhAi$9grqF4u0Yc`gAR1!!8)H2VdPATm0dzSY42ox4{|V}1I3{{UX_q|nC3 z#iRgq+E4wf=bE${#e^>`=0*dd89Z0$JB#ZpD2$gEQ32Ul@@qGDeWGft%OtQV&V5c7 zkKVC)(>t;8p9l&iQ@=X*g&gLCWeRxrk% z=)=oimGlcOatqjU8Av0stp5OtG%HyNG<#ny$|1Rv za8sSR>qsy3DeWKs08YFQYF9nXwu2WLP%F=!Js42w-_;-$UOOxV8lEyalF)ZVzJ6GH7Zc^q}R8}fGY@zZ9;P$PWqDgPQQlSSVnkBTWXouxTgZ8e?W|uZ?ZvK>R4QCF& zH+a`qyPw3@Nun%<(HMfu^yafoX{sn`8Yw+TCnmpCN8w#6C`57E#Dh5`4yK2{@ZFTE zJk^9mzW7o6)-O8T>F|#a_(NFLEJV{u_;H^|ZV4Xs>ey?#ymoqokgVGyQbGi7FwsT3=8Jv(5)87vGep&7oNpct3nYODWKJe|Nw++5b?d@ANRkw#9 z6g{jl*<0nXF-UcddNh;ER?ogGul-!V?eHgvt)BMhE8D#dXQhzfvl=Si`6V0>XozlO zFNR<%oto6xpW;6XxF)=p%EzW^b6UebHyqbvu!b?{Cp3c#Yly;vXrXwUdXL(Zv;+(* zRcjjnL8*FAQ`KNuFwDQbCcYN;ET%HPuGE{v*2N|bzaXBKW|kG9Qb-Tdiq!Pf=~{Xe z3>KQ3nCyl~#wbl1)okVqVdM8tAiNioOM3bmO}h22v^k4oSgLisW_CD zKbA4?P48UID;LOI@C7fJAZ@4!6(uZp4xHCEF(;|}RQ7>ZfwfC63wu_AsH1#>+)*eC zkOu>~H5A<38nb6&PJStY(1CJ2Dm}$t3|oKzdPl!{^f2-;27YL?J28=;wIOOMLl#X| zWGaN9z#RosB$6`?#47yJR<5!UwlY9GXSt+36mD=Cj`=#CFshtA2J`XBjj?#J23khnaNvKm13v zRFN6)Jz%tseMi_-l+O!IGCL1KE=RR4)R^3|+o8;H`j6kr3WRdo%Pcu18^j}R}Tg-)n;DtEd+*MF$rxQROPyDSzqwSQd;QLi$ z@@8R=Lw8#2<;+0FM;!^Q)|Fqvgo3jF&RH1o|~`BD<}jJ{2EKC1;*@W=Ce#I znex>`HfyuCO;fv?bCebDiK)J3W6|OTC(E z8NfK&K_ZE!$@+b==FV9$_-SMP%?jFO_&E-Qd^KilwcTi2$LHx%dBk!t#%YXthO;VW zYb3TpILi`ic*8)KA_Us*H;$t{XdB&f+5)X4imTqUa#`Hm%I0g^jIrvY28DeGO+bGU z_?g*{JLEX24%Pf?rJpi5<~I^3;bR54tX8|O>YBZQwzP&@Rb$IB#zksi)3n=FBHGDS zPyYa}Xj|#+E!6I{Pl9RFjKrr=ytG?+XGQXcFgZA(d_UkhHA~01)ns(EQ=PfVZ~m#R z&xoMYB56gUO6Pz!)_(s0`h#`55;8)V#>A}Fxte#Y_;X2L{T`J7GW5yh51Q2YSHYTn zm7HecR+eMVRDdhwr^Yu?J3X(I7>*garkXd6uin+B)b%*y!6V9nKwd$Jcck z^j!^pm3yZ8Q#l~~(ks1IYsLK8gh)CrabF;h#9EZv%Sx6q%!K+`fhQjH!%)4{FQX}N zJeLR34;)d|x8moV`q%3>P}@R$qOQ-$%XO?B-mh|X1pFcrSm35}S>0A$P8Zk&gnV)< z=%3SF1lriXv#tdWMq)$yMPom%lE@D33+7c00BmQDwVJ-uHMy?Lk$Hd)hc)!ruHR6a zNrJ*7ErlRlH-qg>#DSz40E5(LitEJo$8?8Sw`)7bSH?4e$68f= zqT1?9wZPuofTOK!JaeW^da<>u6?|ZTD*piK=7cm`Ij6pV#9q#ExyD3m>?-Sxtj_W> z-_!jRXu5^%v}#o)0!29fX_t$%%PCZ&s;rDMPCD1nyt`(T%vjN1+zQEfr^A!p%x(4t}9Tm~Ge41gLOSkG&4J&`)@_sQcJ`M0TZj8d_ZKic9$+3O!y?#%O5Y zPSQ&oF>xz{w2(4S?^=vj<}W7RJSNoub5LufIrRVsddwTCmg?R)fkm7Wfx46JO+sNd z%D#r{NEi6%UCM4ma&H69`Ur&!uaWQ%L$ZM< z!`@!EJI~Um;)2(0Ww*Dv)g+aowzVOjo|!lU9qT<>+`(3U0JHogZK>WfPT41KHR|m8 zmDTiC^4Z-&fS@e0a7B8rA&r)qr!3bQDe0|sv{Bl^4gdm#w1I6#<3nn1rZNy8-98x_-)vg|q;+9A)d`Tgg#VWbjIU#!0je7UZ%C|fW4ir<}GS=2T&d9sI)oZP^ zWzN7d4gjdL7j}MJ48gZ3IN$F|Zj>tdaDs9&Sc=waQKXQ<(qUE30*XyEDoaHhWkKiU zQW^gMDY28DYWQGw<(PBR-kDrLv4si#e+PmfuI)(et{{VW_l3jo;kcXQo!)#BLZ~Mr;8aEVjx6Ma za;e|mg^zFGkSW{?_p5E?-jkr^N^lJVE;cHL02TUx_n|#;5_yfsUU>JaQb7~)Jq&$9 zuW}`Un0;GwL8<&g?PKdBgVQupgpuK$03}B&^Hr$EeY=BGi+a8Zo)!W*!({Lox0>-K*jMN$TgWDBbKNZQP zg}KgZXmj3&2h&z3G~!ylerSZ`P~(njXvZRyysvt(PBHIM3<~EpVvYqcEMd52thQ1s ziV0q7=s`HgYCxz#I0BA^c%fn#Bi@*z}q%3H_BOo|?R z7H}5;C$QqL1Lqj4dp%9leDf~+WT@yWHu_z~%bD-+BVVR9?^}hljuivxsL2{cpr{0A z7^fN5Mo$b2*ceEPgpW@Zi@5%gTRig3ad1InkT-O%v$*t)ynUz{?9yYBGyBnoTOTR3 z{+Ma7FvE!(kD7O<{{T<4ds&RXh4UmmOAHEk{o**acCspnJSwKx-1w2Bvx!ukZ_9raF0tb)eIZ&MHWf*E^<$j<=~kC_cdA-8p{hGL zXFDT32=}g2C3XJ*m5JMbPqd9@L3<6ElHHro(k{~2ucUZyN|#5o{5)%j$I!pyOYGR{ zmQge^n1T)w4$v`Pd+A_}+3y(yf8=YoH}>On=K1D{OUMbwU@2+W5FrwIfk*tNhlj-X z5hB0h5u-gBhG?PUX`M?S!nzLS0Ihj5;s$>hS=x{o%m#6trir!jeT4DkOip_dM_c%h zO`U>XM`Y*aMH@DsqTa>1bn9Fn)S!>tb63<=2Z`ENX!P4pJ@La4g$9hYxYVSFH?Xer z*9VHi>o#Xb)r6K8b46}W85H_Q&M0a8OQ>nnEOXqeLgzUHITUUj-;br+i+G)+cmlEO z-mDBagA74?jw>ak__oq{V~t)Xn2u03Pu{hfPNi*m8#*#?Lxvf}UQlHL;z?$X=R~}4 z0!MhLbKh{r4L*FAb!FfjeW@>w34aUAB5nMOh@}JH4NoVXGr4&WgZId&DY%UuJjj8z z^aN)Vy7mn|*4W+Z@t}(wMUSucqi(e&wzqjid&-RS(y-Ro8mEbMiSB2&c=X7dY;(#m zu18RVxcRG0hVkl>J-?l6r&_@nK8O%{vF_g0^H1uwsdM6w!Re7*L8fW2A2#49%S$Nf zoOT1Ct^T~@N$~yU%p6OQyS@)v`E}oh?|emWE;OrmfEM(5ha1QFb6M8ej}$vw{t7(; z{%e@Tc$P+8q`w~Z>SI5F{8eh@ZWhgQeIT|@K5^2$N29g(EnmbwRr!E|2>vQ7aV5qG z=z3AtmUgUs%cVwf-1VjFbqdY4ENvYtchdu{t;+hFp7mYUu^qeYW()T<*)I;0s%#bV*`UDUGvWT$3(n%U{P8tK-7 zLxSLYR(Af{vzhT^w(=F;nHiwWcSPZ0Wny?uUEh$aYM-jv>2*bvP;Fp=DmPl}yBYafo~SyCo} zqsiNxaa(;GQ)`$*w-xj66UkzAb&F4nB)91uD{Z1%x8dVe9OInP6*jnkFdlJ0x?p2D z`KD`U>Gd}w=9Fre3vCpH_NLLwjm#eiyS~*$#g)X(lm$NGkZ3+8AKjiQxQw4kt@_@? zz!W(IR%Ue9TN(JEy0%6wxc=0(e-X=Sb@IrfieXuobzq(JU?D{{V)B`<}HMtvb!R#J{k`8CR74GB&q& z6Dh$Vk3eeJ8&xteaGu%s6yb%m5(JI~JoO@*LjaWl#wf+CRm``|I37^Q;CJGq2KSsR z0H3vNuAo@PMl<%M_Vy_pk2LNP2P|&?Y)-lO6pE(S#~3Wf)PI^|=EY?uhJq?yaG8;RuA;z0tOV{z)o+v0|Ke6_-^T852Y z;IJ$RU#kX?HSVRJBOHE+yAj^Ftqr<_k1WJ`nY;W~kStIaJqH1MnhSnqCD(ki90eT| zd(?!-9NLV^tmYd?`8#@_fkfP0EQRB>Q?@b`U~oVCsfh$Ckw&>}0&ptpkYh+7O_8GJ zNw)Gy_Nf7e+jNaA@|}aG2UAhMnn`65+kqS?af94@)t+!M2SexwfkAnVB#5IWbI%=U zD#$a*BS|4BndEn3&;7$sK1E9~jq9I3F#j~B|^3Q?kQP@-?VpgC-F3 zl4``v>xcDco}5-zdA&pqaCxmZy5V9WxFGOrBP06#Sjp}ypG|V^c_yimu&3IjPI3XN zW;sLgSZ!jQ{^E#$`l)z-Ncf}S!vKBih*4Z9u41eiC_C325sU*)2Vxv;KJ-Lap ztPZvPQoOalf5U0e%LX>1F+A2ETk$Q{u*ONT8E?}WI3H@|dXdwfEq;O4V!XPtG1)rC zq+l@ZS&b*aZ5-x%nWT}}7e$2HTE>%4yrPBVfRv! z+oo!2fftaiwVJhhToPMZs>;sN1^r!Xa=G-@o9L5_3Zh*}2S-&OddY)(d2%5LQ9sKy zrP91TVJt-531xHa_!X&b7#;4SYmYKXl=}?T(_Tdq2WDIznWnL58cba*$NvDBlU~## z(yeXx-CLnW94%Q?tXpyzbdwH>zBk;4!iZ4}nd z1%<$1J*zOUwYIh_?Dpv8y0ILZvMVGPTTm8PZUH?9f7+%-+!dt$I@B+0yf{}(ANt$* z1%v^9t?$N1*k+iHd@Xh7+q}xatk*7K9>@*_W3(GsWB#vekcmubG)?(qp>T7Yd*Yp6 zUqRrH4@GBg(NC@zKP?}kU~`&sLk*>t zwr*9_rPo#mrfL5GhkQFFu7M<)jnb8kPn4Yi1KiSo3qj=DTxt`HekI9NJp%jC9xuAr zwY&R08%DR0?OcM+gVGn=n)7o#y*IDZTc~RP0NOO$Yq%rxElLJ-9YFUKv&CARI^CtJ z>51jq$fI+Sg5>taXms5TX0d}xEfX{ew35J%J?SQ`rs>2958HT|q}YL@W%&YZ@af$^FLQ}9eT_OhsB z8#<5|94$$FL$1YR3XML}4U3Gtoc{Hh@eaMHqCL-uHHj?j)bR{MU>|nxTDA!*LEt|K z=spj&o<(N9)vgq)%P%4^{wgacZJ>D6Y7OL@Xf2(|Y2EO#rh1-h6|DaNS*Esc!+3Vi zDQ(nkHy1n>{{Z4Ued`(GUmxp!Benc3?eF32hbG?Lh~9tZIp(o>)~5deUv<6l7MrF9 z(-Tn|z2umVW?4awJe(6&$E$db_gJ3L>Q=V4@jsCOnUyk%0Laf%U!H6<`LzvWL$cEp zB=g9MnD@>}KK1vHA9!BV#kx?li)1?0o?hN?a3}u&B|gOVqVl!$8+#kb<5;imUhYCO zkhoGlJ}CA{1TEjteEuNcsdwQ7(adj{QC-rR|{`IlZtZ#J-5gw%0b`hz` zmPXl?_#Nw=_gk6FB^rX-F^%Q(X8mPYb^Ytq@c3K$YKjH*#l`K%C8b#zK|cb$PlaAk z>ri)j2zEF$10p60;F{5EqRldbKUZvaq)Tlirwh~E)~wcGn>lhvdM=QYDOC+Ie4cSmw2u%& zYY&tQ1JjXOm73W@9CpdZ1_ds>)pp2KV0^K~XYcQ2z2*z1kL)Wms=+xt-Av4Th2Yb; zq-w8qCuip7B_9Vgy7uWOh^OK@j-s;G)@on#e-Ov6bHz8dvV|~IH~#>b=Cf|KB!N;Z zD`^@{yX5}>DlRV*2mt;-0l(Zw3XsErn!T-JBhwJiy$d9Ew(|n<1wP{{YKc?KUxN=0DL-9OCb-^o&|=)f=0U?L@_=!o2MS zp7^62cdHO&WLH-`A=PbC72b+DtiAL%4jcuydFCj(sK1ao6 zuQfNgM`$Ew+t3lxoX6o=q>L`3e8hW3IsRzaw4FCjiG*kgJz364q%sM2b#eidceZhX zT@iEYr}wi%B8bM=;ZA)clSwCFThcNA0D9aN!xH0$B-b`=ImjlUGCJf`Sgtoa{?(>x z!dT~TbIGciwka)vj@3)dSo&lG?Ntea%5K%8ILi*SR5s~uGt816278lTw~3qcX2@0G z1@36YkgACtLMZw{>rz4}L|fkGMBk0=j^7j&#l%u1k)oE~GJA1QxVbY11BB{MC`ERf zSww0Ao-!!ZwiIil!jy?Pz~}{EaU@ny;~9|pQ~{hZ?Oe!@5vd>nmNYS)jQuCxsgw*73CB`TR-~7&D_lZmeX0oobI?$cy1iTZ z_D02kZ&M!iYQenuk{)+s9~Bs_Rs~|C^E01{y%-YyV})FCnu>&v5{;)DIR?1)>g?=T zZaMAVqaD;n=1AFqAmJEvYU*A`_>&O?HhQ;85>{+gjB)}$=xSFaZ97hR?OrYmmKfSP zW4%=4YoBI35mIHmMyF%pNf^njM9vH3SJ1U5bl$TdARLco6^GSrl^o3y?Tv{&d)7LQ zN`wo>?|Or$C+4iTKa{mMQb)yeYzrw93c+SqQ5zvZh+=M@V< zhTwkncvG6xgHc7m!RtlauISkJ6-Zs(F+{*NtEc%6w5>%{me0K%Y?)GfiW)F>ARUGc z9cR>v)MrQ9jDUZdZ)~S-Xd5`cig9fTVbZsObR?kKIvNAS216Dzo;e+OrT`f8!K~+s z?=Bule5n={1S>W;#T4`Ph}Nu&zU3>l9)Mz!Noj$>J!|UP--IqA(je4QcxHimCTYovJFN!3_e=>B#4fzA{lUvcU`^riwGKT&2$?aUJ& z(pLt$c+b<0{{Tuf+2WE>woT1ijXH4@d2>oFv>0tJ{K(skbf(G?0A97OW;1Bpi|E!j zF{?=+9R+;%TGz35%Xp3mJSnZ(bM%ZFS*>YSdX!{bq5?P$JALV~N)tw!+TzSS3aZ3s zindr!RXox?KS#aNr;#F=9@YMbU(;Dlf5!LT74bASI=!%--bM?!HqtZD)^)G7^r&Rd z2dJc8EYw#`*0d?zkR`Rf)!cjf8A9z*{_4@FPQ_$vZKE0VzCo${ClR=qM_NDDi$zyth1t-thUOPdWw##v-hr)!HUBrGuA zWJe+X#8sM(fpED^FHE<%k+=qFF^a%Pcj8@d#7=DDGfkuhw^;3n2@xlpf98$PZTh~S zrSJ7COI7^qnA03%cQx}LAL<%)(2-%e^AIj}lic+c@|{~%*DdcPhW6U(IaJ`6Q@1~Q zS#fnSoWk>~%rTTqwmomK&1r!$a@c(TQ7<=TYESy z8fhSoID(D55mauw7-^Ynx>`@|zonWhdgi z-;bW{_SCpr;02QZ093iTlIl+;1No{X<;!;aR@|v`$_`d>^p+t@CZ8u4H`?FJ`)pTzT=S ztlGk@ZS@kOIuEEgz7 zBSIdvemV310A_aP>hAVPqLO)~CC90l`~LvawwjgAp1Y*UrFfFl@itCJt`oJ;fx!l` zwws}u46KUIGK-#Z?@sKZy40^=)3nka^62bceKKzkTif_HZ3j<}FvS5e zze4gaJCDgV@yi>a(nWw|0P?4TDg2i6@s1>;yf5I*CNCA;YMN%-J2+!D+I6{qG4}qc zSoSBd?ORmPEhE_N<};@%+p&sBmvKZRb+uJw7~C3;U0H6ntZcvmf@z)XJ~#BX^(~&sY&qHb9zC7&>$Vi z#T}>U)0}=PD5W1OnrgT9w!i=hqM_B+Po_K%y=qxlyA`H`Xwi@TEMNZsh_6$7YslI> zpMQGwIz6!R+L^A}M?8FSm&y0LDbthNrI`GIr%RaY0fb*k=nBoAu&ZH1qSG~2a~ zWVm<~`jwYB{rXqXwAd|m1OjMA@$~~(+Hk`~@kWt#dbUxzEV6Kc#xi}VFBV)!VRp+n z!-0^rr^nhxpJ}Efmf<10Q|V>kgYQXWistDclTe+m7$^alrDvitqmjQ=< zed*qv;(KYWT%)SCaqUl)X9R1Swyg7l^FwZ@w^K;3Z<}sz?j@1?9o$s!(tU13j?Ikk zySG96)_=zq7rHEwLvZ0v&D|7IFD&=qc!n{ z@eZeLBbI;42ZF+_kH+$&0?Jv(bz0B3eLnMZuSqN=5UQ~p8bd$#Ddo(UY9Y@dd)Lk_ zJa}#)K4by0#`Nn)X}&H#Zrg=rjPMO#=^)78@&H}LpPG*g%T{(haBo}!OMG_sqv5#| zppjd09^$)m*0Ds+z&3OC6cZio%Y~~jNF;;zJ?LpjQ;z3~*m`Zm?T4IEHa6^t(zx8+ zhs_Uf7&4Q)AaQ|B1Z(LNF$%ne6vbCt!b^T;1_oFj^iWuV0JdEA1DdEf^7jFdPfv4R zl2!zWmoqT+AMq8YMYOTS5Hheq`cu6ux|~ixX2lA8x#eQ=ZY#&7vx8Axk>o~&iRw)W zHY&pf)nZ?Mt@agUMExoPjAt0dcGlKO-OB7$LAm8_0*a9^MHw&_lX2!l-jalo2_(dg zgaaoBwMk<}ba~3fW`l76`rFu0QsvT78)8`o+?px~nIcq_sR}w!p1YZyfk^#sa*=`C z=8$;=`X_SFyF7OIr&n_m=Q{N(wP{6|i(n5hG6vyCC-bXieVc+udO2Jb#cBlM zKCW{_oCXGjh+*?aDH}1?wF2vYMo8j~fpT{b-hzM-F^+pt){Io(^O`}$hAH)%WQ_f( z6{rC5(9?TqFvB&dH1RFtl|4)Wte1;4k|l{DR*|GQA$b6N)`n)0?Z|+SGaj7K8g;I< z75Ytidu=Qutb0GuHCg;Jvbu+d?=(Fcce0+~!2Gl-#IAq%*UfIPrEQ>B6FVoA?zg zJyq}E^Na=sZd6D%wm#Iwf~K>%y?GXE^A)i?EMAt!ahip{hU}Hu9^&EQV~~bYar@H! zZ&CaPoGv|5v&bSy;{}+L-yXt>()D;E*q7+TJzG5w+N}lp?}{|58Ryfi73Vgi5=e(C zryV{`e9Knx&WkO=T+gSOuJ-}H<#I4OU{l+;H0y0sQ-Z~xVyj)q@*mN-5Bt_Fd{y9S zu3TN%5pf7~2IWZP41%O^dFfc|+ovrKm;FKl<<7UK&jo{@P1FN=#qGIAIIVQs zGUCD=QVAitPc38wsg6#l-0}!)8vN5^{p(r3XtYafo2!W*cb5;TK+grc3i^kH{5`06 zcJ4h(#m!`kAo5{>Bn`Gh-H76`tyvnI?;1@%h8Dw1%>FH%n#qa}MY&%~Ok1Wg$P|Bs zEbM$YqAjEemnU?xFV`dYEPInz!)TE25XOj%a(0YoKQ(k#ix%SeRXmbBc{7&g9TFNLj{9^Ar&!x6vW{7^I8M;+$q;t|_O*eMwLeW|7UG@}peah#ueS#M`7@8v?dV0zUc zw$Tiz7ZIKqV3IqImE^g!DGj8eU&ctlEMW;|{i{o&_%iNB;oF=^r08u+sc9 zW1yoQE*5*E^4?H0O5T;<{u{V0p^}Ivh88?X{VBj2AspKp+ z<08FIL$8xqcyq9k8pg(`^)ntCT9cx8#GDb2^6m|Hm&;4TA`ds8RdG@TnwQ^SJ z79Ud+*i|?FB1XFWCA@&{KBBzhmtN{NT6_7kOTJFMYSD&w5M5kC3&;@%CoN00J$lPb zwF?>sy66b+Sf3L3@>xTzko2!mJ*plLg6CV1ODt`)oaM!54vvD__gvHk&EX|8l|$OM z`ZtE*mJG;@aqZf<9i)17py&=W%?o4Vn~Q7JSYY!YC)dwG?@!O8+OH5O>H$z0vl^dWsLwTKBL~gDXuj0>T3i+w->^$Gq~1l#Vn}!;%kjo-WXuq(r(On z_xPi{9pQ~lmMJx*bW(Ccb+4fKFT)>(f+_VNhTwCv8O3i>*4g621XKK0=Q=N6!kr!~ zYYSM?&J~S8U!f+*~VMT_A*Y36r1Noe$}!hb(N3v^K8HN7s?op3CC9c)`I$1N@tTQPXwk zbs5}5@yM&xt7HnMEU%Jl-_waS*yMX_d`3<|0~MJ5*2!lJWi|i z4vO6xklV!evb=Xz*7?D3@tsa&Q12>a=!~?2CNzd0^uRMk`Ha zq}tD|UBi8C5W{YXqg-)Jqwwv5N@UyxxH%?ckUrG&FxE}vX8?jio|H6-dmNKm9bDa<#1p z3wc7S0EnZLiXsSAn{NC8^%}P^rp9?a3-u5_qeIU+K2E?C`&5QrNdUDGL<>SrasEf< zmnumy1(+DE|PdsV%lq9D!|=OE|l`-D1dZDRRtCcN5mKJ|ei1{^emCmfZ$a4n1D9G!qN`V|pS+TL59P z)X?xVDdDr9dV^X1A(`>zlgT29jt2;+22pv>a%xLslROqH_Ny939+?j1KS>o7jhCvD zE3%0^wlRQ69St!Q>kB%@&WO^WAE(-}x{JrVDqJfJ5Pj=mCa)#5hB-q<7+`vMVOhO! zKtYlKM&ptQ;{KY)#N(wCZzks*@j*$(0X$Wf>{F#<8Zjp_WK@X9Ca8##P7O|0 zCjzWXA>vLuQ87>X+jCS}fK{_oXuVsI^GKr!DZuF-pgS+}}XiA)>avq9OE?B)<-xbR;5_cK{j!NMkAb3OL;H>Ac34_n8h$s31N@D zYIPaID|vDB612|SP?ZQ05LUDQ0FQ-!qg2bR+d@kh1P(~5-f>BESC71D7L1k_kvWEG z$&yA+s-vLz$*k6+e@uXfz_!Zcpip@xf`I5KP z?a3y!Sp#@1TU46XVim3}@a)6tOoM~_;($#q1&x0j1)SFGaU4e7cpoN$*6v~RXBQU{ z#gXcAaf)uF4L;5Hd5eV^9OQe}Z89fhu<3?H(`})(gi127pj@f#%kHy2A93376qz~q7Vtz$a(fh?qg(@~y9@|sX1wo}=0)~wO>H!U@#(Go07P@Hr% zpgxGgpuijfSsxQx+>6+5Y?P#`NpQU!eAd1*y3$Ev?HPFX%L{&tXB4mSGQlUAr#r&m z;0GVY32CifM;P<$*&KB!YV`3;Na`jIq@L@|8i$>5+S-@YEv0r}O8EmNo7#cbtR~hh zLtMnR*BK0jTP?TzTAW%;w`54Gg>Gp7044=f>GgL$^zMcl(?htDc6)^ZNWy?W*`}I) zogJj5r3iT+y=Wh3>489A!2{+)pD+$Kp0p;DPjK-7pl!!)m3_*wj{}OySon?`F}2RZ zI3c@Gx~Gk;BRf_=%zH0d)#@27K9xXnUHPDHp^k7@YrSLcyjgVYKMih1PgbY8E#&k1 zrER(B1!DCpUN$VBOLZBERR%iurFRf)Y&4GN*=t#V{{UA?z6%K0a0MPZe6fO2BQXtR zO7zPbD^AmQ+#@tms`p%0)vV$}%xnBo`?W}zy2XvZ<5!L^EgHIXUQgxvaynITX_1G? z`n~C6>ck9shu*D&QIQBIaUT_A9@-cXL;|gH>Q_<-IG`ZbAUr-peAODJqYl8zc@*0Q zQyXd6smu4TR&oth0-sfSuyLN1lG0+T#Io^_Xob{ePzgL$uc1kLrNg4}oae1nG}(Nu zhmgD+Q)M#2QEL!1d!=HcrEjS#u`9~&&sxP8-+t8M+EQg@1 zMwhBzU)`9jE!srg&lsMWs9hp8gA4(O|vP6x#TZ(^0$s*$&`6<=yrMf86W>IwOm z-a_^ZLtS_`S+s?2E$$lrWjQgvdHYtvPZnu*lZ$Em(Ka{%Gn#Q{sV%|@7C9qR({RD6 za&J}hI6Ob7-O9rINV)PHVU;?rX$7BxwT}q+&JAlxx@ObK+jk6^2g^N1--`QH-Rr0r zX2))8731wUS=Kbu{i65qtcTQF^@G=%azVACO>P&r-D50w86JSH38Y$;{oBe}%8$Rb zW3-JUPw;k~A+%?n@zj}TX8Oy=SN5(2euO!-p*`3>FG9yvI6m8b@wen&H2owXfeNKL9urZ=H z6=rO7ts79*3^2_ue2ZvY4aJXe4QFGud^EDZ zEO!y@p44;~H?p92(_u*gP+Pu9-UT7zkAb=SNUyk(zx|-!cg?yNY>pxMe zRvPbA#^xUbxuan#fW&d0^pekFwq3nLtc-hB!@~Lm+N=H|=P=kOB$59B6aN6JRf}|u zK7B@iD$+gPpb72IdII|Ctb9P$#!tz&m&=!De{oyi?$%m)7W#UxmWz$+{{U+F--%$- z;F0FEia~Pky_uvZC%GcCd&Z|WwUcT#w%THBZN-?mZ@+5G-uQzgh%=K}>91s%FfHjl zsCFDzE8DdEav9C2+)0vTZ{~-4iAc#}e|oOm7XVS~Y8iPIi)(T~ABdFko^fAI{+hxd zvU#kymQX~KH&O5_=QG5yo-taF0BQy+sV&QTN!$i_`KO!gcRfCuiygTvKQdGLk2PC1 z=HDxB`_x`!>b$Y4?gGVWCEe`FZ)p(A%_-WdKK}LFUS#Bzq+!nl^);B)yiKO*nw;8h zw6iL(4II#Vf%hK8$S~3I#v9Ve`dFyY5gi^m2-idbgkTX7Mc%+f@@c>*u@hmNo6@_J#eF`tgrO5 zz<1h=GT+B|x^0tYBP6kwnpWyaUc=49>za>IHl*9pPyDg;taCrB ztNeWK{{Z@v6!$VGg!DP}9m5NAbfsg@xE<&ibl(~H?^m?4*0nFdY0}A={I5bH_rUIP z(!TR|b!zYkB(%3Ezd=ZqHhr)-rL6>Ioc<}DTw@F{SNEqEknaunZ%gpbjGAwU?Y|Fd zhjDi0?tS&1S4` zlJIVi92(DAOnoy;Ddi}S1XCjmGVm)U;k(9&2;@9xgIeKpAx}X4#XO7ko7P?6&nJV> zR!;L*)SbMmNJ#$xoYtdUc@}V8eI}^0h9=tXMi0kI#lG9;;}tG}sb0t>xwt!R-H;KL?q>LT!MICJLK~I z^+u_t#dmH>%*5l3v?DuD6Qqa)Y#E1YX<_1sOn^TJ?_VCf@a_Cp9&MqVUvx+`LBuT`qrUr!3>0;;AGZ{)5I*pGrOF7R;PL| z7}9HL91}j*&rUN&X^fLwfKDa_vZRHFU+lFj^ zjV7N-)LK`O?GE0nwB-K)6}fFz-rD8jk$_>y$l%r;f2o%i`jp9e6fbVBR3eNx{{YQn zte;!wdiXy^)NiA=F-c`HWjp}2?Nd;{blUJVY3#zA>E1fibpQl%h@Ae3Fbzjk)RN^2 zf*c+x*=MC?m)v5axt(Th^D-$vq|*y0n&Wg>m6ZOXYK!YjNC=i`8?HhY&1NpO>)ZR5 zw9};)cCoe^P(4gNg<>3SWwx_{UwdVT)Z4RE+FHdVvEEwQDRlZ|VUtR%~Ns#(O0!r;gefr@a3)P^KNe@m>$UZ0*JS@ z)2wbquI4X{k1@&5^IsUB`i1yNJg8)u6mS)I#ap2Gk@dForg_34;h5Gu^{d7{>-gJ9 zNBn5V?^QOnWEd};39pnj{j@G5j_1rP`bo}fO{Cc0-vpWCjtI^eWpGIQRkT?fNvHFo z%s#Bp_VBiIFH=_A!XbxZWc!m=pb8F0sEXDwgiyk=ov_Bo{MkVx_cTMgpaU!RHBmC0 zC|r}%09HNG;+$8iMvQOjiZ*6NvS^YsHwmp_V=a=>Y$J^J;`kp(U13;O^Y5im`O)#(hk8 zagf+GpMzR*5Y25ciL;3c5U1>D^}d!!cSd~!pd$vUMj6GWTSb!)+StbixVCUW#G;i0 zt|?r4x0C^um~qL*YSFI6D&TI~d*ZEF-soNziu*x($>nX=F_QwXMIS#o6_~eMX(MNq z0>}=-jyW82{8sb&bEqZvg<=37Hr7KFhS*Lg!MQ)| znss7maOa$$?b^7v@gZ%)2RJpG{Ctv!M3Bay`bp0<7-5=0yh=)w&hL7)9^Bp}=O}Zx zrfRHjIXD$nhL?LRf;b^*bI2l_pAKq>QD;SnH*!T=5o;ZzC>4*ftnRT7)bd-v-N-9j znY6aDWfu+zJqq-orLeS>vgENHGt>B{We<+(n=;bFZ33&D0uvv=q-?%gwtk`1p2oiP zbXx{u`vX4Rppnpb#VWt>hMjT%L|D{x0A!z&S-iF6_{4FsVA;a_*C)V~;N`JjOn(8} zETT!~mO-9JKnL2X*1Q!Qu%lY0=~Qh}4l+J#J~(`zKZuhV&sw?}fg4HWQ@Q*dty|l) z)7TiI3zE+uAHc0gg7h61#1^tm9huYhJ4O*rf?6rS{Xias_oEK7{uo%3P`K150NYr_ zyyu~F!jJpX`|GI^Qe%z0$$de{!t>s>J|*y`x^AS=G+QJVTfY-?cG3h#C!*)r4%Ma8 zG<_3F@Z#w@+WtA^8|Em)n9satwkw}qew{g*`D`#9{$%7!A?`;5_N^|RrMpAs6lWWE zXRxM6z_Tu+1iD4)>RL-2xg%__k7i!~0C8VIxY7l-k%T~s7aR<6N3nm54}-iQZzVVS z$q`zs{#~|tljXgIeFsswM6h^m&eYqq6&L_}R&B4NSj0h@r0j|b&0D8h-cP*Vzm)?I zL}$0nIxvG%mRmRkyegg$k-_^`Qs#HLmmISi+<#G8*}OXoBPzY4h>)?sD0=?&kMOmd z-d-f}Fk}auatN+??K%kd?+^^?KT4~}Yo%iRnm@u5fBJMpO0GsjvA|!wBYU;m z*12Oa7Xjjst9#KYv(xLkzm4>bBsHdwX?Lw^F|R8GP34C9Z*R4Hzr+vXzZYHa)$K1{ zHRdZMjI2?QV7<@Dt=5IB-2NR=FMPbP7ytr(Yj>qvSzO!PE!4L%-AXW%MEEFAdhagB zmd_W>yfNV09WLCqziN#vm@5E0sQtPc-RKr}F-PTSnsQpEaMCd3{FXe^-5)}>(OqY0 zCB3{L4>IMqZ3p9~Xv>95%|cy1)fFxjZ;{8+1#Ztw%j}{%nNgis@)(0xEzZH0JbRN% zZ>Emg>PW*97mdVHjZ0M^ZP!U5uA!;Mu2e{;?LxBfr+7T#`c?LuaP=gHQkrTg2T-<-dy4=^g?Y z4R<7xxBSMs$!ndZP-^l|CfK86pJBxuuwBW?8*6K4;r%|$F69FpQxg?{PfTFdVtlJs z({3&X!gG<*rK4JY2{z2Y5%F8yLF|IC+Kcm=%HBm3js#l;AXyJEg48Wifg4k#g)`WaM3?pcBgPy`aZX7Z9TSj^N!Vpxw?+Uit)&43o=@)C3kPW{TLP++9X$HC8 ztaOu1o6Cgfj1J9KHlRWeN(KJ_lvaCMl1qrO7X*$DX-97hPcb7Q3E+`h z__VE-g@j64n^*H3YYei0}X$*16{=wtDYtELL=O8%{liEV(kQq?BMQ zX`w>5>?I>1`4q=f@c8nZE4UG#n$|O~lxnvjV&~L-gWRn~ha@^G4!`5?LNiqOfXu$uO*znkfdRA{c^{#vId?QaccNZR2&7|f;>E)r|*2lv-cZy;z*9c9KZUl?!1Mk|t zx#mM;p<|5!{{Z4BYlc^irMFn zWWE>Dw98=a0g=c4~`^!^k*Nz7`S3b*X+LCZSWEtn+b`_yj2b0i$s^dzj1d})+5le76;<7h-{Fm0rb#DIv zgSCtoe>1Pfeku6O_SYFvcqgw+R%6DVG_ml!D<#nLOLT}Z4t=<+#lE4cYBOpYrG~4z zXpvCuO{lBe1Lm{WdMtOBlInW#Gs@?3?mtn-Z(&)zx6dEc&x*W7s!#ao^{F(Qd9ow6 zf*{3H+>_AIHrHMs(B+=$-We~oIe9l1Cwr6k?MroA>Hh!`B0Nfo(mkBuQc2`Uk>;Oq z1N5lnz6Z^7y;o_>hxfiPzPPwmF$sjH5yXj?C)fdBp?p6xe`1Q~QrQ*KTkVkn>2H4hZ(AA-}3z#G3cP!GAT_;yzR0Pv=e(v7o8Y>wc6 zksQ*m8d^4^qj_7*VPxJ0>=tZrE29u+hi8)GPkV=TI4l&NIIoxZw^ur@x@AL@Kp}+( zBaWvYrEcob)Qi!wf$H)CoF$pYbi7~vqKt`Xy=UNOsCaZra-z@pB1*T zCEmRIlqOOL_}<-t`%w2+1Jp;QN#Gx9^XZ8#(3#|(RvkCB4}N2fh-38iIq6q4*z(<& zlOaJL@9&+I5hzii|R`W5GZJUVPz8*8mlUf^Q#S5gai#C4GIH-)9rZtbJd-se?{ zOh(6GSr${y+zv5}b3rURg8)mm1v}9+onKdsOB_jOY2N1Xwk|!u>T1{1^nU|K9oLE_ zTmJwNO1ZbvpkUG3kMfZBZ;FI(uXv&2p63>}FUT&~2nWBn+PU@KTy*1)FLdHK{3GG{ z(oIV8>%>><&yf%1+o|jc>VJA&Z#wF}CAC9s9j&d^zycV~Ra34r`%$sn_(Q|$@!e{6 z7q_ec%Ve+H0*%rlZEEQ*d^=@zb|VE%z>Hhk#z@Bu-loMe+Rf)Fz1g~k>QC<4g_Bzr zI~5lT80@MkMf3SgL~g}M^nt)NEknb4yt<4UY;jAfT_Ogab;83AdIH_+OKIRaA7}TS zM{rypD$HPgiyArWuOrl$z~0?W$PtMn?f~Q;y*tyi9bWfEvc0pkw-(ninE+{hKn~=7 z)vDCI1Esa7I$gx}Gp{UUK4Q!F_NIOYf@RQGOS?d~7T#he(~!z@f-AR^mKOg2NA84L z)~Tk60sK@#;WOQrgNm2+R?Z8b?V60cp`UwMkVn?NK|gM5E#XVseGkSuG}1}=hTy>| zEu3%T2lvH&OZtPN{{VJ}Ob;@}4ZYrHE&dqf)jE{*EPV4zv4c$Toz|gu8p%GRFX3z> zahxbPX)*JI%>`|zu!yNSark>E!08(BTlYDqns%HON8$$7 z_V}jQ2rexy9c|{fxt1@(@~aua-Twe_@lCWJ8N+`mu-6n@UopUT1!J5400x@gSjN#P zS%g4zD_MUKXtqiRw3hSRU%)Q3**8GnQh$k}TsCVpZl*v$Jv(=*os2A6 zSK7TZ?N4rWTf50g(=FX@2;rDvDYc)3e6(3LCRygkIN?G2cdnDBFoQ?YH9bP=Jcxy% zfn*hBR7O(3AVZq>vW8z!ebWbK$MGQISfbeCMuxZ12ZRB_NtiSaW!wEi*9=G78vwXVS)!AvEz+Io`a4S(=Ub|79PH+g9X@#c*?hA@aBa3b%sMKm zB-hfvr{B|Qb$u2)-9{UgxMKN;dUlN9AL72drg$pdt~~v*jQ1!v3ft*=R5mefgtkw; zbeu*y{Fn6n_ix~<+bgGpUqG>`^oJzAE9pKG(ju|6+V}4$W0Hk_gYau#sp(J`X^o^V z{{ZA^6t_~_u~_Y+P&#d`WQ<;|JC4%a@w~`R4>Tp-nr)<#>e@t&pX&J(k@d@nn+&Or z)E=YaX%-!(*UT(2^;Uf1oYrT>494bPE<#B?D<05Z$skeO<2kL8AI05ox&kF`)upu3 zbn^~OL4fCVV$H6bjJ|>3^t!{{10lykc&)yh;d^UPyJAs~YQ78Wdqn~`Se}?#z6+bn zq6)xKPx*DOl1Dq$s~RhNG$&vBq+2Y9jw5v48-d7!6z3Xc@g4GTqJPOTf6HR+A$bd+*$sKDqljP04 zjrH7sEUcqA;8VRXMv~SdWHK=MHKEe2;({@pGj}GAl0?SU0*qQ2pUblt-~o!s-D|Ny zc2V4QVdN>K-P(fo-f zTgP(@ExdZbsxEx#T|}%@V;y?eD|gehn5M$&NwOw6Ilwib(rx2wqzpLEG`im2Bmr4+ zM{!Ox_+6VQ4o5>rF!fu@8z^(T^qOMvLW}4FHJ{S1Bvb-Ic%y~WH@$iueNm}6MI=^7 zQi-oJxo&vCt#q)NvJXRCw$hbk4UFU7uN_+NglrPp%@F6(IL$THuRMeq?N`DU82SNO ze-r8$3>TWd3GEZAK-WYd869ZI?)=PF2GVwWr+oE2YgeZ+2sd=1HBVue3EQoDheE8m z>0Ye{h}p=_HnOVysEbs$gpkBEgRW~MsNG8U4dmXvy|_5Z>rJ$kiBL*B$=r@v_|0jS zg_|QFU=P?aaig2!nMlservP%d&JtzVYO{$Bv<;Qh#Xe) zQ?=A@$XM;<@{s2Xj%dpbE>(|p=@I)zI@W!ieBRUgcc(+NJ4-X?Jv!E>N$@(wCgMK_ zYmcE+86^Gt3f4d)fzOtTg?sfTy?d%d0|hbzDeaoS`n60Jx^|F>6|JmsV0~EJ?ebXF zwyyV%#x1a0kFG<(KNPC<(98I%>zLtGUW~vDeY?`T-w|2HrDA574&4F$sMF(XSZC60 zTPPmxU-2C?_ocIIl1I8z95A2+k<@|rtfV@|qo~}azLjAicVIFX2%ju{hgzdm@Slk< zub$RTM@)_k?Jk9+a=!`({Y_p=#L7PtT8SpRxw}IHp((iF41Cau;%!e_wSwl-Q4W{T z5fR@10AgzUFAZrLDG@P`QM`>oXywBZ^RRHE?@ByT;-$75B$7FX2~+cljy zX{u}TX}WBUsp=0EqhkoFJlVhHU;Ne{dzkvmfEryyHFO?Yd#GmBfQ0H%6Pj7H<#E>RCi+-+a+^r_NBLU&=hc%y3VCCS=q|d%19++J4fz&3V1)K z%cR+x-w^6eeK=(cV`jLGPyEbzZ`!_tZK25uyEVP8gW- z8w-#<>C76>wy%9B5ZOwII7I*|s2uAHMd^)C@=_N&sdhuC?=VsoCn1s$rv1CL<^QVoevLIcpDs z%idmJnIN`?S$xO12ySk0dn)t*Q)qk}qj-g0IXp|Q$zf~*T|iM`LVFDMC)%fLXRMt` zip_6iktvc{M82R0=~3L)zWYbI)h+GKlcMQGcX>eKN05$QPjl@@GFG~_OjDrvGs3z? z#?t&hXP(kdJlAiMPkKMZn&pOrXs@bDs#p;Pj5t#N0I=vjYbklCc#_vrwa`YBJObiG zwzRxZN=7@mBjf$nt5EQEho-?L{B|pOs>JDuu4HFv4sdgx-A*fB+{1V>;^N~-miF)R z+Ud;RUhIIUpdR?AO*sQ<43og68s*lSBm7PC$zgZph|t>t>x}TbD$P2^=)f7}{IUU7 zBLwH;wHfWLi#Irpgv?lX_N8`Oyf&K6xq;eA<70@Et7ndB)RwM@OG=?TmZdt5n=42s zwrhB09G8q?h^qQiD=(;c8K?2me{e?@mm97Lw{W{8Toq>a=C(c}*Zlbntdhp-um@Eg zNcW|dNby~?{(C&GHoF|1)IOo62`)V4>sg(D8u8z$Sx)G{Kovmak7{BXS;zqLX=S7Z z9D&xg+9sXm#IAm>;MFa)T#z(A8Y5AcBr6c9-yLa9 z&-D5+9_Yeu{{SF4qQ<3&XV$jWbnC*u--nwa=(9Img9kY*tFqN2;GY61L&)D@UhlFijYaa2XFmMX<`sK{PGxE;kH)NC!A5kZttdB=L^hP5};Z9LgSMyx)Q)|>fo zgS!CYtCeMlSX-^U0~`*yG%l;ESwyOr4Z%3g1*__RV-_oCdMjE|^z zbVAXViE-aP_3d6FBp6SSX+MEyacvUH*=@Krv6>MoVTMP&YoBq8eTCCwCJ;(<^GBG} z52RHwGR8LU=~fp6b*JLcmsWQ2sSgt4?O8ofMu<(?SLXt&G|KrV zrKZmW`_>0wr#u{SM_Bl(*4jwzs^n$IIH?Aj{{SSeO;SL9S*UyIBUU8fQu~crAxtRAqScEve<;U} zbBfHZ#Bq`_k}5iuxXjor7L>Kd={EzA+}A$3bmx|a+Vx8T(wMBO*ufQ;x0gLf??oBP zfwc6epJMuIB86oITPNDM`YcSRbM>WqZmj6RO6Hx5hL~gwX18XI!YjQ7BqXi~q?fu3 zZ;(b$ZaP-u$ay;EtX()99kq+Woj!GIph#uOZ2r}vu+iE)asI1a29~)86nu6ur)t#a z1?yRq)Ar!vxh1$k(-othH9&9$CcSV07_Bm05^j)!X`~8@yyJ>VB*9vtE~Kdu!2=X( zAFE!hQINQ=n)sJjP{mcbG;Y7F7FG&t9}H4oUX9$IwT`-Uoc_;zGYppq9l$M~)w8yN z_JNFGP+k|({FuQid96!ABgQ}7QVLNU?Z{!xdbxPPW`V@86g{9cCs$9soQ+icM+*qF3py#;LbVoMPh}!Hv)4_5N z#a|cGJ4=_iZLt{$?#c*J`_<;m5teot>(5#bP1PomWJd*5A5P(n)q2d=0>)N=?wDiC zT;p-gQs_%swu09~y`CnLIig=OHeN|#&||%P{cmE|(pUn$uCmb`thw^#BmV&TBDZ%M zi_IFB+N?UF^vwlt63aZ3BxxCct-|AVR<$2GpHIBgp%UumM{WblD{cV%dkT>ABqQ+l zvRx1}vN8d0u{F5YH61R>#((Zo$K>QIDI0_QW4WZ45%`AhPgl{jyL}H#mnZv$=>g+F zGF(U040kn;tEdZ_bo*h$TgLlX{1PiV{v_9~W|G4~c`Twnmyu*3k?ziV ze${7)uXKq;^x9p_+N3t@i7fk1=DTsf?V43)+MJU`4YreaERwF}1~NuH@m&0JwQO$u zJq@;*;mtzQE6GlwdcT`|q^hsjo?4^fy%$T0M3+;)j_xSEdohC8?%wsC(>x>Me-cQN z-v0plCrw8JN$%td%AoR9e%18pXV7fLo|~iTI;ZyH!b_b=tX;g+9dX8Rar{>7)-8~H zTIQQ|cCyIqV~7BV7lG^twIuNuh#EL17LVj=H!fgDl}_7q&#BMODYf5-{2=!#-VT-> zMQp>}%M>Ww%6&1b5p?tzqMucPZK7W zr!BphSffP7asl}#=9d2ePOp4bs%o-pIt96#ONES6JkPamKjlzKWs9P6ytti&*hC zpb95}+fRocsdXFVOn>nUoYvUZu-@93!MO!}k7_OhZ#+TbIZ|mHwzn60G-lFh;E-`C zakzffp3_?5-tDbZRe4oL?STLQiheTMUum|tQ$sDxerm&=sknjrip}`H!*)I;vs(-M zIR&Vb&0it5Fl=LrZEJgQi}}RM{{S}JW{G`41bIG_^Hj?H#oF?QN|rpO#B>UFv=*o~NqrE#;T?^qNYS&*lQ)mH9l?;&!Ug zJRNVNX`h4A-C>jUUEL;SVeQ9CENHE20!=&J0zqbs6$YHxYIdbS^9Jv1Qw6=WW#&cw z>hWGxg`Y*eO=0dMl&+TJYC;z>M(3+%xUD^tL87d1Y5xF;l>z+GCq7|6t39c_PirZ{ zy8gzjdpl#6-S_6799~+4db0us*-}4~n#XItCwOl}b44$f8;Jts8qnT;5(C2@=Q*T0 zy`8?P8Hy!iA>c4Io7CJ{`xB<>5M8`%jTm9ju;hKdYh|a~GmOZ&Ud6ip^_lQ5gnzVy zCB`ITayRpe((AgKT3fhA0f6gL)=T<{tSyC{iwRx$=~@2(3V4n?t7QCP2>9CVjDTws z<6UN3+vi=`PSPiA zmG4AdYLZL&R>v71RZ?X(>sNKCDjlV;-qqbVRE?aguqWoQ21}G|m10loCaa!#{{Tx6 z$EGV=S;y9e^dq>d7WOwDoErJgi(`8^4=nQS_RVXo?My&riTl=>#nOK zD6D;rHIaZ*x|h#3?1lbnC6j6JN&f&E-aO-s4wWlSJqap`0Iu9*@H70;dVJ8^t{unR znh9R1poteNl0B;(sOU)>?!aaT^$Pm3+{FDEO)S=IE$4xlFweKWX2mu0CDh)}3FfX( zMNVk@JwolG-80~J70Gn1x0w)(1DyNOi)7L=j9>#(OSH&;5awAI;*Gpm(lR!TeX8iu zEurn2SA98rfKF(r$HOQ809A$Qn%}6*SO>Ly{{X^VPnP$s@L{xKx^sOo*VY5Yej&Kh z?tn;SkQUqM6+IJLy1m+EibMysKGyW8?jLg~8L3#sYiAJUb43HK+j4?I2Oa5!yto*p zNp~ENgdo!ketD)LS2qh3dz+;oy4T|6V{mYLRURB93 zX{KSxI3Cr=uD~D#B-K~@xd^0>dI2RM;I=C|kB!+;>L614%|%x}palgisHX+_V|)ng-!yXq%EUIHu{Rm0^&eRNmG;hqV@IkDcCGTp5`1$J&n5tfwQ^ zr;eX$+5Z4N*^|%=4TYL{zoWTL8g|r83T&C<4+!0%?b0J zQ&N%=cPXT=e)EI0HY-o!8(cF5T=QA@ZOb+`^saXMYC@aHnnmPuMfgg~eaw#I^U1^V`@nGu%EImNWDZ`H#(Gni43SXghWhmpZ`_z!y4_Oo*sT#{zm(4!{oPj71(7 z@Xe)!5bB;GfO+GadufO)4`yNS{{Tv-#89)g^IYh>DP9Byt(fynr* z_|veFY%N|`+}oqFeIdO=_@{xd_+@6~bSI2`sQo^{2O$nAkCv7f z9XjDW-cni6#(;m3&tHl^UDh=iG|P*<_6ruq{rna_LR9mak0<@07P!9O6YJMK^P2Bd<$hv!5S~!y4))_+q zj_eOpNTb%Q^(G(MHR$eT=pfze{wmX^c)IRXSTw7Lw~*k@?S)nMAoE7*vkJUR{XDk3 z)US0r>9rd}aUm-Rbn@dTs2C*m=AUTy`sakaDPd`4r`k)V+U7L4d3H$IJg{Epn$T(b zHl1s3@a8wvLg32Zr2hcovU;zCukK~TYnA|Rgn|9*#UYty$_o!-4&_dCPm+Fr`rTdC&VWG=ugtc2+cyW!fM}mKP0{2F<(qftIt)mk@T1lIhV@%Y~ zvVrkHT@bI@hiyRqA(e`i2d-+|+ z1LW1#7kY-PDO(6J7egZs1!Kvt7KmFxZg+;ud>Ri@)GqcEw_K0hM#r* znuu=n%Xuy^CS(~OHLJR`@+57bkPrH=mHz-n^-1Q9;+PZ>HUVLbiu(2a%v%@K2_u@+ zVzauUO*R%Wv3iwUE^ z6`R&AmIBPN{qap2r&5wdgft9P{{YKLhNXH*S0ty+9|g!OwYcqrL@W@$D~@P71_wV= zjG86^B#-DA6?wGw=|x$25IFNms}_fr#^zpwijVebF_*xtG*?gi-+ z)p*6Ui%$t{bW|J@TN_6Y8l2WyZB$Mq9G{wXX?Gk-7DJC}(cTQeG=}?C5y%9x zZC`o{OQ_`aM*FixrbGAD47uA?t<1U3;00&aap25mU((*`)z^p$+_6pQ*Z4 zvB?~R>J^)sZ&wD5vX~X?S@QO9_i`Y}=DN3`KGj{QS040IS^0y7uF;y{z70X%$Q@2N zB8!&IqC!H_*&$~qIjI2rZOS*K9A=tXUR+6lO%r2etT`F|sjNC;@Ib{t9A(?;VrqU% zw?#DK4LuW0`a1&;=_ zkX^=zIUmh&z3p$u15Iuhf;v#hs;$Rby7uv1@T@AEQ@T-Gp2b+sal;x0MRsHAtv$V( z$e@rYkL@wA$sE??XIUui8G$*kRzSB59JmQxp$(G#>PV}hgD z(H1th`fI~1_jeP#U?g@MaxwS&R@mL{hRb9mzCCnc%Da7S*Pm zXVq@8=(dh+sJ_9Sx&AAcjdb&Y^c$7cp_1=po|#G{Z`3g3Bz$xf%GUPY+fjwCa3f5! zNLvdVe9(5Iow}msbov_2s%-wEqCm$d@2@iGy?P_oSCT8-n^Gnx>zo$OzifT9$=~ z_u_?%!d@NGG#i~d2`{0xxtLr@W&src0Lne-e0Fvh+N3gH!G9`R#1<%`xMYcs{K`6-d1Udg|Wc?ONMO5{xYKa#!aSnWo@-&*~PR;fW-)yN%?OAPcA2ClL>p>6%PG zsT!`Sxvez&YX~|n^X5K1&uU&jr;OWw72=rZa@(9iZarM{MqK!DEkTaP^;I#2Y2)el z#cJM`a#?xfe->VAHu`>(dvf<|xe(ewr;l^(`_}itspESkn&ZW~rHt0QFd<+A#@&fw z$L&CPQrh3cdNip6$9Jk-Hv5Tz*|_#!{v+C{O*h0^#;s_&m9>lMMah%@09Fr{J;IK( z&1b3nJiFBNb-1|IwHu3R+en3smw`bR!1YBx^@pD8d+2 zcH7Y7wH@E$=6d$hTKGr8de)nBcMav>hH!B@ji4WO9@(VUz6S7hgl!$t-D@+yS!a;0 z(d+=PplY_z-JnKyia5q22)hD~+z!={mrd8>xK*@*#^ofFU}GlIi~dcTuBlQU9?-4y znPc#THo6w6B!Pv|QsiT=UTWmhZ=knpy?4g?waig2=@JzYMURu$6#hLn%T2T|aV%Fi zL~_d6RQJVv`^CECnzYerw&6voY)Q0##2(*jt;l4(QF`BuERCWqfsO6Rz$o0Gy)M!( zwEb@4I|!|XwdUa{n|62O^ww8a@U&Wvwjt7qvz&~AK9C2vt+$1IBHk3#EoanqCA+$k z9nBIZ1bOIlT;|)Y+>yG5Z9+9w5*?spZYZlOX)i86G?Dk{XuEaYY_bnlMNKA1P_baR zuSp)?cfcF_;`iaynx z*6vc~*~%#-Wb$g;oib*OoxoOGSc#&MqjKf`4;5NuU^RPt_MT6|z!N0pnXoF08+~CV zNW#Y8oqugOgCyEZ)Y`%#^ACx!a1(_F-19tu>{emm02djGndgO-^UJxM>N?9`w&!)rHio z6@gJnnnf<4;|CNqAWy>0D{Vkn*000<4f6_1cd|xqc9X!ZCxvv|c73s#~OKsbhe z=D9vvkTKStNocGUh$Q2hgbNfz##=uIieo<0yg+%Cd{;(5JggdFs%fcmfFSwelHN%c zm2SbfY*tzqsOtX!fwXPzH)6g~srZcDYT`K5ND1bT)Fzuby{TTB6MX7`3Q4r2t@(R?YQm=Re?`6s<7w2mu#l^#%P-D$EYw^P6bbggkQo~f;* zA#q*5vsvRHjMptC-_wj$lgok0u8go+{-5}L#dj$j$jwKkV($O)@nNXR(=Rvk5?9}%&ox85l*F)}z&S+zccEQ`0%Cf{lZ>OM;y zt+e)kA(JOPsMPvB?}?Tb{LF*#NTl(-xRYy3@rwEN=CM7_ zLy`q2oIAeoaC_CM^sQ4~Tjkjwez~jsHw<>NG@uR6de_cuZW<;TV}V+$4M;2_YxM0! zq4bG$Ou__hhQc*011C@_0- zSwQpMv1MXM-iNu#i zm{m057gy&rLhU?Ngo=A#Va*I}BxBQx)Ch8T6=1c;J8AJ+%)@F^1d8*a1mGN2hFf#j z0;0CLJg7BfTFxEgqM90iGj2)~n%N6A3&<5jmMD6PF-pT2W@GdkBHk%eu@$WvdXLjw zHb4#*u{di>v}qhjR!r8$!*0>QtkXhbeZWys-m-K!t@G)M(oB(*ImINngaz^z&ZT9F@9M9HWkbTyos@v=us2+t!P39C*tmm0AOaM+}m+Spv>x==2Y%6JDA zLg`G>=2Fe@YS0$*RhCdhWSY<4EyUR@%swk(x@xHDR9xA{qo~bu>)U+#eEF>(arHBO z>gb@y)+<4AXher%WPPeJ*}E_Wde$#4zD0{GM!uZ!P&%!`oCRa{twdTtW#MYi{{Rj& zoPb3$@#`11YR>NFdDn8VTG;6*7=qnudVh!fla?RNIgZXa7PmRZEzx$&5DGmcMqVpD zadwe5+}EJJ+`|U9qZ(+DNGBq_K-*mYU3!*ToomI@J>xB^h~iPf?s%pi4b^4UKNzzX zXNZDZJagK})i-wOi(Gghgyb zVZFC^uScA6@uyxTJ~D#-MbYharLrxU-sXQ(5BpN7o+a!1F_5+~KJ zAN!Y!^Wqdm^Et-ZzbAc^LV+<>5V1GPDQCOdf={{X}`k!mm1?ylu- z53-;j0Z4T(73dbv6}FGz`+NOHR|^b3hQby-IXsbAxAfmITlnk41Q^Z6rH0^KqF-M^QrCNxis{gAv!!oMMz|-VpI!&f$G`;oEBmx$~xjaB~}X0QSeV zZ$AkIg^Nd}YPRsO8&tqIW8CrHnJDW&LO-Im%zG4vvnSzw^QHS{)jFP5eLHbH2&Me=(3=| z*n9%9S}e`KzM4bW9WW_@qDB#;vK! z8BW&caN`EGV&;@R$g-|t?~ydQNG!shmH#zDfU7*StB@c#gY29&rH zd7-+jqksD}%KJ}5P|+ws?6sc{>78RQZQ=BeQ#3IFDO?u#qiu9YH*Gb;w2aus@6rcq zW|Fdu9@H)7sJ6((m<&tzNw;&$0IR@Mi|)T|wkiX7N3SooGwEN(WNT1$>U;U3ThVwss{HoEB~c6K(xE zxYa*1R=K#BJzdoX8`M$Xd|WtTsCmW^?Hs@@r-1llmls|*@X zr+-dtbldpmiYcNg`dPOCKYHKTtTvGWR40;0 zKeb}=)UTgv7k3fd?$e`{Wf>$qF&9o^H=!K#TEv^l_W%!hR_JfG_S@tZ8gh7V{QbE#zEjz zyer`7XSj~zP+!DM4nSe)6(%D}@ZO`YDVi9}Q0_TrTx5N!TAzllw7H`!eAr3lfazbO zbnPzM(lrDEG4%Enuf#e{t;!!M1`knM!Q}ZygDuUvByb}+Jr}ioH$~F!uOba_b}9WJ z^Hk`%EOy5Vpkv;)7Bj_eyKn)fMpWAPX5Danuv@t_dD7xV_Qy8Tpn zHH9!7J_zerZxF$EuIdW~td6mRmt)*}QBlP34cznBG{VCAAo(OK5BFHshv*s{8fB`g zpxio=Gn#KQmrba(Rix{3%hw(0`b8SUk%7f-NXstTUM5+x+n2R5OO%d1j!OGgdX}Xe z2N@aZNG|V|X8gwhd(nM-Ut0S+(xY<75ARl8>Su2wiol!LB5zFmd>Se(NXj;=ZXYI( zHHm9lpd^6AVD|4=U0UW=EtwdubM0FD&9W)Vr|c^?sl^|b!Iy(Ysg$_9l@H~}-6>tv z(oVQ$B=^l5sak$%5y;E&Rl%n?0h(NoYM?6?oBphWMZs(%!l)$EQ)+esIryQSq(U${ zQXP)YM<8v$`88~oX&PmiWOl0m02bhS$g19EkYN;>5P3*f^mG(Owc;q+&COeLcze>5_PTGnlQm{e@23!=SJ& z3Xiy=@}y)mD>76Jla3B6Z>9KoE($xZ>}kfEqC*MKl%V&(r}prqV+tvp#`VoE#@^d# zR2c)>n#$@^u%Lvg5#f0?+%xif*IDU;tw=PERalRaRKSfMPU3#_>+qu)Jen5jEu*Cd zC`;oOJy;Y>I+!dm$)uAbJex%wX=dXG6c(D&{BTLdFgl7Vb~TzvW>LVdNM%u$L&vos z;$2Be?Ou;iLG4+4hTG2|&=Orbwga5eX~yxjB?FceJest5>MIa0r07_YQr=&k#8>pHDnpd%@rJ{12sw)LXvLF z6N)MFR;r3zfkbr~#b_7Egts(ZrLvQgU2UW49M!Sh#Jq4TH>@&f)rK`6NU9}84Uhn@ zeljvRBB+|-Tj}Pp=cmTKBI1LV6?W-G#*#`sg!>ZVuI_1bAA z+Pu6DDzw5)N>E%8*QH9qn7HDJlTO@0Y?Jdv+1iMYO2#x{Xq%w~iuDs~fgUT=hs+;B zzq64vjVD33zJ_H6d8d7dibgTGa!nJd{{T$1jZ;O7PdY8Ni^jpc=$Nr5*tb$C^csvh z_NgVVnWz|Sqiv$-90}NUR6gG|pm?q#Q@zOwI{yIXvm}P~Uoo=&j%c=S8eJAmIe98de&Rrs3UgLdvn%-zFgh3=^Qy6`iAP# z*Ul{OwT({p>gMZGXaSIfSnaYx_9}73KJeP>P~OWe<^HR2W{OU3R|-By9jj5PUtV14 zvMNgjoMVwIAOwA@E2wzt3k!e4+T0CBd~Iu)kL9Pp9qSfjQm>URWVf2{SiSNzt=omw z=>WR_0Ls1Uq}M+eEuFrNV9{C3Olzo582m%zV=<4?D=?RLdiCS@DIe0U5(2-Dz1Jl37@d!Ex6D2IQwQ)zhvS73 z#_LtmC5&wkZE|`0hR$i<{{V+?r@1rBtVo5pEF;|NKjrKy*}NyGM*}m@s2Q+-Hc7V= z?~#gZux|QbXSA`hk*%QBZ?#F7`scZD$Lul1Ydj~R*u?>r?BZvBT1hfmvu&kCWvCs5 z9(ex%&1>}eu?P#hpK3L%^lGIH*l=<4K)#C$xbui_gHrKth~d-!04)w% z*mbP@TI`Z0@yC8^9bawpJvD#ZtppocK^W*bp;Jq5GQrr99`C-Yadsc#wEfsbmzPvS|Vx)E$*Gxbw8)Xb6kvNKtp>sC8`e>B%8 zVzCt%%fHsOD{0^-C#@IeLPkLY?rWm~_e&APU}NU1n_X*TvCx+HQ^fS7Sf9WT?Z zn*B_SZ~^24LNJ@eO7DgxkGHj4HP}&k^|>4j#8FOKAc@Z0muUroG%UGj=KsjUYS_^B0Sc$;SDjNCy)_}Isd4es?o=NLX z^hjlogg}eiig|XCT*;O^{2H7wLkP%hpPG)Pw1wx|hIm=qk?Eq%%zg1yHPk~i=v3Py zT(@fCI=gxkd7$sFlLrZr?NHON+{gfoD63WozK-K#6aq1d!T5qp&>3KrS%+No74(a% zq2+qW#bWh_vn)W);(H1@F_E@O%YW)yc|P4K#hhY3Kp(|MB?@o{9jJz2i=0*(Q+qZS z(rFy=mvDEHpK3PtWh{B-g;1v(_haIqd82A`Sb!4_G5V>M&xqW{cXd6MvTYvVe7P7` zA-0$hOofNFFjsZGT6ZkbFWYq{x7RmjJF~Tiw|Z}LV)KFkKeZ~8!{$jdGB6(EkfQeG zXFy^sC>7M_v|xPZ132qWq|qf&={|rzdQGbMdj43Mpg>QtHJ=o{yin@6GK|!Jyo;3^ z+!OOz(c!&oJlbdMX@#GK^$8dW)IvSYJ_}dLByzaH1*wg#iFM8!pK32j@VZ-_(n#{T z4vH~A6B-lftEbe}LBSM??^9f!YSo5sa~K=|Dsai>9xFE; z+T1oWMLg5wjvxy+^GvFmqORPs*OFBSo+w%MIAdN&rEjc8(&1E^e3{0J&tHlX@qrvr zQBKnHw1G@5&>mb=K-=4yA9e*gw6+5kOGz5=pbD*Twm%>4qDE?!K)GFpbp(>)KG3g$7;>#QUXR8AKtZg&Y~g6=}0Kl zBG{+3Wv*__avxU$wOZVu#!8y`_Nc_o#(LK-y}ELLV{+26;N(`0&M|;ZW3-25BZFG) zJ&6N7D_qDrw9Yl!Fe=qwdVsn0=Hv?}K>Q!kmF`D&3n})00~u(W*sRE8~A6$o+Gt&)o)?9^H^;GNm!6}1HBdDp9ASOT7-uB-fcqW zGwFMtBL4vLsQ&=HZ!T{9mnv7&R4nFJCNu!mkm?dgcz~s{2%`T06vB_-QC1K*U(P2q z1GV1r6kr-A+8d`CXFPTkgKS2il0_!g@8ga#s77nohFBDrWBb-$R=r#|y=SYDu4l5@ z6kJ`iJ78vwn*RXs(SZIi)4Awco?E ztLmHs}?sL2!X5OkxbnQ}Q5Se`O@HMSL{ zvtynF$on#VLmbJmsWOi694n$Tvi??SP61d1C^@fVdNVZyIrnqA^1mGcrK z0^Ze;heXyUoU{NZJZ?2(FR;Pl1278GbRDSZwRqh?3`svV^L-D)dgI6h*DJIBQC~pO zyfd*!;$j;nO2j{J4tA<6h_?kGJ z@0TCF2{(+QUJ^~m?^!)VN?BZz=QO>vf}DbXisk2BJY!uijZsf6`(}if$MG*f5ARua z(|0yG{whh~(&Ic)wB%^x@u|3S5eMHi^21(fR1wy&vFL3Bj1Vb>w6fZ8FhHhixZ2$6 zQ%N2&K=;iklH)DvY?I!QTx(JVA(x-MD3@7n`$lVQTy0kD0zLieH&^9Tf&11{8^>h? zk_oFCX{6veKNX;2*Fsh#j%p342)K2?9@MvG*lfhC$J-QKT0PzQ{LRsW)~p)79d60a zHxNn1Foxn8fbyit_^K@Y3l{Ls&i(68rT9!+uc1yp)ZhhWZ7Zp%cI7_J4FbWz{$5f(@T4xDZ9t*r z1M4*x)MbQyW{Y^eyU>%{DO0!_u!OkQn+J1|?@JrRHsSWj+4;>|du0rn%N5OIb$tg8 zS{d_`kSi_88)&td2?jPFwHqG2wQ-!+%Wc0GZsIpyeaA}EY0ytF8@R~nOASv( zNdvWL^qAso797@3O0x1#Jh82QoVzieD{-2AY!P?^BCUBcFx3unw^9|K3LZ)e~n1hXxELAk&M=|*ohQYM^1PZMsb>b zYkGiTYo|4v4J3jhGSsH^p-he_hPY-N9w-~cQ|diwqX{pfSzjnCmfC-r!CEzngT-BG zI7i9pLuw2X!8}uBoz*(gw@9m=l$PpknZcr|9KN4&oSH!_YVs0A9?oQ8nze0J@M}2S z^rF!e5J14Ekjb?MC~JE>ds7%~hB+0fF`MmKoRP_)rn)0M)wgT0O(mLA4PAT^40(%p zp(HGGf@{|9TeTM)MTa7>C$|0*T*TyOITWhu1|y2tJ*gvwp(fK=`(n4^&ayGbG)=*$ z7IMhg9GYbwkXZ7x($7v*z}i2Gq{VKO?U|FItF7$hbCPjdF=~M_SG5jaDCr29CV=`(L!NGCb8CT*pYDw3_P5N%^t z&3T$QQHj767P?Y8(oKHlmfY+;eX34h-9tX*Y#P9LkSa@*J^E3y+`K!E_C4!8e|9Fi zRc0KX_0RHrZ-%48R;S6_Kiy~?mG-5&9p$ukYBIZk>Pb9|7DcukziL{ZGF!(ij zV0pl-T4cs4ygO|K-e`dqKz^f6;JR2M+Ru-g=DBpy#@j&6V6Sy~Or;BBo|T&1_SjzP zhz}CxrKj9Uc_0z7$IWK6$OYUbn|UPg0IhzDY2+|C+P^e$w(9FYO)ZX+(sIs!YB{t- z+v;Lyy*lREBLSFa6l>nvgg&8OoQ^l!AA6wM`I(S0#S0ystTK8)P&>6d)%7b>Ry_3W zUo`PIi3DNR5$hcZJu5cIr#81SO9F5vQTDGkwP|X7Q>j0C_+7_|Z%YyQf*Ah*jdsN9 zH^+D80Dn<6%Kl&Dto&cs*suIeZt6m}*a}oGP1|k&kG&w$wAN4z%*;o(xHc!%j>O73oyX9Sa46XD`cam8`GI;uTMMh&cF$vwm2dQ&YwLkg=`i8C)9l6bG zLqRq2kbOdwUq~cVNtXIajsPPx!rfiRtkFy;F*lr9bJm%`AymT}C-CZ^ng-+*Ctxgo zD;1<}Zm?*7Jil{YOG)Q$RH*r;mij{~QEne>?cIcOsq59O-d^^Cjewo^?P8T z@ZQ!2MbGU|?KHTPZWEa_ri23_ej8FPfwGddY21QzI;!)Ez za+vcJoz&GcDOEWJwO4V*gXyGNj@3rMrqv@ccEwt~1gb|`3s<-)oKh(DCrP%G!LC-d zBXMtYw2Ea8pcRG)tbLr%CJMGiHn)w~^);zhHIV8XfaZ%VB~A@zE#Y+;4s-2JZ42!I zt8;5NAZx}k6M>olTu56OHKF_>$=133xk1PktY<>lmcT4r6iRl#IcN2a=ADta7L zhR1V()};4iY37$m+eZ|-;_RxN=QLV{-`;=@O=mAJP?MIS^()rFq=f zP8tDumh_r38@J$dS=$iA)>xG?tPL#GH3uZBoPDWm z_oRApkF`>Pq;a{154}jn+Th98c4+vcDl$$x;)Jy^+n~l6{MGMy5-#Rt=eB4|n(`zC zNx}J~I^LwPM&V=(dr*3=uCg7Q0LOY%z+5l+16Ak~Yd#^6Lc@Bg9Bs!njJ(&|&IdU; z?ON??MG~ViQ_p(&#;v1E6y>3IARnaGb6b}itutL05F(Z;!``g9)+B^y%*fAfYv=Y? zZD`wNQ};B&T}fRy#TeE!t>P&p^r++Bts2C?=117pJwr)`Oy}B&i6?#*HzVyI0L{I!xQs`Gwf9;yhjmo&{-eJPgmRBW+&stdrhVO%el>_AS zPOS7f)z>b+_03W%PW0w!M*!lREv&_T3|5NJG>xH5g0->fu$1kbR-|*a^VfT;X#jG> zd(m-Rv#-_7X!R=?*FKR+L<$MO!K`&LzJ3?oTD{IkS{fe*l96DfGS`P*sJD%D8S;6c~mc_tu4FXCqPYYfbDRx9vk?fWYo#Zu4?bVyB?Jj zrMFyFOe(&)c>&`!i`I0DtNDqHg;QTeZ8VY4RUg~-oYy^WMh{EypO)&<$GL}dTFWgc zM5JvBJ*muSk&JOxh?I=y6&hY53OHPm@m?z-`go>Dsty;L=!-q5T2^fyL5Aj~9+I26 zk3Y3KwtxdiCdEBPFkfZ1mIVL{9~99nizqw_xnzut4z+w)Bx1Tsz-6)cuQr^gsHP}} zrT`sAX~0stY6Iz7C2ZAuQTZ4+TB2!4?N%ioP+pbh$lz2&%umv4d%xwPr7q2y3gOQu zCXJYG>BTO(Qb7WuUp3Cxz~-VN6P%M=XiGOvXuBI(8NlsSNn2TZy)?!fX-5Dby*JbJ z{3s-6=9w*;fzq{%TF$Mbx7VMwUml*PqSK=ShTv7P#G|!1w6@<(!N?TOJ1mS9qoPF} zab0N@PALWQX~2$@1;w7gc&DClCaaxRMK~3ctcGgQ78DdNh=BOG7?spCi8EzSm29;aJ#11LFvarVnwTni^q;s0&t$|iXrxnRy zBvXS*?sFhGq*{bTgPhiwTjM#+1%GRWCl#9%uavQX}pa0k78AH>${CY_M4K2cf#Tf)cwQ@`r zqAl4$8LeX!WxN^36m(Xgjzv{#B2j`-jw-Y|up*9>4cuxE0*q;M-l>-joYg5MxkHYW zx_e;2@y%#th#IA>LH4UO%EaI4hC*;DJ7~lX@y5L z+Sb61aZb}uDtb`~X@SLO50OH`Q>9+AHZk6r8((^=NJ4|}S_RJ|QC3J?bgG>JZj{4M zKnSKQ@KQmHaaO!uo|M8UcPKcoO92A5!7);%gSpNPFuPKQmQ5yeT>5Gg-JPbWisNh1 zS4dg9P~rpaisyCEeZ9bL)O<{Yaw#-OREj<&V_W9dEW=m=Z8*hxtF}Y1@m{U60xOd8 zePoJ_?fg+k>MdTcRVo4a0tfw*S&O}97Lt2V3)CyAy<3lkOt zy$<@(lou|=y{pyg#p<;oO~#=#vIi`9Jt@YSf4NkvVXM{ZCs$37;WadoN=%`%#%U(4 zq@~$o2;}o#uUB4JW-qi0uclN4cB*W=CoHY#Qbu|j^?H=mS@>2+6mE?P1Nf#9X%Z(J z0Iyf7stipwKq~n3qT?G$uUD%DYUpD;fIoUN-$zs<0AyFI)u^fEow$uaz~ZiQ>bzI0 z)u2~d<=58v_!G@%95oYe#AB(iSF0@<#T4!VRpO0@PnEuN)`fN zr8?8?cHrPwtJP1cw6>7?KGl1m0N1P4(Sqxi+sLY;oSOA|v1@U7m9g_xNh@Z(UZYkb zllK1ry%QS}E7j_`T?f0jE~Mg=O=iH71$w<&qAOUOaf+9g_~~A+R!gZH9x+x6c0EOU zy+T53ZaEpDjlcY&ydRME|z=Mn))W1=3V`4-pRjEuUD&53-H1ib|+5t>h*e&AOG0~ CkEzK3 literal 0 HcmV?d00001 diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java index 501326dae0..0b5276fda5 100644 --- a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java @@ -3,9 +3,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; - import com.github.miniyk2012.coding2017.coderising.download.api.ConnectionManager; -import com.github.miniyk2012.coding2017.coderising.download.api.DownloadListener; import com.github.miniyk2012.coding2017.coderising.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { @@ -24,17 +22,12 @@ public void testDownload() { String url = "http://inews.gtimg.com/newsapp_bt/0/1209438116/1000"; // String url = "https://www.baidu.com/img/bd_logo.png"; - - FileDownloader downloader = new FileDownloader(url, "test.png"); + String filePath = "src/main/resources/downloads/test.png"; + FileDownloader downloader = new FileDownloader(url, filePath); ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - }); + downloader.setListener(() -> downloadFinished = true); downloader.execute(); From 3a859a046a8456ed395168614469dd40305d1454 Mon Sep 17 00:00:00 2001 From: sawyerwu <664269713@qq.com> Date: Mon, 3 Apr 2017 19:06:02 +0800 Subject: [PATCH 049/552] LRU and first min-jvm --- .../664269713/DataStructure/DataStructure.iml | 21 ++++++++++++++++++- .../src/com/ace/coding/Queue.java | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/group03/664269713/DataStructure/DataStructure.iml b/group03/664269713/DataStructure/DataStructure.iml index 595934855d..73665fca7c 100644 --- a/group03/664269713/DataStructure/DataStructure.iml +++ b/group03/664269713/DataStructure/DataStructure.iml @@ -4,10 +4,11 @@ + - + @@ -16,5 +17,23 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/group03/664269713/DataStructure/src/com/ace/coding/Queue.java b/group03/664269713/DataStructure/src/com/ace/coding/Queue.java index 15bcf5d497..16f983727a 100644 --- a/group03/664269713/DataStructure/src/com/ace/coding/Queue.java +++ b/group03/664269713/DataStructure/src/com/ace/coding/Queue.java @@ -18,7 +18,7 @@ public Object deQueue(){ } public boolean isEmpty(){ - return size()>0; + return size() == 0; } public int size(){ From 8068caccaffb98229380b5a64e0c6aab2778ec48 Mon Sep 17 00:00:00 2001 From: sawyerwu <664269713@qq.com> Date: Mon, 3 Apr 2017 19:08:57 +0800 Subject: [PATCH 050/552] LRU and first min-jvm --- .../src/com/ace/coding/DLinkedList.java | 38 +++++ .../src/com/ace/coding/LRUPageFrame.java | 136 ++++++++++++++++++ .../com/ace/jvm/loader/ClassFileLoader.java | 62 ++++++++ .../com/ace/jvm/test/ClassFileloaderTest.java | 88 ++++++++++++ .../src/com/ace/jvm/test/EmployeeV1.java | 28 ++++ 5 files changed, 352 insertions(+) create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/DLinkedList.java create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/LRUPageFrame.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileLoader.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/test/ClassFileloaderTest.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/test/EmployeeV1.java diff --git a/group03/664269713/DataStructure/src/com/ace/coding/DLinkedList.java b/group03/664269713/DataStructure/src/com/ace/coding/DLinkedList.java new file mode 100644 index 0000000000..3d96fc3fb2 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/DLinkedList.java @@ -0,0 +1,38 @@ +package com.ace.coding; + +import java.util.Objects; + +/** + * Created by ace on 2017/4/2. + */ +public class DLinkedList { + private Node first; + private Node last; + private int currentSize; + + public DLinkedList(){ + currentSize = 0; + first = null; + last = null; + } + + public void add(Object obj){ + Node newNode = new Node(); + newNode.obj = obj; + if(first == null){ + first = newNode; + last = newNode; + } else { + + } + } + + + public static class Node{ + private Object obj; + private Node prev; + private Node next; + + public Node(){} + } +} diff --git a/group03/664269713/DataStructure/src/com/ace/coding/LRUPageFrame.java b/group03/664269713/DataStructure/src/com/ace/coding/LRUPageFrame.java new file mode 100644 index 0000000000..338263fa64 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/LRUPageFrame.java @@ -0,0 +1,136 @@ +package com.ace.coding; + +/** + * 用双向链表实现LRU算法 + * + */ +public class LRUPageFrame { + + private int capacity; + private int currentSize; + + private Node first;// 链表头 + private Node last;// 链表尾 + + + public LRUPageFrame(int capacity) { + currentSize = 0; + this.capacity = capacity; + } + + /** + * 获取缓存中对象 + */ + public void access(int pageNum) { + Node newNode = new Node(); + newNode.pageNum = pageNum; + + if(currentSize == 0){ + first = newNode; + last = first; + currentSize ++; + } else { + // if the node is exist then moveToHead + //else add to first + // if currentSize > 3 removeLast + Node currentNode = getNode(pageNum); + if(currentNode != null){ + remove(currentNode); + addFirst(newNode); + } else { + addFirst(newNode); + if(currentSize > 3){ + removeLast(); + } + } + } + } + + private void remove(Node node){ + Node pNode = first; + while(pNode != null){ + if(pNode == node){ + if(pNode == last){ + last = pNode.prev; + } else { + pNode.next.prev = pNode.prev; + } + if(pNode == first){ + first = pNode.next; + } else { + pNode.prev.next = pNode.next; + } + currentSize --; + } + pNode = pNode.next; + } + } + + private Node getNode(int pageNum){ + Node pNode = first; + while(pNode != null){ + if(pNode.pageNum == pageNum){ + return pNode; + } + pNode = pNode.next; + } + return null; + } + + private void removeLast(){ + Node pNode = last; + if(first.next == null){ + first = null; + last = null; + } else { + last.prev.next = null; + last = last.prev; + } + +// if(last != null){ +// if(last.prev != null){ +// last.prev.next = null; +// } else { +// first = null; +// } +// last = last.prev; +// } + + currentSize --; + } + + private void addFirst(Node newNode){ + if(last == null){ + last = newNode; + } else { + newNode.next = first; + first.prev = newNode; + } + first = newNode; + currentSize ++; + } + + + 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(); + } + private static class Node { + + Node prev; + Node next; + int pageNum; + + Node() { + } + } +} diff --git a/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileLoader.java b/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..a6f34271e3 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileLoader.java @@ -0,0 +1,62 @@ +package com.ace.jvm.loader; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + + + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + String path = getClassPath() + "//" + className.replaceAll("\\.", "//") + ".class"; + InputStream in = null; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try{ + in = new FileInputStream(path); + byte[] bytes = new byte[1024]; + int len = 0; + while((len = in.read(bytes)) != -1){ + out.write(bytes, 0 , len); + } + }catch (IOException e){ + e.printStackTrace(); + } finally { + if (in != null){ + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return out.toByteArray(); + } + + + public void addClassPath(String path) { + clzPaths.add(path); + } + + + + public String getClassPath(){ + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < clzPaths.size(); i++){ + if(i == clzPaths.size() - 1){ + sb.append(clzPaths.get(i)); + }else{ + sb.append(clzPaths.get(i) + ";"); + } + } + return sb.toString(); + } + + + + + +} diff --git a/group03/664269713/DataStructure/src/com/ace/jvm/test/ClassFileloaderTest.java b/group03/664269713/DataStructure/src/com/ace/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..2079641d3b --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,88 @@ +package com.ace.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.ace.jvm.loader.ClassFileLoader; + +public class ClassFileloaderTest { + + + static String path1 = "D:\\Upgrade\\coding2017\\group03\\664269713\\DataStructure\\bin"; + static String path2 = "C:\temp"; + + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.ace.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(809, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.ace.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Mon, 3 Apr 2017 22:24:19 +0800 Subject: [PATCH 051/552] SVM&LRU SVM&LRU --- .../{ => 1List&BinaryTreeNode}/ArrayList.java | 0 .../BinaryTreeNode.java | 0 .../{ => 1List&BinaryTreeNode}/Iterator.java | 0 .../LinkedList.java | 0 .../{ => 1List&BinaryTreeNode}/List.java | 0 .../{ => 1List&BinaryTreeNode}/Queue.java | 0 .../{ => 1List&BinaryTreeNode}/Stack.java | 0 .../JVM&LRU/JVM/ClassFileLoader.java | 63 ++++ .../JVM&LRU/JVM/ClassFileloaderTest.java | 88 +++++ group23/601689050/JVM&LRU/JVM/EmployeeV1.java | 28 ++ group23/601689050/JVM&LRU/LRU/Iterator.java | 5 + .../601689050/JVM&LRU/LRU/LRUPageFrame.java | 117 +++++++ .../JVM&LRU/LRU/LRUPageFrameTest.java | 29 ++ group23/601689050/JVM&LRU/LRU/LinkedList.java | 313 ++++++++++++++++++ group23/601689050/JVM&LRU/LRU/List.java | 7 + 15 files changed, 650 insertions(+) rename group23/601689050/{ => 1List&BinaryTreeNode}/ArrayList.java (100%) rename group23/601689050/{ => 1List&BinaryTreeNode}/BinaryTreeNode.java (100%) rename group23/601689050/{ => 1List&BinaryTreeNode}/Iterator.java (100%) rename group23/601689050/{ => 1List&BinaryTreeNode}/LinkedList.java (100%) rename group23/601689050/{ => 1List&BinaryTreeNode}/List.java (100%) rename group23/601689050/{ => 1List&BinaryTreeNode}/Queue.java (100%) rename group23/601689050/{ => 1List&BinaryTreeNode}/Stack.java (100%) create mode 100644 group23/601689050/JVM&LRU/JVM/ClassFileLoader.java create mode 100644 group23/601689050/JVM&LRU/JVM/ClassFileloaderTest.java create mode 100644 group23/601689050/JVM&LRU/JVM/EmployeeV1.java create mode 100644 group23/601689050/JVM&LRU/LRU/Iterator.java create mode 100644 group23/601689050/JVM&LRU/LRU/LRUPageFrame.java create mode 100644 group23/601689050/JVM&LRU/LRU/LRUPageFrameTest.java create mode 100644 group23/601689050/JVM&LRU/LRU/LinkedList.java create mode 100644 group23/601689050/JVM&LRU/LRU/List.java diff --git a/group23/601689050/ArrayList.java b/group23/601689050/1List&BinaryTreeNode/ArrayList.java similarity index 100% rename from group23/601689050/ArrayList.java rename to group23/601689050/1List&BinaryTreeNode/ArrayList.java diff --git a/group23/601689050/BinaryTreeNode.java b/group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java similarity index 100% rename from group23/601689050/BinaryTreeNode.java rename to group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java diff --git a/group23/601689050/Iterator.java b/group23/601689050/1List&BinaryTreeNode/Iterator.java similarity index 100% rename from group23/601689050/Iterator.java rename to group23/601689050/1List&BinaryTreeNode/Iterator.java diff --git a/group23/601689050/LinkedList.java b/group23/601689050/1List&BinaryTreeNode/LinkedList.java similarity index 100% rename from group23/601689050/LinkedList.java rename to group23/601689050/1List&BinaryTreeNode/LinkedList.java diff --git a/group23/601689050/List.java b/group23/601689050/1List&BinaryTreeNode/List.java similarity index 100% rename from group23/601689050/List.java rename to group23/601689050/1List&BinaryTreeNode/List.java diff --git a/group23/601689050/Queue.java b/group23/601689050/1List&BinaryTreeNode/Queue.java similarity index 100% rename from group23/601689050/Queue.java rename to group23/601689050/1List&BinaryTreeNode/Queue.java diff --git a/group23/601689050/Stack.java b/group23/601689050/1List&BinaryTreeNode/Stack.java similarity index 100% rename from group23/601689050/Stack.java rename to group23/601689050/1List&BinaryTreeNode/Stack.java diff --git a/group23/601689050/JVM&LRU/JVM/ClassFileLoader.java b/group23/601689050/JVM&LRU/JVM/ClassFileLoader.java new file mode 100644 index 0000000000..6a7ab61bc0 --- /dev/null +++ b/group23/601689050/JVM&LRU/JVM/ClassFileLoader.java @@ -0,0 +1,63 @@ +package com.loader; + +import java.io.*; +import java.util.ArrayList; +import java.util.Dictionary; +import java.util.List; + + + +public class ClassFileLoader { + + private List clzPaths = new ArrayList<>(); + + public byte[] readBinaryCode(String className) throws ClassNotFoundException { + + String fileName = className.replace('.',File.separatorChar)+".class"; + InputStream is = null; + try{ + is = new FileInputStream(fileName); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length = 0; + while((length = is.read(buffer)) != -1){ + baos.write(buffer,0,length); + } + return baos.toByteArray(); + } catch (IOException e){ + e.printStackTrace(); + } finally { + if(is!=null){ + try{ + is.close(); + } catch (IOException e){ + e.printStackTrace(); + } + } + } + return null; + } + + + + + public void addClassPath(String path) { + + StringBuilder str = new StringBuilder(path); + + } + + + + public String getClassPath(){ + + String path = Thread.currentThread().getContextClassLoader().getResource("/").getPath(); + + return path; + } + + + + + +} diff --git a/group23/601689050/JVM&LRU/JVM/ClassFileloaderTest.java b/group23/601689050/JVM&LRU/JVM/ClassFileloaderTest.java new file mode 100644 index 0000000000..eae77d6dd4 --- /dev/null +++ b/group23/601689050/JVM&LRU/JVM/ClassFileloaderTest.java @@ -0,0 +1,88 @@ +package com.test; + +import com.loader.ClassFileLoader; +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + + +public class ClassFileloaderTest { + + + public static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + public static String path2 = "C:\\temp"; + + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() throws ClassNotFoundException { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length-1); + + } + + + @Test + public void testMagicNumber() throws ClassNotFoundException { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i capacity) { + last = last.prev; + last.next = null; + } + } else { + moveToFirst(iteratorNode); + } + } + } + + } + + private void moveLastToFirst() { + last.next = first; + first.prev = last; + first = last; + last = last.prev; + last.next = null; + first.prev = null; + } + private void moveToFirst(Node iteratorNode){ + iteratorNode.prev.next = iteratorNode.next; + iteratorNode.next.prev = iteratorNode.prev; + iteratorNode.prev = null; + iteratorNode.next = first; + first.prev = iteratorNode; + first = iteratorNode; + } + + private void addToFirst(int pageNum) { + Node node = new Node(); + node.pageNum = pageNum; + node.prev = null; + node.next = first; + first.prev = node; + first = node; + size++; + } + + + 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/group23/601689050/JVM&LRU/LRU/LRUPageFrameTest.java b/group23/601689050/JVM&LRU/LRU/LRUPageFrameTest.java new file mode 100644 index 0000000000..a7dd99ec58 --- /dev/null +++ b/group23/601689050/JVM&LRU/LRU/LRUPageFrameTest.java @@ -0,0 +1,29 @@ +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()); + } + +} diff --git a/group23/601689050/JVM&LRU/LRU/LinkedList.java b/group23/601689050/JVM&LRU/LRU/LinkedList.java new file mode 100644 index 0000000000..4a71816e5d --- /dev/null +++ b/group23/601689050/JVM&LRU/LRU/LinkedList.java @@ -0,0 +1,313 @@ +import java.util.Objects; +import java.util.Stack; + +public class LinkedList implements List { + + private Node head; + private Node rear; + public boolean isEmpty(){ + return true; + } + + public void add(Object o){ + if(isEmpty()) + addFirst(o); + else + addLast(o); + } + public void add(int index , Object o){ + if(index<0 || o ==null){ + throw new IllegalArgumentException("不合法"); + } else if (index == 0 && head == null){ + addFirst(o); + }else if(index>0 && head == null){ + throw new IllegalArgumentException("不合法"); + }else{ + Node srcNode = (Node) this.get(index); + Node newNode = new Node(); + newNode.data = o; + newNode.next = srcNode.next; + srcNode.next.previous = newNode; + srcNode.next = newNode; + newNode.previous = srcNode; + } + } + public Object get(int index){ + Node newNode = new Node(); + for(int i = 0;i7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + Node p1,p2 = null; + p1 = head; + while (head.next != null){ + p2 = head.next; + head.next = p2.next; + p2.next = p1; + p1 = p2; + } + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + int size = this.size(); + Node newNode = new Node(); + newNode = head; + if(size%2 == 0){ + int length = size/2; + for(int i = 0;i101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + int[] listB = new int[list.size()-1]; + int[] listA = new int[list.size()-1]; + int size = list.size(); + for(int i=0;i min && (int)newNode.data min && (int)newNode.data > max){ + break; + } + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + LinkedList listA = this; + LinkedList listB = list; + LinkedList listC = new LinkedList(); + if(listA == null){ + return list; + } + if(listB == null){ + return this; + } + Node p1 = listA.head; + Node p2 = listB.head; + Node p3 = listC.head; + while(p1 != null && p2 !=null) { + if ((int) p1.data <= (int) p2.data) { + p3.next = p1; + p1 = p1.next; + } else { + p3.next = p2; + p2 = p2.next; + } + p3 = p3.next; + } + if(p1 == null){ + p3.next = p2; + } + if(p2 == null){ + p3.next = p1; + } + return listC; + } +} diff --git a/group23/601689050/JVM&LRU/LRU/List.java b/group23/601689050/JVM&LRU/LRU/List.java new file mode 100644 index 0000000000..4f7bcc71a8 --- /dev/null +++ b/group23/601689050/JVM&LRU/LRU/List.java @@ -0,0 +1,7 @@ +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} From db1ef05a3210141bd9bcf9aade2bb5c81b81a084 Mon Sep 17 00:00:00 2001 From: Jiandan1357 Date: Mon, 3 Apr 2017 22:38:47 +0800 Subject: [PATCH 052/552] =?UTF-8?q?4=E5=91=A8=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group23/601689050/{JVM&LRU => 4LRU&JVM}/JVM/ClassFileLoader.java | 0 .../601689050/{JVM&LRU => 4LRU&JVM}/JVM/ClassFileloaderTest.java | 0 group23/601689050/{JVM&LRU => 4LRU&JVM}/JVM/EmployeeV1.java | 0 group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/Iterator.java | 0 group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/LRUPageFrame.java | 0 group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/LRUPageFrameTest.java | 0 group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/LinkedList.java | 0 group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/List.java | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename group23/601689050/{JVM&LRU => 4LRU&JVM}/JVM/ClassFileLoader.java (100%) rename group23/601689050/{JVM&LRU => 4LRU&JVM}/JVM/ClassFileloaderTest.java (100%) rename group23/601689050/{JVM&LRU => 4LRU&JVM}/JVM/EmployeeV1.java (100%) rename group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/Iterator.java (100%) rename group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/LRUPageFrame.java (100%) rename group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/LRUPageFrameTest.java (100%) rename group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/LinkedList.java (100%) rename group23/601689050/{JVM&LRU => 4LRU&JVM}/LRU/List.java (100%) diff --git a/group23/601689050/JVM&LRU/JVM/ClassFileLoader.java b/group23/601689050/4LRU&JVM/JVM/ClassFileLoader.java similarity index 100% rename from group23/601689050/JVM&LRU/JVM/ClassFileLoader.java rename to group23/601689050/4LRU&JVM/JVM/ClassFileLoader.java diff --git a/group23/601689050/JVM&LRU/JVM/ClassFileloaderTest.java b/group23/601689050/4LRU&JVM/JVM/ClassFileloaderTest.java similarity index 100% rename from group23/601689050/JVM&LRU/JVM/ClassFileloaderTest.java rename to group23/601689050/4LRU&JVM/JVM/ClassFileloaderTest.java diff --git a/group23/601689050/JVM&LRU/JVM/EmployeeV1.java b/group23/601689050/4LRU&JVM/JVM/EmployeeV1.java similarity index 100% rename from group23/601689050/JVM&LRU/JVM/EmployeeV1.java rename to group23/601689050/4LRU&JVM/JVM/EmployeeV1.java diff --git a/group23/601689050/JVM&LRU/LRU/Iterator.java b/group23/601689050/4LRU&JVM/LRU/Iterator.java similarity index 100% rename from group23/601689050/JVM&LRU/LRU/Iterator.java rename to group23/601689050/4LRU&JVM/LRU/Iterator.java diff --git a/group23/601689050/JVM&LRU/LRU/LRUPageFrame.java b/group23/601689050/4LRU&JVM/LRU/LRUPageFrame.java similarity index 100% rename from group23/601689050/JVM&LRU/LRU/LRUPageFrame.java rename to group23/601689050/4LRU&JVM/LRU/LRUPageFrame.java diff --git a/group23/601689050/JVM&LRU/LRU/LRUPageFrameTest.java b/group23/601689050/4LRU&JVM/LRU/LRUPageFrameTest.java similarity index 100% rename from group23/601689050/JVM&LRU/LRU/LRUPageFrameTest.java rename to group23/601689050/4LRU&JVM/LRU/LRUPageFrameTest.java diff --git a/group23/601689050/JVM&LRU/LRU/LinkedList.java b/group23/601689050/4LRU&JVM/LRU/LinkedList.java similarity index 100% rename from group23/601689050/JVM&LRU/LRU/LinkedList.java rename to group23/601689050/4LRU&JVM/LRU/LinkedList.java diff --git a/group23/601689050/JVM&LRU/LRU/List.java b/group23/601689050/4LRU&JVM/LRU/List.java similarity index 100% rename from group23/601689050/JVM&LRU/LRU/List.java rename to group23/601689050/4LRU&JVM/LRU/List.java From 624fd04f1782f9a06b41b0cee559ca3e87e89783 Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Tue, 4 Apr 2017 13:10:43 +0800 Subject: [PATCH 053/552] =?UTF-8?q?=20[=E8=8F=A0=E8=90=9DC]:=E8=A1=A5?= =?UTF-8?q?=E4=BA=A4=E7=AC=AC=E4=BA=8C=E6=AC=A1=E6=99=AE=E9=80=9A=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01_DataStructure/src/main/ArrayList.java | 2 +- .../src/test/ArrayListTest.java | 13 +- .../02_ArrayUtil/src/main/ArrayUtil.java | 209 ++++++++++++++++++ .../02_ArrayUtil/src/test/ArrayUtilTest.java | 101 +++++++++ .../ordinary_work/02_temp/src/main/Test.java | 5 - 5 files changed, 323 insertions(+), 7 deletions(-) create mode 100644 group23/1323434545/ordinary_work/02_ArrayUtil/src/main/ArrayUtil.java create mode 100644 group23/1323434545/ordinary_work/02_ArrayUtil/src/test/ArrayUtilTest.java delete mode 100644 group23/1323434545/ordinary_work/02_temp/src/main/Test.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java b/group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java index 14548a000e..f5e2b03a8a 100644 --- a/group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java @@ -16,7 +16,7 @@ public void add(Object o) { @Override public void add(int index, Object o) { - //检查是否越界 + // 检查是否越界 ListUtils.CheckIndexInRange(0, size, index); if (size == elementData.length) { elementData = Arrays.copyOf(elementData, elementData.length + 10); diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java b/group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java index ee2ca2afd7..dc958d5731 100644 --- a/group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java +++ b/group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java @@ -23,6 +23,14 @@ public void testAddObject() { list.add(0); list.add(1); list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + list.add(7); + list.add(8); + list.add(9); + list.add(10); assertEquals(0, list.get(0)); assertEquals(1, list.get(1)); assertEquals(2, list.get(2)); @@ -107,11 +115,14 @@ public void testSize() { @Test public void testIterator() { + Iterator i = list.iterator(); + assertEquals(0, list.size()); + assertFalse(i.hasNext()); list.add("a"); list.add("b"); list.add("c"); list.add("d"); - Iterator i = list.iterator(); + i = list.iterator(); assertTrue(i.hasNext()); assertEquals("a", i.next()); assertTrue(i.hasNext()); diff --git a/group23/1323434545/ordinary_work/02_ArrayUtil/src/main/ArrayUtil.java b/group23/1323434545/ordinary_work/02_ArrayUtil/src/main/ArrayUtil.java new file mode 100644 index 0000000000..fd9ff8c8bd --- /dev/null +++ b/group23/1323434545/ordinary_work/02_ArrayUtil/src/main/ArrayUtil.java @@ -0,0 +1,209 @@ +package main; + +import java.util.Arrays; + +public class ArrayUtil { + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + if (null == origin) { + return; + } + for (int temp = 0, i = 0; i < origin.length / 2; i++) { + temp = origin[i]; + origin[i] = origin[origin.length - i - 1]; + origin[origin.length - i - 1] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @param newArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + if (null == oldArray) { + return null; + } + int counter = 0; + int[] newArray = new int[oldArray.length]; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[counter++] = oldArray[i]; + } + } + return Arrays.copyOf(newArray, counter); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5,6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + if (null == array1) { + return array2; + } + if (null == array2) { + return array1; + } + if (0 == array1.length && 0 == array2.length) { + return new int[0]; + } + Arrays.sort(array1); + Arrays.sort(array2); + int[] array = new int[array1.length + array2.length]; + System.arraycopy(array1, 0, array, 0, array1.length); + System.arraycopy(array2, 0, array, array1.length, array2.length); + int counter = 0; + for (int i = 0; i < array.length - 1 - counter; i++) { + for (int j = i + 1; j < array.length - counter; j++) { + if (array[i] == array[j]) { + int k = 0; + for (k = i; k < array.length - 1; k++) { + array[k] = array[k + 1]; + } + i--; + counter++; + break; + } + } + } + array = Arrays.copyOf(array, array.length - counter); + Arrays.sort(array); + return array; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + if (null == oldArray) { + return null; + } + int[] array = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + array[i] = oldArray[i]; + } + return array; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max <= 1) { + return new int[0]; + } + int[] array = new int[max]; + array[0] = 1; + array[1] = 1; + int i = 1; + do { + i++; + array[i] = array[i - 1] + array[i - 2]; + } while (array[i] < max); + return Arrays.copyOf(array, i); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + if (max < 3) { + return new int[0]; + } + int[] array = new int[max]; + int counter = 0; + for (int i = 2; i < max; i++) { + int j = 2; + for (; j * j <= i; j++) { + if (i % j == 0) { + break; + } + } + if (j * j > i) { + array[counter] = i; + counter++; + } + } + return Arrays.copyOf(array, counter); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + if (max < 7) { + return new int[0]; + } + int[] array = new int[2]; + int counter = 0; + for (int i = 6; i < max; i++) { + int sum = 0; + for (int j = 1; j <= i / 2; j++) { + if (i % j == 0) { + sum = sum + j; + } + } + if (sum == i) { + if (counter == array.length) { + array = ArrayUtil.grow(array, 2); + } + array[counter++] = i; + } + } + return Arrays.copyOf(array, counter); + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator) { + if (null == array) { + return null; + } + if (array.length == 0) { + return ""; + } + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + sb.append(seperator).append(array[i]); + } + return sb.toString().substring(seperator.length()); + } + +} diff --git a/group23/1323434545/ordinary_work/02_ArrayUtil/src/test/ArrayUtilTest.java b/group23/1323434545/ordinary_work/02_ArrayUtil/src/test/ArrayUtilTest.java new file mode 100644 index 0000000000..103d34daff --- /dev/null +++ b/group23/1323434545/ordinary_work/02_ArrayUtil/src/test/ArrayUtilTest.java @@ -0,0 +1,101 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import main.ArrayUtil; + +public class ArrayUtilTest { + @Test + public void testReverseArray() { + int[] origin = null; + ArrayUtil.reverseArray(origin); + assertEquals(null, origin); + + int[] origin1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + ArrayUtil.reverseArray(origin1); + int[] expected1 = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; + for (int i = 0; i < 4; i++) { + assertEquals(expected1[i], origin1[i]); + } + + int[] origin2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; + ArrayUtil.reverseArray(origin2); + int[] expected2 = { 8, 7, 6, 5, 4, 3, 2, 1, 0 }; + for (int i = 0; i < 4; i++) { + assertEquals(expected2[i], origin2[i]); + } + } + + @Test + public void testRemoveZero() { + int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; + int excepted[] = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }; + oldArr = ArrayUtil.removeZero(oldArr); + System.out.println(oldArr.length); + for (int i = 0; i < oldArr.length; i++) { + assertEquals(excepted[i], oldArr[i]); + } + } + + @Test + public void testMerge() { + int[] array1 = { 3, 4, 4, 5, 7, 8 }; + int[] array2 = { 4, 5, 6, 7 }; + int[] expected = { 3, 4, 5, 6, 7, 8 }; + int[] array = ArrayUtil.merge(array1, array2); + for (int i = 0; i < array.length; i++) { + assertEquals(expected[i], array[i]); + } + } + + @Test + public void testGrow() { + int[] oldArray = { 2, 3, 6 }; + int[] array = ArrayUtil.grow(oldArray, 3); + int[] expected = { 2, 3, 6, 0, 0, 0 }; + for (int i = 0; i < array.length; i++) { + assertEquals(expected[i], array[i]); + } + } + + @Test + public void testFibonacci() { + int[] fibonacci = ArrayUtil.fibonacci(1); + assertEquals(0, fibonacci.length); + + int[] fibonacci1 = ArrayUtil.fibonacci(16); + int[] excepted1 = { 1, 1, 2, 3, 5, 8, 13, 15 }; + for (int i = 0; i < fibonacci1.length; i++) { + assertEquals(excepted1[i], fibonacci1[i]); + } + } + + @Test + public void testGetPrimes() { + int[] primes = ArrayUtil.getPrimes(23); + int[] excepted = { 2, 3, 5, 7, 11, 13, 17, 19 }; + for (int i = 0; i < primes.length; i++) { + assertEquals(excepted[i], primes[i]); + } + } + + @Test + public void testGetPerfectNumbers() { + int[] PerfectNumbers = ArrayUtil.getPerfectNumbers(497); + int[] excepted = { 6, 28, 496 }; + for (int i = 0; i < PerfectNumbers.length; i++) { + assertEquals(excepted[i], PerfectNumbers[i]); + } + } + + @Test + public void testJoin() { + int[] array1 = { 3 }; + assertEquals("3", ArrayUtil.join(array1, "-%")); + int[] array2 = { 3, 8, 9, 7 }; + assertEquals("3-%8-%9-%7", ArrayUtil.join(array2, "-%")); + } + +} diff --git a/group23/1323434545/ordinary_work/02_temp/src/main/Test.java b/group23/1323434545/ordinary_work/02_temp/src/main/Test.java deleted file mode 100644 index e4585146a0..0000000000 --- a/group23/1323434545/ordinary_work/02_temp/src/main/Test.java +++ /dev/null @@ -1,5 +0,0 @@ -package main; - -public class Test { - -} From 8a82604362b931c784f07e9ec23ba057c3c95bc2 Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Tue, 4 Apr 2017 20:12:31 +0800 Subject: [PATCH 054/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E8=A1=A5?= =?UTF-8?q?=E4=BA=A4=E5=85=B3=E4=BA=8E=E8=AF=BB=E5=8F=96Struts=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E7=9A=84=E4=BD=9C=E4=B8=9A!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01_litestruts/src/main/LoginAction.java | 36 ++++++++++ .../01_litestruts/src/main/Struts.java | 71 +++++++++++++++++++ .../big_work/01_litestruts/src/main/View.java | 27 +++++++ .../01_litestruts/src/test/StrutsTest.java | 55 ++++++++++++++ .../big_work/01_temp/src/main/Test.java | 5 -- 5 files changed, 189 insertions(+), 5 deletions(-) create mode 100644 group23/1323434545/big_work/01_litestruts/src/main/LoginAction.java create mode 100644 group23/1323434545/big_work/01_litestruts/src/main/Struts.java create mode 100644 group23/1323434545/big_work/01_litestruts/src/main/View.java create mode 100644 group23/1323434545/big_work/01_litestruts/src/test/StrutsTest.java delete mode 100644 group23/1323434545/big_work/01_temp/src/main/Test.java diff --git a/group23/1323434545/big_work/01_litestruts/src/main/LoginAction.java b/group23/1323434545/big_work/01_litestruts/src/main/LoginAction.java new file mode 100644 index 0000000000..4f48122d92 --- /dev/null +++ b/group23/1323434545/big_work/01_litestruts/src/main/LoginAction.java @@ -0,0 +1,36 @@ +package main; + +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} \ No newline at end of file diff --git a/group23/1323434545/big_work/01_litestruts/src/main/Struts.java b/group23/1323434545/big_work/01_litestruts/src/main/Struts.java new file mode 100644 index 0000000000..5cd2261413 --- /dev/null +++ b/group23/1323434545/big_work/01_litestruts/src/main/Struts.java @@ -0,0 +1,71 @@ +package main; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 + * + */ + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static View runAction(String actionName, Map parameters) + throws DocumentException, ReflectiveOperationException, SecurityException { + View view = null; + SAXReader reader = new SAXReader(); + Document document = reader.read(new File("./xml/struts.xml")); + Element root = document.getRootElement(); + for (Iterator iterator = (Iterator) root.elementIterator("action"); iterator.hasNext();) { + Element actionElement = (Element) iterator.next(); + String actionElementName = actionElement.attributeValue("name"); + if (actionElementName.equals(actionName)) { + Class c = Class.forName(actionElement.attributeValue("class")); + Constructor con = c.getConstructor(); + Object o = con.newInstance(); + Method setName = c.getMethod("setName", String.class); + setName.invoke(o, parameters.get("name")); + Method setPassword = c.getMethod("setPassword", String.class); + setPassword.invoke(o, parameters.get("password")); + Method execute = c.getMethod("execute"); + String resultStr = execute.invoke(o).toString(); + + for (iterator = actionElement.elementIterator("result"); iterator.hasNext();) { + Element resultElement = (Element) iterator.next(); + if (resultElement.attributeValue("name").equals(resultStr)) { + view = new View(); + parameters.put("name", c.getMethod("getName").invoke(o).toString()); + parameters.put("password", c.getMethod("getPassword").invoke(o).toString()); + parameters.put("message", c.getMethod("getMessage").invoke(o).toString()); + view.setJsp(resultElement.getStringValue()); + view.setParameters(parameters); + } + } + } + + } + return view; + + } + +} \ No newline at end of file diff --git a/group23/1323434545/big_work/01_litestruts/src/main/View.java b/group23/1323434545/big_work/01_litestruts/src/main/View.java new file mode 100644 index 0000000000..93c37fd966 --- /dev/null +++ b/group23/1323434545/big_work/01_litestruts/src/main/View.java @@ -0,0 +1,27 @@ +package main; + +import java.util.Map; + +@SuppressWarnings("rawtypes") +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group23/1323434545/big_work/01_litestruts/src/test/StrutsTest.java b/group23/1323434545/big_work/01_litestruts/src/test/StrutsTest.java new file mode 100644 index 0000000000..836897b221 --- /dev/null +++ b/group23/1323434545/big_work/01_litestruts/src/test/StrutsTest.java @@ -0,0 +1,55 @@ +package test; + +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + +import main.Struts; +import main.View; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "tes"); + params.put("password", "1234"); + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group23/1323434545/big_work/01_temp/src/main/Test.java b/group23/1323434545/big_work/01_temp/src/main/Test.java deleted file mode 100644 index e4585146a0..0000000000 --- a/group23/1323434545/big_work/01_temp/src/main/Test.java +++ /dev/null @@ -1,5 +0,0 @@ -package main; - -public class Test { - -} From f7fd2fb684e5108e83014e8cd9f26ce27273ecc3 Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Tue, 4 Apr 2017 20:28:10 +0800 Subject: [PATCH 055/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=9B=AE=E5=BD=95=E5=90=8D=E5=AD=97!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01_litestruts/src/main/LoginAction.java | 0 .../{big_work => work_Big}/01_litestruts/src/main/Struts.java | 0 .../{big_work => work_Big}/01_litestruts/src/main/View.java | 0 .../{big_work => work_Big}/01_litestruts/src/test/StrutsTest.java | 0 .../1323434545/{big_work => work_Big}/02_temp/src/main/Test.java | 0 .../01_5BasicDS}/src/main/ArrayList.java | 0 .../01_5BasicDS}/src/main/BinaryTreeNode.java | 0 .../01_5BasicDS}/src/main/Iterator.java | 0 .../01_5BasicDS}/src/main/LinkedList.java | 0 .../01_5BasicDS}/src/main/List.java | 0 .../01_5BasicDS}/src/main/Queue.java | 0 .../01_5BasicDS}/src/main/Stack.java | 0 .../01_5BasicDS}/src/test/ArrayListTest.java | 0 .../01_5BasicDS}/src/test/BinaryTreeNodeTest.java | 0 .../01_5BasicDS}/src/test/LinkedListTest.java | 0 .../01_5BasicDS}/src/test/QueueTest.java | 0 .../01_5BasicDS}/src/test/StackTest.java | 0 .../01_5BasicDS}/src/utils/ListUtils.java | 0 .../02_ArrayUtil/src/main/ArrayUtil.java | 0 .../02_ArrayUtil/src/test/ArrayUtilTest.java | 0 20 files changed, 0 insertions(+), 0 deletions(-) rename group23/1323434545/{big_work => work_Big}/01_litestruts/src/main/LoginAction.java (100%) rename group23/1323434545/{big_work => work_Big}/01_litestruts/src/main/Struts.java (100%) rename group23/1323434545/{big_work => work_Big}/01_litestruts/src/main/View.java (100%) rename group23/1323434545/{big_work => work_Big}/01_litestruts/src/test/StrutsTest.java (100%) rename group23/1323434545/{big_work => work_Big}/02_temp/src/main/Test.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/main/ArrayList.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/main/BinaryTreeNode.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/main/Iterator.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/main/LinkedList.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/main/List.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/main/Queue.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/main/Stack.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/test/ArrayListTest.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/test/BinaryTreeNodeTest.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/test/LinkedListTest.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/test/QueueTest.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/test/StackTest.java (100%) rename group23/1323434545/{ordinary_work/01_DataStructure => work_DataStructure/01_5BasicDS}/src/utils/ListUtils.java (100%) rename group23/1323434545/{ordinary_work => work_DataStructure}/02_ArrayUtil/src/main/ArrayUtil.java (100%) rename group23/1323434545/{ordinary_work => work_DataStructure}/02_ArrayUtil/src/test/ArrayUtilTest.java (100%) diff --git a/group23/1323434545/big_work/01_litestruts/src/main/LoginAction.java b/group23/1323434545/work_Big/01_litestruts/src/main/LoginAction.java similarity index 100% rename from group23/1323434545/big_work/01_litestruts/src/main/LoginAction.java rename to group23/1323434545/work_Big/01_litestruts/src/main/LoginAction.java diff --git a/group23/1323434545/big_work/01_litestruts/src/main/Struts.java b/group23/1323434545/work_Big/01_litestruts/src/main/Struts.java similarity index 100% rename from group23/1323434545/big_work/01_litestruts/src/main/Struts.java rename to group23/1323434545/work_Big/01_litestruts/src/main/Struts.java diff --git a/group23/1323434545/big_work/01_litestruts/src/main/View.java b/group23/1323434545/work_Big/01_litestruts/src/main/View.java similarity index 100% rename from group23/1323434545/big_work/01_litestruts/src/main/View.java rename to group23/1323434545/work_Big/01_litestruts/src/main/View.java diff --git a/group23/1323434545/big_work/01_litestruts/src/test/StrutsTest.java b/group23/1323434545/work_Big/01_litestruts/src/test/StrutsTest.java similarity index 100% rename from group23/1323434545/big_work/01_litestruts/src/test/StrutsTest.java rename to group23/1323434545/work_Big/01_litestruts/src/test/StrutsTest.java diff --git a/group23/1323434545/big_work/02_temp/src/main/Test.java b/group23/1323434545/work_Big/02_temp/src/main/Test.java similarity index 100% rename from group23/1323434545/big_work/02_temp/src/main/Test.java rename to group23/1323434545/work_Big/02_temp/src/main/Test.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/main/ArrayList.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/BinaryTreeNode.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/main/BinaryTreeNode.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/Iterator.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/main/Iterator.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/LinkedList.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/main/LinkedList.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/List.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/main/List.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/Queue.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/main/Queue.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/main/Stack.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/main/Stack.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/test/ArrayListTest.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/BinaryTreeNodeTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/test/BinaryTreeNodeTest.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/LinkedListTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/test/LinkedListTest.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/QueueTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/test/QueueTest.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/test/StackTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/test/StackTest.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java diff --git a/group23/1323434545/ordinary_work/01_DataStructure/src/utils/ListUtils.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java similarity index 100% rename from group23/1323434545/ordinary_work/01_DataStructure/src/utils/ListUtils.java rename to group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java diff --git a/group23/1323434545/ordinary_work/02_ArrayUtil/src/main/ArrayUtil.java b/group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java similarity index 100% rename from group23/1323434545/ordinary_work/02_ArrayUtil/src/main/ArrayUtil.java rename to group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java diff --git a/group23/1323434545/ordinary_work/02_ArrayUtil/src/test/ArrayUtilTest.java b/group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java similarity index 100% rename from group23/1323434545/ordinary_work/02_ArrayUtil/src/test/ArrayUtilTest.java rename to group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java From 6bc5b7dfcdf58434ed1cdf476d21f3557b56238a Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 5 Apr 2017 15:25:12 +0800 Subject: [PATCH 056/552] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HarryHook/coding2017/array/ArrayUtil.java | 561 +++++------ .../coding2017/array/ArrayUtilTest.java | 291 +++--- .../coding2017/basic/ArrayListTest.java | 14 +- .../coding2017/basic/BinaryTreeNode.java | 202 ++-- .../coding2017/basic/BinaryTreeNodeTest.java | 55 +- .../HarryHook/coding2017/basic/Iterator.java | 8 +- .../coding2017/basic/LinkedListTest.java | 631 ++++++------- .../HarryHook/coding2017/basic/List.java | 22 +- .../HarryHook/coding2017/basic/ListTest.java | 212 ++--- .../coding2017/basic/MyArrayList.java | 279 +++--- .../coding2017/basic/MyLinkedList.java | 886 ++++++++---------- .../HarryHook/coding2017/basic/MyQueue.java | 78 +- .../HarryHook/coding2017/basic/MyStack.java | 83 +- .../HarryHook/coding2017/basic/QueueTest.java | 46 +- .../HarryHook/coding2017/basic/StackTest.java | 54 +- .../coding2017/download/DownloadThread.java | 76 +- .../coding2017/download/FileDownloader.java | 153 ++- .../download/FileDownloaderTest.java | 84 +- .../coding2017/download/api/Connection.java | 40 +- .../download/api/ConnectionManager.java | 13 +- .../download/impl/ConnectionImpl.java | 94 +- .../download/impl/ConnectionManagerImpl.java | 8 +- .../jvm/loader/ClassFileLoader.java | 98 +- .../jvm/test/ClassFileloaderTest.java | 143 ++- .../coding2017/jvm/test/EmployeeV1.java | 32 +- .../coding2017/linklist/LRUPageFrame.java | 79 +- .../coding2017/linklist/LRUPageFrameTest.java | 53 +- .../coding2017/litestruts/Configuration.java | 157 ++-- .../litestruts/ConfigurationException.java | 21 +- .../litestruts/ConfigurationTest.java | 67 +- .../coding2017/litestruts/LoginAction.java | 35 +- .../coding2017/litestruts/ReflectionUtil.java | 112 ++- .../litestruts/ReflectionUtilTest.java | 177 ++-- .../coding2017/litestruts/Struts.java | 42 +- .../coding2017/litestruts/StrutsTest.java | 68 +- .../HarryHook/coding2017/litestruts/View.java | 53 +- 36 files changed, 2329 insertions(+), 2698 deletions(-) diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java index d5cca25bf4..613163b38a 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java @@ -4,367 +4,236 @@ import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; -public class ArrayUtil -{ - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin) - { - if(origin == null || origin.length == 0) - { - return ; - } - - for(int i=0, j = origin.length-1; i array2[j]) - { - newArray[count++] = array2[j++]; - } - else if(array1[i] == array2[j]) - { - newArray[count++] = array2[j++]; - i++; - } - } - while(i==array1.length && j= max) - { - break; - } - else - { - count++; - } - } - - return Arrays.copyOf(a, count); + // 将非零元素copy到新数组 + return Arrays.copyOf(b, count); + + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (array1 == null) { + return array2; } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max) - { - /* - * 思路:先生成素数数组,数组的最大值小于max - */ - //max小于3时,返回空数组 - if(max < 3) - { - return new int[0]; - } - int[] array = new int[max]; - int count = 0; + if (array2 == null) { + return array1; + } + int[] newArray = new int[array1.length + array2.length]; + // 应该让a1,a2两个数组先进行比较 比较后插入元素 + int i = 0; // array1下标 + int j = 0; // array2下标 + int count = 0; // array3下标 + while (i < array1.length && j < array2.length) { + if (array1[i] < array2[j]) { + newArray[count++] = array1[i++]; + } else if (array1[i] > array2[j]) { + newArray[count++] = array2[j++]; + } else if (array1[i] == array2[j]) { + newArray[count++] = array1[i++] = array2[j++]; + } + } + while (j == array2.length && i < array1.length) { + newArray[count++] = array1[i++]; + } + while (i == array1.length && j < array2.length) { + newArray[count++] = array2[j++]; + } + return Arrays.copyOf(newArray, count); + } - for(int n = 2; n < max; n++) - { - if(isPrime(n)) - { - array[count++] = n; - } - } - - return Arrays.copyOf(array, count); + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + * @throws Exception + */ + public int[] grow(int[] oldArray, int size) { + if (oldArray == null) { + return null; } + if (size < 0) { + throw new IndexOutOfBoundsException("size小于0"); + } + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } - private boolean isPrime(int n) - { - //判断当前n是不是素数 - int i = 2; - while(i < n) - { - if(n % i == 0) - break; - if(n % i != 0) - i++; - } - return i == n; + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max == 1) { + return new int[0]; } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) - { - if(max < 0) - { - return null; - } - int[] array = new int[max]; - int count = 0; - - for(int n = 2; n < max; n++) - { - int sum = 0; - for(int i=1; i= max) { + break; + } else { + count++; + } } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param s - * @return + + return Arrays.copyOf(a, count); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + /* + * 思路:先生成素数数组,数组的最大值小于max */ - public String join(int[] array, String seperator) - { - if(array == null ) - { - return null; - } - if(array.length == 0) - { - return ""; - } - - StringBuilder buffer = new StringBuilder(); - for(int i=0; i5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - @Test - public void testRemoveFirstHalf() { - aLinkedList.removeFirstHalf(); - assertEquals(0, aLinkedList.size()); - - aLinkedList.add(2); - aLinkedList.add(5); - aLinkedList.add(7); - aLinkedList.add(8); // [2,5,7,8] - - aLinkedList.removeFirstHalf(); // [7,8] - assertEquals(2, aLinkedList.size()); - assertEquals(7, aLinkedList.get(0)); - assertEquals(8, aLinkedList.get(1)); + assertEquals(4, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testReverse() { + // 测试当aLinkedList为空时的情况 + aLinkedList.reverse(); + assertEquals(0, aLinkedList.size()); + + // 测试当aLinkedList长度为1时的情况 + aLinkedList.add(4); + aLinkedList.reverse(); + assertEquals(1, aLinkedList.size()); + assertEquals(4, aLinkedList.get(0)); + + for (int i = 1; i < 4; i++) { + aLinkedList.add(i); // [4,1,2,3] } - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - @Test - public void testRemoveIntInt() { - - for (int i=0; i<4; i++) { - aLinkedList.add(i); // [0,1,2,3] - } - - aLinkedList.remove(0, 2); // [2,3] - assertEquals(2, aLinkedList.get(0)); - assertEquals(3, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - - aLinkedList.remove(1, 0); - aLinkedList.remove(0, 0); - assertEquals(2, aLinkedList.size()); - - aLinkedList.remove(1, 1); // [2] - assertEquals(1, aLinkedList.size()); - assertEquals(2, aLinkedList.get(0)); - - aLinkedList.remove(0, 1); // [] - assertEquals(0, aLinkedList.size()); - - expectedEx.expect(Exception.class); - aLinkedList.remove(1, 3); + aLinkedList.reverse(); + assertEquals(4, aLinkedList.size()); + assertEquals(3, aLinkedList.get(0)); + assertEquals(2, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + + } + + /** + * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 + * ,删除以后的值为7,8,10 + * + */ + @Test + public void testRemoveFirstHalf() { + aLinkedList.removeFirstHalf(); + assertEquals(0, aLinkedList.size()); + + aLinkedList.add(2); + aLinkedList.add(5); + aLinkedList.add(7); + aLinkedList.add(8); // [2,5,7,8] + + aLinkedList.removeFirstHalf(); // [7,8] + assertEquals(2, aLinkedList.size()); + assertEquals(7, aLinkedList.get(0)); + assertEquals(8, aLinkedList.get(1)); + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + @Test + public void testRemoveIntInt() { + + for (int i = 0; i < 4; i++) { + aLinkedList.add(i); // [0,1,2,3] } - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - @Test - public void testGetElements() { - for (int i=0; i<4; i++) { - aLinkedList.add(i * i); // [0,1,4,9] - } - - MyLinkedList bLinkedList = new MyLinkedList(); - int[] z1 = aLinkedList.getElements(bLinkedList); // [] - assertArrayEquals( z1, new int[0]); - - bLinkedList.add(1); - bLinkedList.add(3); // [1, 3] - - z1 = aLinkedList.getElements(bLinkedList); // [1, 9] - assertArrayEquals(new int[] {1,9}, z1); - - bLinkedList.add(1, 2); // bLinkedList = [1, 2, 3] - z1 = aLinkedList.getElements(bLinkedList); // [1, 4, 9] - assertArrayEquals(new int[] {1,4,9}, z1); - - bLinkedList.add(0, 0); // bLinkedList = [0, 1, 2, 3] - z1 = aLinkedList.getElements(bLinkedList); // [0, 1, 4, 9] - assertArrayEquals(new int[] {0,1,4,9}, z1); - - // aLinkedList不应该变化 - assertEquals(4, aLinkedList.size()); - for (int i=0; i<4; i++) { - assertEquals(i*i, aLinkedList.get(i)); // [0,1,4,9] - } - - // Exception - bLinkedList.add(5); // bLinkedList = [0, 1, 2, 3, 5] - expectedEx.expect(Exception.class); - z1 = aLinkedList.getElements(bLinkedList); + aLinkedList.remove(0, 2); // [2,3] + assertEquals(2, aLinkedList.get(0)); + assertEquals(3, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + + aLinkedList.remove(1, 0); + aLinkedList.remove(0, 0); + assertEquals(2, aLinkedList.size()); + + aLinkedList.remove(1, 1); // [2] + assertEquals(1, aLinkedList.size()); + assertEquals(2, aLinkedList.get(0)); + + aLinkedList.remove(0, 1); // [] + assertEquals(0, aLinkedList.size()); + + expectedEx.expect(Exception.class); + aLinkedList.remove(1, 3); + } + + /** + * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = + * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + @Test + public void testGetElements() { + for (int i = 0; i < 4; i++) { + aLinkedList.add(i * i); // [0,1,4,9] } - - @Test - public void TestSubtract() - { - //传进的list为null,什么都不干 - MyLinkedList list = null; - for (int i=0; i<6; i++) - { - aLinkedList.add(i); //[0,1,2,3,4,5] - } - aLinkedList.subtract(list); - assertEquals(6, aLinkedList.size()); - - //传进的list为空 - list = new MyLinkedList(); - aLinkedList.subtract(list); - assertEquals(6, aLinkedList.size()); - - aLinkedList.add(1, 1); //[0,1,1,2,3,4,5] - aLinkedList.add(4, 3); //[0,1, 1, 2, 3, 3, 4, 5] - - // list添加元素[0, 1, 3, 7] - list.add(0); - list.add(1); - list.add(3); - list.add(7); - - aLinkedList.subtract(list); //[ 2, 4, 5] - - assertEquals(2, aLinkedList.get(0)); - assertEquals(4, aLinkedList.get(1)); - assertEquals(5, aLinkedList.get(2)); - assertEquals(3, aLinkedList.size()); + + MyLinkedList bLinkedList = new MyLinkedList(); + int[] z1 = aLinkedList.getElements(bLinkedList); // [] + assertArrayEquals(z1, new int[0]); + + bLinkedList.add(1); + bLinkedList.add(3); // [1, 3] + + z1 = aLinkedList.getElements(bLinkedList); // [1, 9] + assertArrayEquals(new int[] { 1, 9 }, z1); + + bLinkedList.add(1, 2); // bLinkedList = [1, 2, 3] + z1 = aLinkedList.getElements(bLinkedList); // [1, 4, 9] + assertArrayEquals(new int[] { 1, 4, 9 }, z1); + + bLinkedList.add(0, 0); // bLinkedList = [0, 1, 2, 3] + z1 = aLinkedList.getElements(bLinkedList); // [0, 1, 4, 9] + assertArrayEquals(new int[] { 0, 1, 4, 9 }, z1); + + // aLinkedList不应该变化 + assertEquals(4, aLinkedList.size()); + for (int i = 0; i < 4; i++) { + assertEquals(i * i, aLinkedList.get(i)); // [0,1,4,9] } - @Test - public void testRemoveDuplicateValues() - { - aLinkedList.removeDuplicateValues(); - assertEquals(0, aLinkedList.size()); - - aLinkedList.add(3); - aLinkedList.add(3); - aLinkedList.add(4); - aLinkedList.add(4); - aLinkedList.add(5); - aLinkedList.add(6); - aLinkedList.add(6); //[3, 3, 4, 4, 5, 6, 6] - - aLinkedList.removeDuplicateValues(); //[3, 4, 5, 6] - - assertEquals(3, aLinkedList.get(0)); - assertEquals(4, aLinkedList.get(1)); - assertEquals(5, aLinkedList.get(2)); - assertEquals(6, aLinkedList.get(3)); - assertEquals(4, aLinkedList.size()); - + + // Exception + bLinkedList.add(5); // bLinkedList = [0, 1, 2, 3, 5] + expectedEx.expect(Exception.class); + z1 = aLinkedList.getElements(bLinkedList); + } + + @Test + public void TestSubtract() { + // 传进的list为null,什么都不干 + MyLinkedList list = null; + for (int i = 0; i < 6; i++) { + aLinkedList.add(i); // [0,1,2,3,4,5] } - @Test - public void testRemoveRange() - { - for (int i=0; i<6; i++) - { - aLinkedList.add(i); // [0, 1, 2, 3, 4, 5] //考虑重复元素 - } - aLinkedList.addFirst(0); // [0, 0, 1, 2, 3, 4, 5] - aLinkedList.add(3, 2); // [0, 0, 1, 2, 2, 3, 4, 5] - - aLinkedList.removeRange(1, 4); // 大于1小于4 [0, 0, 1, 4, 5] - - assertEquals(0, aLinkedList.get(0)); - assertEquals(0, aLinkedList.get(1)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(4, aLinkedList.get(3)); - assertEquals(5, aLinkedList.get(4)); - assertEquals(5, aLinkedList.size()); - - //若出现 min >= max的情况,什么都不做 - aLinkedList.removeRange(4, 1); - assertEquals(0, aLinkedList.get(0)); - assertEquals(0, aLinkedList.get(1)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(4, aLinkedList.get(3)); - assertEquals(5, aLinkedList.get(4)); - assertEquals(5, aLinkedList.size()); - - //将整个链表中的元素删除 - aLinkedList.removeRange(-1, 8); - assertEquals(0, aLinkedList.size()); + aLinkedList.subtract(list); + assertEquals(6, aLinkedList.size()); + + // 传进的list为空 + list = new MyLinkedList(); + aLinkedList.subtract(list); + assertEquals(6, aLinkedList.size()); + + aLinkedList.add(1, 1); // [0,1,1,2,3,4,5] + aLinkedList.add(4, 3); // [0,1, 1, 2, 3, 3, 4, 5] + + // list添加元素[0, 1, 3, 7] + list.add(0); + list.add(1); + list.add(3); + list.add(7); + + aLinkedList.subtract(list); // [ 2, 4, 5] + + assertEquals(2, aLinkedList.get(0)); + assertEquals(4, aLinkedList.get(1)); + assertEquals(5, aLinkedList.get(2)); + assertEquals(3, aLinkedList.size()); + } + + @Test + public void testRemoveDuplicateValues() { + aLinkedList.removeDuplicateValues(); + assertEquals(0, aLinkedList.size()); + + aLinkedList.add(3); + aLinkedList.add(3); + aLinkedList.add(4); + aLinkedList.add(4); + aLinkedList.add(5); + aLinkedList.add(6); + aLinkedList.add(6); // [3, 3, 4, 4, 5, 6, 6] + + aLinkedList.removeDuplicateValues(); // [3, 4, 5, 6] + + assertEquals(3, aLinkedList.get(0)); + assertEquals(4, aLinkedList.get(1)); + assertEquals(5, aLinkedList.get(2)); + assertEquals(6, aLinkedList.get(3)); + assertEquals(4, aLinkedList.size()); + + } + + @Test + public void testRemoveRange() { + for (int i = 0; i < 6; i++) { + aLinkedList.add(i); // [0, 1, 2, 3, 4, 5] //考虑重复元素 } - @Test - public void testIntersection() - { - for (int i=0; i<6; i++) - { - aLinkedList.add(i); - } - aLinkedList.add(6); - aLinkedList.add(7); // [0, 1, 2, 3, 4, 5, 6, 7] - //list为null - MyLinkedList list = null; - MyLinkedList newList1 = aLinkedList.intersection(list); - assertNull(newList1); - - //list为空链表 - list = new MyLinkedList(); - MyLinkedList newList2 = aLinkedList.intersection(list); - assertEquals(0, newList2.size()); - - list.add(0); - list.add(3); - list.add(4); - list.add(6); - list.add(7); // [0, 3, 4, 6, 7] - MyLinkedList newList3 = aLinkedList.intersection(list); - - assertEquals(0, newList3.get(0)); - assertEquals(3, newList3.get(1)); - assertEquals(4, newList3.get(2)); - assertEquals(6, newList3.get(3)); - assertEquals(7, newList3.get(4)); - assertEquals(5, newList3.size()); + aLinkedList.addFirst(0); // [0, 0, 1, 2, 3, 4, 5] + aLinkedList.add(3, 2); // [0, 0, 1, 2, 2, 3, 4, 5] + + aLinkedList.removeRange(1, 4); // 大于1小于4 [0, 0, 1, 4, 5] + + assertEquals(0, aLinkedList.get(0)); + assertEquals(0, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + assertEquals(5, aLinkedList.get(4)); + assertEquals(5, aLinkedList.size()); + + // 若出现 min >= max的情况,什么都不做 + aLinkedList.removeRange(4, 1); + assertEquals(0, aLinkedList.get(0)); + assertEquals(0, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + assertEquals(5, aLinkedList.get(4)); + assertEquals(5, aLinkedList.size()); + + // 将整个链表中的元素删除 + aLinkedList.removeRange(-1, 8); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testIntersection() { + for (int i = 0; i < 6; i++) { + aLinkedList.add(i); } - + aLinkedList.add(6); + aLinkedList.add(7); // [0, 1, 2, 3, 4, 5, 6, 7] + // list为null + MyLinkedList list = null; + MyLinkedList newList1 = aLinkedList.intersection(list); + assertNull(newList1); + + // list为空链表 + list = new MyLinkedList(); + MyLinkedList newList2 = aLinkedList.intersection(list); + assertEquals(0, newList2.size()); + + list.add(0); + list.add(3); + list.add(4); + list.add(6); + list.add(7); // [0, 3, 4, 6, 7] + MyLinkedList newList3 = aLinkedList.intersection(list); + + assertEquals(0, newList3.get(0)); + assertEquals(3, newList3.get(1)); + assertEquals(4, newList3.get(2)); + assertEquals(6, newList3.get(3)); + assertEquals(7, newList3.get(4)); + assertEquals(5, newList3.size()); + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java index f2299e8e83..e73700ec53 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java @@ -1,14 +1,16 @@ package com.github.HarryHook.coding2017.basic; +public interface List { -public interface List -{ - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - - public Iterator iterator(); -} + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + public Object remove(int index); + + public int size(); + + public Iterator iterator(); +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java index 92f84b687c..113b32f4d2 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java @@ -10,113 +10,109 @@ public class ListTest { - protected static List aList; - - @Test - public void testFunctional() { - aList.add(1); - aList.add(2); - assertEquals(1, aList.get(0)); - assertEquals(2, aList.get(1)); - - aList.add(3); - aList.add(0, 5); - aList.add(2, 11); - assertEquals(5, aList.get(0)); - assertEquals(11, aList.get(2)); - - aList.add("hi"); - assertEquals("hi", aList.get(5)); - assertEquals(6, aList.size()); - - aList.remove(1); - assertEquals(11, aList.get(1)); - assertEquals(2, aList.get(2)); - - assertEquals(5, aList.size()); - } - - @Test - public void testAdd() { - for (int i=0; i<100; i++) - aList.add(i); - assertEquals(0, aList.get(0)); - assertEquals(99, aList.get(99)); - assertEquals(44, aList.get(44)); - } - - @Test - public void testRemove() { - aList.add(1); - aList.add(2); - aList.add(3); - int u = (Integer)aList.remove(2); - assertEquals(3, u); - assertEquals(2, aList.size()); - - aList.add(1, 5); - u = (Integer)aList.remove(0); - assertEquals(1, u); - assertEquals(5, aList.get(0)); - assertEquals(2, aList.get(1)); - assertEquals(2, aList.size()); - - aList.remove(0); - aList.remove(0); - assertEquals(0, aList.size()); - - - } - - @Test - public void testSize() { - for (int i=0; i<10; i++) - aList.add(i*2); - assertEquals(10, aList.size()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testException() { - expectedEx.expect(Exception.class); - aList.remove(1); - aList.add(3); - aList.add(2, 5); - expectedEx.expect(Exception.class); - } - - @Test - - public void testIterator() - { - Iterator it = aList.iterator(); - assertEquals(false, it.hasNext()); - - aList.add(1); - aList.add(2); - aList.add(3); - - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(2, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - aList.remove(1); - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - expectedEx.expect(Exception.class); - it.next(); - - } - - + protected static List aList; + + @Test + public void testFunctional() { + aList.add(1); + aList.add(2); + assertEquals(1, aList.get(0)); + assertEquals(2, aList.get(1)); + + aList.add(3); + aList.add(0, 5); + aList.add(2, 11); + assertEquals(5, aList.get(0)); + assertEquals(11, aList.get(2)); + + aList.add("hi"); + assertEquals("hi", aList.get(5)); + assertEquals(6, aList.size()); + + aList.remove(1); + assertEquals(11, aList.get(1)); + assertEquals(2, aList.get(2)); + + assertEquals(5, aList.size()); + } + + @Test + public void testAdd() { + for (int i = 0; i < 100; i++) + aList.add(i); + assertEquals(0, aList.get(0)); + assertEquals(99, aList.get(99)); + assertEquals(44, aList.get(44)); + } + + @Test + public void testRemove() { + aList.add(1); + aList.add(2); + aList.add(3); + int u = (Integer) aList.remove(2); + assertEquals(3, u); + assertEquals(2, aList.size()); + + aList.add(1, 5); + u = (Integer) aList.remove(0); + assertEquals(1, u); + assertEquals(5, aList.get(0)); + assertEquals(2, aList.get(1)); + assertEquals(2, aList.size()); + + aList.remove(0); + aList.remove(0); + assertEquals(0, aList.size()); + + } + + @Test + public void testSize() { + for (int i = 0; i < 10; i++) + aList.add(i * 2); + assertEquals(10, aList.size()); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testException() { + expectedEx.expect(Exception.class); + aList.remove(1); + aList.add(3); + aList.add(2, 5); + expectedEx.expect(Exception.class); + } + + @Test + + public void testIterator() { + Iterator it = aList.iterator(); + assertEquals(false, it.hasNext()); + + aList.add(1); + aList.add(2); + aList.add(3); + + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(2, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + aList.remove(1); + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + expectedEx.expect(Exception.class); + it.next(); + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java index dbfd8aae19..e8cc041978 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java @@ -7,161 +7,136 @@ import java.util.Arrays; import java.util.NoSuchElementException; -public class MyArrayList implements List -{ - private int size = 0; //数组元素个数 - - private Object[] elementData = new Object[10]; //初始化数组大小为10 - - //将元素添加到数组尾部 - public void add(Object o) - { //需要判断数组空间是否够用 - ensureCapacity(size + 1); - elementData[size++] = o; - } - //在指定位置添加元素 - public void add(int index, Object o) - { - //判断下标记是否越界 - if (index > size || index < 0) - throw new IndexOutOfBoundsException( - "Index: " + index + ", Size: " + size); - ensureCapacity(size + 1); - //判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移 - if(elementData[index] == null) - { - elementData[index] = o; - } - else - { - for(int i=elementData.length-1; i>index; i--) - { - elementData[i] = elementData[i-1]; - } - elementData[index] = o; - } - size++; - - /* - //判断索引位置是否正确 - if (index > size || index < 0) - throw new IndexOutOfBoundsException( - "Index: " + index + ", Size: " + size); - //扩容检测 - ensureCapacity(size+1); - /* - * 对源数组进行复制处理(位移),从index + 1到size-index。 - * 主要目的就是空出index位置供数据插入, - * 即向右移动当前位于该位置的元素以及所有后续元素。 - - System.arraycopy(elementData, index, elementData, index + 1, - size - index); - //在指定位置赋值 - elementData[index] = 0; - size++; - - */ - } - - public Object get(int index) - { - //若index超出size应该抛出异常 - if(index >= size) - throw new IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); - return elementData[index]; - - } - - public Object remove(int index) - { //涉及到元素移位 - Object oldValue = elementData[index]; - for(int i=index; i oldCapacity) - { - //Object oldData[] = elementData; //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存 - int newCapacity = (oldCapacity * 3)/2 + 1; //增加50%+1 - if (newCapacity < minCapacity) - newCapacity = minCapacity; - // minCapacity is usually close to size, so this is a win: - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - - //返回数组的大小 - public int size() - { - return size; - } - - public Iterator iterator() - { - return new MyArrayListIterator(); +public class MyArrayList implements List { + private int size = 0; // 数组元素个数 + + private Object[] elementData = new Object[10]; // 初始化数组大小为10 + + // 将元素添加到数组尾部 + public void add(Object o) { // 需要判断数组空间是否够用 + ensureCapacity(size + 1); + elementData[size++] = o; + } + + // 在指定位置添加元素 + public void add(int index, Object o) { + // 判断下标记是否越界 + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + ensureCapacity(size + 1); + // 判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移 + if (elementData[index] == null) { + elementData[index] = o; + } else { + for (int i = elementData.length - 1; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + elementData[index] = o; } - - private class MyArrayListIterator implements Iterator - { - private int cursor = 0; //记录索引位置 - public boolean hasNext() - { - return cursor != size; - } - public Object next() - { - try { - Object next = get(cursor); - cursor++; - return next; - - } catch (IndexOutOfBoundsException e) - { - throw new NoSuchElementException(); - } - - } + size++; + + /* + * //判断索引位置是否正确 if (index > size || index < 0) throw new + * IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); + * //扩容检测 ensureCapacity(size+1); /* 对源数组进行复制处理(位移),从index + + * 1到size-index。 主要目的就是空出index位置供数据插入, 即向右移动当前位于该位置的元素以及所有后续元素。 + * + * System.arraycopy(elementData, index, elementData, index + 1, size - + * index); //在指定位置赋值 elementData[index] = 0; size++; + * + */ + } + + public Object get(int index) { + // 若index超出size应该抛出异常 + if (index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + return elementData[index]; + + } + + public Object remove(int index) { // 涉及到元素移位 + Object oldValue = elementData[index]; + for (int i = index; i < elementData.length - 1; i++) + elementData[i] = elementData[i + 1]; + elementData[--size] = null; + + return oldValue; + } + + // 判断是否需要给数组扩容 + public void ensureCapacity(int minCapacity) { + + int oldCapacity = elementData.length; + if (minCapacity > oldCapacity) { + // Object oldData[] = elementData; + // //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存 + int newCapacity = (oldCapacity * 3) / 2 + 1; // 增加50%+1 + if (newCapacity < minCapacity) + newCapacity = minCapacity; + // minCapacity is usually close to size, so this is a win: + elementData = Arrays.copyOf(elementData, newCapacity); } - - public static void main(String[] args) - { - MyArrayList myArrays = new MyArrayList(); - myArrays.add(3); - myArrays.add(0, 11); - myArrays.add(1, 2); - myArrays.add(3, 5); - myArrays.add(2, 1); - myArrays.add(7); - Print(myArrays); - - for(int i = 0; i < 19; i++) - myArrays.add(i, 55); - - System.out.println("获取指定位置元素: " + myArrays.get(2)); - System.out.println("删除指定位置元素: " + myArrays.remove(1)); - System.out.println("当前元素个数:" + myArrays.size()); - - Print(myArrays); - + } + + // 返回数组的大小 + public int size() { + return size; + } + + public Iterator iterator() { + return new MyArrayListIterator(); + } + + private class MyArrayListIterator implements Iterator { + private int cursor = 0; // 记录索引位置 + + public boolean hasNext() { + return cursor != size; } - public static void Print(MyArrayList myArrays) - { - Iterator it = myArrays.iterator(); - System.out.println("对链表中的元素进行打印:"); - while(it.hasNext()) - System.out.print(it.next() + " "); - System.out.println(""); - System.out.println("当前元素个数: " + myArrays.size()); + + public Object next() { + try { + Object next = get(cursor); + cursor++; + return next; + + } catch (IndexOutOfBoundsException e) { + throw new NoSuchElementException(); + } } - -} + } + + public static void main(String[] args) { + MyArrayList myArrays = new MyArrayList(); + myArrays.add(3); + myArrays.add(0, 11); + myArrays.add(1, 2); + myArrays.add(3, 5); + myArrays.add(2, 1); + myArrays.add(7); + Print(myArrays); + for (int i = 0; i < 19; i++) + myArrays.add(i, 55); + + System.out.println("获取指定位置元素: " + myArrays.get(2)); + System.out.println("删除指定位置元素: " + myArrays.remove(1)); + System.out.println("当前元素个数:" + myArrays.size()); + + Print(myArrays); + + } + + public static void Print(MyArrayList myArrays) { + Iterator it = myArrays.iterator(); + System.out.println("对链表中的元素进行打印:"); + while (it.hasNext()) + System.out.print(it.next() + " "); + System.out.println(""); + System.out.println("当前元素个数: " + myArrays.size()); + + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java index 9a668faaf0..e1c3478907 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java @@ -5,549 +5,409 @@ package com.github.HarryHook.coding2017.basic; -public class MyLinkedList implements List -{ - private Node head = null; //头指针 - private int size = 0; - private static class Node - { - Object data; - Node next; +public class MyLinkedList implements List { + private Node head = null; // 头指针 + private int size = 0; + + private static class Node { + Object data; + Node next; + } + + public void add(Object o) { + addLast(o); + } + + // 在指定位置添加元素 + public void add(int index, Object o) { + + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } - public void add(Object o) - { - addLast(o); + + // 存在插入头结点的情况 + if (index == 0) { + addFirst(o); + } else { // 即 index != 0 的情况 + // p保存待插入节点的前一节点,x指向要插入的节点 + Node x = head; + Node p = null; + int i = 0; + while (i < index) { + p = x; + x = x.next; + i++; + } + Node n = new Node(); + p.next = n; + n.next = x; + n.data = o; + size++; } - //在指定位置添加元素 - public void add(int index , Object o) - { - - if (index > size || index < 0) - { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - - //存在插入头结点的情况 - if(index == 0) - { - addFirst(o); - } - else - { //即 index != 0 的情况 - // p保存待插入节点的前一节点,x指向要插入的节点 - Node x = head; - Node p = null; - int i = 0; - while(i < index) - { - p = x; - x = x.next; - i++; - } - Node n = new Node(); - p.next = n; - n.next = x; - n.data = o; - size++; - } - + + } + + // 返回指定位置元素 + public Object get(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } - //返回指定位置元素 - public Object get(int index) - { - if(index >= size) - { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - Node x = head; - int i = 0; - while(i < index && x != null) - { - x = x.next; - i++; - } - return x.data; + Node x = head; + int i = 0; + while (i < index && x != null) { + x = x.next; + i++; } - - //移除指定位置节点 - public Object remove(int index) - { - if (index > size || index < 0) - { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - //先判断是否是头节点 - if( index == 0) - { - return removeFirst(); - } - else - { - Node x = head; - Node pre = null; - int i = 0; - while(i < index) - { - pre = x; - x = x.next; - i++; - } - Object Data = pre.next.data; - pre.next = x.next; - x = null; - size--; - return Data; - } + return x.data; + } + // 移除指定位置节点 + public Object remove(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } - //头部添加节点 - public void addFirst(Object o) - { - Node n = new Node(); - n.next = head; - head = n; - n.data = o; - size++; + // 先判断是否是头节点 + if (index == 0) { + return removeFirst(); + } else { + Node x = head; + Node pre = null; + int i = 0; + while (i < index) { + pre = x; + x = x.next; + i++; + } + Object Data = pre.next.data; + pre.next = x.next; + x = null; + size--; + return Data; } - //尾部添加节点 - public void addLast(Object o) - { - if (head == null) - { - head = new Node(); - head.data = o; - } - else - { - Node x = head; - while(x.next != null) - { - x = x.next; - } - Node n = new Node(); - x.next = n; - n.next = null; - n.data = o; - } - size++; + + } + + // 头部添加节点 + public void addFirst(Object o) { + Node n = new Node(); + n.next = head; + head = n; + n.data = o; + size++; + } + + // 尾部添加节点 + public void addLast(Object o) { + if (head == null) { + head = new Node(); + head.data = o; + } else { + Node x = head; + while (x.next != null) { + x = x.next; + } + Node n = new Node(); + x.next = n; + n.next = null; + n.data = o; } - //移除第一个节点 - public Object removeFirst() - { - Node n = head; - Object Data = n.data; - head = head.next; - n = null; - size--; - return Data; + size++; + } + + // 移除第一个节点 + public Object removeFirst() { + Node n = head; + Object Data = n.data; + head = head.next; + n = null; + size--; + return Data; + } + + // 移除最后一个节点 + public Object removeLast() { + Node x = head; + Node p = null; + if (x.next == null) { + return removeFirst(); + } else { + while (x.next != null) { + p = x; + x = x.next; + } + Object Data = x.data; + p.next = null; + x = null; // 删除最后一个节点 + size--; + return Data; } - - //移除最后一个节点 - public Object removeLast() - { - Node x = head; - Node p = null; - if(x.next == null) - { - return removeFirst(); - } - else - { - while(x.next != null) - { - p = x; - x = x.next; - } - Object Data = x.data; - p.next = null; - x = null; //删除最后一个节点 - size--; - return Data; - } + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new MyLinkedListIterator(); + } + + private class MyLinkedListIterator implements Iterator { + private int cursor = 0; // 记录索引位置 + + public boolean hasNext() { + return cursor != size; } - public int size() - { - return size; + + public Object next() { + Object next = get(cursor); + cursor++; + return next; } - public Iterator iterator() - { - return new MyLinkedListIterator(); + } + + /** + * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + if (head == null) { + return; } - private class MyLinkedListIterator implements Iterator - { - private int cursor = 0; //记录索引位置 - public boolean hasNext() - { - return cursor != size; - } - public Object next() - { - Object next = get(cursor); - cursor ++; - return next; - } + Node p1, p2, p3; + p1 = head; + p2 = p1.next; + while (p2 != null) { + p3 = p2.next; + p2.next = p1; + p1 = p2; + p2 = p3; } - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse() - { - if(head == null) - { - return ; - } - Node p1, p2, p3; - p1 = head; - p2 = p1.next; - while(p2 != null) - { - p3 = p2.next; - p2.next = p1; - p1 = p2; - p2 = p3; - } - head.next = null; - head = p1; + head.next = null; + head = p1; + } + + /** + * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 + * ,删除以后的值为7,8,10 + * + */ + public void removeFirstHalf() { + if (size == 0) { + return; } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf() + Node p = head; + Node q = null; + int i = size / 2; + int j = 0; + while (j < i) { + j++; + q = p; + p = p.next; + } + head = p; + q.next = null; + size = size - i; + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + Node p = head; + Node q = null; + int index = 0; + int j = 0; + + while (index < i) { + q = p; + p = p.next; + index++; + } + + while (p != null && j < length) { + p = p.next; + j++; + } + if (i == 0) // 从头开始移除元素 { - if(size == 0) - { - return ; - } - Node p = head; - Node q = null; - int i = size / 2; - int j = 0; - while(j < i) - { - j++; - q = p; - p = p.next; - } + if (p == null) // 元素全被删光 + { + head = null; + size = 0; + } else // 从头删length个元素 + { head = p; + size = size - length; + } + } else // 从中间开始移除元素 + { + if (p == null) { q.next = null; - size = size - i; + size = size - j; + } else { + q.next = p; + size = size - length; + } + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = + * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + public int[] getElements(MyLinkedList list) { + if (list == null) { + return new int[0]; } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length) - { - Node p = head; - Node q = null; - int index = 0; - int j = 0; - - while(index < i) - { - q = p; - p = p.next; - index ++; - } + int i = 0; + int[] array = new int[list.size()]; + while (i < list.size()) { + array[i] = (int) this.get((int) list.get(i)); + i++; + } + return array; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 从当前链表中中删除在list中出现的元素 + * + * @param list + */ + + public void subtract(MyLinkedList list) { + int i = 0; + if (list == null) { + return; + } + while (i < list.size()) { + for (int index = 0; index < this.size(); index++) { + Node p = head; // 当前节点 + Node q = null; // 前驱节点 + while (list.get(i) != p.data && p.next != null) { + q = p; + p = p.next; + } + if (p.data == list.get(i)) { // 删除找到的节点 - while(p != null && j < length) - { - p = p.next; - j++; - } - if(i==0) //从头开始移除元素 - { - if(p == null) //元素全被删光 - { - head = null; - size = 0; - } - else //从头删length个元素 - { - head = p; - size = size - length; - } - } - else //从中间开始移除元素 - { - if(p == null) - { - q.next = null; - size = size - j ; - } - else - { - q.next = p; - size = size - length; - } - } - + if (p == head) { + head = head.next; + } else { + q.next = p.next; + } + size--; + } + } + + i++; } - - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(MyLinkedList list) - { - if(list == null) - { - return new int[0]; - } - int i = 0 ; - int[] array = new int[list.size()]; - while(i < list.size()) - { - array[i] = (int) this.get((int)list.get(i)); - i++; - } - return array; + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() { + if (head == null) { + return; } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在list中出现的元素 + Node p = head; + Node q = head; // 前驱 + while (p.next != null) { + p = p.next; - * @param list - */ - - public void subtract(MyLinkedList list) - { - int i = 0; - if(list == null) - { - return ; - } - while(i < list.size()) - { - for(int index = 0; index < this.size(); index++) - { - Node p = head; //当前节点 - Node q = null; //前驱节点 - while(list.get(i) != p.data && p.next != null) - { - q = p; - p = p.next; - } - if(p.data == list.get(i)) //删除找到的节点 - { - if(p == head) - head = head.next; - else - { - q.next = p.next; - } - size--; - } - } - - i++; - } + while (p.data == q.data) { + size--; + if (p.next == null) { + q.next = null; + break; + } + q.next = p.next; + p = p.next; + if (p == null) + break; + } + q = q.next; } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues() - { - if(head == null) - { - return ; - } - Node p = head; - Node q = head; //前驱 - while(p.next != null) - { - p = p.next; - - while(p.data == q.data) - { - size--; - if(p.next == null) - { - q.next = null; - break; - } - q.next = p.next; - p = p.next; - if(p == null) - break; - } - q = q.next; - } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * + * @param min + * @param max + */ + public void removeRange(int min, int max) { + + Node p = head; // 当前节点 + Node q = head; // 前驱节点 + while (p.next != null && ((int) p.data <= min || (int) p.data >= max)) { // 未找到继续遍历 + q = p; + p = p.next; } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max) - { - - Node p = head; //当前节点 - Node q = head; //前驱节点 - while(p.next != null && ((int)p.data <= min || (int)p.data >= max)) //未找到继续遍历 - { - q = p; - p = p.next; - } - while((int)p.data > min && (int)p.data < max) //删除找到的节点 - { - p = p.next; - size--; - - if(size == 0) //删完所有元素 - break ; - } - if(q == head) //头结点被删掉 - { - head = p; - } - else - { - q.next = p; - } - + while ((int) p.data > min && (int) p.data < max) { // 删除找到的节点 + p = p.next; + size--; + + if (size == 0) // 删完所有元素 + break; } + if (q == head) { // 头结点被删掉 - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public MyLinkedList intersection(MyLinkedList list) - { - if(list == null || this == null) - { - return null; - } - Node p1 = list.head; - Node p2 = this.head; - MyLinkedList newList = new MyLinkedList(); - - while(p1 != null && p2 != null) - { - while(((int) p1.data < (int) p2.data) && p1.next != null) - { - p1 = p1.next; - } - while(((int) p1.data > (int) p2.data) && p2.next != null) - { - p2 = p2.next; - } - if(p1.data == p2.data) - { - newList.add(p1.data); - p1 = p1.next; - p2 = p2.next; - } - - if(p1 == null && p2 == null) //若最后两个元素相等 - { - break; - } - } - return newList; + head = p; + } else { + q.next = p; } - - - public static void main(String[] args) - { - MyLinkedList myList = new MyLinkedList(); - myList.add(1); - myList.add(1); - myList.add(3); - myList.add(4); - myList.add(5); - myList.add(5); - myList.add(7); - myList.add(8); - myList.add(8); - myList.add(9); - Print(myList); - /* - MyLinkedList list = new MyLinkedList(); - list.add(0); - list.add(3); - list.add(5); - list.add(6); - list.add(9); - list.add(19); - //Print(list); - //myList.removeDuplicateValues(); - //myList.subtract(list); - */ - - myList.removeRange(-11, 10); - Print(myList); - /* - MyLinkedList list1 = myList.intersection(list); - System.out.println("打印交集:"); - Print(list1); - /* reverse() - myList.reverse(); - Print(myList); - */ - - //System.out.println("从第二个元素开始,移除三个元素"); - //myList.remove(1, 1); - //Print(myList); - - // getElements() - MyLinkedList list = new MyLinkedList(); - - int[] array = myList.getElements(list); - System.out.println("输出:"+array[0]); - for(int i=0; i (int) p2.data) && p2.next != null) { + p2 = p2.next; + } + if (p1.data == p2.data) { + newList.add(p1.data); + p1 = p1.next; + p2 = p2.next; + } + + if (p1 == null && p2 == null) { // 若最后两个元素相等 + break; + } } + return newList; + } + + public static void Print(MyLinkedList myList) { + Iterator it = myList.iterator(); + System.out.println("对链表中的元素进行打印:"); + while (it.hasNext()) + System.out.print(it.next() + " "); + System.out.println(""); + System.out.println("当前元素个数: " + myList.size()); + System.out.println(""); + } - } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java index 9b713eaea9..3d6cd9df0a 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java @@ -3,52 +3,38 @@ * 实现简单的队列 */ package com.github.HarryHook.coding2017.basic; + import java.util.*; -public class MyQueue -{ - private MyArrayList elementData = new MyArrayList(); - private int size = 0; - //入队 - public void enQueue(Object o) - { - elementData.add(o); - size++; - } - //出队 - public Object deQueue() - { - if(isEmpty()) - throw new NoSuchElementException(); - Object Data = elementData.remove(0); - size--; - return Data; - } - //判断队列是否为空 - public boolean isEmpty() - { - return size() == 0; - } - //队列中元素个数 - public int size() - { - return size; - } - public static void main(String[] args) - { - MyQueue mq = new MyQueue(); - mq.enQueue(1); - mq.enQueue(2); - mq.enQueue(3); - mq.enQueue(4); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - //System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - //System.out.println("队列中元素个数: " + mq.size()); + +public class MyQueue { + private MyArrayList elementData = new MyArrayList(); + private int size = 0; + + // 入队 + public void enQueue(Object o) { + elementData.add(o); + size++; + } + + // 出队 + public Object deQueue() { + if (isEmpty()) { + throw new NoSuchElementException(); } + Object Data = elementData.remove(0); + size--; + return Data; + } + + // 判断队列是否为空 + public boolean isEmpty() { + return size() == 0; + } + + // 队列中元素个数 + public int size() { + return size; + } + + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java index c7f87c04e6..2702c66a07 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java @@ -6,54 +6,39 @@ import java.util.*; -public class MyStack -{ - private MyArrayList elementData = new MyArrayList(); - private int size = 0; - - //入栈操作 - public void push(Object o) - { - elementData.add(o); - size++; - } - //出栈操作 - public Object pop() - { - Object obj = peek(); - elementData.remove(size() - 1); - size--; - return obj; - } - //获取当前栈顶元素,不用出栈 - public Object peek() - { - if(isEmpty()) - throw new EmptyStackException(); - return elementData.get(size() - 1); - } - //判断栈是否为空 - public boolean isEmpty() - { - return size() == 0; - } - //返回栈内元素个数 - public int size(){ - return size; - } - - public static void main(String[] args) - { - MyStack ms = new MyStack(); - - ms.push(1); - ms.push(2); - ms.push(13); - System.out.println("当前栈顶元素是: " + ms.peek()); - System.out.println("出栈元素是: " + ms.pop()); - System.out.println("出栈元素是: " + ms.pop()); - ms.push(12); - System.out.println("出栈元素是: " + ms.pop()); - System.out.println("当前栈顶元素是: " + ms.peek()); +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + private int size = 0; + + // 入栈操作 + public void push(Object o) { + elementData.add(o); + size++; + } + + // 出栈操作 + public Object pop() { + Object obj = peek(); + elementData.remove(size() - 1); + size--; + return obj; + } + + // 获取当前栈顶元素,不用出栈 + public Object peek() { + if (isEmpty()) { + throw new EmptyStackException(); } + return elementData.get(size() - 1); + } + + // 判断栈是否为空 + public boolean isEmpty() { + return size() == 0; + } + + // 返回栈内元素个数 + public int size() { + return size; + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java index 340f79d240..0b89de7c0a 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java @@ -6,28 +6,28 @@ import com.github.HarryHook.coding2017.basic.MyQueue; public class QueueTest { - private MyQueue queue; - - @Before - public void setUpQueue() { - queue = new MyQueue(); - } - - @Test - public void testQueueFunctional() { - assertEquals(true, queue.isEmpty()); - queue.enQueue(4); - queue.enQueue(2); - assertEquals(2, queue.size()); - assertEquals(false, queue.isEmpty()); - - int i = (Integer)queue.deQueue(); - assertEquals(4, i); - i = (Integer)queue.deQueue(); - assertEquals(2, i); - - assertEquals(0, queue.size()); - assertEquals(true, queue.isEmpty()); - } + private MyQueue queue; + + @Before + public void setUpQueue() { + queue = new MyQueue(); + } + + @Test + public void testQueueFunctional() { + assertEquals(true, queue.isEmpty()); + queue.enQueue(4); + queue.enQueue(2); + assertEquals(2, queue.size()); + assertEquals(false, queue.isEmpty()); + + int i = (Integer) queue.deQueue(); + assertEquals(4, i); + i = (Integer) queue.deQueue(); + assertEquals(2, i); + + assertEquals(0, queue.size()); + assertEquals(true, queue.isEmpty()); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java index 26160faef6..89f56d8006 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java @@ -9,32 +9,32 @@ public class StackTest { - private MyStack stack; - - @Before - public void setUpStack() { - stack = new MyStack(); - } - - @Test - public void testStackFunctional() { - assertEquals(true, stack.isEmpty()); - stack.push(4); - stack.push(2); - assertEquals(2, stack.size()); - assertEquals(false, stack.isEmpty()); - - int i = (Integer)stack.pop(); - assertEquals(2, i); - - i = (Integer)stack.peek(); - assertEquals(4, i); - - i = (Integer)stack.pop(); - assertEquals(4, i); - - assertEquals(0, stack.size()); - assertEquals(true, stack.isEmpty()); - } + private MyStack stack; + + @Before + public void setUpStack() { + stack = new MyStack(); + } + + @Test + public void testStackFunctional() { + assertEquals(true, stack.isEmpty()); + stack.push(4); + stack.push(2); + assertEquals(2, stack.size()); + assertEquals(false, stack.isEmpty()); + + int i = (Integer) stack.pop(); + assertEquals(2, i); + + i = (Integer) stack.peek(); + assertEquals(4, i); + + i = (Integer) stack.pop(); + assertEquals(4, i); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java index c7b05e46c0..122c71eae6 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java @@ -6,46 +6,46 @@ public class DownloadThread extends Thread { - Connection conn; - int startPos; - int endPos; - boolean downloadFinsh = false; - public DownloadThread( Connection conn, int startPos, int endPos) { - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - - public void run() { - - RandomAccessFile outFile = null; + Connection conn; + int startPos; + int endPos; + boolean downloadFinsh = false; + + public DownloadThread(Connection conn, int startPos, int endPos) { + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + + public void run() { + + RandomAccessFile outFile = null; + try { + + byte[] buffer = conn.read(startPos, endPos); + // 在本地创建一个与服务器大小一致的可随机写入文件 + outFile = new RandomAccessFile("bd_logo.png", "rwd"); + outFile.seek(startPos); + outFile.write(buffer); + FileDownloader fileloader = new FileDownloader(""); + fileloader.getListener(); + + } catch (Exception e) { + + e.printStackTrace(); + + } finally { + try { - - byte[] buffer = conn.read(startPos, endPos); - // 在本地创建一个与服务器大小一致的可随机写入文件 - outFile = new RandomAccessFile("bd_logo.png", "rwd"); - outFile.seek(startPos); - outFile.write(buffer); - FileDownloader fileloader = new FileDownloader(""); - fileloader.getListener(); - - }catch(Exception e) { - + outFile.close(); + + } catch (Exception e) { + e.printStackTrace(); - - }finally { - - try { - outFile.close(); - - } catch(Exception e) { - - e.printStackTrace(); - } - - } + } - + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java index ac5b6606d4..1bb64c1050 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java @@ -5,87 +5,86 @@ import com.github.HarryHook.coding2017.download.api.ConnectionManager; import com.github.HarryHook.coding2017.download.api.DownloadListener; - public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String _url) { - - this.url = _url; - - } - - public void execute() { - - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - - Connection conn = null; - - try { - - conn = cm.open(this.url); - int fileLength = conn.getContentLength(); - int threadCount = 3; - int blockSize = fileLength / 1024 / threadCount; - - for (int threadId=1; threadId<=threadCount; threadId++) { - - int startPos = (threadId-1) * blockSize; - int endPos = threadId * blockSize - 1; - if (threadId == threadCount) { - endPos = fileLength; - } - - new DownloadThread(conn, startPos, endPos).start(); + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + public FileDownloader(String _url) { + + this.url = _url; + + } + + public void execute() { + + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, + // endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, + // 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + + Connection conn = null; + + try { + + conn = cm.open(this.url); + int fileLength = conn.getContentLength(); + int threadCount = 3; + int blockSize = fileLength / 1024 / threadCount; + + for (int threadId = 1; threadId <= threadCount; threadId++) { + + int startPos = (threadId - 1) * blockSize; + int endPos = threadId * blockSize - 1; + if (threadId == threadCount) { + endPos = fileLength; } - - } catch(ConnectionException e) { - - e.printStackTrace(); - - }finally { - - if(conn != null) { - + + new DownloadThread(conn, startPos, endPos).start(); + } + + } catch (ConnectionException e) { + + e.printStackTrace(); + + } finally { + + if (conn != null) { + conn.close(); - - } + } - - } - - public void setListener(DownloadListener listener) { - - this.listener = listener; } - public void setConnectionManager(ConnectionManager ucm) { - - this.cm = ucm; - } - - public DownloadListener getListener() { - - return this.listener; - } - - + } + + public void setListener(DownloadListener listener) { + + this.listener = listener; + } + + public void setConnectionManager(ConnectionManager ucm) { + + this.cm = ucm; + } + + public DownloadListener getListener() { + + return this.listener; + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java index 91ddbfa6f8..adf7dad676 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java @@ -9,52 +9,52 @@ import com.github.HarryHook.coding2017.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { - - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - - } - @After - public void tearDown() throws Exception { - - } + boolean downloadFinished = false; + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testDownload() { + + String url = "https://www.baidu.com/img/bd_logo.png"; - @Test - public void testDownload() { - - String url = "https://www.baidu.com/img/bd_logo.png"; - - FileDownloader downloader = new FileDownloader(url); - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - - downloadFinished = true; - } - }); - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - - try { - System.out.println("还没有下载完成,休眠两秒"); - //休眠2秒 - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } + FileDownloader downloader = new FileDownloader(url); + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + + downloadFinished = true; } - System.out.println("下载完成!"); - + }); + + downloader.execute(); + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + + try { + System.out.println("还没有下载完成,休眠两秒"); + // 休眠2秒 + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } } + System.out.println("下载完成!"); + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java index 92b2fe1050..7f6a13f3e0 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java @@ -3,22 +3,26 @@ import java.io.IOException; public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * + * @param startPos + * 开始位置, 从0开始 + * @param endPos + * 结束位置 + * @return + */ + public byte[] read(int startPos, int endPos) throws IOException; + + /** + * 得到数据内容的长度 + * + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java index 57368f7b35..be85791a50 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java @@ -1,10 +1,11 @@ package com.github.HarryHook.coding2017.download.api; public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; + /** + * 给定一个url , 打开一个连接 + * + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java index 2932ec1ddb..84a55784f7 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java @@ -9,57 +9,57 @@ import com.github.HarryHook.coding2017.download.api.Connection; public class ConnectionImpl implements Connection { - - private String url; - - public ConnectionImpl(String url) { - - this.url = url; - } - @Override - public byte[] read(int startPos, int endPos) throws IOException { - - URL url = new URL(this.url); - HttpURLConnection conn = (HttpURLConnection)url.openConnection(); - //conn.setRequestMethod("GET"); - // 设置500毫秒为超时值 - // conn.setReadTimeout(5000); - conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); - BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - - byte[] buffer = new byte[1024]; - int size = 0; - while ((size = in.read(buffer)) != -1) { - out.write(buffer, 0, size); - } - byte[] b = out.toByteArray(); - out.close(); - in.close(); - - return b; - } + private String url; + + public ConnectionImpl(String url) { + + this.url = url; + } - @Override - public int getContentLength() { - - try { - URL url1 = new URL(url); - HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); - return conn.getContentLength(); - - }catch(Exception e) { - - e.printStackTrace(); - } - - return -1; + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + URL url = new URL(this.url); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + // conn.setRequestMethod("GET"); + // 设置500毫秒为超时值 + // conn.setReadTimeout(5000); + conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); + + byte[] buffer = new byte[1024]; + int size = 0; + while ((size = in.read(buffer)) != -1) { + out.write(buffer, 0, size); } + byte[] b = out.toByteArray(); + out.close(); + in.close(); + + return b; + } - @Override - public void close() { - + @Override + public int getContentLength() { + + try { + URL url1 = new URL(url); + HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); + return conn.getContentLength(); + + } catch (Exception e) { + + e.printStackTrace(); } + return -1; + } + + @Override + public void close() { + + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java index 2ce38b1f79..ee40d1e943 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java @@ -6,9 +6,9 @@ public class ConnectionManagerImpl implements ConnectionManager { - @Override - public Connection open(String url) throws ConnectionException { - return new ConnectionImpl(url); - } + @Override + public Connection open(String url) throws ConnectionException { + return new ConnectionImpl(url); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java index 5c52c492a3..c0d992bda8 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java @@ -1,6 +1,5 @@ package com.github.HarryHook.coding2017.jvm.loader; - import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -8,67 +7,60 @@ import java.io.InputStream; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; +public class ClassFileLoader { + private List clzPaths = new ArrayList(); -public class ClassFileLoader { + public byte[] readBinaryCode(String className) { - private List clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - - - String fileName = clzPaths.get(0) + File.separatorChar + - className.replace('.', File.separatorChar) + ".class"; - - InputStream in = null; - try { - in = new FileInputStream(fileName); - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - - byte[] buffer = new byte[1024]; - int length = 0; - while((length = in.read(buffer)) != -1) { - out.write(buffer, 0, length); - } - return out.toByteArray(); - } catch(IOException e) { - e.printStackTrace(); - } finally { - if(in != null) { - try{ - in.close(); - }catch(IOException e) { - e.printStackTrace(); - } + String fileName = clzPaths.get(0) + File.separatorChar + + className.replace('.', File.separatorChar) + ".class"; + + InputStream in = null; + try { + in = new FileInputStream(fileName); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); + + byte[] buffer = new byte[1024]; + int length = 0; + while ((length = in.read(buffer)) != -1) { + out.write(buffer, 0, length); + } + return out.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); } } - return null; - - } - - - public void addClassPath(String path) { - - this.clzPaths.add(path); } - - - - public String getClassPath(){ - - StringBuilder buffer = new StringBuilder(); - - for(int i=0; i capacity) { + // 若缓存已满,移除最后一个节点 + if (currentSize > capacity) { last = last.prev; last.next = null; } - }else { - moveToFirst(iteratorNode); + } else { + moveToFirst(iteratorNode); } } - } + } } + // 将节点/缓存页添加到fitrst public void addToFirst(int pageNum) { Node node = new Node(); @@ -88,7 +88,8 @@ public void addToFirst(int pageNum) { first = node; currentSize++; } - //将last节点移动到first + + // 将last节点移动到first public void moveLastToFirst() { last.next = first; first.prev = last; @@ -97,7 +98,8 @@ public void moveLastToFirst() { last.next = null; first.prev = null; } - //将最近使用的已有缓存页移动到first + + // 将最近使用的已有缓存页移动到first public void moveToFirst(Node iteratorNode) { iteratorNode.prev.next = iteratorNode.next; iteratorNode.next.prev = iteratorNode.prev; @@ -106,19 +108,18 @@ public void moveToFirst(Node iteratorNode) { first.prev = iteratorNode; first = iteratorNode; } - + public String toString() { StringBuilder buffer = new StringBuilder(); Node node = first; - while(node != null) { - buffer.append(node.pageNum); - node = node.next; - if(node != null) { + while (node != null) { + buffer.append(node.pageNum); + node = node.next; + if (node != null) { buffer.append(","); } } return buffer.toString(); } - - + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java index 004b99eac4..f25cb5d5e9 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java @@ -1,35 +1,34 @@ package com.github.HarryHook.coding2017.linklist; -import org.junit.Assert; +import org.junit.Assert; import org.junit.Test; - public class LRUPageFrameTest { - - @Test - public void testAccess() { - LRUPageFrame frame = new LRUPageFrame(3); - frame.access(7); - Assert.assertEquals("7", frame.toString()); - frame.access(0); - Assert.assertEquals("0,7", frame.toString()); - frame.access(7); - Assert.assertEquals("7,0", frame.toString()); - frame.access(1); - Assert.assertEquals("1,7,0", frame.toString()); - frame.access(2); - Assert.assertEquals("2,1,7", 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()); - } + + @Test + public void testAccess() { + LRUPageFrame frame = new LRUPageFrame(3); + frame.access(7); + Assert.assertEquals("7", frame.toString()); + frame.access(0); + Assert.assertEquals("0,7", frame.toString()); + frame.access(7); + Assert.assertEquals("7,0", frame.toString()); + frame.access(1); + Assert.assertEquals("1,7,0", frame.toString()); + frame.access(2); + Assert.assertEquals("2,1,7", 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()); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java index c44457c58f..f2db5581f5 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java @@ -10,88 +10,93 @@ import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; - public class Configuration { - Map actions = new HashMap<>(); - - public Configuration(String fileName) { - String packageName = this.getClass().getPackage().getName(); - - packageName = packageName.replace('.', '/'); - - InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); - - parseXML(is); - - try { - is.close(); - }catch(IOException e) { - throw new ConfigurationException(e); - } + Map actions = new HashMap<>(); + + public Configuration(String fileName) { + String packageName = this.getClass().getPackage().getName(); + + packageName = packageName.replace('.', '/'); + + InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); + + parseXML(is); + + try { + is.close(); + } catch (IOException e) { + throw new ConfigurationException(e); } - private void parseXML(InputStream is) { - SAXBuilder builder = new SAXBuilder(); - - try { - Document doc = builder.build(is); - - Element root = doc.getRootElement(); - - for(Element actionElement : root.getChildren("action")) { - String actionName = actionElement.getAttributeValue("name"); - String clzName = actionElement.getAttributeValue("class"); - - ActionConfig ac = new ActionConfig(actionName, clzName); - - for(Element resultElement : actionElement.getChildren("result")) { - String resultName = resultElement.getAttributeValue("name"); - String viewName = resultElement.getText().trim(); - - ac.addViewResult(resultName, viewName); - } - this.actions.put(actionName, ac); - } - }catch(JDOMException e) { - throw new ConfigurationException(e); - - }catch(IOException e) { - throw new ConfigurationException(e); - + } + + private void parseXML(InputStream is) { + SAXBuilder builder = new SAXBuilder(); + + try { + Document doc = builder.build(is); + + Element root = doc.getRootElement(); + + for (Element actionElement : root.getChildren("action")) { + String actionName = actionElement.getAttributeValue("name"); + String clzName = actionElement.getAttributeValue("class"); + + ActionConfig ac = new ActionConfig(actionName, clzName); + + for (Element resultElement : actionElement.getChildren("result")) { + String resultName = resultElement.getAttributeValue("name"); + String viewName = resultElement.getText().trim(); + + ac.addViewResult(resultName, viewName); } + this.actions.put(actionName, ac); + } + } catch (JDOMException e) { + throw new ConfigurationException(e); + + } catch (IOException e) { + throw new ConfigurationException(e); + } + } - public String getClassName(String action) { - ActionConfig ac = this.actions.get(action); - if(ac == null) { - return null; - } - return ac.getClassName(); + public String getClassName(String action) { + ActionConfig ac = this.actions.get(action); + if (ac == null) { + return null; } - public String getResultView(String action, String resultName) { - ActionConfig ac = this.actions.get(action); - if(ac == null) { - return null; - } - return ac.getViewName(resultName); + return ac.getClassName(); + } + + public String getResultView(String action, String resultName) { + ActionConfig ac = this.actions.get(action); + if (ac == null) { + return null; } - private static class ActionConfig { - String name; - String clzName; - Map viewResult = new HashMap<>(); - - public ActionConfig(String actionName, String clzName) { - this.clzName = clzName; - this.name = actionName; - } - public String getClassName() { - return clzName; - } - public void addViewResult(String name, String viewName) { - viewResult.put(name, viewName); - } - public String getViewName(String resultName) { - return viewResult.get(resultName); - } - + return ac.getViewName(resultName); + } + + private static class ActionConfig { + String name; + String clzName; + Map viewResult = new HashMap<>(); + + public ActionConfig(String actionName, String clzName) { + this.clzName = clzName; + this.name = actionName; + } + + public String getClassName() { + return clzName; + } + + public void addViewResult(String name, String viewName) { + viewResult.put(name, viewName); + } + + public String getViewName(String resultName) { + return viewResult.get(resultName); } + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java index df763a0ab4..83ab2dbe85 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java @@ -1,18 +1,19 @@ package com.github.HarryHook.coding2017.litestruts; - import java.io.IOException; import org.jdom2.JDOMException; public class ConfigurationException extends RuntimeException { - public ConfigurationException(String msg) { - super(msg); - } - public ConfigurationException(JDOMException e) { - super(e); - } - public ConfigurationException(IOException e) { - super(e); - } + public ConfigurationException(String msg) { + super(msg); + } + + public ConfigurationException(JDOMException e) { + super(e); + } + + public ConfigurationException(IOException e) { + super(e); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java index 9e25a7974e..114104c87e 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java @@ -6,38 +6,39 @@ import org.junit.Test; public class ConfigurationTest { - - Configuration cfg = new Configuration("struts.xml"); - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testGetClassName() { - String clzName = cfg.getClassName("login"); - Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LoginAction", clzName); - - clzName = cfg.getClassName("logout"); - Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LogoutAction", clzName); - } - - @Test - public void testGetResultView() { - String jsp = cfg.getResultView("login", "success"); - Assert.assertEquals("/jsp/homepage.jsp", jsp); - - jsp = cfg.getResultView("login", "fail"); - Assert.assertEquals("/jsp/showLogin.jsp", jsp); - - jsp = cfg.getResultView("logout", "success"); - Assert.assertEquals("/jsp/welcome.jsp", jsp); - - jsp = cfg.getResultView("logout", "error"); - Assert.assertEquals("/jsp/error.jsp", jsp); - } + + Configuration cfg = new Configuration("struts.xml"); + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testGetClassName() { + String clzName = cfg.getClassName("login"); + Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LoginAction", clzName); + + clzName = cfg.getClassName("logout"); + Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LogoutAction", clzName); + } + + @Test + public void testGetResultView() { + String jsp = cfg.getResultView("login", "success"); + Assert.assertEquals("/jsp/homepage.jsp", jsp); + + jsp = cfg.getResultView("login", "fail"); + Assert.assertEquals("/jsp/showLogin.jsp", jsp); + + jsp = cfg.getResultView("logout", "success"); + Assert.assertEquals("/jsp/welcome.jsp", jsp); + + jsp = cfg.getResultView("logout", "error"); + Assert.assertEquals("/jsp/error.jsp", jsp); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java index d42f7b0cd6..120d72f1e0 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java @@ -2,41 +2,42 @@ /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * * @author liuxin * */ public class LoginAction { - - private String name ; + + private String name; private String password; private String message; - public String getName() { - return name; + public String getName() { + return name; } public String getPassword() { - return password; + return password; } public String execute() { - if("test".equals(name) && "1234".equals(password)) { - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; } - + public void setName(String name) { - this.name = name; + this.name = name; } - + public void setPassword(String password) { - this.password = password; + this.password = password; } - + public String getMessage() { - return this.message; + return this.message; } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java index 1efcb21574..850f644a2b 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java @@ -7,76 +7,74 @@ import java.util.List; import java.util.Map; +public class ReflectionUtil { -public class ReflectionUtil -{ + public static List getSetterMethods(Class clz) { - public static List getSetterMethods(Class clz) { - - return getMethods(clz, "set"); - } + return getMethods(clz, "set"); + } + + public static void setParameters(Object o, Map params) { + + List methods = getSetterMethods(o.getClass()); + + for (String name : params.keySet()) { + + String methodName = "set" + name; + + for (Method m : methods) { - public static void setParameters(Object o, Map params) { - - List methods = getSetterMethods(o.getClass()); - - for(String name : params.keySet()) { - - String methodName = "set" + name; - - for(Method m : methods) { - - if(m.getName().equalsIgnoreCase(methodName)) { - try { - m.invoke(o, params.get(name)); - - }catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } + if (m.getName().equalsIgnoreCase(methodName)) { + try { + m.invoke(o, params.get(name)); + + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); } } } - } - public static List getGetterMethods(Class clz) { - - return getMethods(clz, "get"); - } + } - public static List getMethods(Class clz, String startWithName) { - - List methods = new ArrayList<>(); - for(Method m : clz.getDeclaredMethods()) { + public static List getGetterMethods(Class clz) { - if(m.getName().startsWith(startWithName)) { - methods.add(m); - } + return getMethods(clz, "get"); + } + + public static List getMethods(Class clz, String startWithName) { + + List methods = new ArrayList<>(); + for (Method m : clz.getDeclaredMethods()) { + + if (m.getName().startsWith(startWithName)) { + methods.add(m); } - - return methods; } - public static Map getParameterMap(Object o) { - - Map params = new HashMap<>(); - - List methods = getGetterMethods(o.getClass()); - - for(Method m : methods) { - - String methodName = m.getName(); - String name = methodName.replaceFirst("get", "").toLowerCase(); - - try { - Object value = m.invoke(o); - params.put(name, value); - - }catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } + return methods; + } + + public static Map getParameterMap(Object o) { + + Map params = new HashMap<>(); + + List methods = getGetterMethods(o.getClass()); + + for (Method m : methods) { + + String methodName = m.getName(); + String name = methodName.replaceFirst("get", "").toLowerCase(); + + try { + Object value = m.invoke(o); + params.put(name, value); + + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); } - - return params; } + + return params; + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java index ff4c30f05d..043b2d3050 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java @@ -14,100 +14,99 @@ import org.junit.Before; import org.junit.Test; - public class ReflectionUtilTest { - @Before - public void setUp() throws Exception { - } + @Before + public void setUp() throws Exception { + } - @After - public void tearDown() throws Exception { - } + @After + public void tearDown() throws Exception { + } - @Test - public void testGetSetterMethod() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - List methods = ReflectionUtil.getSetterMethods(clz); - - Assert.assertEquals(2, methods.size()); - - List expectedNames = new ArrayList<>(); - expectedNames.add("setName"); - expectedNames.add("setPassword"); - - Set acctualNames = new HashSet<>(); - for(Method m : methods) { - - acctualNames.add(m.getName()); - } - - Assert.assertTrue(acctualNames.containsAll(expectedNames)); - } - - @Test - public void testSetParameters() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - Object o = clz.newInstance(); - - Map params = new HashMap(); - params.put("name", "test"); - params.put("password", "1234"); - - ReflectionUtil.setParameters(o, params); - - Field f = clz.getDeclaredField("name"); - - f.setAccessible(true); - Assert.assertEquals("test", f.get(o)); - - f = clz.getDeclaredField("password"); - f.setAccessible(true); - Assert.assertEquals("1234", f.get(o)); - } - - @Test - public void testGetGetterMethod() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - List methods = ReflectionUtil.getGetterMethods(clz); - - Assert.assertEquals(3, methods.size()); - - List expectedNames = new ArrayList<>(); - expectedNames.add("getMessage"); - expectedNames.add("getName"); - expectedNames.add("getPassword"); - - Set acctualNames = new HashSet<>(); - for(Method m : methods) { - - acctualNames.add(m.getName()); - } - - Assert.assertTrue(acctualNames.containsAll(expectedNames)); - + @Test + public void testGetSetterMethod() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getSetterMethods(clz); + + Assert.assertEquals(2, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("setName"); + expectedNames.add("setPassword"); + + Set acctualNames = new HashSet<>(); + for (Method m : methods) { + + acctualNames.add(m.getName()); } - - @Test - public void testGetParameters() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - LoginAction action = (LoginAction)clz.newInstance(); - action.setName("test"); - action.setPassword("1234"); - - Map params = ReflectionUtil.getParameterMap(action); - Assert.assertEquals(3, params.size()); - Assert.assertEquals(null, params.get("message")); - Assert.assertEquals("test", params.get("name")); - Assert.assertEquals("1234", params.get("password")); + + Assert.assertTrue(acctualNames.containsAll(expectedNames)); + } + + @Test + public void testSetParameters() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + Object o = clz.newInstance(); + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + ReflectionUtil.setParameters(o, params); + + Field f = clz.getDeclaredField("name"); + + f.setAccessible(true); + Assert.assertEquals("test", f.get(o)); + + f = clz.getDeclaredField("password"); + f.setAccessible(true); + Assert.assertEquals("1234", f.get(o)); + } + + @Test + public void testGetGetterMethod() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getGetterMethods(clz); + + Assert.assertEquals(3, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("getMessage"); + expectedNames.add("getName"); + expectedNames.add("getPassword"); + + Set acctualNames = new HashSet<>(); + for (Method m : methods) { + + acctualNames.add(m.getName()); } + Assert.assertTrue(acctualNames.containsAll(expectedNames)); + + } + + @Test + public void testGetParameters() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + LoginAction action = (LoginAction) clz.newInstance(); + action.setName("test"); + action.setPassword("1234"); + + Map params = ReflectionUtil.getParameterMap(action); + Assert.assertEquals(3, params.size()); + Assert.assertEquals(null, params.get("message")); + Assert.assertEquals("test", params.get("name")); + Assert.assertEquals("1234", params.get("password")); + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java index 270e26a57d..4a55b6c2d1 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java @@ -4,45 +4,43 @@ import java.util.Map; public class Struts { - + private final static Configuration cfg = new Configuration("struts.xml"); - - public static View runAction(String actionName, Map parameters) { - + + public static View runAction(String actionName, Map parameters) { + String clzName = cfg.getClassName(actionName); - - if(clzName == null) { - + + if (clzName == null) { + return null; - } - - + } + try { - - Class clz = Class.forName(clzName); + + Class clz = Class.forName(clzName); Object action = clz.newInstance(); - + ReflectionUtil.setParameters(action, parameters); - + Method m = clz.getDeclaredMethod("execute"); - String resultName = (String)m.invoke(action); + String resultName = (String) m.invoke(action); - Map params = ReflectionUtil.getParameterMap(action); String resultView = cfg.getResultView(actionName, resultName); - + View view = new View(); view.setParameters(params); view.setJsp(resultView); return view; - - }catch(Exception e) { - + + } catch (Exception e) { + e.printStackTrace(); } - + return null; - + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java index 23dd0a0845..26b12d610c 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java @@ -8,43 +8,43 @@ public class StrutsTest { - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view; + + view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + + } + + @Test + public void testLoginActionFailed() { + + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + try { + View view; - + view = Struts.runAction(actionName, params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - + } catch (Exception e) { + e.printStackTrace(); } - @Test - public void testLoginActionFailed() { - - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - try { - - View view; - - view = Struts.runAction(actionName,params); - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - - }catch(Exception e) { - e.printStackTrace(); - } - - } + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java index 3e35a849c3..258b376ae2 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java @@ -2,30 +2,31 @@ import java.util.Map; -public class View -{ - private String jsp; - private Map parameters; - - //对应action获取Jsp - public String getJsp() { - - return jsp; - } - public View setJsp(String jsp) { - - this.jsp = jsp; - return this; - } - - //execute()获取对应参数 - public Map getParameters() { - - return parameters; - } - public View setParameters(Map parameters) { - - this.parameters = parameters; - return this; - } +public class View { + private String jsp; + private Map parameters; + + // 对应action获取Jsp + public String getJsp() { + + return jsp; + } + + public View setJsp(String jsp) { + + this.jsp = jsp; + return this; + } + + // execute()获取对应参数 + public Map getParameters() { + + return parameters; + } + + public View setParameters(Map parameters) { + + this.parameters = parameters; + return this; + } } From 69112861bb888df8982fbec1f382f2e699f9de1b Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Wed, 5 Apr 2017 20:54:07 +0800 Subject: [PATCH 057/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E8=A1=A5?= =?UTF-8?q?=E4=BA=A4=E7=AC=AC3=E6=AC=A1=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=9C=E4=B8=9A!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/Iterator.java | 6 + .../src/main/LinkedList.java | 256 ++++++++++++++++++ .../src/main/List.java | 9 + .../src/test/LinkedListTest.java | 251 +++++++++++++++++ .../src/utils/ListUtils.java | 11 + 5 files changed, 533 insertions(+) create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/List.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/test/LinkedListTest.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/utils/ListUtils.java diff --git a/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java new file mode 100644 index 0000000000..4a052a8646 --- /dev/null +++ b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java @@ -0,0 +1,6 @@ +package main; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java new file mode 100644 index 0000000000..7242de720f --- /dev/null +++ b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java @@ -0,0 +1,256 @@ +package main; + +import java.util.Arrays; + +import utils.ListUtils; + +public class LinkedList implements List{ + private Node head; + private int size; + + private static class Node { + private Object data; + private Node next; + } + + @Override + public void add(Object o) { + add(size, o); + } + + @Override + public void add(int index, Object o) { + ListUtils.CheckIndexInRange(0, size, index); + if (0==size) { + head = new Node(); + head.data = o; + size++; + return; + } + if (0 == index) { + Node node = new Node(); + node.data = o; + node.next = head; + head = node; + size++; + return; + } + if (index == size) { + Node node = head; + while (null != node.next) { + node = node.next; + } + Node addNode = new Node(); + addNode.data = o; + node.next = addNode; + size++; + return; + } + Node node = head; + for (int i = 0; i < index - 1; i++) { + node = node.next; + } + Node addNode = new Node(); + addNode.data = o; + addNode.next = node.next; + node.next = addNode; + size++; + } + + @Override + public Object remove(int index) { + if(size == 0){ + return null; + } + ListUtils.CheckIndexInRange(0, size - 1, index); + Node node = head; + if (0 == index) { + head = head.next; + size--; + return node.data; + } + for (int i = 0; i < index - 1; i++) { + node = node.next; + } + Node removeNode = node.next; + node.next = removeNode.next; + size--; + return removeNode.data; + } + + @Override + public Object get(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + @Override + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + private int cursor; + + @Override + public boolean hasNext() { + if (size > 0) { + return cursor < size; + } else { + return false; + } + + } + + @Override + public Object next() { + Object tag = get(cursor); + cursor++; + return tag; + } + }; + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + if(this.size == 0){ + return; + } + LinkedList list = new LinkedList(); + for(int i =this.size-1;i>=0;i--){ + list.add(this.get(i)); + } + this.head = list.head; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf(){ + int end = size/2; + for(int i=0;isize){ + return; + } + for(int j =0;j101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + if(null==list||list.size==0){ + return new int[0]; + } + int[] result = new int[list.size]; + int counter = 0; + for(int i=0;imax){ + return; + } + for(int i=0;imin&&(int)get(i)= start && index <= end) { + return true; + } + throw new IndexOutOfBoundsException(); + } + +} From 3c4242e27344a9c210acba5bda77a203b1fb628f Mon Sep 17 00:00:00 2001 From: chaoswang Date: Wed, 5 Apr 2017 21:37:59 +0800 Subject: [PATCH 058/552] =?UTF-8?q?=E5=9B=9B=E6=AC=A1=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=8D=9A=E5=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group06/263050006/article.txt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/group06/263050006/article.txt b/group06/263050006/article.txt index 2eaa5b792f..f6a5e2ef49 100644 --- a/group06/263050006/article.txt +++ b/group06/263050006/article.txt @@ -1,2 +1,12 @@ -CPU、内存、硬盘、指令以及他们之间的关系 -https://zhuanlan.zhihu.com/p/25442061 \ No newline at end of file +第一次作业博客: +CPU、内存、硬盘、指令以及他们之间的关系 +https://zhuanlan.zhihu.com/p/25442061 +第二次作业博客: +为什么32位处理器只能配4G内存 +https://zhuanlan.zhihu.com/p/26174778 +第三次作业博客: +报文和帧 +https://zhuanlan.zhihu.com/p/26175504 +第四次作业博客: +依赖注入通俗解释 +https://zhuanlan.zhihu.com/p/26176550 From be60c00efa845b7e2cfc62a2371fa489b3a651fe Mon Sep 17 00:00:00 2001 From: thomas_young Date: Wed, 5 Apr 2017 21:44:22 +0800 Subject: [PATCH 059/552] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group02/812350401/.gitignore | 1 + .../src/main/resources/downloads/test.png | Bin 100384 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 group02/812350401/src/main/resources/downloads/test.png diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 86b837863d..8cd204f114 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -3,3 +3,4 @@ target/ src/main/java/train/ !src/main/resources/**/*.class !src/main/resources/**/*.xml +src/main/resources/**/*.png diff --git a/group02/812350401/src/main/resources/downloads/test.png b/group02/812350401/src/main/resources/downloads/test.png deleted file mode 100644 index 40c982a45cc70d81071ffcee052e71bf6a5f52cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100384 zcmb5VXHXN~6D}OOARR&t9U)X{(S+iU8X)u%I!KceiUg#Cf}m)GK@*^ zw+gTTaI$l7ak@6%&(^IU^?}tppMilh>42 zQc+b?SCf>}($NCzoB^wW|7V1Si;Iir6psiGj|f;wObYz}EdK@oLZ{f?u>sjw6alP4 zENnt7|Aqh{0DzV4WVbAU|6kZSSlKvP09>a|w3dPZRu(okRt{DUcEHJGJJ3Eip2ly|6eNr z04yhqvY%)ah5kPU8-R`FfAfFBBE))PoXyNdL{TpY{ci=pd!k?!ViN-V2SA0%|IVb| z3{Ibq&xDiZOZ@P_zP>LS)DpUEc+%ysb{F(Xh4htA+E#_bWCA~}-vTTRslf!Pda-8hR5I6Pc) zeWcdX)L?>Q#1P$3;-~?JBR)P}bbY z2l!gg5fG9nbGN!hj;pGJ$Y4#dgfG1x*+Bb>07y@O z(1ZeZfem#0SK~iWwDKn`t*fs~I24D#j{zU^?D&*965gc3M!z-azAE**NrDSEk08if z^0)~(ZU!F5cC+RTWBE}I;*M@C3e~gc(d5W{O8`mvEAwe2j84eD;6v!>0Yp_bn_gto zW!qwQAWQcGWz-$w43kO5pzQ)$(RR+ADB1KmX?LGB(dc-Y+8WK(cqp@b9Y@!Gd~Y6U zJ09U>ev0WAR}VA@7`elrM>P65Z3B~U-Pl@^T2bCvFygo#twgUW53pZVknr1^1{ zto0{5pI51yDnwhp9=AD6WHf+|t~)*Lz6pgWeBJsaQD5ZuFkg&#&@M6JgG-XJB}+Rb zj?BB*vb?=T+;-~@YZWf&i)5&5Z_00CJQIv~Lm;rwJ&O;KJ~Xh^X#`_?D!$P~*SX`- zN{=E&sB{yka3^lGd(UD*4Ml#)xCcC`46SfPgk}9?F)&Uwf9t{B3(6dBY zzc2b0gq;#NwC2{ad%5p**gpVGC)*Y_c@4#RZbar?cj$=HH!`>1Z%<0LniA&Nwx{P= ziN%jPW^cNJW@Kc^{GqS&y2_LR0)+7o?`e0~$l8RGIPcza%Qo$32_05zeip;EUT)J* z$?8QH>;Ia0p=-KQ&^;mjBm}7Hoh1tT#-WcbQzOKS&i)wJ!_yQl)Uqh{07pv*e;IxI zH{iE@TJb|y!GS-$=z8H8+idcSA>>L+8n10xlu{9jsl;IE&vV_H*p53HA2AE3qz zh1Ht{4EAzzESwb7<5Gy<#I=d}^Jx;7lsBp(yp`SThF-pgL>t}z^~+PQ`_RHp))%*c zw~8s-a=(-Xh(&2uI7PJebOV?NT$_a$u^rb59NK+E5o|@ zoB~={N@G7aSzi@B3*#!KG1bTeB2*V#!TxXeOxl$v5ajK;RjhZ zicJ`KG~MRS158ki;J|1Nm!1FX`X>vpKL)#}1|+H8p1|O6Pe-G_1UFwJAd*X>wp2bE z=b1`Icy57ZIQTRrqGv8EW-r_*PK0gein&V|)b3hHLPb|>E0kp;Ga2Ug``e{ni?P1- z9O8U~(LBTz!8J@j*z^wtu47C0`Jg)i@PZpM_$EJs&Ce)wi%LIBz$ixS@Vl7xpuGqCurl^W_<4Gicu{A4EjIf?t6 z=;xGr=ZgvawqI+WWv^iFAK-;5Wsg=$Lf%)a7Jb^I`)gJaczDchn;P_|0>HWEa4R>d zt(hX$rzn(_Cr}3!Z8Wcm#tT2wcfLgV{SuA;bobEJ?uKNGK@P}WVhg=+6NllqvJJ7T zDsz$FCWo>Aa<@wuYY@B<3!6k;jRQ@eRiNBy|Ky=0lK4S`(S3mNVxvK%`(V!^%Lb2*!GCS}VUug~~oOid7_(~mH(TU{ICIHYYrO-p}ee1Qh9TiGv zL4eD?H+kF_Zj6tN31a~vKdaXsSSe|%4ds>OZqm4}=bel!7o3;WSvEm9>wH zyzX%}Jzb<97I8TYcXU8FQfd55sb+V&*HOn)?6EA0?DRs2>~T*O7#)Gn0jvbvrHgE&7K+n8PY zCP%v{{IdtB(5w#~j<6+Onglm8Vse;>9=2w_4{oNbPQd{lqZDKnq*wGPHy_00tsQ*i9%UTtWTdzuPo1#T(xpPR+FMR;1 ziB27?`+SL0x7HWx%)(pQ&;Ce6zJGip>Zw6o0zzM)cNOT?vONIwr;62gejSMj23vZb z>*m6+4?Jhmy2LgwJ4RZ)ln*2NpIS0gxoei#u8T88R9~rCNi1x(*|xj?e7A=9SY5|4 z(s<>1tA%-gt@J;Dfl_3vc*`!Z#mw0Cwzlnmz|ptCQ9k_0=Ztdsz| zP{k)lTYcO3nDUuF5`ifhY*A02U)6ULI-tu#?Z39VjBzzwINmMUn-y?r31O3LG}!g2 z4gKWn1T`=!nP#ke$TUW(e6$jMlD4&2cKv^eHb2d>D{7@Z76h@aAbIcbdSte?7yfeJ z?49b9wc{g}r8`d;ZXsFC*SHvJMi&Y=o~mmLa+!)#GlpM+ko=L_X~C!IrZt_Kka%gYY9YnMmVyos1m1Z>+L%D5D^mle)k8 zy(X~WwxsCf@_+LRsF4xY$1~wHAvxA3F9AfcH3hRl(p1t+$rK_e6Z|2{=$guDsR`nW zjHzs&MuoVd*$86FD!%&nd_fWbYV6X$F;4R;ar5?MEt*RCu*?Ny$?)8T+}8qkyMLq9 zKXuN-Tb!#s_s6|I#`L@eye{?A=?fgVju+33eBGMlk1gLprL|G{3P+ovQEA zm?JrV`yjwR?W7Cg;ItU1;n9E6q?bPPb%Wp@-Q-;=(-Dz1f|;Gux}Y=QcJaA_1>U#5 zfT9<9ZxqO0FoRSIu{vUK4i5hu>0 zfnkJ5)V;|9*A_FHQ}!(|t~OabM|W;e!n)mMQbqeW-A@mL1^lSJVZ-cAN z&ilQsX_FnETYP`O-J9>TJtYQ>k<;|5V|H^Hn%`YkOi&?>FK*CU24#9lW`(TH;j8~q zl)WV$Wxm<7YW4gIHxrllqfU#{QGY^t@2V&ENOLP^LWoDO4&tyZLANy@&pC80K4fdw zF23jjIIw_)LnojdYkuPL{ALsZ&Tfn?wR8TnIvX%L9O&!W6@o9CF9lPyFGK0v%0v8o zJd<9(809}&KJw{xgbh^31ZfUz{%G*%T+2Ta72$(3~MXR#(=oD!3~K1XQWDGxzX#TtZ%%PNms zScjW1oUv&bb)#rzkt{?x7~7S5Om{TOY!H364&pCm!WBArF^>)a=m~FSFV+gb(DR%R zBnq^)cq6v_pA~!Svff)A&(h!yX#poInWRuvOIEIz2h>57moQ{3jAA^8&n?EgJse-{ z<2E23w~VQ_*IbImFm7+(<27q(Vu(D2026EsgwtJ;cF=USfQC z>$%AEjQoy)@<@qygGFo%V|cVe_J}xR_C>OO+Qru870RCIANX%i^6cM%3kFZ&U{T_I%3mTC}=N2Je;NW9k(vBtfoc?g`|7Yw+BSv;zhJPuKRBU z75c1Y_n>_x(;qd^D=L5zTncmFn-J%leZ-sZ8Ul7|WRhf7)W%SD@Hw#kZ2GUFx@~Il zUz4heroRo1p+)>Cul`MEn3DXo$Xd8E-bHIr(*dcxg%$YKm40|?*up%X9O+$w_A#)yP$<3#h<37pDGo?14Ep!PAom$n%LRv+{7@NeF@3BV!A{Nd;-{%xZU3(jK0e!$- z7dkpvvr{ndoE5jJ1U&u+5KKXEUtVE?e|KjLoFng>r4&A2`0B%Zp1&rpX%#&Rz(0M_ z3jGnCRA|y`JI$7T=z>|sjh4k(`~1Xzhq*mZa<(liNoEpQ#h6`h*zB9H)T^H zNU5-|JmGnwt*0J8cJs_&;Nb`Phnag-KZ(KX2`Ym7{z9IA)^Cn}u z{F!-G$3-Tq{67FmGYrP8o-H<9h=#lR^CoZKNR5wh{UJNQaTPVx_h4y0b_XJist@_a zpsBzpuj2Ww9AG1&q3F=G8z?JM*lTPVn@|AS@gG3ICEeNT0wfYa-o&WOnSop$)h%HrV#F`3J1ad~A9vOt&Sc~g7DbE?txdXs zP9+`l1)Sv$1BW&56eOYNC7*Ws*>?>$&NEYgEJ%5^t*oEj|hK_1vy9oTn@X}=y| zi?NdE=bWtE7%kmP(p{pl6z<54N=P)YDU2H>`2@#v z8+ApaZWE@R$*3RqPlOI^jETedNtne%Rp&PK*8e*@-6*oU-J zGZk!WESL66Tq4I^#Srin+ceTcHDW>8aBB5dp)v!*t}M$LajPcIT69=Cqw2nuv`oEw zV1hYVw+Pl!kIdf2k4I)t@E%ZP%Tz5taDt_mKR=m?byig=*%c0d4>g=(4^TC1 z`8NH>D_1pt(my=plN1}naZ1{#N4$$Zt$E3m1E%sotJ{8)z{vHrX6+5dULB8Bg5N2X z6y?QdD6H6QN`tlv@zbd+c@SMxwy6uI?`)`$H+#Xn^=$lwqw-HSIR`U-FRK06Xucr) zTBYeEV4E5R-NN};vA0@aS|pq3w4$3|6AG39H}^3Y44iB7EGD4E^TwTkOg|~h9MDH~^O#qRMbcc(KBoJwOtFoZ4JIIL!5@ z(f1D|R$IyAJVd9mY~jt`SDJN zUhj{h8r<5sDh0p2se;M38QnhxKgq0Q`_xZ-qLVJLplC{XsQFSx!DuGWIeWx?nqUycR z)MdTk3@bV=I&MC@p*Z-W)hOkI?sUjXpYc_>y|RxN0z{Po5VGRp^F`Q#L1& zy<~3egNpUiOwspAquF0~;-z_?ENV!XwwpmvJHVh@*!h~ZBjVRBLrqV z4dh1+K*=MLQ;>*4W|P^iiA2S*+Hy@oA~4uA0XN%(VCD*g+iI-s8At@968~N}5RLyP zqh3+MO4esKTbL-3ftI8Mv#~4s?zB-=%mg{Q^3`Cg^ROTO*tXaE;f_hf(v~#bhUA;2 zs*2C?+n0&rBiL$lSe?2Wsk-^?+-$^ZR8=LD2$>dg?`sR2u(20N+wDa_+8`A)if?uP75N~C?vusV^C zKv*Qn7LPQW`qTane>I5TMR~SDN_#3m7;>y!I|LQ+@$ynT4~lrV^6jGut*+qLE`KBD zW2h&%pcGQ(2UY3G@-(yD@4~!F@%qJ%45eV=vdLfgY3H+w?W&6Haj?y86d34tg{;bx zrBz=pS9g-~-FSkor=t%Bd ztvoROd)hcV+e5KV@auN1J9%KjNUWMa2k728a6}T(hsw^o`5E%EMm{ND206Q~gw+aZ zD<>2T-ziL5MZ7Ch{&GieeX7M5$FP4AMHfssEq^G-3-f24(0#_>Sezo3m`%5bE zb2+<^_0UTcyd5sp@mFwWgOPYq(F$hudJZ!g8MX6xQQUp(hd$88fo?V!CGrOKj0z4O+(zYRF6I7|Q zF;hNwQukrj+k*u1jYVQ8t1p9(`d^#Qm9R+6tLWf)<3hl+9nRL| ztk(wsXHAFG@n3Zd@v>jvD?IKf7#t!t#tu?+d|2E*IfLA9SJ$q&C-^5|Zpkx>CsF)a zI9$LwM|u(*C2?n17a7e#`LnUeuZwf7ewBT{*3sJQW_hUgNH zVM1}5N7j`N=hgPPV!~cg>^T18k(`_C^OdS$ zTUAJ`m2K|4u@J{^y0@8(sL<oTrTk-d|_j+pW5+{%*qug1k->C|V zEwQYu|IMF0ynj!5lUZZX-|DH_?56dMeto$5aq4*);=vj+>~yN07bnW^?1J~Jn^36B zzN@&Ya6*oIz4>dwcQaS{Q{{Pz9}@auY%BdHnPQ8HgMaq+D=JvBY~gPhh3JbK2YTl> zC108U$VX%ud7d3pec$hG?T1W{Ad73F15QP~T*@S5xMw_>v4U>b-mU^8LJE^n>PGP% zx323lj%(*l_kC`$nsS-B=^o^xEzhw~{C_SKd4HEPP{u~|cu5KEB4oyDwy!yHw%}4~ zUPVFFLU4!fGRu2(k+!P&|KzI}^5pKtMtT=$k>b!tC%+n~zSLoaP4KyyFM_m-?H*;l zc^5((B4E{Wo#S-v172A}$;y6#?%C@58`}k)g~rU=ogKoUE<|woyBrCSdloS<7;c2= zD`iE`KFPr&J>M3^N97ZbYp)kWfnv8GT~~LmJ+S4%I4`ukjMs4ey1a#Hec>{!ZvSQV zoGwNoCS_1`V<4}(LlH8{%5?d}|aF+2FOx($FY zl&(PkgLvKby`%Ti284`^>cAvl5EU{v5Uum1LG)v@*hFu)rs|=QjFJLQ=w3iZKEnlruS!_O7s2YZQ$=B&WAE+1N^SDG z-^pdMMpR0pE!(6iT^5CXHiyrJPWRHiDmB{+ex>7oesFj=YaC~@-EZ3u*U{Q#TObgwc8lixD^a|CfWi>)V>Jl?Uo@fA2z)|q^7(tYj@ z?9M1x+VIL`%tvdOd1`Z5`RW$0TB%1dhdl3$?Nl1Cjd{+#hn0@f(!#Qs#8HbFL{xs0 z3xAicx`&Ax*nzc%N3>)xG*iviouY#&PdmkRC|%NC&tB>teV>KrA`_ng9xW zjzpvQ4wLxMT4I~ZmqRz(dV$|TV~@{Z&FCrTrcb&`cDxA;cUdO~D_xc81XpipP1(aI zzYhGvjL^-TO!g@8DLcT^9QokQ;;7|KJlT(*CRWtWENa_X?=I&1 zWu_|QL^JJ#^QHQy^5_`-p1oh?r~?jX&p+$a@#gWoYx}TBvuU1lw~p=DN#UQF-gz!n z?(}qm{qZeZ74sCikNug<)63c|K*=NvxgZ99XEk1Kbv^gSTjlE!5wy&YHfJ89y~ieA zF{1b$7TfGF36U$7MdtOMgKX7Jc0T`g-J7`VG9Ds&XLw=eUPJ&yOF>!eL+w4E+(JNN zjWN7HyJ}3TykyC3kuG<>GVP(d5=N1!FGm_=PoLfaZpRFdL6m`m0er3^f}G7-*qeE_ zIyAQz&q^P9jxifUa1&@k$-dthNiAdkQtA%rqNQe2DFnx1N z)`r>qB_0l_k6YQeLY9sbm;khnj+kmNMlHE~j&0kN2*;GQ`JO4d*@zsZ{JGAtC(abc z*&`3zK!(R{@!)cK#S7Ckbu_nB7?A~ndh z5A9rrz}~GL3guBZ1ufF2pvW8iv?E6>8L4o+s zCpYIx%FzKy&889-8w#;ktR4#!nKyf!dj|IyE@U0cNqxJIFJ7!Kw^Z}>-_v@z^ubA@ zx&D5HLIJYBS}mYNs!m(LY{cNN%C~JYhhOyrnos-53sQEDbMjG;uHN(I4|RW@?%sJq z*TG#U@Z>s>G!}s(@lH@CRk@AwRR;nrh-<%@{D#w3wOVEZao!u~&+l^6?3*ZmU95J~ z+pc)acwQa1>+rO&1`)xmOd~jJD}cpJ*pG9t_3{**D?wWxH+Br3nt-1!yNk@;)iC7z z4A*yAA3UJDzqEEN+t?(Nw6v-mJhlk@^WG&~z=h?l0P<~zF6KSr$Psf8Rrl3Hx{yPR$K=B*<~E(^K)?a zdJ;YwSmP=BkBRM@LDLv9tHkIM&ocwD^W1(#j%plTonIXDiD)b>dm%;vvm=yt??P>A z^U*`&)jGHA^+%6e@T>lW{X!G;M8a-Vd~xLaJr+)Y@!TPIIpp+oA~7i*UL34YCNs9@ zW9MCDU2c-@5kx9JTfU0Eu8vk9RF1f+_aOooC0z28YM9+R9S^tiRrtj2N)!rNw)yJ- zvbZHp-s|ibTU2bDDFmdpRWSoJ4n?dvChtFa#~*;U6n0AsYb<0j1;!*d$wz(@vgJ_1W(qmCwVHjEa_^Zckp^Z08$<8f0)+?&Ik?eQ^fH4 z0ia~kaGZcBPgmHdv}441_A9OK_!Af>RSD-BEP9CiH0~jt9Qc)TMh0ye%brMi%}Eq^ zp^ASD)nB=dfdt|8z}BMGGsCPH1@V=ZF9Yvqt5X_{M$IB0}CAPA&VQI=jZSVvSgG#O{nj1li^q?wA zZOk`yu*Ew1)EG#Lxq(+d$A$$Xq~^h}n9?rRdl#nrA|(A{M-aCloh!?trq1FRLWXP) z`NbYq1Kjzc2y759t&CUvbf(}Gxn!YK_Y!mx?Gkw#bW}4M3gj$`Gh*cSc)YiGfu61X z5`z1C!pe!>Ccc+0ghV^vgn`^c{6{b$?8XVM?zj-p{DDkuvrvMc?rc@qiw)Pkd8jfz zPzg#=y>SdeF0K;N1e z1#=~`XbUfe8v@k0Ni*uKlY!wT!{ir(S>Peh!GW^3k;lKgs%s7#IqiR#1r^Qa9Z>=@ z|F+x(Iv45E6TMhbcHFA$-~Lw+khKWyG@=Xe|IH-Hs0!3lx}nDw2|;mv4i>o z4ZI%%%5;2n!!14etwQ+wu}FTwOnJ`>k7G?VCk&cCq(TNzJW<52Es=p4 zJfANoxW^8*{HU5Qm47x_fvrtBF+K2)fORQK6I1v9>L=)&1W1?LNyZ)l~_- ztfcsSCj%Y!^N1ZE8PT2%#y8=#>BglAn^BgDQ!m!7BtT)6!|~9j-w7<&`N8ilbM>Lz zBQ`O@Z!!6p!c7*52@Z6;cl!ee4cW4>Ej;IDGK0@6^p#&w@4h)N0Us0#m8e17m;_V9 zR@5z652k#Y2iRKF&7G|TG!m(o9^(@&ilNo(^9jE}Ta zxgo9Wx_2jW2cvFBb55-$_OSnUzkhvA4CK}uVd@;|-*Lx2W1pf+H@i}uKtTE;DYqNg zk16FF;mx)gGiPZmhU)YCSNbM6jCXftQMWWHU|Vi>=51V0^;;-sX{#~8lRZ}!bys-= zQ8#hs@exVd4BfGvFCHR8K2^!MF{sQoK(U;A|C8K7&kI zJqTHW$4E+XLwV25w?Dh}gX;%`fj#5b0Nl3R_30Sxxb!jQgaETNu=!^?Y4^$D?5)y9 zmsw(Ng{d4OjB;MnNey$b%s6mStzVEJtEec^t{9HrZyv3AyH+P3mUD>cgqt<3-n2NY zFMmDF6L<4N`n1qg&p*H(e8AHn)2l?D59blh`q*<0`A85(R3iXYWx!fPQtGzc6MWzi z#Yd5eX9j;zhlmZVSzLN7*0ou65R^|rw+oMXl_AcY$^nEF9W(DbU$=#spoDFwuThTV zU)ZYh7~%;NpldceJ&;CGgSRf%j}7!=dAzY2wWigNWHTwPCem;FBW-#)09`&i_q!U& z9k`K_f=^3G4UztU04_iGissSbQ~%Mg*iWYT@lfZ6xqz?DH&azNP8#9ddYR#D%(_7? zHjFG>eutfBqg%6kKn_)0;B7Ggk5Ufi*}?va@{O-W4*%(>jdCHh{s+O<(=-&AjxmV* zUkBc2jE`FDP%C~V14%4iMtd-=w?X-Us601mcXfYoQuGyLhJD_8PYsm)&?TD1ox0O! zwN8AZ!&(ax!3b?#I3C^FE)4}xJsbW;K#5#r>hG5VX|6GYjrzziM+a+yYdN>cMc}Jt zm76fK8jPa+x&`h2lnrtX3Uc>PSSfARO9&v}Xmx*JT@Dz*SxiKW#_7ThMxAI#11gp_ zQM&*TLFzI|X!)@bAHHqHhyJ*ObrRoT&HXM<*3e*Lr08HFXZNS>X%`Lk<65_>j-g5} zW8|B7NA+s7$G~ZbI&l>J$z}4nwc^jznwAPo@uRaKq=OQ~eFCeF);{#MDOKqOSsSF} zonUj;rzUk>-GmFemGC7kVz(o{SAXQ!H%H1#N5F?aNPQ><$)Ot09lBn8OAeT~lMm4K z-~)Uk*;fuT(39}V1b)cXby_cs$@YUoHd~xM;iT%DJD0F)C9_pwFd!GXTyupHR zZ{Xo~RMYp@Ye_I&TW_CI#o(IfH~bFqZYFQS6)SAxKcpHX&HYMn=2DC4CnTsW2Kp!Y z()fwYYA`&NBsmx_-Yj^T zjlaIQCS*9JR%w*XTYmLNO~AWWbCmWLK}y!#$W^%f{Z!iZms`gaiC>;&S$mEOlphj` z)Y8!OlcTX!MXkrit06-Djwn0{vvNGTa=n4Ibw2kY3!LiXhVRM z5d{34H5n9$G?|Hdca?v(?ol?#NBz;J$yhUUh&@Ce{FU@mg7pliUL`2(9#on?ZSfH{ z9_HI2GJN59sndFV$m=(93As15(y*O<)cUi5?PheL4c$F7gu&3(*114%=6v6^ng7e( zky&}`k4DJ>vg4yKgC86f-V>OX?Z4*n?N)uma!}2y z5y$s$?c~p=yYr1>8oP|YM7d258vXgnur1=<8VuobA0Lv8L_?fo--u0Nf#c zXY=x~M#`hcH|;jYu5ES^TPz>Ze!W%r!cxEc`PMY5n-E>x8%N#4(?|5GICxp>rf8XC+`^L?h#0PFxt@gg8F#rQf$68wbI=G*M~VKq`6_ik{-58-9Pnc%9NU;_lLvSdyU>5n_rlm9X8_3f zv3v%o2*9n1=d|8YBx#i3h1TYTUv13CE>Rf8Db(C_GNP+Es;02d>mWU8{TUh}3d9UBd+0)a?Lg1T66P#%_riw#c)@Ctw*Zz2s z3-7C(`+$nyTyz-id#gmI484Q}FtmnNJxjbVi=+%1_-3}#`=(H5<_he8_S|UuW3sF2 zVypOKtUGbzTPx1zd)1x~gEyUZ=l%AbS;&v*L|9X+^t3cf9%{a_Zns>#znS>0erByW z#W=aC{H`kVqPm&Hq?I8&3>1EW`AEIJvF%=*5)I_X8z}6cHg_tpI=l@+x;~$2GMT;@ z33<_&r#TWq1&MCVJjl~+4~DAJ+|;S%@}L~d0>D-05{y{!P1-MeOh&DF;M7a~RZ`gH z(313pS~T!J}_=cE#K#MjozT|3YbEYa20J`J2GWj%7d8 zb?LZ96L=lR=6UUn49`iGgHWvtOER_~{i@fj_3QGHWx4!Q3KD>1s@<+eW0@c4)F)5t zjF&n(8mjfH6H!E8hq$*Sba6jpc0F)QY!edkeExCJmx#uXUXAR*#l*dTfUfHi-K4Sc z@DCcUclb9$FYO`6q`rZir^kwQz_?-)3&k$UBt?qh;wALbfpc(H9H8b~=!R=miL_IF zTfZ(o0!xop`v*wucoOF23#ytw{1ZL7=&++#`7-PN_+AYl^JMw;D?JtJt7>;<_6}U0vb=-3;Vm9}`Zb{VW3W%Wgw#4i^yyE}D5S>nOcJ^Cd9{6m3KQkg>uvlLT1 zeSP=+rR{D7P4w)YE*eY@w19XwHVls%(3d@Wc3OLcmp!U!R2e^ZmIJQiphx!@q>aw=oSc2R49LIJT;fss;PY7NshKtIv`sNeo zrqda?$3?SWw%Vyn6%$ED8C58rI(C{qtuTU}q0}YGf~Jd02|`Jl6j0!HlUDXbVu)}$ zBWIW;deZ=LpX#B^)5n*%dBn&uetVT+w6@boJ##TlVx+{~##YUQ!!>@1`kV5FJ`oAy z0TE^vW^R^=JOUxXm3we+Z53Ce1bdzpzFDA*o|Sl1@Z>T8ILW8$uV;6wrl(6f+X(Xw zH0K~^Tcy!(iDMp{gq!VxEyS=jM2hnzuy{SI4)()#e{Y_|Ra>c67!>6dT`*I^eTXbC ztG8iyHO#tq6~ExMqFAll=(l(^C1J0+Tujm6{gj`Zf+UanMz0Q_an0z|A2yZVj8Lrs zX*Kr|fr0w?FECPt()@_e2wYzB)|T^^c$*X7ozg9R;L<2?(KSkHg)2~Acc2zn=hCT! z=eJ?tupL%CUOh@G58Vi3UAr2HkKC}W2MKtUFPo`nA{}1lfuz*3TfB1wbqmujswF`= z@7&w2;e}go1bS*n-#E|dFsNe-$@|;*zLmQRd|C~JTUummQ#`HhqE6kU``59UHrv=|>F7Fv^cOA5 zJ*=FCiE@}kz~BxWFlk-_DbaGnauV*8wx zp?JY`thM0#=Ck5|fD~baw@Rf&1J@{j*c9}1*+B~y{&Nd&?@bh@QR9Z<`4V=|Yix=5KnxmiDT8*=_v7`y0 zXqh~0ycvxBW~G8VA)4v)U#xKUh>(%@qjhfr0o&IvIste(IfDm;=$eEWDXX3npOY_$Qt^Lfw5a!? zF8@nJ7-)v4<<)KKo4Kuf5}ZV~zw@DiT>z=fm}(h|+}1gtgZ?IoOoGCn2xq>Rryo-Nm`XAfwCU6kn&yk;fN@szdE zZMWWID48nEDvMsJ4%}f@{`5jG)QYP%h}Ndxi8FGBvy|jG#fC^sswIHANH)Us{fW4d zDFiIe5TH@zRbq6tWwH;u2u7N8AtZU=FwLmwX3k~2y=`c zzd>H{tqbDGUJEYt$~a-j93iT)Iw+<|K}^x?bg^t|UFhEk*wjGdjmlrHJ@*(9%c~_T z6;q=SJcCbplz$dR@d=s+@#GI2v*9J0@+cdg>Wu4Rm&V4%sQ5sU{BTiW_+U1-hYcw6 zlJx)(f~kjb6|QFyz&~nvNy4x+cD4i@VKLQD%0yH6Z-5f%!!I|qU z>LJi68lU#Px7TL`yf;MbnJn&t-7RC?2Ux>xg8kh4Md4B7VH0$=L&yFZG2|=4PPV-~ ziz8yY;L#uZM@vnk%20Apq??z1-4Gc73n;bJ04l>-1tmR8RtK9a=^Gz3*9 za)ulN1E(5ky;tIBsyHt-ym{pb}LW&pjJdLNSL$OthG}Z|@eq)Wy zF+f=no~ORPf!pbk_#7tH(yjK)qY0F_E?a4qjsvcm2cey{CJA9YT^vu)Bn1{~m5V>47fvq$+>s`dr>JC!( z=@r7`s@UdGo-QJcN}GzY za*Z(PwBC2<1sIE-gHHgndrCatJVjP%9Ioi{(uKHk z-~5gFvgJ0cW-F!JbZ~Kjf@Mt9D){p-G$8a2*v264zoIAcVoGyKNW1jpW&dbJp^BsFJ%rU`V zq z9@zhjkx@eQ{J81faKaS2QSe;JG2qPO7Z`VJ!TL|4t&DF%rmy)^g13<=Y?GBKf@mA2S zVy$u=yR;KGwQ&ejz7f}B1sXxFN^>6+b9BWF5msluva1KSu1Ghq%JIF_kTXM31P+0W zR+EhPhPF`*6M!TecS=D`J)l7MoUzvxonxrds2Fuo5O{&s+bKlfE3i4i3AIa-Lh~2( zU_3t?y54O!doTSFX#gRe*|(trw@U_PnScW)^8WK-q{$UvABqgeNwQJueqJFIyyQ%0 zbOe{0cOzrRDV&GijzFYeU(?Wlou_9&&;&P|ob_5eV@lM8?Q0pC_q#LOtW0QpjCNKuNk%V()lQM_%5v#6f{_YBWz59rfOPEulz5Yn$!m>OHZoA=y)%vg*Ek z-u!Ya37DIn<~GrfHEa4a4vvxlRbJoPCz^~@u3;Nl*#Z7p50JKxIkU@s7x@DHvh=)~ zD#@`AOSnnSouMglW& zUiXmwgw)XEKg-f3>1$!!knCKwZ+!paktm82?bnaRSN5l#@B$v%uF5fs=hA{h?3PlR z-kggo4E{@^z{MTsmPrhkxLJ}B9CApb95C0!9QOz}>fBe*)_!*4U!f9bl-)%w`feY~ zfA23`6c~PFD>_XRVhFmm4bcdqt*rd#i%Hb`PaLn;eNqzhTkEo=<7~b~+hPLuVTf+j z7l^CQgP)p8BSLdYs$}G*L4^@vvPc5!9rGJW9UzJ%n1s&z?YLXnoBF;?gLP8 z?%SJai;2y8NV@k*3>3NkH5zgRyX%J@J!X1R18g}nQrR1>9>AQ)mQlp}j&)WW~PK-OFr_XQ+-Y*QqQ7|q}# zYEJfIxhy}_3m5ArSnq__^eiCLc<{248!cUCxlG5-7xF}7N4tnd<_9A|$MC@ydvQj2 zrpH^ReVlbH8cpleE@DN`^*G07MSpf~7QMS{X6`cA)o3+FC6Vgp)OAR58|l)pS&ywO z>agL)tpdF+yYluIQ% z>wr@4T-ODLQaYO03WdB;&hf%9)Io%{=|`@={*pwxR~Q!}7LFk*a!QRBeS zJIFk>@|tZNT7g}+3*W0Mbn*c&#A8J{6* zS>?t1?1u3_OxP<|p@ervg5^%GslOoamwp;9ZD^O<_Nur)k#$>818fYY)aXR)yDzzW za8Mf@8-~Y9_*MUpY+-EBsp+m@RCC>nK%n4P0446ke_>qO*~%!`*}5Y^r;VfXQ?P6Z z>P#qR{Uz$~-PifPTm^VjpZemG2uQ?e(UNOhMTRI|>@^M*vSOPyp;Xsl6YRULlm?S8 zp>mCh>wQ3TldBo z5#HOu?_K|0EwjjcyLxhscd$0CzXs(O8*j48BNuf*27I1>mQ~+<%&Cbxq$)hpsbxD9 z0YO$dCF4x86jmDD@hbaUjgqprZS;vRDHkVO4OH65bpZ}`J^`hf)$I+pvXn~~8|i_Z z(cUZd4J~@~p}G`?YxgOSHJ#SpL`r*b*SLc;p`Tugr{ELn zl?!)~?|=5dpWH9P-vgg`|ITg$#q$dH`f+HV@m ze@^rkzy&aDzE5Q{EYTxltUlFn*;(8m$os7>zrXRW$99Unk{9p$g%cVZQ9BMB#(7sWZqv331oMcfrZO*<^lewfM7H59kh)hV>h91t9DRo4mQCGZDzqCH@e$2z-+SIwz{SEx{7JNyct7vcQLut(>4GcOd&r~wwc$5Vq92wy8 zpY>ZtA4=hdHshCYwH_VL17qz_zhPQZ=nXGR&RNfneoZ^kH1NyQeFA}d_XH31x#GMf zj4!b$GvMz1Roinv@ZNr&migwS2vU7sl6(O|FS3lbQVByb4=GlVz%s!wsP5nF-$boD zJMgr_4RfG(bBu1Zs^#mr52BfCKF}I5`-c&Y1uwP=U)*d%p+QA^HB#fM*7;w3BRni( zXa#^NtMQ};ics>0;JS=g=`AIQ?2RsEnUs`yc6W`tT|r^KONfzor{VWTQZ5+f{T>=%XB7@@qM=$_H6?xOD;A-6=UR*>@&|we! zc=ePhSb@H3cpVE5`h03rOrdXzG!K2982!)pAj{O(kDCl_|ZkFI^~mr7>!F=s&#ZXE239qjvONHB(VT$ArG#pZNcObHh8nGMb6(rQ}*h zgKZ=%#)ApVFdX}KLe`@Fn%QVXC?Q^SKL1TsUQ!R{B@zzqFbWgbZ>bho{IrlQW|tE5 zl$!l#^e$SAOdM5FJ4|1Zk=O*7udcv*=NgmpnT^D`7h=1KA7H@py`MNADxa0^yRv7g zuY^VyR`l!T`sm_Dy?bH;VvbDTcuR#=bAFJHqwne=S+F6s8Rj^+-X-$d{qDCjD zm{VkjIrc>PrF_fDxBkRGL-l6~@NVTPWU=t6>evKjbC8s~cS7R6-x#3FJx*k)u-!DF zo8uFXzroR7z>f-FNq$*=tnJqXS8UsfYHV3|UV1=8!Y!VBkQ+Bc>^LKC&>_RaE#r52 zQCK@dmkvnkF$fVA_<_xtkf?=zt%P=oEQc+Eo&9^Y?{WL&fIe+N<= z19!RkYe4Hq+RBvO!2&*j#39RAPGnATs4|Nx{(EOrL*4)Opw+-aW zZ^yUT7^RmtY zH{1xSsOg#9Zt-oDkPUf_ZMSA4+zspuKXNF|G?m~30M&Nu0ERx`c)FIai_c+=z^1S1 z)|l=AJpxms*o6Axq3occ+X#3$ZF~h?Ky#sG{1v#@`Hmjpo5Ts}H)`X~vmJ?M0)l!B zUn4Dzawx%8_WL$2op^W7Y0(2QO@ec0f@KP9FI`klOFG|Yz?@w;tC&o1s~W6Px`-|B z(ac8hkx3-7DuHI}iYXov-(l??!qspRc2Tmb3xBlVB^(7JZ#kp zEm*7(EbR_4@JV0gtG7{b(?wdQj!fv+-C3izu^4(otLY%EW<{yeR};$8NuMQZ6Uv=c zP&5A#_ndRG_J-{i`KWYeIt=Q2nxu6rI0*ou9539iRVWVo@&NQLpg2vb@lImm7bVyO zpr^UI@?Dg_zuN?vcbVhCH+G>g8wT&KuE_7c-vaGC1SnqqqZQkR9Vvr& zq!6e?Q;LwR|F-q&hLw38VFd5ty)@>mIPN%JDjH@a1rANmO~w6g`H)7aY!1%qv9fL% zIS%EUpUqJz;k`BH`$Uf55Q2YsAXnqaZ>=g^o)V?VUia^(<#X}Y6g9zh%^eH#s)6Rz ziYbxHt>vDfM>WkJa${s1e=HF7t%hiE)38yOYW_lIhAf8YilH!;~KYK)QE zy~r`xi_U=N#pIK@XJal3@yZL0T|&zL9jIP^nCb0~X|gH&Re9EVVPR|hyPxu*DDD22 zuF%KzS&OM{A0&uhzVZCF@YW<^Ub@-GA9J&nTHU@MDOl>!?Yo$?^LMyB5$BsF$F;xL z?6O({Rq|S?pzOwLbviz6K?u73g;$FdLPxTZtUT0?+#pjX5SZMOjt*5wIrvOozBY~E zeR56pshH#D&~L9wF=8Dpvg?MnskOJG@HZqi}%T}@xZ zeII&-9nTjZV6A&PQpSiUjwlZw5cd3>`T^uK^fnba)us%RaP+fAZ9z)F$h9Pij3SW< zxVQd}zsVCEDT1A7O$*ebN*JaK_SdYkHwvZtuGp{x7i)ITul_)m)fHaBXxlnq`+d|RE;)uv6ckhi$oZNdKt&E(fO-s-0g{_ zt>sSjjcp7*Gzpc6uWr`ey8_V)nrD0lnW`+#y$`|6zZiJ;=93L)-SwlQqFSnQc_q%u z!bAO{9h;;d#Q@YDe`ZEIdU%0R$^qW>YpVF;*k14FZ#u|+Bh80Eo0m=Z6H`Wb3l2e^ zqsV5v_xhiL^1FZX^zt0!SdL@sw$|h?oWY-!ZX{R;)*|A5>$^D4nq^s*QSTQFA0JQ= zXU`d^fX&VJV+3i3%1R?hA?tU$z|Qz{PlSi7`VR+{kR&s4UkH7cHm6O?bsa zkTDIMezWw6#4~rN5Q8Q!^I#L@EFDh{NMbWQgj1l|14_1&M+m%PDS(!~?)eyE=~J0@ zA~=^mYw;+R;}?E|RT-W_nKv5taopjsVFv1+6;mm;qG#Ae$(z`$y_MM=&kCyrpor}U zSU1q%T8NGw&8(a)KIO>VbQ#+6QlMK(lT2B_|T6IUQt*MR(&fIRuAO6Pat3#s(!yK#gID1l$$Ou_}CHS#)`F^4} z^{*p%H`xpl)i)p_F^W`5qL;&CO~+F6^HpA8j^VN~0`2%6Dkc+KVC4&_3?xCf$;R_( zCI)Vh3XnpT&h+kMxwI;-_A>PSN~rd0se>mwx0~4>G*&=>XSqsLbfe80Q=8>)Vy#`g z7*NTiNPwgW(G0nt2j;wZM96Dcowea&5{q=VLtFmZfs>#a#)N!&a?V3B>(k*-CJ@R! z<2725{L1_wRIef3?f61R6CrZ-cHzPbOKX(^Mvb^F$fO3V{jA!KOOtv`mrhBtM3OaG5-yrT7%!l8)Br};}N#aml7ugI0-6)tqq3L9}pNyMM~KpCu=aC55h zWutj(J!eDEHVUU0Lx_r`cCaXi<|@*Y)4bx^NPVRzu!>_NFQDoCHObj(NUjT;97lAi z1Mmzc-Vv|;toMB_7Jxumb)=ly#iOu+g}@emnnRGZu0mFRl^MMQWm-P@M)8u!hiCLZ zckZG}BkS9smwl@D16lI~$OhUsQk8W&aulylZ82xACV6j)Ze#nUK)aj5W{BT{TweM9 z14Dp+olXXi$$6a+Oe?K&TT{``-reSw8mr7=v{7ESk8eofAYH)VO5{LaZ?b@HJNc2o z;Y^o8CY6P2sOXDN!*mK8_+q&kj+U6xU__tLn&MLKz;K6xjjk+$8J~BdJHqIPDY5D? z-fouf$%b;<(S-V?^rw(ikgl`1M}dz!ld|&1Xw4O)Co5bm2gLag^0E8=p}f+I*EqAtHx5EhIOAlS`j$=Im}7e>hMS`yhGOmQOcSd3^Ik9w2`>{eioQ z`pPecoBy=}#Pf!@=noyER1K4p8N1wZ0FtfY>QQT(bZjcr&MRl*gXOseplQ*tJ2MYi z1*&!ge)Am(6u8Jj^aTh#sF=<89~tjlX`*itv>1r)!#f%jXB$4hPA6VM1w4u9iZJYU zZ`g%~p1)x92kbycQmq7U9>w!u{gyZDX?wL~8^mNw^-qmYuyXe}4lHt2c{}+U*kQo2 zS^5MmFkSbpL=4vAJ4*vN!MTtHjk>e3!z})}h1Lnh68DkgTmfsVHo2ER_)hmTqH9)-4~qu>Qce2$qQO3!1|h%R4l-^|0vD%$kK|b;g44 z@f^*~z_tSyhvBv`kfE%X4bQEX6G^#Bu!MqH2Fw(y^Bk+PQ5{>dNiQ+QyPkc_b-fJCm7Y`1ZzhDbX zjBfcrNL?8bsjR4XS9oECA|S+iOGQ;Lj*V*j$a0t*x{oB2v)%&V{s`JF*V4*L+Guw$ z*k%1Hz!`MK7ASzp0Y=i0q?5AefQ|l}+ssx1=W$1n@fu!3>QfE0YhF>JDqOCo)(r6uPbw|m^zG9WNZ!G{XD`dnb$HJWdf-@(os+15A zeN^$LEjU7;FQE!N|G8tFm$+^D=3!2V!92XsSd>7eQ)9djoRnfzKoyn+*kuu~Rm|BF zhMM(9o4zkK1(R(x+}SmQR`u$j!)wDPDz58_;abToCe1bH3wZ_($5yq}QTTjb>`bBL z!tp~m%RTD8rrP7F7r7z1om^{OYkzZf5SL|A&g>E^#Su?LU$wi(r&N{GWCq)GHoChz zQE%b;d)Dd~9LMar^C=;0Q*%tX1!v383qqO%&(qx^L-R&DvHKY|!K+3g4r;=GKj1gf-|U{qKcz( zOd>_y_kx_FQ7(6gv5T*PaZ7w5@TRV?dxR4jj$s%`v4f;+O5~xw3t)whyLm-r-UkNx zibNXHUDk=QwjE#%{2Fx0)<^I6EJ}qC>1eyU9xiIMbYU4$;_wmKrIG^pZ+%k}s9Fr1zTf2f3h;chlX^Ix&MbH$ObEbfw=*eyJZe%j&BwT3h7G>U-ob z?3Wn-`H)7%YCu3UM);$bd4#)iTw_Gdfvof#Pum(`DF)gwjW_%1%;I%x@3Bi*`PCJV zG%291H8fbhb5jX9x+}q(Fyo@U&}-#;S;}=8Hmwv9FL6I0)d{YFF#< zm554bGy}sGbU0Oe2@$BxE1Hx-GZ`W4_Fwq%UO=rhTeL(K`yaJI22vqSMjvUd+8}&=jRLM_x z9c!fk)gpZZ*!a7eK>cLXyg}&C0|RMKOg;VQ&HcN;t+=VF)!54lX^-uYmI$1OR|pTG zjyU9XWOPdGED13RsEZB)CEPO@BOiNudA1OuBmg7aHG5ZR9GLmEU}q7(swIx@2|IRv zBG65a`%fV1Ewr$3O*t0j(!Sk2-i<-b-I-9HBN!c_q*M&n&#xx^y>5KVv68 zzedd834w!ugi5q`&xTCaX(y@?ZoEO%MZjjfdQFr zJ*uEFb+NJzhChupXooOQ(w(@ukS5hLdbr!5_O_m;+)iIl)pc<$!K?e6K#uf;4+)p9 zv(CFl9vPjmJ>xkl3r8=$Gf+96tPUs0EdXfB><{qzlJX|LQj#pd5POWnBaa|+Mh1ve z@{W5eb36?9q4%MKYc@QGzjVp)`lkf5gh`XMHEL{QHFuw5vZ{w--9?d+LFDyd?!!(W z2;o>L;0$BYJues&dK51KBXWOj4E>%mJQ^oroGdQW@Z%qM@z-r{i3`}Ap*11(^PP16Q3wI>U{#~!pwkPVUm+*5({V9azu@f%U`_0pXow7 z_|L_vaG5c+%jfi@_?Wq17JEDr&iL?$uXp~da^&Kin50tE{fy1{z*Y-63f2KD8Ej+B zbD(wPHYN6Ipg{!Xnd27Ia>7^m1uHEPl3o9+ks<~9#JF!%RIqTw@A5+H7iE;O)eG|H zKouP{Hph!D{h`yEc&l*rlU?!^KL+9yA<;x%XYt*{II#O`{ItZ-MLD8@+*QXrr^6`_ zk3G(wCDC#6XYZ)eU2+9PNc; zFkv*pdTHIh7wDuI@ab|{O8*faJFHA5OD*T>)iHDcpL~oy(<319Ou)gd%g_+>p-`R4 ziAt{wHR?w~=NH3J;LE9R;tL7McAKb%>MNheclk?4S$kYMJtIT51u35TTlzz2%7TvD zIz57(VTlKYAGvm!i{d7{jtoyL%V!_!f6gh_ zs5rh-H=vJ(4RbU#sf&)TKIj&8?A0cbl>aapN3fd z+anyvZDx^FQZUM}mmpq7>oMCp>ONnZHQzg46NP(TB2H_}TQ)5k68e$P)~U4%oXTIa z%D0_>x;+yHc7kzIb}{}gbxqOiQ6n%#2}VoWg{%}PcfJZ5r#t`!v8BuKdVfmBXEgyH zq3Sjb_$vgHd0tsOn$+L6>Ki8_wsSwNPi``~S<=mZ)mLjUtpLEjQQz+mwVKs616J+I z7OP1B-#wNrq>c?EsM-AO^5zhvV-&rZ0K-$x>q(se2cr+Ha?j@D@aYS)&lVqfN7kuL zBktclBRkf)=fQ19d90%+a?lb$9u>>%J|*a}apgwmMFAfx1(oy``Tj-k7ohgF)0vm}}@HS|mcSRd+DJrqWgq zD=p0lRd}MDmEEg}W`Mi+Cz8UdNiR2#a|}b@GflCpPt9{(CMdSD~$?ka2yI2oLe>@I)5-OQRJ1UgL$vN&2 z=7HGeYzZoKBVc#v{O;b?a1@@?1q@Z&Igo0Ja+hFY)WuSziWh0w%~wWzWxq}Md-~4; zs!NIgIhKYQ+Uq~T7(RN8cwT7n*NW;@2HElGEvmx`Z}eZw6c7mCz_AHuGk9GKml_gK z!qqfxpz_dtk4@xKII?tZf!oopDD@3bfi5Q$b_hwFigrN^hsH;Mte1_ls(Q}KC`lap zdjpfxe%}`aC=Y>!mklDIjANY9Zr;7&x+O(<_4$~}=KNwk&b_V`W6gY4rK-?Hywv48 zD~wAs^o`N(b*s%Aj^!~a*VP1+*w(u<%j|^JS`xd9&sF5O4=1? zQS&^mFP7D>FI-U!He8_YI49!{mVjV}Ypc*0JqN$qPh`EEb@Xt3uvIhvnj94>uirF> zj4b=g)XHF+g8*sk-em5rn_K;@2kN7|D~y>j#2v)y8QXk5w*BjCR1yr()c2w;oSU89 zn>g9A!E6sht+Yw(M##Inf+ALMBR+JTla*shKsmKUUq@IerTthZHL7h4K#ay4G5o^}wQ7fG8np|6z3b8*hS^9( z;EmXmuqS`H67Pd;O9VqK?aX@kD?Yh~JXFYs3FENd4-0}A08}3IddN0%6tlAc8Ta8$ zL*vVpOnwlGv0|D2%MOir*&-mX9Vl2=k~GAhbJ(4;=9O6RbjL~woRmT}8WFq?sq&d*w?P>yH}=c`E=zwq9(SorR;*?TKfxF#=W@LuX6P? z#2GozW#h-1&I+#AKdXvC?0!Ltr6jWYaf11Da9sOJ{KIdO50SVu8CoyxH1f5jaMEX@ z#ZKCBZ8qv=0TymcmlBx^gS^|kyp6v3WApUj_J@(ny;{DX(o~IH71K2GW{A?GH{ww< z4gj-EOwm5c#7j!hw4S@@BF#l9Wm>5eMKU-FY9@K~zboc8wl8hC38QWuLmi<{j4<5s z3QVb~W}7cjdC`)w_sFWtxxIX+G|$Q75CU{^m&~e4eV954vG}d<$33xR0owq|(GVE0 z6APj3H^PBdB ziJ)3`LyPz7b_!c27^k?Z7#MA9Ik`#a1)GDnN>$n#KKxz$T@b3v9WHFP4DaVwjn~nQ zFB1+yy%T92`lCEt9ynlww^*WBLG98nkaKKAGijexwaXfpBJiei)~8&wx7Wd*G#;b+ zIgGeCIT$-v-f5F=srH4Ch%VgrMv)%xXoF4<*gEJDqSRKg+%K`z+GK_x*4L|aYCWo; z)YPPOUn8n=<$q)$Ly-O$+Ra%d_g_}i{&r^Pf;+RzA>x$*)&UM$gYBrY&zIKeHR_9> zKFaQJ4QQQAf-P=yS!V2gXbF2*oVE}75DofCpo3h8jrl_gBg6h zi|5*W*OijmV5i!3V|k`ZPcROzxl`bjD;?J&eD0-=?Q0S>Va@cmb`Dp7pl33I-UAM9 z=XylW*jaXLj(D)H`epxhSgs%BTuHc}QYq+RcbJad?`a*rglUrVQM-A(-%NYH!aTSA z-*Vk6q3A==KmK96iJcDbe(i*qdu?|V>J4kr`0LgBsWO>BI@_f+#U&oPc>)=!Y4JP? zh;y;0_3VZ96g@OTw9!r1tw9`6&oOz})C)4UjUHv5atr;Y-GK^&i)HM}w+}!WC{Ap* zxmTMLXgLNz>`2od*%VUrQ`yrfTORGIn2H_<4pr1Y*{jh}@_LGpo8VaN*H7U)b>gmJ9jVPmVKA;C1_>@rwXqeja53euyN-lLfSlk`@Ta^dG&%C zAhwd55=&T#V{^QC8gt5C>+N_Z8mM9Tu=pt-+M2*sD9~rca1e4emEA@i)ytPf8GaH=l zIh$av-MShZGii;F-_4MZVFrMJzw->1>*FoZ4O`NCCJywW)GHnuGja)i-n9hxlwH#i z)G?JGQTk)`+VLBzkgbitYs6S)h(1Hn9Dsf^mtRes@T=Li{e)UIa;C%Im6Jj?jIlyF z5h5E2FU)iRoXzynn&U1zi)^@@A2hzT=z%Uk3Xk$U;ce=RDJ4l|#>Hl$)cHm^07*Es z;90dLaS`I~16B}PuIwt&jfpYORk;XyoDV1Y7%wl(`XzW(=ENEwTjR*KDZ3N6`dtpN@itC7}bPvsu=3g#kxP$_SQT2$aOnWfun=A|sDmT|q6 z(qwcY+5%_jE2zl_uLn~URnw}!S?T6>apKa*_(t$m_g7@YWL1h7Pq z=&kS3byRbgj4qeIoXNyjCi22wI=wzMaE*?ccgo zp%a;V@tA43{(k%Cx{c;bE6TGytQAh4bQFhso>WQLne{`f$0I(V2pf(s`W&U;`P;Lh zhUmqAo_XPo{I4+C0!l40&3}FB)5~6={A(QC5>%}o4DktslC}=YudF}?0u?aGM^vPA zi6VKT#B9YXfs@LkIY`d;wYzGI|04CK`+(!n&wxU&^a&-r@IpG6ZvB}*=WiW&NPWt~ zgHd(kLF7tU>LoU|+K%@&g^4V7Ht2Uu9nz%1vi?7do#nLGqE4Frr;liZz z<3$dGtCQ=85M_II_{#LvW6R zYS5VKq*C)RExhT2MP`H~0Ews3orAv^HyktctpnG!o@PlM!jpglIn2cXrnarGCsUQpUg%dxsZBGCZ$a~e?Kj-nxMjw)AF~4ZN>9g0n;cuC2;_TsSM4pXRo^c{A zUJ*I>my7ch_;yS9#YC>wFAey>5ql$duI>Exzywv7$rX?%SOQRom}V*n9p6MfqwiiW zahFOuF7KR9*{7MoaT@5{D~e^zzpdH(yH8{Q8XH|GsQ&{P$$KfLb)S`X^>ic0D2$dW zZ?%?D&=VYD{8-k*x%&T+{@k@!KAZ=30Zu`lu1pZ^_LTJKX@pH%yaK8_NCQOi*@N7! zZH7nui1W!r{Fox@>ca^dv+_LAOa^v+V89k8t9uo-)jyO4uo|U|y|=pO1K{Iw-xf`d zIMQdVkZAudk^VrEA@b{6(XGTscBiEmTD+OlOaSQTQZjPY9^*wxvzkBFkDX+#*65gH z)01Uiy$xEV1$X?ai8#>QxKsXBz-fCx9)1fMra~^l z@Hai(!B^8byaqk?jQV+(A*Gk3d^8C9Fe@IOmzmhdM!8X|xqV?U&R_Ab0rrPWY&oDN zZyb>%vKQp^gow$$hbk|_v+4Dm+I~!Nx;cWgGgA7%4#h>a%UeMl~~UD zxjvC43n3K{&sEqlzsek{6S~3gL?*UQ=q3AO-lmhzNX=HJtT-8M&VCoN1YOl!8EuQ0 zsI%~(7*L(c;&~KAhP-aHrc9KW%2?^IZWDL_t+RYet^F3f97@Z#D1Sy82(tA*YMTC3 zQWKv{|L*H|pEn7@j&7&k`M2n(pB(ZR9!PUy2C{p1$@!~^g!JeX5Ut3KC0hOs`upDE zySSAuVG@YHz9p|Oh?N>^JCJ_y$zv7d?i4r)2V6H@)tqZTfKZU#)I}~cPmsH>zIrEv zthFm65~TH1uYu*?WMOo)2L!c#-{S>W4os^4bR=rV*|c8uY~_`)=xg};1QjWeMoAH3 zvSTJ&z7148NPCebM+kl8h<@Mp)Rl}^iQr5VLM4*?xL}C9fj@{M(&l=GQCF1 zS}_T++m(;p2nMT4lob__&yj`?BiuubgK55Bj)OG+-0mzAoEe~N=$n}VBItEB4`V93 ze?_ZZSV$Ln`+2wSqSc2tej-sL%@^I>0G>NLHz3>H}O4c}W-5 z9Yf{`w=@l|-$-~}=ArfelIQSfGLiAkRjnk~$+vsc!^Bu(s@>QldD$zdT$cPa?LUO# zSyIAm#L%%WZaV=@#N0|6mm-~=vdSbrloY|UDk#h}#D>_YXoA+M9hr|_cflocf%NbX zieq|XVHSXB0|0n2q)>NCx<+lyQB6DZz~!_3EI6*vMajJ&UA!U3;6Oz?S)b|G`6aLDi9+Y z#B#kbhCP5T8HF{i&7gaFf9e}O>0L3Ypb^iOH}NI{)}IcuG&T(C3zt=fM)_jziX~7| zEvV2=@El+zG=n}<6b;|8vwRI(4F;p){DMpsmP)jSX*Tkqb6zfDy914Pjie&aN1t>k zk~*ILl(7oWm1yeg3DPm7jb^_;-wE*GugV!i(el5_^lPr()l;1_x!fzz49zJwgIFP0 zI?f29#sNbpu^@Xr0M;3}rE`f&PSl95WbA$8UPEcWuH`-ziku60wQ~bh?IyXJTNzyO zm6)6?-%38WBpc1T%?kohQXT*_MGWXD&QWMeigi9M81p4}x4mM~aeOyImS-fv!M;h? zv9TH!W;+Z}&C?!dHZ9OkS*g$gAz@M)owYVN_DXK-mpmBpb4Ln~_%APwfksKFS7yxP zt(4xSC&MX-H&thy%hvg92Lf2DSFsTUDeP5Qy5RrFpyrE~yhcnLuaNma7bd=IQej+b z<$mV!$vXQl2Dm^gJ6-h&kAjD!#8AiP80^l?a4Mx$HRU0_te;>~4B>9bJyI!aqWLDG z8uC|q*ka5d?Z|U5^olAR>a^qmrfU@s*Zz|c)wo3u5Jvl3l^1*&VX;4Z{7`>~98ZIu9JC z_D&ob1)Ug{ciwhUkLGMTvgBGbjX!_pX4zRN?5g;(y*5~4Mnp|)Jzt!52G;U6GpptH z^E`BjuCCgs1&6=^(6ThE;9F>yto46KndmU{BR=lDx~ztCEK4hjxn20c@ETXJmXfEA-mf@@ z>j`LtaZ^A20yOywlgY$KbJQqf#*E}#l#}M$9m=O2JXFzxp|3HAd{+?h)mO}?-#Eu1 zdB#SuF@$%|H`Wc*{N^`qd4JM(LZizQlaqh)=I^i#RZ8a+Y}G8&Zw737o+B6M8M^I5 z4v#c_pkjBZZvQT86Q3~GkI&jlJ>y*Y!7{Bp$Mqz>Y8$iC_iu#~=Ln1&sg0c8ZLXnW zwZ5vqZ=UWUf~$F@ZPAW;#n>q~l_x5$XSz84AU|#fRP3yIysuGDheSQwORuy6^Y+$I z=ETTTsL-hiuTz97TTb3`H#oLT&-$-|h%V@7gPUp!Zq;&**YIb zwA;xU40LVz8&#XN)z_Ns_X4cYoIT8oy&(L$qPn>)j%R6~hKO=+1 zj?s=lxkG=sTd8tj*Yf&i2gdD$`Kmal$cEM$_wEl~-NNQxGh}en9eTFBQ2uNX0VIq$zI@S{{D7cO+b_BHtY4awk_j$VK3e@$ z-W0j0?)-s9u3az;m1n>v#*IYfzVF-W5U_rYjz8+5^3KS9q$$(np$4nhwW&1sNH}wm zb)~3E>?BrUg~A2Y4rl4l3zS7|hF&~}=${2p zFG}uPL=7TN)$-`iKSsstnUiz=CaU{?kPY zg7Sur+xSLVbFbG?5cX)6P z)hevZ-r#CS+Ny0hS;5zh)tXBw-Bep>5qDCVLiVc}(AX!qrelqn`0hj8PPe(Zu97u1*Ka363mIVdz) zW7E;-fPM5vXT5)MFvs?NG8s<>rHZbB zmAySGsIAUu)qs&!#U9hmN8{F!74823-8r{Gjs_?=lmZ1G66ArdJa`^-kg!_E78d5m61*lPJ32&`d<7rOP^NrpW=tP zaI6&-iRp}SQ<~;H5)*Ddde9M;cV{oPGu5c2d&o?S6G`el6-`+3tRS+fVn0!#M9@NW z8aC!Q+(#r*tw#Cha-6Dz!ivt7x3_XhFc?u7@82|+RVQXa$>$mERy?gAT$vbpQ?ie9 zR;8QI99i`-&VDGZW&+bk{{W+wX7xGGC$&%k^BO`<^WL0KZX!bh;{)5KYKON7h4H|l zDzLg9U|C0`oK}MJ4Uq+05&YI_7}t7xj%oe0;#+eLeQGn4-lWUxY9x@B7#%2E7B=J# z)X!T_G6}md=9OE@vL*=i4l!7pf4Z;a}J$qs|k!u26&^Vbt|-ih8!AG zAFM^T<|hQI_2QXn*G5Q#bNke_XjH`ex%A{3Tc)`|x2m5105l`j!vllXp@Om=InHV^ zoM#=X_`#MnC#^_IIA9o6EJ=6IVN-{rDCjCO-~xIR#UXS*@Im(#Q6HC)QjdsKAA0i; z6P}eI&OMC?YBlhUhp!r=x!YtJ@h zR0Ed(097&+XD6pxkXFXvPc=V2D2UuferuAlfN(N8W`enk(YTIBOqvS+0L3iK$VVNj zaTeGY>K%q3qu#0VK|MNDqq!%XQ4z3q_M{Wv>1!b*F9)28 zOMRs>!d@|wr>A<|66n)HaMC_fL+keDczEiTEexw3>FJZ~-|L-A6)Kc9H|P z-ErQRM{6~_m>}crMqt*$3Ad=)deN`~O(N5B02QRumNSCxbM~!jF|@O37lq9b`c~!1 zTyfk}T{dNoA-FC*@lw9Mi(x8%YR#rItEa^i5&$2y7XnAq0)f1|+}L0BMQO1-o}vy7 zWvXQi2>9DY{uz~M%`V3Z3F|~(po%>ERgCFTTy?3ctu31Li3p-$n6MmiLrW+6O$(Ac zQ8JK4Q@CRX6kCZ@i=Ndafmw1zai>%~)Ef089cc20#a+$11?fw}A{+|s?f(Fn*awOY zSi58cMz!OIwsH&uS6xh@2+b#sS3&VqT-`fo6jLJECChO~*-Az^topNV=8m+RYmAy@ z7nZsP%8byOf)Y6CQnQd19M!ih3UgY&7@tW*S!|k{MloESxi~nX)@I$!W5vC4=G$@} zD<`g56Tr=V0t`tI$fSD3x)aizQoel_p2QrC*Q;9%vJiN$R$AB6gbE)Y{=F!afNkkj znNxolKmN+JOaSTydObYoG$N#mt5BBVKs zQw&B8X7w8JX=jmHI?^pd9p?hPFG*VDb9t|dH&lV3wJLcOU;!7ftG19jP#4ma=~u)c zNHf=(CK0%bQ)e5=CTl@!5Jkxp!B@c^K;nvI8!^+YL~xL+*ZTWMl+lWp}+#T z_aV5=c}Zi6&Y%})WH<(?f*q&cocRM8B7wUr7JF7}Q7{J3E5I!Q9o9)1&0LPn$Tccu z3gy5ekBj7FP&Vy=2?WvcfJWqR+PysdaO>*L*!vFE;=zH)#c|p2PQi*D(cV>MlM#=p zG1vF4GPRc&Ac7BU(9*Pd`}4u6N#x;&C5XocmiYn*mN6m1pQxOYD6J(ZF4&2=s#)Y5 z9!U4Do46U)GIlZPo~F2M-<%d<*R5vKqkMxbcp1$HadONEOy{;}xxD-kPz-d(S`nke z12AAaW2vB*d7qnyM{Ii@^*L|EDnNuhodVJK5tN6~u?utulaHEBdSinP<^l8ijTER` zxo3@~x=$kq8+xDGl}~c-bQT!PO5aMJiaW8ZFRy?juqT7p28mT$J7$^GnH*sI)=Wrg z{$yixnA~@?p7`xgLU}gOo-o5aeA2rKT1yBFzO9US9B^peMpkEwXAv>&*iu2=E(>)4 z)psfX0Hz8%(HejOGEW%AQZi99?Lsbe+aiCeA_7sfoMhs<=se^Y;2Nm05-|2AgcDMe zbTfm_dRB5bF-Q(^p0x8)U?Kt)oeQo9TJj!;=B{y-IO~dn8*-zJVuzi#F-7a~MIbvAXP)#R7?qry zVDU;1bo(R6awr>7y+=67%O84;+=R&IJ*c}#h>cW?WMt70`(?`U&{GK1VL%ui%@1z9 z1rxX^JoK#xCtw&VR4|dLl4jw3>IAc7s_tXZRc{tqUgkx}=$Xw)$C>AFV@xk%YQyOn zW0O))IV)Xg!5*dqtogtGioT|ZTd-~x?<*9Wb5TE#qj9ANgOx4K=$ ztj1Ur?D(NJ_SY)ugN)IN%0LZRO+NXuGDu;;4O)8}-!VWWX16OQbH=i%#|=wvE!Z!q zcYKOt8{_Rn1q>@#Aw9G>IT^)0uv{qSg)oBL8a~D>uoPc}!LC_T1pfdOy6RcwBw&GB z8*3GH3`Kh4$y9U|&b1laOICITt68O6ji?A1q;uvXFa~o@w24jzYMza15G--hJ$7bg z+Mm50CBYHWsX>xLO;)pnky^XH=I5F{2#I}I#T3dEbfr3pb_G_mnB02i@B%<0g@1e(q_zK?84R2lZE+}r@THGC0mi;@o%pHYyb`fzJ|>CStpl=C`O zYYxWblT^Vu#&*?)?K98)Xln)s*qj_tHz3OV0&`H7@ehCZU54s4Y??IU$Sls@L9bB} z>Ja0C1$u%pZpdtws}1+3tp)gYEy=3phX9J*bH&o?JdvJg8;h2cr+TU5s3^hWv#m&} z?b*&r=A{%2D98}8#!X7C#>H{t* z<=lcek3Fk7EWzi&T=#^9+^=%MrzLvA5yZA$T_EW(R9rw(35g5eXB*pX_})oP19^n zIIO;@J2PXoHq`Dw$ju;>`Hk;Yra2HJ1${vKQ;QV^fM&q=G#;03T2Z_oDDp_H9j&q~ zY+nUOIU|u<{Cw*@+;w1WtAl~@SH`6VdsjjHwPXaVbgL9GQbOm7^f>)R+jqqd`=c59 zhI>@ZXUsc}6!orbUU8r1rGX@r9G!$35r}h_J80>EJOPTN#;3T+qL30gFX-L#ih;dg zF}ai4u9_byw>+MnyM3r-3U@N9JD!EQ3dS{wwa1!348Z(Vb26#UOE?%A?NrZk<@99- zx#@#T=bf-{!27xBMw}6OG;qW+%4BcWX&cHKM=UpFa!+q+^~1cRG5SI3dwr_N(0N6% z>CSS0RT@d6wlAqXvz)A86knP%Q=Iw3XeBoS@TOQ`E11Jg3YRIC_(kervKvNvxS8YjEe!mrD3&9!YxWEN9 zDx6Y~*v}MPZ;(D|a2>@GjfYk1k_$3c-{!h3 zeOs}X`&EleWRhu4*q3U9fCWV~>6ntulkrZ{0TBd%Jr7=6i|s|LI~|eEx2UCAH7UM z%e1H`{?%d9S?%`V41-XD<7}Qx>%r*6aZawF1#)@!pd_{g5sZp4Xe+HM2^r);hGE)< zf;Y904sqIi9ns0M>5plp2j`CwOVF{(v z-%T;b(~o+#%X>aeX4=%}4Yc@*;h6NMQe7%X^FTyMT8UO;(yheovowvIab5Duj+M|t zeL}nVg;UKKv^&`c7{ylwpo#btXt_b&pwg)YffcN0L@6RXcc5pq5}uV@m#Bb-a0sCe zu^RPZL6WbU%tnU-lw4bq_*~J4SXVe5=<5)&^NwoRcEV4^=molPy~_Iy$?7^p%qd? zj;ltuTAWxWjB8cF4^A;gtRo!axOf$B#e_$hSpqxM9&AC8T(SGF3~%RHFXpV*ovhYSzU8Y<&Fk^)UQd? zHcDFqCbXKB+Q`QpGgVoD4r-=D-6>Wm>ies_Ct3ha<)Fn=B<4<|inLe*QMfGRWY@H~ zq>@C>O!J>=xLSGAWb~(ceYivlRY?0*x#vZ=BHGwQS7Mw~6gyYcE6^cT1ZJ&mt`6=E zdSr07UMj4DgP6+`hK%|_=O?vT;o@=X1R8{gb9#!A@k)*@%uk)mLfp?7KAeH^T#_~A zk;mGqk%3L31;Og%(MqXrBN)b8?^XUN$S|q4t7~=Tn2tTDd8b75AYy&{R&>aW(I8^a zG0u7uLrE&H5x=Y0RWnGhA@dhG>0Xe>Zx%=ccNxWI)|AVIC7%p>(6OwO$%1yqJL9j~ zj4cchBS@e-jmWvlBiztGjAozAJODWO`&LRS+r)K5h zLfr_#$7+(hdy@oL4o*oMD0Gxb^!-HQht?7U1o~WZvw3od!3V$1TXw+_CQ`tY$KH^>=3(`F3>scte5Hyr zlfpwk{;YKrECB9SLNW1BL=P{D)Uv! zFyLplYD&A~wM%v!d{kuPiuN)NYEDka89faL5j*kIHFG}oE7RJBV~4=bI#iypQ1=Yv zbT|~^G6#BDXt?Ej(|tbJyn&fZA8%@87N>0+%{K#uG};Y4SbCQOJ!s2lgg{|HIQF6j zM^0;a&bbAoN(RzE9jfyZfsh4p71?+MRJ^$X%Njx$+t#4Y6m_fFRE~31Neu3{j6g`K#OvVY<+g@z~^4m#|5r$UKktOW6vOo}#T;cW}4_ zS09!cH6>?}(y4e<^BKXSij3EqH3J}XK?YQgy?yG)csQaG0OO}M<%4T_g-Luofl`sN zQUhvbPwhiCU9svX;<3|F*$5n(Z{hbIVC_o(01EHWaZNPXS`stGVW#TVMOgaPhH*%3 zE)N4VzWI}>4Od9PI~Y;7%FAOVwBixiKXb5=>I3{vae zQ(}@T!|Yo!N1g=>J>nqhDaCnM$dQ48O!h5he+4rAbxXx0ZSh+fU{X4BL&;{Rs)~F^lL>upWhCbVy)Jt+ z$1VQraj03w0pk^n*5SrN5)Zv|>zrEUQKr1?F)6P?w~5Cid3Y>H5D~JU~$JZG>FXk z0;sT*u*EvFhs?!MP;kWcZ@GV)YY-I4t=)N9`CO52f;N=lBjGb+`jZYg4~?UHvILh>PqKP zRTvolC|A2(n~F0Ga0hy%-r7Z(5;v0>3z31ES0((?A5IVxShcAP-r^yGaI#~NJ5aM- zM8v$TSPtE(NfH-eSdw|-x{;S*yb^$9iWHf#atO_6HE+tD8>lDw z6prRK-6l6=^sJCr^P}>|3P8v0Ph`1vR0XoVar;t8a27JX0U*(~Ze))qp*&QKSnfc* z$f{uUx$Ft4;Db`xoc{p2lan^>n@$vQS0e6TdJPz440?N0YdHNRkU6Ob52gCG)f??y)g1JbQX z!mcV@sHK%sDMdSRp4AQ+dG_Y7IAO@Vd(dpV)EIX89%GJptsRw^jYi>`=hIP4c4$U+iiEbiSB?!lNP*xCSEjWE zd92~m8#vrZH+$3g!P(M=NaKl#uE}_doG=)vYqww(Al7#3B{Lk+*E*8tnn$SLsL9C9 zRw<^IwsE!z0MmPWWsP_ktbUoRWr*ERQ&&(ikw>U~(`k`{oKidCChiSQ^^kHm3LH*u zTY@o8tV-6_S-PBxzHKuoK@?q(5k;Df?xK*P=bDfI02yn&3MnNdfKSM#`Y(s!jHzV? zgOgTCBtHKD0-0Lsy8zln8wOUU%F;Mg1praIKoyveT|tbVXr$KSW%_{q>GFfdnOw}V zgOk#LI<#xXX%@4pZqJv^B8KisB=zw}lAM0q3!C_+UT|p@?W{AtM*^U)wR4^*E33E3 z^61@aL9pAyZ`@VJ<}tz=%-m0M*v3w1n^_r8tn*AYrnSSkr*N3jJwyt`wx})sk_jEC zYt4RnQxOawVOoq|ZScOgPOi1;`K7E{rP8yrp1fD77}~>P-eyQWxTbL10KAGZ<5=6R zQ7yutBO;@q?;!o zurmIjjnkfnuG91_>J01{=O8aX?w)zQRcBi6A+6)UVB5d3PuoP*1iy zQi(4vM&jFC_Ur{_^wuYHaHG-`06nM+o8(Rpf98d{{7anV9mlt7rbR`_QMvoE?OC+Q z)9&DVj>;dgUA1&SpWXj-raqUD&aIxB3 zxKWuK3_d;Sdn&s^i2Jg*Km4jUQ?4ZdO)24(7WeB%Y-sap~<)2OBFZ1zdBQD%2HV zG3lYavw%^qD%}7pg205u8sIPhw+F}UYa!)kIBvx(Y@_N#qw}1>}aZF=h z%K!{e_!!`D4k)ElwXxS6QXR(#bI?@nNoHYHftZIpj@3JM^2sOKq_RR)Tkk=f=i}Om zo%0K~Q`;3l_O(7)p99J$Fc|>EHwsIkjTRhbc+shRh&tq9HZ&Za8{Zu@X zda!y_p;0V?COA@hjK3fzLw(Zmp84u5Lv#8?75Q3#t!&o$Nrb6Q{;qi2y_Wb2Z1SDr!b zRXG82aZymkfx?lRrc)+BToycis_qXcGURlsk~Spn%KLrlO3E;Nf^s^Kdg8N4*(}oE~REFeHrDj!+Vm<4OgQz{IbR&`P+O9xVPjON}WH|PtAzj0R zoK+E!&Q}@5H`DAq;k`EkJ?OU+mY$q3a@Ay(tX#*B6syvD-$hOH=V2q?Nbpn(mz??a3R%9P>Ttl5IZZk(`gU83vysCx70xeo`ptDyal)af*CLlP>yvk{_u3g;^ewP;NQRX{~M0 zKRsxhh-2H@nac94e6Yv{)y^oLH%$_--U-iIYc0B*;-z5TT*KO|8XHp5qKXVg2O_d^ zY1eM#ChoQL^BPZzHs4OS5tFoLw>f8P;_~SihCzbgHKEZo4WoR({`IxIvbT;y(wE*& zsD)$3dsCRTN*jAovybAvL8Xk-<<8^HdWEJJx`-JizlzV@>jjvq(KnHhO(mAqo*!MJK)`624?L=GKfH)F?^LC?bjuD8{^r zp||pY1XD@zVms|lGjJrji zLZ4Bfr#!RCAXq{w52=p;P&X+g(g?il9{WdX@k8bU<=AJ9-}tK-GL4XdmN{}ee)Sjz zMu}uA%dp_*wR&Ji#Lf#az!XeSl`N0}mgS^+h_}Q|BNAUZ&)R~nHY+T}m-5i#??GG- zHsyC8StR4yiu_7$5Dr<}b7!~OsWBPkmPE*8Y+!p)OOOqdDIgAUQl2m_dE| zQsAz7)t8dvoPuae8f8`y%f@;dU3%MRcu5$?2eo!`C0w?6>q1`6vRg*O>jZ=HDn$~O zjz@@`ZyCp6YO{j5URVrbuDXoe0kq-N)FZZbAh5+rPnO0a$~irAQ&kHH2e-8vVgfw3 z(mK^no5pdp3Q`e*Fnd+9sCGa}$3PEClu?WhHxWb_)W``LH6?M|hLJJRJJSgEv_6y2 z`&BB+9|3sA4H8fou^$5&q%0n&)Q+8M%XclDoDXXCz8`4ETHqL&hko@XgD6G@bJnDm#Pt4QTnKS&&! zb49Fu(n&iaq89f6W}4Y(Q%n`uGN(?J^eas&%FqK0M|L?a)X=wctP!>qaq@aq; z@F~_)FO@hP`_Sq+-u#yOMmVoDpyVkad)2X+q>TuW9lUTl(vb2&z;l9m2imH3aHX@D z$5Tu&m?7A4&`{HC5aE>Iu;g?VAml@EJ!gV3(v?XRmQVS4Xperlqoj>@6(<ZCL!L#l=)Ko@OI6Vz<$CmiW-T#`))331^I{01jzg#kxpyjL>gz{>Hr&@|GE1E0pQe#~_8% zmCgv_i?-8IPIlF{(&2Jer#7P;W1I@@%yYCp;h5kq>i3z`#fsZyxngF4A$*idEXY^{JKaq0)ex z%ZQq~Nr+MfDZJiKd{t?YP1WH}Qn_t>>{MWitiT_rqirleU`gV!CDy$!h|4!~ieUw# z9#1vcJh+q$QL$V{irz7(2uhxnFTgp&Q zm4Dijc#FkRK&%%z&0$}}lHJ^TH*L*huCcy(-><1bucEjBj8W70o+XFU{QG9UZ>I^a zFvJ>r9+f4^f&Tz%IqufF;zw`%ULJA=?zq6FT3zbhg?*?00L@j{_*rwgm(}h?KC;o4 z*bL&jdvo+Y%>GvZSE$QGL_#>PQ|&X-#IA6CsAFh==M;V0q-6BX4;-7m^@AOP6&T2- zkV3c^p<#4PwK{K%Yqep(y0J45)DAo-fS*SN^6mh4KGGuzZFFD z9+|BK?yj@asETZw9#%Q13AUVZnxdnobR!3XYId=e27R3u?D@7|SOnD*lVo8KKNi^sWlm%;7tOD^rFa9LSd zMP{`M?qh*>G|whImy&)cP4hV+6e#K!+wV-KQRqb(BbN3Q6rx77^LPGXeToN6&|HpX zAV7yZPUdnbE9ZV51Npj z9zwJ3Ql63ex(eNBmkROb77yIFxv!a9@GvpQUU|i7{5O2C%n{paHv=aW$}DZ>nb>e~ zS?ym+zrTF`C1XH1K)ru@E?fBW0=Nth2R&+wtxQJ~5hhp;fbc1`NM4$4t)zL86{q1t zxX2mnf@)8xLk7^2A|MzTAM~%B_`6=!?{CuH(FjJ)#1F^GG_yw2b?^nxyyKrCCjww!;Wd)^-X(Jh>POqP+nmRjsP(#WLYJYlJ zS!s68%pEqbRd0Gf@hW2=HcFnDr83U0WO$W88~{DN>f33C&8f=))Y6PY?O^er_1=lL zF@#{aR_avH@T%i0+*fZlhyxG!fN)p6AY4+Uh{>LNam{vSD6N1TmG9b=L8yKz5@U_w zo+Ii;7(e~hmh(#>^FRy<ue+Jv$-BvU&pH+((`Q9#?qS;lflwQ96@$`B$d5RO&3%@*RsZJ_kzf@zJl zpkwSR)?|zlKn8%DTZY__cs0-KbJxRWvrKgr0RTgRip$=3tw14qk7@;cQ6!Clnl?q2 z{cR_a)-n`|%Ii~HF(FAGBCog9q@6**=By;UW!L>xJcF zeABqRwFlA%%~dpszZ-xRo7Kj%1IMPUxGedm_Lh)C7~6nA>q6T)t(jPGaW7e?n$X@ezeAceY@Qtc#T-GeZL1LpMb)fEJDt3x%3-62^ zP`4-_pstoP3sFHnp`ogEI+DK6qJ zbDV)$_N^-?0mjbnBFag?&g zNj-%ryYUH_6;{W{p{&w5iK>RQ9U19ez@F zteMR^CoiYZuEggX!Tsu(brg~KZk6*LHtuO#mnNUunRpIPXW>S(hHFo}+A**3N%X99E+=nB0z=OB~<|cVv;q zfr(WosOwqVIL!A&$^5vFBe67enyOn85l3FVd9J*(PUMlu{Jx{0$6B08fwQwPC-AUP@0|WHbZs8hGWR*AH8jauP>!kBVz>UFgZ2YtWE*BQjBohbD!p` z(9&H(VR>-j$NtP+0{pdGajQi%#bRLU30#h>M+E(|QeSiBLN?Z7pe3;OnCuk&dRtSLnM6*kuND-|Cb4sjtBL+i|aqmOj#LZ}l z({zKSL2jc4Si+1T>+)*9#f|YoNog4I@lq10oyx=1zM-0giJU+Ab*m+re-gOvzqL_w zDUGE=%I9$SpuksZ1ChoXk(ymI5uMysw^D8-lgGUSb2!=VYn`nJo^rdpp422$`LLMe z<398~?2Kb#rvy+D%I(2C)J@`mE&`3i=8d-twLnG6{{S?;+F}Bga0u=1My1$nhFl+T zDTrKXtaym8eCMrNkqq&;d}gb+k=S}8Es8A0R079tYiznAF)$?Hp47?>j*6skyq}s1 z-ah5G{F)^LfcOWIf$d0kSy>`d00Si83KB#T7L#@e8KU(tPJ zCgt*#hhDXBlnXlJD#I0cjRwHqr=c}|!4UQK6sBtHP1`ne)1j)~J%|b9=AYa~lCdgC z$o;4(p#cu=eriD#@IePWV-+2Qqipx9MX?7U`f59jPt(2#p#|n5SPn?VS-;PL6}>GP z+=tlI<|0L79ymFm!~UVr(NI;_FCx}twz)=Fath0wDXkJpZeYT{C#s)n&srfDpB9Xm$2N}g9v4-H@OLHy6s2|i>TLe|7A4*H<8c`pRtIsT700BkZ-C>q8 zN2{`)O?>{_TuWqV?efnjp-T*wZ)$Df%f+|UC6evb-WJBjIof@zUQFX}rCAv*MDxk8 zIXg=ZNUL5nw{lRi$>g4u3v1{^D9tD`{VqEOHOVg(Vv&H#o`CfxmPf~OppC=~)t4$H zE3vW&#~rB@mkKesV~(EGMXkvTxk%6W=aWhuCA&0CWg8bbG7fh9(v`T9*HCC~2}Ez9 z*Q0#Xl)Yd8BoO=+_NwNBIZ%fg=O7;6YKA4f<-m3fr|EH147)-%868Kx0-LP~F_7qb z#!pY0_noJNH$thVaAM>wuR9np7!NE{l3 zw(>u|D;L{9wM|nBK*=D$u95EU8txe{iw1#8Bs;#u)BYJz*EN&EO+C-C(N^$c| z;n4yRc8}t;T6K?=7z7;q(JrA*06bOVw5khbfkyyP_jgK}0-4;zU0WH+rK3rCUnQ$H zR;3H)yRKDD12fK8;Sbvtva{1tIPgFkEu9pe?4A&?|2EqGQt9;O^eQn%gwq z-%|!WW11#ArE$olzuIMmSgf3nb4qS6Ztb6LIQOkuGk!Ib2-sv04I%LZTtxx$PD%E! zX!rBnzS&~W$*lplickZND4x}rz-eOgYm7*&RMYvi$xInc=CpBI+uQn;K&hLEhDKJQ zubgTcb>q2HxDJ@54dJFNe8TPTUsJhwTxS5EiqBt874Q`G>?pq5ontR$;Xuumk98gY z0O4|&+aBMXR=-P#nD=6cnK|Z+9#x#vv`2`kIV5+dhTc^`t5>X>N5G+OwMf&e4l7W7 zSeDX8t)8?nxhnW>C@YO;%=E^1_n{r$U#B@WYQvY*Q3os!??X?o#}Z{+aoaSKdpVqN z8#D}>G}0ee6k4Y~&IgLr6Vz9!0Mk+&hLmUKy;#>@7+rIGks&134_mx@tFmx*XBBPz z^G`O>(xVa*pb^D%$31$WWLKtEX#gCPR)VSCuhPVGP6;@{qMbOsK z=XYSLquic?v)YEeqg~uX1+B!BG`SH-BR*7wb;EQuP4G=hVg2SrytIh!hQ$F`f&Tz0 z2kSq6D*MSl9|A!p1Ssn2h&F}VasUIMt!p?{e;TmuyC!6t%^}HUjg{6czOFSlYC3;T1+%@z)i(K;IE~si17Y`(gkH*WCOH zOQS<|tK7B5r7&2TiQO+#j@6mB)opLDB$69>WJNn#XYcT$na8Q^j#rV`l13DCRrVEm zFBZF7*JL*G*y#jC8u2{u=?J2g+Uj9#6vmQBNWfs5LHm4GD^>9Y_3hcVuu$ypm~Fty zgZ@$)lKbH=Wb;|RGs zk0iBlzTg$f!O6uXSy>wgB+)H#B9#gC9;EwKrv;OVl@Ne)n(Hz~ts*z(bjkOj%ACi8 z>VD(33o&JI8|Vl5qSYaj%C2%rKoDc()GjW3(4gQQxHKy`+A~$K55@-J(zB-(NiU$O z>}gHR+>xASjK9i02YzWi>!~W;`Wg#|t8YG%DlvsTfl!Na&JP`ltKvaFoG40Sccv0T(|O@1R-y|85r6@^7e|{3v9gCIS;i*U^>yNInPo(>(EAafZSLZWKuyQs*xcaoYp${ z)FH9dUgqgyDt4YpHK1S;J;#uG=e=ii+d~eZM4*B`pPF?$pDgEr+OsdF=y@(J?b=(d ztYk&}wd@bQ1L3(YH4RExq?c<*K_rf7gosZd2b2dH_ouO{rB-H~y0Gh+ovpg5-Atu&mGY%)zmwOb>oK*4t6LjrOAu zB~CtZT7wkXUda$%a>FIJa!IC1A(cZZAfBHTq=XKv2i4SjQF?PK$WHRg#*m%tWy&(B zS=03o)G89on9^OD!(qp9^G4n#_>Kk+GNzP9?Y+}}-NOc&7D*~Jt%Him14C z1W~62?g#3whW;pM-;QXgmpGuUjxfzmblA@I$68$ifyts$@5*7c^H{a18u&JZ&w8*r zj-*yD>%;~q$>)!1MRDU{8*OELpK8aGeipuxwubs_E)6`>^dS=Z&}Ok-4e=Cng(Zk@ zn)-E>@=k*US6*_t^{_K(`&ZJmvhLC2$;E3I3@g$>9Ew8<)r@QB&nqJkP?4G@CRV}4 zY39;lEs(Un`pqFjh5rCmj~1suQ;=~;wXHf^k4{bxwK|C4@m7^Ccokz>%US3u8!ibn z#VjL>je?)SW?vXuENQu3l=zF*kz2tS8QKLC=0_i}tFK`e;kf3rnvLN=cJgTJ(w@z( zE>V<#z*1YHjMz9m^I6SC`d2Nta-Vtz!shO4kfrjUdgXd_oM*Q4PEfcY159O|k$4od zOw4eCYRlWT10VILS@UN9Rfl z;H_B}ni(?rs^oRD&ePN0wF5y62?}L+A9|{CtT-aGjjKx_^bFUn-s)E6P7Nyz?p2vi z%1b7dJg!M62DA`H(cm!a?^aw)ktrtw6&YD}(cTfbf@9qZJq zdqed!_l#UM+`b|nn6bkHG3tRmlD5GMsD!6r49^h4n&?{znWCt|< z$e_S;fk3P%oGOZi#HKXktwYsn5#nohj2}w^4m;P)d`+f3+}9BZkCb}-t4*ie$j^dL zG)>wppsTKP)YGFMFiRJL&0&r`ktYL;3Q=_dA6|O!E9)0pYD;WU6a@o;idiRz;TFDR zsu|A;2>*d+;s-Z1Pslk6$7+Ze(ls8V_$>yP_aUroHRoVBgHN(mu8K4`c! zT}-JBWM+cgHsY(+L-SfqK3`#hoC>;oWiD5%jt_Dun=Lj-(VU?G zd;8NMuOvmKE;~_{w&B?4t}{@EH&t@Lu6^jWB|so!6oq?o0}cjpL2617`0w7BO`Vt& z1k_)<Ck&3PnhmPR0 z5d1GnxngrPVm>4HYBgA`^;s8~!*lciWn{2L0C(Av%3Lwd{7sBqy;-pi0 zhw&a~>gw3;XnEpkL44qzv|Oy%QpwaDn(F6ZZMg@fDiIP^Mo9-9jV#pd@OQ<}y*s-g z%yK!U_p!8Vx-+?Z)@dh<6OP9{>f+*&`lZtS13+irUEn-lHJ^ z?KuiN3Rh)n(a$j>(oX`ltc=q~_WNZ>GOB%FCY@T$(n>tWEadu_($VEc=pS)nzMZ3^ zQ8sE;RV+xyCb~+^HhYd)cAsHa+e#w0To0u5&%G{J4?aNpjb2$}Ay|4?<236nJab~- z2blB4Ai81aGe$@Ra*CM@&J^fgSw;ja3K?}G&DV<8 znDK1ozC~P?6te30O^`4}Bx%c!s=TaMoY8yJIfKywZq&}!-A^=%DV#9JG}arviIQ=} zQ>d&rP?7R6Ltko8TOlssd-GXsTf_{qc~G3O_N5Zp-)alGMj=l;n$_wF&-HGv;#lXn zDGO$k$t04#NZ`{8Zw@817k*DuOZ7XLB9zA)ay_e;S6w-nwU#G~5-R83hp@9zaCY)D zOOo(P`!{6wrj`@O52&%tWZh}uwjnW`P{j*S#a!30(+JyfB{ZYhPXwI1QU`1v%;qVrm*WeB(w8M8~4-0P7`msf^o z+Z!owihZYUF>Ya9BNnT*(x6uaAp28z?NL+!pnZi(-(Wv9L14Kg@mj`ot5ZQ7Ssg`V zHJj-IF~_F18kNdU<~7C#&1L*U97}3K72ViSb%K3KjI2gNgIC#V_?!cpv}vs*5{J(3m`l&scM($6{w7znd6#s;mcSf z)4?qpGjq5OO-Zu1(rs@dSt4Y0`5cP%A&D*^1X{{f4>%R-b%%s3jz=|MizIMsL2+cL zNyRUl5uTkWD=jSdE=L%n(%)bipzUuJR|I0ccdI0Q4QdKxHlVK=RYhm*wKlq&YKm~S z(#)I+wP0(z1MCYHUUf0*c zF?I}Tw9r}HTQ{2$Fg-yXYvVd*r+*c|D$MDh;=YZh>PAQuJ8jK$=cYR6628&2yJ-ZL z_HnGImS9gl)TZ&!oqz&zPZY;jygRmoo;ak->OQaLy7I!Oj53}xiWXJifzp_^2nq)j zB)|fA7!-gm#{z?tD(@h2-RQf6xZrR;C>xGD=Cge@3#UG+7DYXF(GsC9PEG|uvU^rY zP~86j+KYgudQ^7q?b5n1IO*~zLigb4rm#dxgSYps^BJi} zyJ=pZVbY3<5V&FqZs)nG)ma-nVyu!wwBX>LzZI~tTW(#jG1yUP0gW3xvCb)cHnQD? zRLGC@H@z`<_H9wvVxdxSi79R5%6j$+D9BZn3ww9@rLo!rBfO_`6VM;xnxXR3Z`4T1 z%}K=EKxQOIj=jx!Jw&cTs~qz~O?B%e`ht!JU}#HqmF3+l5Hpf0Mwd?nj7H#n#Y1Ym zMX{6E`%s468e-WciQrMnq9s*41~n8^s7H&bBee+>@**-4eJ2Aw=#oD=MpKRm&#|g* z6c=1^#Ys!e>Bf2MwySHEYf#X)D&D0%MMmW}ra{9mLMSVUmPLy%wm{o~UWEMn)lj>& zj&K=xd{7dhUKnLhQ&L-kj8;*D&@k^;ZVWi)gwNeTRhw=Ko|LLpD*nc_cT2WHdwWug zxWR5Z_N-Xcp!3Hjp(ZvOlbSj8r+^%!xXO;NHGSZwy zIyeMp0G^yxDzUSQ)pHSS9n^Q=(UfDLIOe?yuEZ$YhTaVu!i;u2*J)gUC9zpq$;cfs zU6^kQ7-T8_D4>0K_Z7>Sl^QUwyUZTl54Bpc%T(LB6NA=t|yj z;g2{F=^MK6^qqpI_x%{B&UyvdIl&ouf=wTe6r z02HLiw(;^ntj@oy-DhR89jA@LnMH!UXX5y@yEz$U{LFAG9pH)Xub`V!zh-GCVpUH- zD+l8wy^{7cyk>m2`mOebDnnreOTkqc0-Dz`JKr|bP%j^IoOU!)>XJ*w!U*>1MM)fY z0a^NrF2>r}zR|(&n#a;3K#<57nufHcjzut!@b;<|U3oajrVFPm>KKqkGm)|L+m)4m zoz#Aj;oH4PD`r9a*1mljBpcgl0*(hMk@7c6|BR+9$;klz>ySLO|Gt8uW z6N>q+pKC3&r_Gg^bmZ4>ZlsRkL`*|_16(KMvDf_NeR-j=g4NnHk&ZqoR)wK9seLT+ z?iTCxlg4Nt2)vquM{ajFP1&!f+rb@`n2sn%9WD`IwW16m6rd0g;F!?OSJGJR*B`DB-jJ04;jHf|^aeP79NY0&8vEtB_rX;I}nzocp*V70y>orL);K(mGOW-9A&?;uEUlQ07<3q@wX$~=oVW1= zOm_K!NI1nak5bPdhW+boh?2@O4ir_E>-cguj+F?n5wW|9BYbVt)q(4qmUYJzmgr2` z+PM_u#}jk9tVD!$!KcSl4RHjl$8>Be2HT7=HMG3^FjJ5#D}N&S*pC<{i_RHTE|VOw zMr%$fIvTM#v)0O4fX1UR9CO{5J@}VfQsXM#NjV5sWI2YSpVo zqtY=-^)wQ0!Ry+Y&JEU9W7M~5uNmagmoZ_9BY{FV01^)szFDf>w(vU8(h-WhgUAsG zK<29rCqclX6FA8j`KeWw=#cV9G{q+*4nRKwfsBPCJdb=)(GYn*Pr0qeYSFof`Jz%Z z&L0&*Tm{JspPtohZ1^(CfV~uB{nnWsB!^^h!c;DLbg7h6=?5$h20PUjAzc0-s}Q-` zKgj<8;=LS?3~tUxpCITt*eXK|I|8Z?Qy)_rz+s6P`%w1rGpH`avvXaN+({!54}-w4nW5Q9xB_xxmB~Yh9~SQgC_0^Ztt2kDR_k35r-W)q0@YM zQ<`961cn6Wsk=;|WI18hqz2)D869a|@2F%C;*Xev!5H_YSE(Xkfe^T^$)#vN67=*r4F*G zT(2YEqOxSK`Nddd zAbeJUt>Buz52zXrKUNJJ2h7WRpxh!PAkRhL&mZd912B8s6x-dhJ5^ zAGH+{>lV?)Zg#E@u&-L;w?XXEMsmy)$-j_Pn9NOAF1d?bLu*NI&960JUbxJ(=yVH#^BHI1AE=VN* z0EFAmOo3fF_UG53q6n5eumB1}sp|1WN?Q*#$6-!2JvQq4KPex|jP)bhtD#2U)W9jQo=V>qIm$!R(vQZw8REA9549kT@NjYqKyQPeyqV=CjJJn{u= z!_l3`%dDhnq5?2npK8=-J`=sXV=V5_#qv3=UYp_T4Js|_fuA|}6h+F5f#8%Ns~5~6H#Vw5 zk)6KAj=%8pKdq3~eBe-H4Z--O_f3*jm;gUkYbd8y76d?>B^^#HBYQ5j=Q_(IjqV0$ zk-t&Dyq?P0iIQY3{wirkr>@(yC2fa24J6ZaT|(v`I#^^Zf69Qoj6rZ>ybl`Zk_K^E z#-=rz4bAM6U^qy}Jc?nc%{<_bGdMj#s=O~?b$CQ}Pv$7->&Nq2M*f~$;4qp*&p8Jo zj|#k`VD4d< z9QZoQ3mb6w21fq?RiK^s=CP5HB3l+!}>gvuu zNM1^>&RDHlOV^!NgTmy&r*^({$_eROf~uAFuTE)X@{&&moXc#^#FhY1 z(%FE7lb?#LOx@5fIR|k+>X+Ou4l%`OX0_<}_u`S=M#{tVlg>UWhy>~1f$c)DKYC*< zLkdsSXc^lF9qV8mh)Fr(gp>iE^jw9AAQAh}lMGgAff_b7Q9;qV)$fzfYN@)^m4!V) zuWq^=!L`q`914(JeF{guYS^MDf!3@@#L_U#*jM&iG9A(|4bWF%hi(h5;(e&tq6C*Q zd1^kK9#73`GO|1>l?tST!S*yzjogR0lY4ei&{bB-sgsP8%@Msx+5j!z9lrITn?II- z1NKovC^AYx=sKFQl*rjq0*wBm}7BV?LVf1xJVF(Qjfas!B-p@ZYl z10(XZ>frBDibtv2?K|T*1GQ$D2JHzM>c!y}|vcyJjHrX^?5Omt>MRRVHHULmCZSo#W=LQ=9?Xw8*GQ`_VCA@On^i zk`5@y#UMfrziK+y{ZI-HI#KqYO6Ig0jRGZUS8)IXTbntAU@0JDn)$RB9!lgLri+77 zxj#v6y=xZXoa^aw6p|827{@h&*FO*EF~-n6>qVx_@>v#92@D`_F>Q-VU z=)7XN*Ny@x+Tt^X&S^DJ^uiFQ%lEF6AWZm$^2hzi+0mnPSD6ZX1aLz zvA$2SrOZ+;RfqFaR#V(y`&Yp_S?zkBKPcTW8r&`65h%`5EL(9DDply`b?9> z3YKyJp>4&^sXycmkdCZs+bsrZw#leS0*}*2-dx9J0gl)OP&(G6->!NGQ@@8vjK;EV zkPg+DH+R>w77`Gr=M@XKS+5#t*b&y3YMSCj7n5SF(h-b-(wka~^`SquVY~V~Pvbg<1 zn8kZ@rboEBnl=4P)P3tyrfz(`3E)ABO1@!=*_%je>C>b zO^FnFkpo?8kcT`}PNu2U)sZioO}0G{3JP5|FVj<-RFBK_zdqCydWm=R^sCbLB0FCy zq{vk9$f}<8aq2kx)lI2HGnNA$=B+bUkQnkXYHmWN1tz-IVpbq9A2mX22b_o&5h02yGwnz}e*Rt&034|ByaE{;w|2CXIKexxt3sD=fFTv%fYa6Rj6 ztpm$Vs&SFadsVRoh76H}>Iv%KCa8_$P+9WC90fhiS1f|^P_oA50m;F@`&0(P-g!WZ zHuX5@0PjTHN)E)$#Eq8GlYzP)YOu8^JfVfmQl`I zx%aOhF(gC(021NO)Liffb4A<3h~8)PsOo+yg`FANR6(3=L+w&PZA-utsNm!M)ymjH zkb{%Pe&&Tw%2wK=d-KW3t8|$$6U}qN=hD6CNy=6^3^wXc-%By>Xn4u>$Z*?^(edwA zM9nlzGfZ<34cdJkY+5y~zVyc!9iorPNIH;iNt%hE6{;Eg*83&P6fXWL4 z_o#;0aQXeKBqXd=unFRZxsV*G>)wdE&T^+BfVnwenks;1P)WxW6D|*0BH^)toY0JU z;<;ByqU2}Zpa$gUs5N9c+k;9I3BwO+E;2eC`hTl!dM@|vW10Ke-1XySy^4!Q<80}rZwH8+SQIacN zrfF~G0~zNSBerXruAa{kSt2-IthJ7#Qsd^a>spDJM2PM)fH96Mf1v5X(ImV~G3?dL zTRlA$S}+M5@;L^Z!qGbYL+zU9&o)-N>wQ5J-$QKySQU8SU{+#j9(mqtf;l(Ubuo@qB4bk=I|g(n=4!liMk>5+P8k}f~y zrgE($O-*KPjTDKVq>d>@q2ckVO3VOoeT`{OyQ7&_IKneAz~hR2YYmu>dW2r|vAD?i zd&2(!g)14!U!K*kd!0K&iB-ypk3}4@tS^uM0H{{_8W?PfwAjW+CpClc&ZVeo_tWZn zgsfvD(v*45Tby;*y88XjzVoqnaT0c4YR&6@CAVh~B%rzZ>qsWlKN4CXCT-d+i1g+l^piwjhZ`4 z*h(|0$mia*W{qIKxJ{@B7OF^I3l874DM)TsM{9=MdvS_+spwMJ-aPh1u6mTJZ2tfe zb17Lt!i*ADvD9yyh4!Byka5&fW{Ppn z(~h-w-ujDdwa%xbS|MAVV;bM)aYtH-0RmMd{{R*A z4R1|k2V`AGYQSG57IN3 zurc2Gt~|ktdu8~4EH+01hSPjH^Wonh{p(L>;j~b`V`uGHoVs464Qa9PQ87nqcRp60 zQcp^;0lw7Q*Gou7I{eUAmXY0DkmyPw;2xOwt;pwV8+!9xKbaCNP!Y9qGFu(#O~e2( zEajW$wQcWWjxR0{7oVX;Wv^}H5;M+OVoc|61)8+U9LQIXF?V}V+;;=^qNI-?o_6Pk zsx}PclTk+salx(?1HLNHLUDtd=qkgNsVV`1;-s$1NIccOK9Nxf3H4T>t}KTjDak#k zsFB$7)b{qOk(EA?l4!_S5;t`3S_vd7PEV!rRupG; znm;Bih0a;K0ai>F*2#9qzC*%~Z)%t~0TY*wAe`>0Bbe%wRx&E?ilDemtg#1B?Beq@4 z#{`-!SlMYes~k*>S0v;d)%W*Gmh201MSTAN#5zW&X9CS5lsplG#ZJy^`84o^mX)~8 zX7p!2vj@GmfU`{atlp*K8Gjg$r->R2;jvmY@X(soMDj6_xnNB-vhd}Vygpj57_9AY zVJ*LmqgYi;a(TGq5m39=ZnX%CMp_8ZQ(9PjH)?Xr8k5}OguC$KOxr_{pBz<{Y#`ID z$wq5<{KhAi$9grqF4u0Yc`gAR1!!8)H2VdPATm0dzSY42ox4{|V}1I3{{UX_q|nC3 z#iRgq+E4wf=bE${#e^>`=0*dd89Z0$JB#ZpD2$gEQ32Ul@@qGDeWGft%OtQV&V5c7 zkKVC)(>t;8p9l&iQ@=X*g&gLCWeRxrk% z=)=oimGlcOatqjU8Av0stp5OtG%HyNG<#ny$|1Rv za8sSR>qsy3DeWKs08YFQYF9nXwu2WLP%F=!Js42w-_;-$UOOxV8lEyalF)ZVzJ6GH7Zc^q}R8}fGY@zZ9;P$PWqDgPQQlSSVnkBTWXouxTgZ8e?W|uZ?ZvK>R4QCF& zH+a`qyPw3@Nun%<(HMfu^yafoX{sn`8Yw+TCnmpCN8w#6C`57E#Dh5`4yK2{@ZFTE zJk^9mzW7o6)-O8T>F|#a_(NFLEJV{u_;H^|ZV4Xs>ey?#ymoqokgVGyQbGi7FwsT3=8Jv(5)87vGep&7oNpct3nYODWKJe|Nw++5b?d@ANRkw#9 z6g{jl*<0nXF-UcddNh;ER?ogGul-!V?eHgvt)BMhE8D#dXQhzfvl=Si`6V0>XozlO zFNR<%oto6xpW;6XxF)=p%EzW^b6UebHyqbvu!b?{Cp3c#Yly;vXrXwUdXL(Zv;+(* zRcjjnL8*FAQ`KNuFwDQbCcYN;ET%HPuGE{v*2N|bzaXBKW|kG9Qb-Tdiq!Pf=~{Xe z3>KQ3nCyl~#wbl1)okVqVdM8tAiNioOM3bmO}h22v^k4oSgLisW_CD zKbA4?P48UID;LOI@C7fJAZ@4!6(uZp4xHCEF(;|}RQ7>ZfwfC63wu_AsH1#>+)*eC zkOu>~H5A<38nb6&PJStY(1CJ2Dm}$t3|oKzdPl!{^f2-;27YL?J28=;wIOOMLl#X| zWGaN9z#RosB$6`?#47yJR<5!UwlY9GXSt+36mD=Cj`=#CFshtA2J`XBjj?#J23khnaNvKm13v zRFN6)Jz%tseMi_-l+O!IGCL1KE=RR4)R^3|+o8;H`j6kr3WRdo%Pcu18^j}R}Tg-)n;DtEd+*MF$rxQROPyDSzqwSQd;QLi$ z@@8R=Lw8#2<;+0FM;!^Q)|Fqvgo3jF&RH1o|~`BD<}jJ{2EKC1;*@W=Ce#I znex>`HfyuCO;fv?bCebDiK)J3W6|OTC(E z8NfK&K_ZE!$@+b==FV9$_-SMP%?jFO_&E-Qd^KilwcTi2$LHx%dBk!t#%YXthO;VW zYb3TpILi`ic*8)KA_Us*H;$t{XdB&f+5)X4imTqUa#`Hm%I0g^jIrvY28DeGO+bGU z_?g*{JLEX24%Pf?rJpi5<~I^3;bR54tX8|O>YBZQwzP&@Rb$IB#zksi)3n=FBHGDS zPyYa}Xj|#+E!6I{Pl9RFjKrr=ytG?+XGQXcFgZA(d_UkhHA~01)ns(EQ=PfVZ~m#R z&xoMYB56gUO6Pz!)_(s0`h#`55;8)V#>A}Fxte#Y_;X2L{T`J7GW5yh51Q2YSHYTn zm7HecR+eMVRDdhwr^Yu?J3X(I7>*garkXd6uin+B)b%*y!6V9nKwd$Jcck z^j!^pm3yZ8Q#l~~(ks1IYsLK8gh)CrabF;h#9EZv%Sx6q%!K+`fhQjH!%)4{FQX}N zJeLR34;)d|x8moV`q%3>P}@R$qOQ-$%XO?B-mh|X1pFcrSm35}S>0A$P8Zk&gnV)< z=%3SF1lriXv#tdWMq)$yMPom%lE@D33+7c00BmQDwVJ-uHMy?Lk$Hd)hc)!ruHR6a zNrJ*7ErlRlH-qg>#DSz40E5(LitEJo$8?8Sw`)7bSH?4e$68f= zqT1?9wZPuofTOK!JaeW^da<>u6?|ZTD*piK=7cm`Ij6pV#9q#ExyD3m>?-Sxtj_W> z-_!jRXu5^%v}#o)0!29fX_t$%%PCZ&s;rDMPCD1nyt`(T%vjN1+zQEfr^A!p%x(4t}9Tm~Ge41gLOSkG&4J&`)@_sQcJ`M0TZj8d_ZKic9$+3O!y?#%O5Y zPSQ&oF>xz{w2(4S?^=vj<}W7RJSNoub5LufIrRVsddwTCmg?R)fkm7Wfx46JO+sNd z%D#r{NEi6%UCM4ma&H69`Ur&!uaWQ%L$ZM< z!`@!EJI~Um;)2(0Ww*Dv)g+aowzVOjo|!lU9qT<>+`(3U0JHogZK>WfPT41KHR|m8 zmDTiC^4Z-&fS@e0a7B8rA&r)qr!3bQDe0|sv{Bl^4gdm#w1I6#<3nn1rZNy8-98x_-)vg|q;+9A)d`Tgg#VWbjIU#!0je7UZ%C|fW4ir<}GS=2T&d9sI)oZP^ zWzN7d4gjdL7j}MJ48gZ3IN$F|Zj>tdaDs9&Sc=waQKXQ<(qUE30*XyEDoaHhWkKiU zQW^gMDY28DYWQGw<(PBR-kDrLv4si#e+PmfuI)(et{{VW_l3jo;kcXQo!)#BLZ~Mr;8aEVjx6Ma za;e|mg^zFGkSW{?_p5E?-jkr^N^lJVE;cHL02TUx_n|#;5_yfsUU>JaQb7~)Jq&$9 zuW}`Un0;GwL8<&g?PKdBgVQupgpuK$03}B&^Hr$EeY=BGi+a8Zo)!W*!({Lox0>-K*jMN$TgWDBbKNZQP zg}KgZXmj3&2h&z3G~!ylerSZ`P~(njXvZRyysvt(PBHIM3<~EpVvYqcEMd52thQ1s ziV0q7=s`HgYCxz#I0BA^c%fn#Bi@*z}q%3H_BOo|?R z7H}5;C$QqL1Lqj4dp%9leDf~+WT@yWHu_z~%bD-+BVVR9?^}hljuivxsL2{cpr{0A z7^fN5Mo$b2*ceEPgpW@Zi@5%gTRig3ad1InkT-O%v$*t)ynUz{?9yYBGyBnoTOTR3 z{+Ma7FvE!(kD7O<{{T<4ds&RXh4UmmOAHEk{o**acCspnJSwKx-1w2Bvx!ukZ_9raF0tb)eIZ&MHWf*E^<$j<=~kC_cdA-8p{hGL zXFDT32=}g2C3XJ*m5JMbPqd9@L3<6ElHHro(k{~2ucUZyN|#5o{5)%j$I!pyOYGR{ zmQge^n1T)w4$v`Pd+A_}+3y(yf8=YoH}>On=K1D{OUMbwU@2+W5FrwIfk*tNhlj-X z5hB0h5u-gBhG?PUX`M?S!nzLS0Ihj5;s$>hS=x{o%m#6trir!jeT4DkOip_dM_c%h zO`U>XM`Y*aMH@DsqTa>1bn9Fn)S!>tb63<=2Z`ENX!P4pJ@La4g$9hYxYVSFH?Xer z*9VHi>o#Xb)r6K8b46}W85H_Q&M0a8OQ>nnEOXqeLgzUHITUUj-;br+i+G)+cmlEO z-mDBagA74?jw>ak__oq{V~t)Xn2u03Pu{hfPNi*m8#*#?Lxvf}UQlHL;z?$X=R~}4 z0!MhLbKh{r4L*FAb!FfjeW@>w34aUAB5nMOh@}JH4NoVXGr4&WgZId&DY%UuJjj8z z^aN)Vy7mn|*4W+Z@t}(wMUSucqi(e&wzqjid&-RS(y-Ro8mEbMiSB2&c=X7dY;(#m zu18RVxcRG0hVkl>J-?l6r&_@nK8O%{vF_g0^H1uwsdM6w!Re7*L8fW2A2#49%S$Nf zoOT1Ct^T~@N$~yU%p6OQyS@)v`E}oh?|emWE;OrmfEM(5ha1QFb6M8ej}$vw{t7(; z{%e@Tc$P+8q`w~Z>SI5F{8eh@ZWhgQeIT|@K5^2$N29g(EnmbwRr!E|2>vQ7aV5qG z=z3AtmUgUs%cVwf-1VjFbqdY4ENvYtchdu{t;+hFp7mYUu^qeYW()T<*)I;0s%#bV*`UDUGvWT$3(n%U{P8tK-7 zLxSLYR(Af{vzhT^w(=F;nHiwWcSPZ0Wny?uUEh$aYM-jv>2*bvP;Fp=DmPl}yBYafo~SyCo} zqsiNxaa(;GQ)`$*w-xj66UkzAb&F4nB)91uD{Z1%x8dVe9OInP6*jnkFdlJ0x?p2D z`KD`U>Gd}w=9Fre3vCpH_NLLwjm#eiyS~*$#g)X(lm$NGkZ3+8AKjiQxQw4kt@_@? zz!W(IR%Ue9TN(JEy0%6wxc=0(e-X=Sb@IrfieXuobzq(JU?D{{V)B`<}HMtvb!R#J{k`8CR74GB&q& z6Dh$Vk3eeJ8&xteaGu%s6yb%m5(JI~JoO@*LjaWl#wf+CRm``|I37^Q;CJGq2KSsR z0H3vNuAo@PMl<%M_Vy_pk2LNP2P|&?Y)-lO6pE(S#~3Wf)PI^|=EY?uhJq?yaG8;RuA;z0tOV{z)o+v0|Ke6_-^T852Y z;IJ$RU#kX?HSVRJBOHE+yAj^Ftqr<_k1WJ`nY;W~kStIaJqH1MnhSnqCD(ki90eT| zd(?!-9NLV^tmYd?`8#@_fkfP0EQRB>Q?@b`U~oVCsfh$Ckw&>}0&ptpkYh+7O_8GJ zNw)Gy_Nf7e+jNaA@|}aG2UAhMnn`65+kqS?af94@)t+!M2SexwfkAnVB#5IWbI%=U zD#$a*BS|4BndEn3&;7$sK1E9~jq9I3F#j~B|^3Q?kQP@-?VpgC-F3 zl4``v>xcDco}5-zdA&pqaCxmZy5V9WxFGOrBP06#Sjp}ypG|V^c_yimu&3IjPI3XN zW;sLgSZ!jQ{^E#$`l)z-Ncf}S!vKBih*4Z9u41eiC_C325sU*)2Vxv;KJ-Lap ztPZvPQoOalf5U0e%LX>1F+A2ETk$Q{u*ONT8E?}WI3H@|dXdwfEq;O4V!XPtG1)rC zq+l@ZS&b*aZ5-x%nWT}}7e$2HTE>%4yrPBVfRv! z+oo!2fftaiwVJhhToPMZs>;sN1^r!Xa=G-@o9L5_3Zh*}2S-&OddY)(d2%5LQ9sKy zrP91TVJt-531xHa_!X&b7#;4SYmYKXl=}?T(_Tdq2WDIznWnL58cba*$NvDBlU~## z(yeXx-CLnW94%Q?tXpyzbdwH>zBk;4!iZ4}nd z1%<$1J*zOUwYIh_?Dpv8y0ILZvMVGPTTm8PZUH?9f7+%-+!dt$I@B+0yf{}(ANt$* z1%v^9t?$N1*k+iHd@Xh7+q}xatk*7K9>@*_W3(GsWB#vekcmubG)?(qp>T7Yd*Yp6 zUqRrH4@GBg(NC@zKP?}kU~`&sLk*>t zwr*9_rPo#mrfL5GhkQFFu7M<)jnb8kPn4Yi1KiSo3qj=DTxt`HekI9NJp%jC9xuAr zwY&R08%DR0?OcM+gVGn=n)7o#y*IDZTc~RP0NOO$Yq%rxElLJ-9YFUKv&CARI^CtJ z>51jq$fI+Sg5>taXms5TX0d}xEfX{ew35J%J?SQ`rs>2958HT|q}YL@W%&YZ@af$^FLQ}9eT_OhsB z8#<5|94$$FL$1YR3XML}4U3Gtoc{Hh@eaMHqCL-uHHj?j)bR{MU>|nxTDA!*LEt|K z=spj&o<(N9)vgq)%P%4^{wgacZJ>D6Y7OL@Xf2(|Y2EO#rh1-h6|DaNS*Esc!+3Vi zDQ(nkHy1n>{{Z4Ued`(GUmxp!Benc3?eF32hbG?Lh~9tZIp(o>)~5deUv<6l7MrF9 z(-Tn|z2umVW?4awJe(6&$E$db_gJ3L>Q=V4@jsCOnUyk%0Laf%U!H6<`LzvWL$cEp zB=g9MnD@>}KK1vHA9!BV#kx?li)1?0o?hN?a3}u&B|gOVqVl!$8+#kb<5;imUhYCO zkhoGlJ}CA{1TEjteEuNcsdwQ7(adj{QC-rR|{`IlZtZ#J-5gw%0b`hz` zmPXl?_#Nw=_gk6FB^rX-F^%Q(X8mPYb^Ytq@c3K$YKjH*#l`K%C8b#zK|cb$PlaAk z>ri)j2zEF$10p60;F{5EqRldbKUZvaq)Tlirwh~E)~wcGn>lhvdM=QYDOC+Ie4cSmw2u%& zYY&tQ1JjXOm73W@9CpdZ1_ds>)pp2KV0^K~XYcQ2z2*z1kL)Wms=+xt-Av4Th2Yb; zq-w8qCuip7B_9Vgy7uWOh^OK@j-s;G)@on#e-Ov6bHz8dvV|~IH~#>b=Cf|KB!N;Z zD`^@{yX5}>DlRV*2mt;-0l(Zw3XsErn!T-JBhwJiy$d9Ew(|n<1wP{{YKc?KUxN=0DL-9OCb-^o&|=)f=0U?L@_=!o2MS zp7^62cdHO&WLH-`A=PbC72b+DtiAL%4jcuydFCj(sK1ao6 zuQfNgM`$Ew+t3lxoX6o=q>L`3e8hW3IsRzaw4FCjiG*kgJz364q%sM2b#eidceZhX zT@iEYr}wi%B8bM=;ZA)clSwCFThcNA0D9aN!xH0$B-b`=ImjlUGCJf`Sgtoa{?(>x z!dT~TbIGciwka)vj@3)dSo&lG?Ntea%5K%8ILi*SR5s~uGt816278lTw~3qcX2@0G z1@36YkgACtLMZw{>rz4}L|fkGMBk0=j^7j&#l%u1k)oE~GJA1QxVbY11BB{MC`ERf zSww0Ao-!!ZwiIil!jy?Pz~}{EaU@ny;~9|pQ~{hZ?Oe!@5vd>nmNYS)jQuCxsgw*73CB`TR-~7&D_lZmeX0oobI?$cy1iTZ z_D02kZ&M!iYQenuk{)+s9~Bs_Rs~|C^E01{y%-YyV})FCnu>&v5{;)DIR?1)>g?=T zZaMAVqaD;n=1AFqAmJEvYU*A`_>&O?HhQ;85>{+gjB)}$=xSFaZ97hR?OrYmmKfSP zW4%=4YoBI35mIHmMyF%pNf^njM9vH3SJ1U5bl$TdARLco6^GSrl^o3y?Tv{&d)7LQ zN`wo>?|Or$C+4iTKa{mMQb)yeYzrw93c+SqQ5zvZh+=M@V< zhTwkncvG6xgHc7m!RtlauISkJ6-Zs(F+{*NtEc%6w5>%{me0K%Y?)GfiW)F>ARUGc z9cR>v)MrQ9jDUZdZ)~S-Xd5`cig9fTVbZsObR?kKIvNAS216Dzo;e+OrT`f8!K~+s z?=Bule5n={1S>W;#T4`Ph}Nu&zU3>l9)Mz!Noj$>J!|UP--IqA(je4QcxHimCTYovJFN!3_e=>B#4fzA{lUvcU`^riwGKT&2$?aUJ& z(pLt$c+b<0{{Tuf+2WE>woT1ijXH4@d2>oFv>0tJ{K(skbf(G?0A97OW;1Bpi|E!j zF{?=+9R+;%TGz35%Xp3mJSnZ(bM%ZFS*>YSdX!{bq5?P$JALV~N)tw!+TzSS3aZ3s zindr!RXox?KS#aNr;#F=9@YMbU(;Dlf5!LT74bASI=!%--bM?!HqtZD)^)G7^r&Rd z2dJc8EYw#`*0d?zkR`Rf)!cjf8A9z*{_4@FPQ_$vZKE0VzCo${ClR=qM_NDDi$zyth1t-thUOPdWw##v-hr)!HUBrGuA zWJe+X#8sM(fpED^FHE<%k+=qFF^a%Pcj8@d#7=DDGfkuhw^;3n2@xlpf98$PZTh~S zrSJ7COI7^qnA03%cQx}LAL<%)(2-%e^AIj}lic+c@|{~%*DdcPhW6U(IaJ`6Q@1~Q zS#fnSoWk>~%rTTqwmomK&1r!$a@c(TQ7<=TYESy z8fhSoID(D55mauw7-^Ynx>`@|zonWhdgi z-;bW{_SCpr;02QZ093iTlIl+;1No{X<;!;aR@|v`$_`d>^p+t@CZ8u4H`?FJ`)pTzT=S ztlGk@ZS@kOIuEEgz7 zBSIdvemV310A_aP>hAVPqLO)~CC90l`~LvawwjgAp1Y*UrFfFl@itCJt`oJ;fx!l` zwws}u46KUIGK-#Z?@sKZy40^=)3nka^62bceKKzkTif_HZ3j<}FvS5e zze4gaJCDgV@yi>a(nWw|0P?4TDg2i6@s1>;yf5I*CNCA;YMN%-J2+!D+I6{qG4}qc zSoSBd?ORmPEhE_N<};@%+p&sBmvKZRb+uJw7~C3;U0H6ntZcvmf@z)XJ~#BX^(~&sY&qHb9zC7&>$Vi z#T}>U)0}=PD5W1OnrgT9w!i=hqM_B+Po_K%y=qxlyA`H`Xwi@TEMNZsh_6$7YslI> zpMQGwIz6!R+L^A}M?8FSm&y0LDbthNrI`GIr%RaY0fb*k=nBoAu&ZH1qSG~2a~ zWVm<~`jwYB{rXqXwAd|m1OjMA@$~~(+Hk`~@kWt#dbUxzEV6Kc#xi}VFBV)!VRp+n z!-0^rr^nhxpJ}Efmf<10Q|V>kgYQXWistDclTe+m7$^alrDvitqmjQ=< zed*qv;(KYWT%)SCaqUl)X9R1Swyg7l^FwZ@w^K;3Z<}sz?j@1?9o$s!(tU13j?Ikk zySG96)_=zq7rHEwLvZ0v&D|7IFD&=qc!n{ z@eZeLBbI;42ZF+_kH+$&0?Jv(bz0B3eLnMZuSqN=5UQ~p8bd$#Ddo(UY9Y@dd)Lk_ zJa}#)K4by0#`Nn)X}&H#Zrg=rjPMO#=^)78@&H}LpPG*g%T{(haBo}!OMG_sqv5#| zppjd09^$)m*0Ds+z&3OC6cZio%Y~~jNF;;zJ?LpjQ;z3~*m`Zm?T4IEHa6^t(zx8+ zhs_Uf7&4Q)AaQ|B1Z(LNF$%ne6vbCt!b^T;1_oFj^iWuV0JdEA1DdEf^7jFdPfv4R zl2!zWmoqT+AMq8YMYOTS5Hheq`cu6ux|~ixX2lA8x#eQ=ZY#&7vx8Axk>o~&iRw)W zHY&pf)nZ?Mt@agUMExoPjAt0dcGlKO-OB7$LAm8_0*a9^MHw&_lX2!l-jalo2_(dg zgaaoBwMk<}ba~3fW`l76`rFu0QsvT78)8`o+?px~nIcq_sR}w!p1YZyfk^#sa*=`C z=8$;=`X_SFyF7OIr&n_m=Q{N(wP{6|i(n5hG6vyCC-bXieVc+udO2Jb#cBlM zKCW{_oCXGjh+*?aDH}1?wF2vYMo8j~fpT{b-hzM-F^+pt){Io(^O`}$hAH)%WQ_f( z6{rC5(9?TqFvB&dH1RFtl|4)Wte1;4k|l{DR*|GQA$b6N)`n)0?Z|+SGaj7K8g;I< z75Ytidu=Qutb0GuHCg;Jvbu+d?=(Fcce0+~!2Gl-#IAq%*UfIPrEQ>B6FVoA?zg zJyq}E^Na=sZd6D%wm#Iwf~K>%y?GXE^A)i?EMAt!ahip{hU}Hu9^&EQV~~bYar@H! zZ&CaPoGv|5v&bSy;{}+L-yXt>()D;E*q7+TJzG5w+N}lp?}{|58Ryfi73Vgi5=e(C zryV{`e9Knx&WkO=T+gSOuJ-}H<#I4OU{l+;H0y0sQ-Z~xVyj)q@*mN-5Bt_Fd{y9S zu3TN%5pf7~2IWZP41%O^dFfc|+ovrKm;FKl<<7UK&jo{@P1FN=#qGIAIIVQs zGUCD=QVAitPc38wsg6#l-0}!)8vN5^{p(r3XtYafo2!W*cb5;TK+grc3i^kH{5`06 zcJ4h(#m!`kAo5{>Bn`Gh-H76`tyvnI?;1@%h8Dw1%>FH%n#qa}MY&%~Ok1Wg$P|Bs zEbM$YqAjEemnU?xFV`dYEPInz!)TE25XOj%a(0YoKQ(k#ix%SeRXmbBc{7&g9TFNLj{9^Ar&!x6vW{7^I8M;+$q;t|_O*eMwLeW|7UG@}peah#ueS#M`7@8v?dV0zUc zw$Tiz7ZIKqV3IqImE^g!DGj8eU&ctlEMW;|{i{o&_%iNB;oF=^r08u+sc9 zW1yoQE*5*E^4?H0O5T;<{u{V0p^}Ivh88?X{VBj2AspKp+ z<08FIL$8xqcyq9k8pg(`^)ntCT9cx8#GDb2^6m|Hm&;4TA`ds8RdG@TnwQ^SJ z79Ud+*i|?FB1XFWCA@&{KBBzhmtN{NT6_7kOTJFMYSD&w5M5kC3&;@%CoN00J$lPb zwF?>sy66b+Sf3L3@>xTzko2!mJ*plLg6CV1ODt`)oaM!54vvD__gvHk&EX|8l|$OM z`ZtE*mJG;@aqZf<9i)17py&=W%?o4Vn~Q7JSYY!YC)dwG?@!O8+OH5O>H$z0vl^dWsLwTKBL~gDXuj0>T3i+w->^$Gq~1l#Vn}!;%kjo-WXuq(r(On z_xPi{9pQ~lmMJx*bW(Ccb+4fKFT)>(f+_VNhTwCv8O3i>*4g621XKK0=Q=N6!kr!~ zYYSM?&J~S8U!f+*~VMT_A*Y36r1Noe$}!hb(N3v^K8HN7s?op3CC9c)`I$1N@tTQPXwk zbs5}5@yM&xt7HnMEU%Jl-_waS*yMX_d`3<|0~MJ5*2!lJWi|i z4vO6xklV!evb=Xz*7?D3@tsa&Q12>a=!~?2CNzd0^uRMk`Ha zq}tD|UBi8C5W{YXqg-)Jqwwv5N@UyxxH%?ckUrG&FxE}vX8?jio|H6-dmNKm9bDa<#1p z3wc7S0EnZLiXsSAn{NC8^%}P^rp9?a3-u5_qeIU+K2E?C`&5QrNdUDGL<>SrasEf< zmnumy1(+DE|PdsV%lq9D!|=OE|l`-D1dZDRRtCcN5mKJ|ei1{^emCmfZ$a4n1D9G!qN`V|pS+TL59P z)X?xVDdDr9dV^X1A(`>zlgT29jt2;+22pv>a%xLslROqH_Ny939+?j1KS>o7jhCvD zE3%0^wlRQ69St!Q>kB%@&WO^WAE(-}x{JrVDqJfJ5Pj=mCa)#5hB-q<7+`vMVOhO! zKtYlKM&ptQ;{KY)#N(wCZzks*@j*$(0X$Wf>{F#<8Zjp_WK@X9Ca8##P7O|0 zCjzWXA>vLuQ87>X+jCS}fK{_oXuVsI^GKr!DZuF-pgS+}}XiA)>avq9OE?B)<-xbR;5_cK{j!NMkAb3OL;H>Ac34_n8h$s31N@D zYIPaID|vDB612|SP?ZQ05LUDQ0FQ-!qg2bR+d@kh1P(~5-f>BESC71D7L1k_kvWEG z$&yA+s-vLz$*k6+e@uXfz_!Zcpip@xf`I5KP z?a3y!Sp#@1TU46XVim3}@a)6tOoM~_;($#q1&x0j1)SFGaU4e7cpoN$*6v~RXBQU{ z#gXcAaf)uF4L;5Hd5eV^9OQe}Z89fhu<3?H(`})(gi127pj@f#%kHy2A93376qz~q7Vtz$a(fh?qg(@~y9@|sX1wo}=0)~wO>H!U@#(Go07P@Hr% zpgxGgpuijfSsxQx+>6+5Y?P#`NpQU!eAd1*y3$Ev?HPFX%L{&tXB4mSGQlUAr#r&m z;0GVY32CifM;P<$*&KB!YV`3;Na`jIq@L@|8i$>5+S-@YEv0r}O8EmNo7#cbtR~hh zLtMnR*BK0jTP?TzTAW%;w`54Gg>Gp7044=f>GgL$^zMcl(?htDc6)^ZNWy?W*`}I) zogJj5r3iT+y=Wh3>489A!2{+)pD+$Kp0p;DPjK-7pl!!)m3_*wj{}OySon?`F}2RZ zI3c@Gx~Gk;BRf_=%zH0d)#@27K9xXnUHPDHp^k7@YrSLcyjgVYKMih1PgbY8E#&k1 zrER(B1!DCpUN$VBOLZBERR%iurFRf)Y&4GN*=t#V{{UA?z6%K0a0MPZe6fO2BQXtR zO7zPbD^AmQ+#@tms`p%0)vV$}%xnBo`?W}zy2XvZ<5!L^EgHIXUQgxvaynITX_1G? z`n~C6>ck9shu*D&QIQBIaUT_A9@-cXL;|gH>Q_<-IG`ZbAUr-peAODJqYl8zc@*0Q zQyXd6smu4TR&oth0-sfSuyLN1lG0+T#Io^_Xob{ePzgL$uc1kLrNg4}oae1nG}(Nu zhmgD+Q)M#2QEL!1d!=HcrEjS#u`9~&&sxP8-+t8M+EQg@1 zMwhBzU)`9jE!srg&lsMWs9hp8gA4(O|vP6x#TZ(^0$s*$&`6<=yrMf86W>IwOm z-a_^ZLtS_`S+s?2E$$lrWjQgvdHYtvPZnu*lZ$Em(Ka{%Gn#Q{sV%|@7C9qR({RD6 za&J}hI6Ob7-O9rINV)PHVU;?rX$7BxwT}q+&JAlxx@ObK+jk6^2g^N1--`QH-Rr0r zX2))8731wUS=Kbu{i65qtcTQF^@G=%azVACO>P&r-D50w86JSH38Y$;{oBe}%8$Rb zW3-JUPw;k~A+%?n@zj}TX8Oy=SN5(2euO!-p*`3>FG9yvI6m8b@wen&H2owXfeNKL9urZ=H z6=rO7ts79*3^2_ue2ZvY4aJXe4QFGud^EDZ zEO!y@p44;~H?p92(_u*gP+Pu9-UT7zkAb=SNUyk(zx|-!cg?yNY>pxMe zRvPbA#^xUbxuan#fW&d0^pekFwq3nLtc-hB!@~Lm+N=H|=P=kOB$59B6aN6JRf}|u zK7B@iD$+gPpb72IdII|Ctb9P$#!tz&m&=!De{oyi?$%m)7W#UxmWz$+{{U+F--%$- z;F0FEia~Pky_uvZC%GcCd&Z|WwUcT#w%THBZN-?mZ@+5G-uQzgh%=K}>91s%FfHjl zsCFDzE8DdEav9C2+)0vTZ{~-4iAc#}e|oOm7XVS~Y8iPIi)(T~ABdFko^fAI{+hxd zvU#kymQX~KH&O5_=QG5yo-taF0BQy+sV&QTN!$i_`KO!gcRfCuiygTvKQdGLk2PC1 z=HDxB`_x`!>b$Y4?gGVWCEe`FZ)p(A%_-WdKK}LFUS#Bzq+!nl^);B)yiKO*nw;8h zw6iL(4II#Vf%hK8$S~3I#v9Ve`dFyY5gi^m2-idbgkTX7Mc%+f@@c>*u@hmNo6@_J#eF`tgrO5 zz<1h=GT+B|x^0tYBP6kwnpWyaUc=49>za>IHl*9pPyDg;taCrB ztNeWK{{Z@v6!$VGg!DP}9m5NAbfsg@xE<&ibl(~H?^m?4*0nFdY0}A={I5bH_rUIP z(!TR|b!zYkB(%3Ezd=ZqHhr)-rL6>Ioc<}DTw@F{SNEqEknaunZ%gpbjGAwU?Y|Fd zhjDi0?tS&1S4` zlJIVi92(DAOnoy;Ddi}S1XCjmGVm)U;k(9&2;@9xgIeKpAx}X4#XO7ko7P?6&nJV> zR!;L*)SbMmNJ#$xoYtdUc@}V8eI}^0h9=tXMi0kI#lG9;;}tG}sb0t>xwt!R-H;KL?q>LT!MICJLK~I z^+u_t#dmH>%*5l3v?DuD6Qqa)Y#E1YX<_1sOn^TJ?_VCf@a_Cp9&MqVUvx+`LBuT`qrUr!3>0;;AGZ{)5I*pGrOF7R;PL| z7}9HL91}j*&rUN&X^fLwfKDa_vZRHFU+lFj^ zjV7N-)LK`O?GE0nwB-K)6}fFz-rD8jk$_>y$l%r;f2o%i`jp9e6fbVBR3eNx{{YQn zte;!wdiXy^)NiA=F-c`HWjp}2?Nd;{blUJVY3#zA>E1fibpQl%h@Ae3Fbzjk)RN^2 zf*c+x*=MC?m)v5axt(Th^D-$vq|*y0n&Wg>m6ZOXYK!YjNC=i`8?HhY&1NpO>)ZR5 zw9};)cCoe^P(4gNg<>3SWwx_{UwdVT)Z4RE+FHdVvEEwQDRlZ|VUtR%~Ns#(O0!r;gefr@a3)P^KNe@m>$UZ0*JS@ z)2wbquI4X{k1@&5^IsUB`i1yNJg8)u6mS)I#ap2Gk@dForg_34;h5Gu^{d7{>-gJ9 zNBn5V?^QOnWEd};39pnj{j@G5j_1rP`bo}fO{Cc0-vpWCjtI^eWpGIQRkT?fNvHFo z%s#Bp_VBiIFH=_A!XbxZWc!m=pb8F0sEXDwgiyk=ov_Bo{MkVx_cTMgpaU!RHBmC0 zC|r}%09HNG;+$8iMvQOjiZ*6NvS^YsHwmp_V=a=>Y$J^J;`kp(U13;O^Y5im`O)#(hk8 zagf+GpMzR*5Y25ciL;3c5U1>D^}d!!cSd~!pd$vUMj6GWTSb!)+StbixVCUW#G;i0 zt|?r4x0C^um~qL*YSFI6D&TI~d*ZEF-soNziu*x($>nX=F_QwXMIS#o6_~eMX(MNq z0>}=-jyW82{8sb&bEqZvg<=37Hr7KFhS*Lg!MQ)| znss7maOa$$?b^7v@gZ%)2RJpG{Ctv!M3Bay`bp0<7-5=0yh=)w&hL7)9^Bp}=O}Zx zrfRHjIXD$nhL?LRf;b^*bI2l_pAKq>QD;SnH*!T=5o;ZzC>4*ftnRT7)bd-v-N-9j znY6aDWfu+zJqq-orLeS>vgENHGt>B{We<+(n=;bFZ33&D0uvv=q-?%gwtk`1p2oiP zbXx{u`vX4Rppnpb#VWt>hMjT%L|D{x0A!z&S-iF6_{4FsVA;a_*C)V~;N`JjOn(8} zETT!~mO-9JKnL2X*1Q!Qu%lY0=~Qh}4l+J#J~(`zKZuhV&sw?}fg4HWQ@Q*dty|l) z)7TiI3zE+uAHc0gg7h61#1^tm9huYhJ4O*rf?6rS{Xias_oEK7{uo%3P`K150NYr_ zyyu~F!jJpX`|GI^Qe%z0$$de{!t>s>J|*y`x^AS=G+QJVTfY-?cG3h#C!*)r4%Ma8 zG<_3F@Z#w@+WtA^8|Em)n9satwkw}qew{g*`D`#9{$%7!A?`;5_N^|RrMpAs6lWWE zXRxM6z_Tu+1iD4)>RL-2xg%__k7i!~0C8VIxY7l-k%T~s7aR<6N3nm54}-iQZzVVS z$q`zs{#~|tljXgIeFsswM6h^m&eYqq6&L_}R&B4NSj0h@r0j|b&0D8h-cP*Vzm)?I zL}$0nIxvG%mRmRkyegg$k-_^`Qs#HLmmISi+<#G8*}OXoBPzY4h>)?sD0=?&kMOmd z-d-f}Fk}auatN+??K%kd?+^^?KT4~}Yo%iRnm@u5fBJMpO0GsjvA|!wBYU;m z*12Oa7Xjjst9#KYv(xLkzm4>bBsHdwX?Lw^F|R8GP34C9Z*R4Hzr+vXzZYHa)$K1{ zHRdZMjI2?QV7<@Dt=5IB-2NR=FMPbP7ytr(Yj>qvSzO!PE!4L%-AXW%MEEFAdhagB zmd_W>yfNV09WLCqziN#vm@5E0sQtPc-RKr}F-PTSnsQpEaMCd3{FXe^-5)}>(OqY0 zCB3{L4>IMqZ3p9~Xv>95%|cy1)fFxjZ;{8+1#Ztw%j}{%nNgis@)(0xEzZH0JbRN% zZ>Emg>PW*97mdVHjZ0M^ZP!U5uA!;Mu2e{;?LxBfr+7T#`c?LuaP=gHQkrTg2T-<-dy4=^g?Y z4R<7xxBSMs$!ndZP-^l|CfK86pJBxuuwBW?8*6K4;r%|$F69FpQxg?{PfTFdVtlJs z({3&X!gG<*rK4JY2{z2Y5%F8yLF|IC+Kcm=%HBm3js#l;AXyJEg48Wifg4k#g)`WaM3?pcBgPy`aZX7Z9TSj^N!Vpxw?+Uit)&43o=@)C3kPW{TLP++9X$HC8 ztaOu1o6Cgfj1J9KHlRWeN(KJ_lvaCMl1qrO7X*$DX-97hPcb7Q3E+`h z__VE-g@j64n^*H3YYei0}X$*16{=wtDYtELL=O8%{liEV(kQq?BMQ zX`w>5>?I>1`4q=f@c8nZE4UG#n$|O~lxnvjV&~L-gWRn~ha@^G4!`5?LNiqOfXu$uO*znkfdRA{c^{#vId?QaccNZR2&7|f;>E)r|*2lv-cZy;z*9c9KZUl?!1Mk|t zx#mM;p<|5!{{Z4BYlc^irMFn zWWE>Dw98=a0g=c4~`^!^k*Nz7`S3b*X+LCZSWEtn+b`_yj2b0i$s^dzj1d})+5le76;<7h-{Fm0rb#DIv zgSCtoe>1Pfeku6O_SYFvcqgw+R%6DVG_ml!D<#nLOLT}Z4t=<+#lE4cYBOpYrG~4z zXpvCuO{lBe1Lm{WdMtOBlInW#Gs@?3?mtn-Z(&)zx6dEc&x*W7s!#ao^{F(Qd9ow6 zf*{3H+>_AIHrHMs(B+=$-We~oIe9l1Cwr6k?MroA>Hh!`B0Nfo(mkBuQc2`Uk>;Oq z1N5lnz6Z^7y;o_>hxfiPzPPwmF$sjH5yXj?C)fdBp?p6xe`1Q~QrQ*KTkVkn>2H4hZ(AA-}3z#G3cP!GAT_;yzR0Pv=e(v7o8Y>wc6 zksQ*m8d^4^qj_7*VPxJ0>=tZrE29u+hi8)GPkV=TI4l&NIIoxZw^ur@x@AL@Kp}+( zBaWvYrEcob)Qi!wf$H)CoF$pYbi7~vqKt`Xy=UNOsCaZra-z@pB1*T zCEmRIlqOOL_}<-t`%w2+1Jp;QN#Gx9^XZ8#(3#|(RvkCB4}N2fh-38iIq6q4*z(<& zlOaJL@9&+I5hzii|R`W5GZJUVPz8*8mlUf^Q#S5gai#C4GIH-)9rZtbJd-se?{ zOh(6GSr${y+zv5}b3rURg8)mm1v}9+onKdsOB_jOY2N1Xwk|!u>T1{1^nU|K9oLE_ zTmJwNO1ZbvpkUG3kMfZBZ;FI(uXv&2p63>}FUT&~2nWBn+PU@KTy*1)FLdHK{3GG{ z(oIV8>%>><&yf%1+o|jc>VJA&Z#wF}CAC9s9j&d^zycV~Ra34r`%$sn_(Q|$@!e{6 z7q_ec%Ve+H0*%rlZEEQ*d^=@zb|VE%z>Hhk#z@Bu-loMe+Rf)Fz1g~k>QC<4g_Bzr zI~5lT80@MkMf3SgL~g}M^nt)NEknb4yt<4UY;jAfT_Ogab;83AdIH_+OKIRaA7}TS zM{rypD$HPgiyArWuOrl$z~0?W$PtMn?f~Q;y*tyi9bWfEvc0pkw-(ninE+{hKn~=7 z)vDCI1Esa7I$gx}Gp{UUK4Q!F_NIOYf@RQGOS?d~7T#he(~!z@f-AR^mKOg2NA84L z)~Tk60sK@#;WOQrgNm2+R?Z8b?V60cp`UwMkVn?NK|gM5E#XVseGkSuG}1}=hTy>| zEu3%T2lvH&OZtPN{{VJ}Ob;@}4ZYrHE&dqf)jE{*EPV4zv4c$Toz|gu8p%GRFX3z> zahxbPX)*JI%>`|zu!yNSark>E!08(BTlYDqns%HON8$$7 z_V}jQ2rexy9c|{fxt1@(@~aua-Twe_@lCWJ8N+`mu-6n@UopUT1!J5400x@gSjN#P zS%g4zD_MUKXtqiRw3hSRU%)Q3**8GnQh$k}TsCVpZl*v$Jv(=*os2A6 zSK7TZ?N4rWTf50g(=FX@2;rDvDYc)3e6(3LCRygkIN?G2cdnDBFoQ?YH9bP=Jcxy% zfn*hBR7O(3AVZq>vW8z!ebWbK$MGQISfbeCMuxZ12ZRB_NtiSaW!wEi*9=G78vwXVS)!AvEz+Io`a4S(=Ub|79PH+g9X@#c*?hA@aBa3b%sMKm zB-hfvr{B|Qb$u2)-9{UgxMKN;dUlN9AL72drg$pdt~~v*jQ1!v3ft*=R5mefgtkw; zbeu*y{Fn6n_ix~<+bgGpUqG>`^oJzAE9pKG(ju|6+V}4$W0Hk_gYau#sp(J`X^o^V z{{ZA^6t_~_u~_Y+P&#d`WQ<;|JC4%a@w~`R4>Tp-nr)<#>e@t&pX&J(k@d@nn+&Or z)E=YaX%-!(*UT(2^;Uf1oYrT>494bPE<#B?D<05Z$skeO<2kL8AI05ox&kF`)upu3 zbn^~OL4fCVV$H6bjJ|>3^t!{{10lykc&)yh;d^UPyJAs~YQ78Wdqn~`Se}?#z6+bn zq6)xKPx*DOl1Dq$s~RhNG$&vBq+2Y9jw5v48-d7!6z3Xc@g4GTqJPOTf6HR+A$bd+*$sKDqljP04 zjrH7sEUcqA;8VRXMv~SdWHK=MHKEe2;({@pGj}GAl0?SU0*qQ2pUblt-~o!s-D|Ny zc2V4QVdN>K-P(fo-f zTgP(@ExdZbsxEx#T|}%@V;y?eD|gehn5M$&NwOw6Ilwib(rx2wqzpLEG`im2Bmr4+ zM{!Ox_+6VQ4o5>rF!fu@8z^(T^qOMvLW}4FHJ{S1Bvb-Ic%y~WH@$iueNm}6MI=^7 zQi-oJxo&vCt#q)NvJXRCw$hbk4UFU7uN_+NglrPp%@F6(IL$THuRMeq?N`DU82SNO ze-r8$3>TWd3GEZAK-WYd869ZI?)=PF2GVwWr+oE2YgeZ+2sd=1HBVue3EQoDheE8m z>0Ye{h}p=_HnOVysEbs$gpkBEgRW~MsNG8U4dmXvy|_5Z>rJ$kiBL*B$=r@v_|0jS zg_|QFU=P?aaig2!nMlservP%d&JtzVYO{$Bv<;Qh#Xe) zQ?=A@$XM;<@{s2Xj%dpbE>(|p=@I)zI@W!ieBRUgcc(+NJ4-X?Jv!E>N$@(wCgMK_ zYmcE+86^Gt3f4d)fzOtTg?sfTy?d%d0|hbzDeaoS`n60Jx^|F>6|JmsV0~EJ?ebXF zwyyV%#x1a0kFG<(KNPC<(98I%>zLtGUW~vDeY?`T-w|2HrDA574&4F$sMF(XSZC60 zTPPmxU-2C?_ocIIl1I8z95A2+k<@|rtfV@|qo~}azLjAicVIFX2%ju{hgzdm@Slk< zub$RTM@)_k?Jk9+a=!`({Y_p=#L7PtT8SpRxw}IHp((iF41Cau;%!e_wSwl-Q4W{T z5fR@10AgzUFAZrLDG@P`QM`>oXywBZ^RRHE?@ByT;-$75B$7FX2~+cljy zX{u}TX}WBUsp=0EqhkoFJlVhHU;Ne{dzkvmfEryyHFO?Yd#GmBfQ0H%6Pj7H<#E>RCi+-+a+^r_NBLU&=hc%y3VCCS=q|d%19++J4fz&3V1)K z%cR+x-w^6eeK=(cV`jLGPyEbzZ`!_tZK25uyEVP8gW- z8w-#<>C76>wy%9B5ZOwII7I*|s2uAHMd^)C@=_N&sdhuC?=VsoCn1s$rv1CL<^QVoevLIcpDs z%idmJnIN`?S$xO12ySk0dn)t*Q)qk}qj-g0IXp|Q$zf~*T|iM`LVFDMC)%fLXRMt` zip_6iktvc{M82R0=~3L)zWYbI)h+GKlcMQGcX>eKN05$QPjl@@GFG~_OjDrvGs3z? z#?t&hXP(kdJlAiMPkKMZn&pOrXs@bDs#p;Pj5t#N0I=vjYbklCc#_vrwa`YBJObiG zwzRxZN=7@mBjf$nt5EQEho-?L{B|pOs>JDuu4HFv4sdgx-A*fB+{1V>;^N~-miF)R z+Ud;RUhIIUpdR?AO*sQ<43og68s*lSBm7PC$zgZph|t>t>x}TbD$P2^=)f7}{IUU7 zBLwH;wHfWLi#Irpgv?lX_N8`Oyf&K6xq;eA<70@Et7ndB)RwM@OG=?TmZdt5n=42s zwrhB09G8q?h^qQiD=(;c8K?2me{e?@mm97Lw{W{8Toq>a=C(c}*Zlbntdhp-um@Eg zNcW|dNby~?{(C&GHoF|1)IOo62`)V4>sg(D8u8z$Sx)G{Kovmak7{BXS;zqLX=S7Z z9D&xg+9sXm#IAm>;MFa)T#z(A8Y5AcBr6c9-yLa9 z&-D5+9_Yeu{{SF4qQ<3&XV$jWbnC*u--nwa=(9Img9kY*tFqN2;GY61L&)D@UhlFijYaa2XFmMX<`sK{PGxE;kH)NC!A5kZttdB=L^hP5};Z9LgSMyx)Q)|>fo zgS!CYtCeMlSX-^U0~`*yG%l;ESwyOr4Z%3g1*__RV-_oCdMjE|^z zbVAXViE-aP_3d6FBp6SSX+MEyacvUH*=@Krv6>MoVTMP&YoBq8eTCCwCJ;(<^GBG} z52RHwGR8LU=~fp6b*JLcmsWQ2sSgt4?O8ofMu<(?SLXt&G|KrV zrKZmW`_>0wr#u{SM_Bl(*4jwzs^n$IIH?Aj{{SSeO;SL9S*UyIBUU8fQu~crAxtRAqScEve<;U} zbBfHZ#Bq`_k}5iuxXjor7L>Kd={EzA+}A$3bmx|a+Vx8T(wMBO*ufQ;x0gLf??oBP zfwc6epJMuIB86oITPNDM`YcSRbM>WqZmj6RO6Hx5hL~gwX18XI!YjQ7BqXi~q?fu3 zZ;(b$ZaP-u$ay;EtX()99kq+Woj!GIph#uOZ2r}vu+iE)asI1a29~)86nu6ur)t#a z1?yRq)Ar!vxh1$k(-othH9&9$CcSV07_Bm05^j)!X`~8@yyJ>VB*9vtE~Kdu!2=X( zAFE!hQINQ=n)sJjP{mcbG;Y7F7FG&t9}H4oUX9$IwT`-Uoc_;zGYppq9l$M~)w8yN z_JNFGP+k|({FuQid96!ABgQ}7QVLNU?Z{!xdbxPPW`V@86g{9cCs$9soQ+icM+*qF3py#;LbVoMPh}!Hv)4_5N z#a|cGJ4=_iZLt{$?#c*J`_<;m5teot>(5#bP1PomWJd*5A5P(n)q2d=0>)N=?wDiC zT;p-gQs_%swu09~y`CnLIig=OHeN|#&||%P{cmE|(pUn$uCmb`thw^#BmV&TBDZ%M zi_IFB+N?UF^vwlt63aZ3BxxCct-|AVR<$2GpHIBgp%UumM{WblD{cV%dkT>ABqQ+l zvRx1}vN8d0u{F5YH61R>#((Zo$K>QIDI0_QW4WZ45%`AhPgl{jyL}H#mnZv$=>g+F zGF(U040kn;tEdZ_bo*h$TgLlX{1PiV{v_9~W|G4~c`Twnmyu*3k?ziV ze${7)uXKq;^x9p_+N3t@i7fk1=DTsf?V43)+MJU`4YreaERwF}1~NuH@m&0JwQO$u zJq@;*;mtzQE6GlwdcT`|q^hsjo?4^fy%$T0M3+;)j_xSEdohC8?%wsC(>x>Me-cQN z-v0plCrw8JN$%td%AoR9e%18pXV7fLo|~iTI;ZyH!b_b=tX;g+9dX8Rar{>7)-8~H zTIQQ|cCyIqV~7BV7lG^twIuNuh#EL17LVj=H!fgDl}_7q&#BMODYf5-{2=!#-VT-> zMQp>}%M>Ww%6&1b5p?tzqMucPZK7W zr!BphSffP7asl}#=9d2ePOp4bs%o-pIt96#ONES6JkPamKjlzKWs9P6ytti&*hC zpb95}+fRocsdXFVOn>nUoYvUZu-@93!MO!}k7_OhZ#+TbIZ|mHwzn60G-lFh;E-`C zakzffp3_?5-tDbZRe4oL?STLQiheTMUum|tQ$sDxerm&=sknjrip}`H!*)I;vs(-M zIR&Vb&0it5Fl=LrZEJgQi}}RM{{S}JW{G`41bIG_^Hj?H#oF?QN|rpO#B>UFv=*o~NqrE#;T?^qNYS&*lQ)mH9l?;&!Ug zJRNVNX`h4A-C>jUUEL;SVeQ9CENHE20!=&J0zqbs6$YHxYIdbS^9Jv1Qw6=WW#&cw z>hWGxg`Y*eO=0dMl&+TJYC;z>M(3+%xUD^tL87d1Y5xF;l>z+GCq7|6t39c_PirZ{ zy8gzjdpl#6-S_6799~+4db0us*-}4~n#XItCwOl}b44$f8;Jts8qnT;5(C2@=Q*T0 zy`8?P8Hy!iA>c4Io7CJ{`xB<>5M8`%jTm9ju;hKdYh|a~GmOZ&Ud6ip^_lQ5gnzVy zCB`ITayRpe((AgKT3fhA0f6gL)=T<{tSyC{iwRx$=~@2(3V4n?t7QCP2>9CVjDTws z<6UN3+vi=`PSPiA zmG4AdYLZL&R>v71RZ?X(>sNKCDjlV;-qqbVRE?aguqWoQ21}G|m10loCaa!#{{Tx6 z$EGV=S;y9e^dq>d7WOwDoErJgi(`8^4=nQS_RVXo?My&riTl=>#nOK zD6D;rHIaZ*x|h#3?1lbnC6j6JN&f&E-aO-s4wWlSJqap`0Iu9*@H70;dVJ8^t{unR znh9R1poteNl0B;(sOU)>?!aaT^$Pm3+{FDEO)S=IE$4xlFweKWX2mu0CDh)}3FfX( zMNVk@JwolG-80~J70Gn1x0w)(1DyNOi)7L=j9>#(OSH&;5awAI;*Gpm(lR!TeX8iu zEurn2SA98rfKF(r$HOQ809A$Qn%}6*SO>Ly{{X^VPnP$s@L{xKx^sOo*VY5Yej&Kh z?tn;SkQUqM6+IJLy1m+EibMysKGyW8?jLg~8L3#sYiAJUb43HK+j4?I2Oa5!yto*p zNp~ENgdo!ketD)LS2qh3dz+;oy4T|6V{mYLRURB93 zX{KSxI3Cr=uD~D#B-K~@xd^0>dI2RM;I=C|kB!+;>L614%|%x}palgisHX+_V|)ng-!yXq%EUIHu{Rm0^&eRNmG;hqV@IkDcCGTp5`1$J&n5tfwQ^ zr;eX$+5Z4N*^|%=4TYL{zoWTL8g|r83T&C<4+!0%?b0J zQ&N%=cPXT=e)EI0HY-o!8(cF5T=QA@ZOb+`^saXMYC@aHnnmPuMfgg~eaw#I^U1^V`@nGu%EImNWDZ`H#(Gni43SXghWhmpZ`_z!y4_Oo*sT#{zm(4!{oPj71(7 z@Xe)!5bB;GfO+GadufO)4`yNS{{Tv-#89)g^IYh>DP9Byt(fynr* z_|veFY%N|`+}oqFeIdO=_@{xd_+@6~bSI2`sQo^{2O$nAkCv7f z9XjDW-cni6#(;m3&tHl^UDh=iG|P*<_6ruq{rna_LR9mak0<@07P!9O6YJMK^P2Bd<$hv!5S~!y4))_+q zj_eOpNTb%Q^(G(MHR$eT=pfze{wmX^c)IRXSTw7Lw~*k@?S)nMAoE7*vkJUR{XDk3 z)US0r>9rd}aUm-Rbn@dTs2C*m=AUTy`sakaDPd`4r`k)V+U7L4d3H$IJg{Epn$T(b zHl1s3@a8wvLg32Zr2hcovU;zCukK~TYnA|Rgn|9*#UYty$_o!-4&_dCPm+Fr`rTdC&VWG=ugtc2+cyW!fM}mKP0{2F<(qftIt)mk@T1lIhV@%Y~ zvVrkHT@bI@hiyRqA(e`i2d-+|+ z1LW1#7kY-PDO(6J7egZs1!Kvt7KmFxZg+;ud>Ri@)GqcEw_K0hM#r* znuu=n%Xuy^CS(~OHLJR`@+57bkPrH=mHz-n^-1Q9;+PZ>HUVLbiu(2a%v%@K2_u@+ zVzauUO*R%Wv3iwUE^ z6`R&AmIBPN{qap2r&5wdgft9P{{YKLhNXH*S0ty+9|g!OwYcqrL@W@$D~@P71_wV= zjG86^B#-DA6?wGw=|x$25IFNms}_fr#^zpwijVebF_*xtG*?gi-+ z)p*6Ui%$t{bW|J@TN_6Y8l2WyZB$Mq9G{wXX?Gk-7DJC}(cTQeG=}?C5y%9x zZC`o{OQ_`aM*FixrbGAD47uA?t<1U3;00&aap25mU((*`)z^p$+_6pQ*Z4 zvB?~R>J^)sZ&wD5vX~X?S@QO9_i`Y}=DN3`KGj{QS040IS^0y7uF;y{z70X%$Q@2N zB8!&IqC!H_*&$~qIjI2rZOS*K9A=tXUR+6lO%r2etT`F|sjNC;@Ib{t9A(?;VrqU% zw?#DK4LuW0`a1&;=_ zkX^=zIUmh&z3p$u15Iuhf;v#hs;$Rby7uv1@T@AEQ@T-Gp2b+sal;x0MRsHAtv$V( z$e@rYkL@wA$sE??XIUui8G$*kRzSB59JmQxp$(G#>PV}hgD z(H1th`fI~1_jeP#U?g@MaxwS&R@mL{hRb9mzCCnc%Da7S*Pm zXVq@8=(dh+sJ_9Sx&AAcjdb&Y^c$7cp_1=po|#G{Z`3g3Bz$xf%GUPY+fjwCa3f5! zNLvdVe9(5Iow}msbov_2s%-wEqCm$d@2@iGy?P_oSCT8-n^Gnx>zo$OzifT9$=~ z_u_?%!d@NGG#i~d2`{0xxtLr@W&src0Lne-e0Fvh+N3gH!G9`R#1<%`xMYcs{K`6-d1Udg|Wc?ONMO5{xYKa#!aSnWo@-&*~PR;fW-)yN%?OAPcA2ClL>p>6%PG zsT!`Sxvez&YX~|n^X5K1&uU&jr;OWw72=rZa@(9iZarM{MqK!DEkTaP^;I#2Y2)el z#cJM`a#?xfe->VAHu`>(dvf<|xe(ewr;l^(`_}itspESkn&ZW~rHt0QFd<+A#@&fw z$L&CPQrh3cdNip6$9Jk-Hv5Tz*|_#!{v+C{O*h0^#;s_&m9>lMMah%@09Fr{J;IK( z&1b3nJiFBNb-1|IwHu3R+en3smw`bR!1YBx^@pD8d+2 zcH7Y7wH@E$=6d$hTKGr8de)nBcMav>hH!B@ji4WO9@(VUz6S7hgl!$t-D@+yS!a;0 z(d+=PplY_z-JnKyia5q22)hD~+z!={mrd8>xK*@*#^ofFU}GlIi~dcTuBlQU9?-4y znPc#THo6w6B!Pv|QsiT=UTWmhZ=knpy?4g?waig2=@JzYMURu$6#hLn%T2T|aV%Fi zL~_d6RQJVv`^CECnzYerw&6voY)Q0##2(*jt;l4(QF`BuERCWqfsO6Rz$o0Gy)M!( zwEb@4I|!|XwdUa{n|62O^ww8a@U&Wvwjt7qvz&~AK9C2vt+$1IBHk3#EoanqCA+$k z9nBIZ1bOIlT;|)Y+>yG5Z9+9w5*?spZYZlOX)i86G?Dk{XuEaYY_bnlMNKA1P_baR zuSp)?cfcF_;`iaynx z*6vc~*~%#-Wb$g;oib*OoxoOGSc#&MqjKf`4;5NuU^RPt_MT6|z!N0pnXoF08+~CV zNW#Y8oqugOgCyEZ)Y`%#^ACx!a1(_F-19tu>{emm02djGndgO-^UJxM>N?9`w&!)rHio z6@gJnnnf<4;|CNqAWy>0D{Vkn*000<4f6_1cd|xqc9X!ZCxvv|c73s#~OKsbhe z=D9vvkTKStNocGUh$Q2hgbNfz##=uIieo<0yg+%Cd{;(5JggdFs%fcmfFSwelHN%c zm2SbfY*tzqsOtX!fwXPzH)6g~srZcDYT`K5ND1bT)Fzuby{TTB6MX7`3Q4r2t@(R?YQm=Re?`6s<7w2mu#l^#%P-D$EYw^P6bbggkQo~f;* zA#q*5vsvRHjMptC-_wj$lgok0u8go+{-5}L#dj$j$jwKkV($O)@nNXR(=Rvk5?9}%&ox85l*F)}z&S+zccEQ`0%Cf{lZ>OM;y zt+e)kA(JOPsMPvB?}?Tb{LF*#NTl(-xRYy3@rwEN=CM7_ zLy`q2oIAeoaC_CM^sQ4~Tjkjwez~jsHw<>NG@uR6de_cuZW<;TV}V+$4M;2_YxM0! zq4bG$Ou__hhQc*011C@_0- zSwQpMv1MXM-iNu#i zm{m057gy&rLhU?Ngo=A#Va*I}BxBQx)Ch8T6=1c;J8AJ+%)@F^1d8*a1mGN2hFf#j z0;0CLJg7BfTFxEgqM90iGj2)~n%N6A3&<5jmMD6PF-pT2W@GdkBHk%eu@$WvdXLjw zHb4#*u{di>v}qhjR!r8$!*0>QtkXhbeZWys-m-K!t@G)M(oB(*ImINngaz^z&ZT9F@9M9HWkbTyos@v=us2+t!P39C*tmm0AOaM+}m+Spv>x==2Y%6JDA zLg`G>=2Fe@YS0$*RhCdhWSY<4EyUR@%swk(x@xHDR9xA{qo~bu>)U+#eEF>(arHBO z>gb@y)+<4AXher%WPPeJ*}E_Wde$#4zD0{GM!uZ!P&%!`oCRa{twdTtW#MYi{{Rj& zoPb3$@#`11YR>NFdDn8VTG;6*7=qnudVh!fla?RNIgZXa7PmRZEzx$&5DGmcMqVpD zadwe5+}EJJ+`|U9qZ(+DNGBq_K-*mYU3!*ToomI@J>xB^h~iPf?s%pi4b^4UKNzzX zXNZDZJagK})i-wOi(Gghgyb zVZFC^uScA6@uyxTJ~D#-MbYharLrxU-sXQ(5BpN7o+a!1F_5+~KJ zAN!Y!^Wqdm^Et-ZzbAc^LV+<>5V1GPDQCOdf={{X}`k!mm1?ylu- z53-;j0Z4T(73dbv6}FGz`+NOHR|^b3hQby-IXsbAxAfmITlnk41Q^Z6rH0^KqF-M^QrCNxis{gAv!!oMMz|-VpI!&f$G`;oEBmx$~xjaB~}X0QSeV zZ$AkIg^Nd}YPRsO8&tqIW8CrHnJDW&LO-Im%zG4vvnSzw^QHS{)jFP5eLHbH2&Me=(3=| z*n9%9S}e`KzM4bW9WW_@qDB#;vK! z8BW&caN`EGV&;@R$g-|t?~ydQNG!shmH#zDfU7*StB@c#gY29&rH zd7-+jqksD}%KJ}5P|+ws?6sc{>78RQZQ=BeQ#3IFDO?u#qiu9YH*Gb;w2aus@6rcq zW|Fdu9@H)7sJ6((m<&tzNw;&$0IR@Mi|)T|wkiX7N3SooGwEN(WNT1$>U;U3ThVwss{HoEB~c6K(xE zxYa*1R=K#BJzdoX8`M$Xd|WtTsCmW^?Hs@@r-1llmls|*@X zr+-dtbldpmiYcNg`dPOCKYHKTtTvGWR40;0 zKeb}=)UTgv7k3fd?$e`{Wf>$qF&9o^H=!K#TEv^l_W%!hR_JfG_S@tZ8gh7V{QbE#zEjz zyer`7XSj~zP+!DM4nSe)6(%D}@ZO`YDVi9}Q0_TrTx5N!TAzllw7H`!eAr3lfazbO zbnPzM(lrDEG4%Enuf#e{t;!!M1`knM!Q}ZygDuUvByb}+Jr}ioH$~F!uOba_b}9WJ z^Hk`%EOy5Vpkv;)7Bj_eyKn)fMpWAPX5Danuv@t_dD7xV_Qy8Tpn zHH9!7J_zerZxF$EuIdW~td6mRmt)*}QBlP34cznBG{VCAAo(OK5BFHshv*s{8fB`g zpxio=Gn#KQmrba(Rix{3%hw(0`b8SUk%7f-NXstTUM5+x+n2R5OO%d1j!OGgdX}Xe z2N@aZNG|V|X8gwhd(nM-Ut0S+(xY<75ARl8>Su2wiol!LB5zFmd>Se(NXj;=ZXYI( zHHm9lpd^6AVD|4=U0UW=EtwdubM0FD&9W)Vr|c^?sl^|b!Iy(Ysg$_9l@H~}-6>tv z(oVQ$B=^l5sak$%5y;E&Rl%n?0h(NoYM?6?oBphWMZs(%!l)$EQ)+esIryQSq(U${ zQXP)YM<8v$`88~oX&PmiWOl0m02bhS$g19EkYN;>5P3*f^mG(Owc;q+&COeLcze>5_PTGnlQm{e@23!=SJ& z3Xiy=@}y)mD>76Jla3B6Z>9KoE($xZ>}kfEqC*MKl%V&(r}prqV+tvp#`VoE#@^d# zR2c)>n#$@^u%Lvg5#f0?+%xif*IDU;tw=PERalRaRKSfMPU3#_>+qu)Jen5jEu*Cd zC`;oOJy;Y>I+!dm$)uAbJex%wX=dXG6c(D&{BTLdFgl7Vb~TzvW>LVdNM%u$L&vos z;$2Be?Ou;iLG4+4hTG2|&=Orbwga5eX~yxjB?FceJest5>MIa0r07_YQr=&k#8>pHDnpd%@rJ{12sw)LXvLF z6N)MFR;r3zfkbr~#b_7Egts(ZrLvQgU2UW49M!Sh#Jq4TH>@&f)rK`6NU9}84Uhn@ zeljvRBB+|-Tj}Pp=cmTKBI1LV6?W-G#*#`sg!>ZVuI_1bAA z+Pu6DDzw5)N>E%8*QH9qn7HDJlTO@0Y?Jdv+1iMYO2#x{Xq%w~iuDs~fgUT=hs+;B zzq64vjVD33zJ_H6d8d7dibgTGa!nJd{{T$1jZ;O7PdY8Ni^jpc=$Nr5*tb$C^csvh z_NgVVnWz|Sqiv$-90}NUR6gG|pm?q#Q@zOwI{yIXvm}P~Uoo=&j%c=S8eJAmIe98de&Rrs3UgLdvn%-zFgh3=^Qy6`iAP# z*Ul{OwT({p>gMZGXaSIfSnaYx_9}73KJeP>P~OWe<^HR2W{OU3R|-By9jj5PUtV14 zvMNgjoMVwIAOwA@E2wzt3k!e4+T0CBd~Iu)kL9Pp9qSfjQm>URWVf2{SiSNzt=omw z=>WR_0Ls1Uq}M+eEuFrNV9{C3Olzo582m%zV=<4?D=?RLdiCS@DIe0U5(2-Dz1Jl37@d!Ex6D2IQwQ)zhvS73 z#_LtmC5&wkZE|`0hR$i<{{V+?r@1rBtVo5pEF;|NKjrKy*}NyGM*}m@s2Q+-Hc7V= z?~#gZux|QbXSA`hk*%QBZ?#F7`scZD$Lul1Ydj~R*u?>r?BZvBT1hfmvu&kCWvCs5 z9(ex%&1>}eu?P#hpK3L%^lGIH*l=<4K)#C$xbui_gHrKth~d-!04)w% z*mbP@TI`Z0@yC8^9bawpJvD#ZtppocK^W*bp;Jq5GQrr99`C-Yadsc#wEfsbmzPvS|Vx)E$*Gxbw8)Xb6kvNKtp>sC8`e>B%8 zVzCt%%fHsOD{0^-C#@IeLPkLY?rWm~_e&APU}NU1n_X*TvCx+HQ^fS7Sf9WT?Z zn*B_SZ~^24LNJ@eO7DgxkGHj4HP}&k^|>4j#8FOKAc@Z0muUroG%UGj=KsjUYS_^B0Sc$;SDjNCy)_}Isd4es?o=NLX z^hjlogg}eiig|XCT*;O^{2H7wLkP%hpPG)Pw1wx|hIm=qk?Eq%%zg1yHPk~i=v3Py zT(@fCI=gxkd7$sFlLrZr?NHON+{gfoD63WozK-K#6aq1d!T5qp&>3KrS%+No74(a% zq2+qW#bWh_vn)W);(H1@F_E@O%YW)yc|P4K#hhY3Kp(|MB?@o{9jJz2i=0*(Q+qZS z(rFy=mvDEHpK3PtWh{B-g;1v(_haIqd82A`Sb!4_G5V>M&xqW{cXd6MvTYvVe7P7` zA-0$hOofNFFjsZGT6ZkbFWYq{x7RmjJF~Tiw|Z}LV)KFkKeZ~8!{$jdGB6(EkfQeG zXFy^sC>7M_v|xPZ132qWq|qf&={|rzdQGbMdj43Mpg>QtHJ=o{yin@6GK|!Jyo;3^ z+!OOz(c!&oJlbdMX@#GK^$8dW)IvSYJ_}dLByzaH1*wg#iFM8!pK32j@VZ-_(n#{T z4vH~A6B-lftEbe}LBSM??^9f!YSo5sa~K=|Dsai>9xFE; z+T1oWMLg5wjvxy+^GvFmqORPs*OFBSo+w%MIAdN&rEjc8(&1E^e3{0J&tHlX@qrvr zQBKnHw1G@5&>mb=K-=4yA9e*gw6+5kOGz5=pbD*Twm%>4qDE?!K)GFpbp(>)KG3g$7;>#QUXR8AKtZg&Y~g6=}0Kl zBG{+3Wv*__avxU$wOZVu#!8y`_Nc_o#(LK-y}ELLV{+26;N(`0&M|;ZW3-25BZFG) zJ&6N7D_qDrw9Yl!Fe=qwdVsn0=Hv?}K>Q!kmF`D&3n})00~u(W*sRE8~A6$o+Gt&)o)?9^H^;GNm!6}1HBdDp9ASOT7-uB-fcqW zGwFMtBL4vLsQ&=HZ!T{9mnv7&R4nFJCNu!mkm?dgcz~s{2%`T06vB_-QC1K*U(P2q z1GV1r6kr-A+8d`CXFPTkgKS2il0_!g@8ga#s77nohFBDrWBb-$R=r#|y=SYDu4l5@ z6kJ`iJ78vwn*RXs(SZIi)4Awco?E ztLmHs}?sL2!X5OkxbnQ}Q5Se`O@HMSL{ zvtynF$on#VLmbJmsWOi694n$Tvi??SP61d1C^@fVdNVZyIrnqA^1mGcrK z0^Ze;heXyUoU{NZJZ?2(FR;Pl1278GbRDSZwRqh?3`svV^L-D)dgI6h*DJIBQC~pO zyfd*!;$j;nO2j{J4tA<6h_?kGJ z@0TCF2{(+QUJ^~m?^!)VN?BZz=QO>vf}DbXisk2BJY!uijZsf6`(}if$MG*f5ARua z(|0yG{whh~(&Ic)wB%^x@u|3S5eMHi^21(fR1wy&vFL3Bj1Vb>w6fZ8FhHhixZ2$6 zQ%N2&K=;iklH)DvY?I!QTx(JVA(x-MD3@7n`$lVQTy0kD0zLieH&^9Tf&11{8^>h? zk_oFCX{6veKNX;2*Fsh#j%p342)K2?9@MvG*lfhC$J-QKT0PzQ{LRsW)~p)79d60a zHxNn1Foxn8fbyit_^K@Y3l{Ls&i(68rT9!+uc1yp)ZhhWZ7Zp%cI7_J4FbWz{$5f(@T4xDZ9t*r z1M4*x)MbQyW{Y^eyU>%{DO0!_u!OkQn+J1|?@JrRHsSWj+4;>|du0rn%N5OIb$tg8 zS{d_`kSi_88)&td2?jPFwHqG2wQ-!+%Wc0GZsIpyeaA}EY0ytF8@R~nOASv( zNdvWL^qAso797@3O0x1#Jh82QoVzieD{-2AY!P?^BCUBcFx3unw^9|K3LZ)e~n1hXxELAk&M=|*ohQYM^1PZMsb>b zYkGiTYo|4v4J3jhGSsH^p-he_hPY-N9w-~cQ|diwqX{pfSzjnCmfC-r!CEzngT-BG zI7i9pLuw2X!8}uBoz*(gw@9m=l$PpknZcr|9KN4&oSH!_YVs0A9?oQ8nze0J@M}2S z^rF!e5J14Ekjb?MC~JE>ds7%~hB+0fF`MmKoRP_)rn)0M)wgT0O(mLA4PAT^40(%p zp(HGGf@{|9TeTM)MTa7>C$|0*T*TyOITWhu1|y2tJ*gvwp(fK=`(n4^&ayGbG)=*$ z7IMhg9GYbwkXZ7x($7v*z}i2Gq{VKO?U|FItF7$hbCPjdF=~M_SG5jaDCr29CV=`(L!NGCb8CT*pYDw3_P5N%^t z&3T$QQHj767P?Y8(oKHlmfY+;eX34h-9tX*Y#P9LkSa@*J^E3y+`K!E_C4!8e|9Fi zRc0KX_0RHrZ-%48R;S6_Kiy~?mG-5&9p$ukYBIZk>Pb9|7DcukziL{ZGF!(ij zV0pl-T4cs4ygO|K-e`dqKz^f6;JR2M+Ru-g=DBpy#@j&6V6Sy~Or;BBo|T&1_SjzP zhz}CxrKj9Uc_0z7$IWK6$OYUbn|UPg0IhzDY2+|C+P^e$w(9FYO)ZX+(sIs!YB{t- z+v;Lyy*lREBLSFa6l>nvgg&8OoQ^l!AA6wM`I(S0#S0ystTK8)P&>6d)%7b>Ry_3W zUo`PIi3DNR5$hcZJu5cIr#81SO9F5vQTDGkwP|X7Q>j0C_+7_|Z%YyQf*Ah*jdsN9 zH^+D80Dn<6%Kl&Dto&cs*suIeZt6m}*a}oGP1|k&kG&w$wAN4z%*;o(xHc!%j>O73oyX9Sa46XD`cam8`GI;uTMMh&cF$vwm2dQ&YwLkg=`i8C)9l6bG zLqRq2kbOdwUq~cVNtXIajsPPx!rfiRtkFy;F*lr9bJm%`AymT}C-CZ^ng-+*Ctxgo zD;1<}Zm?*7Jil{YOG)Q$RH*r;mij{~QEne>?cIcOsq59O-d^^Cjewo^?P8T z@ZQ!2MbGU|?KHTPZWEa_ri23_ej8FPfwGddY21QzI;!)Ez za+vcJoz&GcDOEWJwO4V*gXyGNj@3rMrqv@ccEwt~1gb|`3s<-)oKh(DCrP%G!LC-d zBXMtYw2Ea8pcRG)tbLr%CJMGiHn)w~^);zhHIV8XfaZ%VB~A@zE#Y+;4s-2JZ42!I zt8;5NAZx}k6M>olTu56OHKF_>$=133xk1PktY<>lmcT4r6iRl#IcN2a=ADta7L zhR1V()};4iY37$m+eZ|-;_RxN=QLV{-`;=@O=mAJP?MIS^()rFq=f zP8tDumh_r38@J$dS=$iA)>xG?tPL#GH3uZBoPDWm z_oRApkF`>Pq;a{154}jn+Th98c4+vcDl$$x;)Jy^+n~l6{MGMy5-#Rt=eB4|n(`zC zNx}J~I^LwPM&V=(dr*3=uCg7Q0LOY%z+5l+16Ak~Yd#^6Lc@Bg9Bs!njJ(&|&IdU; z?ON??MG~ViQ_p(&#;v1E6y>3IARnaGb6b}itutL05F(Z;!``g9)+B^y%*fAfYv=Y? zZD`wNQ};B&T}fRy#TeE!t>P&p^r++Bts2C?=117pJwr)`Oy}B&i6?#*HzVyI0L{I!xQs`Gwf9;yhjmo&{-eJPgmRBW+&stdrhVO%el>_AS zPOS7f)z>b+_03W%PW0w!M*!lREv&_T3|5NJG>xH5g0->fu$1kbR-|*a^VfT;X#jG> zd(m-Rv#-_7X!R=?*FKR+L<$MO!K`&LzJ3?oTD{IkS{fe*l96DfGS`P*sJD%D8S;6c~mc_tu4FXCqPYYfbDRx9vk?fWYo#Zu4?bVyB?Jj zrMFyFOe(&)c>&`!i`I0DtNDqHg;QTeZ8VY4RUg~-oYy^WMh{EypO)&<$GL}dTFWgc zM5JvBJ*muSk&JOxh?I=y6&hY53OHPm@m?z-`go>Dsty;L=!-q5T2^fyL5Aj~9+I26 zk3Y3KwtxdiCdEBPFkfZ1mIVL{9~99nizqw_xnzut4z+w)Bx1Tsz-6)cuQr^gsHP}} zrT`sAX~0stY6Iz7C2ZAuQTZ4+TB2!4?N%ioP+pbh$lz2&%umv4d%xwPr7q2y3gOQu zCXJYG>BTO(Qb7WuUp3Cxz~-VN6P%M=XiGOvXuBI(8NlsSNn2TZy)?!fX-5Dby*JbJ z{3s-6=9w*;fzq{%TF$Mbx7VMwUml*PqSK=ShTv7P#G|!1w6@<(!N?TOJ1mS9qoPF} zab0N@PALWQX~2$@1;w7gc&DClCaaxRMK~3ctcGgQ78DdNh=BOG7?spCi8EzSm29;aJ#11LFvarVnwTni^q;s0&t$|iXrxnRy zBvXS*?sFhGq*{bTgPhiwTjM#+1%GRWCl#9%uavQX}pa0k78AH>${CY_M4K2cf#Tf)cwQ@`r zqAl4$8LeX!WxN^36m(Xgjzv{#B2j`-jw-Y|up*9>4cuxE0*q;M-l>-joYg5MxkHYW zx_e;2@y%#th#IA>LH4UO%EaI4hC*;DJ7~lX@y5L z+Sb61aZb}uDtb`~X@SLO50OH`Q>9+AHZk6r8((^=NJ4|}S_RJ|QC3J?bgG>JZj{4M zKnSKQ@KQmHaaO!uo|M8UcPKcoO92A5!7);%gSpNPFuPKQmQ5yeT>5Gg-JPbWisNh1 zS4dg9P~rpaisyCEeZ9bL)O<{Yaw#-OREj<&V_W9dEW=m=Z8*hxtF}Y1@m{U60xOd8 zePoJ_?fg+k>MdTcRVo4a0tfw*S&O}97Lt2V3)CyAy<3lkOt zy$<@(lou|=y{pyg#p<;oO~#=#vIi`9Jt@YSf4NkvVXM{ZCs$37;WadoN=%`%#%U(4 zq@~$o2;}o#uUB4JW-qi0uclN4cB*W=CoHY#Qbu|j^?H=mS@>2+6mE?P1Nf#9X%Z(J z0Iyf7stipwKq~n3qT?G$uUD%DYUpD;fIoUN-$zs<0AyFI)u^fEow$uaz~ZiQ>bzI0 z)u2~d<=58v_!G@%95oYe#AB(iSF0@<#T4!VRpO0@PnEuN)`fN zr8?8?cHrPwtJP1cw6>7?KGl1m0N1P4(Sqxi+sLY;oSOA|v1@U7m9g_xNh@Z(UZYkb zllK1ry%QS}E7j_`T?f0jE~Mg=O=iH71$w<&qAOUOaf+9g_~~A+R!gZH9x+x6c0EOU zy+T53ZaEpDjlcY&ydRME|z=Mn))W1=3V`4-pRjEuUD&53-H1ib|+5t>h*e&AOG0~ CkEzK3 From 5326cfd333907730b0845ce0a5f85f91adde875e Mon Sep 17 00:00:00 2001 From: thomas_young Date: Wed, 5 Apr 2017 23:45:41 +0800 Subject: [PATCH 060/552] =?UTF-8?q?=E4=BD=BF=E7=94=A8commons-io=E8=AF=BB?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E5=B9=B6=E4=BF=AE=E6=AD=A3=E4=BA=86?= =?UTF-8?q?ClassLoader=E7=B1=BB=E5=8A=A0=E8=BD=BD=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group02/812350401/pom.xml | 8 +++ .../jvm/loader/ClassFileLoader.java | 66 +++++++++++------- .../jvm/test/ClassFileloaderTest.java | 16 +++-- .../coding2017/jvm/test}/EmployeeV1.class | Bin 4 files changed, 56 insertions(+), 34 deletions(-) rename group02/812350401/src/main/resources/jvm/{ => com/github/miniyk2012/coding2017/jvm/test}/EmployeeV1.class (100%) diff --git a/group02/812350401/pom.xml b/group02/812350401/pom.xml index 06f43adeb1..5311bd3c32 100644 --- a/group02/812350401/pom.xml +++ b/group02/812350401/pom.xml @@ -38,7 +38,15 @@ annotations RELEASE + + + commons-io + commons-io + 2.5 + + + \ No newline at end of file diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java index d143302ed4..185adfb6a3 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java @@ -1,5 +1,6 @@ package com.github.miniyk2012.coding2017.coderising.jvm.loader; +import org.apache.commons.io.FileUtils; import java.io.*; import java.util.ArrayList; import java.util.List; @@ -9,31 +10,43 @@ public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - InputStream is = null; - ByteArrayOutputStream bas = null; - byte[] ret = null; - try { - is = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream(className)); - bas = new ByteArrayOutputStream(); - byte[] buf = new byte[1024]; - int bytesRead = 0; - while ((bytesRead = is.read(buf)) != -1) { - bas.write(buf, 0, bytesRead); - } - ret = bas.toByteArray(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (is != null) - is.close(); - if (bas != null) - bas.close(); +// InputStream is = null; +// ByteArrayOutputStream bas = null; +// byte[] ret = null; +// try { +// is = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream(className)); +// bas = new ByteArrayOutputStream(); +// byte[] buf = new byte[1024]; +// int bytesRead = 0; +// while ((bytesRead = is.read(buf)) != -1) { +// bas.write(buf, 0, bytesRead); +// } +// ret = bas.toByteArray(); +// } catch (IOException e) { +// e.printStackTrace(); +// } finally { +// try { +// if (is != null) +// is.close(); +// if (bas != null) +// bas.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// return ret; + int lastIndexDot = className.lastIndexOf("."); + String classPath = className.substring(0, lastIndexDot).replace(".", File.separator) + + className.substring(lastIndexDot); + for (String parentPath: clzPaths) { + try { + String fullPath = parentPath + File.separator + classPath; + return FileUtils.readFileToByteArray(new File(fullPath)); } catch (IOException e) { - e.printStackTrace(); + continue; } } - return ret; + return null; } public void addClassPath(String path) { @@ -41,11 +54,10 @@ public void addClassPath(String path) { } public String getClassPath(){ - StringBuilder sb = new StringBuilder(); - for (String path : clzPaths){ - sb.append(path).append(";"); - } - return sb.substring(0, sb.length()-1); + return String.join(";", clzPaths); } + public static void main(String[] args) { + new ClassFileLoader().readBinaryCode(""); + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java index a7fd9df5e9..4d4586fd29 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java @@ -9,10 +9,10 @@ public class ClassFileloaderTest { - - static String path1 = "haha"; - static String path2 = "nana"; - + + static String path1 = ClassFileloaderTest.class.getClassLoader().getResource("struts").getPath(); + static String path2 = ClassFileloaderTest.class.getClassLoader().getResource("jvm").getPath(); + @Before public void setUp() throws Exception { } @@ -38,9 +38,10 @@ public void testClassPath(){ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); + loader.addClassPath(path1); + loader.addClassPath(path2); - String className = "jvm/EmployeeV1.class"; + String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1.class"; byte[] byteCodes = loader.readBinaryCode(className); @@ -53,7 +54,8 @@ public void testClassFileLength() { public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "jvm/EmployeeV1.class"; + loader.addClassPath(path2); + String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1.class"; byte[] byteCodes = loader.readBinaryCode(className); byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; diff --git a/group02/812350401/src/main/resources/jvm/EmployeeV1.class b/group02/812350401/src/main/resources/jvm/com/github/miniyk2012/coding2017/jvm/test/EmployeeV1.class similarity index 100% rename from group02/812350401/src/main/resources/jvm/EmployeeV1.class rename to group02/812350401/src/main/resources/jvm/com/github/miniyk2012/coding2017/jvm/test/EmployeeV1.class From cb4d2814c179a044ec99f8f2b7eec17a79bedba0 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Thu, 6 Apr 2017 00:25:41 +0800 Subject: [PATCH 061/552] =?UTF-8?q?StackUtil=E5=88=9D=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/{ => stack}/Stack.java | 4 +- .../coding2017/basic/stack/StackUtil.java | 115 ++++++++++++++++++ .../basic/{ => stack}/StackTest.java | 4 +- .../coding2017/basic/stack/StackUtilTest.java | 75 ++++++++++++ 4 files changed, 194 insertions(+), 4 deletions(-) rename group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/{ => stack}/Stack.java (74%) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java rename group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/{ => stack}/StackTest.java (86%) create mode 100644 group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/stack/StackUtilTest.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java similarity index 74% rename from group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java rename to group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java index ddfe76f774..e126eb3edd 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java @@ -1,4 +1,6 @@ -package com.github.miniyk2012.coding2017.basic; +package com.github.miniyk2012.coding2017.basic.stack; + +import com.github.miniyk2012.coding2017.basic.ArrayList; public class Stack { diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java new file mode 100644 index 0000000000..80ce820417 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java @@ -0,0 +1,115 @@ +package com.github.miniyk2012.coding2017.basic.stack; + +import com.github.miniyk2012.coding2017.basic.Queue; + +import java.util.Arrays; +import java.util.Objects; + +/** + * Created by thomas_young on 5/4/2017. + */ +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) { + Queue q = new Queue(); + while (!s.isEmpty()) { + q.enQueue(s.pop()); + } + while (!q.isEmpty()) { + s.push(q.deQueue()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + Stack tempS = new Stack(); + boolean found = false; + while (!s.isEmpty()) { + if (!found && Objects.equals(s.peek(), o)) { + s.pop(); + found = true; + } else { + tempS.push(s.pop()); + } + } + while (!tempS.isEmpty()) { + s.push(tempS.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + if (len < 0) { + throw new IndexOutOfBoundsException(); + } + Stack tempS = new Stack(); + while (tempS.size() +* @since
Apr 6, 2017
+* @version 1.0 +*/ +public class StackUtilTest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: reverse(Stack s) +* +*/ +@Test +public void testReverse() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: remove(Stack s, Object o) +* +*/ +@Test +public void testRemove() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: getTop(Stack s, int len) +* +*/ +@Test +public void testGetTop() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: isValidPairs(String s) +* +*/ +@Test +public void testIsValidPairs() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: main(String[] args) +* +*/ +@Test +public void testMain() throws Exception { +//TODO: Test goes here... +} + + +} From 178e2d08d57585028f14f69e48f6645edf5677b7 Mon Sep 17 00:00:00 2001 From: xiaobo Date: Thu, 6 Apr 2017 14:38:21 +0800 Subject: [PATCH 062/552] jvm --- .../jvm/loader/ClassFileLoader.java | 92 +++++++++ .../jvm/test/ClassFileloaderTest.java | 124 ++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 31 +++ .../coderising/jvm/test/TestBytetoHex.java | 29 +++ .../coding/basic/linklist/LRUPageFrame.java | 177 ++++++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 34 ++++ .../com/coding/basic/linklist/LinkedList.java | 191 ++++++++++++++++++ 7 files changed, 678 insertions(+) create mode 100644 group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/test/TestBytetoHex.java create mode 100644 group04/349184132/Study/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group04/349184132/Study/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group04/349184132/Study/src/com/coding/basic/linklist/LinkedList.java diff --git a/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileLoader.java b/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..117e999ba4 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.loader; + +/** + * Created by wang on 2017/3/27. + */ + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + + + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + private static final int BUFFER_LENGTH = 1024; + public byte[] readBinaryCode(String className) { + + File clzFile = new File(getClzPath(className)); + FileInputStream fis = null; + ByteArrayOutputStream bos = null; + try { + fis = new FileInputStream(clzFile); + bos = new ByteArrayOutputStream(); + int len = 0; + byte[] buf = new byte[BUFFER_LENGTH]; + while(-1 !=(len = fis.read(buf))){ + bos.write(buf,0,len); + } + bos.flush(); + return bos.toByteArray(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + }finally { + if(bos!=null){ + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + }if(fis!=null){ + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + + + } + + private String getClzPath(String className) { + String clzPath = this.getClassPath() + + className.replace(".","\\") + + ".class"; + return clzPath; + } + + + + + public void addClassPath(String path) { + if(path==null){ + throw new IllegalArgumentException(); + } + clzPaths.add(path); + } + + + + public String getClassPath(){ + StringBuilder sb = new StringBuilder(); + for(int i=0; isize-1){ + throw new ArrayIndexOutOfBoundsException(); + } + } + + public Object get(int index) { + checkRange(index); + return getNode(index).data; + } + + + + + public Object set(int index ,Object o){ + checkRange(index); + Node node = getNode(index); + Object oldData = node.data; + node.data = o; + return oldData; + } + + public Object remove(int index) { + checkRange(index); + if(index==0){ + return removeFirst(); + }else{ + if(index==size-1){ + return removeLast(); + }else{ + Node node = getNode(index); + Node pre = node.pre; + Node next = node.next; + + pre.next = next; + next.pre = pre; + node.pre = null; + node.next = null; + + return node.data; + } + } + + } + + + + public int size() { + return size; + } + + public boolean isEmypty(){ + return first==null || last == null; + } + + public void addFirst(Object o) { + Node newFirst = new Node(o); + Node oldfirst = first; + newFirst.next = oldfirst; + first = newFirst; + size++; + } + + public void addLast(Object o) { + Node oldLast = last; + Node node = new Node(o); + oldLast.next = node; + node.pre = oldLast; + last = node; + size++; + } + + public Object removeFirst() { + Node oldFirst = first; + first = first.next; + size--; + return oldFirst.data; + } + + public Object removeLast() { + Node oldLast = last; + last = last.pre; + size--; + return oldLast.data; + } + + public boolean contain(Object o){ + Node x = first; + while(x!=null){ + if(Objects.deepEquals(x.data,o)){ + return true; + } + x = x.next; + } + return false; + } + + public Iterator iterator() { + return new LinkIterator(); + } + + private class LinkIterator implements Iterator{ + private int cursor = 0; + @Override + public boolean hasNext() { + return cursor= size){ + throw new ArrayIndexOutOfBoundsException(); + } + return get(cursor++); + } + public boolean remove(){ + LinkedList.this.remove(cursor); + return true; + } + } + private static class Node { + Object data; + Node pre; + Node next; + + public Node(Object data) { + this.data = data; + } + } +} \ No newline at end of file From 6b34eda50b9c55d5977bf8907f8aff0d0bbd9d72 Mon Sep 17 00:00:00 2001 From: xiaobo Date: Thu, 6 Apr 2017 19:43:19 +0800 Subject: [PATCH 063/552] update 0.0 --- .../com/coderising/jvm/clz/AccessFlag.java | 25 ++ .../src/com/coderising/jvm/clz/ClassFile.java | 75 +++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 24 ++ .../coderising/jvm/constant/ConstantInfo.java | 29 ++ .../coderising/jvm/constant/ConstantPool.java | 29 ++ .../coderising/jvm/constant/FieldRefInfo.java | 54 ++++ .../jvm/constant/MethodRefInfo.java | 55 ++++ .../jvm/constant/NameAndTypeInfo.java | 45 +++ .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 ++ .../com/coderising/jvm/constant/UTF8Info.java | 32 ++ .../jvm/loader/ByteCodeIterator.java | 5 + .../jvm/loader/ClassFileLoader.java | 204 ++++++++----- .../jvm/loader/ClassFileParser.java | 44 +++ .../jvm/test/ClassFileloaderTest.java | 288 +++++++++++------- .../com/coderising/jvm/test/EmployeeV1.java | 27 +- .../src/com/coderising/jvm/util/Util.java | 24 ++ ...\347\233\230\346\214\207\344\273\244.docx" | Bin 11099 -> 0 bytes 19 files changed, 820 insertions(+), 198 deletions(-) create mode 100644 group04/349184132/Study/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/util/Util.java delete mode 100644 "group04/349184132/post/CPU\345\206\205\345\255\230\347\241\254\347\233\230\346\214\207\344\273\244.docx" diff --git a/group04/349184132/Study/src/com/coderising/jvm/clz/AccessFlag.java b/group04/349184132/Study/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/clz/ClassFile.java b/group04/349184132/Study/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..650ca8375d --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/clz/ClassIndex.java b/group04/349184132/Study/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/constant/ClassInfo.java b/group04/349184132/Study/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/constant/ConstantInfo.java b/group04/349184132/Study/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/constant/ConstantPool.java b/group04/349184132/Study/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/constant/FieldRefInfo.java b/group04/349184132/Study/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/constant/MethodRefInfo.java b/group04/349184132/Study/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group04/349184132/Study/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/constant/NullConstantInfo.java b/group04/349184132/Study/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group04/349184132/Study/src/com/coderising/jvm/constant/StringInfo.java b/group04/349184132/Study/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/constant/UTF8Info.java b/group04/349184132/Study/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..9c9fac2839 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.loader; + +public class ByteCodeIterator { + +} diff --git a/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileLoader.java b/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileLoader.java index 117e999ba4..33185d8175 100644 --- a/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -1,92 +1,140 @@ package com.coderising.jvm.loader; -/** - * Created by wang on 2017/3/27. - */ - -import java.io.*; +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; - -public class ClassFileLoader { - - private List clzPaths = new ArrayList(); - private static final int BUFFER_LENGTH = 1024; - public byte[] readBinaryCode(String className) { - - File clzFile = new File(getClzPath(className)); - FileInputStream fis = null; - ByteArrayOutputStream bos = null; - try { - fis = new FileInputStream(clzFile); - bos = new ByteArrayOutputStream(); - int len = 0; - byte[] buf = new byte[BUFFER_LENGTH]; - while(-1 !=(len = fis.read(buf))){ - bos.write(buf,0,len); - } - bos.flush(); - return bos.toByteArray(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - }finally { - if(bos!=null){ - try { - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - }if(fis!=null){ - try { - fis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return null; - - - } - - private String getClzPath(String className) { - String clzPath = this.getClassPath() + - className.replace(".","\\") + - ".class"; - return clzPath; - } +import com.coderising.jvm.clz.ClassFile; - public void addClassPath(String path) { - if(path==null){ - throw new IllegalArgumentException(); - } - clzPaths.add(path); - } - - - - public String getClassPath(){ - StringBuilder sb = new StringBuilder(); - for(int i=0; i 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 testPrintHex(){ - ClassFileLoader loader; - loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - - - String actualValue = this.byteToHexString(byteCodes); - System.out.println(actualValue); - - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;ijcJE%?>4;KT1<4Gw%^3^J0p2iZC>%7eu)z&Buj ziWPREsVhDK0MsD>0N_8x3~X%~T&=A#Vg_yenScTN30KG=yi;!lM|*(zdE6@2(E5VH`8RZwp6cs17zARHh z`JM$_!D;OTFlL{uB5g)>tWDowYr=D^j%IeM%(PHbXC)D`zimdb#B!p?o;CsgD2SP^Q>+T`3E~FEvXw46^uM&Q5wEqUew<*w=~mFM~e^; z)wXWadAj#DGICT_I~;& z|38B1HO0XEn}YdA{U`rMAbXRC2jCT}W7$rO5ws6;jnaB88n>4lM;>T>ViDNN!{JQn zp4yj#>Lh!;Uud3+$pJmT>E=1KEnYwMfn(a&sbUnfkJS%tq!C?_6VqLXagh}=DOXhyBcqfJ)jl2H?9iK2G;K7Q83h}fs?&M-2*L$FLk5HZjsnrjuK-GcE=<| zILiZ5&d1X&Y=`N1WWXLTs!hxtZq0bX)0UkAH&PkRCwVn~74hB#@m{$Ix7o45yW|ey zfv$h|Bv4?wTtN25kGx0#Ph)H(*vr_M001a|i8wgAS(!LIu-T;3Z$Hb0H77TI^ECWJ zN+8*+-7KM6d`U;NUGZ*wp|MLT30lPn2^^AyrfRb{LrbuEsAvGfyzX>Pj|0Qr3J~yQ zYX!t;j>hMZfRG~Fp6e29&{8SUMe30n6pbLaKXjULt>epsJ?ZS0v-6iqjRk3^zqw z=}E2X=AUTzH7m3qdUbjtWP{CoNNZoDCXq&$8uySdI5|(!#IsLyqKzP92T&d50TY#` zJeX-lRd=&Fax+=JvN`hFZr9n%NhF1mH-i6bNscS+df0oKfwzE}JvN^Et9Z%Ib-28- zt4;D7$V-g=%~(eD6pZ@2qCJ({@;l=@?f#EF{-@miWF*gszXFIc-#8s}_lv>SduVSURMR z$4KwTzHj14U_wfJ8a=JpaWhOY{LJB*$muxckSmRiD1n1c%xQUd>A92y)F}&+fM*fP zeBUN-v?&zOQh7IvJi1huwE0^KQq{dB7t*VGF*8K!PTC6Yw=SE5z7gh(KBE(qGi32} z(nD2ekmA=sYb{;e89{<;k;e02uEXGqPNL;8qU8aiWi_7=lqR5VD1Alp7ew;!ur0Ud zToATC_ECWEnH6M!bIK#|tsng0Ti>Dq-}T_h0O%MJBxGSnBV~}C*#>Y@BJF4xK|vH$ z2uRZM7$s+ynyNnE-5{Ux-3}zV5_~ z)T6TfFzYjCzQgYE0ex;^J0kgq!#RX&uY0z*q^~w4!l5z^j`#U#OB0Uk*#J7u7bvnYl{b0d%1~u5S~5q?1mn?Svwyo0fm27v5mQVEZz&tWDBhc7awxbbaS#=e%mNXL2lR7Ry$=8Rhn9PV>Qm)crAzNU^)QiB_AOm$7A6mrn@g9jy}pcVoTS)! z0mXzzqU$B{yyKag@di4Sy0UyWj2zelwT3HT&SlCeJ5~Dyhp(eShuF9vKbTlMRRmcM zc{Up7C*G(UKUR)>FYh=HjHO1VxR%kw$}d@~%x5X9#zZ!Ss=IN}Y3XMi`Y@gpeQd^Za^IT(Dden=tGrgs928$O32`hpfRFo9!B zd9Les(3x3GQ}M;WOzH^!*}Bx^r74=_z~e7!eD~4f-($+gE9roqU3e3kKeC5x7>jT4x!8 zI!7yDUrR@KzbbsapNgrsE%5Eas3~a(KFa0#hX=w1VYFBZM@g&d=#SnzjGk1U+qDgh zb?As4w0CWL3$4I0U6u>=>tXLGP!O8>wL$pF@D3;V#-Q`CFUF@^ql1_V=hw5RZg9Lc zPd(i-rY&kS77t^CS+$^QF`mhmVcLc7lb~^&e~FQEJ;P{CM6XhwGE_iKVL3J~56m@W z?%nD&MChxjxVjn?GxVxIo6ywDX%d@EG6S8SQp{)td4--$7|G?_223Y)6u^IK9EacS zHyI5|w1hV(Zy7{8il5J;!CbRpI1jqqp9MlrI=S|NaLu|);a7#n_kVP*b3u}HM?Ge(%J;)SggiET^jh?1phBc4B3a9Cq0obl~@|{X%!4fsIJ)`H!yT_UIrwxR;IP z+8owq?A5g30n+%YM0Fkp3Fow*4$uAnv@`;&xYf*vg@qcJ3=TK5(9g?})=ch$`?HSXz!jV2uJ%L3By~;ps2qeySJSBimR`jssSFx+;5o49rQW)zJu=Q|BzO zReG}llrdTQn)6E^U^@nWs+t=~Z4kln1dYNKrpdd(`&QA-VOi~X#?32ZUI=c3kJYu> z=Uip~^qp%Z``M|=;b2PecyYsc(>EMT)c$JSCm)R~oVxTB9P}BMlF$IiR;7&ooVVK_ z#ux5w?oTgWN=`hEWGlD3VK1Z41e-|d?(MRD9I|-c;~p`&N_%-ln8HM}?k=rkLl-PX zueEk^dYK^$kTD^p@FaVcXj!KseByjEg``mxkSyk2ORvojtS~w*xwq-D0?D}R@VpLR zE)xr!mgBV=ye72V^166EZIM87JqpG6-R%DD&4cX z>le5s`ZE^RcRSuOehL7H!v5NS{0#0KOdK7}ZA^d0Zq+LLpiw^HT~x=t{F+Bn!FE9t zD(=iwUl@;|vHx(Cm-PSvZ$(DXPN~nZb0aA{I>c8-r@d~6jfRb(Qe7X*4r7=ZTZ(XU z-c$z_i+1~YS(Ft=eVJoeBUUWzunNaHu< z)~!`b<#)Sz9_Gh9mGv@UnP);KO<4HQA^u09>?oyT%sXg?2UOIb@73D?YhCrhIkZvt6 zkm&Nnv67(NA$%|OVFt&BIod+j{o}RP;I!#Tq7rFeqCAG!=*}wJYFC{(6s}GDdbBGm zX~|jhBv+!yNytd+i?+Ky_h%#KvTWI|Uzu<45wjCQl5Jqw?N^N`-|yZ~MRl4`3L zO?)shxuB`dY%<7shOVCO1CpMa9GYTJvVH2QHJi{87LMB8a^x-xJ+1-5$CAQTMbnj! zg$~8cTS=`~K}1t_N+q&APx|hH>?;$#Z+UD)9N5(6>@QbV<=>JcsdXe?_jZSH-fv|Y z9`o)P@trgvk9H77yUs-fL7G@yOndzPdGh|W;=x(s%J&}$#$1Fx_;kC+BMjZVp3%vn z!E#(5%aJM%u`QMca@HMVG6?To+?LovP6PB0>5t~r<8A?d>GMe?Jc1ETOz9ZCM*LpK z-gM<7`5tYHiB;A(vleNXp|*4b>1myeL2@bgMK#9?oaa0@_B{7OMOr3i{Lj*bxN^o_ zr~0FEcU&3U#Rzw>Jfc06@ui=<7TMi@S5)CM zNg5t#6SXCKHd+l$&mIxqm1Cbff&aeWLilSlb)wui`V<-f;K2m|F#i<% zDbD<`_uAEv1>ti7o3J;1)OVW7jkn2INMUMTEKfM2iAseLP}5iUhcsxvjVGK7TUE~z z{94tM{Ul7+ooWVJ;tiJBm1TN?gc7k&w#c4^n3VD^&I=r|o$wAXR?l?YW)d~ElKJTO zE+O^AbmmuU(i98ry>Fq&;nMDQz0Y&|n<>eqAVf9%((W)2?zbj_iL`~%SlXD+T3(>0 z75xxbEJ(AoG=y!J&^DxgwKyGeh$DH?*IxZ5m+Sz4wE9%>eGL{_?1iqMp{<7z8>z@n z)6MSr@lql_w@l>~E zLT4=jRa5Ply;NQBcy}$L*afG>gZG`AniOgdg6<j+1a8W!kwb_dU-j zKMSg2X<25&P;C`U=Fi=(*Z_Em81hicLh5JPB=L3#3M`8qvy=wp<7{T=WGikQY#7oa z7BA%xxg||T@5#l=nAdd|nlFCrhMUeG`fqfjc=LN-99*gfe~P2dg00khS~ioekD4Eb6EsFC3KA+tkjbFJxp0US45T_KVJCgsr>;q8(6;9QCHC zdt#oXq3tWW7+Nh)yEc(mhNyPl*GDj&Q%Y{WOP7=RP9K1*<4`MaxK_(5Da0SzZ$jIK zHJFA$ffmTs`b}wg3dg8>YY)w^^YjfOH@X#hQ$xqBPzP@83taVaHqIFe=2ep|QrOEH zLkHXLS%b0aEshseF=ezsr?>k?7J-L&sS+3s+Gh$fgKzf9aO)+`3Ovo0d4z=vL}XGX z;mUvvY4`*amgHV2kR2IkPkAD($&-wCj_RXvSYxa?Y{aNu=}bM7Bt^e2#}Nr7-G3g( zaPg$lCFBa(O|ZAmae-t?>b%#&7QbpVkBt#{YTQOx-x!pl@}-HIkmO@Nbl#lePBJ-V zp9@F(B^;;3+6Pc3m#dy~@BDg4y{R*HfIFs*!aJ=9nAPPE4*0UMX*e7m_Tlb~L;Ic6 z_Y2|2#kZb!v3zOIou~E*9_zly;f-W$Y`h2S@5yV+9D$apL^Qmn6uDes4k z?*=u%Iw!BK#vu2Jfwo%7c!tyx#YsJoI>H4?zSw2 zFE@I0L#dW!T4T_u$x=e-`$az{If~_3MB+JaQMKomjM9a7VV#P^*aEQiMS3fde6UO; z>)%?F=g=)`I-P%V8IFpe^+$)>gMidYcgb5;@j}5;yv#E7f2X zJ{iroX*Kx^8QOHY>dWcYzF1k}xh5*EBWTAq5D8VeMbk$J9N?3Emp%=)rx2y&2qbBf z3&KWyCX=3&MV3_f;%t%f^9nM|!;6}I2s~F>s83h4nqR{fp~g0%A`6e}4`yl3Rc+$o z1}Es88h6{`6(h9PeucKHnMh)PU@(>Xg~QI!yjHZbHO&?~ncG z49D9>%$!TcVkQK1lLZ*dTKR#|9F090^3;wrOWjYS76r#fO=E>Qs(ws-`7`1xt0nR^ z1xI{W;1j-w6X%~1A2>VUWNl*O_^@KksW#cnG6CliP6!bp@T@hWc6)?ZTkO(_MZy8E z*5AaMg_en;kz2E;d|pH1aom~*=k#;p@(3BMqjdz2kg4eoGM_u^nEfv&VS2BIMFs61* zWEYgdqGgv!P_=~}?ksNNaiAH*=ay7xw)`u!ve{d_pldUd6g5HA;>9 zNJ$WiTNH5ibeF;(H({?>s?a&~3{nQXAu64Hq*L9|T2%Ms(CK=@qU2Wszwz;Q;Fa1Q z^MTfctA$lDV4|Z24W8LeuRB48j8@ZgtC-~f@9LEFw>`qET!{|yGbbiZn9K_5fuNLf}&t|Mt z@TqG3<6%ZVQ_1Fek<@+bI}vFZd{sGW86`LTNpjf!I&qe@YjXszZo+sHk9)$*Dxy`0 z`6+%^VuPjZ=ZRKd_N|(V%~uTLj4xy4lS=hEl$0{<%}&yNf5c?<_|Cbwd}qlPy+M{v z9@lR1tkoiamuCkNIAS;3Y1+abzkX^j^&0;JTq~+CR^Ki+w09SG$jMjz5$4Q8VeCv5 zYeY8-i(E9WfU!Mi_tz*|I0vyPRmt74sjCx75H-noaGzB6a985DfSdbVP>#v^-1NTi zj`Dg4FqI$A^~Yql4^aMl(D!ikZuB!1p>A#UDCYa_^I|vw{6EBhau>hl%pFave@1*6 zQLXT8OhD0nzkA@BP3?GiJUM@rE7lkata)*uv(o4HU%%AK13S|uQ{39)I&=3s<|4nl zE54il{ezDiO0HXe^Hj>-h7!5CREEj$1&OLHfRNtfP^L zhu9j}3URO%IDc6CV8zcoCgx_swhUHY00e1$B4?LJn86Sg2;S83=#L9ZB?C zgKPlh2>SNG3~wl!^H9Ihku`LzhsGXzDhUM%s@H$++PbxvkEZ-NAXdr*$2Xl<6A?9P z(J9K~0#dTfWh#r1Q^dPWxnHgtoK zD5!jB=@H)`FJWVAFLimrkF3Oz+n+PjT{dq83MY{o9RP`Mdr@UnHA)eMmzhEQQF_sAl0y4ScUsQ`1)ln+*XD&x&u_^JH zRsJQz@F4jqc24RkGca%;YJp_Hi*uHS^qUn(bTdQ3>kUcD9Mas)TbXJv4}YJ!vXZ6) zdlu6nPlq0N2SbZdj@t0q^$1#A_sYkqPQG`Yn@l2(5o!* z9{8113@>OmQ&uwKHO^O=)JS3(GdReDwfn|;L)@bYdsTE6dQL{4rp6Rb;X#>OmI&>< zD!00u<*oWO?nrdf8nY3KY5$RGD4E9)s+0uR`~}PhKScY~*G?}6_miZ=BcO5fkwdYV z6VlOUV|O^^4czF4FLjt2dWIgtEaF2we*nEHrNXXezYwA(xf;_G@i zqN$)8^<8UIi@zg$wmj|jnM3&R^X>0rmwzLO8@~AD222bGIEW?y|NivQzXbmoM*n9P z%2~EEA$IQjd%@&hFXvsiQ#rZg`s<2AH@HW|CU-iQjg@;|rwCSJNjdj+62pBt7jbX6 zjo$9$d|A;-OI1Mt>5gu(tp&9|zCFhZYq)DU2NMndl6)$uma~C#hrLj4Y}!{;@h~sT z=vj?o?2i%izP2|nWK)3|>&jiK$TOZlu-2XrXBzWOzBv+BBCvoulo#+T>LTI3FC|Rv z!t;b%-yAu{M3{ygPPp4)4&9m}rA^k-Acb-xTsDw}bs$IHBdZ?-YCPX4sfs93&#Bjo z3mSbtG{Kx;?~aYjVaWnyDQx+=Ap9yLpB>`^>A_T?*)VqY`xn#w;Z;eGwjE;aCnqe#Pm0ftZ<9Q z#;ZXs#d;Nt7PsC`iZkww(fac4(Ma}bJi~AEm{##98qlxY^XGE(_m7iW z`TNn}3j+?3;cEgr3gWgu9D3pto8&pa*O%@%XmN{`E+bug@g_Inn>g)T-4#C=k}n+) z7rVBu-T5xC$S~?|WxW@0Qspek{GiR_sDM>EkMFx5a^Rl}Gikz;%jPqTSK8vr*o{siMRa+AR(YpFGIOk=YeCHTbg2?Pe|>3|;);0b^j{QZ{vU!T>l z4*uQ8Jb3G0?ZMl$6946w9}oK2dp}@)4Z8L>=I2}VzXtoI!UObSuu}Ygy0`y@dyxLs z91cSMa@4-2LEK@anaxd>=zT1;H$r3|0yAStoq}Ux8LYOuz&a){Z|3p zWBB9ht>18butWY0|GSp!e;NHy&-AN37%c_)cXiW)!T&zHAJ&Fn?E%6}_QwM7SlP#G z#RKpcQ<{GQ!FvCF0P~MI|N9Mnd~EZ(CtUCj>i;^#d929eZN+bR9pQiAe{3=y;~(b< zf8!~U|AYT$*6=a>ae>%xxb!;~|rAPjpr;igPzeip96Zkt_ XA} Date: Fri, 7 Apr 2017 14:00:59 +0800 Subject: [PATCH 064/552] =?UTF-8?q?20170407=5F1400=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/linklist/LRUPageFrame.java | 74 +++++++++-- .../coding2017/basic/stack/Stack.java | 32 +++++ .../coding2017/basic/stack/StackUtil.java | 102 +++++++++++++++ .../coding2017/jvm/clz/AccessFlag.java | 24 ++++ .../coding2017/jvm/clz/ClassFile.java | 74 +++++++++++ .../coding2017/jvm/clz/ClassIndex.java | 19 +++ .../coding2017/jvm/constant/ClassInfo.java | 24 ++++ .../coding2017/jvm/constant/ConstantInfo.java | 29 +++++ .../coding2017/jvm/constant/ConstantPool.java | 28 ++++ .../coding2017/jvm/constant/FieldRefInfo.java | 54 ++++++++ .../jvm/constant/MethodRefInfo.java | 55 ++++++++ .../jvm/constant/NameAndTypeInfo.java | 45 +++++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coding2017/jvm/constant/StringInfo.java | 26 ++++ .../coding2017/jvm/constant/UTF8Info.java | 32 +++++ .../jvm/loader/ByteCodeIterator.java | 5 + .../jvm/loader/ClassFileLoader.java | 122 +++++++++++++++--- .../jvm/loader/ClassFileParser.java | 33 +++++ .../jvm/test/ClassFileloaderTest.java | 104 ++++++++++++++- .../orajavac/coding2017/jvm/util/Util.java | 24 ++++ 20 files changed, 889 insertions(+), 30 deletions(-) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackUtil.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java index 3240f2558c..56b94881b4 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java @@ -5,7 +5,7 @@ private static class Node { Node prev; Node next; - int pageNum=10000; + Object pageNum=10000; String flag; Node() { @@ -56,19 +56,19 @@ public boolean lookup(int pageNum){ Node nodel = last; //判断要找的元素是否在第一个节点里 - if (nodef.next.pageNum == pageNum){ + if (nodef.next.pageNum.equals(pageNum)){ return true; } //判断要找的元素是否在最后一个节点里 - if (nodel.prev.pageNum == pageNum){ + if (nodel.prev.pageNum.equals(pageNum)){ remove(pageNum); //删除尾元素 addFirst(pageNum); //把访问pageNum添加到第一个节点里 return true; } - while(nodef.next!=null&&nodef.next.pageNum != 999){ - if (nodef.next.pageNum == pageNum){ + while(nodef.next!=null&&!nodef.next.pageNum.equals(999)){ + if (nodef.next.pageNum.equals(pageNum)){ nodef.next = nodef.next.next; //先删除元素 nodef.next.prev = nodef; addFirst(pageNum); //再把访问添加元素 @@ -79,14 +79,30 @@ public boolean lookup(int pageNum){ return false; } - public void remove(int pageNum){ + public Node getFirst() { + return first; + } + + public void setFirst(Node first) { + this.first = first; + } + + public Node getLast() { + return last; + } + + public void setLast(Node last) { + this.last = last; + } + + public void remove(Object pageNum){ length--; Node n = last.prev; last.prev = n.prev; n.prev.next = last; } - public void addFirst(int pageNum){ + public void addFirst(Object pageNum){ Node s = first.next; Node n = new Node(); n.pageNum=pageNum; @@ -95,7 +111,7 @@ public void addFirst(int pageNum){ first.next=n; length++; } - + public String toString(){ StringBuilder buffer = new StringBuilder(); Node node = first; @@ -130,4 +146,46 @@ public String lastToString(){ } return buffer.toString(); } + + public Object getFirstNode(){ + return first.next.pageNum; + } + + /** + * StackUtil 使用 + * @param len + * @return + */ + public Object[] getElements(int len){ + Object[] obj = new Object[len]; + int i=0; + Node node = first; + while(node.next.flag != "last"){ + obj[i] = node.next.pageNum; + node = node.next; + if (i == len-1){ + return obj; + } + i++; + } + return null; + } + + /** + * StackUtil 使用 + * @param obj + * @param o + */ + public void remove(Object obj,Object o){ + Node nodef = first; + while(nodef.next!=null&&!nodef.next.pageNum.equals(999)){ + if (nodef.next.pageNum.equals(obj)){ + nodef.next = nodef.next.next; //先删除元素 + nodef.next.prev = nodef; + length--; + break; + } + nodef = nodef.next; + } + } } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java new file mode 100644 index 0000000000..1b8e4153b7 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java @@ -0,0 +1,32 @@ +package com.github.orajavac.coding2017.basic.stack; + +import com.github.orajavac.coding2017.basic.linklist.LRUPageFrame; + +public class Stack { + + private LRUPageFrame l; + + public Stack(int capacity){ + l = new LRUPageFrame(capacity); + } + + public void push(Object o){ + l.addFirst(o); + } + + public String toString(){ + return l.lastToString(); + } + + public Object[] getElements(int len){ + return l.getElements(len); + } + + public void remove(Object obj){ + l.remove(obj, null); + } + + public Object getFirstNode(){ + return l.getFirstNode(); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackUtil.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackUtil.java new file mode 100644 index 0000000000..178d595a91 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackUtil.java @@ -0,0 +1,102 @@ +package com.github.orajavac.coding2017.basic.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) { + System.out.println(s.toString()); + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + s.remove(o); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + return s.getElements(len); + } + /** + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz + * 使用堆栈检查字符串s中的括号是不是成对出现的。 + * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true + * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; + * @param s + * @return + */ + public static boolean isValidPairs(Stack s,String str){ + for (int i=0;i 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/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..f280244bed --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.github.orajavac.coding2017.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(); + } +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..f37c0f6452 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.github.orajavac.coding2017.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(); + } + + + +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..688e5f622f --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.github.orajavac.coding2017.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()+")"; + } +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..af90d1dcf0 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.github.orajavac.coding2017.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..ecad1d633b --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.github.orajavac.coding2017.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); + } + +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5026756c57 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.github.orajavac.coding2017.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; + } + + + +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..9eb4f19e5a --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,5 @@ +package com.github.orajavac.coding2017.jvm.loader; + +public class ByteCodeIterator { + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java index 062df44717..ba0d450054 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java @@ -4,48 +4,128 @@ 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.github.orajavac.coding2017.jvm.clz.ClassFile; public class ClassFileLoader { - private List clzPaths = new ArrayList(); +private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - byte[] b = null; - try{ - File clfile = new File(packageToPath(className)); - @SuppressWarnings("resource") - BufferedInputStream in = new BufferedInputStream(new FileInputStream(clfile)); - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - byte[] buffer = new byte[1024]; - int size = 0; - while ((size = in.read(buffer)) != -1) { - out.write(buffer, 0, size); - } - b = out.toByteArray(); - }catch(Exception e){ + + 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; } - return b; } + public void addClassPath(String path) { - clzPaths.add(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/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java new file mode 100644 index 0000000000..59fd55ae15 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.github.orajavac.coding2017.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 Date: Fri, 7 Apr 2017 16:20:28 +0800 Subject: [PATCH 065/552] update & stack homework update & stack homework --- .../src/com/coding/basic/stack/Stack.java | 47 ++++++ .../src/com/coding/basic/stack/StackUtil.java | 99 +++++++++++++ .../com/coding/basic/stack/TestStackUtil.java | 63 ++++++++ .../com/coderising/jvm/clz/AccessFlag.java | 25 ++++ .../src/com/coderising/jvm/clz/ClassFile.java | 75 ++++++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 +++ .../coderising/jvm/constant/ClassInfo.java | 24 ++++ .../coderising/jvm/constant/ConstantInfo.java | 29 ++++ .../coderising/jvm/constant/ConstantPool.java | 29 ++++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++++ .../jvm/constant/MethodRefInfo.java | 55 +++++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 ++++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++++ .../jvm/loader/ByteCodeIterator.java | 5 + .../jvm/loader/ClassFileLoader.java | 97 ++++++++----- .../jvm/loader/ClassFileParser.java | 44 ++++++ .../jvm/test/ClassFileloaderTest.java | 134 ++++++++++++++++-- .../src/com/coderising/jvm/util/Util.java | 24 ++++ 20 files changed, 891 insertions(+), 48 deletions(-) create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/StackUtil.java create mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/stack/TestStackUtil.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..58a4846f2b --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,47 @@ +package com.coding.basic.stack; + +import java.util.EmptyStackException; + +import com.coding.basic.array.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + checkBound(); + return elementData.remove(size() - 1); + } + + public Object peek() { + checkBound(); + return elementData.get(size() - 1); + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return elementData.size(); + } + + private void checkBound() { + if (isEmpty()) { + throw new EmptyStackException(); + } + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + for(int i=0;i=0;i--) + s.push(objs[i]); + return objs; + } + /** + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz + * 使用堆栈检查字符串s中的括号是不是成对出现的。 + * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true + * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; + * + * ( 40 ) 41 [ 91 ] 93 {123 }125 + * @param s + * @return + */ + public static boolean isValidPairs(String s){ + if(s == null || s.length() == 0) + return true; + Stack stack = new Stack(); + char[] chars = s.toCharArray(); + for(int i=0;i 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/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..9c9fac2839 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.loader; + +public class ByteCodeIterator { + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java index e9f6541cc1..176b4af934 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -1,13 +1,15 @@ package com.coderising.jvm.loader; +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.coderising.jvm.clz.ClassFile; + public class ClassFileLoader { @@ -15,45 +17,30 @@ public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - className = castClassName(className); - File file = null; - FileInputStream fis = null; - for(String clzPath : clzPaths){ - file = new File((clzPath + className)); - try { - fis = new FileInputStream(file); - byte[] bytes = new byte[2048]; - int i = 0; - int sum = 0; - while((i = fis.read(bytes)) != -1){ - sum += i; - } - fis.close(); - return Arrays.copyOf(bytes, sum); - } catch (FileNotFoundException e) { - continue; - } catch (IOException e) { - e.printStackTrace(); - } + 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 new byte[0]; + + return null; } - private String castClassName(String className) { - String[] packs = className.split("\\."); - StringBuilder sb = new StringBuilder("/"); - 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/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 Date: Fri, 7 Apr 2017 16:58:42 +0800 Subject: [PATCH 066/552] =?UTF-8?q?20170407=5F1658=20jvm=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jvm/loader/ByteCodeIterator.java | 25 +++++++ .../jvm/loader/ClassFileParser.java | 69 +++++++++++++++++-- 2 files changed, 88 insertions(+), 6 deletions(-) diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java index 9eb4f19e5a..8c49c9ed59 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,30 @@ package com.github.orajavac.coding2017.jvm.loader; +import com.github.orajavac.coding2017.jvm.util.Util; + public class ByteCodeIterator { + + private byte[] codes; + + private int pos; + + public ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + + public String nextU4ToHexString(){ + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + public int nextU1ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); + } + + public int nextU4ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java index ee94b17930..c4a1e89d7b 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java @@ -3,16 +3,27 @@ import com.github.orajavac.coding2017.jvm.clz.AccessFlag; import com.github.orajavac.coding2017.jvm.clz.ClassFile; import com.github.orajavac.coding2017.jvm.clz.ClassIndex; +import com.github.orajavac.coding2017.jvm.constant.ClassInfo; import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; +import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; +import com.github.orajavac.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.orajavac.coding2017.jvm.constant.NullConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.StringInfo; +import com.github.orajavac.coding2017.jvm.constant.UTF8Info; public class ClassFileParser { public ClassFile parse(byte[] codes) { - - + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + String magicNumber = iter.nextU4ToHexString(); + System.out.println("magicNumber="+magicNumber); + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); - - return null; + clzFile.setConstPool(parseConstantPool(iter)); + return clzFile; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { @@ -27,7 +38,53 @@ private ClassIndex parseClassInfex(ByteCodeIterator iter) { } private ConstantPool parseConstantPool(ByteCodeIterator iter) { - - return null; + int constPoolCount = iter.nextU2ToInt(); + System.out.println("Constant Pool Count :"+constPoolCount); + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + for (int i=1;i Date: Fri, 7 Apr 2017 18:06:50 +0800 Subject: [PATCH 067/552] stack --- group06/1454385822/.classpath | 6 +- group06/1454385822/.project | 6 + .../coding/basic/homework_05/stack/Stack.java | 32 +++++ .../basic/homework_05/stack/StackUtil.java | 116 ++++++++++++++++++ 4 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 group06/1454385822/src/com/coding/basic/homework_05/stack/Stack.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtil.java diff --git a/group06/1454385822/.classpath b/group06/1454385822/.classpath index f68e6279c1..2d8e27c1f2 100644 --- a/group06/1454385822/.classpath +++ b/group06/1454385822/.classpath @@ -1,8 +1,12 @@ - + + + + + diff --git a/group06/1454385822/.project b/group06/1454385822/.project index 35750341bb..0788dbcaef 100644 --- a/group06/1454385822/.project +++ b/group06/1454385822/.project @@ -5,6 +5,11 @@ + + org.eclipse.wst.common.project.facet.core.builder + + + org.eclipse.jdt.core.javabuilder @@ -13,5 +18,6 @@ org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature diff --git a/group06/1454385822/src/com/coding/basic/homework_05/stack/Stack.java b/group06/1454385822/src/com/coding/basic/homework_05/stack/Stack.java new file mode 100644 index 0000000000..6054e19759 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_05/stack/Stack.java @@ -0,0 +1,32 @@ +package com.coding.basic.homework_05.stack; + +import com.coding.basic.homework_01.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if(!isEmpty()){ + return elementData.remove(elementData.size() - 1); + } + throw new RuntimeException("Stack is Empty"); + } + + public Object peek(){ + if(!isEmpty()){ + return elementData.get(elementData.size() - 1); + } + throw new RuntimeException("Stack is Empty"); + } + + public boolean isEmpty(){ + return elementData.size() > 0 ? false : true; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtil.java b/group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtil.java new file mode 100644 index 0000000000..d3fb5f3f08 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtil.java @@ -0,0 +1,116 @@ +package com.coding.basic.homework_05.stack; + +public class StackUtil { + + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static Stack reverse(Stack s) { + Stack ss = new Stack(); + while(!s.isEmpty()){ + ss.push(s.pop()); + } + return ss; + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static Stack remove(Stack s,Object o) { + Stack ss = new Stack(); + while(!s.isEmpty()){ + Object object = s.peek(); + if(object.equals(o)){ + s.pop(); + }else{ + ss.push(s.pop()); + } + } + return reverse(ss); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + Object[] result; + Stack ss = new Stack(); + if(s.size() <= len){ + result = new Object[s.size() + 1]; + for(int i = 0; i < s.size(); i++){ + result[i] = s.peek(); + ss.push(s.pop()); + } + }else{ + result = new Object[len + 1]; + for(int i = 0; i < s.size(); i++){ + if(i < len){ + result[i] = s.peek(); + } + ss.push(s.pop()); + } + } + result[result.length - 1] = reverse(ss); + return result; + } + /** + * 字符串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){ + Stack stack = new Stack(); + boolean flag = true; + char[] chars = s.toCharArray(); + for (char c : chars) { + if(c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}'){ + System.out.println(c); + stack.push(c); + } + } + Stack reStack = reverse(stack); + while(!stack.isEmpty()){ + Integer i1 = (Integer) stack.pop(); + Integer i2 = (Integer) reStack.pop(); + + if(i1 != i2){ + flag = false; + break; + } + } + return flag; + } + + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); +// String string = "([e{d}f])"; + String string = "([b{x]y})"; + System.out.println(isValidPairs(string)); +// Object[] objects = getTop(stack, 3); +// for(int i=0; i Date: Fri, 7 Apr 2017 23:46:15 +0800 Subject: [PATCH 068/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=8B=AC=E5=8F=B7?= =?UTF-8?q?=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/Stack.java | 20 +++++++- .../coding2017/basic/stack/StackUtil.java | 48 +++++++++++++++++-- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java index e126eb3edd..19cd662268 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java @@ -10,9 +10,14 @@ public class Stack { public void push(Object o){ elementData.add(0, o); } - + + // 如果队列已经没有值了,则抛出ArrayIndexOutOfBoundsException的异常 public Object pop(){ - return elementData.remove(0); + try { + return elementData.remove(0); + } catch (Exception e) { + throw new NullStackException(); + } } public Object peek(){ @@ -24,4 +29,15 @@ public boolean isEmpty(){ public int size(){ return elementData.size(); } + + public static void main(String[] args) { + Stack s = new Stack(); + s.pop(); + } + + public static class NullStackException extends RuntimeException { + NullStackException() { + super("Null Stack!"); + } + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java index 80ce820417..3b3dc501c7 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java @@ -1,9 +1,7 @@ package com.github.miniyk2012.coding2017.basic.stack; import com.github.miniyk2012.coding2017.basic.Queue; - -import java.util.Arrays; -import java.util.Objects; +import java.util.*; /** * Created by thomas_young on 5/4/2017. @@ -78,7 +76,35 @@ public static Object[] getTop(Stack s, int len) { * @return */ public static boolean isValidPairs(String s){ - return false; + Map matchBrackets = new HashMap() {{ + put("{", "}"); + put("[", "]"); + put("(", ")"); + }}; + + Stack stack = new Stack(); + for (int i=0; i Date: Sat, 8 Apr 2017 00:26:34 +0800 Subject: [PATCH 069/552] =?UTF-8?q?=E6=8A=8A=E8=80=81=E5=B8=88=E7=9A=84jvm?= =?UTF-8?q?=E6=A1=86=E6=9E=B6=E6=94=BE=E5=88=B0=E6=88=91=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/clz/AccessFlag.java | 25 ++++ .../coderising/jvm/clz/ClassFile.java | 76 +++++++++++ .../coderising/jvm/clz/ClassIndex.java | 19 +++ .../coderising/jvm/constant/ClassInfo.java | 24 ++++ .../coderising/jvm/constant/ConstantInfo.java | 29 +++++ .../coderising/jvm/constant/ConstantPool.java | 29 +++++ .../coderising/jvm/constant/FieldRefInfo.java | 54 ++++++++ .../jvm/constant/MethodRefInfo.java | 55 ++++++++ .../jvm/constant/NameAndTypeInfo.java | 45 +++++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 ++++ .../coderising/jvm/constant/UTF8Info.java | 32 +++++ .../jvm/loader/ByteCodeIterator.java | 5 + .../jvm/loader/ClassFileLoader.java | 82 ++++++++---- .../jvm/loader/ClassFileParser.java | 38 ++++++ .../jvm/test/ClassFileloaderTest.java | 121 +++++++++++++++--- .../coding2017/coderising/jvm/util/Util.java | 26 ++++ 17 files changed, 652 insertions(+), 47 deletions(-) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..75a579e3cb --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..a4d15e995e --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,76 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.clz; + + +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ClassInfo; +import com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..b71f919b66 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..e818dcb72b --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..3ec050d100 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..33dac5d47d --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..50ef7f0126 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..b399f5cc22 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..1f6f14953b --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..2a16601a40 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..428191ee6a --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..c61084fa6a --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..ced7643955 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,5 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.loader; + +public class ByteCodeIterator { + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java index 185adfb6a3..650afcb6c1 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java @@ -1,5 +1,6 @@ package com.github.miniyk2012.coding2017.coderising.jvm.loader; +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; import org.apache.commons.io.FileUtils; import java.io.*; import java.util.ArrayList; @@ -10,34 +11,8 @@ public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { -// InputStream is = null; -// ByteArrayOutputStream bas = null; -// byte[] ret = null; -// try { -// is = new BufferedInputStream(getClass().getClassLoader().getResourceAsStream(className)); -// bas = new ByteArrayOutputStream(); -// byte[] buf = new byte[1024]; -// int bytesRead = 0; -// while ((bytesRead = is.read(buf)) != -1) { -// bas.write(buf, 0, bytesRead); -// } -// ret = bas.toByteArray(); -// } catch (IOException e) { -// e.printStackTrace(); -// } finally { -// try { -// if (is != null) -// is.close(); -// if (bas != null) -// bas.close(); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// return ret; - int lastIndexDot = className.lastIndexOf("."); - String classPath = className.substring(0, lastIndexDot).replace(".", File.separator) - + className.substring(lastIndexDot); + + String classPath = className.replace(".", File.separator) + ".class"; for (String parentPath: clzPaths) { try { String fullPath = parentPath + File.separator + classPath; @@ -57,6 +32,57 @@ public String getClassPath(){ return String.join(";", clzPaths); } + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } + + // backup + public byte[] readBinaryCodeV1(String className) { + byte[] ret = null; + String classPath = className.replace(".", File.separator) + ".class"; + for (String parentPath: clzPaths) { + String fullPath = parentPath + File.separator + classPath; + ret = readFileToByteArray(fullPath); + if (null != ret) { + return ret; + } + + } + return ret; + + } + + private byte[] readFileToByteArray(String fullPath) { + InputStream is = null; + ByteArrayOutputStream bas = null; + byte[] ret = null; + try { + is = new BufferedInputStream(new FileInputStream(new File(fullPath))); + bas = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int bytesRead = 0; + while ((bytesRead = is.read(buf)) != -1) { + bas.write(buf, 0, bytesRead); + } + ret = bas.toByteArray(); + } catch (IOException e) { +// e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + if (bas != null) + bas.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return ret; + } + public static void main(String[] args) { new ClassFileLoader().readBinaryCode(""); } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..977b8c667f --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,38 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.loader; + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.AccessFlag; +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassIndex; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +import java.io.UnsupportedEncodingException; + + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + + + + + return null; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + return null; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + + return null; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + + return null; + } + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java index 4d4586fd29..4d46b07ece 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java @@ -1,6 +1,10 @@ package com.github.miniyk2012.coding2017.coderising.jvm.test; +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassIndex; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.*; import com.github.miniyk2012.coding2017.coderising.jvm.loader.ClassFileLoader; +import com.github.miniyk2012.coding2017.coderising.jvm.util.Util; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -9,9 +13,10 @@ public class ClassFileloaderTest { - + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; static String path1 = ClassFileloaderTest.class.getClassLoader().getResource("struts").getPath(); static String path2 = ClassFileloaderTest.class.getClassLoader().getResource("jvm").getPath(); + static ClassFile clzFile = null; @Before public void setUp() throws Exception { @@ -41,7 +46,7 @@ public void testClassFileLength() { loader.addClassPath(path1); loader.addClassPath(path2); - String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1.class"; + String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); @@ -55,29 +60,107 @@ public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); loader.addClassPath(path2); - String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1.class"; + String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - String acctualValue = this.byteToHexString(codes); + String acctualValue = Util.byteToHexString(codes); Assert.assertEquals("cafebabe", acctualValue); } - - @org.jetbrains.annotations.NotNull - private String byteToHexString(byte[] codes ){ - 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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..2f1d3e929b --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java @@ -0,0 +1,26 @@ +package com.github.miniyk2012.coding2017.coderising.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 Date: Sat, 8 Apr 2017 10:07:31 +0800 Subject: [PATCH 070/552] clear code --- .../src/org/coding/four/lru/LRUPageFrame.java | 62 +++++++++++-------- 1 file changed, 36 insertions(+), 26 deletions(-) diff --git a/group04/498654356/one/src/org/coding/four/lru/LRUPageFrame.java b/group04/498654356/one/src/org/coding/four/lru/LRUPageFrame.java index 1113e39e7a..8f6b187273 100644 --- a/group04/498654356/one/src/org/coding/four/lru/LRUPageFrame.java +++ b/group04/498654356/one/src/org/coding/four/lru/LRUPageFrame.java @@ -37,38 +37,46 @@ public LRUPageFrame(int capacity) { * @return */ public void access(int pageNum) { + Node node = findNode(pageNum); + if(node == null) { + addNode(pageNum); + } else { + moveExistNode(node); + } + } + + private void moveExistNode(Node node) { + if(node == first) { + return ; + } + if(node == last) { + removeLastNode(); + node.next = first; + first.prev = node; + first = node; + return; + } + node.prev.next = node.next; + node.next.prev = node.prev; + node.prev = null; + node.next = first; + first = node; + } + + private void addNode(int pageNum) { if(first == null) { first = new Node(); first.pageNum = pageNum; last = first; - } else { - if(isFull()) { - Node node = findNode(pageNum); - if(node == null) { // not found - removeLastNode(); - push(pageNum); - } else { - if(node == first) { - return ; - } - if(node == last) { - removeLastNode(); - node.next = first; - first.prev = node; - first = node; - return; - } - node.prev.next = node.next; - node.next.prev = node.prev; - node.prev = null; - node.next = first; - first = node; - } - } else { + }else { + if(isFull()) { + removeLastNode(); + push(pageNum); + }else { push(pageNum); } } - + } private boolean isFull() { @@ -91,6 +99,9 @@ private void push(int pageNum) { private Node findNode(int pageNum) { + if(first == null) { + return null; + } if(first.pageNum == pageNum) { return first; } @@ -122,7 +133,6 @@ public String toString(){ Node node = first; while(node != null){ buffer.append(node.pageNum); - node = node.next; if(node != null){ buffer.append(","); From e39cc4e24cc8f9d8e52beeba32dec46b0fa5dc3a Mon Sep 17 00:00:00 2001 From: Administrator Date: Sat, 8 Apr 2017 10:07:40 +0800 Subject: [PATCH 071/552] clear code --- .../jvm/loader/ClassFileLoader.java | 40 +++---------------- group04/498654356/one/pom.xml | 7 +++- 2 files changed, 12 insertions(+), 35 deletions(-) diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java index d4e0f52537..cb558c3bc4 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -1,13 +1,11 @@ package com.coderising.jvm.loader; -import java.io.ByteArrayOutputStream; -import java.io.Closeable; 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; @@ -22,7 +20,7 @@ public byte[] readBinaryCode(String className) { if(StringUtils.isEmpty(className)) { return EMPTY_BYTES; } - String child = className.replaceAll("\\.", "\\\\") + CLASS_SUFFIX; + String child = className.replace(".", File.separator) + CLASS_SUFFIX; for (String parent: clzPaths) { File file = new File(parent, child); if(file.exists()) { @@ -35,49 +33,23 @@ public byte[] readBinaryCode(String className) { private byte[] doReadBinaryCode(File file) { FileInputStream fis = null; - ByteArrayOutputStream baos = null; try { fis = new FileInputStream(file); - baos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = 0; - while((len = fis.read(b)) > 0) { - baos.write(b, 0, len); - } - return baos.toByteArray(); + return IOUtils.toByteArray(fis); } catch (Exception e) { - new RuntimeException(e); + e.printStackTrace(); } finally { - close(baos); - close(fis); + IOUtils.closeQuietly(fis); } return EMPTY_BYTES; } - - private void close(Closeable stream) { - if(stream != null ) { - try { - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - public void addClassPath(String path) { clzPaths.add(path); } public String getClassPath(){ - StringBuilder builder = new StringBuilder(); - for (String path : clzPaths) { - builder.append(path).append(";"); - } - if(builder.length() > 0) { - builder = builder.deleteCharAt(builder.length() - 1); - } - return builder.toString(); + return StringUtils.join(clzPaths, ";"); } } diff --git a/group04/498654356/one/pom.xml b/group04/498654356/one/pom.xml index b74298d33f..222814666f 100644 --- a/group04/498654356/one/pom.xml +++ b/group04/498654356/one/pom.xml @@ -40,6 +40,11 @@ dom4j 1.6.1 - + + + org.apache.commons + commons-lang3 + 3.4 + \ No newline at end of file From 887398c100eea63b64764653747e9a48aabab2cd Mon Sep 17 00:00:00 2001 From: hp Date: Sat, 8 Apr 2017 10:08:08 +0800 Subject: [PATCH 072/552] =?UTF-8?q?20170408=5F1007=20=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/jvm/loader/ByteCodeIterator.java | 8 ++++++++ .../coding2017/jvm/loader/ClassFileParser.java | 4 ++-- .../coding2017/jvm/test/ClassFileloaderTest.java | 12 ++++++------ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java index 8c49c9ed59..14db612ebf 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,7 @@ package com.github.orajavac.coding2017.jvm.loader; +import java.util.Arrays; + import com.github.orajavac.coding2017.jvm.util.Util; public class ByteCodeIterator { @@ -12,6 +14,12 @@ public ByteCodeIterator(byte[] codes){ this.codes = codes; } + public byte[] getBytes(int len){ + byte[] data = Arrays.copyOfRange(codes,pos,pos+len); + pos+=len; + return data; + } + public String nextU4ToHexString(){ return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java index c4a1e89d7b..065eaa4da7 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java @@ -45,7 +45,7 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { for (int i=1;i Date: Sat, 8 Apr 2017 18:29:18 +0800 Subject: [PATCH 073/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E5=A4=9A=E7=BA=BF=E7=A8=8B=E4=B8=8B=E8=BD=BD=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E4=BD=9C=E4=B8=9A!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02_downloader/src/api/Connection.java | 23 ++++++ .../src/api/ConnectionException.java | 6 ++ .../src/api/ConnectionManager.java | 10 +++ .../src/api/DownloadListener.java | 5 ++ .../src/impl/ConnectionImpl.java | 54 +++++++++++++ .../src/impl/ConnectionManagerImpl.java | 16 ++++ .../src/main/DownloadThread.java | 50 ++++++++++++ .../src/main/FileDownloader.java | 78 +++++++++++++++++++ .../src/test/DownloaderTest.java | 21 +++++ .../work_Big/02_temp/src/main/Test.java | 5 -- 10 files changed, 263 insertions(+), 5 deletions(-) create mode 100644 group23/1323434545/work_Big/02_downloader/src/api/Connection.java create mode 100644 group23/1323434545/work_Big/02_downloader/src/api/ConnectionException.java create mode 100644 group23/1323434545/work_Big/02_downloader/src/api/ConnectionManager.java create mode 100644 group23/1323434545/work_Big/02_downloader/src/api/DownloadListener.java create mode 100644 group23/1323434545/work_Big/02_downloader/src/impl/ConnectionImpl.java create mode 100644 group23/1323434545/work_Big/02_downloader/src/impl/ConnectionManagerImpl.java create mode 100644 group23/1323434545/work_Big/02_downloader/src/main/DownloadThread.java create mode 100644 group23/1323434545/work_Big/02_downloader/src/main/FileDownloader.java create mode 100644 group23/1323434545/work_Big/02_downloader/src/test/DownloaderTest.java delete mode 100644 group23/1323434545/work_Big/02_temp/src/main/Test.java diff --git a/group23/1323434545/work_Big/02_downloader/src/api/Connection.java b/group23/1323434545/work_Big/02_downloader/src/api/Connection.java new file mode 100644 index 0000000000..5b41847037 --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/api/Connection.java @@ -0,0 +1,23 @@ +package api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/1323434545/work_Big/02_downloader/src/api/ConnectionException.java b/group23/1323434545/work_Big/02_downloader/src/api/ConnectionException.java new file mode 100644 index 0000000000..8840863aba --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/api/ConnectionException.java @@ -0,0 +1,6 @@ +package api; + +@SuppressWarnings("serial") +public class ConnectionException extends Exception{ + +} diff --git a/group23/1323434545/work_Big/02_downloader/src/api/ConnectionManager.java b/group23/1323434545/work_Big/02_downloader/src/api/ConnectionManager.java new file mode 100644 index 0000000000..4f297a48ef --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/api/DownloadListener.java b/group23/1323434545/work_Big/02_downloader/src/api/DownloadListener.java new file mode 100644 index 0000000000..e652867321 --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/api/DownloadListener.java @@ -0,0 +1,5 @@ +package api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionImpl.java b/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionImpl.java new file mode 100644 index 0000000000..0764117f5b --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionImpl.java @@ -0,0 +1,54 @@ +package impl; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +import api.Connection; + +public class ConnectionImpl implements Connection{ + private HttpURLConnection huConn; + + + public ConnectionImpl(String url) { + try { + huConn = (HttpURLConnection) new URL(url).openConnection(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + huConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + BufferedInputStream bis = new BufferedInputStream(huConn.getInputStream()); + int len =0; + byte[] bytes = new byte[1024]; + while((len=bis.read(bytes))!=-1){ + os.write(bytes, 0, len); + } + os.flush(); + return os.toByteArray(); + } + + @Override + public int getContentLength() { + return huConn.getContentLength(); + } + + @Override + public void close() { + if(null!=huConn){ + huConn.disconnect(); + } + + } + +} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionManagerImpl.java b/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..96f461422d --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionManagerImpl.java @@ -0,0 +1,16 @@ +package impl; + + + +import api.Connection; +import api.ConnectionException; +import api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) { + return new ConnectionImpl(url); + } + +} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/main/DownloadThread.java b/group23/1323434545/work_Big/02_downloader/src/main/DownloadThread.java new file mode 100644 index 0000000000..84b17f6c9d --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/main/DownloadThread.java @@ -0,0 +1,50 @@ +package main; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +import api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + File saveLocation; + CyclicBarrier barrier; + + public DownloadThread( Connection conn, int startPos, int endPos,File saveLocation,CyclicBarrier barrier){ + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.saveLocation = saveLocation; + this.barrier = barrier; + } + + @Override + public void run() { + RandomAccessFile rf = null; + try { + rf = new RandomAccessFile(saveLocation,"rw"); + rf.seek(startPos); + rf.write(conn.read(startPos, endPos)); + barrier.await(); + }catch (Exception e) { + e.printStackTrace(); + }finally { + if(null!=rf){ + try { + rf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(null!=conn){ + conn.close(); + } + + } + } +} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/main/FileDownloader.java b/group23/1323434545/work_Big/02_downloader/src/main/FileDownloader.java new file mode 100644 index 0000000000..64a0f61741 --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/main/FileDownloader.java @@ -0,0 +1,78 @@ +package main; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +import api.Connection; +import api.ConnectionException; +import api.ConnectionManager; +import api.DownloadListener; +import impl.ConnectionManagerImpl; + +public class FileDownloader { + + String url; + File saveLocation; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String url,File saveLocation) { + this.url = url; + this.saveLocation = saveLocation; + } + + + public void execute() throws ConnectionException{ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + + cm = new ConnectionManagerImpl(); + int length = cm.open(this.url).getContentLength(); + System.out.println("文件长度:"+length); + long time = System.currentTimeMillis(); + CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() { + @Override + public void run() { + listener.notifyFinished(); + System.out.println("耗时:"+(System.currentTimeMillis()-time)/1000+"秒"); + } + }); + + new DownloadThread(cm.open(this.url),0,length/3-1,saveLocation,barrier).start(); + new DownloadThread(cm.open(this.url),length/3,length*2/3-1,saveLocation,barrier).start(); + new DownloadThread(cm.open(this.url),length*2/3,length-1,saveLocation,barrier).start(); + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + + +} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/test/DownloaderTest.java b/group23/1323434545/work_Big/02_downloader/src/test/DownloaderTest.java new file mode 100644 index 0000000000..220c23d57e --- /dev/null +++ b/group23/1323434545/work_Big/02_downloader/src/test/DownloaderTest.java @@ -0,0 +1,21 @@ +package test; + +import java.io.File; + +import api.ConnectionException; +import api.DownloadListener; +import main.FileDownloader; + +public class DownloaderTest { + public static void main(String[] args) throws ConnectionException { + FileDownloader fd = new FileDownloader("http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.13/bin/apache-tomcat-8.5.13.exe",new File("E:\\tomcat.exe")); + fd.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + System.out.println("下载完了!"); + } + }); + fd.execute(); + } + +} diff --git a/group23/1323434545/work_Big/02_temp/src/main/Test.java b/group23/1323434545/work_Big/02_temp/src/main/Test.java deleted file mode 100644 index e4585146a0..0000000000 --- a/group23/1323434545/work_Big/02_temp/src/main/Test.java +++ /dev/null @@ -1,5 +0,0 @@ -package main; - -public class Test { - -} From 2dbc5d05ebb4773137fc94dd4bb84415cdb8d979 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 9 Apr 2017 00:35:47 +0800 Subject: [PATCH 074/552] add ConstantPool classIndex --- .../com/coderising/jvm/clz/ClassFile.java | 50 +++++++ .../com/coderising/jvm/clz/ClassIndex.java | 25 ++++ .../coderising/jvm/constant/ClassInfo.java | 22 +++ .../coderising/jvm/constant/ConstantInfo.java | 5 + .../coderising/jvm/constant/ConstantPool.java | 30 ++++ .../coderising/jvm/constant/FieldRefInfo.java | 18 +++ .../jvm/constant/MethodRefInfo.java | 21 +++ .../jvm/constant/NULLConstantInfo.java | 5 + .../jvm/constant/NameAndTypeInfo.java | 18 +++ .../coderising/jvm/constant/StringInfo.java | 15 ++ .../com/coderising/jvm/constant/UTF8Info.java | 15 ++ .../jvm/loader/ByteCodeIterator.java | 57 ++++++++ .../jvm/loader/ClassFileLoader.java | 9 ++ .../jvm/loader/ClassFileParser.java | 80 +++++++++++ .../jvm/test/ClassFileloaderTest.java | 128 ++++++++++++++++-- 15 files changed, 485 insertions(+), 13 deletions(-) create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/NULLConstantInfo.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/StringInfo.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileParser.java diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..3440fd5fc7 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ConstantPool; + +public class ClassFile { + + private int minorVersion; + private int MajorVersion; + private ConstantPool constantPool; + private ClassIndex classIndex; + + public int getMinorVersion() { + return minorVersion; + } + + public void setMinorVersion(int minorVersion) { + this.minorVersion = minorVersion; + } + + public int getMajorVersion() { + return MajorVersion; + } + + public void setMajorVersion(int majorVersion) { + MajorVersion = majorVersion; + } + + public ConstantPool getConstantPool() { + return constantPool; + } + + public void setConstantPool(ConstantPool constantPool) { + this.constantPool = constantPool; + } + + public void print() { + // TODO Auto-generated method stub + throw new RuntimeException("no implement"); + } + + public ClassIndex getClzIndex() { + return classIndex; + } + + public void setClassIndex(ClassIndex classIndex) { + this.classIndex = classIndex; + } + + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..1beb4f390f --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,25 @@ +package com.coderising.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; + } + public ClassIndex(int thisClassIndex, int superClassIndex) { + super(); + this.thisClassIndex = thisClassIndex; + this.superClassIndex = superClassIndex; + } + + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..4cc095b23a --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.constant; + +public class ClassInfo extends ConstantInfo{ + + private int nameIndex; + private ConstantPool constantPool; + + public ClassInfo(int nameIndex, ConstantPool constantPool) { + super(); + this.nameIndex = nameIndex; + this.constantPool = constantPool; + } + + public int getUtf8Index() { + return this.nameIndex; + } + + public String getClassName() { + return ((UTF8Info)this.constantPool.getConstantInfo(this.nameIndex)).getValue(); + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..da5b29ee74 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.constant; + +public class ConstantInfo { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..da83d88297 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +public class ConstantPool { + public static final int C_UTF8_INFO = 1; + public static final int C_CLASS_INFO = 7; + public static final int C_STRING_INFO = 8; + public static final int C_FIELDREF_INFO = 9; + public static final int C_METHODREF_INFO = 10; + public static final int C_NAME_AND_TYPE_INFO = 12; + private int size; + private List constantInfosList = new ArrayList<>(); + + public void setSize(int size) { + this.size = size; + } + public int getSize() { + return this.size; + } + + public ConstantInfo getConstantInfo(int i) { + return this.constantInfosList.get(i); + } + + public void addConstantInfo(ConstantInfo constantInfo) { + this.constantInfosList.add(constantInfo); + } +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..141d8ddbfa --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.constant; + +public class FieldRefInfo extends ConstantInfo { + private int classInfoIndex; + private int nameAndTypeIndex; + public FieldRefInfo(int classInfoIndex, int nameAndTypeIndex) { + super(); + this.classInfoIndex = classInfoIndex; + this.nameAndTypeIndex = nameAndTypeIndex; + } + public int getClassInfoIndex() { + return classInfoIndex; + } + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..867c837e6c --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.constant; + +public class MethodRefInfo extends ConstantInfo { + private int classInfoIndex; + private int nameAndTypeIndex; + + public MethodRefInfo(int classInfoIndex, int nameAndTypeIndex) { + super(); + this.classInfoIndex = classInfoIndex; + this.nameAndTypeIndex = nameAndTypeIndex; + } + + public int getClassInfoIndex() { + return this.classInfoIndex; + } + + public int getNameAndTypeIndex() { + return this.nameAndTypeIndex; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/NULLConstantInfo.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/NULLConstantInfo.java new file mode 100644 index 0000000000..1fcba5f15d --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/NULLConstantInfo.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.constant; + +public class NULLConstantInfo extends ConstantInfo { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..8e1f2231ed --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.constant; + +public class NameAndTypeInfo extends ConstantInfo { + private int index1; + private int index2; + public NameAndTypeInfo(int index1, int index2) { + super(); + this.index1 = index1; + this.index2 = index2; + } + public int getIndex1() { + return index1; + } + public int getIndex2() { + return index2; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/StringInfo.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..7bc54c28d9 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.constant; + +public class StringInfo extends ConstantInfo { + private int stringIndex; + + public StringInfo(int stringIndex) { + super(); + this.stringIndex = stringIndex; + } + + public int getStringIndex() { + return stringIndex; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..c25bba86e3 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.constant; + +public class UTF8Info extends ConstantInfo{ + private String value; + + public UTF8Info(String value) { + super(); + this.value = value; + } + + public String getValue() { + return this.value; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..e4afbc62bc --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.loader; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; + +public class ByteCodeIterator { + private byte[] codes; + private int index; + + public ByteCodeIterator(byte[] codes) { + super(); + this.codes = codes; + } + + + public void skip(int index) { + this.index = index; + } + + + public int next2ByteToInt() { + return converToInt(codes[index++],codes[index++]); + } + + public int next1ByteToInt() { + return converToInt(codes[index++]); + } + + /** + * big-endian + */ + private int converToInt(byte ... bs) { + int result = 0; + for(int size = bs.length, index = 0; size > 0; size--, index++) { + if(size == 1) { + result += bs[index] & 0xFF; //符号位 + } else { + result += bs[index] << ((size -1) * 8); + } + } + return result; + } + + + public String nextLengthByteToString(int length) { + byte[] bytes = Arrays.copyOfRange(codes, index, index + length); + String str = null; + try { + str = new String(bytes, "UTF-8"); + index += length; + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return str; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java index cb558c3bc4..1f3b8e8b95 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -8,6 +8,8 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import com.coderising.jvm.clz.ClassFile; + public class ClassFileLoader { @@ -51,5 +53,12 @@ public void addClassPath(String path) { public String getClassPath(){ return StringUtils.join(clzPaths, ";"); } + + + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + } } diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..cb74447d1f --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,80 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NULLConstantInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + if(codes == null || codes.length == 0){ + throw new RuntimeException("illegality byteCode"); + } + ByteCodeIterator it = new ByteCodeIterator(codes); + ClassFile clzFile = new ClassFile(); + it.skip(4); + clzFile.setMinorVersion(it.next2ByteToInt()); + clzFile.setMajorVersion(it.next2ByteToInt()); + + //constant_pool + int poolCount = it.next2ByteToInt() - 1; + ConstantPool constantPool = new ConstantPool(); + constantPool.setSize(poolCount); + constantPool.addConstantInfo(new NULLConstantInfo()); + while(poolCount > 0) { + int tag = it.next1ByteToInt(); + if(tag == ConstantPool.C_CLASS_INFO) { + int nameIndex = it.next2ByteToInt(); + ClassInfo classInfo = new ClassInfo(nameIndex, constantPool); + constantPool.addConstantInfo(classInfo); + } else if(tag == ConstantPool.C_UTF8_INFO) { + int length = it.next2ByteToInt(); + String str = it.nextLengthByteToString(length); + UTF8Info utf8Info = new UTF8Info(str); + constantPool.addConstantInfo(utf8Info); + } else if(tag == ConstantPool.C_METHODREF_INFO) { + int classInfoIndex = it.next2ByteToInt(); + int nameAndTypeIndex = it.next2ByteToInt(); + MethodRefInfo methodRefInfo = new MethodRefInfo(classInfoIndex, nameAndTypeIndex); + constantPool.addConstantInfo(methodRefInfo); + } else if(tag == ConstantPool.C_NAME_AND_TYPE_INFO) { + int index1 = it.next2ByteToInt(); + int index2 = it.next2ByteToInt(); + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(index1 , index2); + constantPool.addConstantInfo(nameAndTypeInfo); + } else if(tag == ConstantPool.C_FIELDREF_INFO) { + int classInfoIndex = it.next2ByteToInt(); + int nameAndTypeIndex = it.next2ByteToInt(); + FieldRefInfo fieldRefInfo = new FieldRefInfo(classInfoIndex, nameAndTypeIndex) ; + constantPool.addConstantInfo(fieldRefInfo); + } else if(tag == ConstantPool.C_STRING_INFO) { + int index = it.next2ByteToInt(); + StringInfo stringInfo = new StringInfo(index); + constantPool.addConstantInfo(stringInfo); + } else { + throw new RuntimeException("no implement tag = " + tag); + } + poolCount--; + } + clzFile.setConstantPool(constantPool); + + //access_flag TODO + it.next2ByteToInt(); + + //classIndex + int thisClassIndex = it.next2ByteToInt(); + int superClassIndex = it.next2ByteToInt(); + ClassIndex classIndex = new ClassIndex(thisClassIndex, superClassIndex); + clzFile.setClassIndex(classIndex); + + return clzFile; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java index 3f4a585db7..6701f3cd29 100644 --- a/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -5,20 +5,32 @@ import org.junit.Before; import org.junit.Test; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ClassFileLoader; - - - - public class ClassFileloaderTest { + private static final String TEST_EMPLOYEE_V1_CLASS = "com.coderising.jvm.test.EmployeeV1"; private static final String CAFEBABE = "cafebabe"; static String path1 = "D:\\Dev\\git_repository\\coding2017\\group04\\498654356\\mini-jvm\\jvm\\target\\test-classes"; static String path2 = "C:\\temp"; + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = TEST_EMPLOYEE_V1_CLASS; + clzFile = loader.loadClass(className); +// clzFile.print(); //TODO + } @Before public void setUp() throws Exception { @@ -47,7 +59,7 @@ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = TEST_EMPLOYEE_V1_CLASS; byte[] byteCodes = loader.readBinaryCode(className); @@ -61,7 +73,7 @@ public void testClassFileLength() { public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = TEST_EMPLOYEE_V1_CLASS; byte[] byteCodes = loader.readBinaryCode(className); byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; @@ -71,16 +83,11 @@ public void testMagicNumber(){ Assert.assertEquals(CAFEBABE, acctualValue); } - - - - - private String byteToHexString(byte[] codes ){ 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()); + } + } From 4ef40d8d5daff06a948d9fbaacba11ef7672b3a8 Mon Sep 17 00:00:00 2001 From: cmhello88 Date: Sun, 9 Apr 2017 00:00:56 +0800 Subject: [PATCH 075/552] =?UTF-8?q?jvm=E9=83=A8=E5=88=86=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group03/345943980/download-0335/pom.xml | 4 +- group03/345943980/download-0335/test | Bin 0 -> 69464 bytes .../jvm/loader/ClassFileLoader.java | 68 +++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 81 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 30 +++++++ 5 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 group03/345943980/download-0335/test create mode 100644 group03/345943980/mini-jvm-0330/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/EmployeeV1.java diff --git a/group03/345943980/download-0335/pom.xml b/group03/345943980/download-0335/pom.xml index b62ba3fec1..5193da926b 100644 --- a/group03/345943980/download-0335/pom.xml +++ b/group03/345943980/download-0335/pom.xml @@ -28,8 +28,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.7 - 1.7 + 1.8 + 1.8
diff --git a/group03/345943980/download-0335/test b/group03/345943980/download-0335/test new file mode 100644 index 0000000000000000000000000000000000000000..e52791509fe4c7a96bc8344e71c6f52781e4b214 GIT binary patch literal 69464 zcmeF)W0x#ln=ksc%C>FWu2r?lwr$(CZQHhO+qP}jzMt+s=k)2_yT|?j6*==&jFFKq zW?b_>u9?3K8F4@$q+ekFya+t}xPSep1L+sgFG)cKK59`ZAzDd3DN!Loc?B9tp|7!D zzwRX`#wEn5X=b6tsVSx=rt9VC78rL9_YMJm$%uo3)p-M4VgB<`=>NQB{@)9Xy8r(# zfcDQ>eQQfvQwKXods;JlYb)Bn0unU(7P|KKmCEKen9Atf%5jZx9d*c@VtFHChcbHV zahG##Rw0P2QSmIWydoDX1%FDZtS#81h{Wyo;P7UOV))k^xG?3-f|J!DB6NG`Cuf{= zNT5D)=>E7OarEB+e$h?Pabeid9d9XO4aa2~flOaqEnYcy55G=1JALkdcij;9tlvUI zqxjaT+?jZCrQ=L4z#7JdzAa^1VpsrV<(|}@w3#|d;W?%pSnBPP1^?wSj z`KkkTT;56qJ^R(}8VrF&MUd1B)rmjzoOBO~5@S0ax zO%4;FR*w3b{T5fu+(3`x><4HJ^q@WGyQ)}}4R&K8O=rTb^IQbRz=QWpm$KT#m&ss{ z9T6IKDx4o}=(z;euUg0?2|dhYI28Kry^BG7Fjl1`4WE~Gim1}8p#*SMMRjiyU1ZlmD@q#eOj_8T znHbW-yH>bLIBh+q=&~@;?gl3=)Y2( zd)%hVY98ahRk{y%m2Ya6Fi@?&!7C4^G&bYwED!4>@a|vRYr=ssj&Z7!2>3j&saT^X zclLXAwZz~$D{)1@iSa($KGPWqHp8#VhMq7z|< zi(W189a(Jf7%R7@wjSq7I2YpM3OaahGnr*JsV>7yHkZ{wqH_0oe`6y&&?31dTMc0l zchOXdD0qPD_+}{xtQT*7=SI(VWji-}WH1kzVZ6OK=7H^Qf|9{7bY;a#tHC3rnRZXM z%6(mrfB~tZIyv>K{CfcU3b{O(J$P)~{$bz-m%MGXb1sS6JrL%w=u;OgWAK)Yl%$H+ z0>!ZPcsm6id^p$mw#<24zFz}4IHTvmdbtk0%{6Fo%n|1=SXo5|wLyalYk1|Vq1S{i zLc$P;c2U+d@%J1&5uk>J+6%YD9;tXGp^11F6eTpkJ18k})p^F&J;~|kyI@@ush=Hx z_9v%~6rbAK;_^>ZY^60II{md792sCJQfrX!s#7Svh;A!xmAR`uICIGyen(l`>F%aO zoYAXj(NDLT_LO7ZaSIU_CkC5iW>>^n4OmrKb}+)H@x3Z_ld{o&2W{_Xqy{*@5&~&kL?$vJXyDcZRbMXIH!0~kmzRf=YL~~ec~(wWq3uqBlyk;DqvBp z+x+egL+>c8Fau#`44K$zN;dmsG&#vk`{uiZx=JgGpEQ&_L%6$nZ88n2EdzMYi#V>N zGRG7*IWps%uH?ENu-fo<+89S&w6Zgxg}S>#y5@?|Wb>Ee3i@=3ljaSy;t~wkQ%s=1 zrC!PH!6>fI3^3+=zT6w**KR*~)*9ND3~!v!gOTLd@Rc{YIW6QFHe9)|5u2UrUyki( zb%cKpk#<)%LBYO^6<0yd>g62Dt#7-sMG8HoQ||0U=sNNtCAdxZX2yHJUG@=}!Mg#S%wnOL~nu>JOiQ_nS-^b#QhFVvvj9u`eQO%cWIHF zF2ZW;s|WZvq)BZU+6QB)e-+x?ytB$tstjkZVkW367{={c3pXn1p;2dS%CQ3NJQ${L z$2$ly*U;L4ltpY~4#sQixd&K0a`K;o?c5$kDh&=6KC}sxCkd9_^u#8bUB6%mwR}*w z1953%v{14~86|A!IdS>9zM|&f{Z_NOM#3Halzzx+3V{HBdwqTHXYlxIt#Y;rQ1)D#-XpCt zPbsihe6c!R1H(HE^5IwV6<5+FHu#R*c(L5@37z*sJ$%L-b$M-r)m=Q-872Js&iDdI zax2Vmfb0S3t!MpJ!C})QAf8Jd>?%Z#sm(!|kZNsc|u5QBB} z2KSqH8Ko;gQsCfT4je%4fS^7lV-U5(0Ul;SS;8}2s{r~u^`DzI>$`XR`+)LFd%>So zCj6UfF6>QX&}o6p>()Liu?VH1@AqBB(gL^_=0V{rp&R+0<8fT6Y=L<*i!?r35kPi4 zP=1rJ2MY%G@P^`iB>|k0q&K&nW-}{2MgZbqpJ3#|F0xexDsc%?;m7laKgd^?dO|q| z#>5L`eLW*-zt$3oyUA{PsoLYrm{meKg=HBFYgpK8)10BRhg?oqk-@?FH{id*jnIn2 zY%6|z)CIP!EP;A)9?sm7!yIBq=*Q18WXvwY1%-{fD_K+auY6+QoYi9CvPbw zLTcNjmiR4ilo#j)g{Bf z&wt^;s7;g`9Ap`f=Z=d|AN;6yICWEkxbb#QPcz|U?3N;M0zfY*I&Q!n4xr_6D`}+8 z4{a^mN+1L7mG~&7Obq{au||Y(TPpzJj5Skb8De+J&4@*K6p(IT=uOaI9%(c^d&$GO z*DOchG!S#-cZ+dYN&9u&YlyPvDC;OiWv`c)~gpobfH|AMQt=_`` z_0QevBlGfQMD=wj;Sh<4P1{&YUA>ovW$)r~tCbd{GXl(JZG0YXa&Yw#p4{%&^lTXk zM3Fc8RVFJw5a7e5G>%E5*@Kk3xCdbx%2B)>zymfN8W{|V>BDz@Hvr`IkPZi9H7FJV zx8W=xNssO`*ri0{*SJqCK_m+|$oY#bHcdrkVs0h~w-Kvzidb3cyzQK-@zJgZ87h68 zpss8axKIv6#{+D_N}vw>TKi-pzOe~Uu|2P|65|2A4Ny2YHS1PvNBsQ}gq60IN24FC zm@ybHu&`kM)I!YKxI;&29$kVq$j+}+h7jJ1GJ4Nxz3`kzIG(M1%QR%bOGR6lcs>by z19jS+hg>cd9M5o|Dje;gNmTebwRCK7jLiquk+Uc0AcLnk->LlDM2^rcS8b^<0FuHe zXWaZ*PLWc{39o+jY|v?<_r`y1d;TG-t|G50l>)^k6*`Ld6DoEyy_*&f^VhYu$3Te! znBa%a_il^s5ad*3bTZk!U?vAI0cW#9!cAOH)tKV^l3DS%VL6q}LvWb6I4ukmGBQiq zg~cqzIgD6@P$4MJyJqf{2{h&|UVriENhs008>Si}HyftrDAr+$f$bnR z#cd{R7>qTAhF*m+Y%ja1qC(7ED$ zySDDp!t;K5h~KM=nD3bbef0`r`h7gG4*{+WN-sk1JX?7+i%wv$!HuT8*Qu1+kr`SbZ@V8bDJ*@*9eW}AdzQ!W~i|~#g_NR7B!!BsHS_0 z2-CIP`ZQ;Ej|m00rj5AQ3rR%btRWg0+?FWgjct53BHcD#Od`K)OH;4D#6beKo@zzx zksBrMeCx4QD|(SXdZU0nKMwYVSf78sGM%G`edLV+j>dIHB0~JmQlDsTy&x~y6YK(} z1BKNLhPcK?GV5;)J_ek%Lm;(>0D57MHhll_4M2K=6h^jVSfw>cm4tRrb7~T2Q_t6@ znrAx*Z~TiDO`DJfqg-py`t_9o+*Vn)!*Bam77JlY96_q@+>f)zc;>L@{7+SYif641$=xfktH_`p!0($hWeV1m`1 zM}%6mSuuoaVb>C>s@UFTTbSk1P0RxW@Nk#-ZeZ4zCzP$;^_D^DQK@2gjbL!Pb@wSp zIGD5c9FK5(3U-upJS|$Q$Y7@Q7{()t;lIzJAPR(8zK#;adRUO?#CZX6;N9pGyi=Gp`9pqcR7*cYKLe{)|$tk0B$RPP!J3Bnk$ zxCl@**Hy$V`*nRJN548>Qr1+9tgP;vwsQ4&dv!g=C_m9pwR*vnN_UyHE~j(%Da#yF zT`D-yGHhY@BY@apEsf!BXnBMx;Uig=W-?=Ubg$@*L&zrFVplchoNsKfehb0JJ#}U&{Y|r9{3uE7%43^~(?He_APV|4%EWgsHv5f2@`Ymre-E zNSml4AR{X?K&5Dnk&8%Ru|*i`AbQLS=1_3R5)o@lz7lcZbp3w0l%5Gkz#r>hz0nSj zzuy2n(=eW~MM~*T&6dWvou@XRJud27y}LZ`L49a-C~m+6D3!PkS0i{Wid*0 z&Qv8o8i`UaJNSlXD9)OltIfx3a~DrCf zKxVsCx@r^1khjG_9VslmUMCjkufNr`fy>^>^E1tAuPfM-*Fd;wmh4oV#V~LjO2kj@ zfuAUOfue`uU;5JzQCBw@5T;7Rz9p1?rB3tP-aqeU8h=DX*`O+cFty?%OPRc|npFvH^r8GG=0ie$ge%!qtI)Y6BVUN7=D7~n-wR{P^EFVU-J%v{PfUb zsCU!j*ton^5Z!VOeojQU2w&SRw|FCt3$|JVXv&R{IoyJnJ)mf$6a$^nq_`ZqUdLO) z?H(bclgVtEoB{^%_|pg4cu7#yj&zR@xTqPMhmotT24tI#j&R!|PIRQn)38xrX`hSa zvP*RR8h5wP`xNyWf6*XYe9l`UXkQvN^{V_o zejgQk^{On8uDjL1KTdY`<-_3Ev)(qC6JNb&Ehq1O9s__1TjzDbP<&>gj?&m9H&)aH zDJmu8_uP5-LSDE-+in;O!>;~?S53J272Ptvi;ly|rE#uw;XrHrilsi2Da%W&y#A1J zyc*U2H^kOSw`RW~e${hF0A0-kYs^w-vJXT7&)|T4kM=6PRSTKw%pDuo471MVcEo znrKl*2*ScfpQEeyAfHF$!pZF4tBbBrAP=BYW88GQ}dRjvcGECwq00EA*kR~ z%hE_ITkOl++2}RRn7ro`J1G=Tk;3&fe`^S3*V$Y2`I7=EErMl1-s%MQgaPk*m<;N{ zDuGv2$X@!;=b}2y2eVYfVpSL_H;!Q^z@H;k41@R%`FTw_F#xBnbK*ch>moL})V$`l zCO#uIh=&L^*;<&1vFfJ{-U5l1RtOyhA`8?cV%c~VSr*zkIr*l|X>p0x8R{9xuu|LM zr*Bs6kYDVC6o(OY7YiA6s7XX)2ct^YZxvLo3Q`gP?+-F6sB~A+)7cT3*8z`8CHq-j zJ zR=D^_m=mx8el=waRpT-KF}RsZlVl~+G6sR+fc{y9uJ2Od$&RBmh9F};?ue)@^Vn7M zm`Vj8>9{wT*WS!8R%O`jvz6x1|YyHAoc8 zLR5bl^ONSCY>Nf^Lbw|+PhKBr)Pjv_7`#v|{|0DmqSD~Uge26+UXtNEK=#I99G*8R zh+HPP8`>MUbOjg}N^aYia;~7txl`!YzSf*nxPoH#Noq=*+OeO1DVPMF>q7CsNb$Z< zJ^+rFIj3NS225*jsVhw_499TnP47rj^7}($twm@LB zp1h}U#-(5%CWRgxoej1Rh{wbgw)pk4@yDszgqm1oS<9h)HfV5xM%Zi$SA$mKG`QB7 zI&P}naro#jb}Wr5puS#$CDDn<%@aKv5R^D2-ON#6z?5-f=QAQGINGd1W zNBm&+Jq2y1yj~c`yr1v#VfN5Eim2*|X01iBww+V1g|^m5t-=pF&zR)QxP(SxYbV(1 z7wnkMgnfC3W4(p%>L-1{$=)UHn%uGfh@!nA?Hbr_3G}9m^uA3j8D8#-Ue7~k9W?VG zWZ6>}#_qk_!IHdroAJ&_1k)o@jZDvf3RkQ+r8rMaGx^&Oh;m@3pnKC+knoF?14b zGHcXU&6zOuj9g;l)3v2MBh0=kPQa_ST{?&3sVbWO9xU4r0llD_QD+U<;TaU^43Jo3 zX9q1i=y3<42H7%shp#{p6JrzJDF%5h&BLY$GLFDDNT@FtJy{U{vK&lQ(V&ukdt*Zl zq38g#zvsMJ7i~u7ZR3`}oh^MiXj5}-yLQC|r+JXK7JG(ZoiE7k>bXU(pVjs80qr?+-F|)+mgm5@V_{OEB#2V+)lU+ZnX(1?;~~d2QB^LV#bt zEP(#=l;8O;dzv`^`;-@xmzLtQv(t6`_X(e=3a*2AocNU`RA)dBvI}VAfrsZ~xym-l z2L=Y4ehWD)jyHJ7TDg3Udukl=1uH+x^=88PoePQ=S%}MTO@yP@FEGvbLN) zP3-BBKdALsPFbNa@len{ZtH`-(jR3=7D1vAXttiEYQdXo}yGnPLl1soOvNM0@fRz!Wf$};vK=%z^};8+b& zb9bf4hN0~0Qqb8BfS*I~d)Zoo`(L6@SjlX}B3UQW6*6oe{AWB1A` zjVrzE5LvP@eX%!Oq9Z)YPT%Yf5dGcQ`gu>T_d#P-=|NC`GqwO068PxMv%QsZ z4jT$I^ag=SPN{<+*d1h^gf@*~X%SZG3XHU$E9*g@KB*+%0nB+)><~U#CpGj?g-;p$ zdJ8)gQSL8~i2lpU9rJ6A7@k@gbJ*M>I}ny+wD6xy3zk_wbKow8KDU%|iu5p8b8rrI z%*T8GPy-t;(n;#~lOV)b>Sl-A`nYUvzr06sH3v(VW*Ab#TEQ`CR`O4YVh%S%&rup| zcl`mlgk^)l+c5zuA>V{yvcx34@Vwbxyi>a@u%biW-9aV4$>$JX2AJf@#&nWhAq&P? zV2laWLd$;g!-IJt;uItIPE!Q8ntsT#MwbhDMA^e)tHWZg4S~ssi(I#k6~PYI1+&&5 zTzVp;t<8s43s+YK@Ul1<)d#=R>1OV}5}4IqqSUo&54{O=WOMosX>glxKi(zB#yYo~--x&al>paKHrAN2X9IPrbj%pnVULc& zOV6>P)EPFLl?h@=uM4Btp|erC_ZXzOGT^vFo?08@8(Dxo1D|STCe>5sURXVRv^ZFa zaB;CXhOU(2=`LWnx=Ohe>V&tKrP%v77D@#;^tZBHVkH~YDcQ!__E`Z1eLMOjFuB>J z&d;|8ejVhx8*Tgj`+mrTqiTyeCTu7h<#jqW&cb=LOV}GIx*tzxK63b62oz^D6;sqV z`B>pVIG)2X5vx9hso5m}JXtT^`g`(hLbr(R@;n|vxhEp^g2WlqWeSh%N8z(bcJk}; z6P=m8E(FLIq7Q@ZsgK;VF3tg8r^Q0bL&$awq;j}Kdt{lr?rtbBj z$1xW!i~5|89W_-#JD}C9vmTPQ(e%j zZL%GUT-~{1BPyVtg@#HI(-Skit@p&m@ScMlF_qtM%FHO^JmGP*ifuA`O{#@(Vb=Pn zYq+cx^QO)Cz&sLBwK0h^7F%C#6+QX~FkeU@ZJW2OQTc{8DR{RAnmb>XO8ik25x0AJ z=?NO@HI@leoTKdYu+8O&x_A4#>FDYYqRe$sTyCxN#q#9$PetI1Z81MZ8l?x;u%uQ0 zq$3yLroPa7<=I(rG5Zy(qJQ&Bc%WLCV<(T?(n>m0)?Y8uFoIixS{ z$JAkO2Y>59OynAJ6Vg|Yp@A!^A*Y}KA32kFMf1)S&{sw0nAS#Qlnxla>It}$_t)U9 ztuLX5BQt<^8}30}5xh1|i5G?~rPx0nHB$8AwOlmFX^uz=Zd{ zAU7R69j69=&>5E5;W}GCcq%kypN>XRQT!2;Bu8;N%1S$$d{t~Lquwv}Q9tcFyS0$_V-V(D+M?={dVPQSJ!&tXG>)>` zjNW~Jr_~z8A!jTW8Nd{aawtduP2%Oh9j6{noRXPwps6S77)l;#S4zP#VZb5{ z$8gZOEZ0A{@2ISvf(woR{UHm2B;-XKYKm;;%utOhG^~=8`7B z-G(BA!0vmDR+N-!kpI87P|hk*;F_qB_Ki@PH0CaGnt+)K?N;eTSxs`s6bU>!QZ=v@LIBTVSZ<~AY|1WdBhA%8*%!3h82@QA7+{xy z@Wit%>uHZpI?a`znKoLWH9A)G@@<=Bnf6f1)UDiT>KYXR6+`gO_GiqC`4`hMrP4z2 z+4^27bA~^nXm&?7gZ1gdDCnqt_}FoHf|-@F<1P%JWS0=TH#}AnXJQ1EJMydHLg_Z? zbBu1M_M$j-uotzB{gIlJTp}weyDgZ}dPjcfkW*vaM9aj8pEgcHaEBdTJX!{6(FUzK zQcUpTBA^&OZ24sL9g1>IdQx<03-16yVx&!fl);`6Gf=rRs2$rpS**pqqiUp_Z&J)4 zO$;R*e9aB{-^9iv_OauyN4GRBL`BX0gIFBl%OR>G1ApQO3OU*y7f15y&YRoz80SbC z>fbx1?*Jd9uDgDt*8rU_I7qka4J>Ms)*9|t+ZAuz+^#{cs#+5fPQ6jo zh<28L9ZWF8u7*+dx4i^C$@eT9Tw{$1mQ8EMsv z)kpL!OoC;d#>DguAo8o8>xmt~1%cQlOzjH`9(!7kV_ugd-fCOa2;xzrWd*6fP_$Lm1Zm-{1X1@!?SyC#O+mB@~cm{!G8G&ulQ zIiMH?i+-H8sIO$1z`N)qkj;gJUT!}1Dc6DY_fQbiCliP{%SUfxaO9;o>IT6dSxi@_ z!xuAfI4XK{bAXPyW%yhfL;9D_7;=iP7B9|#V=sr;gTbJ;x5+{_(OfA8pBm72SiMn0D z*11FW<0(i+Yp+i0WL%XH({lQ`?!UtM4XpswF36u%gsw=145gzDHyDQZvLXhr9mG@H z&sJ{E_wlrSL_fZG3SWN9e#VG+37C3KMBE`3)n_yCdk2}fE=6hMM`#-x23tm=YS-cdA5kwO093`uXpIAL~x-`hA_NJXl3;(EUVv;V|ym>WtrcvyJ{ha zthI$P@w7I5F#{n}WlHi+T8u6F?vYk9mBlP&JLI64?|+8&bq{jcf!vSQiiGEZbJ&=n z9|@1t{IYN8p`oVBoVgR_*@a^hs~aU=^Jn$@54%sXk`G7MCjp{YNjke zD=%PzG+FtL;pAgA3cvw=RiBa{Ay;~Ll6;#;uhMO>yk^Lg}D*rI2ZmvV`8 z4-(dzs%Mp(lKw45@9n?+CAjo?9pMPelc~Rnoj@U0>NM9j+dbAM1|a33f1uijyeMHZ zL^}7PFZGw&Qx#h{x4&w}i1dZGh@gB@RVa3W=3ezflvMaAd7pj3YBJA=V?iPq1GJN# zpzBXtSsiVu`2HnvG5rQT*<8{2>;=O!BAEqP;o#y{j+t~SCv_G+xeR36UCohKH$L@O zELDYgCD*TLtQ;ZOJOP|Os8_JELwJ%(e-)x=qeet=Ec|4;(bB1@e(WNeM!^=5Fo8+P z-%VLcv8vU(XxA|n$@4kg0i;w}xjZpNWfMay_FgE&EjVvq^4$&C)v_M(sJ1Y-oLqRDBn zwvlL9AvADYG=YzG!w3;m^l-|<2HlD?KZ{l;*_K~>omzVQx+BZvZfj6akf(iS(Bn^)&DM6bjMjoc$lX=GqTtlTPUR@trZKe zPc-gev6RQk;0(vV6{EKMOGoQBP?CQjyl99|_uryO?6^cyq5Kn!8E)kXPzw+DG7xsn zxP?EM#tK_H@W{_cwbs$M_Q2BjD{N z8YgVS-eE=!S>8)BdBo2t-egB$Tz&z!NqSXu(jv}w zHqObcns%(xd&{6SGeeEWwFP03w8h(a!UfWx=q_85*=}YX?i<3?GpLS46cDi*rcy0u zPT-UJ)z^%KMTPOHCZdi58rbS+PzhU5DRT-`Zb`y-7U>`5G#n7Sg$TS46N(u(g;Y)E zKc>vNscYqB6U<6Si$83l$UdwKD6io#jd~HHVu;_Mo4u@3`Nd=T#e;p)sE;}7Pq=_8 z=1|Kj%d(Gg8h)x=d!!z@6L-I6oRH0Xong3A8k{-nHpQD|H(ozV51F$@##&@rX8q9& zwA*nz>_N}1i|zIut+F-(N45!oVB-gFploLYAJPomTF4D;}xZh*CzW}@W@e<$3v~Y1}dX9OwI>f;N{}* z0_*t5ZmJ@^C&aulB=Hh~cZ5+tt25E7r;nqAW2J&vAn>_Gk49~;w4$Nur6&9 zAea*g(_F?(!(S{Py*>g(V_=&kpSj$_XqukWmAGVps#R1EsTM;~wHivYCH&Ab<-$p5W7Q+yUIq(zQ--0(+7Y zc2Ki`6?YWx{}R5c?5->yHP0tc?F2ET0$E`(DtB#d-*F1 zGSe(~gVC&KGZfOrm6B`7l8i~^Ad*woY9r8W-)aHvIVY++8RK~mVxNbK^=f!=2+)KX zMkn7EPCX)cW^h|`sDH(n%TN8q9rSs_nk!5=VtB^d18Vr?y}%Z28Y9}AySo12=)`qo z_CCf#g;WTZr&`zuuzW@zcI=QXFW4Bist2bv*&O)daO{9b%e4`*BIuin^g-9i4?wec z0rz)s?|1laBg#VrG*YJF%gc05+W>Ec+TO)xM@RO&S5+&k4B8`tYj&ZDBTBgkI<6*0Pa78JQS zHdv-cIRY`_y*{le@Fjo7Fm-(+97+V~E<={zvP+r~r!T@jQ4!{J&e#i=g%PO7N zN3u!P%qEp9S38chr1*Lip3_+itlF&@U(TeHnD#MK)?1CN4nxaT#^<+#Gyf))xgG9Y8_9 zEyUeJR$k@OFE3sA07*bo127~6l$Je*y1GdA&x^T-B-STvTbjiOdqivjsn7X&G-nUrqCs~)hjaaI2cyG9TAi;4=0{l$!8ma!j zulr-PevH&IyQ7_A?p^<%VtjMk6Q`Y~ERM(dw_`v2$nF&IyQ7_A?p^<%VtjMk6Q z`Y~ERM(f9D{TQtuqxEC7evHp>S5yny_2gzvh5Df`WB$K%@4$xNRX;|CfnXuP zdS#hsY(Yp6h6W}jPtOFnEQeMFUx^7duKH6`E_#WchHXqaigu{{l-5Uf(HxrERz)yo znbax9kj~iDt?oxH#eTz1;YZ;5YFlwi55E#DF3PAc*7W$tA?~flNDb|obA#E!1zk;9 zMmJWl#A^wF9WPm!>3>cx1`6pm5Xb7->28=XL+alutT8E}k}M&iywfAk6a5}j`Hox5 zy`w0iL5+evYk@vscYWwO`$ItW_vmHPMd_;hpGfs8z~ilop0Q zvZpCv8J-_1N;6=HCDLHa^CK1KOeBYNph^(Wv@buSMLbPDFA>DH7P&xvDeF|32%no1 z%cWhk1;$vZSa?%eM<7hZA%-gta7~Rm^iwpBhu6FwOw1r$yf4Ej2O2JS&)aj>eTSztS4@a4@2u(Dwur;*Jtqt;(RpC0n&_iBsi3;!=o-<^I##%dP zA4pbm>m`ZC2BQaE4tLs0GcQSY6aCbyoj>j^+AZWuXoR}eC-l(r2q>@clyc%BdD<2! z!N6xLK7mX>8kD?vGhr-t;$GIFwL049=#xktg$7t+8n-Z$P9IyM=CD#^*Qj3zU$+Dt zq{WO#aw=RdcJRQ+))f;wol8-nLF#+`2GnU{AlQ?_&PJa95Mo-}THDeqP%Ui-gWKcg zxEl1#P@*>SuxwK`yy52sgFRt`E`FDdP}FjOb5N>W6cJ7*?$P?^sX_ZQgNx%V0OZ@- z`-3oDCEG4h=(cnunFWe9)li~&ub~E%_SJgE6^vlUQCXID1jmA>di@_gdU+qEM-}pk zIkP(t1!&$Vc4~u@k#@drBtkQmGGwWg)Mi;O;=HyNf75K$j2l)v?Ik#7s}JFzGAsI2 zl)zPrLigPrE(X2&BI21>;=%S*iY@@k)FBRq0>rGRx>cU4>ovglV(nqu2^f zdr;1MmBA5%n!}jQCkk*qZ$$Gt3-;k)>`5w^=Ubg*W$J7OylhFdW^c#%X=JMthkc0+S10CSfrh?X7lwaJ9gd%j z(&s6Id&ks+4q6{VDau3q-j83p$D@l=l#mwvi#ZwX;ozTAaPih0^}VAi1hmc!mLG-k zySW>GHY+0SULRs$sen_m;7(vuq@*3!MvP-TleINngu`ZPN zISL@}Fuxczs{GN|eq%iOzCgsgSrKFPlRSm9Y-{jXr@|GiAzjx7>cb^pjl6rY) zC)rsK{VI1e;v!)Cpt`LS?NH^#;6kGB4Nn4yC%Oh)3!DEb`ou=?DlOPGj>456FH*@^ z&Rbwkwfcd^Qs{e1lSx~BPpWbopz&BZRZ2CFKQZM?XDwyA-kBn&jqKG}PZ*SvlTO{9 zQQyl*?!_Khw`P2=BV}9N;y(}UY8_TMpB)MS&~qTt-!+M7aY zX*P^@GTf|NTnnwu{gYlY;c|ngoWY5l1$aFIgB6x0td7lp7%H$d|C;HZHiEVK!B!Cwq9}n}4E>vuSwbLA%z zCAW?f`)8*J-NQs9rT24f=2NIt^c!80eghhSlA}H@*g&qDWE~!w9)hD5 ztVE5xqr52PN0p&z%GXabs$L8#K}w97AR&vrP0ZT3;ZjAeOO3#HTWFl2MwbZTT~ZtD ztbIL4I7t_1lBhiN?cLf3%Zg#xSwHQX1YW$T?%N$#EK32AI9OARVgCc7jX#21vw=6@ zWxdo2;nWRK&2x<{k!dal>cP@-SlM}!E&f(RnGTpd;?8?kZII7%pIj>30iY(JI0p{b zImR`KPdo5uyZEPu7X{0=Xq}s2biYI%$EOB5=AZN-oqpD3FU1Zgxk{irzRKj-+siTw|BwZBSv4tC8ysY|{ z8?j%4nlP))(K~Xndzu@LZ57V@)7QdX)ZNjqO{{k`FEzcsz!b|o8dU?qId4l6c(u5L zh6@XB%}_aVYmt@nAhmbMwnCqV{v>Ws1S`o-_PUGrSo%My~nDcJo8{G8U8PAOJi}_D{5tOs2BzDM&m2H` zskRH|-{3CQHCjIGJl9b_8)oC&2wrK8 zleUT%dVkb%F2l9J39PhlfSIt|l^_5+kdw?~Wr!<=$S~6sxTcIAHv1jv!%+8m&>%s! zBGKk^ROGoa&FWPY5{t~p(JU+9&|ZOfq+!_dCZAbOyc1OpSkbJypY)&Pp4-GgVdauV z#f3JTKugb<-|{f;A0zc|w-(?Y=iW1!w02ENG#?n*eQ z6Q7k#hYJlM_ZwjZTgYo=Y|;h>p?QsxZ|~_8N7xWG2`Ez@4aboSdn%I50;n&xcP2yt ziOI#8j)6n~i9srP6N|2i%|y)C*tm)F806h)9P@v1_D;c~M9r4&vTfV8ZQHhOuf1&B zw)e7a+qP}p{om6a9nrT>Kir6_dauZ;IWuRD9N)|GKC;0*%fQv1_Fl=XBh%J!eH*s& znI6i#Z~DaIFz6G2*__(c38gU{Z?x7%=%q&o(>Y?(!%{+V&YDcz!_ouB;J#z7l-oYx z#Zb{yZ&vPro)^}qCl#l}wnqwi68qWYm$n_f_@U-kFw<9*J-**;$s5NtIXZ5>&qayk z6VAVUF?3KcQ_xpMQojW218aFf8Vbp}x>%uNrZ>}~K+5buKjjgXgT)755)=}gJ=qqD zOD^{`m0F^0E!77UlD#L4C6+M{pkM+_h?=lRa_5o5nm5l!cYV z+gHxlw~1GH_EvzF`<=l4Ij11w(WpTZCo)BXoS=TgUk4UMyRU}4x1JCjVb_7#wnJyn zBNN)tfm-tJH|U`C8yHL{?|yp2!66|?PZSI)UinBrCmy7IcfJQu;TrU|E&PW$<#xK0 zg9dcQ>gS&tqcFnTj{p*p?(OsGi2^slY_cu#%Hx+uw^MLf5G_wzye^*b_Rr6Mt7S)| zBSW~bJl-_jR3*1)b)tvl0tR2xZ&?p>Q-6J*0em2d%WzMbn@a8o+cHq-f;y#W+vy_( zQbLG3OiVA+qStT?tr1&6E)R^W_XO<(&V!6<=PHGsqCp>-wnP+vgG5U*Y&?BZ-61Fy zR#!p4*sBv5XRZ(ymLxxfp4AbcD(u7YGxyr%Hvd=_dOI{#x-yBP)Zau{D6~EHD3Z+V5m#$mk_X3PA`XA)#rS zkr^T?3>H>n!8ii;gD8ZV{7GN{&VY;xZ?nEsqpg8$fl|$)qbt7#5dpj=cd>77wp!k( ztAVz%uDVvYPWbXa?O{)nWQzESn%d%a=X|}I^o93#dKecLVG-@z5yeWX<7_cBBAH*o z%k%K$LCa~g825xdt?A*}%63SYIqK$V;$&%HMbYJ+$1-)Yfv`29DpzN|j*z$<8ZL-o zPJarGy12}Uy!f>1&-ONRwkE-noEmw#M@}`o@6wQ76ZMoK1`{!m5%#vO3X`E?7?%!_ znaN;_o`%MvXG>d`I<#wjReq)RfR!p0zF(03%rklR2MWGanh zn{c*)IY2xcSTnsJ6Cpu^_n@aR>q5iuyr zDwCqQ-onzthXdOhAc>bLR@QF8wRjh>n&HBg)1QnCYcD%x4I5S{1$o*IX`aVaRtdgc z38JQAYY|6YsTQ^>R;a2?6yd6R*bbLxJiL)!YI1yQ5SY1N z$~m_OI0GxLeWmPPu6&xolEuSx>9X{^{8lI>h> zh-T}fwwV#F50)&4+-3o^K8p@O8r^0aLSjF)QenAm!%?+>HNpY=<8p9wt0}mG#F>wy zmTHAeLpW8tpekq_Ryy-O1Dq2;%|6Z0_^1%IJ6j&=yYSxkYbMx~t^=fF(HbRl#a(wX z*tESVQi!aE4Ce+;9NBjBANhqSgfh0g86z`6+EDAVkhQzdXrR~?MAuckFHAvbh`(ud zhszrWU}X^uy%}itr*YuaSqG$%;wI!E9W+phPSi3<(w4~hb)%ltD1lVYzHEABuWLm? zXR0ENW;y@wQ4N`G5w(K{30zWSOYnx)jD3_XOe<+i1klqabAhB>_d+qQQzbHZHuetL z)`sQ6vJ31GNLruE$J>uq>NKv&Gu>*0dAAT*|w~{@q~OtDIb~@q%g0~H>ip1G=fH_Y)4oR9Dkf` z)L?{b0~&%Fqn}V|k_~j7C1@gYjc4<_vX|JD|k6?E&`CT~;Pjr%-%Mkp-E zKr#54Aer(^bhF5c$bhZm@EI4p>w>$^lP!i{>hz0NQjhd5GIDs{Zchg*ko3ans;os~ z5I);Eq9YsKAG<%j?u&e6PK$>CafI-!^RKcWfTV(sJcw4(LurHa&k2$fA#CFh-(aSHl);%2I&Qd3=k@VtHn8HWWGmxy%w)XM{6h+l9SWP-!68pP z@Vw%qIxZ}x;i>WUL?C5gQvM?Rp`CF<^cxgj=#gQjyF5{Ad6`elADk}8$vJVj*aK^S zT{gucoP@oi7);Y-pQMxgNO2})hc1k@Y0~Mu2ve+05LjAy7ob=ZWP1_Gx+p@G(_)-7 z9}*?$7peEY%pB29YtE5h8Zpeg9v`17F;1+3!woa4-?}C3=kWWw5ik&K4J&`5iwn_V zFXBZ98u>Gx%)O8uh~}rmL1fHL`kjVPpC~%dY?F2rZ-|ic7FWz>ELx@VVi&;&B6`Vx&Y3(vMI=mm-C|BsN zr)}vU7WU>mA-y!Rg+zzH9CmcPupYFf!`p%O@TKWk89wfQp|^<%srMJDV=?io)>Trj zy#RH!qcJN<0qeR)6|nmFZ%YvirsXOEqfM;u{=1T)#bl?EaFd zBPGjr*lX+-l5ab)O0q7-aFAjo2nl8`B_mb#QALwMq~<_9yw~u~LV?azaCZI#L*+8{ z>liPazlLCmaL`FimyjkYh(-{daI6(I>Q_k0tj2&f8H8%oOiTh`Hf~J$a+;c!D0lW= zI7hXUq?J}v6+KX$*8p0##1e`L6I-Z?_l-h2T5!?QVe<21`yE5|iH+DWK|G5Zx-7IV z22gc0;5z^?yOh+mE!Q2=6m3OGGPM!ygyt4lpvUt7XM7U8SvkscP8jGR)9 z#I-iMo=?S^v|i7oj$aj&w9tW5e>f(qGe4>w8Q^@DM(aykdR2C?4z7Qv>*+{?)qVxQ+ZkWY^uZ-QoosIEuPu#-o<_eX#P!Xv z|FA*RE~D0MUzyeyF-i@vP{CC*HeJ5s118WUKijf`0zG;F1Pl@j4ca37ce*~&OK0E152zqLuw5}bQcpr*@6WAdlyv0lEo!R{}q}5O# zwi-nWOPq#xK@?sf?y6fL*e3`U^Q}HGGgk zd%#*qg3M-FlVR^zWw* zFB`Y+V~T$Q!_kl#2k818car{zdZT@L(n0jQYm)uGc0a_`gafGO%WSe~=bg5VV$0Y3 z5&vD@UtwL4#-T)Z*&i%-0h=fqqiW3zPP>QAFT1>s-e1oz9lcasvF$wuDa{A3pE0Ou;64o&4jBC3yuP=zJ`EBEGx*w~iyte6W0N0| zhw2nNKEQJd?jZ8=goq?E_eoxQr7PHmX~WhL3H{SndlAK06q!`j7$<8u2(%bLat5np zX=g#yk5x)|61&t)xs@3QYfpeSr{-$<_~&woz`RC^CO{O( zKf&7AM7B#cuqkda+Sp{aS=z#ZH|Z>vNFYTiSy~}F!1*?O~@;J*vZJFb8L?;CU%(pBfeSQ-2Sh^ zv|{5mw!(fR&XCO)uN!aAnqNFB6yCgAXep_Ms4u$dilzoCw%@lt`LbqdhuNBJT+o3dj9CNDE}pZ zwZ1Cc=g>xlv)19h*=~oaS4X7En58}*S{bXa#`W)cwE&Wo{x{911y<&vF(TN2_)Jq zndzzFH%s-K>smT2_|A-zhx--{gOWo!i8t8M{zfCAq#M*c%54pgTGYA5{mDm_@-Fv~ z>TQjB^=O*ZyRpIO*M6m7E~C0dpkSWEK4^Dbt&D2N{Ssd*cX_4vsF8mr1ek2LPpT4m zD=s*LoGiXOs)3GT&fmuesUSZu!zE%qZ^#uEyI{m6CVeK}l;|fj{iGZ@H)}!s9ax*c zJBQ~L(IZU1=zi}01ko)OH-AYHwmXI}9MD7oH>cDAG4*7)%A^H{mLr^XW>lU{3dPW_ zeN=G75OW5i`WJb(NO!3?1KBw{6|Sbq)rq_XGA)cU2L`8zN1L8o5`L}Yd~9y|_0P;F z!6!Xbd%?;Mi_>88bG^_J%6x*)#np%FcX>N{dZGIkl0(VyeU%)uFT(3xH(lgtsTiC=2AE$ z_Kn43U6-0>5CwaKjqPs%`1M6X&B8drmtMofyg!A%eE{+TvV0+w*~OYmvgpL05r4&O zEn1CkupGKXD$)wcrgN=rUnFj!pF|nz64eHy?fNyBA+%cuJkKIMQ;OXWAtv+H_8av` zIHyJD<;x$C-$)EMuUlYdTTIib(T?FcI?iJG=s+QRXNboJQ!tGtWe-!N-6`XNp1iQn zK-W&s0JU;K&nf`8PzA~;^Ho7cueSuyqjqtOkt??W$0eBUuJV>OR) zkNV?c<(vxM#cFQS?OdG7q@_q84 zi*%dq-uPkgRD#<1(h9(QZ%BB3>GiLixf5MX_`l`BSD};ha5knNmx_DB9*Q5K0~pp% zS87~4&y$0me28BR_g2$)1NB4Y1XSd>%6{Q}3 z&L#nKB)zJFCThlmT)O7dfLnUfw4BG%9$~t71yeGhW9L3K9#@w#xBr@{j$o--s~Jx3 zDqFKvH73)-G^D;eDLKos;o*~>>x<_75$x<|wT1wqkfjaNmc7Qv^Hho}aZwVic_hfO zc;f6lJKDd5rDOE@DCj0n<0q>Na6soDx5=6#M)^}LPab5RINnH+H(N-QD~xJE?MbIL zTSh>izvw|YebQ)2mlt$Z9-I0|1a;qzBFNPdfo%bvC(i!x?gFkafa^oZJ0^VwKwn}$ zk9Ta{y^%3r9UD4#`GkFb7QnYC{>^v)>b5s?O2+vbIw)1JNN z0lkrZT(r{?(u=fGJxs6SA}1nO{<*Y3z0?cviAu%3xc7{68S{kRN+}0uO0_a~-$TNm z;+oqU1sVAWXg{PYW5NSExI2aHfsHGuF5j~YH?Sv>?f|z5>(Xl>#|&>A={1-V?B1V( zWF|sUf zr73u1A-E|tHc=;T-{;+J> zPul|z$fRXV0A23VaMCA9@fSe!O+QR;UYZy`JYARK7vGjgzJB3}kiJPhPg`Eud;c*b z?DA;55m?~t+&vr>3i$GH8F-QpSRyD3bN`t@b0$qWpU|i&nDF2iptmI}n2AE_$Lq6V z5=q-`h{a$0pM8Loha`oRAQrT5D~)j#zs#9~L4_1^riH>|OQlrmNhC>{)AjfWumkkR zj5AG3MOw^l3CZd|8^!5Y_0I8RlG0xC91FeKqQU^rF+W#=6K2O-)Lso`EV4F{b8`O( za!f<`5{|=I_^$C{Y*H4KCyfXS00+-Txz?h|bh-W4R?$LaMFkCa z(Ttw3(0!qz4ujVZ^v>fnoj!ySybuqC{!S`fnt6Ok z&!q-prUh!qBAO*8*e9$cYeN>|l{tQscyg0aimXsj(!t>+{n?df`g~_1%}&MJH`(LX z=?Vm6ujU*pI#;Q{WWlpV_*hQDTrLh#G=?6OJWPS0k=YlQQ&4D%JDzCAPxb%XpaV|x zuMpik#F2am-By8ewzg5JRESS>l%ODpwu1>0^f&dX;+ z>Y*A!zTT_)Ncb_{TtZtb<{#wdrl9u-b|-t!lsi{k^y?uUXXoEw0MOMR%a>-rfP9qn z{B5|~C zGE52V;2PDuJ0`e8>uJUh&}Jm+!b%9~+vK7Y5AAjFmN%e9qG{sn^PpqM6-Tx3=HMfW z*$!uM8)V{$tvA>wLAUlnH_~bO1PNea4T*cBXJ7O2*#-E@$r81v>EyuI&;y{MFDA03 zj9H`$oS~WSbF;$Qtgy7P{@4&rFh%ctqs{|XZ*e#daQMFX(^g0|pBZ2c?Vt;+vkJ7z z`b%1?4~+H8@3fPX_=pStn&8Y`zX4O-A~2KnOU-%daPj)!+oH@Lx~-HhCr;O9Zie}n zZ71wzXV_F;IVnXFRh?M0VT(MY^^=S=N2x|>irDG*HEHUEvE}6g52SN?S zIwpgl<)O!s6#|IQ`Lav+^)iW#nm@*9yeM_x?7ht#9u{sPL=8YonxLepl7g5bvKdFW zbc)T=!#g*IKO`m(GuXB_edYREJYMuPV z!r3JcLie`HDlr64s*kU4gmdaJ_)Z$z*{XryLX;O^b5_f+LY9!{Gf9PFV<-40@|5c3 z(_vD)1JmCsR;g6g;|n>>6kEYy)ZfbLup32~j7;P;jGQea3{VPX?JyQ*SeY52Zv3J)7Ut!fkU}MZOK^9u z*ID^JO+QRU!4wj^>3F5di89Uo9yAQPTXB8rOavYa2$cyjS_p2NXgupP4;Lx>E=qoV zOz4uH$}JCoBu)U5WYW9OFJ3yAj!{Eu9Y)ubBfz7E(K4S zz!$B;atk16zi58rkLczn4mnatQL^(JDp>4j7C58{q-{%R;c%3*XBtyp{aG&h#l}|> z@*JfcwYDQ|U6Yh`irX(~UcYs;lFZjKuO7g0B>6VPjd4sd6?84jYnzbxNBRE(+V)}b znpX1rl^1*wmY6-Mx( zap_ouN!O{CgLJ-~o;%SLS-C7J^%#qV@_8+udjGpT*?y(y(B3>vY;8V?d5_~l@1P}r zri*;vR9`WF&ODP@(aOuNIZTg_o#v|!Onc(Xnt%m3+;tk{%qD`cL!EX+MkOz~dBX z5HEH$<*7y`QS*Yx%3S{?4_(|gvXzj<%0<8BojFA;D%%&5RERRXcM5c`i!!L#glThL ztmj^^sAoy#8hJ7$A1GK=@+J9vzH^iKkaUfUdJrh+Fsuw$vwQLC5t9UpQ#-uhWCgS;{o#vtb77S-DQN&N_{p$+^IwP&UQhO+Vr;b~WvmCJW(Ex^;$?%`pJdMX!-?0P>u zqfGjUDOFu0>|L{9Aw?_H`f-wAlnD6}yZ9l;%p=deyJc3}mnuKgx`g(m)ULKJ)_kNq znfikJs_shauhx}?ZuK6!u3 zd1?1X?JT>`OMX+^T<9Mwer)@+?DWHWanrB%_NQIEQo(YKDuLLNJcXXA;1$Fa9xEgX z=~?v>D-M>e*HtAu1+i)AQbq4`ZeU!aFnOR%yfv&@^9E;$hqOzaicK713=x>6og|+! zqgMjT!J?cTA5G*PbZM1+Bh;F+a&4a@mB{PX#4LWG)qb>s*Hsn_of-Yt@Nko1pqdMYb;466WH4wd&$6}#jwcKmRjbLTMq_RK8k6^Qw$J6HN`7mE&F_8w}|^8!(G@7oaq(jUyNI%{^)!v{o!-@2KEx4odVlY zJ+3<{h}-!1Vy0RwwJs}BMzy!o)5CiprNi+A{I}&8jsH+RA+szD_t+_|OD8>ZVEoAb zNUHGXeFxXbq4!1Qp8AJUb6F(+La388FS-YfR;q6bDyzCInN`+5z@%wbO(bsESfhHG zyR9)UX)Qm3#dJt5@{1<(K*G5xlN!xg0JHLF^#*j!&RGT+D&*`Jdo`V6=fZS1=PD)S z>|Lbf?muwtYi?xw6}xQAQkM~ac~n=S3*Y=%=AAb3q_&fo!w2AXUbbDroLC<3=-$2s z`vh?{rZ~nbNj85gAHt9ujA6oxdr>JOBCg3vWm~dTsj0P)Dwon-u~3mZ#=ITPC_a5C zGbwB`q+iLAer|z;YuF9dCVrK8Mrw>~e%IX)!sxf5xLN-Irf}^NbQ}V7?O#GjuGX&o zyWbMDqm=;}iC?bfj`!K@Y(iw9FNh20K0 zW2h~A8-il7)aT>oeiqh5>M+z7@nfvdbPu&Y`r2ZDLRvQ4B6LTlG3}3v_4W3;k`3mq zRYE3hS=4#y9p*kM=xcJ3Kc1?;(MCq4*kR|MdKP5KV@g_^$)+Z<5|ffsJNEB{-Q=5| zpdN~MRusG>$~Rr^zGGw#rGSWzq5~EUw}P-nKvTgxEB3Iv>gSshgEhZJ^#rz!8@BK;lP)a4czx2 zSf6>&7lkVA<}#I0gE|Z*LxgwR^|gV+b=tF_zGo3`#bRxFL6f56VAmkZGp_M#xr8~FqP)*U|RG=nCig_295?bzMnPNWo6Yz?a z4mVjw-r#bKeA29dU)lkVs0134#DS|Npvl*!g_G?JLB)%Fy!Z3 zV}zgD9Mj=2Gwfq4WLJaHVBZ?SEW1l>v2=t(c@=HJ#K=PzUq7cUH3FFlX;&=N2yCVO*VX0!< z3sCq6EBuHwMzdS?+@l@5afk1Z5@x?rm~_cs#`G#>-2;L=x_=bj6K)%S1>v#$NXldU zP9RJO{yTXn;e8R@tQSwra1=i((OGOz8W8cTUDejoiu5rELc1o9#x?rEXji5Z+Sx?7 zvy-=Kkc%9vQ4}z;n(~TjQ-gndO16&yCn+7dVh^Q(O@4z`31#`V_yKAuXIu z2J3#ZNMR1R%+bxVtSRA~Evj-#Q))Ux=n~NwyuvL_x&Jh8cC~&^Q-qy;?2^d#8;N-d#hVvVFwnQl}Yeu?Ua>rD19 z_`%y>x^m29}%X6HFuqh6pQ* zA50Wp&Poid?%-#s=v1j~CPzgK%r6v#Cqau%3``8n3=F{lL~Cej0NjAF7C?dw4E|5# z1`dITka6t)PtsWU@BZ&aZ-oD6(c^!;i>cH9pu;8V(hn+NjQ)z7=UiYg!#v8h=vo{s zh=dP?B(RFg|PpwF~kE}YLriw^N_yFKb@s!ngL|805c6~qG{#wp#em+wFajm{M zGfsaAj3qT$yVR<&+tdD(`<_cExSRDTCmvS#0_K1VIU*GHQhpP%W3)Jy3L7zMuoti(BZrQPMl+PS9jwZa6SncF+peLT?O7+Xn>wzIZ3&Gn(wyH_E z{aHnc26ZYDLS=Py<+vkK~nF4XiDJUN0KL7w^y$0}XShp;h5;2xu-GGh!>jFiEY zak-K}r%=IH7|Yoqke0khEYa=&ac7w$>URNI-yMRASOe;IDSFuCLbI&L@zi+#f1^pl z=YQk>Pr_*Te}%&l{GX$#VsC9~_dkOfqweXVvW)q=ZIYM)lf)ni5HNlgj+96kRXBze zE(8Kgk{>(_Kt-Q{j*&hE^GHTha-b(V4B81Q+E?NzxmnJT-%#jU(X3VD-~8Qp+LW7{ zyOE36sk!m=y8UW~lxUHa^t$8wy8XF*`}y5tyYo9+RR^3Nq~DfM#?Z|?uZu5R=2iW1 ztwyBRTWI@S*&Kmuwk6ZPuXJb6?uPlyNZixx=Q`@v$Xug<5Ft)EI*ef>6Lg8T)nqs$Mc2{Mkls;#iK|9Ed-R`N#f+x#Pm8>4KquZ_5znmPNu6IPPh^5V8(=?WGuqjEtt>AdC8 z3U)<#7k5(aQ%iY?!u-Q=A5zvqOVfON(Xs?rCmA<{MgHbOg@q3_qXTg@17%ekZ;omw z7HgqfN*a|Kg1qz-CUMY*%N+se?O)y;GbUWwAzF62!&JwmN!ojZS|L^K4H+^@5)ve# z^X-WEVN7b2W}$l#E)!G1mxT-~lt`izHfQ-VvsKk)71>*b92_@trBaIav9Mu+_1d;} z@|ph+PBEO!%pXST{)Gi=COrU1klwAp=VZZ8h7eQdej^ ztS+=qRWvTsRn9GnV9g{4w1+-6^{Vzxhh8C%VnyvuxF!)>o%)IBp-J!86tZwE(3I-o@pmga5*D+-=ypu{5Ae`CEH}m?(Y$Ec*!)aNg zoMXUVgux4T1<99Ns#%$tSyfrQ5==asUR*TYOiKx85#rVHlvZsCT;$;E16^woO&$X9 zjff=@EfiOCjy3VE5#wb183qDJqf>3zo#$B_?M9{j#@$RaMogYOp;%jOtXT{*f|_u5 zM*LE|Z9!W#QDxIA?kslU*c!2BpN?q`?yW)wJ};u-q2G9r;pOPy4!zi~l*w>)wxvfk ziHmrBf==lyN~z*iRlEoQD57lrZlWCM9 z0HA5jko_;4d_LmYqr<4%Bq_Bz@BW-dL05iLVWW=0Ul&{r9nwaXnhOE!Mk9sWih*XF z$<^#eyeAg3O_$N3XOj3Y1&U(wpLecX2P3a2r7?#=FL?C1{f!6cvy?gt&#IUjNJG%U z#@VFON|eTR=(C5K@P7GwRhk}$w9i@QHXEz;Z$ymtePQVLNcT+cFBpv0DmQM)bvtMM zkfrY{<)#txw@AXG-O=!64w?Ek{+d}11aJCpTuz?V&BU2HS!2Df78VkP=dAdC!K%S2VglN7*{BKgsII%G%3%W5rE(#|Jcu%wBXAbp6>sgQd+ z5W-KIPaX*6su;yS6iZ!_R|Wh1ReL-?l~QxsA%D0I-vLw!mG8&T%@OpZ-)j71Fhp3~ zFwYa(BMIF9N@^3ZL+=?&d2b7UeWb)~%kDf?xykNIt;x0)0ouKQ_A-e8I0 z=;mX?A5KDH-cInFm8&fKv&&IZrfw%^3m}C84gNc)N^~M)Nv%+n!!{L zCJ5FIHpYmc9KyCBEUXbRWHpOl)NIqc+-o%D;+p#VZiuWZQhdT~wk@b@vb=TvBOP00 z(&68)eCL33o_C{PNS=Bb;mKrp7D30`K)8^%${!g&&GR6Zd|(FB5K`$fcP6I;<{ZrB zEE%_|SO)N3;&&e&vgFG`1|}Y8Xvq;2DjG0IF?M@;C#C*NafsYSZn-4akv?2=jtG*> zHG+QkM0&^dgf5gb3_=)mJ(C{9U*zI=0xKj&KhuhP2a@`d=rcWtwjY4}-37|r=B0?g z7#^?c47HjIi9;B$)tLMNM-Pv45WPbJOFd9NEHxS(Vgg?cQf;a7$d-KQ2IN7mzCEb= ziZldlas|k;M^HNu^z=7u{Eb*6NO)t3A*HM%w!%XU_$`xa$M$QMiFIQ19qBh@tCQ7pT~OBTx$?2Qlf>Yi=rRp(mpD+W9Nu$qrR+>gSbOHFKb zH)r|_5>9~&(7{^Bc5rd}xiS3dLwo6;U1(1?V)ykTYlsqs+XV-;!NVW+($0IG`Unhs%hcDs^)mx6jccBEC$5%l zS8mhWcWgYT)j9o_=}FPCmiSG1Svlt5b+TO@EO!J)iFSWb>bN~iJTtnyNDQpLb75|_ z=GaY^KBBJXL$!KW@tRjYd|%2dR`hM+(3V2CF?|Ma`D47{*OgP6QC|o!=)4ucRrWA= znlX8J;=dE~fIFh#K)(`HujQNGW~a{c4yC?e)emo%e)7%+(XSF_7BGKfkTC`b9&azH z;BU))y2_yL5~zmACxUj%iN4fQ_Ta6E_>@cDsxqVLmr!6TDs-OL9b)&jMqxRhGouukM24Hx6ZXIN-k)Ep7V1KN2U3aNsUK0$VCPB2XiB#1W1m5~ zXzV7;gAO5UgeZYOC?Y->m!GoA>cnSQ*t1>{~+n*#3Pp6T-|hMww2X z&6M57GVeo-CHFXGxw4V){IL&ETFM1A6>}>p94kv)D<-=8gW0SpGIt8FO=gTWmPhmI zMx`B4%T|z$=Ex_NrWOiOVj4^7jpYfF9eT=|X(frY%M2+g4yF|@jbmIUY9{11T+Joo z=Wa!V?m@Uc9)Vyu`Y3bvtzxGD++Qag`{c7!5_zU!**vfJnfPW6o>l@=_(ROsHYlIj zX{W~}{sd75_)=EDfl)abUj>JEDZY8kVffe|-w;n)))Ot}cY}J87xdEM%h@C20XT`1 z8728E`2saX@LPYx&@xJ_kku-)>b16`v6tX%6d8YBF2q!Z->Er6wN;Q>t5D!5pu<$K zx~*0riu1-yyYkn3)UxZIhIcY~Z<=`TkCv+HgKMKAn5wgf*mgUXfR4Rg6f^1M}u=gYGKhB@=J zqw%dtCf3Q;_}Js9uM`2l_h@xz|Jp{y$mP5lMgT`4;b$L^pnMy(-nzXfj)Y2gXh>eO zy?RNZW(69RH!(KKAKJ1pvAptjdK;$E${DynDj5{SMpNkaXI}`SS#&1d8aP`=*}Hta zN_Gf)>4PBu!0_eo%`1J1u?!~RR6yaMtK$En|ED(WZ0~agfB^vb{D%+!?`y;VW*|!4 z$`t^S!67C!3D||XEPFO)e zh#p5gi4z$Anj;xAKbloiAn35r&1AM8XaYK_u!>7ZF`M}fq>m$*vRIZxPZcM~PuiO^D)3~{%@w0tpeMEoXo%67o0)?m z!O@_;-5c@c@HYCJPap0NqASZtWsc9)M-jdtxQPZzK%5no$dIKrE@)ao6v4NS8(gDV zJTmcNj^M5p?H>ZgToTtB)8ClbsdhlLoR-se$=h9}M#4)BgM)HWp~`1ZYonX^lyir7 zf^Mh+4p%ENnoSQwowO%r$Yy+Ffn}ViCjFZjL4eT|1nZhmx0{P=DIUeVVU3=|;xRkQ zK3c+j?{bthke06j2+Mdz#LW{)gm5kait@LXk0DA;7ds!5^t@B%awEbUa$I?6a3M@% zR64PdS-&>7t&Fz6#KfvR7C@-JTxnk9G0D1sKUjpB>&Ou-(aPj2I3$sqmylDUnqww8 zCq#QMX35qYwdeLadaVTVk40oSu}U_HqTnk$lmar#s$ zm1g!jcdAkgD$vD72f7kO(oaju5h2eMfL{9fT98L(&N^_#N(t}yU9nN2xFtPfR@<|d zS8jf}xzKdjOqN-^xySQTxFcv2>2gNeX{?Z2u~RBH`I=0hDd-JJei}0)@T!~n;mDyT z39F~07Av#{=^Sxn(L?R;E2k#UVB#7O{n;Cj-qu{PRf%!UXv5ra{gY`i+j>t#8mo?` zE$f89!bI-;J*`g`s#cR)RI{wr!vz2)A2E~gB$wW>`?xo1KjiC?oBZv+9@}MSbXL+` zo9aZ_6tU&HSmw&tZQ9?qjD*BiLteI`So>7AULS~uecT~WfgJ&>81!f?&+c+pJvtn0 zPqIj~9_@Ei$KBEUR1ZvB$6r>LA>woEHJrGn9}L~qdez$DgYMP2?^2}~#hzBGqOyvG z{CP|)i2~rpH6Y~e^uf`#O}naLw=009>aY{dl)sku+f_P9SBDERzX-{}Dc8R6u($d4 zTpRi$HT)61A=8M~kR6#AlWl29vD8mX@2S|^2|br>x^iB1hqb6II7v_+6Kl8G`eGD# zn(_HSNV}>f{sI?e-xy$w(ZWr13D<^mCJI0{*fC?yt>M~=1G;Sj6;T|~(ip?0GW&!) zf5gMT6%YJ$2xHeFbcQsyf(W%ZrZ8Y1uLlupFXphaxW)c85ox;-Z*hM~X%#FtYwWnjLn??*|5%H%fgopA9uW-Ew-p@Yr_!@$->=uikXS z$%~_)_sLQ88v4;WUd`ixcfg6)bD=8`*1AdtgcG~f7u0o;BCTnRw#8>f>Wu?_3wYqN^WGQp`qN&Y z0JF!O{q8Xk+pcdYm45?<`pF8>4+TRs){C7e`4YLSH-DG!FGCi}9V)J6=e{st#Y6<3 z%;>yqD$>2-QAJcrILh7sQC?w1_)s5K>CUT~fw%NtCyYB;GLtQx6JokGIFgS#IML@B#+~I5*bA)I*e2hc^?JS`&-sbz z?l0%=AFz2Ree)f;{>Iw=h^@9_<0Ne{|~z{=B;r7b@vftZS z@EsKKMSlKB5A@|OIuc3^p$hJ=>j-g$!1n~n{}RrHgY?W0qLz@v z$xiMZsh>Q$9qH^Q*HOSK4nF)lM?yAUe&|EBcANxE`cB;n^-H}(e;d)guq|;}1=lu8 zMLfricdH9NDCV14z6wwwMxKd)gxC~L@e628n6Cz8Rn->z(joA20O=EJC-KU?XOHRb zlR9J7wQE}j>YwOSFkv~^&P;qiLw)6=pPX|`skWfHial(ISXGbXNGpD48jL%cwTE57 z&}H=_X!=I28VYX8=xAdw&d1wb6m4F6_zs&RJVag1)~1HNcBda0b9Sj33D3n#g0lO< z*0V2Aq2eVTvJhXzGW6v;s`ybDro=5%z~Mca7`D(4ulRx0QnW&Z2%I7S`XCwV#LH!ov+iaiM)0$30X2}ThqT@vDlv|}SQ1*nK?2`fS@k=2CHdq(UaZ8&p~ zP6kP4!YK+|?r8Rzk7~)eBW{ZzF*c(GS=7`W3!CgvJQbptUU54d-NkNLi3%f+}&) zR|acWP?JPT>J_Ype{(c^^`fV1OW{$Cofb+`q$3XDk`a+8f1f#Fd}w55j8;uhCVMx< z*RDc*_v%pkw5=5C_ci?a;kDoa9wbPbmAt>rmd2YsdWM7rRXpVB>9%1r@hKTRXiQO0 zGkOKPr6Qhgei|WiF++XKEJb-%W4h8TNZEHd(0EV9*-EhpX{lTG3mbWakWg5DmvD58 zXQiP{sEvQV@hn{wDn#SK{Vge`cJrhc`Vu_EUp0W%gKl#K5qwp5C0_4WlDt;g)M*sJ zw^f!l8h(v2iHa_Lr*$K!+6qM$6O`xBJN-5G;tkvSnnxKyKg+ukRotdoNsRBpyfM%! z+89j6qF#*|yO)N!^9{r3Qo6})4oJmgX=4GX@5fnl`er$pZbE##Fik~BGV5t0=dgsSCyPJ>yg4>a zJtDhD+r<_hy%Hk*mOQ3M+eX{=e6OyhJ$KhqR~h%m>laYppvUg+5v_C9Mq;A9Acf60 zRizjVF~)8>7{~7SpAVrmMIac>0~E_PN4{cJ7ZA^Y7a@D}@!R!6{>7oV);xGR){WMS ztSk-Hi0@y$5+XM5SzNFf2?#hXz;J!b-;%cV)C=naX2T1nvEhkf(x)R>)jG=qG_4QG zjpjL8+E+ZM&v0!ySjH=Cm^FCjY!)eJSi2NAjkPxoC?h+G84fC?Cq8977g{L`EoH?a z?ExGum<%-w5KkOMOZt<)k++f$^PeWMkjftCRahhaZpOk{%xw>(P|T=#!BZ8mAE;{_ zYOlfr%~;$+AlQ_VxpUz+V0`x?V9XL#83|{&P^u*lQMrtrIsIjs56-87X4<}a@z)9S zR6SUSCdcuFlPG#Zt>Bxi(49pUqay3Md$70y@EZ&VNwulNRE$^Ghp&n}sA?d#}7#)nRxJu8%GsB;avRBa|u+C)2 zC@>GlX?qsa7Pbc{P723LB~bSo8zPD6>)$wv356_)xw-1GQBIJ2o@(~pU);cDpcp;V z=y_6_M|n^%zsM#dstVD3c@-Zzxo6c=!P*d6r@UVJgrZy4s)I$^o{J<*Yh@AZav*SS zge$YWK-3@?y-RmI&(39`30hI{E}fqeXZv8j$nm?*Wp_Jdj|e=6H$h+p<4qXddfSEd zv(lQFy?qVmeUlW%2~e&ht)wFGwtx)ZR8U;DP#GqM*5BNCvb?x9nnz-g0L@wtH9Nb? zSQS#I&}2jJVMnwkwRXJIGY&)`OSUlwaj_=@s}T#BchsXR6#5l(tfj`Pi>$E9-?}k1 z&}5vKwhW~d%5ul@Kp*zjEvRJzsUf77hhP&;SF{E!; zdX4%dX_!64~c=Ub+cd3?oGj6X;CkG2U0yE3Bm&dqV= zz9Z#aEM=ORd_)r~H6V>5ENW#z>pfPVTuMoYzvmOZjvPG7nL^AJKtNFMCeF%f*GAV) zOtDq#$HFF=5;PZ~Y;Q;ZsH#UQfr=#lKrR#ClycM!ILX3#gg!4D8$a6tHImKB5AzSS z&yNtO@C;YyS@USMl^&sET^uimTdb9Th6fIoMj`(sfqT(POZ?D|JA#%pUU*Q_Z1ZgtGVmRwDgSP zKD-(%HHgk&^^(Tf&Lv~}Vj5S9(Ls1lJZ##dHn(WS^kK10p(&s4QAx)#LGJvPIvI{$ z3T5YF4|)EBbNi^!qb>Q|k>**u5H;*vWo?yw?5~lg zci0C|!Dq}@5)ieAEVS}0S2n%W>&8ClaZY&3&N(=RWWLZqv<6{X>eY3TPU=3;n&@^zU-A9br)`;Ic2PX9d0+Djo@^T*%1=Py|fj;t`j()e|tpnC0v?JqO~MH;n4 z)q?E>4(~qQxU8PwYKGZyrPn1rJ>eaSbj)+RCor#9i-xm6NWSLm<4+D;?Ur#{6q0>K zDZ}Y{VUIW0mU$|g+RS_zvICiyyChX!P)s4j@u7>|GfsMIo^@}qhfSE#)J>dlUP>n% z(ye-_&tY0<5TUhq9%~q*P1L6g$0l_Y;w?k^YU2QrS49 zUC$BSH=c2?MmV6U_uw?R;kD~Bk(<`H){A|C;|-4^DFCc0`6VBxXMcT3^S9>jD=Svb^UR>;|=YE<*U zMcknaabusYyvVDDE_Dfwk(ps3cg9KOBLSgFWx2j3s;wUWP0*T7u#SHgIq#@*>~x?A z2f2F3-K>XQ!N`3{IVaK?s1_#gDpK$ljjLSyGBxZwN=pqD4PZXyIOH)el?1I!(aXrC7p89u%t|%t zR8?1;yb~?IgkOuWmUD0`Yj}92^1eXO@GEgz@}ksOn_(8r9ojj z(+SpXN-XtP217?J%r@(N1`_NBIbQ^t2wn1h+XxcbLHBXBytd7gzq$E)e7xejj%g5`i>`Kl^OHqFh z^homViL7uG$)d@mUy+GfQRf}YcDkt$%L+6pM|$}cmbl(=?XHb0?oTMabRmzXf{yT> zWWIKYx0VUpY*x}d%93>W+-_f4wdA+?#RjjFBIYqs;gyQdNzb#CXtG_kGyG>U%9Xq` zT}rzo*O(2VAYWN z#fuR-Q}Zg^j8*z1zP-Bcx$HNi&}V2=_bE1p))691b_pVrX#L10Dj zq7yCoIi*>tV9DsdM~r&&_H)zUD_Wd$6waZ!n+pz0|_$=AOW^+A-7Z zp+|{5rQfWedf2*Qy%nz@Ia9>)u*#Uk(*g;j`HAjFS8>3K!0adwoZ;%_-MU$wAF>Z*=Fsh zDZbRCGc+zgxk{V*;MoFS+b37nT@;^7q0_Z3eEkvJOq+zr+?MBzLY{+M+~EZ8Yf)3F zlZQSh8|+_(TqDpfscZL~{&z-}fPrl0BWwU*lk`9BKmYJcHEjR+TiS~iEbWEhT8Sr8 zC^if&Q=AInt`rqDHK8R~E`*MH-#&(GSqk(jxx0TksJoBLDOkov13zEGnw7oADBhyD zTz>i3X@*H~jZO z=$qb^)spk#VjJ`X^kpfzYe3u)QZ6AH6&kA~kk>se> zke1;-TK&M}{QNKu_+yw!h1CZyO|HWQDtn3ds-r*}IT@K_BSgk1wCWpK)r;=@$wJh0 zoir+ME?e;3_pl5T_j(Wh$)_i+`1X8w;)QRDQDb9tdGb3w*FOS26UugVO- zF!B%vAM1exdS7u6Ob_?JLbcSk`?_o!M=Ow5t1|K}aiTw}T3+6@02-*f8k1BeV5m=H z9bt_^7BQ%Bg4)+~kMz|;n;gQawq?ifDlY;#aRrjvMv=Y`O+_NKH$Z9a_t-)+jqW)h zjLW(nk>#W+fpHB;N3?4sJVf)2IPuXvYKwuECJpn_Qlkh3P)2sAJyTGLP}(9@qvW=% zm!gt4bLz%-^2Vdnitui&J1l11Q#W|Y2r~tX{Gm-lvcb-=$5lD}#42rZ#vco7k%HH0 zd2!`8C)FZ!zj7B3htV#%SiN~hJ5iX6KO+?*K(_wCv}J{_H$Ymr%NqTwi=&Nw63{h6 z_j-ob0Z5Q{DdwPeZnfO=q2h(NM2CO_5RG7bea!SmLT=!>rI$j-M+g1pdgU)k%= z-LEOL*et**I@mz9JtQ6MS)26p8bwu}qD8bqNB+Q-AF(W{6&t1!-o4Vyr_pbKdaSJ! ziZ*N|v?k7XlOUuI7T?PqS@t3VrT4;#ln+9Z{3fDg+nw1<7Inf^OfPEQGL&HVzoWwX z_CsB&(1XP-^$o+*A>(r@_q2Ir2HK8p;`=!QwGA&n`6qVeqZA7elPGh@k+Ty|qO6P2 zf9{mE9Uoam2A^Y-O!A+NN)f$7Lo{T*Cj>>&Hp27vwv@xeO+5M{D`j%LHv5>NsfEo- z!9*4J>X8IG1|#|n%O|V^F5rQ?);t1dr2aAfwda%t(;T)=X7j4kt}79K+ zR#qc2<}GO_L~KgEp*AzAG?n~>)x&LsZN42OJ)||FC=xP+8OZCIuI39gzZ0F9-L@k@K^!Q(Aym36Yydk#TCJicW-A~GP6ui(JK*M5M+_9CGUs|mvzM_<;K^+P| zdyp9iNUV5V+DbVP$qjaRqC7P8*}@pnI@s_bqlLuFlqKohrIhSA*~DcX4zwZQ8n@Qz zK$`;5DLSI?x#})?67j=h@h@KniQayL!+T!k52vP0?lh z+omp@s5hx2#6Ny=h#?b^^vB@_MDiR^(q;o0;~`WLkanMx)_&nC+YU?3sa%qIb9;fv zvkScWM99?k$H*(bctVU4z2l z^($xh$XA#5`7Q(Fcf41-=iI!ng;*!<)*|1S7@QJWwFVa<0HaxeOM;??9KLU4c1b81 z#g)pTVvPH8?|ql}7S^yHci6R)H_&pl?nqI8BXH_Kao}!Zl$WezBAAv0Ifo&JsalyJ z;|r`Zjjw<TULBykRea>3d4O&<+_yTFyBnSK1H&8PL}nkfuOu3{>g`XN zxS0MeajysSI3AQ~0^Pd=5B6|3=x(teH_ksRT-K`edj=*lrBpo2C1mO-k)jAT$bf2W zdedF_l;?ik(lu9PU3=%*-(xgM{7eXq-glOZ5co38NPw}G6Zm<2d#1-#9_Tmi0xkgK zXn0DN%P6@$5%nk(X`2dmGMo;UavldShZS1>AoUp>PtzVVO4knV$iNmar|e~_m)Gyy z*^S5}oID_7dd;3eLOtxSSq>ZQyXPU(Wy!`!MnYm5bYpv^D+892d`aS-OK zS{Y(NhWABWM>@gnd-}s-Zy~yg$zUI?YfQ0R1tOjwTNw~)rFx=y2O2vpjv#l&XXb;7 z>)e?0 z`=6w%-{pSJ=A!yV&erCSa{qR=-QLlkBfh_mw88z4YOs7TTh9O8I{zzg?Drx3yv_gB zr>wsE$A|tETK-+-XV3bp>1I)XQu(*n;no@d>_~5&@!#!X@-MC#q<{?bV*mgi>=1?d zjzrko004ZQ|9K(7*ZJ-2_&>hR;fxlX(SkEta7GKxXu%mRIHLt;wBU>uoY8_aT5v`S z&S=3IEjXhEXSCpq7M#(7Gg@#)3(jc487(-Y1!uJ2j24{Hf-_ohMhnhp!5J+$qXlQQ z;EWcW(SkEta7GKxXu%mRIHLt;wBU>uoYA_)wBU>uoY8_aT5v`S&S*KhIB|lV>})x2 zc`rDl1-K=b;EWak@b4L||Bu+Kzo6IKSrG+iF#&KE^RItq`<)s5KgVMJZ`b*M0ZM@@ AyZ`_I literal 0 HcmV?d00001 diff --git a/group03/345943980/mini-jvm-0330/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group03/345943980/mini-jvm-0330/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..17abd10b7e --- /dev/null +++ b/group03/345943980/mini-jvm-0330/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,68 @@ +package com.coderising.jvm.loader; + +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; + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + className = className.replace(".", File.separator) + ".class"; + for (String path : clzPaths) { + String clzFileName = path + File.separator + className; + byte[] codes = this.loadClassFile(clzFileName); + if (codes != null) { + return codes; + } + } + return null; + } + + private byte[] loadClassFile(String clzFileName){ + try { + return IOUtils.toByteArray(new FileInputStream(clzFileName)); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public void addClassPath(String path) { + clzPaths.add(path); + } + + public String getClassPath() { + return StringUtils.join(clzPaths, ";"); + } + + public String getClassPath_V1() { + StringBuffer sb = new StringBuffer(); + /* + * for (int i = 0; i < clzPaths.size(); i++) + { + if (i == clzPaths.size() - 1) { + sb.append(clzPaths.get(i)); + break; + } + sb.append(clzPaths.get(i)); + sb.append(";"); + * + * } + */ + for (int i = 0; i < clzPaths.size(); i++) { + sb.append(clzPaths.get(i)); + if (i < clzPaths.size() - 1) { + sb.append(";"); + } + } + return sb.toString(); + } + +} diff --git a/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..3f7c043ec5 --- /dev/null +++ b/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,81 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class ClassFileloaderTest { + + + static String path1 = "E:\\github\\coding2017\\group03\\345943980\\mini-jvm-0330\\target\\test-classes"; + static String path2 = "D:\\wordtest"; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Sun, 9 Apr 2017 01:47:22 +0800 Subject: [PATCH 076/552] ClassFileParser --- .../jvm/loader/ByteCodeIterator.java | 45 ++++++ .../jvm/loader/ClassFileParser.java | 137 ++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 group04/1299310140/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group04/1299310140/src/com/coderising/jvm/loader/ClassFileParser.java diff --git a/group04/1299310140/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group04/1299310140/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..9cbc4c3fb4 --- /dev/null +++ b/group04/1299310140/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + + private byte[] codes; + private int pos; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public byte[] getBytes(int length){ + byte[] data = Arrays.copyOfRange(codes, pos, pos + length); + pos += length; + return data; + } + + public int nextU1ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); + } + + public int nextU4ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public String nextU1ToString(){ + return Util.byteToHexString(new byte[]{codes[pos++]}); + } + + public String nextU2ToString(){ + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++]}); + } + + public String nextU4ToString(){ + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + +} diff --git a/group04/1299310140/src/com/coderising/jvm/loader/ClassFileParser.java b/group04/1299310140/src/com/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..bb3535dcf6 --- /dev/null +++ b/group04/1299310140/src/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,137 @@ +package com.coderising.jvm.loader; + +import java.io.UnsupportedEncodingException; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + + ClassFile classFile = new ClassFile(); + + ByteCodeIterator iter = new ByteCodeIterator(codes); + + String magicNumber = iter.nextU4ToString(); + System.out.println("magicNumber:"+magicNumber); + + int minorVersion = iter.nextU2ToInt(); + int majorVersion = iter.nextU2ToInt(); + classFile.setMinorVersion(minorVersion); + classFile.setMajorVersion(majorVersion); + + ConstantPool constantPool = this.parseConstantPool(iter); + classFile.setConstPool(constantPool); + + AccessFlag accessFlag = this.parseAccessFlag(iter); + classFile.setAccessFlag(accessFlag); + + ClassIndex classIndex = this.parseClassIndex(iter); + classFile.setClassIndex(classIndex); + + return classFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter){ + AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); + return accessFlag; + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter){ + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + ClassIndex classIndex = new ClassIndex(); + classIndex.setThisClassIndex(thisClassIndex); + classIndex.setSuperClassIndex(superClassIndex); + + return classIndex; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter){ + + ConstantPool constantPool = new ConstantPool(); + + constantPool.addConstantInfo(new NullConstantInfo()); + + int constantNumber = iter.nextU2ToInt();//常量池项的个数 + + for(int i = 1;i <= constantNumber - 1;i++){ + + int type = iter.nextU1ToInt(); + + if(type == 1){ + //UTF8Info + int length = iter.nextU2ToInt(); + byte[] bytes = iter.getBytes(length); + String value = ""; + try { + value = new String(bytes,"UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + UTF8Info utf8Info = new UTF8Info(constantPool); + utf8Info.setLength(length); + utf8Info.setValue(value); + + constantPool.addConstantInfo(utf8Info); + }else if(type == 7){ + //ClassInfo + int utf8Index = iter.nextU2ToInt(); + ClassInfo classInfo = new ClassInfo(constantPool); + classInfo.setUtf8Index(utf8Index); + + constantPool.addConstantInfo(classInfo); + }else if(type == 8){ + //StringInfo + int index = iter.nextU2ToInt(); + StringInfo stringInfo = new StringInfo(constantPool); + stringInfo.setIndex(index); + + constantPool.addConstantInfo(stringInfo); + }else if(type == 9){ + //FieldRefInfo + int classInfoIndex = iter.nextU2ToInt(); + int nameAndTypeIndex = iter.nextU2ToInt(); + FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool); + fieldRefInfo.setClassInfoIndex(classInfoIndex); + fieldRefInfo.setNameAndTypeIndex(nameAndTypeIndex); + + constantPool.addConstantInfo(fieldRefInfo); + }else if(type == 10){ + //MethodRefInfo + int classInfoIndex = iter.nextU2ToInt(); + int nameAndTypeIndex = iter.nextU2ToInt(); + MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool); + methodRefInfo.setClassInfoIndex(classInfoIndex); + methodRefInfo.setNameAndTypeIndex(nameAndTypeIndex); + + constantPool.addConstantInfo(methodRefInfo); + }else if(type == 12){ + //NameAndTypeInfo + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool); + nameAndTypeInfo.setIndex1(nameIndex); + nameAndTypeInfo.setIndex2(descriptorIndex); + + constantPool.addConstantInfo(nameAndTypeInfo); + }else{ + // + throw new RuntimeException("该常量项还未实现!!!"); + } + } + + return constantPool; + } + +} From 1225c2591e74c2b6f59bf08a7bbfe7bc79d87050 Mon Sep 17 00:00:00 2001 From: Harry Date: Sun, 9 Apr 2017 10:22:20 +0800 Subject: [PATCH 077/552] add Stackutil and StackUtilTest --- .../HarryHook/coding2017/stack/StackUtil.java | 138 ++++++++++++++++++ .../coding2017/stack/StackUtilTest.java | 78 ++++++++++ 2 files changed, 216 insertions(+) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java new file mode 100644 index 0000000000..32bbc0da28 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java @@ -0,0 +1,138 @@ +package com.github.HarryHook.coding2017.stack; + +import com.github.HarryHook.coding2017.basic.MyStack; + +public class StackUtil { + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + + public void reverse(MyStack s) { + + if (s.isEmpty()) { + return; + } + // 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。 + Object tmp1 = s.pop(); + reverse(s); + if (s.isEmpty()) { + s.push(tmp1); + return; + } + Object temp2 = s.pop(); + reverse(s); + s.push(tmp1); + reverse(s); + s.push(temp2); + + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public void remove(MyStack s, Object o) { + if (s.isEmpty()) { + return; + } + MyStack stack = new MyStack(); + while (!(s.isEmpty())) { + if (s.peek() != o) { + stack.push(s.pop()); + } else { + s.pop(); + } + } + while (!(stack.isEmpty())) { + s.push(stack.pop()); + } + + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, + * 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public Object[] getTop(MyStack s, int len) { + if (s.isEmpty() || len <= 0) { + return null; + } + if (len > s.size()) { + len = s.size(); + } + Object[] array = new Object[len]; + + int i = 0; + while (i < len) { + array[i++] = s.pop(); + } + while (i != 0) { + s.push(array[--i]); + } + return array; + } + + /** + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s = + * "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true 如果 s = "([b{x]y})", + * 则该字符串中的括号不是成对出现的, 该方法返回false; + * + * @param s + * @return + */ + public boolean isValidPairs(String s) { + if (s == null || s == "") { + return false; + } + MyStack stack = new MyStack(); + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == '(') { + stack.push(s.charAt(i)); + } else if (s.charAt(i) == ')') { + if (stack.isEmpty()) { + return false; + } else { + char outOfStackChar = (char) stack.pop(); + if (outOfStackChar != '(') { + return false; + } + } + } + + if (s.charAt(i) == '{') { + stack.push(s.charAt(i)); + } else if (s.charAt(i) == '}') { + if (stack.isEmpty()) { + return false; + } else { + char outOfStackChar = (char) stack.pop(); + if (outOfStackChar != '{') { + return false; + } + } + } + + if (s.charAt(i) == '[') { + stack.push(s.charAt(i)); + } else if (s.charAt(i) == ']') { + if (stack.isEmpty()) { + return false; + } else { + char outOfStackChar = (char) stack.pop(); + if (outOfStackChar != '[') { + return false; + } + } + } + + } + return true; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java new file mode 100644 index 0000000000..59f1fa1a40 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java @@ -0,0 +1,78 @@ +package com.github.HarryHook.coding2017.stack; +import com.github.HarryHook.coding2017.basic.MyStack; +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class StackUtilTest { + private StackUtil sk; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverse() { + sk = new StackUtil(); + MyStack stack = new MyStack(); + stack.push(1); + stack.push(2); + stack.push(3); + sk.reverse(stack); + assertEquals(1, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(3, stack.pop()); + } + @Test + public void testRemove() { + sk = new StackUtil(); + MyStack stack = new MyStack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(5); + sk.remove(stack, 2); + assertEquals(5, stack.pop()); + assertEquals(3, stack.pop()); + assertEquals(1, stack.pop()); + } + @Test + public void testGetTop() { + sk = new StackUtil(); + MyStack stack = new MyStack(); + + Object[] array = sk.getTop(stack, 3); + assertNull(array); + + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(5); + array = sk.getTop(stack, 3); + assertArrayEquals(array, new Object[] {5, 2, 3}); + array = sk.getTop(stack, 6); + assertArrayEquals(array, new Object[] {5, 2, 3, 2, 1}); + array = sk.getTop(stack, -1); + assertNull(array); + } + @Test + public void testIsValidPairs() { + sk = new StackUtil(); + String expr = null; + assertEquals(false, sk.isValidPairs(expr)); + expr = ""; + assertEquals(false, sk.isValidPairs(expr)); + expr = "{xx[x]t)yyza]}"; + assertEquals(false, sk.isValidPairs(expr)); + expr = "asd{[(asds)]sx}"; + assertEquals(true, sk.isValidPairs(expr)); + } + +} From 3a639be99714f39fda16b6ef13ffcadb96f36e55 Mon Sep 17 00:00:00 2001 From: Harry Date: Sun, 9 Apr 2017 10:25:15 +0800 Subject: [PATCH 078/552] add jvm_2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 读取版本号,ConstantPool, 类索引 --- .../coding2017/jvm/clz/AccessFlag.java | 26 ++++ .../coding2017/jvm/clz/ClassFile.java | 79 ++++++++++++ .../coding2017/jvm/clz/ClassIndex.java | 22 ++++ .../coding2017/jvm/constant/ClassInfo.java | 28 +++++ .../coding2017/jvm/constant/ConstantInfo.java | 31 +++++ .../coding2017/jvm/constant/ConstantPool.java | 31 +++++ .../coding2017/jvm/constant/FieldRefInfo.java | 58 +++++++++ .../jvm/constant/MethodRefInfo.java | 57 +++++++++ .../jvm/constant/NameAndTypeInfo.java | 48 ++++++++ .../jvm/constant/NullConstantInfo.java | 14 +++ .../coding2017/jvm/constant/StringInfo.java | 27 ++++ .../coding2017/jvm/constant/UTF8Info.java | 37 ++++++ .../jvm/loader/ByteCodeIterator.java | 39 ++++++ .../jvm/loader/ClassFileLoader.java | 54 +++++--- .../jvm/loader/ClassFileParser.java | 115 ++++++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 104 ++++++++++++++++ .../HarryHook/coding2017/jvm/util/Util.java | 22 ++++ 17 files changed, 778 insertions(+), 14 deletions(-) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..fedc174261 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java @@ -0,0 +1,26 @@ +package com.github.HarryHook.coding2017.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; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..9754e904e4 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java @@ -0,0 +1,79 @@ +package com.github.HarryHook.coding2017.jvm.clz; + +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.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 void setClzIndex(ClassIndex clzIndex) { + this.clzIndex = 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 setConstantPool(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 = 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(); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..9b6162360d --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java @@ -0,0 +1,22 @@ +package com.github.HarryHook.coding2017.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/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..305ac57f5a --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.github.HarryHook.coding2017.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/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..3cf807a716 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java @@ -0,0 +1,31 @@ +package com.github.HarryHook.coding2017.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); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..9d06349f3b --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.github.HarryHook.coding2017.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; + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..6e8ddcb91b --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.github.HarryHook.coding2017.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(); + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7815c8a6a2 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java @@ -0,0 +1,57 @@ +package com.github.HarryHook.coding2017.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(); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..519656f681 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,48 @@ +package com.github.HarryHook.coding2017.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/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..59489a965c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java @@ -0,0 +1,14 @@ +package com.github.HarryHook.coding2017.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..1d625069be --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java @@ -0,0 +1,27 @@ +package com.github.HarryHook.coding2017.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); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..e787b42ed2 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.github.HarryHook.coding2017.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; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..a65cd6f3d8 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,39 @@ +package com.github.HarryHook.coding2017.jvm.loader; + +import java.util.Arrays; + +import com.github.HarryHook.coding2017.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + public byte[] getByte(int len) { + if (pos + len > codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + public String nextU4ToHexString() { + + return Util.byteToHexString(new byte[] {codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public int nextU1ToInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + public int nextU2ToInt() { + + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++]}); + } + public int nextU4ToInt() { + + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java index c0d992bda8..2f2c9c4345 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java @@ -1,51 +1,61 @@ package com.github.HarryHook.coding2017.jvm.loader; +import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; - import java.util.ArrayList; import java.util.List; +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; + + public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - - String fileName = clzPaths.get(0) + File.separatorChar + - className.replace('.', File.separatorChar) + ".class"; - - InputStream in = null; + 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) { + BufferedInputStream bis = null; try { - in = new FileInputStream(fileName); + File f = new File(clzFileName); + bis = new BufferedInputStream(new FileInputStream(f)); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); byte[] buffer = new byte[1024]; int length = 0; - while ((length = in.read(buffer)) != -1) { + while ((length = bis.read(buffer)) != -1) { out.write(buffer, 0, length); } return out.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { - if (in != null) { + if (bis != null) { try { - in.close(); + bis.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; - } - public void addClassPath(String path) { - + if (this.clzPaths.contains(path)) { + return ; + } this.clzPaths.add(path); } @@ -63,4 +73,20 @@ public String getClassPath() { return buffer.toString(); } + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } + public static void main(String[] args) { + ClassFile clzFile = null; + ClassFileLoader loader = new ClassFileLoader(); + String path1 = "F:\\Coding2017\\group02\\727171008\\bin"; + loader.addClassPath(path1); + String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; + clzFile = loader.loadClass(className); + clzFile.print(); + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..4a7cc6bd04 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java @@ -0,0 +1,115 @@ +package com.github.HarryHook.coding2017.jvm.loader; + +import java.io.UnsupportedEncodingException; + +import com.github.HarryHook.coding2017.jvm.clz.AccessFlag; +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.clz.ClassIndex; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.constant.NullConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.StringInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + String magicNumber = iter.nextU4ToHexString(); + if (!"cafebabe".equals(magicNumber)) { + return null; + } + + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstantPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex clzIndex = parseClassIndex(iter); + clzFile.setClzIndex(clzIndex); + + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + return flag; + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + ClassIndex clzIndex = new ClassIndex(); + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + + return clzIndex; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + int constPoolCount = iter.nextU2ToInt(); + System.out.println("const Pool Count : " + constPoolCount); + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + for (int i = 1; i <= constPoolCount - 1; i++) { + int tag = iter.nextU1ToInt(); + if (tag == 7) { + // Class Info + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setUtf8Index(utf8Index); + pool.addConstantInfo(clzInfo); + } else if (tag == 1) { + // UTF8 String + int len = iter.nextU2ToInt(); + byte[] data = iter.getByte(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + + } + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + } else if (tag == 8) { + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == 9) { + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == 10) { + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == 12) { + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setIndex1(iter.nextU2ToInt()); + nameType.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag" + tag + "has not complemented"); + } + + } + System.out.println("Finished reading Constant Pool "); + return pool; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java index a7117f9ede..1f6a3a9a50 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java @@ -5,13 +5,30 @@ import org.junit.Before; import org.junit.Test; +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.clz.ClassIndex; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; public class ClassFileloaderTest { + private static final String FULL_QUALIFIED_CLASS_NAME = "com/github/HarryHook/coding2017/jvm/test/EmployeeV1"; static String path1 = "F:\\Coding2017\\group02\\727171008\\bin"; // F:\Coding2017\group02\727171008\bin\com\github\HarryHook\coding2017\jvm\test static String path2 = "F:\\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; + clzFile = loader.loadClass(className); + clzFile.print(); + } @Before public void setUp() throws Exception { @@ -78,4 +95,91 @@ private String byteToHexString(byte[] codes) { return buffer.toString(); } + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool() { + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java new file mode 100644 index 0000000000..0a05d3f49c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java @@ -0,0 +1,22 @@ +package com.github.HarryHook.coding2017.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } +} \ No newline at end of file From 15447d778707a08132c8e3d1ac4d77ac2b1521ff Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sun, 9 Apr 2017 12:08:38 +0800 Subject: [PATCH 079/552] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B=EF=BC=8C=E4=BF=AE=E6=94=B9getTop=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/StackUtil.java | 7 +- .../coding2017/basic/stack/StackUtilTest.java | 127 ++++++++++-------- 2 files changed, 74 insertions(+), 60 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java index 3b3dc501c7..c4e253d92b 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java @@ -52,7 +52,7 @@ public static void remove(Stack s,Object o) { */ public static Object[] getTop(Stack s, int len) { if (len < 0) { - throw new IndexOutOfBoundsException(); + return null; } Stack tempS = new Stack(); while (tempS.size() * @since
Apr 6, 2017
* @version 1.0 -*/ -public class StackUtilTest { +*/ +public class StackUtilTest { -@Before -public void before() throws Exception { -} + private StackUtil sk; + @Before + public void setUp() throws Exception { + } -@After -public void after() throws Exception { -} + @After + public void tearDown() throws Exception { + } -/** -* -* Method: reverse(Stack s) -* -*/ -@Test -public void testReverse() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: remove(Stack s, Object o) -* -*/ -@Test -public void testRemove() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: getTop(Stack s, int len) -* -*/ -@Test -public void testGetTop() throws Exception { -//TODO: Test goes here... -} + @Test + public void testReverse() { + sk = new StackUtil(); + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + sk.reverse(stack); + assertEquals(1, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(3, stack.pop()); + } + @Test + public void testRemove() { + sk = new StackUtil(); + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(5); + sk.remove(stack, 2); + assertEquals(5, stack.pop()); + assertEquals(3, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(1, stack.pop()); + } + @Test + public void testGetTop() { + sk = new StackUtil(); + Stack stack = new Stack(); -/** -* -* Method: isValidPairs(String s) -* -*/ -@Test -public void testIsValidPairs() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: main(String[] args) -* -*/ -@Test -public void testMain() throws Exception { -//TODO: Test goes here... -} + Object[] array = sk.getTop(stack, 3); + assertArrayEquals(array, new Object[0]); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(5); + array = sk.getTop(stack, 3); + assertArrayEquals(array, new Object[] {5, 2, 3}); + array = sk.getTop(stack, 6); + assertArrayEquals(new Object[] {5, 2, 3, 2, 1}, array); + array = sk.getTop(stack, -1); + assertNull(array); + } + @Test + public void testIsValidPairs() { + sk = new StackUtil(); + String expr = ""; + assertEquals(true, sk.isValidPairs(expr)); + expr = "{xx[])yyza]}"; + assertEquals(false, sk.isValidPairs(expr)); + expr = "asd{[(asds)]sx}"; + assertEquals(true, sk.isValidPairs(expr)); + } -} +} From 5b1c92b1c55a06ac443d4ec0acae0d602e284550 Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Sun, 9 Apr 2017 13:04:15 +0800 Subject: [PATCH 080/552] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E5=91=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jvm/loader/ClassFileLoader.java | 81 +++++++++++ .../jvm/test/ClassFileloaderTest.java | 92 ++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++++ .../563253496/week4_lru/src/LRUPageFrame.java | 135 ++++++++++++++++++ .../week4_lru/src/LRUPageFrameTest.java | 34 +++++ .../week5_stack/src/stack/Stack.java | 63 ++++++++ .../week5_stack/src/stack/StackUtil.java | 129 +++++++++++++++++ .../week5_stack/src/test/StackUtilTest.java | 95 ++++++++++++ 8 files changed, 657 insertions(+) create mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/563253496/week4_lru/src/LRUPageFrame.java create mode 100644 group23/563253496/week4_lru/src/LRUPageFrameTest.java create mode 100644 group23/563253496/week5_stack/src/stack/Stack.java create mode 100644 group23/563253496/week5_stack/src/stack/StackUtil.java create mode 100644 group23/563253496/week5_stack/src/test/StackUtilTest.java diff --git a/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..5f56b80bff --- /dev/null +++ b/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,81 @@ +package com.coderising.jvm.loader; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + String path = getClassFilePath(className); + if (path != null) { + try { + BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path)); + int count = bis.available(); + byte[] content = new byte[count]; + int len = bis.read(content,0,count); + return content; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + + + } + + private byte[] loadClassFile(String clzFileName) { + + return null; + } + + + public void addClassPath(String path) { + clzPaths.add(path); + } + + public String getClassPath_V1() { + + return null; + } + + public String getClassPath() { + StringBuilder sb = new StringBuilder(); + for (String s : clzPaths) { + sb.append(s); + sb.append(";"); + } + sb.deleteCharAt(sb.length() - 1); + return sb.toString(); + } + + private String getClassFilePath(String className) { + StringBuilder sb = new StringBuilder(); + for (String path : clzPaths + ) { + sb.append(path); + sb.append("\\"); + char[] classname = className.toCharArray(); + for (int i = 0; i < classname.length; i++) { + if (classname[i] == '.') { + sb.append("\\"); + + } else { + sb.append(classname[i]); + } + } + sb.append(".class"); + String classpath = sb.toString(); + File file = new File(classpath); + if (file.exists()) { + return classpath; + } + } + return null; + } +} diff --git a/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..1e00b5f2f5 --- /dev/null +++ b/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.loader.ClassFileLoader; + + + + + +public class ClassFileloaderTest { + + + static String path1 = "D:\\mygit\\coding2017\\group23\\563253496\\week5_jvm\\out\\production\\untitled"; + static String path2 = "C:\\temp"; + + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i +* @since
 29, 2017
+* @version 1.0 +*/ 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()); + } + +} diff --git a/group23/563253496/week5_stack/src/stack/Stack.java b/group23/563253496/week5_stack/src/stack/Stack.java new file mode 100644 index 0000000000..3065476c3f --- /dev/null +++ b/group23/563253496/week5_stack/src/stack/Stack.java @@ -0,0 +1,63 @@ +package stack; + +import java.util.ArrayList; + +/** + * Created by bdl19 on 2017/4/8. + */ +public class Stack { + private int count; + private ArrayList elementData; + + public Stack() { + this.count = 0; + elementData = new ArrayList(); + } + + public void push(Object o) { + count++; + elementData.add(o); + + } + + public Object pop() { + count--; + Object o = elementData.get(count); + elementData.remove(count); + return o; + } + + public Object peek() { + + return elementData.get(count-1); + } + + public boolean isEmpty() { + if (count == 0) { + return true; + } else { + return false; + } + } + + public int size() { + return count; + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + Stack s = new Stack(); + while(!this.isEmpty()){ + sb.append(this.peek().toString()); + sb.append(","); + s.push(this.pop()); + } + while(!s.isEmpty()){ + this.push(s.pop()); + } + +// sb.deleteCharAt(sb.length()-1); + return sb.toString(); + } +} + diff --git a/group23/563253496/week5_stack/src/stack/StackUtil.java b/group23/563253496/week5_stack/src/stack/StackUtil.java new file mode 100644 index 0000000000..f94434c17b --- /dev/null +++ b/group23/563253496/week5_stack/src/stack/StackUtil.java @@ -0,0 +1,129 @@ +package stack; + +import stack.Stack; + +/** + * Created by bdl19 on 2017/4/8. + */ + +public class StackUtil { + + + public static void main(String[] args) { + Stack s = new Stack(); + for (int i = 1; i <=5 ; i++) { + s.push(i); + } + System.out.println(s); + reverse(s); + System.out.println(s); + } + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(Stack s) { + Stack temp = new Stack(); + while (!s.isEmpty()) { + temp.push(s.pop()); + } + //System.out.println(temp); + s = temp; + + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + Stack temp = new Stack(); + Object obj; + while (!s.isEmpty()) { + obj = s.pop(); + if (obj.equals(o)) { + break; + } + temp.push(obj); + } + while (!temp.isEmpty()) { + s.push(temp.pop()); + } + + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + if (len > s.size()) { + throw new IndexOutOfBoundsException(); + } + Object[] o = new Object[len]; + Stack temp = new Stack(); + + for (int i = 0; i < len; i++) { + o[i] = s.peek(); + temp.push(s.pop()); + + } + while (!temp.isEmpty()) { + s.push(temp.pop()); + } + return o; + + } + + + /** + * 字符串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) { + char[] chars = s.toCharArray(); + Stack stack = new Stack(); + + for (int i = 0; i < chars.length; i++) { + switch (chars[i]) { + case '(': + stack.push('('); + break; + case '[': + stack.push('['); + break; + case '{': + stack.push('{'); + break; + case ')': + if (!stack.pop().equals('(')) { + return false; + } + break; + case ']': + if (!stack.pop().equals('[')) { + return false; + } + break; + case '}': + if (!stack.pop().equals('{')) { + return false; + } + break; + } + } + + return true; + } + + +} diff --git a/group23/563253496/week5_stack/src/test/StackUtilTest.java b/group23/563253496/week5_stack/src/test/StackUtilTest.java new file mode 100644 index 0000000000..fc1e727103 --- /dev/null +++ b/group23/563253496/week5_stack/src/test/StackUtilTest.java @@ -0,0 +1,95 @@ +package test; + +import junit.framework.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import stack.Stack; +import stack.StackUtil; + +import static com.sun.xml.internal.ws.dump.LoggingDumpTube.Position.After; +import static com.sun.xml.internal.ws.dump.LoggingDumpTube.Position.Before; + +/** +* stack.StackUtil Tester. +* +* @author +* @since
 8, 2017
+* @version 1.0 +*/ +public class StackUtilTest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: reverse(stack.Stack s) +* +*/ +@Test +public void testReverse() throws Exception { +//TODO: Test goes here... + Stack s = new Stack(); + for (int i = 1; i <=5 ; i++) { + s.push(i); + } + Assert.assertEquals("5,4,3,2,1,",s.toString()); + StackUtil.reverse(s); + + Assert.assertEquals("1,2,3,4,5,",s.toString()); +} + +/** +* +* Method: remove(stack.Stack s, Object o) +* +*/ +@Test +public void testRemove() throws Exception { + Stack s = new Stack(); + for (int i = 1; i <=5 ; i++) { + s.push(i); + } + Assert.assertEquals("5,4,3,2,1,",s.toString()); + StackUtil.remove(s,1); + + Assert.assertEquals("5,4,3,2,",s.toString()); +//TODO: Test goes here... +} + +/** +* +* Method: getTop(stack.Stack s, int len) +* +*/ +@Test +public void testGetTop() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: isValidPairs(String s) +* +*/ +@Test +public void testIsValidPairs() throws Exception { +//TODO: Test goes here... + String s = "([e{d}f])"; + boolean b = StackUtil.isValidPairs(s); + Assert.assertEquals(true,b); + s = "([b{x]y})"; + b = StackUtil.isValidPairs(s); + Assert.assertEquals(false,b); + +} + + +} From 469e3ddae55a564403bcd1aff6bdcddeeba99d72 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 9 Apr 2017 13:32:47 +0800 Subject: [PATCH 081/552] add StackUtil --- .../one/src/org/coding/five/StackUtil.java | 126 ++++++++++++++++++ .../test/org/coding/five/StackUtilTest.java | 78 +++++++++++ 2 files changed, 204 insertions(+) create mode 100644 group04/498654356/one/src/org/coding/five/StackUtil.java create mode 100644 group04/498654356/one/test/org/coding/five/StackUtilTest.java diff --git a/group04/498654356/one/src/org/coding/five/StackUtil.java b/group04/498654356/one/src/org/coding/five/StackUtil.java new file mode 100644 index 0000000000..0d9526139e --- /dev/null +++ b/group04/498654356/one/src/org/coding/five/StackUtil.java @@ -0,0 +1,126 @@ +package org.coding.five; + +import java.util.Arrays; + +import org.coding.one.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) { + if(isEmpty(s)) { + return; + } + Stack temp = new Stack(); + reversePush(s, temp); + Stack temp2 = new Stack(); + reversePush(temp, temp2); + reversePush(temp2, s); + } + + private static boolean isEmpty(Stack s) { + return s == null || s.isEmpty(); + } + + private static void reversePush(Stack source, Stack dest) { + while(!source.isEmpty()) { + dest.push(source.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(isEmpty(s) || o == null) { + return; + } + Stack temp = new Stack(); + while(!s.isEmpty()) { + Object dest = s.pop(); + if(!o.equals(dest)) { + temp.push(dest); + } + } + reversePush(temp, s); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + if(isEmpty(s) || len < 1) { + return null; + } + Object[] result = new Object[len]; + int count = 0; + Stack temp = new Stack(); + while(!s.isEmpty() && count < len) { + Object v = s.pop(); + result[count] = v; + temp.push(v); + count++; + } + reversePush(temp, s); + return Arrays.copyOf(result, count); + } + /** + * 字符串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){ + if(s== null || s.isEmpty()) { + return false; + } + char a = '('; + char b = '['; + char c = '{'; + char a2 = ')'; + char b2 = ']'; + char c2 = '}'; + Stack stack = new Stack(); + for(int i = 0, length = s.length(); i < length; i++) { + char charAt = s.charAt(i); + if(charAt == a) { + stack.push(a); + } else if(charAt == b){ + stack.push(b); + } else if(charAt == c){ + stack.push(c); + } else if(charAt == a2){ + if(!isEqualStackTopValue(a, stack)) { + return false; + } + } else if(charAt == b2){ + if(!isEqualStackTopValue(b, stack)) { + return false; + } + } else if(charAt == c2){ + if(!isEqualStackTopValue(c, stack)) { + return false; + } + } + } + + return true; + } + + private static boolean isEqualStackTopValue(char a2, Stack stack) { + return (char) stack.pop() == a2; + } + + +} diff --git a/group04/498654356/one/test/org/coding/five/StackUtilTest.java b/group04/498654356/one/test/org/coding/five/StackUtilTest.java new file mode 100644 index 0000000000..bab59b8690 --- /dev/null +++ b/group04/498654356/one/test/org/coding/five/StackUtilTest.java @@ -0,0 +1,78 @@ +package org.coding.five; + +import static org.junit.Assert.fail; + +import org.coding.one.Stack; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class StackUtilTest { + Stack s ; + + @Before + public void setUp() throws Exception { + s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + } + + @After + public void tearDown() throws Exception { + s = null; + } + + @Test + public void testReverse() { + StackUtil.reverse(s); + Assert.assertEquals(5, s.size()); + Assert.assertEquals(1, s.pop()); + Assert.assertEquals(2, s.pop()); + Assert.assertEquals(3, s.pop()); + Assert.assertEquals(4, s.pop()); + Assert.assertEquals(5, s.pop()); + } + + @Test + public void testRemove() { + StackUtil.remove(s, 1); + Assert.assertEquals(4, s.size()); + Assert.assertEquals(5, s.pop()); + Assert.assertEquals(4, s.pop()); + Assert.assertEquals(3, s.pop()); + Assert.assertEquals(2, s.pop()); + Assert.assertEquals(0, s.size()); + } + + @Test + public void testGetTop() { + Object[] top = StackUtil.getTop(s, 2); + Assert.assertEquals(5, top[0]); + Assert.assertEquals(4, top[1]); + + Assert.assertEquals(5, s.size()); + Assert.assertEquals(5, s.pop()); + Assert.assertEquals(4, s.pop()); + Assert.assertEquals(3, s.pop()); + Assert.assertEquals(2, s.pop()); + Assert.assertEquals(1, s.pop()); + Assert.assertEquals(0, s.size()); + } + + @Test + public void testIsValidPairs() { + String s = "([e{d}f])"; + boolean v = StackUtil.isValidPairs(s); + Assert.assertEquals(true, v); + s = "([b{x]y})"; + v = StackUtil.isValidPairs(s); + Assert.assertEquals(false, v); + + } + +} From 1b6cdec138d42ed173fd7159ad077aac1c14ee4d Mon Sep 17 00:00:00 2001 From: '1299310140' <'13437282785@163.com'> Date: Sun, 9 Apr 2017 14:53:58 +0800 Subject: [PATCH 082/552] StackUtil --- .../src/com/coding/basic/stack/StackUtil.java | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 group04/1299310140/src/com/coding/basic/stack/StackUtil.java diff --git a/group04/1299310140/src/com/coding/basic/stack/StackUtil.java b/group04/1299310140/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..d4809b98bc --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,123 @@ +package com.coding.basic.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) { + if(s == null){ + return; + } + + Stack reverseOne = new Stack(); + while(!s.isEmpty()){ + reverseOne.push(s.pop()); + } + + Stack reverseTwo = new Stack(); + while(!reverseOne.isEmpty()){ + reverseTwo.push(reverseOne.pop()); + } + + while(!reverseTwo.isEmpty()){ + s.push(reverseTwo.pop()); + } + + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s == null){ + return; + } + + Stack temp = new Stack(); + Object top = null; + while(!s.isEmpty()){ + top = s.pop(); + if(top.equals(o)){ + break; + } + temp.push(top); + } + + while(!temp.isEmpty()){ + s.push(temp.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) {//len>s的size,null填充 + if(s == null || len <= 0){ + return null; + } + + Object[] result = new Object[len]; + int i = 0; + for(i = 0;i < len;i++){ + if(s.isEmpty()){ + break; + } + result[i] = s.pop(); + } + + for(int j = i - 1;j >= 0;j--){ + s.push(result[j]); + } + return result; + } + + /** + * 字符串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){ + if(s == null){ + return true; + } + + char[] sc = s.toCharArray(); + Stack scStack = new Stack(); + for(int i = 0;i < sc.length;i++){ + scStack.push(sc[i]); + } + + Stack temp = new Stack(); + while(!scStack.isEmpty()){ + char scStackTop = (char)scStack.pop(); + if(scStackTop == ')' || scStackTop == ']' || scStackTop == '}'){ + temp.push(scStackTop); + continue; + } + + if(scStackTop == '(' || scStackTop == '[' || scStackTop == '{'){ + if(temp.isEmpty()){ + return false; + } + char tempTop = (char)temp.pop(); + if((scStackTop + 1 == tempTop) || (scStackTop + 2 == tempTop)){ + continue; + }else{ + return false; + } + } + } + return true; + } + +} From eb2e3f735c60a111669b737377659ab08ff50913 Mon Sep 17 00:00:00 2001 From: kai Date: Sun, 9 Apr 2017 20:03:34 +0800 Subject: [PATCH 083/552] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group06/1378560653/.classpath | 3 + group06/1378560653/article.txt | 3 +- .../com/coderising/jvm/clz/AccessFlag.java | 25 +++ .../com/coderising/jvm/clz/ClassFile.java | 75 +++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 24 +++ .../coderising/jvm/constant/ConstantInfo.java | 29 +++ .../coderising/jvm/constant/ConstantPool.java | 29 +++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++ .../jvm/constant/MethodRefInfo.java | 55 +++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 +++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++ .../jvm/loader/ByteCodeIterator.java | 40 ++++ .../jvm/loader/ClassFileLoader.java | 137 ++++++++++++ .../jvm/loader/ClassFileParser.java | 144 +++++++++++++ .../jvm/test/ClassFileloaderTest.java | 198 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 0 .../com/coderising/jvm/util/Util.java | 22 ++ .../coderising/download/FileDownloader.java | 5 +- .../download/impl/ConnectionImpl.java | 2 +- .../download/test/ConnectionTest.java | 53 +++++ .../download/test/FileDownloaderTest.java | 60 ++++++ .../jvm/loader/ClassFileLoader.java | 61 ------ .../jvm/test/ClassFileloaderTest.java | 85 -------- .../com/coding/basic/{ => stack}/Stack.java | 2 +- .../src/com/coding/basic/stack/StackUtil.java | 145 +++++++++++++ .../com/coding/basic/stack/StackUtilTest.java | 82 ++++++++ 29 files changed, 1316 insertions(+), 152 deletions(-) create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassFile.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/StringInfo.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java rename group06/1378560653/{src => mini-jvm}/com/coderising/jvm/test/EmployeeV1.java (100%) create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/util/Util.java create mode 100644 group06/1378560653/src/com/coderising/download/test/ConnectionTest.java create mode 100644 group06/1378560653/src/com/coderising/download/test/FileDownloaderTest.java delete mode 100644 group06/1378560653/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group06/1378560653/src/com/coderising/jvm/test/ClassFileloaderTest.java rename group06/1378560653/src/com/coding/basic/{ => stack}/Stack.java (94%) create mode 100644 group06/1378560653/src/com/coding/basic/stack/StackUtil.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/StackUtilTest.java diff --git a/group06/1378560653/.classpath b/group06/1378560653/.classpath index 036cc56d25..7bd01a193c 100644 --- a/group06/1378560653/.classpath +++ b/group06/1378560653/.classpath @@ -1,8 +1,11 @@ + + + diff --git a/group06/1378560653/article.txt b/group06/1378560653/article.txt index 42b64998ea..5d908b43c6 100644 --- a/group06/1378560653/article.txt +++ b/group06/1378560653/article.txt @@ -2,4 +2,5 @@ ڶƪ£http://blog.csdn.net/raymond120/article/details/58043040 ƪ£http://blog.csdn.net/raymond120/article/details/60759278 ƪ£http://blog.csdn.net/raymond120/article/details/61937892 -ƪ£http://blog.csdn.net/raymond120/article/details/68665071 \ No newline at end of file +ƪ£http://blog.csdn.net/raymond120/article/details/68665071 +ƪ£http://blog.csdn.net/raymond120/article/details/68958532 \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/clz/AccessFlag.java b/group06/1378560653/mini-jvm/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassFile.java b/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..650ca8375d --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassIndex.java b/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ClassInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantPool.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/StringInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/constant/UTF8Info.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..9293f1706e --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,40 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public int nextU1ToInt() { + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public byte[] getBytes(int length) { + if(pos + length >= codes.length){ + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes, pos, pos+length); + pos = pos + length; + return data; + } + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..12e7096bc5 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,137 @@ +package com.coderising.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.coderising.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/group06/1378560653/src/com/coderising/jvm/test/EmployeeV1.java b/group06/1378560653/mini-jvm/com/coderising/jvm/test/EmployeeV1.java similarity index 100% rename from group06/1378560653/src/com/coderising/jvm/test/EmployeeV1.java rename to group06/1378560653/mini-jvm/com/coderising/jvm/test/EmployeeV1.java diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/util/Util.java b/group06/1378560653/mini-jvm/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..d1e7ec9e64 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/util/Util.java @@ -0,0 +1,22 @@ +package com.coderising.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 clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - String classDirName = className.replace('.', '\\')+".class"; - String clzpath = getClassPath()+"\\"+ classDirName; - try { - FileInputStream clz = new FileInputStream(clzpath); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - int flag = 0; - while((flag = clz.read())!=-1){ - baos.write(flag); - } - clz.close(); - return baos.toByteArray(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - - public void addClassPath(String path) { - File file = new File(path); - if(file.exists()){ - clzPaths.add(path); - } else { - throw new IllegalArgumentException("路径:"+path+"不存在"); - } - } - - - public String getClassPath(){ - if(clzPaths.isEmpty()){ - return " "; - } - - StringBuffer buf = new StringBuffer(); - for (int i = 0; i < clzPaths.size(); i++) { - buf.append(clzPaths.get(i)); - if(i != (clzPaths.size() - 1)){ - buf.append(";"); - } - } - return buf.toString(); - } - -} \ No newline at end of file diff --git a/group06/1378560653/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group06/1378560653/src/com/coderising/jvm/test/ClassFileloaderTest.java deleted file mode 100644 index 3ace0974f5..0000000000 --- a/group06/1378560653/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coderising.jvm.test; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.loader.ClassFileLoader; - - -public class ClassFileloaderTest { - - - static String path1 = "H:\\github\\coding2017\\group06\\1378560653\\bin"; - static String path2 = "C:\\Temp"; - - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "com.coderising.jvm.test.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i s) { + if(s.isEmpty()){ + return; + } + + Stack temp1 = new Stack<>(); + Stack temp2 = new Stack<>(); + + while(!s.isEmpty()){ + temp1.push(s.pop()); + } + + while(!temp1.isEmpty()){ + temp2.push(temp1.pop()); + } + + while(!temp2.isEmpty()){ + s.push(temp2.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s.isEmpty()){ + return; + } + + Stack temp = new Stack<>(); + + while(!s.isEmpty()){ + Object data = s.pop(); + if(o.equals(data)){ + continue; + } + temp.push(data); + } + + while(!temp.isEmpty()){ + s.push(temp.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + if(s.isEmpty()){ + return new Object[0]; + } + + if(len >= s.size()){ + len = s.size(); + } + + Object[] result = new Object[len]; + + Stack temp = new Stack<>(); + int count = 0; + while(!s.isEmpty()){ + Object data = s.pop(); + temp.push(data); + result[count++] = data; + if(count == len){ + break; + } + } + + while(!temp.isEmpty()){ + s.push(temp.pop()); + } + + return result; + } + /** + * 字符串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){ + if(s.length() == 0){ + return false; + } + + Stack temp1 = new Stack<>(); + Stack temp2 = new Stack<>(); + + for(int i = 0, j = s.length()-1; i <= j; i++,j--){ + temp1.push(s.charAt(i)); + temp2.push(s.charAt(j)); + } + + while(!temp1.isEmpty()&&!temp2.isEmpty()){ + char a = temp1.pop(); + char b = temp2.pop(); + if(a == '('){ + if(b != ')'){ + return false; + } + } + if(a == '[') { + if(b != ']'){ + return false; + } + } + if(a == '{'){ + if(b != '}'){ + return false; + } + } + } + return true; + } + + public static String toString(Stack s) { + StringBuffer buffer = new StringBuffer(); + buffer.append("["); + while(!s.isEmpty()){ + buffer.append(s.pop()); + if(s.size()!=0){ + buffer.append(","); + } + } + buffer.append("]"); + return buffer.toString(); + } +} \ No newline at end of file diff --git a/group06/1378560653/src/com/coding/basic/stack/StackUtilTest.java b/group06/1378560653/src/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..dd7a461ac4 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,82 @@ +package com.coding.basic.stack; + +import static org.junit.Assert.*; +import java.util.Stack; +import org.junit.Assert; +import org.junit.Test; + +public class StackUtilTest { + + @Test + public void testReverse() { + Stack s = new Stack<>(); + StackUtil.reverse(s); + Assert.assertEquals("[]", s.toString()); + + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + + StackUtil.reverse(s); + Assert.assertEquals("[1,2,3,4,5]", StackUtil.toString(s)); + } + @Test + public void testRemove() { + Stack s = new Stack<>(); + StackUtil.remove(s,3); + Assert.assertEquals("[]", s.toString()); + { + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + + StackUtil.remove(s,3); + Assert.assertEquals("[5,4,2,1]", StackUtil.toString(s)); + } + { + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + + StackUtil.remove(s,7); + Assert.assertEquals("[5,4,3,2,1]", StackUtil.toString(s)); + } + } + @Test + public void testGetTop() { + Stack s = new Stack<>(); + assertArrayEquals(new Object[0], StackUtil.getTop(s,3)); + + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + + int[] expected = {5,4,3}; + Object[] result = StackUtil.getTop(s,3); + int[] actual = new int[result.length]; + for(int i = 0; i < result.length; i++){ + actual[i] = (int)result[i]; + } + + assertArrayEquals(expected, actual); + } + + @Test + public void testIsValidPairs(){ + String s1 = "([e{d}f])"; + assertTrue(StackUtil.isValidPairs(s1)); + + String s2 = "([b{x]y})"; + assertFalse(StackUtil.isValidPairs(s2)); + } +} + + From 0d1120a4706e27cdc3f66dcd431cabf3d6cf7811 Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Sun, 9 Apr 2017 20:21:31 +0800 Subject: [PATCH 084/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=9B=AE=E5=BD=95!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01_litestruts/src/main/LoginAction.java | 36 --------- .../01_litestruts/src/main/Struts.java | 71 ----------------- .../work_Big/01_litestruts/src/main/View.java | 27 ------- .../01_litestruts/src/test/StrutsTest.java | 55 ------------- .../02_downloader/src/api/Connection.java | 23 ------ .../src/api/ConnectionException.java | 6 -- .../src/api/ConnectionManager.java | 10 --- .../src/api/DownloadListener.java | 5 -- .../src/impl/ConnectionImpl.java | 54 ------------- .../src/impl/ConnectionManagerImpl.java | 16 ---- .../src/main/DownloadThread.java | 50 ------------ .../src/main/FileDownloader.java | 78 ------------------- .../src/test/DownloaderTest.java | 21 ----- 13 files changed, 452 deletions(-) delete mode 100644 group23/1323434545/work_Big/01_litestruts/src/main/LoginAction.java delete mode 100644 group23/1323434545/work_Big/01_litestruts/src/main/Struts.java delete mode 100644 group23/1323434545/work_Big/01_litestruts/src/main/View.java delete mode 100644 group23/1323434545/work_Big/01_litestruts/src/test/StrutsTest.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/api/Connection.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/api/ConnectionException.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/api/ConnectionManager.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/api/DownloadListener.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/impl/ConnectionImpl.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/impl/ConnectionManagerImpl.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/main/DownloadThread.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/main/FileDownloader.java delete mode 100644 group23/1323434545/work_Big/02_downloader/src/test/DownloaderTest.java diff --git a/group23/1323434545/work_Big/01_litestruts/src/main/LoginAction.java b/group23/1323434545/work_Big/01_litestruts/src/main/LoginAction.java deleted file mode 100644 index 4f48122d92..0000000000 --- a/group23/1323434545/work_Big/01_litestruts/src/main/LoginAction.java +++ /dev/null @@ -1,36 +0,0 @@ -package main; - -public class LoginAction { - private String name; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute() { - if ("test".equals(name) && "1234".equals(password)) { - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name) { - this.name = name; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getMessage() { - return this.message; - } -} \ No newline at end of file diff --git a/group23/1323434545/work_Big/01_litestruts/src/main/Struts.java b/group23/1323434545/work_Big/01_litestruts/src/main/Struts.java deleted file mode 100644 index 5cd2261413..0000000000 --- a/group23/1323434545/work_Big/01_litestruts/src/main/Struts.java +++ /dev/null @@ -1,71 +0,0 @@ -package main; - -import java.io.File; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.Iterator; -import java.util.Map; - -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -public class Struts { - /* - * - * 0. 读取配置文件struts.xml - * - * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , - * "password"="1234") , 那就应该调用 setName和setPassword方法 - * - * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - * - * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 - * {"message": "登录成功"} , 放到View对象的parameters - * - * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 - * - */ - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static View runAction(String actionName, Map parameters) - throws DocumentException, ReflectiveOperationException, SecurityException { - View view = null; - SAXReader reader = new SAXReader(); - Document document = reader.read(new File("./xml/struts.xml")); - Element root = document.getRootElement(); - for (Iterator iterator = (Iterator) root.elementIterator("action"); iterator.hasNext();) { - Element actionElement = (Element) iterator.next(); - String actionElementName = actionElement.attributeValue("name"); - if (actionElementName.equals(actionName)) { - Class c = Class.forName(actionElement.attributeValue("class")); - Constructor con = c.getConstructor(); - Object o = con.newInstance(); - Method setName = c.getMethod("setName", String.class); - setName.invoke(o, parameters.get("name")); - Method setPassword = c.getMethod("setPassword", String.class); - setPassword.invoke(o, parameters.get("password")); - Method execute = c.getMethod("execute"); - String resultStr = execute.invoke(o).toString(); - - for (iterator = actionElement.elementIterator("result"); iterator.hasNext();) { - Element resultElement = (Element) iterator.next(); - if (resultElement.attributeValue("name").equals(resultStr)) { - view = new View(); - parameters.put("name", c.getMethod("getName").invoke(o).toString()); - parameters.put("password", c.getMethod("getPassword").invoke(o).toString()); - parameters.put("message", c.getMethod("getMessage").invoke(o).toString()); - view.setJsp(resultElement.getStringValue()); - view.setParameters(parameters); - } - } - } - - } - return view; - - } - -} \ No newline at end of file diff --git a/group23/1323434545/work_Big/01_litestruts/src/main/View.java b/group23/1323434545/work_Big/01_litestruts/src/main/View.java deleted file mode 100644 index 93c37fd966..0000000000 --- a/group23/1323434545/work_Big/01_litestruts/src/main/View.java +++ /dev/null @@ -1,27 +0,0 @@ -package main; - -import java.util.Map; - -@SuppressWarnings("rawtypes") -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - - public Map getParameters() { - return parameters; - } - - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} \ No newline at end of file diff --git a/group23/1323434545/work_Big/01_litestruts/src/test/StrutsTest.java b/group23/1323434545/work_Big/01_litestruts/src/test/StrutsTest.java deleted file mode 100644 index 836897b221..0000000000 --- a/group23/1323434545/work_Big/01_litestruts/src/test/StrutsTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package test; - -import java.util.HashMap; -import java.util.Map; - -import org.dom4j.DocumentException; -import org.junit.Assert; -import org.junit.Test; - -import main.Struts; -import main.View; - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name", "test"); - params.put("password", "1234"); - View view = null; - try { - view = Struts.runAction(actionName, params); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (DocumentException e) { - e.printStackTrace(); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name", "tes"); - params.put("password", "1234"); - View view = null; - try { - view = Struts.runAction(actionName, params); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (DocumentException e) { - e.printStackTrace(); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } - -} diff --git a/group23/1323434545/work_Big/02_downloader/src/api/Connection.java b/group23/1323434545/work_Big/02_downloader/src/api/Connection.java deleted file mode 100644 index 5b41847037..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group23/1323434545/work_Big/02_downloader/src/api/ConnectionException.java b/group23/1323434545/work_Big/02_downloader/src/api/ConnectionException.java deleted file mode 100644 index 8840863aba..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/api/ConnectionException.java +++ /dev/null @@ -1,6 +0,0 @@ -package api; - -@SuppressWarnings("serial") -public class ConnectionException extends Exception{ - -} diff --git a/group23/1323434545/work_Big/02_downloader/src/api/ConnectionManager.java b/group23/1323434545/work_Big/02_downloader/src/api/ConnectionManager.java deleted file mode 100644 index 4f297a48ef..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/api/DownloadListener.java b/group23/1323434545/work_Big/02_downloader/src/api/DownloadListener.java deleted file mode 100644 index e652867321..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionImpl.java b/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionImpl.java deleted file mode 100644 index 0764117f5b..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package impl; - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - -import api.Connection; - -public class ConnectionImpl implements Connection{ - private HttpURLConnection huConn; - - - public ConnectionImpl(String url) { - try { - huConn = (HttpURLConnection) new URL(url).openConnection(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - huConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - BufferedInputStream bis = new BufferedInputStream(huConn.getInputStream()); - int len =0; - byte[] bytes = new byte[1024]; - while((len=bis.read(bytes))!=-1){ - os.write(bytes, 0, len); - } - os.flush(); - return os.toByteArray(); - } - - @Override - public int getContentLength() { - return huConn.getContentLength(); - } - - @Override - public void close() { - if(null!=huConn){ - huConn.disconnect(); - } - - } - -} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionManagerImpl.java b/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionManagerImpl.java deleted file mode 100644 index 96f461422d..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,16 +0,0 @@ -package impl; - - - -import api.Connection; -import api.ConnectionException; -import api.ConnectionManager; - -public class ConnectionManagerImpl implements ConnectionManager { - - @Override - public Connection open(String url) { - return new ConnectionImpl(url); - } - -} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/main/DownloadThread.java b/group23/1323434545/work_Big/02_downloader/src/main/DownloadThread.java deleted file mode 100644 index 84b17f6c9d..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/main/DownloadThread.java +++ /dev/null @@ -1,50 +0,0 @@ -package main; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.concurrent.CyclicBarrier; - -import api.Connection; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - File saveLocation; - CyclicBarrier barrier; - - public DownloadThread( Connection conn, int startPos, int endPos,File saveLocation,CyclicBarrier barrier){ - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - this.saveLocation = saveLocation; - this.barrier = barrier; - } - - @Override - public void run() { - RandomAccessFile rf = null; - try { - rf = new RandomAccessFile(saveLocation,"rw"); - rf.seek(startPos); - rf.write(conn.read(startPos, endPos)); - barrier.await(); - }catch (Exception e) { - e.printStackTrace(); - }finally { - if(null!=rf){ - try { - rf.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if(null!=conn){ - conn.close(); - } - - } - } -} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/main/FileDownloader.java b/group23/1323434545/work_Big/02_downloader/src/main/FileDownloader.java deleted file mode 100644 index 64a0f61741..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/main/FileDownloader.java +++ /dev/null @@ -1,78 +0,0 @@ -package main; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.concurrent.CyclicBarrier; - -import api.Connection; -import api.ConnectionException; -import api.ConnectionManager; -import api.DownloadListener; -import impl.ConnectionManagerImpl; - -public class FileDownloader { - - String url; - File saveLocation; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String url,File saveLocation) { - this.url = url; - this.saveLocation = saveLocation; - } - - - public void execute() throws ConnectionException{ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - - cm = new ConnectionManagerImpl(); - int length = cm.open(this.url).getContentLength(); - System.out.println("文件长度:"+length); - long time = System.currentTimeMillis(); - CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() { - @Override - public void run() { - listener.notifyFinished(); - System.out.println("耗时:"+(System.currentTimeMillis()-time)/1000+"秒"); - } - }); - - new DownloadThread(cm.open(this.url),0,length/3-1,saveLocation,barrier).start(); - new DownloadThread(cm.open(this.url),length/3,length*2/3-1,saveLocation,barrier).start(); - new DownloadThread(cm.open(this.url),length*2/3,length-1,saveLocation,barrier).start(); - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - - -} \ No newline at end of file diff --git a/group23/1323434545/work_Big/02_downloader/src/test/DownloaderTest.java b/group23/1323434545/work_Big/02_downloader/src/test/DownloaderTest.java deleted file mode 100644 index 220c23d57e..0000000000 --- a/group23/1323434545/work_Big/02_downloader/src/test/DownloaderTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package test; - -import java.io.File; - -import api.ConnectionException; -import api.DownloadListener; -import main.FileDownloader; - -public class DownloaderTest { - public static void main(String[] args) throws ConnectionException { - FileDownloader fd = new FileDownloader("http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.13/bin/apache-tomcat-8.5.13.exe",new File("E:\\tomcat.exe")); - fd.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - System.out.println("下载完了!"); - } - }); - fd.execute(); - } - -} From c2e4670f38038f0c2cbb3dd07caf894087a15cf8 Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Sun, 9 Apr 2017 20:23:48 +0800 Subject: [PATCH 085/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E5=86=8D?= =?UTF-8?q?=E6=AC=A1=E4=BF=AE=E6=94=B9=E7=9B=AE=E5=BD=95!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../01_litestruts/src/main/LoginAction.java | 36 +++++++++ .../01_litestruts/src/main/Struts.java | 71 ++++++++++++++++++ .../01_litestruts/src/main/View.java | 27 +++++++ .../01_litestruts/src/test/StrutsTest.java | 55 ++++++++++++++ .../02_downloader/src/api/Connection.java | 23 ++++++ .../src/api/ConnectionException.java | 6 ++ .../src/api/ConnectionManager.java | 10 +++ .../src/api/DownloadListener.java | 5 ++ .../src/impl/ConnectionImpl.java | 54 ++++++++++++++ .../src/impl/ConnectionManagerImpl.java | 15 ++++ .../src/main/DownloadThread.java | 50 +++++++++++++ .../src/main/FileDownloader.java | 73 +++++++++++++++++++ .../src/test/DownloaderTest.java | 21 ++++++ 13 files changed, 446 insertions(+) create mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java create mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/Struts.java create mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/View.java create mode 100644 group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/api/Connection.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java b/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java new file mode 100644 index 0000000000..4f48122d92 --- /dev/null +++ b/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java @@ -0,0 +1,36 @@ +package main; + +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java b/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java new file mode 100644 index 0000000000..5cd2261413 --- /dev/null +++ b/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java @@ -0,0 +1,71 @@ +package main; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 + * + */ + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static View runAction(String actionName, Map parameters) + throws DocumentException, ReflectiveOperationException, SecurityException { + View view = null; + SAXReader reader = new SAXReader(); + Document document = reader.read(new File("./xml/struts.xml")); + Element root = document.getRootElement(); + for (Iterator iterator = (Iterator) root.elementIterator("action"); iterator.hasNext();) { + Element actionElement = (Element) iterator.next(); + String actionElementName = actionElement.attributeValue("name"); + if (actionElementName.equals(actionName)) { + Class c = Class.forName(actionElement.attributeValue("class")); + Constructor con = c.getConstructor(); + Object o = con.newInstance(); + Method setName = c.getMethod("setName", String.class); + setName.invoke(o, parameters.get("name")); + Method setPassword = c.getMethod("setPassword", String.class); + setPassword.invoke(o, parameters.get("password")); + Method execute = c.getMethod("execute"); + String resultStr = execute.invoke(o).toString(); + + for (iterator = actionElement.elementIterator("result"); iterator.hasNext();) { + Element resultElement = (Element) iterator.next(); + if (resultElement.attributeValue("name").equals(resultStr)) { + view = new View(); + parameters.put("name", c.getMethod("getName").invoke(o).toString()); + parameters.put("password", c.getMethod("getPassword").invoke(o).toString()); + parameters.put("message", c.getMethod("getMessage").invoke(o).toString()); + view.setJsp(resultElement.getStringValue()); + view.setParameters(parameters); + } + } + } + + } + return view; + + } + +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/View.java b/group23/1323434545/work_Other/01_litestruts/src/main/View.java new file mode 100644 index 0000000000..93c37fd966 --- /dev/null +++ b/group23/1323434545/work_Other/01_litestruts/src/main/View.java @@ -0,0 +1,27 @@ +package main; + +import java.util.Map; + +@SuppressWarnings("rawtypes") +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java b/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java new file mode 100644 index 0000000000..836897b221 --- /dev/null +++ b/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java @@ -0,0 +1,55 @@ +package test; + +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + +import main.Struts; +import main.View; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "tes"); + params.put("password", "1234"); + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/Connection.java b/group23/1323434545/work_Other/02_downloader/src/api/Connection.java new file mode 100644 index 0000000000..5b41847037 --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/api/Connection.java @@ -0,0 +1,23 @@ +package api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java new file mode 100644 index 0000000000..8840863aba --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java @@ -0,0 +1,6 @@ +package api; + +@SuppressWarnings("serial") +public class ConnectionException extends Exception{ + +} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java new file mode 100644 index 0000000000..4f297a48ef --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java b/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java new file mode 100644 index 0000000000..e652867321 --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java @@ -0,0 +1,5 @@ +package api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java new file mode 100644 index 0000000000..0764117f5b --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java @@ -0,0 +1,54 @@ +package impl; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +import api.Connection; + +public class ConnectionImpl implements Connection{ + private HttpURLConnection huConn; + + + public ConnectionImpl(String url) { + try { + huConn = (HttpURLConnection) new URL(url).openConnection(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + huConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + BufferedInputStream bis = new BufferedInputStream(huConn.getInputStream()); + int len =0; + byte[] bytes = new byte[1024]; + while((len=bis.read(bytes))!=-1){ + os.write(bytes, 0, len); + } + os.flush(); + return os.toByteArray(); + } + + @Override + public int getContentLength() { + return huConn.getContentLength(); + } + + @Override + public void close() { + if(null!=huConn){ + huConn.disconnect(); + } + + } + +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..a24b3b800b --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package impl; + + + +import api.Connection; +import api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) { + return new ConnectionImpl(url); + } + +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java b/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java new file mode 100644 index 0000000000..84b17f6c9d --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java @@ -0,0 +1,50 @@ +package main; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +import api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + File saveLocation; + CyclicBarrier barrier; + + public DownloadThread( Connection conn, int startPos, int endPos,File saveLocation,CyclicBarrier barrier){ + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.saveLocation = saveLocation; + this.barrier = barrier; + } + + @Override + public void run() { + RandomAccessFile rf = null; + try { + rf = new RandomAccessFile(saveLocation,"rw"); + rf.seek(startPos); + rf.write(conn.read(startPos, endPos)); + barrier.await(); + }catch (Exception e) { + e.printStackTrace(); + }finally { + if(null!=rf){ + try { + rf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(null!=conn){ + conn.close(); + } + + } + } +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java b/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java new file mode 100644 index 0000000000..8febebeada --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java @@ -0,0 +1,73 @@ +package main; + +import java.io.File; +import java.util.concurrent.CyclicBarrier; +import api.ConnectionException; +import api.ConnectionManager; +import api.DownloadListener; +import impl.ConnectionManagerImpl; + +public class FileDownloader { + + String url; + File saveLocation; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String url,File saveLocation) { + this.url = url; + this.saveLocation = saveLocation; + } + + + public void execute() throws ConnectionException{ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + + cm = new ConnectionManagerImpl(); + int length = cm.open(this.url).getContentLength(); + System.out.println("文件长度:"+length); + long time = System.currentTimeMillis(); + CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() { + @Override + public void run() { + listener.notifyFinished(); + System.out.println("耗时:"+(System.currentTimeMillis()-time)/1000+"秒"); + } + }); + + new DownloadThread(cm.open(this.url),0,length/3-1,saveLocation,barrier).start(); + new DownloadThread(cm.open(this.url),length/3,length*2/3-1,saveLocation,barrier).start(); + new DownloadThread(cm.open(this.url),length*2/3,length-1,saveLocation,barrier).start(); + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + + +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java b/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java new file mode 100644 index 0000000000..220c23d57e --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java @@ -0,0 +1,21 @@ +package test; + +import java.io.File; + +import api.ConnectionException; +import api.DownloadListener; +import main.FileDownloader; + +public class DownloaderTest { + public static void main(String[] args) throws ConnectionException { + FileDownloader fd = new FileDownloader("http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.13/bin/apache-tomcat-8.5.13.exe",new File("E:\\tomcat.exe")); + fd.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + System.out.println("下载完了!"); + } + }); + fd.execute(); + } + +} From 4f263d1ba44e1ddb823bc5a04fca9dfe61971adc Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Sun, 9 Apr 2017 20:26:27 +0800 Subject: [PATCH 086/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E7=AC=AC=E5=9B=9B=E6=AC=A1=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84(LRU=E7=AE=97=E6=B3=95)=E4=BD=9C=E4=B8=9A!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../04_LRU/src/main/LRUPageFrame.java | 117 ++++++++++++++++++ .../04_LRU/src/test/LRUPageFrameTest.java | 35 ++++++ 2 files changed, 152 insertions(+) create mode 100644 group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java create mode 100644 group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java diff --git a/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java b/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java new file mode 100644 index 0000000000..b9e7bc9c79 --- /dev/null +++ b/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java @@ -0,0 +1,117 @@ +package main; + +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.capacity = capacity; + this.currentSize = 0; + } + + /** + * 获取缓存中的对象 + * + * @param pageNum + */ + public void access(int pageNum) { + if (first == null && last == null) { + first = new Node(); + first.pageNum = pageNum; + last = first; + currentSize++; + return; + } + Node tagNode = find(pageNum); + if (tagNode != null) { + moveExistingNodeToHead(tagNode); + return; + } + Node node = new Node(); + node.pageNum = pageNum; + addNewNodeToHead(node); + + } + + private void addNewNodeToHead(Node node) { + if (currentSize == capacity) { + removeLast(); + } + Node temp = first; + temp.prev = node; + node.next = temp; + first = node; + 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 temp = last.prev; + temp.next = null; + last = temp; + currentSize--; + } + + /** + * 移动到表头,表示这个节点是最新使用过的 + */ + private void moveExistingNodeToHead(Node node) { + if (node.prev == null) { + return; + } + Node prev = node.prev; + Node next = node.next; + if (next == null) { + last = prev; + } + prev.next = next; + if (next != null) { + next.prev = prev; + } + Node temp = first; + temp.prev = node; + node.prev = null; + node.next = temp; + first = node; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + Node node = first; + while (node != null) { + sb.append(node.pageNum); + node = node.next; + if (node != null) { + sb.append(","); + } + } + return sb.toString(); + } + +} diff --git a/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java b/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java new file mode 100644 index 0000000000..02d1461149 --- /dev/null +++ b/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java @@ -0,0 +1,35 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import main.LRUPageFrame; + +public class LRUPageFrameTest { + + @Test + public void testAccess() { + LRUPageFrame pf = new LRUPageFrame(3); + pf.access(7); + pf.access(0); + pf.access(1); + assertEquals("1,0,7", pf.toString()); + pf.access(2); + assertEquals("2,1,0", pf.toString()); + pf.access(0); + assertEquals("0,2,1", pf.toString()); + pf.access(0); + assertEquals("0,2,1", pf.toString()); + pf.access(3); + assertEquals("3,0,2", pf.toString()); + pf.access(0); + assertEquals("0,3,2", pf.toString()); + pf.access(4); + assertEquals("4,0,3", pf.toString()); + pf.access(5); + assertEquals("5,4,0", pf.toString()); + + } + +} From 6d151332da2dc284c5a01d79d08b8fb3568bd093 Mon Sep 17 00:00:00 2001 From: "[skycobo]" <[1323434545@qq.com]> Date: Sun, 9 Apr 2017 20:28:23 +0800 Subject: [PATCH 087/552] =?UTF-8?q?[=E8=8F=A0=E8=90=9DC]:=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E7=AC=AC5=E6=AC=A1=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84(StackUtil)=E4=BD=9C=E4=B8=9A!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../05_StackUtil/src/main/ArrayList.java | 75 ++++++++++++ .../05_StackUtil/src/main/Iterator.java | 6 + .../05_StackUtil/src/main/ListUtils.java | 11 ++ .../05_StackUtil/src/main/Stack.java | 25 ++++ .../05_StackUtil/src/main/StackUtil.java | 110 ++++++++++++++++++ .../05_StackUtil/src/test/StackUtilTest.java | 93 +++++++++++++++ 6 files changed, 320 insertions(+) create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java new file mode 100644 index 0000000000..cb3e96bb69 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java @@ -0,0 +1,75 @@ +package main; + +import java.util.Arrays; + +public class ArrayList{ + private Object[] elementData = new Object[10]; + private int size; + + public void add(Object o) { + add(size, o); + + } + + public void add(int index, Object o) { + // 检查是否越界 + ListUtils.CheckIndexInRange(0, size, index); + if (size == elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length + 10); + } + if (index < size) { + for (int i = size; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + } + elementData[index] = o; + size++; + } + + public Object remove(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Object tag = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size - 1] = null; + size--; + return tag; + + } + + public Object get(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + return elementData[index]; + + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + private int cursor; + + @Override + public boolean hasNext() { + if (size > 0) { + return cursor < size; + } else { + return false; + } + + } + + @Override + public Object next() { + Object tag = get(cursor); + cursor++; + return tag; + } + }; + + } + +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java new file mode 100644 index 0000000000..4a052a8646 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java @@ -0,0 +1,6 @@ +package main; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java new file mode 100644 index 0000000000..1a52071c8b --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java @@ -0,0 +1,11 @@ +package main; + +public class ListUtils { + public static boolean CheckIndexInRange(int start, int end, int index) { + if (index >= start && index <= end) { + return true; + } + throw new IndexOutOfBoundsException(); + } + +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java new file mode 100644 index 0000000000..bd489f7a98 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java @@ -0,0 +1,25 @@ +package main; + +public class Stack { + private ArrayList list = new ArrayList(); + + public void push(Object o) { + list.add(o); + } + + public Object pop() { + return list.remove(list.size() - 1); + } + + public Object peek() { + return list.get(list.size() - 1); + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java new file mode 100644 index 0000000000..7267563541 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java @@ -0,0 +1,110 @@ +package main; + +import java.util.Arrays; + +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 stack1 = new Stack(); + while (!s.isEmpty()) { + stack1.push(s.pop()); + } + Stack stack2 = new Stack(); + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + while (!stack2.isEmpty()) { + s.push(stack2.pop()); + } + + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + Stack stack = new Stack(); + while (!s.isEmpty()) { + stack.push(s.pop()); + } + while (!stack.isEmpty()) { + Object temp = stack.pop(); + if (!o.equals(temp)) { + s.push(temp); + } + } + + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, + * 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + if (len < 0) { + return new Object[0]; + } + Object[] objArray = new Object[len]; + int i = 0; + for (; i < len; i++) { + if (s.isEmpty()) { + break; + } + objArray[i] = s.pop(); + } + objArray = Arrays.copyOf(objArray, i); + for (int j = objArray.length - 1; j >= 0; j--) { + s.push(objArray[j]); + } + return objArray; + } + + /** + * 字符串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) { + String[] array = s.split(""); + Stack stack = new Stack(); + for (String s1 : array) { + if ("{[()]}".contains(s1)) { + if (!stack.isEmpty()) { + if (")]}".contains(s1)) { + if (s1.replace(")", "(").equals(stack.peek().toString()) + || s1.replace("]", "[").equals(stack.peek().toString()) + || s1.replace("}", "{").equals(stack.peek().toString())) { + stack.pop(); + } else { + return false; + } + } else { + stack.push(s1); + } + } else { + if (")]}".contains(s1)) { + return false; + } + stack.push(s1); + } + } + } + if (stack.isEmpty()) { + return true; + } + return false; + } + +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java new file mode 100644 index 0000000000..d2eb27dad7 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java @@ -0,0 +1,93 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import main.Stack; +import main.StackUtil; + +public class StackUtilTest { + Stack stack; + + @Before + public void setUp() throws Exception { + stack = new Stack(); + } + + @Test + public void testReverse() { + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + StackUtil.reverse(stack); + int[] expected = { 1, 2, 3, 4, 5 }; + for (int i = 0; !stack.isEmpty(); i++) { + assertEquals(expected[i], stack.pop()); + } + } + + @Test + public void testRemove() { + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + StackUtil.remove(stack, 9); + int[] expected = { 5, 4, 3, 2, 1 }; + for (int i = 0; !stack.isEmpty(); i++) { + assertEquals(expected[i], stack.pop()); + } + + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + StackUtil.remove(stack, 3); + int[] expected1 = { 5, 4, 2, 1 }; + for (int i = 0; !stack.isEmpty(); i++) { + assertEquals(expected1[i], stack.pop()); + } + } + + @Test + public void testGetTop() { + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + Object[] result = StackUtil.getTop(stack, 3); + int[] expected = { 5, 4, 3 }; + for (int i = 0; i < result.length; i++) { + assertEquals(expected[i], result[i]); + } + + result = StackUtil.getTop(stack, 9); + int[] expected1 = { 5, 4, 3, 2, 1 }; + for (int i = 0; i < result.length; i++) { + assertEquals(expected1[i], result[i]); + } + + result = StackUtil.getTop(stack, -1); + assertEquals(0, result.length); + } + + @Test + public void testIsValidPairs() { + assertTrue(StackUtil.isValidPairs("12wed333")); + assertTrue(StackUtil.isValidPairs("1{2[3(4)5]6}")); + assertTrue(StackUtil.isValidPairs("{{{[[[((()))]]]}}}")); + assertTrue(StackUtil.isValidPairs("{}[]()([{}])")); + assertFalse(StackUtil.isValidPairs(")abcd{}[]()")); + assertFalse(StackUtil.isValidPairs("a{b[c}d]()")); + assertFalse(StackUtil.isValidPairs("a{b)c}[]{}")); + assertFalse(StackUtil.isValidPairs("{}[](()")); + } + +} From 0391a23dbc703e09ba0fefe0540f2a91ed3caf46 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 9 Apr 2017 21:20:00 +0800 Subject: [PATCH 088/552] add AccessFlag --- .../com/coderising/jvm/clz/AccessFlag.java | 25 ++++++++ .../com/coderising/jvm/clz/ClassFile.java | 8 +++ .../jvm/loader/ClassFileParser.java | 64 ++++++++++++------- .../jvm/test/ClassFileloaderTest.java | 8 +++ 4 files changed, 81 insertions(+), 24 deletions(-) create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/AccessFlag.java diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..cdb8f8859a --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java index 3440fd5fc7..cbcd1dd0ae 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -8,6 +8,7 @@ public class ClassFile { private int MajorVersion; private ConstantPool constantPool; private ClassIndex classIndex; + private AccessFlag accessFlag; public int getMinorVersion() { return minorVersion; @@ -46,5 +47,12 @@ public void setClassIndex(ClassIndex classIndex) { this.classIndex = classIndex; } + public AccessFlag getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(AccessFlag accessFlag) { + this.accessFlag = accessFlag; + } } diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileParser.java index cb74447d1f..feac69befb 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileParser.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ClassFileParser.java @@ -1,5 +1,6 @@ package com.coderising.jvm.loader; +import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; import com.coderising.jvm.constant.ClassInfo; @@ -24,38 +25,64 @@ public ClassFile parse(byte[] codes) { clzFile.setMajorVersion(it.next2ByteToInt()); //constant_pool - int poolCount = it.next2ByteToInt() - 1; + clzFile.setConstantPool(parseConstantPool(it)); + + //access_flag + clzFile.setAccessFlag(parseAccessFlag(it)); + + //classIndex + clzFile.setClassIndex(parseClassInfex(it)); + + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + int value = iter.next2ByteToInt(); + AccessFlag accessFlag = new AccessFlag(value); + return accessFlag; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + int thisClassIndex = iter.next2ByteToInt(); + int superClassIndex = iter.next2ByteToInt(); + ClassIndex classIndex = new ClassIndex(thisClassIndex, superClassIndex); + return classIndex; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + int poolCount = iter.next2ByteToInt() - 1; ConstantPool constantPool = new ConstantPool(); constantPool.setSize(poolCount); constantPool.addConstantInfo(new NULLConstantInfo()); while(poolCount > 0) { - int tag = it.next1ByteToInt(); + int tag = iter.next1ByteToInt(); if(tag == ConstantPool.C_CLASS_INFO) { - int nameIndex = it.next2ByteToInt(); + int nameIndex = iter.next2ByteToInt(); ClassInfo classInfo = new ClassInfo(nameIndex, constantPool); constantPool.addConstantInfo(classInfo); } else if(tag == ConstantPool.C_UTF8_INFO) { - int length = it.next2ByteToInt(); - String str = it.nextLengthByteToString(length); + int length = iter.next2ByteToInt(); + String str = iter.nextLengthByteToString(length); UTF8Info utf8Info = new UTF8Info(str); constantPool.addConstantInfo(utf8Info); } else if(tag == ConstantPool.C_METHODREF_INFO) { - int classInfoIndex = it.next2ByteToInt(); - int nameAndTypeIndex = it.next2ByteToInt(); + int classInfoIndex = iter.next2ByteToInt(); + int nameAndTypeIndex = iter.next2ByteToInt(); MethodRefInfo methodRefInfo = new MethodRefInfo(classInfoIndex, nameAndTypeIndex); constantPool.addConstantInfo(methodRefInfo); } else if(tag == ConstantPool.C_NAME_AND_TYPE_INFO) { - int index1 = it.next2ByteToInt(); - int index2 = it.next2ByteToInt(); + int index1 = iter.next2ByteToInt(); + int index2 = iter.next2ByteToInt(); NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(index1 , index2); constantPool.addConstantInfo(nameAndTypeInfo); } else if(tag == ConstantPool.C_FIELDREF_INFO) { - int classInfoIndex = it.next2ByteToInt(); - int nameAndTypeIndex = it.next2ByteToInt(); + int classInfoIndex = iter.next2ByteToInt(); + int nameAndTypeIndex = iter.next2ByteToInt(); FieldRefInfo fieldRefInfo = new FieldRefInfo(classInfoIndex, nameAndTypeIndex) ; constantPool.addConstantInfo(fieldRefInfo); } else if(tag == ConstantPool.C_STRING_INFO) { - int index = it.next2ByteToInt(); + int index = iter.next2ByteToInt(); StringInfo stringInfo = new StringInfo(index); constantPool.addConstantInfo(stringInfo); } else { @@ -63,18 +90,7 @@ public ClassFile parse(byte[] codes) { } poolCount--; } - clzFile.setConstantPool(constantPool); - - //access_flag TODO - it.next2ByteToInt(); - - //classIndex - int thisClassIndex = it.next2ByteToInt(); - int superClassIndex = it.next2ByteToInt(); - ClassIndex classIndex = new ClassIndex(thisClassIndex, superClassIndex); - clzFile.setClassIndex(classIndex); - - return clzFile; + return constantPool; } } diff --git a/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java index 6701f3cd29..8c8d7b5f44 100644 --- a/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -5,6 +5,7 @@ import org.junit.Before; import org.junit.Test; +import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; import com.coderising.jvm.constant.ClassInfo; @@ -191,5 +192,12 @@ public void testClassIndex(){ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + + @Test + public void testAccessFlag() { + AccessFlag accessFlag = clzFile.getAccessFlag(); + Assert.assertEquals(true, accessFlag.isPublicClass()); + Assert.assertEquals(false, accessFlag.isFinalClass()); + } } From d96e83aee061f1eafeabeaa57804bb41bcb093c8 Mon Sep 17 00:00:00 2001 From: longcloud Date: Sun, 9 Apr 2017 21:59:30 +0800 Subject: [PATCH 089/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/{ => stack}/Stack.java | 4 +- .../src/com/coding/basic/stack/StackUtil.java | 133 ++++++++++++++++++ 2 files changed, 136 insertions(+), 1 deletion(-) rename group03/619224754/src/com/coding/basic/{ => stack}/Stack.java (87%) create mode 100644 group03/619224754/src/com/coding/basic/stack/StackUtil.java diff --git a/group03/619224754/src/com/coding/basic/Stack.java b/group03/619224754/src/com/coding/basic/stack/Stack.java similarity index 87% rename from group03/619224754/src/com/coding/basic/Stack.java rename to group03/619224754/src/com/coding/basic/stack/Stack.java index cf10ecc1b3..016b7630ba 100644 --- a/group03/619224754/src/com/coding/basic/Stack.java +++ b/group03/619224754/src/com/coding/basic/stack/Stack.java @@ -1,4 +1,6 @@ -package com.coding.basic; +package com.coding.basic.stack; + +import com.coding.basic.ArrayList; public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group03/619224754/src/com/coding/basic/stack/StackUtil.java b/group03/619224754/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..1da51576f2 --- /dev/null +++ b/group03/619224754/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,133 @@ +package com.coding.basic.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) { + if(s == null || s.isEmpty()) { + return; + } + + Stack retStack = new Stack(); + Object o = null; + do + { + o = s.pop(); + retStack.push(o); + } + while(o != null); + + s = retStack; + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()) { + return; + } + + Stack tempStack = new Stack(); + Object o1 = null; + do + { + o1 = s.pop(); + if(o1 == o) { + break; + } + else { + tempStack.push(o1); + } + } + while(o1 != null); + + do + { + o1 = tempStack.pop(); + s.push(o1); + } + while(o1 != null); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + if(s == null || s.isEmpty() ||len <= 0) { + return null; + } + + Object[] arr = new Object[len]; + if(s.size() < len){ + for (int i = 0; i < s.size(); i++) { + arr[i] = s.pop(); + } + for (int i = s.size(); i >= 0; i--) { + s.push(arr[i]); + } + } + else + { + for (int i = 0; i < len; i++) { + arr[i] = s.pop(); + } + for (int i = len; i >= 0; i--) { + s.push(arr[i]); + } + } + + return arr; + } + /** + * 字符串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){ + boolean isValid = true; + Stack stack = new Stack(); + for (int i = 0; i < s.length(); i++) { + if(s.charAt(i) =='(' || s.charAt(i) =='[' || s.charAt(i) =='{') { + stack.push(s.charAt(i)); + } + else if(s.charAt(i) ==')' || s.charAt(i) ==']' || s.charAt(i) =='}') { + char c = ' '; + switch(s.charAt(i)) + { + case ')': + c = (char) stack.pop(); + if(c != '(') + isValid = false; + break; + case ']': + c = (char) stack.pop(); + if(c != '[') + isValid = false; + break; + case '}': + c = (char) stack.pop(); + if(c != '{') + isValid = false; + break; + + } + if(!isValid) { + break; + } + } + } + return isValid; + } +} From 63c46f369bacfbf4b642c3dcd6237d8dbbf63288 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sun, 9 Apr 2017 22:21:28 +0800 Subject: [PATCH 090/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E6=B1=A0=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group02/812350401/pom.xml | 7 +- .../coderising/jvm/clz/ClassFile.java | 7 +- .../coderising/jvm/constant/ConstantPool.java | 6 +- .../coderising/jvm/constant/FieldRefInfo.java | 7 +- .../jvm/constant/MethodRefInfo.java | 19 +-- .../jvm/constant/NameAndTypeInfo.java | 10 +- .../coderising/jvm/constant/UTF8Info.java | 2 - .../jvm/loader/ByteCodeIterator.java | 74 ++++++++++++ .../jvm/loader/ClassFileParser.java | 108 +++++++++++++++--- .../jvm/test/ClassFileloaderTest.java | 12 +- .../coding2017/jvm/test/EmployeeV1.class | Bin 1114 -> 1056 bytes .../jvm/loader/ClassFileParserTest.java | 53 +++++++++ 12 files changed, 260 insertions(+), 45 deletions(-) create mode 100644 group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java diff --git a/group02/812350401/pom.xml b/group02/812350401/pom.xml index 5311bd3c32..6ad5aa08db 100644 --- a/group02/812350401/pom.xml +++ b/group02/812350401/pom.xml @@ -44,7 +44,12 @@ commons-io 2.5 - + + + org.apache.commons + commons-lang3 + 3.4 + diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java index a4d15e995e..c4d13704f2 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java @@ -48,9 +48,7 @@ public void setConstPool(ConstantPool pool) { public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - - - + public void print(){ @@ -60,8 +58,7 @@ public void print(){ System.out.println("Class Name:"+ getClassName()); System.out.println("Super Class Name:"+ getSuperClassName()); - - + } private String getClassName(){ diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java index 33dac5d47d..09370db1e5 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java @@ -1,16 +1,18 @@ package com.github.miniyk2012.coding2017.coderising.jvm.constant; +import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; + 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); diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java index 50ef7f0126..98c5ced1a9 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java @@ -33,12 +33,11 @@ public String toString(){ } public String getClassName(){ - ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex()); - UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index()); - - return utf8Info.getValue(); + // UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index()); + // return utf8Info.getValue(); + return classInfo.getClassName(); } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java index b399f5cc22..a3cf910c99 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java @@ -29,27 +29,28 @@ public void setNameAndTypeIndex(int nameAndTypeIndex) { } public String toString(){ - return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ; } + public String getClassName(){ - ConstantPool pool = this.getConstantPool(); - ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex()); + // ConstantPool pool = this.getConstantPool(); + // ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex()); + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(classInfoIndex); return clzInfo.getClassName(); } public String getMethodName(){ - ConstantPool pool = this.getConstantPool(); - NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + // ConstantPool pool = this.getConstantPool(); + // NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(nameAndTypeIndex); return typeInfo.getName(); } public String getParamAndReturnType(){ - ConstantPool pool = this.getConstantPool(); - NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + // ConstantPool pool = this.getConstantPool(); + // NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(nameAndTypeIndex); return typeInfo.getTypeInfo(); } - - } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java index 1f6f14953b..79f421bdd1 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java @@ -28,14 +28,16 @@ public int getType() { public String getName(){ - ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); + // ConstantPool pool = this.getConstantPool(); + // UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); + UTF8Info utf8Info1 = (UTF8Info)getConstantInfo(index1); return utf8Info1.getValue(); } public String getTypeInfo(){ - ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2); + // ConstantPool pool = this.getConstantPool(); + // UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2); + UTF8Info utf8Info2 = (UTF8Info)getConstantInfo(index2); return utf8Info2.getValue(); } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java index c61084fa6a..3247ec1656 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java @@ -26,7 +26,5 @@ public String getValue() { public void setValue(String value) { this.value = value; } - - } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java index ced7643955..73eb2fc1ff 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,79 @@ package com.github.miniyk2012.coding2017.coderising.jvm.loader; +import com.github.miniyk2012.coding2017.coderising.jvm.util.Util; +import org.apache.commons.lang3.ArrayUtils; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; + public class ByteCodeIterator { + private byte[] codes; + private int point = 0; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public int nextU1toInt() { + byte[] u1 = new byte[] {codes[point++]}; + return Util.byteToInt(u1); + } + + public int nextU2toInt() { + byte[] u2 = new byte[] {codes[point++], codes[point++]}; + return Util.byteToInt(u2); + } + + /** + * 读取n个字节,并编码成UTF-8输出,point自动增加 + * @param n + * @return + */ + public String readUtf8(int n) + { + byte[] info = Arrays.copyOfRange(codes, point, point+n); + String utf8; + try { + utf8 = new String(info, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("常量池UTF-8编码错误"); + } + point += n; + return utf8; + } + + /** + * 返回当前位置 + * @return + */ + public int position() { + return point; + } + + /** + * n可正可负 + * @param n + */ + public void skip(int n) { + point = point + n; + } + + public void seek(int n) { + if (n >= codes.length || n < 0) throw new IndexOutOfBoundsException(); + point = n; + } + + public static void main(String[] args) throws UnsupportedEncodingException { + byte[] codes = {0x00, 0x34, 0x00}; + ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes); + System.out.println(byteCodeIterator.nextU2toInt()); + System.out.println(byteCodeIterator.nextU1toInt()); + byte[] codes2 = "Employee".getBytes("UTF-8"); + byte[] codes3 = ArrayUtils.addAll(codes2, codes); + byteCodeIterator = new ByteCodeIterator(codes3); + System.out.println(byteCodeIterator.readUtf8(codes2.length)); + System.out.println(byteCodeIterator.nextU2toInt()); + System.out.println(byteCodeIterator.nextU1toInt()); + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java index 977b8c667f..7b84a15899 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java @@ -3,36 +3,110 @@ import com.github.miniyk2012.coding2017.coderising.jvm.clz.AccessFlag; import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassIndex; -import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; - -import java.io.UnsupportedEncodingException; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.*; public class ClassFileParser { public ClassFile parse(byte[] codes) { - - + ClassFile clzFile = new ClassFile(); + ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes); + byteCodeIterator.skip(4); // skip magic + int minorVersion = byteCodeIterator.nextU2toInt(); + int majorVersion = byteCodeIterator.nextU2toInt(); + ConstantPool constantPool = parseConstantPool(byteCodeIterator); + AccessFlag accessFlag = parseAccessFlag(byteCodeIterator); + ClassIndex classIndex = parseClassInfex(byteCodeIterator); - return null; + clzFile.setMinorVersion(minorVersion); + clzFile.setMajorVersion(majorVersion); + clzFile.setConstPool(constantPool); + clzFile.setAccessFlag(accessFlag); + clzFile.setClassIndex(classIndex); + return clzFile; } - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - - return null; + protected AccessFlag parseAccessFlag(ByteCodeIterator iter) { + int access_flags = iter.nextU2toInt(); + AccessFlag accessFlag = new AccessFlag(access_flags); + return accessFlag; } - private ClassIndex parseClassInfex(ByteCodeIterator iter) { - - return null; - + protected ClassIndex parseClassInfex(ByteCodeIterator iter) { + ClassIndex classIndex = new ClassIndex(); + int thisClassIndex = iter.nextU2toInt(); + int superClassIndex = iter.nextU2toInt(); + classIndex.setThisClassIndex(thisClassIndex); + classIndex.setSuperClassIndex(superClassIndex); + return classIndex; } - private ConstantPool parseConstantPool(ByteCodeIterator iter) { - - return null; + protected ConstantPool parseConstantPool(ByteCodeIterator iter) { + ConstantPool constantPool = new ConstantPool(); + int constant_pool_count = iter.nextU2toInt(); + ConstantInfo constantInfo; + constantPool.addConstantInfo(new NullConstantInfo()); + for (int i=1; iYkL_q@@^zlR0k!#P*( zoX0Iu)j$+pam-pRq^VbE8%{;z*@%Xt+d&K&==4z6C0^=$<_v~enh=Oh5D=fdVM-s9 zoLq}^49f`5eN8(VaM~VGSIVhBIYR_1|3p!ld9ReSGKo>qpmWiVoea315DR9e$cYcd t%obtJ`3_W40D)JqZm{H!&#>MuO;Hh1H6N*AlQ{VWbu8J*4eB|zegVD(I&c60 delta 547 zcmah_%Sr-a6#o7hbw-^^4Z3M%TBf5lW|p++vItrf20_pw$Qw51j8RkIO9V3Q+Vl)T z1_eDpj}Wxz4cfMe&Of<{7IEO*zVCehIsdKvDzChJJw5}-W7!8kroE6b!(GCQStMno zd{B{=kdZOxqy9X1nuKg;tJrzU#x}MqEkmp8*6~GIGjvmLpX9O&Ijz#F>SmqNLg(Yq z!yqP8`}P})+F@aRSU~_01q%8U^kYE6f`S|t?JE|er}7GxFv76*zw%^(!L?yl+gvfI zAdCn@pi#OkY0Z*Z*NWvvtz!LZ?X}OXnqeDk;)r3;q3SJd_e?jfJ?pGiG8m*&UNucj z(XD>^9f6FNbu!wQq8lWNAo&ng2ZW0h2h;~JHGL03jod@DZ-l(c=NQNMrNm@jsv9ConK8}eVz5^FA mfZ!9PgOD5;e}H#8-G$G77ZanCh!UpIRZ|#plw(v2h<^jGTU;#w diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java new file mode 100644 index 0000000000..6aa66225b7 --- /dev/null +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java @@ -0,0 +1,53 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.loader; + +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.UTF8Info; +import com.github.miniyk2012.coding2017.coderising.jvm.test.ClassFileloaderTest; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by thomas_young on 9/4/2017. + */ +public class ClassFileParserTest { + private static ClassFileParser parser; + private static byte[] byteCodes; + + @BeforeClass + public static void setUp() { + String path = ClassFileloaderTest.class.getClassLoader().getResource("jvm").getPath(); + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1"; + byteCodes = loader.readBinaryCode(className); + parser = new ClassFileParser(); + } + + @Test + public void parse() throws Exception { + + } + + @Test + public void parseAccessFlag() throws Exception { + + } + + @Test + public void parseClassInfex() throws Exception { + + } + + @Test + public void parseConstantPool() throws Exception { + ByteCodeIterator byteCodeIterator = new ByteCodeIterator(byteCodes); + byteCodeIterator.skip(8); // skip magic,minor_version,major_version + ConstantPool constantPool = parser.parseConstantPool(byteCodeIterator); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(5); + assertEquals("name", utf8Info.getValue()); + } + +} \ No newline at end of file From f2f63c5c55eb0c8d8551a142d13ac78725da0c2f Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Sun, 9 Apr 2017 22:33:31 +0800 Subject: [PATCH 091/552] =?UTF-8?q?jvm=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit jvm第二次作业 --- .../me/book/algorithms/BasicBinarySearch.java | 12 + .../algorithms/LongestCommonPrefix.java | 223 ++++++++++++++++++ .../algorithms/MedianOfTwoSortedArrays.java | 60 +++-- .../coding/me/leetcode/algorithms/TwoSum.java | 21 ++ .../src/practise/chapter1/HelloService.java | 35 +++ .../practise/chapter1/HelloWorldService.java | 9 + .../learn-spring/src/test/practise/Test1.java | 39 +++ .../jvm/loader/ByteCodeIterator.java | 55 ++++- .../jvm/loader/ClassFileParser.java | 80 ++++++- 9 files changed, 504 insertions(+), 30 deletions(-) create mode 100644 group23/1028361767/data-structure/src/com/coding/me/book/algorithms/BasicBinarySearch.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java create mode 100644 group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java create mode 100644 group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java create mode 100644 group23/1028361767/learn-spring/src/test/practise/Test1.java diff --git a/group23/1028361767/data-structure/src/com/coding/me/book/algorithms/BasicBinarySearch.java b/group23/1028361767/data-structure/src/com/coding/me/book/algorithms/BasicBinarySearch.java new file mode 100644 index 0000000000..ad58cb7730 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/book/algorithms/BasicBinarySearch.java @@ -0,0 +1,12 @@ +package com.coding.me.book.algorithms; + +public class BasicBinarySearch { + + public int findIndex(int[] nums, int target){ + if(nums.length == 0) return -1; + + int mid = nums.length / 2; + return 0; + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java new file mode 100644 index 0000000000..910241063f --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java @@ -0,0 +1,223 @@ +package com.coding.me.leetcode.algorithms; + +/** + * Write a function to find the longest common prefix string amongst an array of strings. + * ["a", "b"] return "" + * ["a", "a"] return "a" + * ["ac", "ac", "a", "a"] return "a" + * + */ +public class LongestCommonPrefix { + + public static String mySolution(String[] strs){ + if(strs.length == 0) return ""; + char[] chars = strs[0].toCharArray(); + int count = chars.length; + if(count == 0) return ""; + char[] tmp; + for(int i = 1;i n) + return findKthSmallest(b, n, begin2, a, m, begin1, k); + if (m == 0) + return b[begin2 + k - 1]; + if (k == 1) + return Integer.min(a[begin1], b[begin2]); + int partA = Integer.min(k / 2, m), partB = k - partA; + if (a[begin1 + partA - 1] == b[begin2 + partB - 1]) + return a[begin1 + partA - 1]; + else if (a[begin1 + partA - 1] > b[begin2 + partB - 1]) + return findKthSmallest(a, m, begin1, b, n - partB, begin2 + partB, k - partB); + else + return findKthSmallest(a, m - partA, begin1 + partA, b, n, begin2, k - partA); + + } + private MedianOfTwoSortedArrays motsa; @Before diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java index 45e4727ec7..d91eb869fb 100644 --- a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java @@ -1,6 +1,9 @@ package com.coding.me.leetcode.algorithms; +import java.lang.ref.WeakReference; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -78,4 +81,22 @@ public int[] leetCodeSolution2(int[] nums, int target) { } throw new IllegalArgumentException("No two sum solution"); } + + + public static void main(String[] args) throws InterruptedException { +// String s = new String("字符串在内存中"); + List s = new ArrayList(); + s.add(new Object()); + WeakReference wr = new WeakReference(s.get(0)); + +// Thread.sleep(500); + System.out.println(wr.get()); + + s.remove(0); + System.gc(); + + System.out.println(wr.get()); +// Thread.sleep(500); +// System.out.println(wr.get()); + } } diff --git a/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java b/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java new file mode 100644 index 0000000000..c6d60e339c --- /dev/null +++ b/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java @@ -0,0 +1,35 @@ +package practise.chapter1; + +import java.util.List; + +public class HelloService { + + private String target; + + private List targets; + + public HelloService(String target){ + this.target = target; + } + + public String say(){ + return "hello " + this.target; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + + public List getTargets() { + return targets; + } + + public void setTargets(List targets) { + this.targets = targets; + } + +} diff --git a/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java b/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java new file mode 100644 index 0000000000..390a7b7e68 --- /dev/null +++ b/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java @@ -0,0 +1,9 @@ +package practise.chapter1; + +public class HelloWorldService { + + public String hello(){ + System.out.println("Hello Spring!"); + return "hello"; + } +} diff --git a/group23/1028361767/learn-spring/src/test/practise/Test1.java b/group23/1028361767/learn-spring/src/test/practise/Test1.java new file mode 100644 index 0000000000..7867ac294d --- /dev/null +++ b/group23/1028361767/learn-spring/src/test/practise/Test1.java @@ -0,0 +1,39 @@ +package test.practise; + +import org.junit.Assert; +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import practise.chapter1.HelloService; +import practise.chapter1.HelloWorldService; + +public class Test1 { + + ApplicationContext context = new ClassPathXmlApplicationContext("practise/chapter1.xml"); + + @Test + public void testHello(){ + HelloWorldService helloWorldService = context.getBean("helloWorldService", HelloWorldService.class); + Assert.assertEquals("hello", helloWorldService.hello()); + HelloWorldService helloWorldService1 = context.getBean("helloWorldService1", HelloWorldService.class); + Assert.assertEquals("hello", helloWorldService1.hello()); + HelloWorldService helloWorldService2 = context.getBean("helloWorldService2", HelloWorldService.class); + Assert.assertEquals("hello", helloWorldService2.hello()); + String[] alias = context.getAliases("helloWorldService"); + Assert.assertEquals(2, alias.length); + for(String alia : alias){ + System.out.println(alia); + } + } + + @Test + public void testSay(){ + HelloService helloService = context.getBean("helloService", HelloService.class); + Assert.assertEquals("hello spring3", helloService.say()); + for(String target : helloService.getTargets()){ + System.out.println(target); + } + Assert.assertEquals(3, helloService.getTargets().size()); + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java index 9c9fac2839..0fab88f9cb 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,58 @@ package com.coderising.jvm.loader; public class ByteCodeIterator { - + + private byte[] codes; + private int pos; + + public ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + + public byte[] nextU2(){ return new byte[]{codes[pos++], codes[pos++]};} + + public byte[] nextU4(){ return new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]};} + + public int nextU1ToInt() { + return (codes[pos++] & 0xff); + } + + public int nextU2ToInt() { + return ((codes[pos++] & 0xff00) << 8) | (codes[pos++] & 0x00ff); + } + + public int nextU4ToInt() { + return ((codes[pos++] & 0xff000000) << 24) | ((codes[pos++] & 0x00ff0000) << 16) + | ((codes[pos++] & 0x0000ff00) << 8) | (codes[pos++] & 0x000000ff) ; + } + + public String nextUxToHexString(int len) { + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Sun, 9 Apr 2017 22:54:02 +0800 Subject: [PATCH 092/552] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/102228177/work2_26/.classpath | 16 +- .../src/com/coderising/array/ArrayUtil.java | 19 +- .../jvm/loader/ClassFileLoader.java | 81 +++++++ .../jvm/test/ClassFileloaderTest.java | 93 ++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 +++ .../coding/basic/linklist/LRUPageFrame.java | 150 +++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 31 +++ .../src/com/coderising/data/LinkedList.java | 42 ++-- .../com/coderising/data/LinkedListTest.java | 7 +- .../coderising/download/DownloadThread.java | 2 +- .../coderising/download/FileDownloader.java | 2 +- .../download/FileDownloaderTest.java | 5 +- .../download/impl/ConnectionImpl.java | 2 +- .../download/impl/ConnectionManagerImpl.java | 2 +- .../com/coderising/jvm/clz/AccessFlag.java | 25 +++ .../src/com/coderising/jvm/clz/ClassFile.java | 75 +++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 33 +++ .../coderising/jvm/constant/ConstantInfo.java | 38 ++++ .../coderising/jvm/constant/ConstantPool.java | 39 ++++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++ .../jvm/constant/MethodRefInfo.java | 55 +++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 +++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++ .../jvm/loader/ByteCodeIterator.java | 49 +++++ .../jvm/loader/ClassFileLoader.java | 137 ++++++++++++ .../jvm/loader/ClassFileParser.java | 115 ++++++++++ .../jvm/test/ClassFileloaderTest.java | 203 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 +++ .../src/com/coderising/jvm/util/Util.java | 24 +++ .../src/com/coding/basic/stack/ArrayList.java | 150 +++++++++++++ .../src/com/coding/basic/stack/Iterator.java | 8 + .../src/com/coding/basic/stack/List.java | 10 + .../src/com/coding/basic/stack/Stack.java | 22 ++ .../src/com/coding/basic/stack/StackUtil.java | 45 ++++ 37 files changed, 1673 insertions(+), 52 deletions(-) create mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/ArrayList.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/List.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java diff --git a/group17/102228177/work2_26/.classpath b/group17/102228177/work2_26/.classpath index 80437ca942..dfa83d7793 100644 --- a/group17/102228177/work2_26/.classpath +++ b/group17/102228177/work2_26/.classpath @@ -1,8 +1,8 @@ - - - - - - - - + + + + + + + + diff --git a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java index 60949d043e..a0dc5262db 100644 --- a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java +++ b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java @@ -34,7 +34,7 @@ public static void main(String[] args) { // System.out.println(Arrays.toString(util.merge(a1, a2))); System.out.println(Arrays.toString(util.fibonacci(15))); - System.out.println(Arrays.toString(util.getPrimes(23))); +// System.out.println(Arrays.toString(util.getPrimes(23))); } /** @@ -115,14 +115,15 @@ public int[] grow(int [] oldArray, int size){ */ public int[] fibonacci(int max){ List list = new ArrayList(); - int f1 = 1, f2 = 1, f = 0; - list.add(f1); - list.add(f2); - while(f < max){ - f = f1+f2; - f1 = f2; - f2 = f; - list.add(f); + if (max <= 1) { + return new int[]{}; + } + int lo = 0; + int hi = 1; + while(hi clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + String name = ""; + for (int i = 0; i < className.length(); i++) { + if(className.charAt(i)=='.'){ + name += File.separatorChar; + }else{ + name += className.charAt(i); + } + } + File file = new File(getClassPath()+ File.separatorChar +name+".class"); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = new FileInputStream(file); + out = new ByteArrayOutputStream(); + byte[] buff = new byte[1024*2]; + int len = 0; + while((len=in.read(buff))!=-1){ + out.write(buff, 0, len); + } + return out.toByteArray(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + finally { + if(in!=null){ + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(out!=null){ + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return null; + + + } + + + public void addClassPath(String path) { + clzPaths.add(path); + } + + + + public String getClassPath(){ + StringBuilder sb = new StringBuilder(); + for (String string : clzPaths) { + sb.append(string).append(";"); + } + sb = sb.deleteCharAt(sb.length()-1); + return sb.toString(); + } +} \ No newline at end of file diff --git a/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..1e51c27361 --- /dev/null +++ b/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,93 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.loader.ClassFileLoader; + + + + + +public class ClassFileloaderTest { + + +// static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "D:\\git\\coding2017\\group17\\102228177\\work3_26\\bin"; + static String path2 = "C:\temp"; + + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i= 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(); + } +} \ No newline at end of file diff --git a/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..c323d03b3f --- /dev/null +++ b/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,31 @@ +package com.coding.basic.linklist; + +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()); + } + +} \ No newline at end of file diff --git a/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java index 22a72affaf..ee2a7fd554 100644 --- a/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java +++ b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java @@ -292,22 +292,19 @@ public void removeRange(int min, int max){ throw new RuntimeException("LinkedList is empty!"); }else{ Node q = head; - //头判断 - if((int)q.data>min && (int)q.datamin && (int)p.data 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/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..8334e80b63 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,49 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } +} diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..81264ceed7 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,137 @@ +package com.coderising.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 com.coderising.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(){ + + 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/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java b/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java b/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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= maxLen){ + grow(); + } + elements[size] = o; + size++; + } + + /** + * 数组扩容 + */ + private void grow(){ + maxLen = maxLen + (maxLen >> 1); + Object[] newArr = new Object[maxLen]; + System.arraycopy(elements, 0, newArr, 0, size); + elements = newArr; + } + + /** + * 在指定索引处添加元素 + * @param i 指定索引 + * @param o 添加元素 + */ + public void add(int i,Object o){ + //判断插入位置大于数组实际长度 + if(i > size){ + size = i; + if(size >= maxLen){//数组大小大于数组最大容量则需要扩容 + grow(); + } + } + //插入位置不大于数组实际长度时,将插入位置的元素向后移。 + for (int j = size; j > i ; j++) { + elements[j] = elements[j-1]; + } + elements[i] = o; + size++; + } + + /** + * 获取传入索引的元素 + * @param index 索引 + * @return 返回传入索引的元素 + */ + public Object get(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + } + for (int i = 0; i < size; i++) { + return elements[index]; + } + return null; + } + + /** + * 删除指定索引元素并返回 + * @param index + * @return 该索引处元素 + */ + public Object remove(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + }else{ + for (int j = index; j < size-1; j++) { + elements[j]=elements[j+1]; + } + size--; + return elements[index]; + } + } + + /** + * 获取大小 + * @return + */ + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + int cursor; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + if(i >= size){ + throw new NoSuchElementException(); + } + if (i >= elements.length){ + throw new ConcurrentModificationException(); + } + cursor = i+1; + return elements[i]; + } + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(6, 6); + list.remove(3); + for (int i = 0; i < list.size(); i++) { + System.out.println(i+":"+list.get(i)); + } + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } +} diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java new file mode 100644 index 0000000000..f51a971a1c --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic.stack; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/List.java b/group17/102228177/work4_09/src/com/coding/basic/stack/List.java new file mode 100644 index 0000000000..2d2c693e0d --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/List.java @@ -0,0 +1,10 @@ +package com.coding.basic.stack; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..1af8fbfb7a --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic.stack; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..2ecca1811c --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,45 @@ +package com.coding.basic.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; + } + + +} \ No newline at end of file From fc49622cf0d18e8cfc1f8f2e4c57e0fd873edec9 Mon Sep 17 00:00:00 2001 From: myThinkPad <1252327158@qq.com> Date: Mon, 10 Apr 2017 10:41:38 +0800 Subject: [PATCH 093/552] update --- .../download/com/coderising/download/FileDownloaderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group27/1252327158/task3_20170326/download/com/coderising/download/FileDownloaderTest.java b/group27/1252327158/task3_20170326/download/com/coderising/download/FileDownloaderTest.java index 865d65510d..8d9b15f690 100644 --- a/group27/1252327158/task3_20170326/download/com/coderising/download/FileDownloaderTest.java +++ b/group27/1252327158/task3_20170326/download/com/coderising/download/FileDownloaderTest.java @@ -21,7 +21,7 @@ public void tearDown() throws Exception { @Test public void testDownload() { - String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1489721424&di=1fda6467501ab1d5e5bff43e801d14ee&imgtype=jpg&er=1&src=http%3A%2F%2Fimg4.duitang.com%2Fuploads%2Fitem%2F201507%2F30%2F20150730163204_A24MX.thumb.700_0.jpeg"; + String url = "http://read.pudn.com/downloads161/ebook/730477/driver%20book/Windows文件系统过滤驱动开发教程(第二版).pdf"; FileDownloader downloader = new FileDownloader(url); From 5312870d0d35d12b09e5b19e17b725275782f84f Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Mon, 10 Apr 2017 12:46:54 +0800 Subject: [PATCH 094/552] InfixExpr Done InfixExpr Done --- .../src/com/coding/basic/Stack.java | 37 ------- .../coding/basic/stack/expr/InfixExpr.java | 101 ++++++++++++++++++ .../basic/stack/expr/InfixExprTest.java | 48 +++++++++ 3 files changed, 149 insertions(+), 37 deletions(-) delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Stack.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Stack.java b/group23/1028361767/data-structure/src/com/coding/basic/Stack.java deleted file mode 100644 index a98f5d76a5..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coding.basic; - -import java.util.EmptyStackException; - -import com.coding.basic.array.ArrayList; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - checkBound(); - return elementData.get(size() - 1); - } - - public Object peek() { - checkBound(); - return elementData.remove(size() - 1); - } - - public boolean isEmpty() { - return size() == 0; - } - - public int size() { - return elementData.size(); - } - - private void checkBound() { - if (isEmpty()) { - throw new EmptyStackException(); - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..5b91a03a95 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,101 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + if(expr == null || "".equals(expr)){ + return 0; + } + Stack numStack = new Stack(); + Stack opStack = new Stack(); + String[] ss = expr.split(""); + boolean needOper = false;// 需要运算,遇到* / 后置为true + boolean foundOper = true;// 遇到运算符 + String ops = "+-*/"; + for (int i=0;i 1){ + doAddOrSubOps(numStack, opStack); + } + return new Float((String)numStack.pop()); + } + + /** + * 多个加减 + * @param numStack + * @param opStack + */ + private void doAddOrSubOps(Stack numStack, Stack opStack) { + Stack calStack = new Stack(); + while(numStack.size() > 1){ + calStack.push(numStack.pop()); + calStack.push(opStack.pop()); + } + float num1 = new Float((String)numStack.pop()); + float num2; + while(calStack.size() > 0){ + String op = (String)calStack.pop(); + num2 = new Float((String)calStack.pop()); + if("+".equals(op)){ + num1 += num2; + }else{ + num1 -= num2; + } + } + numStack.push(num1 + ""); + } + + /** + * 单个乘除 + * @param numStack + * @param op + */ + private void doMulOrDivOp(Stack numStack, String op){ + float num2 = new Float((String)numStack.pop()); + float num1 = new Float((String)numStack.pop()); + String result = null; + if("*".equals(op)){ + result = (num1 * num2) + ""; + }else{ + result = (num1 / num2) + ""; + } + numStack.push(result); + } + +} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..1d679bdb32 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file From fe754de1bc1ddbaccb4b29010da90075fea42f15 Mon Sep 17 00:00:00 2001 From: earliest Date: Sun, 9 Apr 2017 22:51:08 -0700 Subject: [PATCH 095/552] jvm constant pool assignemnt --- .../jvm/loader/ClassFileLoader.java | 20 +- .../jvm/test/ClassFileloaderTest.java | 308 ++++++++++++------ group17/article/20170402-20170409.md | 2 +- 3 files changed, 223 insertions(+), 107 deletions(-) mode change 100644 => 100755 group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java index 6d669e294f..ec9ea83caf 100644 --- a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -9,18 +9,24 @@ import java.util.Collection; import java.util.List; +import com.coderising.jvm.clz.ClassFile; + public class ClassFileLoader { private List clzPaths = new ArrayList(); + public ClassFileLoader(){ + + } + public byte[] readBinaryCode(String className) { String classPath = convertToFilePath(className); File targetFile = null; for(int i = 0; i< clzPaths.size(); i++){ String fullPath = clzPaths.get(i)+File.separator+classPath; - System.out.println("path: " + fullPath); + //System.out.println("path: " + fullPath); File temp = new File(fullPath); if(temp.exists()) { targetFile = temp; @@ -29,10 +35,10 @@ public byte[] readBinaryCode(String className) { } if(targetFile != null){ - System.out.println("targetFile: " + targetFile.getAbsolutePath()); + //System.out.println("targetFile: " + targetFile.getAbsolutePath()); } long fileLength = targetFile.length(); - System.out.println("File length: " + fileLength); + //System.out.println("File length: " + fileLength); byte[] byteArray = new byte[(int)fileLength]; FileInputStream is = null; try { @@ -61,6 +67,14 @@ public byte[] readBinaryCode(String className) { } + public ClassFile loadClass(String className){ + byte[] ba = readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(ba); + } + + + private String convertToFilePath(String className){ return className.replaceAll("\\.", File.separator) + ".class"; } diff --git a/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java old mode 100644 new mode 100755 index 4df3f4b529..d3e036dee0 --- a/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,103 +1,205 @@ -package com.coderising.jvm.test; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.loader.ClassFileLoader; - - - - - -public class ClassFileloaderTest { - - - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path2 = "C:\temp"; - static String path3 = "/Users/erlisuo/Documents/workspace/codeRising2017working/1282579502/bin"; - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - loader.addClassPath(path3); - String className = "com.coderising.jvm.test.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path3); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - @Test - public void testToHexString(){ - byte b1 = 'a'; - byte b2 = 'b'; - System.out.println("Binary: " + Integer.toBinaryString(b1) + " decimal: " + Integer.toString(b1) + " hex: " + Integer.toHexString(b1)); - System.out.println("Binary: " + Integer.toBinaryString(b2) + " decimal: " + Integer.toString(b2) + " hex: " + Integer.toHexString(b2)); - - byte[] bArray = new byte[]{b1, b2}; - System.out.println(byteToHexString(bArray)); - } - - - - private String byteToHexString(byte[] codes ){ - 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/group17/article/20170402-20170409.md b/group17/article/20170402-20170409.md index 3d45ad0516..f0d32f145f 100644 --- a/group17/article/20170402-20170409.md +++ b/group17/article/20170402-20170409.md @@ -30,7 +30,7 @@ 516886559 -1282579502 +1282579502 https://www.evernote.com/l/AZ3ajLOAlTVHw7foK2KLb-bWZ7kw6FjljDA 614982500 From 83bb942114853f18699d0d5e2b33e82e824c6b3f Mon Sep 17 00:00:00 2001 From: earliest Date: Sun, 9 Apr 2017 22:53:56 -0700 Subject: [PATCH 096/552] jvm constant pool assignment --- .../com/coderising/jvm/clz/AccessFlag.java | 25 ++++ .../src/com/coderising/jvm/clz/ClassFile.java | 75 ++++++++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 +++ .../coderising/jvm/constant/ClassInfo.java | 24 ++++ .../coderising/jvm/constant/ConstantInfo.java | 30 +++++ .../jvm/constant/ConstantInfoFactory.java | 93 +++++++++++++++ .../coderising/jvm/constant/ConstantPool.java | 29 +++++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++++++ .../coderising/jvm/constant/FloatRefInfo.java | 15 +++ .../coderising/jvm/constant/IntegerInfo.java | 22 ++++ .../InvalidConstantInfoTypeException.java | 11 ++ .../jvm/constant/MethodRefInfo.java | 55 +++++++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++++++ .../jvm/constant/NullConstantInfo.java | 13 +++ .../coderising/jvm/constant/StringInfo.java | 26 +++++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++++ .../jvm/loader/ByteCodeIterator.java | 63 ++++++++++ .../jvm/loader/ClassFileParser.java | 96 +++++++++++++++ .../jvm/test/ByteCodeIteratorTest.java | 51 ++++++++ .../src/com/coderising/jvm/util/Util.java | 24 ++++ .../src/com/coding/basic/stack/Stack.java | 24 ++++ .../src/com/coding/basic/stack/StackUtil.java | 109 ++++++++++++++++++ 22 files changed, 935 insertions(+) create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java create mode 100755 group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100755 group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group17/1282579502/src/com/coderising/jvm/test/ByteCodeIteratorTest.java create mode 100755 group17/1282579502/src/com/coderising/jvm/util/Util.java create mode 100755 group17/1282579502/src/com/coding/basic/stack/Stack.java create mode 100755 group17/1282579502/src/com/coding/basic/stack/StackUtil.java diff --git a/group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java b/group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100755 index 0000000000..aab65b780b --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ + package com.coderising.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/group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java b/group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java new file mode 100755 index 0000000000..650ca8375d --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java b/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100755 index 0000000000..e424f284b3 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100755 index 0000000000..aea9048ea4 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100755 index 0000000000..b99ed30fbf --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.constant; + +public abstract class ConstantInfo { + public static final int UTF8_INFO = 1; + public static final int INTEGER_INFO = 3; + 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/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java new file mode 100644 index 0000000000..01df38c682 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java @@ -0,0 +1,93 @@ +package com.coderising.jvm.constant; + +import java.io.UnsupportedEncodingException; + +import com.coderising.jvm.loader.ByteCodeIterator; +import com.coderising.jvm.util.Util; + +public class ConstantInfoFactory { + public ByteCodeIterator iter = null; + public ConstantPool pool = null; + public ConstantInfoFactory(ByteCodeIterator iter, ConstantPool pool){ + this.iter = iter; + this.pool = pool; + } + + public void fillNextConstantInfo() throws InvalidConstantInfoTypeException, UnsupportedEncodingException{ + int constantIdentifier = iter.getNextByte(); + ConstantInfo var = null; + System.out.println("constant identifyer: " + constantIdentifier); + var = classify(constantIdentifier); + pool.addConstantInfo(var); + } + + public ConstantInfo classify(int constantInfoTypeId) throws InvalidConstantInfoTypeException, UnsupportedEncodingException{ + ConstantInfo ret = null; + switch(constantInfoTypeId){ + case ConstantInfo.CLASS_INFO: + ClassInfo classInfo = new ClassInfo(pool); + byte[] utf8Index = iter.getNextNBytes(2); + System.out.println("constant classInfo: utf index: " + Util.byteToInt(utf8Index)); + classInfo.setUtf8Index(Util.byteToInt(utf8Index)); + ret = classInfo; + + break; + case ConstantInfo.FIELD_INFO: + FieldRefInfo fieldInfo = new FieldRefInfo(pool); + int classInfoIndex = Util.byteToInt(iter.getNextNBytes(2)); + fieldInfo.setClassInfoIndex(classInfoIndex); + int nameAndTypeIndex = Util.byteToInt(iter.getNextNBytes(2)); + fieldInfo.setNameAndTypeIndex(nameAndTypeIndex); + ret = fieldInfo; + break; + case ConstantInfo.INTEGER_INFO: + IntegerInfo integerInfo = new IntegerInfo(pool); + int val = Util.byteToInt(iter.getNextNBytes(4)); + integerInfo.setInteger(val); + ret = integerInfo; + break; + case ConstantInfo.FLOAT_INFO: + FloatRefInfo floatInfo = new FloatRefInfo(pool); + ret = floatInfo; + throw new InvalidConstantInfoTypeException("Flat info has not been properly implemented yet"); + //break; + case ConstantInfo.METHOD_INFO: + MethodRefInfo methodInfo = new MethodRefInfo(pool); + int methodClassInfoIndex = Util.byteToInt(iter.getNextNBytes(2)); + methodInfo.setClassInfoIndex(methodClassInfoIndex); + int methodNameAndTypeIndex = Util.byteToInt(iter.getNextNBytes(2)); + methodInfo.setNameAndTypeIndex(methodNameAndTypeIndex); + ret = methodInfo; + break; + case ConstantInfo.NAME_AND_TYPE_INFO: + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + int nameIndex = Util.byteToInt(iter.getNextNBytes(2)); + nameAndTypeInfo.setIndex1(nameIndex); + int descriptorIndex = Util.byteToInt(iter.getNextNBytes(2)); + nameAndTypeInfo.setIndex2(descriptorIndex); + ret = nameAndTypeInfo; + break; + case ConstantInfo.STRING_INFO: + StringInfo stringInfo = new StringInfo(pool); + int index = Util.byteToInt(iter.getNextNBytes(2)); + stringInfo.setIndex(index); + ret = stringInfo; + break; + case ConstantInfo.UTF8_INFO: + UTF8Info utfInfo = new UTF8Info(pool); + int length = Util.byteToInt(iter.getNextNBytes(2)); + utfInfo.setLength(length); + + String utf8Val = new String(iter.getNextNBytes(length), "UTF-8"); + System.out.println("UTF 8 content " + utf8Val); + + utfInfo.setValue(utf8Val); + ret = utfInfo; + break; + + default: + throw new InvalidConstantInfoTypeException(); + } + return ret; + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100755 index 0000000000..9a1a998f41 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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){ + System.out.println("added: " + info.getClass().getName() + " current size; " + constantInfos.size()); + 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 int getSize() { + return this.constantInfos.size() -1; + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100755 index 0000000000..65475e194c --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java new file mode 100644 index 0000000000..356216a166 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.constant; + +public class FloatRefInfo extends ClassInfo{ + + public FloatRefInfo(ConstantPool pool) { + super(pool); + // TODO Auto-generated constructor stub + } + + public int getType(){ + return ConstantInfo.FLOAT_INFO; + } + + +} diff --git a/group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java new file mode 100644 index 0000000000..1980de8f2f --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.constant; + +public class IntegerInfo extends ConstantInfo{ + + int val = 0; + public IntegerInfo(ConstantPool pool) { + super(pool); + // TODO Auto-generated constructor stub + } + + public int getType(){ + return ConstantInfo.INTEGER_INFO; + } + + public void setInteger(int val){ + this.val = val; + } + + public int getInteger(){ + return val; + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java b/group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java new file mode 100644 index 0000000000..ac33ac7f9c --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java @@ -0,0 +1,11 @@ +package com.coderising.jvm.constant; + +public class InvalidConstantInfoTypeException extends Exception{ + + public InvalidConstantInfoTypeException(){ + super(); + } + public InvalidConstantInfoTypeException(String message){ + super(message); + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100755 index 0000000000..7f05870020 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100755 index 0000000000..402f9dec86 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100755 index 0000000000..936736016f --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java new file mode 100755 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java b/group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100755 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100755 index 0000000000..f312b513ac --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,63 @@ +package com.coderising.jvm.loader; + +public class ByteCodeIterator { + + byte[] source = null; + int currentPos = 0; + + public ByteCodeIterator(byte[] source){ + this.source = source; + } + + public byte getNextByte(){ + if(currentPos > source.length -1){ + throw new IndexOutOfBoundsException(); + } + return getByteAt(currentPos++); + } + + public byte[] getNextNBytes(int n){ + byte[] retArray = new byte[n]; + for(int i = 0; isource.length-1){ + throw new IndexOutOfBoundsException(); + } + return source[n]; + } + + + public String getNextHexString(){ + byte b1 = getNextByte(); + int i1 = b1 & 0xFF; + String strVal = Integer.toHexString(i1); + if(strVal.length() < 2){ + strVal = "0".concat(strVal); + } + return strVal; + } + + public String getNextNHexString(int n){ + StringBuilder sb = new StringBuilder(); + while(n-->0){ + sb.append(getNextHexString()); + } + + return sb.toString(); + } + + + + public static void printByteInNumber(byte b){ + int tmp = b; + System.out.println(Integer.toBinaryString(tmp)); + int tmp1 = tmp & 0xFF; + System.out.println(Integer.toBinaryString(tmp1)); + System.out.println(Integer.toHexString(tmp1)); + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java new file mode 100755 index 0000000000..7c5809efec --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,96 @@ +package com.coderising.jvm.loader; + +import java.io.UnsupportedEncodingException; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantInfoFactory; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.InvalidConstantInfoTypeException; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ClassFileParser { + ClassFile clz = null; + public ClassFile parse(byte[] codes) { + clz = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + String magicHex = iter.getNextNHexString(4); + System.out.println("Magic Number: "+magicHex); + + String minorHex = iter.getNextHexString() + iter.getNextHexString(); + int minorVersionInt = Integer.parseInt(minorHex, 16); + String majorHex = iter.getNextHexString() + iter.getNextHexString(); + int majorVersionInt = Integer.parseInt(majorHex, 16); + clz.setMajorVersion(majorVersionInt);clz.setMinorVersion(minorVersionInt); + System.out.println("Major version: " + majorVersionInt + " minor version: " + minorVersionInt); + clz.setConstPool(parseConstantPool(iter)); + fillClassInfo(clz, clz.getConstantPool()); + return clz; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + return null; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + + return null; + + } + + private void fillClassInfo(ClassFile clz, ConstantPool pool){ + ClassIndex newClassIndex = new ClassIndex(); + clz.setClassIndex(newClassIndex); + for(int i = 0; i< pool.getSize(); i++){ + if(pool.getConstantInfo(i) instanceof ClassInfo){ + if(clz.getClzIndex().getThisClassIndex() == 0){ + System.out.println("class"); + clz.getClzIndex().setThisClassIndex(i); + } + else if(clz.getClzIndex().getSuperClassIndex() == 0){ + clz.getClzIndex().setSuperClassIndex(i); + } + else{ + break; + } + } + } + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + String constantPoolSizeHex = iter.getNextHexString() + iter.getNextHexString(); + System.out.println("hex string: " + constantPoolSizeHex + " integer value: " + Integer.parseInt(constantPoolSizeHex, 16)); + int constantCount = Integer.parseInt(constantPoolSizeHex, 16); + ConstantPool constantPool = new ConstantPool(); + constantPool.addConstantInfo(new NullConstantInfo()); + ConstantInfoFactory constantInfoFactory = new ConstantInfoFactory(iter, constantPool); + while(constantCount-- > 1){ + try { + constantInfoFactory.fillNextConstantInfo(); + } catch ( Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + break; + } + + } + + for(int i = 0; i Date: Mon, 10 Apr 2017 14:14:27 +0800 Subject: [PATCH 097/552] =?UTF-8?q?jvm=E5=B8=B8=E9=87=8F=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1264835468/src/assignment/BinaryTree.java | 10 +- .../1264835468/src/assignment/MyStack.java | 39 ------ .../assignment/{MyQueue.java => Queue.java} | 2 +- group17/1264835468/src/assignment/Stack.java | 53 +++++++ .../assignment0326/jvm/clz/AccessFlag.java | 25 ++++ .../src/assignment0326/jvm/clz/ClassFile.java | 77 +++++++++++ .../assignment0326/jvm/clz/ClassIndex.java | 19 +++ .../jvm/constant/ClassInfo.java | 24 ++++ .../jvm/constant/ConstantInfo.java | 29 ++++ .../jvm/constant/ConstantPool.java | 29 ++++ .../jvm/constant/FieldRefInfo.java | 54 ++++++++ .../jvm/constant/MethodRefInfo.java | 55 ++++++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../jvm/constant/StringInfo.java | 26 ++++ .../assignment0326/jvm/constant/UTF8Info.java | 32 +++++ .../jvm/loader/ByteCodeIterator.java | 34 +++++ .../jvm/loader/ClassFileLoader.java | 25 ++++ .../jvm/loader/ClassFileParser.java | 122 +++++++++++++++++ .../jvm/test/ClassFileLoaderTest.java | 129 ++++++++++++++++-- .../src/assignment0326/jvm/util/Util.java | 24 ++++ .../src/assignment0326/lru/Clock.java | 99 -------------- .../src/assignment0405/StackUtil.java | 104 ++++++++++++++ .../src/assignment0405/StackUtilTest.java | 61 +++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++++ 25 files changed, 1000 insertions(+), 158 deletions(-) delete mode 100644 group17/1264835468/src/assignment/MyStack.java rename group17/1264835468/src/assignment/{MyQueue.java => Queue.java} (95%) create mode 100644 group17/1264835468/src/assignment/Stack.java create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java create mode 100644 group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java create mode 100644 group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java create mode 100644 group17/1264835468/src/assignment0326/jvm/util/Util.java delete mode 100644 group17/1264835468/src/assignment0326/lru/Clock.java create mode 100644 group17/1264835468/src/assignment0405/StackUtil.java create mode 100644 group17/1264835468/src/assignment0405/StackUtilTest.java create mode 100644 group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java diff --git a/group17/1264835468/src/assignment/BinaryTree.java b/group17/1264835468/src/assignment/BinaryTree.java index 1d76a7ce2c..882a87f6ed 100644 --- a/group17/1264835468/src/assignment/BinaryTree.java +++ b/group17/1264835468/src/assignment/BinaryTree.java @@ -53,10 +53,10 @@ public String toString() { * */ private class BFSNodeQueue { - private MyQueue> nodeQueue; + private Queue> nodeQueue; public BFSNodeQueue() { - nodeQueue = new MyQueue<>(); + nodeQueue = new Queue<>(); } public boolean isEmpty() { @@ -79,9 +79,9 @@ public BinaryTreeNode deQueue() { } // 把所有出队节点放进另一个队列中 - public MyQueue> getResult() { + public Queue> getResult() { prepare(); - MyQueue> result = new MyQueue<>(); + Queue> result = new Queue<>(); while (!isEmpty()) { result.enQueue(deQueue()); } @@ -121,7 +121,7 @@ private class BFSIterator implements Iterator> { Iterator> iterator; public BFSIterator() { - MyQueue> BFSQueue = new BFSNodeQueue().getResult(); + Queue> BFSQueue = new BFSNodeQueue().getResult(); list = new MyArrayList<>(); while (!BFSQueue.isEmpty()) { list.add(BFSQueue.deQueue()); diff --git a/group17/1264835468/src/assignment/MyStack.java b/group17/1264835468/src/assignment/MyStack.java deleted file mode 100644 index 0c3d30337b..0000000000 --- a/group17/1264835468/src/assignment/MyStack.java +++ /dev/null @@ -1,39 +0,0 @@ -package assignment; - -public class MyStack { - private MyArrayList elementData = new MyArrayList<>(); - - public void push(T o) { - elementData.add(o); - } - - public T pop() { - if (!isEmpty()) { - T data = elementData.remove(elementData.size() - 1); - return data; - } - throw new StackIsEmptyException(); - } - - public T peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} - -class StackIsEmptyException extends RuntimeException { - public StackIsEmptyException() { - super(); - } - - public StackIsEmptyException(String string) { - super(string); - } -} diff --git a/group17/1264835468/src/assignment/MyQueue.java b/group17/1264835468/src/assignment/Queue.java similarity index 95% rename from group17/1264835468/src/assignment/MyQueue.java rename to group17/1264835468/src/assignment/Queue.java index c5e3e8ce88..eb3b474e75 100644 --- a/group17/1264835468/src/assignment/MyQueue.java +++ b/group17/1264835468/src/assignment/Queue.java @@ -1,6 +1,6 @@ package assignment; -public class MyQueue { +public class Queue { private MyLinkedList elementData = new MyLinkedList<>(); public void enQueue(T o) { diff --git a/group17/1264835468/src/assignment/Stack.java b/group17/1264835468/src/assignment/Stack.java new file mode 100644 index 0000000000..9100544ee3 --- /dev/null +++ b/group17/1264835468/src/assignment/Stack.java @@ -0,0 +1,53 @@ +package assignment; + +public class Stack { + private MyArrayList elementData = new MyArrayList<>(); + + public void push(T o) { + elementData.add(o); + } + + public T pop() { + if (!isEmpty()) { + T data = elementData.remove(elementData.size() - 1); + return data; + } + throw new EmptyStackException(); + } + + public T peek() { + if(!isEmpty()) + return elementData.get(elementData.size() - 1); + throw new EmptyStackException(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = elementData.size()-1; i >=0; i--) { + stringBuilder.append(elementData.get(i)); + if (i != 0) { + stringBuilder.append(", "); + } + } + return stringBuilder.toString(); + } +} + +class EmptyStackException extends RuntimeException { + public EmptyStackException() { + super(); + } + + public EmptyStackException(String string) { + super(string); + } +} diff --git a/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java b/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..f95bc2e902 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java b/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..2cb501297d --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java @@ -0,0 +1,77 @@ +package assignment0326.jvm.clz; + + +import assignment0326.jvm.constant.ClassInfo; +import assignment0326.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/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java b/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..a3e5c3d350 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..4a7397478e --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..f6acdc0580 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java b/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..96f40534da --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..d0beb7f1f2 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..3678f46c39 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..7659657b94 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..d8f8bda26e --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package assignment0326.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..eb6b9b4d7e --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java b/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..80f3389bd9 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..e9b9fdaf2e --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,34 @@ +package assignment0326.jvm.loader; + +public class ByteCodeIterator { + int curPos; + byte[] bytes; + + public ByteCodeIterator(byte[] bytes) { + curPos=0; + this.bytes = bytes; + } + + public byte nextByte(){ + return bytes[curPos++]; + } + public int nextByteToInt(){ + return Byte.toUnsignedInt(nextByte()); + } + public int next2BytesToInt(){ + int hi=Byte.toUnsignedInt(nextByte()); + int lo = Byte.toUnsignedInt(nextByte()); + int i=hi<<8|lo; + return i; + } + public byte[] nextNBytes(int n){ + byte[] bytes = new byte[n]; + for (int i = 0; i < n; i++) { + bytes[i]=nextByte(); + } + return bytes; + } + public void skip(int n){ + curPos+=n; + } +} diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java index a5add91113..4aaf67a2d1 100644 --- a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java +++ b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java @@ -1,9 +1,13 @@ package assignment0326.jvm.loader; +import assignment0326.jvm.clz.ClassFile; + import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @@ -38,6 +42,9 @@ public byte[] readBinaryCode(String className) { public void addClassPath(String path) { + if(this.clzPaths.contains(path)){ + return; + } clzPaths.add(path); } @@ -53,7 +60,25 @@ public String getClassPath(){ } + private byte[] loadClassFile(String clzFileName) { + + try { + + return Files.readAllBytes(Paths.get(clzFileName)); + + + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + } } diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..92aaa75d3a --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java @@ -0,0 +1,122 @@ +package assignment0326.jvm.loader; + +import assignment0326.jvm.clz.AccessFlag; +import assignment0326.jvm.clz.ClassFile; +import assignment0326.jvm.clz.ClassIndex; +import assignment0326.jvm.constant.*; + + +public class ClassFileParser { + + private ConstantPool constantPool; + public ClassFile parse(byte[] codes) { + ClassFile classFile=new ClassFile(); + ByteCodeIterator iterator = new ByteCodeIterator(codes); + iterator.skip(4); + + classFile.setMinorVersion(iterator.next2BytesToInt()); + classFile.setMajorVersion(iterator.next2BytesToInt()); + + classFile.setConstPool(parseConstantPool(iterator)); + + classFile.setAccessFlag(parseAccessFlag(iterator)); + + classFile.setClassIndex(parseClassIndex(iterator)); + return classFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag flag = new AccessFlag(iter.next2BytesToInt()); + return flag; + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + ClassIndex classIndex=new ClassIndex(); + classIndex.setThisClassIndex(iter.next2BytesToInt()); + classIndex.setSuperClassIndex(iter.next2BytesToInt()); + return classIndex; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + constantPool=new ConstantPool(); + int size=iter.next2BytesToInt(); + constantPool.addConstantInfo(new NullConstantInfo()); + for (int i = 0; i < size-1; i++) { + parseConstant(iter); + } + return constantPool; + } + + private void parseConstant(ByteCodeIterator iter) { + int flag=iter.nextByteToInt(); + ConstantInfo constantInfo; + switch (flag){ + case ConstantInfo.UTF8_INFO: + constantInfo=parseUTF8Info(iter); + break; + case ConstantInfo.CLASS_INFO: + constantInfo = parseClassInfo(iter); + break; + case ConstantInfo.STRING_INFO: + constantInfo = parseStringInfo(iter); + break; + case ConstantInfo.FIELD_INFO: + constantInfo = parseFieldInfo(iter); + break; + case ConstantInfo.METHOD_INFO: + constantInfo = parseMethodInfo(iter); + break; + case ConstantInfo.NAME_AND_TYPE_INFO: + constantInfo = parseNameAndTypeInfo(iter); + break; + default: + throw new RuntimeException("Unsupported flag"); + } + constantPool.addConstantInfo(constantInfo); + } + + private ConstantInfo parseUTF8Info(ByteCodeIterator iter) { + UTF8Info utf8Info = new UTF8Info(constantPool); + int length=iter.next2BytesToInt(); + String value=new String(iter.nextNBytes(length)); + utf8Info.setLength(length); + utf8Info.setValue(value); + return utf8Info; + } + + private ConstantInfo parseClassInfo(ByteCodeIterator iter) { + ClassInfo classInfo = new ClassInfo(constantPool); + classInfo.setUtf8Index(iter.next2BytesToInt()); + return classInfo; + } + + private ConstantInfo parseStringInfo(ByteCodeIterator iter) { + StringInfo stringInfo = new StringInfo(constantPool); + stringInfo.setIndex(iter.next2BytesToInt()); + return stringInfo; + } + + private ConstantInfo parseFieldInfo(ByteCodeIterator iter) { + FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool); + fieldRefInfo.setClassInfoIndex(iter.next2BytesToInt()); + fieldRefInfo.setNameAndTypeIndex(iter.next2BytesToInt()); + return fieldRefInfo; + } + + private ConstantInfo parseMethodInfo(ByteCodeIterator iter) { + MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool); + methodRefInfo.setClassInfoIndex(iter.next2BytesToInt()); + methodRefInfo.setNameAndTypeIndex(iter.next2BytesToInt()); + return methodRefInfo; + } + + private ConstantInfo parseNameAndTypeInfo(ByteCodeIterator iter) { + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool); + nameAndTypeInfo.setIndex1(iter.next2BytesToInt()); + nameAndTypeInfo.setIndex2(iter.next2BytesToInt()); + return nameAndTypeInfo; + } + + +} diff --git a/group17/1264835468/src/assignment0326/jvm/test/ClassFileLoaderTest.java b/group17/1264835468/src/assignment0326/jvm/test/ClassFileLoaderTest.java index 5ebb4075a6..3b507732bb 100644 --- a/group17/1264835468/src/assignment0326/jvm/test/ClassFileLoaderTest.java +++ b/group17/1264835468/src/assignment0326/jvm/test/ClassFileLoaderTest.java @@ -4,6 +4,9 @@ * Created by Administrator on 2017/3/30. */ +import assignment0326.jvm.clz.ClassFile; +import assignment0326.jvm.clz.ClassIndex; +import assignment0326.jvm.constant.*; import assignment0326.jvm.loader.ClassFileLoader; import org.junit.After; import org.junit.Assert; @@ -11,16 +14,23 @@ import org.junit.Test; - - - public class ClassFileLoaderTest { + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; static String path1 = "D:\\GitHub\\group17\\1264835468\\bin"; static String path2 = "C:\\Temp"; + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + //clzFile.print(); + } @Before public void setUp() throws Exception { @@ -31,7 +41,7 @@ public void tearDown() throws Exception { } @Test - public void testClassPath(){ + public void testClassPath() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); @@ -39,7 +49,7 @@ public void testClassPath(){ String clzPath = loader.getClassPath(); - Assert.assertEquals(path1+";"+path2,clzPath); + Assert.assertEquals(path1 + ";" + path2, clzPath); } @@ -60,12 +70,12 @@ public void testClassFileLength() { @Test - public void testMagicNumber(){ + public void testMagicNumber() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); String className = "assignment0326.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; String acctualValue = this.byteToHexString(codes); @@ -74,17 +84,13 @@ public void testMagicNumber(){ } - - - - - private String byteToHexString(byte[] codes ){ + private String byteToHexString(byte[] codes) { 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()); + } + + } \ No newline at end of file diff --git a/group17/1264835468/src/assignment0326/jvm/util/Util.java b/group17/1264835468/src/assignment0326/jvm/util/Util.java new file mode 100644 index 0000000000..5855550bf8 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/util/Util.java @@ -0,0 +1,24 @@ +package assignment0326.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 strings=new ArrayList<>(); - for (int i = 0; i <10; i++) { - strings.add(String.valueOf(new Random().nextInt(3000))); - } - System.out.println(strings); - System.out.println(strings.stream().map(s-> s.charAt(0)).sorted().distinct().limit(5).collect(Collectors.toList())); - } - - public int findMinDifference(List timePoints) { - List list=new ArrayList<>(); - - for (String s:timePoints) { - list.add(parse(s)); - } - Collections.sort(list); - int min=Integer.MAX_VALUE; - for (int i = 0; i < list.size()-1; i++) { - min=Math.min(min,Math.min(Math.abs(list.get(i+1)-list.get(i)),24*60-Math.abs(list.get(i+1)-list.get(i)))); - } - return min; - } - - private Integer parse(String s) { - return Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(3, 5)); - } -} diff --git a/group17/1264835468/src/assignment0405/StackUtil.java b/group17/1264835468/src/assignment0405/StackUtil.java new file mode 100644 index 0000000000..469a13f9a9 --- /dev/null +++ b/group17/1264835468/src/assignment0405/StackUtil.java @@ -0,0 +1,104 @@ +package assignment0405; + +import assignment.Stack; + +/** + * Created by Administrator on 2017/4/6. + */ +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 stack1 = new Stack(); + Stack stack2 = new Stack(); + popAllToAnotherStack(s, stack1); + popAllToAnotherStack(stack1, stack2); + popAllToAnotherStack(stack2, s); + } + + private static void popAllToAnotherStack(Stack s, Stack another) { + while (!s.isEmpty()) { + another.push(s.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + Stack stack2 = new Stack(); + while (!s.isEmpty()) { + Object top = s.pop(); + if (!top.equals(o)) { + stack2.push(top); + } + } + popAllToAnotherStack(stack2, s); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + if(len>s.size()) + throw new RuntimeException("Stack size:" + s.size() + " < " + len); + Object[] objects = new Object[len]; + for (int i = 0; i < len; i++) { + objects[i] = s.pop(); + } + for (int i = len - 1; i >= 0; i--) { + s.push(objects[i]); + } + return objects; + } + + /** + * 字符串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) { + Stack stack = new Stack<>(); + + for (char c : s.toCharArray()) { + if (isLeft(c)) { + stack.push(c); + continue; + } + if (isRight(c)) { + if (stack.isEmpty() || !match(stack.pop(), c)) { + return false; + } + } + } + return stack.isEmpty(); + } + + private static boolean isLeft(char c) { + return c == '[' || c == '(' || c == '{'; + } + + private static boolean isRight(char c) { + return c == ']' || c == ')' || c == '}'; + } + + private static boolean match(char c1, char c2) { + return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}'); + } + + +} diff --git a/group17/1264835468/src/assignment0405/StackUtilTest.java b/group17/1264835468/src/assignment0405/StackUtilTest.java new file mode 100644 index 0000000000..58be1302f6 --- /dev/null +++ b/group17/1264835468/src/assignment0405/StackUtilTest.java @@ -0,0 +1,61 @@ +package assignment0405; + +import assignment.Stack; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by Administrator on 2017/4/9. + */ +public class StackUtilTest { + @Test + public void reverse() throws Exception { + Stack stack = new Stack(); + pushAll(stack, 1, 2, 3, 4); + Assert.assertEquals("4, 3, 2, 1", stack.toString()); + StackUtil.reverse(stack); + Assert.assertEquals("1, 2, 3, 4", stack.toString()); + StackUtil.reverse(stack); + Assert.assertEquals("4, 3, 2, 1", stack.toString()); + } + + + @Test + public void remove() throws Exception { + Stack stack = new Stack(); + pushAll(stack, 0, 1, 2, 3); + StackUtil.remove(stack, 1); + Assert.assertEquals("3, 2, 0", stack.toString()); + pushAll(stack, 4, 5, 6, 5); + Assert.assertEquals("5, 6, 5, 4, 3, 2, 0", stack.toString()); + StackUtil.remove(stack, 5); + Assert.assertEquals("6, 4, 3, 2, 0", stack.toString()); + + } + + @Test(expected = RuntimeException.class) + public void getTop() throws Exception { + Stack stack = new Stack(); + pushAll(stack, 1, 2, 3, 4, 5); + Assert.assertArrayEquals(new Object[]{5, 4, 3}, StackUtil.getTop(stack, 3)); + Assert.assertArrayEquals(new Object[]{5}, StackUtil.getTop(stack, 1)); + Assert.assertArrayEquals(new Object[]{5, 4, 3, 2, 1}, StackUtil.getTop(stack, 5)); + //异常 + StackUtil.getTop(stack, 6); + } + + @Test + public void isValidPairs() throws Exception { + Assert.assertTrue(StackUtil.isValidPairs("()[]{}([])")); + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + Assert.assertFalse(StackUtil.isValidPairs("((a)[]{b(c)}")); + } + + private void pushAll(Stack s, Object... objects) { + for (Object object : objects) { + s.push(object); + } + } + +} \ No newline at end of file diff --git a/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java b/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..8ba6ebd501 --- /dev/null +++ b/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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 From e93808e860d874b3281784886ec2d230f05813bb Mon Sep 17 00:00:00 2001 From: liuxianan// <1264835468@qq.com> Date: Mon, 10 Apr 2017 14:55:02 +0800 Subject: [PATCH 098/552] =?UTF-8?q?jvm=E5=B8=B8=E9=87=8F=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jvm/loader/ByteCodeIterator.java | 28 ++- .../jvm/loader/ClassFileLoader.java | 65 +++-- .../jvm/loader/ClassFileParser.java | 229 +++++++++--------- .../src/assignment0405/StackUtil.java | 6 +- 4 files changed, 173 insertions(+), 155 deletions(-) diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java index e9b9fdaf2e..09d87c13b6 100644 --- a/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java +++ b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java @@ -5,30 +5,38 @@ public class ByteCodeIterator { byte[] bytes; public ByteCodeIterator(byte[] bytes) { - curPos=0; + curPos = 0; this.bytes = bytes; } - public byte nextByte(){ + public boolean hasNext() { + return !(curPos >= bytes.length); + } + + public byte nextByte() { return bytes[curPos++]; } - public int nextByteToInt(){ + + public int nextByteToInt() { return Byte.toUnsignedInt(nextByte()); } - public int next2BytesToInt(){ - int hi=Byte.toUnsignedInt(nextByte()); + + public int next2BytesToInt() { + int hi = Byte.toUnsignedInt(nextByte()); int lo = Byte.toUnsignedInt(nextByte()); - int i=hi<<8|lo; + int i = hi << 8 | lo; return i; } - public byte[] nextNBytes(int n){ + + public byte[] nextNBytes(int n) { byte[] bytes = new byte[n]; for (int i = 0; i < n; i++) { - bytes[i]=nextByte(); + bytes[i] = nextByte(); } return bytes; } - public void skip(int n){ - curPos+=n; + + public void skip(int n) { + curPos += n; } } diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java index 4aaf67a2d1..3b05a1f761 100644 --- a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java +++ b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java @@ -17,47 +17,46 @@ public class ClassFileLoader { - private List clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - String path = className.replace(".", File.separator); - File classFile=null; - for (String p: clzPaths) { - classFile=new File(p+File.separator+path+".class"); - if(classFile.exists()) - break; - } - if(classFile==null) - throw new RuntimeException("no such class file"); - - byte[] bytes=new byte[(int)classFile.length()]; - try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(classFile))){ - bufferedInputStream.read(bytes, 0, bytes.length); - - } catch (IOException e) { - e.printStackTrace(); - } - return bytes; + private List clzPaths = new ArrayList<>(); + + public byte[] readBinaryCode(String className) { + String path = className.replace(".", File.separator); + File classFile = null; + for (String p : clzPaths) { + classFile = new File(p + File.separator + path + ".class"); + if (classFile.exists()) + break; } + if (classFile == null) + throw new RuntimeException("no such class file"); + byte[] bytes = new byte[(int) classFile.length()]; + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(classFile))) { + bufferedInputStream.read(bytes, 0, bytes.length); - public void addClassPath(String path) { - if(this.clzPaths.contains(path)){ - return; - } - clzPaths.add(path); + } catch (IOException e) { + e.printStackTrace(); } + return bytes; + } + public void addClassPath(String path) { + if (this.clzPaths.contains(path)) { + return; + } + clzPaths.add(path); + } + - public String getClassPath(){ - StringBuilder stringBuilder=new StringBuilder(); - for (int i = 0; i s.size()) + if (len > s.size()) throw new RuntimeException("Stack size:" + s.size() + " < " + len); Object[] objects = new Object[len]; for (int i = 0; i < len; i++) { @@ -96,8 +96,8 @@ private static boolean isRight(char c) { return c == ']' || c == ')' || c == '}'; } - private static boolean match(char c1, char c2) { - return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}'); + private static boolean match(char left, char right) { + return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}'); } From cae45cdc6480ce170cd0ddb5560ad6b2503614a7 Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Mon, 10 Apr 2017 15:10:09 +0800 Subject: [PATCH 099/552] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=BB=93=E6=9E=84=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=AC=AC=E5=85=AD=E6=AC=A1=E4=BD=9C=E4=B8=9A=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group27/383117348/.classpath | 3 +- .../coderising/download/DownloadThread.java | 0 .../coderising/download/FileDownloader.java | 0 .../download/FileDownloaderTest.java | 0 .../coderising/download/api/Connection.java | 0 .../download/api/ConnectionException.java | 0 .../download/api/ConnectionManager.java | 0 .../download/api/DownloadListener.java | 0 .../download/impl/ConnectionImpl.java | 0 .../download/impl/ConnectionManagerImpl.java | 0 .../coderising/litestruts/LoginAction.java | 0 .../com/coderising/litestruts/Struts.java | 0 .../com/coderising/litestruts/StrutsTest.java | 0 .../com/coderising/litestruts/View.java | 0 .../com/coderising/litestruts/struts.xml | 0 .../com/coding/basic/BinaryTreeNode.java | 0 .../com/coding/basic/Iterator.java | 0 .../com/coding/basic/List.java | 0 .../com/coding/basic/Queue.java | 0 .../com/coding/basic/array/ArrayList.java | 0 .../com/coding/basic/array/ArrayUtil.java | 0 .../coding/basic/linklist/LRUPageFrame.java | 0 .../basic/linklist/LRUPageFrameTest.java | 0 .../com/coding/basic/linklist/LinkedList.java | 0 .../com/coding/basic/stack/Stack.java | 0 .../com/coding/basic/stack/StackUtil.java | 0 .../coding/basic/stack/expr/InfixExpr.java | 15 ++++ .../basic/stack/expr/InfixExprTest.java | 46 ++++++++++++ .../basic/stack/test/StackUtilTest.java | 0 .../coderising/jvm/attr/AttributeInfo.java | 17 +++++ .../com/coderising/jvm/attr/CodeAttr.java | 49 ++++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 46 ++++++++++++ .../jvm/attr/LocalVariableItem.java | 39 ++++++++++ .../jvm/attr/LocalVariableTable.java | 25 +++++++ .../coderising/jvm/attr/StackMapTable.java | 29 ++++++++ .../com/coderising/jvm/clz/AccessFlag.java | 0 .../com/coderising/jvm/clz/ClassFile.java | 24 ++++-- .../com/coderising/jvm/clz/ClassIndex.java | 0 .../coderising/jvm/constant/ClassInfo.java | 0 .../coderising/jvm/constant/ConstantInfo.java | 0 .../coderising/jvm/constant/ConstantPool.java | 0 .../coderising/jvm/constant/FieldRefInfo.java | 0 .../coderising/jvm/constant/FloatInfo.java | 0 .../coderising/jvm/constant/IntegerInfo.java | 0 .../jvm/constant/MethodRefInfo.java | 0 .../jvm/constant/NameAndTypeInfo.java | 0 .../jvm/constant/NullConstantInfo.java | 0 .../coderising/jvm/constant/StringInfo.java | 0 .../com/coderising/jvm/constant/UTF8Info.java | 0 .../com/coderising/jvm/field/Field.java | 31 ++++++++ .../jvm/loader/ByteCodeIterator.java | 14 ++++ .../jvm/loader/ClassFileLoader.java | 0 .../jvm/loader/ClassFileLoader_backup.java | 0 .../jvm/loader/ClassFileParser.java | 14 ++++ .../com/coderising/jvm/method/Method.java | 52 +++++++++++++ .../jvm/test/ClassFileloaderTest.java | 74 +++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 0 .../com/coderising/jvm/util/Util.java | 0 58 files changed, 472 insertions(+), 6 deletions(-) rename group27/383117348/{src => data-structure}/com/coderising/download/DownloadThread.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/FileDownloader.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/FileDownloaderTest.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/api/Connection.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/api/ConnectionException.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/api/ConnectionManager.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/api/DownloadListener.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/impl/ConnectionImpl.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/impl/ConnectionManagerImpl.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/LoginAction.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/Struts.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/StrutsTest.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/View.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/struts.xml (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/BinaryTreeNode.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/Iterator.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/List.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/Queue.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/array/ArrayList.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/array/ArrayUtil.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LRUPageFrame.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LRUPageFrameTest.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LinkedList.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/stack/Stack.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/stack/StackUtil.java (100%) create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java rename group27/383117348/{src => data-structure}/com/coding/basic/stack/test/StackUtilTest.java (100%) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/clz/AccessFlag.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/clz/ClassFile.java (74%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/clz/ClassIndex.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ClassInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ConstantInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ConstantPool.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/FieldRefInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/FloatInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/IntegerInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/MethodRefInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/NameAndTypeInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/NullConstantInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/StringInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/UTF8Info.java (100%) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ByteCodeIterator.java (76%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileLoader.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileLoader_backup.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileParser.java (92%) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/test/ClassFileloaderTest.java (71%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/test/EmployeeV1.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/util/Util.java (100%) diff --git a/group27/383117348/.classpath b/group27/383117348/.classpath index a96bb3c428..58f336f5a2 100644 --- a/group27/383117348/.classpath +++ b/group27/383117348/.classpath @@ -1,7 +1,8 @@ - + + diff --git a/group27/383117348/src/com/coderising/download/DownloadThread.java b/group27/383117348/data-structure/com/coderising/download/DownloadThread.java similarity index 100% rename from group27/383117348/src/com/coderising/download/DownloadThread.java rename to group27/383117348/data-structure/com/coderising/download/DownloadThread.java diff --git a/group27/383117348/src/com/coderising/download/FileDownloader.java b/group27/383117348/data-structure/com/coderising/download/FileDownloader.java similarity index 100% rename from group27/383117348/src/com/coderising/download/FileDownloader.java rename to group27/383117348/data-structure/com/coderising/download/FileDownloader.java diff --git a/group27/383117348/src/com/coderising/download/FileDownloaderTest.java b/group27/383117348/data-structure/com/coderising/download/FileDownloaderTest.java similarity index 100% rename from group27/383117348/src/com/coderising/download/FileDownloaderTest.java rename to group27/383117348/data-structure/com/coderising/download/FileDownloaderTest.java diff --git a/group27/383117348/src/com/coderising/download/api/Connection.java b/group27/383117348/data-structure/com/coderising/download/api/Connection.java similarity index 100% rename from group27/383117348/src/com/coderising/download/api/Connection.java rename to group27/383117348/data-structure/com/coderising/download/api/Connection.java diff --git a/group27/383117348/src/com/coderising/download/api/ConnectionException.java b/group27/383117348/data-structure/com/coderising/download/api/ConnectionException.java similarity index 100% rename from group27/383117348/src/com/coderising/download/api/ConnectionException.java rename to group27/383117348/data-structure/com/coderising/download/api/ConnectionException.java diff --git a/group27/383117348/src/com/coderising/download/api/ConnectionManager.java b/group27/383117348/data-structure/com/coderising/download/api/ConnectionManager.java similarity index 100% rename from group27/383117348/src/com/coderising/download/api/ConnectionManager.java rename to group27/383117348/data-structure/com/coderising/download/api/ConnectionManager.java diff --git a/group27/383117348/src/com/coderising/download/api/DownloadListener.java b/group27/383117348/data-structure/com/coderising/download/api/DownloadListener.java similarity index 100% rename from group27/383117348/src/com/coderising/download/api/DownloadListener.java rename to group27/383117348/data-structure/com/coderising/download/api/DownloadListener.java diff --git a/group27/383117348/src/com/coderising/download/impl/ConnectionImpl.java b/group27/383117348/data-structure/com/coderising/download/impl/ConnectionImpl.java similarity index 100% rename from group27/383117348/src/com/coderising/download/impl/ConnectionImpl.java rename to group27/383117348/data-structure/com/coderising/download/impl/ConnectionImpl.java diff --git a/group27/383117348/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group27/383117348/data-structure/com/coderising/download/impl/ConnectionManagerImpl.java similarity index 100% rename from group27/383117348/src/com/coderising/download/impl/ConnectionManagerImpl.java rename to group27/383117348/data-structure/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group27/383117348/src/com/coderising/litestruts/LoginAction.java b/group27/383117348/data-structure/com/coderising/litestruts/LoginAction.java similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/LoginAction.java rename to group27/383117348/data-structure/com/coderising/litestruts/LoginAction.java diff --git a/group27/383117348/src/com/coderising/litestruts/Struts.java b/group27/383117348/data-structure/com/coderising/litestruts/Struts.java similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/Struts.java rename to group27/383117348/data-structure/com/coderising/litestruts/Struts.java diff --git a/group27/383117348/src/com/coderising/litestruts/StrutsTest.java b/group27/383117348/data-structure/com/coderising/litestruts/StrutsTest.java similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/StrutsTest.java rename to group27/383117348/data-structure/com/coderising/litestruts/StrutsTest.java diff --git a/group27/383117348/src/com/coderising/litestruts/View.java b/group27/383117348/data-structure/com/coderising/litestruts/View.java similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/View.java rename to group27/383117348/data-structure/com/coderising/litestruts/View.java diff --git a/group27/383117348/src/com/coderising/litestruts/struts.xml b/group27/383117348/data-structure/com/coderising/litestruts/struts.xml similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/struts.xml rename to group27/383117348/data-structure/com/coderising/litestruts/struts.xml diff --git a/group27/383117348/src/com/coding/basic/BinaryTreeNode.java b/group27/383117348/data-structure/com/coding/basic/BinaryTreeNode.java similarity index 100% rename from group27/383117348/src/com/coding/basic/BinaryTreeNode.java rename to group27/383117348/data-structure/com/coding/basic/BinaryTreeNode.java diff --git a/group27/383117348/src/com/coding/basic/Iterator.java b/group27/383117348/data-structure/com/coding/basic/Iterator.java similarity index 100% rename from group27/383117348/src/com/coding/basic/Iterator.java rename to group27/383117348/data-structure/com/coding/basic/Iterator.java diff --git a/group27/383117348/src/com/coding/basic/List.java b/group27/383117348/data-structure/com/coding/basic/List.java similarity index 100% rename from group27/383117348/src/com/coding/basic/List.java rename to group27/383117348/data-structure/com/coding/basic/List.java diff --git a/group27/383117348/src/com/coding/basic/Queue.java b/group27/383117348/data-structure/com/coding/basic/Queue.java similarity index 100% rename from group27/383117348/src/com/coding/basic/Queue.java rename to group27/383117348/data-structure/com/coding/basic/Queue.java diff --git a/group27/383117348/src/com/coding/basic/array/ArrayList.java b/group27/383117348/data-structure/com/coding/basic/array/ArrayList.java similarity index 100% rename from group27/383117348/src/com/coding/basic/array/ArrayList.java rename to group27/383117348/data-structure/com/coding/basic/array/ArrayList.java diff --git a/group27/383117348/src/com/coding/basic/array/ArrayUtil.java b/group27/383117348/data-structure/com/coding/basic/array/ArrayUtil.java similarity index 100% rename from group27/383117348/src/com/coding/basic/array/ArrayUtil.java rename to group27/383117348/data-structure/com/coding/basic/array/ArrayUtil.java diff --git a/group27/383117348/src/com/coding/basic/linklist/LRUPageFrame.java b/group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrame.java similarity index 100% rename from group27/383117348/src/com/coding/basic/linklist/LRUPageFrame.java rename to group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrame.java diff --git a/group27/383117348/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrameTest.java similarity index 100% rename from group27/383117348/src/com/coding/basic/linklist/LRUPageFrameTest.java rename to group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrameTest.java diff --git a/group27/383117348/src/com/coding/basic/linklist/LinkedList.java b/group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java similarity index 100% rename from group27/383117348/src/com/coding/basic/linklist/LinkedList.java rename to group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java diff --git a/group27/383117348/src/com/coding/basic/stack/Stack.java b/group27/383117348/data-structure/com/coding/basic/stack/Stack.java similarity index 100% rename from group27/383117348/src/com/coding/basic/stack/Stack.java rename to group27/383117348/data-structure/com/coding/basic/stack/Stack.java diff --git a/group27/383117348/src/com/coding/basic/stack/StackUtil.java b/group27/383117348/data-structure/com/coding/basic/stack/StackUtil.java similarity index 100% rename from group27/383117348/src/com/coding/basic/stack/StackUtil.java rename to group27/383117348/data-structure/com/coding/basic/stack/StackUtil.java diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..cc084db36d --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,15 @@ +package com.coding.basic.stack.expr; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + return 0.0f; + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..e2de427e62 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,46 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group27/383117348/src/com/coding/basic/stack/test/StackUtilTest.java b/group27/383117348/data-structure/com/coding/basic/stack/test/StackUtilTest.java similarity index 100% rename from group27/383117348/src/com/coding/basic/stack/test/StackUtilTest.java rename to group27/383117348/data-structure/com/coding/basic/stack/test/StackUtilTest.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..85156946eb --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.attr; + +public class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..63f4503244 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,49 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo{ + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + + return null; + } + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..0e072f6d66 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,46 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo{ + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + + return null; + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..3eb2654e36 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..e69728e6aa --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,25 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..70387e2bb2 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2Int(); + int len = iter.nextU4Integer(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group27/383117348/src/com/coderising/jvm/clz/AccessFlag.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/AccessFlag.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/clz/AccessFlag.java rename to group27/383117348/mini-jvm/com/coderising/jvm/clz/AccessFlag.java diff --git a/group27/383117348/src/com/coderising/jvm/clz/ClassFile.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java similarity index 74% rename from group27/383117348/src/com/coderising/jvm/clz/ClassFile.java rename to group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java index 1b5a8b95a6..9827aa2937 100644 --- a/group27/383117348/src/com/coderising/jvm/clz/ClassFile.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java @@ -1,7 +1,12 @@ package com.coderising.jvm.clz; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFile { @@ -11,7 +16,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -22,9 +28,6 @@ public AccessFlag getAccessFlag() { public void setAccessFlag(AccessFlag accessFlag) { this.accessFlag = accessFlag; } - - - public ConstantPool getConstantPool() { return pool; } @@ -48,7 +51,18 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } public void print(){ diff --git a/group27/383117348/src/com/coderising/jvm/clz/ClassIndex.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassIndex.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/clz/ClassIndex.java rename to group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassIndex.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/ClassInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/ClassInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/ConstantInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/ConstantInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/ConstantPool.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/ConstantPool.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/FieldRefInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/FieldRefInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/FloatInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/FloatInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/IntegerInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/IntegerInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/MethodRefInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/MethodRefInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/NameAndTypeInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/NullConstantInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/NullConstantInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/StringInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/StringInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/UTF8Info.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/UTF8Info.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..17e3b77754 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + return null; + } + +} diff --git a/group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java similarity index 76% rename from group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java rename to group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java index 2688ae5810..3a3e4dd7b9 100644 --- a/group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java @@ -48,4 +48,18 @@ private byte[] getByteBySize(int size){ } return by; } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = code[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } } diff --git a/group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader.java rename to group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java diff --git a/group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader_backup.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader_backup.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader_backup.java rename to group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader_backup.java diff --git a/group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java similarity index 92% rename from group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java rename to group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java index 209ee78d36..8a42fe4cb4 100644 --- a/group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java @@ -26,6 +26,7 @@ public ClassFile parse(byte[] codes) { if(!magicNum.equals("cafebabe")){ throw new RuntimeException("文件类型错误"); } + ByteCodeIterator iter = new ByteCodeIterator(codes); int minVersion = by.nextU2Int(); int majorVersion = by.nextU2Int(); @@ -34,14 +35,20 @@ public ClassFile parse(byte[] codes) { AccessFlag flag = parseAccessFlag(by); ClassIndex index = parseClassIndex(by); + parseInterfaces(iter); + file.setMinorVersion(minVersion); file.setMajorVersion(majorVersion); file.setAccessFlag(flag); file.setClassIndex(index); file.setConstPool(constant); + + return file; } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { AccessFlag flag = new AccessFlag(iter.nextU2Int()); return flag; @@ -105,6 +112,13 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } return pool; } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2Int(); + + + } + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java b/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..e46b5885ab --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.method; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + return null; + + } +} diff --git a/group27/383117348/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java similarity index 71% rename from group27/383117348/src/com/coderising/jvm/test/ClassFileloaderTest.java rename to group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java index ff026ee819..fa5e910f98 100644 --- a/group27/383117348/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,5 +1,7 @@ package com.coderising.jvm.test; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -12,7 +14,9 @@ import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.constant.NameAndTypeInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; public class ClassFileloaderTest { @@ -193,6 +197,76 @@ public void testClassIndex(){ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } diff --git a/group27/383117348/src/com/coderising/jvm/test/EmployeeV1.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/EmployeeV1.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/test/EmployeeV1.java rename to group27/383117348/mini-jvm/com/coderising/jvm/test/EmployeeV1.java diff --git a/group27/383117348/src/com/coderising/jvm/util/Util.java b/group27/383117348/mini-jvm/com/coderising/jvm/util/Util.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/util/Util.java rename to group27/383117348/mini-jvm/com/coderising/jvm/util/Util.java From 7adfa4e86575800dcaa83b5fb2239ed14e7ffbc5 Mon Sep 17 00:00:00 2001 From: Ren650119726 <102228177@qq.com> Date: Mon, 10 Apr 2017 15:18:38 +0800 Subject: [PATCH 100/552] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/stack/Stack.java | 38 ++++++++-- .../src/com/coding/basic/stack/StackUtil.java | 73 ++++++++++++++++++- .../com/coding/basic/stack/StackUtilTest.java | 44 +++++++++++ 3 files changed, 146 insertions(+), 9 deletions(-) create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java index 1af8fbfb7a..42b6362e2f 100644 --- a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java @@ -1,22 +1,48 @@ package com.coding.basic.stack; +import java.util.EmptyStackException; + public class Stack { - private ArrayList elementData = new ArrayList(); + private ArrayList elementData; + private int elementCount; - public void push(Object o){ + public Stack() { + this.elementData = new ArrayList(); + this.elementCount = 0; + } + public void push(Object o){ + elementData.add(o); + elementCount++; } public Object pop(){ - return null; + Object object = elementData.remove(elementCount-1); + elementCount--; + return object; } public Object peek(){ - return null; + if(isEmpty()){ + throw new EmptyStackException(); + } + return elementData.get(elementCount-1); } public boolean isEmpty(){ - return false; + return elementCount==0; } public int size(){ - return -1; + return elementCount; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < elementData.size(); i++) { + sb.append(elementData.get(i)).append(","); + } + sb = sb.deleteCharAt(sb.length()-1); + sb.append("]"); + return sb.toString(); } } \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java index 2ecca1811c..5b8019e2b7 100644 --- a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java @@ -8,8 +8,22 @@ public class StackUtil { * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 */ public static void reverse(Stack s) { - + if(s.isEmpty()){ + return ; + } + int temp1 = (int) s.pop(); + reverse(s); + if(s.isEmpty()){ + s.push(temp1); + return ; + } + int temp2 = (int) s.pop(); + reverse(s); + s.push(temp1); + reverse(s); + s.push(temp2); } + /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 @@ -17,7 +31,19 @@ public static void reverse(Stack s) { * @param o */ public static void remove(Stack s,Object o) { - + if(s.isEmpty()){ + return ; + } + Stack stack = new Stack(); + while(!s.isEmpty()){ + Object pop = s.pop(); + if(!pop.equals(o)){ + stack.push(pop); + } + } + while(!stack.isEmpty()){ + s.push(stack.pop()); + } } /** @@ -27,7 +53,19 @@ public static void remove(Stack s,Object o) { * @return */ public static Object[] getTop(Stack s,int len) { - return null; + int i = 0; + Stack stack = new Stack(); + Object[] objects = new Object[len]; + while(i < len){ + Object o = s.pop(); + stack.push(o); + objects[i] = o; + i++; + } + while(!stack.isEmpty()){ + s.push(stack.pop()); + } + return objects; } /** * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz @@ -38,6 +76,35 @@ public static Object[] getTop(Stack s,int len) { * @return */ public static boolean isValidPairs(String s){ + Stack stack = new Stack(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '(': + case '[': + case '{': + stack.push(c); + break; + case ')': + if((char)stack.pop()!='('){ + return false; + } + break; + case ']': + if((char)stack.pop()!='['){ + return false; + } + break; + case '}': + if((char)stack.pop()!='{'){ + return false; + } + break; + } + } + if(stack.isEmpty()){ + return true; + } return false; } diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..722dd25846 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,44 @@ +package com.coding.basic.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class StackUtilTest { + Stack stack ; + { + stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + } + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverse() { + StackUtil.reverse(stack); + Assert.assertEquals("[5,4,3,2,1]", stack.toString()); + } + @Test + public void testRemove() { + StackUtil.remove(stack, 3); + Assert.assertEquals("[1,2,4,5]", stack.toString()); + } + @Test + public void testGetTop(){ + Assert.assertEquals(new Object[]{5,4}, StackUtil.getTop(stack, 2)); + Assert.assertEquals("[1,2,3,4,5]", stack.toString()); + } +} From 14b90bcd79c5479a0fd663dce1e14e66dc4f6714 Mon Sep 17 00:00:00 2001 From: mengxz <82427129@qq.com> Date: Mon, 10 Apr 2017 18:52:40 +0800 Subject: [PATCH 101/552] homework of 17/4/5 first commit ,read constantpool --- .../coderising/jvm/attr/AttributeInfo.java | 18 +++ .../com/coderising/jvm/attr/CodeAttr.java | 10 ++ .../com/coderising/jvm/clz/AccessFlag.java | 24 ++++ .../com/coderising/jvm/clz/ClassFile.java | 76 ++++++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 +++ .../coderising/jvm/constant/ClassInfo.java | 26 ++++ .../coderising/jvm/constant/ConstantInfo.java | 32 +++++ .../coderising/jvm/constant/ConstantPool.java | 29 ++++ .../coderising/jvm/constant/DoubleInfo.java | 10 ++ .../coderising/jvm/constant/FieldRefInfo.java | 52 +++++++ .../coderising/jvm/constant/FloatInfo.java | 10 ++ .../coderising/jvm/constant/IntegerInfo.java | 20 +++ .../com/coderising/jvm/constant/LongInfo.java | 10 ++ .../jvm/constant/MethodRefInfo.java | 52 +++++++ .../jvm/constant/NameAndTypeInfo.java | 43 ++++++ .../jvm/constant/NullConstantInfo.java | 10 ++ .../coderising/jvm/constant/StringInfo.java | 25 ++++ .../com/coderising/jvm/constant/UTF8Info.java | 31 +++++ .../java/com/coderising/jvm/field/Field.java | 51 +++++++ .../jvm/loader/ByteCodeIterator.java | 41 ++++++ .../jvm/loader/ClassFileLoader.java | 5 - .../jvm/loader/ClassFileParser.java | 130 ++++++++++++++++++ .../com/coderising/jvm/method/Method.java | 27 ++++ .../java/com/coderising/jvm/util/Util.java | 21 +++ .../com/coding/basic/{ => stack}/Stack.java | 4 +- .../com/coding/basic/stack/StackUtil.java | 47 +++++++ .../coding/basic/stack/expr/InfixExpr.java | 14 ++ .../com/coding/basic/stack/StackUtilTest.java | 65 +++++++++ .../basic/stack/expr/InfixExprTest.java | 35 +++++ 29 files changed, 931 insertions(+), 6 deletions(-) create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java rename group17/82427129/JavaUtil/src/main/java/com/coding/basic/{ => stack}/Stack.java (88%) create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..11e25039c3 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..bdf080d421 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.attr; + +public class CodeAttr extends AttributeInfo{ + + public CodeAttr(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + // TODO Auto-generated constructor stub + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..ee70c4305c --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,24 @@ +package com.coderising.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; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..d1d3b4159d --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,76 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 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 ConstantPool getPool() { + return pool; + } + + public void setPool(ConstantPool pool) { + this.pool = pool; + } + + public List getFields() { + return fields; + } + + public void addFields(Field f){ + this.fields.add(f); + } + + public List getMethods() { + return methods; + } + + public void addMethods(Method m){ + this.methods.add(m); + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..7750d4439d --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..c0d67993ed --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,26 @@ +package com.coderising.jvm.constant; + +public class ClassInfo extends ConstantInfo { + private int type = CLASS_INFO;// u1 tag + private int name_index;// u2 name_index + + @Override + public int getType() { + return type; + } + + public int getName_index() { + return name_index; + } + + public void setName_index(int name_index) { + this.name_index = name_index; + } + + public String getClassName() { + int name_index = getName_index(); + UTF8Info utf8 = (UTF8Info) this.constantPool + .getConstantInfo(name_index); + return utf8.getValue(); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..885fba98b5 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,32 @@ +package com.coderising.jvm.constant; + +public abstract class ConstantInfo { + public static final int UTF8_INFO = 1; + public static final int INTEGER_INFO = 3; + public static final int FLOAT_INFO = 4; + public static final int LONG_INFO = 5; + public static final int DOUBLE_INFO = 6; + 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 cp){ + this.constantPool = cp; + } + + public abstract int getType(); + + public ConstantPool getConstantPool(){ + return this.constantPool; + } + + public ConstantInfo getConstantInfo(int index){ + return this.constantPool.getConstantInfo(index); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..179b5ad9bf --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +public class ConstantPool { + private List cl = new ArrayList(); + private int constant_pool_size; + + public int getConstant_pool_size() { + return constant_pool_size; + } + + public void setConstant_pool_size(int constant_pool_size) { + this.constant_pool_size = constant_pool_size; + } + + public void addConstantInfo(ConstantInfo e){ + cl.add(e); + } + + public ConstantInfo getConstantInfo(int index) { + return cl.get(index); + } + + public int getSize() { + return cl.size() - 1;// 减去常量池的长度一项 + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java new file mode 100644 index 0000000000..9d6112ee35 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.constant; + +public class DoubleInfo extends ConstantInfo { + private int type = DOUBLE_INFO; + + @Override + public int getType() { + return type; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..8d3a8c25c8 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.constant; + +public class FieldRefInfo extends ConstantInfo { + private int type = FIELD_INFO;//u1 tag + private int class_index;//u2 class_index + private int name_and_type_index;//u2 name_and_type_index + + @Override + public int getType() { + return type; + } + + public int getClass_index() { + return class_index; + } + + public void setClass_index(int class_index) { + this.class_index = class_index; + } + + public int getName_and_type_index() { + return name_and_type_index; + } + + public void setName_and_type_index(int name_and_type_index) { + this.name_and_type_index = name_and_type_index; + } + + @Override + public String toString() { + return getClassName() + ":"+getFieldName()+" : "+getFieldType(); + } + + public String getClassName() { + ClassInfo classInfo = (ClassInfo) this.constantPool + .getConstantInfo(class_index); + return classInfo.getClassName(); + } + + public String getFieldName() { + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.constantPool + .getConstantInfo(name_and_type_index); + return nameAndTypeInfo.getName(); + } + + public String getFieldType() { + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.constantPool + .getConstantInfo(name_and_type_index); + return nameAndTypeInfo.getTypeInfo(); + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java new file mode 100644 index 0000000000..d02f37f6d8 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.constant; + +public class FloatInfo extends ConstantInfo { + private int type = FLOAT_INFO; + + @Override + public int getType() { + return type; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java new file mode 100644 index 0000000000..b89a8925c4 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java @@ -0,0 +1,20 @@ +package com.coderising.jvm.constant; + +public class IntegerInfo extends ConstantInfo { + private int type = INTEGER_INFO; + private int Num; + + @Override + public int getType() { + return type; + } + + public int getNum() { + return Num; + } + + public void setNum(int num) { + Num = num; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java new file mode 100644 index 0000000000..23c80a2640 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.constant; + +public class LongInfo extends ConstantInfo { + private int type = LONG_INFO; + + @Override + public int getType() { + return type; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..86a199808b --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.constant; + +public class MethodRefInfo extends ConstantInfo { + private int type = METHOD_INFO;//u1 tag + private int class_index;//u2 class_index + private int name_and_type_index;//u2 name_and_type_index + + @Override + public int getType() { + return type; + } + + public int getClass_index() { + return class_index; + } + + public void setClass_index(int class_index) { + this.class_index = class_index; + } + + public int getName_and_type_index() { + return name_and_type_index; + } + + public void setName_and_type_index(int name_and_type_index) { + this.name_and_type_index = name_and_type_index; + } + + public String getClassName() { + ClassInfo c = (ClassInfo) this.constantPool + .getConstantInfo(class_index); + return c.getClassName(); + } + + public String getMethodName() { + NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool + .getConstantInfo(name_and_type_index); + return nt.getName(); + } + + public String getParamsAndReturnType() { + NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool + .getConstantInfo(name_and_type_index); + return nt.getTypeInfo(); + } + + @Override + public String toString() { + return getClassName() + ":" + getMethodName() + ":" + + getParamsAndReturnType(); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..61b434d245 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,43 @@ +package com.coderising.jvm.constant; + +public class NameAndTypeInfo extends ConstantInfo { + private int type = NAME_AND_TYPE_INFO;// u1 tag + private int name_index;//u2 name_index + private int descriptor_index;//u2 descriptor_index + + @Override + public int getType() { + return type; + } + + public int getName_index() { + return name_index; + } + + public void setName_index(int name_index) { + this.name_index = name_index; + } + + public int getDescriptor_index() { + return descriptor_index; + } + + public void setDescriptor_index(int descriptor_index) { + this.descriptor_index = descriptor_index; + } + + public String getName() { + UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(name_index); + return u.getValue(); + } + + public String getTypeInfo() { + UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(descriptor_index); + return u.getValue(); + } + + @Override + public String toString() { + return "(" + getName() + "," + getTypeInfo() + ")"; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..b383988fe7 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo{ + + @Override + public int getType() { + return -1; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..b2bbbe9093 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,25 @@ +package com.coderising.jvm.constant; + +public class StringInfo extends ConstantInfo { + private int type = STRING_INFO;//u1 tag + private int string_index;//u2 string_index + @Override + public int getType() { + return type; + } + public int getString_index() { + return string_index; + } + public void setString_index(int string_index) { + this.string_index = string_index; + } + public String getString(){ + UTF8Info u = (UTF8Info)this.constantPool.getConstantInfo(string_index); + return u.getValue(); + } + @Override + public String toString() { + return getString(); + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..4bcf998504 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.constant; + +public class UTF8Info extends ConstantInfo { + private int type = UTF8_INFO;//u1 tag + private int length;//u2 length + private String value;//n 个 u1 + public UTF8Info(ConstantPool pool) { + super(pool); + } + @Override + public int getType() { + return type; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + @Override + public String toString() { + return "UTF8Info [type="+type+",length="+length+",value="+value+"]"; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..19fcec9e46 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java @@ -0,0 +1,51 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag;//u2 access_flags + private int nameIndex;//u2 name_index + private int descriptorIndex;//u2 descriptor_index + //attr 属性表信息首次写jvm先放弃,以后再加 + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + return null; + } + + public int getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public void setDescriptorIndex(int descriptorIndex) { + this.descriptorIndex = descriptorIndex; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..7bd30d2832 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,41 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + private byte[] codes; + private int pos = 0; + + public void back(int length) { + if (pos - length < 0) { + throw new RuntimeException("back length is too long:" + length + + ",pos:" + pos); + } + pos -= length; + } + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public int nextU1toInt() { + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2toInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4toInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], + codes[pos++], codes[pos++] }); + } + + public String nextUxtoHexString(int len) { + byte[] bytes = new byte[len]; + for (int i = 0; i < len; i++) { + bytes[i] = codes[pos++]; + } + return Util.byteToHexString(bytes); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java index fafac43407..d8818219ed 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -96,9 +96,4 @@ private String convertName(String className) { return sb.toString(); } - public static void main(String[] args) { - String d = "com.taiji.array.Load"; - ClassFileLoader cc = new ClassFileLoader(); - System.out.print(cc.convertName(d)); - } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..888dfe4817 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,130 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ClassFileParser { + /** + * 读取ClassFile对象 + * @param codes + * @return + */ + public ClassFile parse(byte[] codes) { + ClassFile cf = new ClassFile(); + ByteCodeIterator itr = new ByteCodeIterator(codes); + String magicNumber = itr.nextUxtoHexString(4);//1读取魔数 + if (!magicNumber.equals("cafebabe")) { + throw new RuntimeException("magicNum not ok"); + } + cf.setMajorVersion(itr.nextU2toInt());//2读取主版本号 + cf.setMinorVersion(itr.nextU2toInt());//3读取次版本号 + + ConstantPool pool = parseConstantPool(itr);//4、5读取常量池 + cf.setPool(pool); + + cf.setAccessFlag(new AccessFlag(itr.nextU2toInt()));//6读取访问标志 + + ClassIndex classIndex = parseClassIndex(itr);//读取类引用7this和8super + cf.setClzIndex(classIndex); + + return cf; + } + + /** + * 读取this super对象引用 + * @param itr + * @return + */ + public ClassIndex parseClassIndex(ByteCodeIterator itr) { + ClassIndex classIndex = new ClassIndex(); + classIndex.setThisClassIndex(itr.nextU2toInt()); + classIndex.setSuperClassIndex(itr.nextU2toInt()); + return classIndex; + } + /** + * 读取常量池 + * @param itr + * @return + */ + public ConstantPool parseConstantPool(ByteCodeIterator itr) { + int count = itr.nextU2toInt(); + ConstantPool pool = new ConstantPool(); + pool.setConstant_pool_size(count); + pool.addConstantInfo(new NullConstantInfo());// 占住常量池的第一个,常量池是的index从1开始 + + for (int i = 1; i < count; i++) { + int tag = itr.nextU1toInt(); + switch (tag) { + case ConstantInfo.CLASS_INFO: + ClassInfo classInfo = new ClassInfo(); + classInfo.setName_index(itr.nextU2toInt()); + pool.addConstantInfo(classInfo); + break; + + case ConstantInfo.UTF8_INFO: + UTF8Info utf8Info = new UTF8Info(pool); + int length = itr.nextU2toInt(); + String value = itr.nextUxtoHexString(length); + utf8Info.setLength(length); + utf8Info.setValue(value); + pool.addConstantInfo(utf8Info); + break; + + case ConstantInfo.STRING_INFO: + StringInfo si = new StringInfo(); + si.setString_index(itr.nextU2toInt()); + pool.addConstantInfo(si); + break; + + case ConstantInfo.NAME_AND_TYPE_INFO: + NameAndTypeInfo nt = new NameAndTypeInfo(); + nt.setName_index(itr.nextU2toInt()); + nt.setDescriptor_index(itr.nextU2toInt()); + pool.addConstantInfo(nt); + break; + + case ConstantInfo.METHOD_INFO: + MethodRefInfo m = new MethodRefInfo(); + m.setClass_index(itr.nextU2toInt()); + m.setName_and_type_index(itr.nextU2toInt()); + pool.addConstantInfo(m); + break; + + case ConstantInfo.FIELD_INFO: + FieldRefInfo f = new FieldRefInfo(); + f.setClass_index(itr.nextU2toInt()); + f.setName_and_type_index(itr.nextU2toInt()); + pool.addConstantInfo(f); + break; + + /*case ConstantInfo.FLOAT_INFO: + + break; + + case ConstantInfo.INTEGER_INFO: + break; + + case ConstantInfo.DOUBLE_INFO: + break; + + case ConstantInfo.LONG_INFO: + break;*/ + + default: + throw new RuntimeException("the constant pool tag " + tag + + " has not been implemented yet."); + } + } + return pool; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..8a876551a0 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.method; + +public class Method { + private int access_flags; + private int name_index; + private int type_index; + + + public int getAccess_flags() { + return access_flags; + } + public void setAccess_flags(int access_flags) { + this.access_flags = access_flags; + } + public int getName_index() { + return name_index; + } + public void setName_index(int name_index) { + this.name_index = name_index; + } + public int getType_index() { + return type_index; + } + public void setType_index(int type_index) { + this.type_index = type_index; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..2201593cd2 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java @@ -0,0 +1,21 @@ +package com.coderising.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java similarity index 88% rename from group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java rename to group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java index 6bde3e3105..007362e95a 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java @@ -1,7 +1,9 @@ -package com.coding.basic; +package com.coding.basic.stack; import java.util.EmptyStackException; +import com.coding.basic.ArrayList; + public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..e1bc00858f --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,47 @@ +package com.coding.basic.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) { + + } + /** + * 添加元素到栈底部 + * @param s + * @param value + */ + public static void addToBottom(Stack s, Integer value){ + + } + /** + * 删除栈中的某个元素 注意:只能使用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/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..cd086dfe79 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,14 @@ +package com.coding.basic.stack.expr; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + return 0.0f; + } +} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..e47a5d44d4 --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,65 @@ +package com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Test; + +public class StackUtilTest { + + @Test + public void testReverse() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testAddToBottom() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..4152869ad2 --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,35 @@ +package com.coding.basic.stack.expr; + +import org.junit.Assert; +import org.junit.Test; + +public class InfixExprTest { + + @Test + public void testEvaluate() { + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + } + +} From 333ab1743ae41ac136cd1cc6ac5b947f18c82646 Mon Sep 17 00:00:00 2001 From: xiaobo Date: Mon, 10 Apr 2017 22:47:53 +0800 Subject: [PATCH 102/552] StackAndJvm StackUtil and Parse JVM constant --- .../jvm/loader/ByteCodeIterator.java | 29 +++++ .../jvm/loader/ClassFileParser.java | 96 ++++++++++++--- .../com/coding/basic/linklist/LinkedList.java | 4 +- .../Study/src/com/first/ArrayList.java | 10 +- .../Study/src/com/first/LinkedList.java | 54 ++++++--- .../349184132/Study/src/com/first/Queue.java | 2 +- .../349184132/Study/src/com/first/Stack.java | 4 +- .../Study/src/com/first/StackUtil.java | 110 ++++++++++++++++++ .../src/com/first/test/StackUtilTest.java | 90 ++++++++++++++ .../Study/src/com/linked/LinkedList.java | 4 +- 10 files changed, 362 insertions(+), 41 deletions(-) create mode 100644 group04/349184132/Study/src/com/first/StackUtil.java create mode 100644 group04/349184132/Study/src/com/first/test/StackUtilTest.java diff --git a/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java index 9c9fac2839..a91c3f49b3 100644 --- a/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,34 @@ package com.coderising.jvm.loader; +import com.coderising.jvm.util.Util; + +import java.util.Arrays; + public class ByteCodeIterator { + private byte[] codes; + private int pos = 0; + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[] {codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[]{ codes[pos++] ,codes[pos++]}); + } + + public int nextU1ToInt() { + return Util.byteToInt(new byte[] { codes[pos++]}); + } + public byte[] getByte(int len) { + if(len + pos >= codes.length){ + throw new IndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes,pos,pos+len); + pos += len; + return data; + } } diff --git a/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileParser.java b/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileParser.java index 8e29f14a0c..31fc69f828 100644 --- a/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group04/349184132/Study/src/com/coderising/jvm/loader/ClassFileParser.java @@ -1,27 +1,43 @@ package com.coderising.jvm.loader; -import java.io.UnsupportedEncodingException; - import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.NullConstantInfo; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.constant.*; + +import java.io.UnsupportedEncodingException; public class ClassFileParser { public ClassFile parse(byte[] codes) { - + ClassFile clzFile = new ClassFile(); + + ByteCodeIterator iter = new ByteCodeIterator(codes); + + String magicNumber = iter.nextU4ToHexString(); + + if(!"cafebabe".equals(magicNumber)){ + return null; + } + + clzFile.setMinorVersion(iter.nextU2ToInt()); + + clzFile.setMajorVersion(iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex index = parseClassInfex(iter); + + clzFile.setClassIndex(index); + - return null; + return clzFile; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { @@ -36,8 +52,62 @@ private ClassIndex parseClassInfex(ByteCodeIterator iter) { } private ConstantPool parseConstantPool(ByteCodeIterator iter) { + int constPoolCount = iter.nextU2ToInt(); + System.out.println("Constant Pool Size : " + constPoolCount); + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); - return null; + for(int i=1;i s.size()){ + throw new IndexOutOfBoundsException(); + } + Object[] result = new Object[len]; + + for(int i=0; i +* @since
���� 7, 2017
+* @version 1.0 +*/ +public class StackUtilTest { + Stack s = new Stack(); + + @Before + public void before() throws Exception { + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + } + + @After + public void after() throws Exception { + } + + /** + * Method: reverse(Stack s) + */ + @Test + public void testReverse() throws Exception { + + StackUtil.reverse(s); + int[] result = new int[s.size()]; + for (int i = 0; i < result.length; i++) { + result[i] = (Integer) s.pop(); + } + int[] expect = new int[]{1, 2, 3, 4, 5}; + Assert.assertArrayEquals(expect, result); + } + + /** + * Method: remove(Stack s, Object o) + */ + @Test + public void testRemove() throws Exception { + int[] result = new int[s.size() - 1]; + StackUtil.remove(s, 1); + for (int i = 0; i < result.length; i++) { + result[i] = (Integer) s.pop(); + } + int[] expect = new int[]{5, 4, 3, 2}; + Assert.assertArrayEquals(expect, result); + + } + + /** + * Method: getTop(Stack s, int len) + */ + @Test + public void testGetTop() throws Exception { + // stack 5 4 3 2 1 + Object[] result = StackUtil.getTop(s, 2); + // 5 4 + Object[] expect = {5, 4}; + Assert.assertArrayEquals(expect, result); + } + + /** + * Method: isValidPairs(String s) + */ + @Test + public void testIsValidPairs() throws Exception { + String s1 = "([e{d}f])"; + boolean flag1 = StackUtil.isValidPairs(s1); + Assert.assertEquals(true, flag1); // ArrayList.remove 边界 删除最后一个 + String s2 = "([b{x]y})"; + boolean flag2 = StackUtil.isValidPairs(s2); + Assert.assertEquals(false, flag2); + } + + +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/linked/LinkedList.java b/group04/349184132/Study/src/com/linked/LinkedList.java index 44aba236b4..9d4e45d034 100644 --- a/group04/349184132/Study/src/com/linked/LinkedList.java +++ b/group04/349184132/Study/src/com/linked/LinkedList.java @@ -236,7 +236,7 @@ public Node reverseFor(Node head){ } /** * 递归写法 - * @param node + * @param * @return */ public Node reverseRecursion(Node current){ @@ -297,7 +297,7 @@ public int[] getElements(LinkedList list){ int index = 0; for(Iterator iter = list.iterator();iter.hasNext();){ int LinkIndex = (int)iter.next(); - result[index] = (int)get(LinkIndex); + result[index] = (Integer) get(LinkIndex); } return result; } From 35f6dba078285f5d8fc93b8b397a2797cf05cc16 Mon Sep 17 00:00:00 2001 From: gongxun Date: Mon, 10 Apr 2017 23:26:44 +0800 Subject: [PATCH 103/552] template --- .../785396327/3.26/jvm_1/ClassFileLoader.java | 2 +- group17/785396327/4.5/clz/AccessFlag.java | 28 ++ group17/785396327/4.5/clz/ClassFile.java | 89 ++++++ group17/785396327/4.5/clz/ClassIndex.java | 25 ++ group17/785396327/4.5/constant/ClassInfo.java | 27 ++ .../785396327/4.5/constant/ConstantInfo.java | 31 ++ .../785396327/4.5/constant/ConstantPool.java | 31 ++ .../785396327/4.5/constant/FieldRefInfo.java | 57 ++++ .../785396327/4.5/constant/MethodRefInfo.java | 48 ++++ .../4.5/constant/NameAndTypeInfo.java | 48 ++++ .../4.5/constant/NullConstantInfo.java | 14 + .../785396327/4.5/constant/StringInfo.java | 29 ++ group17/785396327/4.5/constant/UTF8Info.java | 33 +++ .../4.5/test/ClassFileloaderTest.java | 265 ++++++++++++++++++ group17/785396327/4.5/util/Util.java | 27 ++ 15 files changed, 753 insertions(+), 1 deletion(-) create mode 100644 group17/785396327/4.5/clz/AccessFlag.java create mode 100644 group17/785396327/4.5/clz/ClassFile.java create mode 100644 group17/785396327/4.5/clz/ClassIndex.java create mode 100644 group17/785396327/4.5/constant/ClassInfo.java create mode 100644 group17/785396327/4.5/constant/ConstantInfo.java create mode 100644 group17/785396327/4.5/constant/ConstantPool.java create mode 100644 group17/785396327/4.5/constant/FieldRefInfo.java create mode 100644 group17/785396327/4.5/constant/MethodRefInfo.java create mode 100644 group17/785396327/4.5/constant/NameAndTypeInfo.java create mode 100644 group17/785396327/4.5/constant/NullConstantInfo.java create mode 100644 group17/785396327/4.5/constant/StringInfo.java create mode 100644 group17/785396327/4.5/constant/UTF8Info.java create mode 100644 group17/785396327/4.5/test/ClassFileloaderTest.java create mode 100644 group17/785396327/4.5/util/Util.java diff --git a/group17/785396327/3.26/jvm_1/ClassFileLoader.java b/group17/785396327/3.26/jvm_1/ClassFileLoader.java index 95f68a5a7f..9a937ba631 100644 --- a/group17/785396327/3.26/jvm_1/ClassFileLoader.java +++ b/group17/785396327/3.26/jvm_1/ClassFileLoader.java @@ -12,7 +12,7 @@ public class ClassFileLoader { public byte[] readBinaryCode(String className) { InputStream fis = null; - String filePath = clzPaths.get(0) + "\\\\" + className.replaceAll("\\.", "\\\\") + ".class"; + String filePath = clzPaths.get(0) + File.pathSeparator + className.replaceAll("\\.", File.pathSeparator) + ".class"; byte[] buffer = new byte[(int) new File(filePath).length()]; try { if (clzPaths.size() > 0 && className != null && !className.trim().equals("")) { diff --git a/group17/785396327/4.5/clz/AccessFlag.java b/group17/785396327/4.5/clz/AccessFlag.java new file mode 100644 index 0000000000..bbdf7c8818 --- /dev/null +++ b/group17/785396327/4.5/clz/AccessFlag.java @@ -0,0 +1,28 @@ +package clz; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } + +} diff --git a/group17/785396327/4.5/clz/ClassFile.java b/group17/785396327/4.5/clz/ClassFile.java new file mode 100644 index 0000000000..d4a8b8ed0c --- /dev/null +++ b/group17/785396327/4.5/clz/ClassFile.java @@ -0,0 +1,89 @@ +package clz; + +import constant.ClassInfo; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/10. + */ +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; +// private List fields = new ArrayList(); +// private List methods = new ArrayList(); + + 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 addField(Field f){ +// this.fields.add(f); +// } +// public List getFields(){ +// return this.fields; +// } +// public void addMethod(Method m){ +// this.methods.add(m); +// } +// public List getMethods() { +// return methods; +// } + + + 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/group17/785396327/4.5/clz/ClassIndex.java b/group17/785396327/4.5/clz/ClassIndex.java new file mode 100644 index 0000000000..d0eb281a09 --- /dev/null +++ b/group17/785396327/4.5/clz/ClassIndex.java @@ -0,0 +1,25 @@ +package clz; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } +} diff --git a/group17/785396327/4.5/constant/ClassInfo.java b/group17/785396327/4.5/constant/ClassInfo.java new file mode 100644 index 0000000000..1143ac1faa --- /dev/null +++ b/group17/785396327/4.5/constant/ClassInfo.java @@ -0,0 +1,27 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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/group17/785396327/4.5/constant/ConstantInfo.java b/group17/785396327/4.5/constant/ConstantInfo.java new file mode 100644 index 0000000000..8e6eaf72cf --- /dev/null +++ b/group17/785396327/4.5/constant/ConstantInfo.java @@ -0,0 +1,31 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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/group17/785396327/4.5/constant/ConstantPool.java b/group17/785396327/4.5/constant/ConstantPool.java new file mode 100644 index 0000000000..b7b29bf115 --- /dev/null +++ b/group17/785396327/4.5/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package constant; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by IBM on 2017/4/10. + */ +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/group17/785396327/4.5/constant/FieldRefInfo.java b/group17/785396327/4.5/constant/FieldRefInfo.java new file mode 100644 index 0000000000..1e86db4134 --- /dev/null +++ b/group17/785396327/4.5/constant/FieldRefInfo.java @@ -0,0 +1,57 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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/group17/785396327/4.5/constant/MethodRefInfo.java b/group17/785396327/4.5/constant/MethodRefInfo.java new file mode 100644 index 0000000000..a3df142200 --- /dev/null +++ b/group17/785396327/4.5/constant/MethodRefInfo.java @@ -0,0 +1,48 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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.getNameAndTypeIndex() ; + } + 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(); + } +} diff --git a/group17/785396327/4.5/constant/NameAndTypeInfo.java b/group17/785396327/4.5/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..f59efe07c0 --- /dev/null +++ b/group17/785396327/4.5/constant/NameAndTypeInfo.java @@ -0,0 +1,48 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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/group17/785396327/4.5/constant/NullConstantInfo.java b/group17/785396327/4.5/constant/NullConstantInfo.java new file mode 100644 index 0000000000..c6bc0c17e5 --- /dev/null +++ b/group17/785396327/4.5/constant/NullConstantInfo.java @@ -0,0 +1,14 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +public class NullConstantInfo extends ConstantInfo { + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } +} diff --git a/group17/785396327/4.5/constant/StringInfo.java b/group17/785396327/4.5/constant/StringInfo.java new file mode 100644 index 0000000000..595eed7f47 --- /dev/null +++ b/group17/785396327/4.5/constant/StringInfo.java @@ -0,0 +1,29 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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/group17/785396327/4.5/constant/UTF8Info.java b/group17/785396327/4.5/constant/UTF8Info.java new file mode 100644 index 0000000000..12b8395559 --- /dev/null +++ b/group17/785396327/4.5/constant/UTF8Info.java @@ -0,0 +1,33 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..7c32811a45 --- /dev/null +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -0,0 +1,265 @@ +package test; + +import clz.ClassFile; +import constant.*; +import jvm_1.ClassFileLoader; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.lang.reflect.Method; + +/** + * Created by IBM on 2017/4/10. + */ +public class ClassFileloaderTest { + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + +// clzFile = loader.loadClass(className); + clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + +// List fields = clzFile.getFields(); +// Assert.assertEquals(2, fields.size()); +// { +// Field f = fields.get(0); +// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); +// } +// { +// Field f = fields.get(1); +// Assert.assertEquals("age:I", f.toString()); +// } + } + @Test + public void testMethods(){ + +// List methods = clzFile.getMethods(); +// ConstantPool pool = clzFile.getConstantPool(); +// +// { +// Method m = methods.get(0); +// assertMethodEquals(pool,m, +// "", +// "(Ljava/lang/String;I)V", +// "2ab7000c2a2bb5000f2a1cb50011b1"); +// +// } +// { +// Method m = methods.get(1); +// assertMethodEquals(pool,m, +// "setName", +// "(Ljava/lang/String;)V", +// "2a2bb5000fb1"); +// +// } +// { +// Method m = methods.get(2); +// assertMethodEquals(pool,m, +// "setAge", +// "(I)V", +// "2a1bb50011b1"); +// } +// { +// Method m = methods.get(3); +// assertMethodEquals(pool,m, +// "sayHello", +// "()V", +// "b2001c1222b60024b1"); +// +// } +// { +// Method m = methods.get(4); +// assertMethodEquals(pool,m, +// "main", +// "([Ljava/lang/String;)V", +// "bb000159122b101db7002d4c2bb6002fb1"); +// } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ +// String methodName = pool.getUTF8String(m.getNameIndex()); +// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); +// String code = m.getCodeAttr().getCode(); +// Assert.assertEquals(expectedName, methodName); +// Assert.assertEquals(expectedDesc, methodDesc); +// Assert.assertEquals(expectedCode, code); + } + +} diff --git a/group17/785396327/4.5/util/Util.java b/group17/785396327/4.5/util/Util.java new file mode 100644 index 0000000000..9bcb3c4e10 --- /dev/null +++ b/group17/785396327/4.5/util/Util.java @@ -0,0 +1,27 @@ +package util; + +/** + * Created by IBM on 2017/4/10. + */ +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 Date: Mon, 10 Apr 2017 23:53:14 +0800 Subject: [PATCH 104/552] test04 test05 --- group17/1158154002/.classpath | 2 + .../src/test04/loader/ClassFileLoader.java | 61 ++++++++++ .../test04/loader/ClassFileloaderTest.java | 84 +++++++++++++ .../src/test04/loader/EmployeeV1.java | 28 +++++ .../src/test04/lru/LRUPageFrame.java | 112 +++++++++++++++++ .../src/test04/lru/LRUPageFrameTest.java | 29 +++++ .../1158154002/src/test05/stack/Stack.java | 43 +++++++ .../src/test05/stack/StackTest.java | 52 ++++++++ .../src/test05/stack/StackUtil.java | 113 ++++++++++++++++++ 9 files changed, 524 insertions(+) create mode 100644 group17/1158154002/src/test04/loader/ClassFileLoader.java create mode 100644 group17/1158154002/src/test04/loader/ClassFileloaderTest.java create mode 100644 group17/1158154002/src/test04/loader/EmployeeV1.java create mode 100644 group17/1158154002/src/test04/lru/LRUPageFrame.java create mode 100644 group17/1158154002/src/test04/lru/LRUPageFrameTest.java create mode 100644 group17/1158154002/src/test05/stack/Stack.java create mode 100644 group17/1158154002/src/test05/stack/StackTest.java create mode 100644 group17/1158154002/src/test05/stack/StackUtil.java diff --git a/group17/1158154002/.classpath b/group17/1158154002/.classpath index 2d7497573f..44f39c3ace 100644 --- a/group17/1158154002/.classpath +++ b/group17/1158154002/.classpath @@ -3,5 +3,7 @@ + +
diff --git a/group17/1158154002/src/test04/loader/ClassFileLoader.java b/group17/1158154002/src/test04/loader/ClassFileLoader.java new file mode 100644 index 0000000000..0f144fbb43 --- /dev/null +++ b/group17/1158154002/src/test04/loader/ClassFileLoader.java @@ -0,0 +1,61 @@ +package test04.loader; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + + +public class ClassFileLoader { + private List clzPaths = new ArrayList(); + + + public byte[] readBinaryCode(String className) { + className=className.replace(".", File.separator)+".class"; + for (String path : clzPaths) { + String clzFileName=path+File.separator+className; + byte[] codes=loadClassFile(clzFileName); + if (codes!=null) { + return codes; + } + } + return null; + + + } + + private byte[] loadClassFile(String clzFileName) { + File file=new File(clzFileName); + try { + return IOUtils.toByteArray(new FileInputStream(file)); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + + } + + + + public void addClassPath(String path) { + if (this.clzPaths.contains(path)) { + return; + } + this.clzPaths.add(path); + } + + public String getClassPath_V1(){ + + return null; + } + + public String getClassPath(){ + return StringUtils.join(this.clzPaths,";"); + } +} diff --git a/group17/1158154002/src/test04/loader/ClassFileloaderTest.java b/group17/1158154002/src/test04/loader/ClassFileloaderTest.java new file mode 100644 index 0000000000..8897e72c91 --- /dev/null +++ b/group17/1158154002/src/test04/loader/ClassFileloaderTest.java @@ -0,0 +1,84 @@ +package test04.loader; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ClassFileloaderTest { + + static String path1 = "D:/mygit/coding2017/group17/1158154002/bin/"; + static String path2 = "file:/"; + + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + System.out.println(clzPath); + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "test04.loader.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1036, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "test04.loader.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + return elementData.remove(size()-1); + } + + public Object peek(){ + if (size()>0) { + return elementData.get(size()-1); + } else { + return null; + } + + } + + public boolean isEmpty(){ + return elementData.size()==0; + } + + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + StringBuffer sb=new StringBuffer(); + while (peek()!=null) { + sb.append(pop()).append(","); + } + + return sb.substring(0, sb.length()-1); + } + +} diff --git a/group17/1158154002/src/test05/stack/StackTest.java b/group17/1158154002/src/test05/stack/StackTest.java new file mode 100644 index 0000000000..b311650fff --- /dev/null +++ b/group17/1158154002/src/test05/stack/StackTest.java @@ -0,0 +1,52 @@ +package test05.stack; + +import java.util.Arrays; + +import org.junit.Test; + +public class StackTest { + @Test + public void testReverse(){ + Stack stack=new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + + StackUtil.reverse(stack); + System.out.println(stack.toString()); + } + + @Test + public void testRemove(){ + Stack stack=new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + + StackUtil.remove(stack,3); + System.out.println(stack.toString()); + } + //isValidPairs + @Test + public void testGetTop(){ + Stack stack=new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + + System.out.println(Arrays.toString(StackUtil.getTop(stack,6))); + System.out.println(stack.toString()); + } + + @Test + public void testIsValidPairs(){ + System.out.println(StackUtil.isValidPairs("([e{d}f])")); + System.out.println(StackUtil.isValidPairs("([b{x]y})")); + } +} diff --git a/group17/1158154002/src/test05/stack/StackUtil.java b/group17/1158154002/src/test05/stack/StackUtil.java new file mode 100644 index 0000000000..b999c82706 --- /dev/null +++ b/group17/1158154002/src/test05/stack/StackUtil.java @@ -0,0 +1,113 @@ +package test05.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 temp=new Stack(); + while (s.peek()!=null) { + temp.push(s.pop()); + } + Stack temp2=new Stack(); + while (temp.peek()!=null) { + temp2.push(temp.pop()); + } + while (temp2.peek()!=null) { + s.push(temp2.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + Stack temp=new Stack(); + while (s.peek()!=null) { + Object obj=s.pop(); + if (!obj.equals(o)) { + temp.push(obj); + } + } + while (temp.peek()!=null) { + s.push(temp.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + * @throws Exception + */ + public static Object[] getTop(Stack s,int len) { + if (len<=s.size()) { + Stack temp=new Stack(); + Object[] result=new Object[len]; + for (int i = 0; i < s.size(); i++) { + Object o=s.pop(); + temp.push(o); + if (i= 0; i--) { + char c = s.charAt(i); + if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { + s2.push(c); + } + } + + for (int i = 0; i < s1.size() / 2; i++) { + char a = (char) s1.pop(); + char b = (char) s2.pop(); + if (a == '(' && b != ')') { + return false; + } else if (a == ')' && b != '(') { + return false; + } else if (a == '[' && b != ']') { + return false; + } else if (a == ']' && b != '[') { + return false; + } else if (a == '{' && b != '}') { + return false; + } else if (a == '}' && b != '{') { + return false; + } + } + + return true; + } + + +} From 2f81c812351ec13557105399e6b4bc69e1d0f843 Mon Sep 17 00:00:00 2001 From: liuxianan// <1264835468@qq.com> Date: Tue, 11 Apr 2017 10:49:29 +0800 Subject: [PATCH 105/552] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9null?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/1264835468/src/assignment0405/StackUtil.java | 5 ++++- group17/1264835468/src/assignment0405/StackUtilTest.java | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/group17/1264835468/src/assignment0405/StackUtil.java b/group17/1264835468/src/assignment0405/StackUtil.java index 7e5c717b4d..dcaf1992dd 100644 --- a/group17/1264835468/src/assignment0405/StackUtil.java +++ b/group17/1264835468/src/assignment0405/StackUtil.java @@ -2,6 +2,8 @@ import assignment.Stack; +import java.util.Objects; + /** * Created by Administrator on 2017/4/6. */ @@ -35,7 +37,8 @@ public static void remove(Stack s, Object o) { Stack stack2 = new Stack(); while (!s.isEmpty()) { Object top = s.pop(); - if (!top.equals(o)) { + //Objects.equals(null, null) == true + if (!Objects.equals(top, o)) { stack2.push(top); } } diff --git a/group17/1264835468/src/assignment0405/StackUtilTest.java b/group17/1264835468/src/assignment0405/StackUtilTest.java index 58be1302f6..d36a17c29d 100644 --- a/group17/1264835468/src/assignment0405/StackUtilTest.java +++ b/group17/1264835468/src/assignment0405/StackUtilTest.java @@ -17,6 +17,7 @@ public void reverse() throws Exception { Assert.assertEquals("1, 2, 3, 4", stack.toString()); StackUtil.reverse(stack); Assert.assertEquals("4, 3, 2, 1", stack.toString()); + } @@ -30,6 +31,11 @@ public void remove() throws Exception { Assert.assertEquals("5, 6, 5, 4, 3, 2, 0", stack.toString()); StackUtil.remove(stack, 5); Assert.assertEquals("6, 4, 3, 2, 0", stack.toString()); + pushAll(stack, null, 7, null); + Assert.assertEquals("null, 7, null, 6, 4, 3, 2, 0", stack.toString()); + StackUtil.remove(stack, null); + Assert.assertEquals("7, 6, 4, 3, 2, 0", stack.toString()); + } From 34244e2c2a6b54efc7ce547793d1b3cac8cfe87a Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Tue, 11 Apr 2017 10:49:31 +0800 Subject: [PATCH 106/552] =?UTF-8?q?week5=5Fjvm2=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/jvm/clz/AccessFlag.java | 25 +++ .../src/com/coderising/jvm/clz/ClassFile.java | 75 +++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 24 +++ .../coderising/jvm/constant/ConstantInfo.java | 29 +++ .../coderising/jvm/constant/ConstantPool.java | 29 +++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++ .../jvm/constant/MethodRefInfo.java | 55 +++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 +++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++ .../jvm/loader/ByteCodeIterator.java | 54 +++++ .../jvm/loader/ClassFileLoader.java | 140 ++++++++++++ .../jvm/loader/ClassFileParser.java | 112 ++++++++++ .../jvm/test/ClassFileloaderTest.java | 202 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 +++ .../src/com/coderising/jvm/util/Util.java | 24 +++ 18 files changed, 986 insertions(+) create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..650ca8375d --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..577e41536b --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + private byte[] codes; + private int pos; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + this.pos = 0; + } + + public byte[] getCodes(int length) { + if (this.pos + length >= this.codes.length) { + throw new IndexOutOfBoundsException(); + } + + byte[] buffer = new byte[length]; + for (int i = 0; i < length; i++) { + buffer[i] = this.codes[pos++]; + } + return buffer; + } + + public int nextU1ToInt() { + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[]{codes[pos++], codes[pos++]}); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextUxToHexString(int len) { + byte[] buffer = new byte[len]; + for (int i = 0; i < len; i++) { + buffer[i] = this.codes[pos++]; + } + return Util.byteToHexString(buffer); + } + + public void back(int i) { + this.pos -= i; + + } +} diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..be4e12c7de --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 Date: Tue, 11 Apr 2017 10:51:29 +0800 Subject: [PATCH 107/552] =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/article/20170402-20170409.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group17/article/20170402-20170409.md b/group17/article/20170402-20170409.md index 3d45ad0516..931f26886d 100644 --- a/group17/article/20170402-20170409.md +++ b/group17/article/20170402-20170409.md @@ -26,7 +26,7 @@ 296910598 -1264835468 +1264835468 http://www.jianshu.com/p/686572a97fb3 516886559 From 10c1cc1ed0ffc01f589a4727795b7020a0c1debb Mon Sep 17 00:00:00 2001 From: Ren650119726 <102228177@qq.com> Date: Tue, 11 Apr 2017 13:55:07 +0800 Subject: [PATCH 108/552] =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/article/20170402-20170409.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group17/article/20170402-20170409.md b/group17/article/20170402-20170409.md index 3d45ad0516..adee3992f0 100644 --- a/group17/article/20170402-20170409.md +++ b/group17/article/20170402-20170409.md @@ -12,7 +12,7 @@ 1204187480 -102228177 +102228177 http://note.youdao.com/noteshare?id=4be7978218219daddfb0bb85182be12e 876385982 From e01a26e4da32b9e564036450a98a1da98d5e0bda Mon Sep 17 00:00:00 2001 From: 10094714 Date: Tue, 11 Apr 2017 14:46:55 +0800 Subject: [PATCH 109/552] StackUtil practise --- .../learning/java/stack/StackUtil.java | 12 ++- .../learning/java/stack/StackUtilTest.java | 76 +++++++++++++++++++ 2 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 group06/263050006/src/test/java/com/github/chaoswang/learning/java/stack/StackUtilTest.java diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java index d5d7ecc223..986d434531 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java @@ -1,21 +1,27 @@ package com.github.chaoswang.learning.java.stack; +import java.util.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) { + public static void reverse(Stack s) { } + + public static void addToBottom(Stack s, Integer value){ + + } + /** * ɾջеijԪ ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ * * @param o */ - public static void remove(Stack s, Object o) { + public static void remove(Stack s, Object o) { } @@ -26,7 +32,7 @@ public static void remove(Stack s, Object o) { * @param len * @return */ - public static Object[] getTop(Stack s, int len) { + public static Object[] getTop(Stack s, int len) { return null; } diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/stack/StackUtilTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/stack/StackUtilTest.java new file mode 100644 index 0000000000..cce5434964 --- /dev/null +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/stack/StackUtilTest.java @@ -0,0 +1,76 @@ +package com.github.chaoswang.learning.java.stack; + +import java.util.Stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddToBottom() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} From 9ef2ca0f0ad2e7358c5b906b1298c4d12cf2912e Mon Sep 17 00:00:00 2001 From: orajavac Date: Tue, 11 Apr 2017 15:28:57 +0800 Subject: [PATCH 110/552] =?UTF-8?q?20170411=5F1528=20=E8=BF=90=E7=AE=97?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/linklist/LRUPageFrame.java | 56 ++++++++++- .../coding2017/basic/stack/Stack.java | 19 +++- .../basic/stack/expr/InfixExpr.java | 95 +++++++++++++++++++ .../basic/stack/expr/InfixExprTest.java | 55 +++++++++++ .../orajavac/coding2017/jvm/util/Util.java | 21 ++++ 5 files changed, 244 insertions(+), 2 deletions(-) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExpr.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java index 56b94881b4..482157d08c 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java @@ -18,12 +18,19 @@ private static class Node { private Node first;// 链表头 private Node last;// 链表尾 - + + public LRUPageFrame(){ + init(); + } public LRUPageFrame(int capacity) { this.capacity = capacity; + init(); + } + + public void init(){ first = new Node(); last = new Node(); last.flag = "last"; //用来标识最后一个节点是链表尾,在这里链表尾并不算做内存页 @@ -112,6 +119,21 @@ public void addFirst(Object pageNum){ length++; } + public void add(Object pageNum){ + Node node = first.next; + while (node.next!=null){ + node = node.next; + } + Node e = new Node(); + e.pageNum = pageNum; + Node prev = node.prev; + prev.next = e; + e.prev = prev; + e.next = node; + node.prev = e; + length++; + } + public String toString(){ StringBuilder buffer = new StringBuilder(); Node node = first; @@ -188,4 +210,36 @@ public void remove(Object obj,Object o){ nodef = nodef.next; } } + + /** + * Stack 使用 + * @return + */ + public int getLength(){ + return length; + } + + /** + * Stack 使用 pop + * @return + */ + public Object remove(){ + length--; + Node n = last.prev; + last.prev = n.prev; + n.prev.next = last; + return n.pageNum; + } + + /** + * Stack 使用 pop + * @return + */ + public Object removeLow(){ + length--; + Node n = first.next; + first.next = n.next; + n.next.prev = first; + return n.pageNum; + } } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java index 1b8e4153b7..499b4a33e4 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java @@ -10,8 +10,21 @@ public Stack(int capacity){ l = new LRUPageFrame(capacity); } + public Stack(){ + l = new LRUPageFrame(); + } + public void push(Object o){ - l.addFirst(o); + //l.addFirst(o); + l.add(o); + } + + public Object pop(){ + return l.remove(); + } + + public Object popLow(){ + return l.removeLow(); } public String toString(){ @@ -29,4 +42,8 @@ public void remove(Object obj){ public Object getFirstNode(){ return l.getFirstNode(); } + + public int length(){ + return l.getLength(); + } } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExpr.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..a6b4e86a38 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExpr.java @@ -0,0 +1,95 @@ +package com.github.orajavac.coding2017.basic.stack.expr; + +import java.util.HashMap; +import java.util.Map; +import com.github.orajavac.coding2017.basic.stack.Stack; +import com.github.orajavac.coding2017.jvm.util.Util; + +public class InfixExpr { + + String expr = null; + + private final String ADD = "+"; + + private final String SUB = "-"; + + private final String MUL = "*"; + + private final String DIV = "/"; + + private Map operator = new HashMap(); + + private Stack oper = new Stack(); + + private Stack num = new Stack(); + + public InfixExpr(String expr) { + this.expr = expr; + this.operator.put(this.ADD,1); + this.operator.put(this.SUB,1); + this.operator.put(this.MUL,2); + this.operator.put(this.DIV,2); + } + + public float evaluate() { + Object[] obj = Util.parseOperNumToArray(this.expr); + String key = null; + for (int i=0;i level2){ //2+3*4+5 栈顶运算符大于即将入压运算符 + operation(op,num.pop(),num.pop()); + }else if (level1 == level2){ //3-20+2 栈顶运算符等于即将入压运算符 + operation(op,num.pop(),num.pop()); + }else{ + oper.push(op); //把刚刚弹出,再压入栈 + oper.push(key); + } + } + if (oper.length() == 0){ + oper.push(key); + } + } + + public void operation(Object oper,Object num1,Object num2){ + Integer result = null; + if(oper.equals("*")){ + result = Integer.parseInt(num1.toString()) * Integer.parseInt(num2.toString()); + num.push(result); + } + if(oper.equals("/")){ + result = Integer.parseInt(num2.toString()) / Integer.parseInt(num1.toString()); + num.push(result); + } + if(oper.equals("+")){ + result = Integer.parseInt(num1.toString()) + Integer.parseInt(num2.toString()); + num.push(result); + } + if(oper.equals("-")){ + result = Integer.parseInt(num2.toString()) - Integer.parseInt(num1.toString()); + num.push(result); + } + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..733f48c7bb --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,55 @@ +package com.github.orajavac.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2+6"); + Assert.assertEquals(106.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3-4*5+2"); + Assert.assertEquals(-15, expr.evaluate(), 0.001f); + } + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java index 59fd55ae15..52a84fb7a8 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java @@ -1,5 +1,11 @@ package com.github.orajavac.coding2017.jvm.util; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class Util { public static int byteToInt(byte[] codes){ String s1 = byteToHexString(codes); @@ -21,4 +27,19 @@ public static String byteToHexString(byte[] codes ){ } return buffer.toString(); } + + public static Object[] parseOperNumToArray(String str){ + String regEx = "\\d+|(\\*)|(\\+)|(-)|(/)"; + Pattern pat = Pattern.compile(regEx); + Matcher mat = pat.matcher(str); + List l = new ArrayList(); + while(mat.find()){ + l.add(mat.group()); + } + /*Object[] obj = l.toArray(); + for (int i=0;i Date: Tue, 11 Apr 2017 16:26:11 +0800 Subject: [PATCH 111/552] =?UTF-8?q?StackUtil.reverse=E9=80=92=E5=BD=92?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/stack/StackUtil.java | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/group04/1299310140/src/com/coding/basic/stack/StackUtil.java b/group04/1299310140/src/com/coding/basic/stack/StackUtil.java index d4809b98bc..1dd70e80f4 100644 --- a/group04/1299310140/src/com/coding/basic/stack/StackUtil.java +++ b/group04/1299310140/src/com/coding/basic/stack/StackUtil.java @@ -6,26 +6,52 @@ 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) { - if(s == null){ + public static void reverse(Stack s) {//s:[1,2,3,4,5] + if(s == null || s.isEmpty()){ return; } Stack reverseOne = new Stack(); while(!s.isEmpty()){ reverseOne.push(s.pop()); - } + }//s:[] reverseOne:[5,4,3,2,1] Stack reverseTwo = new Stack(); while(!reverseOne.isEmpty()){ reverseTwo.push(reverseOne.pop()); - } + }//s:[] reverseOne:[] reverseTwo:[1,2,3,4,5] while(!reverseTwo.isEmpty()){ s.push(reverseTwo.pop()); - } + }//s:[5,4,3,2,1] reverseOne:[] reverseTwo:[] } + + //递归实现 + public static void reverse_V1(Stack s){ + if(s == null || s.isEmpty()){ + return; + } + + Object top = s.pop(); + if(!s.isEmpty()){ + StackUtil.reverse_V1(s); + + Stack temp = new Stack(); + while(!s.isEmpty()){ + temp.push(s.pop()); + } + + s.push(top); + + while(!temp.isEmpty()){ + s.push(temp.pop()); + } + + }else{ + s.push(top); + } + } /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 @@ -33,7 +59,7 @@ public static void reverse(Stack s) { * @param o */ public static void remove(Stack s,Object o) { - if(s == null){ + if(s == null || s.isEmpty()){ return; } @@ -58,8 +84,8 @@ public static void remove(Stack s,Object o) { * @param len * @return */ - public static Object[] getTop(Stack s,int len) {//len>s的size,null填充 - if(s == null || len <= 0){ + public static Object[] getTop(Stack s,int len) {//若len>s的size,则Object[size]~Object[len-1]为null + if(s == null || s.isEmpty() || len <= 0){ return null; } @@ -79,7 +105,7 @@ public static Object[] getTop(Stack s,int len) {//len>s的size,null填充 } /** - * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,y,z * 使用堆栈检查字符串s中的括号是不是成对出现的。 * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; @@ -87,17 +113,17 @@ public static Object[] getTop(Stack s,int len) {//len>s的size,null填充 * @return */ public static boolean isValidPairs(String s){ - if(s == null){ + if(s == null || s.length() == 0 || s.length() == 1){ return true; } char[] sc = s.toCharArray(); - Stack scStack = new Stack(); + Stack scStack = new Stack();//用该栈保存参数字符串的字符数组 for(int i = 0;i < sc.length;i++){ scStack.push(sc[i]); } - Stack temp = new Stack(); + Stack temp = new Stack();//保存')' ']' '}' while(!scStack.isEmpty()){ char scStackTop = (char)scStack.pop(); if(scStackTop == ')' || scStackTop == ']' || scStackTop == '}'){ @@ -110,6 +136,7 @@ public static boolean isValidPairs(String s){ return false; } char tempTop = (char)temp.pop(); + //scStackTop:'('or'['or'{' tempTop:')'or']'or'}' if((scStackTop + 1 == tempTop) || (scStackTop + 2 == tempTop)){ continue; }else{ From 9ee3c363b4866cf63048b8447052c9e92cd4167a Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Tue, 11 Apr 2017 16:35:53 +0800 Subject: [PATCH 112/552] =?UTF-8?q?=E5=8A=A0=E4=BA=86=E4=BA=9B=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/basic/stack/expr/InfixExpr.java | 174 +++++++++++++++++- 1 file changed, 170 insertions(+), 4 deletions(-) diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java index cc084db36d..4406d7d304 100644 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java @@ -1,15 +1,181 @@ package com.coding.basic.stack.expr; -public class InfixExpr { - String expr = null; +import java.util.ArrayList; + +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.StackUtil; +public class InfixExpr { + private String expr = null; + public InfixExpr(String expr) { this.expr = expr; } - + /** + * 对expr进行解析计算 + * @return + */ public float evaluate() { + float f = 0.0f; + //如果不为空继续解析 + if (expr != null || expr.length() > 0) { + //如果符号不对称,抛出异常 + if (!StackUtil.isValidPairs(expr)) { + try { + throw new Exception("格式不正确,解析表达式失败!"); + } catch (Exception e) { + e.printStackTrace(); + } + }; + //将字符串转化为集合 + ArrayList list=getStringList(expr); + //根据获得的集合转化为后序表达式集合 + ArrayList postOrder = getPostOrder(list); + Stack stack = new Stack(); + for (int i = 0; i < postOrder.size(); i++) { + //如果为数字,则压入栈 + if(Character.isDigit(postOrder.get(i).charAt(0))){ + stack.push(Float.parseFloat(postOrder.get(i))); + }else{ + //否则,取出栈顶两个元素进行计算. + Float back = (Float)stack.pop(); + Float front = (Float)stack.pop(); + Float res = 0.0f; + switch (postOrder.get(i).charAt(0)) { + case '+': + res = front + back; + break; + case '-': + res = front - back; + break; + case '*': + res = front * back; + break; + case '/': + res = front / back; + break; + } + //将结果再压回栈中 + stack.push(res); + } + } + //最终计算结果出栈; + f = (Float)stack.pop(); - return 0.0f; + } else { + //为空抛出异常 + try { + throw new Exception("表达式内容为空,解析失败!"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return f; + } + /** + * 将字符串转换为集合方法 + * @param str + * @return + */ + private ArrayList getStringList(String str) { + ArrayList result = new ArrayList(); + String num = ""; + for (int i = 0; i < str.length(); i++) { + //如果为数字,叠加到num字符串中 + if (Character.isDigit(str.charAt(i))) { + num = num + str.charAt(i); + } else { + //如果num不为空,表示数字字符凑够了,加到集合里 + if (num != "") { + result.add(num); + } + //然后再把非数字字符也加到集合中,清空num字符串 + result.add(str.charAt(i) + ""); + num = ""; + } + } + //最后判断下,num中还有值没,有的话加到集合里 + if (num != "") { + result.add(num); + } + //返回结果 + return result; } + + /** + * 中序表达式转后序表达式 + * @param list + * @return + */ + private ArrayList getPostOrder(ArrayList list) { + ArrayList result = new ArrayList(); + Stack stack = new Stack(); + for (int i = 0; i < list.size(); i++) { + //如果为数字,加到集合里 + if (Character.isDigit(list.get(i).charAt(0))) { + result.add(list.get(i)); + } else { + switch (list.get(i).charAt(0)) { + //如果有左括号,先压入操作符栈中 + case '(': + stack.push(list.get(i)); + break; + //ok,等到右括号了 + case ')': + //先看看操作符栈顶是不是左括号头头 + while (!stack.peek().equals("(")) { + //不是左括号头头,就把操作符栈中的操作符弹出来一个,加到集合里,一直弹到见到左括号为止 + result.add((String) stack.pop()); + } + //最后把左括号也弹出来,这样就只有加减乘除没有括号了 + stack.pop(); + break; + default: + //这里全是处理加减乘除的操作 + //如果操作符栈不为空,比较下当前操作符和操作符栈顶的操作符优先级大小 + while (!stack.isEmpty() && compare((String) stack.peek(), list.get(i))) { + //如果栈顶操作符优先级大于当前,则栈中的操作符弹出加到集合里 + result.add((String) stack.pop()); + } + //否则继续压到栈中,或者之前栈中元素已经弹出,再将优先级小的操作符加到操作符栈中. + stack.push(list.get(i)); + break; + } + } + } + while (!stack.isEmpty()) { + //最后看下操作符栈还有操作符没,有了加到集合末尾 + result.add((String) stack.pop()); + } + return result; + } + /** + * 操作符优先级比较算法 + * @param peek + * @param cur + * @return + */ + public static boolean compare(String peek, String cur) { + //乘除优先级大于加减 + //如果操作符栈顶操作符的优先级大于当前操作符的优先级,则返回true + if ("*".equals(peek) && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-".equals(cur))) { + return true; + } else if ("/".equals(peek) && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-".equals(cur))) { + return true; + } else if ("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))) { + return true; + } else if ("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))) { + return true; + } + //如果当前操作符的优先级大于栈顶的操作符优先级,返回false + return false; + } + + public static void main(String[] args) { + InfixExpr expr = new InfixExpr("3*20+13*5-40/2"); + float f = expr.evaluate(); + System.out.println(f); + } } From e19041e745b9ad715abfd321d8a35478b49310b6 Mon Sep 17 00:00:00 2001 From: chaoswang Date: Tue, 11 Apr 2017 22:37:38 +0800 Subject: [PATCH 113/552] =?UTF-8?q?jvm=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/downloader/impl/ConnectionImpl.java | 3 +- .../learning/java/jvm/ClassFileLoader.java | 24 ---- .../learning/java/jvm/clz/AccessFlag.java | 26 ++++ .../learning/java/jvm/clz/ClassFile.java | 76 +++++++++++ .../learning/java/jvm/clz/ClassIndex.java | 22 ++++ .../learning/java/jvm/constant/ClassInfo.java | 28 ++++ .../java/jvm/constant/ConstantInfo.java | 32 +++++ .../java/jvm/constant/ConstantPool.java | 31 +++++ .../java/jvm/constant/FieldRefInfo.java | 54 ++++++++ .../java/jvm/constant/MethodRefInfo.java | 57 +++++++++ .../java/jvm/constant/NameAndTypeInfo.java | 48 +++++++ .../java/jvm/constant/NullConstantInfo.java | 13 ++ .../java/jvm/constant/StringInfo.java | 27 ++++ .../learning/java/jvm/constant/UTF8Info.java | 37 ++++++ .../java/jvm/loader/ByteCodeIterator.java | 5 + .../java/jvm/loader/ClassFileLoader.java | 116 +++++++++++++++++ .../java/jvm/loader/ClassFileParser.java | 31 +++++ .../learning/java/jvm/util/Util.java | 22 ++++ .../java/jvm/ClassFileloaderTest.java | 120 +++++++++++++++++- 19 files changed, 743 insertions(+), 29 deletions(-) delete mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/ClassFileLoader.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/AccessFlag.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassIndex.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ClassInfo.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ConstantInfo.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ConstantPool.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/FieldRefInfo.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/MethodRefInfo.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NameAndTypeInfo.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NullConstantInfo.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/StringInfo.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/UTF8Info.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ByteCodeIterator.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileLoader.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileParser.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/util/Util.java diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/downloader/impl/ConnectionImpl.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/downloader/impl/ConnectionImpl.java index d3cd269ee1..ee9cd68c56 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/downloader/impl/ConnectionImpl.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/downloader/impl/ConnectionImpl.java @@ -40,7 +40,8 @@ public byte[] read(int startPos, int endPos) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); int len = 0; int hasRead = 0; - while((len < currentSectionLength) && ((hasRead = is.read(buffer)) != -1)) { + while((len < currentSectionLength) && ((hasRead = is.read(buffer)) != -1)) { + System.out.println(buffer.length); bos.write(buffer, 0, hasRead); len += hasRead; } diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/ClassFileLoader.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/ClassFileLoader.java deleted file mode 100644 index 1b0b8f1514..0000000000 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/ClassFileLoader.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.chaoswang.learning.java.jvm; - -import java.util.ArrayList; -import java.util.List; - -public class ClassFileLoader { - - private List clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - - return null; - - } - - public void addClassPath(String path) { - - } - - public String getClassPath() { - return null; - } - -} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/AccessFlag.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..02c11cc5d7 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/AccessFlag.java @@ -0,0 +1,26 @@ +package com.github.chaoswang.learning.java.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; + } + +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..26b2d02b67 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java @@ -0,0 +1,76 @@ +package com.github.chaoswang.learning.java.jvm.clz; + +import com.github.chaoswang.learning.java.jvm.constant.ClassInfo; +import com.github.chaoswang.learning.java.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(); + } +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassIndex.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..572db1f6d8 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassIndex.java @@ -0,0 +1,22 @@ +package com.github.chaoswang.learning.java.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; + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ClassInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..2bbf8a79a7 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.github.chaoswang.learning.java.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/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ConstantInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..1884cae795 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ConstantInfo.java @@ -0,0 +1,32 @@ +package com.github.chaoswang.learning.java.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); + } + +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ConstantPool.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..033b2de3da --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.github.chaoswang.learning.java.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; + } +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/FieldRefInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..48c4ee8eeb --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.github.chaoswang.learning.java.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/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/MethodRefInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..2b2cbeabbc --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/MethodRefInfo.java @@ -0,0 +1,57 @@ +package com.github.chaoswang.learning.java.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/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NameAndTypeInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..f557cc7ded --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,48 @@ +package com.github.chaoswang.learning.java.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() + ")"; + } +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NullConstantInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..c1cca00185 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.github.chaoswang.learning.java.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/StringInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..c4a198f8d5 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/StringInfo.java @@ -0,0 +1,27 @@ +package com.github.chaoswang.learning.java.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); + } + +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/UTF8Info.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..07243b928d --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.github.chaoswang.learning.java.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; + } + +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ByteCodeIterator.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..5d75712596 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,5 @@ +package com.github.chaoswang.learning.java.jvm.loader; + +public class ByteCodeIterator { + +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileLoader.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..8ac7e8573d --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileLoader.java @@ -0,0 +1,116 @@ +package com.github.chaoswang.learning.java.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.github.chaoswang.learning.java.jvm.clz.ClassFile; + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + + // String path = className.replaceAll("\\.", "/"); + // õķ + 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 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); + + } + + public void addClassPath(String path) { + // ѾӹIJҪټ + if (clzPaths.contains(path)) { + return; + } + clzPaths.add(path); + } + + // ------------------------------backup------------------------ + public String getClassPath_V1() { + StringBuffer sb = new StringBuffer(); + for (String clzPath : clzPaths) { + sb.append(clzPath).append(";"); + } + String classPath = sb.toString(); + return classPath.substring(0, classPath.length() - 1); + } + + // ȡһ.classļǰ4ֽڣ תʮַDzǣCAFEBABE + private byte[] readClassFile_V1(String filePath) { + BufferedInputStream bis = null; + ByteArrayOutputStream bos = null; + try { + bis = new BufferedInputStream(new FileInputStream(filePath)); + bos = new ByteArrayOutputStream(); + byte[] bbuf = new byte[1024];// ˼ǣܶ1024Ҳܲ1024 + int index = 0; + + while ((index = bis.read(bbuf)) != -1) { + // readڶĩβǰ˷һֱѭʵֻӡһ + System.out.println(bbuf.length); + bos.write(bbuf, 0, index); + } + return bos.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileParser.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..7c4608601e --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileParser.java @@ -0,0 +1,31 @@ +package com.github.chaoswang.learning.java.jvm.loader; + +import com.github.chaoswang.learning.java.jvm.clz.AccessFlag; +import com.github.chaoswang.learning.java.jvm.clz.ClassFile; +import com.github.chaoswang.learning.java.jvm.clz.ClassIndex; +import com.github.chaoswang.learning.java.jvm.constant.ConstantPool; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + + return null; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + return null; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + + return null; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + + return null; + } + +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/util/Util.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/util/Util.java new file mode 100644 index 0000000000..f74531ca2d --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/util/Util.java @@ -0,0 +1,22 @@ +package com.github.chaoswang.learning.java.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } +} diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java index 25f2d1afb8..927a37b6fd 100644 --- a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java @@ -5,11 +5,31 @@ import org.junit.Before; import org.junit.Test; +import com.github.chaoswang.learning.java.jvm.clz.ClassFile; +import com.github.chaoswang.learning.java.jvm.clz.ClassIndex; +import com.github.chaoswang.learning.java.jvm.constant.ClassInfo; +import com.github.chaoswang.learning.java.jvm.constant.ConstantPool; +import com.github.chaoswang.learning.java.jvm.constant.MethodRefInfo; +import com.github.chaoswang.learning.java.jvm.constant.NameAndTypeInfo; +import com.github.chaoswang.learning.java.jvm.constant.UTF8Info; +import com.github.chaoswang.learning.java.jvm.loader.ClassFileLoader; + public class ClassFileloaderTest { - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + private static final String FULL_QUALIFIED_CLASS_NAME = "com/github/chaoswang/learning/java/jvm/EmployeeV1"; + static String path1 = "E:\\workspace_jee\\coding2017\\target\\test-classes"; static String path2 = "C:\temp"; + static ClassFile clzFile = null; +// static { +// ClassFileLoader loader = new ClassFileLoader(); +// loader.addClassPath(path1); +// String className = "com.github.chaoswang.learning.java.jvm.EmployeeV1"; +// +// clzFile = loader.loadClass(className); +// clzFile.print(); +// } + @Before public void setUp() throws Exception { } @@ -37,12 +57,12 @@ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "com.github.chaoswang.learning.java.jvm.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); // ע⣺ֽܺJVM汾йϵ Կõൽж - Assert.assertEquals(1056, byteCodes.length); + Assert.assertEquals(1086, byteCodes.length); } @@ -50,7 +70,7 @@ public void testClassFileLength() { public void testMagicNumber() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "com.github.chaoswang.learning.java.jvm.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; @@ -63,6 +83,7 @@ private String byteToHexString(byte[] codes) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < codes.length; i++) { byte b = codes[i]; + // 0xff󣬸24λͻᱻ0˲24λᲹ1ľͲcaffffffca int value = b & 0xFF; String strHex = Integer.toHexString(value); if (strHex.length() < 2) { @@ -73,4 +94,95 @@ private String byteToHexString(byte[] codes) { return buffer.toString(); } + /** + * ---------------------------------------------------------------------- + */ + + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool() { + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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()); + } + } \ No newline at end of file From da8d44dced8f38c6a9844b60cd5a0b43e7a62a93 Mon Sep 17 00:00:00 2001 From: chaoswang Date: Tue, 11 Apr 2017 23:06:19 +0800 Subject: [PATCH 114/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learning/java/jvm/attr/AttributeInfo.java | 19 +++++ .../learning/java/jvm/attr/CodeAttr.java | 50 ++++++++++++ .../java/jvm/attr/LineNumberTable.java | 45 +++++++++++ .../java/jvm/attr/LocalVariableItem.java | 49 ++++++++++++ .../java/jvm/attr/LocalVariableTable.java | 23 ++++++ .../learning/java/jvm/attr/StackMapTable.java | 29 +++++++ .../learning/java/jvm/clz/ClassFile.java | 24 ++++++ .../learning/java/jvm/field/Field.java | 31 ++++++++ .../java/jvm/loader/ByteCodeIterator.java | 52 ++++++++++++- .../learning/java/jvm/method/Method.java | 51 +++++++++++++ .../java/jvm/ClassFileloaderTest.java | 76 +++++++++++++++++++ 11 files changed, 448 insertions(+), 1 deletion(-) create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/AttributeInfo.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/CodeAttr.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LineNumberTable.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LocalVariableItem.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LocalVariableTable.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/StackMapTable.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/field/Field.java create mode 100644 group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/method/Method.java diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/AttributeInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..737a9d83db --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.github.chaoswang.learning.java.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/CodeAttr.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..f7157b9d3c --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/CodeAttr.java @@ -0,0 +1,50 @@ +package com.github.chaoswang.learning.java.jvm.attr; + +import com.github.chaoswang.learning.java.jvm.clz.ClassFile; +import com.github.chaoswang.learning.java.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + + return null; + } + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LineNumberTable.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..8f52a6feac --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LineNumberTable.java @@ -0,0 +1,45 @@ +package com.github.chaoswang.learning.java.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.github.chaoswang.learning.java.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + + return null; + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LocalVariableItem.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..4c4443a4d1 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LocalVariableItem.java @@ -0,0 +1,49 @@ +package com.github.chaoswang.learning.java.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LocalVariableTable.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..c56aee7f26 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/LocalVariableTable.java @@ -0,0 +1,23 @@ +package com.github.chaoswang.learning.java.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.github.chaoswang.learning.java.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/StackMapTable.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..3cb32df88b --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/attr/StackMapTable.java @@ -0,0 +1,29 @@ +package com.github.chaoswang.learning.java.jvm.attr; + +import com.github.chaoswang.learning.java.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //StackMapTable̫ӣ ٴ ֻԭʼĴ + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java index 26b2d02b67..77ed31c188 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java @@ -1,7 +1,12 @@ package com.github.chaoswang.learning.java.jvm.clz; +import java.util.ArrayList; +import java.util.List; + import com.github.chaoswang.learning.java.jvm.constant.ClassInfo; import com.github.chaoswang.learning.java.jvm.constant.ConstantPool; +import com.github.chaoswang.learning.java.jvm.field.Field; +import com.github.chaoswang.learning.java.jvm.method.Method; public class ClassFile { @@ -11,6 +16,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -53,7 +60,24 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } + public void addField(Field f) { + this.fields.add(f); + } + + public List getFields() { + return this.fields; + } + + public void addMethod(Method m) { + this.methods.add(m); + } + + public List getMethods() { + return methods; + } + public void print() { + if (this.accessFlag.isPublicClass()) { System.out.println("Access flag : public "); } diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/field/Field.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/field/Field.java new file mode 100644 index 0000000000..c0ef09f88a --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/field/Field.java @@ -0,0 +1,31 @@ +package com.github.chaoswang.learning.java.jvm.field; + +import com.github.chaoswang.learning.java.jvm.constant.ConstantPool; +import com.github.chaoswang.learning.java.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + return null; + } + +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ByteCodeIterator.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ByteCodeIterator.java index 5d75712596..8cf2374114 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ByteCodeIterator.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,55 @@ package com.github.chaoswang.learning.java.jvm.loader; +import java.util.Arrays; + +import com.github.chaoswang.learning.java.jvm.util.Util; + public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } -} + public void back(int n) { + this.pos -= n; + } +} \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/method/Method.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/method/Method.java new file mode 100644 index 0000000000..c55cb5ac25 --- /dev/null +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/method/Method.java @@ -0,0 +1,51 @@ +package com.github.chaoswang.learning.java.jvm.method; + +import com.github.chaoswang.learning.java.jvm.attr.CodeAttr; +import com.github.chaoswang.learning.java.jvm.clz.ClassFile; +import com.github.chaoswang.learning.java.jvm.loader.ByteCodeIterator; + +public class Method { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + return null; + + } +} diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java index 927a37b6fd..16c361ca04 100644 --- a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java @@ -1,5 +1,7 @@ package com.github.chaoswang.learning.java.jvm; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -12,7 +14,9 @@ import com.github.chaoswang.learning.java.jvm.constant.MethodRefInfo; import com.github.chaoswang.learning.java.jvm.constant.NameAndTypeInfo; import com.github.chaoswang.learning.java.jvm.constant.UTF8Info; +import com.github.chaoswang.learning.java.jvm.field.Field; import com.github.chaoswang.learning.java.jvm.loader.ClassFileLoader; +import com.github.chaoswang.learning.java.jvm.method.Method; public class ClassFileloaderTest { @@ -184,5 +188,77 @@ public void testClassIndex() { Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + + /** + * ǵJVMӦʵֵIJ + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } \ No newline at end of file From e8142c7a1dcb45022b9b06bafa60915f9fa6ff19 Mon Sep 17 00:00:00 2001 From: gongxun Date: Tue, 11 Apr 2017 23:17:05 +0800 Subject: [PATCH 115/552] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../785396327/3.26/jvm_1/ClassFileLoader.java | 11 +- .../4.5/iterator/ByteCodeIterator.java | 40 ++++++ .../785396327/4.5/parse/ClassFilePaser.java | 50 +++++++ .../4.5/test/ClassFileloaderTest.java | 122 +++++++++--------- group17/785396327/4.5/util/Util.java | 3 + 5 files changed, 164 insertions(+), 62 deletions(-) create mode 100644 group17/785396327/4.5/iterator/ByteCodeIterator.java create mode 100644 group17/785396327/4.5/parse/ClassFilePaser.java diff --git a/group17/785396327/3.26/jvm_1/ClassFileLoader.java b/group17/785396327/3.26/jvm_1/ClassFileLoader.java index 9a937ba631..66f209f161 100644 --- a/group17/785396327/3.26/jvm_1/ClassFileLoader.java +++ b/group17/785396327/3.26/jvm_1/ClassFileLoader.java @@ -1,5 +1,8 @@ package jvm_1; +import clz.ClassFile; +import parse.ClassFilePaser; + import java.io.*; import java.util.ArrayList; import java.util.List; @@ -12,7 +15,7 @@ public class ClassFileLoader { public byte[] readBinaryCode(String className) { InputStream fis = null; - String filePath = clzPaths.get(0) + File.pathSeparator + className.replaceAll("\\.", File.pathSeparator) + ".class"; + String filePath = clzPaths.get(0) + "\\\\" + className.replaceAll("\\.", "\\\\") + ".class"; byte[] buffer = new byte[(int) new File(filePath).length()]; try { if (clzPaths.size() > 0 && className != null && !className.trim().equals("")) { @@ -47,4 +50,10 @@ public String getClassPath() { } return sb.substring(0, sb.length() - 1); } + + public ClassFile loadClass(String className) { + byte[] bytes = readBinaryCode(className); + ClassFilePaser classFilePaser = new ClassFilePaser(); + return classFilePaser.parse(bytes); + } } diff --git a/group17/785396327/4.5/iterator/ByteCodeIterator.java b/group17/785396327/4.5/iterator/ByteCodeIterator.java new file mode 100644 index 0000000000..7157d01a2c --- /dev/null +++ b/group17/785396327/4.5/iterator/ByteCodeIterator.java @@ -0,0 +1,40 @@ +package iterator; + +import util.Util; + +import java.util.Arrays; + +/** + * Created by IBM on 2017/4/11. + */ +public class ByteCodeIterator { + + byte[] codes; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public String nextU4ToHexString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 4; i++) { + byte code = codes[i]; + int value = code & 0xff; + sb.append(Integer.toHexString(value)); + } + codes = Arrays.copyOfRange(codes, 4, codes.length); + return sb.toString(); + } + + public int nextU2ToInt() { + byte[] buff = new byte[]{codes[0], codes[1]}; + codes = Arrays.copyOfRange(codes, 2, codes.length); + return Util.byteToInt(buff); + } + + public int nextU1ToInt() { + byte[] buff = new byte[]{codes[0]}; + codes = Arrays.copyOfRange(codes, 1, codes.length); + return Util.byteToInt(buff); + } +} diff --git a/group17/785396327/4.5/parse/ClassFilePaser.java b/group17/785396327/4.5/parse/ClassFilePaser.java new file mode 100644 index 0000000000..3ddd9df6c3 --- /dev/null +++ b/group17/785396327/4.5/parse/ClassFilePaser.java @@ -0,0 +1,50 @@ +package parse; + +import clz.ClassFile; +import constant.ClassInfo; +import constant.ConstantInfo; +import constant.ConstantPool; +import constant.NullConstantInfo; +import iterator.ByteCodeIterator; + +/** + * Created by IBM on 2017/4/11. + */ +public class ClassFilePaser { + private ClassFile classFile; + + public ClassFile parse(byte[] codes) { + classFile = new ClassFile(); + + ByteCodeIterator iterator = new ByteCodeIterator(codes); + String magic = iterator.nextU4ToHexString(); + if (!"cafebabe".equals(magic)) + return null; + + classFile.setMinorVersion(iterator.nextU2ToInt()); + classFile.setMajorVersion(iterator.nextU2ToInt()); + + ConstantPool constantPool = parseConstantPool(iterator); + classFile.setConstPool(constantPool); + + return classFile; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iterator) { + int poolSize = iterator.nextU2ToInt(); + System.out.println("constant pool size = " + (poolSize - 1)); + + ConstantPool constantPool = new ConstantPool(); + + constantPool.addConstantInfo(new NullConstantInfo()); + for (int i = 1; i < poolSize; i++) { + int tag = iterator.nextU1ToInt(); + if (tag == ConstantInfo.CLASS_INFO) { + ClassInfo classInfo = new ClassInfo(constantPool); + classInfo.setUtf8Index(iterator.nextU2ToInt()); + constantPool.addConstantInfo(classInfo); + } + } + return constantPool; + } +} diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java index 7c32811a45..8c15346ca4 100644 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -16,17 +16,17 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "D:\\workspace\\IDEA\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; static String path2 = "C:\temp"; static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "jvm_1.EmployeeV1"; -// clzFile = loader.loadClass(className); - clzFile.print(); + clzFile = loader.loadClass(className); +// clzFile.print(); } @@ -57,12 +57,12 @@ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "jvm_1.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); + Assert.assertEquals(1020, byteCodes.length); } @@ -116,67 +116,67 @@ public void testConstantPool(){ ConstantPool pool = clzFile.getConstantPool(); - Assert.assertEquals(53, pool.getSize()); +// Assert.assertEquals(53, pool.getSize()); { ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); Assert.assertEquals(2, clzInfo.getUtf8Index()); - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); - } - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); - Assert.assertEquals(4, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); - Assert.assertEquals("java/lang/Object", utf8Info.getValue()); - } - { - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); - Assert.assertEquals("name", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(6); - Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(7); - Assert.assertEquals("age", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(8); - Assert.assertEquals("I", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(9); - Assert.assertEquals("", 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()); +// UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); +// Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); } +// { +// ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); +// Assert.assertEquals(4, clzInfo.getUtf8Index()); +// +// UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); +// Assert.assertEquals("java/lang/Object", utf8Info.getValue()); +// } +// { +// UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); +// Assert.assertEquals("name", utf8Info.getValue()); +// +// utf8Info = (UTF8Info) pool.getConstantInfo(6); +// Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); +// +// utf8Info = (UTF8Info) pool.getConstantInfo(7); +// Assert.assertEquals("age", utf8Info.getValue()); +// +// utf8Info = (UTF8Info) pool.getConstantInfo(8); +// Assert.assertEquals("I", utf8Info.getValue()); +// +// utf8Info = (UTF8Info) pool.getConstantInfo(9); +// Assert.assertEquals("", 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(){ diff --git a/group17/785396327/4.5/util/Util.java b/group17/785396327/4.5/util/Util.java index 9bcb3c4e10..f2e2b3d859 100644 --- a/group17/785396327/4.5/util/Util.java +++ b/group17/785396327/4.5/util/Util.java @@ -1,5 +1,7 @@ package util; +import constant.ConstantPool; + /** * Created by IBM on 2017/4/10. */ @@ -24,4 +26,5 @@ public static String byteToHexString(byte[] codes ){ } return buffer.toString(); } + } From 4a70761cd753a619971e547c84c4bc83815ef998 Mon Sep 17 00:00:00 2001 From: chaoswang Date: Wed, 12 Apr 2017 00:21:46 +0800 Subject: [PATCH 116/552] =?UTF-8?q?StackUtil=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learning/java/stack/StackUtil.java | 90 +++++++++++++++++-- 1 file changed, 83 insertions(+), 7 deletions(-) diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java index 986d434531..3253cdcffa 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java @@ -1,20 +1,33 @@ package com.github.chaoswang.learning.java.stack; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Stack; + public class StackUtil { + + public static void addToBottom(Stack s, Integer value) { + Stack tmpStack = new Stack(); + while(!s.empty()){ + tmpStack.push(s.pop()); + } + s.push(value); + while(!tmpStack.empty()){ + s.push(tmpStack.pop()); + } + } /** * ջеԪInteger, ջջ : 5,4,3,2,1 ø÷ ԪشΪ: 1,2,3,4,5 * ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ */ public static void reverse(Stack s) { - - } - - public static void addToBottom(Stack s, Integer value){ + Stack tmpStack = new Stack(); + } - /** * ɾջеijԪ ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ @@ -22,7 +35,20 @@ public static void addToBottom(Stack s, Integer value){ * @param o */ public static void remove(Stack s, Object o) { - + if(o == null){ + return; + } + Stack tmpStack = new Stack(); + while(!s.empty()){ + Integer poped = s.pop(); + if(o.equals(poped)){ + break; + } + tmpStack.push(poped); + } + while(!tmpStack.empty()){ + s.push(tmpStack.pop()); + } } /** @@ -33,7 +59,21 @@ public static void remove(Stack s, Object o) { * @return */ public static Object[] getTop(Stack s, int len) { - return null; + int stackSize = s.size(); + if(len > stackSize || len <= 0){ + throw new IllegalArgumentException("parameter len illegal"); + } + List ret = new ArrayList(); + Stack tmpStack = new Stack(); + for(int i=0;i s, int len) { * @return */ public static boolean isValidPairs(String s) { + Map map = new HashMap(); + map.put('(', ')'); + map.put('[', ']'); + map.put('{', '}'); + Stack tmpStack = new Stack(); + for(char c : s.toCharArray()){ + Character value = map.get(c); + if(value != null){ + tmpStack.push(value); + } + } + StringBuffer sb = new StringBuffer(); + while(!tmpStack.empty()){ + Character poped = tmpStack.pop(); + Character value = map.get(poped); + if(value != null) + sb.append(value); + } + + List ret = new ArrayList(); + for(char c : s.toCharArray()){ + Character value = map.get(c); + if(value != null){ + ret.add(value); + } + } + StringBuffer sb2 = new StringBuffer(); + for(Character c : ret){ + Character value = map.get(c); + if(value != null) + sb2.append(c); + } + + if(sb.toString().equals(sb2.toString())){ + return true; + } return false; } From 87a5322794551adad4ddf187aa15b4566458c4fa Mon Sep 17 00:00:00 2001 From: 10094714 Date: Wed, 12 Apr 2017 11:23:58 +0800 Subject: [PATCH 117/552] =?UTF-8?q?StackUtilTest=E9=80=9A=E8=BF=87?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0pom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group06/263050006/pom.xml | 63 +++++++++++++++++++ .../learning/java/stack/StackUtil.java | 59 +++++++++-------- 2 files changed, 91 insertions(+), 31 deletions(-) create mode 100644 group06/263050006/pom.xml diff --git a/group06/263050006/pom.xml b/group06/263050006/pom.xml new file mode 100644 index 0000000000..91c21f2b50 --- /dev/null +++ b/group06/263050006/pom.xml @@ -0,0 +1,63 @@ + + 4.0.0 + com.github.chaoswang + coding2017 + 0.0.1-SNAPSHOT + coding2017 + coding2017 + + coding2017/group06/263050006/src/main/java + coding2017/group06/263050006/src/test/java + + + coding2017/group06/263050006/src/main/java + + **/*.java + + + + + + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + + + + + + junit + junit + 4.12 + test + + + + + org.apache.commons + commons-lang3 + 3.5 + + + + + commons-io + commons-io + 2.5 + + + + + jdom + jdom + 1.1 + + + + + \ No newline at end of file diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java index 3253cdcffa..7f2c30d1f1 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/stack/StackUtil.java @@ -1,6 +1,7 @@ package com.github.chaoswang.learning.java.stack; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,8 +26,12 @@ public static void addToBottom(Stack s, Integer value) { */ public static void reverse(Stack s) { Stack tmpStack = new Stack(); - - + while(!s.empty()){ + tmpStack.push(s.pop()); + } + while(!tmpStack.empty()){ + StackUtil.addToBottom(s, tmpStack.pop()); + } } /** @@ -58,15 +63,15 @@ public static void remove(Stack s, Object o) { * @param len * @return */ - public static Object[] getTop(Stack s, int len) { + public static Object[] getTop(Stack s, int len) { int stackSize = s.size(); if(len > stackSize || len <= 0){ throw new IllegalArgumentException("parameter len illegal"); } List ret = new ArrayList(); - Stack tmpStack = new Stack(); + Stack tmpStack = new Stack(); for(int i=0;i s, int len) { */ public static boolean isValidPairs(String s) { Map map = new HashMap(); - map.put('(', ')'); - map.put('[', ']'); - map.put('{', '}'); + map.put(')', '('); + map.put(']', '['); + map.put('}', '{'); + List bracketList = Arrays.asList('(', ')','[', ']','{', '}'); Stack tmpStack = new Stack(); for(char c : s.toCharArray()){ - Character value = map.get(c); - if(value != null){ - tmpStack.push(value); + if(bracketList.contains(c)){ + tmpStack.push(c); } } - StringBuffer sb = new StringBuffer(); - while(!tmpStack.empty()){ + //ŵĸż϶ɶ + if(tmpStack.size()%2 != 0){ + return false; + } + Stack tmpStack2 = new Stack(); + int tmpSize = tmpStack.size(); + for(int i=0;i ret = new ArrayList(); - for(char c : s.toCharArray()){ - Character value = map.get(c); - if(value != null){ - ret.add(value); + for(int i=0;i Date: Wed, 12 Apr 2017 16:06:36 +0800 Subject: [PATCH 118/552] =?UTF-8?q?jvm=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learning/java/jvm/clz/ClassFile.java | 28 ++++++--- .../learning/java/jvm/constant/ClassInfo.java | 8 ++- .../java/jvm/constant/FieldRefInfo.java | 9 ++- .../java/jvm/constant/MethodRefInfo.java | 9 ++- .../java/jvm/constant/NameAndTypeInfo.java | 10 +++- .../java/jvm/constant/StringInfo.java | 7 ++- .../learning/java/jvm/constant/UTF8Info.java | 8 +++ .../java/jvm/loader/ClassFileParser.java | 59 ++++++++++++++++--- .../java/jvm/ClassFileloaderTest.java | 19 +++--- 9 files changed, 126 insertions(+), 31 deletions(-) diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java index 77ed31c188..b6c9a423b7 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/clz/ClassFile.java @@ -10,13 +10,27 @@ public class ClassFile { + //ClassļĴΰ汾 private int minorVersion; + //Classļ汾,Java SE 6.0Ӧ֧Java SE 5.0ıClassļṹ֮ private int majorVersion; + /** + * ClassļгҪ洢 ԼãҪַ + * finalֵijԵijʼֵȵȣҪ洢ͽӿڵȫ޶ƣ + * ֶεԼ Լ + * CONSTANT_Utf8_info,CONSTANT_Float_info,CONSTANT_Double_info + */ + private ConstantPool pool; + + //ʾ߽ӿڵķϢ private AccessFlag accessFlag; + //ij private ClassIndex clzIndex; - private ConstantPool pool; + + //ֶαϢ private List fields = new ArrayList(); + // private List methods = new ArrayList(); public ClassIndex getClzIndex() { @@ -78,12 +92,12 @@ public List getMethods() { 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()); +// if (this.accessFlag.isPublicClass()) { +// System.out.println("Access flag : public "); +// } +// System.out.println("Class Name:" + getClassName()); +// +// System.out.println("Super Class Name:" + getSuperClassName()); } diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ClassInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ClassInfo.java index 2bbf8a79a7..f30e75f5df 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ClassInfo.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/ClassInfo.java @@ -1,6 +1,12 @@ package com.github.chaoswang.learning.java.jvm.constant; - +/** + * CONSTANT_Class_info { + * u1 tag; + * u2 name_index; + * } + */ public class ClassInfo extends ConstantInfo { + private int type = ConstantInfo.CLASS_INFO; private int utf8Index; diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/FieldRefInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/FieldRefInfo.java index 48c4ee8eeb..762f678545 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/FieldRefInfo.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/FieldRefInfo.java @@ -1,6 +1,13 @@ package com.github.chaoswang.learning.java.jvm.constant; - +/** + * CONSTANT_Fieldref_info { + * u1 tag; + * u2 class_index; + * u2 name_and_type_index; + * } + */ public class FieldRefInfo extends ConstantInfo{ + private int type = ConstantInfo.FIELD_INFO; private int classInfoIndex; private int nameAndTypeIndex; diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/MethodRefInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/MethodRefInfo.java index 2b2cbeabbc..f8f30a92cd 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/MethodRefInfo.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/MethodRefInfo.java @@ -1,9 +1,14 @@ package com.github.chaoswang.learning.java.jvm.constant; - +/** + * CONSTANT_Methodref_info { + * u1 tag; + * u2 class_index; + * u2 name_and_type_index; + */ public class MethodRefInfo extends ConstantInfo { + private int type = ConstantInfo.METHOD_INFO; - private int classInfoIndex; private int nameAndTypeIndex; diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NameAndTypeInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NameAndTypeInfo.java index f557cc7ded..bd91ec8aac 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NameAndTypeInfo.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/NameAndTypeInfo.java @@ -1,8 +1,14 @@ package com.github.chaoswang.learning.java.jvm.constant; - +/** + * CONSTANT_NameAndType_info { + * u1 tag; + * u2 name_index; + * u2 descriptor_index; + * } + */ public class NameAndTypeInfo extends ConstantInfo { + public int type = ConstantInfo.NAME_AND_TYPE_INFO; - private int index1; private int index2; diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/StringInfo.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/StringInfo.java index c4a198f8d5..82c4be3245 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/StringInfo.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/StringInfo.java @@ -1,6 +1,11 @@ package com.github.chaoswang.learning.java.jvm.constant; - +/** + * CONSTANT_String_info { + * u1 tag; + * u2 string_index; + */ public class StringInfo extends ConstantInfo { + private int type = ConstantInfo.STRING_INFO; private int index; diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/UTF8Info.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/UTF8Info.java index 07243b928d..5950d094e7 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/UTF8Info.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/constant/UTF8Info.java @@ -1,6 +1,14 @@ package com.github.chaoswang.learning.java.jvm.constant; +/** + * CONSTANT_Utf8_info { + * u1 tag; + * u2 length; + * u1 bytes[length]; + * } + */ public class UTF8Info extends ConstantInfo { + private int type = ConstantInfo.UTF8_INFO; private int length; private String value; diff --git a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileParser.java b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileParser.java index 7c4608601e..3b133dba93 100644 --- a/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileParser.java +++ b/group06/263050006/src/main/java/com/github/chaoswang/learning/java/jvm/loader/ClassFileParser.java @@ -3,29 +3,72 @@ import com.github.chaoswang.learning.java.jvm.clz.AccessFlag; import com.github.chaoswang.learning.java.jvm.clz.ClassFile; import com.github.chaoswang.learning.java.jvm.clz.ClassIndex; +import com.github.chaoswang.learning.java.jvm.constant.ClassInfo; import com.github.chaoswang.learning.java.jvm.constant.ConstantPool; +import com.github.chaoswang.learning.java.jvm.constant.UTF8Info; public class ClassFileParser { - + + public ClassFile parse(byte[] codes) { - - return null; + ByteCodeIterator codeIterator = new ByteCodeIterator(codes); + ClassFile classFile = new ClassFile(); + //ħ + codeIterator.getBytes(4); + classFile.setMinorVersion(codeIterator.nextU2ToInt()); + classFile.setMajorVersion(codeIterator.nextU2ToInt()); + + return classFile; } + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - - return null; + //أصijǶ٣ + AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); + return accessFlag; } - private ClassIndex parseClassInfex(ByteCodeIterator iter) { + private ClassIndex parseClassIndex(ByteCodeIterator iter) { return null; } private ConstantPool parseConstantPool(ByteCodeIterator iter) { - - return null; + ConstantPool pool = new ConstantPool(); + ClassInfo classInfo = new ClassInfo(pool); + //classInfo tagֵ + iter.nextU1toInt(); + classInfo.setUtf8Index(iter.nextU2ToInt()); + pool.addConstantInfo(classInfo); + + UTF8Info utf8Info = new UTF8Info(pool); + //UTF8Info tagֵ + iter.nextU1toInt(); + //UTF8Info lengthֵ + int length = iter.nextU2ToInt(); + utf8Info.setLength(length); + utf8Info.setValue(iter.nextUxToHexString(length)); + pool.addConstantInfo(utf8Info); + + classInfo = new ClassInfo(pool); + //classInfo tagֵ + iter.nextU1toInt(); + classInfo.setUtf8Index(iter.nextU2ToInt()); + pool.addConstantInfo(classInfo); + + for(int i=0;i<8;i++){ + utf8Info = new UTF8Info(pool); + //UTF8Info tagֵ + iter.nextU1toInt(); + //UTF8Info lengthֵ + length = iter.nextU2ToInt(); + utf8Info.setLength(length); + utf8Info.setValue(iter.nextUxToHexString(length)); + pool.addConstantInfo(utf8Info); + } + + return pool; } } \ No newline at end of file diff --git a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java index 16c361ca04..3694a31b59 100644 --- a/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java +++ b/group06/263050006/src/test/java/com/github/chaoswang/learning/java/jvm/ClassFileloaderTest.java @@ -21,18 +21,19 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/github/chaoswang/learning/java/jvm/EmployeeV1"; - static String path1 = "E:\\workspace_jee\\coding2017\\target\\test-classes"; +// static String path1 = "E:\\workspace_jee\\coding2017\\target\\test-classes"; + static String path1 = "D:\\project\\workspace_1\\d-learning\\target\\test-classes"; static String path2 = "C:\temp"; static ClassFile clzFile = null; -// static { -// ClassFileLoader loader = new ClassFileLoader(); -// loader.addClassPath(path1); -// String className = "com.github.chaoswang.learning.java.jvm.EmployeeV1"; -// -// clzFile = loader.loadClass(className); -// clzFile.print(); -// } + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.github.chaoswang.learning.java.jvm.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } @Before public void setUp() throws Exception { From 3ac90d6d7aecc46d0e8745270ace4e3a44c6bd32 Mon Sep 17 00:00:00 2001 From: "yanght1454385822@qq.com" Date: Wed, 12 Apr 2017 17:07:56 +0800 Subject: [PATCH 119/552] homework_05 --- .../homework_04/jvm/attr/AccessFlag.java | 26 +++ .../basic/homework_04/jvm/clz/ClassFile.java | 107 ++++++++++ .../homework_04/jvm/clz/ClassFileParser.java | 99 +++++++++ .../basic/homework_04/jvm/clz/ClassIndex.java | 22 ++ .../jvm/constant/ConstantInfo.java | 23 ++ .../jvm/constant/ConstantPool.java | 33 +++ .../basic/homework_04/jvm/info/ClassInfo.java | 43 ++++ .../homework_04/jvm/info/FieldRefInfo.java | 34 +++ .../homework_04/jvm/info/MethodRefInfo.java | 37 ++++ .../homework_04/jvm/info/NameAndTypeInfo.java | 39 ++++ .../jvm/info/NullConstantInfo.java | 16 ++ .../homework_04/jvm/info/StringInfo.java | 27 +++ .../basic/homework_04/jvm/info/UTF8Info.java | 37 ++++ .../jvm/loader/ClassFileLoader.java | 25 ++- .../jvm/test/ClassFileloaderTest.java | 198 +++++++++++++++++- .../jvm/util/ByteCodeIterator.java | 56 +++++ .../basic/homework_04/jvm/util/Util.java | 26 +++ .../coding/basic/homework_05/stack/Stack.java | 32 --- .../basic/homework_05/stack/StackUtil.java | 93 ++++---- .../homework_05/stack/StackUtilTest.java | 78 +++++++ .../basic/homework_06/expr/InfixExpr.java | 18 ++ .../basic/homework_06/expr/InfixExprTest.java | 48 +++++ 22 files changed, 1028 insertions(+), 89 deletions(-) create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/AccessFlag.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFile.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassIndex.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantInfo.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantPool.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/info/ClassInfo.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/info/FieldRefInfo.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/info/MethodRefInfo.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NameAndTypeInfo.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NullConstantInfo.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/info/StringInfo.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/info/UTF8Info.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/util/ByteCodeIterator.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/util/Util.java delete mode 100644 group06/1454385822/src/com/coding/basic/homework_05/stack/Stack.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtilTest.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExpr.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExprTest.java diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/AccessFlag.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/AccessFlag.java new file mode 100644 index 0000000000..9854d93ba3 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/AccessFlag.java @@ -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; + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFile.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..05e6e579b2 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFile.java @@ -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; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java new file mode 100644 index 0000000000..ce1853b454 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java @@ -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; + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassIndex.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..eb2b604537 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassIndex.java @@ -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; + } + + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..c7209b72b5 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantInfo.java @@ -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; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantPool.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..261e5f5a15 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantPool.java @@ -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 constantInfos = new ArrayList(); + + 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(); + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/ClassInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/ClassInfo.java new file mode 100644 index 0000000000..c30a15f36d --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/ClassInfo.java @@ -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(); + } + + + + + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/FieldRefInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/FieldRefInfo.java new file mode 100644 index 0000000000..d29e5564eb --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/FieldRefInfo.java @@ -0,0 +1,34 @@ +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 FieldRefInfo extends ConstantInfo{ + + public FieldRefInfo(ConstantPool pool) { + super(pool); + // TODO Auto-generated constructor stub + } + public FieldRefInfo() { + // TODO Auto-generated constructor stub + } + private int tag = ConstantInfo.FIELDREF_INFO; + private int clz_index; + private int nameAndType_index; + public int getClz_index() { + return clz_index; + } + public void setClz_index(int clz_index) { + this.clz_index = clz_index; + } + public int getNameAndType_index() { + return nameAndType_index; + } + public void setNameAndType_index(int nameAndType_index) { + this.nameAndType_index = nameAndType_index; + } + public int getTag() { + return tag; + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/MethodRefInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/MethodRefInfo.java new file mode 100644 index 0000000000..1467cf94d0 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/MethodRefInfo.java @@ -0,0 +1,37 @@ +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 MethodRefInfo extends ConstantInfo { + + public MethodRefInfo(ConstantPool pool) { + super(pool); + // TODO Auto-generated constructor stub + } + public MethodRefInfo() { + // TODO Auto-generated constructor stub + } + private int tag = ConstantInfo.METHODREF_INFO; + private int class_index; + private int nameAndType_index; + + public int getClass_index() { + return class_index; + } + public void setClass_index(int class_index) { + this.class_index = class_index; + } + public int getNameAndType_index() { + return nameAndType_index; + } + public void setNameAndType_index(int nameAndType_index) { + this.nameAndType_index = nameAndType_index; + } + public int getTag() { + return tag; + } + + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NameAndTypeInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NameAndTypeInfo.java new file mode 100644 index 0000000000..49d26d5083 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NameAndTypeInfo.java @@ -0,0 +1,39 @@ +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 NameAndTypeInfo extends ConstantInfo { + + private int tag = ConstantInfo.NAMEANDTYPE_INFO; + private int clz_index; + private int descriptor_index; + + public NameAndTypeInfo(ConstantPool pool) { + super(pool); + // TODO Auto-generated constructor stub + } + public NameAndTypeInfo() { + // TODO Auto-generated constructor stub + } + + + public int getClz_index() { + return clz_index; + } + public void setClz_index(int clz_index) { + this.clz_index = clz_index; + } + + public int getDescriptor_index() { + return descriptor_index; + } + public void setDescriptor_index(int descriptor_index) { + this.descriptor_index = descriptor_index; + } + public int getTag() { + return tag; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NullConstantInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NullConstantInfo.java new file mode 100644 index 0000000000..8b44232f31 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NullConstantInfo.java @@ -0,0 +1,16 @@ +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 NullConstantInfo extends ConstantInfo{ + + public NullConstantInfo(ConstantPool pool) { + super(pool); + // TODO Auto-generated constructor stub + } + + public NullConstantInfo() { + // TODO Auto-generated constructor stub + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/StringInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/StringInfo.java new file mode 100644 index 0000000000..3399821e58 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/StringInfo.java @@ -0,0 +1,27 @@ +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 StringInfo extends ConstantInfo { + + public StringInfo(ConstantPool pool) { + super(pool); + } + public StringInfo() { + // TODO Auto-generated constructor stub + } + private int tag = ConstantInfo.STRING_INFO; + private int string_index; + public int getString_index() { + return string_index; + } + public void setString_index(int string_index) { + this.string_index = string_index; + } + public int getTag() { + return tag; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/UTF8Info.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/UTF8Info.java new file mode 100644 index 0000000000..abc51a4c33 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/UTF8Info.java @@ -0,0 +1,37 @@ +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 UTF8Info extends ConstantInfo{ + + private int tag = ConstantInfo.UTF8_INFO; + private int length; + private String value; + + public UTF8Info(ConstantPool pool) { + super(pool); + } + public UTF8Info() { + } + + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + + @Override + public String toString() { + return "UTF8Info [tag=" + tag + ", length=" + length + ", value=" + value +")]"; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/loader/ClassFileLoader.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/loader/ClassFileLoader.java index e4d36e04c6..6cc1f20181 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/loader/ClassFileLoader.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/loader/ClassFileLoader.java @@ -7,6 +7,8 @@ import java.util.Arrays; import java.util.List; +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.clz.ClassFileParser; public class ClassFileLoader { @@ -62,11 +64,11 @@ private byte[] readFile(File file){ * @return */ private String getPath(String path ,String className){ - System.out.println(className); +// System.out.println(className); String [] ways = className.split("\\."); - for (String string : ways) { - System.out.println(string); - } +// for (String string : ways) { +// System.out.println(string); +// } StringBuilder builder = new StringBuilder(); builder.append(path); for (String string : ways) { @@ -75,7 +77,7 @@ private String getPath(String path ,String className){ builder.append(string); } builder.append(".class"); - System.out.println(builder.toString()); +// System.out.println(builder.toString()); return builder.toString(); } @@ -107,8 +109,19 @@ public String getClassPath(){ return builder.toString(); } + public ClassFile loadClass(String className) { + byte[] codes = readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + ClassFile clzFile = parser.parser(codes); + return clzFile; + } + -} \ No newline at end of file +} + + + + \ No newline at end of file diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java index a0ba195077..c419db3033 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java @@ -1,19 +1,38 @@ package com.coding.basic.homework_04.jvm.test; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.clz.ClassIndex; +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.MethodRefInfo; +import com.coding.basic.homework_04.jvm.info.NameAndTypeInfo; +import com.coding.basic.homework_04.jvm.info.UTF8Info; import com.coding.basic.homework_04.jvm.loader.ClassFileLoader; + + public class ClassFileloaderTest { + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; static String path1 = "C:\\Users\\yanght\\Documents\\mygit\\coding2017-1\\group06\\1454385822\\bin"; static String path2 = "D:\temp"; - - + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coding.basic.homework_04.jvm.test.EmployeeV2"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } @Before public void setUp() throws Exception { @@ -42,13 +61,12 @@ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coding.basic.homework_04.jvm.test.EmployeeV1"; -// String className = "EmployeeV1"; + String className = "com.coding.basic.homework_04.jvm.test.EmployeeV2"; byte[] byteCodes = loader.readBinaryCode(className); // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1084, byteCodes.length); + Assert.assertEquals(1056, byteCodes.length); } @@ -57,7 +75,7 @@ public void testClassFileLength() { public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coding.basic.homework_04.jvm.test.EmployeeV1"; + String className = "com.coding.basic.homework_04.jvm.test.EmployeeV2"; byte[] byteCodes = loader.readBinaryCode(className); byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; @@ -86,4 +104,172 @@ private String byteToHexString(byte[] codes ){ return buffer.toString(); } + + + /** + * ---------------------------------------------------------------------- + */ + + + @Test + public void testVersion(){ + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool(){ + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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.getClass_index()); + Assert.assertEquals(13, methodRef.getNameAndType_index()); + } + + { + NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13); + Assert.assertEquals(9, nameAndType.getClz_index()); + Assert.assertEquals(14, nameAndType.getDescriptor_index()); + } + //抽查几个吧 + { + MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45); + Assert.assertEquals(1, methodRef.getClass_index()); + Assert.assertEquals(46, methodRef.getNameAndType_index()); + } + + { + 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + //@Test +// public void testReadFields(){ +// +// List fields = clzFile.getFields(); +// Assert.assertEquals(2, fields.size()); +// { +// Field f = fields.get(0); +// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); +// } +// { +// Field f = fields.get(1); +// Assert.assertEquals("age:I", f.toString()); +// } +// } +// //@Test +// public void testMethods(){ +// +// List methods = clzFile.getMethods(); +// ConstantPool pool = clzFile.getConstantPool(); +// +// { +// Method m = methods.get(0); +// assertMethodEquals(pool,m, +// "", +// "(Ljava/lang/String;I)V", +// "2ab7000c2a2bb5000f2a1cb50011b1"); +// +// } +// { +// Method m = methods.get(1); +// assertMethodEquals(pool,m, +// "setName", +// "(Ljava/lang/String;)V", +// "2a2bb5000fb1"); +// +// } +// { +// Method m = methods.get(2); +// assertMethodEquals(pool,m, +// "setAge", +// "(I)V", +// "2a1bb50011b1"); +// } +// { +// Method m = methods.get(3); +// assertMethodEquals(pool,m, +// "sayHello", +// "()V", +// "b2001c1222b60024b1"); +// +// } +// { +// Method m = methods.get(4); +// assertMethodEquals(pool,m, +// "main", +// "([Ljava/lang/String;)V", +// "bb000159122b101db7002d4c2bb6002fb1"); +// } +// } +// +// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ +// String methodName = pool.getUTF8String(m.getNameIndex()); +// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); +// String code = m.getCodeAttr().getCode(); +// Assert.assertEquals(expectedName, methodName); +// Assert.assertEquals(expectedDesc, methodDesc); +// Assert.assertEquals(expectedCode, code); +// } + + } \ No newline at end of file diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/ByteCodeIterator.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/ByteCodeIterator.java new file mode 100644 index 0000000000..c4518aa650 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/ByteCodeIterator.java @@ -0,0 +1,56 @@ +package com.coding.basic.homework_04.jvm.util; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextUxToHexString(int len) throws UnsupportedEncodingException { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return new String(tmp, "utf8"); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/Util.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/Util.java new file mode 100644 index 0000000000..ce35c5a40d --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/Util.java @@ -0,0 +1,26 @@ +package com.coding.basic.homework_04.jvm.util; + +public class Util { + + public static int byteToInt(byte[] codes){ + String hexString = byteToHexString(codes); + return Integer.valueOf(hexString, 16).intValue(); + } + + public static String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i 0 ? false : true; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtil.java b/group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtil.java index d3fb5f3f08..224ba6e9b2 100644 --- a/group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtil.java +++ b/group06/1454385822/src/com/coding/basic/homework_05/stack/StackUtil.java @@ -1,5 +1,7 @@ package com.coding.basic.homework_05.stack; +import java.util.Stack; + public class StackUtil { @@ -7,12 +9,27 @@ public class StackUtil { * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 */ - public static Stack reverse(Stack s) { - Stack ss = new Stack(); - while(!s.isEmpty()){ - ss.push(s.pop()); + public static void reverse(Stack s) { + if(s.isEmpty()){ + return; } - return ss; + Object object = s.pop(); + reverse(s); + addToBottom(s, object); + } + /** + * 将Object放入到当前栈的底部 + * @param s + * @param object + */ + public static void addToBottom(Stack s, Object object){ + if(s.isEmpty()){ + s.push(object); + return; + } + Object tem = s.pop(); + addToBottom(s, object); + s.push(tem); } /** @@ -20,7 +37,7 @@ public static Stack reverse(Stack s) { * * @param o */ - public static Stack remove(Stack s,Object o) { + public static void remove(Stack s,Object o) { Stack ss = new Stack(); while(!s.isEmpty()){ Object object = s.peek(); @@ -30,7 +47,9 @@ public static Stack remove(Stack s,Object o) { ss.push(s.pop()); } } - return reverse(ss); + while(!ss.isEmpty()){ + s.push(ss.pop()); + } } /** @@ -57,7 +76,9 @@ public static Object[] getTop(Stack s,int len) { ss.push(s.pop()); } } - result[result.length - 1] = reverse(ss); + while(!ss.isEmpty()){ + s.push(ss.pop()); + } return result; } /** @@ -70,47 +91,29 @@ public static Object[] getTop(Stack s,int len) { */ public static boolean isValidPairs(String s){ Stack stack = new Stack(); - boolean flag = true; - char[] chars = s.toCharArray(); - for (char c : chars) { - if(c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}'){ - System.out.println(c); + for(int i = 0; i s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExpr.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExpr.java new file mode 100644 index 0000000000..c6212009bc --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExpr.java @@ -0,0 +1,18 @@ +package com.coding.basic.homework_06.expr; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + return 0.0f; + } + + + + +} \ No newline at end of file diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExprTest.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExprTest.java new file mode 100644 index 0000000000..49014889ac --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package com.coding.basic.homework_06.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file From bfa4908bcb67666705e24f9bc921e209b20897ee Mon Sep 17 00:00:00 2001 From: mengxz <82427129@qq.com> Date: Wed, 12 Apr 2017 18:33:19 +0800 Subject: [PATCH 120/552] homeword test Past codes . --- .../com/coderising/jvm/attr/CodeAttr.java | 4 + .../com/coderising/jvm/clz/ClassFile.java | 28 ++- .../coderising/jvm/constant/ClassInfo.java | 12 +- .../coderising/jvm/constant/ConstantPool.java | 24 ++- .../jvm/constant/MethodRefInfo.java | 26 +-- .../jvm/loader/ClassFileLoader.java | 29 ++- .../jvm/loader/ClassFileParser.java | 27 ++- .../com/coderising/jvm/method/Method.java | 48 +++-- .../jvm/loader/ClassFileLoaderTest.java | 180 ++++++++++++++++++ 9 files changed, 329 insertions(+), 49 deletions(-) diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java index bdf080d421..a05fb3c27f 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java @@ -2,6 +2,10 @@ public class CodeAttr extends AttributeInfo{ + private String code; + public String getCode() { + return code; + } public CodeAttr(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); // TODO Auto-generated constructor stub diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java index d1d3b4159d..fee1cc2415 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; @@ -17,6 +18,31 @@ public class ClassFile { private List fields = new ArrayList(); private List methods = new ArrayList(); + 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()); + + } + + public String getClassName(){ + int index = this.clzIndex.getThisClassIndex(); + ClassInfo c = (ClassInfo)pool.getConstantInfo(index); + return c.getClassName(); + } + public String getSuperClassName(){ + int index = this.clzIndex.getSuperClassIndex(); + ClassInfo c = (ClassInfo)pool.getConstantInfo(index); + return c.getClassName(); + } + /* + * getter setter + * + */ public int getMinorVersion() { return minorVersion; } @@ -49,7 +75,7 @@ public void setClzIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - public ConstantPool getPool() { + public ConstantPool getConstantPool() { return pool; } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java index c0d67993ed..772ec3f1e0 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java @@ -2,23 +2,23 @@ public class ClassInfo extends ConstantInfo { private int type = CLASS_INFO;// u1 tag - private int name_index;// u2 name_index + private int utf8Index;// u2 name_index @Override public int getType() { return type; } - public int getName_index() { - return name_index; + public int getUtf8Index() { + return utf8Index; } - public void setName_index(int name_index) { - this.name_index = name_index; + public void setUtf8Index(int name_index) { + this.utf8Index = name_index; } public String getClassName() { - int name_index = getName_index(); + int name_index = getUtf8Index(); UTF8Info utf8 = (UTF8Info) this.constantPool .getConstantInfo(name_index); return utf8.getValue(); diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java index 179b5ad9bf..009b2c45c4 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java @@ -5,16 +5,8 @@ public class ConstantPool { private List cl = new ArrayList(); - private int constant_pool_size; + private int constantPoolSize; - public int getConstant_pool_size() { - return constant_pool_size; - } - - public void setConstant_pool_size(int constant_pool_size) { - this.constant_pool_size = constant_pool_size; - } - public void addConstantInfo(ConstantInfo e){ cl.add(e); } @@ -26,4 +18,18 @@ public ConstantInfo getConstantInfo(int index) { public int getSize() { return cl.size() - 1;// 减去常量池的长度一项 } + /* + * getter setter + */ + public int getConstantPoolSize() { + return constantPoolSize; + } + + public void setConstantPoolSize(int constantPoolSize) { + this.constantPoolSize = constantPoolSize; + } + + public String getUTF8String(int nameIndex) { + return ((UTF8Info)getConstantInfo(nameIndex)).getValue(); + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java index 86a199808b..4064e09b39 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java @@ -2,45 +2,45 @@ public class MethodRefInfo extends ConstantInfo { private int type = METHOD_INFO;//u1 tag - private int class_index;//u2 class_index - private int name_and_type_index;//u2 name_and_type_index + private int classInfoIndex;//u2 class_index + private int nameAndTypeIndex;//u2 name_and_type_index @Override public int getType() { return type; } - public int getClass_index() { - return class_index; + public int getClassInfoIndex() { + return classInfoIndex; } - public void setClass_index(int class_index) { - this.class_index = class_index; + public void setClassInfoIndex(int class_index) { + this.classInfoIndex = class_index; } - public int getName_and_type_index() { - return name_and_type_index; + public int getNameAndTypeIndex() { + return nameAndTypeIndex; } - public void setName_and_type_index(int name_and_type_index) { - this.name_and_type_index = name_and_type_index; + public void setNameAndTypeIndex(int name_and_type_index) { + this.nameAndTypeIndex = name_and_type_index; } public String getClassName() { ClassInfo c = (ClassInfo) this.constantPool - .getConstantInfo(class_index); + .getConstantInfo(classInfoIndex); return c.getClassName(); } public String getMethodName() { NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool - .getConstantInfo(name_and_type_index); + .getConstantInfo(nameAndTypeIndex); return nt.getName(); } public String getParamsAndReturnType() { NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool - .getConstantInfo(name_and_type_index); + .getConstantInfo(nameAndTypeIndex); return nt.getTypeInfo(); } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java index d8818219ed..0c02adef66 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -8,10 +8,29 @@ import java.util.ArrayList; import java.util.List; +import com.coderising.jvm.clz.ClassFile; + public class ClassFileLoader { private static final int BUFFERSIZE = 1024; private List clzPaths = new ArrayList(); + /** + * 装载class文件 + * 读取二进制字节流,并解析成ClassFile对象 + * @param className + * @return ClassFile + */ + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + } + + /** + * 从.class文件读取二进制字节流 + * @param className + * @return + */ public byte[] readBinaryCode(String className) { if (clzPaths.size()<=0){ return null; @@ -36,7 +55,7 @@ public byte[] readBinaryCode(String className) { /** * 文件读取二进制字节流 * @param f - * @return + * @return byte[] * @throws FileNotFoundException */ private byte[] readFile(File f) throws FileNotFoundException { @@ -63,10 +82,18 @@ private byte[] readFile(File f) throws FileNotFoundException { return baos.toByteArray(); } + /** + * 增加类加载路径,加载时按增加时的先后顺序加载 + * @param path + */ public void addClassPath(String path) { clzPaths.add(path); } + /** + * 获取类加载路径 + * @return + */ public String getClassPath() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < clzPaths.size(); i++) { diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java index 888dfe4817..87f748c2d0 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java @@ -12,6 +12,7 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; public class ClassFileParser { /** @@ -59,7 +60,7 @@ public ClassIndex parseClassIndex(ByteCodeIterator itr) { public ConstantPool parseConstantPool(ByteCodeIterator itr) { int count = itr.nextU2toInt(); ConstantPool pool = new ConstantPool(); - pool.setConstant_pool_size(count); + pool.setConstantPoolSize(count);; pool.addConstantInfo(new NullConstantInfo());// 占住常量池的第一个,常量池是的index从1开始 for (int i = 1; i < count; i++) { @@ -67,7 +68,7 @@ public ConstantPool parseConstantPool(ByteCodeIterator itr) { switch (tag) { case ConstantInfo.CLASS_INFO: ClassInfo classInfo = new ClassInfo(); - classInfo.setName_index(itr.nextU2toInt()); + classInfo.setUtf8Index(itr.nextU2toInt()); pool.addConstantInfo(classInfo); break; @@ -95,8 +96,8 @@ public ConstantPool parseConstantPool(ByteCodeIterator itr) { case ConstantInfo.METHOD_INFO: MethodRefInfo m = new MethodRefInfo(); - m.setClass_index(itr.nextU2toInt()); - m.setName_and_type_index(itr.nextU2toInt()); + m.setClassInfoIndex(itr.nextU2toInt()); + m.setNameAndTypeIndex(itr.nextU2toInt()); pool.addConstantInfo(m); break; @@ -127,4 +128,22 @@ public ConstantPool parseConstantPool(ByteCodeIterator itr) { } return pool; } + /** + * 读取字段 + * @param itr + * @return + */ + public Field parseField(ByteCodeIterator itr){ + + return null; + } + /** + * 读取方法 + * @param itr + * @return + */ + public Field parseMethod(ByteCodeIterator itr){ + + return null; + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java index 8a876551a0..456e5d9f94 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java @@ -1,27 +1,45 @@ package com.coderising.jvm.method; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; + public class Method { - private int access_flags; - private int name_index; - private int type_index; + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private CodeAttr codeAttr; - public int getAccess_flags() { - return access_flags; + private ClassFile clzFile; + /* + * getter setter + */ + public int getAccessFlag() { + return accessFlag; + } + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + public int getNameIndex() { + return nameIndex; } - public void setAccess_flags(int access_flags) { - this.access_flags = access_flags; + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; } - public int getName_index() { - return name_index; + public int getDescriptorIndex() { + return descriptorIndex; } - public void setName_index(int name_index) { - this.name_index = name_index; + public void setDescriptorIndex(int descriptorIndex) { + this.descriptorIndex = descriptorIndex; } - public int getType_index() { - return type_index; + public CodeAttr getCodeAttr() { + return codeAttr; } - public void setType_index(int type_index) { - this.type_index = type_index; + public void setCodeAttr(CodeAttr codeAttr) { + this.codeAttr = codeAttr; } + public ClassFile getClzFile() { + return clzFile; + } + } diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java index e2ed056cc3..194db3cba0 100644 --- a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java +++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java @@ -1,13 +1,35 @@ package com.coderising.jvm.loader; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + public class ClassFileLoaderTest { + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; static String path2 = "D:\\workProgram\\GitRepo\\coding2017\\group17\\82427129\\JavaUtil\\target\\classes"; + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path2); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } @Before public void setUp() throws Exception { } @@ -55,7 +77,93 @@ public void testMagicNumber(){ Assert.assertEquals("cafebabe", acctualValue); } + + @Test + public void testVersion(){ + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + } + + @Test + public void testConstantPool(){ + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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.getName_index()); + Assert.assertEquals(14, nameAndType.getDescriptor_index()); + } + //抽查几个吧 + { + 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()); + } + private String byteToHexString(byte[] codes) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < codes.length; i++) { @@ -69,5 +177,77 @@ private String byteToHexString(byte[] codes) { } return buffer.toString(); } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } From 17df039e0366f8f551d828fec668bcd41457067e Mon Sep 17 00:00:00 2001 From: gongxun Date: Wed, 12 Apr 2017 18:58:48 +0800 Subject: [PATCH 121/552] =?UTF-8?q?=E5=AE=8C=E6=88=90jvm=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E6=B1=A0=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../3.26/jvm_1/ClassFileloaderTest.java | 2 +- .../4.5/iterator/ByteCodeIterator.java | 10 ++ .../785396327/4.5/parse/ClassFilePaser.java | 53 ++++++- group17/785396327/4.5/stack/MyStack.java | 35 +++++ group17/785396327/4.5/stack/StackUtil.java | 115 +++++++++++++++ .../785396327/4.5/stack/StackUtilTest.java | 101 +++++++++++++ .../4.5/test/ClassFileloaderTest.java | 135 +++++++++--------- group17/785396327/4.5/util/Util.java | 2 - 8 files changed, 379 insertions(+), 74 deletions(-) create mode 100644 group17/785396327/4.5/stack/MyStack.java create mode 100644 group17/785396327/4.5/stack/StackUtil.java create mode 100644 group17/785396327/4.5/stack/StackUtilTest.java diff --git a/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java b/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java index 067cd93c2b..5a298da661 100644 --- a/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java +++ b/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java @@ -9,7 +9,7 @@ * Created by william on 2017/4/5. */ public class ClassFileloaderTest { - static String path1 = "D:\\workspace\\IDEA\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; + static String path1 = "G:\\Git\\homework\\coding2017\\group17\\785396327\\3.12\\out\\production\\785396327"; static String path2 = "C:\temp"; diff --git a/group17/785396327/4.5/iterator/ByteCodeIterator.java b/group17/785396327/4.5/iterator/ByteCodeIterator.java index 7157d01a2c..904537b00d 100644 --- a/group17/785396327/4.5/iterator/ByteCodeIterator.java +++ b/group17/785396327/4.5/iterator/ByteCodeIterator.java @@ -1,5 +1,6 @@ package iterator; +import org.junit.Test; import util.Util; import java.util.Arrays; @@ -37,4 +38,13 @@ public int nextU1ToInt() { codes = Arrays.copyOfRange(codes, 1, codes.length); return Util.byteToInt(buff); } + + public byte[] nextLengthBytes(int length) { + byte[] result = new byte[length]; + for (int i = 0; i < length; i++) { + result[i] = codes[i]; + } + codes = Arrays.copyOfRange(codes, length, codes.length); + return result; + } } diff --git a/group17/785396327/4.5/parse/ClassFilePaser.java b/group17/785396327/4.5/parse/ClassFilePaser.java index 3ddd9df6c3..4e3053e78f 100644 --- a/group17/785396327/4.5/parse/ClassFilePaser.java +++ b/group17/785396327/4.5/parse/ClassFilePaser.java @@ -1,11 +1,12 @@ package parse; +import clz.AccessFlag; import clz.ClassFile; -import constant.ClassInfo; -import constant.ConstantInfo; -import constant.ConstantPool; -import constant.NullConstantInfo; +import clz.ClassIndex; +import com.sun.corba.se.impl.orbutil.closure.Constant; +import constant.*; import iterator.ByteCodeIterator; +import util.Util; /** * Created by IBM on 2017/4/11. @@ -27,9 +28,26 @@ public ClassFile parse(byte[] codes) { ConstantPool constantPool = parseConstantPool(iterator); classFile.setConstPool(constantPool); + AccessFlag accessFlag = parseAccessFlag(iterator); + classFile.setAccessFlag(accessFlag); + + ClassIndex classIndex = parseClassIndex(iterator); + classFile.setClassIndex(classIndex); return classFile; } + private ClassIndex parseClassIndex(ByteCodeIterator iterator) { + ClassIndex classIndex = new ClassIndex(); + classIndex.setThisClassIndex(iterator.nextU2ToInt()); + classIndex.setSuperClassIndex(iterator.nextU2ToInt()); + return classIndex; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iterator) { + AccessFlag accessFlag = new AccessFlag(iterator.nextU2ToInt()); + return accessFlag; + } + private ConstantPool parseConstantPool(ByteCodeIterator iterator) { int poolSize = iterator.nextU2ToInt(); System.out.println("constant pool size = " + (poolSize - 1)); @@ -43,6 +61,33 @@ private ConstantPool parseConstantPool(ByteCodeIterator iterator) { ClassInfo classInfo = new ClassInfo(constantPool); classInfo.setUtf8Index(iterator.nextU2ToInt()); constantPool.addConstantInfo(classInfo); + } else if (tag == ConstantInfo.METHOD_INFO) { + MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool); + methodRefInfo.setClassInfoIndex(iterator.nextU2ToInt()); + methodRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt()); + constantPool.addConstantInfo(methodRefInfo); + } else if (tag == ConstantInfo.FIELD_INFO) { + FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool); + fieldRefInfo.setClassInfoIndex(iterator.nextU2ToInt()); + fieldRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt()); + constantPool.addConstantInfo(fieldRefInfo); + } else if (tag == ConstantInfo.STRING_INFO) { + StringInfo stringInfo = new StringInfo(constantPool); + stringInfo.setIndex(iterator.nextU2ToInt()); + constantPool.addConstantInfo(stringInfo); + } else if (tag == ConstantInfo.NAME_AND_TYPE_INFO) { + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool); + nameAndTypeInfo.setIndex1(iterator.nextU2ToInt()); + nameAndTypeInfo.setIndex2(iterator.nextU2ToInt()); + constantPool.addConstantInfo(nameAndTypeInfo); + } else if (tag == ConstantInfo.UTF8_INFO) { + UTF8Info utf8Info = new UTF8Info(constantPool); + int length = iterator.nextU2ToInt(); + utf8Info.setLength(length); + utf8Info.setValue(new String(iterator.nextLengthBytes(length))); + constantPool.addConstantInfo(utf8Info); + } else { + System.out.println("other class info "); } } return constantPool; diff --git a/group17/785396327/4.5/stack/MyStack.java b/group17/785396327/4.5/stack/MyStack.java new file mode 100644 index 0000000000..80ee0fdd62 --- /dev/null +++ b/group17/785396327/4.5/stack/MyStack.java @@ -0,0 +1,35 @@ +package stack; + +import java.util.ArrayList; + +/** + * Created by gongxun on 2017/4/12. + */ +public class MyStack { + private ArrayList elementData = new ArrayList(); + + public void push(T o) { + elementData.add(0, o); + } + + public T pop() { + return elementData.remove(0); + } + + public T peek() { + return elementData.get(0); + } + + public boolean isEmpty() { + return elementData.isEmpty(); + } + + public int size() { + return elementData.size(); + } + + @Override + public String toString() { + return elementData.toString(); + } +} diff --git a/group17/785396327/4.5/stack/StackUtil.java b/group17/785396327/4.5/stack/StackUtil.java new file mode 100644 index 0000000000..aa821a50ae --- /dev/null +++ b/group17/785396327/4.5/stack/StackUtil.java @@ -0,0 +1,115 @@ +package stack; + +/** + * Created by gongxun on 2017/4/12. + */ +public class StackUtil { + public static void bad_reverse(MyStack s) { + + } + + + public static void reverse_247565311(MyStack s) { + + } + + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(MyStack s) { + MyStack tempStack = new MyStack(); + while (!s.isEmpty()) + addToBottom(tempStack, s.pop()); + while (!tempStack.isEmpty()) + s.push(tempStack.pop()); + } + + public static void addToBottom(MyStack s, Integer value) { + MyStack reserveStack = new MyStack(); + while (!s.isEmpty()) + reserveStack.push(s.pop()); + s.push(value); + while (!reserveStack.isEmpty()) + s.push(reserveStack.pop()); + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(MyStack s, Object o) { + if (null == o) + return; + MyStack tempStack = new MyStack(); + while (!s.isEmpty()) { + if (!s.peek().equals(o)) { + tempStack.push(s.pop()); + } else { + s.pop(); + break; + } + } + while (!tempStack.isEmpty()) + s.push(tempStack.pop()); + } + + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(MyStack s, int len) { + if (len > s.size()) + return null; + Object[] datas = new Object[len]; + for (int i = 0; i < len; i++) { + datas[i] = s.pop(); + } + return datas; + } + + /** + * 字符串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) { + if (s == null || s.trim().isEmpty()) + return false; + String[] arr = s.split(""); + MyStack stack = new MyStack(); + for (int i = 0; i < arr.length; i++) { + if ("(".equals(arr[i]) || "[".equals(arr[i]) || "{".equals(arr[i])) + stack.push(arr[i]); + if (")".equals(arr[i])) { + if (stack.peek().equals("(")) + stack.pop(); + else + return false; + } + if ("]".equals(arr[i])) { + if (stack.peek().equals("[")) + stack.pop(); + else + return false; + } + if ("}".equals(arr[i])) { + if (stack.peek().equals("{")) + stack.pop(); + else + return false; + } + } + return true; + } +} diff --git a/group17/785396327/4.5/stack/StackUtilTest.java b/group17/785396327/4.5/stack/StackUtilTest.java new file mode 100644 index 0000000000..bf411a953a --- /dev/null +++ b/group17/785396327/4.5/stack/StackUtilTest.java @@ -0,0 +1,101 @@ +package stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/12. + */ +public class StackUtilTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + /** + * [头元素,...,尾元素] + */ + @Test + public void testStack() { + MyStack stack = new MyStack(); + stack.push(1); + stack.push(2); + System.out.println(stack); + } + + @Test + public void testAddToBottom() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[3, 2, 1, 0]", s.toString()); + + } + + @Test + public void testReverse() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + } + + @Test + public void testReverse_247565311() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + + Assert.assertEquals("[1, 2, 3]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[3, 1]", s.toString()); + } + + @Test + public void testGetTop() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java index 8c15346ca4..9f76c4ccbc 100644 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -1,6 +1,7 @@ package test; import clz.ClassFile; +import clz.ClassIndex; import constant.*; import jvm_1.ClassFileLoader; import org.junit.After; @@ -14,9 +15,9 @@ * Created by IBM on 2017/4/10. */ public class ClassFileloaderTest { - private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + private static final String FULL_QUALIFIED_CLASS_NAME = "jvm_1/EmployeeV1"; - static String path1 = "D:\\workspace\\IDEA\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; + static String path1 = "G:\\Git\\homework\\coding2017\\group17\\785396327\\3.12\\out\\production\\785396327"; static String path2 = "C:\temp"; static ClassFile clzFile = null; @@ -106,7 +107,7 @@ private String byteToHexString(byte[] codes ){ public void testVersion(){ Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); + Assert.assertEquals(51, clzFile.getMajorVersion()); } @@ -116,78 +117,78 @@ public void testConstantPool(){ ConstantPool pool = clzFile.getConstantPool(); -// Assert.assertEquals(53, pool.getSize()); + Assert.assertEquals(53, pool.getSize()); { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); - Assert.assertEquals(2, clzInfo.getUtf8Index()); + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(7); + Assert.assertEquals(44, clzInfo.getUtf8Index()); -// UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); -// Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(44); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(11); + Assert.assertEquals(48, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(48); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(12); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(13); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(14); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(15); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(16); + Assert.assertEquals("", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(17); + Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(18); + Assert.assertEquals("Code", utf8Info.getValue()); + } + + { + MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(1); + Assert.assertEquals(11, methodRef.getClassInfoIndex()); + Assert.assertEquals(36, 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()); } -// { -// ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); -// Assert.assertEquals(4, clzInfo.getUtf8Index()); -// -// UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); -// Assert.assertEquals("java/lang/Object", utf8Info.getValue()); -// } -// { -// UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); -// Assert.assertEquals("name", utf8Info.getValue()); -// -// utf8Info = (UTF8Info) pool.getConstantInfo(6); -// Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); -// -// utf8Info = (UTF8Info) pool.getConstantInfo(7); -// Assert.assertEquals("age", utf8Info.getValue()); -// -// utf8Info = (UTF8Info) pool.getConstantInfo(8); -// Assert.assertEquals("I", utf8Info.getValue()); -// -// utf8Info = (UTF8Info) pool.getConstantInfo(9); -// Assert.assertEquals("", 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()); + 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/group17/785396327/4.5/util/Util.java b/group17/785396327/4.5/util/Util.java index f2e2b3d859..9b95c51ec4 100644 --- a/group17/785396327/4.5/util/Util.java +++ b/group17/785396327/4.5/util/Util.java @@ -1,7 +1,5 @@ package util; -import constant.ConstantPool; - /** * Created by IBM on 2017/4/10. */ From 8d67f91586b6b2fdfe7026eb68ed71ece86da0f5 Mon Sep 17 00:00:00 2001 From: sawyerwu <664269713@qq.com> Date: Wed, 12 Apr 2017 19:43:25 +0800 Subject: [PATCH 122/552] mini-jvm 2 --- .../src/com/ace/coding/StackUtil.java | 102 +++++++++++++ .../src/com/ace/jvm/clz/AccessFlag.java | 25 ++++ .../src/com/ace/jvm/clz/ClassFile.java | 75 ++++++++++ .../src/com/ace/jvm/clz/ClassIndex.java | 19 +++ .../src/com/ace/jvm/constant/ClassInfo.java | 24 ++++ .../com/ace/jvm/constant/ConstantInfo.java | 29 ++++ .../com/ace/jvm/constant/ConstantPool.java | 29 ++++ .../com/ace/jvm/constant/FieldRefInfo.java | 54 +++++++ .../com/ace/jvm/constant/MethodRefInfo.java | 55 +++++++ .../com/ace/jvm/constant/NameAndTypeInfo.java | 45 ++++++ .../ace/jvm/constant/NullConstantInfo.java | 13 ++ .../src/com/ace/jvm/constant/StringInfo.java | 26 ++++ .../src/com/ace/jvm/constant/UTF8Info.java | 32 +++++ .../com/ace/jvm/loader/ByteCodeIterator.java | 40 ++++++ .../com/ace/jvm/loader/ClassFileLoader.java | 8 +- .../com/ace/jvm/loader/ClassFileParser.java | 134 ++++++++++++++++++ .../com/ace/jvm/test/ClassFileloaderTest.java | 108 +++++++++++++- .../src/com/ace/jvm/util/Util.java | 24 ++++ 18 files changed, 839 insertions(+), 3 deletions(-) create mode 100644 group03/664269713/DataStructure/src/com/ace/coding/StackUtil.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/clz/AccessFlag.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/clz/ClassFile.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/clz/ClassIndex.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/ClassInfo.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/ConstantInfo.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/ConstantPool.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/FieldRefInfo.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/MethodRefInfo.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/NameAndTypeInfo.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/NullConstantInfo.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/StringInfo.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/constant/UTF8Info.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/loader/ByteCodeIterator.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileParser.java create mode 100644 group03/664269713/DataStructure/src/com/ace/jvm/util/Util.java diff --git a/group03/664269713/DataStructure/src/com/ace/coding/StackUtil.java b/group03/664269713/DataStructure/src/com/ace/coding/StackUtil.java new file mode 100644 index 0000000000..12c6636b1d --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/coding/StackUtil.java @@ -0,0 +1,102 @@ +package com.ace.coding; + +public class StackUtil { + + /** + * 鍋囪鏍堜腑鐨勫厓绱犳槸Integer, 浠庢爤椤跺埌鏍堝簳鏄� : 5,4,3,2,1 璋冪敤璇ユ柟娉曞悗锛� 鍏冪礌娆″簭鍙樹负: + * 1,2,3,4,5 娉ㄦ剰锛氬彧鑳戒娇鐢⊿tack鐨勫熀鏈搷浣滐紝鍗硃ush,pop,peek,isEmpty锛� + * 鍙互浣跨敤鍙﹀涓�涓爤鏉ヨ緟鍔� + */ + public static void reverse(Stack s) { + if (s.size() == 0) { + return; + } + int last = getLast(s); + reverse(s); + s.push(last); + } + + public static int getLast(Stack s) { + int top = (int) s.pop(); + + if (s.size() == 0) { + return top; + } else { + int last = getLast(s); + s.push(top); + return last; + } + } + + /** + * 鍒犻櫎鏍堜腑鐨勬煇涓厓绱� 娉ㄦ剰锛氬彧鑳戒娇鐢⊿tack鐨勫熀鏈搷浣滐紝鍗硃ush,pop,peek,isEmpty锛� + * 鍙互浣跨敤鍙﹀涓�涓爤鏉ヨ緟鍔� + * + * @param o + */ + public static void remove(Stack s, Object o) { + Stack newStack = new Stack(); + for (int i = 0; i < s.size(); i++) { + Object obj = s.pop(); + if (obj == o) { + break; + } + newStack.push(obj); + } + + for (int j = 0; j < newStack.size(); j++) { + Object obj = newStack.pop(); + s.push(obj); + } + } + + /** + * 浠庢爤椤跺彇寰條en涓厓绱�, 鍘熸潵鐨勬爤涓厓绱犱繚鎸佷笉鍙� + * 娉ㄦ剰锛氬彧鑳戒娇鐢⊿tack鐨勫熀鏈搷浣滐紝鍗硃ush,pop,peek,isEmpty锛� 鍙互浣跨敤鍙﹀涓�涓爤鏉ヨ緟鍔� + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + Object[] objArr = new Object[len]; + Stack newStack = new Stack(); + + for (int i = 0; i < len; i++) { + Object obj = s.pop(); + objArr[i] = obj; + newStack.push(obj); + } + + for (int j = 0; j < len; j++) { + Object obj = newStack.pop(); + s.push(obj); + } + + return objArr; + } + + /** + * 瀛楃涓瞫 鍙兘鍖呭惈杩欎簺瀛楃锛� ( ) [ ] { }, a,b,c... x,yz + * 浣跨敤鍫嗘爤妫�鏌ュ瓧绗︿覆s涓殑鎷彿鏄笉鏄垚瀵瑰嚭鐜扮殑銆� 渚嬪s = "([e{d}f])" , + * 鍒欒瀛楃涓蹭腑鐨勬嫭鍙锋槸鎴愬鍑虹幇锛� 璇ユ柟娉曡繑鍥瀟rue 濡傛灉 s = "([b{x]y})", + * 鍒欒瀛楃涓蹭腑鐨勬嫭鍙蜂笉鏄垚瀵瑰嚭鐜扮殑锛� 璇ユ柟娉曡繑鍥瀎alse; + * + * @param s + * @return + */ + public static boolean isValidPairs(String s) { + Stack stack = new Stack(); + int len = s.length(); + for (int i = 0; i < len; i++) { + stack.push(s.charAt(i)); + } + StringBuilder stringBuilder = new StringBuilder(); + + for (int j = 0; j < stack.size(); j++) { + stringBuilder.append(stack.pop()); + } + + return stringBuilder.toString().equals(s); + } + +} diff --git a/group03/664269713/DataStructure/src/com/ace/jvm/clz/AccessFlag.java b/group03/664269713/DataStructure/src/com/ace/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..744f7eeadb --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/clz/ClassFile.java b/group03/664269713/DataStructure/src/com/ace/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..98f0539fc7 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.ace.jvm.clz; + +import com.ace.jvm.constant.ClassInfo; +import com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/clz/ClassIndex.java b/group03/664269713/DataStructure/src/com/ace/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..421ae7ef42 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/constant/ClassInfo.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..2e6cf0c08e --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/constant/ConstantInfo.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..1c67f67c4a --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/constant/ConstantPool.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..c067852a99 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/constant/FieldRefInfo.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..6b04332521 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/constant/MethodRefInfo.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..1eb5b0e0a4 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/constant/NameAndTypeInfo.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..b7a8125b92 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/constant/NullConstantInfo.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..b9adf49ac6 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.ace.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group03/664269713/DataStructure/src/com/ace/jvm/constant/StringInfo.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..d027a02c87 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/constant/UTF8Info.java b/group03/664269713/DataStructure/src/com/ace/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..75d0695236 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.ace.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/group03/664269713/DataStructure/src/com/ace/jvm/loader/ByteCodeIterator.java b/group03/664269713/DataStructure/src/com/ace/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..42f779a0c4 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,40 @@ +package com.ace.jvm.loader; + +import java.util.Arrays; + +import com.ace.jvm.util.Util; + +public class ByteCodeIterator { + private int pos = 0; + private byte[] codes; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public byte[] getBytes(int len) { + if (pos + len > codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos = pos + len; + return data; + } + + public int nextU1ToInt() { + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } +} diff --git a/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileLoader.java b/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileLoader.java index a6f34271e3..7558f1d303 100644 --- a/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileLoader.java +++ b/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileLoader.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; +import com.ace.jvm.clz.ClassFile; + public class ClassFileLoader { @@ -55,7 +57,11 @@ public String getClassPath(){ return sb.toString(); } - + public ClassFile loadClass(String className){ + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + } diff --git a/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileParser.java b/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..845671a600 --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/loader/ClassFileParser.java @@ -0,0 +1,134 @@ +package com.ace.jvm.loader; + +import java.io.UnsupportedEncodingException; + +import com.ace.jvm.clz.AccessFlag; +import com.ace.jvm.clz.ClassFile; +import com.ace.jvm.clz.ClassIndex; +import com.ace.jvm.constant.ClassInfo; +import com.ace.jvm.constant.ConstantPool; +import com.ace.jvm.constant.FieldRefInfo; +import com.ace.jvm.constant.MethodRefInfo; +import com.ace.jvm.constant.NameAndTypeInfo; +import com.ace.jvm.constant.NullConstantInfo; +import com.ace.jvm.constant.StringInfo; +import com.ace.jvm.constant.UTF8Info; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + + String magicNum = iter.nextU4ToHexString(); + if (!"cafebabe".equals(magicNum)) { + return null; + } + + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex index = parseClassInfex(iter); + clzFile.setClassIndex(index); + + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + int flagValue = iter.nextU2ToInt(); + AccessFlag accessFlag = new AccessFlag(flagValue); + return accessFlag; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + ClassIndex classIndex = new ClassIndex(); + int thisClassIndex = iter.nextU2ToInt(); + classIndex.setThisClassIndex(thisClassIndex); + + int superClassIndex = iter.nextU2ToInt(); + classIndex.setSuperClassIndex(superClassIndex); + + return classIndex; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + ConstantPool pool = new ConstantPool(); + int poolCount = iter.nextU2ToInt(); + + pool.addConstantInfo(new NullConstantInfo()); + + for (int i = 1; i < poolCount - 1; i++) { + int tag = iter.nextU1ToInt(); + + if(tag == 7){ + int utf8Index = iter.nextU2ToInt(); + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(utf8Index); + + pool.addConstantInfo(classInfo); + } else if(tag == 1){ + int len = iter.nextU2ToInt(); + byte[] data = iter.getBytes(len); + String str = null; + try { + str = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + UTF8Info utf8Info = new UTF8Info(pool); + utf8Info.setLength(len); + utf8Info.setValue(str); + + pool.addConstantInfo(utf8Info); + } else if(tag == 8){ + StringInfo stringInfo = new StringInfo(pool); + int index = iter.nextU2ToInt(); + stringInfo.setIndex(index); + + pool.addConstantInfo(stringInfo); + } else if(tag == 9){ + FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); + int classInfoIndex = iter.nextU2ToInt(); + int nameAndTypeIndex = iter.nextU2ToInt(); + + fieldRefInfo.setClassInfoIndex(classInfoIndex); + fieldRefInfo.setNameAndTypeIndex(nameAndTypeIndex); + + pool.addConstantInfo(fieldRefInfo); + } else if(tag == 10){ + MethodRefInfo methodRefInfo = new MethodRefInfo(pool); + int classInfoIndex = iter.nextU2ToInt(); + int nameAndTypeIndex = iter.nextU2ToInt(); + + methodRefInfo.setClassInfoIndex(classInfoIndex); + methodRefInfo.setNameAndTypeIndex(nameAndTypeIndex); + + pool.addConstantInfo(methodRefInfo); + } else if(tag == 12){ + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + int index1 = iter.nextU2ToInt(); + int index2 = iter.nextU2ToInt(); + + nameAndTypeInfo.setIndex1(index1); + nameAndTypeInfo.setIndex2(index2); + + pool.addConstantInfo(nameAndTypeInfo); + } else { + throw new RuntimeException("the constant pool tag " + tag + " is not exist."); + } + + } + + return pool; + } + +} diff --git a/group03/664269713/DataStructure/src/com/ace/jvm/test/ClassFileloaderTest.java b/group03/664269713/DataStructure/src/com/ace/jvm/test/ClassFileloaderTest.java index 2079641d3b..496d19dc71 100644 --- a/group03/664269713/DataStructure/src/com/ace/jvm/test/ClassFileloaderTest.java +++ b/group03/664269713/DataStructure/src/com/ace/jvm/test/ClassFileloaderTest.java @@ -1,19 +1,36 @@ package com.ace.jvm.test; import org.junit.After; -import org.junit.Assert; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import com.ace.jvm.clz.ClassFile; +import com.ace.jvm.clz.ClassIndex; +import com.ace.jvm.constant.ClassInfo; +import com.ace.jvm.constant.ConstantPool; +import com.ace.jvm.constant.MethodRefInfo; +import com.ace.jvm.constant.NameAndTypeInfo; +import com.ace.jvm.constant.UTF8Info; import com.ace.jvm.loader.ClassFileLoader; public class ClassFileloaderTest { + private static final String FULL_QUALIFIED_CLASS_NAME = "com/ace/jvm/test/EmployeeV1"; static String path1 = "D:\\Upgrade\\coding2017\\group03\\664269713\\DataStructure\\bin"; static String path2 = "C:\temp"; + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.ace.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); +// clzFile.print(); + } @Before public void setUp() throws Exception { @@ -46,7 +63,7 @@ public void testClassFileLength() { byte[] byteCodes = loader.readBinaryCode(className); - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + // 娉ㄦ剰锛氳繖涓瓧鑺傛暟鍙兘鍜屼綘鐨凧VM鐗堟湰鏈夊叧绯伙紝 浣犲彲浠ョ湅鐪嬬紪璇戝ソ鐨勭被鍒板簳鏈夊澶� Assert.assertEquals(809, byteCodes.length); } @@ -85,4 +102,91 @@ private String byteToHexString(byte[] codes ){ return buffer.toString(); } + @Test + public void testVersion(){ + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool(){ + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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/group03/664269713/DataStructure/src/com/ace/jvm/util/Util.java b/group03/664269713/DataStructure/src/com/ace/jvm/util/Util.java new file mode 100644 index 0000000000..fe7741649d --- /dev/null +++ b/group03/664269713/DataStructure/src/com/ace/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.ace.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 Date: Wed, 12 Apr 2017 20:09:36 +0800 Subject: [PATCH 123/552] jvm done --- group12/382266293/src/array/ArrayUtil.java | 256 +++++++++--------- .../382266293/src/array/ArrayUtilTest.java | 140 +++++----- .../coderising/download/DownloadThread.java | 23 +- .../com/coderising/download/DownloadUtil.java | 34 +-- .../coderising/download/FileDownloader.java | 98 +++---- .../download/FileDownloaderTest.java | 12 +- .../coderising/download/api/Connection.java | 30 +- .../download/impl/ConnectionImpl.java | 52 ++-- .../download/impl/ConnectionManagerImpl.java | 18 +- .../download/impl/DownloadUtil.java | 8 +- .../src/com/coderising/jvm/attr/CodeAttr.java | 76 +++--- .../coderising/jvm/attr/LineNumberTable.java | 50 +++- .../jvm/attr/LocalVariableItem.java | 30 +- .../jvm/attr/LocalVariableTable.java | 46 +++- .../coderising/jvm/attr/StackMapTable.java | 12 +- .../com/coderising/jvm/clz/AccessFlag.java | 18 +- .../src/com/coderising/jvm/clz/ClassFile.java | 78 +++--- .../com/coderising/jvm/clz/ClassIndex.java | 16 +- .../coderising/jvm/constant/ClassInfo.java | 21 +- .../coderising/jvm/constant/ConstantInfo.java | 8 +- .../coderising/jvm/constant/ConstantPool.java | 8 +- .../coderising/jvm/constant/FieldRefInfo.java | 48 ++-- .../jvm/constant/MethodRefInfo.java | 44 +-- .../jvm/constant/NameAndTypeInfo.java | 26 +- .../coderising/jvm/constant/StringInfo.java | 10 +- .../com/coderising/jvm/constant/UTF8Info.java | 19 +- .../src/com/coderising/jvm/field/Field.java | 42 ++- .../jvm/loader/ByteCodeIterator.java | 68 ++--- .../jvm/loader/ClassFileLoader.java | 72 ++--- .../jvm/loader/ClassFileParser.java | 71 +++-- .../src/com/coderising/jvm/method/Method.java | 81 +++--- .../jvm/test/ClassFileloaderTest.java | 143 +++++----- .../com/coderising/jvm/test/EmployeeV1.java | 20 +- .../src/com/coderising/jvm/util/Util.java | 10 +- .../coderising/litestruts/LoginAction.java | 24 +- .../src/litestruts/ActionXMLreader.java | 1 + .../src/litestruts/Configuration.java | 110 ++++---- group12/382266293/src/litestruts/Struts.java | 100 +++---- .../382266293/src/litestruts/StrutsTest.java | 20 +- group12/382266293/src/litestruts/View.java | 8 +- group12/382266293/src/test.java | 59 ++-- 41 files changed, 1034 insertions(+), 976 deletions(-) diff --git a/group12/382266293/src/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java index ea847fd386..0abca4577f 100644 --- a/group12/382266293/src/array/ArrayUtil.java +++ b/group12/382266293/src/array/ArrayUtil.java @@ -8,106 +8,38 @@ public class ArrayUtil { - /** - * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = - * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * - * @param origin - * @return - */ - public void reverseArray(int[] origin) { - - int temp; - int index = origin.length - 1; - int numbersToReverse = origin.length / 2; - for (int i = 0; i < numbersToReverse; i++) { - temp = origin[i]; - origin[i] = origin[index - i]; - origin[index - i] = temp; + public static void initialArray(int[] arr, int j) { + for (int i = 0; i < arr.length; i++) { + arr[i] = j; } } - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} - * - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray) { + public static boolean isPerfectNum(int num) { - BitSet check = new BitSet(oldArray.length); - boolean isZero; - for (int i = 0; i < oldArray.length; i++) { - isZero = (oldArray[i] == 0) ? true : false; - check.set(i, isZero); + int sum = 0; + for (int i = 1; i <= num / 2; i++) { + if (num % i == 0) + sum += i; } - int newSize = oldArray.length - check.cardinality(); - int[] newArr = new int[newSize]; - - int nextIndex = check.nextClearBit(0); - for (int i = 0; i < newSize; i++) { - newArr[i] = oldArray[nextIndex]; - nextIndex = check.nextClearBit(nextIndex + 1); - } + return (num == sum) ? true : false; - return newArr; } - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = - * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * - * @param array1 - * @param array2 - * @return - */ + public static boolean isPrime(int num) { - public int[] merge(int[] array1, int[] array2) { + if (num <= 1) + return false; - int len1 = array1.length; - int len2 = array2.length; - int len3 = array1[len1 - 1] < array2[len2 - 1] ? array2[len2 - 1] + 1 : array1[len1 - 1] + 1; - int[] newArr = new int[len3]; - initialArray(newArr, -1); - for (int i = 0; i < len1; i++) { - newArr[array1[i]] = 0; - } - for (int i = 0; i < len2; i++) { - newArr[array2[i]] = 0; - } - int mergedLength = 0; - for (int i = 0; i < len3; i++) { - if (newArr[i] != -1) - newArr[mergedLength++] = i; - } - return Arrays.copyOf(newArr, mergedLength); - } + if (num == 2) + return true; - public static void initialArray(int[] arr, int j) { - for (int i = 0; i < arr.length; i++) { - arr[i] = j; + for (int i = 2; i <= Math.sqrt(num) + 1; i++) { + if (num % i == 0) + return false; } - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * - * @param oldArray - * @param size - * @return - */ - public int[] grow(int[] oldArray, int size) { - int[] newArr = new int[oldArray.length + size]; - for (int i = 0; i < oldArray.length; i++) { - newArr[i] = oldArray[i]; - } - return newArr; + return true; } /** @@ -131,6 +63,30 @@ public int[] fibonacci(int max) { return Arrays.copyOf(result, ++count); } + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + + int count = 0; + ArrayList myList = new ArrayList(); + for (int i = 1; i < max; i++) { + if (isPerfectNum(i)) { + count++; + myList.add(i); + } + } + int[] result = new int[count]; + Iterator iterator = myList.iterator(); + for (int i = 0; i < count; i++) { + result[i] = iterator.next(); + } + return result; + } + /** * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] * @@ -154,73 +110,117 @@ public int[] getPrimes(int max) { return result; } - public static boolean isPrime(int num) { - - if (num <= 1) - return false; - - if (num == 2) - return true; + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { - for (int i = 2; i <= Math.sqrt(num) + 1; i++) { - if (num % i == 0) - return false; + int[] newArr = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArr[i] = oldArray[i]; } + return newArr; + } - return true; + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if (i < array.length - 1) + sb.append(seperator); + } + return sb.toString(); } /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 * - * @param max + * @param array1 + * @param array2 * @return */ - public int[] getPerfectNumbers(int max) { - int count = 0; - ArrayList myList = new ArrayList(); - for (int i = 1; i < max; i++) { - if (isPerfectNum(i)) { - count++; - myList.add(i); - } + public int[] merge(int[] array1, int[] array2) { + + int len1 = array1.length; + int len2 = array2.length; + int len3 = array1[len1 - 1] < array2[len2 - 1] ? array2[len2 - 1] + 1 : array1[len1 - 1] + 1; + int[] newArr = new int[len3]; + initialArray(newArr, -1); + for (int i = 0; i < len1; i++) { + newArr[array1[i]] = 0; } - int[] result = new int[count]; - Iterator iterator = myList.iterator(); - for (int i = 0; i < count; i++) { - result[i] = iterator.next(); + for (int i = 0; i < len2; i++) { + newArr[array2[i]] = 0; } - return result; + int mergedLength = 0; + for (int i = 0; i < len3; i++) { + if (newArr[i] != -1) + newArr[mergedLength++] = i; + } + return Arrays.copyOf(newArr, mergedLength); } - public static boolean isPerfectNum(int num) { + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ - int sum = 0; - for (int i = 1; i <= num / 2; i++) { - if (num % i == 0) - sum += i; + public int[] removeZero(int[] oldArray) { + + BitSet check = new BitSet(oldArray.length); + boolean isZero; + for (int i = 0; i < oldArray.length; i++) { + isZero = (oldArray[i] == 0) ? true : false; + check.set(i, isZero); } - return (num == sum) ? true : false; + int newSize = oldArray.length - check.cardinality(); + int[] newArr = new int[newSize]; + + int nextIndex = check.nextClearBit(0); + for (int i = 0; i < newSize; i++) { + newArr[i] = oldArray[nextIndex]; + nextIndex = check.nextClearBit(nextIndex + 1); + } + return newArr; } /** - * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] * - * @param array - * @param s + * @param origin * @return */ - public String join(int[] array, String seperator) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < array.length; i++) { - sb.append(array[i]); - if (i < array.length - 1) - sb.append(seperator); + public void reverseArray(int[] origin) { + + int temp; + int index = origin.length - 1; + int numbersToReverse = origin.length / 2; + for (int i = 0; i < numbersToReverse; i++) { + temp = origin[i]; + origin[i] = origin[index - i]; + origin[index - i] = temp; } - return sb.toString(); } } \ No newline at end of file diff --git a/group12/382266293/src/array/ArrayUtilTest.java b/group12/382266293/src/array/ArrayUtilTest.java index 031ef6c09b..d86ecde1fc 100644 --- a/group12/382266293/src/array/ArrayUtilTest.java +++ b/group12/382266293/src/array/ArrayUtilTest.java @@ -1,10 +1,14 @@ package array; -import static org.junit.Assert.*; -import static util.TestUtil.*; +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.assertArrayEquals; +import static util.TestUtil.getRandomIntArray; +import static util.TestUtil.getRandomNumber; + import java.util.Arrays; import java.util.Iterator; import java.util.TreeSet; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -25,43 +29,61 @@ public void tearDown() throws Exception { } @Test - public void testReverseArray() { + public void testFibonacci() { + int[] expected = new int[] { 1, 1, 2, 3, 5, 8, 13 }; + int[] acutal = new int[expected.length]; + actual = au.fibonacci(15); + assertArrayEquals(expected, actual); + } - int size = getRandomNumber(); - int[] expected = getRandomIntArray(size); - actual = Arrays.copyOf(expected, size); + @Test + public void testGetPerfectNumbers() { - au.reverseArray(actual); + int[] expected = new int[] { 6, 28, 496, 8128 }; + int[] acutal = new int[expected.length]; + actual = au.getPerfectNumbers(10000); + assertArrayEquals(expected, actual); + } - for (int i = 0; i < size; i++) { - assertEquals(expected[i], actual[size - 1 - i]); - } + @Test + public void testGetPrimes() { + int[] expected = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }; + int[] acutal = new int[expected.length]; + actual = au.getPrimes(23); + assertArrayEquals(expected, actual); } @Test - public void testRemoveZero() { + public void testGrow() { + int[] expected = getRandomIntArray(getRandomNumber()); + int growSize = getRandomNumber(); + int[] actual = au.grow(expected, growSize); - int size = getRandomNumber(10000); - int[] expected = getRandomIntArray(size); + assertEquals(expected.length + growSize, actual.length); - int zeros = getRandomNumber(size - 1); - TreeSet t = new TreeSet(); - while (t.size() != zeros) { - t.add(getRandomNumber(size)); + for (int i = 0; i < actual.length; i++) { + if (i < expected.length) { + assertEquals(expected[i], actual[i]); + } else { + assertEquals(0, actual[i]); + } } - for (Integer i : t) { - expected[i] = 0; - } + } - int expectedSize = size - zeros; - actual = au.removeZero(expected); - assertEquals(expectedSize, actual.length); + @Test + public void testJoin() { - for (int i = 0, j = 0; i < size; i++) { - if (expected[i] != 0) - assertEquals(expected[i], actual[j++]); + int[] expected = getRandomIntArray(getRandomNumber()); + String seperator = "-"; + String joinedString = au.join(expected, seperator); + + String[] actual = joinedString.split(seperator); + + assertEquals(expected.length, actual.length); + for (int i = 0; i < expected.length; i++) { + assertEquals(expected[i], Integer.parseInt(actual[i])); } } @@ -92,61 +114,43 @@ public void testMerge() { } @Test - public void testGrow() { - int[] expected = getRandomIntArray(getRandomNumber()); - int growSize = getRandomNumber(); - int[] actual = au.grow(expected, growSize); + public void testRemoveZero() { - assertEquals(expected.length + growSize, actual.length); + int size = getRandomNumber(10000); + int[] expected = getRandomIntArray(size); - for (int i = 0; i < actual.length; i++) { - if (i < expected.length) { - assertEquals(expected[i], actual[i]); - } else { - assertEquals(0, actual[i]); - } + int zeros = getRandomNumber(size - 1); + TreeSet t = new TreeSet(); + while (t.size() != zeros) { + t.add(getRandomNumber(size)); } - } - - @Test - public void testFibonacci() { - int[] expected = new int[] { 1, 1, 2, 3, 5, 8, 13 }; - int[] acutal = new int[expected.length]; - actual = au.fibonacci(15); - assertArrayEquals(expected, actual); - } - - @Test - public void testGetPrimes() { + for (Integer i : t) { + expected[i] = 0; + } - int[] expected = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }; - int[] acutal = new int[expected.length]; - actual = au.getPrimes(23); - assertArrayEquals(expected, actual); - } + int expectedSize = size - zeros; + actual = au.removeZero(expected); + assertEquals(expectedSize, actual.length); - @Test - public void testGetPerfectNumbers() { + for (int i = 0, j = 0; i < size; i++) { + if (expected[i] != 0) + assertEquals(expected[i], actual[j++]); + } - int[] expected = new int[] { 6, 28, 496, 8128 }; - int[] acutal = new int[expected.length]; - actual = au.getPerfectNumbers(10000); - assertArrayEquals(expected, actual); } @Test - public void testJoin() { + public void testReverseArray() { - int[] expected = getRandomIntArray(getRandomNumber()); - String seperator = "-"; - String joinedString = au.join(expected, seperator); + int size = getRandomNumber(); + int[] expected = getRandomIntArray(size); + actual = Arrays.copyOf(expected, size); - String[] actual = joinedString.split(seperator); + au.reverseArray(actual); - assertEquals(expected.length, actual.length); - for (int i = 0; i < expected.length; i++) { - assertEquals(expected[i], Integer.parseInt(actual[i])); + for (int i = 0; i < size; i++) { + assertEquals(expected[i], actual[size - 1 - i]); } } diff --git a/group12/382266293/src/com/coderising/download/DownloadThread.java b/group12/382266293/src/com/coderising/download/DownloadThread.java index 38f92f6677..11df6109e3 100644 --- a/group12/382266293/src/com/coderising/download/DownloadThread.java +++ b/group12/382266293/src/com/coderising/download/DownloadThread.java @@ -2,7 +2,6 @@ import java.io.File; import java.io.IOException; - import java.io.RandomAccessFile; import com.coderising.download.api.Connection; @@ -22,6 +21,15 @@ public DownloadThread(Connection conn, int startPos, int endPos) { this.endPos = endPos; } + public void close() { + this.conn.close(); + + } + + public void notifyFinished() { + fileDownloader.setThreadFinished(); + } + @Override public void run() { System.out.println(this.getName() + " is running"); @@ -49,21 +57,12 @@ public void run() { } } - public void setFileDownloader(FileDownloader fileDownloader) { - this.fileDownloader = fileDownloader; - } - - public void notifyFinished() { - fileDownloader.setThreadFinished(); - } - public void setDest(String dest) { this.dest = dest; } - public void close() { - this.conn.close(); - + public void setFileDownloader(FileDownloader fileDownloader) { + this.fileDownloader = fileDownloader; } } diff --git a/group12/382266293/src/com/coderising/download/DownloadUtil.java b/group12/382266293/src/com/coderising/download/DownloadUtil.java index c169214476..8e54afc2f9 100644 --- a/group12/382266293/src/com/coderising/download/DownloadUtil.java +++ b/group12/382266293/src/com/coderising/download/DownloadUtil.java @@ -9,8 +9,15 @@ public class DownloadUtil { private static final int MIN_CONNECTIONS = 3; private static final int MAX_CONNECTIONS = 10; - public static long getCurrentTime() { - return System.currentTimeMillis(); + public static int calculateConnects(int length) { + int conns = length / 1024 / 1024 / 10; + if (conns < MIN_CONNECTIONS) { + return MIN_CONNECTIONS; + } else if (conns > MAX_CONNECTIONS) { + return MAX_CONNECTIONS; + } else { + return conns; + } } public static void createTempFile(String tempName, int len) { @@ -44,15 +51,14 @@ public static void createTempFile(String tempName, int len) { } } - public static int calculateConnects(int length) { - int conns = length / 1024 / 1024 / 10; - if (conns < MIN_CONNECTIONS) { - return MIN_CONNECTIONS; - } else if (conns > MAX_CONNECTIONS) { - return MAX_CONNECTIONS; - } else { - return conns; - } + public static long getCurrentTime() { + return System.currentTimeMillis(); + } + + public static void printDownloadReport(int length, long start, long end) { + int time = (int) ((end - start) / 1000); + float speed = (float) length / 1024 / 1024 / time; + System.out.println("共耗时:" + time + "s,下载速度: " + (float) (Math.round(speed * 100)) / 100 + "Mb/s"); } public static boolean rename(String from, String to) { @@ -64,10 +70,4 @@ public static boolean rename(String from, String to) { return false; } - public static void printDownloadReport(int length, long start, long end) { - int time = (int) ((end - start) / 1000); - float speed = (float) length / 1024 / 1024 / time; - System.out.println("共耗时:" + time + "s,下载速度: " + (float) (Math.round(speed * 100)) / 100 + "Mb/s"); - } - } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java index 671ff7243c..311ebede84 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloader.java +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -9,20 +9,45 @@ public class FileDownloader { private final static String EXT = "lyj"; private static DownloadThread[] threadPool; + private static String fileName; + private static String tempName; + private int finishedCount; public String downloadLocation; - String url; ConnectionManager cm; DownloadListener listener; - private static String fileName; - private static String tempName; public FileDownloader(String _url) { this.url = _url; this.finishedCount = 0; } + private boolean checkFinish(int links) { + + while (finishedCount != links) { + try { + Thread.sleep(5000); + System.out.println("Unfinshed threads number: " + (links - finishedCount)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + return true; + } + + private void checkLength(int length, Connection conn) { + if (length <= 0) { + try { + throw new ConnectionException("file does not exist"); + } catch (ConnectionException e) { + e.printStackTrace(); + } finally { + conn.close(); + } + } + } + public void execute() { // 在这里实现你的代码, 注意: 需要用多线程实现下载 // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 @@ -75,44 +100,6 @@ public void execute() { } } - private void checkLength(int length, Connection conn) { - if (length <= 0) { - try { - throw new ConnectionException("file does not exist"); - } catch (ConnectionException e) { - e.printStackTrace(); - } finally { - conn.close(); - } - } - } - - private void setTempName(String name) { - String temp = name.substring(0, name.lastIndexOf(".") + 1) + EXT; - FileDownloader.tempName = downloadLocation + temp; - } - - private void setFileName(String name) { - FileDownloader.fileName = downloadLocation + name; - } - - private void setLocation(String downloadLocation) { - this.downloadLocation = downloadLocation; - } - - private boolean checkFinish(int links) { - - while (finishedCount != links) { - try { - Thread.sleep(5000); - System.out.println("Unfinshed threads number: " + (links - finishedCount)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - return true; - } - private void freeDownloadThread() { if (threadPool != null) { for (int i = 0; i < threadPool.length; i++) { @@ -134,6 +121,12 @@ public DownloadListener getListener() { return this.listener; } + private void setAndStartThread(DownloadThread downloadThread, String dest) { + downloadThread.setDest(dest); + downloadThread.setFileDownloader(this); + downloadThread.start(); + } + private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, int length) throws ConnectionException { int connectionNumbers = threadPool.length; @@ -156,22 +149,29 @@ private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, } } - private void setAndStartThread(DownloadThread downloadThread, String dest) { - downloadThread.setDest(dest); - downloadThread.setFileDownloader(this); - downloadThread.start(); - } - public void setConnectionManager(ConnectionManager ucm) { this.cm = ucm; } - public void setThreadFinished() { - finishedCount++; + private void setFileName(String name) { + FileDownloader.fileName = downloadLocation + name; } public void setListener(DownloadListener listener) { this.listener = listener; } + private void setLocation(String downloadLocation) { + this.downloadLocation = downloadLocation; + } + + private void setTempName(String name) { + String temp = name.substring(0, name.lastIndexOf(".") + 1) + EXT; + FileDownloader.tempName = downloadLocation + temp; + } + + public void setThreadFinished() { + finishedCount++; + } + } diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index 88a5dba40e..b9c458d2a6 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -9,20 +9,20 @@ import com.coderising.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { - boolean downloadFinished = false; + public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; + + public static String picture = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; + + public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; + boolean downloadFinished = false; @Before public void setUp() throws Exception { } - @After public void tearDown() throws Exception { } - public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; - public static String picture = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; - public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; - @Test public void testDownload() { diff --git a/group12/382266293/src/com/coderising/download/api/Connection.java b/group12/382266293/src/com/coderising/download/api/Connection.java index 11a0eab3d8..53293962a0 100644 --- a/group12/382266293/src/com/coderising/download/api/Connection.java +++ b/group12/382266293/src/com/coderising/download/api/Connection.java @@ -4,15 +4,10 @@ public interface Connection { /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * - * @param startPos - * 开始位置, 从0开始 - * @param endPos - * 结束位置 - * @return + * 关闭连接 */ - public byte[] read(int startPos, int endPos) throws IOException; + + public void close(); /** * 得到数据内容的长度 @@ -21,15 +16,20 @@ public interface Connection { */ public int getContentLength(); - /** - * 关闭连接 - */ + public String getFileName(); - public void close(); + public boolean isFinished(); - public String getFileName(); + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * + * @param startPos + * 开始位置, 从0开始 + * @param endPos + * 结束位置 + * @return + */ + public byte[] read(int startPos, int endPos) throws IOException; public void setFinished(); - - public boolean isFinished(); } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java index a4fa5c15ad..7c772bc665 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java @@ -12,8 +12,8 @@ public class ConnectionImpl implements Connection { - private ConnectionManager cm; private static int buffer_size = 1024; + private ConnectionManager cm; private HttpURLConnection httpConn; private URL url; private boolean finished = false; @@ -28,6 +28,31 @@ public ConnectionImpl(ConnectionManager cm, String _url) { } } + @Override + public void close() { + httpConn.disconnect(); + } + + @Override + public int getContentLength() { + int len = httpConn.getContentLength(); + + return len; + + } + + @Override + public String getFileName() { + String fileName = httpConn.getURL().getFile(); + fileName = fileName.substring(fileName.lastIndexOf('/') + 1); + return fileName; + } + + @Override + public boolean isFinished() { + return finished; + } + @Override public byte[] read(int startPos, int endPos) throws IOException { InputStream in = null; @@ -60,34 +85,9 @@ public byte[] read(int startPos, int endPos) throws IOException { return null; } - @Override - public int getContentLength() { - int len = httpConn.getContentLength(); - - return len; - - } - - @Override - public void close() { - httpConn.disconnect(); - } - - @Override - public String getFileName() { - String fileName = httpConn.getURL().getFile(); - fileName = fileName.substring(fileName.lastIndexOf('/') + 1); - return fileName; - } - @Override public void setFinished() { finished = true; } - @Override - public boolean isFinished() { - return finished; - } - } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java index 122073e37b..c4634733d5 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -16,6 +16,15 @@ public ConnectionManagerImpl() { this.connections = 0; } + private void checkConnectionSize() { + if (connections > MAX_CONNECTION_SIZE) + try { + throw new NoFreeSourceException("No free connections available."); + } catch (NoFreeSourceException e) { + e.printStackTrace(); + } + } + @Override public Connection open(String url) throws ConnectionException { this.url = url; @@ -33,13 +42,4 @@ public Connection open(String url) throws ConnectionException { return null; } - private void checkConnectionSize() { - if (connections > MAX_CONNECTION_SIZE) - try { - throw new NoFreeSourceException("No free connections available."); - } catch (NoFreeSourceException e) { - e.printStackTrace(); - } - } - } diff --git a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java index 834a68d702..34521a5cd7 100644 --- a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java +++ b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java @@ -6,10 +6,6 @@ public class DownloadUtil { - public static long getCurrentTime() { - return System.currentTimeMillis(); - } - public static void createTempFile(String tempName, int len) { File file = new File(tempName); if (file.exists()) { @@ -41,4 +37,8 @@ public static void createTempFile(String tempName, int len) { } } + public static long getCurrentTime() { + return System.currentTimeMillis(); + } + } diff --git a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java index 68a628ec61..da9c2899a2 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,52 +1,13 @@ package com.coderising.jvm.attr; -import java.io.UnsupportedEncodingException; - import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); - System.out.println("attrIndex " + attrNameIndex); - int attrLen = iter.nextU4ToInt(); int maxStack = iter.nextU2ToInt(); @@ -57,9 +18,9 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ System.out.println("codeLen " + codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, "Code"); - String code = iter.nextUxToHexString(codeLen); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); System.out.println("Code is " + code); @@ -104,6 +65,39 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ return codeAttr; } + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public String getCode() { + return code; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } private void setStackMapTable(StackMapTable t) { diff --git a/group12/382266293/src/com/coderising/jvm/attr/LineNumberTable.java b/group12/382266293/src/com/coderising/jvm/attr/LineNumberTable.java index 22941f83b1..f6a8c2e64b 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/LineNumberTable.java +++ b/group12/382266293/src/com/coderising/jvm/attr/LineNumberTable.java @@ -6,35 +6,59 @@ import com.coderising.jvm.loader.ByteCodeIterator; public class LineNumberTable extends AttributeInfo { - List items = new ArrayList(); - private static class LineNumberItem{ int startPC; int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } public int getLineNum() { return lineNum; } + public int getStartPC() { + return startPC; + } public void setLineNum(int lineNum) { this.lineNum = lineNum; } + public void setStartPC(int startPC) { + this.startPC = startPC; + } } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + + int attrLen = iter.nextU4ToInt(); + + int line_number_table_length = iter.nextU2ToInt(); + + LineNumberTable lnt = new LineNumberTable(attrNameIndex, attrLen); + + + for (int i = 0; i < line_number_table_length; i++) { + + LineNumberItem lni = new LineNumberItem(); + + int start_pc = iter.nextU2ToInt(); + lni.setStartPC(start_pc); + + int line_number = iter.nextU2ToInt(); + lni.setLineNum(line_number); + + lnt.addLineNumberItem(lni); + } + + + + return lnt; } + List items = new ArrayList(); public LineNumberTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); } diff --git a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java index 3eb2654e36..80f3af5cd5 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java +++ b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -6,34 +6,34 @@ public class LocalVariableItem { private int nameIndex; private int descIndex; private int index; - public int getStartPC() { - return startPC; + public int getDescIndex() { + return descIndex; } - public void setStartPC(int startPC) { - this.startPC = startPC; + public int getIndex() { + return index; } public int getLength() { return length; } - public void setLength(int length) { - this.length = length; - } public int getNameIndex() { return nameIndex; } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; + public int getStartPC() { + return startPC; } public void setDescIndex(int descIndex) { this.descIndex = descIndex; } - public int getIndex() { - return index; - } public void setIndex(int index) { this.index = index; } + public void setLength(int length) { + this.length = length; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } } diff --git a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java index fa69dc9bdb..0028567ac1 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java +++ b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -4,25 +4,53 @@ import java.util.ArrayList; import java.util.List; -import com.coderising.jvm.constant.ConstantPool; - import com.coderising.jvm.loader.ByteCodeIterator; public class LocalVariableTable extends AttributeInfo{ - List items = new ArrayList(); + public static LocalVariableTable parse(ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + + int attrLen = iter.nextU4ToInt(); + + int local_variable_table_length = iter.nextU2ToInt(); + + LocalVariableTable lvt = new LocalVariableTable(attrNameIndex, attrLen); + + + for (int i = 0; i < local_variable_table_length; i++) { + + LocalVariableItem lvi = new LocalVariableItem(); + + int start_pc = iter.nextU2ToInt(); + lvi.setStartPC(start_pc); + + int length = iter.nextU2ToInt(); + lvi.setLength(length); + + int name_index = iter.nextU2ToInt(); + lvi.setNameIndex(name_index); + + int desc_index = iter.nextU2ToInt(); + lvi.setDescIndex(desc_index); + + int index = iter.nextU2ToInt(); + lvi.setIndex(index); + + lvt.addLocalVariableItem(lvi); + } + + return lvt; + } + List items = new ArrayList(); + public LocalVariableTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; - } + private void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } - } diff --git a/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java b/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java index 44c5d90d46..0dd885a940 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java +++ b/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java @@ -5,12 +5,6 @@ public class StackMapTable extends AttributeInfo{ - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - public static StackMapTable parse(ByteCodeIterator iter){ int index = iter.nextU2ToInt(); int len = iter.nextU4ToInt(); @@ -23,6 +17,12 @@ public static StackMapTable parse(ByteCodeIterator iter){ return t; } + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + private void setOriginalCode(String code) { this.originalCode = code; diff --git a/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java b/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java index 17dd61f8b6..20e86330df 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java +++ b/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java @@ -3,6 +3,11 @@ import com.coderising.jvm.loader.ByteCodeIterator; public class AccessFlag { + public static AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); + return accessFlag; + } + private int flagValue; public AccessFlag(int value) { @@ -13,20 +18,15 @@ public int getFlagValue() { return flagValue; } - public void setFlagValue(int flag) { - this.flagValue = flag; + public boolean isFinalClass() { + return (this.flagValue & 0x0010) != 0; } public boolean isPublicClass() { return (this.flagValue & 0x0001) != 0; } - public boolean isFinalClass() { - return (this.flagValue & 0x0010) != 0; - } - - public static AccessFlag parseAccessFlag(ByteCodeIterator iter) { - AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); - return accessFlag; + public void setFlagValue(int flag) { + this.flagValue = flag; } } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java index 6e37d03643..58c21ac41b 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java +++ b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java @@ -19,45 +19,57 @@ public class ClassFile { private List fields = new ArrayList(); private List methods = new ArrayList(); - public ClassIndex getClzIndex() { - return clzIndex; + public void addField(Field field) { + + this.fields.add(field); + + } + + public void addMethod(Method method) { + + this.methods.add(method); + } public AccessFlag getAccessFlag() { return accessFlag; } - public void setAccessFlag(AccessFlag accessFlag) { - this.accessFlag = accessFlag; + private String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public ClassIndex getClzIndex() { + return clzIndex; } public ConstantPool getConstantPool() { return pool; } - public int getMinorVersion() { - return minorVersion; - } + public List getFields() { - public void setMinorVersion(int minorVersion) { - this.minorVersion = minorVersion; + return fields; } public int getMajorVersion() { return majorVersion; } - public void setMajorVersion(int majorVersion) { - this.majorVersion = majorVersion; - } + public List getMethods() { - public void setConstPool(ConstantPool pool) { - this.pool = pool; + return methods; + } + public int getMinorVersion() { + return minorVersion; } - public void setClassIndex(ClassIndex clzIndex) { - this.clzIndex = clzIndex; + private String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); } public void print() { @@ -71,20 +83,17 @@ public void print() { } - private String getClassName() { - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); + public void setAccessFlag(AccessFlag accessFlag) { + this.accessFlag = accessFlag; } - private String getSuperClassName() { - ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); + public void setClassIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; } + + public void setConstPool(ConstantPool pool) { + this.pool = pool; - public List getFields() { - - return fields; } public void setFields(List fields) { @@ -92,16 +101,9 @@ public void setFields(List fields) { this.fields = fields; } - - public void addField(Field field) { - - this.fields.add(field); - - } - - public List getMethods() { - return methods; + public void setMajorVersion(int majorVersion) { + this.majorVersion = majorVersion; } public void setMethods(List methods) { @@ -110,9 +112,7 @@ public void setMethods(List methods) { } - public void addMethod(Method method) { - - this.methods.add(method); - + public void setMinorVersion(int minorVersion) { + this.minorVersion = minorVersion; } } diff --git a/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java b/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java index 0212bc9fb3..213fb9163f 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java +++ b/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java @@ -4,19 +4,19 @@ 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 int getThisClassIndex() { + return thisClassIndex; + } + public void setSuperClassIndex(int superClassIndex) { this.superClassIndex = superClassIndex; } + + public void setThisClassIndex(int thisClassIndex) { + this.thisClassIndex = thisClassIndex; + } } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java b/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java index 4b593e7347..083bfe73f0 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java @@ -8,21 +8,22 @@ public ClassInfo(ConstantPool pool) { super(pool); } - public int getUtf8Index() { - return utf8Index; - } - - public void setUtf8Index(int utf8Index) { - this.utf8Index = utf8Index; + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); + return utf8Info.getValue(); } + @Override public int getType() { return type; } - public String getClassName() { - int index = getUtf8Index(); - UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); - return utf8Info.getValue(); + public int getUtf8Index() { + return utf8Index; + } + + public void setUtf8Index(int utf8Index) { + this.utf8Index = utf8Index; } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java b/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java index 96845046b3..5366000a7b 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java @@ -19,14 +19,14 @@ public ConstantInfo(ConstantPool pool) { pool.addConstantInfo(this); } - public abstract int getType(); + public ConstantInfo getConstantInfo(int index) { + return this.constantPool.getConstantInfo(index); + } public ConstantPool getConstantPool() { return constantPool; } - public ConstantInfo getConstantInfo(int index) { - return this.constantPool.getConstantInfo(index); - } + public abstract int getType(); } diff --git a/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java b/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java index 95c44dde8f..06b83239f4 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java @@ -22,11 +22,11 @@ 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; } + + public String getUTF8String(int index) { + return ((UTF8Info) this.constantInfos.get(index)).getValue(); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java index e9f34e550c..6161ac4c06 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -9,33 +9,10 @@ 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()); @@ -55,4 +32,29 @@ public String getFieldType() { NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + @Override + public int getType() { + return type; + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + @Override + public String toString() { + + NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); + + return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]"; + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java index d58de16f72..1330036966 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -11,31 +11,10 @@ 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()); @@ -48,10 +27,33 @@ public String getMethodName() { return typeInfo.getName(); } + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + public String getParamAndReturnType() { ConstantPool pool = this.getConstantPool(); NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public int getType() { + return type; + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + @Override + public String toString() { + + return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType(); + } + } diff --git a/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java index a792e2dc13..9ce0725fd3 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -14,34 +14,36 @@ 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(); } + @Override + public int getType() { + return type; + } + public String getTypeInfo() { ConstantPool pool = this.getConstantPool(); UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2); return utf8Info2.getValue(); } + public void setIndex1(int index1) { + this.index1 = index1; + } + + public void setIndex2(int index2) { + this.index2 = index2; + } + + @Override public String toString() { return "(" + getName() + "," + getTypeInfo() + ")"; } diff --git a/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java b/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java index 0ea1f6bdac..e900b990cf 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java @@ -8,18 +8,20 @@ public StringInfo(ConstantPool pool) { super(pool); } - public int getType() { - return type; - } - public int getIndex() { return index; } + @Override + public int getType() { + return type; + } + public void setIndex(int index) { this.index = index; } + @Override public String toString() { return this.getConstantPool().getUTF8String(index); } diff --git a/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java b/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java index a7e88969a4..b1179ad150 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java @@ -13,25 +13,26 @@ public int getLength() { return length; } - public void setLength(int length) { - this.length = length; - } - + @Override public int getType() { return type; } - @Override - public String toString() { - return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]"; - } - public String getValue() { return value; } + public void setLength(int length) { + this.length = length; + } + public void setValue(String value) { this.value = value; } + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]"; + } + } diff --git a/group12/382266293/src/com/coderising/jvm/field/Field.java b/group12/382266293/src/com/coderising/jvm/field/Field.java index 2b0c549685..1349de930d 100644 --- a/group12/382266293/src/com/coderising/jvm/field/Field.java +++ b/group12/382266293/src/com/coderising/jvm/field/Field.java @@ -1,17 +1,34 @@ package com.coderising.jvm.field; -import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; public class Field { + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int access_flags = iter.nextU2ToInt(); + int name_index = iter.nextU2ToInt(); + int descriptor_index = iter.nextU2ToInt(); + int attrbutes_count = iter.nextU2ToInt(); + + if (attrbutes_count != 0) { + throw new RuntimeException("field attrbutes_count is " + attrbutes_count); + } + + Field field = new Field(access_flags,name_index,descriptor_index,pool); + + return field; + } private int accessFlag; private int nameIndex; - private int descriptorIndex; + private int descriptorIndex; + private ConstantPool pool; + + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { @@ -21,28 +38,9 @@ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool po this.pool = pool; } - - - @Override public String toString() { return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex) ; } - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int access_flags = iter.nextU2ToInt(); - int name_index = iter.nextU2ToInt(); - int descriptor_index = iter.nextU2ToInt(); - int attrbutes_count = iter.nextU2ToInt(); - - if (attrbutes_count != 0) { - throw new RuntimeException("field attrbutes_count is " + attrbutes_count); - } - - Field field = new Field(access_flags,name_index,descriptor_index,pool); - - return field; - } - } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java index 4b554a434a..5fa9ba7661 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -11,59 +11,59 @@ public ByteCodeIterator(byte[] codes) { this.codes = codes; } - public String nextU4ToHexString() { - byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; - return Util.byteToHexString(u4); + public void back(int i) { + currPos = currPos - 2; + } + + public String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); } + public byte[] nextNbytesToHexString(int length) { + byte[] bytes = new byte[length]; + int len = currPos + length; + for(int j = 0; currPos < len; j++) { + bytes[j] = codes[currPos++]; + } + + return bytes; + } + public int nextU1ToInt() { byte[] u1 = new byte[] { codes[currPos++] }; return Util.byteToInt(u1); } - + + public int nextU2ToInt() { byte[] u2 = new byte[] { codes[currPos++], codes[currPos++] }; return Util.byteToInt(u2); } - public int nextU4ToInt() { + public String nextU4ToHexString() { byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; - return Util.byteToInt(u4); + return Util.byteToHexString(u4); } - - public byte[] nextNbytesToHexString(int length) { - byte[] bytes = new byte[length]; - int len = currPos + length; - for(int j = 0; currPos < len; j++) { - bytes[j] = codes[currPos++]; - } - - return bytes; + public int nextU4ToInt() { + byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; + return Util.byteToInt(u4); } - + public String nextUxToHexString(int length) { byte[] codes = nextNbytesToHexString(length); return byteToHexString(codes); } - - public String byteToHexString(byte[] codes) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } - - public void back(int i) { - currPos = currPos - 2; - } } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java index 71a8b6fefa..135cf41dee 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -14,10 +14,40 @@ public class ClassFileLoader { private List clzPaths = new ArrayList(); - public byte[] readBinaryCode(String className) { + public void addClassPath(String path) { + clzPaths.add(path); + } - String clzFileName = "//" + className.replaceAll("\\.", "//") + ".class"; - return loadClassFile(clzFileName); + private File getClassFile(String clzFileName) { + + for (String path : clzPaths) { + File file = new File(path + "//" + clzFileName); + if (file.exists()) { + return file; + } + } + return null; + + } + + public String getClassPath() { + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < clzPaths.size(); i++) { + + sb.append(clzPaths.get(i)); + if (i < clzPaths.size() - 1) { + sb.append(";"); + } + + } + + return sb.toString(); + } + + public String getClassPath_V1() { + + return null; } public ClassFile loadClass(String className) throws UnsupportedEncodingException { @@ -65,40 +95,10 @@ private byte[] loadClassFile(String clzFileName) { } - private File getClassFile(String clzFileName) { - - for (String path : clzPaths) { - File file = new File(path + "//" + clzFileName); - if (file.exists()) { - return file; - } - } - return null; - - } - - public void addClassPath(String path) { - clzPaths.add(path); - } - - public String getClassPath_V1() { - - return null; - } - - public String getClassPath() { - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < clzPaths.size(); i++) { - - sb.append(clzPaths.get(i)); - if (i < clzPaths.size() - 1) { - sb.append(";"); - } - - } + public byte[] readBinaryCode(String className) { - return sb.toString(); + String clzFileName = "//" + className.replaceAll("\\.", "//") + ".class"; + return loadClassFile(clzFileName); } } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java index e1c997d3d0..b29cfe1d45 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java @@ -1,10 +1,6 @@ package com.coderising.jvm.loader; import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; - -import org.junit.Assert; import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; @@ -19,7 +15,6 @@ import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; -import com.coderising.jvm.util.Util; public class ClassFileParser { @@ -62,39 +57,6 @@ public ClassFile parse(byte[] codes) { return clzFile; } - private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { - - int methodNum = iter.nextU2ToInt(); - - ConstantPool pool = clzFile.getConstantPool(); - for (int i = 0; i < methodNum; i++) { - Method method = Method.parse(clzFile,iter); - clzFile.addMethod(method); - } - - } - - private void parseFields(ClassFile clzFile, ByteCodeIterator iter) { - - int fieldNum = iter.nextU2ToInt(); - - ConstantPool pool = clzFile.getConstantPool(); - for (int i = 0; i < fieldNum; i++) { - Field field = Field.parse(pool,iter); - clzFile.addField(field); - } - - } - - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceNum = iter.nextU2ToInt(); - - if (0 != interfaceNum) { - throw new RuntimeException("interface parser not finsihed yet, pls check!"); - } - - } - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { return AccessFlag.parseAccessFlag(iter); @@ -188,4 +150,37 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { return pool; } + private void parseFields(ClassFile clzFile, ByteCodeIterator iter) { + + int fieldNum = iter.nextU2ToInt(); + + ConstantPool pool = clzFile.getConstantPool(); + for (int i = 0; i < fieldNum; i++) { + Field field = Field.parse(pool,iter); + clzFile.addField(field); + } + + } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceNum = iter.nextU2ToInt(); + + if (0 != interfaceNum) { + throw new RuntimeException("interface parser not finsihed yet, pls check!"); + } + + } + + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + + int methodNum = iter.nextU2ToInt(); + + ConstantPool pool = clzFile.getConstantPool(); + for (int i = 0; i < methodNum; i++) { + Method method = Method.parse(clzFile,iter); + clzFile.addMethod(method); + } + + } + } diff --git a/group12/382266293/src/com/coderising/jvm/method/Method.java b/group12/382266293/src/com/coderising/jvm/method/Method.java index 3c3e026a40..b77ff6271b 100644 --- a/group12/382266293/src/com/coderising/jvm/method/Method.java +++ b/group12/382266293/src/com/coderising/jvm/method/Method.java @@ -1,61 +1,20 @@ package com.coderising.jvm.method; -import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; +import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.loader.ByteCodeIterator; -import com.sun.org.apache.bcel.internal.classfile.Code; public class Method { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private CodeAttr codeAttr; - - private ClassFile clzFile; - - - public ClassFile getClzFile() { - return clzFile; - } - - public int getNameIndex() { - return nameIndex; - } - public int getDescriptorIndex() { - return descriptorIndex; - } - - public CodeAttr getCodeAttr() { - return codeAttr; - } - - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } - - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - } - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ int access_flags = iter.nextU2ToInt(); int name_index = iter.nextU2ToInt(); int descriptor_index = iter.nextU2ToInt(); int attrbutes_count = iter.nextU2ToInt(); - System.out.println("count1 = " + attrbutes_count); Method method = new Method(clzFile, access_flags,name_index,descriptor_index); @@ -65,8 +24,10 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ iter.back(2); if (AttributeInfo.CODE.equalsIgnoreCase("Code")) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); method.setCodeAttr(codeAttr); + } else { throw new RuntimeException(att_name + "has not been implemented"); } @@ -78,4 +39,40 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } + private int accessFlag; + private int nameIndex; + + private int descriptorIndex; + + private CodeAttr codeAttr; + + + private ClassFile clzFile; + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + public ClassFile getClzFile() { + return clzFile; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public int getNameIndex() { + return nameIndex; + } + + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } } diff --git a/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java index d4f255a763..15050a0d76 100644 --- a/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,7 +1,6 @@ package com.coderising.jvm.test; import java.io.UnsupportedEncodingException; -import java.util.Arrays; import java.util.List; import org.junit.After; @@ -11,7 +10,11 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.constant.*; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; import com.coderising.jvm.method.Method; @@ -20,9 +23,8 @@ public class ClassFileloaderTest { static String path1 = "C:\\Users\\steve\\workspace\\coding2017n\\group12\\382266293\\bin"; static String path2 = "C:\temp"; - String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static ClassFile clzFile = null; + static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); @@ -36,6 +38,30 @@ public class ClassFileloaderTest { } clzFile.print(); } + String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + private String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } @Before public void setUp() throws Exception { @@ -45,19 +71,6 @@ public void setUp() throws Exception { public void tearDown() throws Exception { } - @Test - public void testClassPath() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1 + ";" + path2, clzPath); - - } - @Test public void testClassFileLength() { @@ -74,37 +87,26 @@ public void testClassFileLength() { } @Test - public void testMagicNumber() { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; - - String acctualValue = this.byteToHexString(codes); + public void testClassIndex() { - Assert.assertEquals("cafebabe", acctualValue); - } + ClassIndex clzIndex = clzFile.getClzIndex(); + ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex()); + ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex()); - private String byteToHexString(byte[] codes) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); + Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } @Test - public void testVersion() { + public void testClassPath() { - Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); } @@ -177,31 +179,19 @@ public void testConstantPool() { } @Test - public void testClassIndex() { + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; - ClassIndex clzIndex = clzFile.getClzIndex(); - ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex()); - ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex()); + String acctualValue = this.byteToHexString(codes); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); - Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); + Assert.assertEquals("cafebabe", acctualValue); } - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } @Test public void testMethods(){ @@ -247,15 +237,28 @@ public void testMethods(){ "bb000159122b101db7002d4c2bb6002fb1"); } } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } } + + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } } diff --git a/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java b/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java index d36b122f60..24c0cae543 100644 --- a/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java +++ b/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java @@ -2,7 +2,13 @@ public class EmployeeV1 { + public static void main(String[] args) { + EmployeeV1 p = new EmployeeV1("Andy", 29); + p.sayHello(); + + } private String name; + private int age; public EmployeeV1(String name, int age) { @@ -10,21 +16,15 @@ public EmployeeV1(String name, int age) { this.age = age; } - public void setName(String name) { - this.name = name; + public void sayHello() { + System.out.println("Hello , this is class Employee "); } 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(); - + public void setName(String name) { + this.name = name; } } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/jvm/util/Util.java b/group12/382266293/src/com/coderising/jvm/util/Util.java index 1f9e087bb9..c2042deaac 100644 --- a/group12/382266293/src/com/coderising/jvm/util/Util.java +++ b/group12/382266293/src/com/coderising/jvm/util/Util.java @@ -1,11 +1,6 @@ package com.coderising.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 < codes.length; i++) { @@ -19,4 +14,9 @@ public static String byteToHexString(byte[] codes) { } return buffer.toString(); } + + public static int byteToInt(byte[] codes) { + String s1 = byteToHexString(codes); + return Integer.valueOf(s1, 16).intValue(); + } } diff --git a/group12/382266293/src/com/coderising/litestruts/LoginAction.java b/group12/382266293/src/com/coderising/litestruts/LoginAction.java index 95fd144d4d..7d1cf06a48 100644 --- a/group12/382266293/src/com/coderising/litestruts/LoginAction.java +++ b/group12/382266293/src/com/coderising/litestruts/LoginAction.java @@ -11,14 +11,6 @@ public class LoginAction { private String password; private String message; - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - public String execute() { if ("test".equals(name) && "1234".equals(password)) { this.message = "login successful"; @@ -28,6 +20,18 @@ public String execute() { return "fail"; } + public String getMessage() { + return this.message; + } + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + public void setName(String name) { this.name = name; } @@ -35,8 +39,4 @@ public void setName(String name) { public void setPassword(String password) { this.password = password; } - - public String getMessage() { - return this.message; - } } \ No newline at end of file diff --git a/group12/382266293/src/litestruts/ActionXMLreader.java b/group12/382266293/src/litestruts/ActionXMLreader.java index 92e700edc4..53d815c174 100644 --- a/group12/382266293/src/litestruts/ActionXMLreader.java +++ b/group12/382266293/src/litestruts/ActionXMLreader.java @@ -1,6 +1,7 @@ package litestruts; import java.util.List; + import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; diff --git a/group12/382266293/src/litestruts/Configuration.java b/group12/382266293/src/litestruts/Configuration.java index 731a4218b0..44b85c9b45 100644 --- a/group12/382266293/src/litestruts/Configuration.java +++ b/group12/382266293/src/litestruts/Configuration.java @@ -1,25 +1,47 @@ package litestruts; +import static util.Print.println; + import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; + import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; -import static util.Print.*; public class Configuration { - Map actions = new HashMap<>(); + private static class ActionCfg { - private static Configuration cfg = new Configuration(); + String name; + String clz; + Map viewResult = new HashMap<>(); - private Configuration() { + public ActionCfg(String name, String clz) { + this.name = name; + this.clz = clz; + } + + public void addViewResult(String result, String jsp) { + viewResult.put(result, jsp); + + } + + public String getClassName() { + return clz; + } + + public Map getViewResult() { + return viewResult; + } } + private static Configuration cfg = new Configuration(); + public static Configuration getNewInstance() { if (cfg == null) { @@ -28,6 +50,36 @@ public static Configuration getNewInstance() { return cfg; } + public static void main(String[] args) { + Configuration cfg = new Configuration(); + cfg.parse("struts.xml"); + String clz = cfg.getClassName("login"); + println(clz); + + } + + Map actions = new HashMap<>(); + + private Configuration() { + + } + + public String getClassName(String action) { + ActionCfg cfg = this.actions.get(action); + if (cfg == null) { + return null; + } + return cfg.getClassName(); + } + + public String getResultView(String action, String resultName) { + ActionCfg cfg = this.actions.get(action); + if (cfg == null) { + return null; + } + return cfg.getViewResult().get(resultName); + } + public void parse(String fileName) { String src = this.getClass().getPackage().getName(); @@ -73,54 +125,4 @@ public void parseXML(InputStream is) { } } - public String getClassName(String action) { - ActionCfg cfg = this.actions.get(action); - if (cfg == null) { - return null; - } - return cfg.getClassName(); - } - - public String getResultView(String action, String resultName) { - ActionCfg cfg = this.actions.get(action); - if (cfg == null) { - return null; - } - return cfg.getViewResult().get(resultName); - } - - public static void main(String[] args) { - Configuration cfg = new Configuration(); - cfg.parse("struts.xml"); - String clz = cfg.getClassName("login"); - println(clz); - - } - - private static class ActionCfg { - - String name; - String clz; - Map viewResult = new HashMap<>(); - - public Map getViewResult() { - return viewResult; - } - - public ActionCfg(String name, String clz) { - this.name = name; - this.clz = clz; - } - - public void addViewResult(String result, String jsp) { - viewResult.put(result, jsp); - - } - - public String getClassName() { - return clz; - } - - } - } diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index b84e2e6264..2371cdbcd8 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -1,6 +1,5 @@ package litestruts; -import util.ActionXMLreader; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -9,33 +8,26 @@ import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; + import org.dom4j.Node; +import util.ActionXMLreader; + public class Struts { private static Object actionObj = null; private static String address = "src/litestruts/struts.xml"; private static ActionXMLreader reader = new ActionXMLreader(); - @SuppressWarnings("unchecked") - public static View runAction(String actionName, Map parameters) { - - Node root = reader.getRootNode(address); - String clazz = reader.parseClass(root, actionName); - actionObj = getObj(clazz); - BeanInfo bi = getBeanInfo(actionObj); - PropertyDescriptor[] pd = bi.getPropertyDescriptors(); - - setParameters(actionObj, pd, parameters); - String executeResult = getResult(actionObj, bi, "execute"); - String jsp = reader.parseResult(root, actionName, executeResult); - Map readParamters = getReadParameters(actionObj, pd); - - View view = new View(); - view.setJsp(jsp); - view.setParameters(readParamters); + private static BeanInfo getBeanInfo(Object obj) { - return view; + BeanInfo bi = null; + try { + bi = Introspector.getBeanInfo(obj.getClass(), Object.class); + } catch (IntrospectionException e) { + e.printStackTrace(); + } + return bi; } private static Object getObj(String clazz) { @@ -53,28 +45,22 @@ private static Object getObj(String clazz) { return null; } - private static BeanInfo getBeanInfo(Object obj) { - - BeanInfo bi = null; - try { - bi = Introspector.getBeanInfo(obj.getClass(), Object.class); - } catch (IntrospectionException e) { - e.printStackTrace(); - } - return bi; - } + @SuppressWarnings("rawtypes") + public static Map getReadParameters(Object obj, PropertyDescriptor[] pd) { - private static void setParameters(Object obj, PropertyDescriptor[] pd, Map parameters) { + Map viewParams = new HashMap(); for (int i = 0; i < pd.length; i++) { - String name = pd[i].getName(); - if (parameters.containsKey(name)) - try { - pd[i].getWriteMethod().invoke(obj, parameters.get(name)); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } + String readMethod = pd[i].getReadMethod().getName().substring(3); + String value = null; + try { + value = (String) pd[i].getReadMethod().invoke(obj); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + viewParams.put(readMethod.toLowerCase(), value); } + return viewParams; } private static String getResult(Object obj, BeanInfo bi, String execute) { @@ -91,22 +77,38 @@ private static String getResult(Object obj, BeanInfo bi, String execute) { return null; } - @SuppressWarnings("rawtypes") - public static Map getReadParameters(Object obj, PropertyDescriptor[] pd) { + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters) { - Map viewParams = new HashMap(); + Node root = reader.getRootNode(address); + String clazz = reader.parseClass(root, actionName); + actionObj = getObj(clazz); + BeanInfo bi = getBeanInfo(actionObj); + PropertyDescriptor[] pd = bi.getPropertyDescriptors(); + + setParameters(actionObj, pd, parameters); + String executeResult = getResult(actionObj, bi, "execute"); + String jsp = reader.parseResult(root, actionName, executeResult); + Map readParamters = getReadParameters(actionObj, pd); + + View view = new View(); + view.setJsp(jsp); + view.setParameters(readParamters); + + return view; + } + + private static void setParameters(Object obj, PropertyDescriptor[] pd, Map parameters) { for (int i = 0; i < pd.length; i++) { - String readMethod = pd[i].getReadMethod().getName().substring(3); - String value = null; - try { - value = (String) pd[i].getReadMethod().invoke(obj); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } - viewParams.put(readMethod.toLowerCase(), value); + String name = pd[i].getName(); + if (parameters.containsKey(name)) + try { + pd[i].getWriteMethod().invoke(obj, parameters.get(name)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } } - return viewParams; } } \ No newline at end of file diff --git a/group12/382266293/src/litestruts/StrutsTest.java b/group12/382266293/src/litestruts/StrutsTest.java index b450d7a935..8d70a91cb3 100644 --- a/group12/382266293/src/litestruts/StrutsTest.java +++ b/group12/382266293/src/litestruts/StrutsTest.java @@ -9,30 +9,30 @@ public class StrutsTest { @Test - public void testLoginActionSuccess() { - + public void testLoginActionFailed() { String actionName = "login"; - Map params = new HashMap(); params.put("name", "test"); - params.put("password", "1234"); + params.put("password", "123456"); // 密码和预设的不一致 View view = Struts.runAction(actionName, params); - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); } @Test - public void testLoginActionFailed() { + public void testLoginActionSuccess() { + String actionName = "login"; + Map params = new HashMap(); params.put("name", "test"); - params.put("password", "123456"); // 密码和预设的不一致 + params.put("password", "1234"); View view = Struts.runAction(actionName, params); - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); } } diff --git a/group12/382266293/src/litestruts/View.java b/group12/382266293/src/litestruts/View.java index 0c917dcb35..41152f3214 100644 --- a/group12/382266293/src/litestruts/View.java +++ b/group12/382266293/src/litestruts/View.java @@ -10,15 +10,15 @@ public String getJsp() { return jsp; } + public Map getParameters() { + return parameters; + } + public View setJsp(String jsp) { this.jsp = jsp; return this; } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { this.parameters = parameters; return this; diff --git a/group12/382266293/src/test.java b/group12/382266293/src/test.java index b3a32d2556..3910b896af 100644 --- a/group12/382266293/src/test.java +++ b/group12/382266293/src/test.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.net.URL; import java.util.LinkedList; + import sun.net.www.protocol.http.HttpURLConnection; public class test { @@ -16,30 +17,6 @@ public class test { public static String tempName = ""; public static String fileName = ""; - LinkedList a; - - private static void createTempFile1(String from) { - long length = 0; - URL url = null; - HttpURLConnection conn = null; - try { - url = new URL(from); - conn = (HttpURLConnection) url.openConnection(); - String file = conn.getURL().getFile(); - fileName = file.substring(file.lastIndexOf('/') + 1); - tempName = fileName.substring(0, fileName.lastIndexOf('.') + 1) + "lyj"; - length = conn.getContentLength(); - conn.disconnect(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - conn.disconnect(); - } - tempName = downloadLocation + tempName; - fileName = downloadLocation + fileName; - bufferFile(tempName, length); - } - public static void bufferFile(String name, long len) { FileOutputStream temp = null; @@ -66,6 +43,28 @@ public static void bufferFile(String name, long len) { } } + private static void createTempFile1(String from) { + long length = 0; + URL url = null; + HttpURLConnection conn = null; + try { + url = new URL(from); + conn = (HttpURLConnection) url.openConnection(); + String file = conn.getURL().getFile(); + fileName = file.substring(file.lastIndexOf('/') + 1); + tempName = fileName.substring(0, fileName.lastIndexOf('.') + 1) + "lyj"; + length = conn.getContentLength(); + conn.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + conn.disconnect(); + } + tempName = downloadLocation + tempName; + fileName = downloadLocation + fileName; + bufferFile(tempName, length); + } + public static void download(String src) { createTempFile1(src); @@ -95,6 +94,12 @@ public static void download(String src) { } + public static void main(String[] args) throws IOException { + + download(url2); + + } + public static boolean rename(String temp) { File file = new File(temp); File f1 = new File(fileName); @@ -107,10 +112,6 @@ public static boolean rename(String temp) { return false; } - public static void main(String[] args) throws IOException { - - download(url2); - - } + LinkedList a; } From f19f62afdb72ea810e19f2ba817c6c034fd11216 Mon Sep 17 00:00:00 2001 From: gongxun Date: Wed, 12 Apr 2017 23:35:16 +0800 Subject: [PATCH 124/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=A1=A8=E5=92=8C=E5=B1=9E=E6=80=A7=E8=A1=A8=E7=9A=84=E6=A1=86?= =?UTF-8?q?=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.5/clz/ClassFile.java | 33 ++--- group17/785396327/4.5/stack/StackUtil.java | 2 +- .../4.5/test/ClassFileloaderTest.java | 118 +++++++++--------- group17/785396327/4.9/attr/AttributeInfo.java | 20 +++ group17/785396327/4.9/attr/CodeAttr.java | 55 ++++++++ .../785396327/4.9/attr/LineNumberTable.java | 44 +++++++ .../785396327/4.9/attr/LocalVariableItem.java | 42 +++++++ .../4.9/attr/LocalVariableTable.java | 27 ++++ group17/785396327/4.9/attr/StackMapTable.java | 32 +++++ group17/785396327/4.9/field/Field.java | 33 +++++ group17/785396327/4.9/method/Method.java | 52 ++++++++ 11 files changed, 385 insertions(+), 73 deletions(-) create mode 100644 group17/785396327/4.9/attr/AttributeInfo.java create mode 100644 group17/785396327/4.9/attr/CodeAttr.java create mode 100644 group17/785396327/4.9/attr/LineNumberTable.java create mode 100644 group17/785396327/4.9/attr/LocalVariableItem.java create mode 100644 group17/785396327/4.9/attr/LocalVariableTable.java create mode 100644 group17/785396327/4.9/attr/StackMapTable.java create mode 100644 group17/785396327/4.9/field/Field.java create mode 100644 group17/785396327/4.9/method/Method.java diff --git a/group17/785396327/4.5/clz/ClassFile.java b/group17/785396327/4.5/clz/ClassFile.java index d4a8b8ed0c..e65cfbda81 100644 --- a/group17/785396327/4.5/clz/ClassFile.java +++ b/group17/785396327/4.5/clz/ClassFile.java @@ -2,6 +2,11 @@ import constant.ClassInfo; import constant.ConstantPool; +import field.Field; +import method.Method; + +import java.util.ArrayList; +import java.util.List; /** * Created by IBM on 2017/4/10. @@ -13,8 +18,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; -// private List fields = new ArrayList(); -// private List methods = new ArrayList(); + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -51,18 +56,18 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } -// public void addField(Field f){ -// this.fields.add(f); -// } -// public List getFields(){ -// return this.fields; -// } -// public void addMethod(Method m){ -// this.methods.add(m); -// } -// public List getMethods() { -// return methods; -// } + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } public void print(){ diff --git a/group17/785396327/4.5/stack/StackUtil.java b/group17/785396327/4.5/stack/StackUtil.java index aa821a50ae..afaa5fce1b 100644 --- a/group17/785396327/4.5/stack/StackUtil.java +++ b/group17/785396327/4.5/stack/StackUtil.java @@ -110,6 +110,6 @@ public static boolean isValidPairs(String s) { return false; } } - return true; + return stack.size() == 0;//最后判断stack中没有元素了,可能有单个括号 } } diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java index 9f76c4ccbc..f1361b07a0 100644 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -3,13 +3,15 @@ import clz.ClassFile; import clz.ClassIndex; import constant.*; +import field.Field; import jvm_1.ClassFileLoader; +import method.Method; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.lang.reflect.Method; +import java.util.List; /** * Created by IBM on 2017/4/10. @@ -197,70 +199,70 @@ public void testClassIndex(){ @Test public void testReadFields(){ -// List fields = clzFile.getFields(); -// Assert.assertEquals(2, fields.size()); -// { -// Field f = fields.get(0); -// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); -// } -// { -// Field f = fields.get(1); -// Assert.assertEquals("age:I", f.toString()); -// } + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } } @Test public void testMethods(){ -// List methods = clzFile.getMethods(); -// ConstantPool pool = clzFile.getConstantPool(); -// -// { -// Method m = methods.get(0); -// assertMethodEquals(pool,m, -// "", -// "(Ljava/lang/String;I)V", -// "2ab7000c2a2bb5000f2a1cb50011b1"); -// -// } -// { -// Method m = methods.get(1); -// assertMethodEquals(pool,m, -// "setName", -// "(Ljava/lang/String;)V", -// "2a2bb5000fb1"); -// -// } -// { -// Method m = methods.get(2); -// assertMethodEquals(pool,m, -// "setAge", -// "(I)V", -// "2a1bb50011b1"); -// } -// { -// Method m = methods.get(3); -// assertMethodEquals(pool,m, -// "sayHello", -// "()V", -// "b2001c1222b60024b1"); -// -// } -// { -// Method m = methods.get(4); -// assertMethodEquals(pool,m, -// "main", -// "([Ljava/lang/String;)V", -// "bb000159122b101db7002d4c2bb6002fb1"); -// } + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } } private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ -// String methodName = pool.getUTF8String(m.getNameIndex()); -// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); -// String code = m.getCodeAttr().getCode(); -// Assert.assertEquals(expectedName, methodName); -// Assert.assertEquals(expectedDesc, methodDesc); -// Assert.assertEquals(expectedCode, code); + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); } } diff --git a/group17/785396327/4.9/attr/AttributeInfo.java b/group17/785396327/4.9/attr/AttributeInfo.java new file mode 100644 index 0000000000..0a8a0c60c9 --- /dev/null +++ b/group17/785396327/4.9/attr/AttributeInfo.java @@ -0,0 +1,20 @@ +package attr; + +/** + * Created by IBM on 2017/4/12. + */ +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } +} diff --git a/group17/785396327/4.9/attr/CodeAttr.java b/group17/785396327/4.9/attr/CodeAttr.java new file mode 100644 index 0000000000..b069203d4f --- /dev/null +++ b/group17/785396327/4.9/attr/CodeAttr.java @@ -0,0 +1,55 @@ +package attr; + +import clz.ClassFile; +import iterator.ByteCodeIterator; + +/** + * Created by IBM on 2017/4/12. + */ +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + + return null; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + +} diff --git a/group17/785396327/4.9/attr/LineNumberTable.java b/group17/785396327/4.9/attr/LineNumberTable.java new file mode 100644 index 0000000000..f875aa2427 --- /dev/null +++ b/group17/785396327/4.9/attr/LineNumberTable.java @@ -0,0 +1,44 @@ +package attr; + +import iterator.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by IBM on 2017/4/12. + */ +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + +} diff --git a/group17/785396327/4.9/attr/LocalVariableItem.java b/group17/785396327/4.9/attr/LocalVariableItem.java new file mode 100644 index 0000000000..d0213e92f5 --- /dev/null +++ b/group17/785396327/4.9/attr/LocalVariableItem.java @@ -0,0 +1,42 @@ +package attr; + +/** + * Created by IBM on 2017/4/12. + */ +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group17/785396327/4.9/attr/LocalVariableTable.java b/group17/785396327/4.9/attr/LocalVariableTable.java new file mode 100644 index 0000000000..060ed31e85 --- /dev/null +++ b/group17/785396327/4.9/attr/LocalVariableTable.java @@ -0,0 +1,27 @@ +package attr; + +import iterator.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by IBM on 2017/4/12. + */ +public class LocalVariableTable extends AttributeInfo { + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter) { + + return null; + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + +} diff --git a/group17/785396327/4.9/attr/StackMapTable.java b/group17/785396327/4.9/attr/StackMapTable.java new file mode 100644 index 0000000000..8de15ac552 --- /dev/null +++ b/group17/785396327/4.9/attr/StackMapTable.java @@ -0,0 +1,32 @@ +package attr; + +import iterator.ByteCodeIterator; + +/** + * Created by IBM on 2017/4/12. + */ +public class StackMapTable extends AttributeInfo { + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); +// int len = iter.nextU4ToInt(); +// StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 +// String code = iter.nextUxToHexString(len); +// t.setOriginalCode(code); + +// return t; + return null; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group17/785396327/4.9/field/Field.java b/group17/785396327/4.9/field/Field.java new file mode 100644 index 0000000000..896398d113 --- /dev/null +++ b/group17/785396327/4.9/field/Field.java @@ -0,0 +1,33 @@ +package field; + +import constant.ConstantPool; +import iterator.ByteCodeIterator; + +/** + * Created by IBM on 2017/4/12. + */ +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool, ByteCodeIterator iter){ + + return null; + } +} diff --git a/group17/785396327/4.9/method/Method.java b/group17/785396327/4.9/method/Method.java new file mode 100644 index 0000000000..f3b51fd15d --- /dev/null +++ b/group17/785396327/4.9/method/Method.java @@ -0,0 +1,52 @@ +package method; + +import attr.CodeAttr; +import clz.ClassFile; +import iterator.ByteCodeIterator; + +/** + * Created by IBM on 2017/4/12. + */ +public class Method { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + return null; + + } +} From b0847da7eb523bf373b08f446b6f88e3dbe98494 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Thu, 13 Apr 2017 10:48:40 +0800 Subject: [PATCH 125/552] =?UTF-8?q?StackUtil=E6=94=B9=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit StackUtil改正 --- .../src/com/coding/basic/stack/StackUtil.java | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/StackUtil.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/StackUtil.java index bbcc7e05e2..53175a670f 100644 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/StackUtil.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/StackUtil.java @@ -9,13 +9,27 @@ public class StackUtil { */ public static void reverse(Stack s) { Stack tmp = new Stack(); - Stack tmp1 = new Stack(); - while(!s.isEmpty()) - tmp.push(s.pop()); - while(!tmp.isEmpty()) - tmp1.push(tmp.pop()); - while(!tmp1.isEmpty()) - s.push(tmp1.pop()); +// Stack tmp1 = new Stack(); +// while(!s.isEmpty()) +// tmp.push(s.pop()); +// while(!tmp.isEmpty()) +// tmp1.push(tmp.pop()); +// while(!tmp1.isEmpty()) +// s.push(tmp1.pop()); + /** + * 改正 + */ + int len = s.size(); + for(int i=0;i i) { + tmp.push(s.pop()); + } + s.push(top); + while(tmp.size() > 0){ + s.push(tmp.pop()); + } + } } /** @@ -90,9 +104,7 @@ public static boolean isValidPairs(String s){ } } } - System.out.println(stack.size()); - if(!stack.isEmpty()) return false; - return true; + return stack.size() == 0; } From 1a3f0bb01fe59b8e565bc5d8c6992d0ca375bd65 Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Thu, 13 Apr 2017 16:35:14 +0800 Subject: [PATCH 126/552] =?UTF-8?q?week6=20jvm=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/jvm/test/EmployeeV1.java | 31 +- .../coderising/jvm/attr/AttributeInfo.java | 19 ++ .../src/com/coderising/jvm/attr/CodeAttr.java | 126 ++++++++ .../coderising/jvm/attr/LineNumberTable.java | 70 +++++ .../jvm/attr/LocalVariableItem.java | 39 +++ .../jvm/attr/LocalVariableTable.java | 46 +++ .../coderising/jvm/attr/StackMapTable.java | 30 ++ .../com/coderising/jvm/clz/AccessFlag.java | 25 ++ .../src/com/coderising/jvm/clz/ClassFile.java | 92 ++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 24 ++ .../coderising/jvm/constant/ConstantInfo.java | 29 ++ .../coderising/jvm/constant/ConstantPool.java | 29 ++ .../coderising/jvm/constant/FieldRefInfo.java | 54 ++++ .../jvm/constant/MethodRefInfo.java | 55 ++++ .../jvm/constant/NameAndTypeInfo.java | 45 +++ .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 ++ .../com/coderising/jvm/constant/UTF8Info.java | 32 ++ .../src/com/coderising/jvm/field/Field.java | 44 +++ .../jvm/loader/ByteCodeIterator.java | 65 ++++ .../jvm/loader/ClassFileLoader.java | 140 +++++++++ .../jvm/loader/ClassFileParser.java | 170 +++++++++++ .../src/com/coderising/jvm/method/Method.java | 66 +++++ .../jvm/test/ClassFileloaderTest.java | 277 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++ .../src/com/coderising/jvm/util/Util.java | 24 ++ 27 files changed, 1604 insertions(+), 14 deletions(-) create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/method/Method.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java index 12e3d7efdd..c3e3931582 100644 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -1,28 +1,31 @@ package com.coderising.jvm.test; public class EmployeeV1 { - - - private String name; + + + private String name; private int age; - + public EmployeeV1(String name, int age) { this.name = name; - this.age = age; - } + this.age = age; + } public void setName(String name) { this.name = name; } - public void setAge(int age){ - this.age = age; + + public void setAge(int age) { + this.age = age; } - public void sayHello() { - System.out.println("Hello , this is class Employee "); + + 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(); - + + public static void main(String[] args) { + EmployeeV1 p = new EmployeeV1("Andy", 29); + p.sayHello(); + } } \ No newline at end of file diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..eb2a0a9a26 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,126 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; +import com.coderising.jvm.loader.ClassFileLoader; +import sun.text.CodePointIterator; + +import java.io.UnsupportedEncodingException; + + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attribute_name_index = iter.nextU2ToInt(); + if (!clzFile.getConstantPool().getUTF8String(attribute_name_index).equalsIgnoreCase(CODE)) { + throw new RuntimeException("CODE属性的attributenameindex解析错误"); + } + + int attribute_len = iter.nextU4ToInt(); + byte[] bytes = iter.getBytes(attribute_len); + ByteCodeIterator codeIter = new ByteCodeIterator(bytes); + + int max_stack = codeIter.nextU2ToInt(); + int max_locals = codeIter.nextU2ToInt(); + int code_len = codeIter.nextU4ToInt(); + /*byte[] codes = codeIter.getBytes(code_len); + + String code = null; + try { + + code = new String(codes, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } +*/ + String code = codeIter.nextUxToHexString(code_len); + CodeAttr codeAttr = new CodeAttr(attribute_name_index, attribute_len, max_stack, max_locals, code_len, code); + + int exception_table_len = codeIter.nextU2ToInt(); + if (exception_table_len > 0) { + throw new RuntimeException("方法的code属性中有异常未进行解析"); + } + + //code中的属性 + int attribute_count = codeIter.nextU2ToInt(); + /*byte[] bytes1 = codeIter.getBytes(attribute_length); + ByteCodeIterator codeAttrIter = new ByteCodeIterator(bytes1); + + while (codeAttrIter.isNotEnd()) { + int attributenameindex = codeAttrIter.nextU2ToInt(); + if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LINE_NUM_TABLE)) { + LineNumberTable table = LineNumberTable.parse(codeAttrIter, attributenameindex); + codeAttr.setLineNumberTable(table); + } else if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LOCAL_VAR_TABLE)) { + LocalVariableTable table = LocalVariableTable.parse(codeAttrIter,attributenameindex); + codeAttr.setLocalVariableTable(table); + }else if(clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(STACK_MAP_TABLE)){ + codeIter.back(2); + StackMapTable table = StackMapTable.parse(codeIter); + codeAttr.setStackMapTable(table); + } + }*/ + for (int i = 0; i < attribute_count; i++) { + int attributenameindex = codeIter.nextU2ToInt(); + if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LINE_NUM_TABLE)) { + LineNumberTable table = LineNumberTable.parse(codeIter, attributenameindex); + codeAttr.setLineNumberTable(table); + } else if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LOCAL_VAR_TABLE)) { + LocalVariableTable table = LocalVariableTable.parse(codeIter,attributenameindex); + codeAttr.setLocalVariableTable(table); + }else if(clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(STACK_MAP_TABLE)){ + codeIter.back(2); + StackMapTable table = StackMapTable.parse(codeIter); + codeAttr.setStackMapTable(table); + } + + } + + + + + return codeAttr; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LineNumberTable.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..2130cdb021 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,70 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter, int attribute_name_index) { + int ccc = (iter.codes.length); + long attribute_len = iter.nextU4ToInt(); + int line_number_table_len = iter.nextU2ToInt(); + LineNumberTable table = new LineNumberTable(attribute_name_index,(int)attribute_len); + + /*byte[] bytes = iter.getBytes(line_number_table_len); + ByteCodeIterator lntIter = new ByteCodeIterator(bytes);*/ + + + /*while (lntIter.isNotEnd()) { + //int c = lntIter.codes.length; + LineNumberItem item = new LineNumberItem(); + item.setStartPC(lntIter.nextU2ToInt()); + item.setLineNum(lntIter.nextU2ToInt()); + table.addLineNumberItem(item); + }*/ + + + for (int i = 0; i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter,int attribute_name_index) { + int attribute_len = iter.nextU2ToInt(); + + byte[] bytes = iter.getBytes(attribute_len); + ByteCodeIterator lvtIter = new ByteCodeIterator(bytes); + + LocalVariableTable table = new LocalVariableTable(attribute_name_index,attribute_len); + + while(lvtIter.isNotEnd()){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(lvtIter.nextU2ToInt()); + item.setLength(lvtIter.nextU2ToInt()); + item.setNameIndex(lvtIter.nextU2ToInt()); + item.setDescIndex(lvtIter.nextU2ToInt()); + item.setIndex(lvtIter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + + + return table; + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..4755266987 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..dc4dfff971 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,44 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + int accessflag = iter.nextU2ToInt(); + int nameindex = iter.nextU2ToInt(); + int descriptorindex = iter.nextU2ToInt(); + int attributecount = iter.nextU2ToInt(); + if (attributecount > 0) { + throw new RuntimeException("该字段中有属性" + attributecount + "个,未进行解析"); + } + Field field = new Field(accessflag, nameindex, descriptorindex, pool); + return field; + + } + public String toString() { + return pool.getUTF8String(this.nameIndex)+":"+pool.getUTF8String(this.descriptorIndex); + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..40b792eda5 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,65 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + public byte[] codes; + public int pos = 0; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } + + public boolean isNotEnd(){ + if(pos 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 Date: Thu, 13 Apr 2017 18:57:00 +0800 Subject: [PATCH 127/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4.5/iterator/ByteCodeIterator.java | 7 ++++- .../785396327/4.5/parse/ClassFilePaser.java | 28 ++++++++++++++++- .../4.5/test/ClassFileloaderTest.java | 4 +-- group17/785396327/4.9/attr/CodeAttr.java | 31 +++++++++++++++++-- .../785396327/4.9/attr/LineNumberTable.java | 19 +++++++++--- .../4.9/attr/LocalVariableTable.java | 21 +++++++++++-- group17/785396327/4.9/field/Field.java | 20 ++++++++---- group17/785396327/4.9/method/Method.java | 12 ++++++- 8 files changed, 122 insertions(+), 20 deletions(-) diff --git a/group17/785396327/4.5/iterator/ByteCodeIterator.java b/group17/785396327/4.5/iterator/ByteCodeIterator.java index 904537b00d..860694d41c 100644 --- a/group17/785396327/4.5/iterator/ByteCodeIterator.java +++ b/group17/785396327/4.5/iterator/ByteCodeIterator.java @@ -1,6 +1,5 @@ package iterator; -import org.junit.Test; import util.Util; import java.util.Arrays; @@ -47,4 +46,10 @@ public byte[] nextLengthBytes(int length) { codes = Arrays.copyOfRange(codes, length, codes.length); return result; } + + public int nextU4ToInt() { + byte[] buff = new byte[]{codes[0], codes[1], codes[2], codes[3]}; + codes = Arrays.copyOfRange(codes, 4, codes.length); + return Util.byteToInt(buff); + } } diff --git a/group17/785396327/4.5/parse/ClassFilePaser.java b/group17/785396327/4.5/parse/ClassFilePaser.java index 4e3053e78f..eb6514f449 100644 --- a/group17/785396327/4.5/parse/ClassFilePaser.java +++ b/group17/785396327/4.5/parse/ClassFilePaser.java @@ -5,11 +5,15 @@ import clz.ClassIndex; import com.sun.corba.se.impl.orbutil.closure.Constant; import constant.*; +import field.Field; import iterator.ByteCodeIterator; +import method.Method; import util.Util; +import java.util.List; + /** - * Created by IBM on 2017/4/11. + * Created by william on 2017/4/11. */ public class ClassFilePaser { private ClassFile classFile; @@ -33,9 +37,31 @@ public ClassFile parse(byte[] codes) { ClassIndex classIndex = parseClassIndex(iterator); classFile.setClassIndex(classIndex); + + iterator.nextU2ToInt();//没有接口直接读取两个字节 + + int fieldCount = iterator.nextU2ToInt(); + for (int i = 0; i < fieldCount; i++) { + Field field = parseField(iterator, constantPool); + classFile.addField(field); + } + + int methodCount = iterator.nextU2ToInt(); + for (int i = 0; i < methodCount; i++) { + Method method = parseMethod(iterator, classFile); + classFile.addMethod(method); + } return classFile; } + private Method parseMethod(ByteCodeIterator iterator, ClassFile classFile) { + return Method.parse(classFile,iterator); + } + + private Field parseField(ByteCodeIterator iterator, ConstantPool constantPool) { + return Field.parse(constantPool, iterator); + } + private ClassIndex parseClassIndex(ByteCodeIterator iterator) { ClassIndex classIndex = new ClassIndex(); classIndex.setThisClassIndex(iterator.nextU2ToInt()); diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java index f1361b07a0..8aacc9ee57 100644 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -19,7 +19,7 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "jvm_1/EmployeeV1"; - static String path1 = "G:\\Git\\homework\\coding2017\\group17\\785396327\\3.12\\out\\production\\785396327"; + static String path1 = "G:\\Git\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; static String path2 = "C:\temp"; static ClassFile clzFile = null; @@ -29,7 +29,7 @@ public class ClassFileloaderTest { String className = "jvm_1.EmployeeV1"; clzFile = loader.loadClass(className); -// clzFile.print(); + clzFile.print(); } diff --git a/group17/785396327/4.9/attr/CodeAttr.java b/group17/785396327/4.9/attr/CodeAttr.java index b069203d4f..bfa3eeacc8 100644 --- a/group17/785396327/4.9/attr/CodeAttr.java +++ b/group17/785396327/4.9/attr/CodeAttr.java @@ -1,6 +1,7 @@ package attr; import clz.ClassFile; +import constant.ConstantInfo; import iterator.ByteCodeIterator; /** @@ -42,9 +43,33 @@ public void setLocalVariableTable(LocalVariableTable t) { } public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { - - - return null; + //按照属性表格式读取 + int attributeNameIndex = iter.nextU2ToInt(); + int attributeLength = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLength = iter.nextU4ToInt(); + byte[] code = iter.nextLengthBytes(codeLength); + int exceptionTableLength = iter.nextU2ToInt();//跳过异常表 + System.out.println("Code属性表中的异常表元素大小:" + exceptionTableLength); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, new String(code)); + int attributesCount = iter.nextU2ToInt(); + //code属性表中又有属性 + for (int i = 0; i < attributesCount; i++) { + int attrIndex = iter.nextU2ToInt(); + String utf8String = clzFile.getConstantPool().getUTF8String(attrIndex); +// clzFile.getConstantPool().getConstantInfo(attrIndex). + if ("LineNumberTable".equals(utf8String)) { + codeAttr.setLineNumberTable(LineNumberTable.parse(iter)); + } else if ("LocalVariableTable".equals(utf8String)) { + codeAttr.setLocalVariableTable(LocalVariableTable.parse(iter)); + } else if ("stackMapTable".equals(utf8String)) { + codeAttr.setStackMapTable(StackMapTable.parse(iter)); + } else { + throw new RuntimeException("other attribute in code table"); + } + } + return codeAttr; } private void setStackMapTable(StackMapTable t) { diff --git a/group17/785396327/4.9/attr/LineNumberTable.java b/group17/785396327/4.9/attr/LineNumberTable.java index f875aa2427..0b857f4e0f 100644 --- a/group17/785396327/4.9/attr/LineNumberTable.java +++ b/group17/785396327/4.9/attr/LineNumberTable.java @@ -6,7 +6,7 @@ import java.util.List; /** - * Created by IBM on 2017/4/12. + * Created by william on 2017/4/12. */ public class LineNumberTable extends AttributeInfo { List items = new ArrayList(); @@ -35,9 +35,20 @@ public LineNumberTable(int attrNameIndex, int attrLen) { } - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; + public static LineNumberTable parse(ByteCodeIterator iter) { + int attributeNameIndex = iter.nextU2ToInt(); + int attributeLength = iter.nextU4ToInt(); + int lineNumberTableLength = iter.nextU2ToInt(); + LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex,attributeLength); + for (int i = 0; i < lineNumberTableLength; i++) { + int start_pc = iter.nextU2ToInt(); + int lineNumber = iter.nextU2ToInt(); + LineNumberItem lineNumberItem = new LineNumberItem(); + lineNumberItem.setLineNum(lineNumber); + lineNumberItem.setStartPC(start_pc); + lineNumberTable.addLineNumberItem(lineNumberItem); + } + return lineNumberTable; } diff --git a/group17/785396327/4.9/attr/LocalVariableTable.java b/group17/785396327/4.9/attr/LocalVariableTable.java index 060ed31e85..83d21a883e 100644 --- a/group17/785396327/4.9/attr/LocalVariableTable.java +++ b/group17/785396327/4.9/attr/LocalVariableTable.java @@ -16,8 +16,25 @@ public LocalVariableTable(int attrNameIndex, int attrLen) { } public static LocalVariableTable parse(ByteCodeIterator iter) { - - return null; + int attributeNameIndex = iter.nextU2ToInt(); + int attributeLength = iter.nextU4ToInt(); + int localVariableTableLength = iter.nextU2ToInt(); + LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex, attributeLength); + for (int i = 0; i < localVariableTableLength; i++) { + int startPc = iter.nextU2ToInt(); + int length = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int index = iter.nextU2ToInt(); + LocalVariableItem localVariableItem = new LocalVariableItem(); + localVariableItem.setStartPC(startPc); + localVariableItem.setLength(length); + localVariableItem.setNameIndex(nameIndex); + localVariableItem.setDescIndex(descIndex); + localVariableItem.setIndex(index); + localVariableTable.addLocalVariableItem(localVariableItem); + } + return localVariableTable; } private void addLocalVariableItem(LocalVariableItem item) { diff --git a/group17/785396327/4.9/field/Field.java b/group17/785396327/4.9/field/Field.java index 896398d113..dda04d2d4b 100644 --- a/group17/785396327/4.9/field/Field.java +++ b/group17/785396327/4.9/field/Field.java @@ -12,10 +12,9 @@ public class Field { private int descriptorIndex; - private ConstantPool pool; - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { this.accessFlag = accessFlag; this.nameIndex = nameIndex; @@ -24,10 +23,19 @@ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool po } + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + int accessFlags = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptor_index = iter.nextU2ToInt(); + int attributesCount = iter.nextU2ToInt(); + if (attributesCount > 0) { + throw new RuntimeException("Field字段表,暂时不支持存在属性"); + } + return new Field(accessFlags, nameIndex, descriptor_index, pool); + } - - public static Field parse(ConstantPool pool, ByteCodeIterator iter){ - - return null; + @Override + public String toString() { + return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex); } } diff --git a/group17/785396327/4.9/method/Method.java b/group17/785396327/4.9/method/Method.java index f3b51fd15d..c0836c8bdc 100644 --- a/group17/785396327/4.9/method/Method.java +++ b/group17/785396327/4.9/method/Method.java @@ -3,6 +3,7 @@ import attr.CodeAttr; import clz.ClassFile; import iterator.ByteCodeIterator; +import util.Util; /** * Created by IBM on 2017/4/12. @@ -46,7 +47,16 @@ public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIn public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { - return null; + int accessFlags = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributesCount = iter.nextU2ToInt();//有几个属性 + Method method = new Method(clzFile, accessFlags, nameIndex, descriptorIndex); + for (int i = 0; i < attributesCount; i++) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + method.codeAttr = codeAttr; + } + return new Method(clzFile, accessFlags, nameIndex, descriptorIndex); } } From 62cd9d89adfc6352923d1a227c713a0dc8518f9c Mon Sep 17 00:00:00 2001 From: mengxz <82427129@qq.com> Date: Thu, 13 Apr 2017 19:00:07 +0800 Subject: [PATCH 128/552] homework 17/4/13 parse for method and field ,didn't completed --- .../coderising/jvm/attr/AttributeInfo.java | 7 + .../coderising/jvm/attr/LineNumberTable.java | 10 ++ .../jvm/attr/LocalVariableItem.java | 10 ++ .../jvm/attr/LocalVariableTable.java | 10 ++ .../coderising/jvm/attr/StackMapTable.java | 10 ++ .../com/coderising/jvm/clz/ClassFile.java | 41 ++--- .../coderising/jvm/constant/ClassInfo.java | 25 +++- .../coderising/jvm/constant/ConstantInfo.java | 5 + .../coderising/jvm/constant/ConstantPool.java | 25 ++-- .../coderising/jvm/constant/DoubleInfo.java | 4 + .../coderising/jvm/constant/FieldRefInfo.java | 50 ++++--- .../coderising/jvm/constant/FloatInfo.java | 5 + .../coderising/jvm/constant/IntegerInfo.java | 5 + .../com/coderising/jvm/constant/LongInfo.java | 5 + .../jvm/constant/MethodRefInfo.java | 59 +++++--- .../jvm/constant/NameAndTypeInfo.java | 49 +++--- .../jvm/constant/NullConstantInfo.java | 4 + .../coderising/jvm/constant/StringInfo.java | 36 +++-- .../com/coderising/jvm/constant/UTF8Info.java | 36 +++-- .../java/com/coderising/jvm/field/Field.java | 75 ++++++++-- .../jvm/loader/ByteCodeIterator.java | 7 + .../jvm/loader/ClassFileParser.java | 140 ++++++++++++------ .../com/coderising/jvm/method/Method.java | 66 +++++++-- .../java/com/coderising/jvm/util/Util.java | 3 + .../jvm/loader/ClassFileLoaderTest.java | 2 +- 25 files changed, 506 insertions(+), 183 deletions(-) create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java index 11e25039c3..a4d82c25c9 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java @@ -1,5 +1,8 @@ package com.coderising.jvm.attr; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + public abstract class AttributeInfo { public static final String CODE = "Code"; public static final String CONST_VALUE = "ConstantValue"; @@ -15,4 +18,8 @@ public AttributeInfo(int attrNameIndex, int attrLen) { this.attrNameIndex = attrNameIndex; this.attrLen = attrLen; } + + public static AttributeInfo parse(ConstantPool cp, ByteCodeIterator itr){ + throw new RuntimeException("AttributeInfo parse hasn't implemented"); + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..cccbce87b5 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.attr; + +public class LineNumberTable extends AttributeInfo { + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + // TODO Auto-generated constructor stub + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..74ca8df92e --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem extends AttributeInfo { + + public LocalVariableItem(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + // TODO Auto-generated constructor stub + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..2a3af25d77 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.attr; + +public class LocalVariableTable extends AttributeInfo { + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + // TODO Auto-generated constructor stub + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..525d6a9071 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.attr; + +public class StackMapTable extends AttributeInfo{ + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + // TODO Auto-generated constructor stub + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java index fee1cc2415..7460b4953b 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -17,31 +17,38 @@ public class ClassFile { private ConstantPool pool; private List fields = new ArrayList(); private List methods = new ArrayList(); - - public void print(){ - - if(this.accessFlag.isPublicClass()){ + + 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()); - + System.out.println("Class Name:" + getClassName()); + + System.out.println("Super Class Name:" + getSuperClassName()); } - public String getClassName(){ + public String getClassName() { int index = this.clzIndex.getThisClassIndex(); - ClassInfo c = (ClassInfo)pool.getConstantInfo(index); + ClassInfo c = (ClassInfo) pool.getConstantInfo(index); return c.getClassName(); } - public String getSuperClassName(){ + + public String getSuperClassName() { int index = this.clzIndex.getSuperClassIndex(); - ClassInfo c = (ClassInfo)pool.getConstantInfo(index); + ClassInfo c = (ClassInfo) pool.getConstantInfo(index); return c.getClassName(); } + + public void addFields(Field f) { + this.fields.add(f); + } + + public void addMethods(Method m) { + this.methods.add(m); + } + /* * getter setter - * */ public int getMinorVersion() { return minorVersion; @@ -87,16 +94,16 @@ public List getFields() { return fields; } - public void addFields(Field f){ - this.fields.add(f); + public void setFields(List fl) { + this.fields = fl; } public List getMethods() { return methods; } - public void addMethods(Method m){ - this.methods.add(m); + public void setMethods(List ml) { + this.methods = ml; } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java index 772ec3f1e0..8758755887 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java @@ -4,17 +4,19 @@ public class ClassInfo extends ConstantInfo { private int type = CLASS_INFO;// u1 tag private int utf8Index;// u2 name_index + public ClassInfo(ConstantPool c) { + super(c); + } + @Override public int getType() { return type; } - public int getUtf8Index() { - return utf8Index; - } - - public void setUtf8Index(int name_index) { - this.utf8Index = name_index; + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " ClassInfo" + + ",u2 name_index:" + getUtf8Index()); } public String getClassName() { @@ -23,4 +25,15 @@ public String getClassName() { .getConstantInfo(name_index); return utf8.getValue(); } + + /* + * getter setter + */ + public int getUtf8Index() { + return utf8Index; + } + + public void setUtf8Index(int name_index) { + this.utf8Index = name_index; + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java index 885fba98b5..a485aa25f9 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java @@ -22,6 +22,11 @@ public ConstantInfo(ConstantPool cp){ public abstract int getType(); + public abstract void print(); + + /* + * getter setter + */ public ConstantPool getConstantPool(){ return this.constantPool; } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java index 009b2c45c4..c1239d9220 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java @@ -5,7 +5,6 @@ public class ConstantPool { private List cl = new ArrayList(); - private int constantPoolSize; public void addConstantInfo(ConstantInfo e){ cl.add(e); @@ -18,18 +17,22 @@ public ConstantInfo getConstantInfo(int index) { public int getSize() { return cl.size() - 1;// 减去常量池的长度一项 } - /* - * getter setter - */ - public int getConstantPoolSize() { - return constantPoolSize; - } - - public void setConstantPoolSize(int constantPoolSize) { - this.constantPoolSize = constantPoolSize; - } public String getUTF8String(int nameIndex) { return ((UTF8Info)getConstantInfo(nameIndex)).getValue(); } + + public String print(){ + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < cl.size(); i++) { + ConstantInfo c = cl.get(i); + if(i<10){ + System.out.print("0"+i+". "); + }else{ + System.out.print(i+". "); + } + c.print(); + } + return sb.toString(); + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java index 9d6112ee35..25a0628678 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java @@ -7,4 +7,8 @@ public class DoubleInfo extends ConstantInfo { public int getType() { return type; } + @Override + public void print() { + + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java index 8d3a8c25c8..3170fa25d1 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java @@ -1,34 +1,29 @@ package com.coderising.jvm.constant; public class FieldRefInfo extends ConstantInfo { - private int type = FIELD_INFO;//u1 tag - private int class_index;//u2 class_index - private int name_and_type_index;//u2 name_and_type_index + private int type = FIELD_INFO;// u1 tag + private int class_index;// u2 class_index + private int name_and_type_index;// u2 name_and_type_index + + public FieldRefInfo(ConstantPool pool) { + super(pool); + } @Override public int getType() { return type; } - public int getClass_index() { - return class_index; - } - - public void setClass_index(int class_index) { - this.class_index = class_index; - } - - public int getName_and_type_index() { - return name_and_type_index; - } - - public void setName_and_type_index(int name_and_type_index) { - this.name_and_type_index = name_and_type_index; + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " FieldInfo" + + ",u2 class_index:" + getClass_index() + + ",u2 name_and_type_index:" + getName_and_type_index()); } @Override public String toString() { - return getClassName() + ":"+getFieldName()+" : "+getFieldType(); + return getClassName() + ":" + getFieldName() + " : " + getFieldType(); } public String getClassName() { @@ -49,4 +44,23 @@ public String getFieldType() { return nameAndTypeInfo.getTypeInfo(); } + /* + * getter setter + */ + public int getClass_index() { + return class_index; + } + + public void setClass_index(int class_index) { + this.class_index = class_index; + } + + public int getName_and_type_index() { + return name_and_type_index; + } + + public void setName_and_type_index(int name_and_type_index) { + this.name_and_type_index = name_and_type_index; + } + } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java index d02f37f6d8..c20ebee388 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java @@ -7,4 +7,9 @@ public class FloatInfo extends ConstantInfo { public int getType() { return type; } + @Override + public void print() { + // TODO Auto-generated method stub + + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java index b89a8925c4..35da3f20ef 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java @@ -8,6 +8,11 @@ public class IntegerInfo extends ConstantInfo { public int getType() { return type; } + @Override + public void print() { + // TODO Auto-generated method stub + + } public int getNum() { return Num; diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java index 23c80a2640..61a19f320c 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java @@ -7,4 +7,9 @@ public class LongInfo extends ConstantInfo { public int getType() { return type; } + @Override + public void print() { + // TODO Auto-generated method stub + + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java index 4064e09b39..ad59210e84 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java @@ -1,29 +1,12 @@ package com.coderising.jvm.constant; public class MethodRefInfo extends ConstantInfo { - private int type = METHOD_INFO;//u1 tag - private int classInfoIndex;//u2 class_index - private int nameAndTypeIndex;//u2 name_and_type_index + private int type = METHOD_INFO;// u1 tag + private int classInfoIndex;// u2 class_index + private int nameAndTypeIndex;// u2 name_and_type_index - @Override - public int getType() { - return type; - } - - public int getClassInfoIndex() { - return classInfoIndex; - } - - public void setClassInfoIndex(int class_index) { - this.classInfoIndex = class_index; - } - - public int getNameAndTypeIndex() { - return nameAndTypeIndex; - } - - public void setNameAndTypeIndex(int name_and_type_index) { - this.nameAndTypeIndex = name_and_type_index; + public MethodRefInfo(ConstantPool pool) { + super(pool); } public String getClassName() { @@ -44,9 +27,41 @@ public String getParamsAndReturnType() { return nt.getTypeInfo(); } + @Override + public int getType() { + return type; + } + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " MethodInfo" + + ",u2 class_index:" + getClassInfoIndex() + + ",u2 name_and_type_index" + getNameAndTypeIndex()); + } + @Override public String toString() { return getClassName() + ":" + getMethodName() + ":" + getParamsAndReturnType(); } + + /* + * getter setter + */ + public int getClassInfoIndex() { + return classInfoIndex; + } + + public void setClassInfoIndex(int class_index) { + this.classInfoIndex = class_index; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + public void setNameAndTypeIndex(int name_and_type_index) { + this.nameAndTypeIndex = name_and_type_index; + } + } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java index 61b434d245..08e9b6a0f2 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -2,14 +2,44 @@ public class NameAndTypeInfo extends ConstantInfo { private int type = NAME_AND_TYPE_INFO;// u1 tag - private int name_index;//u2 name_index - private int descriptor_index;//u2 descriptor_index + private int name_index;// u2 name_index + private int descriptor_index;// u2 descriptor_index + + public NameAndTypeInfo(ConstantPool pool) { + super(pool); + } @Override public int getType() { return type; } + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " NameAndTypeInfo" + + ",u2 name_index:" + getName_index() + ",u2 descriptor_index:" + + getDescriptor_index()); + } + + @Override + public String toString() { + return "(" + getName() + "," + getTypeInfo() + ")"; + } + + public String getName() { + UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(name_index); + return u.getValue(); + } + + public String getTypeInfo() { + UTF8Info u = (UTF8Info) this.constantPool + .getConstantInfo(descriptor_index); + return u.getValue(); + } + + /* + * getter setter + */ public int getName_index() { return name_index; } @@ -25,19 +55,4 @@ public int getDescriptor_index() { public void setDescriptor_index(int descriptor_index) { this.descriptor_index = descriptor_index; } - - public String getName() { - UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(name_index); - return u.getValue(); - } - - public String getTypeInfo() { - UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(descriptor_index); - return u.getValue(); - } - - @Override - public String toString() { - return "(" + getName() + "," + getTypeInfo() + ")"; - } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java index b383988fe7..2c67e88d37 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java @@ -6,5 +6,9 @@ public class NullConstantInfo extends ConstantInfo{ public int getType() { return -1; } + @Override + public void print() { + System.out.println("NullConstantInfo"); + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java index b2bbbe9093..4fac07f7cc 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java @@ -1,25 +1,43 @@ package com.coderising.jvm.constant; public class StringInfo extends ConstantInfo { - private int type = STRING_INFO;//u1 tag - private int string_index;//u2 string_index + private int type = STRING_INFO;// u1 tag + private int string_index;// u2 string_index + + public StringInfo(ConstantPool cp) { + super(cp); + } + @Override public int getType() { return type; } - public int getString_index() { - return string_index; - } - public void setString_index(int string_index) { - this.string_index = string_index; + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " StringInfo" + + ",u2 string_index:" + getString_index()); } - public String getString(){ - UTF8Info u = (UTF8Info)this.constantPool.getConstantInfo(string_index); + + public String getString() { + UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(string_index); return u.getValue(); } + @Override public String toString() { return getString(); } + /* + * getter setter + */ + public int getString_index() { + return string_index; + } + + public void setString_index(int string_index) { + this.string_index = string_index; + } + } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java index 4bcf998504..ef5eef58a2 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java @@ -1,31 +1,47 @@ package com.coderising.jvm.constant; public class UTF8Info extends ConstantInfo { - private int type = UTF8_INFO;//u1 tag - private int length;//u2 length - private String value;//n 个 u1 + private int type = UTF8_INFO;// u1 tag + private int length;// u2 length + private String value;// n 个 u1 + public UTF8Info(ConstantPool pool) { super(pool); } + @Override public int getType() { return type; } - public int getLength() { - return length; + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " UTF8Info" + ",u2 length:" + + getLength() + ",u1 bytes[" + getLength() + "] " + getValue()); } - public void setLength(int length) { - this.length = length; + + @Override + public String toString() { + return "UTF8Info [type=" + type + ",length=" + length + ",value=" + + value + "]"; } + + /* + * getter setter + */ public String getValue() { return value; } + public void setValue(String value) { this.value = value; } - @Override - public String toString() { - return "UTF8Info [type="+type+",length="+length+",value="+value+"]"; + + public int getLength() { + return length; } + public void setLength(int length) { + this.length = length; + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java index 19fcec9e46..f28d2d6140 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java @@ -1,29 +1,60 @@ package com.coderising.jvm.field; +import java.util.List; + +import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; public class Field { - private int accessFlag;//u2 access_flags - private int nameIndex;//u2 name_index - private int descriptorIndex;//u2 descriptor_index - //attr 属性表信息首次写jvm先放弃,以后再加 - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - + private int accessFlag;// u2 access_flags + private int nameIndex;// u2 name_index + private int descriptorIndex;// u2 descriptor_index + private int attrCount;//u2 attributes_count + private List attributeInfos;//attribute_info attributes[attributes_count]; + + public Field(){} + public Field(int accessFlag, int nameIndex, int descriptorIndex, + int attrCount) { + super(); this.accessFlag = accessFlag; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; - this.pool = pool; + this.attrCount = attrCount; + } + + /** + * 读取字段
+ * field_info {
+ * u2 access_flags,
+ * u2 name_index,
+ * u2 descriptor_index,
+ * u2 attributes_count,
+ * attribute_info attributes[attributes_count]
+ * } + * + * @param itr + * @return Field + */ + public static Field parse(ConstantPool pool, ByteCodeIterator itr) { + int accessFlag = itr.nextU2toInt(); + int nameIndex = itr.nextU2toInt(); + int descriptorIndex = itr.nextU2toInt(); + int attrCount = itr.nextU2toInt(); + Field field = new Field(accessFlag, nameIndex, descriptorIndex, attrCount); + for (int i = 0; i < attrCount; i++) { + field.addAttributeInfo(AttributeInfo.parse(pool, itr)); + } + return field; } - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - return null; + public void addAttributeInfo(AttributeInfo a) { + this.attributeInfos.add(a); } + /* + * getter setter + */ public int getAccessFlag() { return accessFlag; } @@ -47,5 +78,21 @@ public int getDescriptorIndex() { public void setDescriptorIndex(int descriptorIndex) { this.descriptorIndex = descriptorIndex; } - + + public int getAttrCount() { + return attrCount; + } + + public void setAttrCount(int attrCount) { + this.attrCount = attrCount; + } + + public List getAttributeInfos() { + return attributeInfos; + } + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } + } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java index 7bd30d2832..5cdf37fdaf 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java @@ -38,4 +38,11 @@ public String nextUxtoHexString(int len) { } return Util.byteToHexString(bytes); } + public String nextUxtoAscii(int len){ + byte[] bytes = new byte[len]; + for (int i = 0; i < len; i++) { + bytes[i] = codes[pos++]; + } + return Util.byteToAscii(bytes); + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java index 87f748c2d0..90ae51a12c 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java @@ -1,5 +1,7 @@ package com.coderising.jvm.loader; +import java.util.List; + import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; @@ -13,36 +15,62 @@ import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFileParser { /** * 读取ClassFile对象 + * * @param codes * @return */ public ClassFile parse(byte[] codes) { ClassFile cf = new ClassFile(); ByteCodeIterator itr = new ByteCodeIterator(codes); - String magicNumber = itr.nextUxtoHexString(4);//1读取魔数 + String magicNumber = itr.nextUxtoHexString(4);// 1读取魔数 if (!magicNumber.equals("cafebabe")) { throw new RuntimeException("magicNum not ok"); } - cf.setMajorVersion(itr.nextU2toInt());//2读取主版本号 - cf.setMinorVersion(itr.nextU2toInt());//3读取次版本号 + cf.setMinorVersion(itr.nextU2toInt());// 3读取次版本号 + cf.setMajorVersion(itr.nextU2toInt());// 2读取主版本号 - ConstantPool pool = parseConstantPool(itr);//4、5读取常量池 + ConstantPool pool = parseConstantPool(itr);// 4、5读取常量池 + pool.print();// 打印常量池 cf.setPool(pool); - - cf.setAccessFlag(new AccessFlag(itr.nextU2toInt()));//6读取访问标志 - - ClassIndex classIndex = parseClassIndex(itr);//读取类引用7this和8super + + cf.setAccessFlag(new AccessFlag(itr.nextU2toInt()));// 6读取访问标志 + + ClassIndex classIndex = parseClassIndex(itr);// 读取类引用7this和8super cf.setClzIndex(classIndex); - + + int interfaceCount = itr.nextU2toInt();//读取接口信息 + if (interfaceCount != 0) { + throw new RuntimeException( + "the interface isn't 0,parser has not been implemented yet."); + } + + int FieldCount = itr.nextU2toInt();//读取字段信息 + for (int i = 0; i < FieldCount; i++) { + Field f = Field.parse(pool, itr); + cf.addFields(f); + } + + int MethodCount = itr.nextU2toInt(); + for (int i = 0; i < MethodCount; i++) {//读取方法信息 + Method m = Method.parse(pool, itr); + cf.addMethods(m); + } + return cf; } /** - * 读取this super对象引用 + * 读取this super对象引用
+ * classIndex_Info {
+ * u2 this_class,
+ * u2 super_class
+ * } + * * @param itr * @return */ @@ -52,74 +80,111 @@ public ClassIndex parseClassIndex(ByteCodeIterator itr) { classIndex.setSuperClassIndex(itr.nextU2toInt()); return classIndex; } + /** * 读取常量池 + * * @param itr * @return */ public ConstantPool parseConstantPool(ByteCodeIterator itr) { int count = itr.nextU2toInt(); ConstantPool pool = new ConstantPool(); - pool.setConstantPoolSize(count);; pool.addConstantInfo(new NullConstantInfo());// 占住常量池的第一个,常量池是的index从1开始 for (int i = 1; i < count; i++) { int tag = itr.nextU1toInt(); switch (tag) { case ConstantInfo.CLASS_INFO: - ClassInfo classInfo = new ClassInfo(); + ClassInfo classInfo = new ClassInfo(pool); classInfo.setUtf8Index(itr.nextU2toInt()); pool.addConstantInfo(classInfo); + + /* + * System.out.println(i + ". u1 tag:" + + * classInfo.getType()+" ClassInfo" + ",u2 name_index:" + + * classInfo.getUtf8Index()); + */ break; case ConstantInfo.UTF8_INFO: UTF8Info utf8Info = new UTF8Info(pool); int length = itr.nextU2toInt(); - String value = itr.nextUxtoHexString(length); + String value = itr.nextUxtoAscii(length); utf8Info.setLength(length); utf8Info.setValue(value); pool.addConstantInfo(utf8Info); + + /* + * System.out.println(i + ". u1 tag:" + utf8Info.getType() + + * " UTF8Info" + ",u2 length:" + utf8Info.getLength() + + * ",u1 bytes[" + utf8Info.getLength() + "] " + + * utf8Info.getValue()); + */ break; case ConstantInfo.STRING_INFO: - StringInfo si = new StringInfo(); + StringInfo si = new StringInfo(pool); si.setString_index(itr.nextU2toInt()); pool.addConstantInfo(si); + + /* + * System.out.println(i + ". u1 tag:" + + * si.getType()+" StringInfo" + ",u2 string_index:" + + * si.getString_index()); + */ break; case ConstantInfo.NAME_AND_TYPE_INFO: - NameAndTypeInfo nt = new NameAndTypeInfo(); + NameAndTypeInfo nt = new NameAndTypeInfo(pool); nt.setName_index(itr.nextU2toInt()); nt.setDescriptor_index(itr.nextU2toInt()); pool.addConstantInfo(nt); + + /* + * System.out.println(i + ". u1 tag:" + nt.getType()+ + * " NameAndTypeInfo" + ",u2 name_index:" + nt.getName_index() + + * ",u2 descriptor_index:" + nt.getDescriptor_index()); + */ break; case ConstantInfo.METHOD_INFO: - MethodRefInfo m = new MethodRefInfo(); + MethodRefInfo m = new MethodRefInfo(pool); m.setClassInfoIndex(itr.nextU2toInt()); m.setNameAndTypeIndex(itr.nextU2toInt()); pool.addConstantInfo(m); + + /* + * System.out.println(i + ". u1 tag:" + m.getType()+ + * " MethodInfo" + ",u2 class_index:" + m.getClassInfoIndex() + + * ",u2 name_and_type_index" + m.getNameAndTypeIndex()); + */ break; case ConstantInfo.FIELD_INFO: - FieldRefInfo f = new FieldRefInfo(); + FieldRefInfo f = new FieldRefInfo(pool); f.setClass_index(itr.nextU2toInt()); f.setName_and_type_index(itr.nextU2toInt()); pool.addConstantInfo(f); - break; - /*case ConstantInfo.FLOAT_INFO: - - break; - - case ConstantInfo.INTEGER_INFO: - break; - - case ConstantInfo.DOUBLE_INFO: + /* + * System.out.println(i + ". u1 tag:" + f.getType()+ + * " FieldInfo" + ",u2 class_index:" + f.getClass_index() + + * ",u2 name_and_type_index:" + f.getName_and_type_index()); + */ break; - case ConstantInfo.LONG_INFO: - break;*/ + /* + * case ConstantInfo.FLOAT_INFO: + * + * break; + * + * case ConstantInfo.INTEGER_INFO: break; + * + * case ConstantInfo.DOUBLE_INFO: break; + * + * case ConstantInfo.LONG_INFO: break; + */ default: throw new RuntimeException("the constant pool tag " + tag @@ -128,22 +193,5 @@ public ConstantPool parseConstantPool(ByteCodeIterator itr) { } return pool; } - /** - * 读取字段 - * @param itr - * @return - */ - public Field parseField(ByteCodeIterator itr){ - - return null; - } - /** - * 读取方法 - * @param itr - * @return - */ - public Field parseMethod(ByteCodeIterator itr){ - - return null; - } + } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java index 456e5d9f94..04b0df7c3c 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java @@ -1,45 +1,87 @@ package com.coderising.jvm.method; -import com.coderising.jvm.attr.CodeAttr; +import java.util.List; + +import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; public class Method { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private CodeAttr codeAttr; - + private int accessFlag;// u2 access_flags + private int nameIndex;// u2 name_index + private int descriptorIndex;// u2 descriptor_index + private int attrCount;//u2 attributes_count + private List attributeInfos;//attribute_info attributes[attributes_count]; + private ClassFile clzFile; + + /** + * 读取方法 method_info {
+ * u2 access_flags,
+ * u2 name_index,
+ * u2 descriptor_index,
+ * u2 attributes_count,
+ * attribute_info attributes[attributes_count]
+ * } + * + * @param itr + * @return + */ + public static Method parse(ConstantPool cp, ByteCodeIterator itr) { + int accessFlag = itr.nextU2toInt(); + int nameIndex= itr.nextU2toInt(); + int descriptorIndex = itr.nextU2toInt(); + int attrCount = itr.nextU2toInt(); + + return null; + } + /* * getter setter */ public int getAccessFlag() { return accessFlag; } + public void setAccessFlag(int accessFlag) { this.accessFlag = accessFlag; } + public int getNameIndex() { return nameIndex; } + public void setNameIndex(int nameIndex) { this.nameIndex = nameIndex; } + public int getDescriptorIndex() { return descriptorIndex; } + public void setDescriptorIndex(int descriptorIndex) { this.descriptorIndex = descriptorIndex; } - public CodeAttr getCodeAttr() { - return codeAttr; + + public List getAttributeInfos() { + return attributeInfos; } - public void setCodeAttr(CodeAttr codeAttr) { - this.codeAttr = codeAttr; + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; } + public ClassFile getClzFile() { return clzFile; } - + + public int getAttrCount() { + return attrCount; + } + + public void setAttrCount(int attrCount) { + this.attrCount = attrCount; + } + } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java index 2201593cd2..c69ba73610 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java @@ -18,4 +18,7 @@ public static String byteToHexString(byte[] codes) { } return buffer.toString(); } + public static String byteToAscii(byte[] codes){ + return new String(codes); + } } diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java index 194db3cba0..da5ab5f0a7 100644 --- a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java +++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java @@ -81,7 +81,7 @@ public void testMagicNumber(){ @Test public void testVersion(){ Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); + Assert.assertEquals(51, clzFile.getMajorVersion()); } @Test From aa8a20dff826a2f4bac57be24191908cfbc5850c Mon Sep 17 00:00:00 2001 From: gongxun Date: Thu, 13 Apr 2017 21:46:42 +0800 Subject: [PATCH 129/552] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.9/attr/CodeAttr.java | 6 +++--- group17/785396327/4.9/attr/LineNumberTable.java | 3 +-- group17/785396327/4.9/attr/LocalVariableTable.java | 5 ++--- group17/785396327/4.9/attr/StackMapTable.java | 5 ++--- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/group17/785396327/4.9/attr/CodeAttr.java b/group17/785396327/4.9/attr/CodeAttr.java index bfa3eeacc8..b83508d876 100644 --- a/group17/785396327/4.9/attr/CodeAttr.java +++ b/group17/785396327/4.9/attr/CodeAttr.java @@ -60,11 +60,11 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { String utf8String = clzFile.getConstantPool().getUTF8String(attrIndex); // clzFile.getConstantPool().getConstantInfo(attrIndex). if ("LineNumberTable".equals(utf8String)) { - codeAttr.setLineNumberTable(LineNumberTable.parse(iter)); + codeAttr.setLineNumberTable(LineNumberTable.parse(iter, attrIndex)); } else if ("LocalVariableTable".equals(utf8String)) { - codeAttr.setLocalVariableTable(LocalVariableTable.parse(iter)); + codeAttr.setLocalVariableTable(LocalVariableTable.parse(iter, attrIndex)); } else if ("stackMapTable".equals(utf8String)) { - codeAttr.setStackMapTable(StackMapTable.parse(iter)); + codeAttr.setStackMapTable(StackMapTable.parse(iter, attrIndex)); } else { throw new RuntimeException("other attribute in code table"); } diff --git a/group17/785396327/4.9/attr/LineNumberTable.java b/group17/785396327/4.9/attr/LineNumberTable.java index 0b857f4e0f..acd781fb3e 100644 --- a/group17/785396327/4.9/attr/LineNumberTable.java +++ b/group17/785396327/4.9/attr/LineNumberTable.java @@ -35,8 +35,7 @@ public LineNumberTable(int attrNameIndex, int attrLen) { } - public static LineNumberTable parse(ByteCodeIterator iter) { - int attributeNameIndex = iter.nextU2ToInt(); + public static LineNumberTable parse(ByteCodeIterator iter,int attributeNameIndex) { int attributeLength = iter.nextU4ToInt(); int lineNumberTableLength = iter.nextU2ToInt(); LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex,attributeLength); diff --git a/group17/785396327/4.9/attr/LocalVariableTable.java b/group17/785396327/4.9/attr/LocalVariableTable.java index 83d21a883e..9cb74c9697 100644 --- a/group17/785396327/4.9/attr/LocalVariableTable.java +++ b/group17/785396327/4.9/attr/LocalVariableTable.java @@ -6,7 +6,7 @@ import java.util.List; /** - * Created by IBM on 2017/4/12. + * Created by william on 2017/4/12. */ public class LocalVariableTable extends AttributeInfo { List items = new ArrayList(); @@ -15,8 +15,7 @@ public LocalVariableTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - public static LocalVariableTable parse(ByteCodeIterator iter) { - int attributeNameIndex = iter.nextU2ToInt(); + public static LocalVariableTable parse(ByteCodeIterator iter, int attributeNameIndex) { int attributeLength = iter.nextU4ToInt(); int localVariableTableLength = iter.nextU2ToInt(); LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex, attributeLength); diff --git a/group17/785396327/4.9/attr/StackMapTable.java b/group17/785396327/4.9/attr/StackMapTable.java index 8de15ac552..fce272fd9f 100644 --- a/group17/785396327/4.9/attr/StackMapTable.java +++ b/group17/785396327/4.9/attr/StackMapTable.java @@ -3,7 +3,7 @@ import iterator.ByteCodeIterator; /** - * Created by IBM on 2017/4/12. + * Created by william on 2017/4/12. */ public class StackMapTable extends AttributeInfo { private String originalCode; @@ -12,8 +12,7 @@ public StackMapTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); + public static StackMapTable parse(ByteCodeIterator iter,int index){ // int len = iter.nextU4ToInt(); // StackMapTable t = new StackMapTable(index,len); From 5e6f4ffabe691fc258ab4af9362ee4a49f7bf0d3 Mon Sep 17 00:00:00 2001 From: liujk <1252327158@qq.com> Date: Thu, 13 Apr 2017 21:55:04 +0800 Subject: [PATCH 130/552] add task4 --- .../coding/basic/linklist/LRUPageFrame.java | 131 ++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 34 +++ .../com/coderising/jvm/clz/AccessFlag.java | 25 +++ .../src/com/coderising/jvm/clz/ClassFile.java | 75 +++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 24 +++ .../coderising/jvm/constant/ConstantInfo.java | 29 +++ .../coderising/jvm/constant/ConstantPool.java | 29 +++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++ .../jvm/constant/MethodRefInfo.java | 55 +++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 +++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++ .../jvm/loader/ByteCodeIterator.java | 5 + .../jvm/loader/ClassFileLoader.java | 140 ++++++++++++ .../jvm/loader/ClassFileParser.java | 44 ++++ .../jvm/test/ClassFileloaderTest.java | 202 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 +++ .../src/com/coderising/jvm/util/Util.java | 24 +++ 20 files changed, 1034 insertions(+) create mode 100644 group27/1252327158/task4_20170402/linklist/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group27/1252327158/task4_20170402/linklist/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/util/Util.java diff --git a/group27/1252327158/task4_20170402/linklist/com/coding/basic/linklist/LRUPageFrame.java b/group27/1252327158/task4_20170402/linklist/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..5068578571 --- /dev/null +++ b/group27/1252327158/task4_20170402/linklist/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,131 @@ +package com.coding.basic.linklist; + + +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/group27/1252327158/task4_20170402/linklist/com/coding/basic/linklist/LRUPageFrameTest.java b/group27/1252327158/task4_20170402/linklist/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group27/1252327158/task4_20170402/linklist/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..650ca8375d --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..9c9fac2839 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.loader; + +public class ByteCodeIterator { + +} diff --git a/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..33185d8175 --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/util/Util.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 Date: Thu, 13 Apr 2017 22:14:51 +0800 Subject: [PATCH 131/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AC=AC=E4=BA=8C?= =?UTF-8?q?=E4=B8=AA=E4=BD=9C=E4=B8=9A=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.9/expr/InfixExpr.java | 18 +++++++ group17/785396327/4.9/expr/InfixExprTest.java | 48 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 group17/785396327/4.9/expr/InfixExpr.java create mode 100644 group17/785396327/4.9/expr/InfixExprTest.java diff --git a/group17/785396327/4.9/expr/InfixExpr.java b/group17/785396327/4.9/expr/InfixExpr.java new file mode 100644 index 0000000000..035542712b --- /dev/null +++ b/group17/785396327/4.9/expr/InfixExpr.java @@ -0,0 +1,18 @@ +package expr; + +/** + * Created by IBM on 2017/4/13. + */ +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + return 0.0f; + } + +} diff --git a/group17/785396327/4.9/expr/InfixExprTest.java b/group17/785396327/4.9/expr/InfixExprTest.java new file mode 100644 index 0000000000..91c19fe23e --- /dev/null +++ b/group17/785396327/4.9/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by IBM on 2017/4/13. + */ +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } +} From 452797faac2778644462e73be2b746e3a0c2ed7e Mon Sep 17 00:00:00 2001 From: Admin Date: Fri, 14 Apr 2017 07:51:52 +0800 Subject: [PATCH 132/552] InfixExpr DONE --- .../coding/basic/stack/StackUtil.java | 14 +-- .../coding/basic/stack/expr/InfixExpr.java | 105 +++++++++++++++++- .../basic/stack/expr/InfixExprTest.java | 11 +- .../coding/basic/stack/expr/TokenParser.java | 85 ++++++++++++++ .../src/com/coderising/jvm/method/Method.java | 2 +- 5 files changed, 199 insertions(+), 18 deletions(-) create mode 100644 group12/382266293/coding/basic/stack/expr/TokenParser.java diff --git a/group12/382266293/coding/basic/stack/StackUtil.java b/group12/382266293/coding/basic/stack/StackUtil.java index 706bcd7033..e0beed1708 100644 --- a/group12/382266293/coding/basic/stack/StackUtil.java +++ b/group12/382266293/coding/basic/stack/StackUtil.java @@ -1,7 +1,5 @@ package stack; -import static org.junit.Assert.assertEquals; - import java.util.Objects; import java.util.Stack; @@ -10,22 +8,24 @@ public class StackUtil { /** * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param */ - public static void reverse(Stack stack) { + public static void reverse(Stack stack) { if (stack.isEmpty()) { return; } - int i = getAndRemoveLastElement(stack); + E i = getAndRemoveLastElement(stack); reverse(stack); stack.push(i); } - public static int getAndRemoveLastElement(Stack stack) { - int result = stack.pop(); + + public static E getAndRemoveLastElement(Stack stack) { + E result = stack.pop(); if (stack.isEmpty()) { return result; } else { - int last = getAndRemoveLastElement(stack); + E last = getAndRemoveLastElement(stack); stack.push(result); return last; } diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index eade1dc743..c927527029 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -1,18 +1,115 @@ package stack.expr; +import java.util.Stack; +import stack.StackUtil; + public class InfixExpr { String expr = null; - + public InfixExpr(String expr) { this.expr = expr; } - public float evaluate() { + public float evaluate() { + + TokenParser tp = new TokenParser(); + tp.parse(expr); + Stack ints = new Stack(); + Stack signs = new Stack(); + + int i1 = tp.nextInt(); + String sign1 = tp.nextSign(); + + ints.push(i1); + signs.push(sign1); + + while (tp.hasNextSign()) { + + int i2 = tp.nextInt(); + String sign2 = tp.nextSign(); + + + if (tp.hasNextInt()) { + + if (highPrioritySign(sign1) || lowPrioritySign(sign2) ) { + + i1 = ints.pop(); + sign1 = signs.pop(); + int result = calculate(i1, i2, sign1); + ints.push(result); + + } else { + + ints.push(i2); + + } + + signs.push(sign2); + sign1 = sign2; + + } + + } + + StackUtil.reverse(ints); + + while (!ints.isEmpty()) { + + int firstInt = ints.pop(); + + if (ints.isEmpty()) { + return (float) firstInt; + } + + int secInt = ints.pop(); + String sign = signs.pop(); + int result = calculate(firstInt, secInt, sign); + ints.push(result); - return 0.0f; + } + + return (float) ints.peek(); } - + private int calculate(int firstInt, int secInt, String lowsign) { + + int result; + if (lowsign.equals("+")) { + result = firstInt + secInt; + } else if (lowsign.equals("-")) { + result = firstInt - secInt; + } else if (lowsign.equals("*")) { + result = firstInt * secInt; + } else if (lowsign.equals("/")) { + result = firstInt / secInt; + } else { + throw new RuntimeException(lowsign + "is not supported yet!"); + } + + return result; + + } + private boolean lowPrioritySign(String sign) { + + if (sign.equals("+") || sign.equals("-")) { + + return true; + + } + + return false; + } + private boolean highPrioritySign(String sign) { + + if (sign.equals("*") || sign.equals("/")) { + + return true; + + } + + return false; + } + } diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java index bb047629bd..ddff0c588c 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java @@ -5,7 +5,6 @@ import org.junit.Before; import org.junit.Test; - public class InfixExprTest { @Before @@ -18,7 +17,7 @@ public void tearDown() throws Exception { @Test public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + // InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); { InfixExpr expr = new InfixExpr("2+3*4+5"); Assert.assertEquals(19.0, expr.evaluate(), 0.001f); @@ -27,22 +26,22 @@ public void testEvaluate() { InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); Assert.assertEquals(100.0, expr.evaluate(), 0.001f); } - + { InfixExpr expr = new InfixExpr("3*20/2"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - + { InfixExpr expr = new InfixExpr("20/2*3"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - + { InfixExpr expr = new InfixExpr("10-30+50"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - + } } diff --git a/group12/382266293/coding/basic/stack/expr/TokenParser.java b/group12/382266293/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..10402673d6 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,85 @@ +package stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingDeque; + +public class TokenParser { + + Queue intQ; + Queue signQ; + static final List signs = new ArrayList(); + { + signs.add("+"); + signs.add("-"); + signs.add("*"); + signs.add("/"); + } + + public TokenParser() { + intQ = new LinkedBlockingDeque(); + signQ = new LinkedBlockingDeque(); + } + + public void parse(String expr) { + + String[] tokens = expr.split(""); + String number = ""; + + for (int i = 0; i < tokens.length; i++) { + + String c = tokens[i]; + + if (isSign(c)) { + signQ.add(c); + if (!number.equals("")) { + int num = Integer.parseInt(number); + intQ.add(num); + number = ""; + } + } else { + number += tokens[i]; + } + + } + + if (!number.equals("")) { + int num = Integer.parseInt(number); + intQ.add(num); + } + + int intSize = intQ.size(); + if (intSize < 2 || intSize - signQ.size() > 1) { + throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ); + } + + intQ.add(0); + signQ.add("+"); + + } + + private boolean isSign(String c) { + if (signs.contains(c)) { + return true; + } + return false; + } + + public int nextInt() { + return intQ.poll(); + } + + public String nextSign() { + return signQ.poll(); + } + + public boolean hasNextInt() { + return !intQ.isEmpty(); + } + + public boolean hasNextSign() { + return !signQ.isEmpty(); + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/method/Method.java b/group12/382266293/src/com/coderising/jvm/method/Method.java index b77ff6271b..705ec22792 100644 --- a/group12/382266293/src/com/coderising/jvm/method/Method.java +++ b/group12/382266293/src/com/coderising/jvm/method/Method.java @@ -29,7 +29,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ method.setCodeAttr(codeAttr); } else { - throw new RuntimeException(att_name + "has not been implemented"); + throw new RuntimeException(att_name + " has not been implemented"); } } From 452ee7278a9273a21efd203a112352a6920fa30e Mon Sep 17 00:00:00 2001 From: Mengxz Date: Fri, 14 Apr 2017 09:33:24 +0800 Subject: [PATCH 133/552] Update 20170326-20170402.md --- group17/article/20170326-20170402.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group17/article/20170326-20170402.md b/group17/article/20170326-20170402.md index 5df4ce08e6..0729404704 100644 --- a/group17/article/20170326-20170402.md +++ b/group17/article/20170326-20170402.md @@ -22,7 +22,7 @@ 240094626 -82427129 +82427129 http://blog.csdn.net/Walk_er/article/details/66971517 296910598 From d0aa048dec299fb814b20dbac7e6639da8e30c0d Mon Sep 17 00:00:00 2001 From: Mengxz Date: Fri, 14 Apr 2017 09:34:09 +0800 Subject: [PATCH 134/552] Update 20170402-20170409.md --- group17/article/20170402-20170409.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group17/article/20170402-20170409.md b/group17/article/20170402-20170409.md index 3d45ad0516..3f2e5110a7 100644 --- a/group17/article/20170402-20170409.md +++ b/group17/article/20170402-20170409.md @@ -22,7 +22,7 @@ 240094626 -82427129 +82427129 http://blog.csdn.net/Walk_er/article/details/68486226 296910598 From 50b74b10ba3ca1cc1a031704b1f0fc9fac7d4eae Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Fri, 14 Apr 2017 09:57:48 +0800 Subject: [PATCH 135/552] =?UTF-8?q?week6=E4=B8=AD=E5=BA=8F=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 20 +++ .../coderising/download/FileDownloader.java | 73 ++++++++ .../download/FileDownloaderTest.java | 59 +++++++ .../coderising/download/api/Connection.java | 23 +++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 ++ .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 +++ .../download/impl/ConnectionManagerImpl.java | 15 ++ .../coderising/litestruts/LoginAction.java | 39 +++++ .../src/com/coderising/litestruts/Struts.java | 34 ++++ .../com/coderising/litestruts/StrutsTest.java | 43 +++++ .../src/com/coderising/litestruts/View.java | 23 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 19 ++ .../src/com/coding/basic/array/ArrayList.java | 35 ++++ .../src/com/coding/basic/array/ArrayUtil.java | 96 ++++++++++ .../coding/basic/linklist/LRUPageFrame.java | 164 ++++++++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 34 ++++ .../com/coding/basic/linklist/LinkedList.java | 125 +++++++++++++ .../src/com/coding/basic/stack/Stack.java | 64 +++++++ .../src/com/coding/basic/stack/StackUtil.java | 136 +++++++++++++++ .../com/coding/basic/stack/StackUtilTest.java | 78 +++++++++ .../coding/basic/stack/expr/InfixExpr.java | 116 +++++++++++++ .../basic/stack/expr/InfixExprTest.java | 48 +++++ 27 files changed, 1339 insertions(+) create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/DownloadThread.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/FileDownloader.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/Connection.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/Struts.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/View.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/Iterator.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/List.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/Queue.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java diff --git a/group23/563253496/week6_stack/src/com/coderising/download/DownloadThread.java b/group23/563253496/week6_stack/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} diff --git a/group23/563253496/week6_stack/src/com/coderising/download/FileDownloader.java b/group23/563253496/week6_stack/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,73 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/563253496/week6_stack/src/com/coderising/download/FileDownloaderTest.java b/group23/563253496/week6_stack/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/563253496/week6_stack/src/com/coderising/download/api/Connection.java b/group23/563253496/week6_stack/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionException.java b/group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionManager.java b/group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/563253496/week6_stack/src/com/coderising/download/api/DownloadListener.java b/group23/563253496/week6_stack/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionImpl.java b/group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.coderising.download.impl; + +import java.io.IOException; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coderising.download.impl; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} diff --git a/group23/563253496/week6_stack/src/com/coderising/litestruts/LoginAction.java b/group23/563253496/week6_stack/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group23/563253496/week6_stack/src/com/coderising/litestruts/Struts.java b/group23/563253496/week6_stack/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.coderising.litestruts; + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java b/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java b/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java b/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java b/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/List.java b/group23/563253496/week6_stack/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/Queue.java b/group23/563253496/week6_stack/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..4576c016af --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java @@ -0,0 +1,35 @@ +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java new file mode 100644 index 0000000000..45740e6d57 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coding.basic.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..24b9d8b155 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,164 @@ +package com.coding.basic.linklist; + + +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/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java new file mode 100644 index 0000000000..f4c7556a2e --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java @@ -0,0 +1,125 @@ +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..fff3778da5 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,64 @@ +package com.coding.basic.stack; + +import java.util.ArrayList; +import java.util.ArrayList; + +/** + * Created by bdl19 on 2017/4/8. + */ +public class Stack { + private int count; + private ArrayList elementData; + + public Stack() { + this.count = 0; + elementData = new ArrayList(); + } + + public void push(Object o) { + count++; + elementData.add(o); + + } + + public Object pop() { + count--; + Object o = elementData.get(count); + elementData.remove(count); + return o; + } + + public Object peek() { + + return elementData.get(count-1); + } + + public boolean isEmpty() { + if (count == 0) { + return true; + } else { + return false; + } + } + + public int size() { + return count; + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + Stack s = new Stack(); + while(!this.isEmpty()){ + sb.append(this.peek().toString()); + sb.append(","); + s.push(this.pop()); + } + while(!s.isEmpty()){ + this.push(s.pop()); + } + +// sb.deleteCharAt(sb.length()-1); + return sb.toString(); + } +} + diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..70bd34e37f --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,136 @@ +package com.coding.basic.stack; +import java.util.Stack; +public class StackUtil { + + public static void bad_reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Integer top = s.pop(); + reverse(s); + addToBottom(s,top); + + + } + public static void addToBottom(Stack s, Integer value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Integer top = s.pop(); + addToBottom(s,value); + s.push(top); + } + + } + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + + while(!s.isEmpty()){ + Object value = s.pop(); + if(!value.equals(o)){ + tmpStack.push(value); + } + } + + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + + if(s == null || s.isEmpty() || s.size() stack = new Stack(); + for(int i=0;i s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..51bf762651 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,116 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +import java.util.HashMap; + +public class InfixExpr { + String expr = null; + char[] chars; + Stack opStack; + Stack numStack; + private HashMap level = new HashMap<>(); + + int pos; + + public InfixExpr(String expr) { + this.expr = expr; + + + this.level.put('+', 0); + this.level.put('-', 0); + this.level.put('*', 1); + this.level.put('/', 1); + + + this.opStack = new Stack(); + this.numStack = new Stack(); + this.pos = 0; + } + + public float evaluate() { + chars = expr.toCharArray(); + while (this.pos < chars.length) { + if (isOp(chars[pos])) { + if (opStack.isEmpty()) { + opStack.push(chars[pos]); + pos++; + } else { + //TODO analyze + char op = (char) opStack.pop(); + if (level.get(chars[pos]) <= level.get(op)) { + int b = (int) numStack.pop(); + int a = (int) numStack.pop(); + int c = this.caculate(a, b, op); + numStack.push(c); + opStack.push(chars[pos]); + pos++; + + + }else { + opStack.push(op); + opStack.push(chars[pos]); + pos++; + } + } + } else { + int num = this.getNumber(); + numStack.push(num); + + } + } + + while(!opStack.isEmpty()){ + char op = (char) opStack.pop(); + int b = (int) numStack.pop(); + int a = (int) numStack.pop(); + int c = this.caculate(a, b, op); + numStack.push(c); + + } + + return (int)numStack.pop(); + } + + private boolean isOp(char c) { + switch (c) { + case '+': + case '-': + case '*': + case '/': + return true; + + default: + return false; + } + } + + private int getNumber() { + int num = Integer.parseInt("" + chars[pos]); + pos++; + while ((pos < chars.length)&&(!isOp(chars[pos])) ) { + num *= 10; + num += Integer.parseInt("" + chars[pos]); + pos++; + } + return num; + } + + private int caculate(int a, int b, char c) { + switch (c) { + case '+': + return a + b; + case '-': + return a - b; + case '*': + return a * b; + case '/': + return a / b; + + + + } + return -1; + } +} + diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..20f52b4c63 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} From 50447105b3c52854431fec9f7468e8f2a7522393 Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Fri, 14 Apr 2017 10:20:48 +0800 Subject: [PATCH 136/552] =?UTF-8?q?week6=20=E4=B8=AD=E5=BA=8F=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC=20=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/basic/stack/expr/InfixExpr.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java index 51bf762651..091c670ba8 100644 --- a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java @@ -39,9 +39,8 @@ public float evaluate() { //TODO analyze char op = (char) opStack.pop(); if (level.get(chars[pos]) <= level.get(op)) { - int b = (int) numStack.pop(); - int a = (int) numStack.pop(); - int c = this.caculate(a, b, op); + + int c = this.caculate(op); numStack.push(c); opStack.push(chars[pos]); pos++; @@ -62,12 +61,10 @@ public float evaluate() { while(!opStack.isEmpty()){ char op = (char) opStack.pop(); - int b = (int) numStack.pop(); - int a = (int) numStack.pop(); - int c = this.caculate(a, b, op); - numStack.push(c); - } + int c = this.caculate(op); + numStack.push(c); + } return (int)numStack.pop(); } @@ -96,7 +93,9 @@ private int getNumber() { return num; } - private int caculate(int a, int b, char c) { + private int caculate(char c) { + int b = (int) numStack.pop(); + int a = (int) numStack.pop(); switch (c) { case '+': return a + b; @@ -106,9 +105,6 @@ private int caculate(int a, int b, char c) { return a * b; case '/': return a / b; - - - } return -1; } From 762238f8a348b82b01e11394b708f9eca12ed42f Mon Sep 17 00:00:00 2001 From: orajavac Date: Fri, 14 Apr 2017 11:02:58 +0800 Subject: [PATCH 137/552] 20170414_1102 jvm --- .../coding2017/jvm/attr/AttributeInfo.java | 19 +++++ .../coding2017/jvm/attr/CodeAttr.java | 78 ++++++++++++++++++ .../coding2017/jvm/attr/LineNumberTable.java | 40 ++++++++++ .../jvm/attr/LocalVariableItem.java | 39 +++++++++ .../jvm/attr/LocalVariableTable.java | 34 ++++++++ .../coding2017/jvm/attr/StackMapTable.java | 28 +++++++ .../coding2017/jvm/clz/ClassFile.java | 21 ++++- .../orajavac/coding2017/jvm/field/Field.java | 34 ++++++++ .../jvm/loader/ByteCodeIterator.java | 22 +++++- .../jvm/loader/ClassFileParser.java | 59 ++++++++++++-- .../orajavac/coding2017/jvm/loader/test.java | 21 +++++ .../coding2017/jvm/method/Method.java | 69 ++++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 79 ++++++++++++++++++- 13 files changed, 533 insertions(+), 10 deletions(-) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LineNumberTable.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/test.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..77ea35c265 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.github.orajavac.coding2017.jvm.attr; + +public abstract class AttributeInfo { + + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..4fa025750d --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java @@ -0,0 +1,78 @@ +package com.github.orajavac.coding2017.jvm.attr; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo{ + + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); + int exceptionTableLen = iter.nextU2ToInt(); + if (exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + } + int subAttrCount = iter.nextU2ToInt(); + for (int x=1;x<=subAttrCount;x++){ + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + iter.back(2); + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + }else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + }else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + }else{ + throw new RuntimeException("need code to process"); + } + } + return null; + } + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LineNumberTable.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..2fd7714bcb --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LineNumberTable.java @@ -0,0 +1,40 @@ +package com.github.orajavac.coding2017.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..5ddd8ce997 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.github.orajavac.coding2017.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..23e528ee79 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java @@ -0,0 +1,34 @@ +package com.github.orajavac.coding2017.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(index,len); + int itemLen = iter.nextU2ToInt(); + for (int i=1;i<=itemLen;i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..e9d5430659 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java @@ -0,0 +1,28 @@ +package com.github.orajavac.coding2017.jvm.attr; + +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java index 79c34bd11f..5bebf86b69 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java @@ -1,7 +1,12 @@ package com.github.orajavac.coding2017.jvm.clz; +import java.util.ArrayList; +import java.util.List; + import com.github.orajavac.coding2017.jvm.constant.ClassInfo; import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.field.Field; +import com.github.orajavac.coding2017.jvm.method.Method; public class ClassFile { private int minorVersion; @@ -10,7 +15,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -47,7 +53,18 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } public void print(){ diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java new file mode 100644 index 0000000000..8339ac98d4 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java @@ -0,0 +1,34 @@ +package com.github.orajavac.coding2017.jvm.field; + +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + Field f = new Field(accessFlag,nameIndex,descIndex,pool); + return f; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java index 14db612ebf..9cc6d5d9b9 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java @@ -15,8 +15,12 @@ public ByteCodeIterator(byte[] codes){ } public byte[] getBytes(int len){ - byte[] data = Arrays.copyOfRange(codes,pos,pos+len); - pos+=len; + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; return data; } @@ -35,4 +39,18 @@ public int nextU2ToInt(){ public int nextU4ToInt(){ return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java index 065eaa4da7..0cfb131cc3 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java @@ -11,6 +11,8 @@ import com.github.orajavac.coding2017.jvm.constant.NullConstantInfo; import com.github.orajavac.coding2017.jvm.constant.StringInfo; import com.github.orajavac.coding2017.jvm.constant.UTF8Info; +import com.github.orajavac.coding2017.jvm.field.Field; +import com.github.orajavac.coding2017.jvm.method.Method; public class ClassFileParser { @@ -22,18 +24,39 @@ public ClassFile parse(byte[] codes) { clzFile.setMinorVersion(iter.nextU2ToInt()); clzFile.setMajorVersion(iter.nextU2ToInt()); - clzFile.setConstPool(parseConstantPool(iter)); + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex clzIndex = parseClassInfex(iter); + clzFile.setClassIndex(clzIndex); + + parseInterfaces(iter); + + parseFileds(clzFile,iter); + + parseMethods(clzFile,iter); return clzFile; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - - return null; + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + return flag; } private ClassIndex parseClassInfex(ByteCodeIterator iter) { - return null; + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + + ClassIndex clzIndex = new ClassIndex(); + + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + + return clzIndex; } @@ -82,9 +105,35 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { nameType.setIndex2(iter.nextU2ToInt()); pool.addConstantInfo(nameType); }else{ - throw new RuntimeException("the constant pool tag "+tag+" has not found"); + throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet."); } } + System.out.println("Finished reading Constant pool "); return pool; } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFileds(ClassFile clzFile,ByteCodeIterator iter){ + int filedCount = iter.nextU2ToInt(); + System.out.println("Field count:" + filedCount); + for (int i=1;i<=filedCount;i++){ + Field f = Field.parse(clzFile.getConstantPool(), iter); + clzFile.addField(f); + } + } + + private void parseMethods(ClassFile clzFile,ByteCodeIterator iter){ + int methodCount = iter.nextU2ToInt(); + for (int i=1;i<=methodCount;i++){ + Method m = Method.parse(clzFile, iter); + clzFile.addMethod(m); + } + } } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/test.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/test.java new file mode 100644 index 0000000000..a504858eb3 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/test.java @@ -0,0 +1,21 @@ +package com.github.orajavac.coding2017.jvm.loader; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; + +public class test { + + /** + * @param args + */ + public static void main(String[] args) { + String path1 = "bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.github.orajavac.coding2017.jvm.test.EmployeeV1"; + ClassFile clzFile = loader.loadClass(className); + + System.out.println("getMinorVersion="+clzFile.getMinorVersion()); + System.out.println("getMajorVersion="+clzFile.getMajorVersion()); + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java new file mode 100644 index 0000000000..5beb1fdf12 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java @@ -0,0 +1,69 @@ +package com.github.orajavac.coding2017.jvm.method; + +import com.github.orajavac.coding2017.jvm.attr.AttributeInfo; +import com.github.orajavac.coding2017.jvm.attr.CodeAttr; +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.field.Field; +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class Method { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + Method m = new Method(clzFile,accessFlag,nameIndex,descIndex); + for (int j=1;j<=attribCount;j++){ + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + }else{ + throw new RuntimeException("only CODE attribute is"); + } + } + return m; + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/ClassFileloaderTest.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/ClassFileloaderTest.java index 0bab359c95..ce766190f3 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/ClassFileloaderTest.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/ClassFileloaderTest.java @@ -1,5 +1,7 @@ package com.github.orajavac.coding2017.jvm.test; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -12,7 +14,9 @@ import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; import com.github.orajavac.coding2017.jvm.constant.NameAndTypeInfo; import com.github.orajavac.coding2017.jvm.constant.UTF8Info; +import com.github.orajavac.coding2017.jvm.field.Field; import com.github.orajavac.coding2017.jvm.loader.ClassFileLoader; +import com.github.orajavac.coding2017.jvm.method.Method; public class ClassFileloaderTest { private static final Object FULL_QUALIFIED_CLASS_NAME = null; @@ -85,7 +89,7 @@ public void testMagicNumber(){ public void testVersion(){ Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); + Assert.assertEquals(51, clzFile.getMajorVersion()); } @@ -184,4 +188,77 @@ private String byteToHexString(byte[] codes ){ } return buffer.toString(); } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + } From 2db74efb130e9b92ad27f6e67d5b4f4428458b15 Mon Sep 17 00:00:00 2001 From: gongxun Date: Fri, 14 Apr 2017 11:49:53 +0800 Subject: [PATCH 138/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=89=80=E6=9C=89jvm?= =?UTF-8?q?=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.5/iterator/ByteCodeIterator.java | 9 +++++++++ group17/785396327/4.5/test/ClassFileloaderTest.java | 10 +++++----- group17/785396327/4.5/util/Util.java | 2 +- group17/785396327/4.9/attr/CodeAttr.java | 6 +++--- group17/785396327/4.9/method/Method.java | 4 ++-- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/group17/785396327/4.5/iterator/ByteCodeIterator.java b/group17/785396327/4.5/iterator/ByteCodeIterator.java index 860694d41c..adfc288cc2 100644 --- a/group17/785396327/4.5/iterator/ByteCodeIterator.java +++ b/group17/785396327/4.5/iterator/ByteCodeIterator.java @@ -47,6 +47,15 @@ public byte[] nextLengthBytes(int length) { return result; } + public String nextLengthString(int length) { + byte[] result = new byte[length]; + for (int i = 0; i < length; i++) { + result[i] = codes[i]; + } + codes = Arrays.copyOfRange(codes, length, codes.length); + return Util.byteToHexString(result); + } + public int nextU4ToInt() { byte[] buff = new byte[]{codes[0], codes[1], codes[2], codes[3]}; codes = Arrays.copyOfRange(codes, 4, codes.length); diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java index 8aacc9ee57..854453f2bd 100644 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -221,7 +221,7 @@ public void testMethods(){ assertMethodEquals(pool,m, "", "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); + "2ab700012a2bb500022a1cb50003b1"); } { @@ -229,7 +229,7 @@ public void testMethods(){ assertMethodEquals(pool,m, "setName", "(Ljava/lang/String;)V", - "2a2bb5000fb1"); + "2a2bb50002b1"); } { @@ -237,14 +237,14 @@ public void testMethods(){ assertMethodEquals(pool,m, "setAge", "(I)V", - "2a1bb50011b1"); + "2a1bb50003b1"); } { Method m = methods.get(3); assertMethodEquals(pool,m, "sayHello", "()V", - "b2001c1222b60024b1"); + "b200041205b60006b1"); } { @@ -252,7 +252,7 @@ public void testMethods(){ assertMethodEquals(pool,m, "main", "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); + "bb0007591208101db700094c2bb6000ab1"); } } diff --git a/group17/785396327/4.5/util/Util.java b/group17/785396327/4.5/util/Util.java index 9b95c51ec4..e35332238c 100644 --- a/group17/785396327/4.5/util/Util.java +++ b/group17/785396327/4.5/util/Util.java @@ -1,7 +1,7 @@ package util; /** - * Created by IBM on 2017/4/10. + * Created by william on 2017/4/10. */ public class Util { public static int byteToInt(byte[] codes){ diff --git a/group17/785396327/4.9/attr/CodeAttr.java b/group17/785396327/4.9/attr/CodeAttr.java index b83508d876..9e3505eb37 100644 --- a/group17/785396327/4.9/attr/CodeAttr.java +++ b/group17/785396327/4.9/attr/CodeAttr.java @@ -49,10 +49,10 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { int maxStack = iter.nextU2ToInt(); int maxLocals = iter.nextU2ToInt(); int codeLength = iter.nextU4ToInt(); - byte[] code = iter.nextLengthBytes(codeLength); + String code = iter.nextLengthString(codeLength); int exceptionTableLength = iter.nextU2ToInt();//跳过异常表 - System.out.println("Code属性表中的异常表元素大小:" + exceptionTableLength); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, new String(code)); +// System.out.println("Code属性表中的异常表元素大小:" + exceptionTableLength); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); int attributesCount = iter.nextU2ToInt(); //code属性表中又有属性 for (int i = 0; i < attributesCount; i++) { diff --git a/group17/785396327/4.9/method/Method.java b/group17/785396327/4.9/method/Method.java index c0836c8bdc..8a5fb59e09 100644 --- a/group17/785396327/4.9/method/Method.java +++ b/group17/785396327/4.9/method/Method.java @@ -54,9 +54,9 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { Method method = new Method(clzFile, accessFlags, nameIndex, descriptorIndex); for (int i = 0; i < attributesCount; i++) { CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); - method.codeAttr = codeAttr; + method.setCodeAttr(codeAttr); } - return new Method(clzFile, accessFlags, nameIndex, descriptorIndex); + return method; } } From 10f4cdddd21630d124c244679718b6661c270464 Mon Sep 17 00:00:00 2001 From: mengxz <82427129@qq.com> Date: Fri, 14 Apr 2017 19:11:51 +0800 Subject: [PATCH 139/552] commit to home --- .../coderising/jvm/attr/AttributeInfo.java | 26 +++- .../com/coderising/jvm/attr/CodeAttr.java | 117 +++++++++++++++++- .../coderising/jvm/attr/LineNumberTable.java | 61 ++++++++- .../jvm/attr/LocalVariableTable.java | 15 ++- .../java/com/coderising/jvm/field/Field.java | 21 +++- .../jvm/loader/ClassFileParser.java | 2 - .../com/coderising/jvm/method/Method.java | 44 ++++++- 7 files changed, 261 insertions(+), 25 deletions(-) diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java index a4d82c25c9..f39a23dcf3 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java @@ -1,6 +1,7 @@ package com.coderising.jvm.attr; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; public abstract class AttributeInfo { @@ -10,16 +11,29 @@ public abstract class AttributeInfo { public static final String LINE_NUM_TABLE = "LineNumberTable"; public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen; + int attrNameIndex;// u2 attribute_name_index + int attrLen;// u4 attribute_length public AttributeInfo(int attrNameIndex, int attrLen) { - this.attrNameIndex = attrNameIndex; this.attrLen = attrLen; } - - public static AttributeInfo parse(ConstantPool cp, ByteCodeIterator itr){ - throw new RuntimeException("AttributeInfo parse hasn't implemented"); + + public static AttributeInfo parse(ConstantPool pool, ByteCodeIterator itr) { + int attrNameIndex = itr.nextU2toInt(); + String attrName = ((UTF8Info) pool.getConstantInfo(attrNameIndex)) + .getValue(); + itr.back(2); + switch (attrName) { + case CODE: + return CodeAttr.parse(pool, itr); + case LINE_NUM_TABLE: + return LineNumberTable.parse(pool, itr); + case LOCAL_VAR_TABLE: + + default: + throw new RuntimeException( + "attributeInfo exclude CodeAttr hasn't implemented"); + } } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java index a05fb3c27f..3011511ae4 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java @@ -1,14 +1,121 @@ package com.coderising.jvm.attr; -public class CodeAttr extends AttributeInfo{ +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + + private int maxStack;//u2 max_stack + private int maxLocals;//u2 max_locals + private int codeLenth;//u4 code_length + private String code;//u1 code[code_length] + private int exceptionTableLength;//u2 exception_table_length; + /* + * { u2 start_pc; + u2 end_pc; + u2 handler_pc; + u2 catch_type; + } exception_table[exception_table_length]; + private ExceptionTable exceptionTable;//unimplemented*/ + private int attrCount;//u2 attributes_count + private List AttrList = new ArrayList();//attribute_info attributes[attributes_count]; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, + int maxLocals, int codeLenth, String code, + int exceptionTableLength, int attrCount) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLenth = codeLenth; + this.code = code; + this.exceptionTableLength = exceptionTableLength; + this.attrCount = attrCount; + } + + /** + * 给CodeAttr 增加属性 + * @param a + */ + public void addAttr(AttributeInfo a){ + this.AttrList.add(a); + } + + public static CodeAttr parse(ConstantPool pool, ByteCodeIterator itr) { + int attrNameIndex = itr.nextU2toInt(); + int attrLen = itr.nextU4toInt(); + int maxStack = itr.nextU2toInt(); + int maxLocals = itr.nextU2toInt(); + int codeLenth = itr.nextU4toInt(); + String code = itr.nextUxtoHexString(codeLenth); + int exceptionTableLength = itr.nextU2toInt(); + int attrCount = itr.nextU2toInt(); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, + codeLenth, code, exceptionTableLength, attrCount); + for (int i = 0; i < attrCount; i++) { + codeAttr.addAttr(AttributeInfo.parse(pool, itr)); + } + return codeAttr; + } + /* + * getter setter + */ + public int getMaxStack() { + return maxStack; + } + + public void setMaxStack(int maxStack) { + this.maxStack = maxStack; + } + + public int getMaxLocals() { + return maxLocals; + } + + public void setMaxLocals(int maxLocals) { + this.maxLocals = maxLocals; + } + + public int getCodeLenth() { + return codeLenth; + } + + public void setCodeLenth(int codeLenth) { + this.codeLenth = codeLenth; + } + + public void setCode(String code) { + this.code = code; + } - private String code; public String getCode() { return code; } - public CodeAttr(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - // TODO Auto-generated constructor stub + + public int getAttrCount() { + return attrCount; + } + + public void setAttrCount(int attrCount) { + this.attrCount = attrCount; + } + + public List getAttrList() { + return AttrList; + } + + public void setAttrList(List attrList) { + AttrList = attrList; + } + + public int getExceptionTableLength() { + return exceptionTableLength; + } + + public void setExceptionTableLength(int exceptionTableLength) { + this.exceptionTableLength = exceptionTableLength; } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java index cccbce87b5..30b39988f0 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java @@ -1,10 +1,67 @@ package com.coderising.jvm.attr; +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + public class LineNumberTable extends AttributeInfo { - public LineNumberTable(int attrNameIndex, int attrLen) { + private int lineNumberTableLength; + private List lineNumberTable = new ArrayList(); + + public LineNumberTable(int attrNameIndex, int attrLen, + int lineNumberTableLength) { super(attrNameIndex, attrLen); - // TODO Auto-generated constructor stub + this.lineNumberTableLength = lineNumberTableLength; + } + + public void addLineNumberItem(LineNumberItem e) { + this.lineNumberTable.add(e); + } + + public static LineNumberTable parse(ConstantPool pool, ByteCodeIterator itr) { + int attrNameIndex = itr.nextU2toInt(); + int attrLen = itr.nextU4toInt(); + int lineNumberTableLength = itr.nextU2toInt(); + LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex, + attrLen, lineNumberTableLength); + for (int i = 0; i < lineNumberTableLength; i++) { + lineNumberTable.addLineNumberItem(LineNumberItem.parse(pool, itr)); + } + return lineNumberTable; + } + + private static class LineNumberItem { + @SuppressWarnings("unused") + private int startPc; + @SuppressWarnings("unused") + private int lineNum; + + public LineNumberItem(int startPc, int lineNum) { + super(); + this.startPc = startPc; + this.lineNum = lineNum; + } + + public static LineNumberItem parse(ConstantPool pool, + ByteCodeIterator itr) { + int startPc = itr.nextU2toInt(); + int lineNum = itr.nextU2toInt(); + return new LineNumberTable.LineNumberItem(startPc, lineNum); + } + } + + /* + * getter setter + */ + public int getLineNumberTableLength() { + return lineNumberTableLength; + } + + public void setLineNumberTableLength(int lineNumberTableLength) { + this.lineNumberTableLength = lineNumberTableLength; } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java index 2a3af25d77..2704149043 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java @@ -2,9 +2,18 @@ public class LocalVariableTable extends AttributeInfo { - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - // TODO Auto-generated constructor stub + private int localVarTableLength ;//u2 local_variable_table_length + + + private static class + /* + * getter setter + */ + public int getLocalVarTableLength() { + return localVarTableLength; + } + public void setLocalVarTableLength(int localVarTableLength) { + this.localVarTableLength = localVarTableLength; } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java index f28d2d6140..fee1d06d95 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java @@ -4,6 +4,7 @@ import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; public class Field { @@ -12,15 +13,19 @@ public class Field { private int descriptorIndex;// u2 descriptor_index private int attrCount;//u2 attributes_count private List attributeInfos;//attribute_info attributes[attributes_count]; + + private ConstantPool cp; public Field(){} + public Field(int accessFlag, int nameIndex, int descriptorIndex, - int attrCount) { + int attrCount, ConstantPool cp) { super(); this.accessFlag = accessFlag; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; this.attrCount = attrCount; + this.cp = cp; } /** @@ -41,7 +46,7 @@ public static Field parse(ConstantPool pool, ByteCodeIterator itr) { int nameIndex = itr.nextU2toInt(); int descriptorIndex = itr.nextU2toInt(); int attrCount = itr.nextU2toInt(); - Field field = new Field(accessFlag, nameIndex, descriptorIndex, attrCount); + Field field = new Field(accessFlag, nameIndex, descriptorIndex, attrCount, pool); for (int i = 0; i < attrCount; i++) { field.addAttributeInfo(AttributeInfo.parse(pool, itr)); } @@ -51,6 +56,12 @@ public static Field parse(ConstantPool pool, ByteCodeIterator itr) { public void addAttributeInfo(AttributeInfo a) { this.attributeInfos.add(a); } + @Override + public String toString() { + UTF8Info utf8Info1 = (UTF8Info)this.cp.getConstantInfo(this.nameIndex); + UTF8Info utf8Info2 = (UTF8Info)this.cp.getConstantInfo(this.descriptorIndex); + return utf8Info1.getValue()+":"+utf8Info2.getValue(); + } /* * getter setter @@ -94,5 +105,11 @@ public List getAttributeInfos() { public void setAttributeInfos(List attributeInfos) { this.attributeInfos = attributeInfos; } + public ConstantPool getCp() { + return cp; + } + public void setCp(ConstantPool cp) { + this.cp = cp; + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java index 90ae51a12c..b9887d3b30 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java @@ -1,7 +1,5 @@ package com.coderising.jvm.loader; -import java.util.List; - import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java index 04b0df7c3c..d29f77fb25 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java @@ -1,8 +1,10 @@ package com.coderising.jvm.method; +import java.util.ArrayList; import java.util.List; import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -11,8 +13,22 @@ public class Method { private int accessFlag;// u2 access_flags private int nameIndex;// u2 name_index private int descriptorIndex;// u2 descriptor_index - private int attrCount;//u2 attributes_count - private List attributeInfos;//attribute_info attributes[attributes_count]; + private int attrCount;// u2 attributes_count + /* + * attributes[attributes_count]; + */ + private List attributeInfos = new ArrayList(); + + public Method() {} + + public Method(int accessFlag, int nameIndex, int descriptorIndex, + int attrCount) { + super(); + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.attrCount = attrCount; + } private ClassFile clzFile; @@ -26,17 +42,35 @@ public class Method { * } * * @param itr - * @return + * @return Method */ public static Method parse(ConstantPool cp, ByteCodeIterator itr) { int accessFlag = itr.nextU2toInt(); - int nameIndex= itr.nextU2toInt(); + int nameIndex = itr.nextU2toInt(); int descriptorIndex = itr.nextU2toInt(); int attrCount = itr.nextU2toInt(); - + Method method = new Method(accessFlag, nameIndex, descriptorIndex, + attrCount); + for (int i = 0; i < attrCount; i++) { + method.addAttributeInfo(AttributeInfo.parse(cp, itr)); + } + return method; + } + + /** + * 专门用来获取code属性的方法 + * + * @return + */ + public CodeAttr getCodeAttr() { + return null; } + public void addAttributeInfo(AttributeInfo a) { + this.attributeInfos.add(a); + } + /* * getter setter */ From 721c1b63d48a72e96b9724beb1e7423dc87fa37d Mon Sep 17 00:00:00 2001 From: Admin Date: Fri, 14 Apr 2017 20:55:44 +0800 Subject: [PATCH 140/552] one bug fixed --- group12/382266293/coding/basic/stack/expr/InfixExpr.java | 5 +++-- .../382266293/coding/basic/stack/expr/InfixExprTest.java | 4 ++-- group12/382266293/coding/basic/stack/expr/TokenParser.java | 6 ++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index c927527029..8bda337676 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -50,8 +50,9 @@ public float evaluate() { } } - + StackUtil.reverse(ints); + StackUtil.reverse(signs); while (!ints.isEmpty()) { @@ -83,7 +84,7 @@ private int calculate(int firstInt, int secInt, String lowsign) { } else if (lowsign.equals("/")) { result = firstInt / secInt; } else { - throw new RuntimeException(lowsign + "is not supported yet!"); + throw new RuntimeException(lowsign + "has not been supported yet!"); } return result; diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java index ddff0c588c..dbb3c34f21 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java @@ -23,8 +23,8 @@ public void testEvaluate() { Assert.assertEquals(19.0, expr.evaluate(), 0.001f); } { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + InfixExpr expr = new InfixExpr("3*20+12*5-40/2/2+5*2*2/2+1-10/2"); + Assert.assertEquals(116.0, expr.evaluate(), 0.001f); } { diff --git a/group12/382266293/coding/basic/stack/expr/TokenParser.java b/group12/382266293/coding/basic/stack/expr/TokenParser.java index 10402673d6..2352da5e79 100644 --- a/group12/382266293/coding/basic/stack/expr/TokenParser.java +++ b/group12/382266293/coding/basic/stack/expr/TokenParser.java @@ -26,13 +26,15 @@ public void parse(String expr) { String[] tokens = expr.split(""); String number = ""; + String sign = ""; for (int i = 0; i < tokens.length; i++) { String c = tokens[i]; if (isSign(c)) { - signQ.add(c); + sign = c; + signQ.add(sign); if (!number.equals("")) { int num = Integer.parseInt(number); intQ.add(num); @@ -53,7 +55,7 @@ public void parse(String expr) { if (intSize < 2 || intSize - signQ.size() > 1) { throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ); } - + intQ.add(0); signQ.add("+"); From 1b6f4db52f2895aac13a4be3632a66b86c90d08d Mon Sep 17 00:00:00 2001 From: Admin Date: Fri, 14 Apr 2017 21:00:03 +0800 Subject: [PATCH 141/552] 1 --- group12/382266293/coding/basic/stack/expr/InfixExpr.java | 1 + 1 file changed, 1 insertion(+) diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index 8bda337676..4cc73bb0bf 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -69,6 +69,7 @@ public float evaluate() { } + System.out.println("we shall not reach here"); return (float) ints.peek(); } From cddb175fb202a0cdd5175602cc529c63ee6b2b10 Mon Sep 17 00:00:00 2001 From: Admin Date: Sat, 15 Apr 2017 11:07:53 +0800 Subject: [PATCH 142/552] bug fix --- group12/382266293/coding/basic/stack/expr/InfixExpr.java | 4 ++-- group12/382266293/coding/basic/stack/expr/TokenParser.java | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index 4cc73bb0bf..7b5892711b 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -50,7 +50,7 @@ public float evaluate() { } } - + StackUtil.reverse(ints); StackUtil.reverse(signs); @@ -85,7 +85,7 @@ private int calculate(int firstInt, int secInt, String lowsign) { } else if (lowsign.equals("/")) { result = firstInt / secInt; } else { - throw new RuntimeException(lowsign + "has not been supported yet!"); + throw new RuntimeException(lowsign + " has not been supported yet!"); } return result; diff --git a/group12/382266293/coding/basic/stack/expr/TokenParser.java b/group12/382266293/coding/basic/stack/expr/TokenParser.java index 2352da5e79..785be33b88 100644 --- a/group12/382266293/coding/basic/stack/expr/TokenParser.java +++ b/group12/382266293/coding/basic/stack/expr/TokenParser.java @@ -26,15 +26,13 @@ public void parse(String expr) { String[] tokens = expr.split(""); String number = ""; - String sign = ""; for (int i = 0; i < tokens.length; i++) { String c = tokens[i]; if (isSign(c)) { - sign = c; - signQ.add(sign); + signQ.add(c); if (!number.equals("")) { int num = Integer.parseInt(number); intQ.add(num); From 2c3e85f200785a981ec1dadfc38e711ceedca302 Mon Sep 17 00:00:00 2001 From: Admin Date: Sat, 15 Apr 2017 12:03:30 +0800 Subject: [PATCH 143/552] bug fix again --- .../coding/basic/stack/expr/InfixExpr.java | 13 ++++++++----- .../coding/basic/stack/expr/InfixExprTest.java | 6 +++--- .../coding/basic/stack/expr/TokenParser.java | 10 ++++++---- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index 7b5892711b..030b0e3fad 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -23,7 +23,7 @@ public float evaluate() { ints.push(i1); signs.push(sign1); - while (tp.hasNextSign()) { + while (tp.hasNextInt()) { int i2 = tp.nextInt(); String sign2 = tp.nextSign(); @@ -31,20 +31,23 @@ public float evaluate() { if (tp.hasNextInt()) { - if (highPrioritySign(sign1) || lowPrioritySign(sign2) ) { - + if (highPrioritySign(sign1) || lowPrioritySign(sign2)) { i1 = ints.pop(); sign1 = signs.pop(); int result = calculate(i1, i2, sign1); ints.push(result); } else { - + ints.push(i2); } - signs.push(sign2); + if (tp.hasNextInt()) { + + signs.push(sign2); + } + sign1 = sign2; } diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java index dbb3c34f21..883af2fe8c 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java @@ -17,14 +17,14 @@ public void tearDown() throws Exception { @Test public void testEvaluate() { - // InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); { InfixExpr expr = new InfixExpr("2+3*4+5"); Assert.assertEquals(19.0, expr.evaluate(), 0.001f); } { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2/2+5*2*2/2+1-10/2"); - Assert.assertEquals(116.0, expr.evaluate(), 0.001f); + InfixExpr expr = new InfixExpr("3*20+12*5-40/2/2+5*2*2/2+1-10/2*4+1"); + Assert.assertEquals(102.0, expr.evaluate(), 0.001f); } { diff --git a/group12/382266293/coding/basic/stack/expr/TokenParser.java b/group12/382266293/coding/basic/stack/expr/TokenParser.java index 785be33b88..f5f37a9a5b 100644 --- a/group12/382266293/coding/basic/stack/expr/TokenParser.java +++ b/group12/382266293/coding/basic/stack/expr/TokenParser.java @@ -26,13 +26,15 @@ public void parse(String expr) { String[] tokens = expr.split(""); String number = ""; + String sign = ""; for (int i = 0; i < tokens.length; i++) { String c = tokens[i]; if (isSign(c)) { - signQ.add(c); + sign = c; + signQ.add(sign); if (!number.equals("")) { int num = Integer.parseInt(number); intQ.add(num); @@ -53,9 +55,9 @@ public void parse(String expr) { if (intSize < 2 || intSize - signQ.size() > 1) { throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ); } - - intQ.add(0); - signQ.add("+"); + + intQ.add(1); + signQ.add("*"); } From 30735226ce2061aebe191e1b45be2d4bd720d3df Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Sat, 15 Apr 2017 12:10:31 +0800 Subject: [PATCH 144/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/jvm/field/Field.java | 5 +- .../jvm/loader/ByteCodeIterator.java | 4 +- .../jvm/loader/ClassFileParser.java | 59 +++++++++++++++---- .../jvm/test/ClassFileloaderTest.java | 2 + 4 files changed, 55 insertions(+), 15 deletions(-) diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java index 17e3b77754..98fcbf5469 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java @@ -20,12 +20,9 @@ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool po this.pool = pool; } - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ return null; } - + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java index 3a3e4dd7b9..8e85a3d0ab 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java @@ -58,7 +58,9 @@ public String nextUxToHexString(int len) { return Util.byteToHexString(tmp).toLowerCase(); } - + public int getPos(){ + return pos; + } public void back(int n) { this.pos -= n; } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java index 8a42fe4cb4..6bd590d869 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java @@ -1,6 +1,8 @@ package com.coderising.jvm.loader; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; @@ -15,6 +17,8 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFileParser { @@ -26,7 +30,6 @@ public ClassFile parse(byte[] codes) { if(!magicNum.equals("cafebabe")){ throw new RuntimeException("文件类型错误"); } - ByteCodeIterator iter = new ByteCodeIterator(codes); int minVersion = by.nextU2Int(); int majorVersion = by.nextU2Int(); @@ -34,21 +37,25 @@ public ClassFile parse(byte[] codes) { ConstantPool constant = parseConstantPool(by); AccessFlag flag = parseAccessFlag(by); ClassIndex index = parseClassIndex(by); - - parseInterfaces(iter); + parseInterfaces(by); + List fields = parseField(by,constant); + List methods = parseMethod(by,file); file.setMinorVersion(minVersion); file.setMajorVersion(majorVersion); file.setAccessFlag(flag); file.setClassIndex(index); file.setConstPool(constant); - - + for(Field field:fields){ + file.addField(field); + } + for(Method method:methods){ + file.addMethod(method); + } + return file; } - - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { AccessFlag flag = new AccessFlag(iter.nextU2Int()); return flag; @@ -115,10 +122,42 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { private void parseInterfaces(ByteCodeIterator iter) { int interfaceCount = iter.nextU2Int(); - - + System.out.println("interfaceCount:" + interfaceCount); } + private List parseField(ByteCodeIterator by,ConstantPool pool) { + // TODO Auto-generated method stub + List result = new ArrayList(); + int fieldCount = by.nextU2Int(); + for(int i=0;i parseMethod(ByteCodeIterator by,ClassFile file) { + // TODO Auto-generated method stub + List result = new ArrayList(); + int methodCount = by.nextU2Int(); + for(int i=0;i fields = clzFile.getFields(); Assert.assertEquals(2, fields.size()); + System.out.println("field_size:"+fields.size()); { Field f = fields.get(0); Assert.assertEquals("name:Ljava/lang/String;", f.toString()); @@ -219,6 +220,7 @@ public void testMethods(){ List methods = clzFile.getMethods(); ConstantPool pool = clzFile.getConstantPool(); + System.out.println("methods_size:"+methods.size()); { Method m = methods.get(0); From f4a4056589e258da10d0013e5815d6922f9cbd0f Mon Sep 17 00:00:00 2001 From: gongxun Date: Sat, 15 Apr 2017 17:01:24 +0800 Subject: [PATCH 145/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.9/expr/ExprParser.java | 37 +++++++++++ group17/785396327/4.9/expr/InfixExpr.java | 61 ++++++++++++++++++- group17/785396327/4.9/expr/InfixExprTest.java | 9 +++ group17/785396327/4.9/expr/OperEnum.java | 21 +++++++ 4 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 group17/785396327/4.9/expr/ExprParser.java create mode 100644 group17/785396327/4.9/expr/OperEnum.java diff --git a/group17/785396327/4.9/expr/ExprParser.java b/group17/785396327/4.9/expr/ExprParser.java new file mode 100644 index 0000000000..a197377b4a --- /dev/null +++ b/group17/785396327/4.9/expr/ExprParser.java @@ -0,0 +1,37 @@ +package expr; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by IBM on 2017/4/15. + */ +public class ExprParser { + + public static List parse(InfixExpr infixExpr) { + if (infixExpr == null || infixExpr.expr == null || infixExpr.expr.trim().isEmpty()) + return null; + String[] split = infixExpr.expr.split(""); + List results = new ArrayList(); + StringBuilder numberBuffer = new StringBuilder(); + for (int i = 0; i < split.length; i++) { + String ele = split[i]; + if (ele.equals(OperEnum.ADD.getOperator()) || ele.equals(OperEnum.SUBSTRACT.getOperator()) || ele.equals(OperEnum.MINUS.getOperator()) || ele.equals(OperEnum.MULTIPLY.getOperator())) { + results.add(numberBuffer.toString()); + numberBuffer.delete(0, numberBuffer.length()); + results.add(ele); + } else + numberBuffer.append(ele); + } + results.add(numberBuffer.toString()); + return results; + } + + public static boolean belongsHighPriority(String operEle) { + return belongsOperator(operEle) && (operEle.trim().equals(OperEnum.MINUS.getOperator()) || operEle.trim().equals(OperEnum.MULTIPLY.getOperator())); + } + + public static boolean belongsOperator(String operEle) { + return (operEle != null) && (operEle.trim().equals(OperEnum.ADD.getOperator()) || operEle.trim().equals(OperEnum.SUBSTRACT.getOperator()) || operEle.trim().equals(OperEnum.MULTIPLY.getOperator()) || operEle.trim().equals(OperEnum.MINUS.getOperator())); + } +} diff --git a/group17/785396327/4.9/expr/InfixExpr.java b/group17/785396327/4.9/expr/InfixExpr.java index 035542712b..9845d45809 100644 --- a/group17/785396327/4.9/expr/InfixExpr.java +++ b/group17/785396327/4.9/expr/InfixExpr.java @@ -1,7 +1,11 @@ package expr; +import stack.MyStack; + +import java.util.List; + /** - * Created by IBM on 2017/4/13. + * Created by william on 2017/4/13. */ public class InfixExpr { String expr = null; @@ -11,8 +15,61 @@ public InfixExpr(String expr) { } public float evaluate() { + List operList = ExprParser.parse(this); + MyStack numberStack = new MyStack(); + MyStack operatorStack = new MyStack(); + if (operList != null) { + for (String operEle : operList) { + if (ExprParser.belongsOperator(operEle)) + operatorStack.push(operEle); + else { + numberStack.push(operEle); + if (!operatorStack.isEmpty() && ExprParser.belongsHighPriority(operatorStack.peek())) { + String highPriorityValue = calcHighOper(numberStack, operatorStack); + numberStack.push(highPriorityValue); + } + } + } + } + if (numberStack.size() != operatorStack.size() + 1) + throw new RuntimeException(" wrong operation number "); + return Float.parseFloat(calcSameOper(numberStack, operatorStack)); + } + + private String calcHighOper(MyStack numberStack, MyStack operatorStack) { + Float rightNumber = Float.parseFloat((String) numberStack.pop()); + Float leftNumber = Float.parseFloat((String) numberStack.pop()); + String oper = operatorStack.pop(); + return calc(rightNumber, leftNumber, oper); + } + + private String calcSameOper(MyStack numberStack, MyStack operatorStack) { + MyStack allStack = new MyStack(); + while (!operatorStack.isEmpty()) { + allStack.push(numberStack.pop()); + allStack.push(operatorStack.pop()); + } + allStack.push(numberStack.pop()); + while (allStack.size() != 1) { + Float leftNumber = Float.parseFloat((String) allStack.pop()); + String oper = (String) allStack.pop(); + Float rightNumber = Float.parseFloat((String) allStack.pop()); + allStack.push(calc(rightNumber, leftNumber, oper)); + } + return (String) allStack.pop(); + } - return 0.0f; + private String calc(Float rightNumber, Float leftNumber, String oper) { + if (oper.equals(OperEnum.ADD.getOperator())) + return leftNumber + rightNumber + ""; + else if (oper.equals(OperEnum.SUBTRACT.getOperator())) + return leftNumber - rightNumber + ""; + else if (oper.equals(OperEnum.MULTIPLY.getOperator())) + return leftNumber * rightNumber + ""; + else if (oper.equals(OperEnum.MINUS.getOperator())) + return leftNumber / rightNumber + ""; + else + throw new RuntimeException("not support " + leftNumber + " " + oper + " " + rightNumber + " operation"); } } diff --git a/group17/785396327/4.9/expr/InfixExprTest.java b/group17/785396327/4.9/expr/InfixExprTest.java index 91c19fe23e..1249bbf04b 100644 --- a/group17/785396327/4.9/expr/InfixExprTest.java +++ b/group17/785396327/4.9/expr/InfixExprTest.java @@ -5,6 +5,8 @@ import org.junit.Before; import org.junit.Test; +import java.util.List; + /** * Created by IBM on 2017/4/13. */ @@ -45,4 +47,11 @@ public void testEvaluate() { } } + + @Test + public void testExprParser() { + InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + List parse = ExprParser.parse(expr); + System.out.println(parse); + } } diff --git a/group17/785396327/4.9/expr/OperEnum.java b/group17/785396327/4.9/expr/OperEnum.java new file mode 100644 index 0000000000..adb41b75ff --- /dev/null +++ b/group17/785396327/4.9/expr/OperEnum.java @@ -0,0 +1,21 @@ +package expr; + +/** + * Created by IBM on 2017/4/15. + */ +public enum OperEnum { + ADD("+"), SUBTRACT("-"), MULTIPLY("*"), MINUS("/"); + private String operator; + + OperEnum(String operator) { + this.operator = operator; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } +} From 565d9ef8434b517b12076b7f8080cc10f55a3aea Mon Sep 17 00:00:00 2001 From: GordenChow <513274874@qq.com> Date: Sat, 15 Apr 2017 17:45:12 +0800 Subject: [PATCH 146/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=A4=87=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第六周作业备份,数据结构一完成test,jvm尚未test --- .../src/com/coding/basic/stack/StackUtil.java | 26 +++-- .../com/coding/basic/stack/StackUtilTest.java | 76 ++++++++++++++ .../coding/basic/stack/expr/InfixExpr.java | 98 +++++++++++++++++++ .../basic/stack/expr/InfixExprTest.java | 48 +++++++++ .../coderising/jvm/attr/AttributeInfo.java | 19 ++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 94 ++++++++++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 55 +++++++++++ .../jvm/attr/LocalVariableItem.java | 39 ++++++++ .../jvm/attr/LocalVariableTable.java | 42 ++++++++ .../coderising/jvm/attr/StackMapTable.java | 30 ++++++ .../src/com/coderising/jvm/clz/ClassFile.java | 21 +++- .../coderising/jvm/constant/ConstantInfo.java | 5 - .../coderising/jvm/constant/ConstantPool.java | 4 +- .../jvm/constant/MethodRefInfo.java | 3 +- .../src/com/coderising/jvm/field/Field.java | 44 +++++++++ .../jvm/loader/ByteCodeIterator.java | 44 ++++++--- .../jvm/loader/ClassFileParser.java | 32 ++++++ .../src/com/coderising/jvm/method/Method.java | 76 ++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 81 +++++++++++++-- 19 files changed, 802 insertions(+), 35 deletions(-) create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java index e53e38ca4b..fa8a8c0325 100755 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java @@ -1,5 +1,6 @@ package com.coding.basic.stack; +import java.util.Stack; public class StackUtil { /** @@ -7,14 +8,27 @@ public class StackUtil { * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 */ public static void reverse(Stack s) { - Stack temp = new Stack(); - //先清空s - while (!s.isEmpty()) { - temp.push(s.pop()); + if(null == s || s.isEmpty()){ + return; } + Object object = s.pop(); + reverse(s); + addToBottom(s,object); } + public static void addToBottom(Stack s ,Object num){ + if(s.isEmpty()){ + s.push(num); + + }else{ + Object o = s.pop(); + addToBottom(s,num); + s.push(o); + } + } + + /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 * @@ -101,7 +115,7 @@ public static boolean isValidPairs(String s) { break; case ']': temp = (byte) stack.peek(); - if (temp != ']') { + if (temp != '[') { return false; } else { stack.pop(); @@ -109,7 +123,7 @@ public static boolean isValidPairs(String s) { break; case '}': temp = (byte) stack.peek(); - if (temp != ']') { + if (temp != '{') { return false; } else { stack.pop(); diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..d183607f63 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,76 @@ +package com.coding.basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Stack; +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddToBottom() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..ddd255e4a0 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,98 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.StackUtil; + +import java.util.Stack; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + char[] chars = expr.toCharArray(); + System.out.println(chars); + + Stack numStack = new Stack(); + Stack operStack = new Stack(); + //当前数,有可能是操作数,有可能是运算符 + String curr = ""; + OperIterator operIterator = new OperIterator(chars); + int num = operIterator.nextNumber(); + numStack.push(num); + while(operIterator.hasNext()){ + int numB = 0; + char oper = operIterator.nextOperator(); + switch (oper){ + case '+': + case '-': + operStack.push(oper); + numStack.push(operIterator.nextNumber()); + continue; + case '*': + numB = operIterator.nextNumber(); + numStack.push(Double.parseDouble(numStack.pop() + "") * numB); + continue; + case '/': + numB = operIterator.nextNumber(); + numStack.push(Double.parseDouble(numStack.pop()+"") / numB); + continue; + } + } + + //清算站内数据 + if(operStack.isEmpty()) return Float.parseFloat(numStack.pop() + ""); + + StackUtil.reverse(operStack); + StackUtil.reverse(numStack); + while(!operStack.isEmpty()){ + char oper = (char)operStack.pop(); + + numStack.push(operate(Float.parseFloat(numStack.pop()+""),Float.parseFloat(numStack.pop() +""),oper)); + } + + return (float) numStack.pop(); + } + + private float operate(float a,float b,char oper){ + switch (oper){ + case '-': + return a-b; + case '+': + return a+b; + case '*': + return a*b; + case '/': + return a/b; + } + return 0.00f; + } + + class OperIterator { + private char[] expr ; + private int pos = 0; + + public OperIterator(char[] expr) { + this.expr = expr; + } + + public char nextOperator(){ + return expr[pos++]; + } + public int nextNumber(){ + StringBuffer num = new StringBuffer(""); + while(pos <= expr.length-1 && expr[pos] != '+' && expr[pos] != '-' && expr[pos] != '*' && expr[pos] != '/'){ + num.append(expr[pos++]); + } + return Integer.parseInt(num.toString()); + } + + public boolean hasNext(){ + return pos < expr.length-1; + } + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..343683f11a --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..89fb53394e --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..1194321d0d --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,94 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Int(); + int maxStack = iter.nextU2Int(); + int maxLocals = iter.nextU2Int(); + + int codeLength = iter.nextU4Int(); + String code = iter.nextUxToHexString(codeLength); + + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + + //exception + int exceptionTableLength = iter.nextU2Int(); + if (exceptionTableLength > 0) { + String exceptionTable = iter.nextUxToHexString(exceptionTableLength); + throw new RuntimeException("there's exception to be implemented !!"); + } + + //attribute table of the code + int attributesCount = iter.nextU2Int(); + for (int i = 0; i < attributesCount; i++) { + int subAttributeNameIndex = iter.nextU2Int(); + iter.back(2); + + String subAttributeName = clzFile.getConstantPool().getUTF8String(subAttributeNameIndex); + + if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { + + LineNumberTable lineNumberTable = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(lineNumberTable); + + } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { + + LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(localVariableTable); + + } else { + throw new RuntimeException("there's other sub attribute to added : name = " + subAttributeName); + } + + } + + return codeAttr; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..1e969ef3ee --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,55 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Int(); + LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex,attributeLength); + + //lineNumberItem block + int lineNumberTableLength = iter.nextU2Int(); + for(int i = 0 ;i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Int(); + + LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex,attributeLength); + + int localVariableTableLength = iter.nextU2Int(); + for(int i = 0 ;i < localVariableTableLength;i++){ + LocalVariableItem localVariableItem = new LocalVariableItem(); + localVariableItem.setStartPC(iter.nextU2Int()); + localVariableItem.setLength(iter.nextU2Int()); + localVariableItem.setDescIndex(iter.nextU2Int()); + localVariableItem.setIndex(iter.nextU2Int()); + localVariableTable.addLocalVariableItem(localVariableItem); + } + + + return localVariableTable; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..3a8b6b8013 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2Int(); + int len = iter.nextU4Int(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java index 650ca8375d..4755266987 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -1,7 +1,12 @@ package com.coderising.jvm.clz; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFile { @@ -11,7 +16,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -48,7 +54,18 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } public void print(){ diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java index 5d66317801..466b072244 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -18,11 +18,6 @@ public ConstantInfo(ConstantPool pool) { this.constantPool = pool; } public abstract int getType(); - - @Override - public String toString(){ - return super.toString(); - } public ConstantPool getConstantPool() { return constantPool; diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java index f92c8028b9..86c0445695 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -1,11 +1,11 @@ package com.coderising.jvm.constant; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; public class ConstantPool { - private List constantInfos = new LinkedList(); + private List constantInfos = new ArrayList(); public ConstantPool(){ diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index 65c586916c..9568c571d8 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -27,8 +27,7 @@ public int getNameAndTypeIndex() { public void setNameAndTypeIndex(int nameAndTypeIndex) { this.nameAndTypeIndex = nameAndTypeIndex; } - - @Override + public String toString(){ return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ; diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..d3a642a109 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,44 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + @Override + public String toString() { + return super.toString(); + } + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + int accessFlag = iter.nextU2Int(); + int nameIndex = iter.nextU1Int(); + int descriptorIndex = iter.nextU2Int(); + + int attributsCount = iter.nextU2Int(); + + if (attributsCount > 0) { + throw new RuntimeException("field : " + ((UTF8Info) pool.getConstantInfo(nameIndex)).getValue() + "has attributes to be implemented !!"); + } + + Field field = new Field(accessFlag,nameIndex,descriptorIndex,pool); + return field; + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java index e4c5c83681..59d072ef0b 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -5,30 +5,50 @@ import java.util.Arrays; public class ByteCodeIterator { - private byte[] code ; + private byte[] code; private int pos = 0; public ByteCodeIterator(byte[] code) { this.code = code; } - public int nextU1Int(){ + public byte[] getBytes(int length) { + if (pos + length >= code.length) { + throw new IndexOutOfBoundsException("not enough bytes!"); + } + byte[] bytes = Arrays.copyOfRange(code, pos, pos + length); + pos += length; + return bytes; + } + + public int nextU1Int() { return Util.byteToInt(new byte[]{code[pos++]}); } - public int nextU2Int(){ - return Util.byteToInt(new byte[]{code[pos++],code[pos++]}); + public int nextU2Int() { + + return Util.byteToInt(new byte[]{code[pos++], code[pos++]}); } - public String nextU4HexString(){ - return Util.byteToHexString(new byte[]{code[pos++],code[pos++],code[pos++],code[pos++]}); + + public int nextU4Int() { + return Util.byteToInt(new byte[]{code[pos++], code[pos++], code[pos++], code[pos++]}); } - public byte[] getBytes(int length){ - if(pos+length >= code.length){ - throw new IndexOutOfBoundsException("not enough bytes!"); + public String nextU4HexString() { + return Util.byteToHexString(new byte[]{code[pos++], code[pos++], code[pos++], code[pos++]}); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = code[pos++]; } - byte[] bytes = Arrays.copyOfRange(code,pos,pos+length); - pos += length; - return bytes; + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java index 0c35bca807..e9bfa54720 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -4,6 +4,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; import com.coderising.jvm.constant.*; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; import java.io.UnsupportedEncodingException; @@ -26,6 +28,10 @@ public ClassFile parse(byte[] codes) { clzFile.setAccessFlag(parseAccessFlag(iterator)); clzFile.setClassIndex(parseClassIndex(iterator)); + parseInterfaces(iterator); + parseFields(clzFile,iterator); + parseMethods(clzFile,iterator); + return clzFile; } @@ -102,8 +108,34 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } } + System.out.println("Finished reading Constant pool "); return pool; } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2Int(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFields(ClassFile clazzFile,ByteCodeIterator iterator){ + int fieldCount = iterator.nextU2Int(); + for (int i = 0 ;i fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool, m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool, m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool, m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool, m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } From 0174facd5e8f039d2b24164b7d7c0f432f03f873 Mon Sep 17 00:00:00 2001 From: GordenChow <513274874@qq.com> Date: Sat, 15 Apr 2017 22:19:49 +0800 Subject: [PATCH 147/552] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=AC=AC=E5=85=AD?= =?UTF-8?q?=E5=91=A8=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jvm单元测试通过 --- .../mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java | 2 +- .../src/com/coderising/jvm/attr/LocalVariableTable.java | 1 + .../mini-jvm/src/com/coderising/jvm/field/Field.java | 7 +++++-- .../mini-jvm/src/com/coderising/jvm/method/Method.java | 4 ++-- .../src/com/coderising/jvm/test/ClassFileloaderTest.java | 9 +++++---- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java index 1194321d0d..cf37bf22aa 100644 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -71,7 +71,7 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { LineNumberTable lineNumberTable = LineNumberTable.parse(iter); codeAttr.setLineNumberTable(lineNumberTable); - } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { + } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LOCAL_VAR_TABLE)) { LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); codeAttr.setLocalVariableTable(localVariableTable); diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java index 9547f95d68..93d2af0d62 100644 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -26,6 +26,7 @@ public static LocalVariableTable parse(ByteCodeIterator iter){ LocalVariableItem localVariableItem = new LocalVariableItem(); localVariableItem.setStartPC(iter.nextU2Int()); localVariableItem.setLength(iter.nextU2Int()); + localVariableItem.setNameIndex(iter.nextU2Int()); localVariableItem.setDescIndex(iter.nextU2Int()); localVariableItem.setIndex(iter.nextU2Int()); localVariableTable.addLocalVariableItem(localVariableItem); diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java index d3a642a109..acbb77410a 100644 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java @@ -23,12 +23,15 @@ public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool po @Override public String toString() { - return super.toString(); + String name = pool.getUTF8String(nameIndex); + String descr = pool.getUTF8String(descriptorIndex); + + return name+":"+descr; } public static Field parse(ConstantPool pool, ByteCodeIterator iter) { int accessFlag = iter.nextU2Int(); - int nameIndex = iter.nextU1Int(); + int nameIndex = iter.nextU2Int(); int descriptorIndex = iter.nextU2Int(); int attributsCount = iter.nextU2Int(); diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java index fd0713d9ca..3d2c8e2554 100644 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java @@ -66,11 +66,11 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { method.setCodeAttr(codeAttr); } else { - throw new RuntimeException("there's other method attribute to be implemented !!"); + throw new RuntimeException("there's other method attribute to be implemented:attributeName = " + attributeName); } } - return null; + return method; } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index dcdff98cf7..bd32473909 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -19,14 +19,15 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "/Users/guodongchow/Desktop/coding2017/projects/mini-jvm/bin/"; - static String path2 = "/Users/guodongchow/bin"; +// static String path1 = "/Users/guodongchow/Desktop/coding2017/projects/mini-jvm/bin/"; + static String path1 = "/Users/guodongchow/Desktop/coding2017/"; + static String path2 = "/Users/guodongchow/bin/"; static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "EmployeeV1"; clzFile = loader.loadClass(className); clzFile.print(); @@ -60,7 +61,7 @@ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); From d1fabaf5a3835854e6ecd29498d313531f15185a Mon Sep 17 00:00:00 2001 From: Admin Date: Sun, 16 Apr 2017 10:14:32 +0800 Subject: [PATCH 148/552] last fix --- .../coding/basic/stack/expr/InfixExpr.java | 26 ++++++--------- .../basic/stack/expr/InfixExprTest.java | 32 +++++++++++++++++-- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index 030b0e3fad..4174b0a693 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -28,26 +28,18 @@ public float evaluate() { int i2 = tp.nextInt(); String sign2 = tp.nextSign(); - if (tp.hasNextInt()) { - - if (highPrioritySign(sign1) || lowPrioritySign(sign2)) { - i1 = ints.pop(); - sign1 = signs.pop(); - int result = calculate(i1, i2, sign1); - ints.push(result); - - } else { - - ints.push(i2); - - } - if (tp.hasNextInt()) { + if (highPrioritySign(sign1)) { - signs.push(sign2); + i1 = ints.pop(); + sign1 = signs.pop(); + i2 = calculate(i1, i2, sign1); + } - + + ints.push(i2); + signs.push(sign2); sign1 = sign2; } @@ -105,7 +97,7 @@ private boolean lowPrioritySign(String sign) { return false; } - + private boolean highPrioritySign(String sign) { if (sign.equals("*") || sign.equals("/")) { diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java index 883af2fe8c..666265df6c 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java @@ -17,20 +17,46 @@ public void tearDown() throws Exception { @Test public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { InfixExpr expr = new InfixExpr("2+3*4+5"); Assert.assertEquals(19.0, expr.evaluate(), 0.001f); } + + { + InfixExpr expr = new InfixExpr("2+3*4+5*1+1"); + Assert.assertEquals(20.0, expr.evaluate(), 0.001f); + } + { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2/2+5*2*2/2+1-10/2*4+1"); - Assert.assertEquals(102.0, expr.evaluate(), 0.001f); + InfixExpr expr = new InfixExpr("2+3*4/2"); + Assert.assertEquals(8.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("2-3*4/2-1"); + Assert.assertEquals(-5.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("6-1*5+2+0"); + Assert.assertEquals(3.0, expr.evaluate(), 0.001f); } { InfixExpr expr = new InfixExpr("3*20/2"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } + + { + InfixExpr expr = new InfixExpr("3*20/2+1"); + Assert.assertEquals(31, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2+1-1"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } { InfixExpr expr = new InfixExpr("20/2*3"); From 6d4a5998cf81d4dd46b142a7d66e625c1ab3f07f Mon Sep 17 00:00:00 2001 From: Admin Date: Sun, 16 Apr 2017 10:27:11 +0800 Subject: [PATCH 149/552] we can do better --- .../382266293/coding/basic/stack/expr/InfixExpr.java | 12 +----------- .../coding/basic/stack/expr/InfixExprTest.java | 5 +++++ .../coding/basic/stack/expr/TokenParser.java | 3 +-- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index 4174b0a693..2b4d531c40 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -46,6 +46,7 @@ public float evaluate() { } + signs.pop(); StackUtil.reverse(ints); StackUtil.reverse(signs); @@ -86,17 +87,6 @@ private int calculate(int firstInt, int secInt, String lowsign) { return result; } - - private boolean lowPrioritySign(String sign) { - - if (sign.equals("+") || sign.equals("-")) { - - return true; - - } - - return false; - } private boolean highPrioritySign(String sign) { diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java index 666265df6c..791ea67e43 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java @@ -18,6 +18,11 @@ public void tearDown() throws Exception { @Test public void testEvaluate() { + { + InfixExpr expr = new InfixExpr("1*2*2-1"); + Assert.assertEquals(3.0, expr.evaluate(), 0.001f); + } + { InfixExpr expr = new InfixExpr("2+3*4+5"); Assert.assertEquals(19.0, expr.evaluate(), 0.001f); diff --git a/group12/382266293/coding/basic/stack/expr/TokenParser.java b/group12/382266293/coding/basic/stack/expr/TokenParser.java index f5f37a9a5b..4fa0d7b79e 100644 --- a/group12/382266293/coding/basic/stack/expr/TokenParser.java +++ b/group12/382266293/coding/basic/stack/expr/TokenParser.java @@ -56,8 +56,7 @@ public void parse(String expr) { throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ); } - intQ.add(1); - signQ.add("*"); + intQ.add(0); } From 23a19dcdfe9d9fadc9cf4157a264ff2def9fad7b Mon Sep 17 00:00:00 2001 From: '1299310140' <'13437282785@163.com'> Date: Sun, 16 Apr 2017 13:01:21 +0800 Subject: [PATCH 150/552] expr --- .../coding/basic/stack/expr/InfixExpr.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 group04/1299310140/src/com/coding/basic/stack/expr/InfixExpr.java diff --git a/group04/1299310140/src/com/coding/basic/stack/expr/InfixExpr.java b/group04/1299310140/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..e0d6af6a21 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,75 @@ +package com.coding.basic.stack.expr; + +import java.util.Stack; + +public class InfixExpr { + //操作数为整数,操作符只支持+、-、*、/,/的返回值为float类型 + private String expr = ""; + private char[] sc = null; + private int pos = 0; + + public InfixExpr(String expr) { + this.expr = expr; + this.sc = expr.toCharArray(); + } + + //下一个操作数 + private int nextOperand(){ + int result = sc[pos] - 48;//char:'0'-->int:0 + pos++; + while(pos < sc.length && sc[pos] >= '0' && sc[pos] <= '9'){ + result = result * 10 + (sc[pos] - 48); + pos++; + } + return result; + } + + //下一个操作符 + private char nextOperator(){ + return sc[pos++]; + } + + public float evaluate() { + Stack stack = this.multiplyDivide(); + float result = add(stack); + return result; + } + + //将栈内所有操作数相加 + private float add(Stack stack){ + if(stack == null || stack.isEmpty()){ + return 0; + } + + float result = 0; + while(!stack.isEmpty()){ + result = result + (float)stack.pop(); + } + return result; + } + + //操作数入栈,完成乘除运算,'-'随数入栈 + private Stack multiplyDivide(){ + Stack operandStack = new Stack(); + operandStack.push((float)this.nextOperand()); + int tempOperand = 0; + char tempOperator = 0; + while(pos < sc.length){ + tempOperator = this.nextOperator(); + tempOperand = this.nextOperand(); + if(tempOperator == '+'){ + operandStack.push((float)tempOperand); + }else if(tempOperator == '-'){ + operandStack.push((float)(- tempOperand)); + }else if(tempOperator == '*'){ + float top = (float)operandStack.pop(); + operandStack.push(top * tempOperand); + }else if(tempOperator == '/'){ + float top = (float)operandStack.pop(); + operandStack.push(top / tempOperand); + } + } + + return operandStack; + } +} From 14a24decf77222f3f987c521cc5ae20f465bf245 Mon Sep 17 00:00:00 2001 From: GUK0 <1685605435@qq.com> Date: Sun, 16 Apr 2017 13:34:10 +0800 Subject: [PATCH 151/552] =?UTF-8?q?=E7=AC=AC7=E5=91=A8=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=EF=BC=8CJunit=E6=B5=8B=E8=AF=95=E6=9C=89?= =?UTF-8?q?=E7=82=B9=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../structure/week2/ArrayUtilTest.java | 1 - .../247565311/structure/week6/StackUtil.java | 40 +++---- .../structure/week6/StackUtilTest.java | 7 +- .../247565311/structure/week7/InfixExpr.java | 93 ++++++++++++--- .../structure/week7/InfixExprTest.java | 112 ++++++++++-------- .../week567_miniJVM/attr/AttrFactory.java | 80 +++++++++++++ .../week567_miniJVM/attr/AttributeInfo.java | 19 +-- .../week567_miniJVM/attr/CodeAttr.java | 53 ++++----- .../week567_miniJVM/attr/LineNumberTable.java | 18 ++- .../attr/LocalVariableItem.java | 7 ++ .../attr/LocalVariableTable.java | 6 +- .../week567_miniJVM/attr/StackMapTable.java | 2 +- .../week567_miniJVM/clz/ClassFile.java | 76 ++++++------ .../constant/ConstantPool.java | 6 - .../week567_miniJVM/constant/InfoFactory.java | 54 +++++++++ .../week567_miniJVM/constant/UTF8Info.java | 3 - .../week567_miniJVM/field/Field.java | 33 ++---- .../loader/ByteCodeIterator.java | 34 ++++-- .../loader/ClassFileLoader.java | 24 ++-- .../{test => loader}/ClassFileLoaderTest.java | 44 +++---- .../loader/ClassFileParser.java | 105 +++++++++++----- .../week567_miniJVM/method/Method.java | 47 ++++---- .../week567_miniJVM/test/EmployeeV1.java | 15 ++- .../247565311/week567_miniJVM/util/Util.java | 3 - 24 files changed, 557 insertions(+), 325 deletions(-) create mode 100644 group12/247565311/week567_miniJVM/attr/AttrFactory.java create mode 100644 group12/247565311/week567_miniJVM/constant/InfoFactory.java rename group12/247565311/week567_miniJVM/{test => loader}/ClassFileLoaderTest.java (93%) diff --git a/group12/247565311/structure/week2/ArrayUtilTest.java b/group12/247565311/structure/week2/ArrayUtilTest.java index c1b414d725..3d249b7225 100644 --- a/group12/247565311/structure/week2/ArrayUtilTest.java +++ b/group12/247565311/structure/week2/ArrayUtilTest.java @@ -8,7 +8,6 @@ public class ArrayUtilTest { ArrayUtil u = null; @Before public void setUp() throws Exception { - System.out.println("ʼһµIJ"); u = new ArrayUtil(); } diff --git a/group12/247565311/structure/week6/StackUtil.java b/group12/247565311/structure/week6/StackUtil.java index 9895f02f30..4529372e4c 100644 --- a/group12/247565311/structure/week6/StackUtil.java +++ b/group12/247565311/structure/week6/StackUtil.java @@ -2,20 +2,10 @@ import java.util.Stack; public class StackUtil { - public static void bad_reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack(); - while(!s.isEmpty()){ - tmpStack.push(s.pop()); - } - s = tmpStack; - } - + /** - * 閸嬪洩顔曢弽鍫滆厬閻ㄥ嫬鍘撶槐鐘虫ЦInteger, 娴犲孩鐖ゆい璺哄煂閺嶅牆绨抽弰锟� 5,4,3,2,1 鐠嬪啰鏁ょ拠銉︽煙濞夋洖鎮楅敍锟介崗鍐濞嗏�绨崣妯硅礋: 1,2,3,4,5 - * 濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 */ public static void reverse(Stack s){ if(s == null || s.isEmpty()) return; @@ -27,22 +17,26 @@ public static void reverse(Stack s){ } while(!s1.isEmpty()) s.push(s1.pop()); + for(int i=0;ii) + int index = 1; + while(index+i0) + while(!s1.isEmpty()) s.push(s1.pop()); } } - // 閫氳繃閫掑綊鍙互涓嶄娇鐢ㄥ爢鏍堝畬鎴愯繖涓�姛鑳� + // 原地翻转栈也可以使用递归的方式,就是不好理解 public static void reverse2(Stack s) { if(s == null || s.isEmpty()){ return; } Integer top = s.pop(); - reverse(s); + reverse2(s); addToBottom(s,top); } public static void addToBottom(Stack s, Integer value){ @@ -55,7 +49,7 @@ public static void addToBottom(Stack s, Integer value){ } } /** - * 閸掔娀娅庨弽鍫滆厬閻ㄥ嫭鐓囨稉顏勫帗缁憋拷濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И + * 移出栈中的某个元素,只能使用push,pop,peek,isEmpty这几种操作 * * @param o */ @@ -76,7 +70,7 @@ public static void remove(Stack s,Object o) { } /** - * 娴犲孩鐖ゆい璺哄絿瀵版en娑擃亜鍘撶槐锟�閸樼喐娼甸惃鍕垽娑擃厼鍘撶槐鐘辩箽閹镐椒绗夐崣锟� * 濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И + * 获取栈顶的len个元素,只能使用push,pop,peek,isEmpty这几种操作来完成 * @param len * @return */ @@ -98,10 +92,10 @@ public static Object[] getTop(Stack s,int len) { return result; } /** - * 鐎涙顑佹稉鐬�閸欘垵鍏橀崠鍛儓鏉╂瑤绨虹�妤冾儊閿涳拷 ( ) [ ] { }, a,b,c... x,yz - * 娴h法鏁ら崼鍡樼垽濡拷鐓$�妤冾儊娑撶灚娑擃厾娈戦幏顒�娇閺勵垯绗夐弰顖涘灇鐎电懓鍤悳鎵畱閵嗭拷 - * 娓氬顩 = "([e{d}f])" , 閸掓瑨顕氱�妤冾儊娑撹弓鑵戦惃鍕閸欓攱妲搁幋鎰嚠閸戣櫣骞囬敍锟界拠銉︽煙濞夋洝绻戦崶鐎焤ue - * 婵″倹鐏�s = "([b{x]y})", 閸掓瑨顕氱�妤冾儊娑撹弓鑵戦惃鍕閸欒渹绗夐弰顖涘灇鐎电懓鍤悳鎵畱閿涳拷鐠囥儲鏌熷▔鏇$箲閸ョ�alse; + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz + * 使用堆栈检查字符串s中的括号是不是成对出现的。 + * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true + * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; * @param s * @return */ diff --git a/group12/247565311/structure/week6/StackUtilTest.java b/group12/247565311/structure/week6/StackUtilTest.java index f1a8aec8ac..74c10b3ffd 100644 --- a/group12/247565311/structure/week6/StackUtilTest.java +++ b/group12/247565311/structure/week6/StackUtilTest.java @@ -1,13 +1,12 @@ package structure.week6; -import static org.junit.Assert.fail; - import java.util.Stack; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; + public class StackUtilTest { @Before @@ -24,11 +23,8 @@ public void testAddToBottom() { s.push(1); s.push(2); s.push(3); - StackUtil.addToBottom(s, 0); - Assert.assertEquals("[0, 1, 2, 3]", s.toString()); - } @Test public void testReverse() { @@ -74,5 +70,4 @@ public void testIsValidPairs() { Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); } - } \ No newline at end of file diff --git a/group12/247565311/structure/week7/InfixExpr.java b/group12/247565311/structure/week7/InfixExpr.java index 4fc4d13fbe..1cb09a5d0b 100644 --- a/group12/247565311/structure/week7/InfixExpr.java +++ b/group12/247565311/structure/week7/InfixExpr.java @@ -1,17 +1,20 @@ package structure.week7; -// 姹傝В琛ㄨ揪寮忓瓧绗︿覆锛岄鍏堝皢琛ㄨ揪寮忓垱寤烘垚涓�5琛ㄨ揪寮忔爲锛岄渶瑕佹牴鎹繍绠楃鐨勪紭鍏堢骇鏉ュ垱寤� +import structure.week1.Stack; +// 使用表达式树来完成这个运算 public class InfixExpr { String expr = null; Element getElem = null; public InfixExpr(String expr) { - this.expr = expr; + this.expr = "0+"+expr; // 由于遇到优先级变化会生成单独节点,必须以最低优先级开头 getElem = new Element(expr); } public float evaluate() throws Exception{ - Node node = new Node('\0',getElem.getNextNum()); - Node root = createNode(node); + Node root = createNode(null); return (float) getValue(root); } + public double evaluate_stack(){ + return 0.0; + } class Element{ private int index; private String str; @@ -19,7 +22,35 @@ public Element(String _str){ index = 0; str = _str; } - public double getNextNum(){ + public double peekNextNum(){ + int lastindex = index; + double resl = 0,resr=0; + int fbits = 0; + char ch = str.charAt(index); + boolean hasp = false; + while(ch=='.' || (ch<='9' && '0'<=ch)){ + index += 1; + if(ch == '.') hasp = true; + else{ + if(hasp){ + fbits -= 1; + resr += (double)(ch-'0') * Math.pow(10,fbits); + }else{ + resl *= 10; + resl += (ch-'0'); + } + } + if(hasNext()) ch = str.charAt(index); + else break; + } + index = lastindex; + return resl+resr; + } + public double getNextNum() throws Exception{ + if(!hasNext()) { + int a = index -2; + throw new Exception("表达式格式错误,在位置"+a+"处缺少操作数。"); + } double resl = 0,resr=0; int fbits = 0; char ch = str.charAt(index); @@ -41,6 +72,18 @@ public double getNextNum(){ } return resl+resr; } + public char peekNextOper(){ + int lastindex = index; + char ch = '\0'; + while(hasNext()){ + ch = str.charAt(index); + index += 1; + if(ch=='+'||ch=='-'||ch=='*'||ch=='/') break; + ch = '\0'; + } + index = lastindex; + return ch; + } public char getNextOper(){ if(hasNext()){ char ch = str.charAt(index); @@ -68,23 +111,37 @@ class Node{ val =v; } } - private Node createNode(Node root){ + private Node createNode(Node node) throws Exception{ + if(getElem.peekNextOper() == '\0') return node; + if(node == null){ + node = new Node('\0',getElem.getNextNum()); + } char ch = getElem.getNextOper(); - if(ch == '\0'){ - + Node root = new Node(ch,0); + root.left = node; + char chn = getElem.peekNextOper(); + if(operUpDowm(ch,chn)<0){ // 操作符优先级提升 + root.right = createNode(null); + }else if(operUpDowm(ch,chn)>0){ // 操作符优先级下降 + root.right = new Node('\0',getElem.getNextNum()); + return root; // 这里是遍历完一个连续乘除法,需要返回节点,考虑5-2*3-4,不返回会导致5-2*3+4 }else{ - + root.right = new Node('\0',getElem.getNextNum()); } - Node node = new Node(getElem.getNextOper(),0); - node.left = root; - node.right = null; - // todo - return node; + return createNode(root); + } + private int operUpDowm(char c1,char c2){ + int temp1 = 0,temp2=0; + if(c1=='+'||c1=='-')temp1 = 0; + else if(c1=='*'||c1=='/')temp1 = 1; + if(c2=='+'||c2=='-')temp2 = 0; + else if(c2=='*'||c2=='/')temp2 = 1; + return temp1-temp2; } private double getValue(Node root) throws Exception{ - if(root == null) throw new Exception("表达式非法"); + if(root == null) throw new Exception("解析表达式出现异常"); switch(root.op){ - case '+': + case '+': return getValue(root.left)+getValue(root.right); case '-': return getValue(root.left)-getValue(root.right); @@ -92,8 +149,10 @@ private double getValue(Node root) throws Exception{ return getValue(root.left)*getValue(root.right); case '/': return getValue(root.left)/getValue(root.right); - default: + case '\0': return root.val; + default: + throw new Exception("目前还不支持 "+new StringBuilder().append(root.op).toString()+" 运算符。"); } } } diff --git a/group12/247565311/structure/week7/InfixExprTest.java b/group12/247565311/structure/week7/InfixExprTest.java index 21680594de..730e623126 100644 --- a/group12/247565311/structure/week7/InfixExprTest.java +++ b/group12/247565311/structure/week7/InfixExprTest.java @@ -6,58 +6,66 @@ public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - @After - public void tearDown() throws Exception { - } - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - try { - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } + @Before + public void setUp() throws Exception { + } + @After + public void tearDown() throws Exception { + } + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + try { + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - try { - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + try { + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } - { - InfixExpr expr = new InfixExpr("10-30+50"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - } + { + InfixExpr expr = new InfixExpr("3*20/2"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + { + InfixExpr expr = new InfixExpr("4*2*5+5-4*5/5*3/2*4-2+4*2+2/1"); + try { + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + } } \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/attr/AttrFactory.java b/group12/247565311/week567_miniJVM/attr/AttrFactory.java new file mode 100644 index 0000000000..71992f4302 --- /dev/null +++ b/group12/247565311/week567_miniJVM/attr/AttrFactory.java @@ -0,0 +1,80 @@ +package week567_miniJVM.attr; + +import week567_miniJVM.clz.ClassFile; +import week567_miniJVM.constant.ConstantInfo; +import week567_miniJVM.constant.UTF8Info; +import week567_miniJVM.loader.ByteCodeIterator; +import week567_miniJVM.attr.LineNumberTable; + +public class AttrFactory{ + private static AttrFactory instance = new AttrFactory(); + public static AttrFactory Instance(){ + return instance; + } + public AttributeInfo parse(ClassFile clzFile,ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + ConstantInfo info = clzFile.getConstantPool().getConstantInfo(attrNameIndex); + if(info.getType()==1&&"Code".equals(((UTF8Info) info).getValue())){ + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocal = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + CodeAttr codeattr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocal,codeLen,code); + + int exceptLen = iter.nextU2ToInt(); // 쳣 + while(exceptLen>0){ + exceptLen -= 1; + int startPc = iter.nextU2ToInt(); + int endPc = iter.nextU2ToInt(); + int handlerPc = iter.nextU2ToInt(); + int catchType = iter.nextU2ToInt(); + // TODO + } + int attributeLen = iter.nextU2ToInt(); // »Եĸ + while(attributeLen>0){ + attributeLen -= 1; + AttributeInfo chattr = AttrFactory.Instance().parse(clzFile, iter); + codeattr.addAttr(chattr); + } + return codeattr; + }else if(info.getType()==1&&"LineNumberTable".equals(((UTF8Info) info).getValue())){ + int attrLen = iter.nextU4ToInt(); + int lineNum = iter.nextU2ToInt(); + LineNumberTable linetable = new LineNumberTable(attrNameIndex,lineNum); + while(lineNum>0){ + lineNum -= 1; + int startPc = iter.nextU2ToInt(); + int lineNumber = iter.nextU2ToInt(); + linetable.addLineNumberItem(startPc,lineNumber); + } + return linetable; + }else if(info.getType()==1&&"LocalVariableTable".equals(((UTF8Info) info).getValue())){ + int attrLen = iter.nextU4ToInt(); + int localVarNum = iter.nextU2ToInt(); + LocalVariableTable lvartable = new LocalVariableTable(attrNameIndex,localVarNum); + while(localVarNum>0){ + localVarNum -= 1; + int startPc = iter.nextU2ToInt(); + int length = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int index = iter.nextU2ToInt(); + LocalVariableItem item = new LocalVariableItem(startPc,length,nameIndex,descIndex,index); + lvartable.addLocalVariableItem(item); + } + return lvartable; + }else if(info.getType()==1&&"StackMapTable".equals(((UTF8Info) info).getValue())){ + int attrLen = iter.nextU4ToInt(); + int entryNum = iter.nextU2ToInt(); + StackMapTable stacktable = new StackMapTable(attrNameIndex,entryNum); + stacktable.parse(iter); + //while(entryNum>0){ + // entryNum -= 1; + + //} + return stacktable; + } + return null; + } +} \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/attr/AttributeInfo.java b/group12/247565311/week567_miniJVM/attr/AttributeInfo.java index e97ebe0065..fb310678bf 100644 --- a/group12/247565311/week567_miniJVM/attr/AttributeInfo.java +++ b/group12/247565311/week567_miniJVM/attr/AttributeInfo.java @@ -1,7 +1,6 @@ package week567_miniJVM.attr; - - +import structure.week1.ArrayList; public abstract class AttributeInfo { public static final String CODE = "Code"; @@ -12,13 +11,19 @@ public abstract class AttributeInfo { public static final String STACK_MAP_TABLE = "StackMapTable"; int attrNameIndex; int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; + private String attrName; + ArrayList attrs = new ArrayList(); + public AttributeInfo( int attrNameIndex,int attrLen,String attrname) { + this.attrNameIndex = attrNameIndex; this.attrLen = attrLen; + this.attrName = attrname; + } + public String getAttrName(){ + return attrName; + } + public void addAttr(AttributeInfo attrinfo){ + attrs.add(attrinfo); } - - } diff --git a/group12/247565311/week567_miniJVM/attr/CodeAttr.java b/group12/247565311/week567_miniJVM/attr/CodeAttr.java index b32d6aada9..15e0a027f2 100644 --- a/group12/247565311/week567_miniJVM/attr/CodeAttr.java +++ b/group12/247565311/week567_miniJVM/attr/CodeAttr.java @@ -1,13 +1,10 @@ - - package week567_miniJVM.attr; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.constant.ConstantPool; import week567_miniJVM.loader.ByteCodeIterator; - public class CodeAttr extends AttributeInfo { private int maxStack ; private int maxLocals ; @@ -16,46 +13,40 @@ public class CodeAttr extends AttributeInfo { public String getCode() { return code; } - - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen,AttributeInfo.CODE); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; } - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; + public LineNumberTable getLineNumberTable() { + for(int i=0;i items = new ArrayList(); public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen,AttributeInfo.LOCAL_VAR_TABLE); } - public static LocalVariableTable parse(ByteCodeIterator iter){ return null; } - private void addLocalVariableItem(LocalVariableItem item) { + public void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } + } diff --git a/group12/247565311/week567_miniJVM/attr/StackMapTable.java b/group12/247565311/week567_miniJVM/attr/StackMapTable.java index c6b72f2655..aaf8d2944d 100644 --- a/group12/247565311/week567_miniJVM/attr/StackMapTable.java +++ b/group12/247565311/week567_miniJVM/attr/StackMapTable.java @@ -9,7 +9,7 @@ public class StackMapTable extends AttributeInfo{ private String originalCode; public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen,AttributeInfo.STACK_MAP_TABLE); } public static StackMapTable parse(ByteCodeIterator iter){ diff --git a/group12/247565311/week567_miniJVM/clz/ClassFile.java b/group12/247565311/week567_miniJVM/clz/ClassFile.java index 91226364b8..5db5b1dba8 100644 --- a/group12/247565311/week567_miniJVM/clz/ClassFile.java +++ b/group12/247565311/week567_miniJVM/clz/ClassFile.java @@ -7,65 +7,48 @@ import structure.week1.ArrayList; public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - - + public int minorVersion,majorVersion; + private AccessFlag accessFlag = null; + private ClassIndex clzIndex = null; + private ConstantPool constPool = null; + private ArrayList methods = null; + private ArrayList fields = null; + public ClassIndex getClzIndex() { return clzIndex; } + public void setClzIndex(ClassIndex clz){ + clzIndex = clz; + } public AccessFlag getAccessFlag() { return accessFlag; } - public void setAccessFlag(AccessFlag accessFlag) { - this.accessFlag = accessFlag; - } - - - - public ConstantPool getConstantPool() { - return pool; + public void setAccessFlag(AccessFlag acsFlag){ + accessFlag = acsFlag; + } + public ConstantPool getConstantPool() { + return constPool; } + public void setConstantPool(ConstantPool pool){ + constPool = 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 setVersion(int minor,int major){ + minorVersion = minor; + majorVersion = major; + } public void print(){ - if(this.accessFlag.isPublicClass()){ - System.out.println("Access flag : public "); + 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); @@ -76,9 +59,18 @@ private String getSuperClassName(){ return superClass.getClassName(); } public ArrayList getMethods() { - return null; + return methods; } public ArrayList getFields() { - return null; + return fields; + } + public void setClassIndex(ClassIndex parseClassIndex) { + clzIndex = parseClassIndex; + } + public void setFields(ArrayList parseFields) { + fields = parseFields; + } + public void setMethods(ArrayList parseMethods) { + methods = parseMethods; } } diff --git a/group12/247565311/week567_miniJVM/constant/ConstantPool.java b/group12/247565311/week567_miniJVM/constant/ConstantPool.java index fb35f6c253..23c1c32dce 100644 --- a/group12/247565311/week567_miniJVM/constant/ConstantPool.java +++ b/group12/247565311/week567_miniJVM/constant/ConstantPool.java @@ -4,19 +4,13 @@ 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); } diff --git a/group12/247565311/week567_miniJVM/constant/InfoFactory.java b/group12/247565311/week567_miniJVM/constant/InfoFactory.java new file mode 100644 index 0000000000..8c8bdc12f4 --- /dev/null +++ b/group12/247565311/week567_miniJVM/constant/InfoFactory.java @@ -0,0 +1,54 @@ +package week567_miniJVM.constant; +import week567_miniJVM.loader.ByteCodeIterator; +public class InfoFactory{ + private static InfoFactory infoFact = new InfoFactory(); + public static InfoFactory Invoke(){ + return infoFact; + } + public ConstantInfo getInfoObj(int tag,ByteCodeIterator iter,ConstantPool pool){ + switch(tag){ + case 1:{ + UTF8Info info = new UTF8Info(pool); + info.setLength(iter.nextU2ToInt()); + info.setValue(iter.nextUxToHexString(info.getLength())); + return info;} + case 7:{ + ClassInfo info = new ClassInfo(pool); + info.setUtf8Index(iter.nextU2ToInt()); + return info; } + case 8:{ + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + return info;} + case 9:{ + FieldRefInfo info = new FieldRefInfo(pool); + info.setClassInfoIndex(iter.nextU2ToInt()); + info.setNameAndTypeIndex(iter.nextU2ToInt()); + return info;} + case 10:{ + MethodRefInfo info = new MethodRefInfo(pool); + info.setClassInfoIndex(iter.nextU2ToInt()); + info.setNameAndTypeIndex(iter.nextU2ToInt()); + return info;} + case 12:{ + NameAndTypeInfo info = new NameAndTypeInfo(pool); + info.setIndex1(iter.nextU2ToInt()); + info.setIndex2(iter.nextU2ToInt()); + return info;} + default: + new RuntimeException("tag 为"+tag+" 的常亮项尚不支持!").printStackTrace(); + break; + } + return null; + } +} + + + + + + + + + + diff --git a/group12/247565311/week567_miniJVM/constant/UTF8Info.java b/group12/247565311/week567_miniJVM/constant/UTF8Info.java index ac2341bda9..40dbb7f126 100644 --- a/group12/247565311/week567_miniJVM/constant/UTF8Info.java +++ b/group12/247565311/week567_miniJVM/constant/UTF8Info.java @@ -26,7 +26,4 @@ public String getValue() { public void setValue(String value) { this.value = value; } - - - } diff --git a/group12/247565311/week567_miniJVM/field/Field.java b/group12/247565311/week567_miniJVM/field/Field.java index 47eac5a308..dd7510510a 100644 --- a/group12/247565311/week567_miniJVM/field/Field.java +++ b/group12/247565311/week567_miniJVM/field/Field.java @@ -1,33 +1,24 @@ package week567_miniJVM.field; +import structure.week1.ArrayList; import week567_miniJVM.constant.ConstantPool; -import week567_miniJVM.constant.UTF8Info; import week567_miniJVM.loader.ByteCodeIterator; - - public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - + private int accessFlag,nameIndex,descIndex; private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - + public Field( int accessFlag, int nameIndex, int descIndex,ConstantPool pool) { this.accessFlag = accessFlag; this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; + this.descIndex = descIndex; this.pool = pool; } - - - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - return null; + public void parse(ConstantPool pool,ByteCodeIterator iter){ + int propNum = iter.nextU2ToInt(); + while(propNum>0){ + propNum -= 1; + int prop = iter.nextU2ToInt(); + // TODO + } + return ; } - } \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java b/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java index d38345b3fe..a3cf1f4578 100644 --- a/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java +++ b/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java @@ -1,20 +1,38 @@ package week567_miniJVM.loader; public class ByteCodeIterator { - + private byte[] bytes = null; + int index = 0; + public ByteCodeIterator(byte[] _byte){ + bytes = _byte; + } + public void skip(int i){ + index += i; + } + public int nextU1ToInt(){ + byte a = bytes[index]; + System.out.print(a); + index += 1; + return (int)(a&0xff); + } public int nextU2ToInt() { - // TODO Զɵķ - return 0; + return nextU1ToInt()*256+nextU1ToInt(); } public int nextU4ToInt() { - // TODO Զɵķ - return 0; + return nextU1ToInt()*256*256*256+nextU1ToInt()*256*256+nextU1ToInt()*256+nextU1ToInt(); } public String nextUxToHexString(int len) { - // TODO Զɵķ - return null; + String res = ""; + while(len>0){ + len -= 1; + int a = nextU1ToInt(); + res += (char)(a&0xff); + } + return res; } - + public boolean hasNext(){ + return index clzPaths = new ArrayList(); - public byte[] readBinaryCode(String className) throws Exception { + public ClassFile loadClass(String className){ + + byte[] bytes = readBinaryCode(className); + ClassFile clzFile = new ClassFileParser().parse(bytes); + + return clzFile; + } + public byte[] readBinaryCode(String className) { for(String s:clzPaths){ String filename = s+className+".class"; File file = new File(filename); @@ -20,32 +26,26 @@ public byte[] readBinaryCode(String className) throws Exception { } return null; } - public ClassFile loadClass(String className){ - return null; - } - private byte[] loadClassFile(String clzFileName) throws Exception { + private byte[] loadClassFile(String clzFileName) { File file = new File(clzFileName); long filelength = file.length(); byte[]res = null; - if(filelength>Integer.MAX_VALUE)throw new IOException("ļ"); + if(filelength>Integer.MAX_VALUE) new IOException("ļ").printStackTrace(); try { FileInputStream fileinput = new FileInputStream(file); res = new byte[(int) filelength]; int offset=0,length=0; while(offset-1)) offset += length; - fileinput.close(); - } catch (FileNotFoundException e) { + if(fileinput!=null)fileinput.close(); + } catch (Exception e) { e.printStackTrace(); } return res; } - public void addClassPath(String path) { clzPaths.add(path); } - - public String getClassPath(){ String res = ""; int size = clzPaths.size(); diff --git a/group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java b/group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java similarity index 93% rename from group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java rename to group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java index ed81eaa399..c235413b3b 100644 --- a/group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java +++ b/group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java @@ -1,7 +1,7 @@ -package week567_miniJVM.test; +package week567_miniJVM.loader; + import structure.week1.ArrayList; -import structure.week1.List; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.clz.ClassIndex; import week567_miniJVM.constant.ClassInfo; @@ -19,23 +19,15 @@ import org.junit.Test; public class ClassFileLoaderTest { - private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "F:\\code_language\\demo\\Homework\\bin\\week567_miniJVM\\test"; + private static final String FULL_QUALIFIED_CLASS_NAME = "EmployeeV1.class"; + static String path1 = "F:\\code_language\\demo\\Homework\\bin\\week567_miniJVM\\test\\"; static String path2 = "C:\temp"; - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - - clzFile = loader.loadClass(className); - clzFile.print(); - } - - @Before - public void setUp() throws Exception { + public void setUp() throws Exception { + int = 1; + += 1; + System.out.print(); } @After public void tearDown() throws Exception { @@ -59,7 +51,8 @@ public void testClassFileLength() { } catch (Exception e) { e.printStackTrace(); } - // 这里断言.class文件的字节数 + // .classļֽ + System.out.print(byteCodes.length); Assert.assertEquals(267, byteCodes.length); } @Test @@ -91,8 +84,17 @@ private String byteToHexString(byte[] codes ){ return buffer.toString(); } /** - * miniJVM第二次作业测试用例 + * miniJVMڶҵ */ + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "week567_miniJVM.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } @Test public void testVersion(){ Assert.assertEquals(0, clzFile.getMinorVersion()); @@ -140,7 +142,7 @@ public void testConstantPool(){ Assert.assertEquals(9, nameAndType.getIndex1()); Assert.assertEquals(14, nameAndType.getIndex2()); } - // 随机抽查一个 + // һ { MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45); Assert.assertEquals(1, methodRef.getClassInfoIndex()); @@ -160,7 +162,7 @@ public void testClassIndex(){ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } /** - * miniJVM第三次作业测试用例 + * miniJVMҵ */ @Test public void testReadFields(){ @@ -223,4 +225,4 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } -} \ No newline at end of file +} diff --git a/group12/247565311/week567_miniJVM/loader/ClassFileParser.java b/group12/247565311/week567_miniJVM/loader/ClassFileParser.java index 5a23889b50..c3858dbaf6 100644 --- a/group12/247565311/week567_miniJVM/loader/ClassFileParser.java +++ b/group12/247565311/week567_miniJVM/loader/ClassFileParser.java @@ -1,44 +1,91 @@ package week567_miniJVM.loader; -import java.io.UnsupportedEncodingException; - +import structure.week1.ArrayList; import week567_miniJVM.clz.AccessFlag; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.clz.ClassIndex; -import week567_miniJVM.constant.ClassInfo; +import week567_miniJVM.constant.ConstantInfo; import week567_miniJVM.constant.ConstantPool; -import week567_miniJVM.constant.FieldRefInfo; -import week567_miniJVM.constant.MethodRefInfo; -import week567_miniJVM.constant.NameAndTypeInfo; +import week567_miniJVM.constant.InfoFactory; import week567_miniJVM.constant.NullConstantInfo; -import week567_miniJVM.constant.StringInfo; -import week567_miniJVM.constant.UTF8Info; - -public class ClassFileParser { +import week567_miniJVM.field.Field; +import week567_miniJVM.method.Method; - public ClassFile parse(byte[] codes) { - - - - return null; +public class ClassFileParser { + public ClassFile parse(byte[] bytes) { + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(bytes); + if(!"cafebabe".equals(iter.nextUxToHexString(4))) return null; + + clzFile.setVersion(iter.nextU2ToInt(),iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstantPool(pool); + + clzFile.setAccessFlag(parseAccessFlag(iter)); + clzFile.setClassIndex(parseClassIndex(iter)); + + int collectionNum = iter.nextU2ToInt(); + iter.skip(collectionNum*2); + + clzFile.setFields(parseFields(iter,pool)); + clzFile.setMethods(parseMethods(clzFile,iter)); + return clzFile; } - - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - - return null; + + private ConstantPool parseConstantPool(ByteCodeIterator iter){ + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + int lenpool = iter.nextU2ToInt(); + while(lenpool>1){ + lenpool -= 1; + int tag = iter.nextU1ToInt(); + ConstantInfo info = InfoFactory.Invoke().getInfoObj(tag,iter,pool); + pool.addConstantInfo(info); + } + return pool; } - - private ClassIndex parseClassInfex(ByteCodeIterator iter) { - - return null; - + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag caflag = new AccessFlag(iter.nextU2ToInt()); + return caflag; } - - private ConstantPool parseConstantPool(ByteCodeIterator iter) { - - return null; + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + ClassIndex clzIndex = new ClassIndex(); + clzIndex.setThisClassIndex(iter.nextU2ToInt()); + clzIndex.setSuperClassIndex(iter.nextU2ToInt()); + return clzIndex; } - + private ArrayList parseFields(ByteCodeIterator iter,ConstantPool pool){ + ArrayList fields = new ArrayList(); + int fieldNum = iter.nextU2ToInt(); + while(fieldNum>0){ + fieldNum -= 1; + int accflag = iter.nextU2ToInt(); // 例如是public + int nameIndex = iter.nextU2ToInt();// 指向常量池的入口 + int descIndex = iter.nextU2ToInt(); // 指向常量池的入口 + Field field = new Field(accflag,nameIndex,descIndex,pool); + field.parse(pool,iter); + fields.add(field); + } + return fields; + } + + private ArrayList parseMethods(ClassFile clzFile,ByteCodeIterator iter){ + ArrayList methods = new ArrayList(); + int methodNum = iter.nextU2ToInt(); + while(methodNum>0){ + methodNum -= 1; + int accflag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + Method method = new Method(clzFile,accflag,nameIndex,descIndex); + method.parse(clzFile,iter); + methods.add(method); + } + return methods; + } } diff --git a/group12/247565311/week567_miniJVM/method/Method.java b/group12/247565311/week567_miniJVM/method/Method.java index aadd29e9a6..ceabffec1b 100644 --- a/group12/247565311/week567_miniJVM/method/Method.java +++ b/group12/247565311/week567_miniJVM/method/Method.java @@ -1,58 +1,51 @@ package week567_miniJVM.method; - import week567_miniJVM.clz.ClassFile; -import week567_miniJVM.attr.AttributeInfo; -import week567_miniJVM.attr.CodeAttr; -import week567_miniJVM.constant.ConstantPool; +import week567_miniJVM.constant.ConstantInfo; import week567_miniJVM.constant.UTF8Info; import week567_miniJVM.loader.ByteCodeIterator; - - +import week567_miniJVM.attr.AttrFactory; +import week567_miniJVM.attr.AttributeInfo; +import week567_miniJVM.attr.CodeAttr; public class Method { - - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - + private int accessFlag,nameIndex,descIndex; private CodeAttr codeAttr; - private ClassFile clzFile; - public ClassFile getClzFile() { return clzFile; } - + public int getAccessFlag(){ + return accessFlag; + } public int getNameIndex() { return nameIndex; } public int getDescriptorIndex() { - return descriptorIndex; + return descIndex; } - public CodeAttr getCodeAttr() { return codeAttr; } - public void setCodeAttr(CodeAttr code) { this.codeAttr = code; } - - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descIndex) { this.clzFile = clzFile; this.accessFlag = accessFlag; this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; + this.descIndex = descIndex; } - - - - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ - return null; - + public void parse(ClassFile clzFile, ByteCodeIterator iter){ + int attributeNum = iter.nextU2ToInt(); + while(attributeNum>0){ + attributeNum -= 1; + AttributeInfo attrinfo = AttrFactory.Instance().parse(clzFile, iter); + if(attrinfo == null) continue; + + + } } } diff --git a/group12/247565311/week567_miniJVM/test/EmployeeV1.java b/group12/247565311/week567_miniJVM/test/EmployeeV1.java index b9855461ae..bfa4460096 100644 --- a/group12/247565311/week567_miniJVM/test/EmployeeV1.java +++ b/group12/247565311/week567_miniJVM/test/EmployeeV1.java @@ -1,5 +1,18 @@ package week567_miniJVM.test; public class EmployeeV1 { - + private int age; + private String name; + public void setAge(int _age){ + age = _age; + } + public int getAge(){ + return age; + } + public void setName(String _name){ + name = _name; + } + public String getName(){ + return name; + } } diff --git a/group12/247565311/week567_miniJVM/util/Util.java b/group12/247565311/week567_miniJVM/util/Util.java index c10eaee6f2..9c7baeb915 100644 --- a/group12/247565311/week567_miniJVM/util/Util.java +++ b/group12/247565311/week567_miniJVM/util/Util.java @@ -5,9 +5,6 @@ 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 Date: Sat, 15 Apr 2017 23:12:59 -0700 Subject: [PATCH 152/552] jvm homework, Fields and Methods parsing --- .../coderising/jvm/attr/AttributeInfo.java | 48 +++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 94 +++++++++ .../attr/InvalidAttributeInfoException.java | 7 + .../coderising/jvm/attr/LineNumberTable.java | 53 +++++ .../jvm/attr/LocalVariableItem.java | 71 +++++++ .../jvm/attr/LocalVariableTable.java | 40 ++++ .../coderising/jvm/attr/StackMapTable.java | 30 +++ .../src/com/coderising/jvm/clz/ClassFile.java | 24 ++- .../coderising/jvm/constant/ConstantInfo.java | 1 - .../jvm/constant/ConstantInfoFactory.java | 4 +- .../coderising/jvm/constant/ConstantPool.java | 8 + .../src/com/coderising/jvm/field/Field.java | 50 +++++ .../coderising/jvm/interfaze/Interfaze.java | 5 + .../interfaze/InvalidInterfaceException.java | 7 + .../jvm/loader/ByteCodeIterator.java | 23 ++- .../jvm/loader/ClassFileParser.java | 101 ++++++++-- .../method/InvalidMethodInfoException.java | 7 + .../src/com/coderising/jvm/method/Method.java | 87 +++++++++ .../jvm/test/ClassFileloaderTest.java | 81 +++++++- .../jvm/test/ClassFileloaderTest2.java | 52 +++++ .../coding/basic/stack/expr/InfixExpr.java | 184 ++++++++++++++++++ .../basic/stack/expr/InfixExprTest.java | 60 ++++++ group17/article/20170409-20170416.md | 56 ++++++ 23 files changed, 1069 insertions(+), 24 deletions(-) create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/InvalidAttributeInfoException.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group17/1282579502/src/com/coderising/jvm/field/Field.java create mode 100644 group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java create mode 100644 group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java create mode 100644 group17/1282579502/src/com/coderising/jvm/method/InvalidMethodInfoException.java create mode 100644 group17/1282579502/src/com/coderising/jvm/method/Method.java create mode 100644 group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java create mode 100644 group17/1282579502/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group17/1282579502/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group17/article/20170409-20170416.md diff --git a/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java b/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..1e4c513330 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,48 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + public static AttributeInfo parse(ClassFile file, ByteCodeIterator iter) throws InvalidAttributeInfoException{ + AttributeInfo attrInfo = null; + int attributeType = iter.getNextNBytesInteger(2); + String attributeTag = file.getConstantPool().getUTF8String(attributeType); + System.out.println("attribute type: " + attributeType + " utf8 val: " + file.getConstantPool().getUTF8String(attributeType)); + + if(attributeTag.equals(CODE)){ + System.out.println("about to parse CODE attribute"); + //ClassFile clzFile, ByteCodeIterator iter, int attributeNameIndex + attrInfo = CodeAttr.parse(file, iter, attributeType); + } + else if(attributeTag.equals(LINE_NUM_TABLE)){ + System.out.println("about to parse LINE_NUM_TABLE attribute"); + attrInfo = LineNumberTable.parse(iter); + } + else if(attributeTag.equals(LOCAL_VAR_TABLE)){ + System.out.println("about to parse LOCAL_VAR_TABLE attribute"); + attrInfo = LocalVariableTable.parse(iter, file, attributeType); + } + else{ + System.out.println("about to throw attribute"); + throw new InvalidAttributeInfoException("Unimplemented attribute exception."); + } + + return attrInfo; + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java b/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..12d151d575 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,94 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; +import com.coderising.jvm.method.InvalidMethodInfoException; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter, int attributeNameIndex) throws InvalidAttributeInfoException{ + System.out.println("parsing CodeAttr..."); + + int attributeLength = iter.getNextNBytesInteger(4); + int maxStack = iter.getNextNBytesInteger(2); + int maxLocalVar = iter.getNextNBytesInteger(2); + int codeLength = iter.getNextNBytesInteger(4); + + + System.out.println("attribute length: " + attributeLength); + System.out.println("max stack: " + maxStack); + System.out.println("max local variable: " + maxLocalVar); + System.out.println("code length: " + codeLength); + + String realCode = iter.getNextNHexString(codeLength); + System.out.println("real cdoe: " + realCode); + + int exceptionCount = iter.getNextNBytesInteger(2); + System.out.println("exception count: " + exceptionCount); + if(exceptionCount>0){ + throw new InvalidAttributeInfoException("Exception parser un-implemented."); + } + //int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code + CodeAttr code = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocalVar, codeLength, realCode); + + int subAttributeCount = iter.getNextNBytesInteger(2); + System.out.println("sub attribute count : " + subAttributeCount); + for(int i = 0; i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int attributeLength = iter.getNextNBytesInteger(4); + int lineNumberTableLength = iter.getNextNBytesInteger(2); + System.out.println("attribute length: " + attributeLength); + System.out.println("line number table length: " + lineNumberTableLength); + LineNumberTable table = new LineNumberTable(attributeLength, lineNumberTableLength); + for(int i = 0; i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + +public static LocalVariableTable parse(ByteCodeIterator iter, ClassFile clz, int nameIndex){ + LocalVariableTable attrInfo = null; + int attributeLength = iter.getNextNBytesInteger(4); + int localVarTableLength = iter.getNextNBytesInteger(2); + System.out.println("attribute length: " + attributeLength); + System.out.println("local variable table length: " + localVarTableLength); + attrInfo = new LocalVariableTable(nameIndex, attributeLength); + for(int i = 0;i fields; + private List methods; public ClassIndex getClzIndex() { return clzIndex; @@ -49,8 +55,6 @@ public void setClassIndex(ClassIndex clzIndex) { } - - public void print(){ if(this.accessFlag.isPublicClass()){ @@ -72,4 +76,20 @@ private String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public void setFields(List fields){ + this.fields = fields; + } + + public void setMethods(List methods){ + this.methods = methods; + } + + public List getFields(){ + return fields; + } + + public List getMethods(){ + return methods; + } } diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java index b99ed30fbf..4ddac90612 100755 --- a/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java @@ -26,5 +26,4 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - } diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java index 01df38c682..ce35409add 100644 --- a/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java @@ -16,7 +16,7 @@ public ConstantInfoFactory(ByteCodeIterator iter, ConstantPool pool){ public void fillNextConstantInfo() throws InvalidConstantInfoTypeException, UnsupportedEncodingException{ int constantIdentifier = iter.getNextByte(); ConstantInfo var = null; - System.out.println("constant identifyer: " + constantIdentifier); + //System.out.println("constant identifyer: " + constantIdentifier); var = classify(constantIdentifier); pool.addConstantInfo(var); } @@ -27,7 +27,7 @@ public ConstantInfo classify(int constantInfoTypeId) throws InvalidConstantInfoT case ConstantInfo.CLASS_INFO: ClassInfo classInfo = new ClassInfo(pool); byte[] utf8Index = iter.getNextNBytes(2); - System.out.println("constant classInfo: utf index: " + Util.byteToInt(utf8Index)); + //System.out.println("constant classInfo: utf index: " + Util.byteToInt(utf8Index)); classInfo.setUtf8Index(Util.byteToInt(utf8Index)); ret = classInfo; diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java index 9a1a998f41..59ad734f25 100755 --- a/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java @@ -26,4 +26,12 @@ public String getUTF8String(int index){ public int getSize() { return this.constantInfos.size() -1; } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + for(int i = 0; i attributeList = new ArrayList<>(); + for(int i = 0; i0){ + throw new InvalidAttributeInfoException("Attribute infomation is NOT valid."); + } + Field newField = new Field(accessFlag, nameIndex, descriptorIndex,pool); + return newField; + } + + public String toString(){ + return pool.getUTF8String(nameIndex) + ":" +pool.getUTF8String( descriptorIndex); + } + +} diff --git a/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java b/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java new file mode 100644 index 0000000000..7d1f90c030 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.interfaze; + +public class Interfaze { + +} diff --git a/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java b/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java new file mode 100644 index 0000000000..b5eed64afc --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java @@ -0,0 +1,7 @@ +package com.coderising.jvm.interfaze; + +public class InvalidInterfaceException extends Exception{ + public InvalidInterfaceException(String message){ + super(message); + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java index f312b513ac..b34c2c6736 100755 --- a/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,7 @@ package com.coderising.jvm.loader; +import com.coderising.jvm.util.Util; + public class ByteCodeIterator { byte[] source = null; @@ -50,7 +52,26 @@ public String getNextNHexString(int n){ return sb.toString(); } - + + public String peekNextNHex(int n){ + String val = getNextNHexString(n); + backOffNBytes(n); + return val; + } + + public void backOffNBytes(int n){ + if(n < currentPos){ + currentPos -=n; + } + else{ + System.err.println("Don't have enough bytes."); + } + } + + public int getNextNBytesInteger(int n){ + byte[] barray = getNextNBytes(n); + return Util.byteToInt(barray); + } public static void printByteInNumber(byte b){ diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java index 7c5809efec..c168129abc 100755 --- a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java @@ -1,7 +1,11 @@ package com.coderising.jvm.loader; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import com.coderising.jvm.attr.InvalidAttributeInfoException; import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; @@ -16,6 +20,11 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.interfaze.Interfaze; +import com.coderising.jvm.interfaze.InvalidInterfaceException; +import com.coderising.jvm.method.InvalidMethodInfoException; +import com.coderising.jvm.method.Method; public class ClassFileParser { ClassFile clz = null; @@ -24,29 +33,89 @@ public ClassFile parse(byte[] codes) { ByteCodeIterator iter = new ByteCodeIterator(codes); String magicHex = iter.getNextNHexString(4); System.out.println("Magic Number: "+magicHex); - - String minorHex = iter.getNextHexString() + iter.getNextHexString(); - int minorVersionInt = Integer.parseInt(minorHex, 16); - String majorHex = iter.getNextHexString() + iter.getNextHexString(); - int majorVersionInt = Integer.parseInt(majorHex, 16); - clz.setMajorVersion(majorVersionInt);clz.setMinorVersion(minorVersionInt); - System.out.println("Major version: " + majorVersionInt + " minor version: " + minorVersionInt); - clz.setConstPool(parseConstantPool(iter)); - fillClassInfo(clz, clz.getConstantPool()); + try{ + String minorHex = iter.getNextHexString() + iter.getNextHexString(); + int minorVersionInt = Integer.parseInt(minorHex, 16); + String majorHex = iter.getNextHexString() + iter.getNextHexString(); + int majorVersionInt = Integer.parseInt(majorHex, 16); + clz.setMajorVersion(majorVersionInt);clz.setMinorVersion(minorVersionInt); + System.out.println("Major version: " + majorVersionInt + " minor version: " + minorVersionInt); + clz.setConstPool(parseConstantPool(iter)); + fillClassInfo(clz, clz.getConstantPool()); + System.out.println(iter.peekNextNHex(8)); + parseAccessFlag(iter); + parseClassInfex(iter);parseClassInfex(iter); + parseInterface(iter); + parseFields(iter); + parseMethods(iter); + } + catch(Exception e){ + e.printStackTrace(); + } return clz; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + ConstantPool cp = clz.getConstantPool(); + int visitFlagIndex = iter.getNextNBytesInteger(2); + System.out.println("visit flag index: " + visitFlagIndex + " variable value: " + cp.getUTF8String(visitFlagIndex)); return null; } private ClassIndex parseClassInfex(ByteCodeIterator iter) { - + int classInfIndex = iter.getNextNBytesInteger(2); + System.out.println("class info: " + classInfIndex); return null; } + private List parseInterface(ByteCodeIterator iter) throws InvalidInterfaceException{ + int interfaceCount = iter.getNextNBytesInteger(2); + if(interfaceCount>0){ + throw new InvalidInterfaceException("Unimplemented interface parser: " + interfaceCount); + } + return null; + } + + private void parseFields(ByteCodeIterator iter){ + int fieldsCount = iter.getNextNBytesInteger(2); + System.out.println("Fields count: " + fieldsCount); + List fields = new LinkedList<>(); + for(int i = 0; i methods = new ArrayList<>(); + for(int i = 0; i fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } - } diff --git a/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java b/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java new file mode 100644 index 0000000000..a0e42c0f0e --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + + + + + +public class ClassFileloaderTest2 { + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + static String path1 = "/Users/erlisuo/Documents/workspace/codeRising2017working/1282579502/bin"; + static String path3 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static ClassFileLoader loader = null; + static { + loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + //clzFile.print(); + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + +} diff --git a/group17/1282579502/src/com/coding/basic/stack/expr/InfixExpr.java b/group17/1282579502/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..2d70a2ec02 --- /dev/null +++ b/group17/1282579502/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,184 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +import javafx.util.converter.NumberStringConverter; + +public class InfixExpr { + String expr = null; + Map priorityMap = null; + List exprTokens = null; + public InfixExpr(String expr) { + priorityMap = new HashMap(); + init(); + this.expr = expr; + exprTokens = parse(); + } + + public void init(){ + priorityMap.put('+', 0); + priorityMap.put('-', 0); + priorityMap.put('*', 1); + priorityMap.put('/', 1); + } + + public float evaluate() { + Stack operatorStack = new Stack<>(); + Stack operandStack = new Stack<>(); + + Float operandOne, operandTwo; + + int index = 0; + + while(index < exprTokens.size()){ + String cc = exprTokens.get(index); + try{ + if(isFloat(cc)){ + System.out.println("push operand: " + cc); + operandStack.push(Float.parseFloat(cc)); + System.out.println("peek: " + operandStack.peek()); + + } + else if(priorityMap.get(cc.charAt(0)) != null){ + char c = cc.charAt(0); + if(operatorStack.isEmpty()){ + System.out.println("push operator: " + cc); + operatorStack.push(c); + } + else{ + int preOperatorPriority = getPriority(operatorStack.peek()); + int curOperatorPriority = getPriority(c); + if(curOperatorPriority <= preOperatorPriority){ + //do precalculation first + operandTwo = operandStack.pop(); + operandOne = operandStack.pop(); + char operator = operatorStack.pop(); + float result = doCalculation(operandOne, operandTwo, operator); + + operandStack.push(result); + operatorStack.push(c); + } + else{ + System.out.println("push operator: " + cc); + operatorStack.push(c); + } + } + } + else{ + throw new Exception("Unsupported character: " + cc); + } + } + catch(Exception e){ + e.printStackTrace(); + } + index ++; + } + System.out.println("dumpping operator stack:"); + dumpStack(operatorStack); + System.out.println("dumpping operand stack:"); + dumpStack(operandStack); + try{ + while(!operatorStack.isEmpty()){ + operandTwo = operandStack.pop(); + operandOne = operandStack.pop(); + char operator = operatorStack.pop(); + float result = doCalculation(operandOne, operandTwo, operator); + + operandStack.push(result); + } + }catch(Exception e){ + e.printStackTrace(); + } + + if(operandStack.size() > 1){ + System.err.println("More than one result reminded in operands stack."); + } + return operandStack.pop(); + } + + private float doCalculation(float operandOne, float operandTwo, char operator) throws Exception{ + System.out.println("operand 1: " + operandOne + " operand 2: " + operandTwo + " operator: " + operator); + float result = 0f; + if(operator == '+'){ + result = operandOne + operandTwo; + } + else if(operator == '-'){ + result = operandOne - operandTwo; + } + else if(operator == '*'){ + result = operandOne * operandTwo; + } + else if(operator == '/'){ + result = operandOne / operandTwo; + } + else{ + throw new Exception("Unsupported operator"); + } + System.out.println("result: " + result); + return result; + } + + private int getPriority(Character c){ + return priorityMap.get(c); + } + + private boolean isFloat(String v){ + try{ + Float.parseFloat(v); + return true; + } + catch(Exception e){ + return false; + } + } + + private List parse(){ + List vals = new ArrayList<>(); + int p1 = 0; + int p2 = 1; + while(p2 Date: Sun, 16 Apr 2017 15:51:04 +0800 Subject: [PATCH 153/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A,=20=E5=B1=9E=E6=80=A7=E6=96=B9=E6=B3=95=20init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/jvm/attr/AttributeInfo.java | 19 +++++ .../com/coding2017/jvm/attr/CodeAttr.java | 52 +++++++++++++ .../coding2017/jvm/attr/LineNumberTable.java | 46 +++++++++++ .../jvm/attr/LocalVariableItem.java | 49 ++++++++++++ .../jvm/attr/LocalVariableTable.java | 25 ++++++ .../coding2017/jvm/attr/StackMapTable.java | 29 +++++++ .../com/coding2017/jvm/bean/EmployeeV1.java | 1 + .../com/coding2017/jvm/clz/ClassFile.java | 36 +++++++++ .../java/com/coding2017/jvm/field/Field.java | 32 ++++++++ .../jvm/loader/ByteCodeIterator.java | 8 ++ .../jvm/loader/ClassFileParser.java | 10 +++ .../com/coding2017/jvm/method/Method.java | 48 ++++++++++++ .../jvm/loader/ClassFileLoaderTest.java | 76 +++++++++++++++++++ 13 files changed, 431 insertions(+) create mode 100644 group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/AttributeInfo.java create mode 100644 group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java create mode 100644 group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java create mode 100644 group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableItem.java create mode 100644 group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java create mode 100644 group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java create mode 100644 group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java create mode 100644 group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/AttributeInfo.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..2ec4931cac --- /dev/null +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coding2017.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + +} diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..a0a52ca70c --- /dev/null +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java @@ -0,0 +1,52 @@ +package com.coding2017.jvm.attr; + +import com.coding2017.jvm.clz.ClassFile; +import com.coding2017.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + // private ByteCodeCommand[] cmds ; + // public ByteCodeCommand[] getCmds() { + // return cmds; + // } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, + String code /* ByteCodeCommand[] cmds */) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + // this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + return null; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + +} diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..9449eafc1f --- /dev/null +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java @@ -0,0 +1,46 @@ +package com.coding2017.jvm.attr; + +import com.coding2017.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + + return null; + } + +} diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableItem.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..4ad18b0fd7 --- /dev/null +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableItem.java @@ -0,0 +1,49 @@ +package com.coding2017.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..41dfb68e87 --- /dev/null +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java @@ -0,0 +1,25 @@ +package com.coding2017.jvm.attr; + +import com.coding2017.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter) { + + return null; + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + +} diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..a9fab7c2e8 --- /dev/null +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java @@ -0,0 +1,29 @@ +package com.coding2017.jvm.attr; + +import com.coding2017.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo { + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter) { + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index, len); + + // 后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/bean/EmployeeV1.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/bean/EmployeeV1.java index 4fdddbb2eb..487793f448 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/bean/EmployeeV1.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/bean/EmployeeV1.java @@ -3,6 +3,7 @@ public class EmployeeV1 { private String name; + private int age; public EmployeeV1(String name, int age) { diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/clz/ClassFile.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/clz/ClassFile.java index 19c738f8d4..6d12e65d5b 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/clz/ClassFile.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/clz/ClassFile.java @@ -2,6 +2,11 @@ import com.coding2017.jvm.constant.ClassInfo; import com.coding2017.jvm.constant.ConstantPool; +import com.coding2017.jvm.field.Field; +import com.coding2017.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; public class ClassFile { @@ -12,6 +17,9 @@ public class ClassFile { private ClassIndex clzIndex; private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + public ClassIndex getClzIndex() { return clzIndex; } @@ -53,6 +61,34 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } + public void setClzIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } + + public ConstantPool getPool() { + return pool; + } + + public void setPool(ConstantPool pool) { + this.pool = pool; + } + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + + public List getMethods() { + return methods; + } + + public void setMethods(List methods) { + this.methods = methods; + } + public void print() { if (this.accessFlag.isPublicClass()) { diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java new file mode 100644 index 0000000000..3439d9c8bf --- /dev/null +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java @@ -0,0 +1,32 @@ +package com.coding2017.jvm.field; + + +import com.coding2017.jvm.constant.ConstantPool; +import com.coding2017.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + return null; + } + +} diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ByteCodeIterator.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ByteCodeIterator.java index 566b251c32..3a3af964c5 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ByteCodeIterator.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ByteCodeIterator.java @@ -35,4 +35,12 @@ public byte[] nextByteN(int n) { } return bytes; } + + public int nextU4ToInt() { + return ByteUtil.bytesToInt(nextByteN(4)); + } + + public String nextUxToHexString(int len) { + return ByteUtil.byteToHexString(nextByteN(len)); + } } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java index ff21b4fa0c..b684d1774d 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java @@ -30,6 +30,8 @@ public ClassFile parse(byte[] codes) { // this class and super class classFile.setClassIndex(parseClassInfex(iterator)); + parseInterfaces(iterator); + return classFile; } @@ -96,4 +98,12 @@ private ConstantInfo parseConstantInfo(ConstantPool constantPool, ByteCodeIterat } } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java new file mode 100644 index 0000000000..9969d5dcf0 --- /dev/null +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java @@ -0,0 +1,48 @@ +package com.coding2017.jvm.method; + +import com.coding2017.jvm.attr.CodeAttr; +import com.coding2017.jvm.clz.ClassFile; +import com.coding2017.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + return null; + + } +} diff --git a/group01/280646174/jvm/src/test/java/com/coding2017/jvm/loader/ClassFileLoaderTest.java b/group01/280646174/jvm/src/test/java/com/coding2017/jvm/loader/ClassFileLoaderTest.java index c25f6f2c0f..d9dd2a22ff 100644 --- a/group01/280646174/jvm/src/test/java/com/coding2017/jvm/loader/ClassFileLoaderTest.java +++ b/group01/280646174/jvm/src/test/java/com/coding2017/jvm/loader/ClassFileLoaderTest.java @@ -3,11 +3,15 @@ import com.coding2017.jvm.clz.ClassFile; import com.coding2017.jvm.clz.ClassIndex; import com.coding2017.jvm.constant.*; +import com.coding2017.jvm.field.Field; +import com.coding2017.jvm.method.Method; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.List; + import static org.junit.Assert.*; /** @@ -186,4 +190,76 @@ public void testClassIndex(){ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + } \ No newline at end of file From 1a985bf1e3f570fd2bd4b6abbd81c510575519b5 Mon Sep 17 00:00:00 2001 From: kai Date: Sun, 16 Apr 2017 16:00:54 +0800 Subject: [PATCH 154/552] =?UTF-8?q?=E7=AC=AC=E5=85=AD=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/attr/AttributeInfo.java | 19 +++ .../com/coderising/jvm/attr/CodeAttr.java | 121 ++++++++++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 69 ++++++++++ .../jvm/attr/LocalVariableItem.java | 39 ++++++ .../jvm/attr/LocalVariableTable.java | 58 +++++++++ .../coderising/jvm/attr/StackMapTable.java | 30 +++++ .../com/coderising/jvm/clz/ClassFile.java | 23 +++- .../com/coderising/jvm/field/Field.java | 49 +++++++ .../jvm/loader/ByteCodeIterator.java | 12 ++ .../jvm/loader/ClassFileLoader.java | 18 +-- .../jvm/loader/ClassFileParser.java | 76 +++++++++-- .../com/coderising/jvm/method/Method.java | 90 +++++++++++++ .../jvm/test/ClassFileloaderTest.java | 79 ++++++++++++ .../src/com/coding/basic/array/ArrayList.java | 2 +- .../coding/basic/stack/expr/InfixExpr.java | 98 ++++++++++++++ .../basic/stack/expr/InfixExprTest.java | 48 +++++++ 16 files changed, 805 insertions(+), 26 deletions(-) create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/field/Field.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/method/Method.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expr/InfixExprTest.java diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..f9292d0dcb --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,121 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); + + int exceptionTableLen = iter.nextU2ToInt(); + //TODO 处理exception + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + int subAttrCount = iter.nextU2ToInt(); + + for(int x=1; x<=subAttrCount; x++){ + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } + else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } + else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } + else{ + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + /*for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..88f677b2c8 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,58 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/attr/StackMapTable.java b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassFile.java b/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassFile.java index 650ca8375d..eb17998c52 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassFile.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/clz/ClassFile.java @@ -1,17 +1,23 @@ package com.coderising.jvm.clz; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFile { private int minorVersion; private int majorVersion; + private ConstantPool pool; private AccessFlag accessFlag; private ClassIndex clzIndex; - private ConstantPool pool; - + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -48,7 +54,18 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } public void print(){ diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/field/Field.java b/group06/1378560653/mini-jvm/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..645016368e --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/field/Field.java @@ -0,0 +1,49 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + + String name = pool.getUTF8String(nameIndex); + String desc = pool.getUTF8String(descriptorIndex); + + return name +":"+ desc; + } + + + public static Field parse(ClassFile clzFile,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attributeCount = iter.nextU2ToInt(); + + Field f = new Field(accessFlag, nameIndex, descIndex, clzFile.getConstantPool()); + + if(attributeCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java index 9293f1706e..23860c17e8 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java @@ -37,4 +37,16 @@ public byte[] getBytes(int length) { return data; } + public String nextUxToHexString(int len) { + byte[] temp = new byte[len]; + for(int i = 0; i < len; i++){ + temp[i] = codes[pos++]; + } + return Util.byteToHexString(temp).toLowerCase(); + } + + public void back(int i) { + pos -= i; + + } } diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java index 12e7096bc5..91b1068989 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java @@ -15,7 +15,12 @@ public class ClassFileLoader { - + /* + * 1.加载文件路径 + * 2.加载.class文件 + * 3.将.class文件转换为字节数组 + * 4.解析.class字节数组 + */ private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { @@ -33,8 +38,6 @@ public byte[] readBinaryCode(String className) { return null; - - } private byte[] loadClassFile(String clzFileName) { @@ -97,13 +100,10 @@ private byte[] loadClassFile_V1(String clzFileName) { try { File f = new File(clzFileName); - - + bis = new BufferedInputStream(new FileInputStream(f)); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; int length = -1; @@ -130,8 +130,4 @@ private byte[] loadClassFile_V1(String clzFileName) { return null; } - - - - } \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java index 5c13f9972f..ebce02bc4b 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java @@ -13,6 +13,8 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; import com.sun.xml.internal.bind.v2.runtime.Name; public class ClassFileParser { @@ -46,21 +48,59 @@ public ClassFile parse(byte[] codes) { ClassIndex clzIndex = parseClassIndex(iter); clzFile.setClassIndex(clzIndex); + //6.Interface + parseInterfaces(iter); + + //7.Filed + parseFileds(clzFile, iter); + + //8.Method + parseMethods(clzFile, iter); + return clzFile; } - - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); - return flag; + + /* + * --------------------------------------------------------------------------- + * 4.Interface + * 5.Field + * 6.Method + */ + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + System.out.println("interfaceCount:" + interfaceCount); + + //TODO:EmployeeV1.java没有实现接口,只读出其接口个数:0;若实现interface,则解析 } - - private ClassIndex parseClassIndex(ByteCodeIterator iter) { - ClassIndex clzIndex = new ClassIndex(); - clzIndex.setThisClassIndex(iter.nextU2ToInt()); - clzIndex.setSuperClassIndex(iter.nextU2ToInt()); - return clzIndex; - + + private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { + int fieldCount = iter.nextU2ToInt(); + System.out.println("fieldCount:" + fieldCount); + + for(int i = 1; i <= fieldCount; i++){ + Field field = Field.parse(clzFile, iter); + clzFile.addField(field); + } + } + + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + int methodCount = iter.nextU2ToInt(); + System.out.println("methodCount:" + methodCount); + + for(int i = 1; i <= methodCount; i++){ + Method method = Method.parse(clzFile, iter); + clzFile.addMethod(method); + } + + } + + /* + * --------------------------------------------------------------------------- + * 1.ConstantPool + * 2.AccessFlag + * 3.ClassIndex + */ private ConstantPool parseConstantPool(ByteCodeIterator iter) { @@ -139,6 +179,20 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } return pool; } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + return flag; + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + ClassIndex clzIndex = new ClassIndex(); + clzIndex.setThisClassIndex(iter.nextU2ToInt()); + clzIndex.setSuperClassIndex(iter.nextU2ToInt()); + return clzIndex; + } + + } diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/method/Method.java b/group06/1378560653/mini-jvm/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..f08312b396 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/method/Method.java @@ -0,0 +1,90 @@ +package com.coderising.jvm.method; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = pool.getUTF8String(nameIndex); + + String desc = pool.getUTF8String(descriptorIndex); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + for( int j=1; j<= attribCount; j++){ + + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else{ + throw new RuntimeException("only CODE attribute is implemented , please implement the "+ attrName); + } + + } + + return m ; + + } +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java b/group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java index 61f592aaa4..a43d684af8 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,5 +1,7 @@ package com.coderising.jvm.test; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -13,6 +15,8 @@ import com.coderising.jvm.constant.NameAndTypeInfo; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFileloaderTest { @@ -195,4 +199,79 @@ public void testClassIndex(){ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + } + diff --git a/group06/1378560653/src/com/coding/basic/array/ArrayList.java b/group06/1378560653/src/com/coding/basic/array/ArrayList.java index 9fd1e776cc..ab2c9d3f21 100644 --- a/group06/1378560653/src/com/coding/basic/array/ArrayList.java +++ b/group06/1378560653/src/com/coding/basic/array/ArrayList.java @@ -76,7 +76,7 @@ private ArrayListIterator(ArrayList arraylist) { } @Override public boolean hasNext() { - pos ++; + pos++; if(pos >= size){ return false; }else{ diff --git a/group06/1378560653/src/com/coding/basic/stack/expr/InfixExpr.java b/group06/1378560653/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..b081b056a6 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,98 @@ +package com.coding.basic.stack.expr; + +import java.util.Stack; + +/* + * 中序表达式求值 + * 1.只支持加减乘除,不支持括号 + * 2.表达式中只支持int,结果可能是float + * 3.用2个栈实现:一个运算符栈,一个操作数栈 + */ + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + int i = 0; + while(i < expr.length()){ + char c = expr.charAt(i); + if(isOperator(c)){ + if(opStack.isEmpty()){ + opStack.push(c); + } else { + char preOperator = opStack.peek(); + if(ComparePriority(c,preOperator) > 0){ + opStack.push(c); + } else { + float num2 = numStack.pop(); + float num1 = numStack.pop(); + numStack.push(calculate(opStack.pop(),num1,num2)); + opStack.push(c); + } + } + i++; + } + if(isNumber(c)){ + String str = String.valueOf(c); + i++; + while(i < expr.length() && isNumber(expr.charAt(i))){ + str += expr.charAt(i); + i++; + } + numStack.push(Float.parseFloat(str)); + } + } + + while(!opStack.isEmpty()){ + float num2 = numStack.pop(); + float num1 = numStack.pop(); + numStack.push(calculate(opStack.pop(),num1,num2)); + } + float result = numStack.pop(); + return result; + } + + private Float calculate(char c, float num1, float num2) { + if(c == '+'){ + return num1+num2; + } + if(c == '-'){ + return num1-num2; + } + if(c == '*'){ + return num1*num2; + } + if(c == '/'){ + return num1/num2; + } + return null; + } + + private int ComparePriority(char c, char preOperator) { + if((c == '/' || c == '*')&&(preOperator == '+' || preOperator == '-')){ + return 1; + } + return -1; + } + + private boolean isNumber(char c) { + if(c >= '0' && c <= '9'){ + return true; + } + return false; + } + + private boolean isOperator(char c) { + if(c == '+' || c == '-' || c == '*' ||c == '/'){ + return true; + } + return false; + } +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expr/InfixExprTest.java b/group06/1378560653/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..20f52b4c63 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} From e4681dd40c36a140d4b7799891353e5edb0dd2e2 Mon Sep 17 00:00:00 2001 From: kai Date: Sun, 16 Apr 2017 16:05:41 +0800 Subject: [PATCH 155/552] =?UTF-8?q?=E7=AC=AC=E5=85=AD=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group06/1378560653/article.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/group06/1378560653/article.txt b/group06/1378560653/article.txt index 5d908b43c6..2957d8601c 100644 --- a/group06/1378560653/article.txt +++ b/group06/1378560653/article.txt @@ -1,3 +1,5 @@ +ÿ +-------------------------------------------------------------------- һƪ£http://blog.csdn.net/raymond120/article/details/57415472 ڶƪ£http://blog.csdn.net/raymond120/article/details/58043040 ƪ£http://blog.csdn.net/raymond120/article/details/60759278 From a1d23c39a6a024facea3f652b40cef52e7021513 Mon Sep 17 00:00:00 2001 From: sheng <1158154002@qq.com> Date: Sun, 16 Apr 2017 18:42:06 +0800 Subject: [PATCH 156/552] test06 --- .../1158154002/src/test05/stack/Stack.java | 10 +- .../src/test05/stack/StackUtil.java | 104 ++++++++++++------ .../1158154002/src/test06/expr/InfixExpr.java | 92 ++++++++++++++++ .../src/test06/expr/InfixExprTest.java | 45 ++++++++ 4 files changed, 212 insertions(+), 39 deletions(-) create mode 100644 group17/1158154002/src/test06/expr/InfixExpr.java create mode 100644 group17/1158154002/src/test06/expr/InfixExprTest.java diff --git a/group17/1158154002/src/test05/stack/Stack.java b/group17/1158154002/src/test05/stack/Stack.java index 1ce32a40e5..177a330f7c 100644 --- a/group17/1158154002/src/test05/stack/Stack.java +++ b/group17/1158154002/src/test05/stack/Stack.java @@ -2,18 +2,18 @@ import java.util.ArrayList; -public class Stack { - private ArrayList elementData = new ArrayList(); +public class Stack { + private ArrayList elementData = new ArrayList(); - public void push(Object o){ + public void push(T o){ elementData.add(o); } - public Object pop(){ + public T pop(){ return elementData.remove(size()-1); } - public Object peek(){ + public T peek(){ if (size()>0) { return elementData.get(size()-1); } else { diff --git a/group17/1158154002/src/test05/stack/StackUtil.java b/group17/1158154002/src/test05/stack/StackUtil.java index b999c82706..ead00078b6 100644 --- a/group17/1158154002/src/test05/stack/StackUtil.java +++ b/group17/1158154002/src/test05/stack/StackUtil.java @@ -71,43 +71,79 @@ public static Object[] getTop(Stack s,int len) { * @param s * @return */ - public static boolean isValidPairs(String s) { - Stack s1 = new Stack(); - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { - s1.push(c); - } - } - - Stack s2 = new Stack(); - for (int i = s.length() - 1; i >= 0; i--) { +// public static boolean isValidPairs(String s) { +// Stack s1 = new Stack(); +// for (int i = 0; i < s.length(); i++) { +// char c = s.charAt(i); +// if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { +// s1.push(c); +// } +// } +// +// Stack s2 = new Stack(); +// for (int i = s.length() - 1; i >= 0; i--) { +// char c = s.charAt(i); +// if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { +// s2.push(c); +// } +// } +// +// for (int i = 0; i < s1.size() / 2; i++) { +// char a = (char) s1.pop(); +// char b = (char) s2.pop(); +// if (a == '(' && b != ')') { +// return false; +// } else if (a == ')' && b != '(') { +// return false; +// } else if (a == '[' && b != ']') { +// return false; +// } else if (a == ']' && b != '[') { +// return false; +// } else if (a == '{' && b != '}') { +// return false; +// } else if (a == '}' && b != '{') { +// return false; +// } +// } +// +// return true; +// } + +public static boolean isValidPairs(String s){ + + Stack stack = new Stack(); + for(int i=0;i symbol = new Stack<>(); + Stack num = new Stack<>(); + + for (int i = 0; i < str.length; i++) { + num.push(Float.valueOf(str[i])); + } + + for (int i = 0; i < expr.length(); i++) { + char c = expr.charAt(i); + if (c == '+' || c == '-' || c == '*' || c == '/') { + symbol.push(c); + } + } + // 逆置 + StackUtil.reverse(symbol); + StackUtil.reverse(num); + + // 取数,符号计算 + float result = 0; + while (num.size() > 1) { + float a = num.pop(); + float b = num.pop(); + + char s1 = symbol.pop(); + char s2 = ' '; + if (symbol.size() > 0) { + s2 = symbol.pop(); + if (s1 == '*') { + result = a * b; + symbol.push(s2); + } else if (s1 == '/') { + result = a / b; + symbol.push(s2); + } else if (s2 != ' ') { + if (s2 == '*' || s2 == '/') { + if (s2 == '*') { + result = b * num.pop(); + } else if (s2 == '/') { + result = b / num.pop(); + } + if (s1 == '+') { + result = a + result; + } else if (s1 == '-') { + result = a - result; + } + } else { + if (s1 == '+') { + result = a + b; + symbol.push(s2); + } else if (s1 == '-') { + result = a - b; + symbol.push(s2); + } + } + } + num.push(result); + System.out.println(result); + } else { + if (s1 == '+') { + result = a + b; + } else if (s1 == '-') { + result = a - b; + } else if (s1 == '*') { + result = a * b; + } else if (s1 == '/') { + result = a / b; + } + System.out.println(result); + } + } + + return result; + } +} diff --git a/group17/1158154002/src/test06/expr/InfixExprTest.java b/group17/1158154002/src/test06/expr/InfixExprTest.java new file mode 100644 index 0000000000..5c03c1a06d --- /dev/null +++ b/group17/1158154002/src/test06/expr/InfixExprTest.java @@ -0,0 +1,45 @@ +package test06.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } +// + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } +} From b86ed4bd02d6f14d784d1e6988d56a3a99c5c891 Mon Sep 17 00:00:00 2001 From: mengxz <82427129@qq.com> Date: Sun, 16 Apr 2017 19:29:39 +0800 Subject: [PATCH 157/552] homework ,diliverd at 17/4/9.complited --- .../coderising/jvm/attr/AttributeInfo.java | 3 +- .../com/coderising/jvm/attr/CodeAttr.java | 8 ++ .../coderising/jvm/attr/LineNumberTable.java | 10 ++ .../jvm/attr/LocalVariableItem.java | 10 -- .../jvm/attr/LocalVariableTable.java | 82 ++++++++++- .../coderising/jvm/attr/StackMapTable.java | 7 +- .../com/coderising/jvm/method/Method.java | 7 +- .../java/com/coding/basic/stack/Stack.java | 12 ++ .../com/coding/basic/stack/StackUtil.java | 130 ++++++++++++++++-- .../coding/basic/stack/expr/InfixExpr.java | 38 +++++ .../jvm/loader/ClassFileLoaderTest.java | 5 +- 11 files changed, 278 insertions(+), 34 deletions(-) delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java index f39a23dcf3..8fb9e91d57 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java @@ -14,6 +14,7 @@ public abstract class AttributeInfo { int attrNameIndex;// u2 attribute_name_index int attrLen;// u4 attribute_length + public abstract String getType(); public AttributeInfo(int attrNameIndex, int attrLen) { this.attrNameIndex = attrNameIndex; this.attrLen = attrLen; @@ -30,7 +31,7 @@ public static AttributeInfo parse(ConstantPool pool, ByteCodeIterator itr) { case LINE_NUM_TABLE: return LineNumberTable.parse(pool, itr); case LOCAL_VAR_TABLE: - + return LocalVariableTable.parse(pool, itr); default: throw new RuntimeException( "attributeInfo exclude CodeAttr hasn't implemented"); diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java index 3011511ae4..1f9cfdc169 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java @@ -8,6 +8,7 @@ public class CodeAttr extends AttributeInfo { + private static String TYPE = CODE; private int maxStack;//u2 max_stack private int maxLocals;//u2 max_locals private int codeLenth;//u4 code_length @@ -43,6 +44,11 @@ public void addAttr(AttributeInfo a){ this.AttrList.add(a); } + @Override + public String getType() { + return TYPE; + } + public static CodeAttr parse(ConstantPool pool, ByteCodeIterator itr) { int attrNameIndex = itr.nextU2toInt(); int attrLen = itr.nextU4toInt(); @@ -118,4 +124,6 @@ public void setExceptionTableLength(int exceptionTableLength) { this.exceptionTableLength = exceptionTableLength; } + + } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java index 30b39988f0..4cce2e0368 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java @@ -8,6 +8,7 @@ public class LineNumberTable extends AttributeInfo { + private static String TYPE = LINE_NUM_TABLE; private int lineNumberTableLength; private List lineNumberTable = new ArrayList(); @@ -21,6 +22,10 @@ public void addLineNumberItem(LineNumberItem e) { this.lineNumberTable.add(e); } + @Override + public String getType() { + return TYPE; + } public static LineNumberTable parse(ConstantPool pool, ByteCodeIterator itr) { int attrNameIndex = itr.nextU2toInt(); int attrLen = itr.nextU4toInt(); @@ -33,6 +38,11 @@ public static LineNumberTable parse(ConstantPool pool, ByteCodeIterator itr) { return lineNumberTable; } + /** + * + * @author Meng + * + */ private static class LineNumberItem { @SuppressWarnings("unused") private int startPc; diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 74ca8df92e..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem extends AttributeInfo { - - public LocalVariableItem(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - // TODO Auto-generated constructor stub - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java index 2704149043..b5d5147a3f 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java @@ -1,17 +1,91 @@ package com.coderising.jvm.attr; +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + public class LocalVariableTable extends AttributeInfo { - private int localVarTableLength ;//u2 local_variable_table_length - - - private static class + private static String TYPE = LOCAL_VAR_TABLE; + private int localVarTableLength;// u2 local_variable_table_length + private List itemList = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen, + int localVarTableLength) { + super(attrNameIndex, attrLen); + this.localVarTableLength = localVarTableLength; + } + + public void addItemList(LocalVariableItem item) { + this.itemList.add(item); + } + + @Override + public String getType() { + return TYPE; + } + public static LocalVariableTable parse(ConstantPool pool, + ByteCodeIterator itr) { + int attrNameIndex = itr.nextU2toInt(); + int attrLen = itr.nextU4toInt(); + int localVarTableLength = itr.nextU2toInt(); + LocalVariableTable table = new LocalVariableTable(attrNameIndex, + attrLen, localVarTableLength); + for (int i = 0; i < localVarTableLength; i++) { + table.addItemList(LocalVariableItem.parse(pool, itr)); + } + return table; + } + + /** + * inner class + * + * @author Meng + * + */ + public static class LocalVariableItem { + @SuppressWarnings("unused") + private int startPc; + @SuppressWarnings("unused") + private int length; + @SuppressWarnings("unused") + private int nameIndex; + @SuppressWarnings("unused") + private int descriptorIndex; + @SuppressWarnings("unused") + private int index; + + public LocalVariableItem(int startPc, int length, int nameIndex, + int descriptorIndex, int index) { + super(); + this.startPc = startPc; + this.length = length; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.index = index; + } + + public static LocalVariableItem parse(ConstantPool pool, + ByteCodeIterator itr) { + int startPc = itr.nextU2toInt(); + int length = itr.nextU2toInt(); + int nameIndex = itr.nextU2toInt(); + int descriptorIndex = itr.nextU2toInt(); + int index = itr.nextU2toInt(); + LocalVariableItem item = new LocalVariableItem(startPc, length, nameIndex, descriptorIndex, index); + return item; + } + } + /* * getter setter */ public int getLocalVarTableLength() { return localVarTableLength; } + public void setLocalVarTableLength(int localVarTableLength) { this.localVarTableLength = localVarTableLength; } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java index 525d6a9071..01b80b0471 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java @@ -2,9 +2,12 @@ public class StackMapTable extends AttributeInfo{ + private static String TYPE = STACK_MAP_TABLE; + @Override + public String getType() { + return TYPE; + } public StackMapTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); - // TODO Auto-generated constructor stub } - } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java index d29f77fb25..867e6eed5e 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java @@ -63,7 +63,12 @@ public static Method parse(ConstantPool cp, ByteCodeIterator itr) { * @return */ public CodeAttr getCodeAttr() { - + for (int i = 0; i < attributeInfos.size(); i++) { + AttributeInfo attributeInfo = attributeInfos.get(i); + if(AttributeInfo.CODE.equals(attributeInfo.getType())){ + return (CodeAttr)attributeInfo; + } + } return null; } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java index 007362e95a..5cde9073f3 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java @@ -31,4 +31,16 @@ public boolean isEmpty(){ public int size(){ return elementData.size(); } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < size(); i++) { + sb.append(elementData.get(i)).append(", "); + } + sb.deleteCharAt(sb.length()-1); + sb.deleteCharAt(sb.length()-1); + sb.append("]"); + return sb.toString(); + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java index e1bc00858f..1a29d59e48 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java @@ -5,43 +5,143 @@ public class StackUtil { * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 */ + public static void reverse_useTwoStack(Stack s) { + if (s.size() < 2) { + return; + } + Stack stack1 = new Stack<>(); + Stack stack2 = new Stack<>(); + int length = s.size(); + for (int i = 0; i < length; i++) { + stack1.push(s.pop()); + } + for (int i = 0; i < length; i++) { + stack2.push(stack1.pop()); + } + for (int i = 0; i < length; i++) { + s.push(stack2.pop()); + } + } + public static void reverse(Stack s) { - + if (s.size() < 2) { + return; + } + Stack tmp = new Stack<>(); + int length = s.size(); + for (int i = 0; i < length; i++) { + tmp.push(s.pop()); + } + for (int i = 0; i < length; i++) { + addToBottom(s, tmp.pop()); + } } + /** * 添加元素到栈底部 + * * @param s * @param value */ - public static void addToBottom(Stack s, Integer value){ - + public static void addToBottom(Stack s, Integer value) { + /* + * Stack stack = new Stack<>(); for (int i = 0; i < s.size(); + * i++) { stack.push(s.pop()); } s.push(value); for (int i = 0; i < + * s.size(); i++) { s.push(stack.pop()); } + */ + if (s.isEmpty()) { + s.push(value); + } else { + Integer top = s.pop(); + addToBottom(s, value); + s.push(top); + } } + /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 * * @param o */ - public static void remove(Stack s,Object o) { - + public static boolean remove(Stack s, Object o) { + if (s.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + boolean flag = false; + Stack tmp = new Stack<>(); + while (!s.isEmpty()) { + tmp.push(s.pop()); + if (tmp.peek().equals(o)) { + flag = true; + + tmp.pop(); + for (int i = 0; i < tmp.size(); i++) { + s.push(tmp.pop()); + } + break; + } + } + return flag; } + /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, + * 可以使用另外一个栈来辅助 + * * @param len * @return */ - public static Object[] getTop(Stack s,int len) { - return null; + public static Object[] getTop(Stack s, int len) { + Object[] result = new Object[len]; + Stack tmp = new Stack<>(); + for (int i = 0; i < len; i++) { + result[i] = s.peek(); + tmp.push(s.pop()); + } + for (int i = 0; i < len; i++) { + s.push(tmp.pop()); + } + return result; } + /** - * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz - * 使用堆栈检查字符串s中的括号是不是成对出现的。 - * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true - * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; + * 字符串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; + public static boolean isValidPairs(String s) { + Stack stack = new Stack<>(); + char[] strCharArr = s.toCharArray(); + for (int i = 0; i < strCharArr.length; i++) { + char cc = strCharArr[i]; + int c = cc&0xffff; + if (isBracket(c)) { + if (c == 40 || c == 91 || c == 123) { + stack.push(c); + }else{ + int left = stack.pop(); + if(left+1!=c&&left+2!=c){ + return false; + } + } + } + } + return true; + } + + /** + * judge is Bracket or not + * @param c + * @return + */ + private static boolean isBracket(int c) { + if (c == 40 || c == 41 || c == 91 || c == 93 || c == 123 || c == 125) { + return true; + } else { + return false; + } } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java index cd086dfe79..9f166de8d0 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java @@ -1,14 +1,52 @@ package com.coding.basic.stack.expr; +import java.util.Stack; + public class InfixExpr { String expr = null; + private Stack stack = new Stack<>(); public InfixExpr(String expr) { this.expr = expr; + init(); + } + public void init(){ + splitOpraAndNum(); + } + private void splitOpraAndNum() { + char[] array = expr.toCharArray(); + int mark = 0; + for (int i = 0; i < array.length; i++) { + char c = array[i]; + int cc = c&0xffff; + if(cc<48||cc>57){ + if((i-mark)>0){ + String num = expr.substring(mark, i); + stack.push(Integer.parseInt(num)); + } + }else{ + mark = i; + } + } + } + /** + * 转换成前序表达式进行计算 + * @return + */ + public float evaluatePre(){ + + return 0.0f; } + /** + * 循环扫描,每次找到最高优先级的操作符,如果是*或者/那么计算这个操作符两边的数字, + * 然后利用返回值改变以前的表达式,再次循环 + * 直到表达式变成只有一个数字的时候停止 + * @return + */ public float evaluate() { return 0.0f; } + } diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java index da5ab5f0a7..bcc79dc6d8 100644 --- a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java +++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java @@ -19,11 +19,12 @@ public class ClassFileLoaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "C:\\workPrograms\\GitRepo\\coding2017\\group17\\82427129\\JavaUtil\\target\\classes"; static String path2 = "D:\\workProgram\\GitRepo\\coding2017\\group17\\82427129\\JavaUtil\\target\\classes"; static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); loader.addClassPath(path2); String className = "com.coderising.jvm.test.EmployeeV1"; @@ -42,6 +43,7 @@ public void tearDown() throws Exception { public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); loader.addClassPath(path2); String className = "com.coderising.jvm.test.EmployeeV1"; @@ -67,6 +69,7 @@ public void testGetClassPath() { @Test public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); loader.addClassPath(path2); String className = "com.coderising.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); From 7a2befcbd4ba4fc93b58167da386fd50bbb09622 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sun, 16 Apr 2017 19:56:29 +0800 Subject: [PATCH 158/552] =?UTF-8?q?=E5=A2=9E=E5=8A=A0rxjava=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group02/812350401/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/group02/812350401/pom.xml b/group02/812350401/pom.xml index 6ad5aa08db..596d874817 100644 --- a/group02/812350401/pom.xml +++ b/group02/812350401/pom.xml @@ -50,6 +50,13 @@ commons-lang3 3.4 + + + io.reactivex.rxjava2 + rxjava + 2.0.8 + + From d30b770a3d24221b3c3e16d5c3878d522a82be82 Mon Sep 17 00:00:00 2001 From: xiaobo Date: Sun, 16 Apr 2017 21:36:40 +0800 Subject: [PATCH 159/552] refactor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构 --- .../src/com/coderising/jvm/Method/Method.java | 99 ++++++++++++++ .../coderising/jvm/attr/AttributeInfo.java | 23 ++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 124 ++++++++++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 71 ++++++++++ .../jvm/attr/LocalVariableItem.java | 42 ++++++ .../jvm/attr/LocalVariableTable.java | 60 +++++++++ .../coderising/jvm/attr/StackMapTable.java | 32 +++++ .../src/com/coderising/jvm/field/Field.java | 53 ++++++++ .../jvm/loader/ByteCodeIterator.java | 18 +++ .../jvm/test/ClassFileloaderTest.java | 2 +- .../{first => dataStructure}/ArrayList.java | 2 +- .../BinaryTreeNode.java | 2 +- .../{first => dataStructure}/Iterator.java | 2 +- .../LRU}/LRUPageFrame.java | 2 +- .../LRU}/LRUPageFrameTest.java | 2 +- .../LRU}/LinkedList.java | 6 +- .../{first => dataStructure}/LinkedList.java | 2 +- .../com/{first => dataStructure}/List.java | 2 +- .../com/{first => dataStructure}/Queue.java | 2 +- .../com/{first => dataStructure}/Stack.java | 2 +- .../{first => dataStructure}/StackUtil.java | 2 +- .../arrayList}/ArrayUtil.java | 2 +- .../arrayList}/ArrayUtilTest.java | 4 +- .../src/com/dataStructure/expr/ExprParse.java | 79 +++++++++++ .../src/com/dataStructure/expr/InfixExpr.java | 100 ++++++++++++++ .../com/dataStructure/expr/InfixExprTest.java | 51 +++++++ .../src/com/dataStructure/expr/Token.java | 25 ++++ .../linkedList}/Iterator.java | 2 +- .../linkedList}/LinkedList.java | 2 +- .../linkedList}/List.java | 2 +- .../test/StackUtilTest.java | 6 +- .../test/TestArrayList.java | 6 +- .../test/TestLinkedList.java | 6 +- .../DownloadThread.java | 6 +- .../FileDownloader.java | 13 +- .../FileDownloaderTest.java | 7 +- .../api/Connection.java | 2 +- .../api/ConnectionException.java | 2 +- .../api/ConnectionManager.java | 2 +- .../api/DownloadListener.java | 2 +- .../impl/ConnectionImpl.java | 9 +- .../impl/ConnectionManagerImpl.java | 10 +- .../{second => parseStruts}/LoginAction.java | 2 +- .../{second => parseStruts}/StringUtil.java | 2 +- .../com/{second => parseStruts}/Struts.java | 3 +- .../{second => parseStruts}/StrutsTest.java | 9 +- .../src/com/{second => parseStruts}/View.java | 3 +- .../349184132/Study/src/com/second/struts.xml | 11 -- 48 files changed, 838 insertions(+), 80 deletions(-) create mode 100644 group04/349184132/Study/src/com/coderising/jvm/Method/Method.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group04/349184132/Study/src/com/coderising/jvm/field/Field.java rename group04/349184132/Study/src/com/{first => dataStructure}/ArrayList.java (98%) rename group04/349184132/Study/src/com/{first => dataStructure}/BinaryTreeNode.java (98%) rename group04/349184132/Study/src/com/{first => dataStructure}/Iterator.java (75%) rename group04/349184132/Study/src/com/{coding/basic/linklist => dataStructure/LRU}/LRUPageFrame.java (98%) rename group04/349184132/Study/src/com/{coding/basic/linklist => dataStructure/LRU}/LRUPageFrameTest.java (95%) rename group04/349184132/Study/src/com/{coding/basic/linklist => dataStructure/LRU}/LinkedList.java (97%) rename group04/349184132/Study/src/com/{first => dataStructure}/LinkedList.java (99%) rename group04/349184132/Study/src/com/{first => dataStructure}/List.java (86%) rename group04/349184132/Study/src/com/{first => dataStructure}/Queue.java (94%) rename group04/349184132/Study/src/com/{first => dataStructure}/Stack.java (95%) rename group04/349184132/Study/src/com/{first => dataStructure}/StackUtil.java (99%) rename group04/349184132/Study/src/com/{second/Array => dataStructure/arrayList}/ArrayUtil.java (99%) rename group04/349184132/Study/src/com/{second/Array => dataStructure/arrayList}/ArrayUtilTest.java (96%) create mode 100644 group04/349184132/Study/src/com/dataStructure/expr/ExprParse.java create mode 100644 group04/349184132/Study/src/com/dataStructure/expr/InfixExpr.java create mode 100644 group04/349184132/Study/src/com/dataStructure/expr/InfixExprTest.java create mode 100644 group04/349184132/Study/src/com/dataStructure/expr/Token.java rename group04/349184132/Study/src/com/{linked => dataStructure/linkedList}/Iterator.java (69%) rename group04/349184132/Study/src/com/{linked => dataStructure/linkedList}/LinkedList.java (99%) rename group04/349184132/Study/src/com/{linked => dataStructure/linkedList}/List.java (91%) rename group04/349184132/Study/src/com/{first => dataStructure}/test/StackUtilTest.java (95%) rename group04/349184132/Study/src/com/{first => dataStructure}/test/TestArrayList.java (88%) rename group04/349184132/Study/src/com/{first => dataStructure}/test/TestLinkedList.java (92%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/DownloadThread.java (92%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/FileDownloader.java (92%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/FileDownloaderTest.java (83%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/api/Connection.java (92%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/api/ConnectionException.java (80%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/api/ConnectionManager.java (83%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/api/DownloadListener.java (65%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/impl/ConnectionImpl.java (85%) rename group04/349184132/Study/src/com/{coderising/download => multiThreadDownload}/impl/ConnectionManagerImpl.java (75%) rename group04/349184132/Study/src/com/{second => parseStruts}/LoginAction.java (97%) rename group04/349184132/Study/src/com/{second => parseStruts}/StringUtil.java (97%) rename group04/349184132/Study/src/com/{second => parseStruts}/Struts.java (98%) rename group04/349184132/Study/src/com/{second => parseStruts}/StrutsTest.java (96%) rename group04/349184132/Study/src/com/{second => parseStruts}/View.java (93%) delete mode 100644 group04/349184132/Study/src/com/second/struts.xml diff --git a/group04/349184132/Study/src/com/coderising/jvm/Method/Method.java b/group04/349184132/Study/src/com/coderising/jvm/Method/Method.java new file mode 100644 index 0000000000..488d66869c --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/Method/Method.java @@ -0,0 +1,99 @@ +package com.coderising.jvm.Method; + +/** + * Created by wang on 2017/4/16. + */ +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + + + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + for( int j=1; j<= attribCount; j++){ + + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else{ + throw new RuntimeException("only CODE attribute is implemented , please implement the "+ attrName); + } + + } + + return m ; + + } +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/coderising/jvm/attr/AttributeInfo.java b/group04/349184132/Study/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..6ea1bb367b --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.attr; + +/** + * Created by wang on 2017/4/16. + */ + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/coderising/jvm/attr/CodeAttr.java b/group04/349184132/Study/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..b6711ba618 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,124 @@ +package com.coderising.jvm.attr; + +/** + * Created by wang on 2017/4/16. + */ + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); + + int exceptionTableLen = iter.nextU2ToInt(); + //TODO 处理exception + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.nextU2ToInt(); + + for(int x=1; x<=subAttrCount; x++){ + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } + else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } + else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } + else{ + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + /*for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/coderising/jvm/attr/LocalVariableItem.java b/group04/349184132/Study/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..98ef0c3de8 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + +/** + * Created by wang on 2017/4/16. + */ +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/coderising/jvm/attr/LocalVariableTable.java b/group04/349184132/Study/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..ab6dcd04f2 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,60 @@ +package com.coderising.jvm.attr; + +/** + * Created by wang on 2017/4/16. + */ +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/coderising/jvm/attr/StackMapTable.java b/group04/349184132/Study/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..ec6a8b3475 --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,32 @@ +package com.coderising.jvm.attr; + +/** + * Created by wang on 2017/4/16. + */ +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/coderising/jvm/field/Field.java b/group04/349184132/Study/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..6d1e5dd02a --- /dev/null +++ b/group04/349184132/Study/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,53 @@ +package com.coderising.jvm.field; + +/** + * Created by wang on 2017/4/16. + */ +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java index a91c3f49b3..a5fc48cf2c 100644 --- a/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group04/349184132/Study/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -23,6 +23,24 @@ public int nextU1ToInt() { return Util.byteToInt(new byte[] { codes[pos++]}); } + + public int nextU4ToInt(){return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]});} + + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } + public byte[] getByte(int len) { if(len + pos >= codes.length){ throw new IndexOutOfBoundsException(); diff --git a/group04/349184132/Study/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group04/349184132/Study/src/com/coderising/jvm/test/ClassFileloaderTest.java index 26407abbef..d4557797e1 100644 --- a/group04/349184132/Study/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group04/349184132/Study/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -23,7 +23,7 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "E:\\2017code\\coding2017\\group04\\349184132\\Study\\out\\production\\Study1"; static String path2 = "C:\temp"; static ClassFile clzFile = null; diff --git a/group04/349184132/Study/src/com/first/ArrayList.java b/group04/349184132/Study/src/com/dataStructure/ArrayList.java similarity index 98% rename from group04/349184132/Study/src/com/first/ArrayList.java rename to group04/349184132/Study/src/com/dataStructure/ArrayList.java index a836d89a6b..ea775ba297 100644 --- a/group04/349184132/Study/src/com/first/ArrayList.java +++ b/group04/349184132/Study/src/com/dataStructure/ArrayList.java @@ -1,4 +1,4 @@ -package com.first; +package com.dataStructure; public class ArrayList implements List { diff --git a/group04/349184132/Study/src/com/first/BinaryTreeNode.java b/group04/349184132/Study/src/com/dataStructure/BinaryTreeNode.java similarity index 98% rename from group04/349184132/Study/src/com/first/BinaryTreeNode.java rename to group04/349184132/Study/src/com/dataStructure/BinaryTreeNode.java index 31647f36dd..2b069a80b3 100644 --- a/group04/349184132/Study/src/com/first/BinaryTreeNode.java +++ b/group04/349184132/Study/src/com/dataStructure/BinaryTreeNode.java @@ -1,4 +1,4 @@ -package com.first; +package com.dataStructure; public class BinaryTreeNode { diff --git a/group04/349184132/Study/src/com/first/Iterator.java b/group04/349184132/Study/src/com/dataStructure/Iterator.java similarity index 75% rename from group04/349184132/Study/src/com/first/Iterator.java rename to group04/349184132/Study/src/com/dataStructure/Iterator.java index ea250e3cf5..6ac68a250e 100644 --- a/group04/349184132/Study/src/com/first/Iterator.java +++ b/group04/349184132/Study/src/com/dataStructure/Iterator.java @@ -1,4 +1,4 @@ -package com.first; +package com.dataStructure; public interface Iterator { public boolean hasNext(); diff --git a/group04/349184132/Study/src/com/coding/basic/linklist/LRUPageFrame.java b/group04/349184132/Study/src/com/dataStructure/LRU/LRUPageFrame.java similarity index 98% rename from group04/349184132/Study/src/com/coding/basic/linklist/LRUPageFrame.java rename to group04/349184132/Study/src/com/dataStructure/LRU/LRUPageFrame.java index e70f4cfb79..af61d81560 100644 --- a/group04/349184132/Study/src/com/coding/basic/linklist/LRUPageFrame.java +++ b/group04/349184132/Study/src/com/dataStructure/LRU/LRUPageFrame.java @@ -1,4 +1,4 @@ -package src.com.coning.basic.linklist; +package com.dataStructure.LRU; /** * Created by wang on 2017/3/27. diff --git a/group04/349184132/Study/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group04/349184132/Study/src/com/dataStructure/LRU/LRUPageFrameTest.java similarity index 95% rename from group04/349184132/Study/src/com/coding/basic/linklist/LRUPageFrameTest.java rename to group04/349184132/Study/src/com/dataStructure/LRU/LRUPageFrameTest.java index 409c5f461d..9dc10d3ded 100644 --- a/group04/349184132/Study/src/com/coding/basic/linklist/LRUPageFrameTest.java +++ b/group04/349184132/Study/src/com/dataStructure/LRU/LRUPageFrameTest.java @@ -1,4 +1,4 @@ -package src.com.coning.basic.linklist; +package com.dataStructure.LRU; /** * Created by wang on 2017/3/27. diff --git a/group04/349184132/Study/src/com/coding/basic/linklist/LinkedList.java b/group04/349184132/Study/src/com/dataStructure/LRU/LinkedList.java similarity index 97% rename from group04/349184132/Study/src/com/coding/basic/linklist/LinkedList.java rename to group04/349184132/Study/src/com/dataStructure/LRU/LinkedList.java index 3560d53c7e..bde81890b7 100644 --- a/group04/349184132/Study/src/com/coding/basic/linklist/LinkedList.java +++ b/group04/349184132/Study/src/com/dataStructure/LRU/LinkedList.java @@ -1,7 +1,7 @@ -package com.coding.basic.linklist; +package com.dataStructure.LRU; -import com.first.Iterator; -import com.first.List; +import com.dataStructure.Iterator; +import com.dataStructure.List; import java.util.Objects; diff --git a/group04/349184132/Study/src/com/first/LinkedList.java b/group04/349184132/Study/src/com/dataStructure/LinkedList.java similarity index 99% rename from group04/349184132/Study/src/com/first/LinkedList.java rename to group04/349184132/Study/src/com/dataStructure/LinkedList.java index 4abca8addd..aa059ad82c 100644 --- a/group04/349184132/Study/src/com/first/LinkedList.java +++ b/group04/349184132/Study/src/com/dataStructure/LinkedList.java @@ -1,4 +1,4 @@ -package com.first; +package com.dataStructure; public class LinkedList implements List { diff --git a/group04/349184132/Study/src/com/first/List.java b/group04/349184132/Study/src/com/dataStructure/List.java similarity index 86% rename from group04/349184132/Study/src/com/first/List.java rename to group04/349184132/Study/src/com/dataStructure/List.java index 9c244deb3d..b3aabba4e8 100644 --- a/group04/349184132/Study/src/com/first/List.java +++ b/group04/349184132/Study/src/com/dataStructure/List.java @@ -1,4 +1,4 @@ -package com.first; +package com.dataStructure; public interface List { public void add(Object o); diff --git a/group04/349184132/Study/src/com/first/Queue.java b/group04/349184132/Study/src/com/dataStructure/Queue.java similarity index 94% rename from group04/349184132/Study/src/com/first/Queue.java rename to group04/349184132/Study/src/com/dataStructure/Queue.java index 4d24432adb..3025b84015 100644 --- a/group04/349184132/Study/src/com/first/Queue.java +++ b/group04/349184132/Study/src/com/dataStructure/Queue.java @@ -1,4 +1,4 @@ -package com.first; +package com.dataStructure; public class Queue { private LinkedList elementData = new LinkedList(); diff --git a/group04/349184132/Study/src/com/first/Stack.java b/group04/349184132/Study/src/com/dataStructure/Stack.java similarity index 95% rename from group04/349184132/Study/src/com/first/Stack.java rename to group04/349184132/Study/src/com/dataStructure/Stack.java index a9a1915f82..684ad43d0a 100644 --- a/group04/349184132/Study/src/com/first/Stack.java +++ b/group04/349184132/Study/src/com/dataStructure/Stack.java @@ -1,4 +1,4 @@ -package com.first; +package com.dataStructure; public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group04/349184132/Study/src/com/first/StackUtil.java b/group04/349184132/Study/src/com/dataStructure/StackUtil.java similarity index 99% rename from group04/349184132/Study/src/com/first/StackUtil.java rename to group04/349184132/Study/src/com/dataStructure/StackUtil.java index 88fddf53f7..b76a61a7b1 100644 --- a/group04/349184132/Study/src/com/first/StackUtil.java +++ b/group04/349184132/Study/src/com/dataStructure/StackUtil.java @@ -1,4 +1,4 @@ -package com.first; +package com.dataStructure; import java.util.Objects; diff --git a/group04/349184132/Study/src/com/second/Array/ArrayUtil.java b/group04/349184132/Study/src/com/dataStructure/arrayList/ArrayUtil.java similarity index 99% rename from group04/349184132/Study/src/com/second/Array/ArrayUtil.java rename to group04/349184132/Study/src/com/dataStructure/arrayList/ArrayUtil.java index cd99e201ab..fee9ceb201 100644 --- a/group04/349184132/Study/src/com/second/Array/ArrayUtil.java +++ b/group04/349184132/Study/src/com/dataStructure/arrayList/ArrayUtil.java @@ -1,4 +1,4 @@ -package com.second.Array; +package com.dataStructure.arrayList; import java.util.Arrays; diff --git a/group04/349184132/Study/src/com/second/Array/ArrayUtilTest.java b/group04/349184132/Study/src/com/dataStructure/arrayList/ArrayUtilTest.java similarity index 96% rename from group04/349184132/Study/src/com/second/Array/ArrayUtilTest.java rename to group04/349184132/Study/src/com/dataStructure/arrayList/ArrayUtilTest.java index 4acbbf8880..f6a933ba15 100644 --- a/group04/349184132/Study/src/com/second/Array/ArrayUtilTest.java +++ b/group04/349184132/Study/src/com/dataStructure/arrayList/ArrayUtilTest.java @@ -1,6 +1,4 @@ -package com.second.Array; - -import static org.junit.Assert.*; +package com.dataStructure.arrayList; import org.junit.Assert; import org.junit.Before; diff --git a/group04/349184132/Study/src/com/dataStructure/expr/ExprParse.java b/group04/349184132/Study/src/com/dataStructure/expr/ExprParse.java new file mode 100644 index 0000000000..b7847c305f --- /dev/null +++ b/group04/349184132/Study/src/com/dataStructure/expr/ExprParse.java @@ -0,0 +1,79 @@ +package com.dataStructure.expr; + +import java.util.LinkedList; +import java.util.List; + +/** + * Created by wang on 2017/4/14. + */ +public class ExprParse { + + public List prase(String expr){ + + List tokens = new LinkedList<>(); + + int i = 0; + + while(i < expr.length()){ + + char c = expr.charAt(i); + + if(isOperator(c)){ + + Token t = new Token(Token.OPERATOR,String.valueOf(c)); + tokens.add(t); + i++; + }else if(isNumber(c)){ + int nextIsNumberIndex = nextIsNumber(expr,i); + String num = expr.substring(i,nextIsNumberIndex); + Token t = new Token(Token.NUMBER,num); + tokens.add(t); + i=nextIsNumberIndex; + }else{ + throw new RuntimeException( c + " is not operator or number ! " ); + } + } + return tokens; + + } + + private int nextIsNumber(String expr,int i) { + while(i tokens = exprParse.prase(this.expr); + + Stack val = new Stack<>(); + Stack op = new Stack<>(); + + + for(int i=0; i topPrio){ + op.push(token.getValue()); + }else if(entryPrio <= topPrio){ + float result = getResult(val,op); + val.push(result); + op.push(token.getValue()); + } + } + + + }else if(token.getType() == Token.NUMBER){ + val.push(Float.parseFloat(token.getValue())); + + } + } + + while(!op.isEmpty()){ + float result = getResult(val,op); + val.push(result); + } + + + return val.peek(); + } + + private float getResult(Stack val, Stack op) { + float v2 = val.pop(); + float v1 = val.pop(); + return calculate(op.pop(),v1,v2); + } + + public int getPriority(String op){ + if(op.equals("+") || op.equals("-")){ + return 1; + }else if(op.equals("*") || op.equals("/")){ + return 2; + }else{ + throw new RuntimeException("Not support this operator!"); + } + } + + private float calculate(String ops , float v1 , float v2){ + if(ops.equals("+") ){ + return v1 + v2; + }else if(ops.equals("-")){ + return v1 - v2; + }else if(ops.equals("*")){ + return v1 * v2; + }else if(ops.equals("/")){ + return v1 / v2; + }else{ + throw new RuntimeException("Not support this operator"); + } + } + + + + + + + +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/dataStructure/expr/InfixExprTest.java b/group04/349184132/Study/src/com/dataStructure/expr/InfixExprTest.java new file mode 100644 index 0000000000..3c7255e16a --- /dev/null +++ b/group04/349184132/Study/src/com/dataStructure/expr/InfixExprTest.java @@ -0,0 +1,51 @@ +package com.dataStructure.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +/** + * Created by wang on 2017/4/14. + */ + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file diff --git a/group04/349184132/Study/src/com/dataStructure/expr/Token.java b/group04/349184132/Study/src/com/dataStructure/expr/Token.java new file mode 100644 index 0000000000..7920df312f --- /dev/null +++ b/group04/349184132/Study/src/com/dataStructure/expr/Token.java @@ -0,0 +1,25 @@ +package com.dataStructure.expr; + +/** + * Created by wang on 2017/4/14. + */ +public class Token { + public static final int OPERATOR = 0; + public static final int NUMBER = 1; + private int type ; + private String value; + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + + + public int getType() { + return type; + } + + public String getValue() { + return value; + } +} diff --git a/group04/349184132/Study/src/com/linked/Iterator.java b/group04/349184132/Study/src/com/dataStructure/linkedList/Iterator.java similarity index 69% rename from group04/349184132/Study/src/com/linked/Iterator.java rename to group04/349184132/Study/src/com/dataStructure/linkedList/Iterator.java index b2397b9aa7..aaacd05e86 100644 --- a/group04/349184132/Study/src/com/linked/Iterator.java +++ b/group04/349184132/Study/src/com/dataStructure/linkedList/Iterator.java @@ -1,4 +1,4 @@ -package com.linked; +package com.dataStructure.linkedList; public interface Iterator { public boolean hasNext(); diff --git a/group04/349184132/Study/src/com/linked/LinkedList.java b/group04/349184132/Study/src/com/dataStructure/linkedList/LinkedList.java similarity index 99% rename from group04/349184132/Study/src/com/linked/LinkedList.java rename to group04/349184132/Study/src/com/dataStructure/linkedList/LinkedList.java index 9d4e45d034..3c541b7951 100644 --- a/group04/349184132/Study/src/com/linked/LinkedList.java +++ b/group04/349184132/Study/src/com/dataStructure/linkedList/LinkedList.java @@ -1,4 +1,4 @@ -package com.linked; +package com.dataStructure.linkedList; import java.util.Objects; diff --git a/group04/349184132/Study/src/com/linked/List.java b/group04/349184132/Study/src/com/dataStructure/linkedList/List.java similarity index 91% rename from group04/349184132/Study/src/com/linked/List.java rename to group04/349184132/Study/src/com/dataStructure/linkedList/List.java index 60ec0a4a14..085375fd5e 100644 --- a/group04/349184132/Study/src/com/linked/List.java +++ b/group04/349184132/Study/src/com/dataStructure/linkedList/List.java @@ -1,4 +1,4 @@ -package com.linked; +package com.dataStructure.linkedList; public interface List { diff --git a/group04/349184132/Study/src/com/first/test/StackUtilTest.java b/group04/349184132/Study/src/com/dataStructure/test/StackUtilTest.java similarity index 95% rename from group04/349184132/Study/src/com/first/test/StackUtilTest.java rename to group04/349184132/Study/src/com/dataStructure/test/StackUtilTest.java index 940abbb57c..ba8eb8ad1e 100644 --- a/group04/349184132/Study/src/com/first/test/StackUtilTest.java +++ b/group04/349184132/Study/src/com/dataStructure/test/StackUtilTest.java @@ -1,7 +1,7 @@ -package com.first.test; +package com.dataStructure.test; -import com.first.Stack; -import com.first.StackUtil; +import com.dataStructure.Stack; +import com.dataStructure.StackUtil; import org.junit.After; import org.junit.Assert; import org.junit.Before; diff --git a/group04/349184132/Study/src/com/first/test/TestArrayList.java b/group04/349184132/Study/src/com/dataStructure/test/TestArrayList.java similarity index 88% rename from group04/349184132/Study/src/com/first/test/TestArrayList.java rename to group04/349184132/Study/src/com/dataStructure/test/TestArrayList.java index af7ed55f0a..94fd273183 100644 --- a/group04/349184132/Study/src/com/first/test/TestArrayList.java +++ b/group04/349184132/Study/src/com/dataStructure/test/TestArrayList.java @@ -1,9 +1,9 @@ -package com.first.test; +package com.dataStructure.test; import org.junit.Test; -import com.first.ArrayList; -import com.first.Iterator; +import com.dataStructure.ArrayList; +import com.dataStructure.Iterator; public class TestArrayList { private ArrayList al = new ArrayList(); diff --git a/group04/349184132/Study/src/com/first/test/TestLinkedList.java b/group04/349184132/Study/src/com/dataStructure/test/TestLinkedList.java similarity index 92% rename from group04/349184132/Study/src/com/first/test/TestLinkedList.java rename to group04/349184132/Study/src/com/dataStructure/test/TestLinkedList.java index 2131e580ff..dae63ff1c3 100644 --- a/group04/349184132/Study/src/com/first/test/TestLinkedList.java +++ b/group04/349184132/Study/src/com/dataStructure/test/TestLinkedList.java @@ -1,9 +1,9 @@ -package com.first.test; +package com.dataStructure.test; import org.junit.Test; -import com.first.Iterator; -import com.first.LinkedList; +import com.dataStructure.Iterator; +import com.dataStructure.LinkedList; public class TestLinkedList { LinkedList link = new LinkedList(); diff --git a/group04/349184132/Study/src/com/coderising/download/DownloadThread.java b/group04/349184132/Study/src/com/multiThreadDownload/DownloadThread.java similarity index 92% rename from group04/349184132/Study/src/com/coderising/download/DownloadThread.java rename to group04/349184132/Study/src/com/multiThreadDownload/DownloadThread.java index 2b806a7f44..8e97a75d5e 100644 --- a/group04/349184132/Study/src/com/coderising/download/DownloadThread.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/DownloadThread.java @@ -1,12 +1,12 @@ -package com.coderising.download; +package com.multiThreadDownload; + +import com.multiThreadDownload.api.Connection; import java.io.IOException; import java.io.RandomAccessFile; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; -import com.coderising.download.api.Connection; - public class DownloadThread extends Thread { Connection conn; int startPos; diff --git a/group04/349184132/Study/src/com/coderising/download/FileDownloader.java b/group04/349184132/Study/src/com/multiThreadDownload/FileDownloader.java similarity index 92% rename from group04/349184132/Study/src/com/coderising/download/FileDownloader.java rename to group04/349184132/Study/src/com/multiThreadDownload/FileDownloader.java index 281dafde96..54e6ccfc16 100644 --- a/group04/349184132/Study/src/com/coderising/download/FileDownloader.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/FileDownloader.java @@ -1,16 +1,15 @@ -package com.coderising.download; +package com.multiThreadDownload; + +import com.multiThreadDownload.api.Connection; +import com.multiThreadDownload.api.ConnectionException; +import com.multiThreadDownload.api.ConnectionManager; +import com.multiThreadDownload.api.DownloadListener; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.net.URL; import java.util.concurrent.CyclicBarrier; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; - public class FileDownloader { boolean isFinished = false; diff --git a/group04/349184132/Study/src/com/coderising/download/FileDownloaderTest.java b/group04/349184132/Study/src/com/multiThreadDownload/FileDownloaderTest.java similarity index 83% rename from group04/349184132/Study/src/com/coderising/download/FileDownloaderTest.java rename to group04/349184132/Study/src/com/multiThreadDownload/FileDownloaderTest.java index 604712d2a9..f8d8f8f69d 100644 --- a/group04/349184132/Study/src/com/coderising/download/FileDownloaderTest.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/FileDownloaderTest.java @@ -1,12 +1,11 @@ -package com.coderising.download; +package com.multiThreadDownload; import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; -import com.coderising.download.impl.ConnectionManagerImpl; +import com.multiThreadDownload.api.*; +import com.multiThreadDownload.impl.*; public class FileDownloaderTest { boolean downloadFinished = false; diff --git a/group04/349184132/Study/src/com/coderising/download/api/Connection.java b/group04/349184132/Study/src/com/multiThreadDownload/api/Connection.java similarity index 92% rename from group04/349184132/Study/src/com/coderising/download/api/Connection.java rename to group04/349184132/Study/src/com/multiThreadDownload/api/Connection.java index 0957eaf7f4..bc7b267414 100644 --- a/group04/349184132/Study/src/com/coderising/download/api/Connection.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/api/Connection.java @@ -1,4 +1,4 @@ -package com.coderising.download.api; +package com.multiThreadDownload.api; import java.io.IOException; diff --git a/group04/349184132/Study/src/com/coderising/download/api/ConnectionException.java b/group04/349184132/Study/src/com/multiThreadDownload/api/ConnectionException.java similarity index 80% rename from group04/349184132/Study/src/com/coderising/download/api/ConnectionException.java rename to group04/349184132/Study/src/com/multiThreadDownload/api/ConnectionException.java index 1599be1296..c490e9bc1e 100644 --- a/group04/349184132/Study/src/com/coderising/download/api/ConnectionException.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/api/ConnectionException.java @@ -1,4 +1,4 @@ -package com.coderising.download.api; +package com.multiThreadDownload.api; public class ConnectionException extends Exception { diff --git a/group04/349184132/Study/src/com/coderising/download/api/ConnectionManager.java b/group04/349184132/Study/src/com/multiThreadDownload/api/ConnectionManager.java similarity index 83% rename from group04/349184132/Study/src/com/coderising/download/api/ConnectionManager.java rename to group04/349184132/Study/src/com/multiThreadDownload/api/ConnectionManager.java index ce045393b1..38b13fde5b 100644 --- a/group04/349184132/Study/src/com/coderising/download/api/ConnectionManager.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/api/ConnectionManager.java @@ -1,4 +1,4 @@ -package com.coderising.download.api; +package com.multiThreadDownload.api; public interface ConnectionManager { /** diff --git a/group04/349184132/Study/src/com/coderising/download/api/DownloadListener.java b/group04/349184132/Study/src/com/multiThreadDownload/api/DownloadListener.java similarity index 65% rename from group04/349184132/Study/src/com/coderising/download/api/DownloadListener.java rename to group04/349184132/Study/src/com/multiThreadDownload/api/DownloadListener.java index bf9807b307..b902d38109 100644 --- a/group04/349184132/Study/src/com/coderising/download/api/DownloadListener.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/api/DownloadListener.java @@ -1,4 +1,4 @@ -package com.coderising.download.api; +package com.multiThreadDownload.api; public interface DownloadListener { public void notifyFinished(); diff --git a/group04/349184132/Study/src/com/coderising/download/impl/ConnectionImpl.java b/group04/349184132/Study/src/com/multiThreadDownload/impl/ConnectionImpl.java similarity index 85% rename from group04/349184132/Study/src/com/coderising/download/impl/ConnectionImpl.java rename to group04/349184132/Study/src/com/multiThreadDownload/impl/ConnectionImpl.java index 3ad903146b..b97263378c 100644 --- a/group04/349184132/Study/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/impl/ConnectionImpl.java @@ -1,14 +1,11 @@ -package com.coderising.download.impl; +package com.multiThreadDownload.impl; + +import com.multiThreadDownload.api.Connection; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLConnection; - -import com.coderising.download.api.Connection; public class ConnectionImpl implements Connection{ private HttpURLConnection conn ; diff --git a/group04/349184132/Study/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group04/349184132/Study/src/com/multiThreadDownload/impl/ConnectionManagerImpl.java similarity index 75% rename from group04/349184132/Study/src/com/coderising/download/impl/ConnectionManagerImpl.java rename to group04/349184132/Study/src/com/multiThreadDownload/impl/ConnectionManagerImpl.java index 9132787cf8..97be6ca5ac 100644 --- a/group04/349184132/Study/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group04/349184132/Study/src/com/multiThreadDownload/impl/ConnectionManagerImpl.java @@ -1,14 +1,14 @@ -package com.coderising.download.impl; +package com.multiThreadDownload.impl; + +import com.multiThreadDownload.api.Connection; +import com.multiThreadDownload.api.ConnectionException; +import com.multiThreadDownload.api.ConnectionManager; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; - public class ConnectionManagerImpl implements ConnectionManager { @Override public Connection open(String url) throws ConnectionException { diff --git a/group04/349184132/Study/src/com/second/LoginAction.java b/group04/349184132/Study/src/com/parseStruts/LoginAction.java similarity index 97% rename from group04/349184132/Study/src/com/second/LoginAction.java rename to group04/349184132/Study/src/com/parseStruts/LoginAction.java index 6dd5deaaf6..19eee013fa 100644 --- a/group04/349184132/Study/src/com/second/LoginAction.java +++ b/group04/349184132/Study/src/com/parseStruts/LoginAction.java @@ -1,4 +1,4 @@ -package com.second; +package com.parseStruts; /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 diff --git a/group04/349184132/Study/src/com/second/StringUtil.java b/group04/349184132/Study/src/com/parseStruts/StringUtil.java similarity index 97% rename from group04/349184132/Study/src/com/second/StringUtil.java rename to group04/349184132/Study/src/com/parseStruts/StringUtil.java index 21a3de8e67..85886be5db 100644 --- a/group04/349184132/Study/src/com/second/StringUtil.java +++ b/group04/349184132/Study/src/com/parseStruts/StringUtil.java @@ -1,4 +1,4 @@ -package com.second; +package com.parseStruts; public class StringUtil { public static String nameTogetName(String name){ diff --git a/group04/349184132/Study/src/com/second/Struts.java b/group04/349184132/Study/src/com/parseStruts/Struts.java similarity index 98% rename from group04/349184132/Study/src/com/second/Struts.java rename to group04/349184132/Study/src/com/parseStruts/Struts.java index 77110a674c..c979fc4ca8 100644 --- a/group04/349184132/Study/src/com/second/Struts.java +++ b/group04/349184132/Study/src/com/parseStruts/Struts.java @@ -1,9 +1,8 @@ -package com.second; +package com.parseStruts; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; diff --git a/group04/349184132/Study/src/com/second/StrutsTest.java b/group04/349184132/Study/src/com/parseStruts/StrutsTest.java similarity index 96% rename from group04/349184132/Study/src/com/second/StrutsTest.java rename to group04/349184132/Study/src/com/parseStruts/StrutsTest.java index ff297c01ab..4e4d271880 100644 --- a/group04/349184132/Study/src/com/second/StrutsTest.java +++ b/group04/349184132/Study/src/com/parseStruts/StrutsTest.java @@ -1,12 +1,11 @@ -package com.second; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +package com.parseStruts; import org.junit.Assert; import org.junit.Test; +import java.util.HashMap; +import java.util.Map; + diff --git a/group04/349184132/Study/src/com/second/View.java b/group04/349184132/Study/src/com/parseStruts/View.java similarity index 93% rename from group04/349184132/Study/src/com/second/View.java rename to group04/349184132/Study/src/com/parseStruts/View.java index 647d88d5f0..1034745161 100644 --- a/group04/349184132/Study/src/com/second/View.java +++ b/group04/349184132/Study/src/com/parseStruts/View.java @@ -1,4 +1,5 @@ -package com.second; +package com.parseStruts; + import java.util.Map; diff --git a/group04/349184132/Study/src/com/second/struts.xml b/group04/349184132/Study/src/com/second/struts.xml deleted file mode 100644 index 554dbbe227..0000000000 --- a/group04/349184132/Study/src/com/second/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file From cb3fb6fa582deb24c954036d0e57be3a32466154 Mon Sep 17 00:00:00 2001 From: Harry Date: Sun, 16 Apr 2017 22:37:36 +0800 Subject: [PATCH 160/552] add jvm_3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解析属性表,方法表和Code属性以及LineNumberTable和LocalVarialTable --- .../coding2017/jvm/attr/AttributeInfo.java | 19 ++++ .../coding2017/jvm/attr/CodeAttr.java | 100 ++++++++++++++++++ .../coding2017/jvm/attr/LineNumberTable.java | 57 ++++++++++ .../jvm/attr/LocalVariableItem.java | 49 +++++++++ .../jvm/attr/LocalVariableTable.java | 40 +++++++ .../coding2017/jvm/attr/StackMapTable.java | 29 +++++ .../coding2017/jvm/clz/ClassFile.java | 26 ++++- .../coding2017/jvm/constant/ConstantInfo.java | 3 + .../coding2017/jvm/constant/UTF8Info.java | 7 +- .../HarryHook/coding2017/jvm/field/Field.java | 44 ++++++++ .../jvm/loader/ByteCodeIterator.java | 33 ++++-- .../jvm/loader/ClassFileParser.java | 36 +++++++ .../coding2017/jvm/method/Method.java | 83 +++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 84 ++++++++++++++- 14 files changed, 595 insertions(+), 15 deletions(-) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..33b7dda5c6 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..47a8bd2b1c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java @@ -0,0 +1,100 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; +import com.sun.org.apache.bcel.internal.generic.NEW; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + // private ByteCodeCommand[] cmds ; + // public ByteCodeCommand[] getCmds() { + // return cmds; + // } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, + String code /* ByteCodeCommand[] cmds */) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + // this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + System.out.println(code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + + int exceptionLength = iter.nextU2ToInt(); + if(exceptionLength > 0) { + String exceptionTable = iter.nextUxToHexString(exceptionLength); + System.out.println("exception Table has not complemented" + exceptionTable); + } + //解析子属性 + int subAttrCount = iter.nextU2ToInt(); + + for(int j=1; j<=subAttrCount; j++) { + + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + iter.back(2); + + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + + } else if(AttributeInfo.LOCAL_VAR_TABLE.equals(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + + } else { + throw new RuntimeException("Need implement" + subAttrName); + } + } + return codeAttr; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + public String toString(ConstantPool pool) { + StringBuffer buffer = new StringBuffer(); + buffer.append("Code:").append(code).append("\n"); + buffer.append("\n"); + buffer.append(this.lineNumTable.toString()); + //buffer.append(this.localVarTable.toString(pool)); + return buffer.toString(); + } + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..51933e9bb6 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java @@ -0,0 +1,57 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + int attrNameIndex = iter.nextU2ToInt(); + int attrLength = iter.nextU4ToInt(); + LineNumberTable table = new LineNumberTable(attrNameIndex, attrLength); + int itemLength = iter.nextU2ToInt(); + + for(int i=1; i<=itemLength; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + + return table; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..f442ea5698 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java @@ -0,0 +1,49 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..f9d5d0bdce --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java @@ -0,0 +1,40 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +import java.util.ArrayList; +import java.util.List; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; + +import sun.util.logging.resources.logging; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter) { + int attrNameIndex = iter.nextU2ToInt(); + int attrlength = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(attrNameIndex, attrlength); + int itemLength = iter.nextU2ToInt(); + for (int i = 1; i <= itemLength; i++) { + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..745a2fdc70 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java @@ -0,0 +1,29 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo { + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter) { + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index, len); + + // 后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java index 9754e904e4..45e7464e9f 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java @@ -1,7 +1,13 @@ package com.github.HarryHook.coding2017.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.field.Field; +import com.github.HarryHook.coding2017.jvm.method.Method; public class ClassFile { @@ -11,6 +17,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList();; public ClassIndex getClzIndex() { return clzIndex; @@ -48,7 +56,6 @@ public void setMajorVersion(int majorVersion) { public void setConstantPool(ConstantPool pool) { this.pool = pool; - } public void setClassIndex(ClassIndex clzIndex) { @@ -75,5 +82,22 @@ private String getSuperClassName() { ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public void addField(Field f) { + fields.add(f); + } + + public List getFields() { + return fields; + } + + public void addMethod(Method m) { + methods.add(m); + + } + public List getMethods() { + return methods; + } + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java index 3cf807a716..3d81ed1adb 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java @@ -27,5 +27,8 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index) { return this.constantPool.getConstantInfo(index); } + + + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java index e787b42ed2..27c2ec9059 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java @@ -26,12 +26,11 @@ public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]"; } - public String getValue() { - return value; - } - public void setValue(String value) { this.value = value; } + public String getValue(){ + return value; + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java new file mode 100644 index 0000000000..9d33d90d96 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java @@ -0,0 +1,44 @@ + +package com.github.HarryHook.coding2017.jvm.field; + +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; +import com.sun.istack.internal.Pool; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributesCount = iter.nextU2ToInt(); + System.out.println("field attributes Count: " + attributesCount); + Field f = new Field(accessFlag, nameIndex, descriptorIndex, pool); + if(attributesCount > 0) { + throw new RuntimeException("Field has not complemented attribute"); + } + return f; + } + + public String toString() { + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":" + desc; + } + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java index a65cd6f3d8..b773b6b584 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java @@ -7,9 +7,11 @@ public class ByteCodeIterator { byte[] codes; int pos = 0; + public ByteCodeIterator(byte[] codes) { this.codes = codes; } + public byte[] getByte(int len) { if (pos + len > codes.length) { throw new ArrayIndexOutOfBoundsException(); @@ -18,22 +20,39 @@ public byte[] getByte(int len) { pos += len; return data; } + public String nextU4ToHexString() { - - return Util.byteToHexString(new byte[] {codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + + return Util.byteToHexString(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); } - + public int nextU1ToInt() { - + return Util.byteToInt(new byte[] { codes[pos++] }); } + public int nextU2ToInt() { - - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++]}); + + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); } + public int nextU4ToInt() { - + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); } + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java index 4a7cc6bd04..40608823e9 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java @@ -2,6 +2,7 @@ import java.io.UnsupportedEncodingException; + import com.github.HarryHook.coding2017.jvm.clz.AccessFlag; import com.github.HarryHook.coding2017.jvm.clz.ClassFile; import com.github.HarryHook.coding2017.jvm.clz.ClassIndex; @@ -13,6 +14,8 @@ import com.github.HarryHook.coding2017.jvm.constant.NullConstantInfo; import com.github.HarryHook.coding2017.jvm.constant.StringInfo; import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; +import com.github.HarryHook.coding2017.jvm.field.Field; +import com.github.HarryHook.coding2017.jvm.method.Method; public class ClassFileParser { @@ -37,15 +40,22 @@ public ClassFile parse(byte[] codes) { ClassIndex clzIndex = parseClassIndex(iter); clzFile.setClzIndex(clzIndex); + parseInterfaces(iter); + + parseField(clzFile, iter); + + parseMethod(clzFile, iter); return clzFile; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); return flag; } private ClassIndex parseClassIndex(ByteCodeIterator iter) { + int thisClassIndex = iter.nextU2ToInt(); int superClassIndex = iter.nextU2ToInt(); ClassIndex clzIndex = new ClassIndex(); @@ -109,7 +119,33 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } System.out.println("Finished reading Constant Pool "); + return pool; } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseField(ClassFile clzFile, ByteCodeIterator iter){ + int fieldCount = iter.nextU2ToInt(); + for(int i=1; i<=fieldCount; i++) { + Field f = Field.parse(clzFile.getConstantPool(), iter); + clzFile.addField(f); + + } + } + + private void parseMethod(ClassFile clzFile, ByteCodeIterator iter){ + int methodCount = iter.nextU2ToInt(); + for(int i=1; i<=methodCount; i++) { + Method m = Method.parse(clzFile, iter); + clzFile.addMethod(m); + } + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java new file mode 100644 index 0000000000..d7dedc0439 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java @@ -0,0 +1,83 @@ + +package com.github.HarryHook.coding2017.jvm.method; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; + +import javax.management.RuntimeErrorException; + +import com.github.HarryHook.coding2017.jvm.attr.AttributeInfo; +import com.github.HarryHook.coding2017.jvm.attr.CodeAttr; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributeCount = iter.nextU2ToInt(); + + Method m = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); + + for(int i=1; i<=attributeCount; i++) { + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if(AttributeInfo.CODE.equalsIgnoreCase(attrName)) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else { + throw new RuntimeException("only Attribute is complemented!"); + } + + } + return m; + + } + public String toString(ConstantPool pool) { + StringBuffer buffer = new StringBuffer(); + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + buffer.append(name); + buffer.append(desc); + return buffer.toString(); + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java index 1f6a3a9a50..524907ce9f 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java @@ -1,5 +1,7 @@ package com.github.HarryHook.coding2017.jvm.test; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -12,7 +14,10 @@ import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; +import com.github.HarryHook.coding2017.jvm.field.Field; import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; +import com.github.HarryHook.coding2017.jvm.method.Method; + public class ClassFileloaderTest { @@ -166,8 +171,8 @@ public void testConstantPool() { } { - // UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53); - // Assert.assertEquals("EmployeeV1.java", utf8Info.getValue()); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53); + Assert.assertEquals("EmployeeV1.java", utf8Info.getValue()); } } @@ -181,5 +186,78 @@ public void testClassIndex() { Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } - + /** + * 下面是第三次JVM课应实现的测试用例 + */ + + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + } From ba473c003d29cbe7962c217af3b99772097033e3 Mon Sep 17 00:00:00 2001 From: Harry Date: Sun, 16 Apr 2017 22:38:02 +0800 Subject: [PATCH 161/552] add InfixExpr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现中序表达式求值 --- .../coding2017/stack/expr/InfixExpr.java | 107 ++++++++++++++++++ .../coding2017/stack/expr/InfixExprTest.java | 47 ++++++++ 2 files changed, 154 insertions(+) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..5b1dbd7fa4 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java @@ -0,0 +1,107 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import com.github.HarryHook.coding2017.basic.MyStack; + +public class InfixExpr { + + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + char[] ch = expr.toCharArray(); + MyStack stackOfTocken = new MyStack(); + MyStack stackOfNumber = new MyStack(); + + for (int i = 0; i < ch.length; i++) { + + if (Character.isDigit(ch[i])) { + int tmp = Integer.parseInt("" + ch[i]); + while (i < ch.length - 1 && Character.isDigit(ch[++i])) { + tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + } + + stackOfNumber.push(tmp); + + } + if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') { + stackOfTocken.push(ch[i]); + } + + if (!(stackOfTocken.isEmpty()) && (char) stackOfTocken.peek() == '*') { + int tmp = Integer.parseInt("" + ch[++i]); + while (i < ch.length - 1 && Character.isDigit(ch[++i])) { + tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + } + if (i != ch.length - 1) { + i--; + } + stackOfNumber.push(tmp); + + int tmp1 = Integer.parseInt("" + stackOfNumber.pop()); + int tmp2 = Integer.parseInt("" + stackOfNumber.pop()); + stackOfNumber.push(tmp1 * tmp2); + stackOfTocken.pop(); + + } + if (!(stackOfTocken.isEmpty()) && (char) stackOfTocken.peek() == '/') { + int tmp = Integer.parseInt("" + ch[++i]); + while (i < ch.length - 1 && Character.isDigit(ch[++i])) { + tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + } + if (i != ch.length - 1) { + i--; + } + stackOfNumber.push(tmp); + + int tmp1 = Integer.parseInt("" + stackOfNumber.pop()); + int tmp2 = Integer.parseInt("" + stackOfNumber.pop()); + stackOfNumber.push(tmp2 / tmp1); + stackOfTocken.pop(); + } + } + // 将栈中的数字和运算法逆置,便于计算 + reverse(stackOfNumber); + reverse(stackOfTocken); + + while (!(stackOfTocken.isEmpty())) { + if ((char) stackOfTocken.peek() == '+') { + int tmp1 = Integer.parseInt("" + stackOfNumber.pop()); + int tmp2 = Integer.parseInt("" + stackOfNumber.pop()); + stackOfNumber.push(tmp1 + tmp2); + } + + if ((char) stackOfTocken.peek() == '-') { + int tmp1 = Integer.parseInt("" + stackOfNumber.pop()); + int tmp2 = Integer.parseInt("" + stackOfNumber.pop()); + stackOfNumber.push(tmp1 - tmp2); + } + stackOfTocken.pop(); + } + + return Float.parseFloat("" + stackOfNumber.pop()); + } + + private void reverse(MyStack s) { + + if (s.isEmpty()) { + return; + } + // 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。 + Object tmp1 = s.pop(); + reverse(s); + if (s.isEmpty()) { + s.push(tmp1); + return; + } + Object temp2 = s.pop(); + reverse(s); + s.push(tmp1); + reverse(s); + s.push(temp2); + + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..4abd227502 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java @@ -0,0 +1,47 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import org.junit.Assert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + // InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} From db5add0e43cf76c85a767932f3fdb912cfb4aabf Mon Sep 17 00:00:00 2001 From: yanghaitao0410 <1454385822@qq.com> Date: Sun, 16 Apr 2017 22:43:20 +0800 Subject: [PATCH 162/552] field finish --- group06/1454385822/.classpath | 24 +- .../basic/homework_02/litestruts/struts.xml | 22 +- .../basic/homework_04/jvm/clz/ClassFile.java | 226 +++---- .../homework_04/jvm/clz/ClassFileParser.java | 216 +++---- .../jvm/test/ClassFileloaderTest.java | 550 +++++++++--------- 5 files changed, 536 insertions(+), 502 deletions(-) diff --git a/group06/1454385822/.classpath b/group06/1454385822/.classpath index 2d8e27c1f2..6e5d5ec9db 100644 --- a/group06/1454385822/.classpath +++ b/group06/1454385822/.classpath @@ -1,12 +1,12 @@ - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml index 53f1245121..1fc9e357bf 100644 --- a/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml +++ b/group06/1454385822/src/com/coding/basic/homework_02/litestruts/struts.xml @@ -1,11 +1,13 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + \ No newline at end of file diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFile.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFile.java index 05e6e579b2..9273df7cca 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFile.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFile.java @@ -1,107 +1,119 @@ -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; - } - - -} +package com.coding.basic.homework_04.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +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.field.Field; + +public class ClassFile { + + private String MagicNumber; + private int minorVersion; + private int majorVersion; + private int ConstantNum; + + private ConstantPool constantPool; + private ClassIndex clzIndex; + private AccessFlag accessFlag; + private List fields = new ArrayList(); + + public void addField(Field field){ + fields.add(field); + } + + 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; + } + + + + public List getFields() { + return fields; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java index ce1853b454..794a7d82d8 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java @@ -1,99 +1,117 @@ -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; - } - -} +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.field.Field; +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); + parseInterface(iterator); + + parseField(classFile, iterator); + + return classFile; + } + + private void parseField(ClassFile clzFile, ByteCodeIterator iterator) { + int fieldCount = iterator.nextU2ToInt(); + 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.getClass_index()); - Assert.assertEquals(13, methodRef.getNameAndType_index()); - } - - { - NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13); - Assert.assertEquals(9, nameAndType.getClz_index()); - Assert.assertEquals(14, nameAndType.getDescriptor_index()); - } - //抽查几个吧 - { - MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45); - Assert.assertEquals(1, methodRef.getClass_index()); - Assert.assertEquals(46, methodRef.getNameAndType_index()); - } - - { - 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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - //@Test -// public void testReadFields(){ -// -// List fields = clzFile.getFields(); -// Assert.assertEquals(2, fields.size()); -// { -// Field f = fields.get(0); -// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); -// } -// { -// Field f = fields.get(1); -// Assert.assertEquals("age:I", f.toString()); -// } -// } -// //@Test -// public void testMethods(){ -// -// List methods = clzFile.getMethods(); -// ConstantPool pool = clzFile.getConstantPool(); -// -// { -// Method m = methods.get(0); -// assertMethodEquals(pool,m, -// "", -// "(Ljava/lang/String;I)V", -// "2ab7000c2a2bb5000f2a1cb50011b1"); -// -// } -// { -// Method m = methods.get(1); -// assertMethodEquals(pool,m, -// "setName", -// "(Ljava/lang/String;)V", -// "2a2bb5000fb1"); -// -// } -// { -// Method m = methods.get(2); -// assertMethodEquals(pool,m, -// "setAge", -// "(I)V", -// "2a1bb50011b1"); -// } -// { -// Method m = methods.get(3); -// assertMethodEquals(pool,m, -// "sayHello", -// "()V", -// "b2001c1222b60024b1"); -// -// } -// { -// Method m = methods.get(4); -// assertMethodEquals(pool,m, -// "main", -// "([Ljava/lang/String;)V", -// "bb000159122b101db7002d4c2bb6002fb1"); -// } -// } -// -// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ -// String methodName = pool.getUTF8String(m.getNameIndex()); -// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); -// String code = m.getCodeAttr().getCode(); -// Assert.assertEquals(expectedName, methodName); -// Assert.assertEquals(expectedDesc, methodDesc); -// Assert.assertEquals(expectedCode, code); -// } - - +package com.coding.basic.homework_04.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.clz.ClassIndex; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; +import com.coding.basic.homework_04.jvm.field.Field; +import com.coding.basic.homework_04.jvm.info.ClassInfo; +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.UTF8Info; +import com.coding.basic.homework_04.jvm.loader.ClassFileLoader; + + + +public class ClassFileloaderTest { + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + static String path1 = "D:\\mygit\\coding2017-1\\group06\\1454385822\\bin"; +// static String path1 = "C:\\Users\\yanght\\Documents\\mygit\\coding2017-1\\group06\\1454385822\\bin"; + static String path2 = "D:\temp"; + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coding.basic.homework_04.jvm.test.EmployeeV2"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coding.basic.homework_04.jvm.test.EmployeeV2"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coding.basic.homework_04.jvm.test.EmployeeV2"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + 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.getClass_index()); + Assert.assertEquals(13, methodRef.getNameAndType_index()); + } + + { + NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13); + Assert.assertEquals(9, nameAndType.getClz_index()); + Assert.assertEquals(14, nameAndType.getDescriptor_index()); + } + //抽查几个吧 + { + MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45); + Assert.assertEquals(1, methodRef.getClass_index()); + Assert.assertEquals(46, methodRef.getNameAndType_index()); + } + + { + 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } +// @Test +// public void testMethods(){ +// +// List methods = clzFile.getMethods(); +// ConstantPool pool = clzFile.getConstantPool(); +// +// { +// Method m = methods.get(0); +// assertMethodEquals(pool,m, +// "", +// "(Ljava/lang/String;I)V", +// "2ab7000c2a2bb5000f2a1cb50011b1"); +// +// } +// { +// Method m = methods.get(1); +// assertMethodEquals(pool,m, +// "setName", +// "(Ljava/lang/String;)V", +// "2a2bb5000fb1"); +// +// } +// { +// Method m = methods.get(2); +// assertMethodEquals(pool,m, +// "setAge", +// "(I)V", +// "2a1bb50011b1"); +// } +// { +// Method m = methods.get(3); +// assertMethodEquals(pool,m, +// "sayHello", +// "()V", +// "b2001c1222b60024b1"); +// +// } +// { +// Method m = methods.get(4); +// assertMethodEquals(pool,m, +// "main", +// "([Ljava/lang/String;)V", +// "bb000159122b101db7002d4c2bb6002fb1"); +// } +// } +// +// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ +// String methodName = pool.getUTF8String(m.getNameIndex()); +// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); +// String code = m.getCodeAttr().getCode(); +// Assert.assertEquals(expectedName, methodName); +// Assert.assertEquals(expectedDesc, methodDesc); +// Assert.assertEquals(expectedCode, code); +// } + + } \ No newline at end of file From 3ee3ff1bba8effe0572bb362d9146125cb17c113 Mon Sep 17 00:00:00 2001 From: Ren650119726 <102228177@qq.com> Date: Sun, 16 Apr 2017 22:48:53 +0800 Subject: [PATCH 163/552] =?UTF-8?q?4-16=20jvm=E7=AC=AC=E4=B8=89=E6=AC=A1?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/attr/AttributeInfo.java | 19 ++ .../src/com/coderising/jvm/attr/CodeAttr.java | 116 ++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 68 ++++++ .../jvm/attr/LocalVariableItem.java | 39 ++++ .../jvm/attr/LocalVariableTable.java | 58 +++++ .../coderising/jvm/attr/StackMapTable.java | 30 +++ .../com/coderising/jvm/clz/AccessFlag.java | 25 +++ .../src/com/coderising/jvm/clz/ClassFile.java | 92 ++++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 33 +++ .../coderising/jvm/constant/ConstantInfo.java | 38 ++++ .../coderising/jvm/constant/ConstantPool.java | 39 ++++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++ .../jvm/constant/MethodRefInfo.java | 55 +++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 +++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++ .../src/com/coderising/jvm/field/Field.java | 45 ++++ .../jvm/loader/ByteCodeIterator.java | 53 +++++ .../jvm/loader/ClassFileLoader.java | 137 ++++++++++++ .../jvm/loader/ClassFileParser.java | 143 ++++++++++++ .../src/com/coderising/jvm/method/Method.java | 91 ++++++++ .../jvm/test/ClassFileloaderTest.java | 203 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 +++ .../src/com/coderising/jvm/util/Util.java | 24 +++ .../src/com/coding/basic/stack/ArrayList.java | 150 +++++++++++++ .../src/com/coding/basic/stack/InfixExpr.java | 18 ++ .../com/coding/basic/stack/InfixExprTest.java | 47 ++++ .../src/com/coding/basic/stack/Iterator.java | 8 + .../src/com/coding/basic/stack/List.java | 10 + .../src/com/coding/basic/stack/Stack.java | 48 +++++ .../src/com/coding/basic/stack/StackUtil.java | 66 ++++++ 33 files changed, 1872 insertions(+) create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/method/Method.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/ArrayList.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/List.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..a334a13d81 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,116 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); + + int exceptionTableLen = iter.nextU2ToInt(); + //TODO 处理exception + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.nextU2ToInt(); + + for(int x=1; x<=subAttrCount; x++){ + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } + else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } + else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } + else{ + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + /*for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..88f677b2c8 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,58 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..4755266987 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..af1e6bc65f --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,33 @@ +package com.coderising.jvm.constant; + +/** + + * @Description 类常量信息 + + * @author REEFE + + * @time 2017年4月9日 + + */ +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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..855b581f95 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,38 @@ +package com.coderising.jvm.constant; + +/** + + * @Description 常见常量项 + + * @author REEFE + + * @time 2017年4月9日 + + */ +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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..d4f91262b8 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + + +/** + + * @Description:常量池 + + * @author:REEFE + + * @time:2017年4月9日 + + */ +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/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java b/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..7bc2656653 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..2eb83f3983 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,53 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..81264ceed7 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,137 @@ +package com.coderising.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 com.coderising.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(){ + + 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/group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java b/group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java b/group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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= maxLen){ + grow(); + } + elements[size] = o; + size++; + } + + /** + * 数组扩容 + */ + private void grow(){ + maxLen = maxLen + (maxLen >> 1); + Object[] newArr = new Object[maxLen]; + System.arraycopy(elements, 0, newArr, 0, size); + elements = newArr; + } + + /** + * 在指定索引处添加元素 + * @param i 指定索引 + * @param o 添加元素 + */ + public void add(int i,Object o){ + //判断插入位置大于数组实际长度 + if(i > size){ + size = i; + if(size >= maxLen){//数组大小大于数组最大容量则需要扩容 + grow(); + } + } + //插入位置不大于数组实际长度时,将插入位置的元素向后移。 + for (int j = size; j > i ; j++) { + elements[j] = elements[j-1]; + } + elements[i] = o; + size++; + } + + /** + * 获取传入索引的元素 + * @param index 索引 + * @return 返回传入索引的元素 + */ + public Object get(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + } + for (int i = 0; i < size; i++) { + return elements[index]; + } + return null; + } + + /** + * 删除指定索引元素并返回 + * @param index + * @return 该索引处元素 + */ + public Object remove(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + }else{ + for (int j = index; j < size-1; j++) { + elements[j]=elements[j+1]; + } + size--; + return elements[index]; + } + } + + /** + * 获取大小 + * @return + */ + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + int cursor; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + if(i >= size){ + throw new NoSuchElementException(); + } + if (i >= elements.length){ + throw new ConcurrentModificationException(); + } + cursor = i+1; + return elements[i]; + } + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(6, 6); + list.remove(3); + for (int i = 0; i < list.size(); i++) { + System.out.println(i+":"+list.get(i)); + } + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } +} diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java new file mode 100644 index 0000000000..5c04740bfb --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java @@ -0,0 +1,18 @@ +package com.coding.basic.stack; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + return 0.0f; + } + + + + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java new file mode 100644 index 0000000000..7774cf98b0 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java @@ -0,0 +1,47 @@ +package com.coding.basic.stack; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java new file mode 100644 index 0000000000..f51a971a1c --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic.stack; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/List.java b/group17/102228177/work4_16/src/com/coding/basic/stack/List.java new file mode 100644 index 0000000000..2d2c693e0d --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/List.java @@ -0,0 +1,10 @@ +package com.coding.basic.stack; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..42b6362e2f --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData; + private int elementCount; + + public Stack() { + this.elementData = new ArrayList(); + this.elementCount = 0; + } + public void push(Object o){ + elementData.add(o); + elementCount++; + } + + public Object pop(){ + Object object = elementData.remove(elementCount-1); + elementCount--; + return object; + } + + public Object peek(){ + if(isEmpty()){ + throw new EmptyStackException(); + } + return elementData.get(elementCount-1); + } + public boolean isEmpty(){ + return elementCount==0; + } + public int size(){ + return elementCount; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < elementData.size(); i++) { + sb.append(elementData.get(i)).append(","); + } + sb = sb.deleteCharAt(sb.length()-1); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..33fd75f6f1 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,66 @@ +package com.coding.basic.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) { + if(!s.isEmpty()){ + Object last = getBottom(s,s.pop()); + reverse(s); + s.push(last); + } + } + + private static Object getBottom(Stack s,Object t){ + if(s.isEmpty()){ + return t; + } + Object last = getBottom(s, s.pop()); + s.push(t); + return last; + } + /** + * 删除栈中的某个元素 注意:只能使用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; + } + + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + reverse(stack); + System.out.println(stack); + } + +} \ No newline at end of file From c8dd9993228eb98914b0b4740e650bf04b27d8b0 Mon Sep 17 00:00:00 2001 From: xuxiqoqing Date: Sun, 16 Apr 2017 23:34:06 +0800 Subject: [PATCH 164/552] L6 --- .../datastructure/less6/expr/InfixExpr.java | 121 +++++++++ .../less6/expr/InfixExprTest.java | 47 ++++ .../github/vxzh/jvm/attr/AttributeInfo.java | 20 ++ .../src/io/github/vxzh/jvm/attr/CodeAttr.java | 116 ++++++++ .../github/vxzh/jvm/attr/LineNumberTable.java | 72 +++++ .../vxzh/jvm/attr/LocalVariableItem.java | 49 ++++ .../vxzh/jvm/attr/LocalVariableTable.java | 57 ++++ .../github/vxzh/jvm/attr/StackMapTable.java | 30 +++ .../io/github/vxzh/jvm/clz/AccessFlag.java | 26 ++ .../src/io/github/vxzh/jvm/clz/ClassFile.java | 106 ++++++++ .../io/github/vxzh/jvm/clz/ClassIndex.java | 22 ++ .../io/github/vxzh/jvm/clz/ConstantPool.java | 35 +++ .../github/vxzh/jvm/constant/ClassInfo.java | 30 +++ .../vxzh/jvm/constant/ConstantInfo.java | 42 +++ .../vxzh/jvm/constant/FieldRefInfo.java | 60 +++++ .../vxzh/jvm/constant/MethodRefInfo.java | 60 +++++ .../vxzh/jvm/constant/NameAndTypeInfo.java | 51 ++++ .../vxzh/jvm/constant/NullConstantInfo.java | 14 + .../github/vxzh/jvm/constant/StringInfo.java | 30 +++ .../io/github/vxzh/jvm/constant/UTF8Info.java | 40 +++ .../src/io/github/vxzh/jvm/field/Field.java | 48 ++++ .../vxzh/jvm/loader/ByteCodeIterator.java | 58 ++++ .../vxzh/jvm/loader/ClassFileLoader.java | 58 ++++ .../vxzh/jvm/loader/ClassFileParser.java | 188 +++++++++++++ .../src/io/github/vxzh/jvm/method/Method.java | 92 +++++++ .../vxzh/jvm/test/ClassFileloaderTest.java | 254 ++++++++++++++++++ .../io/github/vxzh/jvm/test/EmployeeV1.java | 29 ++ .../L6/src/io/github/vxzh/jvm/util/Util.java | 23 ++ 28 files changed, 1778 insertions(+) create mode 100644 group13/2729382520/L6/src/io/github/vxzh/datastructure/less6/expr/InfixExpr.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/datastructure/less6/expr/InfixExprTest.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/attr/AttributeInfo.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/attr/CodeAttr.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LineNumberTable.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LocalVariableItem.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LocalVariableTable.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/attr/StackMapTable.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/clz/AccessFlag.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ClassFile.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ClassIndex.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ConstantPool.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/constant/ClassInfo.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/constant/ConstantInfo.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/constant/FieldRefInfo.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/constant/MethodRefInfo.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/constant/NameAndTypeInfo.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/constant/NullConstantInfo.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/constant/StringInfo.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/constant/UTF8Info.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/field/Field.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ByteCodeIterator.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ClassFileLoader.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ClassFileParser.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/method/Method.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/test/ClassFileloaderTest.java create mode 100755 group13/2729382520/L6/src/io/github/vxzh/jvm/test/EmployeeV1.java create mode 100644 group13/2729382520/L6/src/io/github/vxzh/jvm/util/Util.java diff --git a/group13/2729382520/L6/src/io/github/vxzh/datastructure/less6/expr/InfixExpr.java b/group13/2729382520/L6/src/io/github/vxzh/datastructure/less6/expr/InfixExpr.java new file mode 100644 index 0000000000..f0f597e6cb --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/datastructure/less6/expr/InfixExpr.java @@ -0,0 +1,121 @@ +package io.github.vxzh.datastructure.less6.expr; + +import java.util.Stack; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + check(); + + Stack operateStack = new Stack(); + Stack numStack = new Stack(); + + char[] ch = expr.toCharArray(); + + for (int i = 0; i < ch.length; i++) { + + if (Character.isDigit(ch[i])) { + int tmp = Integer.parseInt("" + ch[i]); + while (i < ch.length - 1 && Character.isDigit(ch[++i])) { + tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + } + numStack.push(tmp); + + } + if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') { + operateStack.push(ch[i]); + } + + if (!(operateStack.isEmpty()) && (char) operateStack.peek() == '*') { + int tmp = Integer.parseInt("" + ch[++i]); + while (i < ch.length - 1 && Character.isDigit(ch[++i])) { + tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + } + if (i != ch.length - 1) { + i--; + } + numStack.push(tmp); + + int tmp1 = Integer.parseInt("" + numStack.pop()); + int tmp2 = Integer.parseInt("" + numStack.pop()); + numStack.push(tmp1 * tmp2); + operateStack.pop(); + + } + if (!(operateStack.isEmpty()) && (char) operateStack.peek() == '/') { + int tmp = Integer.parseInt("" + ch[++i]); + while (i < ch.length - 1 && Character.isDigit(ch[++i])) { + tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + } + if (i != ch.length - 1) { + i--; + } + numStack.push(tmp); + + int tmp1 = Integer.parseInt("" + numStack.pop()); + int tmp2 = Integer.parseInt("" + numStack.pop()); + numStack.push(tmp2 / tmp1); + operateStack.pop(); + } + } + // 将栈中的数字和运算法逆置,便于计算 + reverse(numStack); + reverse(operateStack); + + while (!(operateStack.isEmpty())) { + if ((char) operateStack.peek() == '+') { + int tmp1 = Integer.parseInt("" + numStack.pop()); + int tmp2 = Integer.parseInt("" + numStack.pop()); + numStack.push(tmp1 + tmp2); + } + + if ((char) operateStack.peek() == '-') { + int tmp1 = Integer.parseInt("" + numStack.pop()); + int tmp2 = Integer.parseInt("" + numStack.pop()); + numStack.push(tmp1 - tmp2); + } + operateStack.pop(); + } + + return Float.parseFloat("" + numStack.pop()); + } + + private void reverse(Stack s) { + + if (s.isEmpty()) { + return; + } + // 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。 + Object tmp1 = s.pop(); + reverse(s); + if (s.isEmpty()) { + s.push(tmp1); + return; + } + Object temp2 = s.pop(); + reverse(s); + s.push(tmp1); + reverse(s); + s.push(temp2); + + } + + private boolean check() { + if (expr.length() <= 0) { + return false; + } else if ('+' == expr.charAt(0) || '-' == expr.charAt(0) || '*' == expr.charAt(0) || '/' == expr.charAt(0)) { + return false; + } else if ('+' == expr.charAt(expr.length() - 1) || '-' == expr.charAt(expr.length() - 1) || '*' == expr.charAt(expr.length() - 1) || '/' == expr.charAt(expr.length() - 1)) { + return false; + } + + return true; + } + +} \ No newline at end of file diff --git a/group13/2729382520/L6/src/io/github/vxzh/datastructure/less6/expr/InfixExprTest.java b/group13/2729382520/L6/src/io/github/vxzh/datastructure/less6/expr/InfixExprTest.java new file mode 100644 index 0000000000..dbf63cea14 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/datastructure/less6/expr/InfixExprTest.java @@ -0,0 +1,47 @@ +package io.github.vxzh.datastructure.less6.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/AttributeInfo.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..cec3cd75f7 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/AttributeInfo.java @@ -0,0 +1,20 @@ +package io.github.vxzh.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/CodeAttr.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..de04b35cad --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/CodeAttr.java @@ -0,0 +1,116 @@ +package io.github.vxzh.jvm.attr; + + +import io.github.vxzh.jvm.clz.ClassFile; +import io.github.vxzh.jvm.clz.ConstantPool; +import io.github.vxzh.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + + int exceptionTableLen = iter.nextU2ToInt(); + //TODO 处理exception + if (exceptionTableLen > 0) { + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.nextU2ToInt(); + + for (int x = 1; x <= subAttrCount; x++) { + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + /*for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index, len); + + int itemLen = iter.nextU2ToInt(); + + for (int i = 1; i <= itemLen; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for (LineNumberItem item : items) { + buffer.append("startPC:" + item.getStartPC()).append(","); + buffer.append("lineNum:" + item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + +} \ No newline at end of file diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LocalVariableItem.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..a0e0f4286a --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LocalVariableItem.java @@ -0,0 +1,49 @@ +package io.github.vxzh.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LocalVariableTable.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..4993f6ce77 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/LocalVariableTable.java @@ -0,0 +1,57 @@ +package io.github.vxzh.jvm.attr; + + +import io.github.vxzh.jvm.clz.ConstantPool; +import io.github.vxzh.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter) { + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index, len); + + int itemLen = iter.nextU2ToInt(); + + for (int i = 1; i <= itemLen; i++) { + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for (LocalVariableItem item : items) { + buffer.append("startPC:" + item.getStartPC()).append(","); + buffer.append("name:" + pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:" + pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:" + item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} \ No newline at end of file diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/StackMapTable.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..4538a51d42 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package io.github.vxzh.jvm.attr; + + +import io.github.vxzh.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo { + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter) { + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index, len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/AccessFlag.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/AccessFlag.java new file mode 100755 index 0000000000..4c3a3c8900 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/AccessFlag.java @@ -0,0 +1,26 @@ +package io.github.vxzh.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/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ClassFile.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ClassFile.java new file mode 100755 index 0000000000..93adf1976a --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ClassFile.java @@ -0,0 +1,106 @@ +package io.github.vxzh.jvm.clz; + +import io.github.vxzh.jvm.constant.ClassInfo; +import io.github.vxzh.jvm.field.Field; +import io.github.vxzh.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + + 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 addField(Field f) { + this.fields.add(f); + } + + public List getFields() { + return this.fields; + } + + public void addMethod(Method m) { + this.methods.add(m); + } + + public List getMethods() { + return methods; + } + + + 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/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ClassIndex.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ClassIndex.java new file mode 100755 index 0000000000..4500959430 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ClassIndex.java @@ -0,0 +1,22 @@ +package io.github.vxzh.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/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ConstantPool.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ConstantPool.java new file mode 100755 index 0000000000..b96e330020 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/clz/ConstantPool.java @@ -0,0 +1,35 @@ +package io.github.vxzh.jvm.clz; + +import io.github.vxzh.jvm.constant.ConstantInfo; +import io.github.vxzh.jvm.constant.UTF8Info; + +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/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/ClassInfo.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/ClassInfo.java new file mode 100755 index 0000000000..c9586ee16c --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/ClassInfo.java @@ -0,0 +1,30 @@ +package io.github.vxzh.jvm.constant; + +import io.github.vxzh.jvm.clz.ConstantPool; + +public class ClassInfo extends ConstantInfo { + private int tag = ConstantInfo.CONSTANT_CLASS_INFO; + private int nameIndex; + + public ClassInfo(ConstantPool pool) { + super(pool); + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getTag() { + return tag; + } + + public String getClassName() { + int index = getNameIndex(); + UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/ConstantInfo.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/ConstantInfo.java new file mode 100755 index 0000000000..0f3d63685c --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/ConstantInfo.java @@ -0,0 +1,42 @@ +package io.github.vxzh.jvm.constant; + +import io.github.vxzh.jvm.clz.ConstantPool; + +public abstract class ConstantInfo { + + public static final int CONSTANT_UTF8_INFO = 1;// + public static final int CONSTANT_INTEGER_INFO = 3; + public static final int CONSTANT_FLOAT_INFO = 4;// + public static final int CONSTANT_LONG_INFO = 5; + public static final int CONSTANT_DOUBLE_INFO = 6; + public static final int CONSTANT_CLASS_INFO = 7;// + public static final int CONSTANT_STRING_INFO = 8;// + public static final int CONSTANT_FIELDREF_INFO = 9;// + public static final int CONSTANT_METHODREF_INFO = 10;// + public static final int CONSTANT_INTERFACEMETHODREF_INFO = 11; + public static final int CONSTANT_NAMEANDTYPE_INFO = 12;// + public static final int CONSTANT_METHODHANDLE_INFO = 15; + public static final int CONSTANT_METHODTYPE_INFO = 16; + public static final int CONSTANT_INVOKEDYNAMIC_INFO = 18; + + protected ConstantPool constantPool; + + public ConstantInfo() { + + } + + public ConstantInfo(ConstantPool pool) { + this.constantPool = pool; + } + + public abstract int getTag(); + + public ConstantPool getConstantPool() { + return constantPool; + } + + public ConstantInfo getConstantInfo(int index) { + return this.constantPool.getConstantInfo(index); + } + +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/FieldRefInfo.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/FieldRefInfo.java new file mode 100755 index 0000000000..f39bc87b72 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/FieldRefInfo.java @@ -0,0 +1,60 @@ +package io.github.vxzh.jvm.constant; + +import io.github.vxzh.jvm.clz.ConstantPool; + +public class FieldRefInfo extends ConstantInfo { + private int tag = ConstantInfo.CONSTANT_FIELDREF_INFO; + private int classInfoIndex; + private int nameAndTypeIndex; + + public FieldRefInfo(ConstantPool pool) { + super(pool); + } + + public int getTag() { + return tag; + } + + 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.getNameIndex()); + + 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/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/MethodRefInfo.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/MethodRefInfo.java new file mode 100755 index 0000000000..46535b7769 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package io.github.vxzh.jvm.constant; + +import io.github.vxzh.jvm.clz.ConstantPool; + +public class MethodRefInfo extends ConstantInfo { + + private int tag = ConstantInfo.CONSTANT_METHODREF_INFO; + + private int classInfoIndex; + private int nameAndTypeIndex; + + public MethodRefInfo(ConstantPool pool) { + super(pool); + } + + public int getTag() { + return tag; + } + + 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/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/NameAndTypeInfo.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/NameAndTypeInfo.java new file mode 100755 index 0000000000..a081902eac --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package io.github.vxzh.jvm.constant; + +import io.github.vxzh.jvm.clz.ConstantPool; + +public class NameAndTypeInfo extends ConstantInfo { + public int tag = ConstantInfo.CONSTANT_NAMEANDTYPE_INFO; + + private int nameIndex; + private int descriptorIndex; + + public NameAndTypeInfo(ConstantPool pool) { + super(pool); + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public void setDescriptorIndex(int descriptorIndex) { + this.descriptorIndex = descriptorIndex; + } + + public int getTag() { + return tag; + } + + + public String getName() { + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(nameIndex); + return utf8Info1.getValue(); + } + + public String getTypeInfo() { + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(descriptorIndex); + return utf8Info2.getValue(); + } + + public String toString() { + return "(" + getName() + "," + getTypeInfo() + ")"; + } +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/NullConstantInfo.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/NullConstantInfo.java new file mode 100755 index 0000000000..1d1d8394f9 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/NullConstantInfo.java @@ -0,0 +1,14 @@ +package io.github.vxzh.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getTag() { + return -1; + } + +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/StringInfo.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/StringInfo.java new file mode 100755 index 0000000000..e5175eed4a --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/StringInfo.java @@ -0,0 +1,30 @@ +package io.github.vxzh.jvm.constant; + +import io.github.vxzh.jvm.clz.ConstantPool; + +public class StringInfo extends ConstantInfo { + private int tag = ConstantInfo.CONSTANT_STRING_INFO; + private int index; + + public StringInfo(ConstantPool pool) { + super(pool); + } + + public int getTag() { + return tag; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + + public String toString() { + return this.getConstantPool().getUTF8String(index); + } + +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/UTF8Info.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/UTF8Info.java new file mode 100755 index 0000000000..e1fb81006b --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/constant/UTF8Info.java @@ -0,0 +1,40 @@ +package io.github.vxzh.jvm.constant; + +import io.github.vxzh.jvm.clz.ConstantPool; + +public class UTF8Info extends ConstantInfo { + private int tag = ConstantInfo.CONSTANT_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 getTag() { + return tag; + } + + @Override + public String toString() { + return "UTF8Info [tag=" + tag + ", length=" + length + ", value=" + value + ")]"; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/field/Field.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/field/Field.java new file mode 100644 index 0000000000..7bb54a6b0c --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/field/Field.java @@ -0,0 +1,48 @@ +package io.github.vxzh.jvm.field; + + +import io.github.vxzh.jvm.clz.ClassFile; +import io.github.vxzh.jvm.constant.UTF8Info; +import io.github.vxzh.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private ClassFile clzFile; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ClassFile clzFile) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.clzFile = clzFile; + } + + public String toString() { + String name = ((UTF8Info) clzFile.getConstantPool().getConstantInfo(this.nameIndex)).getValue(); + String desc = ((UTF8Info) clzFile.getConstantPool().getConstantInfo(this.descriptorIndex)).getValue(); + return name + ":" + desc; + } + + + public static Field parse(ClassFile clzFile, ByteCodeIterator iter) { + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex, clzFile); + + if (attribCount > 0) { + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} + + diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ByteCodeIterator.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..f3744d85b5 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,58 @@ +package io.github.vxzh.jvm.loader; + +import io.github.vxzh.jvm.util.Util; + +import java.util.Arrays; + +public class ByteCodeIterator { + + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[]{codes[pos++], codes[pos++]}); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]})); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } + + +} \ No newline at end of file diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ClassFileLoader.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ClassFileLoader.java new file mode 100755 index 0000000000..275e9da3ac --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ClassFileLoader.java @@ -0,0 +1,58 @@ +package io.github.vxzh.jvm.loader; + +import io.github.vxzh.jvm.clz.ClassFile; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +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; + } + + public void addClassPath(String path) { + if (this.clzPaths.contains(path)) { + return; + } + clzPaths.add(path); + } + + public String getClassPath() { + return StringUtils.join(this.clzPaths, ";"); + } + + 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 ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } + +} \ No newline at end of file diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ClassFileParser.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..4f5bafddbe --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/loader/ClassFileParser.java @@ -0,0 +1,188 @@ +package io.github.vxzh.jvm.loader; + +import io.github.vxzh.jvm.clz.AccessFlag; +import io.github.vxzh.jvm.clz.ClassFile; +import io.github.vxzh.jvm.clz.ClassIndex; +import io.github.vxzh.jvm.clz.ConstantPool; +import io.github.vxzh.jvm.constant.ClassInfo; +import io.github.vxzh.jvm.constant.FieldRefInfo; +import io.github.vxzh.jvm.constant.MethodRefInfo; +import io.github.vxzh.jvm.constant.NameAndTypeInfo; +import io.github.vxzh.jvm.constant.NullConstantInfo; +import io.github.vxzh.jvm.constant.StringInfo; +import io.github.vxzh.jvm.constant.UTF8Info; +import io.github.vxzh.jvm.field.Field; +import io.github.vxzh.jvm.method.Method; + +import java.io.UnsupportedEncodingException; + +import static io.github.vxzh.jvm.constant.ConstantInfo.CONSTANT_CLASS_INFO; +import static io.github.vxzh.jvm.constant.ConstantInfo.CONSTANT_FIELDREF_INFO; +import static io.github.vxzh.jvm.constant.ConstantInfo.CONSTANT_METHODREF_INFO; +import static io.github.vxzh.jvm.constant.ConstantInfo.CONSTANT_NAMEANDTYPE_INFO; +import static io.github.vxzh.jvm.constant.ConstantInfo.CONSTANT_STRING_INFO; +import static io.github.vxzh.jvm.constant.ConstantInfo.CONSTANT_UTF8_INFO; + +public class ClassFileParser { + + + public ClassFile parse(byte[] codes) { + + ClassFile clzFile = new ClassFile(); + + ByteCodeIterator iter = new ByteCodeIterator(codes); + + //验证魔数 + String magicNumber = iter.nextU4ToHexString(); + if (!"cafebabe".equals(magicNumber)) { + return null; + } + + //解析次版本号和主版本号 + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + + //解析常量池 + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstPool(pool); + + //解析访问标志 + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + //解析类索引和父类索引 + ClassIndex clzIndex = parseClassInfex(iter); + clzFile.setClassIndex(clzIndex); + + //解析接口 + parseInterfaces(iter); + + //解析字段表集合 + parseFileds(clzFile, iter); + + //解析方法表集合 + parseMethods(clzFile, iter); + + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + // System.out.println("Is public class: " + flag.isPublicClass()); + // System.out.println("Is final class : " + flag.isFinalClass()); + + return flag; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + + ClassIndex clzIndex = new ClassIndex(); + + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + + return clzIndex; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + + int constPoolCount = iter.nextU2ToInt(); + + System.out.println("Constant Pool Count :" + constPoolCount); + + ConstantPool pool = new ConstantPool(); + + pool.addConstantInfo(new NullConstantInfo()); + + for (int i = 1; i <= constPoolCount - 1; i++) { + + int tag = iter.nextU1toInt(); + + if (tag == CONSTANT_CLASS_INFO) {//7 + // Class Info + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setNameIndex(utf8Index); + pool.addConstantInfo(clzInfo); + } else if (tag == CONSTANT_UTF8_INFO) {//1 + // UTF-8 String + int len = iter.nextU2ToInt(); + byte[] data = iter.getBytes(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + } else if (tag == CONSTANT_STRING_INFO) {//8 + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == CONSTANT_FIELDREF_INFO) {//9 + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == CONSTANT_METHODREF_INFO) {//10 + // MethodRef + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == CONSTANT_NAMEANDTYPE_INFO) {//12 + // Name and Type Info + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setNameIndex(iter.nextU2ToInt()); + nameType.setDescriptorIndex(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet."); + } + } + + System.out.println("Finished reading Constant pool "); + + return pool; + } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { + int fieldCount = iter.nextU2ToInt(); + + for (int i = 1; i <= fieldCount; i++) { + Field f = Field.parse(clzFile, iter); + clzFile.addField(f); + } + + } + + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + + int methodCount = iter.nextU2ToInt(); + + for (int i = 1; i <= methodCount; i++) { + Method m = Method.parse(clzFile, iter); + clzFile.addMethod(m); + } + + } + + +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/method/Method.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/method/Method.java new file mode 100644 index 0000000000..40d88910e3 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/method/Method.java @@ -0,0 +1,92 @@ +package io.github.vxzh.jvm.method; + + +import io.github.vxzh.jvm.attr.AttributeInfo; +import io.github.vxzh.jvm.attr.CodeAttr; +import io.github.vxzh.jvm.clz.ClassFile; +import io.github.vxzh.jvm.clz.ConstantPool; +import io.github.vxzh.jvm.constant.UTF8Info; +import io.github.vxzh.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private CodeAttr codeAttr; + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + for (int i = 0; i < attribCount; i++) { + + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if (AttributeInfo.CODE.equalsIgnoreCase(attrName)) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else { + throw new RuntimeException("only CODE attribute is implemented , please implement the " + attrName); + } + + } + + return m; + + } + + +} diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/test/ClassFileloaderTest.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/test/ClassFileloaderTest.java new file mode 100755 index 0000000000..b8defc4b12 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,254 @@ +package io.github.vxzh.jvm.test; + +import io.github.vxzh.jvm.clz.ClassFile; +import io.github.vxzh.jvm.clz.ClassIndex; +import io.github.vxzh.jvm.clz.ConstantPool; +import io.github.vxzh.jvm.constant.ClassInfo; +import io.github.vxzh.jvm.constant.MethodRefInfo; +import io.github.vxzh.jvm.constant.NameAndTypeInfo; +import io.github.vxzh.jvm.constant.UTF8Info; +import io.github.vxzh.jvm.field.Field; +import io.github.vxzh.jvm.loader.ClassFileLoader; +import io.github.vxzh.jvm.method.Method; + +import io.github.vxzh.jvm.util.Util; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +public class ClassFileloaderTest { + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + static String path1 = "/Users/xuxiaoqing/Workspace/test"; + static String path2 = "/Users/xuxiaoqing/Documents/demo"; + + static ClassFile clzFile = null; + + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "io.github.vxzh.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "io.github.vxzh.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "io.github.vxzh.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; + + + String acctualValue = Util.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool() { + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getNameIndex()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getNameIndex()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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.getNameIndex()); + Assert.assertEquals(14, nameAndType.getDescriptorIndex()); + } + //抽查几个吧 + { + 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields() { + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + + @Test + public void testMethods() { + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool, m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool, m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool, m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool, m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool, m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool, Method m, String expectedName, String expectedDesc, String expectedCode) { + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + +} \ No newline at end of file diff --git a/group13/2729382520/L6/src/io/github/vxzh/jvm/test/EmployeeV1.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/test/EmployeeV1.java new file mode 100755 index 0000000000..87e05ff033 --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/test/EmployeeV1.java @@ -0,0 +1,29 @@ +package io.github.vxzh.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/group13/2729382520/L6/src/io/github/vxzh/jvm/util/Util.java b/group13/2729382520/L6/src/io/github/vxzh/jvm/util/Util.java new file mode 100644 index 0000000000..9a659ef3eb --- /dev/null +++ b/group13/2729382520/L6/src/io/github/vxzh/jvm/util/Util.java @@ -0,0 +1,23 @@ +package io.github.vxzh.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } +} \ No newline at end of file From 65070ef6414dabe3da9cdc971a79fd350387847a Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Mon, 17 Apr 2017 09:16:31 +0800 Subject: [PATCH 165/552] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=AC=A1jvm=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第三次jvm作业 --- .../coderising/jvm/attr/AttributeInfo.java | 19 +++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 85 +++++++++++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 51 +++++++++++ .../jvm/attr/LocalVariableItem.java | 39 +++++++++ .../jvm/attr/LocalVariableTable.java | 40 +++++++++ .../coderising/jvm/attr/StackMapTable.java | 30 +++++++ .../src/com/coderising/jvm/clz/ClassFile.java | 29 +++++++ .../src/com/coderising/jvm/field/Field.java | 45 ++++++++++ .../jvm/loader/ByteCodeIterator.java | 13 ++- .../jvm/loader/ClassFileParser.java | 38 ++++++++- .../src/com/coderising/jvm/method/Method.java | 79 +++++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 74 ++++++++++++++++ 12 files changed, 540 insertions(+), 2 deletions(-) create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/method/Method.java diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..56c3bf2b0c --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + System.out.println(code); + CodeAttr attr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + int expTableLen = iter.nextU2ToInt(); + if(expTableLen > 0){ + String expTable = iter.nextUxToHexString(expTableLen); + System.out.println("expTable: " + expTable); + // TODO 异常表处理 + } + int subAttrCount = iter.nextU2ToInt(); + ConstantPool pool = clzFile.getConstantPool(); + for (int i = 1; i <= subAttrCount; i++) { + int subAttrNameIndex = iter.nextU2ToInt(); + String subAttrName = pool.getUTF8String(subAttrNameIndex); + iter.back(2); + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + attr.setLineNumberTable(LineNumberTable.parse(iter)); + }else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + attr.setLocalVariableTable(LocalVariableTable.parse(iter)); + }else if(AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + attr.setStackMapTable(StackMapTable.parse(iter)); + }else{ + //TODO + throw new RuntimeException("CodeAttr.parse not implement " + subAttrName); + } + } + return attr; + } + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..f83202d6c3 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,51 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LineNumberTable table = new LineNumberTable(attrNameIndex, attrLen); + int lineNumberTableLen = iter.nextU2ToInt(); + for(int i=0;i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(attrNameIndex, attrLen); + int localVarLen = iter.nextU2ToInt(); + for(int i=0;i fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + + public ConstantPool getPool() { + return pool; + } + public void setPool(ConstantPool pool) { + this.pool = pool; + } + public List getMethods() { + return methods; + } + public void setMethods(List methods) { + this.methods = methods; + } + public void setClzIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } public ClassIndex getClzIndex() { return clzIndex; } @@ -72,4 +95,10 @@ private String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + public List getFields() { + return fields; + } + public void setFields(List fields) { + this.fields = fields; + } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..01a009331c --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + Field field = new Field(accessFlag, nameIndex, descriptorIndex, pool); + int attCount = iter.nextU2ToInt(); + if(attCount > 0){ + //TODO handle field attrs + throw new RuntimeException("Field.attr not implements"); + } + return field; + } + + public String toString() { + return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex); + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java index 0fab88f9cb..c0c4598800 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,7 @@ package com.coderising.jvm.loader; +import java.io.UnsupportedEncodingException; + public class ByteCodeIterator { private byte[] codes; @@ -45,7 +47,16 @@ public String nextUxToString(int len){ for(int i=0;i parseMethod(ByteCodeIterator iter, ClassFile classFile) { + List methods = new ArrayList<>(); + int mthodsCount = iter.nextU2ToInt(); + for(int i=0;i prarseField(ByteCodeIterator iter, ConstantPool pool) { + List fields = new ArrayList<>(); + int fieldsCount = iter.nextU2ToInt(); + for(int i=0;i fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } From 3fc8b7880c23b0b8f626a1422c3915e4336abfc5 Mon Sep 17 00:00:00 2001 From: "kaitao.li" Date: Mon, 17 Apr 2017 09:32:17 +0800 Subject: [PATCH 166/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A,=20=E5=9F=BA=E6=9C=AC=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/jvm/attr/AttributeInfo.java | 20 ++++++++ .../com/coding2017/jvm/attr/CodeAttr.java | 21 +++++++-- .../coding2017/jvm/attr/LineNumberTable.java | 3 +- .../jvm/attr/LocalVariableTable.java | 3 +- .../coding2017/jvm/attr/StackMapTable.java | 3 +- .../java/com/coding2017/jvm/field/Field.java | 46 +++++++++---------- .../jvm/loader/ClassFileParser.java | 10 ++++ .../com/coding2017/jvm/method/Method.java | 17 +++++++ 8 files changed, 94 insertions(+), 29 deletions(-) diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/AttributeInfo.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/AttributeInfo.java index 2ec4931cac..d4678de264 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/AttributeInfo.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/AttributeInfo.java @@ -1,5 +1,8 @@ package com.coding2017.jvm.attr; +import com.coding2017.jvm.clz.ClassFile; +import com.coding2017.jvm.loader.ByteCodeIterator; + public abstract class AttributeInfo { public static final String CODE = "Code"; public static final String CONST_VALUE = "ConstantValue"; @@ -16,4 +19,21 @@ public AttributeInfo(int attrNameIndex, int attrLen) { this.attrLen = attrLen; } + public static AttributeInfo parse(ClassFile clzFile, ByteCodeIterator iter) { + int nameIndex = iter.nextU2ToInt(); + String name = clzFile.getConstantPool().getUTF8String(nameIndex); + int length = iter.nextU4ToInt(); + if (AttributeInfo.CODE.equals(name)) { + return CodeAttr.parse(clzFile, iter, nameIndex, length); + } else if (AttributeInfo.LINE_NUM_TABLE.equals(name)) { + return LineNumberTable.parse(clzFile, iter, nameIndex, length); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equals(name)) { + return LocalVariableTable.parse(clzFile, iter, nameIndex, length); + } else if (AttributeInfo.STACK_MAP_TABLE.equals(name)) { + return StackMapTable.parse(clzFile, iter, nameIndex, length); + } else { + throw new RuntimeException("not support attribute " + name); + } + } + } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java index a0a52ca70c..93bebc2dc7 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java @@ -39,9 +39,24 @@ public void setLocalVariableTable(LocalVariableTable t) { this.localVarTable = t; } - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { - - return null; + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter, int nameIndex, int length) { + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLength = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLength); + CodeAttr codeAttr = new CodeAttr(nameIndex, length, maxStack, maxLocals, codeLength, code); + int codeAttributeCount = iter.nextU2ToInt(); + for (int j = 0; j < codeAttributeCount; j++) { + AttributeInfo attributeInfo = AttributeInfo.parse(clzFile, iter); + if (attributeInfo instanceof LineNumberTable) { + codeAttr.setLineNumberTable((LineNumberTable) attributeInfo); + } else if (attributeInfo instanceof LocalVariableTable) { + codeAttr.setLocalVariableTable((LocalVariableTable) attributeInfo); + } else if (attributeInfo instanceof StackMapTable) { + codeAttr.setStackMapTable((StackMapTable) attributeInfo); + } + } + return codeAttr; } private void setStackMapTable(StackMapTable t) { diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java index 9449eafc1f..2878f874ed 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java @@ -1,5 +1,6 @@ package com.coding2017.jvm.attr; +import com.coding2017.jvm.clz.ClassFile; import com.coding2017.jvm.loader.ByteCodeIterator; import java.util.ArrayList; @@ -38,7 +39,7 @@ public LineNumberTable(int attrNameIndex, int attrLen) { } - public static LineNumberTable parse(ByteCodeIterator iter) { + public static LineNumberTable parse(ClassFile clzFile, ByteCodeIterator iter, int nameIndex, int length) { return null; } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java index 41dfb68e87..23dff851c8 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java @@ -1,5 +1,6 @@ package com.coding2017.jvm.attr; +import com.coding2017.jvm.clz.ClassFile; import com.coding2017.jvm.loader.ByteCodeIterator; import java.util.ArrayList; @@ -13,7 +14,7 @@ public LocalVariableTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - public static LocalVariableTable parse(ByteCodeIterator iter) { + public static LocalVariableTable parse(ClassFile clzFile, ByteCodeIterator iter, int nameIndex, int length) { return null; } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java index a9fab7c2e8..653ecab830 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java @@ -1,5 +1,6 @@ package com.coding2017.jvm.attr; +import com.coding2017.jvm.clz.ClassFile; import com.coding2017.jvm.loader.ByteCodeIterator; public class StackMapTable extends AttributeInfo { @@ -10,7 +11,7 @@ public StackMapTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - public static StackMapTable parse(ByteCodeIterator iter) { + public static StackMapTable parse(ClassFile clzFile, ByteCodeIterator iter, int nameIndex, int length) { int index = iter.nextU2ToInt(); int len = iter.nextU4ToInt(); StackMapTable t = new StackMapTable(index, len); diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java index 3439d9c8bf..d521fca4e3 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java @@ -1,32 +1,32 @@ package com.coding2017.jvm.field; - import com.coding2017.jvm.constant.ConstantPool; import com.coding2017.jvm.loader.ByteCodeIterator; public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } - - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - return null; - } + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributeCount = iter.nextU2ToInt(); + if (attributeCount != 0) { + throw new RuntimeException("not parse field attribute"); + } + return new Field(accessFlag, nameIndex, descriptorIndex, pool); + } } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java index b684d1774d..87cf762ac4 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java @@ -4,6 +4,8 @@ import com.coding2017.jvm.clz.ClassFile; import com.coding2017.jvm.clz.ClassIndex; import com.coding2017.jvm.constant.*; +import com.coding2017.jvm.field.Field; +import com.coding2017.jvm.method.Method; public class ClassFileParser { @@ -32,6 +34,10 @@ public ClassFile parse(byte[] codes) { parseInterfaces(iterator); + Field.parse(classFile.getConstantPool(), iterator); + + Method.parse(classFile, iterator); + return classFile; } @@ -103,6 +109,10 @@ private void parseInterfaces(ByteCodeIterator iter) { System.out.println("interfaceCount:" + interfaceCount); + if (interfaceCount != 0) { + throw new RuntimeException("not parse interface"); + } + // TODO : 如果实现了interface, 这里需要解析 } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java index 9969d5dcf0..90ad8dec1e 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java @@ -1,5 +1,6 @@ package com.coding2017.jvm.method; +import com.coding2017.jvm.attr.AttributeInfo; import com.coding2017.jvm.attr.CodeAttr; import com.coding2017.jvm.clz.ClassFile; import com.coding2017.jvm.loader.ByteCodeIterator; @@ -42,7 +43,23 @@ public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIn } public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + Method method = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); + + method.parseAttributes(iter); return null; } + + private void parseAttributes(ByteCodeIterator iter) { + int methodAttributeCount = iter.nextU2ToInt(); + for (int i = 0; i < methodAttributeCount; i++) { + AttributeInfo attributeInfo = AttributeInfo.parse(this.clzFile, iter); + if (attributeInfo instanceof CodeAttr) { + this.setCodeAttr((CodeAttr) attributeInfo); + } + } + } } From db9ab4e74833bbc187dc7dcd970496f3395f0210 Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Mon, 17 Apr 2017 15:55:05 +0800 Subject: [PATCH 167/552] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=BA=A0=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/jvm/attr/CodeAttr.java | 74 ++++++++++++++----- .../coderising/jvm/attr/LineNumberTable.java | 15 +++- .../jvm/attr/LocalVariableTable.java | 35 ++++++--- .../com/coderising/jvm/field/Field.java | 18 ++++- .../jvm/loader/ClassFileParser.java | 24 ++---- .../com/coderising/jvm/method/Method.java | 44 ++++++++--- 6 files changed, 149 insertions(+), 61 deletions(-) diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java index 63f4503244..b2779f1b70 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java @@ -3,30 +3,32 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.loader.ByteCodeIterator; -public class CodeAttr extends AttributeInfo{ - private int maxStack ; - private int maxLocals ; - private int codeLen ; +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; private String code; + public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + // private ByteCodeCommand[] cmds ; + // public ByteCodeCommand[] getCmds() { + // return cmds; + // } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, + String code /* ByteCodeCommand[] cmds */) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + // this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -34,16 +36,54 @@ public void setLineNumberTable(LineNumberTable t) { } public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; + this.localVarTable = t; } - + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - - return null; + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Integer(); + int maxStack = iter.nextU2Int(); + int maxLocals = iter.nextU2Int(); + + int length = iter.nextU4Integer(); + String code = iter.nextUxToHexString(length); + + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, length, code); + + int exceptionTableLength = iter.nextU2Int(); + if (exceptionTableLength > 0) { + String exceptionTable = iter.nextUxToHexString(exceptionTableLength); + throw new RuntimeException("解析异常表异常:"+exceptionTable); + } + + int attributesCount = iter.nextU2Int(); + for (int i = 0; i < attributesCount; i++) { + int subAttributeNameIndex = iter.nextU2Int(); + iter.back(2); + + String subAttributeName = clzFile.getConstantPool().getUTF8String(subAttributeNameIndex); + + if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { + + LineNumberTable lineNumberTable = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(lineNumberTable); + + } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LOCAL_VAR_TABLE)) { + + LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(localVariableTable); + + } else { + throw new RuntimeException("解析subAttribute异常-subAttributeName:"+subAttributeName); + } + + } + + return codeAttr; } + private void setStackMapTable(StackMapTable t) { this.stackMapTable = t; - + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java index 0e072f6d66..9c87155ca3 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java @@ -5,7 +5,7 @@ import com.coderising.jvm.loader.ByteCodeIterator; -public class LineNumberTable extends AttributeInfo{ +public class LineNumberTable extends AttributeInfo { List items = new ArrayList(); private static class LineNumberItem { @@ -39,8 +39,19 @@ public LineNumberTable(int attrNameIndex, int attrLen) { } public static LineNumberTable parse(ByteCodeIterator iter) { + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Integer(); + LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex, attributeLength); + + int lineNumberTableLength = iter.nextU2Int(); + for (int i = 0; i < lineNumberTableLength; i++) { + LineNumberItem lineNumberItem = new LineNumberItem(); + lineNumberItem.setStartPC(iter.nextU2Int()); + lineNumberItem.setLineNum(iter.nextU2Int()); + lineNumberTable.addLineNumberItem(lineNumberItem); + } - return null; + return lineNumberTable; } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java index e69728e6aa..abbdae87d5 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java @@ -5,21 +5,36 @@ import com.coderising.jvm.loader.ByteCodeIterator; -public class LocalVariableTable extends AttributeInfo{ +public class LocalVariableTable extends AttributeInfo { List items = new ArrayList(); - + public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen); } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; + + public static LocalVariableTable parse(ByteCodeIterator iter) { + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Integer(); + + LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex, attributeLength); + + int localVariableTableLength = iter.nextU2Int(); + for (int i = 0; i < localVariableTableLength; i++) { + LocalVariableItem localVariableItem = new LocalVariableItem(); + localVariableItem.setStartPC(iter.nextU2Int()); + localVariableItem.setLength(iter.nextU2Int()); + localVariableItem.setNameIndex(iter.nextU2Int()); + localVariableItem.setDescIndex(iter.nextU2Int()); + localVariableItem.setIndex(iter.nextU2Int()); + localVariableTable.addLocalVariableItem(localVariableItem); + } + + return localVariableTable; } + private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); + this.items.add(item); } - - + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java index 98fcbf5469..1d03d962e4 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java @@ -21,8 +21,22 @@ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool po } public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - return null; + Field field = new Field(iter.nextU2Int(), iter.nextU2Int(), iter.nextU2Int(),pool); + int attributeCount=iter.nextU2Int(); + System.out.println("attributeCount:"+attributeCount); + for(int j=0;j fields = parseField(by,constant); - List methods = parseMethod(by,file); - file.setMinorVersion(minVersion); file.setMajorVersion(majorVersion); file.setAccessFlag(flag); file.setClassIndex(index); file.setConstPool(constant); + List fields = parseField(by,constant); + List methods = parseMethod(by,file); + + for(Field field:fields){ file.addField(field); } @@ -130,14 +131,7 @@ private List parseField(ByteCodeIterator by,ConstantPool pool) { List result = new ArrayList(); int fieldCount = by.nextU2Int(); for(int i=0;i parseMethod(ByteCodeIterator by,ClassFile file) { List result = new ArrayList(); int methodCount = by.nextU2Int(); for(int i=0;i Date: Mon, 17 Apr 2017 16:34:35 +0800 Subject: [PATCH 168/552] =?UTF-8?q?Signed-off-by:=20JVM=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=AC=A1<996108220@qq.com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/attr/AttributeInfo.java | 19 ++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 56 +++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 48 ++++++++++ .../jvm/attr/LocalVariableItem.java | 39 ++++++++ .../jvm/attr/LocalVariableTable.java | 37 ++++++++ .../coderising/jvm/attr/StackMapTable.java | 30 ++++++ .../src/com/coderising/jvm/clz/ClassFile.java | 21 ++++- .../src/com/coderising/jvm/field/Field.java | 33 +++++++ .../jvm/loader/ByteCodeIterator.java | 6 ++ .../jvm/loader/ClassFileParser.java | 74 ++++++++++++++- .../src/com/coderising/jvm/method/Method.java | 55 +++++++++++ .../src/com/coding/basic/stack/InfixExpr.java | 92 +++++++++++++++++++ .../com/coding/basic/stack/StackUtilTest.java | 19 ++++ 13 files changed, 526 insertions(+), 3 deletions(-) create mode 100644 group11/996108220/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group11/996108220/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group11/996108220/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group11/996108220/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group11/996108220/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group11/996108220/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group11/996108220/src/com/coderising/jvm/field/Field.java create mode 100644 group11/996108220/src/com/coderising/jvm/method/Method.java create mode 100644 group11/996108220/src/com/coding/basic/stack/InfixExpr.java diff --git a/group11/996108220/src/com/coderising/jvm/attr/AttributeInfo.java b/group11/996108220/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..89fb53394e --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group11/996108220/src/com/coderising/jvm/attr/CodeAttr.java b/group11/996108220/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..aeb0d91f16 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ;//u4 + private int maxLocals ;//u2 + private int codeLen ;// + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + + return null; + } + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + + + + +} diff --git a/group11/996108220/src/com/coderising/jvm/attr/LineNumberTable.java b/group11/996108220/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..415c7b329b --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,48 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public void parse(ByteCodeIterator iter){ + int count=iter.nextU2ToInt(); + for (int j = 0; j items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public void parse(ByteCodeIterator iter){ + int count=iter.nextU2ToInt(); + for (int i = 0; i < count; i++) { + LocalVariableItem item=new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + this.addLocalVariableItem(item); + } + + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group11/996108220/src/com/coderising/jvm/attr/StackMapTable.java b/group11/996108220/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..b1da6c79f7 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + //String code = iter.nextUxToHexString(len); + //t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group11/996108220/src/com/coderising/jvm/clz/ClassFile.java b/group11/996108220/src/com/coderising/jvm/clz/ClassFile.java index 8575f5641a..5fb4b5c922 100644 --- a/group11/996108220/src/com/coderising/jvm/clz/ClassFile.java +++ b/group11/996108220/src/com/coderising/jvm/clz/ClassFile.java @@ -1,7 +1,12 @@ package com.coderising.jvm.clz; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFile { @@ -10,7 +15,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -46,7 +52,18 @@ public void setConstPool(ConstantPool pool) { public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } diff --git a/group11/996108220/src/com/coderising/jvm/field/Field.java b/group11/996108220/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..07d4633599 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,33 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag;//u2 + private int nameIndex;//u2 + private int descriptorIndex;//u2 + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + return null; + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group11/996108220/src/com/coderising/jvm/loader/ByteCodeIterator.java index a151decad8..e9400b2cfd 100644 --- a/group11/996108220/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group11/996108220/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -1,6 +1,7 @@ package com.coderising.jvm.loader; import java.util.Arrays; + import com.coderising.jvm.util.Util; @@ -47,5 +48,10 @@ public byte[] getByte(int length) { cursor=cursor+length; return Arrays.copyOfRange(codes,i, cursor); } + public String getString(int codeLen) { + int i=cursor; + cursor=cursor+codeLen; + return Arrays.copyOfRange(codes,i, cursor).toString(); + } } diff --git a/group11/996108220/src/com/coderising/jvm/loader/ClassFileParser.java b/group11/996108220/src/com/coderising/jvm/loader/ClassFileParser.java index ac55f25e0e..2b705bb4dc 100644 --- a/group11/996108220/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group11/996108220/src/com/coderising/jvm/loader/ClassFileParser.java @@ -1,4 +1,7 @@ package com.coderising.jvm.loader; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.attr.LineNumberTable; +import com.coderising.jvm.attr.LocalVariableTable; import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; @@ -10,7 +13,10 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; import com.coderising.jvm.util.Util; +import com.sun.org.apache.bcel.internal.classfile.LineNumber; public class ClassFileParser { @@ -23,12 +29,78 @@ public ClassFile parse(byte[] codes) { ClassFile classFile=new ClassFile(); classFile.setMinorVersion(iter.nextU2ToInt()); classFile.setMajorVersion(iter.nextU2ToInt()); - classFile.setConstPool(parseConstantPool(iter)); + ConstantPool pool=parseConstantPool(iter); + classFile.setConstPool(pool); classFile.setAccessFlag(parseAccessFlag(iter)); classFile.setClassIndex(parseClassInfex(iter)); + parseInterfaces(iter); + int fieldCount=iter.nextU2ToInt(); + for (int i = 0; i list=new ArrayList<>(); + Stack numStack=new Stack(); + Stack operStack=new Stack(); + public InfixExpr(String s) { + StringTokenizer st = new StringTokenizer(s, "\\+|\\-|\\*|\\/", true); + + while(st.hasMoreElements()){ + list.add(st.nextToken()); + } + } + //5-2+3 6/2*3 5-2+3*4 2+3-5 + public float evaluate() { + + for (int i = 0; i < list.size(); i++) { + + if (list.get(i).charAt(0)=='+') { + if (operStack.size()==0) { + operStack.push(list.get(i).charAt(0)); + continue; + } + if ((char)operStack.peek()=='-'||(char)operStack.peek()=='*'||(char)operStack.peek()=='/') { + numStack.push(caculate()); + } + operStack.push(list.get(i).charAt(0)); + } + else if (list.get(i).charAt(0)=='-') { + if (operStack.size()==0) { + operStack.push(list.get(i).charAt(0)); + continue; + } + if ((char)operStack.peek()=='*'||(char)operStack.peek()=='/') { + numStack.push(caculate()); + } + operStack.push(list.get(i).charAt(0)); + } + else if (list.get(i).charAt(0)=='*') { + if (operStack.size()==0) { + operStack.push(list.get(i).charAt(0)); + continue; + } + if ((char)operStack.peek()=='/') { + numStack.push(caculate()); + } + operStack.push(list.get(i).charAt(0)); + } + else if (list.get(i).charAt(0)=='/') { + if (operStack.size()==0) { + operStack.push(list.get(i).charAt(0)); + continue; + } + operStack.push(list.get(i).charAt(0)); + } + else { + numStack.push(Float.parseFloat(list.get(i))); + } + + } + while (operStack.size()!=0) { + + numStack.push(caculate()); + } + return (float) numStack.pop(); + } + public float caculate(){ + char opf=(char) operStack.pop(); + float op2=(float) numStack.pop(); + float op1=(float) numStack.pop(); + float tmpResult = 0; + switch(opf){ + case '+': + tmpResult = op1 + op2; + break; + case '-': + tmpResult = op1 - op2; + break; + case '*': + tmpResult = op1 * op2; + break; + case '/': + tmpResult = op1 / op2; + break; + } + return tmpResult; + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/StackUtilTest.java b/group11/996108220/src/com/coding/basic/stack/StackUtilTest.java index 91e3211683..e921ed991c 100644 --- a/group11/996108220/src/com/coding/basic/stack/StackUtilTest.java +++ b/group11/996108220/src/com/coding/basic/stack/StackUtilTest.java @@ -78,5 +78,24 @@ public void testIsValidPairs() { String s="([e{df])" ; Assert.assertEquals(false, StackUtil.isValidPairs(s)); } + //5-2+3 6/2*3 5-2+3*4 2+3-5 + @Test + public void testevaluate() { + InfixExpr expr = new InfixExpr("2+3*4+5"); + System.out.println(expr.evaluate()); + Assert.assertEquals(19, expr.evaluate(), 0.001f); + InfixExpr expr1 = new InfixExpr("5-2+3"); + System.out.println(expr1.evaluate()); + Assert.assertEquals(6, expr1.evaluate(), 0.001f); + InfixExpr expr2 = new InfixExpr("6/2*3"); + System.out.println(expr2.evaluate()); + Assert.assertEquals(9, expr2.evaluate(), 0.001f); + InfixExpr expr3 = new InfixExpr("50-2+3*4"); + System.out.println(expr3.evaluate()); + Assert.assertEquals(60, expr3.evaluate(), 0.001f); + InfixExpr expr4 = new InfixExpr("20+30-50"); + System.out.println(expr4.evaluate()); + Assert.assertEquals(0, expr4.evaluate(), 0.001f); + } } From e52aa3c90ec4d53030f9050dce2a23c5fbc4542e Mon Sep 17 00:00:00 2001 From: mengxz <82427129@qq.com> Date: Mon, 17 Apr 2017 18:30:07 +0800 Subject: [PATCH 169/552] update infixExpr.java complete InfixExpression's evaluate --- .../coding/basic/stack/expr/InfixExpr.java | 120 +++++++++++++----- .../com/coding/basic/stack/expr/Token.java | 85 +++++++++++++ 2 files changed, 176 insertions(+), 29 deletions(-) create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java index 9f166de8d0..b498fc2758 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java @@ -1,52 +1,114 @@ package com.coding.basic.stack.expr; +import java.util.ArrayList; +import java.util.List; import java.util.Stack; +import com.coding.basic.stack.StackUtil; + public class InfixExpr { String expr = null; - private Stack stack = new Stack<>(); + private List tokenList = new ArrayList<>(); + private final static String regex = "-|\\+|\\*|/|\\(|\\)"; public InfixExpr(String expr) { this.expr = expr; init(); } - public void init(){ - splitOpraAndNum(); - } - private void splitOpraAndNum() { - char[] array = expr.toCharArray(); - int mark = 0; - for (int i = 0; i < array.length; i++) { - char c = array[i]; - int cc = c&0xffff; - if(cc<48||cc>57){ - if((i-mark)>0){ - String num = expr.substring(mark, i); - stack.push(Integer.parseInt(num)); - } - }else{ - mark = i; - } + + private void init() { + if (StackUtil.isValidPairs(expr)) { + initTokens(); + } else { + throw new RuntimeException( + "Syntax error, ( ) is not completed in your Expression"); } } + /** - * 转换成前序表达式进行计算 - * @return + * 表达式分解并入栈 */ - public float evaluatePre(){ - - return 0.0f; + private void initTokens() { + String[] nums = expr.split(regex); + ArrayList arrayList = new ArrayList(); + for (int i = 0; i < nums.length; i++) { + if (!nums[i].equals("")) { + arrayList.add(nums[i]); + } + } + char[] exChars = expr.toCharArray(); + int numInx = 0; + for (int i = 0; i < exChars.length;) { + char ex = exChars[i]; + int item = ex & 0xffff; + if (item >= 48 && item <= 57) { + int numSize = arrayList.get(numInx++).length(); + String num = new String(exChars, i, numSize); + Token token = new Token(num, Token.NUMBER); + tokenList.add(token); + i += numSize; + } else { + Token token = new Token(String.valueOf(ex), Token.OPERA); + tokenList.add(token); + i += 1; + } + } } /** - * 循环扫描,每次找到最高优先级的操作符,如果是*或者/那么计算这个操作符两边的数字, - * 然后利用返回值改变以前的表达式,再次循环 - * 直到表达式变成只有一个数字的时候停止 + * 从左向右扫描所有token,当遇到同优先级或低优先级的操作符时,把之前的操作符依次出栈并计算结果 + * 扫描完所有token后,依次出栈所有操作数并计算结果 + * * @return */ public float evaluate() { - - return 0.0f; + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + for (int i = 0; i < tokenList.size(); i++) { + Token token = tokenList.get(i); + switch (token.getType()) { + case Token.NUMBER: + numStack.push(token.getNumValue()); + break; + case Token.OPERA: + if (opStack.isEmpty()) { + opStack.push(token); + } else { + while (!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())) { + Token preOper = opStack.pop(); + Float latter = numStack.pop(); + Float former = numStack.pop(); + Float result = caculate(preOper, latter, former); + numStack.push(result); + } + opStack.push(token); + } + break; + default: + throw new RuntimeException(" error not Number not Operate "); + } + } + while (!opStack.isEmpty()) { + Token pre = opStack.pop(); + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + Float result = caculate(pre, f1, f2); + numStack.push(result); + } + return numStack.pop(); + } + private Float caculate(Token t, Float latter,Float former){ + switch (t.getValue()) { + case "+": + return latter + former; + case "-": + return former - latter; + case "*": + return latter * former; + case "/": + return former / latter; + default: + throw new RuntimeException("operation"+t.getValue()+" isn't implemented"); + } } - } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..bc6945c757 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,85 @@ +package com.coding.basic.stack.expr; + +import java.util.HashMap; + +/** + * 表达式中的数字或者操作符的抽象实体类 + * + * @author Walker + * + */ +public class Token { + private final static HashMap priority = new HashMap<>(4); + static { + priority.put("+", 1); + priority.put("-", 1); + priority.put("*", 2); + priority.put("/", 2); + } + private String value; + + public static final int NUMBER = 1; + public static final int OPERA = 2; + private int type; + + public Token(String v, int t) { + this.value = v; + this.type = t; + } + + public boolean isNum() { + return type == NUMBER; + } + + public boolean isOpera() { + return type == OPERA; + } + + @Override + public String toString() { + return value; + } + + public float getNumValue() { + return Float.parseFloat(value); + } + + public boolean hasLowerPriority(Token t) { + if (!this.isOpera() || !t.isOpera()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priority.get(this.value) - priority.get(t.value) < 0; + } + public boolean hasHigherPriority(Token t) { + if (!this.isOpera() || !t.isOpera()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priority.get(this.value) - priority.get(t.value) > 0; + } + public boolean hasEqualPriority(Token t) { + if (!this.isOpera() || !t.isOpera()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priority.get(this.value) - priority.get(t.value) == 0; + } + + /* + * getter setter + */ + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + +} From 7591001ff7e05091c843c82a86630443cb4c8114 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 17 Apr 2017 19:36:45 +0800 Subject: [PATCH 170/552] coding --- .../coderising/jvm/attr/AttributeInfo.java | 76 +++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 94 ++++++ .../jvm/attr/ConstantValueAttr.java | 30 ++ .../coderising/jvm/attr/LineNumberTable.java | 60 ++++ .../jvm/attr/LocalVariableItem.java | 40 +++ .../jvm/attr/LocalVariableTable.java | 47 +++ .../coderising/jvm/attr/StackMapTable.java | 36 +++ .../com/coderising/jvm/clz/AccessFlag.java | 24 ++ .../src/com/coderising/jvm/clz/ClassFile.java | 92 ++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 24 ++ .../coderising/jvm/constant/ConstantInfo.java | 29 ++ .../coderising/jvm/constant/ConstantPool.java | 29 ++ .../coderising/jvm/constant/FieldRefInfo.java | 54 ++++ .../jvm/constant/MethodRefInfo.java | 55 ++++ .../jvm/constant/NameAndTypeInfo.java | 45 +++ .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 ++ .../com/coderising/jvm/constant/UTF8Info.java | 30 ++ .../exception/AddAnotherParserException.java | 10 + .../exception/NoNextByteCodeException.java | 10 + .../jvm/exception/NotAClassFileException.java | 11 + .../src/com/coderising/jvm/field/Field.java | 65 +++++ .../jvm/loader/ByteCodeIterator.java | 113 ++++++++ .../jvm/loader/ClassFileLoader.java | 14 +- .../jvm/loader/ClassFileParser.java | 153 ++++++++++ .../src/com/coderising/jvm/method/Method.java | 66 +++++ .../Util.java} | 26 +- .../src/com/coding/basic/BinaryTree.java | 10 +- .../src/com/coding/basic/BinaryTreeNode.java | 74 ++--- .../src/com/coding/basic/Iterator.java | 16 +- .../zj-2017/src/com/coding/basic/List.java | 18 +- .../zj-2017/src/com/coding/basic/Queue.java | 8 +- .../zj-2017/src/com/coding/basic/Stack.java | 30 -- .../src/com/coding/basic/array/ArrayList.java | 37 ++- .../src/com/coding/basic/array/ArrayUtil.java | 10 +- .../com/coding/basic/linklist/LinkedList.java | 71 +++-- .../src/com/coding/basic/stack/Stack.java | 46 +++ .../src/com/coding/basic/stack/StackUtil.java | 158 ++++++++++ .../coding/basic/stack/expr/InfixExpr.java | 174 +++++++++++ .../com/coding/basic/stack/expr/Operator.java | 48 ++++ .../coderising/jvm/ClassFileloaderTest.java | 271 ++++++++++++++++++ .../jvm/{loader => }/EmployeeV1.java | 10 +- .../jvm/loader/ClassFileloaderTest.java | 87 ------ .../test/com/coding/basic/BinaryTreeTest.java | 117 ++++---- .../src/test/com/coding/basic/QueueTest.java | 128 ++++----- .../com/coding/basic/array/ArrayListTest.java | 4 +- .../com/coding/basic/array/ArrayUtilTest.java | 2 +- .../coding/basic/linklist/LinkedListTest.java | 14 +- .../coding/basic/{ => stack}/StackTest.java | 152 +++++----- .../com/coding/basic/stack/StackUtilTest.java | 95 ++++++ .../basic/stack/expr/InfixExprTest.java | 48 ++++ 52 files changed, 2468 insertions(+), 451 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java rename group12/2258659044/zj-2017/src/com/coderising/jvm/{loader/ClassFileLoaderUtil.java => util/Util.java} (69%) delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Stack.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java rename group12/2258659044/zj-2017/src/test/com/coderising/jvm/{loader => }/EmployeeV1.java (81%) delete mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java rename group12/2258659044/zj-2017/src/test/com/coding/basic/{ => stack}/StackTest.java (82%) create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..a1369ab554 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,76 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.exception.AddAnotherParserException; +import com.coderising.jvm.loader.ByteCodeIterator; + +public abstract class AttributeInfo { + + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + + int attrNameIndex; + int attrLen ; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + /** + * 解析属性 + * @param pool + * @param iter + * @return + */ + public static List parseAttributes(ConstantPool pool,ByteCodeIterator iter){ + + List attributeInfos = new ArrayList(); + try { + + int attrCount = iter.nextU2ToInt(); + for (int i = 0; i < attrCount; i++) { + + AttributeInfo attr = null; + String attrName = pool.getUTF8String(iter.nextU2ToInt()); + iter.back(ByteCodeIterator.numberTwo); + + switch (attrName) { + case AttributeInfo.CONST_VALUE: + attr = ConstantValueAttr.parse(iter); + break; + case AttributeInfo.CODE: + attr = CodeAttr.parse(pool,iter); + break; + case AttributeInfo.EXCEPTIONS: + //TODE + break; + case AttributeInfo.LINE_NUM_TABLE: + attr = LineNumberTable.parse(iter); + break; + case AttributeInfo.LOCAL_VAR_TABLE: + attr = LocalVariableTable.parse(iter); + break; + case AttributeInfo.STACK_MAP_TABLE: + attr = StackMapTable.parse(iter); + break; + default: + throw new AddAnotherParserException(); + } + attributeInfos.add(attr); + + } + } catch (AddAnotherParserException e) { + e.printStackTrace(); + } + return attributeInfos; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..3a2f0e6988 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,94 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + private List attributeInfos = new ArrayList<>(); + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + } + + + public static CodeAttr parse(ConstantPool pool,ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); + + //解析exception_table start TODO + int exceptionTabLen = iter.nextU2ToInt(); + System.out.println("exception_table 的个数为"+exceptionTabLen); + //解析exception_table end TODO + + codeAttr.setAttributeInfos(AttributeInfo.parseAttributes(pool, iter)); + + return codeAttr; + } + + + public int getMaxStack() { + return maxStack; + } + + + public void setMaxStack(int maxStack) { + this.maxStack = maxStack; + } + + + public int getMaxLocals() { + return maxLocals; + } + + + public void setMaxLocals(int maxLocals) { + this.maxLocals = maxLocals; + } + + + public int getCodeLen() { + return codeLen; + } + + + public void setCodeLen(int codeLen) { + this.codeLen = codeLen; + } + + + public String getCode() { + return code; + } + + + public void setCode(String code) { + this.code = code; + } + + public List getAttributeInfos() { + return attributeInfos; + } + + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java new file mode 100644 index 0000000000..697b484657 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class ConstantValueAttr extends AttributeInfo{ + + private int constantValueIndex; + + public int getConstantValueIndex() { + return constantValueIndex; + } + + public void setConstantValueIndex(int constantValueIndex) { + this.constantValueIndex = constantValueIndex; + } + + public ConstantValueAttr(int attrNameIndex, int attrLen,int constantValueIndex) { + super(attrNameIndex, attrLen); + this.constantValueIndex = constantValueIndex; + } + + public static ConstantValueAttr parse(ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int constantValueIndex = iter.nextU2ToInt(); + return new ConstantValueAttr(attrNameIndex,attrLen,constantValueIndex); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..6029bf4253 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,60 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +@SuppressWarnings("unused") +public class LineNumberTable extends AttributeInfo { + + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int nameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LineNumberTable lineNumberTable = new LineNumberTable(nameIndex,attrLen); + + int tableLen = iter.nextU2ToInt(); + + for (int i = 0; i < tableLen; i++) { + + int startPC = iter.nextU2ToInt(); + int lineNum = iter.nextU2ToInt(); + + LineNumberItem item = new LineNumberItem(); + item.setLineNum(startPC); + item.setLineNum(lineNum); + + lineNumberTable.addLineNumberItem(item); + } + + return lineNumberTable; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..c7209a435e --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,40 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..463b110458 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,47 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int nameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LocalVariableTable localVariableTable = new LocalVariableTable(nameIndex,attrLen); + + int tableLen = iter.nextU2ToInt(); + + for (int i = 0; i < tableLen; i++) { + + int startPC = iter.nextU2ToInt(); + int len = iter.nextU2ToInt(); + int nameindex = iter.nextU2ToInt(); + int descrIndex = iter.nextU2ToInt(); + int index = iter.nextU2ToInt(); + + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(startPC); + item.setNameIndex(nameindex); + item.setLength(len); + item.setDescIndex(descrIndex); + item.setIndex(index); + localVariableTable.addLocalVariableItem(item); + } + return localVariableTable; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..033b6bb179 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,36 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + + int nameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + StackMapTable t = null; + t = new StackMapTable(nameIndex,attrLen); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(attrLen); + t.setOriginalCode(code); + + return t; + } + + + private void setOriginalCode(String code) { + this.originalCode = code; + + } + + public String getOriginalCode() { + return originalCode; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..5abd9961ac --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,24 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..c21a0988e5 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..7750d4439d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..e12b3e164e --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..c8035ae876 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..0e940b78d0 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ff9d5fb77 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..0feffa65b5 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..dcac7f97c4 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..fa90d110fe --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..d01065fd53 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..0aa9ee045b --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,30 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java new file mode 100644 index 0000000000..9754f36adf --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.exception; + +public class AddAnotherParserException extends Exception{ + + private static final long serialVersionUID = 5171999484216739737L; + + public AddAnotherParserException(){ + super("you should add another parser to solve the unknown AttributeInfo or Constant!"); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java new file mode 100644 index 0000000000..8819309841 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.exception; + +public class NoNextByteCodeException extends Exception{ + + private static final long serialVersionUID = -904433109427354744L; + + public NoNextByteCodeException(int byteNum){ + super("already haven't "+byteNum+" byte data!"); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java new file mode 100644 index 0000000000..a627baf742 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java @@ -0,0 +1,11 @@ +package com.coderising.jvm.exception; + +public class NotAClassFileException extends Exception{ + + private static final long serialVersionUID = -3645339333237670145L; + + public NotAClassFileException() { + super("this file not a java class file!"); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..f29420615a --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,65 @@ +package com.coderising.jvm.field; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Field { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private List attributeInfos = new ArrayList<>(); + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public int getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + + public List getAttributeInfos() { + return attributeInfos; + } + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } + + @Override + public String toString() { + + String fieldName = pool.getUTF8String(nameIndex); + String fieldDesc = pool.getUTF8String(descriptorIndex); + + return (fieldName+":"+fieldDesc); + } + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + + Field field = new Field(accessFlag,nameIndex,descriptorIndex,pool); + field.setAttributeInfos(AttributeInfo.parseAttributes(pool,iter)); + + return field; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..e69ae7b0b3 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,113 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.exception.NoNextByteCodeException; +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + + private byte[] codes; + private int cursor; + + public static int numberOne = 1; + public static int numberTwo = 2; + public static int numberFour = 4; + + public ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + + public boolean hasNext(int len) { + return (cursor+len) <= codes.length; + } + + public byte[] next(int len){ + + byte[] data = new byte[len]; + + int j = 0; + for (int i = cursor; j < len; i++) { + data[j] = codes[i]; + j++; + } + cursor += len; + + return data; + } + + public int nextU2ToInt(){ + + if(!hasNext(numberTwo)){ + try { + throw new NoNextByteCodeException(numberTwo); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + return Util.byteToInt(next(numberTwo)); + } + + public int nextU4ToInt(){ + + if(!hasNext(numberFour)){ + try { + throw new NoNextByteCodeException(numberFour); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + return Util.byteToInt(next(numberFour)); + } + + public int nextInt(){ + + if(!hasNext(numberOne)){ + try { + throw new NoNextByteCodeException(numberOne); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + return Util.byteToInt(next(numberOne)); + } + + public String nextStr(int len){ + + if(!hasNext(len)){ + try { + throw new NoNextByteCodeException(len); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + char[] arr = new char[len]; + for (int i = 0; i < len; i++) { + arr[i] = (char)nextInt(); + } + return new String(arr); + } + + public String nextUxToHexString(int len) { + + if(!hasNext(len)){ + try { + throw new NoNextByteCodeException(len); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + return Util.byteToHexString(next(len)).toLowerCase(); + + } + + /** + * 回退 + */ + public void back(int backLen){ + + if( backLen<= this.cursor ){ + this.cursor -= backLen; + }else{ + this.cursor = 0; + } + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java index 59d12540fc..4ba2613f1a 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -4,15 +4,19 @@ import java.util.ArrayList; import java.util.List; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.util.Util; + public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - File clzFile = ClassFileLoaderUtil.getClzFile(clzPaths,className); + File clzFile = Util.getClzFile(clzPaths,className); - return ClassFileLoaderUtil.readClz(clzFile); + return Util.readClz(clzFile); } @@ -30,4 +34,10 @@ public String getClassPath(){ return buff.substring(0, buff.length()-1); } + public ClassFile loadClass(String className) throws NotAClassFileException { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..bd1fa61d5b --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,153 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.exception.AddAnotherParserException; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; +import com.coderising.jvm.util.Util; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) throws NotAClassFileException { + + ByteCodeIterator iterator = new ByteCodeIterator(codes); + if(!validator(iterator)){ + throw new NotAClassFileException(); + } + ClassFile clazzFile = new ClassFile(); + + clazzFile.setMinorVersion(iterator.nextU2ToInt()); + + clazzFile.setMajorVersion(iterator.nextU2ToInt()); + + clazzFile.setConstPool(parseConstantPool(iterator)); + + clazzFile.setAccessFlag(parseAccessFlag(iterator)); + + clazzFile.setClassIndex(parseClassInfex(iterator)); + + parseInterfaces(iterator); + + //解析属性 + int fieldCount = iterator.nextU2ToInt(); + for (int i = 0; i < fieldCount; i++) { + clazzFile.addField(Field.parse(clazzFile.getConstantPool(), iterator)); + } + //解析方法 + int methodCount = iterator.nextU2ToInt(); + for (int i = 0; i < methodCount; i++) { + clazzFile.addMethod(Method.parse(clazzFile.getConstantPool(), iterator));; + } + + return clazzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter){ + + return new AccessFlag(iter.nextU2ToInt()); + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter){ + + ClassIndex classIndex = new ClassIndex(); + classIndex.setThisClassIndex(iter.nextU2ToInt()); + classIndex.setSuperClassIndex(iter.nextU2ToInt()); + return classIndex; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter){ + + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + + try { + + int poolSize = iter.nextU2ToInt(); + for (int i = 1; i < poolSize; i++) { + int tag = iter.nextInt(); + switch (tag) { + case ConstantInfo.UTF8_INFO: + UTF8Info UTF8Info = new UTF8Info(pool); + int len = iter.nextU2ToInt(); + String value = iter.nextStr(len); + UTF8Info.setLength(len); + UTF8Info.setValue(value); + pool.addConstantInfo(UTF8Info); + break; + case ConstantInfo.FLOAT_INFO: + //TODO + break; + case ConstantInfo.CLASS_INFO: + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(iter.nextU2ToInt()); + pool.addConstantInfo(classInfo); + break; + case ConstantInfo.STRING_INFO: + StringInfo stringInfo = new StringInfo(pool); + stringInfo.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(stringInfo); + break; + case ConstantInfo.FIELD_INFO: + FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); + fieldRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + fieldRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(fieldRefInfo); + break; + case ConstantInfo.METHOD_INFO: + MethodRefInfo methodRefInfo = new MethodRefInfo(pool); + methodRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + methodRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(methodRefInfo); + break; + case ConstantInfo.NAME_AND_TYPE_INFO: + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + nameAndTypeInfo.setIndex1(iter.nextU2ToInt()); + nameAndTypeInfo.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameAndTypeInfo); + break; + default: + throw new AddAnotherParserException(); + } + } + } catch (AddAnotherParserException e) { + e.printStackTrace(); + } + return pool; + } + + private void parseInterfaces(ByteCodeIterator iter){ + + int interfaceCount = iter.nextU2ToInt(); + System.out.println("接口数量为:"+interfaceCount); + // TODO + } + + /** + * 校验是否为class文件 + * @param iterator + * @return + */ + private boolean validator(ByteCodeIterator iterator){ + + if(iterator.hasNext(4)){ + byte[] magicByte = iterator.next(4); + String magicNumber = Util.byteToHexString(magicByte); + if("cafebabe".equals(magicNumber)){ + return true; + } + } + return false; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..c8d8065df8 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java @@ -0,0 +1,66 @@ +package com.coderising.jvm.method; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private ConstantPool pool; + private List attributeInfos = new ArrayList<>(); + + + public Method(ConstantPool pool,int accessFlag, int nameIndex, int descriptorIndex) { + this.pool = pool; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public static Method parse(ConstantPool pool, ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + + Method method = new Method(pool,accessFlag,nameIndex,descriptorIndex); + method.setAttributeInfos(AttributeInfo.parseAttributes(pool,iter)); + + return method; + } + + + public int getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + + public ConstantPool getPool() { + return pool; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + + public List getAttributeInfos() { + return attributeInfos; + } + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java similarity index 69% rename from group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java rename to group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java index 61faafb77d..d0456fead2 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java @@ -1,4 +1,4 @@ -package com.coderising.jvm.loader; +package com.coderising.jvm.util; import java.io.ByteArrayOutputStream; import java.io.File; @@ -7,8 +7,27 @@ import java.io.InputStream; import java.util.List; -public class ClassFileLoaderUtil { - +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 root; @SuppressWarnings({ "rawtypes", "unchecked" }) public > BinaryTreeNode insert(T o){ @@ -44,12 +44,12 @@ public > BinaryTreeNode insert(T o){ * @param node * @return */ - public List traversalBefore(BinaryTreeNode node){ + public List traversalBefore(BinaryTreeNode node){ //所有数据集合 - List datas = new ArrayList(); + List datas = new ArrayList<>(); return traversal(node,datas); } - private List traversal(BinaryTreeNode node,List datas){ + private List traversal(BinaryTreeNode node,List datas){ if(node !=null){ datas.add(node.getData()); @@ -59,7 +59,7 @@ private List traversal(BinaryTreeNode node,List datas){ return datas; } - public BinaryTreeNode getRoot() { + public BinaryTreeNode getRoot() { return root; } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java index a8e6b66edd..5e8c90fa54 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java @@ -1,37 +1,37 @@ -package com.coding.basic; -public class BinaryTreeNode { - - private Object data; - //父节点 - private BinaryTreeNode parent; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode getParent() { - return parent; - } - public void setParent(BinaryTreeNode parent) { - this.parent = parent; - } -} +package com.coding.basic; +public class BinaryTreeNode { + + private E data; + //父节点 + private BinaryTreeNode parent; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public E getData() { + return data; + } + public void setData(E data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode getParent() { + return parent; + } + public void setParent(BinaryTreeNode parent) { + this.parent = parent; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java index c854120212..d72c308c07 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java @@ -1,8 +1,8 @@ -package com.coding.basic; - -public interface Iterator { - - public boolean hasNext(); - public Object next(); - -} +package com.coding.basic; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/List.java b/group12/2258659044/zj-2017/src/com/coding/basic/List.java index a5a3688eb6..7fd5915bae 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/List.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/List.java @@ -1,10 +1,10 @@ -package com.coding.basic; - -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); +package com.coding.basic; + +public interface List { + + public void add(E o); + public void add(int index, E o); + public E get(int index); + public E remove(int index); + public int size(); } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java index aa8429ac59..169fc0dcb9 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java @@ -2,16 +2,16 @@ import com.coding.basic.linklist.LinkedList; -public class Queue { +public class Queue { - private LinkedList element = new LinkedList(); + private LinkedList element = new LinkedList(); - public void enQueue(Object o){ + public void enQueue(E o){ element.add(o); } - public Object deQueue(){ + public E deQueue(){ return element.removeFirst(); } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java b/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java deleted file mode 100644 index 2b08e856c1..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -import com.coding.basic.array.ArrayList; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - - elementData.add(o); - } - - public Object pop(){ - - return elementData.remove(size()-1); - } - - public Object peek(){ - - return elementData.get(size()-1); - } - public boolean isEmpty(){ - - return size()==0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java index 4bbf60adf9..73f3b9649e 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java @@ -5,7 +5,7 @@ import com.coding.basic.Iterator; import com.coding.basic.List; -public class ArrayList implements List { +public class ArrayList implements List { private int size = 0; /*扩容因子*/ @@ -15,12 +15,12 @@ public class ArrayList implements List { /*扩容引用*/ private Object[] newElementData; - public void add(Object o){ + public void add(E o){ grow(); elementData[size] = o; size ++; } - public void add(int index, Object o){ + public void add(int index, E o){ if(index<0||index>size){ throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); @@ -36,19 +36,21 @@ public void add(int index, Object o){ size ++; } - public Object get(int index){ + public E get(int index){ - if(index<0||index>size){ - throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); - } - return elementData[index]; + rangeCheck(index); + return elementData(index); } - public Object remove(int index){ + public E remove(int index){ - Object o = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, size-(index+1)); - size --; + rangeCheck(index); + E o = elementData(index); + int i = this.size - index - 1; + if (i > 0) { + System.arraycopy(this.elementData, index + 1, this.elementData, index, i); + } + this.elementData[(--this.size)] = null; return o; } @@ -74,6 +76,17 @@ private void grow(){ } } + private void rangeCheck(int index) { + + if (index >= this.size) { + throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); + } + } + + @SuppressWarnings("unchecked") + E elementData(int index) { + return (E) elementData[index]; + } public Iterator iterator(){ diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java index de11fdbca5..0bd2cef66b 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java @@ -112,7 +112,7 @@ public int[] merge2(int[] array1, int[] array2){ bitmap[array2[i]]=true; } - ArrayList ls = new ArrayList(); + ArrayList ls = new ArrayList<>(); for (int i = 0; i < bitmap.length; i++) { if(bitmap[i]==true){ ls.add(i); @@ -149,7 +149,7 @@ public int[] fibonacci(int max){ int[] array = {}; if(max <= 1)return array; //生成 斐波那契数列的ArrayList集合 - ArrayList ls = new ArrayList(); + ArrayList ls = new ArrayList<>(); ls.add(1);ls.add(1); int next;int i = 1; while(true){ @@ -171,7 +171,7 @@ public int[] fibonacci(int max){ */ public int[] getPrimes(int max){ - ArrayList primesList = new ArrayList(); + ArrayList primesList = new ArrayList<>(); boolean flag; for (int i = 2; i < max; i++) { flag = false; @@ -197,7 +197,7 @@ public int[] getPrimes(int max){ public int[] getPerfectNumbers(int max){ int temp; - ArrayList perfectList = new ArrayList(); + ArrayList perfectList = new ArrayList(); for (int i = 6; i <= max; i++) { temp = 0; for (int j = 1; j <= (i/2); j++) { @@ -234,7 +234,7 @@ public String join(int[] array, String seperator){ * @param ls * @return */ - public int[] objList2int(ArrayList ls){ + public int[] objList2int(ArrayList ls){ Object[] objArr = ls.toArray(); int[] array = new int[ls.size()]; diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java b/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java index 0132efaa00..5ee8881fa0 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java @@ -4,57 +4,57 @@ import com.coding.basic.Iterator; import com.coding.basic.List; -import com.coding.basic.Stack; +import com.coding.basic.stack.Stack; -public class LinkedList implements List { +public class LinkedList implements List { - private Node head; + private Node head; private int size = 0; - public void add(Object o){ + public void add(E o){ - Node addNode = new Node(); + Node addNode = new Node<>(); addNode.data = o; if(size==0){ head = addNode; }else{ //获取最后一个节点 - Node lastNode = getPointNode(size-1); + Node lastNode = getPointNode(size-1); lastNode.next = addNode; } size++; } - public void add(int index , Object o){ + public void add(int index , E o){ - Node addNode = new Node(); + Node addNode = new Node<>(); addNode.data = o; if(index == 0){ //添加头结点 addFirst(o); }else if(index == size){//添加尾节点 addLast(o); }else{//在投节点与尾部添加节点 - Node prePointNode = getPointNode(index-1); - Node pointNode = prePointNode.next; + Node prePointNode = getPointNode(index-1); + Node pointNode = prePointNode.next; prePointNode.next = addNode; addNode.next = pointNode; size ++; } } - public Object get(int index){ + public E get(int index){ - Node node = getPointNode(index); + Node node = getPointNode(index); return node.data; } - public Object remove(int index){ + public E remove(int index){ - Node pointNode = getPointNode(index); - Node nextPointNode = pointNode.next; + Node pointNode = getPointNode(index); + Node nextPointNode = pointNode.next; if(index ==0){ head = nextPointNode; }else{ - Node prePointNode = getPointNode(index-1); + Node prePointNode = getPointNode(index-1); prePointNode.next = nextPointNode; } size --; @@ -65,10 +65,10 @@ public int size(){ return size; } - public void addFirst(Object o){ + public void addFirst(E o){ - Node secondNode = head; - head = new Node(); + Node secondNode = head; + head = new Node<>(); head.data = o; if(size>0){ head.next = secondNode; @@ -76,16 +76,16 @@ public void addFirst(Object o){ size ++; } - public void addLast(Object o){ + public void addLast(E o){ add(o); } - public Object removeFirst(){ + public E removeFirst(){ return remove(0); } - public Object removeLast(){ + public E removeLast(){ return remove(size-1); } @@ -118,21 +118,21 @@ public Object next() { * 获取指定的节点 * @return */ - private Node getPointNode(int index){ + private Node getPointNode(int index){ if(index<0||index>size){ throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size+""); } - Node node = head; + Node node = head; for (int i = 0; i < index; i++) { node = node.next; } return node; } - private static class Node{ - Object data; - Node next; + private static class Node{ + E data; + Node next; } @@ -142,8 +142,8 @@ private static class Node{ */ public void reverse(){ - Stack stack = new Stack(); - Node node; + Stack stack = new Stack(); + Node node; //缓存原链表数据 for (node = head; node!=null;node = node.next) { stack.push(node.data); @@ -198,10 +198,10 @@ public void remove(int i, int length){ * 返回的结果应该是[101,301,401,601] * @param list */ - public int[] getElements(LinkedList list){ + public int[] getElements(LinkedList list){ int[] array = new int[list.size()]; for (int i = 0; i < array.length; i++) { - array[i] = (int) get((int)list.get(i)); + array[i] = (int) get(list.get(i)); } return array; } @@ -212,12 +212,11 @@ public int[] getElements(LinkedList list){ * @param list */ - public void subtract(LinkedList list){ + public void subtract(LinkedList list){ for (int i = 0; i < size; i++) { for (int j = 0; j < list.size(); j++) { if(get(i).equals(list.get(j))){ remove(i); - i--; } } } @@ -259,13 +258,13 @@ public void removeRange(int min, int max){ * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 * @param list */ - public LinkedList intersection( LinkedList list){ + public LinkedList intersection( LinkedList list){ - LinkedList newList = new LinkedList(); + LinkedList newList = new LinkedList<>(); for (int i = 0; i < size; i++) { for (int j = 0; j < list.size(); j++) { if(get(i).equals(list.get(j))){ - newList.add(get(i)); + newList.add((E)get(i)); } } } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..f1ede1f8ab --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,46 @@ +package com.coding.basic.stack; + +import com.coding.basic.array.ArrayList; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(E o){ + + elementData.add(o); + } + + public E pop(){ + + return elementData.remove(size()-1); + } + + public E peek(){ + + return elementData.get(size()-1); + } + public boolean isEmpty(){ + + return size()==0; + } + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + + StringBuffer sBuffer = new StringBuffer(); + sBuffer.append("["); + + for (int i = size()-1; i >= 0; i--) { + if(i == 0){ + sBuffer.append(elementData.get(i)+"]"); + }else{ + sBuffer.append(elementData.get(i)+","); + } + } + return sBuffer.toString(); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..871b2fce69 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,158 @@ +package com.coding.basic.stack; + +import java.util.HashMap; +import java.util.Map; + +public class StackUtil { + + private static Map markMap; + + static { + //初始化括号对 + markMap = new HashMap(); + markMap.put('(', ')'); + markMap.put('[', ']'); + markMap.put('{', '}'); + } + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param + */ + public static void reverse(Stack s) { + + if(s == null||s.isEmpty()){ + return; + } + E last = getBottom(s,s.pop()); + reverse(s); + s.push(last); + } + + /** + * 获取栈底部数据 + * @param + * @param s + * @return + */ + private static E getBottom(Stack s,E val){ + + if(s.isEmpty()){ + return val; + } + E lst = getBottom(s,s.pop()); + s.push(val); + return lst; + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param + * + * @param o + */ + public static void remove(Stack s,E o) { + + if(s == null||s.isEmpty()){ + return; + } + E res = s.pop(); + if(res.equals(o)){ + return; + } + remove(s,o); + s.push(res); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param + * @param len + * @return + */ + + public static Object[] getTop(Stack s,int len) { + + if(s == null||s.isEmpty()||len <= 0){ + return null; + } + + //当len的长度大于栈s的长度时返回栈s全部数据 + int size = s.size()>=len? len:s.size(); + + Object[] objs = new Object[size]; + + putValueToArray(s,objs,0); + + return objs; + } + + /** + * 将获取的元素放到数组中 + * @param + * @param s + * @param objs + * @param count + */ + public static void putValueToArray(Stack s,Object[] objs,int count){ + + E res = s.pop(); + count++; + objs[count-1] = res; + if(count== objs.length){ + s.push(res); + return; + } + putValueToArray(s,objs,count); + s.push(res); + } + + /** + * 字符串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){ + + if(!validation(s)){ + return false; + } + Stack markStack = new Stack<>(); + char[] charArr = s.toCharArray(); + for (int i = 0; i < charArr.length; i++) { + if(markMap.containsKey(charArr[i])){ + markStack.push(charArr[i]); + } + if(markMap.containsValue(charArr[i])){ + if(markMap.get(markStack.pop()).equals(charArr[i])){ + continue; + }else{ + return false; + } + } + } + return markStack.size()==0; + } + + private static boolean validation(String s){ + + if(s!=null&&s.length()>0){ + if(s.contains("(")&&s.contains(")")){ + return true; + } + if(s.contains("[")&&s.contains("]")){ + return true; + } + if(s.contains("{")&&s.contains("}")){ + return true; + } + } + return false; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..9d34a17fb5 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,174 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.Iterator; +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.StackUtil; + +public class InfixExpr { + + String expr = null; + char[] data = null; + + private static final String operatorsStr = "+-*/"; + + public InfixExpr(String expr) { + this.expr = expr; + this.data = expr.toCharArray(); + } + + public float evaluate() { + + //数据栈 + Stack dataStack = new Stack<>(); + //操作栈 + Stack operStack = new Stack<>(); + + splitInfixExpr(dataStack,operStack); + + return summary(dataStack,operStack); + } + + + /** + * 拆分数据与运算符于两个栈中 + * + * @return + */ + private void splitInfixExpr(Stack dataStack,Stack operStack) { + + Itr it = new Itr(); + while(it.hasNext()){ + String element = it.next(); + if (operatorsStr.contains(element)) { + putOpersToStack(dataStack,operStack, element); + } else { + dataStack.push(Float.parseFloat(element)); + } + } + validationLastOpers(dataStack,operStack); + } + + /** + * 检查最后一个操作符优先级与之前是否保持统一, + * 若不统一则进行运算,使栈中运算符保持同一个优先级 + * @param stacks + */ + private void validationLastOpers(Stack dataStack,Stack operStack) { + + Object[] opers = StackUtil.getTop(operStack, 2); + Operator thisOper = (Operator) opers[0]; + Operator preOper = (Operator) opers[1]; + if(thisOper.getLevel()!=preOper.getLevel()){ + calculateToStack(dataStack,operStack,false); + } + } + + /** + * 运算符压栈 + * @param stacks + * @param c + */ + private void putOpersToStack(Stack dataStack,Stack operStack, String c) { + + Operator thisOper = Operator.getOperator(c); + if (!operStack.isEmpty()) { + Operator preOper = operStack.peek(); + if (preOper.getLevel() > thisOper.getLevel()) { + calculateToStack(dataStack,operStack,false); + } + } + operStack.push(thisOper); + } + + /** + * 运算 + * @param a 数字 + * @param oper 运算符 + * @param b 数字 + * @return + */ + private float calculate(float a,Operator oper,float b) { + + String operFlag = oper.getFlag(); + + float res = 0f; + if (Operator.ADD.getFlag().equals(operFlag)) { + res = a + b; + } else if (Operator.SUB.getFlag().equals(operFlag)) { + res = a - b; + } else if (Operator.MULTY.getFlag().equals(operFlag)) { + res = a * b; + } else if (Operator.DIVIDE.getFlag().equals(operFlag)) { + res = a / b; + } + return res; + } + + /** + * 运算距栈顶最近两个元素的值并压回原栈 + * @param stacks + * stacks[0]运算符,stacks[1]数据 + * @param isReverse + * 当isReversed为true时会交换两个元素的位置 + */ + private void calculateToStack(Stack dataStack,Stack operStack,boolean isReverse){ + + float a,b; + if(isReverse){ + a = dataStack.pop(); + b = dataStack.pop();; + }else{ + b = dataStack.pop();; + a = dataStack.pop();; + } + + Operator oper = operStack.pop(); + float res = calculate(a,oper,b); + dataStack.push(res); + } + + /** + * 汇总结果 + * @param stacks + * @return + */ + private float summary(Stack dataStack,Stack operStack) { + + StackUtil.reverse(dataStack); + StackUtil.reverse(operStack); + + while (!operStack.isEmpty()) { + calculateToStack(dataStack,operStack,true); + } + return dataStack.pop(); + } + + private class Itr implements Iterator { + + int cursor; + + @Override + public boolean hasNext() { + return cursor != (expr.length()); + } + + @Override + public String next() { + + StringBuilder val = new StringBuilder(); + for (int i = cursor; i < data.length; i++) { + if (operatorsStr.contains(data[i] + "")) { + if ("".equals(val.toString())) { + val.append(data[i]); + this.cursor = (i + 1); + } + break; + } else { + val.append(data[i]); + this.cursor = (i + 1); + } + } + return val.toString(); + } + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java new file mode 100644 index 0000000000..3629e99482 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack.expr; + +public enum Operator { + + ADD("+",1),SUB("-",1),MULTY("*",2),DIVIDE("/",2); + + private String flag; + private int level; + + private Operator(String flag,int level){ + this.flag = flag; + this.level = level; + } + + public static int getLevelByFlag(String flag){ + + Operator[] opers = Operator.values(); + for (Operator operator : opers) { + if(operator.flag.equals(flag)){ + return operator.level; + } + } + return -1; + } + + public static Operator getOperator(String flag){ + + if(ADD.flag.equals(flag)){ + return ADD; + }else if(SUB.flag.equals(flag)){ + return SUB; + }else if(MULTY.flag.equals(flag)){ + return MULTY; + }else if(DIVIDE.flag.equals(flag)){ + return DIVIDE; + } + return null; + } + + public String getFlag() { + return flag; + } + + public int getLevel() { + return level; + } + +} diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java new file mode 100644 index 0000000000..3f763912fc --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java @@ -0,0 +1,271 @@ +package test.com.coderising.jvm; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class ClassFileloaderTest { + + private static final String FULL_QUALIFIED_CLASS_NAME = "test/com/coderising/jvm/EmployeeV1"; + + //static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + static String path1 = "E:\\githubRepository\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + static String path2 = "C:\temp"; + + + static ClassFile clzFile = null; + static { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "test.com.coderising.jvm.EmployeeV1"; + + try { + clzFile = loader.loadClass(className); + } catch (NotAClassFileException e) { + e.printStackTrace(); + } + clzFile.print(); + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "test.com.coderising.jvm.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "test.com.coderising.jvm.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + private String byteToHexString(byte[] codes ){ + 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()); + } + + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + //String code = m.getCodeAttr().getCode(); + CodeAttr codeAttr = (CodeAttr)m.getAttributeInfos().get(0); + String code = codeAttr.getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/EmployeeV1.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java similarity index 81% rename from group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/EmployeeV1.java rename to group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java index 463fb4a15f..9692355ed6 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/EmployeeV1.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java @@ -1,11 +1,11 @@ -package test.com.coderising.jvm.loader; +package test.com.coderising.jvm; +@SuppressWarnings("unused") public class EmployeeV1 { - - + private String name; - private int age; - + private int age ; + public EmployeeV1(String name, int age) { this.name = name; this.age = age; diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java deleted file mode 100644 index b274338091..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package test.com.coderising.jvm.loader; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.loader.ClassFileLoader; - -public class ClassFileloaderTest { - - static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; - static String path2 = "C:\temp"; - - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "test.com.coderising.jvm.loader.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1070, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "test.com.coderising.jvm.loader.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i node = tree.insert(4); + Assert.assertEquals((int)node.getParent().getData(), 2); + Assert.assertEquals((int)node.getParent().getLeft().getData(), 1); + + BinaryTreeNode node2 = tree.insert(8); + Assert.assertEquals((int)node2.getParent().getData(), 7); + Assert.assertEquals((int)node2.getParent().getLeft().getData(), 6); + } + + @Test + public void traversal(){ + + insert(); + //以根节点为起点先序遍历 + List treeList = tree.traversalBefore(tree.getRoot()); + //expected value + int[] exValue = {5,2,1,4,7,6,8}; + for (int i = 0; i < exValue.length; i++) { + Assert.assertEquals((int)treeList.get(i),exValue[i]); + } + + //以数据2位起点先序遍历 + List treeList2 = tree.traversalBefore(tree.getRoot().getLeft()); + //expected value + int[] exValue2 = {2,1,4}; + for (int i = 0; i < exValue2.length; i++) { + Assert.assertEquals((int)treeList2.get(i),exValue2[i]); + } + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java index 75af57b371..b12d23cdbd 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java @@ -1,64 +1,64 @@ -package test.com.coding.basic; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Queue; - -public class QueueTest { - - Queue qe ; - - @Before - public void setup() { - qe = new Queue(); - for (int i = 0; i < 10; i++) { - qe.enQueue(i); - } - } - - @Test - public void enQueue(){ - - Assert.assertEquals(qe.size(), 10); - qe.enQueue("abcd"); - Assert.assertEquals(qe.size(), 11); - } - - @Test//(expected = IndexOutOfBoundsException.class) - public void deQueue(){ - - Assert.assertEquals(qe.size(), 10); - for (int i = 0; i < 10; i++) { - Assert.assertEquals(qe.deQueue(), i); - } - Assert.assertEquals(qe.size(), 0); - //打开下列语句与期望异常测试 - //qe.deQueue(); - } - - public void isEmpty(){ - - Assert.assertEquals(qe.isEmpty(),false); - for (int i = 0; i < 10; i++) { - qe.deQueue(); - } - Assert.assertEquals(qe.isEmpty(),true); - Queue qe1 = new Queue(); - Assert.assertEquals(qe1.isEmpty(), true); - } - - public void size(){ - - Assert.assertEquals(qe.size(),10); - qe.enQueue("lk"); - qe.enQueue('h'); - Assert.assertEquals(qe.size(),12); - for (int i = 0; i < 12; i++) { - qe.deQueue(); - } - Assert.assertEquals(qe.size(),0); - Queue qe1 = new Queue(); - Assert.assertEquals(qe1.size(), 0); - } -} +package test.com.coding.basic; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.Queue; + +public class QueueTest { + + Queue qe ; + + @Before + public void setup() { + qe = new Queue<>(); + for (int i = 0; i < 10; i++) { + qe.enQueue(i); + } + } + + @Test + public void enQueue(){ + + Assert.assertEquals(qe.size(), 10); + qe.enQueue("abcd"); + Assert.assertEquals(qe.size(), 11); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void deQueue(){ + + Assert.assertEquals(qe.size(), 10); + for (int i = 0; i < 10; i++) { + Assert.assertEquals(qe.deQueue(), i); + } + Assert.assertEquals(qe.size(), 0); + //打开下列语句与期望异常测试 + //qe.deQueue(); + } + + public void isEmpty(){ + + Assert.assertEquals(qe.isEmpty(),false); + for (int i = 0; i < 10; i++) { + qe.deQueue(); + } + Assert.assertEquals(qe.isEmpty(),true); + Queue qe1 = new Queue<>(); + Assert.assertEquals(qe1.isEmpty(), true); + } + + public void size(){ + + Assert.assertEquals(qe.size(),10); + qe.enQueue("lk"); + qe.enQueue('h'); + Assert.assertEquals(qe.size(),12); + for (int i = 0; i < 12; i++) { + qe.deQueue(); + } + Assert.assertEquals(qe.size(),0); + Queue qe1 = new Queue<>(); + Assert.assertEquals(qe1.size(), 0); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java index 9c4d91e8b3..ee20d2e038 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java @@ -9,10 +9,10 @@ public class ArrayListTest { - ArrayList ls ; + ArrayList ls ; @Before public void setup() { - ls = new ArrayList(); + ls = new ArrayList<>(); } /** diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java index e8303b8aba..c7dce9c1aa 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java @@ -94,7 +94,7 @@ public void testJoin() { @Test public void testObjList2int() { - ArrayList ls = new ArrayList(); + ArrayList ls = new ArrayList<>(); for (int i = 0; i < 10; i++) { ls.add(i); } diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java index 9a6e86000e..26d95dbc98 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java @@ -9,10 +9,10 @@ public class LinkedListTest { - LinkedList ls ; + LinkedList ls ; @Before public void setup() { - ls = new LinkedList(); + ls = new LinkedList<>(); } /** @@ -169,7 +169,7 @@ public void testGetElements(){ ls.add(201);ls.add(301); ls.add(401);ls.add(501); ls.add(601);ls.add(701); - LinkedList list = new LinkedList(); + LinkedList list = new LinkedList<>(); list.add(1);list.add(3); list.add(4);list.add(6); int[] exceptArr = {101,301,401,601}; @@ -189,7 +189,7 @@ public void testSubtract(){ ls.add(8); ls.add(10); - LinkedList list = new LinkedList(); + LinkedList list = new LinkedList<>(); list.add(2); list.add(5); @@ -236,19 +236,19 @@ public void testIntersection(){ ls.add(3); ls.add(5); - LinkedList list = new LinkedList(); + LinkedList list = new LinkedList<>(); list.add(-1); list.add(0); list.add(5); list.add(9); - LinkedList newList = ls.intersection(list); + LinkedList newList = ls.intersection(list); int[] exceptArr = {-1,0,5}; exceptResult(newList,exceptArr); } - private void exceptResult(LinkedList ls,int[] exceptArr){ + private void exceptResult(LinkedList ls,int[] exceptArr){ Assert.assertEquals(ls.size(), exceptArr.length); for (int i = 0; i < exceptArr.length; i++) { diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java similarity index 82% rename from group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java rename to group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java index 5d9fcd0f16..d43b6f1914 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java @@ -1,76 +1,76 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Stack; - -public class StackTest { - - Stack st ; - - @Before - public void setup() { - st = new Stack(); - for (int i = 0; i < 10; i++) { - st.push(i); - } - } - - @Test - public void push(){ - - Assert.assertEquals(st.size(), 10); - st.push(10); - st.push('a'); - Assert.assertEquals(st.size(), 12); - } - - @Test//(expected = IndexOutOfBoundsException.class) - public void pop(){ - - Assert.assertEquals(st.size(), 10); - for (int i = 9; i >= 0; i--) { - Assert.assertEquals(st.pop(), i); - } - //打开下列语句抛出期望异常 - //st.pop(); - } - - @Test - public void peek(){ - - Assert.assertEquals(st.size(), 10); - Assert.assertEquals(st.peek(), 9); - Assert.assertEquals(st.size(), 10); - } - - @Test - public void isEmpty(){ - - Assert.assertEquals(st.isEmpty(), false); - for (int i = 0; i < 10; i++) { - st.pop(); - } - Assert.assertEquals(st.isEmpty(), true); - Stack st1 = new Stack(); - Assert.assertEquals(st1.isEmpty(), true); - } - - public void size(){ - - Assert.assertEquals(st.size(),10); - st.push("lk"); - st.push('h'); - Assert.assertEquals(st.size(),12); - for (int i = 0; i < 12; i++) { - st.pop(); - } - Assert.assertEquals(st.size(),0); - st.peek(); - Assert.assertEquals(st.size(),0); - Stack st1 = new Stack(); - Assert.assertEquals(st1.size(), 0); - } -} +package test.com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.Stack; + +public class StackTest { + + Stack st ; + + @Before + public void setup() { + st = new Stack<>(); + for (int i = 0; i < 10; i++) { + st.push(i); + } + } + + @Test + public void push(){ + + Assert.assertEquals(st.size(), 10); + st.push(10); + st.push('a'); + Assert.assertEquals(st.size(), 12); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void pop(){ + + Assert.assertEquals(st.size(), 10); + for (int i = 9; i >= 0; i--) { + Assert.assertEquals(st.pop(), i); + } + //打开下列语句抛出期望异常 + //st.pop(); + } + + @Test + public void peek(){ + + Assert.assertEquals(st.size(), 10); + Assert.assertEquals(st.peek(), 9); + Assert.assertEquals(st.size(), 10); + } + + @Test + public void isEmpty(){ + + Assert.assertEquals(st.isEmpty(), false); + for (int i = 0; i < 10; i++) { + st.pop(); + } + Assert.assertEquals(st.isEmpty(), true); + Stack st1 = new Stack<>(); + Assert.assertEquals(st1.isEmpty(), true); + } + + public void size(){ + + Assert.assertEquals(st.size(),10); + st.push("lk"); + st.push('h'); + Assert.assertEquals(st.size(),12); + for (int i = 0; i < 12; i++) { + st.pop(); + } + Assert.assertEquals(st.size(),0); + st.peek(); + Assert.assertEquals(st.size(),0); + Stack st1 = new Stack<>(); + Assert.assertEquals(st1.size(), 0); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..d09f893de2 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,95 @@ +package test.com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.StackUtil; + +public class StackUtilTest { + + Stack s ; + + @Before + public void setup() { + //初始化栈元素:5,4,3,2,1 + s = new Stack<>(); + for (int i = 1; i <= 5; i++) { + s.push(i); + } + } + + @Test + public void testReverse() { + + StackUtil.reverse(s); + Assert.assertEquals(s.size(), 5); + Assert.assertEquals("[1,2,3,4,5]", s.toString()); + } + + @Test + public void testRemove() { + + StackUtil.remove(s, 5); + Assert.assertEquals("[4,3,2,1]", s.toString()); + + StackUtil.remove(s, 1); + Assert.assertEquals("[4,3,2]", s.toString()); + + StackUtil.remove(s, 4); + Assert.assertEquals("[3,2]", s.toString()); + } + + @Test + public void testGetTop() { + + Object[] obj = StackUtil.getTop(s, 6); + Assert.assertEquals(5, obj.length); + Assert.assertEquals(s.toString(),arrayToString(obj)); + + Object[] obj1 = StackUtil.getTop(s, 2); + Assert.assertEquals(2, obj1.length); + Assert.assertEquals("[5,4]",arrayToString(obj1)); + + } + + @Test + public void testIsValidPairs() { + + String s0 = "([e{d}f])"; + Assert.assertEquals(true,StackUtil.isValidPairs(s0)); + + String s1 = "(]e{d}f[)"; + Assert.assertEquals(false,StackUtil.isValidPairs(s1)); + + String s2 = "([b{x]y})"; + Assert.assertEquals(false,StackUtil.isValidPairs(s2)); + + String s3 = "()((()()))()"; + Assert.assertEquals(true,StackUtil.isValidPairs(s3)); + + String s4 = "(fs{fs[fs("; + Assert.assertEquals(false,StackUtil.isValidPairs(s4)); + + String s5 = "gshsg54fs"; + Assert.assertEquals(false,StackUtil.isValidPairs(s5)); + + + } + + private static String arrayToString(Object[] objs){ + + StringBuffer sBuffer = new StringBuffer(); + sBuffer.append("["); + + for (int i = 0; i < objs.length; i++) { + if(i == objs.length-1){ + sBuffer.append(objs[i]+"]"); + }else{ + sBuffer.append(objs[i]+","); + } + } + return sBuffer.toString(); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..d22f51a98b --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package test.com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.expr.InfixExpr; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } +} From 04ba9f6d815ef66b5eb03e64793e39a1a836bbef Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 17 Apr 2017 21:38:23 +0800 Subject: [PATCH 171/552] =?UTF-8?q?=E4=B8=AD=E7=BC=80=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E6=B1=82=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/InfixExpr.java | 134 ++++++++++++++++++ .../basic/stack/expr/InfixExprTest.java | 52 +++++++ 2 files changed, 186 insertions(+) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..92727ce984 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java @@ -0,0 +1,134 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import java.util.LinkedList; +import java.util.List; +import java.util.Stack; + +public class InfixExpr { + private String expr = null; + enum Operator { + PLUS("+", 1), SUB("-", 1), MUL("*", 2), DIV("/", 2); // 优先级越大,说明应该先算 + private String value; + private int priority; + Operator(String value, int prioriy) { + this.value = value; + this.priority = prioriy; + } + public static Operator parseOperator(String value) { + for (Operator c : Operator.values()) { + if (c.value.equals(value)) { + return c; + } + } + throw new RuntimeException("运算符不存在"); + } + } + + public InfixExpr(String expr) { + this.expr = expr; + } + private static Token evaluate(Token operator, Token number1, Token number2) { + float ret; + switch (operator.value) { + case PLUS: + ret = number1.getValue() + number2.getValue(); + break; + case SUB: + ret = number1.getValue() - number2.getValue(); + break; + case MUL: + ret = number1.getValue() * number2.getValue(); + break; + case DIV: + ret = number1.getValue() / number2.getValue(); + break; + default: + throw new RuntimeException("运算符不存在"); + } + return new Token(ret, true); + } + + + public float evaluate() { + List tokens= Token.parse(expr); + Stack> numberStack = new Stack<>(); + Stack> operatorStack = new Stack<>(); + for (Token t : tokens) { + if (t.isNumber()) { + numberStack.push(t); + } else { + if (operatorStack.isEmpty()) { + operatorStack.push(t); + } else { + Token preT = operatorStack.peek(); + if ((preT.value).priority >= ((Operator)t.value).priority) { + Token number2 = numberStack.pop(); + Token number1 = numberStack.pop(); + operatorStack.pop(); + numberStack.push(evaluate(preT, number1, number2)); + } + operatorStack.push(t); + + } + } + } + while (!operatorStack.isEmpty()) { + Token number2 = numberStack.pop(); + Token number1 = numberStack.pop(); + Token operator = operatorStack.pop(); + numberStack.push(evaluate(operator, number1, number2)); + } + return numberStack.pop().getValue(); + } + + + private static class Token { + private boolean number; // 是数字/操作符 + private T value; + public boolean isNumber() { + return number; + } + public T getValue() { + return value; + } + + public Token(T value, boolean number) { + this.value = value; + this.number = number; + } + public static List parse(String expr) { + int i = 0; + int size = expr.length(); + String current; + List tokens = new LinkedList<>(); + String value = ""; + while (i < size) { + current = expr.substring(i,i+1); + if (isOperator(current)) { + tokens.add(new Token(Float.parseFloat(value), true)); + value = ""; + tokens.add(new Token(Operator.parseOperator(current), false)); + } else { + value += current; + } + i++; + } + tokens.add(new Token(Float.parseFloat(value), true)); + return tokens; + } + + private static boolean isOperator(String value) { + for (Operator c : Operator.values()) { + if (c.value.equals(value)) { + return true; + } + } + return false; + } + } + + public static void main(String[] args) { + + + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..706aaea86e --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3"); + Assert.assertEquals(5.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} From 159838d883b7930536f87d9d8125dba0617e0716 Mon Sep 17 00:00:00 2001 From: onlyLYJ <382266293@qq.com> Date: Mon, 17 Apr 2017 21:44:12 +0800 Subject: [PATCH 172/552] new work --- .../coding/basic/stack/expr/InfixExpr.java | 2 +- .../basic/stack/expr/InfixToPostfix.java | 14 ++ .../coding/basic/stack/expr/PostfixExpr.java | 18 +++ .../basic/stack/expr/PostfixExprTest.java | 41 +++++ .../coding/basic/stack/expr/PrefixExpr.java | 18 +++ .../basic/stack/expr/PrefixExprTest.java | 45 ++++++ .../coding/basic/stack/expr/TParser.java | 85 +++++++++++ .../coding/basic/stack/expr/Token.java | 50 ++++++ .../coding/basic/stack/expr/TokenParser.java | 143 +++++++----------- .../basic/stack/expr/TokenParserTest.java | 41 +++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 31 ++-- .../jvm/attr/LocalVariableTable.java | 15 ++ .../src/com/coderising/jvm/clz/ClassFile.java | 11 ++ .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 +++ .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 85 +++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 +++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 +++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 ++++++++ .../jvm/loader/ClassFileParser.java | 2 - .../src/com/coderising/jvm/method/Method.java | 52 +++++-- .../jvm/test/ClassFileloaderTest.java | 78 ++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 48 +++--- 30 files changed, 1071 insertions(+), 133 deletions(-) create mode 100644 group12/382266293/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group12/382266293/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group12/382266293/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group12/382266293/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group12/382266293/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group12/382266293/coding/basic/stack/expr/TParser.java create mode 100644 group12/382266293/coding/basic/stack/expr/Token.java create mode 100644 group12/382266293/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index 2b4d531c40..0d23091ab1 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -12,7 +12,7 @@ public InfixExpr(String expr) { public float evaluate() { - TokenParser tp = new TokenParser(); + TParser tp = new TParser(); tp.parse(expr); Stack ints = new Stack(); Stack signs = new Stack(); diff --git a/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java b/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..790984607f --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,14 @@ +package stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} diff --git a/group12/382266293/coding/basic/stack/expr/PostfixExpr.java b/group12/382266293/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..30682ae05d --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,18 @@ +package stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java b/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..1a6137e537 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/PrefixExpr.java b/group12/382266293/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..96bef48492 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,18 @@ +package stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java b/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..85b68a1020 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/TParser.java b/group12/382266293/coding/basic/stack/expr/TParser.java new file mode 100644 index 0000000000..06c543efd3 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/TParser.java @@ -0,0 +1,85 @@ +package stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingDeque; + +public class TParser { + + Queue intQ; + Queue signQ; + static final List signs = new ArrayList(); + { + signs.add("+"); + signs.add("-"); + signs.add("*"); + signs.add("/"); + } + + public TParser() { + intQ = new LinkedBlockingDeque(); + signQ = new LinkedBlockingDeque(); + } + + public void parse(String expr) { + + String[] tokens = expr.split(""); + String number = ""; + + for (int i = 0; i < tokens.length; i++) { + + String c = tokens[i]; + + if (isSign(c)) { + + signQ.add(c); + + int num = Integer.parseInt(number); + intQ.add(num); + number = ""; + + } else { + + number += tokens[i]; + + } + + } + + int num = Integer.parseInt(number); + intQ.add(num); + + int intSize = intQ.size(); + if (intSize < 2 || intSize - signQ.size() > 1) { + throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ); + } + + intQ.add(0); + + } + + private boolean isSign(String c) { + if (signs.contains(c)) { + return true; + } + return false; + } + + public int nextInt() { + return intQ.poll(); + } + + public String nextSign() { + return signQ.poll(); + } + + public boolean hasNextInt() { + return !intQ.isEmpty(); + } + + public boolean hasNextSign() { + return !signQ.isEmpty(); + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/Token.java b/group12/382266293/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..203f91d61f --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group12/382266293/coding/basic/stack/expr/TokenParser.java b/group12/382266293/coding/basic/stack/expr/TokenParser.java index 4fa0d7b79e..5f4be41e00 100644 --- a/group12/382266293/coding/basic/stack/expr/TokenParser.java +++ b/group12/382266293/coding/basic/stack/expr/TokenParser.java @@ -1,86 +1,57 @@ -package stack.expr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Queue; -import java.util.concurrent.LinkedBlockingDeque; - -public class TokenParser { - - Queue intQ; - Queue signQ; - static final List signs = new ArrayList(); - { - signs.add("+"); - signs.add("-"); - signs.add("*"); - signs.add("/"); - } - - public TokenParser() { - intQ = new LinkedBlockingDeque(); - signQ = new LinkedBlockingDeque(); - } - - public void parse(String expr) { - - String[] tokens = expr.split(""); - String number = ""; - String sign = ""; - - for (int i = 0; i < tokens.length; i++) { - - String c = tokens[i]; - - if (isSign(c)) { - sign = c; - signQ.add(sign); - if (!number.equals("")) { - int num = Integer.parseInt(number); - intQ.add(num); - number = ""; - } - } else { - number += tokens[i]; - } - - } - - if (!number.equals("")) { - int num = Integer.parseInt(number); - intQ.add(num); - } - - int intSize = intQ.size(); - if (intSize < 2 || intSize - signQ.size() > 1) { - throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ); - } - - intQ.add(0); - - } - - private boolean isSign(String c) { - if (signs.contains(c)) { - return true; - } - return false; - } - - public int nextInt() { - return intQ.poll(); - } - - public String nextSign() { - return signQ.poll(); - } - - public boolean hasNextInt() { - return !intQ.isEmpty(); - } - - public boolean hasNextSign() { - return !signQ.isEmpty(); - } - -} +package stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group12/382266293/coding/basic/stack/expr/TokenParserTest.java b/group12/382266293/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..22dd219fb7 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java index da9c2899a2..6ccca5f5cf 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,6 +1,9 @@ package com.coderising.jvm.attr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -20,7 +23,8 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ String code = iter.nextUxToHexString(codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); System.out.println("Code is " + code); @@ -70,21 +74,17 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ private int codeLen ; private String code; - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public String getCode() { @@ -105,8 +105,21 @@ private void setStackMapTable(StackMapTable t) { } - - + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i methods) { public void setMinorVersion(int minorVersion) { this.minorVersion = minorVersion; } + + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java b/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..2bb36340f5 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java index b29cfe1d45..c20fbfe855 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java @@ -174,8 +174,6 @@ private void parseInterfaces(ByteCodeIterator iter) { private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { int methodNum = iter.nextU2ToInt(); - - ConstantPool pool = clzFile.getConstantPool(); for (int i = 0; i < methodNum; i++) { Method method = Method.parse(clzFile,iter); clzFile.addMethod(method); diff --git a/group12/382266293/src/com/coderising/jvm/method/Method.java b/group12/382266293/src/com/coderising/jvm/method/Method.java index 705ec22792..2bb53cdf06 100644 --- a/group12/382266293/src/com/coderising/jvm/method/Method.java +++ b/group12/382266293/src/com/coderising/jvm/method/Method.java @@ -3,11 +3,32 @@ import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; public class Method { + + + private int accessFlag; + private int nameIndex; + + private int descriptorIndex; + + private CodeAttr codeAttr; + + + private ClassFile clzFile; + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ @@ -39,22 +60,17 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - private CodeAttr codeAttr; - private ClassFile clzFile; - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; + + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); } + public ClassFile getClzFile() { return clzFile; } @@ -75,4 +91,20 @@ public int getNameIndex() { public void setCodeAttr(CodeAttr code) { this.codeAttr = code; } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } } diff --git a/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java index 15050a0d76..883ad99c05 100644 --- a/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -10,6 +10,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -260,5 +264,79 @@ public void testVersion() { } + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + } diff --git a/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java b/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java index 24c0cae543..9a36573dd3 100644 --- a/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java +++ b/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java @@ -1,30 +1,28 @@ package com.coderising.jvm.test; public class EmployeeV1 { - - public static void main(String[] args) { - EmployeeV1 p = new EmployeeV1("Andy", 29); - p.sayHello(); - - } + + private String name; - - private int age; - - public EmployeeV1(String name, int age) { - this.name = name; - this.age = age; - } - - public void sayHello() { - System.out.println("Hello , this is class Employee "); - } - - public void setAge(int age) { - this.age = age; - } - - public void setName(String name) { - this.name = 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 From 4fd8d2a642f1d5b0478c3096ed2a83f67bfe6083 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 17 Apr 2017 22:18:33 +0800 Subject: [PATCH 173/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group02/812350401/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 8cd204f114..8380fddb34 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -4,3 +4,4 @@ src/main/java/train/ !src/main/resources/**/*.class !src/main/resources/**/*.xml src/main/resources/**/*.png +src/main/java/assignments From b62b5fb5d9ac212b84981ee299584e0c79de05c6 Mon Sep 17 00:00:00 2001 From: gongxun Date: Mon, 17 Apr 2017 23:39:47 +0800 Subject: [PATCH 174/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A04=E6=9C=8816=E6=97=A5?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.16/cmd/BiPushCmd.java | 20 +++ .../785396327/4.16/cmd/ByteCodeCommand.java | 129 ++++++++++++++++++ group17/785396327/4.16/cmd/CommandParser.java | 86 ++++++++++++ group17/785396327/4.16/cmd/GetFieldCmd.java | 20 +++ .../785396327/4.16/cmd/GetStaticFieldCmd.java | 20 +++ .../785396327/4.16/cmd/InvokeSpecialCmd.java | 20 +++ .../785396327/4.16/cmd/InvokeVirtualCmd.java | 19 +++ group17/785396327/4.16/cmd/LdcCmd.java | 30 ++++ group17/785396327/4.16/cmd/NewObjectCmd.java | 20 +++ group17/785396327/4.16/cmd/NoOperandCmd.java | 24 ++++ group17/785396327/4.16/cmd/OneOperandCmd.java | 27 ++++ group17/785396327/4.16/cmd/PutFieldCmd.java | 19 +++ group17/785396327/4.16/cmd/TwoOperandCmd.java | 65 +++++++++ group17/785396327/4.5/clz/ClassFile.java | 10 ++ .../4.5/test/ClassFileloaderTest.java | 80 +++++++++++ group17/785396327/4.9/attr/CodeAttr.java | 22 ++- group17/785396327/4.9/expr/ExprParser.java | 4 +- group17/785396327/4.9/method/Method.java | 5 + 18 files changed, 611 insertions(+), 9 deletions(-) create mode 100644 group17/785396327/4.16/cmd/BiPushCmd.java create mode 100644 group17/785396327/4.16/cmd/ByteCodeCommand.java create mode 100644 group17/785396327/4.16/cmd/CommandParser.java create mode 100644 group17/785396327/4.16/cmd/GetFieldCmd.java create mode 100644 group17/785396327/4.16/cmd/GetStaticFieldCmd.java create mode 100644 group17/785396327/4.16/cmd/InvokeSpecialCmd.java create mode 100644 group17/785396327/4.16/cmd/InvokeVirtualCmd.java create mode 100644 group17/785396327/4.16/cmd/LdcCmd.java create mode 100644 group17/785396327/4.16/cmd/NewObjectCmd.java create mode 100644 group17/785396327/4.16/cmd/NoOperandCmd.java create mode 100644 group17/785396327/4.16/cmd/OneOperandCmd.java create mode 100644 group17/785396327/4.16/cmd/PutFieldCmd.java create mode 100644 group17/785396327/4.16/cmd/TwoOperandCmd.java diff --git a/group17/785396327/4.16/cmd/BiPushCmd.java b/group17/785396327/4.16/cmd/BiPushCmd.java new file mode 100644 index 0000000000..e69c53310f --- /dev/null +++ b/group17/785396327/4.16/cmd/BiPushCmd.java @@ -0,0 +1,20 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/17. + */ +public class BiPushCmd extends OneOperandCmd { + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); + } +} diff --git a/group17/785396327/4.16/cmd/ByteCodeCommand.java b/group17/785396327/4.16/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..97865bbd31 --- /dev/null +++ b/group17/785396327/4.16/cmd/ByteCodeCommand.java @@ -0,0 +1,129 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantInfo; +import constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by IBM on 2017/4/17. + */ +public abstract class ByteCodeCommand { + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group17/785396327/4.16/cmd/CommandParser.java b/group17/785396327/4.16/cmd/CommandParser.java new file mode 100644 index 0000000000..35d9f80831 --- /dev/null +++ b/group17/785396327/4.16/cmd/CommandParser.java @@ -0,0 +1,86 @@ +package cmd; + +import clz.ClassFile; + +import java.util.List; + +/** + * Created by IBM on 2017/4/17. + */ +public class CommandParser { + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group17/785396327/4.16/cmd/GetFieldCmd.java b/group17/785396327/4.16/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..a255cef97b --- /dev/null +++ b/group17/785396327/4.16/cmd/GetFieldCmd.java @@ -0,0 +1,20 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/17. + */ +public class GetFieldCmd extends TwoOperandCmd { + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group17/785396327/4.16/cmd/GetStaticFieldCmd.java b/group17/785396327/4.16/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..37ca3c7195 --- /dev/null +++ b/group17/785396327/4.16/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/17. + */ +public class GetStaticFieldCmd extends TwoOperandCmd { + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } +} diff --git a/group17/785396327/4.16/cmd/InvokeSpecialCmd.java b/group17/785396327/4.16/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..80af63e860 --- /dev/null +++ b/group17/785396327/4.16/cmd/InvokeSpecialCmd.java @@ -0,0 +1,20 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/17. + */ +public class InvokeSpecialCmd extends TwoOperandCmd { + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } +} diff --git a/group17/785396327/4.16/cmd/InvokeVirtualCmd.java b/group17/785396327/4.16/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..631e743c5f --- /dev/null +++ b/group17/785396327/4.16/cmd/InvokeVirtualCmd.java @@ -0,0 +1,19 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/17. + */ +public class InvokeVirtualCmd extends TwoOperandCmd { + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } +} diff --git a/group17/785396327/4.16/cmd/LdcCmd.java b/group17/785396327/4.16/cmd/LdcCmd.java new file mode 100644 index 0000000000..183a4010de --- /dev/null +++ b/group17/785396327/4.16/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantInfo; +import constant.ConstantPool; +import constant.StringInfo; + +/** + * Created by IBM on 2017/4/17. + */ +public class LdcCmd extends OneOperandCmd { + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + value = strInfo.toString(); + } + + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; + + } +} diff --git a/group17/785396327/4.16/cmd/NewObjectCmd.java b/group17/785396327/4.16/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..6cd609aeb4 --- /dev/null +++ b/group17/785396327/4.16/cmd/NewObjectCmd.java @@ -0,0 +1,20 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/17. + */ +public class NewObjectCmd extends TwoOperandCmd { + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + +} diff --git a/group17/785396327/4.16/cmd/NoOperandCmd.java b/group17/785396327/4.16/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..7797d5218e --- /dev/null +++ b/group17/785396327/4.16/cmd/NoOperandCmd.java @@ -0,0 +1,24 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/17. + */ +public class NoOperandCmd extends ByteCodeCommand { + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } +} diff --git a/group17/785396327/4.16/cmd/OneOperandCmd.java b/group17/785396327/4.16/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..4f3dbc9feb --- /dev/null +++ b/group17/785396327/4.16/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package cmd; + +import clz.ClassFile; + +/** + * Created by IBM on 2017/4/17. + */ +public abstract class OneOperandCmd extends ByteCodeCommand { + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } +} diff --git a/group17/785396327/4.16/cmd/PutFieldCmd.java b/group17/785396327/4.16/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..07c88273cc --- /dev/null +++ b/group17/785396327/4.16/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; + +/** + * Created by IBM on 2017/4/17. + */ +public class PutFieldCmd extends TwoOperandCmd { + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } +} diff --git a/group17/785396327/4.16/cmd/TwoOperandCmd.java b/group17/785396327/4.16/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..a12df75e52 --- /dev/null +++ b/group17/785396327/4.16/cmd/TwoOperandCmd.java @@ -0,0 +1,65 @@ +package cmd; + +import clz.ClassFile; +import constant.*; + +/** + * Created by IBM on 2017/4/17. + */ +public abstract class TwoOperandCmd extends ByteCodeCommand { + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group17/785396327/4.5/clz/ClassFile.java b/group17/785396327/4.5/clz/ClassFile.java index e65cfbda81..27e78451c5 100644 --- a/group17/785396327/4.5/clz/ClassFile.java +++ b/group17/785396327/4.5/clz/ClassFile.java @@ -91,4 +91,14 @@ private String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } } diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java index 854453f2bd..3e4f3e100c 100644 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -2,6 +2,10 @@ import clz.ClassFile; import clz.ClassIndex; +import cmd.BiPushCmd; +import cmd.ByteCodeCommand; +import cmd.OneOperandCmd; +import cmd.TwoOperandCmd; import constant.*; import field.Field; import jvm_1.ClassFileLoader; @@ -265,4 +269,80 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedCode, code); } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + } diff --git a/group17/785396327/4.9/attr/CodeAttr.java b/group17/785396327/4.9/attr/CodeAttr.java index 9e3505eb37..fb8e530b9b 100644 --- a/group17/785396327/4.9/attr/CodeAttr.java +++ b/group17/785396327/4.9/attr/CodeAttr.java @@ -1,6 +1,8 @@ package attr; import clz.ClassFile; +import cmd.ByteCodeCommand; +import cmd.CommandParser; import constant.ConstantInfo; import iterator.ByteCodeIterator; @@ -17,21 +19,24 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, + ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -50,9 +55,12 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { int maxLocals = iter.nextU2ToInt(); int codeLength = iter.nextU4ToInt(); String code = iter.nextLengthString(codeLength); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + int exceptionTableLength = iter.nextU2ToInt();//跳过异常表 // System.out.println("Code属性表中的异常表元素大小:" + exceptionTableLength); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, cmds); int attributesCount = iter.nextU2ToInt(); //code属性表中又有属性 for (int i = 0; i < attributesCount; i++) { diff --git a/group17/785396327/4.9/expr/ExprParser.java b/group17/785396327/4.9/expr/ExprParser.java index a197377b4a..09a909fbad 100644 --- a/group17/785396327/4.9/expr/ExprParser.java +++ b/group17/785396327/4.9/expr/ExprParser.java @@ -16,7 +16,7 @@ public static List parse(InfixExpr infixExpr) { StringBuilder numberBuffer = new StringBuilder(); for (int i = 0; i < split.length; i++) { String ele = split[i]; - if (ele.equals(OperEnum.ADD.getOperator()) || ele.equals(OperEnum.SUBSTRACT.getOperator()) || ele.equals(OperEnum.MINUS.getOperator()) || ele.equals(OperEnum.MULTIPLY.getOperator())) { + if (ele.equals(OperEnum.ADD.getOperator()) || ele.equals(OperEnum.SUBTRACT.getOperator()) || ele.equals(OperEnum.MINUS.getOperator()) || ele.equals(OperEnum.MULTIPLY.getOperator())) { results.add(numberBuffer.toString()); numberBuffer.delete(0, numberBuffer.length()); results.add(ele); @@ -32,6 +32,6 @@ public static boolean belongsHighPriority(String operEle) { } public static boolean belongsOperator(String operEle) { - return (operEle != null) && (operEle.trim().equals(OperEnum.ADD.getOperator()) || operEle.trim().equals(OperEnum.SUBSTRACT.getOperator()) || operEle.trim().equals(OperEnum.MULTIPLY.getOperator()) || operEle.trim().equals(OperEnum.MINUS.getOperator())); + return (operEle != null) && (operEle.trim().equals(OperEnum.ADD.getOperator()) || operEle.trim().equals(OperEnum.SUBTRACT.getOperator()) || operEle.trim().equals(OperEnum.MULTIPLY.getOperator()) || operEle.trim().equals(OperEnum.MINUS.getOperator())); } } diff --git a/group17/785396327/4.9/method/Method.java b/group17/785396327/4.9/method/Method.java index 8a5fb59e09..1b5daa244b 100644 --- a/group17/785396327/4.9/method/Method.java +++ b/group17/785396327/4.9/method/Method.java @@ -2,6 +2,7 @@ import attr.CodeAttr; import clz.ClassFile; +import cmd.ByteCodeCommand; import iterator.ByteCodeIterator; import util.Util; @@ -59,4 +60,8 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { return method; } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } From 4f3cecbd63b2fa0ee5a8f3d9e10c6b7163f840c5 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Tue, 18 Apr 2017 06:13:33 +0800 Subject: [PATCH 175/552] =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=8Eattr?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E5=88=9D=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/InfixExprTest.java | 4 + .../coderising/jvm/clz/ClassFile.java | 26 +++-- .../coderising/jvm/field/Field.java | 50 ++++++++++ .../coderising/jvm/method/Method.java | 96 +++++++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 77 ++++++++++++++- 5 files changed, 245 insertions(+), 8 deletions(-) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java index 706aaea86e..a14953535d 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java @@ -46,6 +46,10 @@ public void testEvaluate() { InfixExpr expr = new InfixExpr("10-30+50"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } + { + InfixExpr expr = new InfixExpr("10-30+50-20/10/2*4"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java index c4d13704f2..82eee82fb5 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java @@ -1,9 +1,14 @@ package com.github.miniyk2012.coding2017.coderising.jvm.clz; +import assignments.jvm.field.Field; +import assignments.jvm.method.Method; import com.github.miniyk2012.coding2017.coderising.jvm.constant.ClassInfo; import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; +import java.util.ArrayList; +import java.util.List; + public class ClassFile { private int minorVersion; @@ -12,7 +17,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -24,8 +30,6 @@ public void setAccessFlag(AccessFlag accessFlag) { this.accessFlag = accessFlag; } - - public ConstantPool getConstantPool() { return pool; } @@ -43,20 +47,28 @@ public void setMajorVersion(int majorVersion) { } public void setConstPool(ConstantPool pool) { this.pool = pool; - + } + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; } 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()); } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..017e6cd8bc --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.field; + +import assignments.jvm.constant.ConstantPool; +import assignments.jvm.constant.UTF8Info; +import assignments.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool, ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..f9e62fbb93 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java @@ -0,0 +1,96 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.method; + +import assignments.jvm.clz.ClassFile; +import assignments.jvm.attr.AttributeInfo; +import assignments.jvm.attr.CodeAttr; +import assignments.jvm.constant.ConstantPool; +import assignments.jvm.constant.UTF8Info; +import assignments.jvm.loader.ByteCodeIterator; + + + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + + + +public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + for( int j=1; j<= attribCount; j++){ + + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else{ + throw new RuntimeException("only CODE attribute is implemented , please implement the "+ attrName); + } + + } + + return m ; + + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java index 013ec8073a..21d5ddbd71 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java @@ -1,15 +1,19 @@ package com.github.miniyk2012.coding2017.coderising.jvm.test; +import assignments.jvm.field.Field; +import assignments.jvm.method.Method; import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassIndex; import com.github.miniyk2012.coding2017.coderising.jvm.constant.*; import com.github.miniyk2012.coding2017.coderising.jvm.loader.ClassFileLoader; import com.github.miniyk2012.coding2017.coderising.jvm.util.Util; import org.junit.After; -import org.junit.Assert; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.List; + public class ClassFileloaderTest { @@ -172,5 +176,76 @@ public void testClassIndex(){ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } From 51a57fbbc581b82d0ed5ae5a1e7f83bf6fbff9a7 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Tue, 18 Apr 2017 06:58:12 +0800 Subject: [PATCH 176/552] =?UTF-8?q?=E5=B0=86=E8=80=81=E5=A4=A7=E7=9A=84Fie?= =?UTF-8?q?ld=E5=92=8CMethod=E6=95=B4=E5=90=88=E5=88=B0=E6=88=91=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/attr/AttributeInfo.java | 19 +++ .../coderising/jvm/attr/CodeAttr.java | 120 ++++++++++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 68 ++++++++++ .../jvm/attr/LocalVariableItem.java | 39 ++++++ .../jvm/attr/LocalVariableTable.java | 57 +++++++++ .../coderising/jvm/attr/StackMapTable.java | 30 +++++ .../coderising/jvm/clz/ClassFile.java | 5 +- .../coderising/jvm/field/Field.java | 14 +- .../jvm/loader/ByteCodeIterator.java | 22 ++++ .../jvm/loader/ClassFileParser.java | 44 ++++++- .../coderising/jvm/method/Method.java | 25 ++-- .../jvm/test/ClassFileloaderTest.java | 4 +- 12 files changed, 422 insertions(+), 25 deletions(-) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/AttributeInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/StackMapTable.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/AttributeInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..661e65bb2b --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..e6b7da9bb6 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,120 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.attr; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; +import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + +public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2toInt(); + int attrLen = iter.nextU4toInt(); + int maxStack = iter.nextU2toInt(); + int maxLocals = iter.nextU2toInt(); + int codeLen = iter.nextU4toInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); + + int exceptionTableLen = iter.nextU2toInt(); + //TODO 处理exception + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.nextU2toInt(); + + for(int x=1; x<=subAttrCount; x++){ + int subAttrIndex = iter.nextU2toInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.skip(-2); + //line item table + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } + else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } + else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } + else{ + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + /*for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2toInt(); + int len = iter.nextU4toInt(); + + LineNumberTable table = new LineNumberTable(index,len); + + int itemLen = iter.nextU2toInt(); + + for(int i=1; i<=itemLen; i++){ + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2toInt()); + item.setLineNum(iter.nextU2toInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LocalVariableItem.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..8d2c4da5c7 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LocalVariableTable.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..3dd937aa2f --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,57 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.attr; + + +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; +import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2toInt(); + int len = iter.nextU4toInt(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.nextU2toInt(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2toInt()); + item.setLength(iter.nextU2toInt()); + item.setNameIndex(iter.nextU2toInt()); + item.setDescIndex(iter.nextU2toInt()); + item.setIndex(iter.nextU2toInt()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/StackMapTable.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..ef046cdfc2 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.attr; + + +import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2toInt(); + int len = iter.nextU4toInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java index 82eee82fb5..7135ef9bcb 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java @@ -1,10 +1,11 @@ package com.github.miniyk2012.coding2017.coderising.jvm.clz; -import assignments.jvm.field.Field; -import assignments.jvm.method.Method; + import com.github.miniyk2012.coding2017.coderising.jvm.constant.ClassInfo; import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; +import com.github.miniyk2012.coding2017.coderising.jvm.field.Field; +import com.github.miniyk2012.coding2017.coderising.jvm.method.Method; import java.util.ArrayList; import java.util.List; diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java index 017e6cd8bc..54d0854ba7 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java @@ -1,9 +1,9 @@ package com.github.miniyk2012.coding2017.coderising.jvm.field; -import assignments.jvm.constant.ConstantPool; -import assignments.jvm.constant.UTF8Info; -import assignments.jvm.loader.ByteCodeIterator; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.UTF8Info; +import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; public class Field { private int accessFlag; @@ -32,10 +32,10 @@ public String toString() { public static Field parse(ConstantPool pool, ByteCodeIterator iter){ - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); + int accessFlag = iter.nextU2toInt(); + int nameIndex = iter.nextU2toInt(); + int descIndex = iter.nextU2toInt(); + int attribCount = iter.nextU2toInt(); //System.out.println("field attribute count:"+ attribCount); Field f = new Field(accessFlag, nameIndex, descIndex,pool); diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java index 73eb2fc1ff..ef2a984ffa 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java @@ -24,6 +24,10 @@ public int nextU2toInt() { return Util.byteToInt(u2); } + public int nextU4toInt() { + return assignments.jvm.util.Util.byteToInt(new byte[] { codes[point++], codes[point++], codes[point++], codes[point++] }); + } + /** * 读取n个字节,并编码成UTF-8输出,point自动增加 * @param n @@ -31,6 +35,10 @@ public int nextU2toInt() { */ public String readUtf8(int n) { + if (point + n >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + byte[] info = Arrays.copyOfRange(codes, point, point+n); String utf8; try { @@ -63,6 +71,20 @@ public void seek(int n) { point = n; } + public String nextU4ToHexString() { + return assignments.jvm.util.Util.byteToHexString((new byte[] { codes[point++], codes[point++], codes[point++], codes[point++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[point++]; + } + return assignments.jvm.util.Util.byteToHexString(tmp).toLowerCase(); + + } + public static void main(String[] args) throws UnsupportedEncodingException { byte[] codes = {0x00, 0x34, 0x00}; ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes); diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java index 7b84a15899..2638010915 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java @@ -1,9 +1,12 @@ package com.github.miniyk2012.coding2017.coderising.jvm.loader; + import com.github.miniyk2012.coding2017.coderising.jvm.clz.AccessFlag; import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassIndex; import com.github.miniyk2012.coding2017.coderising.jvm.constant.*; +import com.github.miniyk2012.coding2017.coderising.jvm.field.Field; +import com.github.miniyk2012.coding2017.coderising.jvm.method.Method; public class ClassFileParser { @@ -12,7 +15,12 @@ public ClassFile parse(byte[] codes) { ClassFile clzFile = new ClassFile(); ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes); - byteCodeIterator.skip(4); // skip magic + // byteCodeIterator.skip(4); // skip magic number + String magicNumber = byteCodeIterator.nextU4ToHexString(); + + if (!"cafebabe".equals(magicNumber)) { + return null; + } int minorVersion = byteCodeIterator.nextU2toInt(); int majorVersion = byteCodeIterator.nextU2toInt(); ConstantPool constantPool = parseConstantPool(byteCodeIterator); @@ -24,6 +32,8 @@ public ClassFile parse(byte[] codes) { clzFile.setConstPool(constantPool); clzFile.setAccessFlag(accessFlag); clzFile.setClassIndex(classIndex); + + parseInterfaces(byteCodeIterator); return clzFile; } @@ -55,6 +65,38 @@ protected ConstantPool parseConstantPool(ByteCodeIterator iter) { return constantPool; } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2toInt(); + + System.out.println("interfaceCount:" + interfaceCount); + for (int i=0; i Date: Tue, 18 Apr 2017 10:08:08 +0800 Subject: [PATCH 177/552] revert change --- .../src/com/coding/basic/linklist/LinkedList.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/liuxin/data-structure/src/com/coding/basic/linklist/LinkedList.java b/liuxin/data-structure/src/com/coding/basic/linklist/LinkedList.java index 9a408dc46d..f4c7556a2e 100644 --- a/liuxin/data-structure/src/com/coding/basic/linklist/LinkedList.java +++ b/liuxin/data-structure/src/com/coding/basic/linklist/LinkedList.java @@ -6,12 +6,6 @@ public class LinkedList implements List { private Node head; - - private static class Node{ - Object data; - Node next; - - } public void add(Object o){ @@ -47,7 +41,11 @@ public Iterator iterator(){ } - + private static class Node{ + Object data; + Node next; + + } /** * 把该链表逆置 From bcf3efdc452a7ec38f3a368b6062a0659459f1e0 Mon Sep 17 00:00:00 2001 From: Admin Date: Tue, 18 Apr 2017 11:41:25 +0800 Subject: [PATCH 178/552] javap done --- .../src/com/coderising/jvm/attr/CodeAttr.java | 8 +- .../src/com/coderising/jvm/clz/ClassFile.java | 27 ++++- .../com/coderising/jvm/cmd/CommandParser.java | 98 ++++++++++++++++++- .../coderising/jvm/constant/ClassInfo.java | 8 ++ .../coderising/jvm/constant/ConstantInfo.java | 4 + .../coderising/jvm/constant/ConstantPool.java | 7 +- .../coderising/jvm/constant/FieldRefInfo.java | 7 ++ .../jvm/constant/MethodRefInfo.java | 7 ++ .../jvm/constant/NameAndTypeInfo.java | 7 ++ .../jvm/constant/NullConstantInfo.java | 11 +++ .../coderising/jvm/constant/StringInfo.java | 8 ++ .../com/coderising/jvm/constant/UTF8Info.java | 9 ++ .../jvm/loader/ClassFileParser.java | 5 +- .../jvm/print/ClassFilePrinter.java | 52 ++++++++++ .../jvm/print/ConstantPoolPrinter.java | 92 +++++++++++++++++ .../coderising/jvm/print/PrintVisitor.java | 23 +++++ 16 files changed, 363 insertions(+), 10 deletions(-) create mode 100644 group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java diff --git a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java index 6ccca5f5cf..99c0183e02 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,5 +1,7 @@ package com.coderising.jvm.attr; +import java.util.Arrays; + import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.cmd.CommandParser; @@ -22,11 +24,12 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ System.out.println("codeLen " + codeLen); String code = iter.nextUxToHexString(codeLen); - + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); - System.out.println("Code is " + code); + System.out.println("Code is " + code); + System.out.println(Arrays.toString(cmds)); int exceptionTableLen = iter.nextU2ToInt(); @@ -109,6 +112,7 @@ private void setStackMapTable(StackMapTable t) { public ByteCodeCommand[] getCmds() { return cmds; } + public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); //buffer.append("Code:").append(code).append("\n"); diff --git a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java index 256073d15d..111cb247d3 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java +++ b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java @@ -5,6 +5,7 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; @@ -35,7 +36,7 @@ public AccessFlag getAccessFlag() { return accessFlag; } - private String getClassName() { + public String getClassName() { int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); @@ -67,7 +68,7 @@ public int getMinorVersion() { return minorVersion; } - private String getSuperClassName() { + public String getSuperClassName() { ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } @@ -118,12 +119,34 @@ public void setMinorVersion(int minorVersion) { public Method getMethod(String methodName, String paramAndReturnType){ + + for (Method m : methods) { + + int nameIndex = m.getNameIndex(); + int descriptorIndex= m.getDescriptorIndex(); + String name = ((UTF8Info)pool.getConstantInfo(nameIndex)).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(descriptorIndex)).getValue(); + if (name.equals(methodName) && desc.equals(paramAndReturnType)) { + return m; + } + } return null; } public Method getMainMethod(){ + for (Method m : methods) { + + int nameIndex = m.getNameIndex(); + int descriptorIndex= m.getDescriptorIndex(); + String name = ((UTF8Info)pool.getConstantInfo(nameIndex)).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(descriptorIndex)).getValue(); + if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { + return m; + } + } + return null; } } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java b/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java index 2bb36340f5..9a4be8a37a 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java @@ -1,6 +1,7 @@ package com.coderising.jvm.cmd; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.coderising.jvm.clz.ClassFile; @@ -42,13 +43,106 @@ public class CommandParser { public static final String iadd = "60"; public static final String iinc = "84"; + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + List cmds = new ArrayList(); + codes = codes.toUpperCase(); + CommandIterator iter = new CommandIterator(codes); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + + NewObjectCmd cmd = new NewObjectCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + + GetFieldCmd cmd = new GetFieldCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + + PutFieldCmd cmd = new PutFieldCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + + LdcCmd cmd = new LdcCmd(clzFile,opCode); + + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + + BiPushCmd cmd = new BiPushCmd(clzFile,opCode); + + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + calculateOffset(cmds); + + + } + + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); - return null; + return result; } - private static void calcuateOffset(List cmds) { + private static void calculateOffset(List cmds) { int offset = 0; for (ByteCodeCommand cmd : cmds) { diff --git a/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java b/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java index 083bfe73f0..b6ddbad601 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class ClassInfo extends ConstantInfo { private int type = ConstantInfo.CLASS_INFO; private int utf8Index; @@ -26,4 +28,10 @@ public int getUtf8Index() { public void setUtf8Index(int utf8Index) { this.utf8Index = utf8Index; } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + } + } diff --git a/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java b/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java index 5366000a7b..a2d0153f93 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public abstract class ConstantInfo { public static final int UTF8_INFO = 1; public static final int FLOAT_INFO = 4; @@ -29,4 +31,6 @@ public ConstantPool getConstantPool() { public abstract int getType(); + public abstract void accept(PrintVisitor visitor); + } diff --git a/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java b/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java index 06b83239f4..40f95c7d77 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java @@ -21,8 +21,13 @@ public ConstantInfo getConstantInfo(int index) { //System.out.println(this.constantInfos.get(index)); return this.constantInfos.get(index); } + + public List getConstantInfos() { - public Object getSize() { + return constantInfos; + } + + public int getSize() { return this.constantInfos.size() - 1; } diff --git a/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java index 6161ac4c06..7e353c3009 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class FieldRefInfo extends ConstantInfo { private int type = ConstantInfo.FIELD_INFO; private int classInfoIndex; @@ -57,4 +59,9 @@ public String toString() { return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]"; } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java index 1330036966..05882cd5f2 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class MethodRefInfo extends ConstantInfo { private int type = ConstantInfo.METHOD_INFO; @@ -55,5 +57,10 @@ public String toString() { return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType(); } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java index 9ce0725fd3..78dbe514b3 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class NameAndTypeInfo extends ConstantInfo { public int type = ConstantInfo.NAME_AND_TYPE_INFO; @@ -47,4 +49,9 @@ public void setIndex2(int index2) { public String toString() { return "(" + getName() + "," + getTypeInfo() + ")"; } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java b/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java index 7d1abf7699..a787901905 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class NullConstantInfo extends ConstantInfo { public NullConstantInfo() { @@ -11,4 +13,13 @@ public int getType() { return -1; } + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + + } + + + + } diff --git a/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java b/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java index e900b990cf..f713523450 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class StringInfo extends ConstantInfo { private int type = ConstantInfo.STRING_INFO; private int index; @@ -25,5 +27,11 @@ public void setIndex(int index) { public String toString() { return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java b/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java index b1179ad150..f0e548debf 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class UTF8Info extends ConstantInfo { private int type = ConstantInfo.UTF8_INFO; private int length; @@ -35,4 +37,11 @@ public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]"; } + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + + } + + } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java index c20fbfe855..b9a2383303 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java @@ -37,7 +37,6 @@ public ClassFile parse(byte[] codes) { System.out.println("majorVersion is " + majorVersion); clzFile.setMajorVersion(majorVersion); - ConstantPool pool = parseConstantPool(iter); clzFile.setConstPool(pool); @@ -98,7 +97,7 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { // utf8-info UTF8Info utf8Info = new UTF8Info(pool); int length = iter.nextU2ToInt(); - System.out.println("length is " + length); + //System.out.println("length is " + length); utf8Info.setLength(length); byte[] bytes = iter.nextNbytesToHexString(length); String value = ""; @@ -107,7 +106,7 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } catch (UnsupportedEncodingException e) { e.printStackTrace(); } - System.out.println("value is " + value); + //System.out.println("value is " + value); utf8Info.setValue(value); } else if (tag == 8) { diff --git a/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java b/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..1f958aac6a --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.print; + +import java.io.UnsupportedEncodingException; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMajorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\steve\\workspace\\coding2017n\\group12\\382266293\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = null; + try { + clzFile = loader.loadClass(className); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..be07ccd496 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.print; + +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter implements PrintVisitor { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + + public void print(){ + + System.out.println("Constant Pool:"); + int size = pool.getSize(); + + for (int i = 1; i <= size; i++) { + ConstantInfo info = pool.getConstantInfo(i); + System.out.print("#" + i + " ="); + info.accept(this); + } + + } + + @Override + public void visit(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + } + + @Override + public void visit(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visit(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visit(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visit(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visit(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + + + @Override + public void visit(NullConstantInfo nullConstantInfo) { + + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java b/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java new file mode 100644 index 0000000000..31aa70b955 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public interface PrintVisitor { + + void visit(ClassInfo pool); + void visit(FieldRefInfo info); + void visit(MethodRefInfo info); + void visit(NameAndTypeInfo info); + void visit(StringInfo info); + void visit(UTF8Info info); + void visit(NullConstantInfo nullConstantInfo); + +} From 45592fb5a42cc205cc6596dc91d78262593b15fb Mon Sep 17 00:00:00 2001 From: orajavac Date: Tue, 18 Apr 2017 15:03:58 +0800 Subject: [PATCH 179/552] =?UTF-8?q?20170418=5F1503=20=E5=89=8D=EF=BC=8C?= =?UTF-8?q?=E5=90=8E=E5=BA=8F=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/PostfixExpr.java | 81 +++++++++++++++++++ .../basic/stack/expr/PostfixExprTest.java | 35 ++++++++ .../basic/stack/expr/PrefixExpr.java | 68 ++++++++++++++++ .../basic/stack/expr/PrefixExprTest.java | 42 ++++++++++ .../orajavac/coding2017/jvm/util/Util.java | 5 ++ 5 files changed, 231 insertions(+) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExprTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExpr.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..c3528d0abe --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,81 @@ +package com.github.orajavac.coding2017.basic.stack.expr; + +import java.util.HashMap; +import java.util.Map; +import com.github.orajavac.coding2017.basic.stack.Stack; +import com.github.orajavac.coding2017.jvm.util.Util; + +/* + * 后序表达式 + */ +public class PostfixExpr { + + String expr = null; + + private final String ADD = "+"; + + private final String SUB = "-"; + + private final String MUL = "*"; + + private final String DIV = "/"; + + private Map operator = new HashMap(); + + private Stack num = new Stack(); + + public PostfixExpr(String expr) { + this.expr = expr; + this.operator.put(this.ADD,1); + this.operator.put(this.SUB,1); + this.operator.put(this.MUL,2); + this.operator.put(this.DIV,2); + } + + public float evaluate() { + String[] expr = Util.parseOperatorToArray(this.expr); + for (int i=0;i operator = new HashMap(); + + private Stack num = new Stack(); + + public PrefixExpr(String expr) { + this.expr = expr; + this.operator.put(this.ADD,1); + this.operator.put(this.SUB,1); + this.operator.put(this.MUL,2); + this.operator.put(this.DIV,2); + } + + public float evaluate() { + String[] expr = Util.parseOperatorToArray(this.expr); + /** + * 4*2 + 6+9*2/3 -8 + * - + + 6 / *2 9 3 * 4 2 8 + */ + for (int i=expr.length-1;i>=0;i--){ + if (this.operator.containsKey(expr[i])){ + num.push(calculate(expr[i], + Float.parseFloat(num.pop().toString()), + Float.parseFloat(num.pop().toString()))); + }else{ + num.push(expr[i]); + } + } + return Float.parseFloat(num.pop().toString()); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..a27e05caa9 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,42 @@ +package com.github.orajavac.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3 * 4 5"); + Assert.assertEquals(26.0, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); + Assert.assertEquals(12.0, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29.0, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16.0, expr.evaluate(),0.001f); + } + + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java index 52a84fb7a8..cd3db5e063 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java @@ -42,4 +42,9 @@ public static Object[] parseOperNumToArray(String str){ }*/ return l.toArray(); } + + public static String[] parseOperatorToArray(String str){ + String[] array = str.split(" "); + return array; + } } From 9512e534cb2eb05e0f86a0ee7e64ba2579e0e6e7 Mon Sep 17 00:00:00 2001 From: Harry Date: Tue, 18 Apr 2017 15:35:34 +0800 Subject: [PATCH 180/552] update jvm --- .../coding2017/jvm/attr/CodeAttr.java | 15 +- .../coding2017/jvm/attr/LineNumberTable.java | 11 ++ .../jvm/attr/LocalVariableTable.java | 13 +- .../coding2017/jvm/clz/ClassFile.java | 15 +- .../coding2017/jvm/cmd/BiPushCmd.java | 23 ++++ .../coding2017/jvm/cmd/ByteCodeCommand.java | 128 +++++++++++++++++ .../coding2017/jvm/cmd/CommandParser.java | 85 ++++++++++++ .../coding2017/jvm/cmd/GetFieldCmd.java | 18 +++ .../coding2017/jvm/cmd/GetStaticFieldCmd.java | 24 ++++ .../coding2017/jvm/cmd/InvokeSpecialCmd.java | 23 ++++ .../coding2017/jvm/cmd/InvokeVirtualCmd.java | 21 +++ .../HarryHook/coding2017/jvm/cmd/LdcCmd.java | 29 ++++ .../coding2017/jvm/cmd/NewObjectCmd.java | 19 +++ .../coding2017/jvm/cmd/NoOperandCmd.java | 23 ++++ .../coding2017/jvm/cmd/OneOperandCmd.java | 27 ++++ .../coding2017/jvm/cmd/PutFieldCmd.java | 19 +++ .../coding2017/jvm/cmd/TwoOperandCmd.java | 67 +++++++++ .../coding2017/jvm/constant/ClassInfo.java | 4 + .../coding2017/jvm/constant/ConstantInfo.java | 15 +- .../coding2017/jvm/constant/FieldRefInfo.java | 5 + .../jvm/constant/MethodRefInfo.java | 5 + .../jvm/constant/NameAndTypeInfo.java | 6 + .../jvm/constant/NullConstantInfo.java | 5 + .../coding2017/jvm/constant/StringInfo.java | 6 + .../coding2017/jvm/constant/UTF8Info.java | 8 +- .../coding2017/jvm/method/Method.java | 4 + .../jvm/print/ClassFilePrinter.java | 51 +++++++ .../jvm/print/ConstantPoolPrinter.java | 25 ++++ .../jvm/test/ClassFileloaderTest.java | 81 ++++++++++- .../coding2017/stack/expr/InfixExpr.java | 77 +++++------ .../coding2017/stack/expr/InfixToPostfix.java | 12 ++ .../coding2017/stack/expr/PostfixExpr.java | 15 ++ .../stack/expr/PostfixExprTest.java | 37 +++++ .../coding2017/stack/expr/PrefixExpr.java | 129 ++++++++++++++++++ .../coding2017/stack/expr/PrefixExprTest.java | 43 ++++++ .../coding2017/stack/expr/Token.java | 50 +++++++ .../coding2017/stack/expr/TokenParser.java | 56 ++++++++ .../stack/expr/TokenParserTest.java | 39 ++++++ 38 files changed, 1176 insertions(+), 57 deletions(-) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java index 47a8bd2b1c..49a937c1b1 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java @@ -1,6 +1,7 @@ package com.github.HarryHook.coding2017.jvm.attr; import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; import com.sun.org.apache.bcel.internal.generic.NEW; @@ -15,10 +16,10 @@ public String getCode() { return code; } - // private ByteCodeCommand[] cmds ; - // public ByteCodeCommand[] getCmds() { - // return cmds; - // } + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; @@ -30,7 +31,7 @@ public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - // this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -92,9 +93,9 @@ public String toString(ConstantPool pool) { buffer.append("Code:").append(code).append("\n"); buffer.append("\n"); buffer.append(this.lineNumTable.toString()); - //buffer.append(this.localVarTable.toString(pool)); + buffer.append(this.localVarTable.toString(pool)); return buffer.toString(); } - + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java index 51933e9bb6..c6b7d796b6 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java @@ -53,5 +53,16 @@ public static LineNumberTable parse(ByteCodeIterator iter) { return table; } + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + +} } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java index f9d5d0bdce..106ae86460 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java @@ -36,5 +36,16 @@ public static LocalVariableTable parse(ByteCodeIterator iter) { private void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } - + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); +} } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java index 45e7464e9f..81856e9ad5 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java @@ -18,7 +18,7 @@ public class ClassFile { private ClassIndex clzIndex; private ConstantPool pool; private List fields = new ArrayList(); - private List methods = new ArrayList();; + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -72,13 +72,13 @@ public void print() { } - private String getClassName() { + public String getClassName() { int thisClassIndex = clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName() { + public String getSuperClassName() { ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } @@ -98,6 +98,15 @@ public void addMethod(Method m) { public List getMethods() { return methods; } + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..6b1c020682 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..f5e6705a8a --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..5b78e0eeb1 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..ec34e7b4a7 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,18 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..1090e17374 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,24 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..4afc337f47 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..6b494dceda --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,21 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..073ddd73a9 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..9c959e31dd --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..554eac0690 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..77bf40708b --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..f3a197114c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..13edc86215 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java index 305ac57f5a..e4822e2bbb 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java @@ -25,4 +25,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java index 3d81ed1adb..6c502016a3 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java @@ -28,7 +28,16 @@ public ConstantInfo getConstantInfo(int index) { return this.constantPool.getConstantInfo(index); } - - - + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java index 6e8ddcb91b..d2d6a19f90 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java @@ -55,4 +55,9 @@ public String getFieldType() { NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java index 7815c8a6a2..a1055932a0 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java @@ -54,4 +54,9 @@ public String getParamAndReturnType() { return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java index 519656f681..29495489f4 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java @@ -45,4 +45,10 @@ public String getTypeInfo() { public String toString() { return "(" + getName() + "," + getTypeInfo() + ")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java index 59489a965c..b0f5ad9b80 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java @@ -11,4 +11,9 @@ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java index 1d625069be..442405aa36 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java @@ -24,4 +24,10 @@ public String toString() { return this.getConstantPool().getUTF8String(index); } + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java index 27c2ec9059..5c740bf402 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java @@ -29,8 +29,14 @@ public String toString() { public void setValue(String value) { this.value = value; } - public String getValue(){ + + public String getValue() { return value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java index d7dedc0439..1182364c71 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java @@ -2,6 +2,7 @@ package com.github.HarryHook.coding2017.jvm.method; import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; import javax.management.RuntimeErrorException; @@ -80,4 +81,7 @@ public String toString(ConstantPool pool) { buffer.append(desc); return buffer.toString(); } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); +} } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..6ede47692c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java @@ -0,0 +1,51 @@ +package com.github.HarryHook.coding2017.jvm.print; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.constant.StringInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; +import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + + public ClassFilePrinter(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public void print() { + + if (clzFile.getAccessFlag().isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name:" + clzFile.getClassName()); + + System.out.println("Super Class Name:" + clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + } + + public static void main(String[] args) { + String path = "F:\\Coding2017\\group02\\727171008\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..3d6c791185 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,25 @@ +package com.github.HarryHook.coding2017.jvm.print; + +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.constant.StringInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java index 524907ce9f..ee7e3b3092 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java @@ -9,6 +9,10 @@ import com.github.HarryHook.coding2017.jvm.clz.ClassFile; import com.github.HarryHook.coding2017.jvm.clz.ClassIndex; +import com.github.HarryHook.coding2017.jvm.cmd.BiPushCmd; +import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; +import com.github.HarryHook.coding2017.jvm.cmd.OneOperandCmd; +import com.github.HarryHook.coding2017.jvm.cmd.TwoOperandCmd; import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; @@ -259,5 +263,80 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } - + /* + * 第四次测试 + */ + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java index 5b1dbd7fa4..a7b7ee00d2 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java @@ -13,73 +13,64 @@ public InfixExpr(String expr) { public float evaluate() { char[] ch = expr.toCharArray(); - MyStack stackOfTocken = new MyStack(); + MyStack stackOfOperator = new MyStack(); MyStack stackOfNumber = new MyStack(); for (int i = 0; i < ch.length; i++) { if (Character.isDigit(ch[i])) { - int tmp = Integer.parseInt("" + ch[i]); + float tmp = Float.parseFloat("" + ch[i]); while (i < ch.length - 1 && Character.isDigit(ch[++i])) { - tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + tmp = tmp * 10 + Float.parseFloat("" + ch[i]); } stackOfNumber.push(tmp); } if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') { - stackOfTocken.push(ch[i]); + stackOfOperator.push(ch[i]); } - if (!(stackOfTocken.isEmpty()) && (char) stackOfTocken.peek() == '*') { - int tmp = Integer.parseInt("" + ch[++i]); + char operator = (char)stackOfOperator.peek(); + if (operator == '*' || operator == '/') { + float tmp = Float.parseFloat("" + ch[++i]); while (i < ch.length - 1 && Character.isDigit(ch[++i])) { - tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + tmp = tmp * 10 + Float.parseFloat("" + ch[i]); } if (i != ch.length - 1) { i--; } stackOfNumber.push(tmp); - int tmp1 = Integer.parseInt("" + stackOfNumber.pop()); - int tmp2 = Integer.parseInt("" + stackOfNumber.pop()); - stackOfNumber.push(tmp1 * tmp2); - stackOfTocken.pop(); - - } - if (!(stackOfTocken.isEmpty()) && (char) stackOfTocken.peek() == '/') { - int tmp = Integer.parseInt("" + ch[++i]); - while (i < ch.length - 1 && Character.isDigit(ch[++i])) { - tmp = tmp * 10 + Integer.parseInt("" + ch[i]); + float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); + float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); + if(operator == '*') { + stackOfNumber.push(tmp1 * tmp2); + } else { + stackOfNumber.push(tmp2 / tmp1); } - if (i != ch.length - 1) { - i--; - } - stackOfNumber.push(tmp); - - int tmp1 = Integer.parseInt("" + stackOfNumber.pop()); - int tmp2 = Integer.parseInt("" + stackOfNumber.pop()); - stackOfNumber.push(tmp2 / tmp1); - stackOfTocken.pop(); + + stackOfOperator.pop(); } + } - // 将栈中的数字和运算法逆置,便于计算 + // 将栈中的数字和运算符逆置,从左往右结合 reverse(stackOfNumber); - reverse(stackOfTocken); - - while (!(stackOfTocken.isEmpty())) { - if ((char) stackOfTocken.peek() == '+') { - int tmp1 = Integer.parseInt("" + stackOfNumber.pop()); - int tmp2 = Integer.parseInt("" + stackOfNumber.pop()); - stackOfNumber.push(tmp1 + tmp2); - } - - if ((char) stackOfTocken.peek() == '-') { - int tmp1 = Integer.parseInt("" + stackOfNumber.pop()); - int tmp2 = Integer.parseInt("" + stackOfNumber.pop()); - stackOfNumber.push(tmp1 - tmp2); + reverse(stackOfOperator); + + while (!(stackOfOperator.isEmpty())) { + char operator = (char) stackOfOperator.peek(); + if (operator == '+' || operator == '-') { + float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); + float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); + if(operator == '+') { + stackOfNumber.push(tmp1 + tmp2); + } else { + stackOfNumber.push(tmp1 - tmp2); + } } - stackOfTocken.pop(); + + stackOfOperator.pop(); } return Float.parseFloat("" + stackOfNumber.pop()); @@ -104,4 +95,8 @@ private void reverse(MyStack s) { s.push(temp2); } + public static void main(String[] args) { + InfixExpr expr = new InfixExpr("2+3*4+5"); + System.out.println(expr.evaluate()); + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..57f6fa107b --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java @@ -0,0 +1,12 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..9fcee1a8f9 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java @@ -0,0 +1,15 @@ +package com.github.HarryHook.coding2017.stack.expr; + + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..7e78fa3997 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java @@ -0,0 +1,37 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(), 0.0f); + } + { + // 9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(), 0.0f); + } + + { + // 10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(), 0.0f); + } + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..97433b79a6 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java @@ -0,0 +1,129 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.lang.reflect.AnnotatedArrayType; +import java.util.ArrayList; + +import com.github.HarryHook.coding2017.basic.MyStack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + char[] ch = expr.toCharArray(); + MyStack stackOfOperator = new MyStack(); + MyStack stackOfNumber = new MyStack(); + ArrayList array = new ArrayList(); + for(int i=0; i OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java new file mode 100644 index 0000000000..8d520fd68a --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java @@ -0,0 +1,56 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else { + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..3067467a10 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java @@ -0,0 +1,39 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} \ No newline at end of file From 5bfc58953acfbcced42ffa25f368a5fbd0459596 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 18 Apr 2017 16:57:23 +0800 Subject: [PATCH 181/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- group24/75939388/.gitignore | 4 ++ .../basic/dataStructure/LRUAlgorithm.java | 62 ++++++++++++++++++ .../src/main/java/miniJVM/Demo.java | 7 --- .../src/main/java/miniJVM/EmployeeV1.java | 28 +++++++++ .../src/test/java/data_structure/LRUTest.java | 24 +++++++ .../src/test/java/miniJVM/testEmployee.java | 63 +++++++++++++++++++ 7 files changed, 183 insertions(+), 9 deletions(-) create mode 100644 group24/75939388/.gitignore create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java delete mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/Demo.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/EmployeeV1.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java create mode 100644 group24/75939388/learning2017/src/test/java/miniJVM/testEmployee.java diff --git a/.gitignore b/.gitignore index 156b10d1f1..6ef02fdccc 100644 --- a/.gitignore +++ b/.gitignore @@ -215,7 +215,7 @@ pip-log.txt #Mr Developer .mr.developer.cfg -.gitignore +#.gitignore ======= @@ -257,7 +257,7 @@ tmp .metadata RemoteSystemsTempFiles -.gitignore +#.gitignore .recommenders .idea/ diff --git a/group24/75939388/.gitignore b/group24/75939388/.gitignore new file mode 100644 index 0000000000..596bd7346d --- /dev/null +++ b/group24/75939388/.gitignore @@ -0,0 +1,4 @@ +*.class +target/ +*.iml +.idea/ \ No newline at end of file diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java new file mode 100644 index 0000000000..28e70cde62 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java @@ -0,0 +1,62 @@ +package basic.dataStructure; + +/** + * @author : 温友朝 + * @date : 2017/4/18 + */ +public class LRUAlgorithm { + public Node first; + public Node last; + public Object data; + + + + public LRUAlgorithm(){ + this.first = new Node(null, new Node()); + this.last = this.first; + } + + public LRUAlgorithm(Object data){ + this.first = new Node(data, new Node()); + this.last = this.first; + } + + + + + + + + + + + + + + + + + + + + private static class Node { + Object data; + Node next; + Node before; + + private Node() {} + + public Node(Object obj, Node next) { + this.data = obj; + this.next = next; + this.before = null; + } + + public Node(Object obj, Node next, Node before){ + this.data = obj; + this.next = next; + this.before = before; + } + + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java b/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java deleted file mode 100644 index 565983ab06..0000000000 --- a/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java +++ /dev/null @@ -1,7 +0,0 @@ -package miniJVM; - -/** - * Created by macvi on 2017/4/11. - */ -public class Demo { -} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/EmployeeV1.java b/group24/75939388/learning2017/src/main/java/miniJVM/EmployeeV1.java new file mode 100644 index 0000000000..e345de37ae --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/EmployeeV1.java @@ -0,0 +1,28 @@ +package miniJVM; + +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/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java b/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java new file mode 100644 index 0000000000..a2cbd9a495 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java @@ -0,0 +1,24 @@ +package data_structure; + +import basic.dataStructure.LRUAlgorithm; +import org.junit.Before; +import org.junit.Test; + +/** + * @author : 温友朝 + * @date : 2017/4/18 + */ +public class LRUTest { + + private LRUAlgorithm lru; + + @Before + public void init(){ + lru = new LRUAlgorithm(); + } + + @Test + public void testAdd(){ + + } +} diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/testEmployee.java b/group24/75939388/learning2017/src/test/java/miniJVM/testEmployee.java new file mode 100644 index 0000000000..a10571b6ee --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/miniJVM/testEmployee.java @@ -0,0 +1,63 @@ +package miniJVM; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.DataInputStream; +import java.io.File; +import java.io.FileInputStream; + +/** + * @author : 温友朝 + * @date : 2017/4/18 + */ +public class testEmployee { + String path = "resources/classes/EmployeeV1.class"; + File file; + + @Before + public void init(){ + try{ + file = new File(path); + }catch(Exception e){ + e.printStackTrace(); + } + } + + @Test + public void readCafebabe(){ + //JVM第一周作业,读取class文件的头四位魔数cafebabe + + try{ + int length = new Long(file.length()).intValue(); + byte[] buffer = new byte[length]; + DataInputStream dis = new DataInputStream(new FileInputStream(file)); + dis.read(buffer); + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < length; i++){ + int temp = buffer[i] & 0xFF; + String hexStr = Integer.toHexString(temp); + if(hexStr.length() < 2){ + sb.append("0").append(hexStr); + }else{ + sb.append(hexStr); + } + +// if((i + 1) % 2 == 0){ +// sb.append(" "); +// } + + if((i + 1) % 16 == 0){ + sb.append("\n"); + } + + } + System.out.println(sb.toString()); + Assert.assertEquals("cafebabe", sb.substring(0, 8)); + + }catch(Exception e){ + e.printStackTrace(); + } + } +} From 653c62d8389b3e1478df629e7484bdc5d7b4d8d6 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 18 Apr 2017 18:53:41 +0800 Subject: [PATCH 182/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/basic/dataStructure/LRUAlgorithm.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java index 28e70cde62..42cce3697c 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java @@ -9,6 +9,7 @@ public class LRUAlgorithm { public Node last; public Object data; + private static final int MAX_SIZE = 5; public LRUAlgorithm(){ @@ -17,13 +18,28 @@ public LRUAlgorithm(){ } public LRUAlgorithm(Object data){ + this.data = data; this.first = new Node(data, new Node()); this.last = this.first; } + public int size(){ + Node temp = first; + int index = 0; + while (temp.next != null){ + index ++; + temp = temp.next; + } + return index; + } + public void add(Object obj){ + if(this.size() < MAX_SIZE){ + Node temp = first; + } + } From 814cb2789e976b4a4973d0e83d8c71fadf6bbd3b Mon Sep 17 00:00:00 2001 From: gongxun Date: Tue, 18 Apr 2017 19:05:12 +0800 Subject: [PATCH 183/552] =?UTF-8?q?=E6=9A=82=E5=AD=98=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.16/cmd/BiPushCmd.java | 2 +- .../785396327/4.16/cmd/ByteCodeCommand.java | 2 +- group17/785396327/4.16/cmd/CommandParser.java | 81 ++++++++++++++++++- group17/785396327/4.16/cmd/GetFieldCmd.java | 2 +- .../4.5/test/ClassFileloaderTest.java | 60 +++++++------- 5 files changed, 113 insertions(+), 34 deletions(-) diff --git a/group17/785396327/4.16/cmd/BiPushCmd.java b/group17/785396327/4.16/cmd/BiPushCmd.java index e69c53310f..9353ea0412 100644 --- a/group17/785396327/4.16/cmd/BiPushCmd.java +++ b/group17/785396327/4.16/cmd/BiPushCmd.java @@ -4,7 +4,7 @@ import constant.ConstantPool; /** - * Created by IBM on 2017/4/17. + * Created by william on 2017/4/17. */ public class BiPushCmd extends OneOperandCmd { public BiPushCmd(ClassFile clzFile, String opCode) { diff --git a/group17/785396327/4.16/cmd/ByteCodeCommand.java b/group17/785396327/4.16/cmd/ByteCodeCommand.java index 97865bbd31..f10bfa21d3 100644 --- a/group17/785396327/4.16/cmd/ByteCodeCommand.java +++ b/group17/785396327/4.16/cmd/ByteCodeCommand.java @@ -8,7 +8,7 @@ import java.util.Map; /** - * Created by IBM on 2017/4/17. + * Created by william on 2017/4/17. */ public abstract class ByteCodeCommand { String opCode; diff --git a/group17/785396327/4.16/cmd/CommandParser.java b/group17/785396327/4.16/cmd/CommandParser.java index 35d9f80831..5f5956350d 100644 --- a/group17/785396327/4.16/cmd/CommandParser.java +++ b/group17/785396327/4.16/cmd/CommandParser.java @@ -1,11 +1,12 @@ package cmd; import clz.ClassFile; +import constant.ClassInfo; import java.util.List; /** - * Created by IBM on 2017/4/17. + * Created by william on 2017/4/17. */ public class CommandParser { public static final String aconst_null = "01"; @@ -44,8 +45,81 @@ public class CommandParser { public static final String iinc = "84"; public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + CommandIterator commandIterator = new CommandIterator(codes); + String command = commandIterator.next2CharAsString().toUpperCase(); + if (command.equals(aconst_null)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(1); + } else if (command.equals(new_object)) { + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, command); + int oprand1 = commandIterator.next2CharAsInt(); + int oprand2 = commandIterator.next2CharAsInt(); + newObjectCmd.setOprand1(oprand1); + newObjectCmd.setOprand2(oprand2); + } else if (command.equals(lstore)) { + } else if (command.equals(invokespecial)) { + + } else if (command.equals(invokevirtual)) { + + } else if (command.equals(getfield)) { + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, command); + } else if (command.equals(putfield)) { + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, command); + } else if (command.equals(getstatic)) { + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, command); + } else if (command.equals(ldc)) { + LdcCmd ldcCmd = new LdcCmd(clzFile, command); + } else if (command.equals(dup)) { + + } else if (command.equals(bipush)) { + BiPushCmd biPushCmd = new BiPushCmd(clzFile, command); + } else if (command.equals(aload_0)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + } else if (command.equals(aload_1)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + } else if (command.equals(aload_2)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + } else if (command.equals(iload)) { + + } else if (command.equals(iload_2)) { + + } else if (command.equals(iload_1)) { + + } else if (command.equals(iload_3)) { + + } else if (command.equals(fload_3)) { + + } else if (command.equals(voidreturn)) { + + } else if (command.equals(ireturn)) { + + } else if (command.equals(freturn)) { + + } else if (command.equals(astore_1)) { + + } else if (command.equals(if_icmp_ge)) { + + } else if (command.equals(if_icmple)) { + + } else if (command.equals(goto_no_condition)) { + + } else if (command.equals(iconst_0)) { + + } else if (command.equals(iconst_1)) { + + } else if (command.equals(istore_1)) { + + } else if (command.equals(istore_2)) { + + } else if (command.equals(iadd)) { + + } else if (command.equals(iinc)) { + + } else { + throw new RuntimeException("wrong command : " + command); + } return null; } @@ -71,6 +145,11 @@ public boolean hasNext() { return pos < this.codes.length(); } + /** + * 从字符串中截取前两个字符 + * + * @return + */ public String next2CharAsString() { String result = codes.substring(pos, pos + 2); pos += 2; diff --git a/group17/785396327/4.16/cmd/GetFieldCmd.java b/group17/785396327/4.16/cmd/GetFieldCmd.java index a255cef97b..c7307abf56 100644 --- a/group17/785396327/4.16/cmd/GetFieldCmd.java +++ b/group17/785396327/4.16/cmd/GetFieldCmd.java @@ -4,7 +4,7 @@ import constant.ConstantPool; /** - * Created by IBM on 2017/4/17. + * Created by william on 2017/4/17. */ public class GetFieldCmd extends TwoOperandCmd { public GetFieldCmd(ClassFile clzFile,String opCode) { diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java index 3e4f3e100c..2a8badce36 100644 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -228,36 +228,36 @@ public void testMethods(){ "2ab700012a2bb500022a1cb50003b1"); } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb50002b1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50003b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b200041205b60006b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb0007591208101db700094c2bb6000ab1"); - } +// { +// Method m = methods.get(1); +// assertMethodEquals(pool,m, +// "setName", +// "(Ljava/lang/String;)V", +// "2a2bb50002b1"); +// +// } +// { +// Method m = methods.get(2); +// assertMethodEquals(pool,m, +// "setAge", +// "(I)V", +// "2a1bb50003b1"); +// } +// { +// Method m = methods.get(3); +// assertMethodEquals(pool,m, +// "sayHello", +// "()V", +// "b200041205b60006b1"); +// +// } +// { +// Method m = methods.get(4); +// assertMethodEquals(pool,m, +// "main", +// "([Ljava/lang/String;)V", +// "bb0007591208101db700094c2bb6000ab1"); +// } } private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ From 5066bfd6413c7be2f6fcc5f4e4d38d9e4a93775c Mon Sep 17 00:00:00 2001 From: "[Ren650119726]" <[102228177@qq.com]> Date: Tue, 18 Apr 2017 22:59:12 +0800 Subject: [PATCH 184/552] 4-16 --- .../275150374Learning/.idea/description.html | 16 ++++- group15/1512_656512403/.idea/description.html | 16 ++++- .../jvm/test/ClassFileloaderTest.java | 2 +- .../src/com/coding/basic/stack/InfixExpr.java | 66 +++++++++++++++++-- .../src/com/coding/basic/stack/Token.java | 49 ++++++++++++++ .../com/coding/basic/stack/TokenParser.java | 56 ++++++++++++++++ .../com/coderising/download/net_multisoc.htm | 15 +++++ 7 files changed, 212 insertions(+), 8 deletions(-) create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Token.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java diff --git a/group01/275150374/275150374Learning/.idea/description.html b/group01/275150374/275150374Learning/.idea/description.html index db5f129556..0f928c44a1 100644 --- a/group01/275150374/275150374Learning/.idea/description.html +++ b/group01/275150374/275150374Learning/.idea/description.html @@ -1 +1,15 @@ -Simple Java application that includes a class with main() method \ No newline at end of file +Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group15/1512_656512403/.idea/description.html b/group15/1512_656512403/.idea/description.html index db5f129556..0f928c44a1 100644 --- a/group15/1512_656512403/.idea/description.html +++ b/group15/1512_656512403/.idea/description.html @@ -1 +1,15 @@ -Simple Java application that includes a class with main() method \ No newline at end of file +Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group17/102228177/work4_16/src/com/coderising/jvm/test/ClassFileloaderTest.java index 4e0b8e1001..3afc6ee711 100644 --- a/group17/102228177/work4_16/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group17/102228177/work4_16/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -24,7 +24,7 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; // static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path1 = "D:\\software\\taotao\\work4_09\\bin"; + static String path1 = "D:\\workspace\\work4_16\\bin"; static String path2 = "C:\temp"; static ClassFile clzFile = null; diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java index 5c04740bfb..a092602897 100644 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java @@ -1,5 +1,6 @@ package com.coding.basic.stack; - +import java.util.List; +import java.util.Stack; public class InfixExpr { String expr = null; @@ -7,12 +8,67 @@ public InfixExpr(String expr) { this.expr = expr; } - public float evaluate() { + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + if(opStack.isEmpty()){ + + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } - return 0.0f; + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + + + return numStack.pop().floatValue(); + } + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); } - - } \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java new file mode 100644 index 0000000000..364fe104f5 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java @@ -0,0 +1,49 @@ +package com.coding.basic.stack; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java b/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java new file mode 100644 index 0000000000..c45a23aed1 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java @@ -0,0 +1,56 @@ +package com.coding.basic.stack; +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} \ No newline at end of file diff --git a/group17/1282579502/src/com/coderising/download/net_multisoc.htm b/group17/1282579502/src/com/coderising/download/net_multisoc.htm index 5ddcba89af..852129b19a 100644 --- a/group17/1282579502/src/com/coderising/download/net_multisoc.htm +++ b/group17/1282579502/src/com/coderising/download/net_multisoc.htm @@ -488,3 +488,18 @@

Result

+ \ No newline at end of file From 1882b98dae1f477e7cc0ea88efc2b6b7d729b899 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Tue, 18 Apr 2017 23:19:19 +0800 Subject: [PATCH 185/552] coding --- .../coding/basic/stack/expr/ExprIterator.java | 32 ++++++++ .../coding/basic/stack/expr/FixExprUtil.java | 81 +++++++++++++++++++ .../coding/basic/stack/expr/InfixExpr.java | 69 ++-------------- .../basic/stack/expr/InfixToPostfix.java | 56 +++++++++++++ .../com/coding/basic/stack/expr/Operator.java | 13 +++ .../coding/basic/stack/expr/PostfixExpr.java | 43 ++++++++++ .../coding/basic/stack/expr/PrefixExpr.java | 44 ++++++++++ .../basic/stack/expr/PostfixExprTest.java | 38 +++++++++ .../basic/stack/expr/PrefixExprTest.java | 46 +++++++++++ 9 files changed, 359 insertions(+), 63 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/ExprIterator.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/FixExprUtil.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/ExprIterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/ExprIterator.java new file mode 100644 index 0000000000..513cc901fb --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/ExprIterator.java @@ -0,0 +1,32 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.List; +import com.coding.basic.array.ArrayList; + + +/** + * 表达式迭代器 + * @author zj + * @since 2017-4-17 + */ +public class ExprIterator{ + + private List data = new ArrayList(); + private int cursor; + + public ExprIterator(String expr){ + this.data = FixExprUtil.FixExprToArray(expr); + } + + public boolean hasNext() { + return cursor != (data.size()); + } + + public String next() { + + int i = cursor; + cursor = (i+1); + return data.get(i); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/FixExprUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/FixExprUtil.java new file mode 100644 index 0000000000..0477bce3ec --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/FixExprUtil.java @@ -0,0 +1,81 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.List; +import com.coding.basic.array.ArrayList; + +public class FixExprUtil { + + /** + * 运算 + * @param a 数字 + * @param oper 运算符 + * @param b 数字 + * @return + */ + public static float calculate(float a,Operator oper,float b) { + + String operFlag = oper.getFlag(); + + float res = 0f; + if (Operator.ADD.getFlag().equals(operFlag)) { + res = a + b; + } else if (Operator.SUB.getFlag().equals(operFlag)) { + res = a - b; + } else if (Operator.MULTY.getFlag().equals(operFlag)) { + res = a * b; + } else if (Operator.DIVIDE.getFlag().equals(operFlag)) { + res = a / b; + } + return res; + } + + /** + * 将字符串顺序逆置 + * @param str + * @return + */ + public static String reverse(String expr){ + + return new StringBuffer(expr).reverse().toString(); + } + + /** + * 将表达式字符串转换为List + * @param expr + * @return + */ + public static List FixExprToArray(String expr){ + + List ls = new ArrayList<>(); + + String[] strArr = expr.split(" "); + for (String str : strArr) { + parse(str,ls); + } + + return ls; + } + + public static void parse(String str,List ls){ + + char[] chr = str.toCharArray(); + StringBuilder token = new StringBuilder(); + + for (char c : chr) { + if(Operator.contains(c+"")){ + if(!"".equals(token.toString())){ + ls.add(token.toString()); + token = new StringBuilder(); + } + ls.add(c+""); + }else{ + token.append(c); + } + } + if(!"".equals(token.toString())){ + ls.add(token.toString()); + } + + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java index 9d34a17fb5..0ee14605fc 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java @@ -1,19 +1,14 @@ package com.coding.basic.stack.expr; -import com.coding.basic.Iterator; import com.coding.basic.stack.Stack; import com.coding.basic.stack.StackUtil; public class InfixExpr { String expr = null; - char[] data = null; - private static final String operatorsStr = "+-*/"; - public InfixExpr(String expr) { this.expr = expr; - this.data = expr.toCharArray(); } public float evaluate() { @@ -23,7 +18,7 @@ public float evaluate() { //操作栈 Stack operStack = new Stack<>(); - splitInfixExpr(dataStack,operStack); + parseExpr(dataStack,operStack); return summary(dataStack,operStack); } @@ -34,12 +29,12 @@ public float evaluate() { * * @return */ - private void splitInfixExpr(Stack dataStack,Stack operStack) { + private void parseExpr(Stack dataStack,Stack operStack) { - Itr it = new Itr(); + ExprIterator it = new ExprIterator(expr); while(it.hasNext()){ String element = it.next(); - if (operatorsStr.contains(element)) { + if (Operator.contains(element)) { putOpersToStack(dataStack,operStack, element); } else { dataStack.push(Float.parseFloat(element)); @@ -79,30 +74,6 @@ private void putOpersToStack(Stack dataStack,Stack operStack, S } operStack.push(thisOper); } - - /** - * 运算 - * @param a 数字 - * @param oper 运算符 - * @param b 数字 - * @return - */ - private float calculate(float a,Operator oper,float b) { - - String operFlag = oper.getFlag(); - - float res = 0f; - if (Operator.ADD.getFlag().equals(operFlag)) { - res = a + b; - } else if (Operator.SUB.getFlag().equals(operFlag)) { - res = a - b; - } else if (Operator.MULTY.getFlag().equals(operFlag)) { - res = a * b; - } else if (Operator.DIVIDE.getFlag().equals(operFlag)) { - res = a / b; - } - return res; - } /** * 运算距栈顶最近两个元素的值并压回原栈 @@ -123,7 +94,7 @@ private void calculateToStack(Stack dataStack,Stack operStack,b } Operator oper = operStack.pop(); - float res = calculate(a,oper,b); + float res = FixExprUtil.calculate(a,oper,b); dataStack.push(res); } @@ -142,33 +113,5 @@ private float summary(Stack dataStack,Stack operStack) { } return dataStack.pop(); } - - private class Itr implements Iterator { - - int cursor; - - @Override - public boolean hasNext() { - return cursor != (expr.length()); - } - - @Override - public String next() { - - StringBuilder val = new StringBuilder(); - for (int i = cursor; i < data.length; i++) { - if (operatorsStr.contains(data[i] + "")) { - if ("".equals(val.toString())) { - val.append(data[i]); - this.cursor = (i + 1); - } - break; - } else { - val.append(data[i]); - this.cursor = (i + 1); - } - } - return val.toString(); - } - } + } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..02aa5b5bff --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,56 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.StackUtil; + +public class InfixToPostfix { + + public static String convert(String expr) { + + ExprIterator it = new ExprIterator(expr); + + Stack s1 = new Stack<>(); + + Stack s2 = new Stack<>(); + + int preLevel,thisLevel; + + while(it.hasNext()){ + + String element = it.next(); + if(Operator.contains(element)){//运算符 + while(true){ + if(s1.isEmpty()){ + s1.push(element); + break; + }else{ + preLevel = Operator.getLevelByFlag(s1.peek()); + thisLevel = Operator.getLevelByFlag(element); + if(thisLevel>preLevel){ + s1.push(element); + break; + }else{ + s2.push(s1.pop()); + } + } + } + }else{ + s2.push(element); + } + } + + while(!s1.isEmpty()){ + s2.push(s1.pop()); + } + StackUtil.reverse(s2); + return s2.toString(); + } + + public static void main(String[] args) { + + String a = "9+(3-1)*3+10/2"; + String post = InfixToPostfix.convert(a); + System.out.println(post); + + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java index 3629e99482..f6de250fc4 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java @@ -37,6 +37,19 @@ public static Operator getOperator(String flag){ return null; } + public static boolean contains(String flag){ + + if(ADD.flag.equals(flag)){ + return true; + }else if(SUB.flag.equals(flag)){ + return true; + }else if(MULTY.flag.equals(flag)){ + return true; + }else if(DIVIDE.flag.equals(flag)){ + return true; + } + return false; + } public String getFlag() { return flag; } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..b406bc3ead --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,43 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +public class PostfixExpr { + + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + //数据栈 + Stack dataStack = new Stack<>(); + + parseExpr(dataStack,null); + + return dataStack.peek(); + } + + /** + * 解析表达式 + * @return + */ + private void parseExpr(Stack dataStack,Stack operStack) { + + ExprIterator it = new ExprIterator(expr); + float a,b,res; + while(it.hasNext()){ + String element = it.next(); + if (Operator.contains(element)) { + b = dataStack.pop(); + a = dataStack.pop(); + res = FixExprUtil.calculate(a, Operator.getOperator(element), b); + dataStack.push(res); + } else { + dataStack.push(Float.parseFloat(element)); + } + } + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..a11e9a13ba --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,44 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +public class PrefixExpr { + + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + //数据栈 + Stack dataStack = new Stack<>(); + + parseExpr(dataStack,null); + + return dataStack.peek(); + } + + /** + * 解析表达式 + * @return + */ + private void parseExpr(Stack dataStack,Stack operStack) { + + ExprIterator it = new ExprIterator(FixExprUtil.reverse(expr)); + float a,b,res; + while(it.hasNext()){ + String element = it.next(); + if (Operator.contains(element)) { + a = dataStack.pop(); + b = dataStack.pop(); + res = FixExprUtil.calculate(a, Operator.getOperator(element), b); + dataStack.push(res); + } else { + dataStack.push(Float.parseFloat(element)); + } + } + } + +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..97ec425a7b --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,38 @@ +package test.com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.expr.PostfixExpr; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..e866223a4e --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,46 @@ +package test.com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.expr.PrefixExpr; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} From 716988973600197347becb3d03b067d90c49cbac Mon Sep 17 00:00:00 2001 From: ZhaoHongxin Date: Tue, 18 Apr 2017 23:22:49 +0800 Subject: [PATCH 186/552] load asignment --- .../src/com/coderising/jvm/attr/CodeAttr.java | 22 ++- .../src/com/coderising/jvm/clz/ClassFile.java | 14 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 ++++ .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 95 +++++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 ++++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 ++++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 ++++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 +++++++++ .../src/com/coderising/jvm/method/Method.java | 7 + .../jvm/print/ClassFilePrinter.java | 54 ++++++++ .../jvm/print/ConstantPoolPrinter.java | 25 ++++ .../jvm/test/ClassFileloaderTest.java | 76 +++++++++++ 19 files changed, 709 insertions(+), 9 deletions(-) create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java index 0e0e46f925..c14103ffab 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,6 +1,8 @@ package com.coderising.jvm.attr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; import com.sun.org.apache.bcel.internal.classfile.Attribute; @@ -15,21 +17,24 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + + + + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -49,7 +54,10 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ String code = iter.nextUxToHexString(codeLen); System.out.println("code:" + code); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); int exceptionTableLen = iter.nextU2toInt(); if (exceptionTableLen > 0) { diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java index e38d3091e4..13a3e4db4d 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -78,12 +78,12 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } @@ -91,4 +91,14 @@ private String getSuperClassName(){ public void addMethod(Method m) { methods.add(m); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..8c15e1bd44 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..85f6f637d4 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..1ee3e0ac81 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,95 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + //codes = codes.toUpperCase(); + CommandIterator iter = new CommandIterator(codes); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if(new_object.equals(opCode)) { + + } + } + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..4d989d6cbb --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..9fb13677eb --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..5ac3454be7 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..303a64b4c7 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..00f9a5a699 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..a43c8bd964 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..92e5c4f3f1 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..6b1b8c284c --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..00b29e1fbc --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..334eec9f98 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/method/Method.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/method/Method.java index 13a8e41994..482f445ae3 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/method/Method.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/method/Method.java @@ -1,6 +1,7 @@ package com.coderising.jvm.method; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; import javax.management.RuntimeErrorException; @@ -77,4 +78,10 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return m; } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..d1579dba28 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; + +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..4010078059 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,25 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index db02c29132..c72b31f6c6 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -9,6 +9,7 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -274,4 +275,79 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + } From 4d6db7f92f10d89d0e02ef63a6f243a7d47865dd Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 18 Apr 2017 23:29:36 +0800 Subject: [PATCH 187/552] =?UTF-8?q?LRU=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/dataStructure/LRUAlgorithm.java | 78 ---------- .../basic/dataStructure/LRULinkedList.java | 133 ++++++++++++++++++ .../src/test/java/data_structure/LRUTest.java | 14 +- 3 files changed, 143 insertions(+), 82 deletions(-) delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/LRULinkedList.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java deleted file mode 100644 index 42cce3697c..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUAlgorithm.java +++ /dev/null @@ -1,78 +0,0 @@ -package basic.dataStructure; - -/** - * @author : 温友朝 - * @date : 2017/4/18 - */ -public class LRUAlgorithm { - public Node first; - public Node last; - public Object data; - - private static final int MAX_SIZE = 5; - - - public LRUAlgorithm(){ - this.first = new Node(null, new Node()); - this.last = this.first; - } - - public LRUAlgorithm(Object data){ - this.data = data; - this.first = new Node(data, new Node()); - this.last = this.first; - } - - public int size(){ - Node temp = first; - int index = 0; - while (temp.next != null){ - index ++; - temp = temp.next; - } - - return index; - } - - public void add(Object obj){ - if(this.size() < MAX_SIZE){ - Node temp = first; - - } - } - - - - - - - - - - - - - - - - private static class Node { - Object data; - Node next; - Node before; - - private Node() {} - - public Node(Object obj, Node next) { - this.data = obj; - this.next = next; - this.before = null; - } - - public Node(Object obj, Node next, Node before){ - this.data = obj; - this.next = next; - this.before = before; - } - - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRULinkedList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRULinkedList.java new file mode 100644 index 0000000000..a7df9d0701 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRULinkedList.java @@ -0,0 +1,133 @@ +package basic.dataStructure; + +/** + * @author : 温友朝 + * @date : 2017/4/18 + */ +public class LRULinkedList { + public Node first; + public Node last; + public Object data; + + private static final int MAX_SIZE = 5; + + + public LRULinkedList() { + this.first = new Node(); + this.last = this.first; + } + + public LRULinkedList(Object data) { + this.data = data; + this.first = new Node(data); + this.last = this.first; + } + + public int size() { + Node temp = first; + int index = 0; + while (temp.next != null) { + index++; + temp = temp.next; + } + + return index; + } + + public void add(Object obj) { + //未满 + if (this.size() < MAX_SIZE) { + Node temp = first; + while(temp.next != null){ + temp = temp.next; + } + this.last = temp.next = new Node(obj, null, temp); + } else { + //满了,链表中是否有该值的数据,有,升为栈顶;无,栈底数据删除,栈顶存入新数据 + Node temp = first; + boolean flag = false; + int index = 0; + while (temp.next != null) { + //存在该值的数据 + if (temp.data == obj) { + flag = true; + } + index ++; + } + if(flag){ + Node node = get(index); + + Object data = last.data; + last.data = node.data; + node.data = data; + }else{ + removeFirst(); + while(temp.next != null){ + temp = temp.next; + } + this.last = temp.next = new Node(obj, null, temp); + } + } + } + + @Override + public String toString() { + Node temp = this.first; + StringBuffer sb = new StringBuffer(); + while (temp.next != null){ + sb.append(temp.data).append(","); + temp = temp.next; + } + + return sb.toString(); + } + + public Node get(int index){ + Node temp = first; + int i = 0; + while(temp.next != null){ + if(index != i){ + temp = temp.next; + }else break; + i++; + } + return temp; + } + + public void removeFirst(){ + this.first = this.get(1); + this.first.before = null; + } + + + private static class Node { + Object data; + Node next; + Node before; + + public Node() { + this.data = null; + this.next = null; + this.before = null; + } + + public Node(Object obj) { + this.data = obj; + this.next = null; + this.before = null; + } + + public Node(Object obj, Node next) { + this.data = obj; + this.next = next; + this.before = null; + } + + public Node(Object obj, Node next, Node before) { + this.data = obj; + this.next = next; + this.before = before; + } + + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java b/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java index a2cbd9a495..35f7a2ca61 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java @@ -1,6 +1,6 @@ package data_structure; -import basic.dataStructure.LRUAlgorithm; +import basic.dataStructure.LRULinkedList; import org.junit.Before; import org.junit.Test; @@ -10,15 +10,21 @@ */ public class LRUTest { - private LRUAlgorithm lru; + private LRULinkedList lru; @Before public void init(){ - lru = new LRUAlgorithm(); + lru = new LRULinkedList(); } @Test public void testAdd(){ - + lru.add(1); +// lru.add(2); +// lru.add(3); +// lru.add(4); +// lru.add(5); +// lru.add(6); + System.out.println(lru.toString()); } } From d054469d9ed2737f08ccd1c33da5a9c087cb144f Mon Sep 17 00:00:00 2001 From: thomas_young Date: Wed, 19 Apr 2017 07:47:08 +0800 Subject: [PATCH 188/552] =?UTF-8?q?little=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/coderising/jvm/loader/ClassFileParser.java | 2 ++ .../coding2017/coderising/jvm/method/Method.java | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java index 2638010915..2cdfb950af 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java @@ -34,6 +34,8 @@ public ClassFile parse(byte[] codes) { clzFile.setClassIndex(classIndex); parseInterfaces(byteCodeIterator); + parseFileds(clzFile, byteCodeIterator); + parseMethods(clzFile, byteCodeIterator); return clzFile; } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java index e97bc6ad1c..3e08abc298 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java @@ -9,7 +9,7 @@ import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; public class Method { - + private int accessFlag; private int nameIndex; private int descriptorIndex; @@ -45,11 +45,9 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd this.descriptorIndex = descriptorIndex; } + - - - -public String toString() { + public String toString() { ConstantPool pool = this.clzFile.getConstantPool(); StringBuilder buffer = new StringBuilder(); From 83fb8ce3c2b51f61d549e67cac3ef1b814315f9e Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Wed, 19 Apr 2017 09:40:17 +0800 Subject: [PATCH 189/552] coding --- .../src/com/coderising/jvm/attr/CodeAttr.java | 17 +- .../src/com/coderising/jvm/clz/ClassFile.java | 32 +++- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 21 +++ .../coderising/jvm/cmd/ByteCodeCommand.java | 125 ++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 155 ++++++++++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 21 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 19 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 21 +++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 21 +++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 +++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 +++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 ++++++++ .../coderising/jvm/constant/ClassInfo.java | 5 + .../coderising/jvm/constant/ConstantInfo.java | 12 ++ .../coderising/jvm/constant/ConstantPool.java | 23 ++- .../coderising/jvm/constant/FieldRefInfo.java | 5 + .../jvm/constant/MethodRefInfo.java | 6 + .../jvm/constant/NameAndTypeInfo.java | 5 + .../jvm/constant/NullConstantInfo.java | 4 + .../coderising/jvm/constant/StringInfo.java | 6 + .../com/coderising/jvm/constant/UTF8Info.java | 4 + .../jvm/loader/ClassFileParser.java | 9 +- .../src/com/coderising/jvm/method/Method.java | 11 ++ .../jvm/print/ClassFilePrinter.java | 52 ++++++ .../jvm/print/ConstantPoolPrinter.java | 91 ++++++++++ .../coderising/jvm/ClassFileloaderTest.java | 82 ++++++++- 29 files changed, 916 insertions(+), 15 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java index 3a2f0e6988..64e6226561 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java @@ -3,6 +3,8 @@ import java.util.ArrayList; import java.util.List; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -12,17 +14,19 @@ public class CodeAttr extends AttributeInfo { private int maxLocals ; private int codeLen ; private String code; + private ByteCodeCommand[] cmds ; private List attributeInfos = new ArrayList<>(); - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; + this.cmds = cmds; } - + public static CodeAttr parse(ConstantPool pool,ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); @@ -31,11 +35,13 @@ public static CodeAttr parse(ConstantPool pool,ByteCodeIterator iter){ int maxLocals = iter.nextU2ToInt(); int codeLen = iter.nextU4ToInt(); String code = iter.nextUxToHexString(codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); + ByteCodeCommand[] cmds = CommandParser.parse(pool.getClzFile(),code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code,cmds); //解析exception_table start TODO + @SuppressWarnings("unused") int exceptionTabLen = iter.nextU2ToInt(); - System.out.println("exception_table 的个数为"+exceptionTabLen); + //System.out.println("exception_table 的个数为"+exceptionTabLen); //解析exception_table end TODO codeAttr.setAttributeInfos(AttributeInfo.parseAttributes(pool, iter)); @@ -43,6 +49,9 @@ public static CodeAttr parse(ConstantPool pool,ByteCodeIterator iter){ return codeAttr; } + public ByteCodeCommand[] getCmds() { + return cmds; + } public int getMaxStack() { return maxStack; diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java index c21a0988e5..534bc36cba 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java @@ -67,6 +67,34 @@ public List getMethods() { return methods; } + public Method getMethod(String methodName, String paramAndReturnType){ + + for(Method m :methods){ + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + + public Method getMainMethod(){ + for(Method m :methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ + return m; + } + } + return null; + } public void print(){ @@ -80,12 +108,12 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..03db32ccc9 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..4c8b21ab09 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,125 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..0dd0573ae5 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,155 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + // System.out.println( cmd.toString(clzFile.getConstPool())); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..92fe286363 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..52a7550d12 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..c6efbae530 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..a17c51a81d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..00f9a5a699 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..a43c8bd964 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..461bb4e2a5 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..6b1b8c284c --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..00b29e1fbc --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..334eec9f98 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java index e12b3e164e..c837b9d838 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java @@ -21,4 +21,9 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java index c8035ae876..35a3d873a9 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java @@ -26,4 +26,16 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java index 0e940b78d0..d641ea15c0 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java @@ -3,14 +3,18 @@ import java.util.ArrayList; import java.util.List; +import com.coderising.jvm.clz.ClassFile; + public class ConstantPool { private List constantInfos = new ArrayList(); + private ClassFile clzFile; - public ConstantPool(){ - + public ConstantPool(ClassFile clzFile){ + this.clzFile = clzFile; } + public void addConstantInfo(ConstantInfo info){ this.constantInfos.add(info); @@ -23,7 +27,20 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } + + public List getConstantInfos() { + return constantInfos; + } + + public void setConstantInfos(List constantInfos) { + this.constantInfos = constantInfos; + } + + public ClassFile getClzFile() { + return clzFile; + } + } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java index 7ff9d5fb77..804e41a393 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,4 +51,9 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + + visitor.visitFieldRef(this); + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java index 0feffa65b5..68d84ad685 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -49,6 +49,12 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + + visitor.visitMethodRef(this); + } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java index dcac7f97c4..c22a7bfbca 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,9 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java index fa90d110fe..80cc827f18 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java index d01065fd53..56f5daa724 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + + visitor.visitString(this); + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java index 0aa9ee045b..858f1b212d 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java @@ -26,5 +26,9 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java index bd1fa61d5b..0d49151217 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java @@ -32,7 +32,7 @@ public ClassFile parse(byte[] codes) throws NotAClassFileException { clazzFile.setMajorVersion(iterator.nextU2ToInt()); - clazzFile.setConstPool(parseConstantPool(iterator)); + clazzFile.setConstPool(parseConstantPool(iterator,clazzFile)); clazzFile.setAccessFlag(parseAccessFlag(iterator)); @@ -67,9 +67,9 @@ private ClassIndex parseClassInfex(ByteCodeIterator iter){ return classIndex; } - private ConstantPool parseConstantPool(ByteCodeIterator iter){ + private ConstantPool parseConstantPool(ByteCodeIterator iter,ClassFile clazzFile){ - ConstantPool pool = new ConstantPool(); + ConstantPool pool = new ConstantPool(clazzFile); pool.addConstantInfo(new NullConstantInfo()); try { @@ -129,8 +129,9 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter){ private void parseInterfaces(ByteCodeIterator iter){ + @SuppressWarnings("unused") int interfaceCount = iter.nextU2ToInt(); - System.out.println("接口数量为:"+interfaceCount); + //System.out.println("接口数量为:"+interfaceCount); // TODO } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java index c8d8065df8..245ccdc558 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java @@ -4,6 +4,8 @@ import java.util.List; import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -35,7 +37,16 @@ public static Method parse(ConstantPool pool, ByteCodeIterator iter){ return method; } + public ByteCodeCommand[] getCmds() { + for (AttributeInfo attributeInfo : attributeInfos) { + if(attributeInfo instanceof CodeAttr){ + return ((CodeAttr) attributeInfo).getCmds(); + } + } + return null; + } + public int getAccessFlag() { return accessFlag; } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..ee99162a4d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()+"\n"); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "test.com.coderising.jvm.EmployeeV1"; + + ClassFile clzFile = null; + try { + clzFile = loader.loadClass(className); + } catch (NotAClassFileException e) { + e.printStackTrace(); + } + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..9abd6ca1ed --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,91 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + + for(int i=1; i<=pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } + } + + private void printSpaceAfterConsName(String consBeforStr){ + + String bashStr = (pool.getSize()+1)+"="+"NameAndType "; + int bashLen = bashStr.length(); + int offset = bashLen-consBeforStr.length(); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java index 3f763912fc..2a18bee6d7 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java @@ -10,6 +10,10 @@ import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -24,8 +28,8 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "test/com/coderising/jvm/EmployeeV1"; - //static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; - static String path1 = "E:\\githubRepository\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + //static String path1 = "E:\\githubRepository\\coding2017\\group12\\2258659044\\zj-2017\\bin"; static String path2 = "C:\temp"; @@ -268,4 +272,78 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } \ No newline at end of file From 38cf9394bb3d862ff967169578973a278085db9c Mon Sep 17 00:00:00 2001 From: "yanght1454385822@qq.com" Date: Wed, 19 Apr 2017 11:07:50 +0800 Subject: [PATCH 190/552] InfixExpr --- .../basic/homework_06/expr/InfixExpr.java | 57 +++++++++++++++++-- .../coding/basic/homework_06/expr/Token.java | 51 +++++++++++++++++ .../basic/homework_06/expr/TokenParser.java | 46 +++++++++++++++ .../homework_06/expr/TokenParserTest.java | 39 +++++++++++++ 4 files changed, 189 insertions(+), 4 deletions(-) create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/Token.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParser.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParserTest.java diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExpr.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExpr.java index c6212009bc..685e4050ea 100644 --- a/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExpr.java +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixExpr.java @@ -1,5 +1,8 @@ package com.coding.basic.homework_06.expr; +import java.util.List; +import java.util.Stack; + public class InfixExpr { String expr = null; @@ -7,12 +10,58 @@ public InfixExpr(String expr) { this.expr = expr; } - public float evaluate() { + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack numStack = new Stack(); + Stack opStack = new Stack(); + + for (Token token : tokens) { + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + }else{ + while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float float1 = numStack.pop(); + Float float2 = numStack.pop(); + Float result = getResult(float1, float2, prevOperator.toString()); + numStack.push(result); + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + while(!opStack.isEmpty()){ + Token prevOperator = opStack.pop(); + Float float1 = numStack.pop(); + Float float2 = numStack.pop(); + Float result = getResult(float1, float2, prevOperator.toString()); + numStack.push(result); + } - return 0.0f; + return numStack.pop(); } - + private Float getResult(Float float1, Float float2, String operator){ + if(operator.equals("+")){ + return float1 + float2; + }else if(operator.equals("-")){ + return float2 - float1; + }else if(operator.equals("*")){ + return float1 * float2; + }else if(operator.equals("/")){ + return float2 / float1; + }else{ + throw new RuntimeException(operator + " is not supported"); + } + + + } - + } \ No newline at end of file diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/Token.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/Token.java new file mode 100644 index 0000000000..59dca19bd7 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/Token.java @@ -0,0 +1,51 @@ +package com.coding.basic.homework_06.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + public static final Map priorities = new HashMap(); + static{ + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber(){ + return type == NUMBER; + } + + public boolean isOperator(){ + return type == OPERATOR; + } + + public int getIntValue(){ + return Integer.valueOf(value).intValue(); + } + + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParser.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParser.java new file mode 100644 index 0000000000..f158fdd933 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParser.java @@ -0,0 +1,46 @@ +package com.coding.basic.homework_06.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + public List parse(String expr){ + List tokens = new ArrayList(); + int i = 0; + while(i < expr.length()){ + char c = expr.charAt(i); + if (isOperator(c)) { + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + } else if(Character.isDigit(c)){ + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token token = new Token(Token.NUMBER, value); + tokens.add(token); + i = nextOperatorIndex; + }else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + } + return tokens; + } + + private int indexOfNextOperator (int i, String expr){ + while(Character.isDigit(expr.charAt(i))){ + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char c){ + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParserTest.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParserTest.java new file mode 100644 index 0000000000..2be1d52989 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParserTest.java @@ -0,0 +1,39 @@ +package com.coding.basic.homework_06.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} \ No newline at end of file From e94ce7944ece1543abefad74499e5b57bb17928c Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 19 Apr 2017 14:15:22 +0800 Subject: [PATCH 191/552] add PrefixExpr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 暂时想不到比这个更好的写法 --- group02/727171008/.classpath | 1 + .../coding2017/stack/expr/PrefixExpr.java | 133 +++++------------- 2 files changed, 33 insertions(+), 101 deletions(-) diff --git a/group02/727171008/.classpath b/group02/727171008/.classpath index 3e0fb272a8..429701a6eb 100644 --- a/group02/727171008/.classpath +++ b/group02/727171008/.classpath @@ -3,5 +3,6 @@ + diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java index 97433b79a6..bb9451c332 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java @@ -1,9 +1,7 @@ package com.github.HarryHook.coding2017.stack.expr; -import java.lang.reflect.AnnotatedArrayType; -import java.util.ArrayList; - -import com.github.HarryHook.coding2017.basic.MyStack; +import java.util.List; +import java.util.Stack; public class PrefixExpr { String expr = null; @@ -14,115 +12,48 @@ public PrefixExpr(String expr) { public float evaluate() { - char[] ch = expr.toCharArray(); - MyStack stackOfOperator = new MyStack(); - MyStack stackOfNumber = new MyStack(); - ArrayList array = new ArrayList(); - for(int i=0; i tokens = parser.parse(this.expr); + + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for (Token token : tokens) { + exprStack.push(token); } - - for (int i = 0; i < array.size(); i++) { - - char operator = (char) array.get(i); - if (operator == '+'|| operator == '-' || operator == '*' || operator == '/') { - stackOfOperator.push(operator); + + while (!exprStack.isEmpty()) { + Token t = exprStack.pop(); + if (t.isNumber()) { + numStack.push(new Float(t.getIntValue())); } else { - stackOfNumber.push(array.get(i)); - } - - operator = (char)stackOfOperator.peek(); - //如果栈顶元素是'*','/'还需判断下个字符是不是'*','/' - if (!(stackOfOperator.isEmpty()) && operator == '*' || operator == '/') { - operator = (char) array.get(++i); - if(operator == '*') { - stackOfOperator.push(ch[i]); - } else { - i--; - } - if(operator == '/') { - stackOfOperator.push(ch[i]); - } else { - i--; - } - stackOfNumber.push(array.get(++i)); - stackOfNumber.push(array.get(++i)); - - float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); - float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); - - if((char)stackOfOperator.peek() == '*') { - stackOfNumber.push(tmp1 * tmp2); - } - if((char)stackOfOperator.peek() == '/'){ - stackOfNumber.push(tmp2 / tmp1); - } - - stackOfOperator.pop(); - } - - } - // 将栈中的数字和运算法逆置,从左往右结合 - reverse(stackOfNumber); - //reverse(stackOfOperator); + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(t.toString(), f1, f2)); - while (!(stackOfOperator.isEmpty())) { - if ((char) stackOfOperator.peek() == '+') { - float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); - float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); - stackOfNumber.push(tmp1 + tmp2); - } - - if ((char) stackOfOperator.peek() == '-') { - float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); - float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); - stackOfNumber.push(tmp1 - tmp2); } - stackOfOperator.pop(); } - - return Float.parseFloat("" + stackOfNumber.pop()); + return numStack.pop().floatValue(); } - private void reverse(MyStack s) { - - if (s.isEmpty()) { - return; + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; } - // 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。 - Object tmp1 = s.pop(); - reverse(s); - if (s.isEmpty()) { - s.push(tmp1); - return; + if (op.equals("-")) { + return f1 - f2; } - Object temp2 = s.pop(); - reverse(s); - s.push(tmp1); - reverse(s); - s.push(temp2); - + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + " is not supported"); } public static void main(String[] args) { - String expr = "-++6/*2 9 3 * 4 2 8"; - PrefixExpr prefixExpr = new PrefixExpr(expr); + + PrefixExpr prefixExpr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); System.out.println(prefixExpr.evaluate()); } From 04167660c88cbf42f2dfb1beb8faa4775d627776 Mon Sep 17 00:00:00 2001 From: gongxun Date: Wed, 19 Apr 2017 14:26:30 +0800 Subject: [PATCH 192/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=AD=97=E8=8A=82?= =?UTF-8?q?=E7=A0=81=E5=91=BD=E4=BB=A4=E7=9A=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.16/cmd/CommandParser.java | 193 +++++++++++------- group17/785396327/4.5/clz/ClassFile.java | 21 +- .../4.5/test/ClassFileloaderTest.java | 82 ++++---- 3 files changed, 177 insertions(+), 119 deletions(-) diff --git a/group17/785396327/4.16/cmd/CommandParser.java b/group17/785396327/4.16/cmd/CommandParser.java index 5f5956350d..c76ca4af52 100644 --- a/group17/785396327/4.16/cmd/CommandParser.java +++ b/group17/785396327/4.16/cmd/CommandParser.java @@ -3,6 +3,7 @@ import clz.ClassFile; import constant.ClassInfo; +import java.util.ArrayList; import java.util.List; /** @@ -46,81 +47,125 @@ public class CommandParser { public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { CommandIterator commandIterator = new CommandIterator(codes); - String command = commandIterator.next2CharAsString().toUpperCase(); - if (command.equals(aconst_null)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(1); - } else if (command.equals(new_object)) { - NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, command); - int oprand1 = commandIterator.next2CharAsInt(); - int oprand2 = commandIterator.next2CharAsInt(); - newObjectCmd.setOprand1(oprand1); - newObjectCmd.setOprand2(oprand2); - - } else if (command.equals(lstore)) { - - } else if (command.equals(invokespecial)) { - - } else if (command.equals(invokevirtual)) { - - } else if (command.equals(getfield)) { - GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, command); - } else if (command.equals(putfield)) { - PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, command); - } else if (command.equals(getstatic)) { - GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, command); - } else if (command.equals(ldc)) { - LdcCmd ldcCmd = new LdcCmd(clzFile, command); - } else if (command.equals(dup)) { - - } else if (command.equals(bipush)) { - BiPushCmd biPushCmd = new BiPushCmd(clzFile, command); - } else if (command.equals(aload_0)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - } else if (command.equals(aload_1)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - } else if (command.equals(aload_2)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - } else if (command.equals(iload)) { - - } else if (command.equals(iload_2)) { - - } else if (command.equals(iload_1)) { - - } else if (command.equals(iload_3)) { - - } else if (command.equals(fload_3)) { - - } else if (command.equals(voidreturn)) { - - } else if (command.equals(ireturn)) { - - } else if (command.equals(freturn)) { - - } else if (command.equals(astore_1)) { - - } else if (command.equals(if_icmp_ge)) { - - } else if (command.equals(if_icmple)) { - - } else if (command.equals(goto_no_condition)) { - - } else if (command.equals(iconst_0)) { - - } else if (command.equals(iconst_1)) { - - } else if (command.equals(istore_1)) { - - } else if (command.equals(istore_2)) { - - } else if (command.equals(iadd)) { - - } else if (command.equals(iinc)) { - - } else { - throw new RuntimeException("wrong command : " + command); + List commandList = new ArrayList(); + while (commandIterator.hasNext()) { + String command = commandIterator.next2CharAsString().toUpperCase(); + if (command.equals(aconst_null)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(new_object)) { + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, command); + newObjectCmd.setOprand1(commandIterator.next2CharAsInt()); + newObjectCmd.setOprand2(commandIterator.next2CharAsInt()); + newObjectCmd.setOffset(newObjectCmd.getLength()); + commandList.add(newObjectCmd); + } else if (command.equals(lstore)) { + + } else if (command.equals(invokespecial)) { + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, command); + invokeSpecialCmd.setOprand1(commandIterator.next2CharAsInt()); + invokeSpecialCmd.setOprand2(commandIterator.next2CharAsInt()); + invokeSpecialCmd.setOffset(invokeSpecialCmd.getLength()); + commandList.add(invokeSpecialCmd); + } else if (command.equals(invokevirtual)) { + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, command); + invokeVirtualCmd.setOprand1(commandIterator.next2CharAsInt()); + invokeVirtualCmd.setOprand2(commandIterator.next2CharAsInt()); + invokeVirtualCmd.setOffset(invokeVirtualCmd.getLength()); + commandList.add(invokeVirtualCmd); + } else if (command.equals(getfield)) { + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, command); + } else if (command.equals(putfield)) { + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, command); + putFieldCmd.setOprand1(commandIterator.next2CharAsInt()); + putFieldCmd.setOprand2(commandIterator.next2CharAsInt()); + putFieldCmd.setOffset(putFieldCmd.getLength()); + commandList.add(putFieldCmd); + } else if (command.equals(getstatic)) { + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, command); + getStaticFieldCmd.setOprand1(commandIterator.next2CharAsInt()); + getStaticFieldCmd.setOprand2(commandIterator.next2CharAsInt()); + getStaticFieldCmd.setOffset(getStaticFieldCmd.getLength()); + commandList.add(getStaticFieldCmd); + } else if (command.equals(ldc)) { + LdcCmd ldcCmd = new LdcCmd(clzFile, command); + ldcCmd.setOperand(commandIterator.next2CharAsInt()); + ldcCmd.setOffset(ldcCmd.getLength()); + commandList.add(ldcCmd); + } else if (command.equals(dup)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(bipush)) { + BiPushCmd biPushCmd = new BiPushCmd(clzFile, command); + biPushCmd.setOperand(commandIterator.next2CharAsInt()); + biPushCmd.setOffset(biPushCmd.getLength()); + commandList.add(biPushCmd); + } else if (command.equals(aload_0)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(aload_1)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(aload_2)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(iload)) { + + } else if (command.equals(iload_2)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(iload_1)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(iload_3)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(fload_3)) { + + } else if (command.equals(voidreturn)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(ireturn)) { + + } else if (command.equals(freturn)) { + + } else if (command.equals(astore_1)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(if_icmp_ge)) { + + } else if (command.equals(if_icmple)) { + + } else if (command.equals(goto_no_condition)) { + + } else if (command.equals(iconst_0)) { + + } else if (command.equals(iconst_1)) { + + } else if (command.equals(istore_1)) { + + } else if (command.equals(istore_2)) { + + } else if (command.equals(iadd)) { + + } else if (command.equals(iinc)) { + + } else { + throw new RuntimeException("wrong command : " + command); + } } - return null; + calcuateOffset(commandList); + return commandList.toArray(new ByteCodeCommand[commandList.size()]); } private static void calcuateOffset(List cmds) { diff --git a/group17/785396327/4.5/clz/ClassFile.java b/group17/785396327/4.5/clz/ClassFile.java index 27e78451c5..fe3f0f500e 100644 --- a/group17/785396327/4.5/clz/ClassFile.java +++ b/group17/785396327/4.5/clz/ClassFile.java @@ -92,13 +92,26 @@ private String getSuperClassName(){ return superClass.getClassName(); } - public Method getMethod(String methodName, String paramAndReturnType){ - - + public Method getMethod(String methodName, String paramAndReturnType) { + if (methods != null) { + for (Method method : methods) { + String name = getConstantPool().getUTF8String(method.getNameIndex()); + String desc = getConstantPool().getUTF8String(method.getDescriptorIndex()); + if(name.equals(methodName)&&desc.equals(paramAndReturnType)) + return method; + } + } return null; } public Method getMainMethod(){ - + if (methods != null) { + for (Method method : methods) { + String name = getConstantPool().getUTF8String(method.getNameIndex()); + String desc = getConstantPool().getUTF8String(method.getDescriptorIndex()); + if(name.equals("main")&&desc.equals("([Ljava/lang/String;)V")) + return method; + } + } return null; } } diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java index 2a8badce36..2276ee4eaf 100644 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -228,36 +228,36 @@ public void testMethods(){ "2ab700012a2bb500022a1cb50003b1"); } -// { -// Method m = methods.get(1); -// assertMethodEquals(pool,m, -// "setName", -// "(Ljava/lang/String;)V", -// "2a2bb50002b1"); -// -// } -// { -// Method m = methods.get(2); -// assertMethodEquals(pool,m, -// "setAge", -// "(I)V", -// "2a1bb50003b1"); -// } -// { -// Method m = methods.get(3); -// assertMethodEquals(pool,m, -// "sayHello", -// "()V", -// "b200041205b60006b1"); -// -// } -// { -// Method m = methods.get(4); -// assertMethodEquals(pool,m, -// "main", -// "([Ljava/lang/String;)V", -// "bb0007591208101db700094c2bb6000ab1"); -// } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb50002b1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50003b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b200041205b60006b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb0007591208101db700094c2bb6000ab1"); + } } private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ @@ -277,13 +277,13 @@ public void testByteCodeCommand(){ ByteCodeCommand [] cmds = initMethod.getCmds(); assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("1: invokespecial #1", cmds[1]); assertOpCodeEquals("4: aload_0", cmds[2]); assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("6: putfield #2", cmds[4]); assertOpCodeEquals("9: aload_0", cmds[5]); assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("11: putfield #3", cmds[7]); assertOpCodeEquals("14: return", cmds[8]); } @@ -293,7 +293,7 @@ public void testByteCodeCommand(){ assertOpCodeEquals("0: aload_0", cmds[0]); assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("2: putfield #2", cmds[2]); assertOpCodeEquals("5: return", cmds[3]); } @@ -302,9 +302,9 @@ public void testByteCodeCommand(){ Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("0: getstatic #4", cmds[0]); + assertOpCodeEquals("3: ldc #5", cmds[1]); + assertOpCodeEquals("5: invokevirtual #6", cmds[2]); assertOpCodeEquals("8: return", cmds[3]); } @@ -314,14 +314,14 @@ public void testByteCodeCommand(){ ByteCodeCommand [] cmds = mainMethod.getCmds(); - assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("0: new #7", cmds[0]); assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("4: ldc #8", cmds[2]); assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("8: invokespecial #9", cmds[4]); assertOpCodeEquals("11: astore_1", cmds[5]); assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("13: invokevirtual #10", cmds[7]); assertOpCodeEquals("16: return", cmds[8]); } From 67a8b47adb6ff31b61f12d6975431310def4623c Mon Sep 17 00:00:00 2001 From: gongxun Date: Wed, 19 Apr 2017 14:27:46 +0800 Subject: [PATCH 193/552] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.16/cmd/CommandParser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/group17/785396327/4.16/cmd/CommandParser.java b/group17/785396327/4.16/cmd/CommandParser.java index c76ca4af52..02d06cd275 100644 --- a/group17/785396327/4.16/cmd/CommandParser.java +++ b/group17/785396327/4.16/cmd/CommandParser.java @@ -76,6 +76,10 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { commandList.add(invokeVirtualCmd); } else if (command.equals(getfield)) { GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, command); + getFieldCmd.setOprand1(commandIterator.next2CharAsInt()); + getFieldCmd.setOprand2(commandIterator.next2CharAsInt()); + getFieldCmd.setOffset(getFieldCmd.getLength()); + commandList.add(getFieldCmd); } else if (command.equals(putfield)) { PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, command); putFieldCmd.setOprand1(commandIterator.next2CharAsInt()); From b7f02fdb6cb037284b58f4ebcca889a9360bbfad Mon Sep 17 00:00:00 2001 From: hejj <844028312@qq.com> Date: Wed, 19 Apr 2017 14:28:28 +0800 Subject: [PATCH 194/552] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 48 ++ .../coderising/download/FileDownloader.java | 86 ++++ .../download/FileDownloaderTest.java | 115 +++++ .../coderising/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 54 +++ .../download/impl/ConnectionManagerImpl.java | 33 ++ .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 161 +++++++ .../com/coderising/litestruts/StrutsTest.java | 50 +++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coding/basic/BinaryTreeNode.java | 145 ++++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 19 + .../src/com/coding/basic/Stack.java | 24 + .../src/com/coding/basic/array/ArrayList.java | 100 +++++ .../src/com/coding/basic/array/ArrayUtil.java | 222 +++++++++ .../com/coding/basic/array/ArrayUtilTest.java | 66 +++ .../coding/basic/linklist/LRUPageFrame.java | 127 ++++++ .../basic/linklist/LRUPageFrameTest.java | 31 ++ .../com/coding/basic/linklist/LinkedList.java | 420 ++++++++++++++++++ .../com/coding/basic/queue/CircleQueue.java | 5 + .../src/com/coding/basic/queue/Josephus.java | 19 + .../com/coding/basic/queue/JosephusTest.java | 27 ++ .../src/com/coding/basic/queue/Queue.java | 26 ++ .../basic/queue/QueueWithTwoStacks.java | 40 ++ .../src/com/coding/basic/stack/Stack.java | 30 ++ .../src/com/coding/basic/stack/StackUtil.java | 135 ++++++ .../com/coding/basic/stack/StackUtilTest.java | 65 +++ .../coding/basic/stack/expr/InfixExpr.java | 207 +++++++++ .../basic/stack/expr/InfixExprTest.java | 60 +++ .../basic/stack/expr/InfixToPostfix.java | 14 + .../coding/basic/stack/expr/PostfixExpr.java | 18 + .../basic/stack/expr/PostfixExprTest.java | 41 ++ .../coding/basic/stack/expr/PrefixExpr.java | 18 + .../basic/stack/expr/PrefixExprTest.java | 45 ++ .../com/coding/basic/stack/expr/Token.java | 50 +++ .../coding/basic/stack/expr/TokenParser.java | 57 +++ .../basic/stack/expr/TokenParserTest.java | 41 ++ .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 90 ++++ .../coderising/jvm/attr/LineNumberTable.java | 53 +++ .../jvm/attr/LocalVariableItem.java | 39 ++ .../jvm/attr/LocalVariableTable.java | 45 ++ .../coderising/jvm/attr/StackMapTable.java | 30 ++ .../com/coderising/jvm/clz/AccessFlag.java | 25 ++ .../src/com/coderising/jvm/clz/ClassFile.java | 92 ++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../coderising/jvm/constant/ClassInfo.java | 24 + .../coderising/jvm/constant/ConstantInfo.java | 29 ++ .../coderising/jvm/constant/ConstantPool.java | 29 ++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++ .../jvm/constant/MethodRefInfo.java | 55 +++ .../jvm/constant/NameAndTypeInfo.java | 45 ++ .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 ++ .../com/coderising/jvm/constant/UTF8Info.java | 32 ++ .../src/com/coderising/jvm/field/Field.java | 44 ++ .../jvm/loader/ByteCodeIterator.java | 43 ++ .../jvm/loader/ClassFileLoader.java | 142 ++++++ .../jvm/loader/ClassFileParser.java | 158 +++++++ .../src/com/coderising/jvm/method/Method.java | 73 +++ .../jvm/test/ClassFileloaderTest.java | 276 ++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 29 ++ .../src/com/coderising/jvm/util/Util.java | 24 + .../one/src/com/coding/basic/Stack.java | 10 +- .../one/src/com/coding/basic/StackUtil.java | 135 ++++++ .../coding/basic/linklist/LRUPageFrame.java | 127 ++++++ .../basic/linklist/LRUPageFrameTest.java | 31 ++ .../com/coding/basic/linklist/LinkedList.java | 125 ++++++ .../coding/basic/stack/expr/InfixExpr.java | 208 +++++++++ .../basic/stack/expr/InfixExprTest.java | 60 +++ 75 files changed, 4919 insertions(+), 5 deletions(-) create mode 100644 group04/844028312/data-structure/src/com/coderising/download/DownloadThread.java create mode 100644 group04/844028312/data-structure/src/com/coderising/download/FileDownloader.java create mode 100644 group04/844028312/data-structure/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group04/844028312/data-structure/src/com/coderising/download/api/Connection.java create mode 100644 group04/844028312/data-structure/src/com/coderising/download/api/ConnectionException.java create mode 100644 group04/844028312/data-structure/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group04/844028312/data-structure/src/com/coderising/download/api/DownloadListener.java create mode 100644 group04/844028312/data-structure/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group04/844028312/data-structure/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group04/844028312/data-structure/src/com/coderising/litestruts/LoginAction.java create mode 100644 group04/844028312/data-structure/src/com/coderising/litestruts/Struts.java create mode 100644 group04/844028312/data-structure/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group04/844028312/data-structure/src/com/coderising/litestruts/View.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/Iterator.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/List.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/Queue.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/Stack.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/array/ArrayList.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/array/ArrayUtil.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/array/ArrayUtilTest.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/linklist/LinkedList.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/queue/Josephus.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/queue/Queue.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/Stack.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/StackUtil.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/Token.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group04/844028312/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/method/Method.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group04/844028312/min-jvm/src/com/coderising/jvm/util/Util.java create mode 100644 group04/844028312/one/src/com/coding/basic/StackUtil.java create mode 100644 group04/844028312/one/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group04/844028312/one/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group04/844028312/one/src/com/coding/basic/linklist/LinkedList.java create mode 100644 group04/844028312/one/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group04/844028312/one/src/com/coding/basic/stack/expr/InfixExprTest.java diff --git a/group04/844028312/data-structure/src/com/coderising/download/DownloadThread.java b/group04/844028312/data-structure/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..580da85576 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,48 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + CyclicBarrier barrier; + String url; + public DownloadThread(CyclicBarrier barrier, String url, int startPos, int endPos){ + this.barrier=barrier; + //this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.url=url; + } + public void run(){ + try { + ConnectionManager cm = new ConnectionManagerImpl(); + conn=cm.open(url); + + byte[] b=conn.read(startPos, endPos); + + RandomAccessFile randomFile = new RandomAccessFile("D://test.zip", "rw"); + write(randomFile,b); + barrier.await(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + public synchronized void write(RandomAccessFile randomFile ,byte[] b) throws IOException{ + randomFile.seek(startPos); + randomFile.write(b); + randomFile.close(); + } +} diff --git a/group04/844028312/data-structure/src/com/coderising/download/FileDownloader.java b/group04/844028312/data-structure/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..9d81ef03be --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,86 @@ +package com.coderising.download; + +import java.util.concurrent.CyclicBarrier; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + + CyclicBarrier cb = new CyclicBarrier(4, new Runnable() { + @Override + public void run() { + // TODO Auto-generated method stub + listener.notifyFinished(); + + } + }); + conn=cm.open(url); + int length = conn.getContentLength(); + new DownloadThread(cb,url,0,length/4).start(); + new DownloadThread(cb,url,length/4+1,(length/4)*2).start(); + new DownloadThread(cb,url,(length/4)*2+1,(length/4)*3).start(); + new DownloadThread(cb,url,(length/4)*3+1,length-1).start(); + + + } catch (Exception e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group04/844028312/data-structure/src/com/coderising/download/FileDownloaderTest.java b/group04/844028312/data-structure/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..b1cc492c33 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,115 @@ +package com.coderising.download; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + private static Integer pages=1; // 网页数 + + private static boolean exeFlag=true; // 执行标识 + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url="http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.0.41/bin/apache-tomcat-8.0.41-windows-x64.zip"; + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + //Thread.sleep(5000); + } catch (Exception e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + + //http://image.so.com/v?ie=utf-8&src=hao_360so&q=%E9%AB%98%E5%9C%86%E5%9C%86&correct=%E9%AB%98%E5%9C%86%E5%9C%86&fromurl=http%3A%2F%2Fwww.cesiu.org.cn%2Fomdsj%2F2010674.html&gsrc=1#multiple=0&dataindex=57&id=537876d111c8adfec7fbda2b80a4f67b + @Test + public void testOpen() throws ConnectionException { + + + + ExecutorService executorService=Executors.newFixedThreadPool(10); // 创建ExecutorService 连接池创建固定的10个初始线程 + + while(exeFlag){ + if(pages<=100){ +// executorService.execute(new Runnable(){ +// +// @Override +// public void run() { +// // TODO Auto-generated method stub +// System.out.println(Thread.currentThread().getName()); +// System.out.println("爬取了第"+pages+"网页..."); +// pages++; +// } +// +// }); + new Runnable(){ + + @Override + public void run() { + // TODO Auto-generated method stub + System.out.println(Thread.currentThread().getName()); + System.out.println("爬取了第"+pages+"网页..."); + pages++; + } + + }.run();; + + }else{ + if(((ThreadPoolExecutor)executorService).getActiveCount()==0){ // 活动线程是0 + executorService.shutdown(); // 结束所有线程 + exeFlag=false; + System.out.println("爬虫任务已经完成"); + } + } + try { + // Thread.sleep(2000); // 线程休息0.1秒 + } catch (Exception e) { + e.printStackTrace(); + } + + } + + } +} diff --git a/group04/844028312/data-structure/src/com/coderising/download/api/Connection.java b/group04/844028312/data-structure/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group04/844028312/data-structure/src/com/coderising/download/api/ConnectionException.java b/group04/844028312/data-structure/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..c3ed7396e7 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group04/844028312/data-structure/src/com/coderising/download/api/ConnectionManager.java b/group04/844028312/data-structure/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group04/844028312/data-structure/src/com/coderising/download/api/DownloadListener.java b/group04/844028312/data-structure/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group04/844028312/data-structure/src/com/coderising/download/impl/ConnectionImpl.java b/group04/844028312/data-structure/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..4849434761 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,54 @@ +package com.coderising.download.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.util.Arrays; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + HttpURLConnection urlConnection; + + + + public HttpURLConnection getUrlConnection() { + return urlConnection; + } + + public void setUrlConnection(HttpURLConnection urlConnection) { + this.urlConnection = urlConnection; + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + byte[] buffer = new byte[endPos-startPos+1]; + int count=0; + urlConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + InputStream ips=urlConnection.getInputStream(); + //ips.skip(startPos); + while(count action=new HashMap(); + private boolean find=false; + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + View v=new View(); + //创建SAXReader对象 + SAXReader reader = new SAXReader(); + Struts struts=new Struts(); + File file=new File(Struts.class.getResource("struts.xml").getFile()); + Document document; + try { + document = reader.read(file); + Element root=document.getRootElement(); + struts.listNodes("login",root); + if(struts.getAction().size()!=0){ + try { + String className=struts.getAction().get("class"); + Class c=Class.forName(className); + Object obj = c.newInstance(); + Method[] methods = c.getDeclaredMethods(); + Iterator iter = parameters.entrySet().iterator(); + while (iter.hasNext()) { + Map.Entry entry = (Map.Entry) iter.next(); + Object key = entry.getKey(); + Object val = entry.getValue(); + for(Method m:methods){ + String sName=m.getName().substring(0, 3); + String eName=m.getName().substring(3, m.getName().length()).toLowerCase(); + + if("set".equals(sName)&&key.equals(eName)){ + m.invoke(obj, val); + break; + } + } + } + Method exectue= c.getDeclaredMethod("execute"); + String key=(String) exectue.invoke(obj, null); + String jsp; + if(key!=null&&!"".equals(key)){ + jsp=struts.getAction().get(key); + v.setJsp(jsp); + } + Map map=new HashMap<>(); + for(Method m:methods){ + String sName=m.getName().substring(0, 3); + + if("get".equals(sName)){ + String key2=m.getName().substring(3, m.getName().length()).toLowerCase(); + String values=(String) m.invoke(obj, null); + map.put(key2, values); + } + } + v.setParameters(map); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + + return v; + } + public Map getAction() { + return action; + } + public void setAction(Map action) { + this.action = action; + } + public Map listNodes(String actionName,Element node){ + String name=node.getName(); //节点名字 + if("action".equals(name)){ + List attributes=node.attributes();//获取节点属性 + for(Attribute attribute:attributes){ + String aName=attribute.getName(); + if("name".equals(aName)&&attribute.getValue().equals(actionName)){ + for(Attribute attribute2:attributes){ + String cName=attribute2.getName(); + if("class".equals(cName)){ + action.put(cName, attribute2.getValue()); + Iterator iterator=node.elementIterator(); + while(iterator.hasNext()){ + Element rNode=iterator.next(); + String result=rNode.getName(); + if("result".equals(result)){ + List attributes3=rNode.attributes(); + for(Attribute attribute3:attributes3){ + String rName=attribute3.getName(); + if("name".equals(rName)){ + String rValue=attribute3.getValue(); + action.put(rValue, rNode.getTextTrim()); + break; + } + } + + + } + else{ + break; + } + } + break; + } + } + find=true; + break; + } + } + } + Iterator iterator=node.elementIterator(); + while(iterator.hasNext()&&!find){ + listNodes(actionName,iterator.next()); + } + return null; + } + + +} diff --git a/group04/844028312/data-structure/src/com/coderising/litestruts/StrutsTest.java b/group04/844028312/data-structure/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..6511d77741 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,50 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + @Test + public void test() { + String actionName = "login"; + Map params = new HashMap(); + + View view = Struts.runAction(actionName,params); + + } +} diff --git a/group04/844028312/data-structure/src/com/coderising/litestruts/View.java b/group04/844028312/data-structure/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group04/844028312/data-structure/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/BinaryTreeNode.java b/group04/844028312/data-structure/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d6a4c888c1 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,145 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + if(data==null){ //жϸڵǷΪ + data=o; + left=null; + right=null; + } + else{ + int insertData=(int) o; + int nowData=(int) data; + if(left==null || right==null){ //1.left==null right==null,2.left!=null,right==null,3.left==null.right!=null + if(nowData>=insertData && left==null){ //жϲСһڵ,left==null + left=new BinaryTreeNode(); + left.data=o; + left.left=null; + left.right=null; + } + else if(insertData>nowData && right==null){ //жϲһڵ,==null + right=new BinaryTreeNode(); + right.data=o; + right.left=null; + right.right=null; + } + else{ + BinaryTreeNode treeNode=null; //¼ȽϽڵ + if(nowData>=insertData ){ //ǰڵݴ + treeNode=left; //ȽϽڵΪڵ + } + else{ + treeNode=right; //Ϊҽڵ + } + BinaryTreeNode tempNode=null; //ʱڵ㣬ڼ¼ȽϽڵڵҽڵΪʱ¼ȽϽڵ + while(treeNode!=null){ + nowData=(int) treeNode.data; //ĵǰֵ + if(insertData<=nowData){ //ǰڵݴ + tempNode=treeNode.left; //ʱڵΪڵ + } + else{ + tempNode=treeNode.right; //Ϊҽڵ + } + if(tempNode==null){ + tempNode=treeNode; //¼ȽϽڵ + if(insertData<=nowData){ //ǰڵݴ + treeNode=treeNode.left; //ȽϽڵΪڵ + } + else{ + treeNode=treeNode.right; //Ϊҽڵ + } + } + else{ + treeNode=tempNode; //ʱڵ㲻ΪʱȽϽڵ㸳ֵΪʱڵ + } + } + if(treeNode==null){ //ȽϽڵΪʱ + treeNode=new BinaryTreeNode(); //½ڵ + treeNode.data=o; + treeNode.left=null; + treeNode.right=null; + int upData=(int) tempNode.data; + if(insertData<=upData){ //һڵݴڲڵʱ + tempNode.left=treeNode; //һڵڵ㸳ڵ + } + else{ + tempNode.right=treeNode; + } + } + } + } + else{ //left!=null&&right!=null + BinaryTreeNode treeNode=null; //жһ + if(nowData>=insertData ){ + treeNode=left; + } + else{ + treeNode=right; + } + BinaryTreeNode tempNode=null; + while(treeNode!=null){ + nowData=(int) treeNode.data; + if(insertData<=nowData){ + tempNode=treeNode.left; + } + else{ + tempNode=treeNode.right; + } + if(tempNode==null){ + tempNode=treeNode; + if(insertData<=nowData){ + treeNode=treeNode.left; + } + else{ + treeNode=treeNode.right; + } + } + else{ + treeNode=tempNode; + } + } + if(treeNode==null){ + treeNode=new BinaryTreeNode(); + treeNode.data=o; + treeNode.left=null; + treeNode.right=null; + int upData=(int) tempNode.data; + if(insertData<=upData){ + tempNode.left=treeNode; + } + else{ + tempNode.right=treeNode; + } + } + } + } + return this; + } + + + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/Iterator.java b/group04/844028312/data-structure/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/List.java b/group04/844028312/data-structure/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/Queue.java b/group04/844028312/data-structure/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/Stack.java b/group04/844028312/data-structure/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..459ec560b4 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/Stack.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +import com.coding.basic.array.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/array/ArrayList.java b/group04/844028312/data-structure/src/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..ee05b19081 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/array/ArrayList.java @@ -0,0 +1,100 @@ +package com.coding.basic.array; + +import java.util.Arrays; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + private static final int DEFAULT_CAPACITY = 10; + private Object[] elementData = new Object[100]; + /** + * ���Ԫ�� + */ + public void add(Object o){ + + if(size=0 && index<=size){ //�ж� index�Ƿ���size��Χ�� 1 2 3 4 + if(size+1array2[j]){ + newArray[count++]=array2[j++]; + + } + if(array1[i]2){ + a=new int[max]; + int record=2; + do{ + a[0]=1; + a[1]=1; + a[record]=a[record-2]+a[record-1]; + record++; + }while(a[record-1]=2){ + while(n1;i--){ + if(n%i==0){ + isPrime=false; + break; + } + + } + if(isPrime){ + primes[record]=n; + record++; + } + n++; + } + } + + return Arrays.copyOf(primes, record); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + int min=6; + int[] perfect=new int[10]; + int record=0; + if(max>=min){ + while(min0;i--){ + if(min%i==0){ + sum=sum+i; + } + } + if(sum==min){ + perfect[record]=min; + record++; + } + min++; + + } + } + return Arrays.copyOf(perfect, record); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + StringBuffer sb=new StringBuffer(); + for(int i=0;i=0&&index7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + Node temp1=last; + for(int i=size-2;i>=0;i--){ + Node temp2=indexOf(i); + temp1.next=temp2; + temp1=temp2; + } + head.next=null; + temp1=head; + head=last; + last=temp1; + } + + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + if(size>1){ + Node index=indexOf(size/2-1); + index.next=null; + last=index; + size=size-size/2; + } + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){//1 2 3 4 5 + if( i=0){ + int len=length+i>size? size-i:length; + int j=0; + while(j0 && i>=0){ + Node before=indexOf(i-1); + Node after=indexOf(length+i); + if(before==null&&after==null){ + head=null; + last=null; + size=0; + } + else if(before==null&&after!=null){ + head=after; + size=size-length; + } + else if(before!=null&&after==null){ + before.next=null; + last=before; + size=size-length; + } + else{ + before.next=after; + size=size-length; + } + }*/ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + if(list==null){ + return null; + } + int size=list.size; + int jude=0; + int [] newInt=new int[size]; + while(jude0){ + int index=(int) list.get(jude); + if(index>=0&&index0){ + int index=(int) list.get(jude); + for(int i=0;imin){ + start=i; + } + if((int)temp.data>=max){ + end=i; + break; + } + i++; + temp=temp.next; + } + if(start==-1){ + start=0; + } + if(end==-1){ + end=size; + } + this.remove(start,end-start); + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + if(list==null){ + return null; + } + int i=0; + int j=0; + LinkedList c=new LinkedList(); + while(i(int)list.get(j)){ + j++; + } + else{ + i++; + } + } + return c; + } +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/CircleQueue.java b/group04/844028312/data-structure/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..1ac659da3d --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,5 @@ +package com.coding.basic.queue; + +public class CircleQueue { + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/Josephus.java b/group04/844028312/data-structure/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..d629d847f4 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,19 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + return null; + } + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/JosephusTest.java b/group04/844028312/data-structure/src/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d90318b51 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/Queue.java b/group04/844028312/data-structure/src/com/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..cd69fde72a --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/Queue.java @@ -0,0 +1,26 @@ +package com.coding.basic.queue; + +import com.coding.basic.linklist.LinkedList; + +public class Queue { + private LinkedList linkedList=new LinkedList(); + + public void enQueue(Object o){ + linkedList.addLast(o); + } + + public Object deQueue(){ + return linkedList.removeFirst(); + } + + public boolean isEmpty(){ + if(linkedList.size()>0){ + return false; + } + return true; + } + + public int size(){ + return linkedList.size(); + } +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group04/844028312/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..bbd4715ca6 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,40 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + } + diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/Stack.java b/group04/844028312/data-structure/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..6079d67598 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,30 @@ +package com.coding.basic.stack; + +import com.coding.basic.array.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); //��ջ��ѹ��Ԫ�� + } + + public Object pop(){ + Object o=elementData.get(elementData.size()-1); //ջ��Ԫ�أ���Ϊջ�Ƚ��� + elementData.remove(elementData.size()-1); //�Ƴ�ջ��Ԫ�� + return o; + } + + public Object peek(){ + return elementData.get(elementData.size()-1); //��ȡջ��Ԫ�� + } + public boolean isEmpty(){ + if(elementData.size()==0){ //���elementData.size�ж��Ƿ�Ϊ�� + return true; + } + return false; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/StackUtil.java b/group04/844028312/data-structure/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..569b217b4c --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,135 @@ +package com.coding.basic.stack; +import java.util.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) { + if(isEmpty(s)){ + return ; + } + Stack help=new Stack(); + int size=0; + while(!s.isEmpty()){ + Object o=s.pop(); + help.push(o); + size++; + } + Object[] o=new Object[size]; + int i=0; + while(!help.isEmpty()){ + o[i]=help.pop(); + i++; + } + for(int j=0;j s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..3028e168c5 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,207 @@ +package com.coding.basic.stack.expr; + +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.coding.basic.Stack; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + if(expr==null|| expr.equals("")){ + return 0.0f; + } + Stack numStack=new Stack(); + Stack opoStack=new Stack(); + int num = 0; + StringTokenizer st = new StringTokenizer(expr,"+,-,*,/",true); + + while(st.hasMoreElements()){ + String s=(String) st.nextElement(); + if("+".equals(s) || "*".equals(s) || "-".equals(s)|| "/".equals(s)){ + if(opoStack.isEmpty()){ + opoStack.push(s); + } + else{ + num=opoPush(opoStack,numStack,s); + } + } + else { +// if(num!=0){ +// Stack temp=new Stack(); +// while(!numStack.isEmpty()){ +// temp.push(numStack.pop()); +// } +// String top = null; +// String a = null; +// int j=0; +// while(!temp.isEmpty()){ +// top=(String) temp.pop(); +// if(j==num){ +// a=top; +// numStack.push(s); +// } +// else{ +// numStack.push(top); +// } +// j++; +// } +// numStack.push(a); +// } +// else{ +// numStack.push(s); +// } + numStack.push(s); + } + } + float result = 0; + if(!opoStack.isEmpty()){ + String opoOne=(String) opoStack.pop(); + String opoTwo=(String) opoStack.pop(); + opoStack.push(opoTwo); + opoStack.push(opoOne); + if(("*".equals(opoOne)||"/".equals(opoOne))&&("*".equals(opoTwo)||"/".equals(opoTwo))){ + + } + else if("*".equals(opoOne)||"/".equals(opoOne)){ + float one= Float.parseFloat((String) numStack.pop()) ; + float two= Float.parseFloat((String) numStack.pop()); + String opo=(String) opoStack.pop(); + if("-".equals(opo)){ + result=two-one; + } + else if("+".equals(opo)){ + result=one+two; + } + else if("/".equals(opo)){ + result=two/one; + } + else { + result=two*one; + } + numStack.push(result+""); + } + } + Stack revOpo=new Stack(); + Stack revNum=new Stack(); + + while(!opoStack.isEmpty()){ + revOpo.push(opoStack.pop()); + } + while(!numStack.isEmpty()){ + revNum.push(numStack.pop()); + } + while(!revOpo.isEmpty()){ + float one= Float.parseFloat((String) revNum.pop()) ; + float two= Float.parseFloat((String) revNum.pop()); + String opo=(String) revOpo.pop(); + if("-".equals(opo)){ + result=one-two; + } + else if("+".equals(opo)){ + result=one+two; + } + else if("/".equals(opo)){ + result=one/two; + } + else { + result=two*one; + } + revNum.push(result+""); + } + return Float.parseFloat((String) revNum.pop()); + } + //2+3*4+5 5-2-2+3--> 5+3-2 75/3/5*5 15*5/3 + private int opoPush(Stack opoStack,Stack numStack,Object opo){ + int num=0;//记录减号的最深位置 + if("+".equals(opo)){ + if(!opoStack.isEmpty()){ + if("*".equals(opoStack.peek())||"/".equals(opoStack.peek())){ + float one= Float.parseFloat((String) numStack.pop()) ; + float two= Float.parseFloat((String) numStack.pop()); + float result; + if("*".equals(opoStack.peek())){ + opoStack.pop(); + result=two*one; + } + else{ + result=two/one; + } + numStack.push(result+""); + } + } +// Stack temp=new Stack(); +// boolean flag=false; //记录是否转移位置 +// while(!opoStack.isEmpty()){ +// temp.push(opoStack.pop()); +// } +// int i=0; +// while(!temp.isEmpty()){ +// String top= (String) temp.pop(); +// if("-".equals(top)&&!flag){ +// num=i+1; +// opoStack.push("+"); +// flag=true; +// } +// opoStack.push(top); +// i++; +// } +// if(!flag){ +// opoStack.push("+"); +// } + opoStack.push("+"); + } + else if("-".equals(opo)){ + if(!opoStack.isEmpty()){ + if("*".equals(opoStack.peek())||"/".equals(opoStack.peek())){ + float one= Float.parseFloat((String) numStack.pop()) ; + float two= Float.parseFloat((String) numStack.pop()); + float result; + if("*".equals(opoStack.peek())){ + opoStack.pop(); + result=one*two; + } + else{ + result=one/two; + } + numStack.push(result+""); + } + } + opoStack.push("-"); + } + else if("*".equals(opo)){ +// Stack temp=new Stack(); +// boolean flag=false; //记录是否转移位置 +// while(!opoStack.isEmpty()){ +// temp.push(opoStack.pop()); +// } +// int i=0; +// while(!temp.isEmpty()){ +// String top=(String) temp.pop(); +// if("/".equals(top)&&!flag){ +// num=i+1; +// opoStack.push("*"); +// flag=true; +// } +// opoStack.push(top); +// i++; +// } +// if(!flag){ +// opoStack.push("*"); +// } + opoStack.push("*"); + } + else if("/".equals(opo)){ + opoStack.push("/"); + } + return num; + } + + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..25a26547e9 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,60 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("5-2+3"); + Assert.assertEquals(6.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr(" 5-2-2+3");//5+3-2-2 + Assert.assertEquals(4, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("75/3/5*5"); //75*5/3/5 0.6 + Assert.assertEquals(25.0, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..96a2194a67 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,14 @@ +package com.coding.basic.stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..dcbb18be4b --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,18 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..956927e2df --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,18 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/Token.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/TokenParser.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..d3b0f167e1 --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group04/844028312/min-jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..96c7823b71 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,90 @@ +package com.coderising.jvm.attr; + +import java.io.UnsupportedEncodingException; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; +import com.coderising.jvm.util.Util; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attrNameIndex=iter.nextU2toInt(); + int attrLen=iter.nextU4toInt(); + int maxStack=iter.nextU2toInt(); + int maxLocals=iter.nextU2toInt(); + int codeLen=iter.nextU4toInt(); + byte[] codes=iter.getByte(codeLen); + String code = null; + try { + code=Util.byteToHexString(codes); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + CodeAttr codeAttr=new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); + + int exceNum=iter.nextU2toInt(); + System.out.println("exception num"+exceNum); + //如果有exception要实现 + int arrtNum=iter.nextU2toInt(); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int attrNameIndex=iter.nextU2toInt(); + int attrLen=iter.nextU4toInt(); + int itemNum=iter.nextU2toInt(); + LineNumberTable lineTable=new LineNumberTable(attrNameIndex,attrLen); + for(int i=0;i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int attrNameIndex=iter.nextU2toInt(); + int attrLen=iter.nextU4toInt(); + int itemNum=iter.nextU2toInt(); + LocalVariableTable localTable=new LocalVariableTable(attrNameIndex,attrLen); + for(int i=0;i fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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/group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group04/844028312/min-jvm/src/com/coderising/jvm/field/Field.java b/group04/844028312/min-jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..87d22a2485 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,44 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + Field field=new Field(iter.nextU2toInt(),iter.nextU2toInt(),iter.nextU2toInt(),pool); + int attrNum=iter.nextU2toInt(); + System.out.println("attrNum:" + attrNum); + + // TODO : 如果field有属性个数, 这里需要解析 + return field; + } + + public String toString(){ + String nameIndex=this.pool.getUTF8String(this.nameIndex); + String descriptorIndex=this.pool.getUTF8String(this.descriptorIndex); + return nameIndex+":"+descriptorIndex; + + } + +} diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group04/844028312/min-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..e6080bbb3d --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,43 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + private byte[] codes; + private int pos; + public ByteCodeIterator(byte[] codes){ + this.codes=codes; + this.pos=0; + } + public byte[] getByte(int len){ + byte[] b=new byte[len]; + if(pos+len>codes.length){ + + } + for(int i=0;i 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[] loadClassFile2(String clzFileName) { + + File f = new File(clzFileName); + +// try { +// +// return null;//IOUtils.toByteArray(new FileInputStream(f)); +// +// } catch (IOException e) { +// e.printStackTrace(); +// return null; +// } + return null; + } + + + + public void addClassPath(String path) { + if(this.clzPaths.contains(path)){ + return; + } + + this.clzPaths.add(path); + + } + + + + public String getClassPath2(){ + // return StringUtils.join(this.clzPaths,";"); + return null; + } + + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } + + + + // ------------------------------backup------------------------ + public String getClassPath(){ + + 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()); + } + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + +} diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group04/844028312/min-jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..019c90d4a3 --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,29 @@ +package com.coderising.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; + System.out.println("Hello , this is class Employee "); + } + 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/group04/844028312/min-jvm/src/com/coderising/jvm/util/Util.java b/group04/844028312/min-jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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;i7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group04/844028312/one/src/com/coding/basic/stack/expr/InfixExpr.java b/group04/844028312/one/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..9b30d29928 --- /dev/null +++ b/group04/844028312/one/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,208 @@ +package com.coding.basic.stack.expr; + +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.coding.basic.Stack; +import com.coding.basic.StackUtil; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + if(expr==null|| expr.equals("")){ + return 0.0f; + } + Stack numStack=new Stack(); + Stack opoStack=new Stack(); + int num = 0; + StringTokenizer st = new StringTokenizer(expr,"+,-,*,/",true); + + while(st.hasMoreElements()){ + String s=(String) st.nextElement(); + if("+".equals(s) || "*".equals(s) || "-".equals(s)|| "/".equals(s)){ + if(opoStack.isEmpty()){ + opoStack.push(s); + } + else{ + num=opoPush(opoStack,numStack,s); + } + } + else { +// if(num!=0){ +// Stack temp=new Stack(); +// while(!numStack.isEmpty()){ +// temp.push(numStack.pop()); +// } +// String top = null; +// String a = null; +// int j=0; +// while(!temp.isEmpty()){ +// top=(String) temp.pop(); +// if(j==num){ +// a=top; +// numStack.push(s); +// } +// else{ +// numStack.push(top); +// } +// j++; +// } +// numStack.push(a); +// } +// else{ +// numStack.push(s); +// } + numStack.push(s); + } + } + float result = 0; + if(!opoStack.isEmpty()){ + String opoOne=(String) opoStack.pop(); + String opoTwo=(String) opoStack.pop(); + opoStack.push(opoTwo); + opoStack.push(opoOne); + if(("*".equals(opoOne)||"/".equals(opoOne))&&("*".equals(opoTwo)||"/".equals(opoTwo))){ + + } + else if("*".equals(opoOne)||"/".equals(opoOne)){ + float one= Float.parseFloat((String) numStack.pop()) ; + float two= Float.parseFloat((String) numStack.pop()); + String opo=(String) opoStack.pop(); + if("-".equals(opo)){ + result=two-one; + } + else if("+".equals(opo)){ + result=one+two; + } + else if("/".equals(opo)){ + result=two/one; + } + else { + result=two*one; + } + numStack.push(result+""); + } + } + Stack revOpo=new Stack(); + Stack revNum=new Stack(); + + while(!opoStack.isEmpty()){ + revOpo.push(opoStack.pop()); + } + while(!numStack.isEmpty()){ + revNum.push(numStack.pop()); + } + while(!revOpo.isEmpty()){ + float one= Float.parseFloat((String) revNum.pop()) ; + float two= Float.parseFloat((String) revNum.pop()); + String opo=(String) revOpo.pop(); + if("-".equals(opo)){ + result=one-two; + } + else if("+".equals(opo)){ + result=one+two; + } + else if("/".equals(opo)){ + result=one/two; + } + else { + result=two*one; + } + revNum.push(result+""); + } + return Float.parseFloat((String) revNum.pop()); + } + //2+3*4+5 5-2-2+3--> 5+3-2 75/3/5*5 15*5/3 + private int opoPush(Stack opoStack,Stack numStack,Object opo){ + int num=0;//记录减号的最深位置 + if("+".equals(opo)){ + if(!opoStack.isEmpty()){ + if("*".equals(opoStack.peek())||"/".equals(opoStack.peek())){ + float one= Float.parseFloat((String) numStack.pop()) ; + float two= Float.parseFloat((String) numStack.pop()); + float result; + if("*".equals(opoStack.peek())){ + opoStack.pop(); + result=two*one; + } + else{ + result=two/one; + } + numStack.push(result+""); + } + } +// Stack temp=new Stack(); +// boolean flag=false; //记录是否转移位置 +// while(!opoStack.isEmpty()){ +// temp.push(opoStack.pop()); +// } +// int i=0; +// while(!temp.isEmpty()){ +// String top= (String) temp.pop(); +// if("-".equals(top)&&!flag){ +// num=i+1; +// opoStack.push("+"); +// flag=true; +// } +// opoStack.push(top); +// i++; +// } +// if(!flag){ +// opoStack.push("+"); +// } + opoStack.push("+"); + } + else if("-".equals(opo)){ + if(!opoStack.isEmpty()){ + if("*".equals(opoStack.peek())||"/".equals(opoStack.peek())){ + float one= Float.parseFloat((String) numStack.pop()) ; + float two= Float.parseFloat((String) numStack.pop()); + float result; + if("*".equals(opoStack.peek())){ + opoStack.pop(); + result=one*two; + } + else{ + result=one/two; + } + numStack.push(result+""); + } + } + opoStack.push("-"); + } + else if("*".equals(opo)){ +// Stack temp=new Stack(); +// boolean flag=false; //记录是否转移位置 +// while(!opoStack.isEmpty()){ +// temp.push(opoStack.pop()); +// } +// int i=0; +// while(!temp.isEmpty()){ +// String top=(String) temp.pop(); +// if("/".equals(top)&&!flag){ +// num=i+1; +// opoStack.push("*"); +// flag=true; +// } +// opoStack.push(top); +// i++; +// } +// if(!flag){ +// opoStack.push("*"); +// } + opoStack.push("*"); + } + else if("/".equals(opo)){ + opoStack.push("/"); + } + return num; + } + + +} diff --git a/group04/844028312/one/src/com/coding/basic/stack/expr/InfixExprTest.java b/group04/844028312/one/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..25a26547e9 --- /dev/null +++ b/group04/844028312/one/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,60 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("5-2+3"); + Assert.assertEquals(6.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr(" 5-2-2+3");//5+3-2-2 + Assert.assertEquals(4, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("75/3/5*5"); //75*5/3/5 0.6 + Assert.assertEquals(25.0, expr.evaluate(), 0.001f); + } + + } + +} From ed72c106f23a0fbae787fd93539947bb2a2c29fd Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Wed, 19 Apr 2017 17:15:47 +0800 Subject: [PATCH 195/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/queue/CircleQueue.java | 5 + .../com/coding/basic/queue/Josephus.java | 42 +++++ .../com/coding/basic/queue/JosephusTest.java | 26 ++++ .../com/coding/basic/{ => queue}/Queue.java | 2 +- .../basic/queue/QueueWithTwoStacks.java | 38 +++++ .../basic/stack/expr/InfixToPostfix.java | 14 ++ .../coding/basic/stack/expr/PostfixExpr.java | 18 +++ .../basic/stack/expr/PostfixExprTest.java | 36 +++++ .../coding/basic/stack/expr/PrefixExpr.java | 17 +++ .../basic/stack/expr/PrefixExprTest.java | 44 ++++++ .../com/coding/basic/stack/expr/Token.java | 49 ++++++ .../coding/basic/stack/expr/TokenParser.java | 56 +++++++ .../basic/stack/expr/TokenParserTest.java | 40 +++++ .../com/coderising/jvm/attr/CodeAttr.java | 111 ++++++++------ .../coderising/jvm/attr/LineNumberTable.java | 13 ++ .../jvm/attr/LocalVariableTable.java | 14 ++ .../com/coderising/jvm/clz/ClassFile.java | 87 +++++++---- .../com/coderising/jvm/cmd/BiPushCmd.java | 23 +++ .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 144 ++++++++++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 +++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../com/coderising/jvm/cmd/LdcCmd.java | 29 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 +++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 ++++++++ .../com/coderising/jvm/method/Method.java | 4 + .../jvm/print/ClassFilePrinter.java | 54 +++++++ .../jvm/print/ConstantPoolPrinter.java | 25 +++ .../jvm/test/ClassFileloaderTest.java | 83 +++++++++- 34 files changed, 1272 insertions(+), 75 deletions(-) create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/Josephus.java create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java rename group27/383117348/data-structure/com/coding/basic/{ => queue}/Queue.java (91%) create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java diff --git a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..ff94d5e21a --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,5 @@ +package com.coding.basic.queue; + +public class CircleQueue { + +} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..9ff4187a53 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java @@ -0,0 +1,42 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m) { + if (n < m || n <= 0 || m <= 0) { + throw new RuntimeException("传入参数有误,执行失败!"); + } + //保存被杀掉的数 + List ints = new ArrayList(); + //报数 + int count = 0; + while(ints.size()!=n){ + + for(int i=0;i list = execute(7, 2); + System.out.println(list); + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java b/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..12a3ec45be --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,26 @@ +package com.coding.basic.queue; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/Queue.java b/group27/383117348/data-structure/com/coding/basic/queue/Queue.java similarity index 91% rename from group27/383117348/data-structure/com/coding/basic/Queue.java rename to group27/383117348/data-structure/com/coding/basic/queue/Queue.java index 4bd32c067b..11b191bf89 100644 --- a/group27/383117348/data-structure/com/coding/basic/Queue.java +++ b/group27/383117348/data-structure/com/coding/basic/queue/Queue.java @@ -1,4 +1,4 @@ -package com.coding.basic; +package com.coding.basic.queue; import org.junit.Test; diff --git a/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..7a6a11a3e4 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,38 @@ +package com.coding.basic.queue; +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + } diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..dcee6ecadf --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,14 @@ +package com.coding.basic.stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} \ No newline at end of file diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..db7e5a4c6a --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,18 @@ +package com.coding.basic.stack.expr; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + + return 0.0f; + } + + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..cc7efb5d40 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,36 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..f3b4953b51 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,17 @@ +package com.coding.basic.stack.expr; +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} \ No newline at end of file diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..9cfaa64570 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,44 @@ +package com.coding.basic.stack.expr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..2d78610e7a --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,49 @@ +package com.coding.basic.stack.expr; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..58ee229f9a --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,56 @@ +package com.coding.basic.stack.expr; +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..3562e42508 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,40 @@ +package com.coding.basic.stack.expr; +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java index b2779f1b70..a47357ec09 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java @@ -1,6 +1,9 @@ package com.coderising.jvm.attr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { @@ -13,22 +16,24 @@ public String getCode() { return code; } - // private ByteCodeCommand[] cmds ; - // public ByteCodeCommand[] getCmds() { - // return cmds; - // } + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, - String code /* ByteCodeCommand[] cmds */) { + String code ,ByteCodeCommand[] cmds ) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - // this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -39,47 +44,61 @@ public void setLocalVariableTable(LocalVariableTable t) { this.localVarTable = t; } - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { int attributeNameIndex = iter.nextU2Int(); - int attributeLength = iter.nextU4Integer(); - int maxStack = iter.nextU2Int(); - int maxLocals = iter.nextU2Int(); - - int length = iter.nextU4Integer(); - String code = iter.nextUxToHexString(length); - - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, length, code); - - int exceptionTableLength = iter.nextU2Int(); - if (exceptionTableLength > 0) { - String exceptionTable = iter.nextUxToHexString(exceptionTableLength); - throw new RuntimeException("解析异常表异常:"+exceptionTable); - } - - int attributesCount = iter.nextU2Int(); - for (int i = 0; i < attributesCount; i++) { - int subAttributeNameIndex = iter.nextU2Int(); - iter.back(2); - - String subAttributeName = clzFile.getConstantPool().getUTF8String(subAttributeNameIndex); - - if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { - - LineNumberTable lineNumberTable = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(lineNumberTable); - - } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LOCAL_VAR_TABLE)) { - - LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(localVariableTable); - - } else { - throw new RuntimeException("解析subAttribute异常-subAttributeName:"+subAttributeName); - } - - } - - return codeAttr; + int attributeLength = iter.nextU4Integer(); + int maxStack = iter.nextU2Int(); + int maxLocals = iter.nextU2Int(); + int length = iter.nextU4Integer(); + String code = iter.nextUxToHexString(length); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, length, code,cmds); + + int exceptionTableLength = iter.nextU2Int(); + if (exceptionTableLength > 0) { + String exceptionTable = iter.nextUxToHexString(exceptionTableLength); + throw new RuntimeException("解析异常表异常:" + exceptionTable); + } + + int attributesCount = iter.nextU2Int(); + for (int i = 0; i < attributesCount; i++) { + int subAttributeNameIndex = iter.nextU2Int(); + iter.back(2); + + String subAttributeName = clzFile.getConstantPool().getUTF8String(subAttributeNameIndex); + + if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { + + LineNumberTable lineNumberTable = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(lineNumberTable); + + } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LOCAL_VAR_TABLE)) { + + LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(localVariableTable); + + } else { + throw new RuntimeException("解析subAttribute异常-subAttributeName:" + subAttributeName); + } + + } + + return codeAttr; + } + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + // buffer.append("Code:").append(code).append("\n"); + for (int i = 0; i < cmds.length; i++) { + buffer.append(cmds[i].toString(pool)).append("\n"); + } + buffer.append("\n"); + buffer.append(this.lineNumTable.toString()); + buffer.append(this.localVarTable.toString(pool)); + return buffer.toString(); } private void setStackMapTable(StackMapTable t) { diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java index 9c87155ca3..8a5b17f7e2 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java @@ -53,5 +53,18 @@ public static LineNumberTable parse(ByteCodeIterator iter) { return lineNumberTable; } + + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java index abbdae87d5..40495c9756 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; +import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; public class LocalVariableTable extends AttributeInfo { @@ -36,5 +37,18 @@ public static LocalVariableTable parse(ByteCodeIterator iter) { private void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java index 9827aa2937..48c856053a 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java @@ -9,81 +9,116 @@ import com.coderising.jvm.method.Method; public class ClassFile { - + private int minorVersion; private int majorVersion; - + private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; private List fields = new ArrayList(); private List methods = new ArrayList(); - + public ClassIndex getClzIndex() { return clzIndex; } + public AccessFlag getAccessFlag() { return accessFlag; } + public void setAccessFlag(AccessFlag accessFlag) { this.accessFlag = accessFlag; } - public ConstantPool getConstantPool() { + + 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; + this.clzIndex = clzIndex; } - - public void addField(Field f){ + + public void addField(Field f) { this.fields.add(f); } - public List getFields(){ + + public List getFields() { return this.fields; } - public void addMethod(Method m){ + + public void addMethod(Method m) { this.methods.add(m); } + public List getMethods() { return methods; } - - - public void print(){ - - if(this.accessFlag.isPublicClass()){ + + 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(){ + System.out.println("Class Name:" + getClassName()); + + System.out.println("Super Class Name:" + getSuperClassName()); + + } + + public String getClassName() { int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType) { + Method method = null; + for(Method m : methods){ + String name = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + if(name.equalsIgnoreCase(methodName) && methodDesc.equalsIgnoreCase(paramAndReturnType)){ + method = m; + } + } + return method; + } + + public Method getMainMethod() { + Method method = null; + for(Method m : methods){ + String name = pool.getUTF8String(m.getNameIndex()); + if(name.equalsIgnoreCase("main")){ + method = m; + } + } + return method; + } + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..4006ca69e1 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(getReadableCodeText()); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode.toUpperCase()); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..e86d3de1de --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,144 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if (codes == null || codes.length() <= 0) { + throw new RuntimeException("字节码指令解析错误!"); + } + List cmds = new ArrayList(); + CommandIterator iter = new CommandIterator(codes); + while (iter.hasNext()) { + String opcmd = iter.next2CharAsString(); + System.out.println("opcmd:" + opcmd); + if (bipush.equalsIgnoreCase(opcmd)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opcmd); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getfield.equalsIgnoreCase(opcmd)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equalsIgnoreCase(opcmd)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokespecial.equalsIgnoreCase(opcmd)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokevirtual.equalsIgnoreCase(opcmd)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equalsIgnoreCase(opcmd)) { + LdcCmd cmd = new LdcCmd(clzFile, opcmd); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (new_object.equalsIgnoreCase(opcmd)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equalsIgnoreCase(opcmd)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equalsIgnoreCase(opcmd) || aload_0.equalsIgnoreCase(opcmd) || aload_1.equalsIgnoreCase(opcmd) + || aload_2.equalsIgnoreCase(opcmd) || iload_1.equalsIgnoreCase(opcmd) + || iload_2.equalsIgnoreCase(opcmd) || iload_3.equalsIgnoreCase(opcmd) + || fload_3.equalsIgnoreCase(opcmd) || voidreturn.equalsIgnoreCase(opcmd) + || astore_1.equalsIgnoreCase(opcmd)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, opcmd); + cmds.add(cmd); + } else { + throw new RuntimeException("暂不支持的指令类型!"); + } + } + calcuateOffset(cmds); + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java b/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java index 2418beda19..091ecc2209 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java @@ -3,6 +3,7 @@ import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; @@ -69,4 +70,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { } return method; } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java b/group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..14407bacbe --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; + +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java b/group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..028161adc7 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,25 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java index 52e1eaffc3..b2128a5372 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java @@ -9,6 +9,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -223,7 +227,7 @@ public void testMethods(){ System.out.println("methods_size:"+methods.size()); { - Method m = methods.get(0); + Method m = methods.get(0); assertMethodEquals(pool,m, "", "(Ljava/lang/String;I)V", @@ -270,5 +274,80 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } - + + /*第四次测试代码*/ + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From 4f88dd045501900c063453b07e726841491d7fb4 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Wed, 19 Apr 2017 17:17:04 +0800 Subject: [PATCH 196/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=80=E5=91=A8=E5=8F=8A?= =?UTF-8?q?LRUPageFrame=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/dataStructure/LRULinkedList.java | 133 --------------- .../basic/dataStructure/LRUPageFrame.java | 160 ++++++++++++++++++ .../java/data_structure/LRUPageFrameTest.java | 65 +++++++ .../src/test/java/data_structure/LRUTest.java | 30 ---- 4 files changed, 225 insertions(+), 163 deletions(-) delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/LRULinkedList.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRULinkedList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRULinkedList.java deleted file mode 100644 index a7df9d0701..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRULinkedList.java +++ /dev/null @@ -1,133 +0,0 @@ -package basic.dataStructure; - -/** - * @author : 温友朝 - * @date : 2017/4/18 - */ -public class LRULinkedList { - public Node first; - public Node last; - public Object data; - - private static final int MAX_SIZE = 5; - - - public LRULinkedList() { - this.first = new Node(); - this.last = this.first; - } - - public LRULinkedList(Object data) { - this.data = data; - this.first = new Node(data); - this.last = this.first; - } - - public int size() { - Node temp = first; - int index = 0; - while (temp.next != null) { - index++; - temp = temp.next; - } - - return index; - } - - public void add(Object obj) { - //未满 - if (this.size() < MAX_SIZE) { - Node temp = first; - while(temp.next != null){ - temp = temp.next; - } - this.last = temp.next = new Node(obj, null, temp); - } else { - //满了,链表中是否有该值的数据,有,升为栈顶;无,栈底数据删除,栈顶存入新数据 - Node temp = first; - boolean flag = false; - int index = 0; - while (temp.next != null) { - //存在该值的数据 - if (temp.data == obj) { - flag = true; - } - index ++; - } - if(flag){ - Node node = get(index); - - Object data = last.data; - last.data = node.data; - node.data = data; - }else{ - removeFirst(); - while(temp.next != null){ - temp = temp.next; - } - this.last = temp.next = new Node(obj, null, temp); - } - } - } - - @Override - public String toString() { - Node temp = this.first; - StringBuffer sb = new StringBuffer(); - while (temp.next != null){ - sb.append(temp.data).append(","); - temp = temp.next; - } - - return sb.toString(); - } - - public Node get(int index){ - Node temp = first; - int i = 0; - while(temp.next != null){ - if(index != i){ - temp = temp.next; - }else break; - i++; - } - return temp; - } - - public void removeFirst(){ - this.first = this.get(1); - this.first.before = null; - } - - - private static class Node { - Object data; - Node next; - Node before; - - public Node() { - this.data = null; - this.next = null; - this.before = null; - } - - public Node(Object obj) { - this.data = obj; - this.next = null; - this.before = null; - } - - public Node(Object obj, Node next) { - this.data = obj; - this.next = next; - this.before = null; - } - - public Node(Object obj, Node next, Node before) { - this.data = obj; - this.next = next; - this.before = before; - } - - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java new file mode 100644 index 0000000000..7624f3420d --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java @@ -0,0 +1,160 @@ +package basic.dataStructure; + +/** + * @author : 温友朝 + */ +public class LRUPageFrame { + private static class Node { + + Node prev; + Node next; + int pageNum; + + Node() {} + + Node(Node prev, Node next, int pageNum){ + this.prev = prev; + this.next = next; + this.pageNum = pageNum; + } + } + + private int capacity; + + private int currentSize; + private Node first;// 链表头 + private Node last;// 链表尾 + + + public LRUPageFrame(int capacity) { + this.currentSize = 0; + this.capacity = capacity; + } + + /** + * 获取缓存中对象 + * + * @param pageNum + */ + public void access(int pageNum){ + if(first == null){ + last = first = new Node(null, null, pageNum); + this.currentSize++; + return; + } + + if(first.pageNum == pageNum){ + return; + } + + if(currentSize < capacity){ + addToFirst(pageNum); + this.currentSize ++; + }else{ + //遍历 + boolean flag = false; + for(int i = 0; i < capacity; i++){ + if(get(i) == pageNum){ + flag = true; + break; + } + } + + //有相同的,交换该数据至栈顶 + if(flag){ + this.moveToFirst(pageNum); + }else{ + //没有相同的,移除栈底元素 + removeLast(); + //添加 + addToFirst(pageNum); + } + } + } + + /** + * 新增至栈底 + * @param pageNum + */ + private void addToLast(int pageNum){ + Node node = new Node(last, null, pageNum); + last.next = node; + this.last = node; + } + + /** + * 新增值栈顶 + * @param pageNum + */ + private void addToFirst(int pageNum){ + Node node = new Node(null, first, pageNum); + first.prev = node; + this.first = node; + } + + /** + * 移除栈底的元素 + */ + public void removeLast(){ + Node node = last.prev; + node.next = null; + this.last = node; + } + + /** + * 从栈底数起,取数 + */ + public int get(int index){ + int in = 0; + Node temp = last; + int res = -1; + while (temp != null){ + if(index == in){ + res = temp.pageNum; + } + in++; + temp = temp.prev; + } + + return res; + } + + public void moveToFirst(int pageNum){ + Node temp = last; + while (temp != null){ + if(temp.pageNum == pageNum){ + break; + } + temp = temp.prev; + } + + //处理节点,任意位置时重组链接 + if(temp.next != null){ + temp.prev.next = temp.next; + temp.next.prev = temp.prev; + }else{ + //栈底remove调 + removeLast(); + } + + addToFirst(pageNum); + } + + public int size(){ + return this.currentSize; + } + + 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/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java b/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java new file mode 100644 index 0000000000..8ae2458de7 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java @@ -0,0 +1,65 @@ +package data_structure; + +import basic.dataStructure.LRUPageFrame; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author : 温友朝 + * @date : 2017/4/19 + */ +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()); + + } + + @Test + public void testSet(){ + LRUPageFrame frame = new LRUPageFrame(3); + frame.access(7); + frame.access(0); + frame.access(1); + frame.moveToFirst(1); + System.out.println(frame.toString()); + } + + @Test + public void testGet(){ + LRUPageFrame frame = new LRUPageFrame(3); + frame.access(7); + frame.access(0); + frame.access(1); + System.out.println(frame.get(0)); + } + + @Test + public void testRemoveFirst(){ + LRUPageFrame frame = new LRUPageFrame(3); + frame.access(7); + frame.access(0); + frame.access(1); + frame.removeLast(); + System.out.println(frame.toString()); + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java b/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java deleted file mode 100644 index 35f7a2ca61..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/LRUTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package data_structure; - -import basic.dataStructure.LRULinkedList; -import org.junit.Before; -import org.junit.Test; - -/** - * @author : 温友朝 - * @date : 2017/4/18 - */ -public class LRUTest { - - private LRULinkedList lru; - - @Before - public void init(){ - lru = new LRULinkedList(); - } - - @Test - public void testAdd(){ - lru.add(1); -// lru.add(2); -// lru.add(3); -// lru.add(4); -// lru.add(5); -// lru.add(6); - System.out.println(lru.toString()); - } -} From ed1d1cb2832107650362aaaa0c9dc790ce865e7c Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Wed, 19 Apr 2017 17:20:00 +0800 Subject: [PATCH 197/552] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/basic/dataStructure/LRUPageFrame.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java index 7624f3420d..439df7ffbd 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java @@ -80,6 +80,7 @@ private void addToLast(int pageNum){ Node node = new Node(last, null, pageNum); last.next = node; this.last = node; + this.currentSize++; } /** @@ -90,6 +91,7 @@ private void addToFirst(int pageNum){ Node node = new Node(null, first, pageNum); first.prev = node; this.first = node; + this.currentSize++; } /** @@ -99,6 +101,7 @@ public void removeLast(){ Node node = last.prev; node.next = null; this.last = node; + this.currentSize--; } /** From 0030da65a68bbe07728806eadad0160aed33eb19 Mon Sep 17 00:00:00 2001 From: luoziyihao Date: Wed, 19 Apr 2017 20:02:13 +0800 Subject: [PATCH 198/552] add count --- group17/article/20170409-20170416.md | 56 ++++++++++++++++++++++++++++ group17/article/template.md | 2 +- group17/count/homework.md | 3 +- 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 group17/article/20170409-20170416.md diff --git a/group17/article/20170409-20170416.md b/group17/article/20170409-20170416.md new file mode 100644 index 0000000000..3d45ad0516 --- /dev/null +++ b/group17/article/20170409-20170416.md @@ -0,0 +1,56 @@ +# 自由写作 + +## 须知 +--- + +交作业时请在QQ 号后面填上各自的文章链接, 比如: + +51075907 http://m.blog.csdn.net/article/details?id=57083764 + +## 文章 +--- + +1204187480 + +102228177 + +876385982 + +785396327 + +1059107701 + +240094626 + +82427129 + +296910598 + +1264835468 + +516886559 + +1282579502 + +614982500 + +865797761 + +1540186032 + +176653813 + +116665530 + +51075907 + +1158154002 + +345450234 + +919764878 + +1368331120 + +517970312 + diff --git a/group17/article/template.md b/group17/article/template.md index 0b06ef733e..3d45ad0516 100644 --- a/group17/article/template.md +++ b/group17/article/template.md @@ -12,7 +12,7 @@ 1204187480 -102228177 http://note.youdao.com/noteshare?id=1f8f4a9d861e24948cdf0219a0d39f4e +102228177 876385982 diff --git a/group17/count/homework.md b/group17/count/homework.md index 640cf4698f..9422c2f12c 100644 --- a/group17/count/homework.md +++ b/group17/count/homework.md @@ -18,6 +18,7 @@ * [20170305-20170312](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170305-20170312.md) * [20170326-20170402](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170326-20170402.md) + * [20170402-20170409](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170402-20170409.md) -20170326-20170402.md 20170402-20170409.md + * [20170409-20170416](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170409-20170416.md) From 1f4be5bc40c4d707984520db027f56059ac8bd56 Mon Sep 17 00:00:00 2001 From: zheng <765324639@qq.com> Date: Wed, 19 Apr 2017 20:55:31 +0800 Subject: [PATCH 199/552] =?UTF-8?q?=E5=AE=8C=E6=88=90jvm=E7=AC=AC=E5=9B=9B?= =?UTF-8?q?=E6=AC=A1=E4=BD=9C=E4=B8=9A=E4=B8=AD=E7=9A=84jvm=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/minijvm/attr/CodeAttr.java | 103 ++++++----- .../java/minijvm/attr/LocalVariableTable.java | 13 ++ .../src/main/java/minijvm/clz/ClassFile.java | 175 ++++++++++-------- .../src/main/java/minijvm/cmd/BiPushCmd.java | 21 +++ .../java/minijvm/cmd/ByteCodeCommand.java | 129 +++++++++++++ .../main/java/minijvm/cmd/CommandParser.java | 158 ++++++++++++++++ .../main/java/minijvm/cmd/GetFieldCmd.java | 21 +++ .../java/minijvm/cmd/GetStaticFieldCmd.java | 19 ++ .../java/minijvm/cmd/InvokeSpecialCmd.java | 21 +++ .../java/minijvm/cmd/InvokeVirtualCmd.java | 21 +++ .../src/main/java/minijvm/cmd/LdcCmd.java | 29 +++ .../main/java/minijvm/cmd/NewObjectCmd.java | 19 ++ .../main/java/minijvm/cmd/NoOperandCmd.java | 24 +++ .../main/java/minijvm/cmd/OneOperandCmd.java | 28 +++ .../main/java/minijvm/cmd/PutFieldCmd.java | 19 ++ .../main/java/minijvm/cmd/TwoOperandCmd.java | 68 +++++++ .../java/minijvm/loader/ClassFileParser.java | 6 +- .../src/main/java/minijvm/method/Method.java | 108 ++++++----- .../java/minijvm/print/ClassFilePrinter.java | 45 +++++ .../minijvm/print/ConstantPoolPrinter.java | 18 ++ .../minijvm/loader/ClassFileloaderTest.java | 80 ++++++++ 21 files changed, 957 insertions(+), 168 deletions(-) create mode 100644 group01/765324639/src/main/java/minijvm/cmd/BiPushCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/ByteCodeCommand.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/CommandParser.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/GetFieldCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/GetStaticFieldCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/InvokeSpecialCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/InvokeVirtualCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/LdcCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/NewObjectCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/NoOperandCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/OneOperandCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/PutFieldCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/cmd/TwoOperandCmd.java create mode 100644 group01/765324639/src/main/java/minijvm/print/ClassFilePrinter.java create mode 100644 group01/765324639/src/main/java/minijvm/print/ConstantPoolPrinter.java diff --git a/group01/765324639/src/main/java/minijvm/attr/CodeAttr.java b/group01/765324639/src/main/java/minijvm/attr/CodeAttr.java index 0044adced8..43a02cfa48 100644 --- a/group01/765324639/src/main/java/minijvm/attr/CodeAttr.java +++ b/group01/765324639/src/main/java/minijvm/attr/CodeAttr.java @@ -1,55 +1,68 @@ package minijvm.attr; import minijvm.clz.ClassFile; +import minijvm.cmd.ByteCodeCommand; +import minijvm.constant.ConstantPool; import minijvm.loader.ByteCodeIterator; - public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } + - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - - return null; - } - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - - } + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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(); - } + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + for (Method method : methods) { + if (pool.getUTF8String(method.getNameIndex()).equals(methodName) + && pool.getUTF8String(method.getDescriptorIndex()).equals(paramAndReturnType)) { + return method; + } + } + return null; + } + public Method getMainMethod(){ + return getMethod("main", "([Ljava/lang/String;)V"); + } } + diff --git a/group01/765324639/src/main/java/minijvm/cmd/BiPushCmd.java b/group01/765324639/src/main/java/minijvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..b2945d337f --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/BiPushCmd.java @@ -0,0 +1,21 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/ByteCodeCommand.java b/group01/765324639/src/main/java/minijvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..910a59520f --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/ByteCodeCommand.java @@ -0,0 +1,129 @@ +package minijvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantInfo; +import minijvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + @Override + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode.toUpperCase()); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/CommandParser.java b/group01/765324639/src/main/java/minijvm/cmd/CommandParser.java new file mode 100644 index 0000000000..189c208e87 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/CommandParser.java @@ -0,0 +1,158 @@ +package minijvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import minijvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + List commandList = new ArrayList<>(); + + CommandIterator iter = new CommandIterator(codes); + while (iter.hasNext()) { + String operCode = iter.next2CharAsString(); + if (aload_0.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else if (invokespecial.equalsIgnoreCase(operCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, operCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + commandList.add(cmd); + } else if (aload_1.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else if (putfield.equalsIgnoreCase(operCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, operCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + commandList.add(cmd); + } else if (aload_2.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else if (ireturn.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else if (voidreturn.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else if (getstatic.equalsIgnoreCase(operCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, operCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + commandList.add(cmd); + } else if (ldc.equalsIgnoreCase(operCode)) { + LdcCmd cmd = new LdcCmd(clzFile, operCode); + cmd.setOperand(iter.next2CharAsInt()); + commandList.add(cmd); + } else if (invokevirtual.equalsIgnoreCase(operCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, operCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + commandList.add(cmd); + } else if (new_object.equalsIgnoreCase(operCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, operCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + commandList.add(cmd); + } else if (dup.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else if (bipush.equalsIgnoreCase(operCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, operCode); + cmd.setOperand(iter.next2CharAsInt()); + commandList.add(cmd); + } else if (astore_1.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else if (iload_1.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else if (iload_2.equalsIgnoreCase(operCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, operCode); + commandList.add(cmd); + } else { + throw new RuntimeException("未实现的操作码:" + operCode); + } + } + calcuateOffset(commandList); + ByteCodeCommand[] commands = new ByteCodeCommand[commandList.size()]; + return commandList.toArray(commands); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + public void nextLengthByte(int length) { + pos += (length * 2); + } + + } +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/GetFieldCmd.java b/group01/765324639/src/main/java/minijvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..972ae719be --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/GetFieldCmd.java @@ -0,0 +1,21 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/GetStaticFieldCmd.java b/group01/765324639/src/main/java/minijvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..648a8940ec --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,19 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/InvokeSpecialCmd.java b/group01/765324639/src/main/java/minijvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..460706b635 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/InvokeVirtualCmd.java b/group01/765324639/src/main/java/minijvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..b2957bbcb6 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,21 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/LdcCmd.java b/group01/765324639/src/main/java/minijvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..b6ca03f4ac --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantInfo; +import minijvm.constant.ConstantPool; +import minijvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/NewObjectCmd.java b/group01/765324639/src/main/java/minijvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..aaff3aecef --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/NoOperandCmd.java b/group01/765324639/src/main/java/minijvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..e9a3493426 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/NoOperandCmd.java @@ -0,0 +1,24 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + @Override + public int getLength(){ + return 1; + } + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/OneOperandCmd.java b/group01/765324639/src/main/java/minijvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..bf2d567850 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/OneOperandCmd.java @@ -0,0 +1,28 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + @Override + public int getLength(){ + return 2; + } + + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/PutFieldCmd.java b/group01/765324639/src/main/java/minijvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..ae41b17fde --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group01/765324639/src/main/java/minijvm/cmd/TwoOperandCmd.java b/group01/765324639/src/main/java/minijvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..262bedc338 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/cmd/TwoOperandCmd.java @@ -0,0 +1,68 @@ +package minijvm.cmd; + +import minijvm.clz.ClassFile; +import minijvm.constant.ClassInfo; +import minijvm.constant.ConstantInfo; +import minijvm.constant.ConstantPool; +import minijvm.constant.FieldRefInfo; +import minijvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + @Override + public int getLength(){ + return 3; + } +} diff --git a/group01/765324639/src/main/java/minijvm/loader/ClassFileParser.java b/group01/765324639/src/main/java/minijvm/loader/ClassFileParser.java index cb42be22d6..9318165708 100644 --- a/group01/765324639/src/main/java/minijvm/loader/ClassFileParser.java +++ b/group01/765324639/src/main/java/minijvm/loader/ClassFileParser.java @@ -10,6 +10,8 @@ import minijvm.clz.AccessFlag; import minijvm.clz.ClassFile; import minijvm.clz.ClassIndex; +import minijvm.cmd.ByteCodeCommand; +import minijvm.cmd.CommandParser; import minijvm.constant.ClassInfo; import minijvm.constant.ConstantInfo; import minijvm.constant.ConstantPool; @@ -212,7 +214,9 @@ private CodeAttr parseCodeAttribute(ByteCodeIterator iter, ClassFile classFile) int codeLength = iter.nextU4ToInt(); String code = iter.nextUxToHexString(codeLength); - CodeAttr codeAttr = new CodeAttr(nameIndex, length, maxStack, maxLocals, codeLength, code); + ByteCodeCommand[] codeCommands = CommandParser.parse(classFile, code); + + CodeAttr codeAttr = new CodeAttr(nameIndex, length, maxStack, maxLocals, codeLength, code, codeCommands); // TODO Code属性中的exception int exceptionLength = iter.nextU2ToInt(); diff --git a/group01/765324639/src/main/java/minijvm/method/Method.java b/group01/765324639/src/main/java/minijvm/method/Method.java index 3d0b9a5678..248c3e79f1 100644 --- a/group01/765324639/src/main/java/minijvm/method/Method.java +++ b/group01/765324639/src/main/java/minijvm/method/Method.java @@ -2,53 +2,77 @@ import minijvm.attr.CodeAttr; import minijvm.clz.ClassFile; +import minijvm.cmd.ByteCodeCommand; +import minijvm.constant.ConstantPool; +import minijvm.constant.UTF8Info; import minijvm.loader.ByteCodeIterator; - - public class Method { - - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private CodeAttr codeAttr; - - private ClassFile clzFile; - - - public ClassFile getClzFile() { - return clzFile; - } + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } - public int getNameIndex() { - return nameIndex; - } - public int getDescriptorIndex() { - return descriptorIndex; - } - - public CodeAttr getCodeAttr() { - return codeAttr; - } + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - } + + + + + @Override + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + return null; + + } - - - - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ - return null; - - } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group01/765324639/src/main/java/minijvm/print/ClassFilePrinter.java b/group01/765324639/src/main/java/minijvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..c5c4898b29 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/print/ClassFilePrinter.java @@ -0,0 +1,45 @@ +package minijvm.print; + +import minijvm.clz.ClassFile; +import minijvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args) throws ClassNotFoundException{ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group01/765324639/src/main/java/minijvm/print/ConstantPoolPrinter.java b/group01/765324639/src/main/java/minijvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..573b4e8e46 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/print/ConstantPoolPrinter.java @@ -0,0 +1,18 @@ +package minijvm.print; + +import minijvm.constant.ConstantPool; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group01/765324639/src/test/java/minijvm/loader/ClassFileloaderTest.java b/group01/765324639/src/test/java/minijvm/loader/ClassFileloaderTest.java index 80586f51e2..625d22e4f2 100644 --- a/group01/765324639/src/test/java/minijvm/loader/ClassFileloaderTest.java +++ b/group01/765324639/src/test/java/minijvm/loader/ClassFileloaderTest.java @@ -10,6 +10,10 @@ import minijvm.clz.ClassFile; import minijvm.clz.ClassIndex; +import minijvm.cmd.BiPushCmd; +import minijvm.cmd.ByteCodeCommand; +import minijvm.cmd.OneOperandCmd; +import minijvm.cmd.TwoOperandCmd; import minijvm.constant.ClassInfo; import minijvm.constant.ConstantPool; import minijvm.constant.MethodRefInfo; @@ -270,5 +274,81 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + + //-----第四次JVM作业----- + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From ade5c10ad39fe4e397fb35fc558c5fc9aeff6181 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Wed, 19 Apr 2017 22:32:05 +0800 Subject: [PATCH 200/552] =?UTF-8?q?=E4=B8=AD=E7=BC=80=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E4=BB=A3=E7=A0=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/expr/InfixExpr.java | 8 +++++++- .../coding2017/basic/stack/expr/InfixExprTest.java | 9 ++++++++- .../coding2017/coderising/jvm/field/Field.java | 3 --- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java index 92727ce984..69d1b41a0e 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java @@ -1,5 +1,6 @@ package com.github.miniyk2012.coding2017.basic.stack.expr; +import java.util.EmptyStackException; import java.util.LinkedList; import java.util.List; import java.util.Stack; @@ -61,11 +62,16 @@ public float evaluate() { operatorStack.push(t); } else { Token preT = operatorStack.peek(); - if ((preT.value).priority >= ((Operator)t.value).priority) { + while (preT.value.priority >= ((Operator)t.value).priority) { Token number2 = numberStack.pop(); Token number1 = numberStack.pop(); operatorStack.pop(); numberStack.push(evaluate(preT, number1, number2)); + try { + preT = operatorStack.peek(); + } catch (EmptyStackException e) { + break; + } } operatorStack.push(t); diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java index a14953535d..5906221e79 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java @@ -19,6 +19,10 @@ public void tearDown() throws Exception { @Test public void testEvaluate() { //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2"); + Assert.assertEquals(2.0, expr.evaluate(), 0.001f); + } { InfixExpr expr = new InfixExpr("2+3"); Assert.assertEquals(5.0, expr.evaluate(), 0.001f); @@ -50,7 +54,10 @@ public void testEvaluate() { InfixExpr expr = new InfixExpr("10-30+50-20/10/2*4"); Assert.assertEquals(26, expr.evaluate(), 0.001f); } - + { + InfixExpr expr = new InfixExpr("10-30+50-20/1+10"); + Assert.assertEquals(20, expr.evaluate(), 0.001f); + } } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java index 54d0854ba7..d89b31c87c 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/field/Field.java @@ -9,9 +9,6 @@ public class Field { private int accessFlag; private int nameIndex; private int descriptorIndex; - - - private ConstantPool pool; public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { From 0f5abc77dcb1f291c6f19f942a681956007c0483 Mon Sep 17 00:00:00 2001 From: "songbao.yang" Date: Wed, 19 Apr 2017 22:53:35 +0800 Subject: [PATCH 201/552] =?UTF-8?q?jvm=20task2=20=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=E6=B1=A0+StackUtil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 6 +- .../download/DownloadThreadTest.java | 9 +- .../coderising/download/FileDownloader.java | 10 +- .../download/FileDownloaderTest.java | 8 +- .../coderising/download/api/Connection.java | 2 +- .../download/api/ConnectionException.java | 2 +- .../download/api/ConnectionManager.java | 2 +- .../download/api/DownloadListener.java | 2 +- .../download/impl/ConnectionImpl.java | 4 +- .../download/impl/ConnectionImplTest.java | 5 +- .../download/impl/ConnectionManagerImpl.java | 8 +- .../com/coderising/litestruts/Action.java | 2 +- .../coderising/litestruts/Configuration.java | 2 +- .../coderising/litestruts/LoginAction.java | 2 +- .../coderising/litestruts/ReflectUtils.java | 2 +- .../com/coderising/litestruts/Struts.java | 4 +- .../com/coderising/litestruts/StrutsTest.java | 2 +- .../src}/com/coderising/litestruts/View.java | 2 +- .../src}/com/coding/basic/BinaryTreeNode.java | 2 +- .../com/coding/basic/BinaryTreeNodeTest.java | 2 +- .../src}/com/coding/basic/Iterator.java | 2 +- .../src}/com/coding/basic/List.java | 2 +- .../src}/com/coding/basic/ListTest.java | 3 +- .../src}/com/coding/basic/Queue.java | 2 +- .../src}/com/coding/basic/QueueTest.java | 2 +- .../com/coding/basic/array}/ArrayList.java | 5 +- .../com/coding/basic}/array/ArrayUtil.java | 2 +- .../coding/basic}/array/ArrayUtilTest.java | 8 +- .../coding/basic/linklist/LRUPageFrame.java | 2 +- .../basic/linklist/LRUPageFrameTest.java | 2 +- .../coding/basic/linklist}/LinkedList.java | 5 +- .../src/com/coding/basic/stack/Stack.java | 77 ++++++++ .../com/coding/basic/stack}/StackTest.java | 13 +- .../src/com/coding/basic/stack/StackUtil.java | 94 +++++++++ .../com/coding/basic/stack/StackUtilTest.java | 61 ++++++ .../com/coderising/jvm/clz/AccessFlag.java | 28 +++ .../src/com/coderising/jvm/clz/ClassFile.java | 75 ++++++++ .../com/coderising/jvm/clz/ClassIndex.java | 27 +++ .../coderising/jvm/constant/ClassInfo.java | 24 +++ .../coderising/jvm/constant/ConstantInfo.java | 40 ++++ .../coderising/jvm/constant/ConstantPool.java | 29 +++ .../coderising/jvm/constant/FieldRefInfo.java | 54 ++++++ .../jvm/constant/MethodRefInfo.java | 55 ++++++ .../jvm/constant/NameAndTypeInfo.java | 45 +++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 +++ .../com/coderising/jvm/constant/UTF8Info.java | 37 ++++ .../jvm/loader/ByteCodeIterator.java | 56 ++++++ .../jvm/loader/ClassFileLoader.java | 88 +++++++++ .../jvm/loader/ClassFileParser.java | 106 ++++++++++ .../jvm/parser/ClassInfoParser.java | 22 +++ .../jvm/parser/ConstantInfoParser.java | 14 ++ .../jvm/parser/DoubleInfoParser.java | 15 ++ .../jvm/parser/FieldRefInfoParser.java | 21 ++ .../jvm/parser/FloatInfoParser.java | 16 ++ .../jvm/parser/IntegerInfoParser.java | 16 ++ .../parser/InterfaceMethodrefInfoParser.java | 16 ++ .../jvm/parser/InvokeDynamicInfoParser.java | 16 ++ .../coderising/jvm/parser/LongInfoParser.java | 15 ++ .../jvm/parser/MethodHandleInfoParser.java | 15 ++ .../jvm/parser/MethodRefInfoParser.java | 22 +++ .../jvm/parser/MethodTypeInfoParser.java | 15 ++ .../jvm/parser/NameAndTypeInfoParser.java | 21 ++ .../jvm/parser/StringInfoParser.java | 20 ++ .../coderising/jvm/parser/UTF8InfoParser.java | 34 ++++ .../jvm/test/ClassFileloaderTest.java | 181 ++++++++++++++++++ .../com/coderising/jvm/test}/EmployeeV1.java | 20 +- .../src/com/coderising/jvm/util/Util.java | 24 +++ .../dataStruct/com/coding/basic/Stack.java | 63 ------ .../jvm/loader/ClassFileLoader.java | 68 ------- .../578505552/src/main/resources/struts.xml | 12 -- group05/578505552/src/test/java/JavaTest.java | 25 --- .../jvm/loader/ClassFileloaderTest.java | 70 ------- 73 files changed, 1502 insertions(+), 300 deletions(-) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/download/DownloadThread.java (88%) rename group05/578505552/{src/test/java/dataStruct => dataStruct/src}/com/coderising/download/DownloadThreadTest.java (80%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/download/FileDownloader.java (82%) rename group05/578505552/{src/test/java/dataStruct => dataStruct/src}/com/coderising/download/FileDownloaderTest.java (81%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/download/api/Connection.java (90%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/download/api/ConnectionException.java (88%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/download/api/ConnectionManager.java (79%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/download/api/DownloadListener.java (59%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/download/impl/ConnectionImpl.java (89%) rename group05/578505552/{src/test/java/dataStruct => dataStruct/src}/com/coderising/download/impl/ConnectionImplTest.java (85%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/download/impl/ConnectionManagerImpl.java (69%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/litestruts/Action.java (93%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/litestruts/Configuration.java (63%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/litestruts/LoginAction.java (94%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/litestruts/ReflectUtils.java (81%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/litestruts/Struts.java (97%) rename group05/578505552/{src/test/java/dataStruct => dataStruct/src}/com/coderising/litestruts/StrutsTest.java (96%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coderising/litestruts/View.java (88%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coding/basic/BinaryTreeNode.java (97%) rename group05/578505552/{src/test/java/dataStruct => dataStruct/src}/com/coding/basic/BinaryTreeNodeTest.java (94%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coding/basic/Iterator.java (78%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coding/basic/List.java (86%) rename group05/578505552/{src/test/java/dataStruct => dataStruct/src}/com/coding/basic/ListTest.java (96%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coding/basic/Queue.java (98%) rename group05/578505552/{src/test/java/dataStruct => dataStruct/src}/com/coding/basic/QueueTest.java (97%) rename group05/578505552/{src/main/java/dataStruct/com/coding/basic => dataStruct/src/com/coding/basic/array}/ArrayList.java (96%) rename group05/578505552/{src/main/java/dataStruct/com/coderising => dataStruct/src/com/coding/basic}/array/ArrayUtil.java (99%) rename group05/578505552/{src/test/java/dataStruct/com/coderising => dataStruct/src/com/coding/basic}/array/ArrayUtilTest.java (97%) rename group05/578505552/{src/main/java/dataStruct => dataStruct/src}/com/coding/basic/linklist/LRUPageFrame.java (97%) rename group05/578505552/{src/test/java/dataStruct => dataStruct/src}/com/coding/basic/linklist/LRUPageFrameTest.java (94%) rename group05/578505552/{src/main/java/dataStruct/com/coding/basic => dataStruct/src/com/coding/basic/linklist}/LinkedList.java (99%) create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/Stack.java rename group05/578505552/{src/test/java/dataStruct/com/coding/basic => dataStruct/src/com/coding/basic/stack}/StackTest.java (85%) create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/StackUtil.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/ClassInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/ConstantInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/DoubleInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/FieldRefInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/FloatInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/IntegerInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/InterfaceMethodrefInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/InvokeDynamicInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/LongInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodHandleInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodRefInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodTypeInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/NameAndTypeInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/StringInfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/parser/UTF8InfoParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/test/ClassFileloaderTest.java rename group05/578505552/{src/main/java/miniJvm/com/coderising/jvm/loader => miniJvm/src/com/coderising/jvm/test}/EmployeeV1.java (73%) create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/util/Util.java delete mode 100644 group05/578505552/src/main/java/dataStruct/com/coding/basic/Stack.java delete mode 100644 group05/578505552/src/main/java/miniJvm/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group05/578505552/src/main/resources/struts.xml delete mode 100644 group05/578505552/src/test/java/JavaTest.java delete mode 100644 group05/578505552/src/test/java/miniJvm/com/coderising/jvm/loader/ClassFileloaderTest.java diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/download/DownloadThread.java b/group05/578505552/dataStruct/src/com/coderising/download/DownloadThread.java similarity index 88% rename from group05/578505552/src/main/java/dataStruct/com/coderising/download/DownloadThread.java rename to group05/578505552/dataStruct/src/com/coderising/download/DownloadThread.java index c837e08f8b..0e3e0d8a40 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/download/DownloadThread.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/DownloadThread.java @@ -1,7 +1,7 @@ -package dataStruct.com.coderising.download; +package com.coderising.download; -import dataStruct.com.coderising.download.api.Connection; -import dataStruct.com.coderising.download.api.DownloadListener; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.api.Connection; import java.io.File; import java.io.IOException; diff --git a/group05/578505552/src/test/java/dataStruct/com/coderising/download/DownloadThreadTest.java b/group05/578505552/dataStruct/src/com/coderising/download/DownloadThreadTest.java similarity index 80% rename from group05/578505552/src/test/java/dataStruct/com/coderising/download/DownloadThreadTest.java rename to group05/578505552/dataStruct/src/com/coderising/download/DownloadThreadTest.java index dbbb80a91a..4c3116a2c3 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coderising/download/DownloadThreadTest.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/DownloadThreadTest.java @@ -1,9 +1,8 @@ -package dataStruct.com.coderising.download; +package com.coderising.download; -import dataStruct.com.coderising.download.DownloadThread; -import dataStruct.com.coderising.download.api.Connection; -import dataStruct.com.coderising.download.api.DownloadListener; -import dataStruct.com.coderising.download.impl.ConnectionManagerImpl; +import com.coderising.download.api.Connection; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/download/FileDownloader.java b/group05/578505552/dataStruct/src/com/coderising/download/FileDownloader.java similarity index 82% rename from group05/578505552/src/main/java/dataStruct/com/coderising/download/FileDownloader.java rename to group05/578505552/dataStruct/src/com/coderising/download/FileDownloader.java index 324ba4d29d..47c8940809 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/download/FileDownloader.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/FileDownloader.java @@ -1,9 +1,9 @@ -package dataStruct.com.coderising.download; +package com.coderising.download; -import dataStruct.com.coderising.download.api.Connection; -import dataStruct.com.coderising.download.api.ConnectionException; -import dataStruct.com.coderising.download.api.ConnectionManager; -import dataStruct.com.coderising.download.api.DownloadListener; +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.api.ConnectionException; import java.io.File; diff --git a/group05/578505552/src/test/java/dataStruct/com/coderising/download/FileDownloaderTest.java b/group05/578505552/dataStruct/src/com/coderising/download/FileDownloaderTest.java similarity index 81% rename from group05/578505552/src/test/java/dataStruct/com/coderising/download/FileDownloaderTest.java rename to group05/578505552/dataStruct/src/com/coderising/download/FileDownloaderTest.java index cb5748f4e6..f2eaeed26e 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coderising/download/FileDownloaderTest.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/FileDownloaderTest.java @@ -1,8 +1,8 @@ -package dataStruct.com.coderising.download; +package com.coderising.download; -import dataStruct.com.coderising.download.api.ConnectionManager; -import dataStruct.com.coderising.download.api.DownloadListener; -import dataStruct.com.coderising.download.impl.ConnectionManagerImpl; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/download/api/Connection.java b/group05/578505552/dataStruct/src/com/coderising/download/api/Connection.java similarity index 90% rename from group05/578505552/src/main/java/dataStruct/com/coderising/download/api/Connection.java rename to group05/578505552/dataStruct/src/com/coderising/download/api/Connection.java index da33f7360c..494c713b27 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/download/api/Connection.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/api/Connection.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.download.api; +package com.coderising.download.api; import java.io.IOException; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/download/api/ConnectionException.java b/group05/578505552/dataStruct/src/com/coderising/download/api/ConnectionException.java similarity index 88% rename from group05/578505552/src/main/java/dataStruct/com/coderising/download/api/ConnectionException.java rename to group05/578505552/dataStruct/src/com/coderising/download/api/ConnectionException.java index 2efc59eec6..5954d22409 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/download/api/ConnectionException.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/api/ConnectionException.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.download.api; +package com.coderising.download.api; public class ConnectionException extends Exception { diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/download/api/ConnectionManager.java b/group05/578505552/dataStruct/src/com/coderising/download/api/ConnectionManager.java similarity index 79% rename from group05/578505552/src/main/java/dataStruct/com/coderising/download/api/ConnectionManager.java rename to group05/578505552/dataStruct/src/com/coderising/download/api/ConnectionManager.java index 2ac9aa5ac9..ce045393b1 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/download/api/ConnectionManager.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/api/ConnectionManager.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.download.api; +package com.coderising.download.api; public interface ConnectionManager { /** diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/download/api/DownloadListener.java b/group05/578505552/dataStruct/src/com/coderising/download/api/DownloadListener.java similarity index 59% rename from group05/578505552/src/main/java/dataStruct/com/coderising/download/api/DownloadListener.java rename to group05/578505552/dataStruct/src/com/coderising/download/api/DownloadListener.java index 8daca6846c..bf9807b307 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/download/api/DownloadListener.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/api/DownloadListener.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.download.api; +package com.coderising.download.api; public interface DownloadListener { public void notifyFinished(); diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/download/impl/ConnectionImpl.java b/group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionImpl.java similarity index 89% rename from group05/578505552/src/main/java/dataStruct/com/coderising/download/impl/ConnectionImpl.java rename to group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionImpl.java index c9b1c7c103..0561318d7a 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/download/impl/ConnectionImpl.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionImpl.java @@ -1,6 +1,6 @@ -package dataStruct.com.coderising.download.impl; +package com.coderising.download.impl; -import dataStruct.com.coderising.download.api.Connection; +import com.coderising.download.api.Connection; import java.io.IOException; import java.io.InputStream; diff --git a/group05/578505552/src/test/java/dataStruct/com/coderising/download/impl/ConnectionImplTest.java b/group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionImplTest.java similarity index 85% rename from group05/578505552/src/test/java/dataStruct/com/coderising/download/impl/ConnectionImplTest.java rename to group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionImplTest.java index 967b4520a2..36d2205096 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coderising/download/impl/ConnectionImplTest.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionImplTest.java @@ -1,7 +1,6 @@ -package dataStruct.com.coderising.download.impl; +package com.coderising.download.impl; -import dataStruct.com.coderising.download.api.Connection; -import dataStruct.com.coderising.download.impl.ConnectionManagerImpl; +import com.coderising.download.api.Connection; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/download/impl/ConnectionManagerImpl.java b/group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionManagerImpl.java similarity index 69% rename from group05/578505552/src/main/java/dataStruct/com/coderising/download/impl/ConnectionManagerImpl.java rename to group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionManagerImpl.java index e8e5a85aeb..3ea9a95517 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group05/578505552/dataStruct/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -1,8 +1,8 @@ -package dataStruct.com.coderising.download.impl; +package com.coderising.download.impl; -import dataStruct.com.coderising.download.api.Connection; -import dataStruct.com.coderising.download.api.ConnectionException; -import dataStruct.com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; import java.net.HttpURLConnection; import java.net.URL; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Action.java b/group05/578505552/dataStruct/src/com/coderising/litestruts/Action.java similarity index 93% rename from group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Action.java rename to group05/578505552/dataStruct/src/com/coderising/litestruts/Action.java index 1c9ad259ad..9248c3eac4 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Action.java +++ b/group05/578505552/dataStruct/src/com/coderising/litestruts/Action.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.litestruts; +package com.coderising.litestruts; import java.util.Map; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Configuration.java b/group05/578505552/dataStruct/src/com/coderising/litestruts/Configuration.java similarity index 63% rename from group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Configuration.java rename to group05/578505552/dataStruct/src/com/coderising/litestruts/Configuration.java index c85b40029f..90d8a0c6a1 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Configuration.java +++ b/group05/578505552/dataStruct/src/com/coderising/litestruts/Configuration.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.litestruts; +package com.coderising.litestruts; /** * Created by songbao.yang on 2017/3/10. diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/LoginAction.java b/group05/578505552/dataStruct/src/com/coderising/litestruts/LoginAction.java similarity index 94% rename from group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/LoginAction.java rename to group05/578505552/dataStruct/src/com/coderising/litestruts/LoginAction.java index b7789abf28..0d1956992b 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/LoginAction.java +++ b/group05/578505552/dataStruct/src/com/coderising/litestruts/LoginAction.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.litestruts; +package com.coderising.litestruts; /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/ReflectUtils.java b/group05/578505552/dataStruct/src/com/coderising/litestruts/ReflectUtils.java similarity index 81% rename from group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/ReflectUtils.java rename to group05/578505552/dataStruct/src/com/coderising/litestruts/ReflectUtils.java index cb35e59963..c11c5632f3 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/ReflectUtils.java +++ b/group05/578505552/dataStruct/src/com/coderising/litestruts/ReflectUtils.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.litestruts; +package com.coderising.litestruts; import java.lang.reflect.Method; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Struts.java b/group05/578505552/dataStruct/src/com/coderising/litestruts/Struts.java similarity index 97% rename from group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Struts.java rename to group05/578505552/dataStruct/src/com/coderising/litestruts/Struts.java index 00bc5a446f..1bfbefbbe1 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/Struts.java +++ b/group05/578505552/dataStruct/src/com/coderising/litestruts/Struts.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.litestruts; +package com.coderising.litestruts; import org.dom4j.Document; import org.dom4j.DocumentException; @@ -21,7 +21,7 @@ public class Struts { public static View runAction(String actionName, Map parameters) { // 0. 读取配置文件struts.xml - Action action = matchAction(parseXml("/struts.xml"), actionName); + Action action = matchAction(parseXml("/com/coderising/litestruts/struts.xml"), actionName); try { // 1. 根据actionName找到相对应的class, 通过反射实例化(创建对象), diff --git a/group05/578505552/src/test/java/dataStruct/com/coderising/litestruts/StrutsTest.java b/group05/578505552/dataStruct/src/com/coderising/litestruts/StrutsTest.java similarity index 96% rename from group05/578505552/src/test/java/dataStruct/com/coderising/litestruts/StrutsTest.java rename to group05/578505552/dataStruct/src/com/coderising/litestruts/StrutsTest.java index bdb0334ae5..972e0e63ca 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coderising/litestruts/StrutsTest.java +++ b/group05/578505552/dataStruct/src/com/coderising/litestruts/StrutsTest.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.litestruts; +package com.coderising.litestruts; import org.junit.Assert; import org.junit.Test; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/View.java b/group05/578505552/dataStruct/src/com/coderising/litestruts/View.java similarity index 88% rename from group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/View.java rename to group05/578505552/dataStruct/src/com/coderising/litestruts/View.java index bb6f39e9a9..07df2a5dab 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/litestruts/View.java +++ b/group05/578505552/dataStruct/src/com/coderising/litestruts/View.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.litestruts; +package com.coderising.litestruts; import java.util.Map; diff --git a/group05/578505552/src/main/java/dataStruct/com/coding/basic/BinaryTreeNode.java b/group05/578505552/dataStruct/src/com/coding/basic/BinaryTreeNode.java similarity index 97% rename from group05/578505552/src/main/java/dataStruct/com/coding/basic/BinaryTreeNode.java rename to group05/578505552/dataStruct/src/com/coding/basic/BinaryTreeNode.java index ee0351da07..3a36db4031 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coding/basic/BinaryTreeNode.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/BinaryTreeNode.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic; +package com.coding.basic; /** * Created by songbao.yang on 2017/2/21. diff --git a/group05/578505552/src/test/java/dataStruct/com/coding/basic/BinaryTreeNodeTest.java b/group05/578505552/dataStruct/src/com/coding/basic/BinaryTreeNodeTest.java similarity index 94% rename from group05/578505552/src/test/java/dataStruct/com/coding/basic/BinaryTreeNodeTest.java rename to group05/578505552/dataStruct/src/com/coding/basic/BinaryTreeNodeTest.java index ee7ecd6e36..9bdfaa5afe 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coding/basic/BinaryTreeNodeTest.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/BinaryTreeNodeTest.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic; +package com.coding.basic; import org.junit.After; import org.junit.Before; diff --git a/group05/578505552/src/main/java/dataStruct/com/coding/basic/Iterator.java b/group05/578505552/dataStruct/src/com/coding/basic/Iterator.java similarity index 78% rename from group05/578505552/src/main/java/dataStruct/com/coding/basic/Iterator.java rename to group05/578505552/dataStruct/src/com/coding/basic/Iterator.java index 1755e82202..4ac23f28c0 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coding/basic/Iterator.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/Iterator.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic; +package com.coding.basic; /** * Created by songbao.yang on 2017/2/21. diff --git a/group05/578505552/src/main/java/dataStruct/com/coding/basic/List.java b/group05/578505552/dataStruct/src/com/coding/basic/List.java similarity index 86% rename from group05/578505552/src/main/java/dataStruct/com/coding/basic/List.java rename to group05/578505552/dataStruct/src/com/coding/basic/List.java index 20d7a6daf9..aadf216958 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coding/basic/List.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/List.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic; +package com.coding.basic; /** * Created by songbao.yang on 2017/2/21. diff --git a/group05/578505552/src/test/java/dataStruct/com/coding/basic/ListTest.java b/group05/578505552/dataStruct/src/com/coding/basic/ListTest.java similarity index 96% rename from group05/578505552/src/test/java/dataStruct/com/coding/basic/ListTest.java rename to group05/578505552/dataStruct/src/com/coding/basic/ListTest.java index 9196c37f4c..4962248170 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coding/basic/ListTest.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/ListTest.java @@ -1,5 +1,6 @@ -package dataStruct.com.coding.basic; +package com.coding.basic; +import com.coding.basic.linklist.LinkedList; import org.junit.After; import org.junit.Assert; import org.junit.Before; diff --git a/group05/578505552/src/main/java/dataStruct/com/coding/basic/Queue.java b/group05/578505552/dataStruct/src/com/coding/basic/Queue.java similarity index 98% rename from group05/578505552/src/main/java/dataStruct/com/coding/basic/Queue.java rename to group05/578505552/dataStruct/src/com/coding/basic/Queue.java index 2b3a62a5d3..ac5f506eff 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coding/basic/Queue.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/Queue.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic; +package com.coding.basic; import java.util.NoSuchElementException; diff --git a/group05/578505552/src/test/java/dataStruct/com/coding/basic/QueueTest.java b/group05/578505552/dataStruct/src/com/coding/basic/QueueTest.java similarity index 97% rename from group05/578505552/src/test/java/dataStruct/com/coding/basic/QueueTest.java rename to group05/578505552/dataStruct/src/com/coding/basic/QueueTest.java index 856258a713..9fe34fbd0e 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coding/basic/QueueTest.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/QueueTest.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic; +package com.coding.basic; import org.junit.After; import org.junit.Assert; diff --git a/group05/578505552/src/main/java/dataStruct/com/coding/basic/ArrayList.java b/group05/578505552/dataStruct/src/com/coding/basic/array/ArrayList.java similarity index 96% rename from group05/578505552/src/main/java/dataStruct/com/coding/basic/ArrayList.java rename to group05/578505552/dataStruct/src/com/coding/basic/array/ArrayList.java index cdbb1107a0..e7f58cbced 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coding/basic/ArrayList.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/array/ArrayList.java @@ -1,4 +1,7 @@ -package dataStruct.com.coding.basic; +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; import java.util.NoSuchElementException; diff --git a/group05/578505552/src/main/java/dataStruct/com/coderising/array/ArrayUtil.java b/group05/578505552/dataStruct/src/com/coding/basic/array/ArrayUtil.java similarity index 99% rename from group05/578505552/src/main/java/dataStruct/com/coderising/array/ArrayUtil.java rename to group05/578505552/dataStruct/src/com/coding/basic/array/ArrayUtil.java index 4a034abf2c..3d70dc8f40 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coderising/array/ArrayUtil.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/array/ArrayUtil.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.array; +package com.coding.basic.array; public class ArrayUtil { diff --git a/group05/578505552/src/test/java/dataStruct/com/coderising/array/ArrayUtilTest.java b/group05/578505552/dataStruct/src/com/coding/basic/array/ArrayUtilTest.java similarity index 97% rename from group05/578505552/src/test/java/dataStruct/com/coderising/array/ArrayUtilTest.java rename to group05/578505552/dataStruct/src/com/coding/basic/array/ArrayUtilTest.java index b09f2efcd0..b1bdd59cbd 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coderising/array/ArrayUtilTest.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/array/ArrayUtilTest.java @@ -1,4 +1,4 @@ -package dataStruct.com.coderising.array; +package com.coding.basic.array; import org.junit.After; import org.junit.Assert; @@ -13,7 +13,7 @@ */ public class ArrayUtilTest { - private ArrayUtil arrayUtil; + private ArrayUtil arrayUtil; @Before public void setUp() throws Exception { @@ -202,4 +202,8 @@ private boolean isArrayEqual(int[] expected, int[] actual){ return true; } + public static void main(String[] args) { + System.out.println("----------"); + } + } \ No newline at end of file diff --git a/group05/578505552/src/main/java/dataStruct/com/coding/basic/linklist/LRUPageFrame.java b/group05/578505552/dataStruct/src/com/coding/basic/linklist/LRUPageFrame.java similarity index 97% rename from group05/578505552/src/main/java/dataStruct/com/coding/basic/linklist/LRUPageFrame.java rename to group05/578505552/dataStruct/src/com/coding/basic/linklist/LRUPageFrame.java index cebc4bc739..f7addeedbb 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coding/basic/linklist/LRUPageFrame.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/linklist/LRUPageFrame.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic.linklist; +package com.coding.basic.linklist; /** * 用双向链表实现LRU算法 diff --git a/group05/578505552/src/test/java/dataStruct/com/coding/basic/linklist/LRUPageFrameTest.java b/group05/578505552/dataStruct/src/com/coding/basic/linklist/LRUPageFrameTest.java similarity index 94% rename from group05/578505552/src/test/java/dataStruct/com/coding/basic/linklist/LRUPageFrameTest.java rename to group05/578505552/dataStruct/src/com/coding/basic/linklist/LRUPageFrameTest.java index ffeaa4a747..2127d16eea 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coding/basic/linklist/LRUPageFrameTest.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic.linklist; +package com.coding.basic.linklist; import org.junit.Assert; diff --git a/group05/578505552/src/main/java/dataStruct/com/coding/basic/LinkedList.java b/group05/578505552/dataStruct/src/com/coding/basic/linklist/LinkedList.java similarity index 99% rename from group05/578505552/src/main/java/dataStruct/com/coding/basic/LinkedList.java rename to group05/578505552/dataStruct/src/com/coding/basic/linklist/LinkedList.java index 9238a5c7a0..7bca51587d 100644 --- a/group05/578505552/src/main/java/dataStruct/com/coding/basic/LinkedList.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/linklist/LinkedList.java @@ -1,4 +1,7 @@ -package dataStruct.com.coding.basic; +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; import java.util.NoSuchElementException; diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/Stack.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..33b414baaa --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,77 @@ +package com.coding.basic.stack; + + +import java.util.EmptyStackException; + +/** + * Created by songbao.yang on 2017/2/22. + * + */ +public class Stack { + + private Object[] elementData; + private static final int MIN_INITIAL_CAPACITY = 10; + private int cursor; + + public Stack() { + elementData = new Object[MIN_INITIAL_CAPACITY]; + cursor = -1; + } + + public void push(Object o) { + ensureCapacity(size() + 1); + cursor = cursor + 1; + System.out.println(cursor); + elementData[cursor] = o; + } + + private void ensureCapacity(int minCapacity) { + if (minCapacity <= elementData.length) { + return; + } + + int newSize = elementData.length << 1; + if (newSize < elementData.length) { + newSize = Integer.MAX_VALUE; + } + + Object[] newDataArray = new Object[newSize]; + System.arraycopy(elementData, 0, newDataArray, 0, size()); + elementData = newDataArray; + } + + + public Object pop() { + Object ele = peek(); + cursor--; + return ele; + } + + public Object peek() { + if (isEmpty()) { + throw new EmptyStackException(); + } + return elementData[this.cursor]; + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return this.cursor + 1; + } + + @Override + public String toString() { + + StringBuffer stringBuffer = new StringBuffer(); + while (!isEmpty()){ + stringBuffer.append(pop()); + if (!isEmpty()){ + stringBuffer.append(','); + } + } + return stringBuffer.toString(); + } +} \ No newline at end of file diff --git a/group05/578505552/src/test/java/dataStruct/com/coding/basic/StackTest.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/StackTest.java similarity index 85% rename from group05/578505552/src/test/java/dataStruct/com/coding/basic/StackTest.java rename to group05/578505552/dataStruct/src/com/coding/basic/stack/StackTest.java index c58643c31a..92b0a07176 100644 --- a/group05/578505552/src/test/java/dataStruct/com/coding/basic/StackTest.java +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/StackTest.java @@ -1,4 +1,4 @@ -package dataStruct.com.coding.basic; +package com.coding.basic.stack; import org.junit.After; import org.junit.Assert; @@ -62,4 +62,15 @@ public void size() throws Exception { } + @Test + public void testToString(){ + + stack.push(1); + stack.push(2); + stack.push(3); + + System.out.println(stack.toString()); + + } + } \ No newline at end of file diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/StackUtil.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..dde9770cab --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,94 @@ +package com.coding.basic.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 stack = new Stack(); + while (!s.isEmpty()){ + stack.push(s.pop()); + } + s = stack; + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + + Stack stack = new Stack(); + while (!s.isEmpty()){ + Object peek = s.peek(); + if (peek.equals(o)){ + s.pop(); + while (!stack.isEmpty()){ + s.push(stack.pop()); + } + } else { + stack.push(s.pop()); + } + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + + Object[] topN = new Object[len]; + Stack stack = new Stack(); + for (int i = 0; i < len; i++){ + if (!s.isEmpty()){ + Object pop = s.pop(); + topN[i] = pop; + stack.push(pop); + } else { + break; + } + } + + while (!stack.isEmpty()){ + s.push(stack.pop()); + } + + return topN; + } + /** + * 字符串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){ + + Stack stack = new Stack(); + + for (int i = 0; i < s.length(); i++) { + + char c = s.charAt(i); + if (c == '{' || c == '[' || c == '('){ + stack.push(c); + } + + if (c == '}' || c == ']' || c == ')'){ + if (stack.isEmpty() || c != (Character) stack.pop()){ + return false; + } + } + } + return true; + } + +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/StackUtilTest.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..f6073b6106 --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,61 @@ +package com.coding.basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * r + * Created by songbao.yang on 2017/4/11. + */ +public class StackUtilTest { + + StackUtil stackUtil; + Stack stack; + + @Before + public void setUp() throws Exception { + stackUtil = new StackUtil(); + stack = new Stack(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void reverse() throws Exception { + + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + + StackUtil.reverse(stack); + + String reverse = stack.toString(); + + Assert.assertEquals("1,2,3,4,5", reverse); + } + + @Test + public void remove() throws Exception { + + } + + @Test + public void getTop() throws Exception { + + } + + @Test + public void isValidPairs() throws Exception { + + } + +} \ No newline at end of file diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/clz/AccessFlag.java b/group05/578505552/miniJvm/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..67e378085f --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,28 @@ +package com.coderising.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/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassFile.java b/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..b68bdb0998 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassIndex.java b/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..23d3214e90 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,27 @@ +package com.coderising.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/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ClassInfo.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..52303f2488 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.coderising.jvm.constant; + +public abstract class ConstantInfo { + + public static final Integer UTF8_INFO = 1; + public static final Integer INTEGER_INFO = 3; + public static final Integer FLOAT_INFO = 4; + public static final Integer LONG_INFO = 5; + public static final Integer DOUBLE_INFO = 6; + public static final Integer CLASS_INFO = 7; + public static final Integer STRING_INFO = 8; + public static final Integer FIELDREF_INFO = 9; + public static final Integer METHODREF_INFO = 10; + public static final Integer INTERFACE_METHODREF_INFO = 11; + public static final Integer NAMEANDTYPE_INFO = 12; + public static final Integer METHODHANDLE_INFO = 15; + public static final Integer METHODTYPE_INFO = 16; + public static final Integer INVOKEDYNAMIC_INFO = 18; + + 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/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ConstantPool.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group05/578505552/miniJvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..f94f00426d --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.constant; + +public class FieldRefInfo extends ConstantInfo{ + private int type = ConstantInfo.FIELDREF_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/group05/578505552/miniJvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..44ddf169f2 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.jvm.constant; + +public class MethodRefInfo extends ConstantInfo { + + private int type = ConstantInfo.METHODREF_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/group05/578505552/miniJvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..7eae6e4ec1 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.constant; + +public class NameAndTypeInfo extends ConstantInfo{ + public int type = ConstantInfo.NAMEANDTYPE_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/group05/578505552/miniJvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/constant/StringInfo.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group05/578505552/miniJvm/src/com/coderising/jvm/constant/UTF8Info.java b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..7e80c58a86 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.coderising.jvm.constant; + +public class UTF8Info extends ConstantInfo{ + + private int type = 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; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..99a6c22608 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = new byte[len]; + System.arraycopy(codes, pos, data, 0, len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..049fbb3cde --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,88 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.clz.ClassFile; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + + className = className.replace('.', File.separatorChar) +".class"; + + for(String path : clzPaths){ + String clzFileName = path + File.separatorChar + className; + byte[] codes = loadClassFile(clzFileName); + if(codes != null){ + return codes; + } + } + + return null; + } + + public void addClassPath(String path) { + if(clzPaths.contains(path)){ + return; + } + clzPaths.add(path); + } + + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + } + + public String getClassPath(){ + + StringBuffer buffer = new StringBuffer(); + + for(int i = 0;i < clzPaths.size(); i++){ + buffer.append(clzPaths.get(i)); + if(i < clzPaths.size() - 1){ + buffer.append(";"); + } + } + + return buffer.toString(); + } + + private byte[] loadClassFile(String clzFileName) { + + BufferedInputStream bis = null; + try { + File f = new File(clzFileName); + bis = new BufferedInputStream(new FileInputStream(f)); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + byte[] buffer = new byte[1024]; + int length = -1; + + while((length = bis.read(buffer)) != -1){ + bos.write(buffer, 0, length); + } + byte [] codes = bos.toByteArray(); + return codes; + + } catch(IOException e){ + e.printStackTrace(); + + } finally{ + if(bis != null){ + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + + } + +} \ No newline at end of file diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..4b8dbf180d --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,106 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.parser.*; + +import java.util.HashMap; +import java.util.Map; + +public class ClassFileParser { + + private static final Map constantPoolParserMap = new HashMap(); + static { + constantPoolParserMap.put(ConstantInfo.UTF8_INFO, new UTF8InfoParser()); +// constantPoolParserMap.put(ConstantInfo.INTEGER_INFO, new IntegerInfoParser()); +// constantPoolParserMap.put(ConstantInfo.FLOAT_INFO, new FloatInfoParser()); +// constantPoolParserMap.put(ConstantInfo.LONG_INFO, new LongInfoParser()); +// constantPoolParserMap.put(ConstantInfo.DOUBLE_INFO, new DoubleInfoParser()); + constantPoolParserMap.put(ConstantInfo.CLASS_INFO, new ClassInfoParser()); + constantPoolParserMap.put(ConstantInfo.STRING_INFO, new StringInfoParser()); + constantPoolParserMap.put(ConstantInfo.FIELDREF_INFO, new FieldRefInfoParser()); + constantPoolParserMap.put(ConstantInfo.METHODREF_INFO, new MethodRefInfoParser()); +// constantPoolParserMap.put(ConstantInfo.INTERFACE_METHODREF_INFO, new InterfaceMethodrefInfoParser()); + constantPoolParserMap.put(ConstantInfo.NAMEANDTYPE_INFO, new NameAndTypeInfoParser()); +// constantPoolParserMap.put(ConstantInfo.METHODHANDLE_INFO, new MethodHandleInfoParser()); +// constantPoolParserMap.put(ConstantInfo.METHODTYPE_INFO, new MethodTypeInfoParser()); +// constantPoolParserMap.put(ConstantInfo.INVOKEDYNAMIC_INFO, new InvokeDynamicInfoParser()); + } + + public ClassFile parse(byte[] codes) { + + ByteCodeIterator iterator = new ByteCodeIterator(codes); + + String magicNum = iterator.nextU4ToHexString(); + if (!"cafebabe".equals(magicNum)){ + return null; + } + + ClassFile clzFile = new ClassFile(); + + clzFile.setMinorVersion(iterator.nextU2ToInt()); + clzFile.setMajorVersion(iterator.nextU2ToInt()); + clzFile.setConstPool(parseConstantPool(iterator)); + clzFile.setAccessFlag(parseAccessFlag(iterator)); + clzFile.setClassIndex(parseClassInfex(iterator)); + + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + return new AccessFlag(iter.nextU2ToInt()); + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + + ClassIndex classIndex = new ClassIndex(); + classIndex.setThisClassIndex(iter.nextU2ToInt()); + classIndex.setSuperClassIndex(iter.nextU2ToInt()); + + return classIndex; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + + int constantPoolCount = iter.nextU2ToInt(); + + ConstantPool constantPool = new ConstantPool(); + constantPool.addConstantInfo(new NullConstantInfo()); + + for (int i = 1; i < constantPoolCount; i++) { + + int tag = iter.nextU1toInt(); + ConstantInfoParser parser = constantPoolParserMap.get(tag); + if (parser == null){ + throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet."); + } + constantPool.addConstantInfo(parser.parser(constantPool, iter)); + } + + return constantPool; + } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { + + + } + + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + + + } + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/ClassInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/ClassInfoParser.java new file mode 100644 index 0000000000..bed605c354 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/ClassInfoParser.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * + * Created by songbao.yang on 2017/4/19. + */ +public class ClassInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + + ClassInfo classInfo = new ClassInfo(constantPool); + int index = iterator.nextU2ToInt(); + classInfo.setUtf8Index(index); + + return classInfo; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/ConstantInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/ConstantInfoParser.java new file mode 100644 index 0000000000..f437a54a4a --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/ConstantInfoParser.java @@ -0,0 +1,14 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * + * Created by songbao.yang on 2017/4/19. + */ +public abstract class ConstantInfoParser { + + public abstract ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator); +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/DoubleInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/DoubleInfoParser.java new file mode 100644 index 0000000000..6563e68861 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/DoubleInfoParser.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * Created by songbao.yang on 2017/4/19. + */ +public class DoubleInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + return null; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/FieldRefInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/FieldRefInfoParser.java new file mode 100644 index 0000000000..316e0fcd4d --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/FieldRefInfoParser.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * Created by songbao.yang on 2017/4/19. + */ +public class FieldRefInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + + FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool); + fieldRefInfo.setClassInfoIndex(iterator.nextU2ToInt()); + fieldRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt()); + + return fieldRefInfo; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/FloatInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/FloatInfoParser.java new file mode 100644 index 0000000000..6162eb798f --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/FloatInfoParser.java @@ -0,0 +1,16 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * + * Created by songbao.yang on 2017/4/19. + */ +public class FloatInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + return null; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/IntegerInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/IntegerInfoParser.java new file mode 100644 index 0000000000..a97a0fa9a4 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/IntegerInfoParser.java @@ -0,0 +1,16 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * + * Created by songbao.yang on 2017/4/19. + */ +public class IntegerInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + return null; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/InterfaceMethodrefInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/InterfaceMethodrefInfoParser.java new file mode 100644 index 0000000000..06f301cf9a --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/InterfaceMethodrefInfoParser.java @@ -0,0 +1,16 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * + * Created by songbao.yang on 2017/4/19. + */ +public class InterfaceMethodrefInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + return null; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/InvokeDynamicInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/InvokeDynamicInfoParser.java new file mode 100644 index 0000000000..f008c4a9b7 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/InvokeDynamicInfoParser.java @@ -0,0 +1,16 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * + * Created by songbao.yang on 2017/4/19. + */ +public class InvokeDynamicInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + return null; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/LongInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/LongInfoParser.java new file mode 100644 index 0000000000..000ff4e841 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/LongInfoParser.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * Created by songbao.yang on 2017/4/19. + */ +public class LongInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + return null; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodHandleInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodHandleInfoParser.java new file mode 100644 index 0000000000..679f2e52d9 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodHandleInfoParser.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * Created by songbao.yang on 2017/4/19. + */ +public class MethodHandleInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + return null; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodRefInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodRefInfoParser.java new file mode 100644 index 0000000000..5bfdb1364b --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodRefInfoParser.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * + * Created by songbao.yang on 2017/4/19. + */ +public class MethodRefInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + + MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool); + methodRefInfo.setClassInfoIndex(iterator.nextU2ToInt()); + methodRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt()); + + return methodRefInfo; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodTypeInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodTypeInfoParser.java new file mode 100644 index 0000000000..c155ef8d5c --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/MethodTypeInfoParser.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * Created by songbao.yang on 2017/4/19. + */ +public class MethodTypeInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + return null; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/NameAndTypeInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/NameAndTypeInfoParser.java new file mode 100644 index 0000000000..6376966e68 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/NameAndTypeInfoParser.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * Created by songbao.yang on 2017/4/19. + */ +public class NameAndTypeInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool); + nameAndTypeInfo.setIndex1(iterator.nextU2ToInt()); + nameAndTypeInfo.setIndex2(iterator.nextU2ToInt()); + + return nameAndTypeInfo; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/StringInfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/StringInfoParser.java new file mode 100644 index 0000000000..6f576e83ef --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/StringInfoParser.java @@ -0,0 +1,20 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.loader.ByteCodeIterator; + +/** + * Created by songbao.yang on 2017/4/19. + */ +public class StringInfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + + StringInfo stringInfo = new StringInfo(constantPool); + stringInfo.setIndex(iterator.nextU2ToInt()); + + return stringInfo; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/parser/UTF8InfoParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/UTF8InfoParser.java new file mode 100644 index 0000000000..566bab3ce6 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/parser/UTF8InfoParser.java @@ -0,0 +1,34 @@ +package com.coderising.jvm.parser; + +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + +import java.io.UnsupportedEncodingException; + +/** + * + * Created by songbao.yang on 2017/4/19. + */ +public class UTF8InfoParser extends ConstantInfoParser { + + public ConstantInfo parser(ConstantPool constantPool, ByteCodeIterator iterator) { + + int lenght = iterator.nextU2ToInt(); + byte[] bytes = iterator.getBytes(lenght); + + String value = null; + try { + value = new String(bytes, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + UTF8Info utf8Info = new UTF8Info(constantPool); + utf8Info.setLength(lenght); + utf8Info.setValue(value); + + return utf8Info; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group05/578505552/miniJvm/src/com/coderising/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..2002d2dddd --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,181 @@ +package com.coderising.jvm.test; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.*; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.util.Util; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + static String path1 = "D:\\project\\Learn\\coding2017\\group05\\578505552\\miniJvm\\src"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = Util.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + /** + * ---------------------------------------------------------------------- + */ + + + @Test + public void testVersion(){ + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool(){ + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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/group05/578505552/src/main/java/miniJvm/com/coderising/jvm/loader/EmployeeV1.java b/group05/578505552/miniJvm/src/com/coderising/jvm/test/EmployeeV1.java similarity index 73% rename from group05/578505552/src/main/java/miniJvm/com/coderising/jvm/loader/EmployeeV1.java rename to group05/578505552/miniJvm/src/com/coderising/jvm/test/EmployeeV1.java index edae33a2aa..2c0ac7cf07 100644 --- a/group05/578505552/src/main/java/miniJvm/com/coderising/jvm/loader/EmployeeV1.java +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -1,30 +1,32 @@ -package miniJvm.com.coderising.jvm.loader; +package com.coderising.jvm.test; public class EmployeeV1 { - - + private String name; private int age; - - public EmployeeV1() { - } - + 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() { + + public void sayHello() { + System.out.println("Hello , this is class Employee "); } + public static void main(String[] args){ - EmployeeV1 p = new EmployeeV1("Andy",29); + com.coderising.jvm.test.EmployeeV1 p = new com.coderising.jvm.test.EmployeeV1("Andy",29); p.sayHello(); } diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/util/Util.java b/group05/578505552/miniJvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - - String fullClassName = className.replace(".", "\\") + ".class"; - for (String clzpath : clzPaths){ - byte[] binaryCode = readBinaryCode(clzpath, fullClassName); - if (binaryCode != null){ - return binaryCode; - } - } - return null; - } - - private byte[] readBinaryCode(String clzPath, String fullClassName){ - - String filePath = clzPath + "\\" + fullClassName; - File classFile = new File(filePath); - if (!classFile.exists()){ - return null; - } - try { - FileInputStream fileInputStream = new FileInputStream(classFile); - DataInputStream dataInputStream = new DataInputStream(fileInputStream); - List bytes = new ArrayList(); - int b; - while ((b = dataInputStream.read()) != -1){ - bytes.add((byte)b); - } - byte[] res = new byte[bytes.size()]; - for (int i = 0; i < bytes.size(); i++){ - res[i] = bytes.get(i); - } - return res; - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - public void addClassPath(String path) { - - if (path == null){ - return; - } - clzPaths.add(path); - } - - public String getClassPath(){ - - StringBuffer stringBuffer = new StringBuffer(); - for (String path : clzPaths){ - stringBuffer.append(path).append(";"); - } - return stringBuffer.substring(0, stringBuffer.length() - 1); - } - -} diff --git a/group05/578505552/src/main/resources/struts.xml b/group05/578505552/src/main/resources/struts.xml deleted file mode 100644 index 0dc7b6de98..0000000000 --- a/group05/578505552/src/main/resources/struts.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group05/578505552/src/test/java/JavaTest.java b/group05/578505552/src/test/java/JavaTest.java deleted file mode 100644 index 26d2197ffe..0000000000 --- a/group05/578505552/src/test/java/JavaTest.java +++ /dev/null @@ -1,25 +0,0 @@ -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Queue; -import java.util.Stack; - -/** - * Created by songbao.yang on 2017/2/21. - */ -public class JavaTest { - - public static void main(String[] args) { - - ArrayList ss = new ArrayList(); - ss.add("a"); - ss.add("b"); - ss.add("c"); - ss.add("d"); - - System.out.println(ss.size()); - ss.remove(0); - System.out.println(ss.size()); - - - } -} diff --git a/group05/578505552/src/test/java/miniJvm/com/coderising/jvm/loader/ClassFileloaderTest.java b/group05/578505552/src/test/java/miniJvm/com/coderising/jvm/loader/ClassFileloaderTest.java deleted file mode 100644 index 97410772aa..0000000000 --- a/group05/578505552/src/test/java/miniJvm/com/coderising/jvm/loader/ClassFileloaderTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package miniJvm.com.coderising.jvm.loader; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class ClassFileloaderTest { - - static String path1 = "D:\\project\\Learn\\coding2017\\group05\\578505552\\target\\classes"; - static String path2 = "C:\\temp"; - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - String clzPath = loader.getClassPath(); - Assert.assertEquals(path1+";"+path2,clzPath); - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "miniJvm.com.coderising.jvm.loader.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1141, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "miniJvm.com.coderising.jvm.loader.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - String acctualValue = this.byteToHexString(codes); - Assert.assertEquals("cafebabe", acctualValue); - } - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i Date: Wed, 19 Apr 2017 23:36:52 +0800 Subject: [PATCH 202/552] =?UTF-8?q?=E5=90=8E=E5=89=8D=E7=BC=80=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/InfixExpr.java | 19 +-- .../basic/stack/expr/InfixToPostfix.java | 67 +++++++++ .../basic/stack/expr/InfixToPostfixTest.java | 32 +++++ .../basic/stack/expr/PostfixExpr.java | 35 +++++ .../basic/stack/expr/PostfixExprTest.java | 41 ++++++ .../basic/stack/expr/PrefixExpr.java | 36 +++++ .../basic/stack/expr/PrefixExprTest.java | 44 ++++++ .../coding2017/basic/stack/expr/Token.java | 64 +++++++++ .../basic/stack/expr/TokenParser.java | 57 ++++++++ .../basic/stack/expr/TokenParserTest.java | 41 ++++++ .../coding2017/minijvm/attr/CodeAttr.java | 24 +++- .../minijvm/attr/LineNumberTable.java | 12 +- .../minijvm/attr/LocalVariableTable.java | 15 +- .../coding2017/minijvm/clz/ClassFile.java | 13 +- .../coding2017/minijvm/cmd/BiPushCmd.java | 21 +++ .../minijvm/cmd/ByteCodeCommand.java | 132 ++++++++++++++++++ .../coding2017/minijvm/cmd/CommandParser.java | 84 +++++++++++ .../coding2017/minijvm/cmd/GetFieldCmd.java | 21 +++ .../minijvm/cmd/GetStaticFieldCmd.java | 19 +++ .../minijvm/cmd/InvokeSpecialCmd.java | 21 +++ .../minijvm/cmd/InvokeVirtualCmd.java | 21 +++ .../coding2017/minijvm/cmd/LdcCmd.java | 29 ++++ .../coding2017/minijvm/cmd/NewObjectCmd.java | 19 +++ .../coding2017/minijvm/cmd/NoOperandCmd.java | 23 +++ .../coding2017/minijvm/cmd/OneOperandCmd.java | 29 ++++ .../coding2017/minijvm/cmd/PutFieldCmd.java | 19 +++ .../coding2017/minijvm/cmd/TwoOperandCmd.java | 67 +++++++++ .../coding2017/minijvm/method/Method.java | 4 + .../minijvm/print/ClassFilePrinter.java | 45 ++++++ .../minijvm/print/ConstantPoolPrinter.java | 18 +++ .../minijvm/test/ClassFileloaderTest.java | 77 ++++++++++ 31 files changed, 1121 insertions(+), 28 deletions(-) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfixTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExprTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PrefixExpr.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PrefixExprTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/Token.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java index 1e597a2b24..87344ca452 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java @@ -33,7 +33,7 @@ private void manageMultiAndDivOper(String[] elements,Stack numStack,Stack operSt preElement = (Float)numStack.pop(); i++; nextElement = Float.valueOf(elements[i]); - numStack.push(doBaseOper(preElement,nextElement,elements[i-1])); + numStack.push(Token.doBaseOper(preElement,nextElement,elements[i-1])); } } } @@ -42,27 +42,12 @@ private void manageMultiAndDivOper(String[] elements,Stack numStack,Stack operSt private float manageAddAndMinusOper(Stack numStack,Stack operStack){ float result = 0f;; while(!operStack.isEmpty()){ - result = doBaseOper(result,(Float)numStack.pop(),(String)operStack.pop()); + result = Token.doBaseOper(result,(Float)numStack.pop(),(String)operStack.pop()); } result += (Float)numStack.pop(); return result; } - private float doBaseOper(float preData,float nextData,String oper){ - switch(oper){ - case "+": - return preData+nextData; - case "-": - return preData-nextData; - case "*": - return preData*nextData; - case "/": - return preData/nextData; - default: - throw new RuntimeException("could not recognise oper:"+oper); - } - } - public String[] getElementArray(String expression){ char[] charArray = expression.toCharArray(); StringBuffer stringBuffer = new StringBuffer(); diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..d444fef039 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,67 @@ +package com.github.ipk2015.coding2017.basic.stack.expr; + + + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + int len = expr.length(); + char c,temp; + Stack stack = new Stack(); + StringBuffer buffer = new StringBuffer(); + for(int i = 0;i tokens = InfixToPostfix.convert("3+(2-5)*6/3"); + + Assert.assertEquals(3, tokens.get(0).getIntValue()); + Assert.assertEquals(2, tokens.get(1).getIntValue()); + Assert.assertEquals(5, tokens.get(2).getIntValue()); + Assert.assertEquals("-", tokens.get(3).toString()); + Assert.assertEquals(6, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(3, tokens.get(6).getIntValue()); + Assert.assertEquals("/", tokens.get(7).toString()); + Assert.assertEquals("+", tokens.get(8).toString()); + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..af427fa948 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,35 @@ +package com.github.ipk2015.coding2017.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List list = parser.parse(expr); + + Stack stack = new Stack(); + int len = list.size(); + float preNum,afterNum; + Token token; + for(int i = 0;i list = parser.parse(expr); + + Stack stack = new Stack(); + int len = list.size(); + float preNum,afterNum; + Token token; + for(int i = 0;i OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + public static float doBaseOper(float preData,float nextData,String oper){ + switch(oper){ + case "+": + return preData+nextData; + case "-": + return preData-nextData; + case "*": + return preData*nextData; + case "/": + return preData/nextData; + default: + throw new RuntimeException("could not recognise oper:"+oper); + } + } + + +} \ No newline at end of file diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..998d1e4c8e --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.github.ipk2015.coding2017.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..2543baec60 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.github.ipk2015.coding2017.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java index 2f141a20a3..ff7fcc4294 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java @@ -1,6 +1,8 @@ package com.github.ipk2015.coding2017.minijvm.attr; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { @@ -12,10 +14,10 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; @@ -26,7 +28,7 @@ public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -78,7 +80,17 @@ private static void addSonAttr(ClassFile clzFile,CodeAttr codeAttr,ByteCodeItera } } - + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java new file mode 100644 index 0000000000..23b2859e6a --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java @@ -0,0 +1,84 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import java.util.List; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..ad694d7eec --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java @@ -0,0 +1,21 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..87bfca3c7f --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,19 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..e573129d76 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..989c3f6fae --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,21 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..bc72a9f300 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..973061d110 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..62c51c2b3a --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..ca6052b34c --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java @@ -0,0 +1,29 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + + + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..e73ff203d5 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..99c6b99455 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; +import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java index 3298a36d6b..61b91fa7b9 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java @@ -3,6 +3,7 @@ import com.github.ipk2015.coding2017.minijvm.attr.AttributeInfo; import com.github.ipk2015.coding2017.minijvm.attr.CodeAttr; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; import com.github.ipk2015.coding2017.minijvm.loader.ByteCodeIterator; public class Method { @@ -67,4 +68,7 @@ private static void addAttr(ClassFile clzFile,Method method,ByteCodeIterator ite throw new RuntimeException("方法的此属性不存在:"+attrName); } } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..6615a189f5 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java @@ -0,0 +1,45 @@ +package com.github.ipk2015.coding2017.minijvm.print; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..295c509941 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java @@ -0,0 +1,18 @@ +package com.github.ipk2015.coding2017.minijvm.print; + +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java index 0a3979119d..213046188c 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java @@ -12,6 +12,10 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.clz.ClassIndex; +import com.github.ipk2015.coding2017.minijvm.cmd.BiPushCmd; +import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; +import com.github.ipk2015.coding2017.minijvm.cmd.OneOperandCmd; +import com.github.ipk2015.coding2017.minijvm.cmd.TwoOperandCmd; import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; @@ -279,5 +283,78 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From bf87a113995ff79ee34866dea233a41b68d0c1ef Mon Sep 17 00:00:00 2001 From: johnChnia Date: Thu, 20 Apr 2017 01:23:21 +0800 Subject: [PATCH 203/552] =?UTF-8?q?=E5=AE=8C=E6=88=90prefix,postfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/InfixExpr.java | 15 +++++ .../basic/stack/expr/InfixExprTest.java | 52 +++++++++++++++++ .../basic/stack/expr/InfixToPostfix.java | 14 +++++ .../coding2017/basic/stack/expr/Operator.java | 41 +++++++++++++ .../basic/stack/expr/PostfixExpr.java | 27 +++++++++ .../basic/stack/expr/PostfixExprTest.java | 41 +++++++++++++ .../basic/stack/expr/PrefixExpr.java | 25 ++++++++ .../basic/stack/expr/PrefixExprTest.java | 45 ++++++++++++++ .../coding2017/basic/stack/expr/Token.java | 50 ++++++++++++++++ .../basic/stack/expr/TokenParser.java | 58 +++++++++++++++++++ .../basic/stack/expr/TokenParserTest.java | 39 +++++++++++++ 11 files changed, 407 insertions(+) create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..ddafe58c46 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java @@ -0,0 +1,15 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..e47a8841da --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..f42f73282a --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,14 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java new file mode 100644 index 0000000000..52ff15fa80 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java @@ -0,0 +1,41 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.stack.Stack; + +/** + * Created by john on 2017/4/20. + */ +public class Operator { + + public void handlerToken(String fix, Stack stack, Token token) { + if (token.isNumber()) { + stack.push(Float.parseFloat(token.toString())); + } else if (token.isOperator()) { + float p = stack.pop(); + float q = stack.pop(); + stack.push(perform(fix, token.toString(), p, q)); + } + } + + private float perform(String fix, String operator, float p, float q) { + float result = 0.0f; + if (operator.equals("+")) { + result = p + q; + } else if (operator.equals("-")) { + if (fix.equals("postfix")) { + result = q - p; + } else if (fix.equals("prefix")){ + result = p - q; + } + } else if (operator.equals("*")) { + result = p * q; + } else if (operator.equals("/")) { + if (fix.equals("postfix")) { + result = q / p; + } else if (fix.equals("prefix")){ + result = p / q; + } + } + return result; + } +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..dfecd16ed4 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,27 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.List; +import com.johnChnia.coding2017.basic.stack.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(this.expr); + Operator operator = new Operator(); + Stack stack = new Stack<>(); + for (int i = 0; i < tokens.size(); i++) { + operator.handlerToken("postfix", stack, tokens.get(i)); + + } + + return stack.pop(); + } + + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..312eed28b3 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.johnChnia.coding2017.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..c16f529845 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,25 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.List; +import com.johnChnia.coding2017.basic.stack.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(this.expr); + Operator operator = new Operator(); + Stack stack = new Stack<>(); + for (int i = tokens.size() - 1; i >= 0; i--) { + operator.handlerToken("prefix", stack, tokens.get(i)); + } + return stack.pop(); + } + + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..30f67b2710 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(), 0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(), 0.001f); + } + + + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java new file mode 100644 index 0000000000..f87a210587 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..b9c8b80444 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java @@ -0,0 +1,58 @@ +package com.johnChnia.coding2017.basic.stack.expr; + + +import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else { + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..cdb3b091db --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,39 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.List; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From cc76d7c021f4928fa7c1548f2dfde107f02e8de5 Mon Sep 17 00:00:00 2001 From: earlywusa Date: Wed, 19 Apr 2017 10:42:49 -0700 Subject: [PATCH 204/552] Update 20170402-20170409.md --- group17/article/20170402-20170409.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group17/article/20170402-20170409.md b/group17/article/20170402-20170409.md index f0d32f145f..59e3477528 100644 --- a/group17/article/20170402-20170409.md +++ b/group17/article/20170402-20170409.md @@ -30,7 +30,7 @@ 516886559 -1282579502 https://www.evernote.com/l/AZ3ajLOAlTVHw7foK2KLb-bWZ7kw6FjljDA +1282579502 614982500 From 65ea9b2de442440d761a8b634e9b78ac2a183ebd Mon Sep 17 00:00:00 2001 From: Ren650119726 <102228177@qq.com> Date: Thu, 20 Apr 2017 08:56:55 +0800 Subject: [PATCH 205/552] =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/article/20170409-20170416.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group17/article/20170409-20170416.md b/group17/article/20170409-20170416.md index 3d45ad0516..eae67d9c31 100644 --- a/group17/article/20170409-20170416.md +++ b/group17/article/20170409-20170416.md @@ -12,7 +12,7 @@ 1204187480 -102228177 +102228177 http://note.youdao.com/noteshare?id=7a1c457bc3de9a140f4e077f6352fc11 876385982 From b22edf148d67c1e63b789dad35bb0b2750e6624b Mon Sep 17 00:00:00 2001 From: zheng <765324639@qq.com> Date: Thu, 20 Apr 2017 12:39:08 +0800 Subject: [PATCH 206/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E5=B8=B8=E9=87=8F=E6=B1=A0=E9=83=A8=E5=88=86=EF=BC=88=E6=A8=A1?= =?UTF-8?q?=E4=BB=BFjavap=E6=8C=87=E4=BB=A4=E6=89=93=E5=8D=B0=E7=9A=84?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/minijvm/constant/ClassInfo.java | 4 + .../java/minijvm/constant/ConstantInfo.java | 68 +++++++++----- .../java/minijvm/constant/ConstantPool.java | 43 +++++---- .../java/minijvm/constant/FieldRefInfo.java | 4 + .../java/minijvm/constant/MethodRefInfo.java | 5 + .../minijvm/constant/NameAndTypeInfo.java | 5 + .../minijvm/constant/NullConstantInfo.java | 5 + .../java/minijvm/constant/StringInfo.java | 5 + .../main/java/minijvm/constant/UTF8Info.java | 66 +++++++------ .../java/minijvm/print/ClassFilePrinter.java | 80 ++++++++-------- .../minijvm/print/ConstantPoolPrinter.java | 11 ++- .../java/minijvm/print/JavapPrintVisitor.java | 93 +++++++++++++++++++ 12 files changed, 274 insertions(+), 115 deletions(-) create mode 100644 group01/765324639/src/main/java/minijvm/print/JavapPrintVisitor.java diff --git a/group01/765324639/src/main/java/minijvm/constant/ClassInfo.java b/group01/765324639/src/main/java/minijvm/constant/ClassInfo.java index c856052998..9baacbdffd 100644 --- a/group01/765324639/src/main/java/minijvm/constant/ClassInfo.java +++ b/group01/765324639/src/main/java/minijvm/constant/ClassInfo.java @@ -22,4 +22,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group01/765324639/src/main/java/minijvm/constant/ConstantInfo.java b/group01/765324639/src/main/java/minijvm/constant/ConstantInfo.java index 5fa0be0189..d40afea29b 100644 --- a/group01/765324639/src/main/java/minijvm/constant/ConstantInfo.java +++ b/group01/765324639/src/main/java/minijvm/constant/ConstantInfo.java @@ -1,29 +1,47 @@ package minijvm.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); - } - + 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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor { + public void visitClassInfo(ClassInfo info); + + public void visitFieldRef(FieldRefInfo info); + + public void visitMethodRef(MethodRefInfo info); + + public void visitNameAndType(NameAndTypeInfo info); + + public void visitString(StringInfo info); + + public void visistUTF8(UTF8Info info); + + } } diff --git a/group01/765324639/src/main/java/minijvm/constant/ConstantPool.java b/group01/765324639/src/main/java/minijvm/constant/ConstantPool.java index 12746a1f3c..6cd94a48d4 100644 --- a/group01/765324639/src/main/java/minijvm/constant/ConstantPool.java +++ b/group01/765324639/src/main/java/minijvm/constant/ConstantPool.java @@ -4,26 +4,25 @@ 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; - } + + 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 int getSize() { + return this.constantInfos.size() - 1; + } } diff --git a/group01/765324639/src/main/java/minijvm/constant/FieldRefInfo.java b/group01/765324639/src/main/java/minijvm/constant/FieldRefInfo.java index ddcf2df456..e7a33ddc10 100644 --- a/group01/765324639/src/main/java/minijvm/constant/FieldRefInfo.java +++ b/group01/765324639/src/main/java/minijvm/constant/FieldRefInfo.java @@ -53,4 +53,8 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group01/765324639/src/main/java/minijvm/constant/MethodRefInfo.java b/group01/765324639/src/main/java/minijvm/constant/MethodRefInfo.java index f4c2368228..a731895413 100644 --- a/group01/765324639/src/main/java/minijvm/constant/MethodRefInfo.java +++ b/group01/765324639/src/main/java/minijvm/constant/MethodRefInfo.java @@ -51,6 +51,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group01/765324639/src/main/java/minijvm/constant/NameAndTypeInfo.java b/group01/765324639/src/main/java/minijvm/constant/NameAndTypeInfo.java index de88422d82..27690de3f7 100644 --- a/group01/765324639/src/main/java/minijvm/constant/NameAndTypeInfo.java +++ b/group01/765324639/src/main/java/minijvm/constant/NameAndTypeInfo.java @@ -44,4 +44,9 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } } diff --git a/group01/765324639/src/main/java/minijvm/constant/NullConstantInfo.java b/group01/765324639/src/main/java/minijvm/constant/NullConstantInfo.java index 88eb702f4b..09f5c4f280 100644 --- a/group01/765324639/src/main/java/minijvm/constant/NullConstantInfo.java +++ b/group01/765324639/src/main/java/minijvm/constant/NullConstantInfo.java @@ -9,5 +9,10 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + // 占位类,不需访问 + throw new RuntimeException("此类不应访问到,代码中应该有问题"); + } } diff --git a/group01/765324639/src/main/java/minijvm/constant/StringInfo.java b/group01/765324639/src/main/java/minijvm/constant/StringInfo.java index 915652a93c..21d586fad9 100644 --- a/group01/765324639/src/main/java/minijvm/constant/StringInfo.java +++ b/group01/765324639/src/main/java/minijvm/constant/StringInfo.java @@ -24,5 +24,10 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } } diff --git a/group01/765324639/src/main/java/minijvm/constant/UTF8Info.java b/group01/765324639/src/main/java/minijvm/constant/UTF8Info.java index 1af71e8e9c..8b90c8e5fb 100644 --- a/group01/765324639/src/main/java/minijvm/constant/UTF8Info.java +++ b/group01/765324639/src/main/java/minijvm/constant/UTF8Info.java @@ -1,33 +1,43 @@ package minijvm.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; - } - @Override +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; + } + + @Override 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; - } - - + 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; + } + + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } } diff --git a/group01/765324639/src/main/java/minijvm/print/ClassFilePrinter.java b/group01/765324639/src/main/java/minijvm/print/ClassFilePrinter.java index c5c4898b29..6ca5063b8b 100644 --- a/group01/765324639/src/main/java/minijvm/print/ClassFilePrinter.java +++ b/group01/765324639/src/main/java/minijvm/print/ClassFilePrinter.java @@ -1,45 +1,49 @@ package minijvm.print; +import java.io.File; + import minijvm.clz.ClassFile; +import minijvm.constant.ConstantInfo.Visitor; import minijvm.loader.ClassFileLoader; public class ClassFilePrinter { - ClassFile clzFile = null; - public ClassFilePrinter(ClassFile clzFile){ - this.clzFile = clzFile; - } - - public void print(){ - - if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag : public "); - } - System.out.println("Class Name:"+ clzFile.getClassName()); - - System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMinorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - cnstPoolPrinter.print(); - - - - - } - - public static void main(String[] args) throws ClassNotFoundException{ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "com.coderising.jvm.test.EmployeeV1"; - - ClassFile clzFile = loader.loadClass(className); - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } + ClassFile clzFile = null; + + public ClassFilePrinter(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public void print(Visitor visitor) { + + if (clzFile.getAccessFlag().isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name:" + clzFile.getClassName()); + + System.out.println("Super Class Name:" + clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMajorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(visitor); + + + + } + + public static void main(String[] args) throws ClassNotFoundException { + String path = new File(".", "target\\test-classes").getAbsolutePath(); + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "minijvm.loader.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + Visitor visitor = new JavapPrintVisitor(); + printer.print(visitor); + } } diff --git a/group01/765324639/src/main/java/minijvm/print/ConstantPoolPrinter.java b/group01/765324639/src/main/java/minijvm/print/ConstantPoolPrinter.java index 573b4e8e46..34ce6ba488 100644 --- a/group01/765324639/src/main/java/minijvm/print/ConstantPoolPrinter.java +++ b/group01/765324639/src/main/java/minijvm/print/ConstantPoolPrinter.java @@ -1,5 +1,7 @@ package minijvm.print; +import minijvm.constant.ConstantInfo; +import minijvm.constant.ConstantInfo.Visitor; import minijvm.constant.ConstantPool; public class ConstantPoolPrinter { @@ -7,11 +9,16 @@ public class ConstantPoolPrinter { ConstantPoolPrinter(ConstantPool pool){ this.pool = pool; } - public void print(){ + public void print(Visitor visitor){ System.out.println("Constant Pool:"); - + int size = pool.getSize(); + System.out.println("size:" + size); + for (int i = 1; i <= size; i++) { + ConstantInfo constantInfo = pool.getConstantInfo(i); + constantInfo.accept(visitor); + } } diff --git a/group01/765324639/src/main/java/minijvm/print/JavapPrintVisitor.java b/group01/765324639/src/main/java/minijvm/print/JavapPrintVisitor.java new file mode 100644 index 0000000000..f080171ebc --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/print/JavapPrintVisitor.java @@ -0,0 +1,93 @@ +package minijvm.print; + +import minijvm.constant.ClassInfo; +import minijvm.constant.ConstantInfo.Visitor; +import minijvm.constant.FieldRefInfo; +import minijvm.constant.MethodRefInfo; +import minijvm.constant.NameAndTypeInfo; +import minijvm.constant.StringInfo; +import minijvm.constant.UTF8Info; + +public class JavapPrintVisitor implements Visitor{ + + private int index = 1; + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder builder = new StringBuilder(); + builder.append(getThisIndexOfPrefix(index++)) + .append(getMid("Class")) + .append("#" + info.getUtf8Index()); + System.out.println(builder.toString()); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder builder = new StringBuilder(); + builder.append(getThisIndexOfPrefix(index++)) + .append(getMid("Fieldref")) + .append("#" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); + System.out.println(builder.toString()); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder builder = new StringBuilder(); + builder.append(getThisIndexOfPrefix(index++)) + .append(getMid("Methodref")) + .append("#" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); + System.out.println(builder.toString()); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder builder = new StringBuilder(); + builder.append(getThisIndexOfPrefix(index++)) + .append(getMid("NameAndType")) + .append("#" + info.getIndex1() + ":#" + info.getIndex2()); + System.out.println(builder.toString()); + } + + @Override + public void visitString(StringInfo info) { + StringBuilder builder = new StringBuilder(); + builder.append(getThisIndexOfPrefix(index++)) + .append(getMid("String")) + .append("#" + info.getIndex()); + System.out.println(builder.toString()); + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder builder = new StringBuilder(); + builder.append(getThisIndexOfPrefix(index++)) + .append(getMid("Utf8")) + .append(info.getValue()); + System.out.println(builder.toString()); + } + + private String getThisIndexOfPrefix(int index) { + if (index < 1) { + throw new IllegalArgumentException("错误的索引"); + } + + if (index < 10) { + return " #" + index + " = "; + } else if (index < 100) { + return " #" + index + " = "; + } else if (index < 1000) { + return " #" + index + " = "; + } else { + throw new IllegalArgumentException("还没有实现" + index + "个常量的打印"); + } + } + + private String getMid(String type) { + if (type.length() >= 19) { + return type; + } + String str = " "; + int length = type.length(); + return type + str.substring(length); + } +} From e334b646e9bcf342e7bf1bd2f3ef5190dab83d40 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Thu, 20 Apr 2017 15:50:44 +0800 Subject: [PATCH 207/552] =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E6=AC=A1jvm=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/jvm/cmd/TwoOperandCmd.java | 2 - .../coding/basic/stack/expr/FixExprUtil.java | 81 -------- .../coding/basic/stack/expr/InfixExpr.java | 3 + .../basic/stack/expr/InfixToPostfix.java | 56 ------ .../coding/basic/stack/expr/PostfixExpr.java | 3 + .../coding/basic/stack/expr/PrefixExpr.java | 3 + .../stack/expr/{ => util}/ExprIterator.java | 3 +- .../basic/stack/expr/util/FixExprUtil.java | 174 ++++++++++++++++++ .../basic/stack/expr/{ => util}/Operator.java | 13 +- 9 files changed, 195 insertions(+), 143 deletions(-) delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/FixExprUtil.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixToPostfix.java rename group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/{ => util}/ExprIterator.java (86%) create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java rename group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/{ => util}/Operator.java (69%) diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java index 334eec9f98..6cb42d2a83 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -2,7 +2,6 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.MethodRefInfo; @@ -49,7 +48,6 @@ protected String getOperandAsClassInfo(ConstantPool pool){ protected String getOperandAsMethod(ConstantPool pool){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/FixExprUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/FixExprUtil.java deleted file mode 100644 index 0477bce3ec..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/FixExprUtil.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.List; -import com.coding.basic.array.ArrayList; - -public class FixExprUtil { - - /** - * 运算 - * @param a 数字 - * @param oper 运算符 - * @param b 数字 - * @return - */ - public static float calculate(float a,Operator oper,float b) { - - String operFlag = oper.getFlag(); - - float res = 0f; - if (Operator.ADD.getFlag().equals(operFlag)) { - res = a + b; - } else if (Operator.SUB.getFlag().equals(operFlag)) { - res = a - b; - } else if (Operator.MULTY.getFlag().equals(operFlag)) { - res = a * b; - } else if (Operator.DIVIDE.getFlag().equals(operFlag)) { - res = a / b; - } - return res; - } - - /** - * 将字符串顺序逆置 - * @param str - * @return - */ - public static String reverse(String expr){ - - return new StringBuffer(expr).reverse().toString(); - } - - /** - * 将表达式字符串转换为List - * @param expr - * @return - */ - public static List FixExprToArray(String expr){ - - List ls = new ArrayList<>(); - - String[] strArr = expr.split(" "); - for (String str : strArr) { - parse(str,ls); - } - - return ls; - } - - public static void parse(String str,List ls){ - - char[] chr = str.toCharArray(); - StringBuilder token = new StringBuilder(); - - for (char c : chr) { - if(Operator.contains(c+"")){ - if(!"".equals(token.toString())){ - ls.add(token.toString()); - token = new StringBuilder(); - } - ls.add(c+""); - }else{ - token.append(c); - } - } - if(!"".equals(token.toString())){ - ls.add(token.toString()); - } - - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java index 0ee14605fc..a02d03c861 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java @@ -2,6 +2,9 @@ import com.coding.basic.stack.Stack; import com.coding.basic.stack.StackUtil; +import com.coding.basic.stack.expr.util.ExprIterator; +import com.coding.basic.stack.expr.util.FixExprUtil; +import com.coding.basic.stack.expr.util.Operator; public class InfixExpr { diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixToPostfix.java deleted file mode 100644 index 02aa5b5bff..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.Stack; -import com.coding.basic.stack.StackUtil; - -public class InfixToPostfix { - - public static String convert(String expr) { - - ExprIterator it = new ExprIterator(expr); - - Stack s1 = new Stack<>(); - - Stack s2 = new Stack<>(); - - int preLevel,thisLevel; - - while(it.hasNext()){ - - String element = it.next(); - if(Operator.contains(element)){//运算符 - while(true){ - if(s1.isEmpty()){ - s1.push(element); - break; - }else{ - preLevel = Operator.getLevelByFlag(s1.peek()); - thisLevel = Operator.getLevelByFlag(element); - if(thisLevel>preLevel){ - s1.push(element); - break; - }else{ - s2.push(s1.pop()); - } - } - } - }else{ - s2.push(element); - } - } - - while(!s1.isEmpty()){ - s2.push(s1.pop()); - } - StackUtil.reverse(s2); - return s2.toString(); - } - - public static void main(String[] args) { - - String a = "9+(3-1)*3+10/2"; - String post = InfixToPostfix.convert(a); - System.out.println(post); - - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java index b406bc3ead..cdd7605635 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -1,6 +1,9 @@ package com.coding.basic.stack.expr; import com.coding.basic.stack.Stack; +import com.coding.basic.stack.expr.util.ExprIterator; +import com.coding.basic.stack.expr.util.FixExprUtil; +import com.coding.basic.stack.expr.util.Operator; public class PostfixExpr { diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java index a11e9a13ba..4a0b025cfe 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -1,6 +1,9 @@ package com.coding.basic.stack.expr; import com.coding.basic.stack.Stack; +import com.coding.basic.stack.expr.util.ExprIterator; +import com.coding.basic.stack.expr.util.FixExprUtil; +import com.coding.basic.stack.expr.util.Operator; public class PrefixExpr { diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/ExprIterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java similarity index 86% rename from group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/ExprIterator.java rename to group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java index 513cc901fb..59efc0907d 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/ExprIterator.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java @@ -1,9 +1,8 @@ -package com.coding.basic.stack.expr; +package com.coding.basic.stack.expr.util; import com.coding.basic.List; import com.coding.basic.array.ArrayList; - /** * 表达式迭代器 * @author zj diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java new file mode 100644 index 0000000000..4f431f219d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java @@ -0,0 +1,174 @@ +package com.coding.basic.stack.expr.util; + +import java.util.regex.Pattern; + +import com.coding.basic.List; +import com.coding.basic.array.ArrayList; +import com.coding.basic.stack.Stack; + +public class FixExprUtil { + + private static String LEFTBRACKRT= "("; + private static String RIGHTBRACKET= ")"; + + /** + * 运算 + * @param a 数字 + * @param oper 运算符 + * @param b 数字 + * @return + */ + public static float calculate(float a,Operator oper,float b) { + + String operFlag = oper.getFlag(); + + float res = 0f; + if (Operator.ADD.getFlag().equals(operFlag)) { + res = a + b; + } else if (Operator.SUB.getFlag().equals(operFlag)) { + res = a - b; + } else if (Operator.MULTY.getFlag().equals(operFlag)) { + res = a * b; + } else if (Operator.DIVIDE.getFlag().equals(operFlag)) { + res = a / b; + } + return res; + } + + /** + * 将字符串顺序逆置 + * @param str + * @return + */ + public static String reverse(String expr){ + + return new StringBuffer(expr).reverse().toString(); + } + + /** + * 判断字符串是否为数字 + * 注意:不包括小数 + * @param str + * @return + */ + public static boolean isNumeric(String str){ + Pattern pattern = Pattern.compile("[0-9]*"); + return pattern.matcher(str).matches(); + } + + /** + * 将中缀表达式装换为后缀表达式 + * @param expr + * @return + */ + public static String InfixCovertToPostfix(String expr){ + + ExprIterator it = new ExprIterator(expr); + Stack stack = new Stack<>(); + List postFixList = new ArrayList(); + + while(it.hasNext()){ + + String element = it.next(); + //数字直接输出 + if(FixExprUtil.isNumeric(element)){ + postFixList.add(element); + }else if(RIGHTBRACKET.equals(element)){//去除左右括号 + do { + postFixList.add(stack.pop()); + } while (!LEFTBRACKRT.equals(stack.pop())); + }else{ + int preLevel = 0; + int thisLevel = Operator.getLevelByFlag(element); + //当栈顶运算符优先级大于本次运算优先级时(左括号除外)出栈至栈顶优先级小于本次运算优先级 + while(preLevel>thisLevel&&preLevel!=3&&!stack.isEmpty()){ + String oprFlag = stack.pop(); + preLevel = Operator.getLevelByFlag(oprFlag); + postFixList.add(oprFlag); + } + stack.push(element); + } + + } + //将栈中剩余元素出栈 + while(!stack.isEmpty()){ + postFixList.add(stack.pop()); + } + //格式化输出 + StringBuffer postFix = new StringBuffer(); + for (int i = 0; i < postFixList.size(); i++) { + postFix.append(postFixList.get(i)+" "); + } + return postFix.toString(); + } + + /** + * 中缀表达式转前缀表达式 + * @param expr + * @return + */ + public static String InfixCovertToPrefix(String expr){ + + String post = InfixCovertToPostfix(expr); + return reverse(post); + } + + /** + * 后缀表达式转前缀表达式 + * @param expr + * @return + */ + public static String postfixCovertToPrefix(String expr){ + return reverse(expr); + } + + /** + * 前缀表达式转后缀表达式 + * @param expr + * @return + */ + public static String prefixCovertToPostfix(String expr){ + return reverse(expr); + } + + /** + * 将表达式字符串转换为List + * @param expr + * @return + */ + public static List FixExprToArray(String expr){ + + List ls = new ArrayList<>(); + + String[] strArr = expr.split(" "); + for (String str : strArr) { + parse(str,ls); + } + + return ls; + } + + public static void parse(String str,List ls){ + + char[] chr = str.toCharArray(); + StringBuilder token = new StringBuilder(); + + for (char c : chr) { + String element = String.valueOf(c); + if(Operator.contains(element)){ + if(!"".equals(token.toString())){ + ls.add(token.toString()); + token = new StringBuilder(); + } + ls.add(c+""); + }else{ + token.append(c); + } + } + if(!"".equals(token.toString())){ + ls.add(token.toString()); + } + + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java similarity index 69% rename from group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java rename to group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java index f6de250fc4..3e76c3b805 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/Operator.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java @@ -1,8 +1,9 @@ -package com.coding.basic.stack.expr; +package com.coding.basic.stack.expr.util; public enum Operator { - ADD("+",1),SUB("-",1),MULTY("*",2),DIVIDE("/",2); + ADD("+",1),SUB("-",1),MULTY("*",2),DIVIDE("/",2) + ,LEFTBRACKRT("(",3),RIGHTBRACKET(")",3); private String flag; private int level; @@ -33,6 +34,10 @@ public static Operator getOperator(String flag){ return MULTY; }else if(DIVIDE.flag.equals(flag)){ return DIVIDE; + }else if(LEFTBRACKRT.flag.equals(flag)){ + return LEFTBRACKRT; + }else if(RIGHTBRACKET.flag.equals(flag)){ + return RIGHTBRACKET; } return null; } @@ -47,6 +52,10 @@ public static boolean contains(String flag){ return true; }else if(DIVIDE.flag.equals(flag)){ return true; + }else if(LEFTBRACKRT.flag.equals(flag)){ + return true; + }else if(RIGHTBRACKET.flag.equals(flag)){ + return true; } return false; } From f2b5091074dc3673af9cd4cc64ca06dab3636e91 Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Thu, 20 Apr 2017 16:49:56 +0800 Subject: [PATCH 208/552] homework complete! --- .../jvm/print/ClassFilePrinter.java | 4 +- .../jvm/print/ConstantPoolPrinter.java | 43 ++++++++++++++----- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java index ee99162a4d..e0be352da4 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -14,11 +14,11 @@ public ClassFilePrinter(ClassFile clzFile){ public void print(){ if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag : public "); + System.out.println("Access flag:public "); } System.out.println("Class Name:"+ clzFile.getClassName()); - System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + System.out.println("Super ClassName:"+ clzFile.getSuperClassName()); System.out.println("minor version:" + clzFile.getMinorVersion()); diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java index 9abd6ca1ed..f2327a8029 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -24,7 +24,7 @@ public void print(){ @Override public void visitString(StringInfo info) { StringBuilder buffer = new StringBuilder(); - buffer.append("String #").append(info.getIndex()); + buffer.append(printConsName("string")).append("#"+info.getIndex()); System.out.println(buffer); } @@ -32,7 +32,7 @@ public void visitString(StringInfo info) { @Override public void visitNameAndType(NameAndTypeInfo info) { StringBuilder buffer = new StringBuilder(); - buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + buffer.append(printConsName("NameAndType")).append("#"+info.getIndex1()).append(":#") .append(info.getIndex2()); System.out.println(buffer); @@ -41,7 +41,7 @@ public void visitNameAndType(NameAndTypeInfo info) { @Override public void visitMethodRef(MethodRefInfo info) { StringBuilder buffer = new StringBuilder(); - buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + buffer.append(printConsName("MethodRef")).append("#"+info.getClassInfoIndex()).append(".#") .append(info.getNameAndTypeIndex()); System.out.println(buffer); @@ -50,7 +50,7 @@ public void visitMethodRef(MethodRefInfo info) { @Override public void visitFieldRef(FieldRefInfo info) { StringBuilder buffer = new StringBuilder(); - buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + buffer.append(printConsName("FieldRef")).append("#"+info.getClassInfoIndex()).append(".#") .append(info.getNameAndTypeIndex()); System.out.println(buffer); @@ -59,7 +59,7 @@ public void visitFieldRef(FieldRefInfo info) { @Override public void visitClassInfo(ClassInfo info) { StringBuilder buffer = new StringBuilder(); - buffer.append("Class #").append(info.getUtf8Index()) + buffer.append(printConsName("Class")).append("#"+info.getUtf8Index()) .append(" ").append(info.getClassName()); System.out.println(buffer); @@ -69,23 +69,44 @@ public void visitClassInfo(ClassInfo info) { @Override public void visistUTF8(UTF8Info info) { StringBuilder buffer = new StringBuilder(); - buffer.append("UTF8 ").append(info.getValue()); + buffer.append(printConsName("UTF8")).append(info.getValue()); System.out.println(buffer); } }; - for(int i=1; i<=pool.getSize(); i++){ + int size = pool.getSize(); + for(int i=1; i<=size; i++){ ConstantInfo constantInfo = pool.getConstantInfo(i); - System.out.print("#"+i+"="); + String space = genaralSpace(size,i); + System.out.print(space+"#"+i+"="); constantInfo.accept(visitor); } } - private void printSpaceAfterConsName(String consBeforStr){ + private String genaralSpace(int size,int i){ - String bashStr = (pool.getSize()+1)+"="+"NameAndType "; + int s1 = String.valueOf(size).length();//数字的位数 + int s2 = String.valueOf(i).length();//数字的位数 + StringBuffer str = new StringBuffer(); + for (int j = 0; j < s1-s2; j++) { + str.append(" "); + } + return str.toString(); + } + + /** + * 输出常量名称后面的空格 + * @param consBeforStr + */ + private String printConsName(String consName){ + + String bashStr = "NameAndType"; int bashLen = bashStr.length(); - int offset = bashLen-consBeforStr.length(); + int offset = bashLen-consName.length(); + for (int i = 0; i < offset; i++) { + consName+= " "; + } + return consName+" "; } } From 8e1a1ea91010bdff6d9bba53bacbb72239a0fc76 Mon Sep 17 00:00:00 2001 From: Haochen Date: Thu, 20 Apr 2017 17:21:10 +0800 Subject: [PATCH 209/552] move InfixExpr --- .../src/main/java/algorithm/{ => expression}/InfixExpr.java | 2 +- .../src/test/java/algorithm/{ => expression}/InfixExprTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename group01/895457260/code/src/main/java/algorithm/{ => expression}/InfixExpr.java (99%) rename group01/895457260/code/src/test/java/algorithm/{ => expression}/InfixExprTest.java (96%) diff --git a/group01/895457260/code/src/main/java/algorithm/InfixExpr.java b/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java similarity index 99% rename from group01/895457260/code/src/main/java/algorithm/InfixExpr.java rename to group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java index 1ddb740364..ad4fae505b 100644 --- a/group01/895457260/code/src/main/java/algorithm/InfixExpr.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java @@ -1,4 +1,4 @@ -package algorithm; +package algorithm.expression; import datastructure.basic.Stack; diff --git a/group01/895457260/code/src/test/java/algorithm/InfixExprTest.java b/group01/895457260/code/src/test/java/algorithm/expression/InfixExprTest.java similarity index 96% rename from group01/895457260/code/src/test/java/algorithm/InfixExprTest.java rename to group01/895457260/code/src/test/java/algorithm/expression/InfixExprTest.java index 34480d6db7..e4c63b79f7 100644 --- a/group01/895457260/code/src/test/java/algorithm/InfixExprTest.java +++ b/group01/895457260/code/src/test/java/algorithm/expression/InfixExprTest.java @@ -1,4 +1,4 @@ -package algorithm; +package algorithm.expression; import org.junit.After; import org.junit.Assert; From cf675c2bf01efb2f79dc25920694e28ee375c7e0 Mon Sep 17 00:00:00 2001 From: Haochen Date: Thu, 20 Apr 2017 17:22:55 +0800 Subject: [PATCH 210/552] finish byte code command parsing --- .../java/jvm/command/CommandIterator.java | 29 +++++ .../main/java/jvm/command/CommandParser.java | 79 ++++++++++++ .../jvm/command/item/ByteCodeCommand.java | 117 ++++++++++++++++++ .../java/jvm/command/item/NoOperandCmd.java | 24 ++++ .../java/jvm/command/item/OneOperandCmd.java | 30 +++++ .../java/jvm/command/item/TwoOperandCmd.java | 74 +++++++++++ .../java/jvm/command/item/impl/ALoad0Cmd.java | 20 +++ .../java/jvm/command/item/impl/ALoad1Cmd.java | 20 +++ .../java/jvm/command/item/impl/ALoad2Cmd.java | 20 +++ .../java/jvm/command/item/impl/ALoad3Cmd.java | 20 +++ .../jvm/command/item/impl/AStore0Cmd.java | 20 +++ .../jvm/command/item/impl/AStore1Cmd.java | 20 +++ .../jvm/command/item/impl/AStore2Cmd.java | 20 +++ .../jvm/command/item/impl/AStore3Cmd.java | 20 +++ .../java/jvm/command/item/impl/BiPushCmd.java | 17 +++ .../java/jvm/command/item/impl/DupCmd.java | 20 +++ .../jvm/command/item/impl/GetFieldCmd.java | 20 +++ .../jvm/command/item/impl/GetStaticCmd.java | 19 +++ .../java/jvm/command/item/impl/ILoad0Cmd.java | 20 +++ .../java/jvm/command/item/impl/ILoad1Cmd.java | 20 +++ .../java/jvm/command/item/impl/ILoad2Cmd.java | 20 +++ .../java/jvm/command/item/impl/ILoad3Cmd.java | 20 +++ .../command/item/impl/InvokeSpecialCmd.java | 17 +++ .../command/item/impl/InvokeVirtualCmd.java | 17 +++ .../java/jvm/command/item/impl/LdcCmd.java | 27 ++++ .../java/jvm/command/item/impl/NewCmd.java | 19 +++ .../jvm/command/item/impl/PutFieldCmd.java | 18 +++ .../java/jvm/command/item/impl/ReturnCmd.java | 20 +++ 28 files changed, 787 insertions(+) create mode 100644 group01/895457260/code/src/main/java/jvm/command/CommandIterator.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/CommandParser.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/NoOperandCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/OneOperandCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/TwoOperandCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad0Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad1Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad2Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad3Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/AStore0Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/AStore1Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/AStore2Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/AStore3Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/BiPushCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/GetFieldCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad0Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad1Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad2Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad3Cmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeVirtualCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/LdcCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/NewCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/ReturnCmd.java diff --git a/group01/895457260/code/src/main/java/jvm/command/CommandIterator.java b/group01/895457260/code/src/main/java/jvm/command/CommandIterator.java new file mode 100644 index 0000000000..8fb8716c23 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/CommandIterator.java @@ -0,0 +1,29 @@ +package jvm.command; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class CommandIterator { + private String codes = null; + private int pos = 0; + + public CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/CommandParser.java b/group01/895457260/code/src/main/java/jvm/command/CommandParser.java new file mode 100644 index 0000000000..be794b07ed --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/CommandParser.java @@ -0,0 +1,79 @@ +package jvm.command; + +import jvm.classfile.ClassFile; +import jvm.command.item.ByteCodeCommand; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; + +public class CommandParser { + public static final String ACONST_NULL = "01"; + public static final String NEW_OBJECT = "BB"; + public static final String LSTORE = "37"; + public static final String INVOKESPECIAL = "B7"; + public static final String INVOKEVIRTUAL = "B6"; + public static final String GETFIELD = "B4"; + public static final String PUTFIELD = "B5"; + public static final String GETSTATIC = "B2"; + public static final String LDC = "12"; + public static final String DUP = "59"; + public static final String BIPUSH = "10"; + public static final String ALOAD_0 = "2A"; + public static final String ALOAD_1 = "2B"; + public static final String ALOAD_2 = "2C"; + public static final String ILOAD = "15"; + public static final String ILOAD_1 = "1B"; + public static final String ILOAD_2 = "1C"; + public static final String ILOAD_3 = "1D"; + public static final String FLOAD_3 = "25"; + + public static final String VOIDRETURN = "B1"; + public static final String IRETURN = "AC"; + public static final String FRETURN = "AE"; + + public static final String ASTORE_1 = "4C"; + public static final String IF_ICMP_GE = "A2"; + public static final String IF_ICMPLE = "A4"; + public static final String GOTO_NO_CONDITION = "A7"; + public static final String ICONST_0 = "03"; + public static final String ICONST_1 = "04"; + public static final String ISTORE_1 = "3C"; + public static final String ISTORE_2 = "3D"; + public static final String IADD = "60"; + public static final String IINC = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + String packageName = CommandParser.class.getPackage().getName() + ".item.impl."; + CommandIterator iterator = new CommandIterator(codes); + List commands = new ArrayList<>(); + try { + while (iterator.hasNext()) { + String opCode = iterator.next2CharAsString().toUpperCase(); + String cmdClassName = packageName + + ByteCodeCommand.codeMap.get(opCode).replaceAll("_", "") + + "Cmd"; + Class clazz = Class.forName(cmdClassName); + Constructor constructor = clazz.getConstructor( + ClassFile.class, String.class, CommandIterator.class); + + ByteCodeCommand command = (ByteCodeCommand) constructor.newInstance(clzFile, opCode, iterator); + commands.add(command); + } + } catch (ClassNotFoundException | NoSuchMethodException + | IllegalAccessException | InvocationTargetException | InstantiationException e) { + e.printStackTrace(); + } + calculateOffset(commands); + return commands.toArray(new ByteCodeCommand[commands.size()]); + } + + private static void calculateOffset(List commands) { + int offset = 0; + for (ByteCodeCommand cmd : commands) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java b/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java new file mode 100644 index 0000000000..b5276f526c --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java @@ -0,0 +1,117 @@ +package jvm.command.item; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.Constant; +import jvm.command.CommandIterator; + +import java.util.HashMap; +import java.util.Map; + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + public static Map codeMap = new HashMap<>(); + + static { + codeMap.put("01", "AConst_Null"); + + codeMap.put("BB", "New"); + codeMap.put("37", "LStore"); + codeMap.put("B7", "InvokeSpecial"); + codeMap.put("B6", "InvokeVirtual"); + codeMap.put("B4", "GetField"); + codeMap.put("B5", "PutField"); + codeMap.put("B2", "GetStatic"); + + codeMap.put("2A", "ALoad_0"); + codeMap.put("2B", "ALoad_1"); + codeMap.put("2C", "ALoad_2"); + + codeMap.put("10", "BiPush"); + codeMap.put("15", "ILoad"); + codeMap.put("1A", "ILoad_0"); + codeMap.put("1B", "ILoad_1"); + codeMap.put("1C", "ILoad_2"); + codeMap.put("1D", "ILoad_3"); + + codeMap.put("25", "FLoad_3"); + + codeMap.put("1E", "LLoad_0"); + + codeMap.put("24", "FLoad_2"); + codeMap.put("4C", "AStore_1"); + + codeMap.put("A2", "If_Icmp_Ge"); + codeMap.put("A4", "If_Icmple"); + + codeMap.put("A7", "GoTo"); + + codeMap.put("B1", "Return"); + codeMap.put("AC", "IReturn"); + codeMap.put("AE", "FReturn"); + + codeMap.put("03", "IConst_0"); + codeMap.put("04", "IConst_1"); + + codeMap.put("3C", "IStore_1"); + codeMap.put("3D", "IStore_2"); + + codeMap.put("59", "Dup"); + + codeMap.put("60", "IAdd"); + codeMap.put("84", "IInc"); + + codeMap.put("12", "Ldc"); + } + + ByteCodeCommand(ClassFile clzFile, String opCode, CommandIterator iterator) { + this.clzFile = clzFile; + this.opCode = opCode; + initOperands(iterator); + } + + protected abstract void initOperands(CommandIterator iterator); + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + protected Constant getConstantInfo(int index) { + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool() { + return this.getClassFile().getConstantPool(); + } + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + public String toString() { + return opCode; + } + + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText() { + String txt = codeMap.get(opCode); + return txt == null ? opCode : txt.toLowerCase(); + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/NoOperandCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/NoOperandCmd.java new file mode 100644 index 0000000000..9ab8abd4b5 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/NoOperandCmd.java @@ -0,0 +1,24 @@ +package jvm.command.item; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; + +public abstract class NoOperandCmd extends ByteCodeCommand { + + public NoOperandCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + protected void initOperands(CommandIterator iterator) {} + + @Override + public String toString(ConstantPool pool) { + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); + } + + public int getLength() { + return 1; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/OneOperandCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/OneOperandCmd.java new file mode 100644 index 0000000000..8ae6926cc6 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/OneOperandCmd.java @@ -0,0 +1,30 @@ +package jvm.command.item; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + protected int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + protected void initOperands(CommandIterator iterator) { + setOperand(iterator.next2CharAsInt()); + } + + public int getOperand() { + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + } + + public int getLength() { + return 2; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/TwoOperandCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/TwoOperandCmd.java new file mode 100644 index 0000000000..53dbd84b39 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/TwoOperandCmd.java @@ -0,0 +1,74 @@ +package jvm.command.item; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.impl.ClassInfo; +import jvm.classfile.constant.item.impl.FieldRefInfo; +import jvm.classfile.constant.item.impl.MethodRefInfo; +import jvm.command.CommandIterator; + +public abstract class TwoOperandCmd extends ByteCodeCommand { + + protected int operand1; + protected int operand2; + + public int getOperand1() { + return operand1; + } + + public void setOperand1(int operand1) { + this.operand1 = operand1; + } + + public void setOperand2(int operand2) { + this.operand2 = operand2; + } + + public int getOperand2() { + return operand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + protected void initOperands(CommandIterator iterator) { + setOperand1(iterator.next2CharAsInt()); + setOperand2(iterator.next2CharAsInt()); + } + + public int getIndex() { + int operand1 = this.getOperand1(); + int operand2 = this.getOperand2(); + return operand1 << 8 | operand2; + } + + protected String getOperandAsClassInfo(ConstantPool pool) { + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo) pool.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool) { + int index = getIndex(); + String codeTxt = getReadableCodeText(); + Constant constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo) this.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + } + + protected String getOperandAsField(ConstantPool pool) { + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + } + + public int getLength() { + return 3; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad0Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad0Cmd.java new file mode 100644 index 0000000000..9673b3f441 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad0Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ALoad0Cmd extends NoOperandCmd { + public ALoad0Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad1Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad1Cmd.java new file mode 100644 index 0000000000..549602b291 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad1Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ALoad1Cmd extends NoOperandCmd { + public ALoad1Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad2Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad2Cmd.java new file mode 100644 index 0000000000..12dc0c6088 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad2Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ALoad2Cmd extends NoOperandCmd { + public ALoad2Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad3Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad3Cmd.java new file mode 100644 index 0000000000..2c151b2de2 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad3Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ALoad3Cmd extends NoOperandCmd { + public ALoad3Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore0Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore0Cmd.java new file mode 100644 index 0000000000..71909a5a22 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore0Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class AStore0Cmd extends NoOperandCmd { + public AStore0Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore1Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore1Cmd.java new file mode 100644 index 0000000000..379da9077c --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore1Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class AStore1Cmd extends NoOperandCmd { + public AStore1Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore2Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore2Cmd.java new file mode 100644 index 0000000000..b11cf64bac --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore2Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class AStore2Cmd extends NoOperandCmd { + public AStore2Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore3Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore3Cmd.java new file mode 100644 index 0000000000..eedd211522 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore3Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class AStore3Cmd extends NoOperandCmd { + public AStore3Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/BiPushCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/BiPushCmd.java new file mode 100644 index 0000000000..da2b176cb4 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/BiPushCmd.java @@ -0,0 +1,17 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; +import jvm.command.item.OneOperandCmd; + +public class BiPushCmd extends OneOperandCmd { + public BiPushCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java new file mode 100644 index 0000000000..d9d02922fb --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class DupCmd extends NoOperandCmd { + public DupCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/GetFieldCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetFieldCmd.java new file mode 100644 index 0000000000..e0e4701bc3 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetFieldCmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsField(pool); + } + + +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java new file mode 100644 index 0000000000..16959b04e0 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java @@ -0,0 +1,19 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; + +public class GetStaticCmd extends TwoOperandCmd { + + public GetStaticCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsField(pool); + } + +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad0Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad0Cmd.java new file mode 100644 index 0000000000..c02449abb8 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad0Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ILoad0Cmd extends NoOperandCmd { + public ILoad0Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad1Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad1Cmd.java new file mode 100644 index 0000000000..ee35698dce --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad1Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ILoad1Cmd extends NoOperandCmd { + public ILoad1Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad2Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad2Cmd.java new file mode 100644 index 0000000000..1f0962b1a8 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad2Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ILoad2Cmd extends NoOperandCmd { + public ILoad2Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad3Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad3Cmd.java new file mode 100644 index 0000000000..dd64684d1a --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad3Cmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ILoad3Cmd extends NoOperandCmd { + public ILoad3Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java new file mode 100644 index 0000000000..3bc0281582 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java @@ -0,0 +1,17 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; + +public class InvokeSpecialCmd extends TwoOperandCmd { + public InvokeSpecialCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsMethod(pool); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeVirtualCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c5809c1ea8 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeVirtualCmd.java @@ -0,0 +1,17 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; + +public class InvokeVirtualCmd extends TwoOperandCmd { + public InvokeVirtualCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsMethod(pool); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/LdcCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/LdcCmd.java new file mode 100644 index 0000000000..73e7aa8f8e --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/LdcCmd.java @@ -0,0 +1,27 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.impl.StringInfo; +import jvm.command.CommandIterator; +import jvm.command.item.OneOperandCmd; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + Constant info = pool.getConstantInfo(this.getOperand()); + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + value = strInfo.toString(); + } + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; + } + +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/NewCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/NewCmd.java new file mode 100644 index 0000000000..67a598a624 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/NewCmd.java @@ -0,0 +1,19 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; + +public class NewCmd extends TwoOperandCmd { + + public NewCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java new file mode 100644 index 0000000000..58628d8dff --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java @@ -0,0 +1,18 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsField(pool); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ReturnCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ReturnCmd.java new file mode 100644 index 0000000000..cc46fe4caa --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ReturnCmd.java @@ -0,0 +1,20 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class ReturnCmd extends NoOperandCmd { + public ReturnCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } +} From d50051f74762dcca8f264996bda300972bf47f7c Mon Sep 17 00:00:00 2001 From: Haochen Date: Thu, 20 Apr 2017 17:24:40 +0800 Subject: [PATCH 211/552] finish byte code command parsing --- .../main/java/jvm/classfile/ClassFile.java | 19 +++- .../main/java/jvm/classfile/ClassParser.java | 2 +- .../attribute/item/AttributeInfo.java | 2 +- .../attribute/item/impl/CodeAttr.java | 2 +- .../java/jvm/classfile/method/Method.java | 30 ++++- .../src/main/java/jvm/util/ByteUtils.java | 4 +- .../test/java/jvm/ClassFileLoaderTest.java | 107 ++++++++++++++---- 7 files changed, 133 insertions(+), 33 deletions(-) diff --git a/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java b/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java index 41f983a086..377b198035 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java @@ -1,6 +1,5 @@ package jvm.classfile; - import jvm.classfile.attribute.item.AttributeInfo; import jvm.classfile.constant.item.impl.ClassInfo; import jvm.classfile.field.Field; @@ -24,6 +23,10 @@ public class ClassFile { List methods = new ArrayList<>(); List attributes = new ArrayList<>(); + + public AccessFlag getAccessFlag() { + return accessFlag; + } public List getInterfaces() { return this.interfaces; } @@ -45,13 +48,13 @@ public void print() { System.out.println("Super Class Name:"+ getSuperClassName()); } - private String getClassName() { + public String getClassName() { int thisClassIndex = this.classIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName() { + public String getSuperClassName() { ClassInfo superClass = (ClassInfo)this.getConstantPool() .getConstantInfo(this.classIndex.getSuperClassIndex()); return superClass.getClassName(); @@ -72,4 +75,14 @@ public ConstantPool getConstantPool() { public ClassIndex getClzIndex() { return classIndex; } + + public Method getMethod(String methodName, String paramAndReturnType) { + return methods.stream().filter(m -> methodName.equals(m.getName()) + && paramAndReturnType.equals(m.getParamAndReturnType())) + .findFirst().orElse(null); + } + + public Method getMainMethod() { + return getMethod("main", "([Ljava/lang/String;)V"); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java b/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java index fa3a07527d..bec7317e2c 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java @@ -98,7 +98,7 @@ private static void parseFields(ClassFile classFile, ByteCodeIterator iterator) private static void parseMethods(ClassFile classFile, ByteCodeIterator iterator) { int count = iterator.nextU2ToInt(); for (int i = 0; i < count; ++i) { - classFile.methods.add(Method.parse(iterator, classFile.constantPool)); + classFile.methods.add(Method.parse(iterator, classFile)); } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/AttributeInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/AttributeInfo.java index 595c12ac9b..7afcc1f786 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/AttributeInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/AttributeInfo.java @@ -8,7 +8,7 @@ public abstract class AttributeInfo { public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; + int attrNameIndex; int attrLen; public AttributeInfo(int attrNameIndex, int attrLen) { diff --git a/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/impl/CodeAttr.java b/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/impl/CodeAttr.java index 75c7383bd8..5ae1a8267a 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/impl/CodeAttr.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/impl/CodeAttr.java @@ -13,7 +13,7 @@ public class CodeAttr extends AttributeInfo { private List attributes = new ArrayList<>(); //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { + //public ByteCodeCommand[] getCommands() { // return cmds; //} diff --git a/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java b/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java index 6068124fa3..916a4aa32b 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java @@ -1,20 +1,25 @@ package jvm.classfile.method; +import jvm.classfile.ClassFile; import jvm.classfile.attribute.item.AttributeInfo; +import jvm.classfile.attribute.item.impl.CodeAttr; import jvm.classfile.attribute.parser.AttributeParser; import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.UTF8Info; +import jvm.command.CommandParser; +import jvm.command.item.ByteCodeCommand; import jvm.util.ByteCodeIterator; import java.util.ArrayList; import java.util.List; - public class Method { private int accessFlag; private int nameIndex; private int descriptorIndex; private ConstantPool constantPool; private List attributes = new ArrayList<>(); + private ByteCodeCommand[] commands; public Method(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool constantPool) { this.accessFlag = accessFlag; @@ -23,14 +28,19 @@ public Method(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool c this.constantPool = constantPool; } - public static Method parse(ByteCodeIterator iterator, ConstantPool constantPool) { + public static Method parse(ByteCodeIterator iterator, ClassFile classFile) { int access = iterator.nextU2ToInt(); int name = iterator.nextU2ToInt(); int descriptor = iterator.nextU2ToInt(); int attrCount = iterator.nextU2ToInt(); - Method result = new Method(access, name, descriptor, constantPool); + Method result = new Method(access, name, descriptor, classFile.getConstantPool()); for (int i = 0; i < attrCount; ++i) { - result.attributes.add(AttributeParser.parse(iterator, constantPool)); + result.attributes.add(AttributeParser.parse(iterator, classFile.getConstantPool())); + } + CodeAttr codeAttr = (CodeAttr) result.attributes.stream() + .filter(a -> a instanceof CodeAttr).findFirst().orElse(null); + if (codeAttr != null) { + result.commands = CommandParser.parse(classFile, codeAttr.getCode()); } return result; } @@ -54,4 +64,16 @@ public List getAttributes() { public int getDescriptorIndex() { return descriptorIndex; } + + public ByteCodeCommand[] getCommands() { + return commands; + } + + public String getName() { + return ((UTF8Info) getConstantPool().getConstantInfo(getNameIndex())).getValue(); + } + + public String getParamAndReturnType() { + return ((UTF8Info) getConstantPool().getConstantInfo(getDescriptorIndex())).getValue(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java b/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java index 3a0e1fc0b6..87afccab3c 100644 --- a/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java +++ b/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java @@ -8,7 +8,9 @@ public class ByteUtils { public static String toHexString(byte[] bytes, int off, int len) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < len; ++i) { - builder.append(Integer.toHexString(Byte.toUnsignedInt(bytes[off + i]))); + int uInt = Byte.toUnsignedInt(bytes[off + i]); + String hex = Integer.toHexString(uInt); + builder.append(hex.length() < 2 ? '0' + hex : hex); } return builder.toString(); } diff --git a/group01/895457260/code/src/test/java/jvm/ClassFileLoaderTest.java b/group01/895457260/code/src/test/java/jvm/ClassFileLoaderTest.java index 23a2341d8f..daaa65a680 100644 --- a/group01/895457260/code/src/test/java/jvm/ClassFileLoaderTest.java +++ b/group01/895457260/code/src/test/java/jvm/ClassFileLoaderTest.java @@ -8,6 +8,10 @@ import jvm.classfile.constant.item.impl.MethodRefInfo; import jvm.classfile.constant.item.impl.NameAndTypeInfo; import jvm.classfile.constant.item.impl.UTF8Info; +import jvm.command.item.impl.BiPushCmd; +import jvm.command.item.ByteCodeCommand; +import jvm.command.item.OneOperandCmd; +import jvm.command.item.TwoOperandCmd; import jvm.exception.ReadClassException; import jvm.classfile.field.Field; import jvm.classfile.method.Method; @@ -64,23 +68,6 @@ public void testMagicNumber() throws ReadClassException { Assert.assertTrue(check); } - private String byteToHexString(byte[] codes) { - StringBuilder buffer = new StringBuilder(); - for (byte b : codes) { - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } - - - - - @Test public void testVersion() { Assert.assertEquals(0, clzFile.getMinorVersion()); @@ -194,7 +181,7 @@ public void testMethods() { assertMethodEquals(pool,m, "", "(Ljava/lang/String;I)V", - "2ab7012a2bb5022a1cb503b1"); + "2ab700012a2bb500022a1cb50003b1"); } { @@ -202,7 +189,7 @@ public void testMethods() { assertMethodEquals(pool,m, "setName", "(Ljava/lang/String;)V", - "2a2bb502b1"); + "2a2bb50002b1"); } { @@ -210,14 +197,14 @@ public void testMethods() { assertMethodEquals(pool,m, "setAge", "(I)V", - "2a1bb503b1"); + "2a1bb50003b1"); } { Method m = methods.get(3); assertMethodEquals(pool,m, "sayHello", "()V", - "b204125b606b1"); + "b200041205b60006b1"); } { @@ -225,7 +212,7 @@ public void testMethods() { assertMethodEquals(pool,m, "main", "([Ljava/lang/String;)V", - "bb0759128101db7094c2bb60ab1"); + "bb0007591208101db700094c2bb6000ab1"); } } @@ -238,4 +225,80 @@ private void assertMethodEquals(ConstantPool pool, Method m, Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + @Test + public void testByteCodeCommand(){ + { + Method initMethod = clzFile.getMethod("", + "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCommands(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #1", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #2", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #3", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = clzFile.getMethod("setName", + "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCommands(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #2", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = clzFile.getMethod("sayHello", + "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCommands(); + + assertOpCodeEquals("0: getstatic #4", cmds[0]); + assertOpCodeEquals("3: ldc #5", cmds[1]); + assertOpCodeEquals("5: invokevirtual #6", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCommands(); + + assertOpCodeEquals("0: new #7", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #8", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #9", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #10", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From 80fa24053da37743b5a9f0543793bce639952588 Mon Sep 17 00:00:00 2001 From: zheng <765324639@qq.com> Date: Thu, 20 Apr 2017 20:18:21 +0800 Subject: [PATCH 212/552] =?UTF-8?q?jvm=E7=AC=AC=E5=9B=9B=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=EF=BC=88=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E9=83=A8=E5=88=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stack/expr/InfixToPostfix.java | 52 ++++++++++++++++++ .../datastructure/stack/expr/PostfixExpr.java | 53 ++++++++++++++++++ .../datastructure/stack/expr/PrefixExpr.java | 55 +++++++++++++++++++ .../java/datastructure/stack/expr/Token.java | 22 +++++++- .../datastructure/stack/expr/TokenParser.java | 4 +- .../stack/expr/InfixExprTest.java | 5 +- .../stack/expr/InfixToPostfixTest.java | 53 ++++++++++++++++++ .../stack/expr/PostfixExprTest.java | 38 +++++++++++++ .../stack/expr/PrefixExprTest.java | 44 +++++++++++++++ 9 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 group01/765324639/src/main/java/datastructure/stack/expr/InfixToPostfix.java create mode 100644 group01/765324639/src/main/java/datastructure/stack/expr/PostfixExpr.java create mode 100644 group01/765324639/src/main/java/datastructure/stack/expr/PrefixExpr.java create mode 100644 group01/765324639/src/test/java/datastructure/stack/expr/InfixToPostfixTest.java create mode 100644 group01/765324639/src/test/java/datastructure/stack/expr/PostfixExprTest.java create mode 100644 group01/765324639/src/test/java/datastructure/stack/expr/PrefixExprTest.java diff --git a/group01/765324639/src/main/java/datastructure/stack/expr/InfixToPostfix.java b/group01/765324639/src/main/java/datastructure/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..18fdf3b391 --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/stack/expr/InfixToPostfix.java @@ -0,0 +1,52 @@ +package datastructure.stack.expr; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + + TokenParser tokenParser = new TokenParser(expr); + List tokenList = tokenParser.parse(); + + Stack operStack = new Stack<>(); + Stack tempStack = new Stack<>(); + for (int i = 0; i < tokenList.size(); i++) { + Token token = tokenList.get(i); + if (token.isNumber()) { + tempStack.push(token); + } else if (token.isOperator()) { + if (operStack.isEmpty() || "(".equals(operStack.peek().getValue())) { + operStack.push(token); + } else if (")".equals(token.getValue())) { + while (!"(".equals(operStack.peek().getValue())) { + tempStack.push(operStack.pop()); + } + operStack.pop(); // 去掉左括号 + } else if (token.comparePriority(operStack.peek()) > 0){ + operStack.push(token); + } else { + tempStack.push(operStack.pop()); + i--; + } + } + } + + while (!operStack.empty()) { + tempStack.push(operStack.pop()); + } + + List list = new ArrayList<>(); + while (!tempStack.empty()) { + list.add(tempStack.pop()); + } + Collections.reverse(list); + return list; + } + + + +} diff --git a/group01/765324639/src/main/java/datastructure/stack/expr/PostfixExpr.java b/group01/765324639/src/main/java/datastructure/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..98a0156df0 --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/stack/expr/PostfixExpr.java @@ -0,0 +1,53 @@ +package datastructure.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(expr); + List tokenList = tokenParser.parse(); + + Stack floatStack = new Stack<>(); + + for (Token token : tokenList) { + if (token.isNumber()) { + floatStack.push(Float.valueOf(token.getValue())); + } else if (token.isOperator()) { + float num2 = floatStack.pop(); + float num1 = floatStack.pop(); + float result = calculate(token.getValue(), num1, num2); + floatStack.push(result); + } + } + + return floatStack.pop(); + } + + private float calculate(String operator, float num1, float num2) { + float result = 0; + switch (operator.charAt(0)) { + case '+': + result = num1 + num2; + break; + case '-': + result = num1 - num2; + break; + case '*': + result = num1 * num2; + break; + case '/': + result = num1 / num2; + break; + default: + throw new IllegalArgumentException(); + } + return result; + } +} diff --git a/group01/765324639/src/main/java/datastructure/stack/expr/PrefixExpr.java b/group01/765324639/src/main/java/datastructure/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..ebec17a78c --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/stack/expr/PrefixExpr.java @@ -0,0 +1,55 @@ +package datastructure.stack.expr; + +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(expr); + List tokenList = tokenParser.parse(); + Collections.reverse(tokenList); + + Stack floatStack = new Stack<>(); + + for (Token token : tokenList) { + if (token.isNumber()) { + floatStack.push(Float.valueOf(token.getValue())); + } else if (token.isOperator()) { + float num1 = floatStack.pop(); + float num2 = floatStack.pop(); + float result = calculate(token.getValue(), num1, num2); + floatStack.push(result); + } + } + + return floatStack.pop(); + } + + private float calculate(String operator, float num1, float num2) { + float result = 0; + switch (operator.charAt(0)) { + case '+': + result = num1 + num2; + break; + case '-': + result = num1 - num2; + break; + case '*': + result = num1 * num2; + break; + case '/': + result = num1 / num2; + break; + default: + throw new IllegalArgumentException(); + } + return result; + } +} diff --git a/group01/765324639/src/main/java/datastructure/stack/expr/Token.java b/group01/765324639/src/main/java/datastructure/stack/expr/Token.java index 44a019197d..e278a5df87 100644 --- a/group01/765324639/src/main/java/datastructure/stack/expr/Token.java +++ b/group01/765324639/src/main/java/datastructure/stack/expr/Token.java @@ -45,7 +45,27 @@ public int comparePriority(Token token) { } return 1; } else { - throw new RuntimeException("不支持的运算符"); + throw new RuntimeException("不支持的运算符:" + token.getValue()); } } + + public boolean isNumber() { + if (NUMBER.equals(type)) { + return true; + } + return false; + } + + public boolean isOperator() { + if (OPERATOR.equals(OPERATOR)) { + return true; + } + return false; + } + + @Override + public String toString() { + return "Token [type=" + type + ", value=" + value + "]"; + } + } diff --git a/group01/765324639/src/main/java/datastructure/stack/expr/TokenParser.java b/group01/765324639/src/main/java/datastructure/stack/expr/TokenParser.java index e1add57663..e3595c8a7a 100644 --- a/group01/765324639/src/main/java/datastructure/stack/expr/TokenParser.java +++ b/group01/765324639/src/main/java/datastructure/stack/expr/TokenParser.java @@ -40,8 +40,8 @@ private boolean isNumber(char c) { } private boolean isOperator(char c) { - String supplyOperator = "+-*/"; - if (supplyOperator.indexOf(supplyOperator) != -1) { + String supplyOperator = "+-*/()"; + if (supplyOperator.indexOf(c) != -1) { return true; } return false; diff --git a/group01/765324639/src/test/java/datastructure/stack/expr/InfixExprTest.java b/group01/765324639/src/test/java/datastructure/stack/expr/InfixExprTest.java index 9746dcdb79..ceffd5d7c1 100644 --- a/group01/765324639/src/test/java/datastructure/stack/expr/InfixExprTest.java +++ b/group01/765324639/src/test/java/datastructure/stack/expr/InfixExprTest.java @@ -42,7 +42,10 @@ public void testEvaluate() { InfixExpr expr = new InfixExpr("10-30+50"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } } } diff --git a/group01/765324639/src/test/java/datastructure/stack/expr/InfixToPostfixTest.java b/group01/765324639/src/test/java/datastructure/stack/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..a5ac1b8f78 --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/stack/expr/InfixToPostfixTest.java @@ -0,0 +1,53 @@ +package datastructure.stack.expr; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +public class InfixToPostfixTest { + + @Test + public void testConvert() { + { + String expr = "((2+3)*8+5+3)*6"; + + List postFix = InfixToPostfix.convert(expr); + String postFixExpr = tokenListToString(postFix); + float postFixExprResult = calculatePostFixExpr(postFixExpr); + + Assert.assertEquals(288, postFixExprResult, 0.001); + } + { + String expr = "9+(3-1)*3+10/2"; + + List postFix = InfixToPostfix.convert(expr); + String postFixExpr = tokenListToString(postFix); + float postFixExprResult = calculatePostFixExpr(postFixExpr); + + Assert.assertEquals(20, postFixExprResult, 0.001); + } + { + String expr = "10-2*3+50"; + + List postFix = InfixToPostfix.convert(expr); + String postFixExpr = tokenListToString(postFix); + float postFixExprResult = calculatePostFixExpr(postFixExpr); + + Assert.assertEquals(54, postFixExprResult, 0.001); + } + } + + private String tokenListToString(List tokenList) { + StringBuilder builder = new StringBuilder(); + for (Token token : tokenList) { + builder.append(token.getValue() + " "); + } + return builder.toString(); + } + + private float calculatePostFixExpr(String expr) { + PostfixExpr postfixExpr = new PostfixExpr(expr); + return postfixExpr.evaluate(); + } +} diff --git a/group01/765324639/src/test/java/datastructure/stack/expr/PostfixExprTest.java b/group01/765324639/src/test/java/datastructure/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..07036c7577 --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/stack/expr/PostfixExprTest.java @@ -0,0 +1,38 @@ +package datastructure.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // ((2+3)*8+5+3)*6 + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group01/765324639/src/test/java/datastructure/stack/expr/PrefixExprTest.java b/group01/765324639/src/test/java/datastructure/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..7c7344bfac --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/stack/expr/PrefixExprTest.java @@ -0,0 +1,44 @@ +package datastructure.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} From 719e23d8efcce013c08b9e5085da33f2b412a5bc Mon Sep 17 00:00:00 2001 From: ZhaoHongxin Date: Thu, 20 Apr 2017 21:43:15 +0800 Subject: [PATCH 213/552] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=AD=97=E8=8A=82=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/jvm/clz/ClassFile.java | 35 ++++++++--- .../com/coderising/jvm/cmd/CommandParser.java | 60 ++++++++++++++++++- .../jvm/test/ClassFileloaderTest.java | 5 +- .../src/com/coding/basic/stack/StackUtil.java | 35 ++++++++++- .../coding/basic/stack/expr/InfixExpr.java | 34 +++++++---- .../basic/stack/expr/InfixExprTest.java | 6 -- .../com/coding/basic/stack/expr/Token.java | 51 +++++++++++----- .../coding/basic/stack/expr/TokenParser.java | 5 +- 8 files changed, 183 insertions(+), 48 deletions(-) diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java index 13a3e4db4d..2381d6f5f6 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -1,11 +1,12 @@ package com.coderising.jvm.clz; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; -import com.coding.basic.ArrayList; -import com.coding.basic.List; public class ClassFile { private int minorVersion; @@ -15,17 +16,17 @@ public class ClassFile { private ClassIndex clzIndex; private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); + private List fields = new ArrayList(); + private List methods = new ArrayList(); public void addField(Field f) { fields.add(f); } - public List getFields() { + public List getFields() { return fields; } - public List getMethods() { + public List getMethods() { return methods; } public ClassIndex getClzIndex() { @@ -94,11 +95,31 @@ public void addMethod(Method m) { public Method getMethod(String methodName, String paramAndReturnType){ + for(Method m : methods) { + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + + if (name.equals(methodName) && desc.equals(paramAndReturnType)) { + return m; + } + } return null; } public Method getMainMethod(){ - + for(Method m :methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ + return m; + } + } return null; } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java index 1ee3e0ac81..c04d14ef3b 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -4,6 +4,7 @@ import java.util.List; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; public class CommandParser { @@ -44,18 +45,71 @@ public class CommandParser { public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - //codes = codes.toUpperCase(); + codes = codes.toUpperCase(); CommandIterator iter = new CommandIterator(codes); - + ArrayList cmds = new ArrayList(); while (iter.hasNext()) { String opCode = iter.next2CharAsString(); if(new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); } + } - return null; + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + + return result; } private static void calcuateOffset(List cmds) { diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index c72b31f6c6..61c83b4224 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,6 +1,7 @@ package com.coderising.jvm.test; import java.io.IOException; +import java.util.List; import org.junit.After; import org.junit.Assert; @@ -9,7 +10,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -18,7 +22,6 @@ import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; import com.coderising.jvm.method.Method; -import com.coding.basic.List; diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackUtil.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackUtil.java index cdb09886fa..a5e4f7623d 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackUtil.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackUtil.java @@ -1,5 +1,4 @@ package com.coding.basic.stack; - public class StackUtil { @@ -7,7 +6,7 @@ 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) { + public static void reverseV1(Stack s) { if (s == null || s.size() == 0) { return; } @@ -24,6 +23,38 @@ private static void reverseTo(Stack s, Stack s1) { s1.push(s.pop()); } } + /** + * 递归实现 + * @param s + */ + public static void reverse(Stack s) { + if (s == null || s.size() == 0) { + return; + } + + Stack temp = new Stack(); + while(!s.isEmpty()){ + temp.push(s.pop()); + } + + while (!temp.isEmpty()) { + Object pop = temp.pop(); + addToBottom(s,pop); + } + + } + + private static void addToBottom(Stack s, Object o) { + + if (s.isEmpty()) { + s.push(o); + } else { + Object pop = s.pop(); + addToBottom(s, o); + s.push(pop); + } + + } /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExpr.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExpr.java index dc51c6adf3..6c582d9b97 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExpr.java @@ -1,9 +1,7 @@ package com.coding.basic.stack.expr; import java.util.List; - -import com.coding.basic.stack.Stack; -import com.coding.basic.stack.StackUtil; +import java.util.Stack; public class InfixExpr { String expr = null; @@ -25,7 +23,7 @@ public float evaluate() { if (opStack.isEmpty()) { opStack.push(t); } else { - Token topOperator = (Token) opStack.peek(); + /*Token topOperator = (Token) opStack.peek(); if (t.comparePriority(topOperator) >= 0) { opStack.push(t); } else { @@ -34,21 +32,31 @@ public float evaluate() { numStack.push(calculate(topOperator.getValue(), f2, f1)); opStack.pop(); opStack.push(t); + }*/ + while(!opStack.isEmpty() + && !t.hasHigherPriority(opStack.peek())) { + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1, f2); + + numStack.push(result); } + opStack.push(t); + } - } else if (t.isDigit()) { - numStack.push(Float.valueOf(t.getValue())); + } + if (t.isDigit()) { + numStack.push(new Float(t.getIntValue())); } } - /*StackUtil.reverse(numStack); - StackUtil.reverse(opStack);*/ while (!opStack.isEmpty()) { - Float f1 = (Float) numStack.pop(); - Float f2 = (Float) numStack.pop(); - Token opr = (Token) opStack.pop(); + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + Token opr = opStack.pop(); numStack.push(calculate(opr.getValue(), f2, f1)); } - return (Float) numStack.pop(); + return numStack.pop(); //return 0.0f; } @@ -68,7 +76,7 @@ private Float calculate(String op, Float f1, Float f2) { System.out.println("-"); return f1 - f2; } - return 0.0f; + throw new RuntimeException(op + " is not supported"); } } diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExprTest.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExprTest.java index a6c3d24012..92d130cddd 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExprTest.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -44,11 +44,5 @@ public void testEvaluate() { } } - @Test - public void test0001() { - InfixExpr expr = new InfixExpr("2+3*4+5"); - String s = "23+3*4+5"; - new TokenParser().parse(s); - } } diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/Token.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/Token.java index b8abf39546..5afe37fe7d 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/Token.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/Token.java @@ -1,42 +1,59 @@ package com.coding.basic.stack.expr; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } public static final int OPRATOR = 0; public static final int NUMBER = 1; - private int signal; - private String value; + int type; + String value; - public Token(int signal, String digit) { - this.signal = signal; - this.value = digit; + public Token(int type, String value) { + this.type = type; + this.value = value; } public boolean isOperator() { - return this.signal == Token.OPRATOR; + return this.type == Token.OPRATOR; } public boolean isDigit() { - return this.signal == Token.NUMBER; + return this.type == Token.NUMBER; } - public int getSignal() { - return signal; + public int getType() { + return type; } - public void setSignal(int signal) { - this.signal = signal; + public void setType(int type) { + this.type = type; } public String getValue() { return value; } - public void setValue(String value) { - this.value = value; + public String toString() { + return value; } - + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public int comparePriority(Token topOperator) { int topOptrPriority = 0; int optPriority = 0; @@ -57,5 +74,11 @@ public int comparePriority(Token topOperator) { return optPriority - topOptrPriority; } + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() || !t.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } } diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/TokenParser.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/TokenParser.java index 447894d7f4..1b4786cc8c 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/TokenParser.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/TokenParser.java @@ -41,12 +41,13 @@ private int indexOfNextOperator(int nowIndex, String expr) { } private boolean charIsDigit(char c) { + //return Character.isDigit(c); return c>='0' && c<='9'; } private boolean charIsOperator(char c) { - - return c=='+' || c=='-' || c=='*' || c=='/'; + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); } } From 43607d3df44b89abf4617a9e64a595318a84818a Mon Sep 17 00:00:00 2001 From: johnChnia Date: Fri, 21 Apr 2017 00:20:58 +0800 Subject: [PATCH 214/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=AD=E5=BA=8F?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/InfixExpr.java | 6 ++- .../basic/stack/expr/InfixToPostfix.java | 39 +++++++++++++++---- .../coding2017/basic/stack/expr/Operator.java | 5 ++- .../basic/stack/expr/PostfixExpr.java | 13 ++++++- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java index ddafe58c46..d3e9afbf9b 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java @@ -1,5 +1,8 @@ package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.List; + public class InfixExpr { String expr = null; @@ -8,7 +11,8 @@ public InfixExpr(String expr) { } public float evaluate() { - return 0.0f; + List tokens = InfixToPostfix.convert(this.expr); + return PostfixExpr.evaluate(tokens); } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java index f42f73282a..e361815f02 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java @@ -1,14 +1,37 @@ package com.johnChnia.coding2017.basic.stack.expr; -import java.util.List; +import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.List; +import com.johnChnia.coding2017.basic.stack.Stack; + + +/*** + * Rule: + */ public class InfixToPostfix { - - public static List convert(String expr) { - - return null; - } - - + + public static List convert(String expr) { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + List list = new ArrayList<>(); + Stack stack = new Stack<>(); + for (int i = 0; i < tokens.size(); i++) { + Token token = tokens.get(i); + if (token.isNumber()) { + list.add(token); + } else if (token.isOperator()) { + while (!stack.empty() && !token.hasHigherPriority(stack.peek())) { + list.add(stack.pop()); + } + stack.push(token); + + } + } + while (!stack.empty()) { + list.add(stack.pop()); + } + return list; + } } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java index 52ff15fa80..adc1aac489 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java @@ -17,6 +17,7 @@ public void handlerToken(String fix, Stack stack, Token token) { } } + private float perform(String fix, String operator, float p, float q) { float result = 0.0f; if (operator.equals("+")) { @@ -24,7 +25,7 @@ private float perform(String fix, String operator, float p, float q) { } else if (operator.equals("-")) { if (fix.equals("postfix")) { result = q - p; - } else if (fix.equals("prefix")){ + } else if (fix.equals("prefix")) { result = p - q; } } else if (operator.equals("*")) { @@ -32,7 +33,7 @@ private float perform(String fix, String operator, float p, float q) { } else if (operator.equals("/")) { if (fix.equals("postfix")) { result = q / p; - } else if (fix.equals("prefix")){ + } else if (fix.equals("prefix")) { result = p / q; } } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java index dfecd16ed4..4046c13830 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java @@ -4,7 +4,9 @@ import com.johnChnia.coding2017.basic.stack.Stack; public class PostfixExpr { - String expr = null; + private String expr = null; + static Operator operator = new Operator(); + public PostfixExpr(String expr) { this.expr = expr; @@ -13,7 +15,6 @@ public PostfixExpr(String expr) { public float evaluate() { TokenParser tokenParser = new TokenParser(); List tokens = tokenParser.parse(this.expr); - Operator operator = new Operator(); Stack stack = new Stack<>(); for (int i = 0; i < tokens.size(); i++) { operator.handlerToken("postfix", stack, tokens.get(i)); @@ -23,5 +24,13 @@ public float evaluate() { return stack.pop(); } + public static float evaluate(List tokens) { + Stack stack = new Stack<>(); + for (int i = 0; i < tokens.size(); i++) { + operator.handlerToken("postfix", stack, tokens.get(i)); + } + return stack.pop(); + } + } From bf84de24d57c4a3857bc508d8a243049db555084 Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 21 Apr 2017 00:23:51 +0800 Subject: [PATCH 215/552] =?UTF-8?q?jvm=20=E5=AD=97=E8=8A=82=E7=A0=81?= =?UTF-8?q?=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/minijvm/attr/CodeAttr.java | 8 ++- .../coding2017/minijvm/clz/ClassFile.java | 15 +++-- .../coding2017/minijvm/cmd/CommandParser.java | 65 ++++++++++++++++++- .../coding2017/minijvm/method/Method.java | 13 ++++ 4 files changed, 92 insertions(+), 9 deletions(-) diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java index ff7fcc4294..c4455c6b2a 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java @@ -2,6 +2,7 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; +import com.github.ipk2015.coding2017.minijvm.cmd.CommandParser; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.loader.ByteCodeIterator; @@ -22,7 +23,7 @@ public ByteCodeCommand[] getCmds() { private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; @@ -46,7 +47,10 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxLocals = iter.nextUNToInt(2); int codeLen = iter.nextUNToInt(4); String code = iter.nextUNToHexString(codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); + + ByteCodeCommand[] commands = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code,commands); int exceptionTableLen = iter.nextUNToInt(2); if(exceptionTableLen != 0){ throw new RuntimeException("code属性里的异常table长度为:"+exceptionTableLen); diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/clz/ClassFile.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/clz/ClassFile.java index 5c3706b76f..3a267144af 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/clz/ClassFile.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/clz/ClassFile.java @@ -5,6 +5,7 @@ import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.UTF8Info; import com.github.ipk2015.coding2017.minijvm.field.Field; import com.github.ipk2015.coding2017.minijvm.method.Method; @@ -90,12 +91,18 @@ public String getSuperClassName(){ return superClass.getClassName(); } public Method getMethod(String methodName, String paramAndReturnType){ - - + List list = getMethods(); + for(Method m : list){ + String name = ((UTF8Info)pool.getConstantInfo(m.getNameIndex())).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(m.getDescriptorIndex())).getValue(); + if(name.equalsIgnoreCase(methodName) && desc.equalsIgnoreCase(paramAndReturnType)){ + return m; + } + } return null; } public Method getMainMethod(){ - - return null; +// main:([Ljava/lang/String;)V + return getMethod("main","([Ljava/lang/String;)V"); } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java index 23b2859e6a..d9c3c619e2 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java @@ -1,5 +1,6 @@ package com.github.ipk2015.coding2017.minijvm.cmd; +import java.util.ArrayList; import java.util.List; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; @@ -42,9 +43,67 @@ public class CommandParser { public static final String iinc = "84"; public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - - return null; + if(null == codes || codes.length() == 0){ + throw new RuntimeException("字节码不存在"); + } + codes = codes.toUpperCase(); + CommandIterator iterator = new CommandIterator(codes); + List commands = new ArrayList(); + while(iterator.hasNext()){ + String operatorCode = iterator.next2CharAsString(); + if(ldc.equals(operatorCode)){ + LdcCmd cmd = new LdcCmd(clzFile,operatorCode); + cmd.setOperand(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(bipush.equals(operatorCode)){ + BiPushCmd cmd = new BiPushCmd(clzFile,operatorCode); + cmd.setOperand(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(new_object.equals(operatorCode)){ + NewObjectCmd cmd = new NewObjectCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(invokespecial.equals(operatorCode)){ + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(invokevirtual.equals(operatorCode)){ + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(putfield.equals(operatorCode)){ + PutFieldCmd cmd = new PutFieldCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(getfield.equals(operatorCode)){ + GetFieldCmd cmd = new GetFieldCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(getstatic.equals(operatorCode)){ + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(dup.equals(operatorCode) || aload_0.equals(operatorCode) || aload_1.equals(operatorCode) || + aload_2.equals(operatorCode) || astore_1.equals(operatorCode) || voidreturn.equals(operatorCode) + || iload.equals(operatorCode) || iload_1.equals(operatorCode) || iload_2.equals(operatorCode) + || iload_3.equals(operatorCode) || fload_3.equals(operatorCode) || iconst_0.equals(operatorCode) + || iconst_1.equals(operatorCode) || istore_1.equals(operatorCode) || istore_2.equals(operatorCode) + || iadd.equals(operatorCode)|| iinc.equals(operatorCode)){ + NoOperandCmd command = new NoOperandCmd(clzFile,operatorCode); + commands.add(command); + }else{ + throw new RuntimeException("this operator code not includes yet:"+operatorCode); + } + } + calcuateOffset(commands); + ByteCodeCommand[] result = new ByteCodeCommand[commands.size()]; + return commands.toArray(result); } private static void calcuateOffset(List cmds) { diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java index 61b91fa7b9..b8a3d7dca2 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java @@ -4,6 +4,8 @@ import com.github.ipk2015.coding2017.minijvm.attr.CodeAttr; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.UTF8Info; import com.github.ipk2015.coding2017.minijvm.loader.ByteCodeIterator; public class Method { @@ -71,4 +73,15 @@ private static void addAttr(ClassFile clzFile,Method method,ByteCodeIterator ite public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + buffer.append(name).append(":").append(desc).append("\n"); + buffer.append(this.codeAttr.toString(pool)); + return buffer.toString(); + } } From 8bdf0c67b02fa4e452d317a5763251690b16a189 Mon Sep 17 00:00:00 2001 From: "kaitao.li" Date: Fri, 21 Apr 2017 09:17:49 +0800 Subject: [PATCH 216/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A,=20=E6=96=B9=E6=B3=95=E8=A7=A3=E6=9E=90done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/coding2017/jvm/attr/CodeAttr.java | 6 ++++++ .../coding2017/jvm/attr/LineNumberTable.java | 16 ++++++++++++---- .../jvm/attr/LocalVariableTable.java | 14 ++++++++++++-- .../com/coding2017/jvm/attr/StackMapTable.java | 7 ++----- .../java/com/coding2017/jvm/field/Field.java | 4 ++++ .../coding2017/jvm/loader/ClassFileParser.java | 18 ++++++++++++++++-- .../java/com/coding2017/jvm/method/Method.java | 4 +++- .../jvm/loader/ClassFileLoaderTest.java | 2 +- 8 files changed, 56 insertions(+), 15 deletions(-) diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java index 93bebc2dc7..b248bdc490 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/CodeAttr.java @@ -45,6 +45,12 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter, int nameI int codeLength = iter.nextU4ToInt(); String code = iter.nextUxToHexString(codeLength); CodeAttr codeAttr = new CodeAttr(nameIndex, length, maxStack, maxLocals, codeLength, code); + int exceptionTableLength = iter.nextU2ToInt(); + if(exceptionTableLength > 0){ + String exTable = iter.nextUxToHexString(exceptionTableLength * 8); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } int codeAttributeCount = iter.nextU2ToInt(); for (int j = 0; j < codeAttributeCount; j++) { AttributeInfo attributeInfo = AttributeInfo.parse(clzFile, iter); diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java index 2878f874ed..68d21f9244 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LineNumberTable.java @@ -1,11 +1,11 @@ package com.coding2017.jvm.attr; -import com.coding2017.jvm.clz.ClassFile; -import com.coding2017.jvm.loader.ByteCodeIterator; - import java.util.ArrayList; import java.util.List; +import com.coding2017.jvm.clz.ClassFile; +import com.coding2017.jvm.loader.ByteCodeIterator; + public class LineNumberTable extends AttributeInfo { List items = new ArrayList(); @@ -40,8 +40,16 @@ public LineNumberTable(int attrNameIndex, int attrLen) { } public static LineNumberTable parse(ClassFile clzFile, ByteCodeIterator iter, int nameIndex, int length) { + int tableLength = iter.nextU2ToInt(); + LineNumberTable lineNumberTable = new LineNumberTable(nameIndex, length); + for (int i = 0; i < tableLength; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + lineNumberTable.addLineNumberItem(item); + } - return null; + return lineNumberTable; } } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java index 23dff851c8..fb039b6f16 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/LocalVariableTable.java @@ -15,8 +15,18 @@ public LocalVariableTable(int attrNameIndex, int attrLen) { } public static LocalVariableTable parse(ClassFile clzFile, ByteCodeIterator iter, int nameIndex, int length) { - - return null; + int tableLength = iter.nextU2ToInt(); + LocalVariableTable localVariableTable = new LocalVariableTable(nameIndex, length); + for (int i = 0; i < tableLength; i++) { + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + localVariableTable.addLocalVariableItem(item); + } + return localVariableTable; } private void addLocalVariableItem(LocalVariableItem item) { diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java index 653ecab830..12e6d80c5c 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/attr/StackMapTable.java @@ -12,12 +12,10 @@ public StackMapTable(int attrNameIndex, int attrLen) { } public static StackMapTable parse(ClassFile clzFile, ByteCodeIterator iter, int nameIndex, int length) { - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index, len); + StackMapTable t = new StackMapTable(nameIndex, length); // 后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); + String code = iter.nextUxToHexString(length); t.setOriginalCode(code); return t; @@ -25,6 +23,5 @@ public static StackMapTable parse(ClassFile clzFile, ByteCodeIterator iter, int private void setOriginalCode(String code) { this.originalCode = code; - } } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java index d521fca4e3..10e1bbb870 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/field/Field.java @@ -29,4 +29,8 @@ public static Field parse(ConstantPool pool, ByteCodeIterator iter) { return new Field(accessFlag, nameIndex, descriptorIndex, pool); } + @Override + public String toString() { + return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex); + } } diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java index 87cf762ac4..b1d11f634d 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/loader/ClassFileParser.java @@ -34,13 +34,27 @@ public ClassFile parse(byte[] codes) { parseInterfaces(iterator); - Field.parse(classFile.getConstantPool(), iterator); + parseFields(classFile, iterator); - Method.parse(classFile, iterator); + parseMethods(classFile, iterator); return classFile; } + private void parseMethods(ClassFile clzFile, ByteCodeIterator iterator) { + int methodCount = iterator.nextU2ToInt(); + for (int i = 0; i < methodCount; i++) { + clzFile.getMethods().add(Method.parse(clzFile, iterator)); + } + } + + private void parseFields(ClassFile clzFile, ByteCodeIterator iterator) { + int fieldCount = iterator.nextU2ToInt(); + for (int i = 0; i < fieldCount; i++) { + clzFile.getFields().add(Field.parse(clzFile.getConstantPool(), iterator)); + } + } + private boolean checkMagicNumber(ByteCodeIterator iterator) { String magicNumber = iterator.nextU4ToString(); return "cafebabe".equals(magicNumber); diff --git a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java index 90ad8dec1e..173e966a7f 100644 --- a/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java +++ b/group01/280646174/jvm/src/main/java/com/coding2017/jvm/method/Method.java @@ -49,7 +49,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { Method method = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); method.parseAttributes(iter); - return null; + return method; } @@ -59,6 +59,8 @@ private void parseAttributes(ByteCodeIterator iter) { AttributeInfo attributeInfo = AttributeInfo.parse(this.clzFile, iter); if (attributeInfo instanceof CodeAttr) { this.setCodeAttr((CodeAttr) attributeInfo); + } else { + throw new RuntimeException("unknown method attribute"); } } } diff --git a/group01/280646174/jvm/src/test/java/com/coding2017/jvm/loader/ClassFileLoaderTest.java b/group01/280646174/jvm/src/test/java/com/coding2017/jvm/loader/ClassFileLoaderTest.java index d9dd2a22ff..0b87979626 100644 --- a/group01/280646174/jvm/src/test/java/com/coding2017/jvm/loader/ClassFileLoaderTest.java +++ b/group01/280646174/jvm/src/test/java/com/coding2017/jvm/loader/ClassFileLoaderTest.java @@ -74,7 +74,7 @@ public void testClassFileLength() { public void testMagicNumber() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coding2017.week4.jvm.test.EmployeeV1"; + String className = "com.coding2017.jvm.bean.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; From aaf64e80887e3e642193ab34cdacf2a01f2f4ce3 Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Fri, 21 Apr 2017 10:24:47 +0800 Subject: [PATCH 217/552] =?UTF-8?q?=E5=89=8D=E5=BA=8F=E5=90=8E=E5=BA=8F?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/basic/stack/expr/PostfixExpr.java | 41 ++++++++++++++++++- .../coding/basic/stack/expr/PrefixExpr.java | 34 ++++++++++++++- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java index db7e5a4c6a..2040814b2c 100644 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java @@ -1,5 +1,9 @@ package com.coding.basic.stack.expr; +import java.util.List; +import java.util.Stack; + + public class PostfixExpr { String expr = null; @@ -8,11 +12,44 @@ public PostfixExpr(String expr) { } public float evaluate() { + Stack stack = new Stack(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + for(Token token :tokens){ + if(token.isNumber()){ + stack.push(token.toString()); + } + if(token.isOperator()){ + int num1 = Integer.parseInt(stack.pop()); + int num2 = Integer.parseInt(stack.pop()); + String result = parseToResult(num1,num2,token.toString()); + stack.push(result); + } + } - return 0.0f; + return Float.parseFloat(stack.pop()); } - + private String parseToResult(int num1, int num2, String oper) { + // TODO Auto-generated method stub + String result = ""; + if(oper.equals("*")) + result = (num1*num2)+""; + if(oper.equals("/")) + result = (num2/num1)+""; + if(oper.equals("+")) + result = (num1+num2)+""; + if(oper.equals("-")) + result = (num2-num1)+""; + return result; + } + + public static void main(String[] args) { + //9+(3-1)*3+10/2 + PostfixExpr pos = new PostfixExpr("9 3 1-3*+ 10 2/+"); + float f =pos.evaluate(); + System.out.println(f); + } } diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java index f3b4953b51..c06a960bfe 100644 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java @@ -1,4 +1,6 @@ package com.coding.basic.stack.expr; + +import java.util.Collections; import java.util.List; import java.util.Stack; @@ -10,8 +12,38 @@ public PrefixExpr(String expr) { } public float evaluate() { - return 0.0f; + Stack stack = new Stack(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Collections.reverse(tokens); + for(Token token :tokens){ + if(token.isNumber()){ + stack.push(token.toString()); + } + if(token.isOperator()){ + int num1 = Integer.parseInt(stack.pop()); + int num2 = Integer.parseInt(stack.pop()); + String result = parseToResult(num1,num2,token.toString()); + stack.push(result); + } + } + + return Float.parseFloat(stack.pop()); } + private String parseToResult(int num1, int num2, String oper) { + // TODO Auto-generated method stub + String result = ""; + if(oper.equals("*")) + result = (num1*num2)+""; + if(oper.equals("/")) + result = (num1/num2)+""; + if(oper.equals("+")) + result = (num1+num2)+""; + if(oper.equals("-")) + result = (num1-num2)+""; + return result; + } + } \ No newline at end of file From 133fbe6233473f6477b4f99b82feb29096eb3268 Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Fri, 21 Apr 2017 15:13:53 +0800 Subject: [PATCH 218/552] =?UTF-8?q?=E4=B8=AD=E5=BA=8F=E8=BD=AC=E5=90=8E?= =?UTF-8?q?=E5=BA=8F,=E4=B8=AD=E5=BA=8F=E8=BD=AC=E5=89=8D=E5=BA=8F?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/InfixToPostfix.java | 51 ++++++++++++++++-- .../basic/stack/expr/InfixToPrevfix.java | 54 +++++++++++++++++++ 2 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java index dcee6ecadf..2e7243ecb2 100644 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java @@ -1,14 +1,59 @@ package com.coding.basic.stack.expr; +import java.util.ArrayList; import java.util.List; +import org.junit.Assert; + +import com.coding.basic.stack.Stack; + + public class InfixToPostfix { - + public static List convert(String expr) { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + List result = getPostOrder(tokens); - return null; + return result; } + + /** + * 中序表达式转后序表达式 + * + * @param list + * @return + */ + private static List getPostOrder(List tokens) { + + List result = new ArrayList(); + Stack stack = new Stack(); + for (int i = 0; i < tokens.size(); i++) { + // 如果为数字,加到集合里 + if (tokens.get(i).isNumber()) { + result.add(tokens.get(i)); + } else { + Token token = null; + if(!stack.isEmpty()){ + token = (Token)stack.peek(); + } + while(!stack.isEmpty() && token.hasHigherPriority(tokens.get(i))){ + result.add((Token)stack.pop()); + } + stack.push(tokens.get(i)); + } + } + while (!stack.isEmpty()) { + // 最后看下操作符栈还有操作符没,有了加到集合末尾 + result.add((Token) stack.pop()); + } + return result; + } - + + public static void main(String[] args) { + List list = InfixToPostfix.convert("300*20+12*5-20/4"); + Assert.assertEquals("[300, 20, *, 12, 5, *, +, 20, 4, /, -]", list.toString()); + } } \ No newline at end of file diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java new file mode 100644 index 0000000000..d824284eda --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java @@ -0,0 +1,54 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; + +import com.coding.basic.stack.Stack; + +public class InfixToPrevfix { + + public static List convert(String expr) { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + return PrevOrderExpr(tokens); + } + + public static List PrevOrderExpr(List tokens) { + List result = new ArrayList(); + Stack operator = new Stack(); + Stack num = new Stack(); + for (int i = tokens.size() - 1; i >= 0; i--) { + if (tokens.get(i).isNumber()) { + num.push(tokens.get(i)); + } + if (tokens.get(i).isOperator()) { + Token token = null; + if (!operator.isEmpty()) { + token = (Token) operator.peek(); + } + while (!operator.isEmpty() && token.hasHigherPriority(tokens.get(i))) { + num.push((Token) operator.pop()); + } + operator.push(tokens.get(i)); + } + } + while(!operator.isEmpty()){ + num.push(operator.pop()); + } + while (!num.isEmpty()) { + result.add((Token) num.pop()); + } + + + return result; + } + + + public static void main(String[] args) { + List list = InfixToPrevfix.convert("300*20+12*5-20/4"); + Assert.assertEquals("[+, *, 300, 20, -, *, 12, 5, /, 20, 4]", list.toString()); + } +} From 1e55f9833776f015675385e5e1def7aa3a685cae Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 21 Apr 2017 16:31:15 +0800 Subject: [PATCH 219/552] =?UTF-8?q?stackUtil=E4=BD=9C=E4=B8=9A=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BF=9D=E5=AD=98=EF=BC=8C=E7=9B=AE=E5=BD=95=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=B8=8E=E8=80=81=E5=B8=88=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/basic/dataStructure/Stack.java | 2 + .../dataStructure/{ => array}/ArrayList.java | 4 +- .../{ => linkedList}/LRUPageFrame.java | 2 +- .../{ => linkedList}/LinkedList.java | 8 +++- .../dataStructure/{ => queue}/Queue.java | 2 +- .../basic/dataStructure/stack/StackUtil.java | 48 +++++++++++++++++++ .../java/data_structure/ArrayListTest.java | 2 +- .../java/data_structure/LRUPageFrameTest.java | 2 +- .../java/data_structure/LinkedListTest.java | 2 +- .../test/java/data_structure/QueueTest.java | 2 +- 10 files changed, 65 insertions(+), 9 deletions(-) rename group24/75939388/learning2017/src/main/java/basic/dataStructure/{ => array}/ArrayList.java (97%) rename group24/75939388/learning2017/src/main/java/basic/dataStructure/{ => linkedList}/LRUPageFrame.java (98%) rename group24/75939388/learning2017/src/main/java/basic/dataStructure/{ => linkedList}/LinkedList.java (97%) rename group24/75939388/learning2017/src/main/java/basic/dataStructure/{ => queue}/Queue.java (97%) create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java index bea16033fa..279e551431 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java @@ -1,5 +1,7 @@ package basic.dataStructure; +import basic.dataStructure.array.ArrayList; + /** * Created by macvi on 2017/4/4. */ diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/array/ArrayList.java similarity index 97% rename from group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java rename to group24/75939388/learning2017/src/main/java/basic/dataStructure/array/ArrayList.java index 8ae862da33..246641cb4a 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/array/ArrayList.java @@ -1,4 +1,6 @@ -package basic.dataStructure; +package basic.dataStructure.array; + +import basic.dataStructure.List; /** * Created by macvi on 2017/4/2. diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/linkedList/LRUPageFrame.java similarity index 98% rename from group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java rename to group24/75939388/learning2017/src/main/java/basic/dataStructure/linkedList/LRUPageFrame.java index 439df7ffbd..8746fc44a0 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LRUPageFrame.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/linkedList/LRUPageFrame.java @@ -1,4 +1,4 @@ -package basic.dataStructure; +package basic.dataStructure.linkedList; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/linkedList/LinkedList.java similarity index 97% rename from group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java rename to group24/75939388/learning2017/src/main/java/basic/dataStructure/linkedList/LinkedList.java index 3ac85ad37b..aa19b4cef5 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/linkedList/LinkedList.java @@ -1,4 +1,8 @@ -package basic.dataStructure; +package basic.dataStructure.linkedList; + +import basic.dataStructure.ArrayUtil; +import basic.dataStructure.List; +import basic.dataStructure.array.ArrayList; /** * Created by macvi on 2017/4/3. @@ -169,7 +173,7 @@ public void reverse(){ /** * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 例如:array = 2->5->7->8 , 删除以后的值为 7->8 * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 */ diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Queue.java similarity index 97% rename from group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java rename to group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Queue.java index 36ca7e9647..5096f9297c 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Queue.java @@ -1,4 +1,4 @@ -package basic.dataStructure; +package basic.dataStructure.queue; /** * Created by macvi on 2017/4/4. diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java new file mode 100644 index 0000000000..5292114c44 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java @@ -0,0 +1,48 @@ +package basic.dataStructure.stack; +import java.util.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/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java index ee8ee6b0d0..fc16cbfb97 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java @@ -1,7 +1,7 @@ package data_structure; import org.junit.Test; -import basic.dataStructure.ArrayList; +import basic.dataStructure.array.ArrayList; /** * Created by macvi on 2017/4/2. diff --git a/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java b/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java index 8ae2458de7..b279f68a64 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java @@ -1,6 +1,6 @@ package data_structure; -import basic.dataStructure.LRUPageFrame; +import basic.dataStructure.linkedList.LRUPageFrame; import org.junit.Assert; import org.junit.Test; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java index c98a305623..b3605b5df8 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java @@ -1,6 +1,6 @@ package data_structure; -import basic.dataStructure.LinkedList; +import basic.dataStructure.linkedList.LinkedList; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java b/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java index 3db6d82e49..1d501c7c1f 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java @@ -2,7 +2,7 @@ import org.junit.Assert; import org.junit.Test; -import basic.dataStructure.Queue; +import basic.dataStructure.queue.Queue; /** * Created by macvi on 2017/4/4. From b3f17ea7fa76a30bf4ef86467e994d65e1b7286f Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 21 Apr 2017 16:44:40 +0800 Subject: [PATCH 220/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=92=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=BB=93=E6=9E=84=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataStructure/{ => stack}/Stack.java | 8 +++- .../test/java/data_structure/StackTest.java | 39 +++++++------------ 2 files changed, 19 insertions(+), 28 deletions(-) rename group24/75939388/learning2017/src/main/java/basic/dataStructure/{ => stack}/Stack.java (78%) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java similarity index 78% rename from group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java rename to group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java index 279e551431..48f4d3c740 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java @@ -1,4 +1,4 @@ -package basic.dataStructure; +package basic.dataStructure.stack; import basic.dataStructure.array.ArrayList; @@ -35,7 +35,11 @@ public int size(){ public String toString() { StringBuffer sb = new StringBuffer(); for(int i = this.size() - 1; i >= 0; i--){ - sb.append(elementData.get(i).toString()).append(","); + if(i != 0){ + sb.append(elementData.get(i).toString()).append(","); + }else{ + sb.append(elementData.get(i).toString()); + } } return sb.toString(); diff --git a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java b/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java index b933b8b63e..2946f174a7 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java @@ -1,49 +1,36 @@ package data_structure; +import basic.dataStructure.stack.Stack; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; -import basic.dataStructure.Stack; /** * Created by macvi on 2017/4/4. */ public class StackTest { - private Stack getStack(){ - Stack s = new Stack(); + private Stack s; + + @Before + public void init(){ + s = new Stack(); for(int i = 0; i < 14; i ++){ s.push(i + ""); } - - return s; } @Test - public void pushTest(){ - Stack s = getStack(); - - System.out.println("stack-->" + s.toString()); - } - - @Test - public void testSize(){ - Stack s = getStack(); - - Assert.assertEquals(14, s.size()); + public void test1(){ + Assert.assertEquals("13,12,11,10,9,8,7,6,5,4,3,2,1,0", s.toString()); + Assert.assertEquals("13", s.pop()); + Assert.assertEquals(13, s.size()); + Assert.assertEquals("12", s.peek()); } @Test - public void testPeek(){ - Stack s = getStack(); + public void test2(){ - Assert.assertEquals("13", s.peek()); } - @Test - public void testPop(){ - Stack s = getStack(); - - Assert.assertEquals("13", s.pop()); - Assert.assertEquals(13, s.size()); - } } From 7cff084ad69a7ab92eac852df250d64df9c89071 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 21 Apr 2017 17:33:11 +0800 Subject: [PATCH 221/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/basic/dataStructure/stack/Stack.java | 8 +++ .../basic/dataStructure/stack/StackUtil.java | 59 ++++++++++++++++--- .../test/java/data_structure/StackTest.java | 11 +++- 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java index 48f4d3c740..f51bb88268 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java @@ -9,6 +9,14 @@ public class Stack { private ArrayList elementData = new ArrayList(); + public Stack(){} + + public Stack(Object...objs){ + for(int i = 0; i < objs.length; i++){ + this.push(objs[i]); + } + } + public void push(Object o){ this.elementData.add(o); } diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java index 5292114c44..e2b197d471 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java @@ -1,5 +1,5 @@ package basic.dataStructure.stack; -import java.util.Stack; + public class StackUtil { @@ -8,10 +8,13 @@ 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) { - - - + public static Stack reverse(Stack s) { + Stack st = new Stack(); + int size = s.size(); + for(int i = 0; i < size; i++){ + st.push(s.pop()); + } + return st; } /** @@ -19,8 +22,19 @@ public static void reverse(Stack s) { * * @param o */ - public static void remove(Stack s,Object o) { - + public static Stack remove(Stack s,Object o) { + Stack tmp = new Stack(); + int size = s.size(); + for(int i = 0; i < size; i++){ + Object obj = s.peek(); + if(obj != o && !obj.equals(o)){ + tmp.push(s.pop()); + }else{ + s.pop(); + } + } + + return tmp; } /** @@ -30,7 +44,22 @@ public static void remove(Stack s,Object o) { * @return */ public static Object[] getTop(Stack s,int len) { - return null; + Stack temp = new Stack(); + int size = s.size(); + Object[] objs = new Object[len]; + for(int i = 0; i < size; i++){ + Object obj = s.pop(); + if(i < len){ + objs[i] = obj; + } + temp.push(obj); + } + + for(int i = 0 ; i < size; i ++){ + s.push(temp.pop()); + } + + return objs; } /** * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz @@ -41,7 +70,19 @@ public static Object[] getTop(Stack s,int len) { * @return */ public static boolean isValidPairs(String s){ - return false; + //圆括号 + Stack bracket = new Stack("(", ")"); + + //方括号 + Stack brackets = new Stack("[", "]"); + + //花括号 + Stack braces = new Stack("{", "}"); + + //String转化为Stack + char[] arr = s.toCharArray(); + Stack strSt = new Stack(arr); + } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java b/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java index 2946f174a7..ad151919f6 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java @@ -1,10 +1,13 @@ package data_structure; import basic.dataStructure.stack.Stack; +import basic.dataStructure.stack.StackUtil; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.Arrays; + /** * Created by macvi on 2017/4/4. */ @@ -15,14 +18,14 @@ public class StackTest { @Before public void init(){ s = new Stack(); - for(int i = 0; i < 14; i ++){ + for(int i = 0; i < 5; i ++){ s.push(i + ""); } } @Test public void test1(){ - Assert.assertEquals("13,12,11,10,9,8,7,6,5,4,3,2,1,0", s.toString()); + Assert.assertEquals("4,3,2,1,0", s.toString()); Assert.assertEquals("13", s.pop()); Assert.assertEquals(13, s.size()); Assert.assertEquals("12", s.peek()); @@ -30,7 +33,9 @@ public void test1(){ @Test public void test2(){ - +// Assert.assertEquals("0,1,2,3,4", StackUtil.reverse(s).toString()); +// Assert.assertEquals("0,1,3,4", StackUtil.remove(s, "2").toString()); + Assert.assertEquals("[4, 3]", Arrays.toString(StackUtil.getTop(s, 2))); } } From 7a4cde88600627eba782b518079846b6ac7ab120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=9A=E5=90=AF=E7=9B=BC?= Date: Fri, 21 Apr 2017 18:13:52 +0800 Subject: [PATCH 222/552] constanst --- .../com/pan/jvm/loader/ClassFileParser.java | 12 ++++---- .../src/test/java/com/pan/MapForEachTest.java | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 group11/252308879/mini-jvm/src/test/java/com/pan/MapForEachTest.java diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/loader/ClassFileParser.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/loader/ClassFileParser.java index b2bddb85c2..e2467d3885 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/loader/ClassFileParser.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/loader/ClassFileParser.java @@ -110,40 +110,40 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { switch (tag) { - case 7: //CONSTANT_Class + case ConstantInfo.CLASS_INFO: //CONSTANT_Class int utf8Index = iter.nextU2ToInt(); ClassInfo classInfo = new ClassInfo(pool); classInfo.setUtf8Index(utf8Index); pool.addConstantInfo(classInfo); break; - case 9: // CONSTANT_Fieldref + case ConstantInfo.FIELD_INFO: // CONSTANT_Fieldref FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); fieldRefInfo.setClassInfoIndex(iter.nextU2ToInt()); fieldRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); pool.addConstantInfo(fieldRefInfo); break; - case 10: // CONSTANT_Methodref + case ConstantInfo.METHOD_INFO: // CONSTANT_Methodref MethodRefInfo methodRefInfo = new MethodRefInfo(pool); methodRefInfo.setClassInfoIndex(iter.nextU2ToInt()); methodRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); pool.addConstantInfo(methodRefInfo); break; - case 8: + case ConstantInfo.STRING_INFO: StringInfo info = new StringInfo(pool); info.setIndex(iter.nextU2ToInt()); pool.addConstantInfo(info); break; - case 12: // CONSTANT_NameAndType + case ConstantInfo.NAME_AND_TYPE_INFO: // CONSTANT_NameAndType NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); nameAndTypeInfo.setIndex1(iter.nextU2ToInt()); nameAndTypeInfo.setIndex2(iter.nextU2ToInt()); pool.addConstantInfo(nameAndTypeInfo); break; - case 1: // CONSTANT_Utf8 + case ConstantInfo.UTF8_INFO: // CONSTANT_Utf8 int length = iter.nextU2ToInt(); byte[] data = iter.getBytes(length); String value = null; diff --git a/group11/252308879/mini-jvm/src/test/java/com/pan/MapForEachTest.java b/group11/252308879/mini-jvm/src/test/java/com/pan/MapForEachTest.java new file mode 100644 index 0000000000..9170ba4f49 --- /dev/null +++ b/group11/252308879/mini-jvm/src/test/java/com/pan/MapForEachTest.java @@ -0,0 +1,30 @@ +package com.pan; + +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by QiPan on 2017/4/19. + */ +public class MapForEachTest { + + @Test + public void testForEach(){ + + Map map = new HashMap<>(); + map.put(1, 11); + map.put(2, 22); + map.put(3, 33); + + Map map2 = new HashMap<>(); + map.forEach((key, value) -> map2.put(key, value.toString())); + + System.out.println(map2); + + + + } + +} From fa6590f5807f1021369a78ad7d03d0972bea8a86 Mon Sep 17 00:00:00 2001 From: gongxun Date: Fri, 21 Apr 2017 19:05:11 +0800 Subject: [PATCH 223/552] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.5/constant/ClassInfo.java | 5 ++ .../785396327/4.5/constant/ConstantInfo.java | 23 ++++++- .../785396327/4.5/constant/FieldRefInfo.java | 5 ++ .../785396327/4.5/constant/MethodRefInfo.java | 63 ++++++++++++++++--- .../4.5/constant/NameAndTypeInfo.java | 5 ++ .../4.5/constant/NullConstantInfo.java | 5 ++ .../785396327/4.5/constant/StringInfo.java | 5 ++ group17/785396327/4.5/constant/UTF8Info.java | 6 ++ 8 files changed, 108 insertions(+), 9 deletions(-) diff --git a/group17/785396327/4.5/constant/ClassInfo.java b/group17/785396327/4.5/constant/ClassInfo.java index 1143ac1faa..4bc1f373df 100644 --- a/group17/785396327/4.5/constant/ClassInfo.java +++ b/group17/785396327/4.5/constant/ClassInfo.java @@ -19,6 +19,11 @@ public int getType() { return type; } + @Override + public void accept(Visitor visitor) { + + } + public String getClassName() { int index = getUtf8Index(); UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); diff --git a/group17/785396327/4.5/constant/ConstantInfo.java b/group17/785396327/4.5/constant/ConstantInfo.java index 8e6eaf72cf..156d96827d 100644 --- a/group17/785396327/4.5/constant/ConstantInfo.java +++ b/group17/785396327/4.5/constant/ConstantInfo.java @@ -13,19 +13,38 @@ public abstract class ConstantInfo { public static final int NAME_AND_TYPE_INFO = 12; protected ConstantPool constantPool; - public ConstantInfo(){ + public ConstantInfo() { } public ConstantInfo(ConstantPool pool) { this.constantPool = pool; } + public abstract int getType(); public ConstantPool getConstantPool() { return constantPool; } - public ConstantInfo getConstantInfo(int index){ + + public ConstantInfo getConstantInfo(int index) { return this.constantPool.getConstantInfo(index); } + + public abstract void accept(Visitor visitor); + + public interface Visitor { + void visitClassInfo(ClassInfo info); + + void visitFieldRef(FieldRefInfo info); + + void visitMethodRef(MethodRefInfo info); + + void visitNameAndType(NameAndTypeInfo info); + + void visitString(StringInfo info); + + void visistUTF8(UTF8Info info); + + } } diff --git a/group17/785396327/4.5/constant/FieldRefInfo.java b/group17/785396327/4.5/constant/FieldRefInfo.java index 1e86db4134..7d813221f5 100644 --- a/group17/785396327/4.5/constant/FieldRefInfo.java +++ b/group17/785396327/4.5/constant/FieldRefInfo.java @@ -15,6 +15,11 @@ public int getType() { return type; } + @Override + public void accept(Visitor visitor) { + + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group17/785396327/4.5/constant/MethodRefInfo.java b/group17/785396327/4.5/constant/MethodRefInfo.java index a3df142200..78b6cf74e7 100644 --- a/group17/785396327/4.5/constant/MethodRefInfo.java +++ b/group17/785396327/4.5/constant/MethodRefInfo.java @@ -3,7 +3,7 @@ /** * Created by IBM on 2017/4/10. */ -public class MethodRefInfo extends ConstantInfo { +public class MethodRefInfo extends ConstantInfo implements ConstantInfo.Visitor { private int type = ConstantInfo.METHOD_INFO; private int classInfoIndex; @@ -17,32 +17,81 @@ public int getType() { return type; } + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + 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(){ + public String toString() { - return getClassName() +" : "+ this.getMethodName() + " : " + this.getNameAndTypeIndex() ; + return getClassName() + " : " + this.getMethodName() + " : " + this.getNameAndTypeIndex(); } - public String getClassName(){ + + public String getClassName() { ConstantPool pool = this.getConstantPool(); - ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex()); + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(this.getClassInfoIndex()); return clzInfo.getClassName(); } - public String getMethodName(){ + public String getMethodName() { ConstantPool pool = this.getConstantPool(); - NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getName(); } + + @Override + public void visitClassInfo(ClassInfo info) { + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder sb = new StringBuilder(); + sb.append("\t# = Methodref\t\t\t#") + .append(classInfoIndex) + .append(".#") + .append(nameAndTypeIndex) + .append("\t\t// ") + .append(getClassName() + ".") + .append(((NameAndTypeInfo) getConstantInfo(nameAndTypeIndex)).getName()) + .append(".") + .append(((NameAndTypeInfo) getConstantInfo(nameAndTypeIndex)).getTypeInfo()); + System.out.println(sb.toString()); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + + } + + @Override + public void visitString(StringInfo info) { + + } + + @Override + public void visistUTF8(UTF8Info info) { + + } } diff --git a/group17/785396327/4.5/constant/NameAndTypeInfo.java b/group17/785396327/4.5/constant/NameAndTypeInfo.java index f59efe07c0..ffb50f622a 100644 --- a/group17/785396327/4.5/constant/NameAndTypeInfo.java +++ b/group17/785396327/4.5/constant/NameAndTypeInfo.java @@ -29,6 +29,11 @@ public int getType() { return type; } + @Override + public void accept(Visitor visitor) { + + } + public String getName(){ ConstantPool pool = this.getConstantPool(); diff --git a/group17/785396327/4.5/constant/NullConstantInfo.java b/group17/785396327/4.5/constant/NullConstantInfo.java index c6bc0c17e5..e11e114840 100644 --- a/group17/785396327/4.5/constant/NullConstantInfo.java +++ b/group17/785396327/4.5/constant/NullConstantInfo.java @@ -11,4 +11,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group17/785396327/4.5/constant/StringInfo.java b/group17/785396327/4.5/constant/StringInfo.java index 595eed7f47..2da9f3a9c5 100644 --- a/group17/785396327/4.5/constant/StringInfo.java +++ b/group17/785396327/4.5/constant/StringInfo.java @@ -14,6 +14,11 @@ public int getType() { return type; } + @Override + public void accept(Visitor visitor) { + + } + public int getIndex() { return index; } diff --git a/group17/785396327/4.5/constant/UTF8Info.java b/group17/785396327/4.5/constant/UTF8Info.java index 12b8395559..8cf71cc4dc 100644 --- a/group17/785396327/4.5/constant/UTF8Info.java +++ b/group17/785396327/4.5/constant/UTF8Info.java @@ -19,6 +19,12 @@ public void setLength(int length) { public int getType() { return type; } + + @Override + public void accept(Visitor visitor) { + + } + @Override public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; From fb66d26cfff5329acff360ff059657bc7cd77f72 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Fri, 21 Apr 2017 21:12:20 +0800 Subject: [PATCH 224/552] update min-jvm --- .../src/com/donaldy/jvm/attr/CodeAttr.java | 47 ++++--- .../donaldy/jvm/attr/LocalVariableTable.java | 23 +++- .../src/com/donaldy/jvm/clz/ClassFile.java | 14 +- .../src/com/donaldy/jvm/cmd/BiPushCmd.java | 23 ++++ .../com/donaldy/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++++++++ .../com/donaldy/jvm/cmd/CommandParser.java | 85 ++++++++++++ .../src/com/donaldy/jvm/cmd/GetFieldCmd.java | 22 +++ .../donaldy/jvm/cmd/GetStaticFieldCmd.java | 23 ++++ .../com/donaldy/jvm/cmd/InvokeSpecialCmd.java | 23 ++++ .../com/donaldy/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../src/com/donaldy/jvm/cmd/LdcCmd.java | 29 ++++ .../src/com/donaldy/jvm/cmd/NewObjectCmd.java | 19 +++ .../src/com/donaldy/jvm/cmd/NoOperandCmd.java | 23 ++++ .../com/donaldy/jvm/cmd/OneOperandCmd.java | 27 ++++ .../src/com/donaldy/jvm/cmd/PutFieldCmd.java | 19 +++ .../com/donaldy/jvm/cmd/TwoOperandCmd.java | 67 +++++++++ .../src/com/donaldy/jvm/method/Method.java | 21 +++ .../donaldy/jvm/print/ClassFilePrinter.java | 54 ++++++++ .../jvm/print/ConstantPoolPrinter.java | 25 ++++ .../donaldy/jvm/test/ClassFileloaderTest.java | 84 ++++++++++++ 20 files changed, 753 insertions(+), 25 deletions(-) create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java create mode 100644 group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java diff --git a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java index 6b699e6991..22e48645be 100644 --- a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java +++ b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java @@ -1,6 +1,7 @@ package com.donaldy.jvm.attr; import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.cmd.ByteCodeCommand; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.loader.ByteCodeIterator; @@ -14,21 +15,21 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -36,21 +37,33 @@ public void setLineNumberTable(LineNumberTable t) { } public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; + this.localVarTable = t; } - + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - + return null; } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); - + public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen); } - + public static LocalVariableTable parse(ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); int attrLen = iter.nextU4ToInt(); @@ -38,8 +38,19 @@ public static LocalVariableTable parse(ByteCodeIterator iter){ return lvTable; } private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); + this.items.add(item); + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); } - - } diff --git a/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java b/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java index c36e1940b1..df5d9a0f9b 100644 --- a/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java +++ b/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java @@ -80,13 +80,23 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..266edbc5e8 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..48ded9618a --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.donaldy.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java b/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..407040f102 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.donaldy.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.donaldy.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..9fe5244f8a --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..21236d26c6 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ClassInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..7b56e9009b --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..58e1d1ff5e --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..28fe64a88d --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..27c8cd13ca --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..40d11a7bce --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..9a1709a9c7 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..4b3b8c1fab --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..1d38c8ed3f --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ClassInfo; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/method/Method.java b/group24/448641125/src/com/donaldy/jvm/method/Method.java index a69ff696b8..603e773b87 100644 --- a/group24/448641125/src/com/donaldy/jvm/method/Method.java +++ b/group24/448641125/src/com/donaldy/jvm/method/Method.java @@ -2,6 +2,7 @@ import com.donaldy.jvm.attr.*; import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.cmd.ByteCodeCommand; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.UTF8Info; import com.donaldy.jvm.loader.ByteCodeIterator; @@ -86,4 +87,24 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java b/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..26e9d183d4 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java @@ -0,0 +1,54 @@ +package com.donaldy.jvm.print; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ClassInfo; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.constant.NameAndTypeInfo; + +import com.donaldy.jvm.constant.StringInfo; +import com.donaldy.jvm.constant.UTF8Info; +import com.donaldy.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java b/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..7070d5766e --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,25 @@ +package com.donaldy.jvm.print; + +import com.donaldy.jvm.constant.ClassInfo; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.constant.NameAndTypeInfo; +import com.donaldy.jvm.constant.StringInfo; +import com.donaldy.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java index 8610fda4c9..0884878010 100644 --- a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java +++ b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java @@ -2,6 +2,10 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.clz.ClassIndex; +import com.donaldy.jvm.cmd.BiPushCmd; +import com.donaldy.jvm.cmd.ByteCodeCommand; +import com.donaldy.jvm.cmd.OneOperandCmd; +import com.donaldy.jvm.cmd.TwoOperandCmd; import com.donaldy.jvm.constant.*; import com.donaldy.jvm.field.Field; import com.donaldy.jvm.method.Method; @@ -276,4 +280,84 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedCode, code); } + + /** + * 第四次 JVM作业 + */ + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + } From c2bdaa8ba49db9af61fc05997e502333e51a6440 Mon Sep 17 00:00:00 2001 From: Haochen Date: Fri, 21 Apr 2017 21:20:36 +0800 Subject: [PATCH 225/552] modify InfixExpr using Token & TokenParser --- .../java/algorithm/expression/InfixExpr.java | 94 ++++--------------- .../algorithm/expression/InfixExprTest.java | 3 +- 2 files changed, 17 insertions(+), 80 deletions(-) diff --git a/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java b/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java index ad4fae505b..8ab94a5093 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java @@ -7,63 +7,41 @@ public class InfixExpr { - Stack numbers = new Stack(); - Stack operators = new Stack(); + private Stack numbers = new Stack(); + private Stack operators = new Stack(); - String expr = null; + private String expr = null; public InfixExpr(String expr) { this.expr = expr; operators.push("#"); } - public float evaluate() throws CalculateException { + public float evaluate() { numbers.clear(); operators.clear(); operators.push("#"); - String[] split = split(expr); - String[] strs = new String[split.length + 1]; - strs[strs.length - 1] = "#"; - System.arraycopy(split, 0, strs, 0, split.length); + List tokens = TokenParser.parse(expr); + tokens.add(new Token(Token.OPERATOR, "#")); - for (int i = 0; !operators.isEmpty() && i < strs.length; ++i) { - String str = strs[i]; - try { - float number = Float.parseFloat(str); - putNumber(number); - } catch (NumberFormatException e) { - putOperator(str); + for (int i = 0; !operators.isEmpty() && i < tokens.size(); ++i) { + Token token = tokens.get(i); + if (token.isNumber()) { + putNumber(token.getFloatValue()); + } else { + putOperator(token.toString()); } } return numbers.isEmpty() ? 0 : (float) numbers.peek(); } - private String[] split(String expr) { - List list = new ArrayList<>(); - int startPos = 0; - for (int i = 0, j = 1; j < expr.length(); ++i, ++j) { - char cI = expr.charAt(i); - char cJ = expr.charAt(j); - if (isDigit(cI) ^ isDigit(cJ)) { - list.add(expr.substring(startPos, j)); - startPos = j; - } - } - list.add(expr.substring(startPos)); - return list.toArray(new String[list.size()]); - } - - private boolean isDigit(char c) { - return Character.isDigit(c) || c == '.'; - } - private void putNumber(float num) { numbers.push(num); } - private void putOperator(String op) throws CalculateException { - int compare = compare(op, (String) operators.peek()); + private void putOperator(String op) { + int compare = Token.compare(op, (String) operators.peek()); switch (compare) { case 1: operators.push(op); @@ -82,7 +60,7 @@ private void putOperator(String op) throws CalculateException { } } - private float calculate(float num2, String op, float num1) throws CalculateException { + private float calculate(float num2, String op, float num1) { switch (op) { case "+": return num2 + num1; @@ -95,46 +73,6 @@ private float calculate(float num2, String op, float num1) throws CalculateExcep return num2 / num1; } } - throw new CalculateException(); - } - - private int compare(String op, String peek) { - int opIndex = indexOf(op); - int peekIndex = indexOf(peek); - return table[opIndex][peekIndex]; - } - - private int indexOf(String op) { - switch (op) { - case "+": - return 0; - case "-": - return 1; - case "*": - return 2; - case "/": - return 3; - case "(": - return 4; - case ")": - return 5; - case "#": - return 6; - } - return 0; + throw new RuntimeException("Divide by 0"); } - - //优先级表 - private int[][] table = { - // + - * / ( ) # - {-1, -1, -1, -1, 1, -1, 1}, // + - {-1, -1, -1, -1, 1, -1, 1}, // - - { 1, 1, -1, -1, 1, -1, 1}, // * - { 1, 1, -1, -1, 1, -1, 1}, // / - { 1, 1, 1, 1, 1, -1, 1}, // ( - {-1, -1, -1, -1, -1, 0, 1}, // ) - {-1, -1, -1, -1, -1, -1, 0} // # - }; - - public static class CalculateException extends Exception {} } diff --git a/group01/895457260/code/src/test/java/algorithm/expression/InfixExprTest.java b/group01/895457260/code/src/test/java/algorithm/expression/InfixExprTest.java index e4c63b79f7..f46783f4d0 100644 --- a/group01/895457260/code/src/test/java/algorithm/expression/InfixExprTest.java +++ b/group01/895457260/code/src/test/java/algorithm/expression/InfixExprTest.java @@ -17,8 +17,7 @@ public void tearDown() throws Exception { } @Test - public void testEvaluate() throws InfixExpr.CalculateException { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + public void testEvaluate() throws Exception { { InfixExpr expr = new InfixExpr("2+3*4+5"); Assert.assertEquals(19.0, expr.evaluate(), 0.001f); From 44e05805ebf6e5c2c0d2066677d79779efac2b7b Mon Sep 17 00:00:00 2001 From: Haochen Date: Fri, 21 Apr 2017 21:40:38 +0800 Subject: [PATCH 226/552] make InfixExpr to ignore invisiable chars --- .../code/src/main/java/algorithm/expression/InfixExpr.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java b/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java index 8ab94a5093..d779244b58 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java @@ -10,10 +10,10 @@ public class InfixExpr { private Stack numbers = new Stack(); private Stack operators = new Stack(); - private String expr = null; - + private String expr; + public InfixExpr(String expr) { - this.expr = expr; + this.expr = expr.replaceAll("\\s", ""); operators.push("#"); } From 8bcfc5e8a355671ea50c7de00db97ced8ebc8103 Mon Sep 17 00:00:00 2001 From: Haochen Date: Fri, 21 Apr 2017 22:37:12 +0800 Subject: [PATCH 227/552] refactor InfixExpr --- .../java/algorithm/expression/InfixExpr.java | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java b/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java index d779244b58..5f8bd1f318 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/InfixExpr.java @@ -14,34 +14,33 @@ public class InfixExpr { public InfixExpr(String expr) { this.expr = expr.replaceAll("\\s", ""); - operators.push("#"); } public float evaluate() { numbers.clear(); operators.clear(); - operators.push("#"); + operators.push(Token.SCOPE); List tokens = TokenParser.parse(expr); - tokens.add(new Token(Token.OPERATOR, "#")); + tokens.add(Token.SCOPE); - for (int i = 0; !operators.isEmpty() && i < tokens.size(); ++i) { + for (int i = 0; i < tokens.size() && !operators.isEmpty(); ++i) { Token token = tokens.get(i); if (token.isNumber()) { - putNumber(token.getFloatValue()); + putNumber(token); } else { - putOperator(token.toString()); + putOperator(token); } } - return numbers.isEmpty() ? 0 : (float) numbers.peek(); + return numbers.isEmpty() ? 0 : ((Token) numbers.peek()).getFloatValue(); } - private void putNumber(float num) { + private void putNumber(Token num) { numbers.push(num); } - private void putOperator(String op) { - int compare = Token.compare(op, (String) operators.peek()); + private void putOperator(Token op) { + int compare = Token.compare(op, (Token) operators.peek()); switch (compare) { case 1: operators.push(op); @@ -50,29 +49,13 @@ private void putOperator(String op) { operators.pop(); break; case -1: - float num1 = (float) numbers.pop(); - float num2 = (float) numbers.pop(); - String operator = (String) operators.pop(); - float result = calculate(num2, operator, num1); + Token num1 = (Token) numbers.pop(); + Token num2 = (Token) numbers.pop(); + Token operator = (Token) operators.pop(); + Token result = Token.calculate(num2, operator, num1); numbers.push(result); putOperator(op); break; } } - - private float calculate(float num2, String op, float num1) { - switch (op) { - case "+": - return num2 + num1; - case "-": - return num2 - num1; - case "*": - return num2 * num1; - case "/": - if (num1 != 0) { - return num2 / num1; - } - } - throw new RuntimeException("Divide by 0"); - } } From a806293f293741b3654383c2110cda1d581210e7 Mon Sep 17 00:00:00 2001 From: Haochen Date: Fri, 21 Apr 2017 22:38:30 +0800 Subject: [PATCH 228/552] finish PostfixExpr --- .../algorithm/expression/PostfixExpr.java | 46 +++++++++++++++++++ .../algorithm/expression/PostfixExprTest.java | 37 +++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 group01/895457260/code/src/main/java/algorithm/expression/PostfixExpr.java create mode 100644 group01/895457260/code/src/test/java/algorithm/expression/PostfixExprTest.java diff --git a/group01/895457260/code/src/main/java/algorithm/expression/PostfixExpr.java b/group01/895457260/code/src/main/java/algorithm/expression/PostfixExpr.java new file mode 100644 index 0000000000..6614d0ec7d --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/expression/PostfixExpr.java @@ -0,0 +1,46 @@ +package algorithm.expression; + +import datastructure.basic.Stack; + +import java.util.EmptyStackException; +import java.util.List; + +public class PostfixExpr { + + private String expr; + private String splitRegex; + private Stack stack = new Stack(); + + public PostfixExpr(String expr) { + this.expr = expr; + this.splitRegex = " "; + } + + public PostfixExpr(String expr, String splitRegex) { + this.expr = expr; + this.splitRegex = splitRegex; + } + + public float evaluate() { + stack.clear(); + List tokens = TokenParser.parse(expr, splitRegex); + + try { + for (Token token : tokens) { + if (token.isNumber()) { + stack.push(token); + } else { + Token num1 = (Token) stack.pop(); + Token num2 = (Token) stack.pop(); + stack.push(Token.calculate(num2, token, num1)); + } + } + } catch (EmptyStackException e) { + throw new RuntimeException("Wrong expression: " + expr); + } + if (stack.size() != 1) { + throw new RuntimeException("Wrong expression: " + expr); + } + return ((Token) stack.pop()).getFloatValue(); + } +} diff --git a/group01/895457260/code/src/test/java/algorithm/expression/PostfixExprTest.java b/group01/895457260/code/src/test/java/algorithm/expression/PostfixExprTest.java new file mode 100644 index 0000000000..d57f19fcda --- /dev/null +++ b/group01/895457260/code/src/test/java/algorithm/expression/PostfixExprTest.java @@ -0,0 +1,37 @@ +package algorithm.expression; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} From c32d8936565552b3e50ac222899c3d88ea79f740 Mon Sep 17 00:00:00 2001 From: Haochen Date: Fri, 21 Apr 2017 22:38:57 +0800 Subject: [PATCH 229/552] finish PrefixExpr --- .../algorithm/expression/InfixToPostfix.java | 14 +++ .../java/algorithm/expression/PrefixExpr.java | 47 ++++++++ .../main/java/algorithm/expression/Token.java | 106 ++++++++++++++++++ .../algorithm/expression/TokenParser.java | 53 +++++++++ .../main/java/jvm/print/ClassFilePrinter.java | 44 ++++++++ .../java/jvm/print/ConstantPoolPrinter.java | 15 +++ .../algorithm/expression/PrefixExprTest.java | 44 ++++++++ .../algorithm/expression/TokenParserTest.java | 39 +++++++ 8 files changed, 362 insertions(+) create mode 100644 group01/895457260/code/src/main/java/algorithm/expression/InfixToPostfix.java create mode 100644 group01/895457260/code/src/main/java/algorithm/expression/PrefixExpr.java create mode 100644 group01/895457260/code/src/main/java/algorithm/expression/Token.java create mode 100644 group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java create mode 100644 group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java create mode 100644 group01/895457260/code/src/main/java/jvm/print/ConstantPoolPrinter.java create mode 100644 group01/895457260/code/src/test/java/algorithm/expression/PrefixExprTest.java create mode 100644 group01/895457260/code/src/test/java/algorithm/expression/TokenParserTest.java diff --git a/group01/895457260/code/src/main/java/algorithm/expression/InfixToPostfix.java b/group01/895457260/code/src/main/java/algorithm/expression/InfixToPostfix.java new file mode 100644 index 0000000000..58ffe99cd3 --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/expression/InfixToPostfix.java @@ -0,0 +1,14 @@ +package algorithm.expression; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} diff --git a/group01/895457260/code/src/main/java/algorithm/expression/PrefixExpr.java b/group01/895457260/code/src/main/java/algorithm/expression/PrefixExpr.java new file mode 100644 index 0000000000..2b70fab0a3 --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/expression/PrefixExpr.java @@ -0,0 +1,47 @@ +package algorithm.expression; + +import datastructure.basic.Stack; + +import java.util.EmptyStackException; +import java.util.List; + +public class PrefixExpr { + private String expr; + private String splitRegex; + private Stack stack = new Stack(); + + public PrefixExpr(String expr) { + this.expr = expr; + this.splitRegex = " "; + } + + public PrefixExpr(String expr, String splitRegex) { + this.expr = expr; + this.splitRegex = splitRegex; + } + + public float evaluate() { + stack.clear(); + List tokens = TokenParser.parse(expr, splitRegex); + + try { + for (int i = tokens.size() - 1; i >= 0; --i) { + Token token = tokens.get(i); + if (token.isNumber()) { + stack.push(token); + } else { + Token num1 = (Token) stack.pop(); + Token num2 = (Token) stack.pop(); + Token result = Token.calculate(num1, token, num2); + stack.push(result); + } + } + } catch (EmptyStackException e) { + throw new RuntimeException("Wrong expression: " + expr); + } + if (stack.size() != 1) { + throw new RuntimeException("Wrong expression: " + expr); + } + return ((Token) stack.pop()).getFloatValue(); + } +} diff --git a/group01/895457260/code/src/main/java/algorithm/expression/Token.java b/group01/895457260/code/src/main/java/algorithm/expression/Token.java new file mode 100644 index 0000000000..3aa4f6f9c4 --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/expression/Token.java @@ -0,0 +1,106 @@ +package algorithm.expression; + +import java.util.Arrays; +import java.util.List; + +class Token { + public static final String ADD = "+"; + public static final String SUB = "-"; + public static final String MUL = "*"; + public static final String DIV = "/"; + public static final String L_BRACKET = "("; + public static final String R_BRACKET = ")"; + + public static final List OPERATORS = Arrays.asList(ADD, SUB, MUL, DIV, L_BRACKET, R_BRACKET); + public static final int OPERATOR = 1; + public static final int NUMBER = 2; + + public static final String SCOPE_STR = "#"; + public static final Token SCOPE = new Token(OPERATOR, SCOPE_STR); + + //优先级表 + private static int[][] priorities = { + // + - * / ( ) # + {-1, -1, -1, -1, 1, -1, 1}, // + + {-1, -1, -1, -1, 1, -1, 1}, // - + { 1, 1, -1, -1, 1, -1, 1}, // * + { 1, 1, -1, -1, 1, -1, 1}, // / + { 1, 1, 1, 1, 1, -1, 1}, // ( + {-1, -1, -1, -1, -1, 0, 1}, // ) + {-1, -1, -1, -1, -1, -1, 0} // # + }; + + String value; + int type; + + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public float getFloatValue() { + return Float.valueOf(value); + } + + public String toString(){ + return value; + } + + private static int indexOf(String op) { + switch (op) { + case ADD: + return 0; + case SUB: + return 1; + case MUL: + return 2; + case DIV: + return 3; + case L_BRACKET: + return 4; + case R_BRACKET: + return 5; + case SCOPE_STR: + return 6; + } + return 0; + } + + public static int compare(Token op, Token peek) { + int opIndex = indexOf(op.toString()); + int peekIndex = indexOf(peek.toString()); + return priorities[opIndex][peekIndex]; + } + + public static Token calculate(Token num1, Token op, Token num2) { + float result = 0.0f; + float n1 = num1.getFloatValue(); + float n2 = num2.getFloatValue(); + switch (op.toString()) { + case "+": + result = n1 + n2; + break; + case "-": + result = n1 - n2; + break; + case "*": + result = n1 * n2; + break; + case "/": + if (n2 == 0) { + throw new RuntimeException("Divide by 0"); + } + result = n1 / n2; + break; + } + return new Token(NUMBER, result + ""); + } +} \ No newline at end of file diff --git a/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java b/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java new file mode 100644 index 0000000000..fc146579bd --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java @@ -0,0 +1,53 @@ +package algorithm.expression; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + public static List parse(String expression) { + return parse(expression, null); + } + + public static List parse(String expression, String splitRegex) { + List tokens = new ArrayList<>(); + String[] split = splitRegex == null || "".equals(splitRegex) ? + new String[]{expression} : expression.split(splitRegex); + + for (String expr : split) { + int i = 0; + while (i < expr.length()) { + char c = expr.charAt(i); + if (isOperator(c)) { + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + } else if (Character.isDigit(c)) { + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + } else { + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + } + } + return tokens; + } + + private static int indexOfNextOperator(int i, String expr) { + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + + private static boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java b/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..632f36c2ea --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java @@ -0,0 +1,44 @@ +package jvm.print; + +import jvm.ClassFileLoader; +import jvm.classfile.ClassFile; +import jvm.exception.ReadClassException; + +public class ClassFilePrinter { + ClassFile clzFile; + + public ClassFilePrinter(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public void print() { + if (clzFile.getAccessFlag().isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name: " + clzFile.getClassName()); + System.out.println("Super Class Name: " + clzFile.getSuperClassName()); + System.out.println("Minor Version: " + clzFile.getMinorVersion()); + System.out.println("Major Version: " + clzFile.getMajorVersion()); + + ConstantPoolPrinter poolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + poolPrinter.print(); + } + + public static void main(String[] args) { + String path = "target/test-classes"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "jvm.EmployeeV1"; + + ClassFile clzFile = null; + try { + clzFile = loader.load(className); + } catch (ReadClassException e) { + e.printStackTrace(); + } + if (clzFile != null) { + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + printer.print(); + } + } +} diff --git a/group01/895457260/code/src/main/java/jvm/print/ConstantPoolPrinter.java b/group01/895457260/code/src/main/java/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..e528f351ad --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,15 @@ +package jvm.print; + +import jvm.classfile.ConstantPool; + +public class ConstantPoolPrinter { + ConstantPool pool; + + ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + System.out.println("Constant Pool:"); + } +} diff --git a/group01/895457260/code/src/test/java/algorithm/expression/PrefixExprTest.java b/group01/895457260/code/src/test/java/algorithm/expression/PrefixExprTest.java new file mode 100644 index 0000000000..a3aa9860f0 --- /dev/null +++ b/group01/895457260/code/src/test/java/algorithm/expression/PrefixExprTest.java @@ -0,0 +1,44 @@ +package algorithm.expression; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group01/895457260/code/src/test/java/algorithm/expression/TokenParserTest.java b/group01/895457260/code/src/test/java/algorithm/expression/TokenParserTest.java new file mode 100644 index 0000000000..b2a7aec54e --- /dev/null +++ b/group01/895457260/code/src/test/java/algorithm/expression/TokenParserTest.java @@ -0,0 +1,39 @@ +package algorithm.expression; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getFloatValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getFloatValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getFloatValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getFloatValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getFloatValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getFloatValue()); + } + +} From ca83f609a5a94239338689d30ad2d2b87adf3ab5 Mon Sep 17 00:00:00 2001 From: gongxun Date: Fri, 21 Apr 2017 23:34:18 +0800 Subject: [PATCH 230/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4.16/print/ClassFilePrinter.java | 48 +++++++++++++++++++ .../4.16/print/ConstantPoolPrinter.java | 48 +++++++++++++++++++ group17/785396327/4.5/clz/ClassFile.java | 7 ++- .../785396327/4.5/constant/ConstantPool.java | 1 + .../785396327/4.5/constant/MethodRefInfo.java | 41 +--------------- .../4.5/constant/NameAndTypeInfo.java | 20 ++++---- .../4.5/constant/NullConstantInfo.java | 1 + .../785396327/4.5/constant/StringInfo.java | 2 +- 8 files changed, 117 insertions(+), 51 deletions(-) create mode 100644 group17/785396327/4.16/print/ClassFilePrinter.java create mode 100644 group17/785396327/4.16/print/ConstantPoolPrinter.java diff --git a/group17/785396327/4.16/print/ClassFilePrinter.java b/group17/785396327/4.16/print/ClassFilePrinter.java new file mode 100644 index 0000000000..2c2b49bab0 --- /dev/null +++ b/group17/785396327/4.16/print/ClassFilePrinter.java @@ -0,0 +1,48 @@ +package print; + +import clz.ClassFile; +import jvm_1.ClassFileLoader; + +/** + * Created by gongxun on 2017/4/21. + */ +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group17/785396327/4.16/print/ConstantPoolPrinter.java b/group17/785396327/4.16/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..9e17cc1ff2 --- /dev/null +++ b/group17/785396327/4.16/print/ConstantPoolPrinter.java @@ -0,0 +1,48 @@ +package print; + +import constant.*; + +/** + * Created by gongxun on 2017/4/21. + */ +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + @Override + public void visitClassInfo(ClassInfo info) { + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + + } + + @Override + public void visitString(StringInfo info) { + + } + + @Override + public void visistUTF8(UTF8Info info) { + + } + }; + } +} diff --git a/group17/785396327/4.5/clz/ClassFile.java b/group17/785396327/4.5/clz/ClassFile.java index fe3f0f500e..f53199e6bb 100644 --- a/group17/785396327/4.5/clz/ClassFile.java +++ b/group17/785396327/4.5/clz/ClassFile.java @@ -1,6 +1,7 @@ package clz; import constant.ClassInfo; +import constant.ConstantInfo; import constant.ConstantPool; import field.Field; import method.Method; @@ -79,15 +80,17 @@ public void print(){ System.out.println("Super Class Name:"+ getSuperClassName()); + System.out.println("Constant pool:"); + } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } diff --git a/group17/785396327/4.5/constant/ConstantPool.java b/group17/785396327/4.5/constant/ConstantPool.java index b7b29bf115..396ccee230 100644 --- a/group17/785396327/4.5/constant/ConstantPool.java +++ b/group17/785396327/4.5/constant/ConstantPool.java @@ -28,4 +28,5 @@ public String getUTF8String(int index){ public Object getSize() { return this.constantInfos.size() -1; } + } diff --git a/group17/785396327/4.5/constant/MethodRefInfo.java b/group17/785396327/4.5/constant/MethodRefInfo.java index 78b6cf74e7..7a95d2a6bb 100644 --- a/group17/785396327/4.5/constant/MethodRefInfo.java +++ b/group17/785396327/4.5/constant/MethodRefInfo.java @@ -3,7 +3,7 @@ /** * Created by IBM on 2017/4/10. */ -public class MethodRefInfo extends ConstantInfo implements ConstantInfo.Visitor { +public class MethodRefInfo extends ConstantInfo{ private int type = ConstantInfo.METHOD_INFO; private int classInfoIndex; @@ -55,43 +55,4 @@ public String getMethodName() { return typeInfo.getName(); } - @Override - public void visitClassInfo(ClassInfo info) { - - } - - @Override - public void visitFieldRef(FieldRefInfo info) { - - } - - @Override - public void visitMethodRef(MethodRefInfo info) { - StringBuilder sb = new StringBuilder(); - sb.append("\t# = Methodref\t\t\t#") - .append(classInfoIndex) - .append(".#") - .append(nameAndTypeIndex) - .append("\t\t// ") - .append(getClassName() + ".") - .append(((NameAndTypeInfo) getConstantInfo(nameAndTypeIndex)).getName()) - .append(".") - .append(((NameAndTypeInfo) getConstantInfo(nameAndTypeIndex)).getTypeInfo()); - System.out.println(sb.toString()); - } - - @Override - public void visitNameAndType(NameAndTypeInfo info) { - - } - - @Override - public void visitString(StringInfo info) { - - } - - @Override - public void visistUTF8(UTF8Info info) { - - } } diff --git a/group17/785396327/4.5/constant/NameAndTypeInfo.java b/group17/785396327/4.5/constant/NameAndTypeInfo.java index ffb50f622a..a65456d245 100644 --- a/group17/785396327/4.5/constant/NameAndTypeInfo.java +++ b/group17/785396327/4.5/constant/NameAndTypeInfo.java @@ -4,8 +4,7 @@ * Created by IBM on 2017/4/10. */ public class NameAndTypeInfo extends ConstantInfo { - public int type = ConstantInfo.NAME_AND_TYPE_INFO; - + public int type = ConstantInfo.NAME_AND_TYPE_INFO; private int index1; private int index2; @@ -16,15 +15,19 @@ public NameAndTypeInfo(ConstantPool 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; } @@ -35,19 +38,20 @@ public void accept(Visitor visitor) { } - public String getName(){ + public String getName() { ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); + UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(index1); return utf8Info1.getValue(); } - public String getTypeInfo(){ + public String getTypeInfo() { ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2); + UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2); return utf8Info2.getValue(); } - public String toString(){ - return "(" + getName() + "," + getTypeInfo()+")"; + public String toString() { + return "(" + getName() + "," + getTypeInfo() + ")"; } + } diff --git a/group17/785396327/4.5/constant/NullConstantInfo.java b/group17/785396327/4.5/constant/NullConstantInfo.java index e11e114840..f3b1201e3a 100644 --- a/group17/785396327/4.5/constant/NullConstantInfo.java +++ b/group17/785396327/4.5/constant/NullConstantInfo.java @@ -16,4 +16,5 @@ public int getType() { public void accept(Visitor visitor) { } + } diff --git a/group17/785396327/4.5/constant/StringInfo.java b/group17/785396327/4.5/constant/StringInfo.java index 2da9f3a9c5..6953e7cdf8 100644 --- a/group17/785396327/4.5/constant/StringInfo.java +++ b/group17/785396327/4.5/constant/StringInfo.java @@ -16,7 +16,7 @@ public int getType() { @Override public void accept(Visitor visitor) { - + visitor.visitString(this); } public int getIndex() { From 8324f2289f9d634b5e6927072f93fd98e714e162 Mon Sep 17 00:00:00 2001 From: "kaitao.li" Date: Fri, 21 Apr 2017 23:40:31 +0800 Subject: [PATCH 231/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A,=20=E8=BF=90=E7=AE=97=E5=BC=8F=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/InfixExpr.java | 155 ++++++++++++++++-- 1 file changed, 141 insertions(+), 14 deletions(-) diff --git a/group01/280646174/basic/src/main/java/com/coding2017/basic/stack/expr/InfixExpr.java b/group01/280646174/basic/src/main/java/com/coding2017/basic/stack/expr/InfixExpr.java index 0f95b519dd..83eee7e6a5 100644 --- a/group01/280646174/basic/src/main/java/com/coding2017/basic/stack/expr/InfixExpr.java +++ b/group01/280646174/basic/src/main/java/com/coding2017/basic/stack/expr/InfixExpr.java @@ -1,18 +1,145 @@ package com.coding2017.basic.stack.expr; +import java.util.Arrays; +import java.util.List; +import java.util.Stack; +import java.util.stream.Collectors; + +import com.google.common.base.CharMatcher; +import com.google.common.collect.Lists; + public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - return 0.0f; - } - - - - + private static final CharMatcher CHAR_MATCHER = CharMatcher.anyOf(Operator.allOperator()); + + private Stack operatorStack = new Stack<>(); + private Stack numberStack = new Stack<>(); + + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List list = splitByOperator(expr); + for (String s : list) { + if (Operator.isOperator(s)) { + if (operatorStack.isEmpty()) { + operatorStack.push(s); + } else { + while (true) { + String op = operatorStack.peek(); + if (Operator.opOf(op).getPriority() >= Operator.opOf(s).getPriority()) { + calculateOnce(); + } else { + break; + } + if (operatorStack.isEmpty()) { + break; + } + } + operatorStack.push(s); + } + } else { + numberStack.push(Float.parseFloat(s)); + } + } + while (!operatorStack.isEmpty()) { + calculateOnce(); + } + if (numberStack.isEmpty() || numberStack.size() != 1) { + throw new RuntimeException("expr error"); + } + return numberStack.pop(); + } + + private void calculateOnce() { + String operator = operatorStack.pop(); + Float secondNumber = numberStack.pop(); + Float firstNumber = numberStack.pop(); + Float calculate = calculate(firstNumber, secondNumber, operator); + numberStack.push(calculate); + } + + private Float calculate(Float firstNumber, Float seconfNumber, String operator) { + if (Operator.ADD.getOp().equals(operator)) { + return firstNumber + seconfNumber; + } else if (Operator.MINUTE.getOp().equals(operator)) { + return firstNumber - seconfNumber; + } else if (Operator.MULTIPLY.getOp().equals(operator)) { + return firstNumber * seconfNumber; + } else if (Operator.DIVIDE.getOp().equals(operator)) { + return firstNumber / seconfNumber; + } + return null; + } + + private List splitByOperator(String expr) { + int pos = 0; + List list = Lists.newArrayList(); + while (pos < expr.length()) { + int index = CHAR_MATCHER.indexIn(expr, pos); + if (index < 0) { + list.add(expr.substring(pos).trim()); + pos = expr.length(); + } else { + list.add(expr.substring(pos, index).trim()); + list.add(expr.substring(index, index + 1)); + pos = index + 1; + } + } + return list; + } + + enum Operator { + ADD("+", 1), MINUTE("-", 1), MULTIPLY("*", 2), DIVIDE("/", 2); + + private String op; + private int priority; + + Operator(String op, int priority) { + this.op = op; + this.priority = priority; + } + + public static Operator opOf(String op) { + for (Operator operator : values()) { + if (operator.getOp().equals(op)) { + return operator; + } + } + return null; + } + + public static boolean isOperator(String op) { + for (Operator operator : values()) { + if (operator.getOp().equals(op)) { + return true; + } + } + return false; + } + + public static String allOperator() { + return Arrays.stream(values()).map(Operator::getOp).collect(Collectors.joining()); + } + + public String getOp() { + return op; + } + + public void setOp(String op) { + this.op = op; + } + + public int getPriority() { + return priority; + } + + public void setPriority(int priority) { + this.priority = priority; + } + + } + } From 2634c9926813101381b473aa1fed88527181b292 Mon Sep 17 00:00:00 2001 From: Haochen Date: Sat, 22 Apr 2017 00:08:30 +0800 Subject: [PATCH 232/552] add toHexString(byte[]) --- group01/895457260/code/src/main/java/jvm/util/ByteUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java b/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java index 87afccab3c..5a82776eef 100644 --- a/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java +++ b/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java @@ -5,6 +5,10 @@ * TODO: */ public class ByteUtils { + public static String toHexString(byte[] bytes) { + return toHexString(bytes, 0, bytes.length); + } + public static String toHexString(byte[] bytes, int off, int len) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < len; ++i) { From c9c03bc08ac548e5839d97ed039cd122170f4661 Mon Sep 17 00:00:00 2001 From: Haochen Date: Sat, 22 Apr 2017 00:10:05 +0800 Subject: [PATCH 233/552] finish constant pool printing --- .../main/java/jvm/classfile/ClassParser.java | 12 ++--- .../main/java/jvm/classfile/ConstantPool.java | 10 ++--- .../jvm/classfile/constant/item/Constant.java | 7 +++ .../constant/item/impl/ClassInfo.java | 12 +++++ .../constant/item/impl/CountConstant.java | 8 ++++ .../constant/item/impl/DoubleInfo.java | 13 ++++++ .../constant/item/impl/FieldRefInfo.java | 24 +++++++++- .../constant/item/impl/FloatInfo.java | 13 ++++++ .../constant/item/impl/IntegerInfo.java | 13 ++++++ .../item/impl/InterfaceMethodRefInfo.java | 24 +++++++++- .../constant/item/impl/InvokeDynamicInfo.java | 24 +++++++++- .../constant/item/impl/LongInfo.java | 13 ++++++ .../constant/item/impl/MethodHandleInfo.java | 16 ++++++- .../constant/item/impl/MethodRefInfo.java | 24 +++++++++- .../constant/item/impl/MethodTypeInfo.java | 22 +++++++++- .../constant/item/impl/NameAndTypeInfo.java | 28 +++++++++++- .../constant/item/impl/StringInfo.java | 12 +++++ .../constant/item/impl/UTF8Info.java | 10 +++++ .../main/java/jvm/print/ClassFilePrinter.java | 3 ++ .../java/jvm/print/ConstantPoolPrinter.java | 44 +++++++++++++++++++ 20 files changed, 315 insertions(+), 17 deletions(-) diff --git a/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java b/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java index bec7317e2c..398bbaa4f2 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java @@ -104,10 +104,12 @@ private static void parseMethods(ClassFile classFile, ByteCodeIterator iterator) private static void linkConstantReferences(ClassFile classFile) { ConstantPool constantPool = classFile.constantPool; - constantPool.forEach(c -> { - if (c instanceof IReference) { - ((IReference) c).linkReference(constantPool); - } - }); + for (int i = 0; i < constantPool.getSize(); ++i) { + constantPool.forEach(c -> { + if (c instanceof IReference) { + ((IReference) c).linkReference(constantPool); + } + }); + } } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/ConstantPool.java b/group01/895457260/code/src/main/java/jvm/classfile/ConstantPool.java index b077ad83a4..9c5bae83db 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/ConstantPool.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/ConstantPool.java @@ -11,20 +11,20 @@ * TODO: */ public class ConstantPool { - private List constantMap = new ArrayList<>(); + private List constants = new ArrayList<>(); public void forEach(Consumer action) { - constantMap.forEach(action); + constants.forEach(action); } public int getSize() { - return constantMap.size() - 1; + return constants.size() - 1; } boolean addConstantInfo(Constant c) { - return constantMap.add(c); + return constants.add(c); } public Constant getConstantInfo(int index) { - return constantMap.get(index); + return constants.get(index); } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/Constant.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/Constant.java index c83fbfbb28..1f87f4d495 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/Constant.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/Constant.java @@ -1,9 +1,16 @@ package jvm.classfile.constant.item; +import java.util.Map; + /** * Created by Haochen on 2017/4/9. * TODO: */ public interface Constant { + int PRINT_TYPE = 1; + int PRINT_PARAM = 2; + int PRINT_COMMENT = 3; + int size(); + Map printableMap(); } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/ClassInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/ClassInfo.java index 84657cd7e4..5e588ada69 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/ClassInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/ClassInfo.java @@ -4,6 +4,9 @@ import jvm.classfile.constant.item.Constant; import jvm.classfile.constant.item.IReference; +import java.util.HashMap; +import java.util.Map; + /** * Created by Haochen on 2017/4/9. * TODO: @@ -21,6 +24,15 @@ public int size() { return 3; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "Class"); + map.put(PRINT_PARAM, "#" + nameIndex); + map.put(PRINT_COMMENT, "// " + className); + return map; + } + @Override public void linkReference(ConstantPool constantPool) { Constant constant = constantPool.getConstantInfo(getUtf8Index()); diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/CountConstant.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/CountConstant.java index 1d671fcbda..f2aaf98787 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/CountConstant.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/CountConstant.java @@ -2,6 +2,9 @@ import jvm.classfile.constant.item.Constant; +import java.util.HashMap; +import java.util.Map; + /** * Created by Haochen on 2017/4/9. * TODO: @@ -18,6 +21,11 @@ public int size() { return 2; } + @Override + public Map printableMap() { + return null; + } + public int getCount() { return count; } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/DoubleInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/DoubleInfo.java index 8fa38452f6..22aad3a0b8 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/DoubleInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/DoubleInfo.java @@ -1,6 +1,10 @@ package jvm.classfile.constant.item.impl; import jvm.classfile.constant.item.Constant; +import jvm.util.ByteUtils; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. @@ -20,6 +24,15 @@ public int size() { return 9; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "Double"); + map.put(PRINT_PARAM, ByteUtils.toHexString(highBytes) + ByteUtils.toHexString(lowBytes)); + map.put(PRINT_COMMENT, ""); + return map; + } + public byte[] getHighBytes() { return highBytes; } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FieldRefInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FieldRefInfo.java index a7f51f51ba..9bb866713b 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FieldRefInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FieldRefInfo.java @@ -1,14 +1,21 @@ package jvm.classfile.constant.item.impl; +import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.IReference; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. * TODO: */ -public class FieldRefInfo implements Constant { +public class FieldRefInfo implements Constant, IReference { private int classIndex; private int nameAndTypeIndex; + private String className; + private String nameAndType; public FieldRefInfo(int classIndex, int nameAndTypeIndex) { this.classIndex = classIndex; @@ -20,6 +27,15 @@ public int size() { return 5; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "FieldRef"); + map.put(PRINT_PARAM, "#" + classIndex + ".#" + nameAndTypeIndex); + map.put(PRINT_COMMENT, "// " + className + '.' + nameAndType); + return map; + } + public int getClassIndex() { return classIndex; } @@ -27,4 +43,10 @@ public int getClassIndex() { public int getNameAndTypeIndex() { return nameAndTypeIndex; } + + @Override + public void linkReference(ConstantPool constantPool) { + className = ((ClassInfo) constantPool.getConstantInfo(classIndex)).getClassName(); + nameAndType = ((NameAndTypeInfo) constantPool.getConstantInfo(nameAndTypeIndex)).getNameAndType(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FloatInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FloatInfo.java index 1368c07674..a24ea332be 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FloatInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FloatInfo.java @@ -1,6 +1,10 @@ package jvm.classfile.constant.item.impl; import jvm.classfile.constant.item.Constant; +import jvm.util.ByteUtils; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. @@ -18,6 +22,15 @@ public int size() { return 5; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "Float"); + map.put(PRINT_PARAM, ByteUtils.toHexString(bytes)); + map.put(PRINT_COMMENT, ""); + return map; + } + public byte[] getBytes() { return bytes; } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java index e345f94994..b929c36a97 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java @@ -1,6 +1,10 @@ package jvm.classfile.constant.item.impl; import jvm.classfile.constant.item.Constant; +import jvm.util.ByteUtils; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. @@ -18,6 +22,15 @@ public int size() { return 5; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "Integer"); + map.put(PRINT_PARAM, ByteUtils.toHexString(bytes)); + map.put(PRINT_COMMENT, ""); + return map; + } + public byte[] getBytes() { return bytes; } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/InterfaceMethodRefInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/InterfaceMethodRefInfo.java index e22f8d4a45..83cbc3dbc1 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/InterfaceMethodRefInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/InterfaceMethodRefInfo.java @@ -1,14 +1,21 @@ package jvm.classfile.constant.item.impl; +import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.IReference; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. * TODO: */ -public class InterfaceMethodRefInfo implements Constant { +public class InterfaceMethodRefInfo implements Constant, IReference { private int classIndex; private int nameAndTypeIndex; + private String className; + private String nameAndType; public InterfaceMethodRefInfo(int classIndex, int nameAndTypeIndex) { this.classIndex = classIndex; @@ -20,6 +27,15 @@ public int size() { return 5; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "InterfaceMethod"); + map.put(PRINT_PARAM, "#" + classIndex + ".#" + nameAndTypeIndex); + map.put(PRINT_COMMENT, "// " + className + '.' + nameAndType); + return map; + } + public int getClassIndex() { return classIndex; } @@ -27,4 +43,10 @@ public int getClassIndex() { public int getNameAndTypeIndex() { return nameAndTypeIndex; } + + @Override + public void linkReference(ConstantPool constantPool) { + className = ((ClassInfo) constantPool.getConstantInfo(classIndex)).getClassName(); + nameAndType = ((NameAndTypeInfo) constantPool.getConstantInfo(nameAndTypeIndex)).getNameAndType(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/InvokeDynamicInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/InvokeDynamicInfo.java index 91caadbb46..11bab7c6ed 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/InvokeDynamicInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/InvokeDynamicInfo.java @@ -1,14 +1,21 @@ package jvm.classfile.constant.item.impl; +import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.IReference; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. * TODO: */ -public class InvokeDynamicInfo implements Constant { +public class InvokeDynamicInfo implements Constant, IReference { private int bootstrapMethodAttrIndex; private int nameAndTypeIndex; + private String bootstrapMethodAttr; + private String nameAndType; public InvokeDynamicInfo(int bootstrapMethodAttrIndex, int nameAndTypeIndex) { this.bootstrapMethodAttrIndex = bootstrapMethodAttrIndex; @@ -20,6 +27,15 @@ public int size() { return 5; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "InvokeDynamic"); + map.put(PRINT_PARAM, "#" + bootstrapMethodAttrIndex + ".#" + nameAndTypeIndex); + map.put(PRINT_COMMENT, "// " + bootstrapMethodAttr + '.' + nameAndType); + return map; + } + public int getBootstrapMethodAttrIndex() { return bootstrapMethodAttrIndex; } @@ -27,4 +43,10 @@ public int getBootstrapMethodAttrIndex() { public int getNameAndTypeIndex() { return nameAndTypeIndex; } + + @Override + public void linkReference(ConstantPool constantPool) { + bootstrapMethodAttr = ((ClassInfo) constantPool.getConstantInfo(bootstrapMethodAttrIndex)).getClassName(); + nameAndType = ((NameAndTypeInfo) constantPool.getConstantInfo(nameAndTypeIndex)).getNameAndType(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/LongInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/LongInfo.java index c740e39f30..202110fb01 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/LongInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/LongInfo.java @@ -1,6 +1,10 @@ package jvm.classfile.constant.item.impl; import jvm.classfile.constant.item.Constant; +import jvm.util.ByteUtils; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. @@ -20,6 +24,15 @@ public int size() { return 9; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "Long"); + map.put(PRINT_PARAM, ByteUtils.toHexString(highBytes) + ByteUtils.toHexString(lowBytes)); + map.put(PRINT_COMMENT, ""); + return map; + } + public byte[] getHighBytes() { return highBytes; } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodHandleInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodHandleInfo.java index c7b6fbe4ac..57b157dbe0 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodHandleInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodHandleInfo.java @@ -1,12 +1,16 @@ package jvm.classfile.constant.item.impl; +import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.IReference; + +import java.util.Map; /** * Created by Haochen on 2017/4/9. * TODO: */ -public class MethodHandleInfo implements Constant { +public class MethodHandleInfo implements Constant, IReference { private int referenceKind; private int referenceIndex; @@ -20,6 +24,11 @@ public int size() { return 4; } + @Override + public Map printableMap() { + return null; + } + public int getReferenceKind() { return referenceKind; } @@ -27,4 +36,9 @@ public int getReferenceKind() { public int getReferenceIndex() { return referenceIndex; } + + @Override + public void linkReference(ConstantPool constantPool) { + + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java index c52903956c..9af83bca59 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java @@ -1,14 +1,21 @@ package jvm.classfile.constant.item.impl; +import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.IReference; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. * TODO: */ -public class MethodRefInfo implements Constant { +public class MethodRefInfo implements Constant, IReference { private int classIndex; private int nameAndTypeIndex; + private String className; + private String nameAndType; public MethodRefInfo(int classIndex, int nameAndTypeIndex) { this.classIndex = classIndex; @@ -20,6 +27,15 @@ public int size() { return 5; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "MethodRef"); + map.put(PRINT_PARAM, "#" + classIndex + ".#" + nameAndTypeIndex); + map.put(PRINT_COMMENT, "// " + className + '.' + nameAndType); + return map; + } + public int getClassInfoIndex() { return classIndex; } @@ -27,4 +43,10 @@ public int getClassInfoIndex() { public int getNameAndTypeIndex() { return nameAndTypeIndex; } + + @Override + public void linkReference(ConstantPool constantPool) { + className = ((ClassInfo) constantPool.getConstantInfo(classIndex)).getClassName(); + nameAndType = ((NameAndTypeInfo) constantPool.getConstantInfo(nameAndTypeIndex)).getNameAndType(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodTypeInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodTypeInfo.java index 9b7e7cba1f..8377a48fe3 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodTypeInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodTypeInfo.java @@ -1,13 +1,19 @@ package jvm.classfile.constant.item.impl; +import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.IReference; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. * TODO: */ -public class MethodTypeInfo implements Constant { +public class MethodTypeInfo implements Constant, IReference { private int descriptorIndex; + private String descriptor; public MethodTypeInfo(int descriptorIndex) { this.descriptorIndex = descriptorIndex; @@ -18,7 +24,21 @@ public int size() { return 3; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "MethodType"); + map.put(PRINT_PARAM, "#" + descriptorIndex); + map.put(PRINT_COMMENT, "// " + descriptor); + return map; + } + public int getDescriptorIndex() { return descriptorIndex; } + + @Override + public void linkReference(ConstantPool constantPool) { + descriptor = ((UTF8Info) constantPool.getConstantInfo(descriptorIndex)).getValue(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/NameAndTypeInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/NameAndTypeInfo.java index c783b969e7..6ec20e6f3f 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/NameAndTypeInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/NameAndTypeInfo.java @@ -1,14 +1,21 @@ package jvm.classfile.constant.item.impl; +import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.IReference; + +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. * TODO: */ -public class NameAndTypeInfo implements Constant { +public class NameAndTypeInfo implements Constant, IReference { private int nameIndex; private int descriptorIndex; + private String name; + private String descriptor; public NameAndTypeInfo(int nameIndex, int descriptorIndex) { this.nameIndex = nameIndex; @@ -20,6 +27,15 @@ public int size() { return 5; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "NameAndType"); + map.put(PRINT_PARAM, "#" + nameIndex + ":#" + descriptorIndex); + map.put(PRINT_COMMENT, "// " + name + ':' + descriptor); + return map; + } + public int getNameIndex() { return nameIndex; } @@ -35,4 +51,14 @@ public int getIndex1() { public int getIndex2() { return descriptorIndex; } + + public String getNameAndType() { + return name + ':' + descriptor; + } + + @Override + public void linkReference(ConstantPool constantPool) { + name = ((UTF8Info) constantPool.getConstantInfo(nameIndex)).getValue(); + descriptor = ((UTF8Info) constantPool.getConstantInfo(descriptorIndex)).getValue(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/StringInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/StringInfo.java index 6e7548db05..58c4d6b517 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/StringInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/StringInfo.java @@ -4,6 +4,9 @@ import jvm.classfile.constant.item.Constant; import jvm.classfile.constant.item.IReference; +import java.util.HashMap; +import java.util.Map; + /** * Created by Haochen on 2017/4/9. * TODO: @@ -21,6 +24,15 @@ public int size() { return 3; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "String"); + map.put(PRINT_PARAM, "#" + stringIndex); + map.put(PRINT_COMMENT, "// " + value); + return map; + } + public String getValue() { return value; } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/UTF8Info.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/UTF8Info.java index 86d139fb7c..490c07bf28 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/UTF8Info.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/UTF8Info.java @@ -3,6 +3,8 @@ import jvm.classfile.constant.item.Constant; import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; /** * Created by Haochen on 2017/4/9. @@ -26,6 +28,14 @@ public int size() { return 3 + length; } + @Override + public Map printableMap() { + Map map = new HashMap<>(); + map.put(PRINT_TYPE, "Utf8"); + map.put(PRINT_PARAM, value); + return map; + } + public int getLength() { return length; } diff --git a/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java b/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java index 632f36c2ea..1d2ca39d46 100644 --- a/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java +++ b/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java @@ -4,6 +4,9 @@ import jvm.classfile.ClassFile; import jvm.exception.ReadClassException; +import java.util.ArrayList; +import java.util.List; + public class ClassFilePrinter { ClassFile clzFile; diff --git a/group01/895457260/code/src/main/java/jvm/print/ConstantPoolPrinter.java b/group01/895457260/code/src/main/java/jvm/print/ConstantPoolPrinter.java index e528f351ad..4ab6b092f6 100644 --- a/group01/895457260/code/src/main/java/jvm/print/ConstantPoolPrinter.java +++ b/group01/895457260/code/src/main/java/jvm/print/ConstantPoolPrinter.java @@ -1,6 +1,12 @@ package jvm.print; import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.Constant; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; public class ConstantPoolPrinter { ConstantPool pool; @@ -11,5 +17,43 @@ public class ConstantPoolPrinter { public void print() { System.out.println("Constant Pool:"); + final List> maps = new LinkedList<>(); + pool.forEach(c -> maps.add(c.printableMap())); + maps.remove(0); + + int[] maxLens = getMaxValueLengths(maps); + + String format = "%" + ((maps.size() + "").length() + 3) + + "s = %" + ((maxLens[0] + 8) > 0 ? "-" + (maxLens[0] + 8) : "") + + "s%" + ((maxLens[1] + 8) > 0 ? "-" + (maxLens[1] + 8) : "") + + "s%s\n"; + + for (int i = 0; i < maps.size(); ++i) { + Map m = maps.get(i); + String type = m.get(Constant.PRINT_TYPE); + String param = m.get(Constant.PRINT_PARAM); + String comment = m.get(Constant.PRINT_COMMENT); + System.out.printf(format, "#" + (i + 1), + type == null ? "" : type, + param == null ? "" : param, + comment == null ? "" : comment); + } + } + + private int[] getMaxValueLengths(List> maps) { + int maxLen[] = new int[2]; + for (Map m : maps) { + String type = m.get(Constant.PRINT_TYPE); + if (type != null && type.length() > maxLen[0]) { + maxLen[0] = type.length(); + } + if (type == null || !"utf8".equals(type.toLowerCase())) { + String param = m.get(Constant.PRINT_PARAM); + if (param != null && param.length() > maxLen[1]) { + maxLen[1] = param.length(); + } + } + } + return maxLen; } } From 91e46e68419f6473ab0b60a9cb5f70aef956bcf5 Mon Sep 17 00:00:00 2001 From: Haochen Date: Sat, 22 Apr 2017 08:32:04 +0800 Subject: [PATCH 234/552] finish InfixToPostfix --- .../algorithm/expression/InfixToPostfix.java | 32 ++++++++-- .../main/java/algorithm/expression/Token.java | 59 +++++++++++------ .../algorithm/expression/TokenParser.java | 7 ++- .../expression/InfixToPostfixTest.java | 63 +++++++++++++++++++ 4 files changed, 134 insertions(+), 27 deletions(-) create mode 100644 group01/895457260/code/src/test/java/algorithm/expression/InfixToPostfixTest.java diff --git a/group01/895457260/code/src/main/java/algorithm/expression/InfixToPostfix.java b/group01/895457260/code/src/main/java/algorithm/expression/InfixToPostfix.java index 58ffe99cd3..44c6bbcd09 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/InfixToPostfix.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/InfixToPostfix.java @@ -1,14 +1,34 @@ package algorithm.expression; +import datastructure.basic.Stack; + +import java.util.ArrayList; import java.util.List; public class InfixToPostfix { - public static List convert(String expr) { - - return null; - } - - + List infix = TokenParser.parse(expr); + List postfix = new ArrayList<>(); + Stack op = new Stack(); + for (Token token : infix) { + if (token.isNumber()) { + postfix.add(token); + } else if (token.equals(Token.R_BRACKET)) { + while (!op.peek().equals(Token.L_BRACKET)) { + postfix.add((Token) op.pop()); + } + op.pop(); + } else { + while (!op.isEmpty() && Token.compare(token, (Token) op.peek()) < 0) { + postfix.add((Token) op.pop()); + } + op.push(token); + } + } + while (!op.isEmpty()) { + postfix.add((Token) op.pop()); + } + return postfix; + } } diff --git a/group01/895457260/code/src/main/java/algorithm/expression/Token.java b/group01/895457260/code/src/main/java/algorithm/expression/Token.java index 3aa4f6f9c4..cb95b43f66 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/Token.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/Token.java @@ -1,22 +1,24 @@ package algorithm.expression; -import java.util.Arrays; -import java.util.List; - class Token { - public static final String ADD = "+"; - public static final String SUB = "-"; - public static final String MUL = "*"; - public static final String DIV = "/"; - public static final String L_BRACKET = "("; - public static final String R_BRACKET = ")"; - - public static final List OPERATORS = Arrays.asList(ADD, SUB, MUL, DIV, L_BRACKET, R_BRACKET); + public static final String OP_ADD = "+"; + public static final String OP_SUB = "-"; + public static final String OP_MUL = "*"; + public static final String OP_DIV = "/"; + public static final String OP_L_BRACKET = "("; + public static final String OP_R_BRACKET = ")"; + public static final String OP_SCOPE = "#"; + public static final int OPERATOR = 1; public static final int NUMBER = 2; - public static final String SCOPE_STR = "#"; - public static final Token SCOPE = new Token(OPERATOR, SCOPE_STR); + public static final Token ADD = new Token(OPERATOR, OP_ADD); + public static final Token SUB = new Token(OPERATOR, OP_SUB); + public static final Token MUL = new Token(OPERATOR, OP_MUL); + public static final Token DIV = new Token(OPERATOR, OP_DIV); + public static final Token L_BRACKET = new Token(OPERATOR, OP_L_BRACKET); + public static final Token R_BRACKET = new Token(OPERATOR, OP_R_BRACKET); + public static final Token SCOPE = new Token(OPERATOR, OP_SCOPE); //优先级表 private static int[][] priorities = { @@ -56,19 +58,19 @@ public String toString(){ private static int indexOf(String op) { switch (op) { - case ADD: + case OP_ADD: return 0; - case SUB: + case OP_SUB: return 1; - case MUL: + case OP_MUL: return 2; - case DIV: + case OP_DIV: return 3; - case L_BRACKET: + case OP_L_BRACKET: return 4; - case R_BRACKET: + case OP_R_BRACKET: return 5; - case SCOPE_STR: + case OP_SCOPE: return 6; } return 0; @@ -103,4 +105,21 @@ public static Token calculate(Token num1, Token op, Token num2) { } return new Token(NUMBER, result + ""); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Token token = (Token) o; + + return type == token.type && (value != null ? value.equals(token.value) : token.value == null); + } + + @Override + public int hashCode() { + int result = value != null ? value.hashCode() : 0; + result = 31 * result + type; + return result; + } } \ No newline at end of file diff --git a/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java b/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java index fc146579bd..ca8619c94b 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java @@ -1,9 +1,14 @@ package algorithm.expression; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class TokenParser { + public static final List OPERATORS = + Arrays.asList(Token.OP_ADD, Token.OP_SUB, Token.OP_MUL, + Token.OP_DIV, Token.OP_L_BRACKET, Token.OP_R_BRACKET); + public static List parse(String expression) { return parse(expression, null); } @@ -48,6 +53,6 @@ private static int indexOfNextOperator(int i, String expr) { private static boolean isOperator(char c) { String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); + return OPERATORS.contains(sc); } } diff --git a/group01/895457260/code/src/test/java/algorithm/expression/InfixToPostfixTest.java b/group01/895457260/code/src/test/java/algorithm/expression/InfixToPostfixTest.java new file mode 100644 index 0000000000..7ea5c86807 --- /dev/null +++ b/group01/895457260/code/src/test/java/algorithm/expression/InfixToPostfixTest.java @@ -0,0 +1,63 @@ +package algorithm.expression; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** +* InfixToPostfix Tester. +* +* @author +* @since
四月 22, 2017
+* @version 1.0 +*/ +public class InfixToPostfixTest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: convert(String expr) +* +*/ +@Test +public void testConvert() throws Exception { + { + String expr = "2+3*4+5"; + Assert.assertEquals("[2, 3, 4, *, +, 5, +]", + InfixToPostfix.convert(expr).toString()); + } + + { + String expr = "3*20+12*5-40/2"; + Assert.assertEquals("[3, 20, *, 12, 5, *, +, 40, 2, /, -]", + InfixToPostfix.convert(expr).toString()); + } + + { + String expr = "3*20/2"; + Assert.assertEquals("[3, 20, *, 2, /]", + InfixToPostfix.convert(expr).toString()); + } + + { + String expr = "20/2*3"; + Assert.assertEquals("[20, 2, /, 3, *]", + InfixToPostfix.convert(expr).toString()); + } + + { + String expr = "10-30+50"; + Assert.assertEquals("[10, 30, -, 50, +]", + InfixToPostfix.convert(expr).toString()); + } +} + +} From 1a98d68f8a13923a9adcdbf24ec67b6e9a2d33b8 Mon Sep 17 00:00:00 2001 From: ZhaoHongxin Date: Sat, 22 Apr 2017 11:47:44 +0800 Subject: [PATCH 235/552] =?UTF-8?q?JVM=E4=BD=9C=E4=B8=9A=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=B8=B8=E9=87=8F=E6=B1=A0=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/constant/ClassInfo.java | 5 ++ .../coderising/jvm/constant/ConstantInfo.java | 13 ++++ .../coderising/jvm/constant/ConstantPool.java | 2 +- .../coderising/jvm/constant/FieldRefInfo.java | 4 ++ .../jvm/constant/MethodRefInfo.java | 5 ++ .../jvm/constant/NameAndTypeInfo.java | 5 ++ .../jvm/constant/NullConstantInfo.java | 3 + .../coderising/jvm/constant/StringInfo.java | 5 ++ .../com/coderising/jvm/constant/UTF8Info.java | 6 +- .../jvm/print/ClassFilePrinter.java | 7 +- .../jvm/print/ConstantPoolPrinter.java | 70 ++++++++++++++++++- 11 files changed, 118 insertions(+), 7 deletions(-) diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java index 92ae6bd6f6..fdf965b579 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -21,4 +21,9 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java index 2e3bef0a4e..d6abf114c9 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -27,4 +27,17 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visitUTF8(UTF8Info info); + + } + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java index 0e940b78d0..805de5cd39 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index 7ff9d5fb77..d9fe4126f4 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,4 +51,8 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index 0feffa65b5..cc54887ddf 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -49,6 +49,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index dcac7f97c4..c9b987ceaa 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,9 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index fa90d110fe..cfc52f5582 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,8 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java index d01065fd53..139406d085 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -22,5 +22,10 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java index b7407d146f..cf6409676f 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -26,7 +26,9 @@ public String getValue() { public void setValue(String value) { this.value = value; } - - + @Override + public void accept(Visitor visitor) { + visitor.visitUTF8(this); + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java index d1579dba28..b6dc906db9 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -1,5 +1,7 @@ package com.coderising.jvm.print; +import java.util.Formatter; + import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantInfo; @@ -29,7 +31,7 @@ public void print(){ System.out.println("minor version:" + clzFile.getMinorVersion()); - System.out.println("major version:" + clzFile.getMinorVersion()); + System.out.println("major version:" + clzFile.getMajorVersion()); ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); cnstPoolPrinter.print(); @@ -40,7 +42,7 @@ public void print(){ } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "E:\\practise\\group05\\1094051862\\mini-jvm\\bin"; ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); String className = "com.coderising.jvm.test.EmployeeV1"; @@ -50,5 +52,6 @@ public static void main(String[] args){ ClassFilePrinter printer = new ClassFilePrinter(clzFile); printer.print(); + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java index 4010078059..280a71aa5f 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -1,7 +1,10 @@ package com.coderising.jvm.print; +import java.util.Formatter; + import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantInfo.Visitor; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.MethodRefInfo; @@ -18,8 +21,71 @@ public void print(){ System.out.println("Constant Pool:"); + Formatter formatter = new Formatter(System.out); + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8"); + formatter.format("%-15s %-10s\n", + "UTF8",info.getValue()); + } + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("#").append(info.getIndex()); + formatter.format("%-15s %-10s %-10s\n", + "String", buffer, "// "+pool.getUTF8String(info.getIndex())); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("#").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + + formatter.format("%-15s %-10s %-10s\n", + "NameAndType", buffer, + "// "+pool.getUTF8String(info.getIndex1())+":"+pool.getUTF8String(info.getIndex2())); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("#").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + formatter.format("%-15s %-10s %-10s\n", + "MethodRef", buffer, + "// "+info.getClassName()+"."+info.getMethodName()+":"+info.getParamAndReturnType()); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("#").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + formatter.format("%-15s %-10s %-10s\n", + "FieldRef", buffer, + "// "+info.getClassName()+"."+info.getFieldName()+":"+info.getFieldType()); + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("#").append(info.getUtf8Index()); + formatter.format("%-15s %-10s %-10s\n", + "Class", buffer, "// "+info.getClassName()); + } + }; - - + for(int i = 1; i <= pool.getSize(); i++) { + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.printf("%8s", "#" + i + " = ");//左对齐,8个空格 + constantInfo.accept(visitor); + } + System.out.println("\n"+"\t"+"FORMATTED BY KANDDE."); + formatter.close(); } } From 7a922e24be7eda17a5813edd42057386f68f9798 Mon Sep 17 00:00:00 2001 From: sdnb Date: Sat, 22 Apr 2017 12:52:32 +0800 Subject: [PATCH 236/552] =?UTF-8?q?=E4=B8=AD=E5=BA=8F=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/week6/exprNew/InfixExpr.java | 58 ++++++++++++++ .../com/coding/week6/exprNew/Operator.java | 75 ++++++++++++++++++ .../java/com/coding/week6/exprNew/Token.java | 48 +++++++++++ .../com/coding/week6/exprNew/TokenParser.java | 51 ++++++++++++ .../week6/exprNew/InfixExprTestTest.java | 79 +++++++++++++++++++ .../coding/week6/exprNew/TokenParserTest.java | 18 +++++ 6 files changed, 329 insertions(+) create mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java create mode 100644 group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java new file mode 100644 index 0000000000..41704db5db --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java @@ -0,0 +1,58 @@ +package com.coding.week6.exprNew; + +import com.coding.weak1.Stack; + +import java.util.List; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + + public float evaluate() { + + Stack operatorStack = new Stack(); + Stack numberStack = new Stack(); + fillStack(numberStack, operatorStack); + while (!operatorStack.isEmpty()) { + Operator symbol = (Operator) operatorStack.pop(); + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(symbol.apply(operTop2, operTop1)); + } + return (float)numberStack.pop(); + } + + public void fillStack(Stack numberStack, Stack operatorStack) { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + for (Token token : tokens) { + if (token.isNumber()) { + numberStack.push((float)token.getIntValue()); + continue; + } + if (token.isOperator()) { + Operator o = token.getOperator(); + if (operatorStack.isEmpty()) { + operatorStack.push(o); + }else { + Operator topO = (Operator)operatorStack.peek(); + if (o.hasHigherPriority(topO)) { + operatorStack.push(o); + } else { + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(topO.apply(operTop2, operTop1)); + operatorStack.pop(); + operatorStack.push(o); + } + } + } + + } + } + +} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java new file mode 100644 index 0000000000..b91c8158bf --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java @@ -0,0 +1,75 @@ +package com.coding.week6.exprNew; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public enum Operator { + ADD("+", 1) { + float apply(float x, float y){ + return x + y; + } + }, + + SUB("-", 1) { + @Override + float apply(float x, float y) { + return x - y; + } + }, + + MULT("*", 2) { + @Override + float apply(float x, float y) { + return x * y; + } + }, + + DIVI("/", 2) { + @Override + float apply(float x, float y) { + return x / y; + } + }; + private String symbol; + private int priority; + + Operator(String symbol, int priority) { + this.symbol = symbol; + this.priority = priority; + } + + public boolean hasHigherPriority(Operator o) { + return this.priority > o.priority; + } + + public String symbol() { + return symbol; + } + + public static List symbols() { + List symbos = new ArrayList<>(); + for (Operator o : Operator.values()) { + symbos.add(o.symbol); + } + return symbos; + } + + abstract float apply(float x, float y); + + private static final Map map = new HashMap(); + + static { + for (Operator o : Operator.values()) { + map.put(o.symbol, o); + } + } + + public static Map getOperatorMap() { + return map; + } +} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java new file mode 100644 index 0000000000..d987ac47b4 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java @@ -0,0 +1,48 @@ +package com.coding.week6.exprNew; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class Token { + + private int type; + private String value; + + static final int NUMBER = 1; + static final int OPERATOR = 2; + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + + public boolean isNumber(){ + return type == NUMBER; + } + + public boolean isOperator(){ + return type == OPERATOR; + } + + public int getIntValue() { + if (isNumber()) + return Integer.valueOf(value); + else + throw new RuntimeException("not a number"); + } + + public String toString() { + return type+":"+value; + } + + + public Operator getOperator() { + if (isOperator()) { + return Operator.getOperatorMap().get(value); + } else { + throw new RuntimeException("not a operator"); + } + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java new file mode 100644 index 0000000000..ee90c39701 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java @@ -0,0 +1,51 @@ +package com.coding.week6.exprNew; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class TokenParser { + + private static List operators = Operator.symbols(); + public List parse(String expr) { + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + char c = expr.charAt(i); + Token token; + if (Character.isDigit(c)) { + int nextOperIndex = getNextOperIndex(i, expr); + String n = expr.substring(i, nextOperIndex); + token = new Token(Token.NUMBER, n); + tokens.add(token); + i = nextOperIndex; + } else if (isOperator(c)) { + token = new Token(Token.OPERATOR, c+""); + tokens.add(token); + i++; + } else { + throw new RuntimeException(c +" is not number or support operator"); + } + + } + return tokens; + } + + private int getNextOperIndex(int i, String expr) { + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char c) { + return operators.contains(String.valueOf(c)); + } + + +} diff --git a/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java b/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java new file mode 100644 index 0000000000..d8f4a5390f --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java @@ -0,0 +1,79 @@ +package ew; + + +import com.coding.week6.exprNew.InfixExpr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Administrator on 2017/4/16 0016. + */ +public class InfixExprTestTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3|"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + + +// @Test +// public void testFillStack() { +// InfixExpr expr = new InfixExpr("10-30+50"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); +// Assert.assertEquals(expr.printOperatorStack(), "+"); +// expr = new InfixExpr("3*20+12*5-40/2"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "2.0,40.0,60.0,60.0"); +// Assert.assertEquals(expr.printOperatorStack(), "/,-,+"); +// expr = new InfixExpr("3*20/2"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "2.0,60.0"); +// Assert.assertEquals(expr.printOperatorStack(), "/"); +// expr = new InfixExpr("20/2*3"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "3.0,10.0"); +// Assert.assertEquals(expr.printOperatorStack(), "*"); +// expr = new InfixExpr("10-30+50"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); +// Assert.assertEquals(expr.printOperatorStack(), "+"); +// } + + + +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java b/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java new file mode 100644 index 0000000000..c919f0084f --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java @@ -0,0 +1,18 @@ +package com.coding.week6.exprNew; + +import org.junit.Test; + +import java.util.List; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class TokenParserTest { + + @Test + public void testParse() throws Exception { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse("3*20+12*5-40/2"); + System.out.println(tokens); + } +} \ No newline at end of file From 886625ee40ca61b57b9286d72bf7dd2cab46c187 Mon Sep 17 00:00:00 2001 From: maishihang <446031103@qq.com> Date: Sat, 22 Apr 2017 15:19:42 +0800 Subject: [PATCH 237/552] update jvm the 2 work update jvm the 2 work --- .../coderising/jvm/attr/AttributeInfo.java | 19 +++ .../src/com/coderising/jvm/attr/CodeAttr.java | 56 +++++++ .../coderising/jvm/attr/LineNumberTable.java | 42 +++++ .../jvm/attr/LocalVariableItem.java | 39 +++++ .../jvm/attr/LocalVariableTable.java | 28 ++++ .../coderising/jvm/attr/StackMapTable.java | 30 ++++ .../src/com/coderising/jvm/field/Field.java | 33 ++++ .../jvm/loader/ByteCodeIterator.java | 54 ++++++- .../jvm/loader/ClassFileLoader.java | 2 +- .../jvm/loader/ClassFileParser.java | 117 +++++++++++++- .../src/com/coderising/jvm/method/Method.java | 57 +++++++ .../jvm/test/ClassFileloaderTest.java | 9 +- .../datastructure/linklist/LRUPageFrame.java | 144 ------------------ 13 files changed, 475 insertions(+), 155 deletions(-) create mode 100644 group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group12/446031103/src/com/coderising/jvm/field/Field.java create mode 100644 group12/446031103/src/com/coderising/jvm/method/Method.java diff --git a/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java b/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java b/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..ee7d423c3b --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + + return null; + } + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + + + + +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java b/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..d88752e323 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + + +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..e4d3df0e77 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java b/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group12/446031103/src/com/coderising/jvm/field/Field.java b/group12/446031103/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..0d1c64587c --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,33 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + return null; + } + +} diff --git a/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java index 9c9fac2839..6fb5570dff 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,57 @@ package com.coderising.jvm.loader; -public class ByteCodeIterator { +import java.util.Arrays; +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } } diff --git a/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java index 33185d8175..070a0ba10b 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -9,7 +9,7 @@ import java.util.List; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang.StringUtils; import com.coderising.jvm.clz.ClassFile; diff --git a/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java index 8e29f14a0c..a30cb22ad1 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java @@ -13,32 +13,139 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFileParser { public ClassFile parse(byte[] codes) { - + ClassFile clzFile = new ClassFile(); + + ByteCodeIterator iter = new ByteCodeIterator(codes); + + String magicNumber = iter.nextU4ToHexString(); + + if (!"cafebabe".equals(magicNumber)) { + return null; + } + + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); - return null; + ClassIndex clzIndex = parseClassInfex(iter); + clzFile.setClassIndex(clzIndex); + + parseInterfaces(iter); + + + return clzFile; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - return null; + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + // System.out.println("Is public class: " + flag.isPublicClass()); + // System.out.println("Is final class : " + flag.isFinalClass()); + + return flag; } private ClassIndex parseClassInfex(ByteCodeIterator iter) { - return null; + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + + ClassIndex clzIndex = new ClassIndex(); + + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + + return clzIndex; } private ConstantPool parseConstantPool(ByteCodeIterator iter) { - return null; + int constPoolCount = iter.nextU2ToInt(); + + System.out.println("Constant Pool Count :" + constPoolCount); + + ConstantPool pool = new ConstantPool(); + + pool.addConstantInfo(new NullConstantInfo()); + + for (int i = 1; i <= constPoolCount - 1; i++) { + + int tag = iter.nextU1toInt(); + + if (tag == 7) { + // Class Info + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setUtf8Index(utf8Index); + + pool.addConstantInfo(clzInfo); + } else if (tag == 1) { + // UTF-8 String + int len = iter.nextU2ToInt(); + byte[] data = iter.getBytes(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + }else if (tag == 8) { + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == 9) { + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == 10) { + // MethodRef + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == 12) { + // Name and Type Info + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setIndex1(iter.nextU2ToInt()); + nameType.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet."); + } + } + + System.out.println("Finished reading Constant pool "); + + return pool; + } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 } + } diff --git a/group12/446031103/src/com/coderising/jvm/method/Method.java b/group12/446031103/src/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..b57ef592d2 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/method/Method.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.method; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + return null; + + } +} diff --git a/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java index 26407abbef..a0cbf7a626 100644 --- a/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -23,15 +23,16 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path2 = "C:\temp"; + //模拟windows中的path,path用;连接,要在这串path中寻找jvm + //static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "E:\\mygit\\coding2017\\group12\\446031103\\bin"; + static String path2 = "E:\temp"; static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - + String className = "com.coderising.jvm.test.EmployeeV1"; clzFile = loader.loadClass(className); clzFile.print(); } diff --git a/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java b/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java index cdb42d1fdd..00be77f3d0 100644 --- a/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java +++ b/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java @@ -165,150 +165,6 @@ public String toString(){ return buffer.toString(); } - /*private static class Node { - - Node prev; - Node next; - int pageNum; - - Node(Node prev,Node next,int pageNum) { - this.prev = prev; - this.next = next; - this.pageNum = pageNum; - } - Node(){ - - } - } - - private int capacity; - private int addCnt ; - private int size; - private Node first;// 链表头 - private Node last;// 链表尾 - - - public LRUPageFrame(int capacity) { - - this.capacity = capacity; - first = new Node(); - } - - *//** - * 获取缓存中对象 - * - * @param key - * @return - *//* - public void access(int pageNum) { - if(null==this.last){ - this.last = new Node(this.first,null,pageNum); - this.first.next = this.last; - addCnt++; - size++; - return; - } - if(contain(pageNum)){ - if(Objects.equals(this.first.next.pageNum, pageNum)){ - return; - } - boolean temp = Objects.equals(getLastNode(size).pageNum, pageNum); - Node currentNode = getNode(pageNum); - Node nextNode = currentNode.next; - Node preNode = currentNode.prev; - - currentNode.prev = this.first; - currentNode.next = this.first.next; - this.first.next = currentNode; - - if(temp){ - preNode.next = null; - if(null==preNode.prev) - preNode.prev = currentNode; - }else{ - preNode.prev = currentNode; - preNode.next = nextNode; - nextNode.next = null; - nextNode.prev = preNode; - } - this.last = getLastNode(size); - return; - } - Node addNode = new Node(this.first,this.first.next,pageNum); - Node oldFirstnode=this.first.next ; - oldFirstnode.prev = addNode; - this.first.next = addNode; - if(isOut()){ - - addCnt++; - if(this.size !=this.capacity ) - size++; - if(addCnt>size) - this.last.prev.next = null; - this.last = getLastNode(size); - }else{ - this.last.prev.next = null; - } - - - } - private boolean isOut(){ - return this.addCnt<=this.capacity; - } - - private Node getLastNode(int sizes) { - Node node=this.first; - for (int i = 0; i < sizes; i++) { - node = node.next; - } - return node; - } - - private boolean contain(Object o){ - Node node = this.first; - - while(null!=node.next){ - - node = node.next; - - if(Objects.equals(node.pageNum,o)){ - return true; - } - - } - return false; - } - - private Node getNode(Object o){ - Node node = this.first; - - while(null!=node.next){ - - node = node.next; - - if(Objects.equals(node.pageNum,o)){ - return node; - } - - } - return null; - } - - - - - public String toString(){ - StringBuilder buffer = new StringBuilder(); - Node node = first; - while(node.next != null){ - node = node.next; - buffer.append(node.pageNum); - if(node.next != null){ - buffer.append(","); - } - } - return buffer.toString(); - }*/ } \ No newline at end of file From cd642e815266556102bb483cc18c98f23ebc9748 Mon Sep 17 00:00:00 2001 From: gongxun Date: Sat, 22 Apr 2017 15:40:55 +0800 Subject: [PATCH 238/552] =?UTF-8?q?=E5=AE=8C=E6=88=90javap=E6=89=93?= =?UTF-8?q?=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4.16/print/ClassFilePrinter.java | 8 +- .../4.16/print/ConstantPoolPrinter.java | 82 +++++++++++++++++-- group17/785396327/4.5/constant/ClassInfo.java | 2 +- .../785396327/4.5/constant/FieldRefInfo.java | 2 +- .../4.5/constant/NameAndTypeInfo.java | 2 +- .../4.5/constant/NullConstantInfo.java | 2 +- group17/785396327/4.5/constant/UTF8Info.java | 2 +- .../785396327/4.9/expr/InfixToPostfix.java | 13 +++ group17/785396327/4.9/expr/PostfixExpr.java | 16 ++++ .../785396327/4.9/expr/PostfixExprTest.java | 38 +++++++++ group17/785396327/4.9/expr/PrefixExpr.java | 16 ++++ .../785396327/4.9/expr/PrefixExprTest.java | 45 ++++++++++ group17/785396327/4.9/expr/Token.java | 52 ++++++++++++ group17/785396327/4.9/expr/TokenParser.java | 58 +++++++++++++ .../785396327/4.9/expr/TokenParserTest.java | 40 +++++++++ 15 files changed, 359 insertions(+), 19 deletions(-) create mode 100644 group17/785396327/4.9/expr/InfixToPostfix.java create mode 100644 group17/785396327/4.9/expr/PostfixExpr.java create mode 100644 group17/785396327/4.9/expr/PostfixExprTest.java create mode 100644 group17/785396327/4.9/expr/PrefixExpr.java create mode 100644 group17/785396327/4.9/expr/PrefixExprTest.java create mode 100644 group17/785396327/4.9/expr/Token.java create mode 100644 group17/785396327/4.9/expr/TokenParser.java create mode 100644 group17/785396327/4.9/expr/TokenParserTest.java diff --git a/group17/785396327/4.16/print/ClassFilePrinter.java b/group17/785396327/4.16/print/ClassFilePrinter.java index 2c2b49bab0..7d8c878553 100644 --- a/group17/785396327/4.16/print/ClassFilePrinter.java +++ b/group17/785396327/4.16/print/ClassFilePrinter.java @@ -27,17 +27,13 @@ public void print(){ ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); cnstPoolPrinter.print(); - - - - } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "G:\\Git\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "jvm_1.EmployeeV1"; ClassFile clzFile = loader.loadClass(className); diff --git a/group17/785396327/4.16/print/ConstantPoolPrinter.java b/group17/785396327/4.16/print/ConstantPoolPrinter.java index 9e17cc1ff2..6c4d4fee4a 100644 --- a/group17/785396327/4.16/print/ConstantPoolPrinter.java +++ b/group17/785396327/4.16/print/ConstantPoolPrinter.java @@ -7,42 +7,108 @@ */ public class ConstantPoolPrinter { ConstantPool pool; - ConstantPoolPrinter(ConstantPool pool){ + + ConstantPoolPrinter(ConstantPool pool) { this.pool = pool; } - public void print(){ + + public void print() { System.out.println("Constant Pool:"); ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { @Override public void visitClassInfo(ClassInfo info) { - + // #7 = Class #44 // jvm_1/EmployeeV1 + StringBuilder sb = new StringBuilder(); + sb.append("Class") + .append("\t\t\t") + .append("#" + info.getUtf8Index()) + .append("\t\t\t\t") + .append("//\t") + .append(info.getClassName()); + System.out.println(sb.toString()); } @Override public void visitFieldRef(FieldRefInfo info) { - + // #2 = Fieldref #7.#37 // jvm_1/EmployeeV1.name:Ljava/lang/String; + StringBuilder sb = new StringBuilder(); + sb.append("Fieldref") + .append("\t\t") + .append("#" + info.getClassInfoIndex()) + .append(".") + .append("#" + info.getNameAndTypeIndex()) + .append("\t\t\t") + .append("//\t") + .append(info.getClassName()) + .append(".") + .append(info.getFieldName()) + .append(info.getFieldType()); + System.out.println(sb.toString()); } @Override public void visitMethodRef(MethodRefInfo info) { - + // #1 = Methodref #11.#36 // java/lang/Object."":()V + StringBuilder sb = new StringBuilder(); + sb.append("Methodref") + .append("\t\t") + .append("#" + info.getClassInfoIndex()) + .append(".") + .append("#" + info.getNameAndTypeIndex()) + .append("\t\t\t") + .append("//\t") + .append(info.getClassName()) + .append(".") + .append(info.getMethodName()); + System.out.println(sb.toString()); } @Override public void visitNameAndType(NameAndTypeInfo info) { - + // #36 = NameAndType #16:#28 // "":()V + StringBuilder sb = new StringBuilder(); + sb.append("NameAndType") + .append("\t\t") + .append("#" + info.getIndex1()) + .append(":") + .append("#" + info.getIndex2()) + .append("\t\t\t") + .append("//\t") + .append(info.getTypeInfo()) + .append(":") + .append(info.getName()); + System.out.println(sb.toString()); } @Override public void visitString(StringInfo info) { - + // #5 = String #41 // Hello , this is class Employee + StringBuilder sb = new StringBuilder(); + sb.append("String") + .append("\t\t\t") + .append("#" + info.getIndex()) + .append("\t\t\t\t") + .append("//\t") + .append(((UTF8Info) info.getConstantInfo(info.getIndex())).getValue()); + System.out.println(sb.toString()); } @Override public void visistUTF8(UTF8Info info) { - + // #32 = Utf8 [Ljava/lang/String; + StringBuilder sb = new StringBuilder(); + sb.append("Utf8") + .append("\t\t\t") + .append(info.getValue()); + System.out.println(sb.toString()); } }; + + for (int i = 1; i < (Integer) pool.getSize(); i++) { + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#" + i + "\t=\t"); + constantInfo.accept(visitor); + } } } diff --git a/group17/785396327/4.5/constant/ClassInfo.java b/group17/785396327/4.5/constant/ClassInfo.java index 4bc1f373df..02aa4b2699 100644 --- a/group17/785396327/4.5/constant/ClassInfo.java +++ b/group17/785396327/4.5/constant/ClassInfo.java @@ -21,7 +21,7 @@ public int getType() { @Override public void accept(Visitor visitor) { - + visitor.visitClassInfo(this); } public String getClassName() { diff --git a/group17/785396327/4.5/constant/FieldRefInfo.java b/group17/785396327/4.5/constant/FieldRefInfo.java index 7d813221f5..2f3d2ee351 100644 --- a/group17/785396327/4.5/constant/FieldRefInfo.java +++ b/group17/785396327/4.5/constant/FieldRefInfo.java @@ -17,7 +17,7 @@ public int getType() { @Override public void accept(Visitor visitor) { - + visitor.visitFieldRef(this); } public int getClassInfoIndex() { diff --git a/group17/785396327/4.5/constant/NameAndTypeInfo.java b/group17/785396327/4.5/constant/NameAndTypeInfo.java index a65456d245..c7e720c0e3 100644 --- a/group17/785396327/4.5/constant/NameAndTypeInfo.java +++ b/group17/785396327/4.5/constant/NameAndTypeInfo.java @@ -34,7 +34,7 @@ public int getType() { @Override public void accept(Visitor visitor) { - + visitor.visitNameAndType(this); } diff --git a/group17/785396327/4.5/constant/NullConstantInfo.java b/group17/785396327/4.5/constant/NullConstantInfo.java index f3b1201e3a..c49d937c76 100644 --- a/group17/785396327/4.5/constant/NullConstantInfo.java +++ b/group17/785396327/4.5/constant/NullConstantInfo.java @@ -14,7 +14,7 @@ public int getType() { @Override public void accept(Visitor visitor) { - + System.out.println("null Constant info"); } } diff --git a/group17/785396327/4.5/constant/UTF8Info.java b/group17/785396327/4.5/constant/UTF8Info.java index 8cf71cc4dc..814615f4f2 100644 --- a/group17/785396327/4.5/constant/UTF8Info.java +++ b/group17/785396327/4.5/constant/UTF8Info.java @@ -22,7 +22,7 @@ public int getType() { @Override public void accept(Visitor visitor) { - + visitor.visistUTF8(this); } @Override diff --git a/group17/785396327/4.9/expr/InfixToPostfix.java b/group17/785396327/4.9/expr/InfixToPostfix.java new file mode 100644 index 0000000000..720be5b28a --- /dev/null +++ b/group17/785396327/4.9/expr/InfixToPostfix.java @@ -0,0 +1,13 @@ +package expr; + +import java.util.List; + +/** + * Created by gongxun on 2017/4/22. + */ +public class InfixToPostfix { + public static List convert(String expr) { + + return null; + } +} diff --git a/group17/785396327/4.9/expr/PostfixExpr.java b/group17/785396327/4.9/expr/PostfixExpr.java new file mode 100644 index 0000000000..a6d19be939 --- /dev/null +++ b/group17/785396327/4.9/expr/PostfixExpr.java @@ -0,0 +1,16 @@ +package expr; + +/** + * Created by gongxun on 2017/4/22. + */ +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } +} diff --git a/group17/785396327/4.9/expr/PostfixExprTest.java b/group17/785396327/4.9/expr/PostfixExprTest.java new file mode 100644 index 0000000000..378e8f2407 --- /dev/null +++ b/group17/785396327/4.9/expr/PostfixExprTest.java @@ -0,0 +1,38 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/22. + */ +public class PostfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(), 0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } +} diff --git a/group17/785396327/4.9/expr/PrefixExpr.java b/group17/785396327/4.9/expr/PrefixExpr.java new file mode 100644 index 0000000000..e86d6463c0 --- /dev/null +++ b/group17/785396327/4.9/expr/PrefixExpr.java @@ -0,0 +1,16 @@ +package expr; + +/** + * Created by gongxun on 2017/4/22. + */ +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } +} diff --git a/group17/785396327/4.9/expr/PrefixExprTest.java b/group17/785396327/4.9/expr/PrefixExprTest.java new file mode 100644 index 0000000000..c2574eb155 --- /dev/null +++ b/group17/785396327/4.9/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/22. + */ +public class PrefixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } +} diff --git a/group17/785396327/4.9/expr/Token.java b/group17/785396327/4.9/expr/Token.java new file mode 100644 index 0000000000..093be5c416 --- /dev/null +++ b/group17/785396327/4.9/expr/Token.java @@ -0,0 +1,52 @@ +package expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by gongxun on 2017/4/22. + */ +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + +} diff --git a/group17/785396327/4.9/expr/TokenParser.java b/group17/785396327/4.9/expr/TokenParser.java new file mode 100644 index 0000000000..5620ad9f50 --- /dev/null +++ b/group17/785396327/4.9/expr/TokenParser.java @@ -0,0 +1,58 @@ +package expr; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by gongxun on 2017/4/22. + */ +public class TokenParser { + public List parse(String expr) { + List tokens = new ArrayList(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group17/785396327/4.9/expr/TokenParserTest.java b/group17/785396327/4.9/expr/TokenParserTest.java new file mode 100644 index 0000000000..22fe16dc85 --- /dev/null +++ b/group17/785396327/4.9/expr/TokenParserTest.java @@ -0,0 +1,40 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +/** + * Created by gongxun on 2017/4/22. + */ +public class TokenParserTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } +} From 64c602aa31f363f7af3db2b97059540cde63a8dd Mon Sep 17 00:00:00 2001 From: xukai Date: Sat, 22 Apr 2017 15:53:05 +0800 Subject: [PATCH 239/552] =?UTF-8?q?jvm=E7=AC=AC=E5=9B=9B=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/xukai/coderising/stack/InfixExpr.java | 173 ++++++------------ .../xukai/coderising/stack/InfixExpr2.java | 104 +++++++++++ .../coderising/stack/InfixToPostfix2.java | 87 +++++++++ .../xukai/coderising/stack/PostfixExpr.java | 57 ++++++ .../coderising/stack/PostfixExprTest.java | 47 +++++ .../xukai/coderising/stack/PrefixExpr.java | 60 ++++++ .../coderising/stack/PrefixExprTest.java | 45 +++++ .../org/xukai/coderising/stack/Token.java | 50 +++++ .../xukai/coderising/stack/TokenParser.java | 57 ++++++ .../java/org/xukai/jvm/attr/CodeAttr.java | 21 ++- .../java/org/xukai/jvm/clz/ClassFile.java | 32 +++- .../java/org/xukai/jvm/cmd/BiPushCmd.java | 22 +++ .../org/xukai/jvm/cmd/ByteCodeCommand.java | 129 +++++++++++++ .../java/org/xukai/jvm/cmd/CommandParser.java | 156 ++++++++++++++++ .../java/org/xukai/jvm/cmd/GetFieldCmd.java | 22 +++ .../org/xukai/jvm/cmd/GetStaticFieldCmd.java | 20 ++ .../org/xukai/jvm/cmd/InvokeSpecialCmd.java | 22 +++ .../org/xukai/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../main/java/org/xukai/jvm/cmd/LdcCmd.java | 30 +++ .../java/org/xukai/jvm/cmd/NewObjectCmd.java | 20 ++ .../java/org/xukai/jvm/cmd/NoOperandCmd.java | 24 +++ .../java/org/xukai/jvm/cmd/OneOperandCmd.java | 28 +++ .../java/org/xukai/jvm/cmd/PutFieldCmd.java | 20 ++ .../java/org/xukai/jvm/cmd/TwoOperandCmd.java | 67 +++++++ .../org/xukai/jvm/constant/ClassInfo.java | 7 +- .../org/xukai/jvm/constant/ConstantInfo.java | 19 ++ .../org/xukai/jvm/constant/ConstantPool.java | 2 +- .../org/xukai/jvm/constant/FieldRefInfo.java | 7 +- .../org/xukai/jvm/constant/MethodRefInfo.java | 7 +- .../xukai/jvm/constant/NameAndTypeInfo.java | 9 +- .../xukai/jvm/constant/NullConstantInfo.java | 7 +- .../org/xukai/jvm/constant/StringInfo.java | 7 +- .../java/org/xukai/jvm/constant/UTF8Info.java | 6 + .../java/org/xukai/jvm/method/Method.java | 13 +- .../org/xukai/jvm/print/ClassFilePrinter.java | 48 +++++ .../xukai/jvm/print/ConstantPoolPrinter.java | 85 +++++++++ .../xukai/jvm/test/ClassFileloaderTest.java | 83 ++++++++- 37 files changed, 1470 insertions(+), 145 deletions(-) create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java index bec5202645..b285a214b8 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java @@ -1,137 +1,76 @@ package org.xukai.coderising.stack; -import com.google.common.collect.Maps; -import com.sun.org.apache.bcel.internal.generic.IFNE; +import java.util.List; +import java.util.Stack; -import java.util.HashMap; public class InfixExpr { - - public static enum TypeToken { - - add('+',0),substruct('-',1),devide('/',3),plus('*',2); - - TypeToken(char token, Integer priority) { - this.token = token; - this.priority = priority; - } - - private char token; - - private Integer priority; - } - String expr = null; public InfixExpr(String expr) { this.expr = expr; } -//3*20+12*5-40/2 - public Double evaluate() { - HashMap map = new HashMap<>(); - map.put("+",0); - map.put("-",1); - map.put("/",3); - map.put("*",2); - - - Stack tokenStack = new Stack(); - Stack numStack = new Stack(); - char[] chars = expr.toCharArray(); - boolean isNem = true; - for (int i = 0; i < expr.length(); i++) { -// if (expr.charAt(i) == TypeToken.add.token || expr.charAt(i) == TypeToken.substruct.token) { -// isNem = true; -// if (!tokenStack.isEmpty() && (char)tokenStack.pop() == '*') { -// Float num2 = Float.valueOf(numStack.pop().toString()); -// Float num1 = Float.valueOf(numStack.pop().toString()); -// numStack.push(num1*num2); -// } else if (!tokenStack.isEmpty() && ((char)tokenStack.pop()) == '/') { -// Float num2 = Float.valueOf(numStack.pop().toString()); -// Float num1 = Float.valueOf(numStack.pop().toString()); -// numStack.push(num1/num2); -// } -// tokenStack.push(expr.charAt(i)); -// } else if (expr.charAt(i) == TypeToken.devide.token){ -// isNem = true; -// tokenStack.push(expr.charAt(i)); -// } else if (expr.charAt(i) == TypeToken.plus.token){ -// isNem = true; -// tokenStack.push(expr.charAt(i)); -// } else if (String.valueOf(expr.charAt(i)).matches("\\d{1}")){ -// if (isNem) { -// numStack.push((expr.charAt(i))); -// } else { -// numStack.push(numStack.pop().toString() + (expr.charAt(i))); -// } -// isNem = false; -// -// } else { -// throw new RuntimeException(); -// } - String token = (expr.charAt(i)) + ""; - Integer priprity = map.get(token); - if (priprity != null) { - //表示是运算符 - if (!tokenStack.isEmpty() && priprity < map.get(tokenStack.peek())) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - String pop = tokenStack.pop()+""; - if (pop.equals("-")) { - numStack.push(num1 - num2); - } else if (pop.equals("*")){ - numStack.push(num1 * num2); - } else if (pop.equals("/")){ - numStack.push(num1 / num2); - } else { - throw new RuntimeException(); + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + if(opStack.isEmpty()){ + + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + } - - } - tokenStack.push(token); - isNem = true; - } else if(token.matches("\\d{1}")) { - //表示是数字 - if (isNem) { - numStack.push(token); - } else { - numStack.push(numStack.pop().toString() + token); + opStack.push(token); } - isNem = false; - } else { - throw new RuntimeException(); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); } } - while (!tokenStack.isEmpty()) { - System.out.println(tokenStack.size()); - if (tokenStack.peek().equals("+")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1+num2+""); - } else if (tokenStack.peek().equals("-")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1-num2+""); - } else if (tokenStack.peek().equals("/")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1/num2+""); - } else if (tokenStack.peek().equals("*")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1*num2+""); - } else { - throw new RuntimeException(); - } - tokenStack.pop(); + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); } -// System.out.println(Double.valueOf(numStack.pop().toString())); - return Double.valueOf(numStack.pop().toString()); + + + return numStack.pop().floatValue(); } - - public static void main(String[] args) { - + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java new file mode 100644 index 0000000000..00302fa05c --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java @@ -0,0 +1,104 @@ +package org.xukai.coderising.stack; + +import java.util.HashMap; + +public class InfixExpr2 { + + public static enum TypeToken { + + add('+',0),substruct('-',1),devide('/',3),plus('*',2); + + TypeToken(char token, Integer priority) { + this.token = token; + this.priority = priority; + } + + private char token; + + private Integer priority; + } + + String expr = null; + + public InfixExpr2(String expr) { + this.expr = expr; + } +//3*20+12*5-40/2 + public Double evaluate() { + HashMap map = new HashMap<>(); + map.put("+",0); + map.put("-",1); + map.put("/",3); + map.put("*",2); + + + Stack tokenStack = new Stack(); + Stack numStack = new Stack(); + char[] chars = expr.toCharArray(); + boolean isNem = true; + for (int i = 0; i < expr.length(); i++) { + String token = (expr.charAt(i)) + ""; + Integer priprity = map.get(token); + if (priprity != null) { + //表示是运算符 + if (!tokenStack.isEmpty() && priprity < map.get(tokenStack.peek())) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + String pop = tokenStack.pop()+""; + if (pop.equals("-")) { + numStack.push(num1 - num2); + } else if (pop.equals("*")){ + numStack.push(num1 * num2); + } else if (pop.equals("/")){ + numStack.push(num1 / num2); + } else { + throw new RuntimeException(); + } + + } + tokenStack.push(token); + isNem = true; + } else if(token.matches("\\d{1}")) { + //表示是数字 + if (isNem) { + numStack.push(token); + } else { + numStack.push(numStack.pop().toString() + token); + } + isNem = false; + } else { + throw new RuntimeException(); + } + } + while (!tokenStack.isEmpty()) { + System.out.println(tokenStack.size()); + if (tokenStack.peek().equals("+")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1+num2+""); + } else if (tokenStack.peek().equals("-")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1-num2+""); + } else if (tokenStack.peek().equals("/")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1/num2+""); + } else if (tokenStack.peek().equals("*")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1*num2+""); + } else { + throw new RuntimeException(); + } + tokenStack.pop(); + } +// System.out.println(Double.valueOf(numStack.pop().toString())); + return Double.valueOf(numStack.pop().toString()); + } + + + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java new file mode 100644 index 0000000000..71a483b29f --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java @@ -0,0 +1,87 @@ +package org.xukai.coderising.stack; + +import java.util.List; +import java.util.Stack; + +/** + * 将中缀表达式转换为后缀表达式: + 与转换为前缀表达式相似,遵循以下步骤: + (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; + (2) 从左至右扫描中缀表达式; + (3) 遇到操作数时,将其压入S2; + (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: + (4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈; + (4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况); + (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; + (5) 遇到括号时: + (5-1) 如果是左括号“(”,则直接压入S1; + (5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃; + (6) 重复步骤(2)至(5),直到表达式的最右边; + (7) 将S1中剩余的运算符依次弹出并压入S2; + (8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。 + + 例如,将中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下: + 扫描到的元素 S2(栈底->栈顶) S1 (栈底->栈顶) 说明 + 1 1 空 数字,直接入栈 + + 1 + S1为空,运算符直接入栈 + ( 1 + ( 左括号,直接入栈 + ( 1 + ( ( 同上 + 2 1 2 + ( ( 数字 + + 1 2 + ( ( + S1栈顶为左括号,运算符直接入栈 + 3 1 2 3 + ( ( + 数字 + ) 1 2 3 + + ( 右括号,弹出运算符直至遇到左括号 + × 1 2 3 + + ( × S1栈顶为左括号,运算符直接入栈 + 4 1 2 3 + 4 + ( × 数字 + ) 1 2 3 + 4 × + 右括号,弹出运算符直至遇到左括号 + - 1 2 3 + 4 × + - -与+优先级相同,因此弹出+,再压入- + 5 1 2 3 + 4 × + 5 - 数字 + 到达最右端 1 2 3 + 4 × + 5 - 空 S1中剩余的运算符 + 因此结果为“1 2 3 + 4 × + 5 -”(注意需要逆序输出)。 + * @author xukai + * @desc + * @date 2017-04-22-14:10 + */ +public class InfixToPostfix2 { + + + private static TokenParser tokenParser = new TokenParser(); + + public static String toPostFixExpr(String expr){ + + List tokens = tokenParser.parse(expr); + + Stack s1 = new Stack(); + Stack s2 = new Stack(); + + for (Token token : tokens) { + if (token.isNumber()) { + s2.push(token); + } else { + while (token.isOperator() && !s1.isEmpty()) { + if (!token.hasHigherPriority(s1.peek())) { + s2.push(s1.pop()); + continue; + } + break; + } + s1.push(token); + } + } + while (!s1.isEmpty()) { + s2.push(s1.pop()); + } + StringBuilder stringBuilder = new StringBuilder(); + while (!s2.isEmpty()) { + Token token = s2.pop(); + s1.push(token); + } + while (!s1.isEmpty()) { + Token token = s1.pop(); + stringBuilder.append(token.toString()).append(" "); + } + + return stringBuilder.substring(0,stringBuilder.length() - 1); + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java new file mode 100644 index 0000000000..98e849c4ff --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java @@ -0,0 +1,57 @@ +package org.xukai.coderising.stack; + +import java.util.List; +import java.util.Stack; + +/** + * 与前缀表达式类似,只是顺序是从左至右: + 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。 + 例如后缀表达式“3 4 + 5 × 6 -”: + (1) 从左至右扫描,将3和4压入堆栈; + (2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈; + (3) 将5入栈; + (4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈; + (5) 将6入栈; + (6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 + */ +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack numStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } else{ + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java new file mode 100644 index 0000000000..178fc23836 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java @@ -0,0 +1,47 @@ +package org.xukai.coderising.stack; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + + @Test + public void testTo(){ + String poseExpr = InfixToPostfix2.toPostFixExpr("10-2*3+50"); + System.out.println(poseExpr); + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java new file mode 100644 index 0000000000..cab9831ec2 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java @@ -0,0 +1,60 @@ +package org.xukai.coderising.stack; + +import java.util.List; +import java.util.Stack; + +/** + * 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 + 例如前缀表达式“- × + 3 4 5 6”: + (1) 从右至左扫描,将6、5、4、3压入堆栈; + (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈; + (3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈; + (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 + 可以看出,用计算机计算前缀表达式的值是很容易的。 + * @author xukai + * @desc + * @date 2017-04-22-13:49 + */ +public class PrefixExpr { + + + private String expr; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate(){ + + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + + Stack numStack = new Stack(); + Stack oprStack = new Stack(); + + for (int i = tokens.size() - 1; i > -1; i--) { + if (tokens.get(i).isNumber()) { + numStack.push(new Float(tokens.get(i).getIntValue())); + } else { + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + numStack.push(caculate(tokens.get(i).toString(), num1, num2)); + } + } + + return numStack.pop(); + } + + private Float caculate(String oper, Float num1, Float num2){ + if (oper.equals("+")) { + return num1 + num2; + } else if (oper.equals("-")) { + return num1 - num2; + } else if (oper.equals("/")) { + return num1 / num2; + } else if (oper.equals("*")) { + return num1 * num2; + } + throw new RuntimeException("illeagal operation token"); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java new file mode 100644 index 0000000000..bc0e4b53e4 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java @@ -0,0 +1,45 @@ +package org.xukai.coderising.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java new file mode 100644 index 0000000000..e10eabb1f4 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java @@ -0,0 +1,50 @@ +package org.xukai.coderising.stack; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java new file mode 100644 index 0000000000..03e214bf1b --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java @@ -0,0 +1,57 @@ +package org.xukai.coderising.stack; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java index d0c8ef4e32..fb08ebc8e2 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java @@ -2,6 +2,8 @@ import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.cmd.ByteCodeCommand; +import org.xukai.jvm.cmd.CommandParser; import org.xukai.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { @@ -16,21 +18,23 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -48,15 +52,14 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxLocals = iter.nextToInt(2); int codeLength = iter.nextToInt(4); String code = iter.nextToString(codeLength); - System.out.println(code); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, cmds); int exceptionTableLength = iter.nextToInt(2); if (exceptionTableLength > 0) { iter.nextToInt(exceptionTableLength); System.out.println("解析exception"); } int subAttributeCount = iter.nextToInt(2); - System.out.println("subAttributeCount" + subAttributeCount); if (subAttributeCount > 0) { for (int i = 0; i < subAttributeCount; i++) { AttributeInfo attributeInfo = AttributeInfo.parseAttribute(iter, clzFile); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java index a2b2dfb515..c8777fea97 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java @@ -81,13 +81,41 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + for(Method m :methods){ + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + public Method getMainMethod(){ + for(Method m :methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ + return m; + } + } + return null; + } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..bd1eb4bf11 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java @@ -0,0 +1,22 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..edb68e1256 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,129 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantInfo; +import org.xukai.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..e44fb1e05f --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java @@ -0,0 +1,156 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; + +import java.util.ArrayList; +import java.util.List; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + // System.out.println( cmd.toString(clzFile.getConstPool())); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..faa268b0d2 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..4112f7cc56 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..7dd0b62407 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,22 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..77ba5c7460 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..2d8b1ae2f3 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantInfo; +import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..0ac1b33832 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,20 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd { + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..63683e3865 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,24 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand { + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..6498b64289 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,28 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..0a5987e4c3 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..b423f989ae --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ClassInfo; +import org.xukai.jvm.constant.ConstantInfo; +import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.FieldRefInfo; +import org.xukai.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand { + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java index bf7171a966..1adde177f3 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java @@ -15,7 +15,12 @@ public void setUtf8Index(int utf8Index) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } + public String getClassName() { int index = getUtf8Index(); UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java index 24323692e9..ffae0e4e83 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java @@ -25,5 +25,24 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + + public abstract void accept(Visitor visitor); + + public static interface Visitor { + + public void visitString(StringInfo info); + + public void visitNameAndType(NameAndTypeInfo info); + + public void visitMethodRef(MethodRefInfo info); + + public void visitFieldRef(FieldRefInfo info); + + public void visitClassInfo(ClassInfo info); + + public void visistUTF8(UTF8Info info); + + + } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java index ff4aa4b906..d9cc6f0f56 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java index f0b846f47c..d9b5281155 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java @@ -11,7 +11,12 @@ public FieldRefInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java index a0c02fedaf..28b80235d9 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java @@ -14,7 +14,12 @@ public MethodRefInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java index c88c848d3a..66d235641d 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java @@ -25,8 +25,13 @@ public void setIndex2(int index2) { public int getType() { return type; } - - + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } + + public String getName(){ ConstantPool pool = this.getConstantPool(); UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java index 0aa452b866..732e8a42cf 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java @@ -9,5 +9,10 @@ public NullConstantInfo(){ public int getType() { return -1; } - + + @Override + public void accept(Visitor visitor) { + + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java index 31a3c52910..0fc28b142c 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java @@ -10,7 +10,12 @@ public StringInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } + public int getIndex() { return index; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java index caf1c19918..ae5200371e 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java @@ -16,6 +16,12 @@ public void setLength(int length) { public int getType() { return type; } + + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } + @Override public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java index 6cd71db72c..27585d73b1 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java @@ -4,6 +4,7 @@ import org.xukai.jvm.attr.AttributeInfo; import org.xukai.jvm.attr.CodeAttr; import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.cmd.ByteCodeCommand; import org.xukai.jvm.constant.UTF8Info; import org.xukai.jvm.loader.ByteCodeIterator; @@ -25,6 +26,7 @@ public ClassFile getClzFile() { public int getNameIndex() { return nameIndex; } + public int getDescriptorIndex() { return descriptorIndex; } @@ -55,6 +57,10 @@ public String getMethodName(){ public String getMethodDescription(){ return ((UTF8Info)clzFile.getConstantPool().getConstantInfo(this.descriptorIndex)).getValue(); } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } @@ -77,12 +83,5 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ } - public static void main(String[] args) { - CodeAttr codeAttr = new CodeAttr(1, 1, 1, 1, 1, ""); - System.out.println(codeAttr instanceof AttributeInfo); - AttributeInfo codeAttr2 = new CodeAttr(1, 1, 1, 1, 1, ""); - System.out.println(codeAttr2 instanceof CodeAttr); - } - } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..4c78dc1796 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java @@ -0,0 +1,48 @@ +package org.xukai.jvm.print; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "D:\\java\\IDEA-Workspace\\coding2017\\group19\\527220084\\xukai_coding\\coding-common\\target\\classes"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "org.xukai.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..b1ec2eda79 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,85 @@ +package org.xukai.jvm.print; + + +import org.xukai.jvm.constant.ClassInfo; +import org.xukai.jvm.constant.ConstantInfo; +import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.FieldRefInfo; +import org.xukai.jvm.constant.MethodRefInfo; +import org.xukai.jvm.constant.NameAndTypeInfo; +import org.xukai.jvm.constant.StringInfo; +import org.xukai.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()).append(" ").append(info.getClassName()).append(".").append + (info.getMethodName()).append(info.getParamAndReturnType()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + + for(int i=1; i <= pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java index c4fad12ff6..08e65bedce 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java @@ -8,6 +8,10 @@ import org.junit.Test; import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.clz.ClassIndex; +import org.xukai.jvm.cmd.BiPushCmd; +import org.xukai.jvm.cmd.ByteCodeCommand; +import org.xukai.jvm.cmd.OneOperandCmd; +import org.xukai.jvm.cmd.TwoOperandCmd; import org.xukai.jvm.constant.ClassInfo; import org.xukai.jvm.constant.ConstantPool; import org.xukai.jvm.constant.MethodRefInfo; @@ -303,7 +307,82 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } - - + + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + } From 2c2e4801a05b0cee814fdd16b093c149909455ba Mon Sep 17 00:00:00 2001 From: xiaomingbai <498654356@qq.com> Date: Sat, 22 Apr 2017 17:13:26 +0800 Subject: [PATCH 240/552] add jvm field,method --- .../coderising/jvm/attr/AttributeInfo.java | 28 ++++++ .../com/coderising/jvm/attr/CodeAttr.java | 89 +++++++++++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 58 ++++++++++++ .../jvm/attr/LocalVariableItem.java | 54 +++++++++++ .../jvm/attr/LocalVariableTable.java | 42 +++++++++ .../com/coderising/jvm/clz/ClassFile.java | 23 +++++ .../coderising/jvm/constant/ConstantPool.java | 3 + .../java/com/coderising/jvm/field/Field.java | 44 +++++++++ .../jvm/loader/ByteCodeIterator.java | 28 +++++- .../jvm/loader/ClassFileParser.java | 66 +++++++++++++- .../com/coderising/jvm/method/Method.java | 43 +++++++++ .../jvm/test/ClassFileloaderTest.java | 78 ++++++++++++++++ 12 files changed, 554 insertions(+), 2 deletions(-) create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/field/Field.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/method/Method.java diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..bd6198e46f --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.attr; + +public class AttributeInfo { + public static final String ATTR_CODE = "Code"; + public static final String ATTR_LINE_NUMBER_TABLE = "LineNumberTable"; + public static final String ATTR_LOCAL_VARIABLE_TABLE = "LocalVariableTable"; + + private int attrNameIndex; + private int attrLength; + public int getAttrNameIndex() { + return attrNameIndex; + } + public void setAttrNameIndex(int attrNameIndex) { + this.attrNameIndex = attrNameIndex; + } + public int getAttrLength() { + return attrLength; + } + public void setAttrLength(int attrLength) { + this.attrLength = attrLength; + } + public AttributeInfo(int attrNameIndex, int attrLength) { + super(); + this.attrNameIndex = attrNameIndex; + this.attrLength = attrLength; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..0f09f3f02b --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,89 @@ +package com.coderising.jvm.attr; + +import org.junit.Assert; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo{ + + private int maxStack ; + private int maxLocals ; + private int codeLength ; + private String code; + private LineNumberTable lineNumTable; + private LocalVariableTable localVariableTable; + public LocalVariableTable getLocalVariableTable() { + return localVariableTable; + } + public void setLocalVariableTable(LocalVariableTable localVariableTable) { + this.localVariableTable = localVariableTable; + } + public CodeAttr(int attrNameIndex, int attrLength) { + super(attrNameIndex, attrLength); + } + public int getMaxStack() { + return maxStack; + } + public void setMaxStack(int maxStack) { + this.maxStack = maxStack; + } + public int getMaxLocals() { + return maxLocals; + } + public void setMaxLocals(int maxLocals) { + this.maxLocals = maxLocals; + } + public int getCodeLength() { + return codeLength; + } + public void setCodeLength(int codeLength) { + this.codeLength = codeLength; + } + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } + public LineNumberTable getLineNumTable() { + return lineNumTable; + } + public void setLineNumTable(LineNumberTable lineNumTable) { + this.lineNumTable = lineNumTable; + } + public static CodeAttr parse(ByteCodeIterator it, ConstantPool constantPool) { + int attrNameIndex = it.next2ByteToInt(); + int attrLength = it.next4ByteToInt(); + int maxStack = it.next2ByteToInt(); + int maxLocals = it.next2ByteToInt(); + int codeLength = it.next4ByteToInt(); + String code = it.nextXByteToHexStr(codeLength); + int exceptionTableLength = it.next2ByteToInt(); + Assert.assertEquals(0, exceptionTableLength); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLength); + codeAttr.setMaxStack(maxStack); + codeAttr.setMaxLocals(maxLocals); + codeAttr.setCodeLength(codeLength); + codeAttr.setCode(code); + + int subAttrCount = it.next2ByteToInt(); + while(subAttrCount > 0) { + int subAttrNameIndex = it.next2ByteToInt(); + String subAttrName = constantPool.getUTF8String(subAttrNameIndex); + if(AttributeInfo.ATTR_LINE_NUMBER_TABLE.equals(subAttrName)) { //LineNumberTable + it.back(2); + codeAttr.setLineNumTable(LineNumberTable.parse(it, constantPool)); + } else if (AttributeInfo.ATTR_LOCAL_VARIABLE_TABLE.equals(subAttrName)) { //LocalVariableTable + it.back(2); + codeAttr.setLocalVariableTable(LocalVariableTable.parse(it, constantPool)); + } else { + throw new RuntimeException("no implements attrName: " + subAttrName); + } + subAttrCount--; + } + return codeAttr; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LineNumberTable.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..655549cf1f --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,58 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class LineNumberTable extends AttributeInfo { + private List lineNumberItems = new ArrayList<>(); + + public LineNumberTable(int attrNameIndex, int attrLength) { + super(attrNameIndex, attrLength); + } + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public List getLineNumberItems() { + return lineNumberItems; + } + + public void addLineNumberItem(LineNumberItem item){ + this.lineNumberItems.add(item); + } + + + public static LineNumberTable parse(ByteCodeIterator it, ConstantPool constantPool) { + int attrNameIndex = it.next2ByteToInt(); + int attrLength = it.next4ByteToInt(); + LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex, attrLength); + int lineNumberTableLength = it.next2ByteToInt(); + while(lineNumberTableLength > 0) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(it.next2ByteToInt()); + item.setLineNum(it.next2ByteToInt()); + lineNumberTable.addLineNumberItem(item); + lineNumberTableLength--; + } + return lineNumberTable; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..a7d220d8a3 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + + private int startPc; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPc() { + return startPc; + } + public void setStartPc(int startPc) { + this.startPc = startPc; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } + public LocalVariableItem(int startPc, int length, int nameIndex, int descIndex, int index) { + super(); + this.startPc = startPc; + this.length = length; + this.nameIndex = nameIndex; + this.descIndex = descIndex; + this.index = index; + } + public LocalVariableItem() { + super(); + // TODO Auto-generated constructor stub + } + + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..2a08a4e778 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + private List localVariableItems = new ArrayList<>(); + + public List getLocalVariableItems() { + return localVariableItems; + } + + public void addLocalVariableItem(LocalVariableItem localVariableItem) { + this.localVariableItems.add(localVariableItem); + } + + public LocalVariableTable(int attrNameIndex, int attrLength) { + super(attrNameIndex, attrLength); + } + + public static LocalVariableTable parse(ByteCodeIterator it, ConstantPool constantPool) { + int attrNameIndex = it.next2ByteToInt(); + int attrLength = it.next4ByteToInt(); + LocalVariableTable localVariableTable = new LocalVariableTable(attrNameIndex, attrLength); + + int localVariableTableLength = it.next2ByteToInt(); + while(localVariableTableLength > 0) { + int startPc = it.next2ByteToInt(); + int length = it.next2ByteToInt(); + int nameIndex = it.next2ByteToInt(); + int descIndex = it.next2ByteToInt(); + int index = it.next2ByteToInt(); + localVariableTable.addLocalVariableItem(new LocalVariableItem(startPc, length, nameIndex, descIndex, index)); + localVariableTableLength--; + } + return localVariableTable; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java index cbcd1dd0ae..387d6cad30 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -1,6 +1,11 @@ package com.coderising.jvm.clz; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFile { @@ -9,6 +14,8 @@ public class ClassFile { private ConstantPool constantPool; private ClassIndex classIndex; private AccessFlag accessFlag; + private List fields = new ArrayList (); + private List methods = new ArrayList (); public int getMinorVersion() { return minorVersion; @@ -54,5 +61,21 @@ public AccessFlag getAccessFlag() { public void setAccessFlag(AccessFlag accessFlag) { this.accessFlag = accessFlag; } + + public List getFields() { + return this.fields; + } + + public void addFiled(Field field) { + this.fields.add(field); + } + + public List getMethods() { + return this.methods; + } + + public void addMethod(Method method) { + this.methods.add(method); + } } diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantPool.java index da83d88297..bc823181c5 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantPool.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/constant/ConstantPool.java @@ -27,4 +27,7 @@ public ConstantInfo getConstantInfo(int i) { public void addConstantInfo(ConstantInfo constantInfo) { this.constantInfosList.add(constantInfo); } + public String getUTF8String(int index) { + return ((UTF8Info)getConstantInfo(index)).getValue(); + } } diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/field/Field.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..b6d47bf761 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/field/Field.java @@ -0,0 +1,44 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; + +public class Field { + + private int accessFlag; + private int nameIndex; + private int descIndex; + private ConstantPool constantPool; + public ConstantPool getConstantPool() { + return constantPool; + } + public void setConstantPool(ConstantPool constantPool) { + this.constantPool = constantPool; + } + public int getAccessFlag() { + return accessFlag; + } + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + @Override + public String toString() { + String name = ((UTF8Info) this.constantPool.getConstantInfo(nameIndex)).getValue(); + String desc = ((UTF8Info) this.constantPool.getConstantInfo(descIndex)).getValue(); + return name + ":" + desc; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java index e4afbc62bc..ca87c3caab 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java @@ -19,13 +19,17 @@ public void skip(int index) { public int next2ByteToInt() { - return converToInt(codes[index++],codes[index++]); + return converToInt(codes[index++], codes[index++]); } public int next1ByteToInt() { return converToInt(codes[index++]); } + public int next4ByteToInt() { + return converToInt(codes[index++], codes[index++], codes[index++], codes[index++]); + } + /** * big-endian */ @@ -53,5 +57,27 @@ public String nextLengthByteToString(int length) { } return str; } + + public String nextXByteToHexStr(int length) { + byte[] bytes = Arrays.copyOfRange(codes, index, index + length); + StringBuffer buffer = new StringBuffer(); + for(int i=0;i 0) { + Method method = new Method(); + int accessFlag = it.next2ByteToInt(); + int nameIndex = it.next2ByteToInt(); + int descIndex = it.next2ByteToInt(); + int attrCount = it.next2ByteToInt(); + method.setAccessFlag(accessFlag); + method.setNameIndex(nameIndex); + method.setDescIndex(descIndex); + method.setConstantPool(clzFile.getConstantPool()); + while(attrCount > 0) { + int attrNameIndex = it.next2ByteToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + if(AttributeInfo.ATTR_CODE.equals(attrName)) { //code + it.back(2); + CodeAttr codeAttr = CodeAttr.parse(it, clzFile.getConstantPool()); + method.setCodeAttr(codeAttr); + } else { + throw new RuntimeException("no implements attributeName: " + attrName); + } + attrCount--; + } + clzFile.addMethod(method); + methodCount--; + } + } + + private void parseField(ByteCodeIterator it, ClassFile clzFile) { + int fieldCount = it.next2ByteToInt(); + while(fieldCount > 0) { + Field field = new Field(); + int accessFlag = it.next2ByteToInt(); + int nameIndex = it.next2ByteToInt(); + int descIndex = it.next2ByteToInt(); + int attrCount = it.next2ByteToInt(); + Assert.assertEquals("no have ", 0, attrCount); //TODO + field.setAccessFlag(accessFlag); + field.setNameIndex(nameIndex); + field.setDescIndex(descIndex); + field.setConstantPool(clzFile.getConstantPool()); + clzFile.addFiled(field); + fieldCount--; + } + } + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { int value = iter.next2ByteToInt(); AccessFlag accessFlag = new AccessFlag(value); diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/method/Method.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..08efcafaf1 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/method/Method.java @@ -0,0 +1,43 @@ +package com.coderising.jvm.method; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.constant.ConstantPool; + +public class Method { + private int accessFlag; + private int nameIndex; + private int descIndex; + private ConstantPool constantPool; + private CodeAttr codeAttr; + public int getAccessFlag() { + return accessFlag; + } + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public ConstantPool getConstantPool() { + return constantPool; + } + public void setConstantPool(ConstantPool constantPool) { + this.constantPool = constantPool; + } + public CodeAttr getCodeAttr() { + return codeAttr; + } + public void setCodeAttr(CodeAttr codeAttr) { + this.codeAttr = codeAttr; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java index 8c8d7b5f44..45a80b9607 100644 --- a/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,5 +1,7 @@ package com.coderising.jvm.test; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -13,7 +15,9 @@ import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.constant.NameAndTypeInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; public class ClassFileloaderTest { @@ -199,5 +203,79 @@ public void testAccessFlag() { Assert.assertEquals(true, accessFlag.isPublicClass()); Assert.assertEquals(false, accessFlag.isFinalClass()); } + + /*** + * third ------------------------------------------------------------------------------------------------------------ + */ + + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } From fe49c69448ba4d9cfda6cc2ce0af641237b06814 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Sat, 22 Apr 2017 19:18:06 +0800 Subject: [PATCH 241/552] seventh homework finished --- .../src/com/donaldy/jvm/attr/CodeAttr.java | 63 +++++++++- .../src/com/donaldy/jvm/clz/ClassFile.java | 19 +++ .../com/donaldy/jvm/cmd/CommandParser.java | 77 +++++++++++- .../com/donaldy/jvm/constant/ClassInfo.java | 4 + .../donaldy/jvm/constant/ConstantInfo.java | 11 ++ .../donaldy/jvm/constant/ConstantPool.java | 4 +- .../donaldy/jvm/constant/FieldRefInfo.java | 4 + .../donaldy/jvm/constant/MethodRefInfo.java | 5 + .../donaldy/jvm/constant/NameAndTypeInfo.java | 6 + .../jvm/constant/NullConstantInfo.java | 4 + .../com/donaldy/jvm/constant/StringInfo.java | 6 + .../com/donaldy/jvm/constant/UTF8Info.java | 5 + .../donaldy/jvm/loader/ClassFileLoader.java | 1 + .../src/com/donaldy/jvm/method/Method.java | 39 +++++- .../donaldy/jvm/print/ClassFilePrinter.java | 10 +- .../jvm/print/ConstantPoolPrinter.java | 116 +++++++++++++++++- .../donaldy/jvm/test/ClassFileloaderTest.java | 4 + 17 files changed, 359 insertions(+), 19 deletions(-) diff --git a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java index 22e48645be..9122f3690a 100644 --- a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java +++ b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java @@ -2,6 +2,7 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.cmd.ByteCodeCommand; +import com.donaldy.jvm.cmd.CommandParser; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.loader.ByteCodeIterator; @@ -16,9 +17,11 @@ public String getCode() { } private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { return cmds; } + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; @@ -41,12 +44,63 @@ public void setLocalVariableTable(LocalVariableTable t) { } public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile,code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code,cmds); + + int exceptionTableLen = iter.nextU2ToInt(); + //TODO 处理exception + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.nextU2ToInt(); + + for(int x=1; x<=subAttrCount; x++){ + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); - return null; + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } + else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } + else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } + else{ + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; } - public String toString(ConstantPool pool){ + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); //buffer.append("Code:").append(code).append("\n"); for(int i=0;i cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + "has not been implement."); + } + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; } private static void calcuateOffset(List cmds) { diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java index 71f31261e4..cbf71927be 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java @@ -21,4 +21,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java index 20cad6fcd5..ff2a27bcd6 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java @@ -26,4 +26,15 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java b/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java index 77bdfc8e67..1698c2c657 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java @@ -23,7 +23,9 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } + + } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java index 6a6f72f5da..ffd7b835e0 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java @@ -51,4 +51,8 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java index e65135279f..b370eff575 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java @@ -49,6 +49,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java index 21ecd2b411..db48418b57 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,10 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java index 3a2cc11017..74e491637f 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java index f59d34a497..94325bfdbc 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java b/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java index 7432e5b6c4..10c06dcf2a 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java @@ -26,6 +26,11 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } diff --git a/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java b/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java index e1132dd023..17f25799c2 100644 --- a/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java +++ b/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java @@ -58,6 +58,7 @@ public String getClassPath() { } public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); ClassFileParser parser = new ClassFileParser(); return parser.parse(codes); diff --git a/group24/448641125/src/com/donaldy/jvm/method/Method.java b/group24/448641125/src/com/donaldy/jvm/method/Method.java index 603e773b87..8720da21b7 100644 --- a/group24/448641125/src/com/donaldy/jvm/method/Method.java +++ b/group24/448641125/src/com/donaldy/jvm/method/Method.java @@ -49,8 +49,42 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + + /*System.out.println("name = " + clzFile.getConstantPool().getUTF8String(nameIndex) + + ", desc = " + clzFile.getConstantPool().getUTF8String(descIndex));*/ + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + //attribCount == 1 + for( int j = 1; j <= attribCount; j++){ + + int attrNameIndex = iter.nextU2ToInt(); + /*System.out.println("attrNameIndex : " + attrNameIndex);*/ + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + /*System.out.println("attrName : " + attrName);*/ + iter.back(2); + + if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){ + /*System.out.println("j : " + j );*/ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else{ + throw new RuntimeException("only CODE attribute is implemented , please implement the "+ attrName); + } + + } + + return m ; + + //////////////////////Backup/////////////////////// + /*int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); int descriptorIndex = iter.nextU2ToInt(); int attributeCount = iter.nextU2ToInt(); @@ -60,6 +94,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ if (!"Code".equals(clzFile.getConstantPool().getUTF8String(attrNameIndex))) throw new RuntimeException("attributeInfo : " + attrNameIndex); + //CodeAttr.parse int attrLen = iter.nextU4ToInt(); int maxStack = iter.nextU2ToInt(); int maxLocals = iter.nextU2ToInt(); @@ -84,7 +119,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ Method method = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); method.setCodeAttr(codeAttr); - return method; + return method;*/ } @@ -105,6 +140,8 @@ public String toString() { } public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java b/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java index 26e9d183d4..740a9aa9aa 100644 --- a/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java +++ b/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java @@ -29,21 +29,19 @@ public void print(){ System.out.println("minor version:" + clzFile.getMinorVersion()); - System.out.println("major version:" + clzFile.getMinorVersion()); + System.out.println("major version:" + clzFile.getMajorVersion()); ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); - - - } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "D:\\tools\\Code\\Y_Repository\\coding2017\\group24\\448641125\\out\\production\\448641125\\"; ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "com.donaldy.jvm.test.EmployeeV1"; ClassFile clzFile = loader.loadClass(className); diff --git a/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java b/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java index 7070d5766e..910494d803 100644 --- a/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java +++ b/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java @@ -1,5 +1,7 @@ package com.donaldy.jvm.print; +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.clz.ClassIndex; import com.donaldy.jvm.constant.ClassInfo; import com.donaldy.jvm.constant.ConstantInfo; import com.donaldy.jvm.constant.ConstantPool; @@ -15,11 +17,117 @@ public class ConstantPoolPrinter { this.pool = pool; } public void print(){ - + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + + for(int i=1; i<=pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } + } + /*public void print(){ + System.out.println("Constant Pool:"); + + for (int i = 0; i <= this.pool.getSize(); ++i) { + ConstantInfo cnstInfo = this.pool.getConstantInfo(i); + + if (cnstInfo instanceof ClassInfo) { + ClassInfo info = (ClassInfo)cnstInfo; + + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + } + + if (cnstInfo instanceof UTF8Info) { + + UTF8Info info = (UTF8Info) cnstInfo; + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + } + + + + *//*int type = constInfo.getType(); + System.out.println("type : " + type); + + if (type == ClassInfo.UTF8_INFO) { + + } else if (type == ClassInfo.FLOAT_INFO) { + + } else if (type == ClassInfo.CLASS_INFO) { + + } else if (type == ClassInfo.STRING_INFO) { + + } else if (type == ClassInfo.FIELD_INFO) { + + } else if (type == ClassInfo.METHOD_INFO) { + + } else if (type == ClassInfo.NAME_AND_TYPE_INFO) { + + }*//* + } - - - } + }*/ } diff --git a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java index 0884878010..7c30dedb17 100644 --- a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java +++ b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java @@ -288,6 +288,10 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName @Test public void testByteCodeCommand(){ { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(this.path1); + this.clzFile = loader.loadClass("com.donaldy.jvm.test.EmployeeV1"); + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); ByteCodeCommand [] cmds = initMethod.getCmds(); From c57c03d57f44ed82dd8595856289f4eaf05326e1 Mon Sep 17 00:00:00 2001 From: xiaomingbai <498654356@qq.com> Date: Sat, 22 Apr 2017 19:24:56 +0800 Subject: [PATCH 242/552] add cmd --- .../com/coderising/jvm/attr/CodeAttr.java | 13 ++ .../com/coderising/jvm/clz/ClassFile.java | 14 ++ .../com/coderising/jvm/cmd/BiPushCmd.java | 5 + .../coderising/jvm/cmd/ByteCodeCommand.java | 85 ++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 127 ++++++++++++++++++ .../com/coderising/jvm/cmd/GetStaticCmd.java | 5 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 5 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 5 + .../java/com/coderising/jvm/cmd/LdcCmd.java | 5 + .../com/coderising/jvm/cmd/NewObjectCmd.java | 5 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 10 ++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 15 +++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 5 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 16 +++ .../com/coderising/jvm/method/Method.java | 4 + .../jvm/test/ClassFileloaderTest.java | 78 +++++++++++ 16 files changed, 397 insertions(+) create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/GetStaticCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/TwoOperandCmd.java diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/CodeAttr.java index 0f09f3f02b..3211cac50c 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/CodeAttr.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/attr/CodeAttr.java @@ -2,6 +2,8 @@ import org.junit.Assert; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -13,6 +15,10 @@ public class CodeAttr extends AttributeInfo{ private String code; private LineNumberTable lineNumTable; private LocalVariableTable localVariableTable; + private ByteCodeCommand[] cmds; + public void setCmds(ByteCodeCommand[] cmds) { + this.cmds = cmds; + } public LocalVariableTable getLocalVariableTable() { return localVariableTable; } @@ -59,6 +65,8 @@ public static CodeAttr parse(ByteCodeIterator it, ConstantPool constantPool) { int maxLocals = it.next2ByteToInt(); int codeLength = it.next4ByteToInt(); String code = it.nextXByteToHexStr(codeLength); + ByteCodeCommand[] cmds = CommandParser.parse(constantPool, code); + int exceptionTableLength = it.next2ByteToInt(); Assert.assertEquals(0, exceptionTableLength); @@ -67,6 +75,7 @@ public static CodeAttr parse(ByteCodeIterator it, ConstantPool constantPool) { codeAttr.setMaxLocals(maxLocals); codeAttr.setCodeLength(codeLength); codeAttr.setCode(code); + codeAttr.setCmds(cmds); int subAttrCount = it.next2ByteToInt(); while(subAttrCount > 0) { @@ -85,5 +94,9 @@ public static CodeAttr parse(ByteCodeIterator it, ConstantPool constantPool) { } return codeAttr; } + + public ByteCodeCommand[] getCmds() { + return this.cmds; + } } diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java index 387d6cad30..f13a8d538c 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -77,5 +77,19 @@ public List getMethods() { public void addMethod(Method method) { this.methods.add(method); } + + public Method getMethod(String methodName, String paramterType) { + for (Method method: this.methods) { + if(getConstantPool().getUTF8String(method.getNameIndex()).equals(methodName) + && getConstantPool().getUTF8String(method.getDescIndex()).equals(paramterType)) { + return method; + } + } + return null; + } + + public Method getMainMethod() { + return this.getMethod("main", "([Ljava/lang/String;)V"); + } } diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/BiPushCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cbffcfc6a9 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.cmd; + +public class BiPushCmd extends OneOperandCmd { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/ByteCodeCommand.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..1f3c0fa0eb --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +public abstract class ByteCodeCommand { + private int offset; + private String opCode; + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + public int getOffset() { + return offset; + } + public void setOffset(int offset) { + this.offset = offset; + } + public String getOpCode() { + return opCode; + } + public void setOpCode(String opCode) { + this.opCode = opCode; + } + public String getReadableCodeText() { + String str = codeMap.get(this.opCode); + if(str == null) { + str = this.opCode; + } + return str; + } + + abstract public int getLength(); + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/CommandParser.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..884c5f856d --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,127 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +public class CommandParser { + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ConstantPool constantPool, String code) { + CommandIterator it = new CommandIterator(code); + List cmds = new ArrayList<>(); + while(it.hasNext()) { + String opCode = it.next2CharAsString().toUpperCase(); + if(aload_0.equalsIgnoreCase(opCode) || aload_1.equalsIgnoreCase(opCode) || aload_2.equalsIgnoreCase(opCode) + || voidreturn.equalsIgnoreCase(opCode) || dup.equalsIgnoreCase(opCode) || astore_1.equalsIgnoreCase(opCode) + || iload_1.equalsIgnoreCase(opCode) || iload_2.equalsIgnoreCase(opCode) || iload_3.equalsIgnoreCase(opCode)){ + NoOperandCmd cmd = new NoOperandCmd(); + cmd.setOpCode(opCode); + cmds.add(cmd); + } else if(invokespecial.equalsIgnoreCase(opCode)) { + addTwoOperandCmd(it, cmds, opCode, new InvokeSpecialCmd()); + } else if(putfield.equalsIgnoreCase(opCode)) { + addTwoOperandCmd(it, cmds, opCode, new PutFieldCmd()); + } else if(getstatic.equalsIgnoreCase(opCode)) { + addTwoOperandCmd(it, cmds, opCode, new GetStaticCmd()); + } else if(invokevirtual.equalsIgnoreCase(opCode)) { + addTwoOperandCmd(it, cmds, opCode, new InvokeVirtualCmd()); + } else if(new_object.equalsIgnoreCase(opCode)) { + addTwoOperandCmd(it, cmds, opCode, new NewObjectCmd()); + } else if(ldc.equalsIgnoreCase(opCode)) { + addOneOperandCmd(it, cmds, opCode, new LdcCmd()); + } else if(bipush.equalsIgnoreCase(opCode)) { + addOneOperandCmd(it, cmds, opCode, new BiPushCmd()); + } else { + throw new RuntimeException("no implements opCode : " + opCode); + } + } + calcuateOffset(cmds); + return cmds.toArray(new ByteCodeCommand[cmds.size()]); + } + + private static void addOneOperandCmd(CommandIterator it, List cmds, String opCode, OneOperandCmd cmd) { + cmd.setOpCode(opCode); + cmd.setOperand(it.next2CharAsInt()); + cmds.add(cmd); + } + + private static void addTwoOperandCmd(CommandIterator it, List cmds, String opCode, + TwoOperandCmd cmd) { + cmd.setIndex(it.next4CharAsInt()); + cmd.setOpCode(opCode); + cmds.add(cmd); + } + + private static void calcuateOffset(List cmds) { + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + } + + private static class CommandIterator { + private String code; + private int index = 0; + public CommandIterator(String code) { + super(); + this.code = code; + } + public boolean hasNext() { + return index < code.length(); + } + public String next2CharAsString() { + String result = code.substring(index, index + 2); + index += 2; + return result; + } + public int next2CharAsInt() { + String str = this.next2CharAsString(); + return hexStrToInt(str); + } + public int next4CharAsInt() { + String s1 = this.next2CharAsString(); + String s2 = this.next2CharAsString(); + return ((hexStrToInt(s1) << 8) | hexStrToInt(s2)); + } + private int hexStrToInt(String s) { + return Integer.valueOf(s, 16).intValue(); + } + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/GetStaticCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/GetStaticCmd.java new file mode 100644 index 0000000000..f1cbe78121 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/GetStaticCmd.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.cmd; + +public class GetStaticCmd extends TwoOperandCmd { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..c7c978ebe7 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.cmd; + +public class InvokeSpecialCmd extends TwoOperandCmd { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..37161c21a8 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.cmd; + +public class InvokeVirtualCmd extends TwoOperandCmd { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/LdcCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..1b89885043 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.cmd; + +public class LdcCmd extends OneOperandCmd { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/NewObjectCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..18c04527e9 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.cmd; + +public class NewObjectCmd extends TwoOperandCmd { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/NoOperandCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..35a279198a --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.cmd; + +public class NoOperandCmd extends ByteCodeCommand { + + @Override + public int getLength() { + return 1; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/OneOperandCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..30f0ea3d80 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.cmd; + +public class OneOperandCmd extends ByteCodeCommand { + private int operand; + public int getOperand() { + return operand; + } + public void setOperand(int operand) { + this.operand = operand; + } + @Override + public int getLength() { + return 2; + } +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/PutFieldCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..378b0087c3 --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.cmd; + +public class PutFieldCmd extends TwoOperandCmd { + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/TwoOperandCmd.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..3bee83d23b --- /dev/null +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,16 @@ +package com.coderising.jvm.cmd; + +public class TwoOperandCmd extends ByteCodeCommand { + private int index; + public void setIndex(int index) { + this.index = index; + } + public int getIndex() { + return this.index; + } + @Override + public int getLength() { + return 3; + } + +} diff --git a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/method/Method.java b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/method/Method.java index 08efcafaf1..1ce4b51c2c 100644 --- a/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/method/Method.java +++ b/group04/498654356/mini-jvm/jvm/src/main/java/com/coderising/jvm/method/Method.java @@ -1,6 +1,7 @@ package com.coderising.jvm.method; import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.ConstantPool; public class Method { @@ -39,5 +40,8 @@ public CodeAttr getCodeAttr() { public void setCodeAttr(CodeAttr codeAttr) { this.codeAttr = codeAttr; } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java index 45a80b9607..7174e88414 100644 --- a/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group04/498654356/mini-jvm/jvm/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -10,6 +10,10 @@ import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -277,5 +281,79 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From 6aa54b1dc202e4af1814fa4e5fc0c24820ea9167 Mon Sep 17 00:00:00 2001 From: gongxun Date: Sat, 22 Apr 2017 21:51:22 +0800 Subject: [PATCH 243/552] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/2.26/list/ArrayList.java | 14 +++++--- group17/785396327/4.9/expr/PostfixExpr.java | 34 ++++++++++++++++++- group17/785396327/4.9/expr/PrefixExpr.java | 34 ++++++++++++++++++- .../785396327/4.9/expr/PrefixExprTest.java | 6 ++-- group17/785396327/4.9/expr/TokenParser.java | 2 +- .../785396327/4.9/expr/TokenParserTest.java | 7 ++++ 6 files changed, 86 insertions(+), 11 deletions(-) diff --git a/group17/785396327/2.26/list/ArrayList.java b/group17/785396327/2.26/list/ArrayList.java index 119079f7ce..dcdc1264b0 100644 --- a/group17/785396327/2.26/list/ArrayList.java +++ b/group17/785396327/2.26/list/ArrayList.java @@ -1,5 +1,7 @@ package list; +import org.junit.Test; + import java.util.Arrays; import java.util.NoSuchElementException; @@ -34,12 +36,12 @@ public boolean add(T ele) { } public T get(int index) { - checkBounds(index); + checkBounds(index, false); return (T) elementData[index]; } public T remove(int index) { - checkBounds(index); + checkBounds(index, false); T removeEle = (T) elementData[index]; System.arraycopy(elementData, index + 1, elementData, index, size - index); size--; @@ -47,7 +49,7 @@ public T remove(int index) { } public boolean add(int index, T ele) { - checkBounds(index); + checkBounds(index, true); grow(size++); //将原本数组从待插入的index截取,将原本index后的有效值,复制到原本数组index+1之后 System.arraycopy(elementData, index, elementData, index + 1, size - index); @@ -65,8 +67,10 @@ public boolean remove(T ele) { return true; } - private void checkBounds(int index) { - if (index < 0 || index >= size) + private void checkBounds(int index, boolean isAdd) { + if (isAdd && (index < 0 || index > size)) { + throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); + } else if (!isAdd && (index < 0 || index >= size)) throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); } diff --git a/group17/785396327/4.9/expr/PostfixExpr.java b/group17/785396327/4.9/expr/PostfixExpr.java index a6d19be939..c22b7788aa 100644 --- a/group17/785396327/4.9/expr/PostfixExpr.java +++ b/group17/785396327/4.9/expr/PostfixExpr.java @@ -1,5 +1,9 @@ package expr; +import stack.MyStack; + +import java.util.List; + /** * Created by gongxun on 2017/4/22. */ @@ -11,6 +15,34 @@ public PostfixExpr(String expr) { } public float evaluate() { - return 0.0f; + TokenParser tokenParser = new TokenParser(); + if (expr == null) + throw new RuntimeException("wrong expr !"); + MyStack stack = new MyStack(); + List tokens = tokenParser.parse(expr); + if (tokens != null) { + for (Token token : tokens) { + if (token.isNumber()) + stack.push(((Integer) token.getIntValue()).floatValue()); + else { + Float value = calcValue(token, stack); + stack.push(value); + } + } + } + return stack.pop(); + } + + private Float calcValue(Token token, MyStack stack) { + String operator = token.toString(); + Float rightNum = stack.pop(); + Float leftNum = stack.pop(); + if (operator.equals("+")) + return leftNum + rightNum; + else if (operator.equals("-")) + return leftNum - rightNum; + else if (operator.equals("*")) + return leftNum * rightNum; + return leftNum / rightNum; } } diff --git a/group17/785396327/4.9/expr/PrefixExpr.java b/group17/785396327/4.9/expr/PrefixExpr.java index e86d6463c0..b29ffa0c64 100644 --- a/group17/785396327/4.9/expr/PrefixExpr.java +++ b/group17/785396327/4.9/expr/PrefixExpr.java @@ -1,7 +1,12 @@ package expr; +import stack.MyStack; + +import java.util.List; + /** * Created by gongxun on 2017/4/22. + * 从后向前遍历入栈 */ public class PrefixExpr { String expr = null; @@ -11,6 +16,33 @@ public PrefixExpr(String expr) { } public float evaluate() { - return 0.0f; + TokenParser tokenParser = new TokenParser(); + if (expr == null) + throw new RuntimeException("wrong expr !"); + MyStack stack = new MyStack(); + List tokens = tokenParser.parse(expr); + for (int i = tokens.size() - 1; i >= 0; i--) { + Token token = tokens.get(i); + if (token.isNumber()) + stack.push(((Integer) token.getIntValue()).floatValue()); + else { + Float value = calcValue(stack, token.toString()); + stack.push(value); + } + } + return stack.pop(); + } + + + private Float calcValue(MyStack stack, String operator) { + Float leftNum = stack.pop(); + Float rightNum = stack.pop(); + if (operator.equals("+")) + return leftNum + rightNum; + else if (operator.equals("-")) + return leftNum - rightNum; + else if (operator.equals("*")) + return leftNum * rightNum; + return leftNum / rightNum; } } diff --git a/group17/785396327/4.9/expr/PrefixExprTest.java b/group17/785396327/4.9/expr/PrefixExprTest.java index c2574eb155..326bfd9f2c 100644 --- a/group17/785396327/4.9/expr/PrefixExprTest.java +++ b/group17/785396327/4.9/expr/PrefixExprTest.java @@ -27,17 +27,17 @@ public void testEvaluate() { { // 4*2 + 6+9*2/3 -8 PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); + Assert.assertEquals(12, expr.evaluate(), 0.001f); } { //(3+4)*5-6 PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); + Assert.assertEquals(29, expr.evaluate(), 0.001f); } { //1+((2+3)*4)-5 PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); + Assert.assertEquals(16, expr.evaluate(), 0.001f); } diff --git a/group17/785396327/4.9/expr/TokenParser.java b/group17/785396327/4.9/expr/TokenParser.java index 5620ad9f50..6c54890a42 100644 --- a/group17/785396327/4.9/expr/TokenParser.java +++ b/group17/785396327/4.9/expr/TokenParser.java @@ -31,7 +31,7 @@ public List parse(String expr) { i = nextOperatorIndex; } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); +// System.out.println("char :["+c+"] is not number or operator,ignore"); i++; } diff --git a/group17/785396327/4.9/expr/TokenParserTest.java b/group17/785396327/4.9/expr/TokenParserTest.java index 22fe16dc85..793ba1fe0b 100644 --- a/group17/785396327/4.9/expr/TokenParserTest.java +++ b/group17/785396327/4.9/expr/TokenParserTest.java @@ -37,4 +37,11 @@ public void test() { Assert.assertEquals("/", tokens.get(9).toString()); Assert.assertEquals(4, tokens.get(10).getIntValue()); } + + @Test + public void testPostfixExprParser() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse("6 5 2 3 + 8 * + 3 + *"); + System.out.println(tokens); + } } From bff98a8ef51634f612ee0251a5040e9db6ce9754 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Sat, 22 Apr 2017 22:17:07 +0800 Subject: [PATCH 244/552] =?UTF-8?q?JVM=E4=BD=9C=E4=B8=9A=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=92=8C=E6=96=87=E4=BB=B6copy=E8=87=AA?= =?UTF-8?q?=E5=88=98=E5=A4=A7=EF=BC=8C=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/basic/dataStructure/stack/Stack.java | 2 +- .../basic/dataStructure/stack/StackUtil.java | 32 +- .../src/main/java/miniJVM/EmployeeV1.java | 28 -- .../src/main/java/miniJVM/attr/CodeAttr.java | 66 ++++ .../java/miniJVM/attr/LineNumberTable.java | 55 +++ .../java/miniJVM/attr/LocalVariableItem.java | 39 ++ .../java/miniJVM/attr/LocalVariableTable.java | 42 +++ .../main/java/miniJVM/attr/StackMapTable.java | 30 ++ .../src/main/java/miniJVM/clz/AccessFlag.java | 25 ++ .../src/main/java/miniJVM/clz/ClassFile.java | 103 ++++++ .../src/main/java/miniJVM/clz/ClassIndex.java | 19 + .../src/main/java/miniJVM/cmd/BiPushCmd.java | 22 ++ .../java/miniJVM/cmd/ByteCodeCommand.java | 129 +++++++ .../main/java/miniJVM/cmd/CommandParser.java | 85 +++++ .../main/java/miniJVM/cmd/GetFieldCmd.java | 22 ++ .../java/miniJVM/cmd/GetStaticFieldCmd.java | 20 ++ .../java/miniJVM/cmd/InvokeSpecialCmd.java | 21 ++ .../java/miniJVM/cmd/InvokeVirtualCmd.java | 21 ++ .../src/main/java/miniJVM/cmd/LdcCmd.java | 30 ++ .../main/java/miniJVM/cmd/NewObjectCmd.java | 20 ++ .../main/java/miniJVM/cmd/NoOperandCmd.java | 24 ++ .../main/java/miniJVM/cmd/OneOperandCmd.java | 27 ++ .../main/java/miniJVM/cmd/PutFieldCmd.java | 20 ++ .../main/java/miniJVM/cmd/TwoOperandCmd.java | 64 ++++ .../main/java/miniJVM/constant/ClassInfo.java | 28 ++ .../java/miniJVM/constant/ConstantInfo.java | 40 +++ .../java/miniJVM/constant/ConstantPool.java | 31 ++ .../java/miniJVM/constant/FieldRefInfo.java | 58 +++ .../java/miniJVM/constant/MethodRefInfo.java | 60 ++++ .../miniJVM/constant/NameAndTypeInfo.java | 51 +++ .../miniJVM/constant/NullConstantInfo.java | 17 + .../java/miniJVM/constant/StringInfo.java | 32 ++ .../main/java/miniJVM/constant/UTF8Info.java | 37 ++ .../src/main/java/miniJVM/field/Field.java | 50 +++ .../java/miniJVM/loader/ByteCodeIterator.java | 57 +++ .../java/miniJVM/loader/ClassFileLoader.java | 132 +++++++ .../java/miniJVM/loader/ClassFileParser.java | 52 +++ .../src/main/java/miniJVM/method/Method.java | 77 ++++ .../java/miniJVM/print/ClassFilePrinter.java | 46 +++ .../miniJVM/print/ConstantPoolPrinter.java | 19 + .../src/main/java/miniJVM/util/Util.java | 24 ++ .../java/thread/download/ClassFileReader.java | 74 ++++ .../test/java/data_structure/StackTest.java | 7 +- .../java/miniJVM/ClassFileloaderTest.java | 336 ++++++++++++++++++ .../src/test/java/miniJVM/miniJVMTest.java | 19 + .../src/test/java/miniJVM/testEmployee.java | 63 ---- 46 files changed, 2153 insertions(+), 103 deletions(-) delete mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/EmployeeV1.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/attr/LineNumberTable.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableItem.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableTable.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/attr/StackMapTable.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/clz/AccessFlag.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassFile.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassIndex.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/BiPushCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetFieldCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetStaticFieldCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeSpecialCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/LdcCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/NewObjectCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/OneOperandCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/PutFieldCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/cmd/TwoOperandCmd.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/ClassInfo.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantInfo.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantPool.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/FieldRefInfo.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/MethodRefInfo.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/NameAndTypeInfo.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/NullConstantInfo.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/StringInfo.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/constant/UTF8Info.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/field/Field.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/loader/ByteCodeIterator.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileLoader.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/print/ClassFilePrinter.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/util/Util.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/ClassFileReader.java create mode 100644 group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java create mode 100644 group24/75939388/learning2017/src/test/java/miniJVM/miniJVMTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/miniJVM/testEmployee.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java index f51bb88268..ea83d96e2b 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/Stack.java @@ -30,7 +30,7 @@ public Object pop(){ public Object peek(){ int index = elementData.size() - 1; - return elementData.get(index); + return index == -1 ? null : elementData.get(index); } public boolean isEmpty(){ return peek() == null; diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java index e2b197d471..1d55a2d47e 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackUtil.java @@ -33,7 +33,6 @@ public static Stack remove(Stack s,Object o) { s.pop(); } } - return tmp; } @@ -70,19 +69,36 @@ public static Object[] getTop(Stack s,int len) { * @return */ public static boolean isValidPairs(String s){ - //圆括号 - Stack bracket = new Stack("(", ")"); + //括号 + Stack bracket = new Stack(")", "("); //方括号 - Stack brackets = new Stack("[", "]"); + Stack brackets = new Stack("]", "["); //花括号 - Stack braces = new Stack("{", "}"); + Stack braces = new Stack("}", "{"); + + char[] symArr = s.toCharArray(); + int length = symArr.length; + for(int i = 0; i < length/2; i++){ + String sym = String.valueOf(symArr[i]); + String endSym = String.valueOf(symArr[length - i -1]); + if(sym.equals(bracket.peek())){ + bracket = remove(bracket, sym); + bracket = remove(bracket, endSym); + } - //String转化为Stack - char[] arr = s.toCharArray(); - Stack strSt = new Stack(arr); + if(sym.equals(brackets.peek())){ + brackets = remove(brackets, sym); + brackets = remove(brackets, endSym); + } + if(sym.equals(braces.peek())){ + braces = remove(braces, sym); + braces = remove(braces, endSym); + } + } + return bracket.isEmpty() && brackets.isEmpty() && braces.isEmpty(); } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/EmployeeV1.java b/group24/75939388/learning2017/src/main/java/miniJVM/EmployeeV1.java deleted file mode 100644 index e345de37ae..0000000000 --- a/group24/75939388/learning2017/src/main/java/miniJVM/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package miniJVM; - -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/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java new file mode 100644 index 0000000000..5657c2198a --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java @@ -0,0 +1,66 @@ +package miniJVM.attr; + +import miniJVM.clz.ClassFile; +import miniJVM.cmd.ByteCodeCommand; +import miniJVM.constant.ConstantPool; +import miniJVM.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableItem.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableItem.java new file mode 100644 index 0000000000..7a2794dee7 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package miniJVM.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableTable.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableTable.java new file mode 100644 index 0000000000..e5bf39196e --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableTable.java @@ -0,0 +1,42 @@ +package miniJVM.attr; + + +import miniJVM.constant.ConstantPool; +import miniJVM.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/attr/StackMapTable.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/StackMapTable.java new file mode 100644 index 0000000000..ffe45f2a73 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package miniJVM.attr; + + +import miniJVM.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/clz/AccessFlag.java b/group24/75939388/learning2017/src/main/java/miniJVM/clz/AccessFlag.java new file mode 100644 index 0000000000..72ac22ec3b --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package miniJVM.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/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassFile.java b/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassFile.java new file mode 100644 index 0000000000..7c002e8e31 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassFile.java @@ -0,0 +1,103 @@ +package miniJVM.clz; + + +import miniJVM.constant.ClassInfo; +import miniJVM.constant.ConstantPool; +import miniJVM.field.Field; +import miniJVM.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassIndex.java b/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassIndex.java new file mode 100644 index 0000000000..9c3f512e99 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package miniJVM.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/group24/75939388/learning2017/src/main/java/miniJVM/cmd/BiPushCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/BiPushCmd.java new file mode 100644 index 0000000000..c14e56b185 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/BiPushCmd.java @@ -0,0 +1,22 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..ddb15c56bf --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java @@ -0,0 +1,129 @@ +package miniJVM.cmd; + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantInfo; +import miniJVM.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java new file mode 100644 index 0000000000..611f50c958 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; + +import java.util.List; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetFieldCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..67e734e5f1 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetStaticFieldCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..95ad38e806 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeSpecialCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..d4f401f26d --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package miniJVM.cmd; + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..37ebbf4cc2 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java @@ -0,0 +1,21 @@ +package miniJVM.cmd; + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/LdcCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/LdcCmd.java new file mode 100644 index 0000000000..c56b294f4d --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantInfo; +import miniJVM.constant.ConstantPool; +import miniJVM.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NewObjectCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..d2e28c5eea --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NewObjectCmd.java @@ -0,0 +1,20 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..ecce3f432f --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java @@ -0,0 +1,24 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/OneOperandCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..6736c608b9 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package miniJVM.cmd; + +import miniJVM.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/PutFieldCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..066f37dd01 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/TwoOperandCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..400fdb0350 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/TwoOperandCmd.java @@ -0,0 +1,64 @@ +package miniJVM.cmd; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/ClassInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ClassInfo.java new file mode 100644 index 0000000000..735ae4eace --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package miniJVM.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantInfo.java new file mode 100644 index 0000000000..1ff428ec90 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package miniJVM.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantPool.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantPool.java new file mode 100644 index 0000000000..920d7f0f19 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package miniJVM.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/FieldRefInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/FieldRefInfo.java new file mode 100644 index 0000000000..47603e4e13 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package miniJVM.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/MethodRefInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/MethodRefInfo.java new file mode 100644 index 0000000000..cd2f012b68 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package miniJVM.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/NameAndTypeInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..eddb11b6f5 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package miniJVM.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/NullConstantInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/NullConstantInfo.java new file mode 100644 index 0000000000..7df8b59156 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package miniJVM.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/StringInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/StringInfo.java new file mode 100644 index 0000000000..07be339e0a --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/StringInfo.java @@ -0,0 +1,32 @@ +package miniJVM.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/UTF8Info.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/UTF8Info.java new file mode 100644 index 0000000000..f9c720429b --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package miniJVM.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/field/Field.java b/group24/75939388/learning2017/src/main/java/miniJVM/field/Field.java new file mode 100644 index 0000000000..bfcf0e9bf0 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/field/Field.java @@ -0,0 +1,50 @@ +package miniJVM.field; + + +import miniJVM.constant.ConstantPool; +import miniJVM.constant.UTF8Info; +import miniJVM.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ByteCodeIterator.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..7e3c9f14c1 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package miniJVM.loader; + +import miniJVM.util.Util; + +import java.util.Arrays; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileLoader.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileLoader.java new file mode 100644 index 0000000000..6edc690097 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileLoader.java @@ -0,0 +1,132 @@ +package miniJVM.loader; + + +import miniJVM.clz.ClassFile; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +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()); +// } +// +// /** +// * 下面是第三次JVM课应实现的测试用例 +// */ +// @Test +// public void testReadFields(){ +// +// List fields = clzFile.getFields(); +// Assert.assertEquals(2, fields.size()); +// { +// Field f = fields.get(0); +// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); +// } +// { +// Field f = fields.get(1); +// Assert.assertEquals("age:I", f.toString()); +// } +// } +// @Test +// public void testMethods(){ +// +// List methods = clzFile.getMethods(); +// ConstantPool pool = clzFile.getConstantPool(); +// +// { +// Method m = methods.get(0); +// assertMethodEquals(pool,m, +// "", +// "(Ljava/lang/String;I)V", +// "2ab7000c2a2bb5000f2a1cb50011b1"); +// +// } +// { +// Method m = methods.get(1); +// assertMethodEquals(pool,m, +// "setName", +// "(Ljava/lang/String;)V", +// "2a2bb5000fb1"); +// +// } +// { +// Method m = methods.get(2); +// assertMethodEquals(pool,m, +// "setAge", +// "(I)V", +// "2a1bb50011b1"); +// } +// { +// Method m = methods.get(3); +// assertMethodEquals(pool,m, +// "sayHello", +// "()V", +// "b2001c1222b60024b1"); +// +// } +// { +// Method m = methods.get(4); +// assertMethodEquals(pool,m, +// "main", +// "([Ljava/lang/String;)V", +// "bb000159122b101db7002d4c2bb6002fb1"); +// } +// } +// +// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ +// String methodName = pool.getUTF8String(m.getNameIndex()); +// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); +// String code = m.getCodeAttr().getCode(); +// Assert.assertEquals(expectedName, methodName); +// Assert.assertEquals(expectedDesc, methodDesc); +// Assert.assertEquals(expectedCode, code); +// } +// +// @Test +// public void testByteCodeCommand(){ +// { +// Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); +// ByteCodeCommand [] cmds = initMethod.getCmds(); +// +// assertOpCodeEquals("0: aload_0", cmds[0]); +// assertOpCodeEquals("1: invokespecial #12", cmds[1]); +// assertOpCodeEquals("4: aload_0", cmds[2]); +// assertOpCodeEquals("5: aload_1", cmds[3]); +// assertOpCodeEquals("6: putfield #15", cmds[4]); +// assertOpCodeEquals("9: aload_0", cmds[5]); +// assertOpCodeEquals("10: iload_2", cmds[6]); +// assertOpCodeEquals("11: putfield #17", cmds[7]); +// assertOpCodeEquals("14: return", cmds[8]); +// } +// +// { +// Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); +// ByteCodeCommand [] cmds = setNameMethod.getCmds(); +// +// assertOpCodeEquals("0: aload_0", cmds[0]); +// assertOpCodeEquals("1: aload_1", cmds[1]); +// assertOpCodeEquals("2: putfield #15", cmds[2]); +// assertOpCodeEquals("5: return", cmds[3]); +// +// } +// +// { +// Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); +// ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); +// +// assertOpCodeEquals("0: getstatic #28", cmds[0]); +// assertOpCodeEquals("3: ldc #34", cmds[1]); +// assertOpCodeEquals("5: invokevirtual #36", cmds[2]); +// assertOpCodeEquals("8: return", cmds[3]); +// +// } +// +// { +// Method mainMethod = this.clzFile.getMainMethod(); +// +// ByteCodeCommand [] cmds = mainMethod.getCmds(); +// +// assertOpCodeEquals("0: new #1", cmds[0]); +// assertOpCodeEquals("3: dup", cmds[1]); +// assertOpCodeEquals("4: ldc #43", cmds[2]); +// assertOpCodeEquals("6: bipush 29", cmds[3]); +// assertOpCodeEquals("8: invokespecial #45", cmds[4]); +// assertOpCodeEquals("11: astore_1", cmds[5]); +// assertOpCodeEquals("12: aload_1", cmds[6]); +// assertOpCodeEquals("13: invokevirtual #47", cmds[7]); +// assertOpCodeEquals("16: return", cmds[8]); +// } +// +// } +// +// private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ +// +// String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); +// +// if(cmd instanceof OneOperandCmd){ +// if(cmd instanceof BiPushCmd){ +// acctual += " " + ((OneOperandCmd)cmd).getOperand(); +// } else{ +// acctual += " #" + ((OneOperandCmd)cmd).getOperand(); +// } +// } +// if(cmd instanceof TwoOperandCmd){ +// acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); +// } +// Assert.assertEquals(expected, acctual); +// } + +} diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/miniJVMTest.java b/group24/75939388/learning2017/src/test/java/miniJVM/miniJVMTest.java new file mode 100644 index 0000000000..9fb146de10 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/miniJVM/miniJVMTest.java @@ -0,0 +1,19 @@ +package miniJVM; + +import thread.download.ClassFileReader; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author : 温友朝 + * @date : 2017/4/18 + */ +public class miniJVMTest { + + @Test + public void readCafebabe(){ + Assert.assertEquals("cafebabe", ClassFileReader.readNextU4Bytes(0)); + } + + +} diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/testEmployee.java b/group24/75939388/learning2017/src/test/java/miniJVM/testEmployee.java deleted file mode 100644 index a10571b6ee..0000000000 --- a/group24/75939388/learning2017/src/test/java/miniJVM/testEmployee.java +++ /dev/null @@ -1,63 +0,0 @@ -package miniJVM; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.DataInputStream; -import java.io.File; -import java.io.FileInputStream; - -/** - * @author : 温友朝 - * @date : 2017/4/18 - */ -public class testEmployee { - String path = "resources/classes/EmployeeV1.class"; - File file; - - @Before - public void init(){ - try{ - file = new File(path); - }catch(Exception e){ - e.printStackTrace(); - } - } - - @Test - public void readCafebabe(){ - //JVM第一周作业,读取class文件的头四位魔数cafebabe - - try{ - int length = new Long(file.length()).intValue(); - byte[] buffer = new byte[length]; - DataInputStream dis = new DataInputStream(new FileInputStream(file)); - dis.read(buffer); - StringBuilder sb = new StringBuilder(); - for(int i = 0; i < length; i++){ - int temp = buffer[i] & 0xFF; - String hexStr = Integer.toHexString(temp); - if(hexStr.length() < 2){ - sb.append("0").append(hexStr); - }else{ - sb.append(hexStr); - } - -// if((i + 1) % 2 == 0){ -// sb.append(" "); -// } - - if((i + 1) % 16 == 0){ - sb.append("\n"); - } - - } - System.out.println(sb.toString()); - Assert.assertEquals("cafebabe", sb.substring(0, 8)); - - }catch(Exception e){ - e.printStackTrace(); - } - } -} From fc47294709a30e2eb51432f9546d5554f062746a Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Sat, 22 Apr 2017 22:40:29 +0800 Subject: [PATCH 245/552] =?UTF-8?q?=E9=83=A8=E5=88=86=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E6=94=B9=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/miniJVM/attr/AttributeInfo.java | 19 ++++++++++ .../java/miniJVM/loader/ClassFileLoader.java | 1 - .../java/miniJVM/loader/ClassFileParser.java | 35 +++++++++---------- .../java/miniJVM/ClassFileloaderTest.java | 23 ++++++------ .../src/test/java/miniJVM/EmployeeV1.java | 28 +++++++++++++++ 5 files changed, 75 insertions(+), 31 deletions(-) create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/attr/AttributeInfo.java create mode 100644 group24/75939388/learning2017/src/test/java/miniJVM/EmployeeV1.java diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/attr/AttributeInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/AttributeInfo.java new file mode 100644 index 0000000000..a35c1bc7e1 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package miniJVM.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileLoader.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileLoader.java index 6edc690097..a96143321a 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileLoader.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileLoader.java @@ -67,7 +67,6 @@ public ClassFile loadClass(String className) { byte[] codes = this.readBinaryCode(className); ClassFileParser parser = new ClassFileParser(); return parser.parse(codes); - } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index bee26cb836..b88f81cbe2 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -9,7 +9,6 @@ public class ClassFileParser { public ClassFile parse(byte[] codes) { - @@ -30,23 +29,21 @@ private ClassIndex parseClassInfex(ByteCodeIterator iter) { private ConstantPool parseConstantPool(ByteCodeIterator iter) { return null; } - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceCount = iter.nextU2ToInt(); - - System.out.println("interfaceCount:" + interfaceCount); - - // TODO : 如果实现了interface, 这里需要解析 - } - - private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { - - - } - - private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { - - - - } +// private void parseInterfaces(ByteCodeIterator iter) { +// int interfaceCount = iter.nextU2ToInt(); +// +// System.out.println("interfaceCount:" + interfaceCount); +// +// // TODO : 如果实现了interface, 这里需要解析 +// } +// +// private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { +// +// +// } +// +// private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { +// +// } } diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java b/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java index 17d5702c90..0115338e08 100644 --- a/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java +++ b/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java @@ -11,19 +11,19 @@ public class ClassFileloaderTest { - private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + private static final String FULL_QUALIFIED_CLASS_NAME = "miniJVM.EmployeeV1"; - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path2 = "C:\temp"; + static String path1 = "resources/classes"; + static String path2 = "resources/classes"; static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - +// String className = "com.coderising.jvm.test.EmployeeV1"; +// String path = "resources/classes/EmployeeV1.class"; + String className = "miniJVM.EmployeeV1"; clzFile = loader.loadClass(className); - } @@ -54,12 +54,12 @@ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; +// String className = "miniJVM.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); + byte[] byteCodes = loader.readBinaryCode(FULL_QUALIFIED_CLASS_NAME); // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); + Assert.assertEquals(1024, byteCodes.length); } @@ -68,8 +68,8 @@ public void testClassFileLength() { public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); +// String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(FULL_QUALIFIED_CLASS_NAME); byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; @@ -175,6 +175,7 @@ public void testConstantPool(){ Assert.assertEquals("EmployeeV1.java", utf8Info.getValue()); } } + // @Test // public void testClassIndex(){ // diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/EmployeeV1.java b/group24/75939388/learning2017/src/test/java/miniJVM/EmployeeV1.java new file mode 100644 index 0000000000..e345de37ae --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/miniJVM/EmployeeV1.java @@ -0,0 +1,28 @@ +package miniJVM; + +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 From 62d6cca0493652dccd615b064d7327e0404448ad Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Sat, 22 Apr 2017 23:17:35 +0800 Subject: [PATCH 246/552] stage --- .../main/java/miniJVM/loader/ClassFileParser.java | 12 ++++++++---- .../src/test/java/miniJVM/ClassFileloaderTest.java | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index b88f81cbe2..7a0fd5252f 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -8,11 +8,15 @@ public class ClassFileParser { + private ClassFile clzFile = new ClassFile(); + public ClassFile parse(byte[] codes) { - - - - return null; + int minorVersion = (codes[4] & 0xFF) + (codes[5] & 0xFF); + clzFile.setMinorVersion(minorVersion); + + int majorVersion = (codes[6] & 0xFF) + (codes[7] & 0xFF); + clzFile.setMajorVersion(majorVersion); + return clzFile; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java b/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java index 0115338e08..5cb994146c 100644 --- a/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java +++ b/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java @@ -103,7 +103,7 @@ private String byteToHexString(byte[] codes ){ public void testVersion(){ Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); + Assert.assertEquals(49, clzFile.getMajorVersion()); } From 7b9535d24267a05113e2217ca7576ef3940b2d4c Mon Sep 17 00:00:00 2001 From: onlyLYJ Date: Sun, 23 Apr 2017 08:52:38 +0800 Subject: [PATCH 247/552] Token parser done --- .../coding/basic/stack/expr/InfixExpr.java | 180 ++++++++---------- .../coding/basic/stack/expr/InfixExprS.java | 102 ++++++++++ .../basic/stack/expr/InfixExprTest.java | 4 +- .../basic/stack/expr/InfixToPostfix.java | 43 ++++- .../coding/basic/stack/expr/PostfixExpr.java | 35 +++- .../coding/basic/stack/expr/PrefixExpr.java | 40 +++- .../coding/basic/stack/expr/Token.java | 29 ++- .../basic/stack/expr/TokenParserTest.java | 25 +++ .../jvm/print/ConstantPoolPrinter.java | 2 +- 9 files changed, 349 insertions(+), 111 deletions(-) create mode 100644 group12/382266293/coding/basic/stack/expr/InfixExprS.java diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index 0d23091ab1..c143116ec4 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -1,102 +1,78 @@ -package stack.expr; - -import java.util.Stack; -import stack.StackUtil; - -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - TParser tp = new TParser(); - tp.parse(expr); - Stack ints = new Stack(); - Stack signs = new Stack(); - - int i1 = tp.nextInt(); - String sign1 = tp.nextSign(); - - ints.push(i1); - signs.push(sign1); - - while (tp.hasNextInt()) { - - int i2 = tp.nextInt(); - String sign2 = tp.nextSign(); - - if (tp.hasNextInt()) { - - if (highPrioritySign(sign1)) { - - i1 = ints.pop(); - sign1 = signs.pop(); - i2 = calculate(i1, i2, sign1); - - } - - ints.push(i2); - signs.push(sign2); - sign1 = sign2; - - } - - } - - signs.pop(); - StackUtil.reverse(ints); - StackUtil.reverse(signs); - - while (!ints.isEmpty()) { - - int firstInt = ints.pop(); - - if (ints.isEmpty()) { - return (float) firstInt; - } - - int secInt = ints.pop(); - String sign = signs.pop(); - int result = calculate(firstInt, secInt, sign); - ints.push(result); - - } - - System.out.println("we shall not reach here"); - return (float) ints.peek(); - } - - private int calculate(int firstInt, int secInt, String lowsign) { - - int result; - if (lowsign.equals("+")) { - result = firstInt + secInt; - } else if (lowsign.equals("-")) { - result = firstInt - secInt; - } else if (lowsign.equals("*")) { - result = firstInt * secInt; - } else if (lowsign.equals("/")) { - result = firstInt / secInt; - } else { - throw new RuntimeException(lowsign + " has not been supported yet!"); - } - - return result; - - } - - private boolean highPrioritySign(String sign) { - - if (sign.equals("*") || sign.equals("/")) { - - return true; - - } - - return false; - } - -} +package stack.expr; + +import java.util.List; +import java.util.Stack; + + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + if(opStack.isEmpty()){ + + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + + + return numStack.pop().floatValue(); + } + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + + +} diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprS.java b/group12/382266293/coding/basic/stack/expr/InfixExprS.java new file mode 100644 index 0000000000..7600cccb93 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/InfixExprS.java @@ -0,0 +1,102 @@ +package stack.expr; + +import java.util.Stack; +import stack.StackUtil; + +public class InfixExprS{ + String expr = null; + + public InfixExprS(String expr) { + this.expr = expr; + } + + public float evaluate() { + + TParser tp = new TParser(); + tp.parse(expr); + Stack ints = new Stack(); + Stack signs = new Stack(); + + int i1 = tp.nextInt(); + String sign1 = tp.nextSign(); + + ints.push(i1); + signs.push(sign1); + + while (tp.hasNextInt()) { + + int i2 = tp.nextInt(); + String sign2 = tp.nextSign(); + + if (tp.hasNextInt()) { + + if (highPrioritySign(sign1)) { + + i1 = ints.pop(); + sign1 = signs.pop(); + i2 = calculate(i1, i2, sign1); + + } + + ints.push(i2); + signs.push(sign2); + sign1 = sign2; + + } + + } + + signs.pop(); + StackUtil.reverse(ints); + StackUtil.reverse(signs); + + while (!ints.isEmpty()) { + + int firstInt = ints.pop(); + + if (ints.isEmpty()) { + return (float) firstInt; + } + + int secInt = ints.pop(); + String sign = signs.pop(); + int result = calculate(firstInt, secInt, sign); + ints.push(result); + + } + + System.out.println("we shall not reach here"); + return (float) ints.peek(); + } + + private int calculate(int firstInt, int secInt, String lowsign) { + + int result; + if (lowsign.equals("+")) { + result = firstInt + secInt; + } else if (lowsign.equals("-")) { + result = firstInt - secInt; + } else if (lowsign.equals("*")) { + result = firstInt * secInt; + } else if (lowsign.equals("/")) { + result = firstInt / secInt; + } else { + throw new RuntimeException(lowsign + " has not been supported yet!"); + } + + return result; + + } + + private boolean highPrioritySign(String sign) { + + if (sign.equals("*") || sign.equals("/")) { + + return true; + + } + + return false; + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java index 791ea67e43..836848ac91 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java @@ -34,8 +34,8 @@ public void testEvaluate() { } { - InfixExpr expr = new InfixExpr("2+3*4/2"); - Assert.assertEquals(8.0, expr.evaluate(), 0.001f); + InfixExpr expr = new InfixExpr("2+3*4/2+1"); + Assert.assertEquals(9, expr.evaluate(), 0.001f); } { diff --git a/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java b/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java index 790984607f..a293ddfeee 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java +++ b/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java @@ -1,14 +1,51 @@ package stack.expr; import java.util.List; +import java.util.Stack; public class InfixToPostfix { public static List convert(String expr) { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + List pTokens = new Stack<>(); + Stack opStack = new Stack<>(); + + for (Token token : tokens) { + if (token.isNumber()) { + pTokens.add(token); + } else { + if (token.isLeftSquare()) { + opStack.push(token); + } else if (token.isRightSquare()) { + while (!opStack.peek().isLeftSquare()) { + pTokens.add(opStack.pop()); + } + opStack.pop(); + } else { + if (opStack.isEmpty() || token.hasHigherPriority(opStack.peek())) { + opStack.add(token); + } else { + while (!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())) { + pTokens.add(opStack.pop()); + } + opStack.add(token); + } + } + } + } - return null; + while(!opStack.isEmpty()) { + pTokens.add(opStack.pop()); + } + + System.out.println(pTokens); + return pTokens; } - - + public static void main(String[] args) { + convert("10-2*3+50"); + } + } diff --git a/group12/382266293/coding/basic/stack/expr/PostfixExpr.java b/group12/382266293/coding/basic/stack/expr/PostfixExpr.java index 30682ae05d..e4eaa4bfe6 100644 --- a/group12/382266293/coding/basic/stack/expr/PostfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/PostfixExpr.java @@ -11,8 +11,41 @@ public PostfixExpr(String expr) { } public float evaluate() { - return 0.0f; + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } else { + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + } + + return numStack.pop().floatValue(); + } + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); } + } diff --git a/group12/382266293/coding/basic/stack/expr/PrefixExpr.java b/group12/382266293/coding/basic/stack/expr/PrefixExpr.java index 96bef48492..1628810d68 100644 --- a/group12/382266293/coding/basic/stack/expr/PrefixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/PrefixExpr.java @@ -3,6 +3,8 @@ import java.util.List; import java.util.Stack; +import stack.StackUtil; + public class PrefixExpr { String expr = null; @@ -11,7 +13,43 @@ public PrefixExpr(String expr) { } public float evaluate() { - return 0.0f; + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + System.out.println(tokens); + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for(Token token : tokens){ + exprStack.push(token); + } + System.out.println(exprStack); + while(!exprStack.isEmpty()){ + Token t = exprStack.pop(); + if(t.isNumber()){ + numStack.push(new Float(t.getIntValue())); + }else{ + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(t.toString(),f1,f2)); + + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); } diff --git a/group12/382266293/coding/basic/stack/expr/Token.java b/group12/382266293/coding/basic/stack/expr/Token.java index 203f91d61f..670663d358 100644 --- a/group12/382266293/coding/basic/stack/expr/Token.java +++ b/group12/382266293/coding/basic/stack/expr/Token.java @@ -6,13 +6,15 @@ import java.util.Map; class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/", "(", ")"); private static final Map priorities = new HashMap<>(); static { priorities.put("+", 1); priorities.put("-", 1); priorities.put("*", 2); priorities.put("/", 2); + priorities.put("(", 0); + priorities.put(")", 3); } static final int OPERATOR = 1; static final int NUMBER = 2; @@ -30,6 +32,22 @@ public boolean isNumber() { public boolean isOperator() { return type == OPERATOR; } + + public boolean isLeftSquare() { + if (!isOperator()) { + return false; + } + + return priorities.get(this.value) == 0; + } + + public boolean isRightSquare() { + if (!isOperator()) { + return false; + } + + return priorities.get(this.value) == 3; + } public int getIntValue() { return Integer.valueOf(value).intValue(); @@ -38,12 +56,21 @@ public String toString(){ return value; } + + public boolean hasHigherPriority(Token t){ if(!this.isOperator() && !t.isOperator()){ throw new RuntimeException("numbers can't compare priority"); } return priorities.get(this.value) - priorities.get(t.value) > 0; } + + public boolean isSquare() { + + return isLeftSquare() || isRightSquare(); + } + + diff --git a/group12/382266293/coding/basic/stack/expr/TokenParserTest.java b/group12/382266293/coding/basic/stack/expr/TokenParserTest.java index 22dd219fb7..427f887edd 100644 --- a/group12/382266293/coding/basic/stack/expr/TokenParserTest.java +++ b/group12/382266293/coding/basic/stack/expr/TokenParserTest.java @@ -37,5 +37,30 @@ public void test() { Assert.assertEquals("/", tokens.get(9).toString()); Assert.assertEquals(4, tokens.get(10).getIntValue()); } + + @Test + public void test1() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("9+(3-1)*3+10/2"); + System.out.println(tokens); +// //9+(3-1)*3+10/2 +// PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); +// Assert.assertEquals(20, expr.evaluate(),0.0f); [9, 3, 1, -, 3, *, +, 10, 2, /, +] + +// Assert.assertEquals(300, tokens.get(0).getIntValue()); +// Assert.assertEquals("*", tokens.get(1).toString()); +// Assert.assertEquals(20, tokens.get(2).getIntValue()); +// Assert.assertEquals("+", tokens.get(3).toString()); +// Assert.assertEquals(12, tokens.get(4).getIntValue()); +// Assert.assertEquals("*", tokens.get(5).toString()); +// Assert.assertEquals(5, tokens.get(6).getIntValue()); +// Assert.assertEquals("-", tokens.get(7).toString()); +// Assert.assertEquals(20, tokens.get(8).getIntValue()); +// Assert.assertEquals("/", tokens.get(9).toString()); +// Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + + } diff --git a/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java index be07ccd496..012aeb7001 100644 --- a/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java +++ b/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -25,7 +25,7 @@ public void print(){ for (int i = 1; i <= size; i++) { ConstantInfo info = pool.getConstantInfo(i); - System.out.print("#" + i + " ="); + System.out.print("#" + i + " = "); info.accept(this); } From f6b35e9386acbd085978a510cab5e2f39c7a1f63 Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Sun, 23 Apr 2017 10:44:59 +0800 Subject: [PATCH 248/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/jvm/attr/CodeAttr.java | 30 +- .../coderising/jvm/attr/LineNumberTable.java | 13 + .../jvm/attr/LocalVariableTable.java | 12 + .../src/com/coderising/jvm/clz/ClassFile.java | 181 +++++---- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 ++ .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ++++++ .../com/coderising/jvm/cmd/CommandParser.java | 130 ++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 ++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 ++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 ++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 ++++ .../jvm/test/ClassFileloaderTest.java | 379 +++++++++++------- .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 72 ++++ .../coderising/jvm/attr/LineNumberTable.java | 55 +++ .../jvm/attr/LocalVariableItem.java | 39 ++ .../jvm/attr/LocalVariableTable.java | 42 ++ .../coderising/jvm/attr/StackMapTable.java | 30 ++ .../com/coderising/jvm/clz/AccessFlag.java | 25 ++ .../src/com/coderising/jvm/clz/ClassFile.java | 102 +++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 ++ .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ++++++ .../com/coderising/jvm/cmd/CommandParser.java | 85 ++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 ++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 ++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 ++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 ++++ .../coderising/jvm/constant/ClassInfo.java | 28 ++ .../coderising/jvm/constant/ConstantInfo.java | 40 ++ .../coderising/jvm/constant/ConstantPool.java | 31 ++ .../coderising/jvm/constant/FieldRefInfo.java | 58 +++ .../jvm/constant/MethodRefInfo.java | 60 +++ .../jvm/constant/NameAndTypeInfo.java | 51 +++ .../jvm/constant/NullConstantInfo.java | 17 + .../coderising/jvm/constant/StringInfo.java | 32 ++ .../com/coderising/jvm/constant/UTF8Info.java | 37 ++ .../src/com/coderising/jvm/field/Field.java | 50 +++ .../jvm/loader/ByteCodeIterator.java | 57 +++ .../jvm/loader/ClassFileLoader.java | 140 +++++++ .../jvm/loader/ClassFileParser.java | 62 +++ .../src/com/coderising/jvm/method/Method.java | 80 ++++ .../jvm/print/ClassFilePrinter.java | 54 +++ .../jvm/print/ConstantPoolPrinter.java | 25 ++ .../jvm/test/ClassFileloaderTest.java | 354 ++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++ .../src/com/coderising/jvm/util/Util.java | 24 ++ .../coderising/download/DownloadThread.java | 20 + .../coderising/download/FileDownloader.java | 73 ++++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 23 ++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 ++ .../download/impl/ConnectionManagerImpl.java | 15 + .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 34 ++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/array/ArrayList.java | 35 ++ .../src/com/coding/basic/array/ArrayUtil.java | 96 +++++ .../coding/basic/linklist/LRUPageFrame.java | 57 +++ .../basic/linklist/LRUPageFrameTest.java | 34 ++ .../com/coding/basic/linklist/LinkedList.java | 125 ++++++ .../com/coding/basic/queue/CircleQueue.java | 5 + .../src/com/coding/basic/queue/Josephus.java | 19 + .../com/coding/basic/queue/JosephusTest.java | 27 ++ .../src/com/coding/basic/queue/Queue.java | 61 +++ .../basic/queue/QueueWithTwoStacks.java | 40 ++ .../src/com/coding/basic/stack/Stack.java | 64 +++ .../src/com/coding/basic/stack/StackUtil.java | 136 +++++++ .../com/coding/basic/stack/StackUtilTest.java | 65 +++ .../coding/basic/stack/expr/InfixExpr.java | 15 + .../basic/stack/expr/InfixExprTest.java | 52 +++ .../basic/stack/expr/InfixToPostfix.java | 14 + .../coding/basic/stack/expr/PostfixExpr.java | 95 +++++ .../basic/stack/expr/PostfixExprTest.java | 41 ++ .../coding/basic/stack/expr/PrefixExpr.java | 98 +++++ .../basic/stack/expr/PrefixExprTest.java | 45 +++ .../com/coding/basic/stack/expr/Token.java | 50 +++ .../coding/basic/stack/expr/TokenParser.java | 57 +++ .../basic/stack/expr/TokenParserTest.java | 41 ++ 98 files changed, 4769 insertions(+), 238 deletions(-) create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/method/Method.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/DownloadThread.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/FileDownloader.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/Connection.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/Struts.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/View.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/Iterator.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/List.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java index eb2a0a9a26..9bace446db 100644 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -4,6 +4,7 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.cmd.*; import sun.text.CodePointIterator; import java.io.UnsupportedEncodingException; @@ -19,21 +20,21 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -68,8 +69,12 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { e.printStackTrace(); } */ + String code = codeIter.nextUxToHexString(code_len); - CodeAttr codeAttr = new CodeAttr(attribute_name_index, attribute_len, max_stack, max_locals, code_len, code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attribute_name_index, attribute_len, max_stack, max_locals, code_len, code, cmds); int exception_table_len = codeIter.nextU2ToInt(); if (exception_table_len > 0) { @@ -122,5 +127,16 @@ private void setStackMapTable(StackMapTable t) { } + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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(); - } + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f) { + this.fields.add(f); + } + + public List getFields() { + return this.fields; + } + + public void addMethod(Method m) { + this.methods.add(m); + } + + public List getMethods() { + return methods; + } + + + 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(); + } + + public Method getMethod(String methodName, String paramAndReturnType) { + Method method = new Method(this,this.accessFlag,) + + } + + public Method getMainMethod() { + + + } } diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..d84508c68b --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,130 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; +import com.sun.org.apache.bcel.internal.generic.BIPUSH; +import com.sun.org.apache.bcel.internal.generic.INVOKESPECIAL; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + codes = codes.toUpperCase(); + if (codes == "" || codes == null) { + throw new RuntimeException("codes为空!"); + } + List cmds = new LinkedList(); + + CommandIterator iter = new CommandIterator(codes); + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + if (opCode.equals(new_object)) { + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile,opCode); + newObjectCmd.setOprand1(iter.next2CharAsInt()); + newObjectCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(newObjectCmd); + } else if (opCode.equals(dup)||opCode.equals(astore_1)||opCode.equals(aload_0)||opCode.equals(aload_1)||opCode.equals(aload_2)||opCode.equals(voidreturn)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, opCode); + cmds.add(noOperandCmd); + + }else if (opCode.equals(ldc)){ + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + }else if (opCode.equals(bipush)){ + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equals(invokespecial)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equals(invokevirtual)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + }else{ + throw new RuntimeException(opCode + "未进行判断!"); + } + } + + calcuateOffset(cmds); + ByteCodeCommand[] cmd = (ByteCodeCommand[])cmds.toArray(); + return cmd; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index 5803e72b18..c4ab5853ab 100644 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -2,6 +2,10 @@ import java.util.List; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -29,149 +33,149 @@ public class ClassFileloaderTest { static String path1 = "D:\\mygit\\coding2017\\group23\\563253496\\week6_jvm\\out\\production\\week6_jvm"; static String path2 = "C:\temp"; - + static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); String className = "com.coderising.jvm.test.EmployeeV1"; - + clzFile = loader.loadClass(className); - clzFile.print(); + } - - + + @Before - public void setUp() throws Exception { + public void setUp() throws Exception { } @After public void tearDown() throws Exception { } - + @Test - public void testClassPath(){ - + public void testClassPath(){ + ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); loader.addClassPath(path2); - + String clzPath = loader.getClassPath(); - + Assert.assertEquals(path1+";"+path2,clzPath); - + } - + @Test - public void testClassFileLength() { - + public void testClassFileLength() { + ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - + String className = "com.coderising.jvm.test.EmployeeV1"; - + byte[] byteCodes = loader.readBinaryCode(className); - + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 Assert.assertEquals(1056, byteCodes.length); - + } - - - @Test + + + @Test public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); + ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); String className = "com.coderising.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - + + String acctualValue = this.byteToHexString(codes); - + Assert.assertEquals("cafebabe", acctualValue); } - - - - private String byteToHexString(byte[] codes ){ - 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()); @@ -183,95 +187,168 @@ public void testConstantPool(){ 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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + } + @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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); String code = m.getCodeAttr().getCode(); Assert.assertEquals(expectedName, methodName); Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); - } - + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..a57a8b5446 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,72 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..14db5dca46 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..2a8dfb6123 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,102 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..2bb36340f5 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..c8e65ff493 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..88353df2d3 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..7130eb3a9f --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ae71396ef --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..036e6d9055 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..5cbbba6033 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..41e0fd7e7a --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..6bfcb47273 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..7db88a939e --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..c6eb0196f8 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..6fb5570dff --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..33185d8175 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java b/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java b/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java b/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java b/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/List.java b/group23/563253496/week7_stack/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..4576c016af --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java @@ -0,0 +1,35 @@ +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java new file mode 100644 index 0000000000..45740e6d57 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coding.basic.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..994a241a3d --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,57 @@ +package com.coding.basic.linklist; + + +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) { + + + } + + + 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/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java new file mode 100644 index 0000000000..f4c7556a2e --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java @@ -0,0 +1,125 @@ +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..1ac659da3d --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,5 @@ +package com.coding.basic.queue; + +public class CircleQueue { + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..d629d847f4 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,19 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + return null; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d90318b51 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..c4c4b7325e --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java @@ -0,0 +1,61 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..bbd4715ca6 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,40 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + } + diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..de597befb4 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,64 @@ +package com.coding.basic.stack; + +import java.util.ArrayList; +import java.util.ArrayList; + +/** + * Created by bdl19 on 2017/4/8. + */ +public class Stack { + private int count; + private ArrayList elementData; + + public Stack() { + this.count = 0; + elementData = new ArrayList(); + } + + public void push(Object o) { + count++; + elementData.add(o); + + } + + public Object pop() { + count--; + Object o = elementData.get(count); + elementData.remove(count); + return o; + } + + public Object peek() { + + return elementData.get(count-1); + } + + public boolean isEmpty() { + if (count == 0) { + return true; + } else { + return false; + } + } + + public int size() { + return count; + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + Stack s = new Stack(); + while(!this.isEmpty()){ + sb.append(this.peek().toString()); + sb.append(","); + s.push(this.pop()); + } + while(!s.isEmpty()){ + this.push(s.pop()); + } + +// sb.deleteCharAt(sb.length()-1); + return sb.toString(); + } +} + diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..0148188b29 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,136 @@ +package com.coding.basic.stack; +import java.util.Stack; +public class StackUtil { + + public static void bad_reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Integer top = s.pop(); + reverse(s); + addToBottom(s,top); + + + } + public static void addToBottom(Stack s, Integer value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Integer top = s.pop(); + addToBottom(s,value); + s.push(top); + } + + } + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + + while(!s.isEmpty()){ + Object value = s.pop(); + if(!value.equals(o)){ + tmpStack.push(value); + } + } + + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + + if(s == null || s.isEmpty() || s.size() stack = new Stack(); + for(int i=0;i s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..ef85ff007f --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,15 @@ +package com.coding.basic.stack.expr; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..20e34e8852 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..96a2194a67 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,14 @@ +package com.coding.basic.stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..8400bef4f8 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,95 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + int count; + ArrayList operator = new ArrayList(); + Stack numStack = new Stack(); + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + operator.add('+'); + operator.add('-'); + operator.add('*'); + operator.add('/'); + this.count = 0; + char[] exprs = this.expr.toCharArray(); + + + + while (count < exprs.length) { + if (operator.contains(exprs[count])) { + switch (exprs[count]) { + case '+': + add(); + break; + case '-': + subtract(); + break; + case '*': + multiply(); + break; + case '/': + divide(); + break; + + } + this.count++; + } else if (exprs[count] == ' ') { + this.count++; + } else { + int num = getNum(exprs); + numStack.push(num); + } + + } + int result = (int)numStack.pop(); + return result; + } + + private int getNum(char[] exprs) { + + int num = exprs[count]-'0'; + this.count++; + + while (exprs[count] >= '0' && exprs[count] <= '9') { + + num *= 10; + num += exprs[count]-'0'; + this.count++; + } + return num; + } + + private void add() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(a + b); + } + + private void subtract() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(b - a); + } + + private void multiply() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(b * a); + } + + private void divide() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(b / a); + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..7a2c0379a1 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,98 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + int index; + ArrayList operator = new ArrayList(); + Stack numStack = new Stack(); + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + operator.add('+'); + operator.add('-'); + operator.add('*'); + operator.add('/'); + char[] exprs = this.expr.toCharArray(); + this.index = exprs.length - 1; + + while (index >= 0) { + if (operator.contains(exprs[index])) { + switch (exprs[index]) { + case '+': + add(); + break; + case '-': + subtract(); + break; + case '*': + multiply(); + break; + case '/': + divide(); + break; + + } + this.index--; + } else if (exprs[index] == ' ') { + this.index--; + } else { + int num = getNum(exprs); + numStack.push(num); + } + + } + int result = (int) numStack.pop(); + return result; + + } + + private int getNum(char[] exprs) { + + int num = exprs[index] - '0'; + this.index--; + int i = 10; + while (exprs[index] >= '0' && exprs[index] <= '9') { + + int temp = exprs[index] - '0'; + temp *= i; + num += temp; + i *= 10; + this.index--; + } + return num; + } + + private void add() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(a + b); + } + + private void subtract() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(a - b); + } + + private void multiply() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(b * a); + } + + private void divide() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(a / b); + } + + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..d3b0f167e1 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From bbc13347daf4ec2dfe09835e2c6cf369209a9bf4 Mon Sep 17 00:00:00 2001 From: jy <977996067@qq.com> Date: Sun, 23 Apr 2017 13:45:13 +0800 Subject: [PATCH 249/552] =?UTF-8?q?4.23=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/task7/expr/InfixExpr.java | 79 ++++++++ .../src/task7/expr/InfixExprTest.java | 56 +++++ .../src/task7/expr/PostfixExpr.java | 45 +++++ .../src/task7/expr/PostfixExprTest.java | 37 ++++ .../src/task7/expr/PrefixExpr.java | 47 +++++ .../src/task7/expr/PrefixExprTest.java | 44 ++++ .../1507_977996067/src/task7/expr/Token.java | 53 +++++ .../src/task7/expr/TokenParser.java | 57 ++++++ .../src/task7/jvm/attr/AttributeInfo.java | 19 ++ .../src/task7/jvm/attr/CodeAttr.java | 120 +++++++++++ .../src/task7/jvm/attr/LineNumberTable.java | 72 +++++++ .../src/task7/jvm/attr/LocalVariableItem.java | 39 ++++ .../task7/jvm/attr/LocalVariableTable.java | 57 ++++++ .../src/task7/jvm/attr/StackMapTable.java | 30 +++ .../src/task7/jvm/clz/AccessFlag.java | 25 +++ .../src/task7/jvm/clz/ClassFile.java | 134 ++++++++++++ .../src/task7/jvm/clz/ClassIndex.java | 19 ++ .../src/task7/jvm/cmd/BiPushCmd.java | 23 +++ .../src/task7/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++ .../src/task7/jvm/cmd/CommandParser.java | 124 ++++++++++++ .../src/task7/jvm/cmd/GetFieldCmd.java | 22 ++ .../src/task7/jvm/cmd/GetStaticFieldCmd.java | 23 +++ .../src/task7/jvm/cmd/InvokeSpecialCmd.java | 23 +++ .../src/task7/jvm/cmd/InvokeVirtualCmd.java | 22 ++ .../src/task7/jvm/cmd/LdcCmd.java | 29 +++ .../src/task7/jvm/cmd/NewObjectCmd.java | 19 ++ .../src/task7/jvm/cmd/NoOperandCmd.java | 23 +++ .../src/task7/jvm/cmd/OneOperandCmd.java | 27 +++ .../src/task7/jvm/cmd/PutFieldCmd.java | 19 ++ .../src/task7/jvm/cmd/TwoOperandCmd.java | 67 ++++++ .../src/task7/jvm/constant/ClassInfo.java | 31 +++ .../src/task7/jvm/constant/ConstantInfo.java | 35 ++++ .../src/task7/jvm/constant/ConstantPool.java | 37 ++++ .../src/task7/jvm/constant/FieldRefInfo.java | 65 ++++++ .../src/task7/jvm/constant/MethodRefInfo.java | 65 ++++++ .../task7/jvm/constant/NameAndTypeInfo.java | 56 +++++ .../task7/jvm/constant/NullConstantInfo.java | 21 ++ .../src/task7/jvm/constant/StringInfo.java | 35 ++++ .../src/task7/jvm/constant/UTF8Info.java | 45 +++++ .../src/task7/jvm/field/Field.java | 48 +++++ .../task7/jvm/loader/ByteCodeIterator.java | 56 +++++ .../src/task7/jvm/loader/ClassFileLoader.java | 122 +++++++++++ .../src/task7/jvm/loader/ClassFileParser.java | 112 ++++++++++ .../src/task7/jvm/method/Method.java | 91 +++++++++ .../src/task7/jvm/print/ClassFilePrinter.java | 44 ++++ .../task7/jvm/print/ConstantInfoVisitor.java | 18 ++ .../jvm/print/ConstantInfoVisitorImpl.java | 51 +++++ .../task7/jvm/print/ConstantPoolPrinter.java | 26 +++ .../task7/jvm/test/ClassFileloaderTest.java | 191 ++++++++++++++++++ .../src/task7/jvm/test/EmployeeV1.java | 29 +++ .../src/task7/jvm/util/Util.java | 23 +++ 51 files changed, 2683 insertions(+) create mode 100644 group15/1507_977996067/src/task7/expr/InfixExpr.java create mode 100644 group15/1507_977996067/src/task7/expr/InfixExprTest.java create mode 100644 group15/1507_977996067/src/task7/expr/PostfixExpr.java create mode 100644 group15/1507_977996067/src/task7/expr/PostfixExprTest.java create mode 100644 group15/1507_977996067/src/task7/expr/PrefixExpr.java create mode 100644 group15/1507_977996067/src/task7/expr/PrefixExprTest.java create mode 100644 group15/1507_977996067/src/task7/expr/Token.java create mode 100644 group15/1507_977996067/src/task7/expr/TokenParser.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java create mode 100644 group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java create mode 100644 group15/1507_977996067/src/task7/jvm/clz/ClassFile.java create mode 100644 group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/StringInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java create mode 100644 group15/1507_977996067/src/task7/jvm/field/Field.java create mode 100644 group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java create mode 100644 group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java create mode 100644 group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java create mode 100644 group15/1507_977996067/src/task7/jvm/method/Method.java create mode 100644 group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java create mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java create mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java create mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java create mode 100644 group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java create mode 100644 group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java create mode 100644 group15/1507_977996067/src/task7/jvm/util/Util.java diff --git a/group15/1507_977996067/src/task7/expr/InfixExpr.java b/group15/1507_977996067/src/task7/expr/InfixExpr.java new file mode 100644 index 0000000000..1a18634382 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/InfixExpr.java @@ -0,0 +1,79 @@ +package task7.expr; + +import org.junit.Assert; +import task5.stack.Stack; + +import java.util.Arrays; + +public class InfixExpr { + + private String expr; + + private Stack numberStack = new Stack<>(); + + private Stack resultStack = new Stack<>(); + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + Assert.assertNotNull(expr); + + String[] operators = expr.split("[\\d]+"); + + int length = operators.length; + + Arrays.stream(expr.split("[+\\-*/]+")) + .map(Float::parseFloat) + .forEach(numberStack::push); + + numberStack = reverse(numberStack); + + resultStack.push(numberStack.pop()); + + for (int i = 1; i < length; i++) { + String currentOperator = operators[i]; +// 先做乘除,结果放resultStack里面 + switch (currentOperator) { + case "*": + resultStack.push(resultStack.pop() * numberStack.pop()); + break; + case "/": + resultStack.push(resultStack.pop() / numberStack.pop()); + break; + case "+": + resultStack.push(numberStack.pop()); + break; + case "-": + resultStack.push(numberStack.pop()); + break; + } + } + + resultStack = reverse(resultStack); + +// 做加减 + for (int i = 1; i < length; i++) { + String currentOperator = operators[i]; + if ("+".equals(currentOperator)) { + Float num1 = resultStack.pop(); + Float num2 = resultStack.pop(); + resultStack.push(num1 + num2); + } else if ("-".equals(currentOperator)) { + Float num1 = resultStack.pop(); + Float num2 = resultStack.pop(); + resultStack.push(num1 - num2); + } + } + return resultStack.peek(); + } + + private Stack reverse(Stack stackToReverse) { + Stack temp = new Stack<>(); + while (!stackToReverse.isEmpty()) + temp.push(stackToReverse.pop()); + return temp; + } +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/InfixExprTest.java b/group15/1507_977996067/src/task7/expr/InfixExprTest.java new file mode 100644 index 0000000000..f9eb14cbdf --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/InfixExprTest.java @@ -0,0 +1,56 @@ +package task7.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + + @Test + public void testExprSplit() { + String expr = "3*20+12*5-40/2"; + Arrays.stream(expr.split("[+\\-*/]+")).forEach(System.out::println); + Arrays.stream(expr.split("[\\d]+")).forEach(System.out::println); + } + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/PostfixExpr.java b/group15/1507_977996067/src/task7/expr/PostfixExpr.java new file mode 100644 index 0000000000..369e52c203 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/PostfixExpr.java @@ -0,0 +1,45 @@ +package task7.expr; + +import task5.stack.Stack; + +import java.util.List; + +public class PostfixExpr { + private String expr = null; + + private Stack numberStack = new Stack<>(); + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List parse = new TokenParser().parse(expr); + for (int i = 0; i < parse.size(); i++) { + Token token = parse.get(i); +// 后缀表达式:从左向右遍历 遇到操作数入栈,遇到操作符弹出操作数栈的两个数计算再入栈 + if (token.isNumber()) + numberStack.push((float) token.getIntValue()); + else + numberStack.push(cal(token.toString(), numberStack.pop(), numberStack.pop())); + } + /*while (!operatorStack.isEmpty()) { + numberStack.push(cal(operatorStack.pop(), numberStack.pop(), numberStack.pop())); + }*/ + return numberStack.peek(); + } + + private static float cal(String operator, float var1, float var2) { + switch (operator) { + case "+": + return var2 + var1; + case "-": + return var2 - var1; + case "*": + return var2 * var1; + case "/": + return var2 / var1; + } + return -1; + } +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/PostfixExprTest.java b/group15/1507_977996067/src/task7/expr/PostfixExprTest.java new file mode 100644 index 0000000000..172d397011 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/PostfixExprTest.java @@ -0,0 +1,37 @@ +package task7.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(), 0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(), 0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(), 0.0f); + } + } + +} diff --git a/group15/1507_977996067/src/task7/expr/PrefixExpr.java b/group15/1507_977996067/src/task7/expr/PrefixExpr.java new file mode 100644 index 0000000000..fe5cb137f0 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/PrefixExpr.java @@ -0,0 +1,47 @@ +package task7.expr; + +import task5.stack.Stack; + +import java.util.List; + +public class PrefixExpr { + + private String expr; + + private Stack numberStack = new Stack<>(); + + public PrefixExpr(String expr) { + this.expr = expr; + + } + + public float evaluate() { + List parse = new TokenParser().parse(expr); + for (int i = parse.size() - 1; i >= 0; i--) { + Token token = parse.get(i); +// 前缀表达式:从右向左遍历 遇到操作数入栈,遇到操作符弹出操作数栈的两个数计算再入栈 + if (token.isNumber()) + numberStack.push((float) token.getIntValue()); + else + numberStack.push(cal(token.toString(), numberStack.pop(), numberStack.pop())); + } + /*while (!operatorStack.isEmpty()) { + numberStack.push(cal(operatorStack.pop(), numberStack.pop(), numberStack.pop())); + }*/ + return numberStack.peek(); + } + + private static float cal(String operator, float var1, float var2) { + switch (operator) { + case "+": + return var1 + var2; + case "-": + return var1 - var2; + case "*": + return var1 * var2; + case "/": + return var1 / var2; + } + return -1; + } +} diff --git a/group15/1507_977996067/src/task7/expr/PrefixExprTest.java b/group15/1507_977996067/src/task7/expr/PrefixExprTest.java new file mode 100644 index 0000000000..9ac8f9936f --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/PrefixExprTest.java @@ -0,0 +1,44 @@ +package task7.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(), 0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(), 0.001f); + } + + + } + +} diff --git a/group15/1507_977996067/src/task7/expr/Token.java b/group15/1507_977996067/src/task7/expr/Token.java new file mode 100644 index 0000000000..5ca7b1aef8 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/Token.java @@ -0,0 +1,53 @@ +package task7.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value); + } + + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/TokenParser.java b/group15/1507_977996067/src/task7/expr/TokenParser.java new file mode 100644 index 0000000000..45d75ffc12 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/TokenParser.java @@ -0,0 +1,57 @@ +package task7.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else { +// System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java b/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..aba714c39b --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package task7.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java b/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..e3784bec44 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java @@ -0,0 +1,120 @@ +package task7.jvm.attr; + + +import task7.jvm.clz.ClassFile; +import task7.jvm.cmd.ByteCodeCommand; +import task7.jvm.cmd.CommandParser; +import task7.jvm.constant.ConstantPool; +import task7.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attrNameIndex = iter.next2Bytes(); + int attrLen = iter.next4Bytes(); + int maxStack = iter.next2Bytes(); + int maxLocals = iter.next2Bytes(); + int codeLen = iter.next4Bytes(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + + int exceptionTableLen = iter.next2Bytes(); + //TODO 处理exception + if (exceptionTableLen > 0) { + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.next2Bytes(); + + for (int x = 1; x <= subAttrCount; x++) { + int subAttrIndex = iter.next2Bytes(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + for (int i = 0; i < cmds.length; i++) { + buffer.append(cmds[i].toString(pool)).append("\n"); + } + buffer.append("\n"); + buffer.append(this.lineNumTable.toString()); + buffer.append(this.localVarTable.toString(pool)); + return buffer.toString(); + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java b/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..ebaec852b9 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java @@ -0,0 +1,72 @@ +package task7.jvm.attr; + +import task7.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + + LineNumberTable table = new LineNumberTable(index, len); + + int itemLen = iter.next2Bytes(); + + for (int i = 1; i <= itemLen; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.next2Bytes()); + item.setLineNum(iter.next2Bytes()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for (LineNumberItem item : items) { + buffer.append("startPC:" + item.getStartPC()).append(","); + buffer.append("lineNum:" + item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..fbb27e8812 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package task7.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..7bcf199b3c --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java @@ -0,0 +1,57 @@ +package task7.jvm.attr; + + +import task7.jvm.constant.ConstantPool; +import task7.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.next2Bytes(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.next2Bytes()); + item.setLength(iter.next2Bytes()); + item.setNameIndex(iter.next2Bytes()); + item.setDescIndex(iter.next2Bytes()); + item.setIndex(iter.next2Bytes()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java b/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..f57144783d --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package task7.jvm.attr; + + +import task7.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo { + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java b/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..e333b4621d --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package task7.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/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java b/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..1587998e29 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java @@ -0,0 +1,134 @@ +package task7.jvm.clz; + +import task7.jvm.constant.ClassInfo; +import task7.jvm.constant.ConstantPool; +import task7.jvm.field.Field; +import task7.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + + private List fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + + public void setClzIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } + + public ConstantPool getPool() { + return pool; + } + + public void setPool(ConstantPool pool) { + this.pool = pool; + } + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + + public List getMethods() { + return methods; + } + + public void setMethods(List methods) { + this.methods = methods; + } + + 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()); + + + } + + public String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType) { + + for (Method method : methods) { + int nameIndex = method.getNameIndex(); + int descriptorIndex = method.getDescriptorIndex(); + String name = getConstantPool().getUTF8String(nameIndex); + String descriptor = getConstantPool().getUTF8String(descriptorIndex); + if (methodName.equalsIgnoreCase(name) && paramAndReturnType.equalsIgnoreCase(descriptor)) { + return method; + } + } + return null; + } + + public Method getMainMethod() { + + return getMethod("main", "([Ljava/lang/String;)"); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java b/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..b4342d6557 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package task7.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/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..b80f830944 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java b/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..e4c9e2ac2d --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package task7.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + +// public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java b/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..f6a12e1701 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java @@ -0,0 +1,124 @@ +package task7.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import task7.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + codes = codes.toUpperCase(); + System.out.println("=========> codes: " + codes); + CommandIterator iterator = new CommandIterator(codes); + List commands = new ArrayList<>(); + while (iterator.hasNext()) { + String opCode = iterator.next2CharAsString(); + switch (opCode) { + case new_object: + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, codes); + newObjectCmd.setOprand1(iterator.next2CharAsInt()); + newObjectCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(newObjectCmd); + break; + case ldc: + LdcCmd ldcCmd = new LdcCmd(clzFile, codes); + ldcCmd.setOperand(iterator.next2CharAsInt()); + commands.add(ldcCmd); + break; + case bipush: + BiPushCmd biPushCmd = new BiPushCmd(clzFile, codes); + biPushCmd.setOperand(iterator.next2CharAsInt()); + commands.add(biPushCmd); + break; + case invokespecial: + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, codes); + invokeSpecialCmd.setOprand1(iterator.next2CharAsInt()); + invokeSpecialCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(invokeSpecialCmd); + break; + case invokevirtual: + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, codes); + invokeVirtualCmd.setOprand1(iterator.next2CharAsInt()); + invokeVirtualCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(invokeVirtualCmd); + break; + default: + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, codes); + commands.add(noOperandCmd); + } + } + calcuateOffset(commands); + return commands.toArray(new ByteCodeCommand[commands.size()]); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16); + } + + } +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..531770d8b9 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..7f43150ca2 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ClassInfo; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.FieldRefInfo; +import task7.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ffe71dfb15 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..de80616b39 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..143b070968 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..09ffc20c19 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..16810f3874 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..713610e243 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..df2b895c03 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..9cf2fded56 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ClassInfo; +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.FieldRefInfo; +import task7.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java b/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..8c2af5157a --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java @@ -0,0 +1,31 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitClassInfo(this); + } + + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java b/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..24922e29d3 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java @@ -0,0 +1,35 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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 abstract void accept(ConstantInfoVisitor visitor); + + public ConstantPool getConstantPool() { + return constantPool; + } + + public ConstantInfo getConstantInfo(int index) { + return this.constantPool.getConstantInfo(index); + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java b/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..485f0dd7c2 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java @@ -0,0 +1,37 @@ +package task7.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +public class ConstantPool { + + private List constantInfos; + + public ConstantPool() { + this.constantInfos = new ArrayList<>(); + } + + public ConstantPool(int size) { + this.constantInfos = new ArrayList<>(size); + + addConstantInfo(new NullConstantInfo()); + } + + 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/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java b/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..01474d2dd6 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java @@ -0,0 +1,65 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitFieldRefInfo(this); + } + + 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/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java b/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..104b798e59 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java @@ -0,0 +1,65 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitMethodRefInfo(this); + } + + 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/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java b/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..18089a2008 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,56 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitNameAndTypeInfo(this); + } + + + 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/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java b/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..216b03a449 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java @@ -0,0 +1,21 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + // non impl + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java b/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..0b601e3adb --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java @@ -0,0 +1,35 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitStringInfo(this); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + + public String toString() { + return this.getConstantPool().getUTF8String(index); + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java b/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..53686ca0a8 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java @@ -0,0 +1,45 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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 void accept(ConstantInfoVisitor visitor) { + visitor.visitUtf8Info(this); + } + + @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/group15/1507_977996067/src/task7/jvm/field/Field.java b/group15/1507_977996067/src/task7/jvm/field/Field.java new file mode 100644 index 0000000000..989f3316c4 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/field/Field.java @@ -0,0 +1,48 @@ +package task7.jvm.field; + + +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.UTF8Info; +import task7.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name + ":" + desc; + } + + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + + int accessFlag = iter.next2Bytes(); + int nameIndex = iter.next2Bytes(); + int descIndex = iter.next2Bytes(); + int attribCount = iter.next2Bytes(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex, pool); + + if (attribCount > 0) { + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java b/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..81c268cdc9 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,56 @@ +package task7.jvm.loader; + +import task7.jvm.util.Util; + +import java.util.Arrays; + +public class ByteCodeIterator { + + private int position; + + private byte[] bytes; + + public ByteCodeIterator(byte[] bytes) { + this.bytes = bytes; + } + + public String getMagicNumber() { + position = 0; + byte[] bytes = Arrays.copyOf(this.bytes, 4); + position += 4; + return Util.byteToHexString(bytes); + } + + public int next2Bytes() { + return nextBytes(2); + } + + public int next4Bytes() { + return nextBytes(4); + } + + public int nextFlag() { + return nextBytes(1); + } + + public void back(int length) { + position -= length; + } + + public byte[] getBytes(int length) { + byte[] bytes = Arrays.copyOfRange(this.bytes, position, position + length); + position += length; + return bytes; + } + + public String nextUxToHexString(int length) { + return new String(getBytes(length)); + } + + private int nextBytes(int size) { + byte[] bytes = Arrays.copyOfRange(this.bytes, position, position + size); + position += size; + return Util.byteToInt(bytes); + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java b/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..350d8b92f4 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java @@ -0,0 +1,122 @@ +package task7.jvm.loader; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import task7.jvm.clz.ClassFile; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +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 < this.clzPaths.size(); i++) { + buffer.append(this.clzPaths.get(i)); + if (i < this.clzPaths.size() - 1) { + buffer.append(";"); + } + } + return buffer.toString(); + } + + private byte[] loadClassFile_V1(String clzFileName) { + + BufferedInputStream bis = null; + + try { + + File f = new File(clzFileName); + + + bis = new BufferedInputStream(new FileInputStream(f)); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + + byte[] buffer = new byte[1024]; + int length = -1; + + while ((length = bis.read(buffer)) != -1) { + bos.write(buffer, 0, length); + } + + byte[] codes = bos.toByteArray(); + + return codes; + + } catch (IOException e) { + e.printStackTrace(); + + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + + } + + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java b/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..eeea785114 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java @@ -0,0 +1,112 @@ +package task7.jvm.loader; + +import task7.jvm.clz.AccessFlag; +import task7.jvm.clz.ClassFile; +import task7.jvm.clz.ClassIndex; +import task7.jvm.constant.*; +import task7.jvm.field.Field; +import task7.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFileParser { + + private ConstantPool constantPool; + + public ClassFile parse(byte[] codes) { + ClassFile classFile = new ClassFile(); + ByteCodeIterator iterator = new ByteCodeIterator(codes); + System.out.println(iterator.getMagicNumber()); + + classFile.setMinorVersion(iterator.next2Bytes()); + classFile.setMajorVersion(iterator.next2Bytes()); + + parseConstantPool(iterator); + classFile.setConstPool(constantPool); + classFile.setAccessFlag(parseAccessFlag(iterator)); + classFile.setClassIndex(parseClassIndex(iterator));//task5 over + + iterator.next2Bytes(); // interface + + classFile.setFields(parseFileds(iterator)); + classFile.setMethods(parseMethods(classFile, iterator));//task6 over + return classFile; + } + + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + return new AccessFlag(iter.next2Bytes()); + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + ClassIndex clazIndex = new ClassIndex(); + clazIndex.setThisClassIndex(iter.next2Bytes()); + clazIndex.setSuperClassIndex(iter.next2Bytes()); + return clazIndex; + } + + private void parseConstantPool(ByteCodeIterator iter) { + int poolCount = iter.next2Bytes(); + ConstantPool pool = new ConstantPool(poolCount); + for (int i = 0; i < poolCount; i++) { + int tag = iter.nextFlag(); + if (tag == ConstantInfo.UTF8_INFO) { //utf-8 + int length = iter.next2Bytes(); + byte[] bytes = iter.getBytes(length); + UTF8Info utf8Info = new UTF8Info(pool); + utf8Info.setValue(new String(bytes)); + utf8Info.setLength(length); + pool.addConstantInfo(utf8Info); + } else if (tag == ConstantInfo.STRING_INFO) { + StringInfo stringInfo = new StringInfo(pool); + stringInfo.setIndex(iter.next2Bytes()); + pool.addConstantInfo(stringInfo); + } else if (tag == ConstantInfo.CLASS_INFO) { + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(iter.next2Bytes()); + pool.addConstantInfo(classInfo); + } else if (tag == ConstantInfo.FIELD_INFO) { + FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); + fieldRefInfo.setClassInfoIndex(iter.next2Bytes()); + fieldRefInfo.setNameAndTypeIndex(iter.next2Bytes()); + pool.addConstantInfo(fieldRefInfo); + } else if (tag == ConstantInfo.METHOD_INFO) { + MethodRefInfo methodRefInfo = new MethodRefInfo(pool); + methodRefInfo.setClassInfoIndex(iter.next2Bytes()); + methodRefInfo.setNameAndTypeIndex(iter.next2Bytes()); + pool.addConstantInfo(methodRefInfo); + } else if (tag == ConstantInfo.NAME_AND_TYPE_INFO) { + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + nameAndTypeInfo.setIndex1(iter.next2Bytes()); + nameAndTypeInfo.setIndex2(iter.next2Bytes()); + pool.addConstantInfo(nameAndTypeInfo); + } + } + this.constantPool = pool; + } + + private List parseFileds(ByteCodeIterator iter) { + int fieldCount = iter.next2Bytes(); + + List fieldList = new ArrayList<>(fieldCount); + + for (int i = 0; i < fieldCount; i++) { + Field f = Field.parse(constantPool, iter); + fieldList.add(f); + } + return fieldList; + } + + private List parseMethods(ClassFile classFile, ByteCodeIterator iter) { + int methodCount = iter.next2Bytes(); + + List methodList = new ArrayList<>(methodCount); + + for (int i = 0; i < methodCount; i++) { + Method m = Method.parse(classFile, iter); + methodList.add(m); + } + return methodList; + } +} diff --git a/group15/1507_977996067/src/task7/jvm/method/Method.java b/group15/1507_977996067/src/task7/jvm/method/Method.java new file mode 100644 index 0000000000..13643df703 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/method/Method.java @@ -0,0 +1,91 @@ +package task7.jvm.method; + +import task7.jvm.attr.AttributeInfo; +import task7.jvm.attr.CodeAttr; +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.UTF8Info; +import task7.jvm.loader.ByteCodeIterator; + +public class Method { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlag = iter.next2Bytes(); + int nameIndex = iter.next2Bytes(); + int descIndex = iter.next2Bytes(); + int attribCount = iter.next2Bytes(); + + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + for (int j = 1; j <= attribCount; j++) { + + int attrNameIndex = iter.next2Bytes(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if (AttributeInfo.CODE.equalsIgnoreCase(attrName)) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else { + throw new RuntimeException("only CODE attribute is implemented , please implement the " + attrName); + } + + } + + return m; + + } +} diff --git a/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java b/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..3f4607a044 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java @@ -0,0 +1,44 @@ +package task7.jvm.print; + +import task7.jvm.clz.ClassFile; +import task7.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + + public ClassFilePrinter(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public void print() { + + if (clzFile.getAccessFlag().isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name:" + clzFile.getClassName()); + + System.out.println("Super Class Name:" + clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + } + + public static void main(String[] args) { + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java new file mode 100644 index 0000000000..40851fc1bf --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java @@ -0,0 +1,18 @@ +package task7.jvm.print; + +import task7.jvm.constant.*; + +public interface ConstantInfoVisitor { + + void visitClassInfo(ClassInfo classInfo); + + void visitFieldRefInfo(FieldRefInfo fieldRefInfo); + + void visitMethodRefInfo(MethodRefInfo methodRefInfo); + + void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo); + + void visitStringInfo(StringInfo stringInfo); + + void visitUtf8Info(UTF8Info utf8Info); +} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java new file mode 100644 index 0000000000..776d23bc79 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java @@ -0,0 +1,51 @@ +package task7.jvm.print; + +import task7.jvm.constant.*; + +public class ConstantInfoVisitorImpl implements ConstantInfoVisitor { + @Override + public void visitClassInfo(ClassInfo classInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("Class\t#").append(classInfo.getUtf8Index()).append("\t").append(classInfo.getClassName()); + System.out.println(sb); + } + + @Override + public void visitFieldRefInfo(FieldRefInfo fieldRefInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("FieldRef\t#").append(fieldRefInfo.getClassInfoIndex()).append("\t").append(fieldRefInfo.getFieldName()); + System.out.println(sb); + + } + + @Override + public void visitMethodRefInfo(MethodRefInfo methodRefInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("MethodRef\t#").append(methodRefInfo.getMethodName()); + System.out.println(sb); + } + + @Override + public void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("NameAndType\t#").append(nameAndTypeInfo.getName()).append("\t") + .append(nameAndTypeInfo.getIndex1()).append("\t") + .append(nameAndTypeInfo.getIndex2()).append("\t") + .append(nameAndTypeInfo.getTypeInfo()); + System.out.println(sb); + } + + @Override + public void visitStringInfo(StringInfo stringInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("String\t#").append(stringInfo.getIndex()); + System.out.println(sb); + } + + @Override + public void visitUtf8Info(UTF8Info utf8Info) { + StringBuilder sb = new StringBuilder(); + sb.append("UTF8\t#").append(utf8Info.getValue()); + System.out.println(sb); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java b/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..d6e87cad83 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,26 @@ +package task7.jvm.print; + +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; + +public class ConstantPoolPrinter { + + private ConstantPool pool; + + ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + + System.out.println("Constant Pool:"); + + ConstantInfoVisitor visitor = new ConstantInfoVisitorImpl(); + int size = (int) pool.getSize(); + for (int i = 0; i < size; i++) { + System.out.print("#" + i + "= "); + ConstantInfo constantInfo = pool.getConstantInfo(i); + constantInfo.accept(visitor); + } + } +} diff --git a/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java b/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..53bea9b04e --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,191 @@ +package task7.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import task7.jvm.clz.ClassFile; +import task7.jvm.clz.ClassIndex; +import task7.jvm.constant.*; +import task7.jvm.loader.ClassFileLoader; + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "EmployeeV1"; + + static String path1 = "E:\\Idea\\coding2017\\group15\\1507_977996067\\out\\task5\\jvm\\test"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "EmployeeV1"; + + clzFile = loader.loadClass(className); +// clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1038, byteCodes.length); + + } + + + @Test + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; + + String actualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", actualValue); + } + + + private String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } + + /** + * ---------------------------------------------------------------------- + */ + + + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool() { + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java b/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..866b94811a --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java @@ -0,0 +1,29 @@ +package task7.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/group15/1507_977996067/src/task7/jvm/util/Util.java b/group15/1507_977996067/src/task7/jvm/util/Util.java new file mode 100644 index 0000000000..60158ac03a --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/util/Util.java @@ -0,0 +1,23 @@ +package task7.jvm.util; + +public class Util { + public static int byteToInt(byte[] codes){ + String s1 = byteToHexString(codes); + return Integer.valueOf(s1, 16); + } + + + public static String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Sun, 23 Apr 2017 14:04:26 +0800 Subject: [PATCH 250/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/InfixToPostfix.java | 110 ++++++++++++++++-- 1 file changed, 103 insertions(+), 7 deletions(-) diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java index 96a2194a67..92c31a1085 100644 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -1,14 +1,110 @@ package com.coding.basic.stack.expr; +import com.coding.basic.stack.Stack; + +import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; public class InfixToPostfix { - - public static List convert(String expr) { - - return null; - } - - + private static List op = new ArrayList(); + + public static List convert(String expr) { + op.add('+'); + op.add('-'); + op.add('*'); + op.add('/'); + List numList = new LinkedList<>(); + List opList = new LinkedList<>(); + + List list = new ArrayList(); + + + char[] chars = expr.toCharArray(); + + int index = 0; + while (index < chars.length) { + if (op.contains(chars[index])) { + if (chars[index] == '*' || chars[index] == '/') { + + char oper = chars[index]; + + StringBuilder sb = new StringBuilder(); + index++; + while (chars[index] >= '0' && chars[index] <= '9') { + sb.append(chars[index]); + index++; + } + String s = numList.get(numList.size() - 1); + numList.remove(numList.size() - 1); + StringBuilder buffer = new StringBuilder(); + buffer.append(s + ' '); + buffer.append(sb); + buffer.append(oper); + numList.add(buffer.toString()); + //numStack.push(buffer.toString()); + + } else { + opList.add("" + chars[index]); + //opStack.push(chars[index]); + } + index++; + } else if (chars[index] == ' ') { + index++; + } else { + StringBuilder sb = new StringBuilder(); + while (chars[index] >= '0' && chars[index] <= '9') { + sb.append(chars[index]); + index++; + } + numList.add(sb.toString()); + //numStack.push(sb.toString()); + } + + } + + int opListIndex = 0; + while (opListIndex < opList.size()) { + for (int i = 0; i < opList.size(); i++) { + String a = numList.get(0); + String b = numList.get(1); + numList.set(0, a + " " + b + " " + opList.get(opListIndex)); + numList.remove(1); + } + } + + String postfixExpr = numList.get(0); + char[] chars1 = postfixExpr.toCharArray(); + index = 0; + while (index < chars1.length) { + if (chars1[index] == '+') { + Token token = new Token(1, "+"); + list.add(token); + } else if (chars1[index] == '-') { + Token token = new Token(1, "-"); + list.add(token); + } else if (chars1[index] == '*') { + Token token = new Token(1, "*"); + list.add(token); + } else if (chars1[index] == '/') { + Token token = new Token(1, "/"); + list.add(token); + }else if (chars1[index] == ' '){ + index++; + }else { + StringBuilder sb = new StringBuilder(); + while (chars1[index] >= '0' && chars1[index] <= '9') { + sb.append(chars1[index]); + index++; + } + Token token = new Token(2, sb.toString()); + list.add(token); + } + + } + + return list; + } + } From a8941cadb6edb552446bd14b2e37308d243efbe3 Mon Sep 17 00:00:00 2001 From: ZhaoHongxin Date: Sun, 23 Apr 2017 15:00:09 +0800 Subject: [PATCH 251/552] =?UTF-8?q?=E8=A1=A5=E5=85=85InfixToPostfix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jvm/print/ConstantPoolPrinter.java | 2 - .../coding/basic/stack/expr/InfixExpr.java | 11 ---- .../basic/stack/expr/InfixToPostfix.java | 46 +++++++++++++++ .../coding/basic/stack/expr/PostfixExpr.java | 57 ++++++++++++++++++ .../basic/stack/expr/PostfixExprTest.java | 47 +++++++++++++++ .../coding/basic/stack/expr/PrefixExpr.java | 59 +++++++++++++++++++ .../basic/stack/expr/PrefixExprTest.java | 49 +++++++++++++++ .../coding/basic/stack/expr/TokenParser.java | 16 ++--- 8 files changed, 267 insertions(+), 20 deletions(-) create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PrefixExprTest.java diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java index 280a71aa5f..d56de1e8be 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -85,7 +85,5 @@ public void visitClassInfo(ClassInfo info) { System.out.printf("%8s", "#" + i + " = ");//左对齐,8个空格 constantInfo.accept(visitor); } - System.out.println("\n"+"\t"+"FORMATTED BY KANDDE."); - formatter.close(); } } diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExpr.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExpr.java index 6c582d9b97..453120c9c3 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixExpr.java @@ -23,16 +23,6 @@ public float evaluate() { if (opStack.isEmpty()) { opStack.push(t); } else { - /*Token topOperator = (Token) opStack.peek(); - if (t.comparePriority(topOperator) >= 0) { - opStack.push(t); - } else { - Float f1 = (Float) numStack.pop(); - Float f2 = (Float) numStack.pop(); - numStack.push(calculate(topOperator.getValue(), f2, f1)); - opStack.pop(); - opStack.push(t); - }*/ while(!opStack.isEmpty() && !t.hasHigherPriority(opStack.peek())) { Token prevOperator = opStack.pop(); @@ -57,7 +47,6 @@ public float evaluate() { numStack.push(calculate(opr.getValue(), f2, f1)); } return numStack.pop(); - //return 0.0f; } private Float calculate(String op, Float f1, Float f2) { diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..efb6daf9b3 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,46 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static Token[] convert(String expr) { + TokenParser parser = new TokenParser(); + List infix = parser.parse(expr); + + Stack postfix = new Stack(); + Stack op = new Stack(); + for (Token token : infix) { + if (token.isDigit()) { + postfix.push(token); + } /*else if (token.getValue().equals("(")) { + op.push(token); + } else if (token.getValue().equals(")")) { + while (!op.isEmpty() && !op.peek().getValue().equals("(")) { + postfix.push(op.pop()); + } + op.pop(); + }*/ else if (token.isOperator()){ + if (op.isEmpty()) { + op.push(token); + } /*else if (op.peek().getValue().equals("(")) { + op.push(token); + } */else if (token.hasHigherPriority(op.peek())) { + op.push(token); + } else { + while (!op.isEmpty()/* &&! op.peek().getValue().equals("(")*/ && !token.hasHigherPriority(op.peek())) { + postfix.push(op.pop()); + } + op.push(token); + } + } + } + while (!op.isEmpty()) { + postfix.push(op.pop()); + } + Token[] result = new Token[postfix.size()]; + return postfix.toArray(result); + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PostfixExpr.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..fd8afaa24d --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack opStack = new Stack(); + Stack numStack = new Stack(); + + Stack exprs = new Stack(); + + for(int i = tokens.size()-1; i >= 0; i--) { + exprs.push(tokens.get(i)); + } + + while(!exprs.isEmpty()) { + Token token = exprs.pop(); + if (token.isDigit()) { + numStack.push(new Float(token.getIntValue())); + } else { + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(token.toString(), f2, f1)); + } + } + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..54ad44afa7 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,47 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(8-2*3)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 8 2 3*-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50*5 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + @Test + public void testInfixToPostfix() { + PostfixExpr expr = new PostfixExpr("9 8 2 3*-3*+ 10 2/+"); + Token[] convert = InfixToPostfix.convert("10-2*3+50*5"); + System.out.println(convert); + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PrefixExpr.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..223441200a --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,59 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack opStack = new Stack(); + Stack numStack = new Stack(); + + Stack exprs = new Stack(); + for(Token token : tokens) { + exprs.push(token); + } + + while(!exprs.isEmpty()) { + Token token = exprs.pop(); + if (token.isDigit()) { + numStack.push(new Float(token.getIntValue())); + } else { + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + } + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2) { + System.out.println(f1 + "=====" +f2); + switch (op) { + case "*": + System.out.println(" * "); + return f1 * f2; + case "/": + System.out.println("/"); + return f1 / f2; + case "+": + System.out.println("+"); + return f1 + f2; + case "-": + System.out.println("-"); + return f1 - f2; + } + throw new RuntimeException(op + " is not supported"); + } + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..b8ac42cee5 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,49 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + System.out.println("================1"); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + System.out.println("================2"); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + System.out.println("================3"); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + System.out.println("================4"); + } + + + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/TokenParser.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/TokenParser.java index 1b4786cc8c..4073ebe6df 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/TokenParser.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/expr/TokenParser.java @@ -23,21 +23,23 @@ public List parse(String expr) { Token t = new Token(Token.NUMBER, value); tokens.add(t); i = nextOperatorIndex; + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; } - System.out.println(c); } return tokens; } - private int indexOfNextOperator(int nowIndex, String expr) { - for (int i = nowIndex; i < expr.length(); i++) { - char c = expr.charAt(i); - if (charIsOperator(c)) { - return i; + private int indexOfNextOperator(int i, String expr) { + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; } } - return expr.length();//如果后面没有操作符,返回字符串长度,用于截取数字 + return i; } private boolean charIsDigit(char c) { From a8b2cb45b4c50edd06ae273e7352c1b6cb080e76 Mon Sep 17 00:00:00 2001 From: gongxun Date: Sun, 23 Apr 2017 15:46:09 +0800 Subject: [PATCH 252/552] =?UTF-8?q?=E5=AE=8C=E6=88=904=E6=9C=8816=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../785396327/4.9/expr/InfixToPostfix.java | 34 ++++++++++++++- .../4.9/expr/InfixToPostfixTest.java | 41 +++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 group17/785396327/4.9/expr/InfixToPostfixTest.java diff --git a/group17/785396327/4.9/expr/InfixToPostfix.java b/group17/785396327/4.9/expr/InfixToPostfix.java index 720be5b28a..58fb60ef2b 100644 --- a/group17/785396327/4.9/expr/InfixToPostfix.java +++ b/group17/785396327/4.9/expr/InfixToPostfix.java @@ -1,13 +1,43 @@ package expr; +import stack.MyStack; + +import java.util.ArrayList; import java.util.List; /** * Created by gongxun on 2017/4/22. + * 遇到数组直接放入集合等待输出 + * 遇到运算符入栈,如果栈顶元素的优先级较待入栈运算符的优先级高,将栈顶元素取出放入集合等待输出,否则直接入栈 */ public class InfixToPostfix { public static List convert(String expr) { - - return null; + List result = new ArrayList(); + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + MyStack stack = new MyStack(); + if (tokens != null) { + for (Token token : tokens) { + if (token.isNumber()) + result.add(token); + else { + while (!stack.isEmpty()) { + Token prevOper = stack.peek(); + if (token.hasHigherPriority(prevOper)) { + stack.push(token); + break; + } else { + result.add(stack.pop()); + } + } + //和+或者-同优先级或者更高优先级的都已经弹栈,只剩空栈 + if (stack.isEmpty()) stack.push(token); + } + } + } + //将剩余的所有符号出栈 + while (!stack.isEmpty()) + result.add(stack.pop()); + return result; } } diff --git a/group17/785396327/4.9/expr/InfixToPostfixTest.java b/group17/785396327/4.9/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..f1dcd3f466 --- /dev/null +++ b/group17/785396327/4.9/expr/InfixToPostfixTest.java @@ -0,0 +1,41 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by IBM on 2017/4/23. + */ +public class InfixToPostfixTest { + + + @Before + public void setUp() { + + } + + @After + public void tearDown() { + + } + + @Test + public void testConvert() { + { + Assert.assertEquals("[2, 3, 4, *, +, 5, +]", InfixToPostfix.convert("2+3*4+5").toString()); + } + { + Assert.assertEquals("[3, 20, *, 12, 5, *, +, 40, 2, /, -]", InfixToPostfix.convert("3*20+12*5-40/2").toString()); + } + + { + Assert.assertEquals("[3, 20, *, 2, /]", InfixToPostfix.convert("3*20/2").toString()); + } + + { + Assert.assertEquals("[20, 2, /, 3, *]", InfixToPostfix.convert("20/2*3").toString()); + } + } +} From e4d42eb61f08dd8141394547ff9e7b515d7002f1 Mon Sep 17 00:00:00 2001 From: RalfNick Date: Sun, 23 Apr 2017 15:58:31 +0800 Subject: [PATCH 253/552] Only data struct --- .../data-struct/com/ralf/stack/MyStack.java" | 42 +++++ .../com/ralf/stack/StackUtil.java" | 173 ++++++++++++++++++ .../com/ralf/stack/StackUtilsTest.java" | 87 +++++++++ .../com/ralf/stack/expr/ExprIterator.java" | 57 ++++++ .../com/ralf/stack/expr/InfixExpr.java" | 74 ++++++++ .../com/ralf/stack/expr/InfixExprTest.java" | 44 +++++ .../com/ralf/stack/expr/InfixToPostExpr.java" | 41 +++++ .../ralf/stack/expr/InfixToPostExprTest.java" | 30 +++ .../com/ralf/stack/expr/PostfixExpr.java" | 48 +++++ .../com/ralf/stack/expr/PostfixExprTest.java" | 34 ++++ .../com/ralf/stack/expr/PrefixExpr.java" | 59 ++++++ .../com/ralf/stack/expr/PrefixExprTest.java" | 39 ++++ .../com/ralf/stack/expr/Token.java" | 49 +++++ .../com/ralf/stack/expr/TokenParser.java" | 56 ++++++ .../com/ralf/stack/expr/TokenParserTest.java" | 36 ++++ 15 files changed, 869 insertions(+) create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/MyStack.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/StackUtil.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/StackUtilsTest.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/ExprIterator.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixExpr.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixExprTest.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixToPostExpr.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixToPostExprTest.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PostfixExpr.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PostfixExprTest.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PrefixExpr.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PrefixExprTest.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/Token.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/TokenParser.java" create mode 100644 "group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/TokenParserTest.java" diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/MyStack.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/MyStack.java" new file mode 100644 index 0000000000..147ee9e15f --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/MyStack.java" @@ -0,0 +1,42 @@ +package com.ralf.stack; + +import java.util.LinkedList; +import java.util.NoSuchElementException; + +/** + * ʵֻݽṹջ + * + * @author Ralf + * + */ +public class MyStack { + + private LinkedList linkedList = new LinkedList<>(); + + public MyStack() { + + } + + public void push(T t) { + linkedList.addFirst(t); + } + + public T pop() { + if (size() == 0) { + throw new NoSuchElementException(); + } + return linkedList.removeFirst(); + } + + public T peek() { + return (size() == 0) ? null : linkedList.getFirst(); + } + + public int size() { + return linkedList.size(); + } + + public boolean isEmpty(){ + return linkedList.isEmpty(); + } +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/StackUtil.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/StackUtil.java" new file mode 100644 index 0000000000..758178131c --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/StackUtil.java" @@ -0,0 +1,173 @@ +package com.ralf.stack; + +import java.util.NoSuchElementException; + +public class StackUtil { + + private static MyStack myStack = new MyStack<>(); + + /** + * ջеԪInteger, ջջ : 5,4,3,2,1 ø÷ ԪشΪ: 1,2,3,4,5 + * ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ + * + * @param + */ + public static void reverse(MyStack stack) { + + if (stack.isEmpty()) { + System.out.println("ջΪջ"); + return; + } + @SuppressWarnings("unchecked") + T[] elements = (T[]) new Object[stack.size()]; + for (int i = 0; i < elements.length; i++) { + elements[i] = stack.pop(); + } + for (int i = 0; i < elements.length; i++) { + stack.push(elements[i]); + } + + } + + public static void bad_reverse(MyStack s) { + if(s == null || s.isEmpty()){ + return; + } + MyStack tmpStack = new MyStack<>(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + + /** + * ɾջеijԪ ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ + * + * @param o + */ + public static void remove(MyStack s, T o) { + if (s.isEmpty()) { + System.out.println("ջΪգ"); + return; + } + MyStack stack = new MyStack<>(); + + while (!s.isEmpty()) { + T t = s.pop(); + if (t.equals(o)) { + PopAndPush(s, stack); + return; + } + stack.push(t); + } + throw new NoSuchElementException("ջûиԪأ"); + + } + + private static void PopAndPush(MyStack s, MyStack stack) { + while (!stack.isEmpty()) { + T t = stack.pop(); + s.push(t); + } + } + + /** + * ջȡlenԪ, ԭջԪرֲ ע⣺ֻʹStackĻpush,pop,peek,isEmpty + * ʹһջ + * + * @param len + * @return + */ + @SuppressWarnings("unchecked") + public static T[] getTop(MyStack s, int len) { + + if (s.isEmpty() || len > s.size()) { + return null; + } + MyStack oldStack = s; + T[] elements = (T[]) new Object[len]; + for (int i = 0; i < len; i++) { + elements[i] = s.pop(); + } + s = oldStack; + return elements; + } + + /** + * ַs ܰЩַ ( ) [ ] { }, a,b,c... x,yz ʹöջַsеDzdzɶԳֵġ s = + * "([e{d}f])" , ַеdzɶԳ֣ ÷true s = "([b{x]y})", + * ַеŲdzɶԳֵģ ÷false; + * + * @param s + * @return + */ + public static boolean isValidPairs(String s) { + + char[] ch = s.toCharArray(); + if (ch.length < 1) { + return false; + } + + MyStack leftStack = new MyStack<>(); + MyStack rightStack = new MyStack<>(); + + for (int i = 0; i < ch.length; i++) { + + switch (ch[i]) { + case '(': + leftStack.push(String.valueOf(ch[i])); + break; + + case '[': + leftStack.push(String.valueOf(ch[i])); + break; + + case '{': + leftStack.push(String.valueOf(ch[i])); + break; + + case ')': + rightStack.push(String.valueOf(ch[i])); + break; + + case ']': + rightStack.push(String.valueOf(ch[i])); + break; + + case '}': + rightStack.push(String.valueOf(ch[i])); + break; + + default: + break; + } + } + return isPair(leftStack, rightStack); + + } + + private static boolean isPair(MyStack leftStack, + MyStack rightStack) { + + if (leftStack.size() != rightStack.size()) { + return false; + } + + reverse(rightStack); + while (!leftStack.isEmpty()) { + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(leftStack.pop()).append(rightStack.pop()); + + String pair = stringBuilder.toString(); + if (!pair.equals("()") && !pair.equals("[]") && !pair.equals("{}")) { + return false; + } + } + return true; + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/StackUtilsTest.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/StackUtilsTest.java" new file mode 100644 index 0000000000..f547c5e0c1 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/StackUtilsTest.java" @@ -0,0 +1,87 @@ +package com.ralf.stack; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class StackUtilsTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void testReverse() { + + MyStack stack = new MyStack<>(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + Assert.assertEquals(5, stack.size()); + + StackUtil.reverse(stack); + //Assert.assertEquals(5, stack.size()); + + Assert.assertEquals(1, stack.pop().intValue()); + Assert.assertEquals(2, stack.pop().intValue()); + Assert.assertEquals(3, stack.pop().intValue()); + Assert.assertEquals(4, stack.pop().intValue()); + Assert.assertEquals(5, stack.pop().intValue()); + } + + @Test + public void testRemove() { + + MyStack stack = new MyStack<>(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + Assert.assertEquals(5, stack.size()); + + StackUtil.remove(stack, 3); + + Assert.assertEquals(4, stack.size()); + + Assert.assertEquals(5, stack.pop().intValue()); + Assert.assertEquals(4, stack.pop().intValue()); + Assert.assertEquals(2, stack.pop().intValue()); + Assert.assertEquals(1, stack.pop().intValue()); + } + + public void testGetTop() { + + MyStack stack = new MyStack<>(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + Assert.assertEquals(5, stack.size()); + + Integer[] integerReal = StackUtil.getTop(stack, 3); + int[] intExpeted = { 1, 2, 3 }; + int[] intReal = new int[integerReal.length]; + for (int i = 0; i < integerReal.length; i++) { + intReal[i] = integerReal[i]; + } + Assert.assertEquals(5, stack.size()); + Assert.assertArrayEquals(intExpeted, intReal); + + } + + @Test + public void testIsValidPair(){ + + String stringTrue = "([e{d}f])"; + String stringFalse = "([b{x]y})"; + + Assert.assertTrue(StackUtil.isValidPairs(stringTrue)); + Assert.assertFalse(StackUtil.isValidPairs(stringFalse)); + + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/ExprIterator.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/ExprIterator.java" new file mode 100644 index 0000000000..d82db3e915 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/ExprIterator.java" @@ -0,0 +1,57 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; + +public class ExprIterator { + + private int operPos; + private int numPos; + private ArrayList operateList = new ArrayList<>(); + private ArrayList numList = new ArrayList<>(); + + public ExprIterator(String exprString) { + char[] chs = exprString.toCharArray(); + transToString(chs); + } + + public Integer nextNumString() { + if (hasNextNum()) { + return Integer.parseInt(numList.get(numPos++)); + } + return null; + } + public String nextOperateString() { + if (hasNextOperate()) { + return operateList.get(operPos++); + } + return null; + } + + public boolean hasNextNum() { + return numPos < numList.size(); + } + + public boolean hasNextOperate() { + return operPos < operateList.size(); + } + + private void transToString(char[] chs) { + + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < chs.length; i++) { + if (chs[i] == '+' || chs[i] == '-' || chs[i] == '*' + || chs[i] == '/') { + numList.add(stringBuilder.toString()); + operateList.add(String.valueOf(chs[i])); + stringBuilder.delete(0, stringBuilder.length()); + } + else { + stringBuilder.append(chs[i]); + } + + } + numList.add(stringBuilder.toString()); + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixExpr.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixExpr.java" new file mode 100644 index 0000000000..86a060845c --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixExpr.java" @@ -0,0 +1,74 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class InfixExpr { + + private String exprString; + + public InfixExpr(String exprString) { + this.exprString = exprString; + } + + public double evaluate() { + + MyStack numStack = new MyStack(); + MyStack operStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + + List list = parser.parse(exprString); + + for (Token token : list) { + if (token.isOperator()) { + if (operStack.isEmpty()) { + operStack.push(token); + } else { + while (!operStack.isEmpty() + && !token.hasHigherPriority(operStack.peek())) { + String operator = operStack.pop().toString(); + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = operate(operator,num1,num2); + numStack.push(result); + } + operStack.push(token); + } + } + if (token.isNumber()) { + numStack.push(new Float(token.getValue())); + } + } + + while(!operStack.isEmpty()){ + String operator = operStack.pop().toString(); + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = operate(operator,num1,num2); + numStack.push(result); + } + + return numStack.pop().floatValue(); + } + + private Float operate(String operator,Float num1, Float num2) { + float result = 0.0f; + switch (operator) { + case "+": + result = num2 + num1; + break; + case "-": + result = num2 - num1; + break; + case "*": + result = num2 * num1; + break; + case "/": + result = num2 / num1; + break; + } + return result; + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixExprTest.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixExprTest.java" new file mode 100644 index 0000000000..cd987b94b0 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixExprTest.java" @@ -0,0 +1,44 @@ +package com.ralf.stack.expr; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixToPostExpr.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixToPostExpr.java" new file mode 100644 index 0000000000..6296d160ef --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixToPostExpr.java" @@ -0,0 +1,41 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +import com.ralf.stack.MyStack; +import com.ralf.stack.StackUtil; + +public class InfixToPostExpr { + + public static List convert(String infixString){ + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(infixString); + + MyStack S1 = new MyStack(); + MyStack S2 = new MyStack<>(); + + + for(Token token : tokens){ + if (token.isNumber()) { + S2.push(token); + } + else{ + while(!S1.isEmpty() && !token.hasHigherPriority(S1.peek())) { + S2.push(S1.pop()); + } + S1.push(token); + } + } + while(!S1.isEmpty()){ + S2.push(S1.pop()); + } + ArrayList list = new ArrayList<>(); + StackUtil.reverse(S2); + while(!S2.isEmpty()){ + list.add(S2.pop()); + } + return list; + } +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixToPostExprTest.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixToPostExprTest.java" new file mode 100644 index 0000000000..d21344ea1e --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/InfixToPostExprTest.java" @@ -0,0 +1,30 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixToPostExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + //10-2*3+50 + String string = "10-2*3+50"; + List tokens = InfixToPostExpr.convert(string); + + Assert.assertEquals(10, tokens.get(0).getValue()); + Assert.assertEquals(2, tokens.get(1).getValue()); + Assert.assertEquals(3, tokens.get(2).getValue()); + Assert.assertEquals("*", tokens.get(3).toString()); + Assert.assertEquals("-", tokens.get(4).toString()); + Assert.assertEquals(50, tokens.get(5).getValue()); + Assert.assertEquals("+", tokens.get(6).toString()); + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PostfixExpr.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PostfixExpr.java" new file mode 100644 index 0000000000..6e40dbe72f --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PostfixExpr.java" @@ -0,0 +1,48 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class PostfixExpr { + + private String exprString; + + public PostfixExpr(String exprString){ + this.exprString = exprString; + } + + public float evaluate() { + MyStack myStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(exprString); + for(Token token : tokens){ + if (token.isNumber()) { + myStack.push(new Float(token.getValue())); + } + if (token.isOperator()) { + float f2 = myStack.pop(); + float f1 = myStack.pop(); + myStack.push(calculate(token.toString(), f1, f2)); + } + } + return myStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PostfixExprTest.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PostfixExprTest.java" new file mode 100644 index 0000000000..d5ff875c0f --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PostfixExprTest.java" @@ -0,0 +1,34 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PrefixExpr.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PrefixExpr.java" new file mode 100644 index 0000000000..651889259e --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PrefixExpr.java" @@ -0,0 +1,59 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class PrefixExpr { + + private String exprString; + + public PrefixExpr(String exprString) { + this.exprString = exprString; + } + + public float evaluate() { + + MyStack myStack = new MyStack<>(); + MyStack exprStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(exprString); + + for(Token token : tokens){ + exprStack.push(token); + } + + while(!exprStack.isEmpty()){ + Token token = exprStack.pop(); + if (token.isNumber()) { + myStack.push(new Float(token.getValue())); + } + else { + Float f1 = myStack.pop(); + Float f2 = myStack.pop(); + myStack.push(calculate(token.toString(),f1,f2)); + } + } + return myStack.pop().floatValue(); + } + + private Float calculate(String operator, Float f1, Float f2) { + if ("+".equals(operator)) { + return f1 + f2; + } + if ("-".equals(operator)) { + return f1 - f2; + } + if ("*".equals(operator)) { + return f1 * f2; + } + if ("/".equals(operator)) { + return f1 / f2; + } + else { + throw new RuntimeException("this operator is not supported!"); + } + + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PrefixExprTest.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PrefixExprTest.java" new file mode 100644 index 0000000000..ff11cc2395 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/PrefixExprTest.java" @@ -0,0 +1,39 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/Token.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/Token.java" new file mode 100644 index 0000000000..1696dafbef --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/Token.java" @@ -0,0 +1,49 @@ +package com.ralf.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + + public static final List OPERATORS = Arrays.asList("+","-","*","/"); + private static final Map priorities = new HashMap(); + static{ + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int NUMBER = 1; + static final int OPERATOR = 2; + String value; + int type; + + public Token(String value, int type){ + this.value = value; + this.type = type; + } + public int getValue() { + + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + public boolean isNumber(){ + return type == NUMBER; + } + public boolean isOperator(){ + return type == OPERATOR; + } + public boolean hasHigherPriority(Token token){ + + if (!this.isOperator() || !token.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(token.value) > 0; + + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/TokenParser.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/TokenParser.java" new file mode 100644 index 0000000000..66206c9f11 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/TokenParser.java" @@ -0,0 +1,56 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + public TokenParser(){ + + } + public List parse(String string) { + List tokens = new ArrayList(); + int i = 0; + while(i < string.length()){ + + char ch = string.charAt(i); + if (isOperator(ch)) { + Token token = new Token(String.valueOf(ch), Token.OPERATOR); + tokens.add(token); + i++; + } + else if (Character.isDigit(ch)) { + int nextIndexOfChar = nextIndexOfOperator(i,string); + String value = string.substring(i, nextIndexOfChar); + Token token = new Token(value, Token.NUMBER); + tokens.add(token); + i = nextIndexOfChar; + } + else { + System.out.println("char:" + ch + " is not a number or operator,ignore!"); + i++; + } + + } + + + return tokens; + } + + private int nextIndexOfOperator(int i, String string) { + + while(Character.isDigit(string.charAt(i))){ + i++; + if (i == string.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char ch) { + String string = String.valueOf(ch); + return Token.OPERATORS.contains(string); + } + +} diff --git "a/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/TokenParserTest.java" "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/TokenParserTest.java" new file mode 100644 index 0000000000..3066880551 --- /dev/null +++ "b/group20/925290009/\347\254\254\344\270\203\346\254\241\344\275\234\344\270\232/data-struct/com/ralf/stack/expr/TokenParserTest.java" @@ -0,0 +1,36 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + TokenParser tokenParser = new TokenParser(); + + List list = tokenParser.parse("300*20+12*5-20/4"); + Assert.assertEquals(300, list.get(0).getValue()); + Assert.assertEquals("*", list.get(1).toString()); + Assert.assertEquals(20, list.get(2).getValue()); + Assert.assertEquals("+", list.get(3).toString()); + Assert.assertEquals(12, list.get(4).getValue()); + Assert.assertEquals("*", list.get(5).toString()); + Assert.assertEquals(5, list.get(6).getValue()); + Assert.assertEquals("-", list.get(7).toString()); + Assert.assertEquals(20, list.get(8).getValue()); + Assert.assertEquals("/", list.get(9).toString()); + Assert.assertEquals(4, list.get(10).getValue()); + + } + +} From d6e495d4434e0074d98e2ee060e1acff6cf0d640 Mon Sep 17 00:00:00 2001 From: sheng <1158154002@qq.com> Date: Sun, 23 Apr 2017 17:13:06 +0800 Subject: [PATCH 254/552] test07 --- .../src/test05/stack/StackTest.java | 2 +- .../src/test05/stack/StackUtil.java | 12 ++-- .../src/test07/expr/InfixToPostfix.java | 56 +++++++++++++++++++ .../src/test07/expr/InfixToPostfixTest.java | 12 ++++ .../src/test07/expr/PostfixExpr.java | 48 ++++++++++++++++ .../src/test07/expr/PostfixExprTest.java | 36 ++++++++++++ .../src/test07/expr/PrefixExpr.java | 49 ++++++++++++++++ .../src/test07/expr/PrefixExprTest.java | 43 ++++++++++++++ group17/1158154002/src/test07/expr/Token.java | 54 ++++++++++++++++++ .../src/test07/expr/TokenParser.java | 55 ++++++++++++++++++ .../src/test07/expr/TokenParserTest.java | 37 ++++++++++++ 11 files changed, 398 insertions(+), 6 deletions(-) create mode 100644 group17/1158154002/src/test07/expr/InfixToPostfix.java create mode 100644 group17/1158154002/src/test07/expr/InfixToPostfixTest.java create mode 100644 group17/1158154002/src/test07/expr/PostfixExpr.java create mode 100644 group17/1158154002/src/test07/expr/PostfixExprTest.java create mode 100644 group17/1158154002/src/test07/expr/PrefixExpr.java create mode 100644 group17/1158154002/src/test07/expr/PrefixExprTest.java create mode 100644 group17/1158154002/src/test07/expr/Token.java create mode 100644 group17/1158154002/src/test07/expr/TokenParser.java create mode 100644 group17/1158154002/src/test07/expr/TokenParserTest.java diff --git a/group17/1158154002/src/test05/stack/StackTest.java b/group17/1158154002/src/test05/stack/StackTest.java index b311650fff..a5d6b39344 100644 --- a/group17/1158154002/src/test05/stack/StackTest.java +++ b/group17/1158154002/src/test05/stack/StackTest.java @@ -7,7 +7,7 @@ public class StackTest { @Test public void testReverse(){ - Stack stack=new Stack(); + Stack stack=new Stack(); stack.push(1); stack.push(2); stack.push(3); diff --git a/group17/1158154002/src/test05/stack/StackUtil.java b/group17/1158154002/src/test05/stack/StackUtil.java index ead00078b6..2904bec41c 100644 --- a/group17/1158154002/src/test05/stack/StackUtil.java +++ b/group17/1158154002/src/test05/stack/StackUtil.java @@ -1,16 +1,19 @@ package test05.stack; + + public class StackUtil { /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 假设栈中的元素是T, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param */ - public static void reverse(Stack s) { - Stack temp=new Stack(); + public static void reverse(Stack s) { + Stack temp=new Stack(); while (s.peek()!=null) { temp.push(s.pop()); } - Stack temp2=new Stack(); + Stack temp2=new Stack(); while (temp.peek()!=null) { temp2.push(temp.pop()); } @@ -145,5 +148,4 @@ public static boolean isValidPairs(String s){ return stack.size() == 0; } - } diff --git a/group17/1158154002/src/test07/expr/InfixToPostfix.java b/group17/1158154002/src/test07/expr/InfixToPostfix.java new file mode 100644 index 0000000000..e88f211eb8 --- /dev/null +++ b/group17/1158154002/src/test07/expr/InfixToPostfix.java @@ -0,0 +1,56 @@ +package test07.expr; + +import java.util.ArrayList; +import java.util.List; + +import test05.stack.Stack; + +public class InfixToPostfix { + // 2+3*4-8/2 2 3 4 * + 8 2 / - + // 2+3*4-8/2+3 + // 2+3*4*5*5-8/2 2 3 4 * 5 * 5 * + 8 2 / - + // 2+3*4*5*5-8/2/2 2 3 4 * 5 * 5 * + 8 2 / - + public static List convert(String expr) { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + List result = new ArrayList(); + + Stack opStack = new Stack<>(); + for (Token token : tokens) { + + if (token.isOperator()) { + + if (opStack.isEmpty()) { + opStack.push(token); + } else { + + if (token.hasHigherPriority()&&!opStack.peek().hasHigherPriority()) { + opStack.push(token); + } else if (!token.hasHigherPriority()&&opStack.peek().hasHigherPriority()) { + if (opStack.size() > 1) { + while (opStack.size() > 0) { + result.add(opStack.pop()); + } + } + opStack.push(token); + } + else { + result.add(token); + } + } + } + if (token.isNumber()) { + result.add(token); + } + } + while (opStack.size() > 0) { + result.add(opStack.pop()); + } + for (Token token : result) { + System.out.print(token.value + " "); + } + System.out.println(); + return result; + } +} diff --git a/group17/1158154002/src/test07/expr/InfixToPostfixTest.java b/group17/1158154002/src/test07/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..eb11aae32d --- /dev/null +++ b/group17/1158154002/src/test07/expr/InfixToPostfixTest.java @@ -0,0 +1,12 @@ +package test07.expr; + +public class InfixToPostfixTest { + + public static void main(String[] args) { + //2+3*4-8/2 + //2+3*4*5*5-8/2 + InfixToPostfix.convert("2+3*4*5*5-8/2/2"); + InfixToPostfix.convert("2+3"); + } + +} diff --git a/group17/1158154002/src/test07/expr/PostfixExpr.java b/group17/1158154002/src/test07/expr/PostfixExpr.java new file mode 100644 index 0000000000..5e4e35433c --- /dev/null +++ b/group17/1158154002/src/test07/expr/PostfixExpr.java @@ -0,0 +1,48 @@ +package test07.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + Float f2=numStack.pop(); + Float f1=numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group17/1158154002/src/test07/expr/PostfixExprTest.java b/group17/1158154002/src/test07/expr/PostfixExprTest.java new file mode 100644 index 0000000000..11e17fc804 --- /dev/null +++ b/group17/1158154002/src/test07/expr/PostfixExprTest.java @@ -0,0 +1,36 @@ +package test07.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } +} diff --git a/group17/1158154002/src/test07/expr/PrefixExpr.java b/group17/1158154002/src/test07/expr/PrefixExpr.java new file mode 100644 index 0000000000..c02253ab1c --- /dev/null +++ b/group17/1158154002/src/test07/expr/PrefixExpr.java @@ -0,0 +1,49 @@ +package test07.expr; + +import java.util.List; +import java.util.Stack; + +import test05.stack.StackUtil; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack numStack = new Stack<>(); + + for (int i = tokens.size()-1; i >=0; i--) { + Token token=tokens.get(i); + if (token.isOperator()){ + Float f2=numStack.pop(); + Float f1=numStack.pop(); + numStack.push(calculate(token.toString(), f2, f1)); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group17/1158154002/src/test07/expr/PrefixExprTest.java b/group17/1158154002/src/test07/expr/PrefixExprTest.java new file mode 100644 index 0000000000..04ed04ad0a --- /dev/null +++ b/group17/1158154002/src/test07/expr/PrefixExprTest.java @@ -0,0 +1,43 @@ +package test07.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } +} diff --git a/group17/1158154002/src/test07/expr/Token.java b/group17/1158154002/src/test07/expr/Token.java new file mode 100644 index 0000000000..7cd540bb3d --- /dev/null +++ b/group17/1158154002/src/test07/expr/Token.java @@ -0,0 +1,54 @@ +package test07.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + public boolean hasHigherPriority(){ + if(!this.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) -1 > 0; + } +} diff --git a/group17/1158154002/src/test07/expr/TokenParser.java b/group17/1158154002/src/test07/expr/TokenParser.java new file mode 100644 index 0000000000..7e3a4db91b --- /dev/null +++ b/group17/1158154002/src/test07/expr/TokenParser.java @@ -0,0 +1,55 @@ +package test07.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group17/1158154002/src/test07/expr/TokenParserTest.java b/group17/1158154002/src/test07/expr/TokenParserTest.java new file mode 100644 index 0000000000..926a03e70e --- /dev/null +++ b/group17/1158154002/src/test07/expr/TokenParserTest.java @@ -0,0 +1,37 @@ +package test07.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } +} From ae3aef5cd6df307c302950dc81a4c73d9b5ad3a0 Mon Sep 17 00:00:00 2001 From: lzb Date: Sun, 23 Apr 2017 17:56:46 +0800 Subject: [PATCH 255/552] =?UTF-8?q?jvm=E7=AC=AC=E5=9B=9B=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/me/lzb/basic/InfixExpr.java | 161 --------------- .../main/java/me/lzb/basic/expr/CalUtil.java | 108 ++++++++++ .../java/me/lzb/basic/expr/InfixExpr.java | 71 +++++++ .../me/lzb/basic/expr/InfixToPostfix.java | 79 ++++++++ .../src/main/java/me/lzb/basic/expr/Node.java | 28 +++ .../java/me/lzb/basic/expr/PostfixExpr.java | 46 +++++ .../java/me/lzb/basic/expr/PrefixExpr.java | 46 +++++ .../lzb/basic/{ => expr}/InfixExprTest.java | 2 +- .../me/lzb/basic/expr/InfixToPostfixTest.java | 42 ++++ .../me/lzb/basic/expr/PostfixExprTest.java | 43 ++++ .../me/lzb/basic/expr/PrefixExprTest.java | 47 +++++ .../main/java/me/lzb/jvm/attr/CodeAttr.java | 13 +- .../main/java/me/lzb/jvm/clz/AccessFlag.java | 12 +- .../main/java/me/lzb/jvm/clz/ClassFile.java | 59 ++++-- .../main/java/me/lzb/jvm/cmd/BiPushCmd.java | 21 ++ .../java/me/lzb/jvm/cmd/ByteCodeCommand.java | 124 ++++++++++++ .../main/java/me/lzb/jvm/cmd/GetFieldCmd.java | 20 ++ .../me/lzb/jvm/cmd/GetStaticFieldCmd.java | 19 ++ .../java/me/lzb/jvm/cmd/InvokeSpecialCmd.java | 21 ++ .../java/me/lzb/jvm/cmd/InvokeVirtualCmd.java | 19 ++ .../src/main/java/me/lzb/jvm/cmd/LdcCmd.java | 29 +++ .../java/me/lzb/jvm/cmd/NewObjectCmd.java | 19 ++ .../java/me/lzb/jvm/cmd/NoOperandCmd.java | 22 ++ .../java/me/lzb/jvm/cmd/OneOperandCmd.java | 29 +++ .../main/java/me/lzb/jvm/cmd/PutFieldCmd.java | 20 ++ .../java/me/lzb/jvm/cmd/TwoOperandCmd.java | 64 ++++++ .../java/me/lzb/jvm/constant/ClassInfo.java | 7 + .../me/lzb/jvm/constant/ConstantInfo.java | 16 +- .../me/lzb/jvm/constant/FieldRefInfo.java | 7 + .../me/lzb/jvm/constant/MethodRefInfo.java | 7 + .../me/lzb/jvm/constant/NameAndTypeInfo.java | 7 + .../me/lzb/jvm/constant/NullConstantInfo.java | 7 + .../java/me/lzb/jvm/constant/StringInfo.java | 7 + .../java/me/lzb/jvm/constant/UTF8Info.java | 7 + .../me/lzb/jvm/loader/ClassFileParser.java | 8 +- .../java/me/lzb/jvm/loader/CommandParser.java | 188 ++++++++++++++++++ .../main/java/me/lzb/jvm/method/Method.java | 26 ++- .../java/me/lzb/jvm/print/ClassPrinter.java | 36 ++++ .../src/main/java/me/lzb/jvm/print/Print.java | 10 + .../java/me/lzb/jvm/print/PrintFormat.java | 57 ++++++ .../java/me/lzb/jvm/print/PrintVisitor.java | 23 +++ .../java/me/lzb/jvm/ClassFileloaderTest.java | 95 ++++++++- 42 files changed, 1472 insertions(+), 200 deletions(-) delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java rename group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/{ => expr}/InfixExprTest.java (97%) create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java deleted file mode 100644 index e30cc00cc2..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java +++ /dev/null @@ -1,161 +0,0 @@ -package me.lzb.basic; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -/** - * Created by LZB on 2017/4/15. - */ -public class InfixExpr { - - - private String expr; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - List list = processExpr(); - - Stack symbolStack = new Stack<>(); - Stack numberStack = new Stack<>(); - - boolean calLevel2 = false; - for (Node n : list) { - if (n.isNumber) { - numberStack.push(n.number); - if (calLevel2) { - calculate(symbolStack, numberStack, false); - calLevel2 = false; - } - } else { - symbolStack.push(n.symbol); - - if (n.isLevel2()) { - calLevel2 = true; - } - } - } - - - Stack tn = new Stack<>(); - int nsize = numberStack.size(); - for (int i = 0; i < nsize; i++) { - tn.push(numberStack.pop()); - } - - numberStack = tn; - - - Stack ts = new Stack<>(); - int ssize = symbolStack.size(); - for (int i = 0; i < ssize; i++) { - ts.push(symbolStack.pop()); - } - - symbolStack = ts; - - - while (!symbolStack.isEmpty()) { - calculate(symbolStack, numberStack, true); - } - - - return numberStack.pop(); - } - - - - private List processExpr() { - List list = new ArrayList<>(); - char[] array = this.expr.toCharArray(); - String number = ""; - for (int i = 0; i < array.length; i++) { - if (Character.isDigit(array[i])) { - number = number + String.valueOf(array[i]); - } else { - Node num = new Node(Float.valueOf(number), null, true, -1); - number = ""; - int calLevel = "+-".indexOf(array[i]) >= 0 ? 1 : 2; - Node sym = new Node(0, String.valueOf(array[i]), false, calLevel); - list.add(num); - list.add(sym); - } - } - - Node num = new Node(Float.valueOf(number), null, true, -1); - list.add(num); - return list; - } - - - private void calculate(Stack symbolStack, Stack numberStack, boolean isRe) { - if (symbolStack.isEmpty()) { - return; - } - - - String symbole = symbolStack.pop(); - - float right; - float left; - - if(isRe){ - left = numberStack.pop(); - right = numberStack.pop(); - }else { - right = numberStack.pop(); - left = numberStack.pop(); - } - - - - float r = calculate(symbole, left, right); - - numberStack.push(r); - } - - - private float calculate(String symbol, float left, float right) { - if ("+".equals(symbol)) { - return left + right; - } - - if ("-".equals(symbol)) { - return left - right; - } - - if ("*".equals(symbol)) { - return left * right; - } - - if ("/".equals(symbol)) { - return left / right; - } - - return 0; - } - - - private class Node { - float number; - String symbol; - boolean isNumber; - int calLevel;//加减1,乘除2 - - public Node(float number, String symbol, boolean isNumber, int calLevel) { - this.number = number; - this.symbol = symbol; - this.isNumber = isNumber; - this.calLevel = calLevel; - } - - private boolean isLevel2() { - return calLevel == 2; - } - } - -} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java new file mode 100644 index 0000000000..5b52ab0863 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java @@ -0,0 +1,108 @@ +package me.lzb.basic.expr; + +import me.lzb.common.utils.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +/** + * Created by LZB on 2017/4/20. + */ +public class CalUtil { + + + public static void calculate(Stack symbolStack, Stack numberStack, boolean isRe) { + if (symbolStack.isEmpty()) { + return; + } + + + String symbole = symbolStack.pop(); + + float right; + float left; + + if (isRe) { + left = numberStack.pop(); + right = numberStack.pop(); + } else { + right = numberStack.pop(); + left = numberStack.pop(); + } + + float r = calculate(symbole, left, right); + + numberStack.push(r); + } + + + public static float calculate(String symbol, float left, float right) { + if ("+".equals(symbol)) { + return left + right; + } + + if ("-".equals(symbol)) { + return left - right; + } + + if ("*".equals(symbol)) { + return left * right; + } + + if ("/".equals(symbol)) { + return left / right; + } + + return 0; + } + + + public static List processInfixExpr(String expr) { + List list = new ArrayList<>(); + char[] array = expr.toCharArray(); + String number = ""; + for (int i = 0; i < array.length; i++) { + if (Character.isDigit(array[i])) { + number = number + String.valueOf(array[i]); + } else { + if (StringUtils.isNotBlank(number)) { + Node num = new Node(Float.valueOf(number), null, -1); + number = ""; + list.add(num); + } + + int calLevel = 1; + + if ("*/".indexOf(array[i]) >= 0) { + calLevel = 2; + } + + if ("()".indexOf(array[i]) >= 0) { + calLevel = 3; + } + + Node sym = new Node(0, String.valueOf(array[i]), calLevel); + + list.add(sym); + } + } + if (StringUtils.isNotBlank(number)) { + Node num = new Node(Float.valueOf(number), null, -1); + list.add(num); + } + + return list; + } + + + public static boolean isLowLevel(Node stackTop, Node next) { + return stackTop.calLevel < next.calLevel; + } + + public static void main(String[] args) { + Node n = new Node(0, "*", 2); + Node m = new Node(0, "-", 1); + System.out.println(isLowLevel(n, m)); + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java new file mode 100644 index 0000000000..833ee8cfda --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java @@ -0,0 +1,71 @@ +package me.lzb.basic.expr; + +import java.util.List; +import java.util.Stack; + +/** + * 中序表达式 + * Created by LZB on 2017/4/15. + */ +public class InfixExpr { + + + private String expr; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + List list = CalUtil.processInfixExpr(expr); + + Stack symbolStack = new Stack<>(); + Stack numberStack = new Stack<>(); + + boolean calLevel2 = false; + for (Node n : list) { + if (n.isNumber()) { + numberStack.push(n.number); + if (calLevel2) { + CalUtil.calculate(symbolStack, numberStack, false); + calLevel2 = false; + } + } else { + symbolStack.push(n.symbol); + + if (n.isLevel2()) { + calLevel2 = true; + } + } + } + + + Stack tn = new Stack<>(); + int nsize = numberStack.size(); + for (int i = 0; i < nsize; i++) { + tn.push(numberStack.pop()); + } + + numberStack = tn; + + + Stack ts = new Stack<>(); + int ssize = symbolStack.size(); + for (int i = 0; i < ssize; i++) { + ts.push(symbolStack.pop()); + } + + symbolStack = ts; + + + while (!symbolStack.isEmpty()) { + CalUtil.calculate(symbolStack, numberStack, true); + } + + + return numberStack.pop(); + } + + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java new file mode 100644 index 0000000000..d9b1d3e5a6 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java @@ -0,0 +1,79 @@ +package me.lzb.basic.expr; + +import java.util.List; +import java.util.Stack; + +/** + * 中序转后序 + * Created by LZB on 2017/4/20. + */ +public class InfixToPostfix { + + private String infix; + + public InfixToPostfix(String infix) { + this.infix = infix; + } + + + public String change() { + StringBuffer sb = new StringBuffer(); + List list = CalUtil.processInfixExpr(infix); + Stack symbolStack = new Stack<>(); + + for (int i = 0; i < list.size(); i++) { + Node n = list.get(i); + //如果是数字,直接输出 + if (n.isNumber()) { + append(sb, n); + continue; + } + + //操作符部分 + + //操作符栈为空,操作符入栈 + if (symbolStack.isEmpty()) { + symbolStack.push(n); + continue; + } + + if (")".equals(n.symbol)) { + //当前操作符为),输出操作数栈内的操作符,直到遇到第一个( + while (!"(".equals(symbolStack.peek().symbol)) { + append(sb, symbolStack.pop()); + } + //遇到的第一个(, 出栈,完成一个括号 + symbolStack.pop(); + } else { + + //计算用,操作符 + //栈顶元素优先级更低,操作符入栈 + if (CalUtil.isLowLevel(symbolStack.peek(), n) || symbolStack.peek().isLevel3()) { + symbolStack.push(n); + } else { + //栈顶元素优先级高于等于当前操作符,输出操作符,直到遇到(,或者遇到优先级更低的操作符 + while (!symbolStack.isEmpty() && !symbolStack.peek().isLevel3() && !CalUtil.isLowLevel(symbolStack.peek(), n)) { + append(sb, symbolStack.pop()); + } + //当前操作符入栈 + symbolStack.push(n); + } + } + } + + + while (!symbolStack.isEmpty()) { + append(sb, symbolStack.pop()); + } + + return sb.toString().trim(); + } + + + private void append(StringBuffer sb, Node node) { + sb.append(" "); + sb.append(node.isNumber() ? (int) node.number : node.symbol); + } + + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java new file mode 100644 index 0000000000..1c698f1101 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java @@ -0,0 +1,28 @@ +package me.lzb.basic.expr; + +/** + * Created by LZB on 2017/4/20. + */ +public class Node { + float number; + String symbol; + int calLevel;//加减1,乘除2, ()3, 数字-1 + + public Node(float number, String symbol, int calLevel) { + this.number = number; + this.symbol = symbol; + this.calLevel = calLevel; + } + + public boolean isLevel2() { + return calLevel == 2; + } + + public boolean isLevel3() { + return calLevel == 3; + } + + public boolean isNumber(){ + return calLevel == -1; + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java new file mode 100644 index 0000000000..22a0db2ee0 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java @@ -0,0 +1,46 @@ +package me.lzb.basic.expr; + +import me.lzb.common.utils.StringUtils; + +import java.util.Stack; + +/** + * 后缀表达式 + * Created by LZB on 2017/4/20. + */ +public class PostfixExpr { + + private String expr; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + Stack symbolStack = new Stack<>(); + Stack numberStack = new Stack<>(); + + char[] array = this.expr.toCharArray(); + String number = ""; + for (int i = 0; i < array.length; i++) { + if (Character.isDigit(array[i])) { + number = number + String.valueOf(array[i]); + } else { + if (StringUtils.isNotBlank(number)) { + numberStack.push(Float.valueOf(number)); + number = ""; + } + if (Character.isSpaceChar(array[i])) { + + + } else { + symbolStack.push(String.valueOf(array[i])); + CalUtil.calculate(symbolStack, numberStack, false); + } + } + } + return numberStack.pop(); + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java new file mode 100644 index 0000000000..27b7b2f52d --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java @@ -0,0 +1,46 @@ +package me.lzb.basic.expr; + +import me.lzb.common.utils.StringUtils; + +import java.util.Stack; + +/** + * 前缀表达式 + * Created by LZB on 2017/4/20. + */ +public class PrefixExpr { + + private String expr; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + Stack symbolStack = new Stack<>(); + Stack numberStack = new Stack<>(); + + char[] array = this.expr.toCharArray(); + String number = ""; + for (int i = array.length - 1; i >= 0; i--) { + if (Character.isDigit(array[i])) { + number = number + String.valueOf(array[i]); + } else { + if (StringUtils.isNotBlank(number)) { + numberStack.push(Float.valueOf(number)); + number = ""; + } + if (Character.isSpaceChar(array[i])) { + + + } else { + symbolStack.push(String.valueOf(array[i])); + CalUtil.calculate(symbolStack, numberStack, true); + } + } + } + return numberStack.pop(); + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java similarity index 97% rename from group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java rename to group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java index 5ca7621354..913f6ad2ee 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.expr; import org.junit.After; import org.junit.Assert; diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..de92921b42 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java @@ -0,0 +1,42 @@ +package me.lzb.basic.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by LZB on 2017/4/20. + */ +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testChange() { + { + InfixToPostfix toPostfix = new InfixToPostfix("((2+3)*8+5+3)*6"); + Assert.assertEquals("2 3 + 8 * 5 + 3 + 6 *", toPostfix.change()); + } + + { + InfixToPostfix toPostfix = new InfixToPostfix("6*(5+(2+3)*8+3)"); + Assert.assertEquals("6 5 2 3 + 8 * + 3 + *", toPostfix.change()); + } + { + InfixToPostfix toPostfix = new InfixToPostfix("9+(3-1)*3+10/2"); + Assert.assertEquals("9 3 1 - 3 * + 10 2 / +", toPostfix.change()); + } + + { + InfixToPostfix toPostfix = new InfixToPostfix("10-2*3+50"); + Assert.assertEquals("10 2 3 * - 50 +", toPostfix.change()); + } + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java new file mode 100644 index 0000000000..4a1239bcf6 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java @@ -0,0 +1,43 @@ +package me.lzb.basic.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +/** + * 后缀表达式 + */ +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1 - 3 * + 10 2 / +"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java new file mode 100644 index 0000000000..11691cda54 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java @@ -0,0 +1,47 @@ +package me.lzb.basic.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * 前缀表达式 + */ +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java index 2addebeb39..f2f30f004f 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java @@ -1,5 +1,7 @@ package me.lzb.jvm.attr; +import me.lzb.jvm.cmd.ByteCodeCommand; + /** * Created by LZB on 2017/4/15. */ @@ -12,13 +14,20 @@ public class CodeAttr extends AttributeInfo { private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java index 224714a010..cfb4f067e8 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java @@ -18,12 +18,20 @@ public void setFlagValue(int flag) { this.flagValue = flag; } - public boolean isPublicClass(){ + public boolean isPublicClass() { return (this.flagValue & 0x0001) != 0; } - public boolean isFinalClass(){ + + public boolean isFinalClass() { return (this.flagValue & 0x0010) != 0; } + public String getFlagString(){ + if (isPublicClass()){ + return "public"; + }else { + return "not public"; + } + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java index c5de9be5ce..5fd864b8a8 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java @@ -1,8 +1,11 @@ package me.lzb.jvm.clz; +import me.lzb.jvm.constant.ClassInfo; import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.field.Field; import me.lzb.jvm.method.Method; +import me.lzb.jvm.print.Print; +import me.lzb.jvm.print.PrintVisitor; import java.util.ArrayList; import java.util.List; @@ -10,7 +13,7 @@ /** * Created by LZB on 2017/4/14. */ -public class ClassFile { +public class ClassFile implements Print{ private String magicNumber; @@ -72,7 +75,6 @@ public void setConstantPool(ConstantPool constantPool) { } - public List getFields() { return fields; } @@ -90,9 +92,6 @@ public void setMethods(List methods) { } - - - public ClassIndex getClzIndex() { return clzIndex; } @@ -102,30 +101,62 @@ public void setClzIndex(ClassIndex clzIndex) { } - public void print(){ + public void print() { - if(this.accessFlag.isPublicClass()){ - System.out.println("Access flag : public "); - } -// System.out.println("Class Name:"+ getClassName()); +// if (this.accessFlag.isPublicClass()) { +// System.out.println("Access flag : public "); +// } +// System.out.println("Class Name:" + getClassName()); // -// System.out.println("Super Class Name:"+ getSuperClassName()); +// System.out.println("Super Class Name:" + getSuperClassName()); } + public String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } - + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } public int getConstantPoolCount() { return constantPool.getSize(); } - public void addField(Field f){ + public void addField(Field f) { this.fields.add(f); } - public void addMethod(Method m){ + public void addMethod(Method m) { this.methods.add(m); } + public Method getMethod(String methodName, String paramAndReturnType) { + for (Method m : methods) { + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + + if (name.equals(methodName) && desc.equals(paramAndReturnType)) { + return m; + } + } + + return null; + } + + public Method getMainMethod() { + return getMethod("main", "([Ljava/lang/String;)V"); + } + + @Override + public void print(PrintVisitor visitor) { + visitor.visitBasicMsg(this); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..83eec1cbc7 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java @@ -0,0 +1,21 @@ +package me.lzb.jvm.cmd; + + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..07e35cb0ce --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,124 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantInfo; +import me.lzb.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static { + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + protected ByteCodeCommand(ClassFile clzFile, String opCode) { + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + protected ConstantInfo getConstantInfo(int index) { + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool() { + return this.getClassFile().getConstantPool(); + } + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + public String toString() { + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText() { + String txt = codeMap.get(opCode); + if (txt == null) { + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..a5fe80425b --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,20 @@ +package me.lzb.jvm.cmd; + + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..2d4d8d53a6 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,19 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..6af68455a0 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..5d87c07505 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,19 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..a34a64b5b0 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantInfo; +import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + value = strInfo.toString(); + } + + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; + + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..ba7d9df3a7 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd { + + public NewObjectCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..242f02716a --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,22 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand { + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); + } + + + public int getLength() { + return 1; + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..00805c5dc7 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,29 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + + public int getLength() { + return 2; + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..df00e5bb8e --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..b87faca257 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,64 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand { + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex() { + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool) { + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo) pool.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool) { + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo) this.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + } + + protected String getOperandAsField(ConstantPool pool) { + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + } + + public int getLength() { + return 3; + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java index 200e59834a..16ea736db1 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/14. */ @@ -16,6 +18,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitClassInfo(this); + } + public int getUtf8Index() { return utf8Index; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java index 3bbabf2180..e1952a7a3e 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java @@ -1,9 +1,12 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.Print; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/14. */ -public abstract class ConstantInfo { +public abstract class ConstantInfo implements Print { public static final String MAGIC_NUMBER = "cafebabe"; @@ -20,11 +23,10 @@ public abstract class ConstantInfo { public static final int Utf8_info = 1; - protected ConstantPool constantPool; - public ConstantInfo(){ + public ConstantInfo() { } @@ -35,10 +37,16 @@ public ConstantInfo(ConstantPool pool) { public ConstantPool getConstantPool() { return constantPool; } - public ConstantInfo getConstantInfo(int index){ + + public ConstantInfo getConstantInfo(int index) { return this.constantPool.getConstantInfo(index); } public abstract int getType(); + + + @Override + public abstract void print(PrintVisitor visitor); + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java index 0ebab33b39..36e77e84d9 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -17,6 +19,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitFieldRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java index 263c185af5..bd921ccf67 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -18,6 +20,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitMethodRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java index bdf158ec37..4cef60cc3f 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -18,6 +20,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitNameAndType(this); + } + public int getIndex1() { return index1; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java index 7f9debba3b..88b90ca6c1 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/14. */ @@ -9,4 +11,9 @@ public class NullConstantInfo extends ConstantInfo{ public int getType() { return -1; } + + @Override + public void print(PrintVisitor visitor) { + + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java index 8ba36d8cfc..5d5fc284af 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -16,6 +18,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitString(this); + } + public int getIndex() { return index; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java index d3f35c2fd7..9a27b3c716 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -20,6 +22,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visistUTF8(this); + } + public String getValue() { return value; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java index bfd3cbc2c0..e265907158 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java @@ -208,7 +208,7 @@ private void parserMethod(ClassFile classFile) { int attributesCount = nextBytesToInt(2); - Method method = new Method(accessFlags, nameIndex, descriptorIndex); + Method method = new Method(classFile, accessFlags, nameIndex, descriptorIndex); for (int j = 1; j <= attributesCount; j++) { @@ -239,7 +239,11 @@ private void parserCodeAttr(int attributeNameIndex, Method method, ClassFile cla int codeLength = nextBytesToInt(4); String code = nextBytesToString(codeLength); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + + //处理cmd + CommandParser commandParser = new CommandParser(code); + + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, commandParser.parse(classFile)); int exceptionTableLength = nextBytesToInt(2); if (exceptionTableLength > 0) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java new file mode 100644 index 0000000000..829b1670c7 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java @@ -0,0 +1,188 @@ +package me.lzb.jvm.loader; + +import me.lzb.common.utils.StringUtils; +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.cmd.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by LZB on 2017/4/22. + */ +public class CommandParser { + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + + private int index; + + private final char[] data; + + public CommandParser(String codes) { + if (StringUtils.isBlank(codes)) { + throw new RuntimeException("the orignal code is not correct!"); + } + codes = codes.toUpperCase(); + data = codes.toCharArray(); + } + + private char[] nextChars(int nextLength) { + char[] target = new char[nextLength]; + System.arraycopy(data, index, target, 0, nextLength); + index = index + nextLength; + return target; + } + + private int nextCharsToInt(int nextLength) { + return Integer.valueOf(String.valueOf(nextChars(nextLength)), 16).intValue(); + } + + private String nextCharsToString(int nextLength) { + return String.valueOf(nextChars(nextLength)); + } + + private boolean hasNext() { + return index < data.length; + } + + + public ByteCodeCommand[] parse(ClassFile clzFile) { + + List cmds = new ArrayList<>(); + + while (hasNext()) { + String opCode = nextCharsToString(2); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(nextCharsToInt(2)); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(nextCharsToInt(2)); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + "has not been implement."); + } + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java index 9c3e9ad984..8c35d5aec5 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java @@ -1,6 +1,8 @@ package me.lzb.jvm.method; import me.lzb.jvm.attr.CodeAttr; +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.cmd.ByteCodeCommand; /** * Created by LZB on 2017/4/15. @@ -12,11 +14,11 @@ public class Method { private CodeAttr codeAttr; -// private ClassFile clzFile; + private ClassFile clzFile; - public Method(/*ClassFile clzFile,*/ int accessFlag, int nameIndex, int descriptorIndex) { -// this.clzFile = clzFile; + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; this.accessFlag = accessFlag; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; @@ -55,11 +57,15 @@ public void setCodeAttr(CodeAttr codeAttr) { this.codeAttr = codeAttr; } -// public ClassFile getClzFile() { -// return clzFile; -// } -// -// public void setClzFile(ClassFile clzFile) { -// this.clzFile = clzFile; -// } + public ClassFile getClzFile() { + return clzFile; + } + + public void setClzFile(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java new file mode 100644 index 0000000000..0b1566669a --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java @@ -0,0 +1,36 @@ +package me.lzb.jvm.print; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantInfo; +import me.lzb.jvm.constant.ConstantPool; + +/** + * Created by LZB on 2017/4/23. + */ +public class ClassPrinter { + + private ClassFile classFile; + + private ConstantPool pool; + + public ClassPrinter(ClassFile classFile) { + this.classFile = classFile; + this.pool = classFile.getConstantPool(); + } + + + public void print() { + PrintVisitor visitor = new PrintFormat(); + + classFile.print(visitor); + + System.out.println("Constant Pool:"); + + for (int i = 1; i <= pool.getSize(); i++) { + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#" + i + " = "); + constantInfo.print(visitor); + } + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java new file mode 100644 index 0000000000..1435d46814 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java @@ -0,0 +1,10 @@ +package me.lzb.jvm.print; + +/** + * Created by LZB on 2017/4/23. + */ +public interface Print { + + public void print(PrintVisitor visitor); + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java new file mode 100644 index 0000000000..663496de8e --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java @@ -0,0 +1,57 @@ +package me.lzb.jvm.print; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.*; + +/** + * Created by LZB on 2017/4/23. + */ +public class PrintFormat implements PrintVisitor { + + + @Override + public void visitBasicMsg(ClassFile info) { + System.out.println("Access flag : " + info.getAccessFlag().getFlagString()); + + System.out.println("Class Name:" + info.getClassName()); + + System.out.println("Super Class Name:" + info.getSuperClassName()); + + System.out.println("minor version:" + info.getMinorVersion()); + + System.out.println("major version:" + info.getMajorVersion()); + + System.out.println(); + } + + + @Override + public void visistUTF8(UTF8Info info) { + System.out.println("UTF8 " + info.getValue()); + } + + @Override + public void visitClassInfo(ClassInfo info) { + System.out.println("Class #" + info.getUtf8Index() + " " + info.getClassName()); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + System.out.println("FieldRef #" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + System.out.println("MethodRef #" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + System.out.println("NameAndType #" + info.getIndex1() + ":#" + info.getIndex2()); + } + + @Override + public void visitString(StringInfo info) { + System.out.println("String #" + info.getIndex()); + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java new file mode 100644 index 0000000000..6d846786bc --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java @@ -0,0 +1,23 @@ +package me.lzb.jvm.print; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.*; + +/** + * Created by LZB on 2017/4/23. + */ +public interface PrintVisitor { + public void visitBasicMsg(ClassFile info); + + public void visitClassInfo(ClassInfo info); + + public void visitFieldRef(FieldRefInfo info); + + public void visitMethodRef(MethodRefInfo info); + + public void visitNameAndType(NameAndTypeInfo info); + + public void visitString(StringInfo info); + + public void visistUTF8(UTF8Info info); +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java index f41b313c97..b4adbcf888 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java @@ -3,10 +3,15 @@ import me.lzb.common.utils.ByteUtils; import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.clz.ClassIndex; +import me.lzb.jvm.cmd.BiPushCmd; +import me.lzb.jvm.cmd.ByteCodeCommand; +import me.lzb.jvm.cmd.OneOperandCmd; +import me.lzb.jvm.cmd.TwoOperandCmd; import me.lzb.jvm.constant.*; import me.lzb.jvm.field.Field; import me.lzb.jvm.loader.ClassFileLoader; import me.lzb.jvm.method.Method; +import me.lzb.jvm.print.ClassPrinter; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -20,13 +25,11 @@ public class ClassFileloaderTest { static String path1 = EmployeeV1.class.getResource("/").getPath(); -// static String path1 = "D:\\code\\learning\\coding2017\\group24\\1148285693\\learning2017\\mini-jvm\\target\\test-classes\\"; static String path2 = "C:\\temp"; static String className = "me.lzb.jvm.EmployeeV1"; private static final String FULL_QUALIFIED_CLASS_NAME = "me/lzb/jvm/EmployeeV1"; -// private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; @Before @@ -43,8 +46,8 @@ public void testPath() { String s = EmployeeV1.class.getResource("/").getPath(); String s2 = EmployeeV1.class.getResource("").getPath(); - System.out.println(s); - System.out.println(s2); +// System.out.println(s); +// System.out.println(s2); } @@ -266,4 +269,88 @@ private void assertMethodEquals(ConstantPool pool, Method m, String expectedName Assert.assertEquals(expectedCode, code); } + /** + * 第四次JVM + */ + + + @Test + public void testByteCodeCommand() { + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #1", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #2", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #3", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #2", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #4", cmds[0]); + assertOpCodeEquals("3: ldc #5", cmds[1]); + assertOpCodeEquals("5: invokevirtual #6", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand[] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #7", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #8", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #9", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #10", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd) { + + String acctual = cmd.getOffset() + ": " + cmd.getReadableCodeText(); + + if (cmd instanceof OneOperandCmd) { + if (cmd instanceof BiPushCmd) { + acctual += " " + ((OneOperandCmd) cmd).getOperand(); + } else { + acctual += " #" + ((OneOperandCmd) cmd).getOperand(); + } + } + if (cmd instanceof TwoOperandCmd) { + acctual += " #" + ((TwoOperandCmd) cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + @Test + public void testPrint() { + ClassPrinter classPrinter = new ClassPrinter(clzFile); + classPrinter.print(); + } } From 80c5c9b174c99569c7e83360f6758dddf90180a9 Mon Sep 17 00:00:00 2001 From: HuiZhou-Xmu <1814014897@qq.com> Date: Sun, 23 Apr 2017 19:34:20 +0800 Subject: [PATCH 256/552] =?UTF-8?q?=E7=AC=AC=E5=85=AD=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhouhui/src/week06/expr/InfixExpr.java | 150 ++++++++++ .../src/week06/expr/InfixExprTest.java | 48 +++ .../src/week06/jvm/attr/AttributeInfo.java | 19 ++ .../zhouhui/src/week06/jvm/attr/CodeAttr.java | 93 ++++++ .../src/week06/jvm/attr/LineNumberTable.java | 54 ++++ .../week06/jvm/attr/LocalVariableItem.java | 39 +++ .../week06/jvm/attr/LocalVariableTable.java | 44 +++ .../src/week06/jvm/attr/StackMapTable.java | 30 ++ .../src/week06/jvm/clz/AccessFlag.java | 25 ++ .../zhouhui/src/week06/jvm/clz/ClassFile.java | 92 ++++++ .../src/week06/jvm/clz/ClassIndex.java | 19 ++ .../src/week06/jvm/constant/ClassInfo.java | 24 ++ .../src/week06/jvm/constant/ConstantInfo.java | 29 ++ .../src/week06/jvm/constant/ConstantPool.java | 29 ++ .../src/week06/jvm/constant/FieldRefInfo.java | 54 ++++ .../week06/jvm/constant/MethodRefInfo.java | 55 ++++ .../week06/jvm/constant/NameAndTypeInfo.java | 45 +++ .../week06/jvm/constant/NullConstantInfo.java | 13 + .../src/week06/jvm/constant/StringInfo.java | 26 ++ .../src/week06/jvm/constant/UTF8Info.java | 32 ++ .../zhouhui/src/week06/jvm/field/Field.java | 45 +++ .../week06/jvm/loader/ByteCodeIterator.java | 55 ++++ .../week06/jvm/loader/ClassFileLoader.java | 140 +++++++++ .../week06/jvm/loader/ClassFileParser.java | 174 +++++++++++ .../zhouhui/src/week06/jvm/method/Method.java | 76 +++++ .../week06/jvm/test/ClassFileloaderTest.java | 273 ++++++++++++++++++ .../src/week06/jvm/test/EmployeeV1.java | 28 ++ .../zhouhui/src/week06/jvm/util/Util.java | 24 ++ 28 files changed, 1735 insertions(+) create mode 100644 group01/1814014897/zhouhui/src/week06/expr/InfixExpr.java create mode 100644 group01/1814014897/zhouhui/src/week06/expr/InfixExprTest.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/attr/AttributeInfo.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/attr/CodeAttr.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/attr/LineNumberTable.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/attr/LocalVariableItem.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/attr/LocalVariableTable.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/attr/StackMapTable.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/clz/AccessFlag.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/clz/ClassFile.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/clz/ClassIndex.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/ClassInfo.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/ConstantInfo.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/ConstantPool.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/FieldRefInfo.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/MethodRefInfo.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/NameAndTypeInfo.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/NullConstantInfo.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/StringInfo.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/constant/UTF8Info.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/field/Field.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/loader/ByteCodeIterator.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/loader/ClassFileLoader.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/loader/ClassFileParser.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/method/Method.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/test/ClassFileloaderTest.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/test/EmployeeV1.java create mode 100644 group01/1814014897/zhouhui/src/week06/jvm/util/Util.java diff --git a/group01/1814014897/zhouhui/src/week06/expr/InfixExpr.java b/group01/1814014897/zhouhui/src/week06/expr/InfixExpr.java new file mode 100644 index 0000000000..eebc672005 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/expr/InfixExpr.java @@ -0,0 +1,150 @@ +package week06.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + float result = 0; + + Stack operandStack = new Stack(); // 运算数栈 + Stack operaterStack = new Stack(); // 运算符栈 + + char[] exprCharArr = expr.toCharArray(); + List exprStringList = new ArrayList(); + addOperandAndOperater(exprCharArr, exprStringList); + + for (int i = 0; i < exprStringList.size(); i++) { + if (isOperand(exprStringList.get(i))) { + operandStack.push(exprStringList.get(i)); + } else if (isOperater(exprStringList.get(i))) { + operaterStack.push(exprStringList.get(i)); + } else { + throw new RuntimeException("this operater has not yet implemented."); + } + + if (operaterStack.size() == 2) { + + String operater_1 = (String) operaterStack.pop(); + String operater_2 = (String) operaterStack.pop(); + if (hasTheSameOrHighPriority(operater_2, operater_1)) { + + String operand_1 = (String) operandStack.pop(); + String operand_2 = (String) operandStack.pop(); + operation(operandStack, operater_2, operand_1, operand_2); + + operaterStack.push(operater_1); + } else if (hasTheLowPriority(operater_2, operater_1)) { + + operandStack.push(exprStringList.get(++i)); + String operand_1 = (String) operandStack.pop(); + String operand_2 = (String) operandStack.pop(); + operation(operandStack, operater_1, operand_1, operand_2); + + operaterStack.push(operater_2); + } + } + + if (i == exprStringList.size() - 1) { + + String operater = (String) operaterStack.pop(); + String operand_1 = (String) operandStack.pop(); + String operand_2 = (String) operandStack.pop(); + operation(operandStack, operater, operand_1, operand_2); + + result = (float) Integer.parseInt((String) operandStack.pop()); + } + } + + return result; + } + + private void addOperandAndOperater(char[] exprCharArr, List exprStringList) { + for (int i = 0; i < exprCharArr.length; i++) { + if (isOperand(exprCharArr[i])) { + StringBuilder sb = new StringBuilder(); + sb.append(exprCharArr[i]); + if (i < exprCharArr.length - 1) { + while (i < exprCharArr.length - 1 && isOperand(exprCharArr[i + 1])) { + sb.append(exprCharArr[i + 1]); + i++; + } + } + exprStringList.add(sb.toString()); + } else if (isOperater(exprCharArr[i])) { + exprStringList.add(exprCharArr[i] + ""); + } + } + } + + private boolean isOperand(char c) { + return !isOperater(c); + } + + private boolean isOperater(char c) { + if (c == '+' || c == '-' || c == '*' || c == '/') { + return true; + } + return false; + } + + private boolean isOperand(String c) { + return !isOperater(c); + } + + // 字符串相等用equals()比较. + private boolean isOperater(String c) { + if (c.equals("+") || c.equals("-") || c.equals("*") || c.equals("/")) { + return true; + } + return false; + } + + // operater_1 has the same or high priority compare with the operater_2. + private boolean hasTheSameOrHighPriority(Object operater_1, Object operater_2) { + if ((operater_1.equals("+") && operater_2.equals("+")) || (operater_1.equals("+") && operater_2.equals("-")) + || (operater_1.equals("-") && operater_2.equals("+")) + || (operater_1.equals("-") && operater_2.equals("-")) + || (operater_1.equals("*") && operater_2.equals("*")) + || (operater_1.equals("*") && operater_2.equals("/")) + || (operater_1.equals("/") && operater_2.equals("*")) + || (operater_1.equals("/") && operater_2.equals("/")) + || (operater_1.equals("*") && operater_2.equals("+")) + || (operater_1.equals("*") && operater_2.equals("-")) + || (operater_1.equals("/") && operater_2.equals("+")) + || (operater_1.equals("/") && operater_2.equals("-"))) { + return true; + } + return false; + } + + //// operater_1 has the low priority compare with the operater_2. + private boolean hasTheLowPriority(Object operater_1, Object operater_2) { + if ((operater_1.equals("+") && operater_2.equals("*")) || (operater_1.equals("+") && operater_2.equals("/")) + || (operater_1.equals("-") && operater_2.equals("*")) + || (operater_1.equals("-") && operater_2.equals("/"))) { + return true; + } + return false; + } + + private void operation(Stack operandStack, String operater, String operand_1, String operand_2) { + if (operater.equals("+")) { + operandStack.push((Integer.parseInt(operand_2) + Integer.parseInt(operand_1)) + ""); + } else if (operater.equals("-")) { + operandStack.push((Integer.parseInt(operand_2) - Integer.parseInt(operand_1)) + ""); + } else if (operater.equals("*")) { + operandStack.push((Integer.parseInt(operand_2) * Integer.parseInt(operand_1)) + ""); + } else if (operater.equals("/")) { + operandStack.push((Integer.parseInt(operand_2) / Integer.parseInt(operand_1)) + ""); + } + } + +} diff --git a/group01/1814014897/zhouhui/src/week06/expr/InfixExprTest.java b/group01/1814014897/zhouhui/src/week06/expr/InfixExprTest.java new file mode 100644 index 0000000000..8ce2c7d1de --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package week06.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/attr/AttributeInfo.java b/group01/1814014897/zhouhui/src/week06/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..80a7b0aa5e --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package week06.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/attr/CodeAttr.java b/group01/1814014897/zhouhui/src/week06/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..de2ed92a6e --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/attr/CodeAttr.java @@ -0,0 +1,93 @@ +package week06.jvm.attr; + +import week06.jvm.clz.ClassFile; +import week06.jvm.constant.ConstantPool; +import week06.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + // private ByteCodeCommand[] cmds ; + // public ByteCodeCommand[] getCmds() { + // return cmds; + // } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, + String code /* ByteCodeCommand[] cmds */) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + // this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + + int exceptionTableLen = iter.nextU2ToInt(); + + if (exceptionTableLen > 0) { + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table,just ignore it"); + } + + int subAttrCount = iter.nextU2ToInt(); + + for (int i = 1; i <= subAttrCount; i++) { + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + iter.back(2); + + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + } + + return codeAttr; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/attr/LineNumberTable.java b/group01/1814014897/zhouhui/src/week06/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..4a31d1ebbe --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/attr/LineNumberTable.java @@ -0,0 +1,54 @@ +package week06.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import week06.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index, len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1;i<=itemLen;i++){ + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/attr/LocalVariableItem.java b/group01/1814014897/zhouhui/src/week06/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..2c1c056d86 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package week06.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/attr/LocalVariableTable.java b/group01/1814014897/zhouhui/src/week06/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..73140faa4e --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/attr/LocalVariableTable.java @@ -0,0 +1,44 @@ +package week06.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import week06.jvm.constant.ConstantPool; + +import week06.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index, len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1;i<=itemLen;i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + + return table; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/attr/StackMapTable.java b/group01/1814014897/zhouhui/src/week06/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..2580f1b7aa --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package week06.jvm.attr; + + +import week06.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/clz/AccessFlag.java b/group01/1814014897/zhouhui/src/week06/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..8e313e8fb1 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/clz/ClassFile.java b/group01/1814014897/zhouhui/src/week06/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..029f680c9b --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/clz/ClassFile.java @@ -0,0 +1,92 @@ +package week06.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import week06.jvm.constant.ClassInfo; +import week06.jvm.constant.ConstantPool; +import week06.jvm.field.Field; +import week06.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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/group01/1814014897/zhouhui/src/week06/jvm/clz/ClassIndex.java b/group01/1814014897/zhouhui/src/week06/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..854ad0aca7 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/constant/ClassInfo.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..bfd827374f --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/constant/ConstantInfo.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..a3efac308d --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/constant/ConstantPool.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..347ddbbde9 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/constant/FieldRefInfo.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..4c1840b3d7 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/constant/MethodRefInfo.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..da4f98b9b6 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/constant/NameAndTypeInfo.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..28d6de6325 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/constant/NullConstantInfo.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..faf8d31e45 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package week06.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/constant/StringInfo.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..caaca2847b --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/constant/UTF8Info.java b/group01/1814014897/zhouhui/src/week06/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..000c47bd1a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/field/Field.java b/group01/1814014897/zhouhui/src/week06/jvm/field/Field.java new file mode 100644 index 0000000000..09cc693300 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/field/Field.java @@ -0,0 +1,45 @@ +package week06.jvm.field; + +import week06.jvm.constant.ConstantPool; +import week06.jvm.constant.UTF8Info; +import week06.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + System.out.println("attribCount:"+attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex, pool); + + if (attribCount > 0) { + throw new RuntimeException("Field Attribute has not been implemented"); + } + return f; + } + + public String toString(){ + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + return name + ":" + desc; + } + +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/loader/ByteCodeIterator.java b/group01/1814014897/zhouhui/src/week06/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..5f3dceb30c --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,55 @@ +package week06.jvm.loader; + +import java.util.Arrays; + +import week06.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/loader/ClassFileLoader.java b/group01/1814014897/zhouhui/src/week06/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..0a3c96e78a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package week06.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 week06.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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + +} diff --git a/group01/1814014897/zhouhui/src/week06/jvm/test/EmployeeV1.java b/group01/1814014897/zhouhui/src/week06/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..3e5fb09863 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package week06.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/group01/1814014897/zhouhui/src/week06/jvm/util/Util.java b/group01/1814014897/zhouhui/src/week06/jvm/util/Util.java new file mode 100644 index 0000000000..94670540d1 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week06/jvm/util/Util.java @@ -0,0 +1,24 @@ +package week06.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 Date: Sun, 23 Apr 2017 19:50:47 +0800 Subject: [PATCH 257/552] =?UTF-8?q?0327=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/coding_170327/LRUPageFrame.java | 152 ++++++++++++++++++ .../coding_170327/loader/ClassFileLoader.java | 58 +++++++ 2 files changed, 210 insertions(+) create mode 100644 group11/729245768/DataStructure/src/main/coding_170327/LRUPageFrame.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170327/loader/ClassFileLoader.java diff --git a/group11/729245768/DataStructure/src/main/coding_170327/LRUPageFrame.java b/group11/729245768/DataStructure/src/main/coding_170327/LRUPageFrame.java new file mode 100644 index 0000000000..bad990fa9a --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170327/LRUPageFrame.java @@ -0,0 +1,152 @@ +package main.coding_170327; + +import java.util.ArrayList; + +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.capacity = capacity; + this.currentSize = 0; + first = new Node(); + last = new Node(); + } + + /** + * 获取缓存中对象 + * + * @param pageNum + * @return + */ + public void access(int pageNum) { + if(isEmpty()){ + //显然是最新数据 + Node node = new Node(); + node.pageNum = pageNum; + addNewNodetoHead(node); + }else{ + Node node = find(pageNum); + if(node==null){ + node = new Node(); + node.pageNum = pageNum; + addNewNodetoHead(node); + }else{ + moveExistingNodeToHead(node); + } + + } + + } + + private void addNewNodetoHead(Node node) { + if(this.currentSize==0){ + // 表示这是第一个节点 + first.next = node; + node.prev = first; + node.next = last; + last.prev = node; + this.currentSize++; + } else { + if(this.currentSize==capacity) + removeLast(); + node.prev = first; + node.next = first.next; + first.next.prev = node; + first.next = node; + this.currentSize++; + } + + } + + private Node find(int data){ + Node compareNode = first.next; + while (compareNode!=last){ + if(data==compareNode.pageNum) + break; + compareNode = compareNode.next; + } + if(compareNode!=last){ + Node node = new Node(); + node.pageNum = data; + return node; + } + return null; + + } + + + + + + + /** + * 删除链表尾部节点 表示 删除最少使用的缓存对象 + */ + private void removeLast() { + Node remove = last.prev; + remove.prev.next = last; + last.prev = remove.prev; + this.currentSize--; + } + + /** + * 移动到链表头,表示这个节点是最新使用过的 + * + * @param node + */ + private void moveExistingNodeToHead(Node node) { + if(this.currentSize>1){ + //如果当前元素只有一个显然不需要移动 + Node compareNode = first.next; + //从头比较,找出node节点的位置,将其前移到开头 + while (compareNode!=last){ + if(compareNode.pageNum==node.pageNum)break; + compareNode = compareNode.next; + } + //删除当前node + compareNode.prev.next = compareNode.next; + compareNode.next.prev = compareNode.prev; + //将node插入到开头位置 + node.prev = first; + node.next = first.next; + first.next.prev = node; + first.next = node; + } + } + private boolean isEmpty(){ + return this.currentSize>0?false:true; + } + + public String toString(){ + ArrayList arrays = new ArrayList<>(); + if(this.currentSize>0){ + Node index = first.next; + while (index!=last){ + arrays.add(index.pageNum); + index = index.next; + } + return arrays.toString(); + } + return ""; + } + + + +} + diff --git a/group11/729245768/DataStructure/src/main/coding_170327/loader/ClassFileLoader.java b/group11/729245768/DataStructure/src/main/coding_170327/loader/ClassFileLoader.java new file mode 100644 index 0000000000..10cc7b400b --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170327/loader/ClassFileLoader.java @@ -0,0 +1,58 @@ +package main.coding_170327.loader; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/20. + */ +public class ClassFileLoader { + private List clzPaths = new ArrayList<>(); + + public byte[] readBinaryCodes(String className){ + className = className.replace('.', File.separatorChar)+".class"; + for(String singlePath:clzPaths){ + String clzFileName = singlePath + File.separatorChar +className; + byte[] codes = loadClassFile(clzFileName); + if(codes!=null){ + return codes; + } + } + return null; + } + public byte[] loadClassFile(String clzFileName){ + File file = new File(clzFileName); + + try { + return IOUtils.toByteArray(new FileInputStream(file)); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + public void addClassPath(String path){ + if(this.clzPaths.contains(path)){ + return; + } + clzPaths.add(path); + } + public String getClassPath_V1(){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Sun, 23 Apr 2017 20:05:12 +0800 Subject: [PATCH 258/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/coding_170409/StackUtil.java | 125 ++++++++++++++++++ .../coding_170409/jvm/constant/ClassInfo.java | 32 +++++ .../jvm/constant/ConstantInfo.java | 33 +++++ .../jvm/constant/ConstantPool.java | 26 ++++ .../jvm/constant/FieldRefInfo.java | 57 ++++++++ .../jvm/constant/MethodRefInfo.java | 59 +++++++++ .../jvm/constant/NameAndTypeInfo.java | 53 ++++++++ .../jvm/constant/NullConstantInfo.java | 16 +++ .../jvm/constant/StringInfo.java | 31 +++++ .../coding_170409/jvm/constant/UTF8Info.java | 40 ++++++ .../jvm/loader/ByteCodeIterator.java | 54 ++++++++ .../jvm/loader/ClassFileLoader.java | 91 +++++++++++++ .../jvm/loader/ClassFileParse.java | 83 ++++++++++++ .../src/main/coding_170409/jvm/util/Util.java | 25 ++++ 14 files changed, 725 insertions(+) create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/StackUtil.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/ClassInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/ConstantInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/ConstantPool.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/FieldRefInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/MethodRefInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/NameAndTypeInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/NullConstantInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/StringInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/UTF8Info.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/loader/ByteCodeIterator.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/loader/ClassFileLoader.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/loader/ClassFileParse.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170409/jvm/util/Util.java diff --git a/group11/729245768/DataStructure/src/main/coding_170409/StackUtil.java b/group11/729245768/DataStructure/src/main/coding_170409/StackUtil.java new file mode 100644 index 0000000000..b46cd21551 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170409/StackUtil.java @@ -0,0 +1,125 @@ +package main.coding_170409; + +import java.util.Stack; + +/** + * Created by peter on 2017/4/21. + */ +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) { + if (s == null || s.isEmpty()) { + return; + } + Stack temp = new Stack<>(); + while (!s.isEmpty()) { + temp.push(s.pop()); + } + while (!temp.isEmpty()) { + addToBottom(s, temp.pop()); + } + + } + + public static void addToBottom(Stack s, Integer value) { + if (s.isEmpty()) { + s.push(value); + } else { + Integer top = s.pop(); + addToBottom(s, value); + s.push(top); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + if (s == null || s.isEmpty()) { + return; + } else { + Stack stack = new Stack<>(); + while (!s.isEmpty()) { + Object data = s.pop(); + if (data != o) { + stack.push(o); + } else { + break; + } + } + while (!stack.isEmpty()) { + s.push(stack.pop()); + } + } + + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + + if (s == null || s.isEmpty() || s.size() < len || len <= 0) { + return null; + } + + Stack tmpStack = new Stack(); + int i = 0; + Object[] result = new Object[len]; + while (!s.isEmpty()) { + Object value = s.pop(); + tmpStack.push(value); + result[i++] = value; + if (i == len) { + break; + } + } + while (!tmpStack.isEmpty()) { + s.push(tmpStack.pop()); + } + return result; + } + + /** + * 字符串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) { + Stack stack = new Stack(); + for(int i=0;i constantInfos = new ArrayList<>(); + + public ConstantPool(){} + + public void addConstantInfo(ConstantInfo constantInfo){ + this.constantInfos.add(constantInfo); + } + public ConstantInfo getConstantInfo(int index){ + return this.constantInfos.get(index); + } + public String getUTF8String(int index){ + return ((UTF8Info)this.constantInfos.get(index)).getValue(); + } + public Object getSizes(){ + return this.constantInfos.size()-1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/FieldRefInfo.java b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..3237e30cd3 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/FieldRefInfo.java @@ -0,0 +1,57 @@ +package main.coding_170409.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class FieldRefInfo extends ConstantInfo { + private int type = ConstantInfo.FIELD_INFO; + private int classInfoIndex; + private int nameAndTypeIndex; + + public FieldRefInfo(ConstantPool pool) { + super(pool); + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + public int getClassInfoIndex() { + return classInfoIndex; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + @Override + 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(); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/MethodRefInfo.java b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7731ab9374 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/MethodRefInfo.java @@ -0,0 +1,59 @@ +package main.coding_170409.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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 getClassInfoIndex() { + return classInfoIndex; + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + @Override + 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(); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/NameAndTypeInfo.java b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..476fc48b57 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,53 @@ +package main.coding_170409.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class NameAndTypeInfo extends ConstantInfo { + public int type = ConstantInfo.NAME_AND_TYPE_INFO; + + private int indexA; + private int indexB; + + public NameAndTypeInfo(ConstantPool pool){ + super(pool); + } + + public int getIndexA() { + return indexA; + } + + public int getIndexB() { + return indexB; + } + + public void setIndexA(int indexA) { + this.indexA = indexA; + } + + public void setIndexB(int indexB) { + this.indexB = indexB; + } + + public String getName(){ + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(indexA); + return utf8Info.getValue(); + } + + public String getTypeInfo(){ + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8_info =(UTF8Info) pool.getConstantInfo(indexB); + return utf8_info.getValue(); + } + + @Override + public String toString() { + return "("+getName()+","+getTypeInfo()+")"; + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/NullConstantInfo.java b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..de967e29b5 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/NullConstantInfo.java @@ -0,0 +1,16 @@ +package main.coding_170409.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/StringInfo.java b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..7bf8ecd14a --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/StringInfo.java @@ -0,0 +1,31 @@ +package main.coding_170409.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class StringInfo extends ConstantInfo { + private int type = ConstantInfo.STRING_INFO; + private int index; + + public StringInfo(ConstantPool pool) { + super(pool); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + @Override + public String toString() { + return this.getConstantPool().getUTF8String(index); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/UTF8Info.java b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..69978afbfc --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170409/jvm/constant/UTF8Info.java @@ -0,0 +1,40 @@ +package main.coding_170409.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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 String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + "]"; + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170409/jvm/loader/ByteCodeIterator.java b/group11/729245768/DataStructure/src/main/coding_170409/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..1451c60491 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170409/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,54 @@ +package main.coding_170409.jvm.loader; + +import main.coding_170409.jvm.util.Util; + +import java.util.Arrays; + +/** + * Created by peter on 2017/4/21. + */ +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + public byte[] getBytes(int len){ + if(pos+len>=codes.length){ + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes,pos,pos+len); + pos+=len; + return data; + } + + public int nextU1ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); + } + + public int nextU4ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public String nextU4ToHexString(){ + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos]++,codes[pos++]}); + } + + public String nextUxToHexString(int len){ + byte[] temp = new byte[len]; + + for(int i=0;i clzPaths = new ArrayList<>(); + public byte[] readBinaryCode(String className){ + className = className.replace('.', File.pathSeparatorChar) +".class"; + for (String path:this.clzPaths){ + String clzFileName = path + File.separatorChar + className; + byte[] codes = loadClassFile(clzFileName); + if(codes!=null){ + return codes; + } + } + return null; + } + + public 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(clzPaths.contains(path)){ + return; + } + clzPaths.add(path); + } + + public String getClassPath(){ + return StringUtils.join(this.clzPaths,";"); + } + public ConstantPool loadClass(String className){ + byte[] codes = this.readBinaryCode(className); + ClassFileParse parser = new ClassFileParse(); + return parser.parse(codes); + } + public String getClassPath_V1(){ + StringBuffer sb = new StringBuffer(); + for(int i=0;i Date: Sun, 23 Apr 2017 20:07:03 +0800 Subject: [PATCH 259/552] =?UTF-8?q?jvm=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/coding_170416/InfixExpr.java | 95 ++++++++++++ .../coding_170416/jvm/attr/AttributeInfo.java | 21 +++ .../main/coding_170416/jvm/attr/CodeAttr.java | 93 ++++++++++++ .../jvm/attr/LineNumberTable.java | 68 +++++++++ .../jvm/attr/LocalVariableItem.java | 52 +++++++ .../jvm/attr/LocalVariableTable.java | 50 +++++++ .../coding_170416/jvm/attr/StackMapTable.java | 23 +++ .../coding_170416/jvm/clz/AccessFlag.java | 28 ++++ .../main/coding_170416/jvm/clz/ClassFile.java | 92 ++++++++++++ .../coding_170416/jvm/clz/ClassIndex.java | 25 ++++ .../coding_170416/jvm/constant/ClassInfo.java | 32 ++++ .../jvm/constant/ConstantInfo.java | 33 +++++ .../jvm/constant/ConstantPool.java | 26 ++++ .../jvm/constant/FieldRefInfo.java | 57 +++++++ .../jvm/constant/MethodRefInfo.java | 59 ++++++++ .../jvm/constant/NameAndTypeInfo.java | 53 +++++++ .../jvm/constant/NullConstantInfo.java | 16 ++ .../jvm/constant/StringInfo.java | 31 ++++ .../coding_170416/jvm/constant/UTF8Info.java | 40 +++++ .../main/coding_170416/jvm/field/Field.java | 44 ++++++ .../jvm/loader/ByteCodeIterator.java | 54 +++++++ .../jvm/loader/ClassFileLoader.java | 91 ++++++++++++ .../jvm/loader/ClassFileParse.java | 140 ++++++++++++++++++ .../main/coding_170416/jvm/method/Method.java | 83 +++++++++++ .../src/main/coding_170416/jvm/util/Util.java | 25 ++++ 25 files changed, 1331 insertions(+) create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/InfixExpr.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/AttributeInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/CodeAttr.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LineNumberTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LocalVariableItem.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LocalVariableTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/StackMapTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/AccessFlag.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/ClassFile.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/ClassIndex.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ClassInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ConstantInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ConstantPool.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/FieldRefInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/MethodRefInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/NameAndTypeInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/NullConstantInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/StringInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/UTF8Info.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/field/Field.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/loader/ByteCodeIterator.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/loader/ClassFileLoader.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/loader/ClassFileParse.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/method/Method.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170416/jvm/util/Util.java diff --git a/group11/729245768/DataStructure/src/main/coding_170416/InfixExpr.java b/group11/729245768/DataStructure/src/main/coding_170416/InfixExpr.java new file mode 100644 index 0000000000..0e33c27527 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/InfixExpr.java @@ -0,0 +1,95 @@ +package main.coding_170416; + +import java.util.Stack; + +/** + * Created by peter on 2017/4/23. + */ +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evalute() { + Stack operator = new Stack<>();//存储操作数 + Stack opeCharacter = new Stack<>();//存储运算符 + StringBuffer sb = new StringBuffer("");//存储获取到的操作数 + int index = 0;// + while (index < expr.length()) { + + Character ch = expr.charAt(index); + if (!Character.isDigit(ch) && opeCharacter.size() == 0) { + opeCharacter.push(ch); + operator.push(Float.parseFloat(sb.toString())); + sb = new StringBuffer(""); + index++; + continue; + } + switch (ch) { + case '+': + case '-': + operator.push(Float.parseFloat(sb.toString())); + sb = new StringBuffer(""); + Character top = opeCharacter.pop(); + float op2 = operator.pop(); + float op1 = operator.pop(); + switch (top) { + case '+': + operator.push(op1 + op2); + break; + case '-': + operator.push(op1 - op2); + break; + case '*': + operator.push(op1 * op2); + break; + case '/': + operator.push(op1 / op2); + break; + } + opeCharacter.push(ch); + break; + case '*': + case '/': + operator.push(Float.parseFloat(sb.toString())); + sb = new StringBuffer(""); + Character top1 = opeCharacter.peek(); + if (top1 == '+' || top1 == '-') { + opeCharacter.push(ch); + } else { + opeCharacter.pop(); + float ope2 = operator.pop(); + float ope1 = operator.pop(); + if (top1 == '*') { + operator.push(ope1 * ope2); + } else { + operator.push(ope1 / ope2); + } + opeCharacter.push(ch); + } + break; + default: + sb.append(ch); + } + index++; + if (index == expr.length()) { + operator.push(Float.parseFloat(sb.toString())); + } + } + //计算运算符栈剩余的操作符 + while (opeCharacter.size()>0){ + float last2 = operator.pop(); + float last1 = operator.pop(); + switch (opeCharacter.pop()){ + case '+': operator.push(last1 + last2) ;break; + case '-': operator.push(last1 - last2);break; + case '*': operator.push(last1 * last2);break; + case '/': operator.push(last1/last2); + } + } + + return operator.pop(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/AttributeInfo.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..199df4ccc9 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/AttributeInfo.java @@ -0,0 +1,21 @@ +package main.coding_170416.jvm.attr; + +/** + * Created by peter on 2017/4/21. + */ +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVaribleTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex,int attrLen){ + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/CodeAttr.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..4a17d9cc2b --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/CodeAttr.java @@ -0,0 +1,93 @@ +package main.coding_170416.jvm.attr; + +import main.coding_170416.jvm.clz.ClassFile; +import main.coding_170416.jvm.constant.ConstantPool; +import main.coding_170416.jvm.loader.ByteCodeIterator; + +/** + * Created by peter on 2017/4/21. + */ +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private LineNumberTable lineNumberTable; + private LocalVariableTable localVariableTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + } + + public void setLineNumberTable(LineNumberTable table) { + this.lineNumberTable = table; + } + + public void setLocalVariableTable(LocalVariableTable table) { + this.localVariableTable = table; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iterator) { + int attrNameIndex = iterator.nextU2ToInt(); + int attrLen = iterator.nextU4ToInt(); + int maxStack = iterator.nextU2ToInt(); + int maxLocals = iterator.nextU2ToInt(); + int codeLen = iterator.nextU4ToInt(); + + String code = iterator.nextUxToHexString(codeLen); + + System.out.println(code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + int exceptionTableLen = iterator.nextU2ToInt(); + //deal with exception + if (exceptionTableLen > 0) { + String exceptionTable = iterator.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table:just ignore " + exceptionTable); + } + int subAttrCount = iterator.nextU2ToInt(); + for (int i = 1; i < subAttrCount; i++) { + int subAttrIndex = iterator.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + iterator.back(2); + + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + LineNumberTable t = LineNumberTable.parse(iterator); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iterator); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iterator); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + } + return codeAttr; + } + + public String toString(ConstantPool pool) { + StringBuilder sb = new StringBuilder(); + sb.append("Code:").append(code).append("\n"); + sb.append("\n"); + sb.append(this.lineNumberTable.toString()); + sb.append(this.localVariableTable.toString(pool)); + return sb.toString(); + } + + public void setStackMapTable(StackMapTable stackMapTable) { + this.stackMapTable = stackMapTable; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LineNumberTable.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..181c88cccc --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LineNumberTable.java @@ -0,0 +1,68 @@ +package main.coding_170416.jvm.attr; + +import main.coding_170416.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList<>(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LineNumberTable parse(ByteCodeIterator iterator) { + int index = iterator.nextU2ToInt(); + int len = iterator.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index, len); + for (int i = 1; i < len; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iterator.nextU2ToInt()); + item.setLineNum(iterator.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Line Number Table:\n"); + for(LineNumberItem item:items){ + sb.append("startPC:"+item.getStartPC()).append(","); + sb.append("LineNum:"+item.getLineNum()).append("\n"); + } + sb.append("\n"); + return sb.toString(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LocalVariableItem.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..5db0ff8ddb --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LocalVariableItem.java @@ -0,0 +1,52 @@ +package main.coding_170416.jvm.attr; + +/** + * Created by peter on 2017/4/21. + */ +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LocalVariableTable.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..3963253cd1 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/LocalVariableTable.java @@ -0,0 +1,50 @@ +package main.coding_170416.jvm.attr; + +import main.coding_170416.jvm.constant.ConstantPool; +import main.coding_170416.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class LocalVariableTable extends AttributeInfo { + List items = new ArrayList<>(); + public LocalVariableTable(int attrNameIndex,int attrLen){ + super(attrNameIndex,attrLen); + } + public void addLocalVariableItem(LocalVariableItem item){ + this.items.add(item); + } + public static LocalVariableTable parse(ByteCodeIterator iterator){ + int index = iterator.nextU1ToInt(); + int len = iterator.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iterator.nextU2ToInt(); + for(int i=0;i<=itemLen;i++){ + LocalVariableItem item =new LocalVariableItem(); + item.setStartPC(iterator.nextU2ToInt()); + item.setLength(iterator.nextU2ToInt()); + item.setNameIndex(iterator.nextU2ToInt()); + item.setDescIndex(iterator.nextU2ToInt()); + item.setIndex(iterator.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + public String toString(ConstantPool pool){ + StringBuffer buffer = new StringBuffer(); + buffer.append("Local variable table:\n"); + for(LocalVariableItem item:items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/StackMapTable.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..4be892690b --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/attr/StackMapTable.java @@ -0,0 +1,23 @@ +package main.coding_170416.jvm.attr; + +import main.coding_170416.jvm.loader.ByteCodeIterator; + +/** + * Created by peter on 2017/4/21. + */ +public class StackMapTable extends AttributeInfo { + private String originalCode; + + public StackMapTable(int attrNameIndex,int attrLen){ + super(attrNameIndex,attrLen); + } + public static StackMapTable parse(ByteCodeIterator iterator){ + int index = iterator.nextU2ToInt(); + int len = iterator.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + return t; + } + private void setOriginalCode(String code){ + this.originalCode =code; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/AccessFlag.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..72a0931e04 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/AccessFlag.java @@ -0,0 +1,28 @@ +package main.coding_170416.jvm.clz; + +/** + * Created by peter on 2017/4/21. + */ +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; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/ClassFile.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..cb27ba2c2d --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/ClassFile.java @@ -0,0 +1,92 @@ +package main.coding_170416.jvm.clz; + +import main.coding_170416.jvm.constant.ClassInfo; +import main.coding_170416.jvm.constant.ConstantPool; +import main.coding_170416.jvm.field.Field; +import main.coding_170416.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private ConstantPool pool; + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private List fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + + 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 setConstantPool(ConstantPool pool){ + this.pool = pool; + } + public void setClassIndex(ClassIndex clzIndex){ + this.clzIndex = clzIndex; + } + + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + + public void addMethod(Method m){ + this.methods.add(m); + } + + public List getMethods(){ + return methods; + } + + 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()); + } + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.getClzIndex().getSuperClassIndex()); + return superClass.getClassName(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/ClassIndex.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..de3497ef86 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/clz/ClassIndex.java @@ -0,0 +1,25 @@ +package main.coding_170416.jvm.clz; + +/** + * Created by peter on 2017/4/21. + */ +public class ClassIndex { + private int thisClassIndex; + private int superClassIndex; + + public void setThisClassIndex(int thisClassIndex) { + this.thisClassIndex = thisClassIndex; + } + + public void setSuperClassIndex(int superClassIndex) { + this.superClassIndex = superClassIndex; + } + + public int getThisClassIndex() { + return thisClassIndex; + } + + public int getSuperClassIndex() { + return superClassIndex; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ClassInfo.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..b60723fc10 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ClassInfo.java @@ -0,0 +1,32 @@ +package main.coding_170416.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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; + } + + @Override + public int getType() { + return type; + } + + public String getClassName(){ + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ConstantInfo.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..699ee83f2f --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ConstantInfo.java @@ -0,0 +1,33 @@ +package main.coding_170416.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ConstantPool.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..400379b5dc --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/ConstantPool.java @@ -0,0 +1,26 @@ +package main.coding_170416.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class ConstantPool { + private List constantInfos = new ArrayList<>(); + + public ConstantPool(){} + + public void addConstantInfo(ConstantInfo constantInfo){ + this.constantInfos.add(constantInfo); + } + public ConstantInfo getConstantInfo(int index){ + return this.constantInfos.get(index); + } + public String getUTF8String(int index){ + return ((UTF8Info)this.constantInfos.get(index)).getValue(); + } + public Object getSizes(){ + return this.constantInfos.size()-1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/FieldRefInfo.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..c88917d99f --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/FieldRefInfo.java @@ -0,0 +1,57 @@ +package main.coding_170416.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class FieldRefInfo extends ConstantInfo { + private int type = ConstantInfo.FIELD_INFO; + private int classInfoIndex; + private int nameAndTypeIndex; + + public FieldRefInfo(ConstantPool pool) { + super(pool); + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + public int getClassInfoIndex() { + return classInfoIndex; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + @Override + 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(); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/MethodRefInfo.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..c00bc277c1 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/MethodRefInfo.java @@ -0,0 +1,59 @@ +package main.coding_170416.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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 getClassInfoIndex() { + return classInfoIndex; + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + @Override + 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(); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/NameAndTypeInfo.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..2a53baddab --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,53 @@ +package main.coding_170416.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class NameAndTypeInfo extends ConstantInfo { + public int type = ConstantInfo.NAME_AND_TYPE_INFO; + + private int indexA; + private int indexB; + + public NameAndTypeInfo(ConstantPool pool){ + super(pool); + } + + public int getIndexA() { + return indexA; + } + + public int getIndexB() { + return indexB; + } + + public void setIndexA(int indexA) { + this.indexA = indexA; + } + + public void setIndexB(int indexB) { + this.indexB = indexB; + } + + public String getName(){ + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(indexA); + return utf8Info.getValue(); + } + + public String getTypeInfo(){ + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8_info =(UTF8Info) pool.getConstantInfo(indexB); + return utf8_info.getValue(); + } + + @Override + public String toString() { + return "("+getName()+","+getTypeInfo()+")"; + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/NullConstantInfo.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..17af5d933c --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/NullConstantInfo.java @@ -0,0 +1,16 @@ +package main.coding_170416.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/StringInfo.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..4586195556 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/StringInfo.java @@ -0,0 +1,31 @@ +package main.coding_170416.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class StringInfo extends ConstantInfo { + private int type = ConstantInfo.STRING_INFO; + private int index; + + public StringInfo(ConstantPool pool) { + super(pool); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + @Override + public String toString() { + return this.getConstantPool().getUTF8String(index); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/UTF8Info.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..0dfe034217 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/constant/UTF8Info.java @@ -0,0 +1,40 @@ +package main.coding_170416.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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 String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + "]"; + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/field/Field.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/field/Field.java new file mode 100644 index 0000000000..5d1801730c --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/field/Field.java @@ -0,0 +1,44 @@ +package main.coding_170416.jvm.field; + +import main.coding_170416.jvm.constant.ConstantPool; +import main.coding_170416.jvm.constant.UTF8Info; +import main.coding_170416.jvm.loader.ByteCodeIterator; + +/** + * Created by peter on 2017/4/21. + */ +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptionIndex; + + private ConstantPool pool; + + public Field(int accessFlag,int nameIndex,int descriptionIndex,ConstantPool pool){ + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptionIndex = descriptionIndex; + this.pool = pool; + } + + @Override + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptionIndex)).getValue(); + return name+":"+desc; + } + + public static Field parse(ConstantPool pool, ByteCodeIterator iterator){ + int accessFlag = iterator.nextU2ToInt(); + int nameIndex = iterator.nextU2ToInt(); + int descIndex = iterator.nextU2ToInt(); + int attributeCount = iterator.nextU2ToInt(); + Field f = new Field(accessFlag,nameIndex,descIndex,pool); + + if(attributeCount>0){ + throw new RuntimeException("Field attribute has not implemented"); + } + return f; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170416/jvm/loader/ByteCodeIterator.java b/group11/729245768/DataStructure/src/main/coding_170416/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..6d1a12af38 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170416/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,54 @@ +package main.coding_170416.jvm.loader; + +import main.coding_170416.jvm.util.Util; + +import java.util.Arrays; + +/** + * Created by peter on 2017/4/21. + */ +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + public byte[] getBytes(int len){ + if(pos+len>=codes.length){ + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes,pos,pos+len); + pos+=len; + return data; + } + + public int nextU1ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); + } + + public int nextU4ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public String nextU4ToHexString(){ + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos]++,codes[pos++]}); + } + + public String nextUxToHexString(int len){ + byte[] temp = new byte[len]; + + for(int i=0;i clzPaths = new ArrayList<>(); + public byte[] readBinaryCode(String className){ + className = className.replace('.', File.pathSeparatorChar) +".class"; + for (String path:this.clzPaths){ + String clzFileName = path + File.separatorChar + className; + byte[] codes = loadClassFile(clzFileName); + if(codes!=null){ + return codes; + } + } + return null; + } + + public 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(clzPaths.contains(path)){ + return; + } + clzPaths.add(path); + } + + public String getClassPath(){ + return StringUtils.join(this.clzPaths,";"); + } + public ClassFile loadClass(String className){ + byte[] codes = this.readBinaryCode(className); + ClassFileParse parser = new ClassFileParse(); + return parser.parse(codes); + } + public String getClassPath_V1(){ + StringBuffer sb = new StringBuffer(); + for(int i=0;i Date: Sun, 23 Apr 2017 20:07:58 +0800 Subject: [PATCH 260/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/coding_170423/PostfixExpr.java | 47 ++++++ .../src/main/coding_170423/PrefixExpr.java | 49 ++++++ .../src/main/coding_170423/jvm/Test.java | 7 + .../coding_170423/jvm/attr/AttributeInfo.java | 21 +++ .../main/coding_170423/jvm/attr/CodeAttr.java | 93 ++++++++++++ .../jvm/attr/LineNumberTable.java | 68 +++++++++ .../jvm/attr/LocalVariableItem.java | 52 +++++++ .../jvm/attr/LocalVariableTable.java | 50 +++++++ .../coding_170423/jvm/attr/StackMapTable.java | 23 +++ .../coding_170423/jvm/clz/AccessFlag.java | 28 ++++ .../main/coding_170423/jvm/clz/ClassFile.java | 92 ++++++++++++ .../coding_170423/jvm/clz/ClassIndex.java | 25 ++++ .../coding_170423/jvm/constant/ClassInfo.java | 32 ++++ .../jvm/constant/ConstantInfo.java | 33 +++++ .../jvm/constant/ConstantPool.java | 26 ++++ .../jvm/constant/FieldRefInfo.java | 57 +++++++ .../jvm/constant/MethodRefInfo.java | 59 ++++++++ .../jvm/constant/NameAndTypeInfo.java | 53 +++++++ .../jvm/constant/NullConstantInfo.java | 16 ++ .../jvm/constant/StringInfo.java | 31 ++++ .../coding_170423/jvm/constant/UTF8Info.java | 40 +++++ .../main/coding_170423/jvm/field/Field.java | 44 ++++++ .../jvm/loader/ByteCodeIterator.java | 54 +++++++ .../jvm/loader/ClassFileLoader.java | 91 ++++++++++++ .../jvm/loader/ClassFileParse.java | 140 ++++++++++++++++++ .../main/coding_170423/jvm/method/Method.java | 83 +++++++++++ .../src/main/coding_170423/jvm/util/Util.java | 25 ++++ 27 files changed, 1339 insertions(+) create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/PostfixExpr.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/PrefixExpr.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/Test.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/AttributeInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/CodeAttr.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LineNumberTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LocalVariableItem.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LocalVariableTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/StackMapTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/AccessFlag.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/ClassFile.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/ClassIndex.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ClassInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ConstantInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ConstantPool.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/FieldRefInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/MethodRefInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/NameAndTypeInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/NullConstantInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/StringInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/UTF8Info.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/field/Field.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/loader/ByteCodeIterator.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/loader/ClassFileLoader.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/loader/ClassFileParse.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/method/Method.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/util/Util.java diff --git a/group11/729245768/DataStructure/src/main/coding_170423/PostfixExpr.java b/group11/729245768/DataStructure/src/main/coding_170423/PostfixExpr.java new file mode 100644 index 0000000000..1543317716 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/PostfixExpr.java @@ -0,0 +1,47 @@ +package main.coding_170423; + +import java.util.Stack; + +/** + * Created by peter on 2017/4/23. + */ +public class PostfixExpr { + String expr = null; + public PostfixExpr(String expr){ + this.expr = expr; + } + + public float evaluate(){ + String[] tokens = expr.split(" "); + int index = 0; + Stack operator = new Stack();//存储操作数 + while (index < tokens.length){ + String s = tokens[index]; + if(Character.isDigit(s.charAt(0))){ + //如果是操作数,直接进栈 + operator.push(Float.parseFloat(s)); + }else{ + float ope2 = operator.pop(); + float ope1 = operator.pop(); + switch (s){ + case "+": + operator.push(ope1+ope2); + break; + case "-": + operator.push(ope1-ope2); + break; + case "*": + operator.push(ope1*ope2); + break; + case "/": + operator.push(ope1/ope2); + break; + default: + System.out.println("invalid operator"); + } + } + index++; + } + return operator.pop(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/PrefixExpr.java b/group11/729245768/DataStructure/src/main/coding_170423/PrefixExpr.java new file mode 100644 index 0000000000..5a2ef9a2a8 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/PrefixExpr.java @@ -0,0 +1,49 @@ +package main.coding_170423; + + +import java.util.Stack; + +/** + * Created by peter on 2017/4/23. + */ +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + String[] tokens = expr.split(" "); + Stack operator = new Stack(); + int index = tokens.length - 1; + while (index >= 0) { + String s = tokens[index]; + if (Character.isDigit(s.charAt(0))) { + //说明是操作数 + operator.push(Float.parseFloat(s)); + } else { + //说明是操作符 + float opera1 = operator.pop(); + float opera2 = operator.pop(); + switch (s) { + case "+": + operator.push(opera1 + opera2); + break; + case "-": + operator.push(opera1 - opera2); + break; + case "*": + operator.push(opera1 * opera2); + break; + case "/": + operator.push(opera1 / opera2); + break; + + } + } + index--; + } + return operator.pop(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/Test.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/Test.java new file mode 100644 index 0000000000..8dcb8f3cf2 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/Test.java @@ -0,0 +1,7 @@ +package main.coding_170423.jvm; + +/** + * Created by peter on 2017/4/21. + */ +public class Test { +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/AttributeInfo.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..5c7e7dbad0 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/AttributeInfo.java @@ -0,0 +1,21 @@ +package main.coding_170423.jvm.attr; + +/** + * Created by peter on 2017/4/21. + */ +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVaribleTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex,int attrLen){ + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/CodeAttr.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..6afddedd42 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/CodeAttr.java @@ -0,0 +1,93 @@ +package main.coding_170423.jvm.attr; + +import main.coding_170423.jvm.clz.ClassFile; +import main.coding_170423.jvm.constant.ConstantPool; +import main.coding_170423.jvm.loader.ByteCodeIterator; + +/** + * Created by peter on 2017/4/21. + */ +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private LineNumberTable lineNumberTable; + private LocalVariableTable localVariableTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + } + + public void setLineNumberTable(LineNumberTable table) { + this.lineNumberTable = table; + } + + public void setLocalVariableTable(LocalVariableTable table) { + this.localVariableTable = table; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iterator) { + int attrNameIndex = iterator.nextU2ToInt(); + int attrLen = iterator.nextU4ToInt(); + int maxStack = iterator.nextU2ToInt(); + int maxLocals = iterator.nextU2ToInt(); + int codeLen = iterator.nextU4ToInt(); + + String code = iterator.nextUxToHexString(codeLen); + + System.out.println(code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + int exceptionTableLen = iterator.nextU2ToInt(); + //deal with exception + if (exceptionTableLen > 0) { + String exceptionTable = iterator.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table:just ignore " + exceptionTable); + } + int subAttrCount = iterator.nextU2ToInt(); + for (int i = 1; i < subAttrCount; i++) { + int subAttrIndex = iterator.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + iterator.back(2); + + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + LineNumberTable t = LineNumberTable.parse(iterator); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iterator); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iterator); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + } + return codeAttr; + } + + public String toString(ConstantPool pool) { + StringBuilder sb = new StringBuilder(); + sb.append("Code:").append(code).append("\n"); + sb.append("\n"); + sb.append(this.lineNumberTable.toString()); + sb.append(this.localVariableTable.toString(pool)); + return sb.toString(); + } + + public void setStackMapTable(StackMapTable stackMapTable) { + this.stackMapTable = stackMapTable; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LineNumberTable.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..79c96934bc --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LineNumberTable.java @@ -0,0 +1,68 @@ +package main.coding_170423.jvm.attr; + +import main.coding_170423.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList<>(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LineNumberTable parse(ByteCodeIterator iterator) { + int index = iterator.nextU2ToInt(); + int len = iterator.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index, len); + for (int i = 1; i < len; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iterator.nextU2ToInt()); + item.setLineNum(iterator.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Line Number Table:\n"); + for(LineNumberItem item:items){ + sb.append("startPC:"+item.getStartPC()).append(","); + sb.append("LineNum:"+item.getLineNum()).append("\n"); + } + sb.append("\n"); + return sb.toString(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LocalVariableItem.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..bf9bc16432 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LocalVariableItem.java @@ -0,0 +1,52 @@ +package main.coding_170423.jvm.attr; + +/** + * Created by peter on 2017/4/21. + */ +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LocalVariableTable.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..72de32aad5 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/LocalVariableTable.java @@ -0,0 +1,50 @@ +package main.coding_170423.jvm.attr; + +import main.coding_170423.jvm.constant.ConstantPool; +import main.coding_170423.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class LocalVariableTable extends AttributeInfo { + List items = new ArrayList<>(); + public LocalVariableTable(int attrNameIndex,int attrLen){ + super(attrNameIndex,attrLen); + } + public void addLocalVariableItem(LocalVariableItem item){ + this.items.add(item); + } + public static LocalVariableTable parse(ByteCodeIterator iterator){ + int index = iterator.nextU1ToInt(); + int len = iterator.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iterator.nextU2ToInt(); + for(int i=0;i<=itemLen;i++){ + LocalVariableItem item =new LocalVariableItem(); + item.setStartPC(iterator.nextU2ToInt()); + item.setLength(iterator.nextU2ToInt()); + item.setNameIndex(iterator.nextU2ToInt()); + item.setDescIndex(iterator.nextU2ToInt()); + item.setIndex(iterator.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + public String toString(ConstantPool pool){ + StringBuffer buffer = new StringBuffer(); + buffer.append("Local variable table:\n"); + for(LocalVariableItem item:items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/StackMapTable.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..5db41e5a47 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/attr/StackMapTable.java @@ -0,0 +1,23 @@ +package main.coding_170423.jvm.attr; + +import main.coding_170423.jvm.loader.ByteCodeIterator; + +/** + * Created by peter on 2017/4/21. + */ +public class StackMapTable extends AttributeInfo { + private String originalCode; + + public StackMapTable(int attrNameIndex,int attrLen){ + super(attrNameIndex,attrLen); + } + public static StackMapTable parse(ByteCodeIterator iterator){ + int index = iterator.nextU2ToInt(); + int len = iterator.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + return t; + } + private void setOriginalCode(String code){ + this.originalCode =code; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/AccessFlag.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..bc010b3503 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/AccessFlag.java @@ -0,0 +1,28 @@ +package main.coding_170423.jvm.clz; + +/** + * Created by peter on 2017/4/21. + */ +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; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/ClassFile.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..a8f944ac9e --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/ClassFile.java @@ -0,0 +1,92 @@ +package main.coding_170423.jvm.clz; + +import main.coding_170423.jvm.constant.ClassInfo; +import main.coding_170423.jvm.constant.ConstantPool; +import main.coding_170423.jvm.field.Field; +import main.coding_170423.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private ConstantPool pool; + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private List fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + + 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 setConstantPool(ConstantPool pool){ + this.pool = pool; + } + public void setClassIndex(ClassIndex clzIndex){ + this.clzIndex = clzIndex; + } + + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + + public void addMethod(Method m){ + this.methods.add(m); + } + + public List getMethods(){ + return methods; + } + + 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()); + } + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.getClzIndex().getSuperClassIndex()); + return superClass.getClassName(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/ClassIndex.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..6f455e0af4 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/clz/ClassIndex.java @@ -0,0 +1,25 @@ +package main.coding_170423.jvm.clz; + +/** + * Created by peter on 2017/4/21. + */ +public class ClassIndex { + private int thisClassIndex; + private int superClassIndex; + + public void setThisClassIndex(int thisClassIndex) { + this.thisClassIndex = thisClassIndex; + } + + public void setSuperClassIndex(int superClassIndex) { + this.superClassIndex = superClassIndex; + } + + public int getThisClassIndex() { + return thisClassIndex; + } + + public int getSuperClassIndex() { + return superClassIndex; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ClassInfo.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..a476e01205 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ClassInfo.java @@ -0,0 +1,32 @@ +package main.coding_170423.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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; + } + + @Override + public int getType() { + return type; + } + + public String getClassName(){ + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ConstantInfo.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..d6a4322c16 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ConstantInfo.java @@ -0,0 +1,33 @@ +package main.coding_170423.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ConstantPool.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..1cd269f915 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/ConstantPool.java @@ -0,0 +1,26 @@ +package main.coding_170423.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class ConstantPool { + private List constantInfos = new ArrayList<>(); + + public ConstantPool(){} + + public void addConstantInfo(ConstantInfo constantInfo){ + this.constantInfos.add(constantInfo); + } + public ConstantInfo getConstantInfo(int index){ + return this.constantInfos.get(index); + } + public String getUTF8String(int index){ + return ((UTF8Info)this.constantInfos.get(index)).getValue(); + } + public Object getSizes(){ + return this.constantInfos.size()-1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/FieldRefInfo.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..5770ed8d56 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/FieldRefInfo.java @@ -0,0 +1,57 @@ +package main.coding_170423.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class FieldRefInfo extends ConstantInfo { + private int type = ConstantInfo.FIELD_INFO; + private int classInfoIndex; + private int nameAndTypeIndex; + + public FieldRefInfo(ConstantPool pool) { + super(pool); + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + public int getClassInfoIndex() { + return classInfoIndex; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + @Override + 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(); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/MethodRefInfo.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..6eb445d9b9 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/MethodRefInfo.java @@ -0,0 +1,59 @@ +package main.coding_170423.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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 getClassInfoIndex() { + return classInfoIndex; + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + @Override + 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(); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/NameAndTypeInfo.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..5e044a6612 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,53 @@ +package main.coding_170423.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class NameAndTypeInfo extends ConstantInfo { + public int type = ConstantInfo.NAME_AND_TYPE_INFO; + + private int indexA; + private int indexB; + + public NameAndTypeInfo(ConstantPool pool){ + super(pool); + } + + public int getIndexA() { + return indexA; + } + + public int getIndexB() { + return indexB; + } + + public void setIndexA(int indexA) { + this.indexA = indexA; + } + + public void setIndexB(int indexB) { + this.indexB = indexB; + } + + public String getName(){ + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(indexA); + return utf8Info.getValue(); + } + + public String getTypeInfo(){ + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8_info =(UTF8Info) pool.getConstantInfo(indexB); + return utf8_info.getValue(); + } + + @Override + public String toString() { + return "("+getName()+","+getTypeInfo()+")"; + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/NullConstantInfo.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..1b91bd4269 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/NullConstantInfo.java @@ -0,0 +1,16 @@ +package main.coding_170423.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/StringInfo.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..1b163ca940 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/StringInfo.java @@ -0,0 +1,31 @@ +package main.coding_170423.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class StringInfo extends ConstantInfo { + private int type = ConstantInfo.STRING_INFO; + private int index; + + public StringInfo(ConstantPool pool) { + super(pool); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + @Override + public String toString() { + return this.getConstantPool().getUTF8String(index); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/UTF8Info.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..05e2427a5c --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/constant/UTF8Info.java @@ -0,0 +1,40 @@ +package main.coding_170423.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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 String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + "]"; + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/field/Field.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/field/Field.java new file mode 100644 index 0000000000..1d3b258374 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/field/Field.java @@ -0,0 +1,44 @@ +package main.coding_170423.jvm.field; + +import main.coding_170423.jvm.constant.ConstantPool; +import main.coding_170423.jvm.constant.UTF8Info; +import main.coding_170423.jvm.loader.ByteCodeIterator; + +/** + * Created by peter on 2017/4/21. + */ +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptionIndex; + + private ConstantPool pool; + + public Field(int accessFlag,int nameIndex,int descriptionIndex,ConstantPool pool){ + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptionIndex = descriptionIndex; + this.pool = pool; + } + + @Override + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptionIndex)).getValue(); + return name+":"+desc; + } + + public static Field parse(ConstantPool pool, ByteCodeIterator iterator){ + int accessFlag = iterator.nextU2ToInt(); + int nameIndex = iterator.nextU2ToInt(); + int descIndex = iterator.nextU2ToInt(); + int attributeCount = iterator.nextU2ToInt(); + Field f = new Field(accessFlag,nameIndex,descIndex,pool); + + if(attributeCount>0){ + throw new RuntimeException("Field attribute has not implemented"); + } + return f; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/loader/ByteCodeIterator.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..8566c06b4d --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,54 @@ +package main.coding_170423.jvm.loader; + +import main.coding_170423.jvm.util.Util; + +import java.util.Arrays; + +/** + * Created by peter on 2017/4/21. + */ +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + public byte[] getBytes(int len){ + if(pos+len>=codes.length){ + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes,pos,pos+len); + pos+=len; + return data; + } + + public int nextU1ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); + } + + public int nextU4ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public String nextU4ToHexString(){ + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos]++,codes[pos++]}); + } + + public String nextUxToHexString(int len){ + byte[] temp = new byte[len]; + + for(int i=0;i clzPaths = new ArrayList<>(); + public byte[] readBinaryCode(String className){ + className = className.replace('.', File.pathSeparatorChar) +".class"; + for (String path:this.clzPaths){ + String clzFileName = path + File.separatorChar + className; + byte[] codes = loadClassFile(clzFileName); + if(codes!=null){ + return codes; + } + } + return null; + } + + public 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(clzPaths.contains(path)){ + return; + } + clzPaths.add(path); + } + + public String getClassPath(){ + return StringUtils.join(this.clzPaths,";"); + } + public ClassFile loadClass(String className){ + byte[] codes = this.readBinaryCode(className); + ClassFileParse parser = new ClassFileParse(); + return parser.parse(codes); + } + public String getClassPath_V1(){ + StringBuffer sb = new StringBuffer(); + for(int i=0;i Date: Sun, 23 Apr 2017 20:10:05 +0800 Subject: [PATCH 261/552] =?UTF-8?q?0327=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/main/coding_170327/Employee.java | 28 ++++++++++ .../main/coding_170327/LRUPageFrameTest.java | 35 ++++++++++++ .../loader/ClassFileLoaderTest.java | 54 +++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 group11/729245768/DataStructure/tests/main/coding_170327/Employee.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170327/LRUPageFrameTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170327/loader/ClassFileLoaderTest.java diff --git a/group11/729245768/DataStructure/tests/main/coding_170327/Employee.java b/group11/729245768/DataStructure/tests/main/coding_170327/Employee.java new file mode 100644 index 0000000000..29c364810d --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170327/Employee.java @@ -0,0 +1,28 @@ +package main.coding_170327; + +/** + * Created by peter on 2017/4/20. + */ +public class Employee { + private String name; + private int age; + public Employee(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(String name){ + System.out.println("Hello, "+name); + } + + public static void main(String[] args) { + + } +} diff --git a/group11/729245768/DataStructure/tests/main/coding_170327/LRUPageFrameTest.java b/group11/729245768/DataStructure/tests/main/coding_170327/LRUPageFrameTest.java new file mode 100644 index 0000000000..4a4e4b0a27 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170327/LRUPageFrameTest.java @@ -0,0 +1,35 @@ +package main.coding_170327; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by peter on 2017/4/19. + */ +public class LRUPageFrameTest extends TestCase { + @Test + public void testAccess() throws Exception { + 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()); + } + + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170327/loader/ClassFileLoaderTest.java b/group11/729245768/DataStructure/tests/main/coding_170327/loader/ClassFileLoaderTest.java new file mode 100644 index 0000000000..4cbdc85daf --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170327/loader/ClassFileLoaderTest.java @@ -0,0 +1,54 @@ +package main.coding_170327.loader; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by peter on 2017/4/20. + */ +public class ClassFileLoaderTest extends TestCase { + public static final String FULL_QUALIFIED_CLASS_NAME = "main/coding_170327/Employee"; + static String path1 = "E:\\IDEASpace\\coding2017\\group11\\729245768\\DataStructure\\tests"; + static String path2 = "C:\temp"; + + @Test + public void testClassPath(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + Assert.assertEquals(path1+";"+path2,loader.getClassPath()); + } + @Test + public void testClassFileLength(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "main.coding_170327.Employee"; + byte[] codes = loader.readBinaryCodes(className); + Assert.assertEquals(891,codes.length); + } + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "main.coding_170327.Employee"; + byte[] codes = loader.readBinaryCodes(className); + byte[] magicNumbers = new byte[]{codes[0],codes[1],codes[2],codes[3]}; + String magic = byteToHexString(magicNumbers); + Assert.assertEquals("cafebabe",magic); + } + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Sun, 23 Apr 2017 20:11:04 +0800 Subject: [PATCH 262/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=80=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/coding_170409/StackUtilTest.java | 63 +++++++++++++++++++ .../jvm/loader/ClassFileParseTest.java | 25 ++++++++ .../coding_170409/jvm/loader/Employee.java | 28 +++++++++ 3 files changed, 116 insertions(+) create mode 100644 group11/729245768/DataStructure/tests/main/coding_170409/StackUtilTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170409/jvm/loader/ClassFileParseTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170409/jvm/loader/Employee.java diff --git a/group11/729245768/DataStructure/tests/main/coding_170409/StackUtilTest.java b/group11/729245768/DataStructure/tests/main/coding_170409/StackUtilTest.java new file mode 100644 index 0000000000..0095b28acd --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170409/StackUtilTest.java @@ -0,0 +1,63 @@ +package main.coding_170409; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Stack; + +/** + * Created by peter on 2017/4/23. + */ +public class StackUtilTest extends TestCase { + @Test + public void testReverse() throws Exception { + Stack stack = new Stack<>(); + stack.push(1); + stack.push(2); + stack.push(3); + StackUtil.reverse(stack); + Assert.assertArrayEquals(new Integer[]{3,2,1},new Integer[]{stack.pop(),stack.pop(),stack.pop()}); + } + + @Test + public void testAddToBottom() throws Exception { + Stack stack = new Stack<>(); + stack.push(1); + stack.push(2); + StackUtil.addToBottom(stack,1); + Assert.assertEquals(1,stack.peek().intValue()); + } + + @Test + public void testRemove() throws Exception { + Stack stack = new Stack<>(); + stack.push(10); + stack.push(20); + stack.push(30); + StackUtil.remove(stack,20); + Assert.assertEquals(2,stack.size()); + } + + @Test + public void testGetTop() throws Exception { + Stack stack = new Stack<>(); + stack.push(10); + stack.push(15); + stack.push(21); + stack.push(19); + stack.push(89); + StackUtil.getTop(stack,2); + Assert.assertEquals(3,stack.size()); + } + + @Test + public void testIsValidPairs() throws Exception { + String s1 = "([e{d}f])"; + String s2 = "([b{x]y})"; + Assert.assertTrue(StackUtil.isValidPairs(s1)); + Assert.assertFalse(StackUtil.isValidPairs(s2)); + + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170409/jvm/loader/ClassFileParseTest.java b/group11/729245768/DataStructure/tests/main/coding_170409/jvm/loader/ClassFileParseTest.java new file mode 100644 index 0000000000..57f922caf4 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170409/jvm/loader/ClassFileParseTest.java @@ -0,0 +1,25 @@ +package main.coding_170409.jvm.loader; + +import junit.framework.TestCase; +import main.coding_170409.jvm.constant.ConstantPool; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by peter on 2017/4/23. + */ +public class ClassFileParseTest extends TestCase { + static String path1 = "E:\\IDEASpace\\coding2017\\group11\\729245768\\DataStructure\\tests"; + + @Test + public void testParse() throws Exception { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String clzName = "main.coding_170409.Employee"; + byte[] codes = loader.readBinaryCode(clzName); + ClassFileParse parse = new ClassFileParse(); + ConstantPool pool = parse.parse(codes); + Assert.assertEquals(54,pool.getSizes()); + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170409/jvm/loader/Employee.java b/group11/729245768/DataStructure/tests/main/coding_170409/jvm/loader/Employee.java new file mode 100644 index 0000000000..98cf9bb578 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170409/jvm/loader/Employee.java @@ -0,0 +1,28 @@ +package main.coding_170409.jvm.loader; + +/** + * Created by peter on 2017/4/20. + */ +public class Employee { + private String name; + private int age; + public Employee(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(String name){ + System.out.println("Hello, "+name); + } + + public static void main(String[] args) { + + } +} From b3f641814990fbd31888b1293e08e3e6c90f244c Mon Sep 17 00:00:00 2001 From: peter <729245768@qq.com> Date: Sun, 23 Apr 2017 20:12:04 +0800 Subject: [PATCH 263/552] =?UTF-8?q?jvm=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tests/main/coding_170416/Employee.java | 28 +++++++++++++ .../main/coding_170416/InfixExprTest.java | 17 ++++++++ .../jvm/loader/ClassFileParseTest.java | 42 +++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 group11/729245768/DataStructure/tests/main/coding_170416/Employee.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170416/InfixExprTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170416/jvm/loader/ClassFileParseTest.java diff --git a/group11/729245768/DataStructure/tests/main/coding_170416/Employee.java b/group11/729245768/DataStructure/tests/main/coding_170416/Employee.java new file mode 100644 index 0000000000..267ce99495 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170416/Employee.java @@ -0,0 +1,28 @@ +package main.coding_170416; + +/** + * Created by peter on 2017/4/20. + */ +public class Employee { + private String name; + private int age; + public Employee(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(String name){ + System.out.println("Hello, "+name); + } + + public static void main(String[] args) { + + } +} diff --git a/group11/729245768/DataStructure/tests/main/coding_170416/InfixExprTest.java b/group11/729245768/DataStructure/tests/main/coding_170416/InfixExprTest.java new file mode 100644 index 0000000000..90de74d213 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170416/InfixExprTest.java @@ -0,0 +1,17 @@ +package main.coding_170416; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by peter on 2017/4/23. + */ +public class InfixExprTest extends TestCase { + @Test + public void testEvalute() throws Exception { + InfixExpr infixExpr = new InfixExpr("2+10*2-14/2"); + Assert.assertEquals(15,infixExpr.evalute(),0.001f); + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170416/jvm/loader/ClassFileParseTest.java b/group11/729245768/DataStructure/tests/main/coding_170416/jvm/loader/ClassFileParseTest.java new file mode 100644 index 0000000000..f519d09a46 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170416/jvm/loader/ClassFileParseTest.java @@ -0,0 +1,42 @@ +package main.coding_170416.jvm.loader; + +import junit.framework.TestCase; +import main.coding_170416.jvm.clz.ClassFile; +import main.coding_170416.jvm.field.Field; +import main.coding_170416.jvm.method.Method; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +/** + * Created by peter on 2017/4/23. + */ +public class ClassFileParseTest extends TestCase { + static String path1 = "E:\\IDEASpace\\coding2017\\group11\\729245768\\DataStructure\\tests"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "main.coding_170416.Employee"; + clzFile = loader.loadClass(className); + } + + @Test + public void testParseFields() throws Exception { + List fields = clzFile.getFields(); + Assert.assertEquals(2,fields.size()); + Field f1 = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f1.toString()); + Field f2 = fields.get(1); + Assert.assertEquals("age:;I", f2.toString()); + } + + @Test + public void testParseMethods() throws Exception { + List methods = clzFile.getMethods(); + Assert.assertEquals(5,methods.size()); + } + +} \ No newline at end of file From 645e8636351381625f7c62a401194db156528b69 Mon Sep 17 00:00:00 2001 From: peter <729245768@qq.com> Date: Sun, 23 Apr 2017 20:13:10 +0800 Subject: [PATCH 264/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=89=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/coding_170423/PostfixExprTest.java | 21 +++++++++++++++++++ .../main/coding_170423/PrefixExprTest.java | 17 +++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 group11/729245768/DataStructure/tests/main/coding_170423/PostfixExprTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170423/PrefixExprTest.java diff --git a/group11/729245768/DataStructure/tests/main/coding_170423/PostfixExprTest.java b/group11/729245768/DataStructure/tests/main/coding_170423/PostfixExprTest.java new file mode 100644 index 0000000000..9630beb57a --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170423/PostfixExprTest.java @@ -0,0 +1,21 @@ +package main.coding_170423; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by peter on 2017/4/23. + */ +public class PostfixExprTest extends TestCase { + @Test + public void testEvaluate() throws Exception { + PostfixExpr post1 = new PostfixExpr("3 4 + 5 * 6 -"); + Assert.assertEquals(29,post1.evaluate(),0.001f); + + PostfixExpr post2 = new PostfixExpr("2 8 4 / + 5 -"); + Assert.assertEquals(-1,post2.evaluate(),0.001f); + + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170423/PrefixExprTest.java b/group11/729245768/DataStructure/tests/main/coding_170423/PrefixExprTest.java new file mode 100644 index 0000000000..a258260bef --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170423/PrefixExprTest.java @@ -0,0 +1,17 @@ +package main.coding_170423; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by peter on 2017/4/23. + */ +public class PrefixExprTest extends TestCase { + @Test + public void testEvaluate() throws Exception { + PrefixExpr pre = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29,pre.evaluate(),0.001f); + } + +} \ No newline at end of file From 704d4b0db05aca95d9e3a24c6529dfb3b61713a0 Mon Sep 17 00:00:00 2001 From: Patrick Date: Sun, 23 Apr 2017 21:24:20 +0800 Subject: [PATCH 265/552] printer --- .../minijvm/constant/ClassInfo.java | 4 ++ .../minijvm/constant/ConstantInfo.java | 11 +++ .../minijvm/constant/ConstantPool.java | 2 +- .../minijvm/constant/FieldRefInfo.java | 5 ++ .../minijvm/constant/MethodRefInfo.java | 5 ++ .../minijvm/constant/NameAndTypeInfo.java | 5 ++ .../minijvm/constant/NullConstantInfo.java | 4 ++ .../minijvm/constant/StringInfo.java | 6 ++ .../coding2017/minijvm/constant/UTF8Info.java | 4 ++ .../minijvm/print/ClassFilePrinter.java | 8 ++- .../minijvm/print/ConstantPoolPrinter.java | 72 ++++++++++++++++++- 11 files changed, 121 insertions(+), 5 deletions(-) diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java index e2e0f50f61..d8cba51f62 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java @@ -23,4 +23,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java index 663c493b57..9275387556 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java @@ -25,5 +25,16 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java index ea0e135a23..d28601f4ba 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java index b74fb427ba..521c010f7b 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java @@ -51,4 +51,9 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java index cc5352db6e..287c907259 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java @@ -49,6 +49,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java index d1cd005111..990c0f6a01 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java @@ -42,4 +42,9 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java index 38eef91f32..06c20e5b4f 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java index 8f23231e72..00b9b9b706 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java index d94a267bbc..c0a7b4e0c5 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java @@ -26,6 +26,10 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java index 6615a189f5..2d7967cb41 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java @@ -20,7 +20,7 @@ public void print(){ System.out.println("minor version:" + clzFile.getMinorVersion()); - System.out.println("major version:" + clzFile.getMinorVersion()); + System.out.println("major version:" + clzFile.getMajorVersion()); ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); cnstPoolPrinter.print(); @@ -31,10 +31,12 @@ public void print(){ } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; +// String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "E:\\javaImprove\\git\\group24\\121111914\\src\\com\\github\\ipk2015\\coding2017\\minijvm\\bin"; ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); - String className = "com.coderising.jvm.test.EmployeeV1"; +// String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "EmployeeV1"; ClassFile clzFile = loader.loadClass(className); diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java index 295c509941..17b88d9932 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java @@ -1,6 +1,13 @@ package com.github.ipk2015.coding2017.minijvm.print; +import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; +import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; +import com.github.ipk2015.coding2017.minijvm.constant.NameAndTypeInfo; +import com.github.ipk2015.coding2017.minijvm.constant.StringInfo; +import com.github.ipk2015.coding2017.minijvm.constant.UTF8Info; public class ConstantPoolPrinter { ConstantPool pool; @@ -11,8 +18,71 @@ public void print(){ System.out.println("Constant Pool:"); + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor(){ + + @Override + public void visitClassInfo(ClassInfo info) { + int utf8Index = info.getUtf8Index(); + String className = info.getClassName(); + sop("Class\t\t"+"#"+utf8Index+"\t\t// "+className); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + int classInfoIndex = info.getClassInfoIndex(); + int nameAndTypeIndex = info.getNameAndTypeIndex(); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + sop("Fieldref\t\t"+"#"+classInfoIndex+".#"+nameAndTypeIndex+"\t\t// " + +className+"."+fieldName+":"+fieldType); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + int classInfoIndex = info.getClassInfoIndex(); + int nameAndTypeIndex = info.getNameAndTypeIndex(); + String className = info.getClassName(); + String methodName = info.getMethodName(); + String paramAndReturnType = info.getParamAndReturnType(); + sop("Methodref\t\t"+"#"+classInfoIndex+".#"+nameAndTypeIndex+"\t\t// " + +className+"."+methodName+":"+paramAndReturnType); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + int index1 = info.getIndex1(); + int index2 = info.getIndex2(); + String name = info.getName(); + String typeInfo = info.getTypeInfo(); + sop("NameAndType\t"+"#"+index1+".#"+index2+"\t\t// "+name+":"+typeInfo); + } + + @Override + public void visitString(StringInfo info) { + int index = info.getIndex(); + String utf8String = info.getConstantPool().getUTF8String(index); + sop("String\t\t"+"#"+index+"\t\t// "+utf8String); + } + + @Override + public void visistUTF8(UTF8Info info) { + sop("Utf8\t\t"+info.getValue()); + } + + }; + int size = pool.getSize(); + for(int i = 1;i < size+1;i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("\t"+"#"+i+" = "); + constantInfo.accept(visitor); + } - + } + + public static void sop(String s){ + System.out.println(s); } } From fdbc3140da5205681a1117ac85b1c8e9f96d16b6 Mon Sep 17 00:00:00 2001 From: James <1310368322@qq.com> Date: Sun, 23 Apr 2017 21:38:12 +0800 Subject: [PATCH 266/552] seven --- .../com/coderising/jvm/cmd/BiPushCmd.java | 18 +++ .../coderising/jvm/cmd/ByteCodeCommand.java | 126 +++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 149 ++++++++++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 18 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 17 ++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 18 +++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 17 ++ .../com/coderising/jvm/cmd/LdcCmd.java | 28 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 17 ++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 22 +++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 25 +++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 18 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 78 +++++++++ .../jvm/print/ClassFilePrinter.java | 44 ++++++ .../jvm/print/ConstantPoolPrinter.java | 82 ++++++++++ .../InfixToPostfix.java | 63 ++++++++ .../PostFixExpr.java | 47 ++++++ .../PreFixExpr.java | 60 +++++++ .../TestIntegerValueOf.java | 8 + .../dataStructure_7_PreAndPost/Token.java | 66 ++++++++ .../TokenParser.java | 55 +++++++ 21 files changed, 976 insertions(+) create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/InfixToPostfix.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/PostFixExpr.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/PreFixExpr.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/TestIntegerValueOf.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/Token.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/TokenParser.java diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/BiPushCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..a211b332a4 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +// bipush: ֽڵijֵ(-128 - 127) ջ +public class BiPushCmd extends OneOperandCmd{ + + protected BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/ByteCodeCommand.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..66d99de660 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,126 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + +public abstract class ByteCodeCommand { + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode.toUpperCase(); + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + System.out.println("opCode: " + opCode); + String txt = codeMap.get(opCode); + if(txt == null){ + System.out.println("txt: " + txt); + return opCode; + } + return txt; + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/CommandParser.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..7f85fb5664 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,149 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01";// nullջ + public static final String new_object = "BB";// һ󣬲ֵѹջ,ֽڹִӿڵķ + public static final String lstore = "37";// ջ long ֵ ָر + public static final String invokespecial = "B7";// ó๹췽ʵʼ˽з,byteڹǰʱijصָʱصһķ + public static final String invokevirtual = "B6";// ʵֽڹָһķ + public static final String getfield = "B4";//ȡָʵ򣬲ѹջ + public static final String putfield = "B5";// Ϊָʵֵ,ֽڹһָʱֶεһãðֶεƺԼֶεķ + public static final String getstatic = "B2";// ȡֶεľֵֶ̬ + public static final String ldc = "12";// int float String ͳֵӳջһֽһָintfloat͵ij + public static final String dup = "59";// ֵջջֵѹջ + public static final String bipush = "10";// byte չΪһ int ͵ֵ valueȻvalueѹ뵽ջһֽvalue + public static final String aload_0 = "2A";// һͱرջ + public static final String aload_1 = "2B";// ڶر͵ֵѹջ,޲ + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B";// ڶintͱرջ + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25";// ĸfloatͱرջ + + public static final String voidreturn = "B1";// ޷ֵķ + public static final String ireturn = "AC";// ӵǰ int + public static final String freturn = "AE";// ӵǰ float + + public static final String astore_1 = "4C";//ջʹڶֲһNoOperand + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03";// iconst_0 int 0 ջ + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + while(iter.hasNext()){ + String opCode = iter.next2CharAsString(); + System.out.println("ֽ룺 opCode --- " + opCode); + if(new_object.equalsIgnoreCase(opCode)){// new ָ + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + System.out.println("cmd"); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + }else if(invokespecial.equalsIgnoreCase(opCode)){// invokespecial ָ + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + }else if(getfield.equalsIgnoreCase(opCode)){// getfield ָ + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + }else if(putfield.equalsIgnoreCase(opCode)){ + System.out.println("putfield"); + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + }else if(getstatic.equalsIgnoreCase(opCode)){ + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + }else if(invokevirtual.equalsIgnoreCase(opCode)){ + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + }else if(bipush.equalsIgnoreCase(opCode)){ + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + }else if(ldc.equalsIgnoreCase(opCode)){ + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + }else if(dup.equalsIgnoreCase(opCode) || aload_0.equalsIgnoreCase(opCode) || iconst_0.equalsIgnoreCase(opCode) || iconst_1.equalsIgnoreCase(opCode) || + aload_0.equalsIgnoreCase(opCode) || aload_1.equalsIgnoreCase(opCode) || aload_2.equalsIgnoreCase(opCode) || iload_1.equalsIgnoreCase(opCode) || + iload_2.equalsIgnoreCase(opCode) || iload_3.equalsIgnoreCase(opCode) || voidreturn.equalsIgnoreCase(opCode) || + astore_1.equalsIgnoreCase(opCode)){ + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + }else{ + System.out.println("the " + opCode+ "has not been implements"); + } + } + + calcuateOffset(cmds); + System.out.println("cmds.size ------ " + cmds.size()); + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/GetFieldCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..d383c51497 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd{ + + protected GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..fafe227dee --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd{ + + protected GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..300e0f68c6 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd{ + + protected InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..99dfbab1a9 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd{ + + protected InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool){ + return super.getOperandAsMethod(pool); + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/LdcCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..b6910b16c8 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd{ + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NewObjectCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..765554d825 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + protected NewObjectCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool){ + return super.getOperandAsClassInfo(pool); + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NoOperandCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..238cd633fc --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + protected NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public int getLength() { + return 1; + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/OneOperandCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..9d1f85005c --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,25 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand{ + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode){ + super(clzFile, opCode); + } + + public int getOperand(){ + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + + public int getLength(){ + return 2; + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/PutFieldCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..601574ea5b --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd{ + + protected PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/TwoOperandCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..0a2aeff703 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,78 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public class TwoOperandCmd extends ByteCodeCommand{ + + // + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public int getOprand2() { + return oprand2; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + + protected TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + @Override + public int getLength() { + return 3; + } + + @Override + public String toString(ConstantPool pool) { + return null; + } + + + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/print/ClassFilePrinter.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..82c1803b3c --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,44 @@ +package com.coderising.jvm.print; + +import java.io.IOException; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + + /*System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName());*/ + //System.out.println("public class " + clzFile.getConstantPool().getConstantInfo(clzFile.getClzIndex().getThisClassIndex())); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + System.out.println("major version:" + clzFile.getMajorVersion()); + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("flags: public "); + } + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + } + + public static void main(String[] args) throws IOException{ + String path = "D:/ProgramWorld/Java/Practice/LangSi/2017Ⱥ/bin/com/coderising/jvm/loader/EmployeeV1.class"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(path); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/print/ConstantPoolPrinter.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..4d71c51470 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,82 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantInfo.Visitor; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitUTF8(UTF8Info info) { + StringBuffer buffer = new StringBuffer(); + buffer.append("Utf8 ").append(info.getValue()); + System.out.println(buffer); + + } + + @Override + public void visitString(StringInfo info) { + StringBuffer buffer = new StringBuffer(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuffer buffer = new StringBuffer(); + buffer.append("NameAndTypeInfo #").append(info.getIndex1()).append( + info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuffer buffer = new StringBuffer(); + buffer.append("MethodRefInfo #").append(info.getClassInfoIndex()+"#").append( + info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuffer buffer = new StringBuffer(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append( + info.getNameAndTypeIndex()); + System.out.println(buffer); + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuffer buffer = new StringBuffer(); + buffer.append("Class #").append(info.getUtf8Index()); + System.out.println(buffer); + } + }; + + for (int i = 1; i <= pool.getSize(); i++) { + ConstantInfo constatnInfo = pool.getConstantInfo(i); + System.out.print("#"+i+" = "); + constatnInfo.accept(visitor); + } + + + } +} diff --git a/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/InfixToPostfix.java b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/InfixToPostfix.java new file mode 100644 index 0000000000..cfe418302b --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/InfixToPostfix.java @@ -0,0 +1,63 @@ +package dataStructure_7_PreAndPost; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr){ + + List result = new ArrayList(); + Stack operatorStack = new Stack(); + TokenParser parser = new TokenParser(); + List list = parser.parse(expr); + + for (Token token : list) { + + if(token.isNumber()){ + result.add(token); + }else if(token.isOperator()){ + + if(operatorStack.isEmpty()){ + operatorStack.push(token); + }else{ + + Token topOperator = operatorStack.pop(); + + if(!token.hasHigherPriority(topOperator)){ + list.add(topOperator); + while(true){ + if(!operatorStack.isEmpty()){ + Token top = operatorStack.pop(); + + if(!token.hasHigherPriority(top) && !operatorStack.isEmpty()){ + list.add(top); + }else{ + break; + } + } + + } + operatorStack.push(token); + }else{ + operatorStack.push(topOperator); + operatorStack.push(token); + } + + } + + } + } + + return result; + } + + public static void main(String[] args) { + + List result = convert("3+2*5+6"); + for (Token token : result) { + System.out.println(token); + } + } +} diff --git a/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/PostFixExpr.java b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/PostFixExpr.java new file mode 100644 index 0000000000..603a797489 --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/PostFixExpr.java @@ -0,0 +1,47 @@ +package dataStructure_7_PreAndPost; + +import java.util.List; +import java.util.Stack; + +public class PostFixExpr { + + String expr = null; + + public PostFixExpr(String expr){ + this.expr = expr; + } + + public float evaluate(){ + //Stack operatorStack = new Stack(); + Stack operandStack = new Stack(); + TokenParser parser = new TokenParser(); + List list = parser.parse(expr); + for (Token token : list) { + if(token.isNumber()){ + Float operand = Float.parseFloat(token.toString()); + operandStack.push(operand); + }else if(token.isOperator()){ + Float operand = operandStack.pop(); + Float operanded = operandStack.pop(); + operandStack.push(calculate(token.toString(), operanded, operand)); + } + } + return operandStack.pop(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/PreFixExpr.java b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/PreFixExpr.java new file mode 100644 index 0000000000..ed3c4b889e --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/PreFixExpr.java @@ -0,0 +1,60 @@ +package dataStructure_7_PreAndPost; + +import java.util.List; +import java.util.Stack; + +public class PreFixExpr { + + String expr = null; + + public PreFixExpr(String expr){ + this.expr = expr; + } + + public float evaluate(){ + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack operatorStack = new Stack(); + Stack operandStack = new Stack(); + + for(int i = tokens.size()-1; i >= 0; i--){ + if(tokens.get(i).isNumber()){ + operandStack.push(new Float(tokens.get(i).getIntValue())); + }else if(tokens.get(i).isOperator()){ + checkOperandStack(operandStack.size()); + Float operand = operandStack.pop(); + Float operanded = operandStack.pop(); + Float result = calculate(tokens.get(i).toString(),operand, operanded); + operandStack.push(result); + } + } + + return operandStack.pop(); + } + + private boolean checkOperandStack(int size) { + if(size < 2){ + throw new RuntimeException("ջеԪ̫"); + } + return true; + } + + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git a/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/TestIntegerValueOf.java b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/TestIntegerValueOf.java new file mode 100644 index 0000000000..fd870c9eeb --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/TestIntegerValueOf.java @@ -0,0 +1,8 @@ +package dataStructure_7_PreAndPost; + +public class TestIntegerValueOf { + public static void main(String[] args) { + String s = "123"; + System.out.println(Integer.valueOf(s).intValue());// Ȱ String װ Integer Ȼתint + } +} diff --git a/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/Token.java b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/Token.java new file mode 100644 index 0000000000..bb16a7c9e9 --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/Token.java @@ -0,0 +1,66 @@ +package dataStructure_7_PreAndPost; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + + public static final List OPERATORS = Arrays.asList("+","-","*","/"); + private static final Map priorities = new HashMap<>(); + + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber(){ + return type == NUMBER; + } + + public boolean isOperator(){ + return type == OPERATOR; + } + + public int getIntValue(){ + return Integer.valueOf(value).intValue(); + } + + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if( !this.isOperator() || !t.isOperator()){ + throw new RuntimeException("number can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + + + + + + + + + + + + +} diff --git a/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/TokenParser.java b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/TokenParser.java new file mode 100644 index 0000000000..dda9412e24 --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_7_PreAndPost/TokenParser.java @@ -0,0 +1,55 @@ +package dataStructure_7_PreAndPost; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} From 5e88c64915c5a0458611c781c663994c91fb919e Mon Sep 17 00:00:00 2001 From: maishihang <446031103@qq.com> Date: Sun, 23 Apr 2017 21:47:30 +0800 Subject: [PATCH 267/552] compele jvm the second work --- .../com/datastructure/stack/StackUtil.java | 53 ++++++++++-- .../datastructure/stack/StackUtilTest.java | 80 +++++++++++++++++++ 2 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 group12/446031103/src/com/datastructure/stack/StackUtilTest.java diff --git a/group12/446031103/src/com/datastructure/stack/StackUtil.java b/group12/446031103/src/com/datastructure/stack/StackUtil.java index 7cab99ede3..2d4040d25d 100644 --- a/group12/446031103/src/com/datastructure/stack/StackUtil.java +++ b/group12/446031103/src/com/datastructure/stack/StackUtil.java @@ -7,13 +7,40 @@ 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) { + //错误,面向对象错误 + /*public static void reverse(Stack s) { Stack temp = new Stack(); while(!s.isEmpty()){ temp.push(s.pop()); } s = temp; + }*/ + public static void reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + + Stack tmp = new Stack(); + while(!s.isEmpty()){ + tmp.push(s.pop()); + } + while(!tmp.isEmpty()){ + Object top = tmp.pop(); + addToBottom(s,top); + } + + + } + public static void addToBottom(Stack s, Object value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Object top = s.pop(); + addToBottom(s,value); + s.push(top); + } } + /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 @@ -21,6 +48,9 @@ public static void reverse(Stack s) { * @param o */ public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()){ + return; + } Stack temp = new Stack(); while(!s.isEmpty()){ Object result=s.pop(); @@ -75,7 +105,7 @@ public static boolean isValidPairs(String s){ } } }else{ - char result=c[clength/2+1]; + char result=c[clength/2]; if(contain(result)){ return false; }; @@ -83,7 +113,7 @@ public static boolean isValidPairs(String s){ if(i s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} From d5cd0b186210699a39863d940213989e83c49b2e Mon Sep 17 00:00:00 2001 From: sdnb Date: Sun, 23 Apr 2017 23:01:40 +0800 Subject: [PATCH 268/552] =?UTF-8?q?=E5=90=8E=E7=BC=80/=E5=89=8D=E7=BC=80/?= =?UTF-8?q?=E4=B8=AD=E7=BC=80=E8=BD=AC=E5=90=8E=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/print/SimpleVistor.java | 56 +++++++++++++++ .../com/coding/week6/exprNew/InfixExpr.java | 11 ++- .../com/coding/week6/exprNew/Operator.java | 10 +-- .../java/com/coding/week6/exprNew/Token.java | 23 +++++-- .../com/coding/week6/exprNew/TokenParser.java | 11 ++- .../java/com/coding/week7/InfixToPostfix.java | 69 +++++++++++++++++++ .../java/com/coding/week7/PostfixExpr.java | 39 +++++++++++ .../java/com/coding/week7/PrefixExpr.java | 43 ++++++++++++ .../week6/exprNew/InfixExprTestTest.java | 3 +- .../com/coding/week7/InfixToPostfixTest.java | 34 +++++++++ .../com/coding/week7/PostfixExprTest.java | 41 +++++++++++ .../java/com/coding/week7/PrefixExprTest.java | 45 ++++++++++++ 12 files changed, 367 insertions(+), 18 deletions(-) create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java create mode 100644 group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java create mode 100644 group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java create mode 100644 group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java create mode 100644 group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java new file mode 100644 index 0000000000..e10e7885ba --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java @@ -0,0 +1,56 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.print; + +import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; + +import java.util.Formatter; + +/** + * Created by Administrator on 2017/4/23 0023. + */ +public class SimpleVistor implements ConstantInfo.Visitor { + private Formatter formatter = new Formatter(System.out); + private String format = " = %-20s %-20s %-100s\n"; + private static final String HASH_KEY = "#"; + private static final String DOUBLE_SLASH = "// "; + private static final String DOT = "."; + private static final String COLON = ":"; + + @Override + public void visitClassInfo(ClassInfo info) { + formatter.format(format, "Class", + HASH_KEY + info.getUtf8Index(), + DOUBLE_SLASH + info.getClassName()); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)info.getConstantInfo(info.getNameAndTypeIndex()); + formatter.format(format, "Fieldref", + HASH_KEY + info.getClassInfoIndex() + DOT + HASH_KEY + info.getNameAndTypeIndex(), + DOUBLE_SLASH + info.getClassName() + DOT + nameAndTypeInfo.getName() + COLON + nameAndTypeInfo.getTypeInfo()); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + formatter.format(format, "Methodref", + HASH_KEY + info.getClassInfoIndex() + DOT + HASH_KEY + info.getNameAndTypeIndex(), + DOUBLE_SLASH + info.getClassName() + DOT + info.getMethodName()); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + formatter.format(format, "NameAndType", + HASH_KEY + info.getIndex1() + COLON + HASH_KEY + info.getIndex2(), + DOUBLE_SLASH + info.getName() + COLON + info.getTypeInfo()); + } + + @Override + public void visitString(StringInfo info) { + formatter.format(format, "String", HASH_KEY + info.getIndex(), DOUBLE_SLASH + info.toString()); + } + + @Override + public void visistUTF8(UTF8Info info) { + formatter.format(format, "Utf8", info.getValue(), ""); + } +} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java index 41704db5db..3962b49fce 100644 --- a/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java @@ -31,21 +31,20 @@ public void fillStack(Stack numberStack, Stack operatorStack) { List tokens = tokenParser.parse(expr); for (Token token : tokens) { if (token.isNumber()) { - numberStack.push((float)token.getIntValue()); - continue; + numberStack.push(token.getFloatValue()); } - if (token.isOperator()) { + else if (token.isOperator()) { Operator o = token.getOperator(); if (operatorStack.isEmpty()) { operatorStack.push(o); }else { - Operator topO = (Operator)operatorStack.peek(); - if (o.hasHigherPriority(topO)) { + Operator top = (Operator)operatorStack.peek(); + if (o.hasHigherPriority(top)) { operatorStack.push(o); } else { float operTop1 = (float) numberStack.pop(); float operTop2 = (float) numberStack.pop(); - numberStack.push(topO.apply(operTop2, operTop1)); + numberStack.push(top.apply(operTop2, operTop1)); operatorStack.pop(); operatorStack.push(o); } diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java index b91c8158bf..f6b4681e46 100644 --- a/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java @@ -10,28 +10,28 @@ */ public enum Operator { ADD("+", 1) { - float apply(float x, float y){ + public float apply(float x, float y){ return x + y; } }, SUB("-", 1) { @Override - float apply(float x, float y) { + public float apply(float x, float y) { return x - y; } }, MULT("*", 2) { @Override - float apply(float x, float y) { + public float apply(float x, float y) { return x * y; } }, DIVI("/", 2) { @Override - float apply(float x, float y) { + public float apply(float x, float y) { return x / y; } }; @@ -59,7 +59,7 @@ public static List symbols() { return symbos; } - abstract float apply(float x, float y); + public abstract float apply(float x, float y); private static final Map map = new HashMap(); diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java index d987ac47b4..c925a22705 100644 --- a/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java @@ -5,11 +5,13 @@ */ public class Token { - private int type; + private int type; private String value; - static final int NUMBER = 1; + static final int NUMBER = 1; static final int OPERATOR = 2; + static final int LEFT_BRACKET = 3; + static final int RIGHT_BRACKET = 4; public Token(int type, String value) { this.type = type; this.value = value; @@ -24,7 +26,15 @@ public boolean isOperator(){ return type == OPERATOR; } - public int getIntValue() { + public boolean isLeftBracket() { + return type == LEFT_BRACKET; + } + + public boolean isRightBracket() { + return type == RIGHT_BRACKET; + } + + public float getFloatValue() { if (isNumber()) return Integer.valueOf(value); else @@ -32,7 +42,7 @@ public int getIntValue() { } public String toString() { - return type+":"+value; + return value; } @@ -45,4 +55,9 @@ public Operator getOperator() { } + public String getValue() { + return value; + } + + } diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java index ee90c39701..52757dc0c7 100644 --- a/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java @@ -25,10 +25,19 @@ public List parse(String expr) { token = new Token(Token.OPERATOR, c+""); tokens.add(token); i++; + } else if (String.valueOf(c).matches("\\s")){ + i++; + } else if (c == '(') { + token = new Token(Token.LEFT_BRACKET, String.valueOf(c)); + tokens.add(token); + i++; + } else if (c == ')') { + token = new Token(Token.RIGHT_BRACKET, String.valueOf(c)); + tokens.add(token); + i++; } else { throw new RuntimeException(c +" is not number or support operator"); } - } return tokens; } diff --git a/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java b/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java new file mode 100644 index 0000000000..6717f571ee --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java @@ -0,0 +1,69 @@ +package com.coding.week7; + +import com.coding.week6.exprNew.Operator; +import com.coding.week6.exprNew.Token; +import com.coding.week6.exprNew.TokenParser; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + /** + 1 建立符号栈 + 2 顺序扫描中序表达式 + a) 是数字, 直接输出 + b) 是运算符 + i : “(” 直接入栈 + ii : “)” 将符号栈中的元素依次出栈并输出, 直到 “(“, “(“只出栈, 不输出 + iii: 其他符号, 将符号栈中的元素依次出栈并输出, 直到 遇到比当前符号优先级更低的符号或者”(“。 将当前符号入栈。 + 3 扫描完后, 将栈中剩余符号依次输出 + */ + List targetTokens = new ArrayList<>(); + TokenParser tokenParser = new TokenParser(); + List sourceTokes = tokenParser.parse(expr); + Stack operStack = new Stack(); + for (Token token : sourceTokes) { + if (token.isNumber()) { + targetTokens.add(token); + } else { + //左括号 + if (token.isLeftBracket()) { + operStack.push(token); + //右括号 + } else if (token.isRightBracket()) { + while (!operStack.isEmpty()) { + Token t = operStack.peek(); + if (t.isLeftBracket()) { + operStack.pop(); + break; + } else { + targetTokens.add(operStack.pop()); + } + } + //普通运算符 + } else { + Operator oper = token.getOperator(); + if (!operStack.isEmpty()) { + Token t = operStack.peek(); + while (!t.isLeftBracket() && !oper.hasHigherPriority(t.getOperator()) && !operStack.isEmpty()) { + t = operStack.pop(); + targetTokens.add(t); + } + } + operStack.push(token); + } + } + } + //将栈中操作符全部输出 + while (!operStack.isEmpty()) { + targetTokens.add(operStack.pop()); + } + return targetTokens; + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java b/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java new file mode 100644 index 0000000000..8fb78e6a8d --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java @@ -0,0 +1,39 @@ +package com.coding.week7; + +import com.coding.week6.exprNew.Operator; +import com.coding.week6.exprNew.Token; +import com.coding.week6.exprNew.TokenParser; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + final Stack numStack; + final Stack operStack; + + public PostfixExpr(String expr) { + this.expr = expr; + this.numStack = new Stack<>(); + this.operStack = new Stack<>(); + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push(token.getFloatValue()); + } else if (token.isOperator()) { + if (numStack.size() >= 2) { + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = token.getOperator().apply(num2, num1); + numStack.push(result); + } + } + } + return numStack.pop(); + } + +} diff --git a/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java b/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java new file mode 100644 index 0000000000..1bb8e4fd8a --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java @@ -0,0 +1,43 @@ +package com.coding.week7; + +import com.coding.week6.exprNew.Operator; +import com.coding.week6.exprNew.Token; +import com.coding.week6.exprNew.TokenParser; + +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + final Stack numStack; + final Stack operStack; + + public PrefixExpr(String expr) { + this.expr = expr; + numStack = new Stack<>(); + operStack = new Stack<>(); + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + parser.parse(expr); + List tokens = parser.parse(expr); + Collections.reverse(tokens); + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push(token.getFloatValue()); + } else if (token.isOperator()) { + if (numStack.size() >= 2) { + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = token.getOperator().apply(num1, num2); + numStack.push(result); + } + } + } + return numStack.pop(); + } + + +} diff --git a/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java b/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java index d8f4a5390f..9939878611 100644 --- a/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java +++ b/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java @@ -1,7 +1,6 @@ -package ew; +package com.coding.week6.exprNew; -import com.coding.week6.exprNew.InfixExpr; import org.junit.After; import org.junit.Assert; import org.junit.Before; diff --git a/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java b/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java new file mode 100644 index 0000000000..54a59316d6 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java @@ -0,0 +1,34 @@ +package com.coding.week7; + +import com.coding.week6.exprNew.Token; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +/** + * Created by Administrator on 2017/4/23 0023. + */ +public class InfixToPostfixTest { + + @Test + public void testConvert() throws Exception { + { + String expr = "9+(3-1)*3+10/2";//"9 3 1-3*+ 10 2/+" + List tokens = InfixToPostfix.convert(expr); + System.out.println(tokens); + Assert.assertEquals("9", tokens.get(0).toString()); + Assert.assertEquals("3", tokens.get(1).toString()); + Assert.assertEquals("1", tokens.get(2).toString()); + Assert.assertEquals("-", tokens.get(3).toString()); + Assert.assertEquals("3", tokens.get(4).toString()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals("+", tokens.get(6).toString()); + Assert.assertEquals("10", tokens.get(7).toString()); + Assert.assertEquals("2", tokens.get(8).toString()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals("+", tokens.get(10).toString()); + } + + } +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java b/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java new file mode 100644 index 0000000000..bde078a97e --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.week7; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java b/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java new file mode 100644 index 0000000000..bb2061303e --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.week7; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} From 54ac61a8938c1102af44af04a76cb92d3119fad2 Mon Sep 17 00:00:00 2001 From: sdnb Date: Sun, 23 Apr 2017 23:02:29 +0800 Subject: [PATCH 269/552] javap --- group24/494800949/EmployeeV1-javap.txt | 164 ++++++++++++++++++ .../jvm/print/ClassFilePrinter.java | 45 +++++ .../jvm/print/ConstantPoolPrinter.java | 34 ++++ .../coding/week6/exprNew/TokenParserTest.java | 2 +- 4 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 group24/494800949/EmployeeV1-javap.txt create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java diff --git a/group24/494800949/EmployeeV1-javap.txt b/group24/494800949/EmployeeV1-javap.txt new file mode 100644 index 0000000000..466714a1dd --- /dev/null +++ b/group24/494800949/EmployeeV1-javap.txt @@ -0,0 +1,164 @@ +$ javap -verbose EmployeeV1 +警告: 二进制文件EmployeeV1包含com.coderising.jvm.test.EmployeeV1 +Classfile /H:/sourceCode/coding2017/group24/494800949/EmployeeV1.class + Last modified 2017-4-9; size 1056 bytes + MD5 checksum 8454b8999ccc9a2ae26a405d47558825 + Compiled from "EmployeeV1.java" +public class com.coderising.jvm.test.EmployeeV1 + minor version: 0 + major version: 52 + flags: ACC_PUBLIC, ACC_SUPER +Constant pool: + #1 = Class #2 // com/coderising/jvm/test/EmployeeV1 + #2 = Utf8 com/coderising/jvm/test/EmployeeV1 + #3 = Class #4 // java/lang/Object + #4 = Utf8 java/lang/Object + #5 = Utf8 name + #6 = Utf8 Ljava/lang/String; + #7 = Utf8 age + #8 = Utf8 I + #9 = Utf8 + #10 = Utf8 (Ljava/lang/String;I)V + #11 = Utf8 Code + #12 = Methodref #3.#13 // java/lang/Object."":()V + #13 = NameAndType #9:#14 // "":()V + #14 = Utf8 ()V + #15 = Fieldref #1.#16 // com/coderising/jvm/test/EmployeeV1.name:Ljava/lang/String; + #16 = NameAndType #5:#6 // name:Ljava/lang/String; + #17 = Fieldref #1.#18 // com/coderising/jvm/test/EmployeeV1.age:I + #18 = NameAndType #7:#8 // age:I + #19 = Utf8 LineNumberTable + #20 = Utf8 LocalVariableTable + #21 = Utf8 this + #22 = Utf8 Lcom/coderising/jvm/test/EmployeeV1; + #23 = Utf8 setName + #24 = Utf8 (Ljava/lang/String;)V + #25 = Utf8 setAge + #26 = Utf8 (I)V + #27 = Utf8 sayHello + #28 = Fieldref #29.#31 // java/lang/System.out:Ljava/io/PrintStream; + #29 = Class #30 // java/lang/System + #30 = Utf8 java/lang/System + #31 = NameAndType #32:#33 // out:Ljava/io/PrintStream; + #32 = Utf8 out + #33 = Utf8 Ljava/io/PrintStream; + #34 = String #35 // Hello , this is class Employee + #35 = Utf8 Hello , this is class Employee + #36 = Methodref #37.#39 // java/io/PrintStream.println:(Ljava/lang/String;)V + #37 = Class #38 // java/io/PrintStream + #38 = Utf8 java/io/PrintStream + #39 = NameAndType #40:#24 // println:(Ljava/lang/String;)V + #40 = Utf8 println + #41 = Utf8 main + #42 = Utf8 ([Ljava/lang/String;)V + #43 = String #44 // Andy + #44 = Utf8 Andy + #45 = Methodref #1.#46 // com/coderising/jvm/test/EmployeeV1."":(Ljava/lang/String;I)V + #46 = NameAndType #9:#10 // "":(Ljava/lang/String;I)V + #47 = Methodref #1.#48 // com/coderising/jvm/test/EmployeeV1.sayHello:()V + #48 = NameAndType #27:#14 // sayHello:()V + #49 = Utf8 args + #50 = Utf8 [Ljava/lang/String; + #51 = Utf8 p + #52 = Utf8 SourceFile + #53 = Utf8 EmployeeV1.java +{ + public com.coderising.jvm.test.EmployeeV1(java.lang.String, int); + descriptor: (Ljava/lang/String;I)V + flags: ACC_PUBLIC + Code: + stack=2, locals=3, args_size=3 + 0: aload_0 + 1: invokespecial #12 // Method java/lang/Object."":()V + 4: aload_0 + 5: aload_1 + 6: putfield #15 // Field name:Ljava/lang/String; + 9: aload_0 + 10: iload_2 + 11: putfield #17 // Field age:I + 14: return + LineNumberTable: + line 9: 0 + line 10: 4 + line 11: 9 + line 12: 14 + LocalVariableTable: + Start Length Slot Name Signature + 0 15 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 15 1 name Ljava/lang/String; + 0 15 2 age I + + public void setName(java.lang.String); + descriptor: (Ljava/lang/String;)V + flags: ACC_PUBLIC + Code: + stack=2, locals=2, args_size=2 + 0: aload_0 + 1: aload_1 + 2: putfield #15 // Field name:Ljava/lang/String; + 5: return + LineNumberTable: + line 15: 0 + line 16: 5 + LocalVariableTable: + Start Length Slot Name Signature + 0 6 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 6 1 name Ljava/lang/String; + + public void setAge(int); + descriptor: (I)V + flags: ACC_PUBLIC + Code: + stack=2, locals=2, args_size=2 + 0: aload_0 + 1: iload_1 + 2: putfield #17 // Field age:I + 5: return + LineNumberTable: + line 18: 0 + line 19: 5 + LocalVariableTable: + Start Length Slot Name Signature + 0 6 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 6 1 age I + + public void sayHello(); + descriptor: ()V + flags: ACC_PUBLIC + Code: + stack=2, locals=1, args_size=1 + 0: getstatic #28 // Field java/lang/System.out:Ljava/io/PrintStream; + 3: ldc #34 // String Hello , this is class Employee + 5: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V + 8: return + LineNumberTable: + line 21: 0 + line 22: 8 + LocalVariableTable: + Start Length Slot Name Signature + 0 9 0 this Lcom/coderising/jvm/test/EmployeeV1; + + public static void main(java.lang.String[]); + descriptor: ([Ljava/lang/String;)V + flags: ACC_PUBLIC, ACC_STATIC + Code: + stack=4, locals=2, args_size=1 + 0: new #1 // class com/coderising/jvm/test/EmployeeV1 + 3: dup + 4: ldc #43 // String Andy + 6: bipush 29 + 8: invokespecial #45 // Method "":(Ljava/lang/String;I)V + 11: astore_1 + 12: aload_1 + 13: invokevirtual #47 // Method sayHello:()V + 16: return + LineNumberTable: + line 24: 0 + line 25: 12 + line 27: 16 + LocalVariableTable: + Start Length Slot Name Signature + 0 17 0 args [Ljava/lang/String; + 12 5 1 p Lcom/coderising/jvm/test/EmployeeV1; +} +SourceFile: "EmployeeV1.java" diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..39553dd48c --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,45 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.print; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "H:\\sourceCode\\coding2017\\group24\\494800949"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..baa0e8ead4 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,34 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.print; + + +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +import java.util.Formatter; + +public class ConstantPoolPrinter { + ConstantPool pool; + + ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + + System.out.println("Constant Pool:"); + + for (int i = 1; i <= (int)pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + Formatter formatter = new Formatter(System.out); + formatter.format("%5s", "#"+i); + constantInfo.accept(new SimpleVistor()); + } + } + + public static void main(String[] args) { +// Formatter f = new Formatter(System.out); +// f.format("%-15s %-5s %-10s\n", "Item", "Qty", "Price"); +// f.format("%-15s %-5s %-10s\n", "----", "----", "-----"); + + } +} diff --git a/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java b/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java index c919f0084f..1e202ed615 100644 --- a/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java +++ b/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java @@ -12,7 +12,7 @@ public class TokenParserTest { @Test public void testParse() throws Exception { TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse("3*20+12*5-40/2"); + List tokens = tokenParser.parse("3* 20+1 2*5-40/2"); System.out.println(tokens); } } \ No newline at end of file From aca3a1737c7c74af154dfc99de62b252fe340be3 Mon Sep 17 00:00:00 2001 From: sdnb Date: Sun, 23 Apr 2017 23:02:49 +0800 Subject: [PATCH 270/552] =?UTF-8?q?jvm=E5=AD=97=E8=8A=82=E7=A0=81=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/jvm/attr/CodeAttr.java | 28 ++-- .../src/com/coderising/jvm/clz/ClassFile.java | 25 ++- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 21 +++ .../coderising/jvm/cmd/ByteCodeCommand.java | 127 +++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 150 ++++++++++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 21 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 20 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 22 +++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 30 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 24 +++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 20 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 63 ++++++++ .../coderising/jvm/constant/ClassInfo.java | 7 +- .../coderising/jvm/constant/ConstantInfo.java | 13 +- .../coderising/jvm/constant/FieldRefInfo.java | 9 +- .../jvm/constant/MethodRefInfo.java | 7 +- .../jvm/constant/NameAndTypeInfo.java | 9 +- .../jvm/constant/NullConstantInfo.java | 6 +- .../coderising/jvm/constant/StringInfo.java | 7 +- .../com/coderising/jvm/constant/UTF8Info.java | 6 + .../jvm/loader/ByteCodeIterator.java | 9 ++ .../src/com/coderising/jvm/method/Method.java | 7 +- .../mini_jvm/test/ClassFileloaderTest.java | 79 +++++++++ 26 files changed, 753 insertions(+), 25 deletions(-) create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java index ee04b856d7..b1685c4314 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -2,6 +2,8 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.CommandParser; import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { @@ -13,21 +15,23 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -47,9 +51,9 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxStack = iter.readTwoBytesToInt(); int maxLocal = iter.readTwoBytesToInt(); int codeLen = iter.readFourBytesToInt(); - String code = iter.readBytesToString(codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocal, codeLen, code); - + String code = iter.readBytesToHexString(codeLen); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocal, codeLen, code, cmds); //异常表长度 int exceptionTableLen = iter.readTwoBytesToInt(); if (exceptionTableLen > 0) { diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java index 047c65195f..6c88b9fff5 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -11,6 +11,7 @@ public class ClassFile { + private static final String MAIN_METHOD_NAME = "main"; private int minorVersion; private int majorVersion; @@ -79,13 +80,33 @@ public void print(){ System.out.println("Super Class Name:"+ getSuperClassName()); } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + for (Method method : methods) { + String name = method.getClzFile().getConstantPool().getUTF8String(method.getNameIndex()); + if (methodName.equals(name)) { + return method; + } + } + + return null; + } + public Method getMainMethod(){ + for (Method method : methods) { + String name = method.getClzFile().getConstantPool().getUTF8String(method.getNameIndex()); + if (MAIN_METHOD_NAME.equals(name)) { + return method; + } + } + return null; + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..eb7dafa79d --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,21 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..b44d66c880 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,127 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static { + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..dd01d38872 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,150 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; + +import java.util.ArrayList; +import java.util.List; +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + CommandIterator cmdIter = new CommandIterator(codes); + List cmds = new ArrayList<>(); + //2ab7000c2a2bb5000f2a1cb50011b1 + while (cmdIter.hasNext()) { + String operCode = cmdIter.next2CharAsString().toUpperCase(); + switch (operCode) { + case bipush: + BiPushCmd cmd = new BiPushCmd(clzFile, operCode); + cmd.setOperand(cmdIter.next2CharAsInt()); + cmds.add(cmd); + break; + case getfield: + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, operCode); + getFieldCmd.setOprand1(cmdIter.next2CharAsInt()); + getFieldCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(getFieldCmd); + break; + case getstatic: + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, operCode); + getStaticFieldCmd.setOprand1(cmdIter.next2CharAsInt()); + getStaticFieldCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(getStaticFieldCmd); + break; + case invokespecial: + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, operCode); + invokeSpecialCmd.setOprand1(cmdIter.next2CharAsInt()); + invokeSpecialCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(invokeSpecialCmd); + break; + case invokevirtual: + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, operCode); + invokeVirtualCmd.setOprand1(cmdIter.next2CharAsInt()); + invokeVirtualCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(invokeVirtualCmd); + break; + case ldc: + LdcCmd ldcCmd = new LdcCmd(clzFile, operCode); + ldcCmd.setOperand(cmdIter.next2CharAsInt()); + cmds.add(ldcCmd); + break; + case new_object: + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, operCode); + newObjectCmd.setOprand1(cmdIter.next2CharAsInt()); + newObjectCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(newObjectCmd); + break; + case putfield: + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, operCode); + putFieldCmd.setOprand1(cmdIter.next2CharAsInt()); + putFieldCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(putFieldCmd); + break; + case astore_1: + case aload_0: + case aload_1: + case iload_1: + case iload_2: + case istore_1: + case voidreturn: + case dup: + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, operCode); + cmds.add(noOperandCmd); + break; + default: + throw new RuntimeException("this oper [ " +operCode+ " ]not impl yet"); + } + } + calcuateOffset(cmds); + return cmds.toArray(new ByteCodeCommand[cmds.size()]); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..5801068cb0 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,21 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e577d1b56c --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..2900bb2c60 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,22 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..ff7f0fdf14 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..abaeae3a9e --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..db90b82a35 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..3cd045f6d3 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,24 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..696764c3e7 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..6f6ecd0eb1 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..78475ac911 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,63 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java index 227bb010a1..489e8c7c7c 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -15,10 +15,15 @@ public void setUtf8Index(int utf8Index) { public int getType() { return type; } - + public String getClassName() { int index = getUtf8Index(); UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java index e7c849ca59..7a9200f669 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -2,7 +2,6 @@ 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; @@ -25,5 +24,15 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index 1808a35c65..bca8e0b32b 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -11,7 +11,7 @@ public FieldRefInfo(ConstantPool pool) { public int getType() { return type; } - + public int getClassInfoIndex() { return classInfoIndex; } @@ -51,4 +51,11 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index dc62d438e6..4664a79cf4 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -14,7 +14,12 @@ public MethodRefInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index b8b9da7353..f1c59a0d5e 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -25,8 +25,13 @@ public void setIndex2(int index2) { public int getType() { return type; } - - + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } + + public String getName(){ ConstantPool pool = this.getConstantPool(); UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index bf19f681d8..16ec6a1e2f 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } - + + @Override + public void accept(Visitor visitor) { + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java index 05a4afad6a..d18ac12305 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -10,7 +10,12 @@ public StringInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } + public int getIndex() { return index; } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java index 61f20ed8f1..81160db29e 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -16,6 +16,12 @@ public void setLength(int length) { public int getType() { return type; } + + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } + @Override public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java index 1fe59b5bdb..cf2db01a36 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -27,6 +27,15 @@ public String readBytesToString(int len) { } + public String readBytesToHexString(int len) { + byte[] bs = new byte[len]; + System.arraycopy(bytes, cursor, bs, 0, len); + String ret = Util.byteToHexString(bs); + cursor += len; + return ret; + } + + public int readTwoBytesToInt() { int ret = Util.bytes2Int(bytes, cursor, U2); cursor += U2; diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java index fd5734e6b6..b848e6b515 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java @@ -3,6 +3,7 @@ import com.coding.mini_jvm.src.com.coderising.jvm.attr.CodeAttr; import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; public class Method { @@ -48,7 +49,6 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ int nameIndex = iter.readTwoBytesToInt(); int descIndex = iter.readTwoBytesToInt(); Method method = new Method(clzFile, accessFlag, nameIndex, descIndex); - System.out.println(clzFile.getConstantPool().getUTF8String(descIndex)); int attrCount = iter.readTwoBytesToInt(); if (attrCount > 1) throw new RuntimeException("other attrbute not impl yet"); @@ -58,9 +58,12 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); method.setCodeAttr(codeAttr); } else - throw new RuntimeException("not impl yet"); + throw new RuntimeException(" attribute[ " + attrNameIndex + " ] not impl yet"); } return method; } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java b/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java index 00812bcd80..b9561f243b 100644 --- a/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java +++ b/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java @@ -2,6 +2,10 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassIndex; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.BiPushCmd; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.OneOperandCmd; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.TwoOperandCmd; import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; import com.coding.mini_jvm.src.com.coderising.jvm.field.Field; import com.coding.mini_jvm.src.com.coderising.jvm.loader.ClassFileLoader; @@ -244,4 +248,79 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + + /***************************第四次jvm测试用例 **************************/ + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From 4d79c885b5ad410ac6711ac0f0c132866a8124f7 Mon Sep 17 00:00:00 2001 From: "songbao.yang" Date: Mon, 24 Apr 2017 08:08:32 +0800 Subject: [PATCH 271/552] =?UTF-8?q?=E4=B8=AD=E5=BA=8F=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F+jvm=E5=AD=97=E6=AE=B5=E6=96=B9=E6=B3=95=E8=A7=A3?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/basic/stack/expr/InfixExpr.java | 115 ++++++++++++ .../basic/stack/expr/InfixExprTest.java | 52 ++++++ .../basic/stack/expr/InfixToPostfix.java | 14 ++ .../coding/basic/stack/expr/PostfixExpr.java | 15 ++ .../basic/stack/expr/PostfixExprTest.java | 40 +++++ .../coding/basic/stack/expr/PrefixExpr.java | 15 ++ .../basic/stack/expr/PrefixExprTest.java | 45 +++++ .../com/coding/basic/stack/expr/Token.java | 51 ++++++ .../coding/basic/stack/expr/TokenParser.java | 57 ++++++ .../basic/stack/expr/TokenParserTest.java | 39 +++++ .../coderising/jvm/attr/AttributeInfo.java | 19 ++ .../src/com/coderising/jvm/attr/CodeAttr.java | 114 ++++++++++++ .../coderising/jvm/attr/LineNumberTable.java | 65 +++++++ .../jvm/attr/LocalVariableItem.java | 49 ++++++ .../jvm/attr/LocalVariableTable.java | 57 ++++++ .../coderising/jvm/attr/StackMapTable.java | 32 ++++ .../src/com/coderising/jvm/clz/ClassFile.java | 37 +++- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 22 +++ .../coderising/jvm/cmd/ByteCodeCommand.java | 133 ++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 84 +++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 20 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 22 +++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 ++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 +++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 +++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 ++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 63 +++++++ .../src/com/coderising/jvm/field/Field.java | 50 ++++++ .../jvm/loader/ClassFileParser.java | 21 ++- .../src/com/coderising/jvm/method/Method.java | 99 +++++++++++ .../jvm/print/ClassFilePrinter.java | 45 +++++ .../jvm/print/ConstantPoolPrinter.java | 18 ++ .../jvm/test/ClassFileloaderTest.java | 164 +++++++++++++++++- .../com/coderising/jvm/test/EmployeeV1.java | 2 +- 37 files changed, 1705 insertions(+), 15 deletions(-) create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/Token.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group05/578505552/dataStruct/src/com/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/field/Field.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/method/Method.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group05/578505552/miniJvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixExpr.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..4201398137 --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,115 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class InfixExpr { + + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + + if (!check(tokens)){ + throw new RuntimeException("illegal expression"); + } + + Stack operatorStack = new Stack(); + Stack numberStack = new Stack(); + + for (Token token : tokens){ + + if (token.isNumber()){ + numberStack.push(token); + } + + if (token.isOperator()){ + + if (operatorStack.isEmpty() || token.hasHigherPriority(operatorStack.peek())){ + operatorStack.push(token); + + } else { + popOneOperator(operatorStack, numberStack); + + if (operatorStack.isEmpty() || token.hasHigherPriority(operatorStack.peek())){ + operatorStack.push(token); + + } else { + popOneOperator(operatorStack, numberStack); + operatorStack.push(token); + } + } + } + } + + while (!operatorStack.isEmpty()){ + + popOneOperator(operatorStack, numberStack); + } + + return Float.valueOf(numberStack.pop().toString()); + } + + private void popOneOperator(Stack operatorStack, Stack numberStack){ + + Token operator = operatorStack.pop(); + Token num1 = numberStack.pop(); + Token num2 = numberStack.pop(); + float res = evaluateTwo(num2, num1, operator); + numberStack.push(new Token(Token.NUMBER, String.valueOf(res))); + } + + private float evaluateTwo(Token num1, Token num2, Token o){ + + Float s1 = Float.valueOf(num1.toString()); + Float s2 = Float.valueOf(num2.toString()); + + if (o.toString().equals("+")){ + return s1 + s2; + + } else if (o.toString().equals("-")){ + return s1 - s2; + + } else if (o.toString().equals("*")){ + return s1 * s2; + + } else if (o.toString().equals("/")){ + return s1 / s2; + } + + throw new RuntimeException("unsupported operator [" + o.toString() + "]"); + } + + private boolean check(List tokens) { + + if (tokens == null || tokens.isEmpty()){ + return false; + } + + int i = 0; + for (Token token : tokens){ + if (token.isNumber()){ + i++; + if ( i != 1){ + return false; + } + } + + if (token.isOperator()){ + i--; + if ( i != 0){ + return false; + } + } + } + return i == 1; + } + + +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixExprTest.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..20e34e8852 --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..96a2194a67 --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,14 @@ +package com.coding.basic.stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PostfixExpr.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..3854996ebf --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,15 @@ +package com.coding.basic.stack.expr; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..2f8c48fc70 --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,40 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PrefixExpr.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..d6d90d32dc --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,15 @@ +package com.coding.basic.stack.expr; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/Token.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..ade4e96c24 --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,51 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/TokenParser.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..5d655167b6 --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/TokenParserTest.java b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..66402e1f3c --- /dev/null +++ b/group05/578505552/dataStruct/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,39 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/attr/CodeAttr.java b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..9ab4480643 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,114 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; +import org.w3c.dom.Attr; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + String name = clzFile.getConstantPool().getUTF8String(attrNameIndex); + + int attrLength = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLength = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLength); + System.out.println("code: " + code); + + ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLength, maxStack, maxLocals, codeLength, code, cmds); + + int exceptionTableLength = iter.nextU2ToInt(); + + if (exceptionTableLength > 0){ + System.out.println(iter.nextUxToHexString(exceptionTableLength)); + //TODO parse exception + System.out.println("just ignore exception!!"); + } + + int subAttrCount = iter.nextU2ToInt(); + for (int i = 0; i < subAttrCount; i++) { + + int subAttrNameIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrNameIndex); + iter.back(2); + + if (AttributeInfo.LINE_NUM_TABLE.equals(subAttrName)){ + codeAttr.setLineNumberTable(LineNumberTable.parse(iter)); + + } else if (AttributeInfo.LOCAL_VAR_TABLE.equals(subAttrName)){ + codeAttr.setLocalVariableTable(LocalVariableTable.parse(iter)); + + } else if (AttributeInfo.STACK_MAP_TABLE.equals(subAttrName)){ + codeAttr.setStackMapTable(StackMapTable.parse(iter)); + + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + } + + return codeAttr; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLenght = iter.nextU4ToInt(); + + LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex, attrLenght); + + int lineNumberTableLenght = iter.nextU2ToInt(); + for (int i = 0; i < lineNumberTableLenght; i++) { + LineNumberItem lineNumberItem = new LineNumberItem(); + lineNumberItem.setStartPC(iter.nextU2ToInt()); + lineNumberItem.setLineNum(iter.nextU2ToInt()); + } + + return lineNumberTable; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } + + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/attr/LocalVariableItem.java b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..9561e904a9 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,49 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/attr/LocalVariableTable.java b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..435322a1a4 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLenght = iter.nextU4ToInt(); + + LocalVariableTable localVariableTable = new LocalVariableTable(attrNameIndex, attrLenght); + + int localVariableTableLen = iter.nextU2ToInt(); + for (int i = 0; i < localVariableTableLen; i++) { + LocalVariableItem localVariableItem = new LocalVariableItem(); + localVariableItem.setStartPC(iter.nextU2ToInt()); + localVariableItem.setLength(iter.nextU2ToInt()); + localVariableItem.setNameIndex(iter.nextU2ToInt()); + localVariableItem.setDescIndex(iter.nextU2ToInt()); + localVariableItem.setIndex(iter.nextU2ToInt()); + localVariableTable.addLocalVariableItem(localVariableItem); + } + + return localVariableTable; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/attr/StackMapTable.java b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..0814041fc6 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,32 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassFile.java b/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassFile.java index b68bdb0998..9d32f49239 100644 --- a/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/clz/ClassFile.java @@ -2,6 +2,11 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; public class ClassFile { @@ -11,7 +16,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -23,8 +29,6 @@ public void setAccessFlag(AccessFlag accessFlag) { this.accessFlag = accessFlag; } - - public ConstantPool getConstantPool() { return pool; } @@ -48,7 +52,18 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } public void print(){ @@ -63,13 +78,23 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } } diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..d93515a002 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..533345deb7 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,133 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + public static ByteCodeCommand[] parse(ClassFile clzFile, String code){ + + return null; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/CommandParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..e48ab7c091 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,84 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +import java.util.List; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..beb16e5cda --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e5c00c29de --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..cdcdf7ff31 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..b8ab36c150 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..4a62b18a49 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..f7d8e92bdb --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd { + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..faf5c7f3e6 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand { + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..f7898f8a42 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..1b99558a3e --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..8bd2dbe59e --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,63 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/field/Field.java b/group05/578505552/miniJvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..72d268c6ca --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool, ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + String name = pool.getUTF8String(nameIndex); + System.out.println("field <" + name + "> attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileParser.java index 4b8dbf180d..19201bd175 100644 --- a/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -6,14 +6,19 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; import com.coderising.jvm.parser.*; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class ClassFileParser { private static final Map constantPoolParserMap = new HashMap(); + static { constantPoolParserMap.put(ConstantInfo.UTF8_INFO, new UTF8InfoParser()); // constantPoolParserMap.put(ConstantInfo.INTEGER_INFO, new IntegerInfoParser()); @@ -48,6 +53,11 @@ public ClassFile parse(byte[] codes) { clzFile.setAccessFlag(parseAccessFlag(iterator)); clzFile.setClassIndex(parseClassInfex(iterator)); + parseInterfaces(iterator); + + parseFileds(clzFile, iterator); + parseMethods(clzFile, iterator); + return clzFile; } @@ -90,17 +100,26 @@ private void parseInterfaces(ByteCodeIterator iter) { System.out.println("interfaceCount:" + interfaceCount); +// throw new RuntimeException("interfaceParse has not been implemented"); + // TODO : 如果实现了interface, 这里需要解析 } private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { - + int fieldCount = iter.nextU2ToInt(); + for (int i = 0; i < fieldCount; i++) { + clzFile.addField(Field.parse(clzFile.getConstantPool(), iter)); + } } private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + int methodCount = iter.nextU2ToInt(); + for (int i = 0; i < methodCount; i++) { + clzFile.addMethod(Method.parse(clzFile, iter)); + } } } diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/method/Method.java b/group05/578505552/miniJvm/src/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..98b2042c11 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/method/Method.java @@ -0,0 +1,99 @@ +package com.coderising.jvm.method; + +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private CodeAttr codeAttr; + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + + int accessFlags = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributesCount = iter.nextU2ToInt(); + + String name = clzFile.getConstantPool().getUTF8String(nameIndex); + System.out.println("method <" + name + "> attribute count : "+ attributesCount); + + String descriptor = clzFile.getConstantPool().getUTF8String(descriptorIndex); + System.out.println("method <" + name + "> descriptor :" + descriptor); + + Method method = new Method(clzFile, accessFlags, nameIndex, descriptorIndex); + for (int i = 0; i < attributesCount; i++) { + + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if (AttributeInfo.CODE.equals(attrName)){ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + method.setCodeAttr(codeAttr); + } else { + throw new RuntimeException(attrName + " attribute has not been implemented"); + } + } + + return method; + } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group05/578505552/miniJvm/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..ee6a99daa6 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group05/578505552/miniJvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..c1a9700884 --- /dev/null +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ConstantPool; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group05/578505552/miniJvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index 2002d2dddd..7b93641e63 100644 --- a/group05/578505552/miniJvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -2,20 +2,28 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.*; +import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; import com.coderising.jvm.util.Util; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.List; + public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - + static String path1 = "D:\\project\\Learn\\coding2017\\group05\\578505552\\miniJvm\\src"; static String path2 = "C:\temp"; @@ -26,10 +34,9 @@ public class ClassFileloaderTest { String className = "com.coderising.jvm.test.EmployeeV1"; clzFile = loader.loadClass(className); - clzFile.print(); + } - - + @Before public void setUp() throws Exception { } @@ -47,7 +54,7 @@ public void testClassPath(){ String clzPath = loader.getClassPath(); - Assert.assertEquals(path1+";"+path2,clzPath); + Assert.assertEquals(path1 + ";" + path2, clzPath); } @@ -81,7 +88,6 @@ public void testMagicNumber(){ Assert.assertEquals("cafebabe", acctualValue); } - /** * ---------------------------------------------------------------------- */ @@ -175,7 +181,151 @@ public void testClassIndex(){ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } - + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool, Method m , String expectedName, String expectedDesc, String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand[] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } diff --git a/group05/578505552/miniJvm/src/com/coderising/jvm/test/EmployeeV1.java b/group05/578505552/miniJvm/src/com/coderising/jvm/test/EmployeeV1.java index 2c0ac7cf07..f49176c686 100644 --- a/group05/578505552/miniJvm/src/com/coderising/jvm/test/EmployeeV1.java +++ b/group05/578505552/miniJvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -8,7 +8,7 @@ public class EmployeeV1 { public EmployeeV1(String name, int age) { this.name = name; this.age = age; - } + } public void setName(String name) { From c866a88a113d1de1e00129d1d06ee84956423b4b Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 24 Apr 2017 09:46:58 +0800 Subject: [PATCH 272/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/queue/CircleQueue.java | 5 --- .../src/com/coding/basic/queue/Josephus.java | 19 --------- .../com/coding/basic/queue/JosephusTest.java | 27 ------------- .../basic/queue/QueueWithTwoStacks.java | 40 ------------------- 4 files changed, 91 deletions(-) delete mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/queue/CircleQueue.java delete mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/queue/Josephus.java delete mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/queue/JosephusTest.java delete mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/queue/QueueWithTwoStacks.java diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/queue/CircleQueue.java b/liuxin/data-structure/assignment/src/com/coding/basic/queue/CircleQueue.java deleted file mode 100644 index 1ac659da3d..0000000000 --- a/liuxin/data-structure/assignment/src/com/coding/basic/queue/CircleQueue.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coding.basic.queue; - -public class CircleQueue { - -} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/queue/Josephus.java b/liuxin/data-structure/assignment/src/com/coding/basic/queue/Josephus.java deleted file mode 100644 index d629d847f4..0000000000 --- a/liuxin/data-structure/assignment/src/com/coding/basic/queue/Josephus.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic.queue; - -import java.util.ArrayList; -import java.util.List; - -/** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 - * @author liuxin - * - */ -public class Josephus { - - public static List execute(int n, int m){ - - return null; - } - -} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/queue/JosephusTest.java b/liuxin/data-structure/assignment/src/com/coding/basic/queue/JosephusTest.java deleted file mode 100644 index 7d90318b51..0000000000 --- a/liuxin/data-structure/assignment/src/com/coding/basic/queue/JosephusTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coding.basic.queue; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class JosephusTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testExecute() { - - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); - - } - -} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/queue/QueueWithTwoStacks.java b/liuxin/data-structure/assignment/src/com/coding/basic/queue/QueueWithTwoStacks.java deleted file mode 100644 index bbd4715ca6..0000000000 --- a/liuxin/data-structure/assignment/src/com/coding/basic/queue/QueueWithTwoStacks.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coding.basic.queue; - -import java.util.Stack; - -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - - - - public boolean isEmpty() { - return false; - } - - - - public int size() { - return -1; - } - - - - public void enQueue(E item) { - - } - - public E deQueue() { - return null; - } - - - } - From e1798d0172d187a222c54cc0e582f6c38e008b9e Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 24 Apr 2017 09:52:19 +0800 Subject: [PATCH 273/552] refactor --- .../com/coding/basic/queue/CircleQueue.java | 30 +++- .../src/com/coding/basic/queue/Josephus.java | 24 +++- .../basic/queue/QueueWithTwoStacks.java | 26 +++- .../src/com/coding/basic/stack/Tail.java | 5 + .../basic/stack/expr/InfixToPostfix.java | 30 +++- .../com/coding/basic/queue/CircleQueue.java | 39 ++++++ .../src/com/coding/basic/queue/Josephus.java | 18 +++ .../com/coding/basic/queue/JosephusTest.java | 27 ++++ .../basic/queue/QueueWithTwoStacks.java | 47 +++++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 2 +- .../src/com/coderising/jvm/clz/ClassFile.java | 11 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 15 +- .../coderising/jvm/cmd/ByteCodeCommand.java | 50 +++++-- .../com/coderising/jvm/cmd/CommandParser.java | 64 +++------ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 ++- .../coderising/jvm/cmd/GetStaticFieldCmd.java | 25 +++- .../coderising/jvm/cmd/InvokeSpecialCmd.java | 30 +++- .../coderising/jvm/cmd/InvokeVirtualCmd.java | 72 +++++++++- .../src/com/coderising/jvm/cmd/LdcCmd.java | 27 +++- .../com/coderising/jvm/cmd/NewObjectCmd.java | 26 +++- .../com/coderising/jvm/cmd/NoOperandCmd.java | 125 ++++++++++++++++- .../com/coderising/jvm/cmd/PutFieldCmd.java | 29 +++- .../com/coderising/jvm/cmd/TwoOperandCmd.java | 8 +- .../jvm/constant/MethodRefInfo.java | 3 + .../jvm/engine/ExecutionResult.java | 56 ++++++++ .../coderising/jvm/engine/ExecutorEngine.java | 83 +++++++++++ .../src/com/coderising/jvm/engine/Heap.java | 39 ++++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++++ .../com/coderising/jvm/engine/MethodArea.java | 88 ++++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 28 ++++ .../coderising/jvm/engine/OperandStack.java | 26 ++++ .../com/coderising/jvm/engine/StackFrame.java | 131 ++++++++++++++++++ .../src/com/coderising/jvm/method/Method.java | 66 ++++++++- .../jvm/print/ClassFilePrinter.java | 2 +- .../jvm/test/ClassFileloaderTest.java | 2 +- .../com/coderising/jvm/test/MiniJVMTest.java | 28 ++++ 36 files changed, 1261 insertions(+), 114 deletions(-) create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/Tail.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/queue/CircleQueue.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/queue/Josephus.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/queue/JosephusTest.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/Heap.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/JavaObject.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/MethodArea.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/MiniJVM.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/OperandStack.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/StackFrame.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/test/MiniJVMTest.java diff --git a/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java b/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java index 1ac659da3d..b431db364f 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java @@ -1,5 +1,33 @@ package com.coding.basic.queue; -public class CircleQueue { +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return false; + + } + public int size() { + return -1; + } + + + + public void enQueue(E data) { + + } + + public E deQueue() { + return null; + } } diff --git a/liuxin/data-structure/answer/src/com/coding/basic/queue/Josephus.java b/liuxin/data-structure/answer/src/com/coding/basic/queue/Josephus.java index 29a9115535..4f33935f24 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/queue/Josephus.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/queue/Josephus.java @@ -5,7 +5,7 @@ /** * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 * @author liuxin * */ @@ -13,7 +13,27 @@ public class Josephus { public static List execute(int n, int m){ - return null; + Queue queue = new Queue(); + for (int i = 0; i < n; i++){ + queue.enQueue(i); + } + + List result = new ArrayList(); + int i = 0; + + while (!queue.isEmpty()) { + + int x = queue.deQueue(); + + if (++i % m == 0){ + result.add(x); + } else{ + queue.enQueue(x); + } + } + + + return result; } } diff --git a/liuxin/data-structure/answer/src/com/coding/basic/queue/QueueWithTwoStacks.java b/liuxin/data-structure/answer/src/com/coding/basic/queue/QueueWithTwoStacks.java index 4be68d6cbd..ed5a8dd98a 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/queue/QueueWithTwoStacks.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -1,9 +1,10 @@ package com.coding.basic.queue; +import java.util.NoSuchElementException; import java.util.Stack; public class QueueWithTwoStacks { - private Stack stack1; + private Stack stack1; private Stack stack2; @@ -13,29 +14,42 @@ public QueueWithTwoStacks() { } - + private void moveStack1ToStack2() { + while (!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + + } public boolean isEmpty() { - return false; + return stack1.isEmpty() && stack2.isEmpty(); } public int size() { - return -1; + return stack1.size() + stack2.size(); } public void enQueue(E item) { - + stack1.push(item); } public E deQueue() { - return null; + if (isEmpty()) { + throw new NoSuchElementException("Queue is empty"); + } + if (stack2.isEmpty()) { + moveStack1ToStack2(); + } + + return stack2.pop(); } + } diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/Tail.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/Tail.java new file mode 100644 index 0000000000..7f30ce55c8 --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/Tail.java @@ -0,0 +1,5 @@ +package com.coding.basic.stack; + +public class Tail { + +} diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java index 67ff350735..d52ec73bd3 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -1,13 +1,35 @@ package com.coding.basic.stack.expr; import java.util.List; +import java.util.Stack; public class InfixToPostfix { - + public static List convert(String expr) { - return null; + return null; + } + + public static void main(String[] args) { + Stack stack = new Stack(); + String expr = "1+((2+3)*4)-5"; + for(int i=0;i + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return false; + + } + + public int size() { + return -1; + } + + + + public void enQueue(E data) { + + } + + public E deQueue() { + return null; + } +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/queue/Josephus.java b/liuxin/data-structure/assignment/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..6a3ea639b9 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,18 @@ +package com.coding.basic.queue; + +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + return null; + } + +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/queue/JosephusTest.java b/liuxin/data-structure/assignment/src/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d90318b51 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/queue/QueueWithTwoStacks.java b/liuxin/data-structure/assignment/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..cef19a8b59 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,47 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + + } + diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/attr/CodeAttr.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/attr/CodeAttr.java index 03df78f541..279aea09b8 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/attr/CodeAttr.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/attr/CodeAttr.java @@ -102,7 +102,7 @@ public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); //buffer.append("Code:").append(code).append("\n"); for(int i=0;i codeMap = new HashMap(); static{ @@ -104,18 +140,6 @@ public String getOpCode() { public abstract int getLength(); - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - public String getReadableCodeText(){ String txt = codeMap.get(opCode); if(txt == null){ @@ -124,5 +148,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/CommandParser.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/CommandParser.java index 0410f9d061..f2ea2147fa 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/CommandParser.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/CommandParser.java @@ -7,40 +7,7 @@ public class CommandParser { - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { @@ -57,51 +24,58 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { while (iter.hasNext()) { String opCode = iter.next2CharAsString(); - if (new_object.equals(opCode)) { + if (ByteCodeCommand.new_object.equals(opCode)) { NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { + } else if (ByteCodeCommand.invokespecial.equals(opCode)) { InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); // System.out.println( cmd.toString(clzFile.getConstPool())); cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { + } else if (ByteCodeCommand.invokevirtual.equals(opCode)) { InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (getfield.equals(opCode)) { + } else if (ByteCodeCommand.getfield.equals(opCode)) { GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (getstatic.equals(opCode)) { + } else if (ByteCodeCommand.getstatic.equals(opCode)) { GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (putfield.equals(opCode)) { + } else if (ByteCodeCommand.putfield.equals(opCode)) { PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (ldc.equals(opCode)) { + } else if (ByteCodeCommand.ldc.equals(opCode)) { LdcCmd cmd = new LdcCmd(clzFile, opCode); cmd.setOperand(iter.next2CharAsInt()); cmds.add(cmd); - } else if (bipush.equals(opCode)) { + } else if (ByteCodeCommand.bipush.equals(opCode)) { BiPushCmd cmd = new BiPushCmd(clzFile, opCode); cmd.setOperand(iter.next2CharAsInt()); cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + } else if (ByteCodeCommand.dup.equals(opCode) + || ByteCodeCommand.aload_0.equals(opCode) + || ByteCodeCommand.aload_1.equals(opCode) + || ByteCodeCommand.aload_2.equals(opCode) + || ByteCodeCommand.iload_1.equals(opCode) + || ByteCodeCommand.iload_2.equals(opCode) + || ByteCodeCommand.iload_3.equals(opCode) + || ByteCodeCommand.fload_3.equals(opCode) + || ByteCodeCommand.voidreturn.equals(opCode) + || ByteCodeCommand.astore_1.equals(opCode)) { NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); cmds.add(cmd); diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/GetFieldCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/GetFieldCmd.java index 2e6061edd2..1bf902da39 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -11,12 +15,24 @@ public GetFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } - + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); + + + + } } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java index e6cf9d5960..9d42c7a75b 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -5,6 +5,10 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -15,9 +19,24 @@ public GetStaticFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); + } + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + //TODO 处理非System.out的情况 } - } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java index ac228d0e4d..f239957a4d 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -3,6 +3,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.MethodArea; +import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -13,11 +17,31 @@ public InvokeSpecialCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { + + return super.getOperandAsMethod(); + } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + + - return super.getOperandAsMethod(pool); } - } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java index c15d827797..ec9e508cbe 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -1,7 +1,13 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.MethodArea; +import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; + public class InvokeVirtualCmd extends TwoOperandCmd { @@ -11,12 +17,70 @@ public InvokeVirtualCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsMethod(pool); + return super.getOperandAsMethod(); } - + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if(isSystemOutPrintlnMethod(className,methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while(currentClassName != null){ + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + + break; + + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/LdcCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/LdcCmd.java index ffb66f811c..f00d1f07f3 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/LdcCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/LdcCmd.java @@ -4,6 +4,10 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -12,9 +16,9 @@ public LdcCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + ConstantInfo info = getConstantInfo(this.getOperand()); String value = "TBD"; if(info instanceof StringInfo){ @@ -25,5 +29,22 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } - + public void execute(StackFrame frame,ExecutionResult result){ + + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } + + + } } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/NewObjectCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/NewObjectCmd.java index 33813b5d59..9cee0a1675 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -1,7 +1,12 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -10,10 +15,25 @@ public NewObjectCmd(ClassFile clzFile, String opCode){ } @Override - public String toString(ConstantPool pool) { + public String toString() { + + return super.getOperandAsClassInfo(); + } + public void execute(StackFrame frame,ExecutionResult result){ + + int index = this.getIndex(); + + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + + String clzName = info.getClassName(); + + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); + + - return super.getOperandAsClassInfo(pool); } - } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/NoOperandCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/NoOperandCmd.java index 56c28fefe2..0ef5fcc892 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -10,10 +14,129 @@ public NoOperandCmd(ClassFile clzFile, String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + + + } public int getLength(){ diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/PutFieldCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/PutFieldCmd.java index 85bb369c19..63753d3c5d 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -1,7 +1,13 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -10,10 +16,29 @@ public PutFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + + } + } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/TwoOperandCmd.java index 6c0cf53082..5af94b5f27 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -39,14 +39,14 @@ public int getIndex(){ return index; } - protected String getOperandAsClassInfo(ConstantPool pool){ + protected String getOperandAsClassInfo(){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + ClassInfo info = (ClassInfo)getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); } - protected String getOperandAsMethod(ConstantPool pool){ + protected String getOperandAsMethod(){ int index = getIndex(); String codeTxt = getReadableCodeText(); ConstantInfo constInfo = this.getConstantInfo(index); @@ -54,7 +54,7 @@ protected String getOperandAsMethod(ConstantPool pool){ return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); } - protected String getOperandAsField(ConstantPool pool){ + protected String getOperandAsField(){ int index = getIndex(); String codeTxt = getReadableCodeText(); diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/constant/MethodRefInfo.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/constant/MethodRefInfo.java index 036e6d9055..5701eca2e1 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -1,5 +1,8 @@ package com.coderising.jvm.constant; +import java.util.ArrayList; +import java.util.List; + public class MethodRefInfo extends ConstantInfo { private int type = ConstantInfo.METHOD_INFO; diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/ExecutionResult.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..8f6c51e52a --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/ExecutorEngine.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..79388c1e9c --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,83 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); + + while(!stack.empty()){ + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if(result.isPauseAndRunNewFrame()){ + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame,nextFrame); + + stack.push(nextFrame); + + } else { + + stack.pop(); + + } + } + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + Method nextMethod = nextFrame.getMethod(); + + + List paramList = nextMethod.getParameterList(); + + //加上1 是因为要把this也传递过去 + + int paramNum = paramList.size() + 1; + + + List values = new ArrayList(); + + //数据结构知识: 从栈中取出栈顶的x个元素 + while(paramNum>0){ + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + //数据结构知识: 把一个列表倒序排列 + List params = new ArrayList(); + + for(int i=values.size()-1; i>=0 ;i--){ + params.add(values.get(i)); + } + + + nextFrame.setLocalVariableTable(params); + + } + +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/Heap.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..82ad210cef --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/JavaObject.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..71ba382d9a --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/MethodArea.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..e71fd10ac1 --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,88 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if(m == null){ + + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + + } +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/MiniJVM.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..443524cc5f --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i operands = new ArrayList(); + + public void push(JavaObject jo){ + operands.add(jo); + } + public JavaObject pop(){ + int index = size()-1; + JavaObject jo = (JavaObject)operands.get(index); + operands.remove(index); + return jo; + + } + public JavaObject top(){ + int index = size()-1; + return (JavaObject)operands.get(index); + } + public int size(){ + return operands.size(); + } +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/StackFrame.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/StackFrame.java new file mode 100644 index 0000000000..cfa31973fa --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/engine/StackFrame.java @@ -0,0 +1,131 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.method.Method; + +public class StackFrame { + + private List localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/method/Method.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/method/Method.java index 71ab6ab053..3b141388ab 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/method/Method.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/method/Method.java @@ -2,9 +2,14 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.cmd.ByteCodeCommand; + +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.NameAndTypeInfo; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; @@ -53,7 +58,7 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd -public String toString() { + public String toString() { ConstantPool pool = this.clzFile.getConstantPool(); StringBuilder buffer = new StringBuilder(); @@ -100,4 +105,63 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } + + private String getParamAndReturnType(){ + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + public List getParameterList(){ + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/print/ClassFilePrinter.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/print/ClassFilePrinter.java index 14407bacbe..af5c9bec65 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/print/ClassFilePrinter.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -40,7 +40,7 @@ public void print(){ } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); String className = "com.coderising.jvm.test.EmployeeV1"; diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/ClassFileloaderTest.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/ClassFileloaderTest.java index 5657310e0d..f1a996be49 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -31,7 +31,7 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; static String path2 = "C:\temp"; static ClassFile clzFile = null; diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/MiniJVMTest.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..787c0d954d --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/MiniJVMTest.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + + } + +} From e062976461686c4bf830794425ae613414ef2011 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 24 Apr 2017 10:00:49 +0800 Subject: [PATCH 274/552] refactor --- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 8 ++ .../coderising/jvm/cmd/ByteCodeCommand.java | 4 +- .../com/coderising/jvm/cmd/GetFieldCmd.java | 8 ++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 8 ++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 8 ++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 7 ++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 8 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 8 ++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 8 ++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 8 ++ .../jvm/engine/ExecutionResult.java | 56 +++++++++++ .../coderising/jvm/engine/ExecutorEngine.java | 35 +++++++ .../src/com/coderising/jvm/engine/Heap.java | 39 ++++++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++++++++ .../com/coderising/jvm/engine/MethodArea.java | 68 +++++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 28 ++++++ .../com/coderising/jvm/engine/StackFrame.java | 95 +++++++++++++++++++ 17 files changed, 466 insertions(+), 1 deletion(-) create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/Heap.java create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/JavaObject.java create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/MethodArea.java create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/MiniJVM.java create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/StackFrame.java diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/BiPushCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/BiPushCmd.java index cd0fbd4848..1f60641d2d 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/BiPushCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -3,6 +3,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -17,6 +19,12 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/ByteCodeCommand.java index a3abeacc82..e48d4e38f7 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -6,6 +6,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public abstract class ByteCodeCommand { @@ -124,5 +126,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/GetFieldCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/GetFieldCmd.java index 2e6061edd2..c771d535f7 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -16,6 +18,12 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java index e6cf9d5960..e6876c36bb 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -5,6 +5,8 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -20,4 +22,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java index ac228d0e4d..8d60e72341 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -3,6 +3,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -18,6 +20,12 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java index c15d827797..a1f2d1a1c6 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -16,6 +18,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/LdcCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/LdcCmd.java index ffb66f811c..1669aa3900 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/LdcCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/LdcCmd.java @@ -4,6 +4,8 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -25,5 +27,11 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/NewObjectCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/NewObjectCmd.java index 33813b5d59..caa2609928 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -15,5 +17,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/NoOperandCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/NoOperandCmd.java index 56c28fefe2..c3cda9b52e 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -20,4 +22,10 @@ public int getLength(){ return 1; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/PutFieldCmd.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/PutFieldCmd.java index 85bb369c19..dc31cf084d 100644 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -15,5 +17,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/ExecutionResult.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..8f6c51e52a --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/ExecutorEngine.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..5d6b582879 --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,35 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/Heap.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..82ad210cef --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/JavaObject.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..71ba382d9a --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/MethodArea.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..781e81acf1 --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,68 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/MiniJVM.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..443524cc5f --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} From 76c37539a53433c8100cf924a2a82144cf519745 Mon Sep 17 00:00:00 2001 From: orajavac Date: Mon, 24 Apr 2017 10:07:46 +0800 Subject: [PATCH 275/552] 20170424_1007 jvm --- .../coding2017/jvm/attr/CodeAttr.java | 23 +++- .../jvm/attr/LocalVariableTable.java | 15 ++ .../coding2017/jvm/clz/ClassFile.java | 4 +- .../coding2017/jvm/cmd/BiPushCmd.java | 23 ++++ .../coding2017/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++++++++ .../coding2017/jvm/cmd/CommandParser.java | 85 ++++++++++++ .../coding2017/jvm/cmd/GetFieldCmd.java | 22 +++ .../coding2017/jvm/cmd/GetStaticFieldCmd.java | 23 ++++ .../coding2017/jvm/cmd/InvokeSpecialCmd.java | 23 ++++ .../coding2017/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../orajavac/coding2017/jvm/cmd/LdcCmd.java | 29 ++++ .../coding2017/jvm/cmd/NewObjectCmd.java | 19 +++ .../coding2017/jvm/cmd/NoOperandCmd.java | 23 ++++ .../coding2017/jvm/cmd/OneOperandCmd.java | 27 ++++ .../coding2017/jvm/cmd/PutFieldCmd.java | 19 +++ .../coding2017/jvm/cmd/TwoOperandCmd.java | 67 +++++++++ .../coding2017/jvm/constant/ClassInfo.java | 6 + .../coding2017/jvm/constant/ConstantInfo.java | 11 ++ .../coding2017/jvm/constant/ConstantPool.java | 2 +- .../coding2017/jvm/constant/FieldRefInfo.java | 6 + .../jvm/constant/MethodRefInfo.java | 6 +- .../jvm/constant/NameAndTypeInfo.java | 8 +- .../jvm/constant/NullConstantInfo.java | 6 + .../coding2017/jvm/constant/StringInfo.java | 4 + .../coding2017/jvm/constant/UTF8Info.java | 5 +- .../orajavac/coding2017/jvm/field/Field.java | 20 ++- .../coding2017/jvm/method/Method.java | 18 ++- .../jvm/print/ClassFilePrinter.java | 53 ++++++++ .../jvm/print/ConstantPoolPrinter.java | 60 ++++++++ 29 files changed, 744 insertions(+), 13 deletions(-) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ClassFilePrinter.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ConstantPoolPrinter.java diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java index 4fa025750d..acffda0f88 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java @@ -1,6 +1,8 @@ package com.github.orajavac.coding2017.jvm.attr; import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.cmd.ByteCodeCommand; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo{ @@ -13,10 +15,10 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; @@ -70,6 +72,19 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ } return null; } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..7223cb7afc --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..acd1d7202f --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..7bdc7ca76b --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ClassInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; +import com.github.orajavac.coding2017.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..f467b84f3f --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..f210141c66 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..41f73494e7 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..52d280cc0b --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..7a6781c152 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..f9d005287f --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..1fd6b367e1 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..4deb99ecd2 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ClassInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; +import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java index 730ca7663b..61dcdd9d3f 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java @@ -21,4 +21,10 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + + @Override + public void accept(Visistor visitor) { + visitor.visitClassInfo(this); + + } } \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java index 099f4012e0..37055df0a2 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java @@ -26,4 +26,15 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + + public abstract void accept(Visistor visistor); + + public static interface Visistor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visitUTF8(UTF8Info info); + } } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java index c1eef85f66..304e78f8ba 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java @@ -22,7 +22,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java index f280244bed..c9a06f397d 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java @@ -51,4 +51,10 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visistor visitor) { + visitor.visitFieldRef(this); + + } } \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java index f37c0f6452..6e53f8db5c 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java @@ -50,6 +50,10 @@ public String getParamAndReturnType(){ return typeInfo.getTypeInfo(); } - + @Override + public void accept(Visistor visitor) { + visitor.visitMethodRef(this); + + } } \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java index 688e5f622f..0f25bb4ef6 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,10 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } -} \ No newline at end of file + + @Override + public void accept(Visistor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java index af90d1dcf0..64eff24eef 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java @@ -10,4 +10,10 @@ public int getType() { return -1; } + @Override + public void accept(Visistor visitor) { + + + } + } \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java index ecad1d633b..2224a46e73 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java @@ -23,4 +23,8 @@ public String toString(){ return this.getConstantPool().getUTF8String(index); } + @Override + public void accept(Visistor visitor) { + visitor.visitString(this); + } } \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java index 5026756c57..bdceafe0f2 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java @@ -27,6 +27,9 @@ public void setValue(String value) { this.value = value; } - + @Override + public void accept(Visistor visitor) { + visitor.visitUTF8(this); + } } \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java index 8339ac98d4..40c8ad3a2c 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java @@ -1,8 +1,10 @@ package com.github.orajavac.coding2017.jvm.field; import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.UTF8Info; import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + public class Field { private int accessFlag; private int nameIndex; @@ -20,15 +22,29 @@ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool po this.pool = pool; } - + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); int nameIndex = iter.nextU2ToInt(); int descIndex = iter.nextU2ToInt(); int attribCount = iter.nextU2ToInt(); - Field f = new Field(accessFlag,nameIndex,descIndex,pool); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + return f; } + } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java index 5beb1fdf12..6f43647396 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java @@ -3,6 +3,8 @@ import com.github.orajavac.coding2017.jvm.attr.AttributeInfo; import com.github.orajavac.coding2017.jvm.attr.CodeAttr; import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.UTF8Info; import com.github.orajavac.coding2017.jvm.field.Field; import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; @@ -42,7 +44,21 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd this.descriptorIndex = descriptorIndex; } - + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ClassFilePrinter.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..c46c21056d --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ClassFilePrinter.java @@ -0,0 +1,53 @@ +package com.github.orajavac.coding2017.jvm.print; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ClassInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; +import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; +import com.github.orajavac.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.orajavac.coding2017.jvm.constant.StringInfo; +import com.github.orajavac.coding2017.jvm.constant.UTF8Info; +import com.github.orajavac.coding2017.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ConstantPoolPrinter.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..6c4a3915bd --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,60 @@ + package com.github.orajavac.coding2017.jvm.print; + +import com.github.orajavac.coding2017.jvm.constant.ClassInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; +import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; +import com.github.orajavac.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.orajavac.coding2017.jvm.constant.StringInfo; +import com.github.orajavac.coding2017.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visistor visistor = new ConstantInfo.Visistor(){ + public void visitString(StringInfo info){ + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + } + + public void visitClassInfo(ClassInfo info){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()).append(" ") + .append(info.getClassName()); + } + + public void visitFieldRef(FieldRefInfo info){ + StringBuilder buffer = new StringBuilder(); + buffer.append("FiledRef #").append(info.getClassInfoIndex()).append(" ") + .append(info.getNameAndTypeIndex()); + } + + public void visitMethodRef(MethodRefInfo info){ + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(" ").append(info.getParamAndReturnType()); + } + + public void visitNameAndType(NameAndTypeInfo info){ + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(" ").append(info.getIndex2()); + } + + public void visitUTF8(UTF8Info info){ + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 #").append(info.getValue()); + } + }; + + for (int i=0;i Date: Mon, 24 Apr 2017 10:50:47 +0800 Subject: [PATCH 276/552] coding --- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 8 +- .../coderising/jvm/cmd/ByteCodeCommand.java | 4 + .../com/coderising/jvm/cmd/GetFieldCmd.java | 8 +- .../coderising/jvm/cmd/GetStaticFieldCmd.java | 7 ++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 8 +- .../coderising/jvm/cmd/InvokeVirtualCmd.java | 8 +- .../src/com/coderising/jvm/cmd/LdcCmd.java | 7 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 7 ++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 7 ++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 7 ++ .../jvm/engine/ExecutionResult.java | 52 ++++++++++ .../coderising/jvm/engine/ExecutorEngine.java | 28 ++++++ .../src/com/coderising/jvm/engine/Heap.java | 39 ++++++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++++++++ .../com/coderising/jvm/engine/MethodArea.java | 69 ++++++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 29 ++++++ .../com/coderising/jvm/engine/StackFrame.java | 95 +++++++++++++++++++ .../com/coding/basic/queue/CircleQueue.java | 33 +++++++ .../src/com/coding/basic/queue/Josephus.java | 18 ++++ .../com/coding/basic/{ => queue}/Queue.java | 2 +- .../basic/queue/QueueWithTwoStacks.java | 40 ++++++++ .../com/coding/basic/queue/JosephusTest.java | 27 ++++++ .../coding/basic/{ => queue}/QueueTest.java | 4 +- 23 files changed, 571 insertions(+), 7 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/engine/Heap.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/engine/JavaObject.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MethodArea.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MiniJVM.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/engine/StackFrame.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/queue/Josephus.java rename group12/2258659044/zj-2017/src/com/coding/basic/{ => queue}/Queue.java (85%) create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/queue/JosephusTest.java rename group12/2258659044/zj-2017/src/test/com/coding/basic/{ => queue}/QueueTest.java (90%) diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java index 03db32ccc9..85b2b876ff 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -16,6 +18,10 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java index 4c8b21ab09..f4f63c0174 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -6,6 +6,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public abstract class ByteCodeCommand { @@ -122,4 +124,6 @@ public String getReadableCodeText(){ } return txt; } + + public abstract void execute(StackFrame frame,ExecutionResult result); } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java index 92fe286363..aa268ca39e 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -15,7 +17,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java index 52a7550d12..54a85e2603 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -16,4 +18,9 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java index c6efbae530..bdc4b00adc 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -16,6 +18,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java index a17c51a81d..40a668437e 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -15,7 +17,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java index 00f9a5a699..f6d22350a7 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java @@ -4,6 +4,8 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -26,4 +28,9 @@ public String toString(ConstantPool pool) { } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java index a43c8bd964..ace90a27cd 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -15,5 +17,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java index 461bb4e2a5..662f5cf5ca 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -20,4 +22,9 @@ public int getLength(){ return 1; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java index 00b29e1fbc..6c17b72c46 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -15,5 +17,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutionResult.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..368ab4ea31 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutorEngine.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..dc0030932e --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; +import com.coding.basic.stack.Stack; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/Heap.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..7df6548625 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/JavaObject.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..e48667b9d2 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MethodArea.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..9d21b55787 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,69 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className) throws NotAClassFileException{ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className) throws NotAClassFileException{ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MiniJVM.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..7e933213cb --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.engine; + +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.loader.ClassFileLoader; + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException, NotAClassFileException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/queue/CircleQueue.java b/group12/2258659044/zj-2017/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..4d99dc68e0 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,33 @@ +package com.coding.basic.queue; + +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return false; + + } + + public int size() { + return -1; + } + + + + public void enQueue(E data) { + + } + + public E deQueue() { + return null; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/queue/Josephus.java b/group12/2258659044/zj-2017/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..6ca15ac7f2 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,18 @@ +package com.coding.basic.queue; + +import com.coding.basic.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + return null; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java b/group12/2258659044/zj-2017/src/com/coding/basic/queue/Queue.java similarity index 85% rename from group12/2258659044/zj-2017/src/com/coding/basic/Queue.java rename to group12/2258659044/zj-2017/src/com/coding/basic/queue/Queue.java index 169fc0dcb9..f7761a384b 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/queue/Queue.java @@ -1,4 +1,4 @@ -package com.coding.basic; +package com.coding.basic.queue; import com.coding.basic.linklist.LinkedList; diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group12/2258659044/zj-2017/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..7b1527e7b9 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,40 @@ +package com.coding.basic.queue; + +import com.coding.basic.stack.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + + } diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/JosephusTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..4b9176a8ca --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package test.com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.queue.Josephus; + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/QueueTest.java similarity index 90% rename from group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java rename to group12/2258659044/zj-2017/src/test/com/coding/basic/queue/QueueTest.java index b12d23cdbd..ef471b8c4e 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/QueueTest.java @@ -1,9 +1,9 @@ -package test.com.coding.basic; +package test.com.coding.basic.queue; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import com.coding.basic.Queue; +import com.coding.basic.queue.Queue; public class QueueTest { From 1208fb8d26f9d8fd97272faf3834e30926a6b91a Mon Sep 17 00:00:00 2001 From: Harry Date: Mon, 24 Apr 2017 11:23:13 +0800 Subject: [PATCH 277/552] =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前中后序表达式求值,以及中序表达式转后序表达式 --- .../coding2017/stack/expr/InfixExpr.java | 19 ++++---- .../coding2017/stack/expr/InfixToPostfix.java | 45 ++++++++++++++++++- .../coding2017/stack/expr/PostfixExpr.java | 43 +++++++++++++++++- .../coding2017/stack/expr/PrefixExpr.java | 10 ++--- 4 files changed, 98 insertions(+), 19 deletions(-) diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java index a7b7ee00d2..b9667fdaac 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java @@ -23,7 +23,7 @@ public float evaluate() { while (i < ch.length - 1 && Character.isDigit(ch[++i])) { tmp = tmp * 10 + Float.parseFloat("" + ch[i]); } - + stackOfNumber.push(tmp); } @@ -31,7 +31,7 @@ public float evaluate() { stackOfOperator.push(ch[i]); } - char operator = (char)stackOfOperator.peek(); + char operator = (char) stackOfOperator.peek(); if (operator == '*' || operator == '/') { float tmp = Float.parseFloat("" + ch[++i]); while (i < ch.length - 1 && Character.isDigit(ch[++i])) { @@ -44,15 +44,15 @@ public float evaluate() { float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); - if(operator == '*') { + if (operator == '*') { stackOfNumber.push(tmp1 * tmp2); - } else { - stackOfNumber.push(tmp2 / tmp1); + } else { + stackOfNumber.push(tmp2 / tmp1); } - + stackOfOperator.pop(); } - + } // 将栈中的数字和运算符逆置,从左往右结合 reverse(stackOfNumber); @@ -63,10 +63,10 @@ public float evaluate() { if (operator == '+' || operator == '-') { float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); - if(operator == '+') { + if (operator == '+') { stackOfNumber.push(tmp1 + tmp2); } else { - stackOfNumber.push(tmp1 - tmp2); + stackOfNumber.push(tmp1 - tmp2); } } @@ -95,6 +95,7 @@ private void reverse(MyStack s) { s.push(temp2); } + public static void main(String[] args) { InfixExpr expr = new InfixExpr("2+3*4+5"); System.out.println(expr.evaluate()); diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java index 57f6fa107b..10088e28cd 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java @@ -1,12 +1,53 @@ package com.github.HarryHook.coding2017.stack.expr; +import java.util.ArrayList; import java.util.List; +import java.util.Stack; +import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; + +//中序表达式: 3*20+12*5-40/2 转换成后续表达式:3 20 * 12 5 * + 40 2 / - +//思路:当前token依次从左往右读取, 数字依次append, 当前入栈的运算符的优先级小于等于栈顶的运算符,栈顶操作符出栈 public class InfixToPostfix { - public static List convert(String expr) { + public List convert(String expr) { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + List listOfTokens = new ArrayList<>(); + + Stack opsStack = new Stack<>(); + + for (Token token : tokens) { + + if (token.isNumber()) { + listOfTokens.add(token); + } else if (token.isOperator()) { // 还需判断当前操作符和栈顶操作符的优先级 + if (opsStack.isEmpty()) { + opsStack.push(token); + } else { + if (!token.hasHigherPriority(opsStack.peek())) { + listOfTokens.add(opsStack.pop()); + } + opsStack.push(token); + } + + } + } + while (!(opsStack.isEmpty())) { // exprStack 为空,但操作符栈还有元素 + listOfTokens.add(opsStack.pop()); + } + return listOfTokens; + } - return null; + public static void main(String[] args) { + InfixToPostfix toPostfix = new InfixToPostfix(); + List t = new ArrayList(); + String expr = "3+20+12*5+40/2"; + t = toPostfix.convert(expr); + System.out.println("expr: " + expr); + System.out.println("PostfixExpr: " + t); } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java index 9fcee1a8f9..49bebad1a7 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java @@ -1,5 +1,7 @@ package com.github.HarryHook.coding2017.stack.expr; +import java.util.List; +import java.util.Stack; public class PostfixExpr { String expr = null; @@ -7,9 +9,46 @@ public class PostfixExpr { public PostfixExpr(String expr) { this.expr = expr; } - + public float evaluate() { - return 0.0f; + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack numStack = new Stack<>(); + for (Token token : tokens) { + + if (token.isNumber()) { + numStack.push(new Float(token.getIntValue())); + } else { + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + } + return numStack.pop().floatValue(); + } + + // 注意,此时计算的顺序和前序的次序相反 + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + if (op.equals("-")) { + return f1 - f2; + } + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + " is not supported"); + } + + public static void main(String[] args) { + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + System.out.println("The result of the expression: " + expr.evaluate()); } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java index bb9451c332..d93b6e32fe 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java @@ -20,16 +20,15 @@ public float evaluate() { for (Token token : tokens) { exprStack.push(token); } - + System.out.println(tokens); while (!exprStack.isEmpty()) { Token t = exprStack.pop(); if (t.isNumber()) { numStack.push(new Float(t.getIntValue())); - } else { + } else if(t.isOperator()){ Float f1 = numStack.pop(); Float f2 = numStack.pop(); numStack.push(calculate(t.toString(), f1, f2)); - } } return numStack.pop().floatValue(); @@ -52,9 +51,8 @@ private Float calculate(String op, Float f1, Float f2) { } public static void main(String[] args) { - - PrefixExpr prefixExpr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - System.out.println(prefixExpr.evaluate()); + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + System.out.println("The result of the expression: " + expr.evaluate()); } } \ No newline at end of file From d0aed3355041dee99f16cdb452333ddb163e4244 Mon Sep 17 00:00:00 2001 From: Harry Date: Mon, 24 Apr 2017 11:24:22 +0800 Subject: [PATCH 278/552] add jvm_4 --- .../coding2017/jvm/attr/CodeAttr.java | 56 +++-- .../coding2017/jvm/attr/LineNumberTable.java | 19 +- .../coding2017/jvm/clz/ClassFile.java | 45 ++-- .../coding2017/jvm/cmd/CommandParser.java | 198 ++++++++++++------ .../coding2017/jvm/constant/ConstantPool.java | 2 +- .../coding2017/jvm/method/Method.java | 4 +- .../coding2017/queue/CircleQueue.java | 38 ++++ 7 files changed, 251 insertions(+), 111 deletions(-) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java index 49a937c1b1..9ecd803572 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java @@ -2,6 +2,7 @@ import com.github.HarryHook.coding2017.jvm.clz.ClassFile; import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; +import com.github.HarryHook.coding2017.jvm.cmd.CommandParser; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; import com.sun.org.apache.bcel.internal.generic.NEW; @@ -16,16 +17,18 @@ public String getCode() { return code; } - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, - String code /* ByteCodeCommand[] cmds */) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, + ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; @@ -43,40 +46,44 @@ public void setLocalVariableTable(LocalVariableTable t) { } public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { - + int attrNameIndex = iter.nextU2ToInt(); int attrLen = iter.nextU4ToInt(); int maxStack = iter.nextU2ToInt(); int maxLocals = iter.nextU2ToInt(); int codeLen = iter.nextU4ToInt(); - + String code = iter.nextUxToHexString(codeLen); System.out.println(code); - - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); - + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); + int exceptionLength = iter.nextU2ToInt(); - if(exceptionLength > 0) { + if (exceptionLength > 0) { String exceptionTable = iter.nextUxToHexString(exceptionLength); System.out.println("exception Table has not complemented" + exceptionTable); } - //解析子属性 + // 解析子属性 int subAttrCount = iter.nextU2ToInt(); - - for(int j=1; j<=subAttrCount; j++) { - + + for (int j = 1; j <= subAttrCount; j++) { + int subAttrIndex = iter.nextU2ToInt(); String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); iter.back(2); - - if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { LineNumberTable t = LineNumberTable.parse(iter); codeAttr.setLineNumberTable(t); - - } else if(AttributeInfo.LOCAL_VAR_TABLE.equals(subAttrName)) { + + } else if (AttributeInfo.LOCAL_VAR_TABLE.equals(subAttrName)) { LocalVariableTable t = LocalVariableTable.parse(iter); codeAttr.setLocalVariableTable(t); - + + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); } else { throw new RuntimeException("Need implement" + subAttrName); } @@ -88,14 +95,17 @@ private void setStackMapTable(StackMapTable t) { this.stackMapTable = t; } + public String toString(ConstantPool pool) { StringBuffer buffer = new StringBuffer(); - buffer.append("Code:").append(code).append("\n"); + for(int i=0;i fields = new ArrayList(); - private List methods = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; } + public void setClzIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } + public AccessFlag getAccessFlag() { return accessFlag; } @@ -82,31 +83,51 @@ public String getSuperClassName() { ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } - + public void addField(Field f) { fields.add(f); } - + public List getFields() { return fields; } - + public void addMethod(Method m) { methods.add(m); - + } + public List getMethods() { return methods; } - public Method getMethod(String methodName, String paramAndReturnType){ - - + + public Method getMethod(String methodName, String paramAndReturnType) { + + for (Method m : methods) { + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if (name.equals(methodName) && desc.equals(paramAndReturnType)) { + return m; + } + } return null; } - public Method getMainMethod(){ - + + public Method getMainMethod() { + for (Method m : methods) { + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { + return m; + } + } return null; } - } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java index 5b78e0eeb1..b982fa7aa4 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java @@ -6,80 +6,150 @@ import com.github.HarryHook.coding2017.jvm.clz.ClassFile; public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - - return null; + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + // System.out.println( cmd.toString(clzFile.getConstPool())); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + } - private static void calcuateOffset(List cmds) { + calcuateOffset(cmds); - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); } - private static class CommandIterator { - String codes = null; - int pos = 0; + } - CommandIterator(String codes) { - this.codes = codes; - } + private static class CommandIterator { + String codes = null; + int pos = 0; - public boolean hasNext() { - return pos < this.codes.length(); - } + CommandIterator(String codes) { + this.codes = codes; + } - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } + public boolean hasNext() { + return pos < this.codes.length(); + } - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); } + + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java index 9d06349f3b..92d1b381d1 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java @@ -25,7 +25,7 @@ public String getUTF8String(int index) { return ((UTF8Info) this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() - 1; } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java index 1182364c71..08b8ff029b 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java @@ -77,8 +77,8 @@ public String toString(ConstantPool pool) { StringBuffer buffer = new StringBuffer(); String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); - buffer.append(name); - buffer.append(desc); + buffer.append(name).append(":").append(desc).append("\n"); + buffer.append(this.codeAttr.toString(pool)); return buffer.toString(); } public ByteCodeCommand[] getCmds() { diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java new file mode 100644 index 0000000000..cd82fb2550 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java @@ -0,0 +1,38 @@ +package com.github.HarryHook.coding2017.queue; + +/** + * 用数组实现循环队列 + * + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + // 用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + // 队头 + private int front = 0; + // 队尾 + private int rear = 0; + + public boolean isEmpty() { + return false; + + } + + public int size() { + return -1; + } + + public void enQueue(E data) { + + } + + public E deQueue() { + return null; + } +} From 18f0c6c1058c7a859f9dd2f7be2f7110af5da041 Mon Sep 17 00:00:00 2001 From: Harry Date: Mon, 24 Apr 2017 11:35:34 +0800 Subject: [PATCH 279/552] add queue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现循环队列,约瑟夫环以及双栈实现队列 --- .../HarryHook/coding2017/queue/Josephus.java | 18 ++++++ .../coding2017/queue/JosephusTest.java | 25 +++++++++ .../HarryHook/coding2017/queue/Queue.java | 55 +++++++++++++++++++ .../coding2017/queue/QueueWithTwoStacks.java | 37 +++++++++++++ 4 files changed, 135 insertions(+) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java new file mode 100644 index 0000000000..7b5fe53f5e --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java @@ -0,0 +1,18 @@ +package com.github.HarryHook.coding2017.queue; + +import java.util.List; + +/** + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 + * + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m) { + return null; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java new file mode 100644 index 0000000000..39d2ef9971 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java @@ -0,0 +1,25 @@ +package com.github.HarryHook.coding2017.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java new file mode 100644 index 0000000000..3be0147770 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java @@ -0,0 +1,55 @@ +package com.github.HarryHook.coding2017.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + private static class Node { + private E item; + private Node next; + } + + public Queue() { + first = null; + last = null; + size = 0; + } + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } else { + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..c72abadcd2 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java @@ -0,0 +1,37 @@ +package com.github.HarryHook.coding2017.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return false; + } + + public int size() { + return -1; + } + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + +} From 4fd6a16a91d51c576456c8dcd10dcc92c193f071 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Mon, 24 Apr 2017 14:09:25 +0800 Subject: [PATCH 280/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/miniJVM/constant/ConstantInfo.java | 15 ++-- .../main/java/miniJVM/constant/UTF8Info.java | 2 +- .../java/miniJVM/loader/ByteCodeIterator.java | 2 +- .../java/miniJVM/loader/ClassFileParser.java | 83 ++++++++++++++++--- 4 files changed, 79 insertions(+), 23 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantInfo.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantInfo.java index 1ff428ec90..6ab8326c7f 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantInfo.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantInfo.java @@ -28,13 +28,12 @@ public ConstantInfo getConstantInfo(int index){ public abstract void accept(Visitor visitor); - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - + public interface Visitor{ + void visitClassInfo(ClassInfo info); + void visitFieldRef(FieldRefInfo info); + void visitMethodRef(MethodRefInfo info); + void visitNameAndType(NameAndTypeInfo info); + void visitString(StringInfo info); + void visitUTF8(UTF8Info info); } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/UTF8Info.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/UTF8Info.java index f9c720429b..ff3518e492 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/constant/UTF8Info.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/UTF8Info.java @@ -28,7 +28,7 @@ public void setValue(String value) { } @Override public void accept(Visitor visitor) { - visitor.visistUTF8(this); + visitor.visitUTF8(this); } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ByteCodeIterator.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ByteCodeIterator.java index 7e3c9f14c1..7ab4e6cc97 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ByteCodeIterator.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ByteCodeIterator.java @@ -24,7 +24,7 @@ public byte[] getBytes(int len) { return data; } - public int nextU1toInt() { + public int nextU1ToInt() { return Util.byteToInt(new byte[] { codes[pos++] }); } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index 7a0fd5252f..e707448916 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -4,34 +4,92 @@ import miniJVM.clz.AccessFlag; import miniJVM.clz.ClassFile; import miniJVM.clz.ClassIndex; -import miniJVM.constant.ConstantPool; +import miniJVM.constant.*; public class ClassFileParser { private ClassFile clzFile = new ClassFile(); - public ClassFile parse(byte[] codes) { - int minorVersion = (codes[4] & 0xFF) + (codes[5] & 0xFF); - clzFile.setMinorVersion(minorVersion); + private ByteCodeIterator iter; - int majorVersion = (codes[6] & 0xFF) + (codes[7] & 0xFF); - clzFile.setMajorVersion(majorVersion); + private static final int MAGIC_NUMBER_LENGTH = 4; + + private static ConstantPool pool; + + public ClassFile parse(byte[] codes){ + iter = new ByteCodeIterator(codes); + iter.pos = MAGIC_NUMBER_LENGTH; + parseVersions(iter); + pool = new ConstantPool(); + parseConstantPool(iter); return clzFile; } - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + private void parseVersions(ByteCodeIterator iter){ + int minorVersion = iter.nextU2ToInt(); + clzFile.setMinorVersion(minorVersion); - return null; + int majorVersion = iter.nextU2ToInt(); + clzFile.setMajorVersion(majorVersion); } - private ClassIndex parseClassInfex(ByteCodeIterator iter) { + private void parseAccessFlag(ByteCodeIterator iter) { + AccessFlag accessFlag = null; + + clzFile.setAccessFlag(accessFlag); + } - return null; + private void parseClassIndex(ByteCodeIterator iter) { + ClassIndex classInfo = null; + clzFile.setClassIndex(classInfo); } - private ConstantPool parseConstantPool(ByteCodeIterator iter) { - return null; + private void parseConstantPool(ByteCodeIterator iter) { + + try{ + //常量池个数 + int cnstSize = iter.nextU2ToInt() - 1; + System.out.println("常量个数:" + cnstSize); + for(int i = 0; i < cnstSize; i++){ + int index = iter.nextU1ToInt(); + if(index == ConstantInfo.CLASS_INFO){ + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(iter.nextU2ToInt()); + pool.addConstantInfo(classInfo); + }else if(index == ConstantInfo.UTF8_INFO){ + UTF8Info utf8Info = new UTF8Info(pool); + int length = iter.nextU2ToInt(); + utf8Info.setLength(length); + utf8Info.setValue(iter.nextUxToHexString(length)); + pool.addConstantInfo(utf8Info); + }else if(index == ConstantInfo.METHOD_INFO){ + MethodRefInfo methodRefInfo = new MethodRefInfo(pool); + methodRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + methodRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(methodRefInfo); + }else if(index == ConstantInfo.NAME_AND_TYPE_INFO){ + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + nameAndTypeInfo.setIndex1(iter.nextU2ToInt()); + nameAndTypeInfo.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameAndTypeInfo); + }else if(index == ConstantInfo.FIELD_INFO){ + FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); + fieldRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + fieldRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(fieldRefInfo); + }else if(index == ConstantInfo.STRING_INFO){ + StringInfo stringInfo = new StringInfo(pool); + stringInfo.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(stringInfo); + } else { + throw new Exception("没有针对index=" + index + "没有处理"); + } + } + clzFile.setConstPool(pool); + }catch(Exception e){ + e.printStackTrace(); + } } // private void parseInterfaces(ByteCodeIterator iter) { // int interfaceCount = iter.nextU2ToInt(); @@ -49,5 +107,4 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { // private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { // // } - } From aa759474c247101a9abdbf44304aba89aba456bf Mon Sep 17 00:00:00 2001 From: macvis Date: Mon, 24 Apr 2017 14:40:32 +0800 Subject: [PATCH 281/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A0maven=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=9A=84pom.xml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- group24/75939388/learning2017/pom.xml | 99 +++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 group24/75939388/learning2017/pom.xml diff --git a/.gitignore b/.gitignore index 6ef02fdccc..6988a7c6d8 100644 --- a/.gitignore +++ b/.gitignore @@ -235,7 +235,7 @@ hs_err_pid* .recommenders -*.xml +#*.xml *.iml .idea *.iml @@ -248,7 +248,7 @@ rebel-remote.xml .metadata target -*.class +#*.class log *.log diff --git a/group24/75939388/learning2017/pom.xml b/group24/75939388/learning2017/pom.xml new file mode 100644 index 0000000000..44d3aab4e9 --- /dev/null +++ b/group24/75939388/learning2017/pom.xml @@ -0,0 +1,99 @@ + + + 4.0.0 + + me.wyc + learning2017 + 1.0 + learning2017 + pom + + https://github.com/macvis/coding2017 + 2017编程提高 + + + + wyc + https://github.com/macvis/ + macvis@126.com + + + + + + + aliyun + aliyun + http://maven.aliyun.com/nexus/content/groups/public + + true + never + + + false + + + + + + + aliyun + aliyun + http://maven.aliyun.com/nexus/content/groups/public + + true + + + false + + + + + + + + + junit + junit + 4.12 + + + + + dom4j + dom4j + 1.6.1 + + + + jaxen + jaxen + 1.1.6 + + + + + commons-io + commons-io + 2.5 + + + org.apache.commons + commons-lang3 + 3.5 + + + commons-codec + commons-codec + 1.10 + + + org.apache.commons + commons-collections4 + 4.1 + + + + \ No newline at end of file From 73f1f8c0a9e29c4b8504dfec420322a972b513f2 Mon Sep 17 00:00:00 2001 From: macvis Date: Mon, 24 Apr 2017 16:08:29 +0800 Subject: [PATCH 282/552] stage files --- .../java/miniJVM/constant/ConstantPool.java | 4 +- .../java/miniJVM/loader/ClassFileParser.java | 173 +++++++++--------- 2 files changed, 91 insertions(+), 86 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantPool.java b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantPool.java index 920d7f0f19..50042ec97d 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantPool.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/constant/ConstantPool.java @@ -12,9 +12,7 @@ public ConstantPool(){ } public void addConstantInfo(ConstantInfo info){ - this.constantInfos.add(info); - } public ConstantInfo getConstantInfo(int index){ @@ -24,7 +22,7 @@ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } public int getSize() { - return this.constantInfos.size() -1; + return this.constantInfos.size() - 1; } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index e707448916..167e6621b3 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -8,89 +8,96 @@ public class ClassFileParser { - private ClassFile clzFile = new ClassFile(); - - private ByteCodeIterator iter; - - private static final int MAGIC_NUMBER_LENGTH = 4; - - private static ConstantPool pool; - - public ClassFile parse(byte[] codes){ - iter = new ByteCodeIterator(codes); - iter.pos = MAGIC_NUMBER_LENGTH; - parseVersions(iter); - pool = new ConstantPool(); - parseConstantPool(iter); - return clzFile; - } - - private void parseVersions(ByteCodeIterator iter){ - int minorVersion = iter.nextU2ToInt(); - clzFile.setMinorVersion(minorVersion); - - int majorVersion = iter.nextU2ToInt(); - clzFile.setMajorVersion(majorVersion); - } - - private void parseAccessFlag(ByteCodeIterator iter) { - AccessFlag accessFlag = null; - - clzFile.setAccessFlag(accessFlag); - } - - private void parseClassIndex(ByteCodeIterator iter) { - ClassIndex classInfo = null; - - clzFile.setClassIndex(classInfo); - } - - private void parseConstantPool(ByteCodeIterator iter) { - - try{ - //常量池个数 - int cnstSize = iter.nextU2ToInt() - 1; - System.out.println("常量个数:" + cnstSize); - for(int i = 0; i < cnstSize; i++){ - int index = iter.nextU1ToInt(); - if(index == ConstantInfo.CLASS_INFO){ - ClassInfo classInfo = new ClassInfo(pool); - classInfo.setUtf8Index(iter.nextU2ToInt()); - pool.addConstantInfo(classInfo); - }else if(index == ConstantInfo.UTF8_INFO){ - UTF8Info utf8Info = new UTF8Info(pool); - int length = iter.nextU2ToInt(); - utf8Info.setLength(length); - utf8Info.setValue(iter.nextUxToHexString(length)); - pool.addConstantInfo(utf8Info); - }else if(index == ConstantInfo.METHOD_INFO){ - MethodRefInfo methodRefInfo = new MethodRefInfo(pool); - methodRefInfo.setClassInfoIndex(iter.nextU2ToInt()); - methodRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); - pool.addConstantInfo(methodRefInfo); - }else if(index == ConstantInfo.NAME_AND_TYPE_INFO){ - NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); - nameAndTypeInfo.setIndex1(iter.nextU2ToInt()); - nameAndTypeInfo.setIndex2(iter.nextU2ToInt()); - pool.addConstantInfo(nameAndTypeInfo); - }else if(index == ConstantInfo.FIELD_INFO){ - FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); - fieldRefInfo.setClassInfoIndex(iter.nextU2ToInt()); - fieldRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); - pool.addConstantInfo(fieldRefInfo); - }else if(index == ConstantInfo.STRING_INFO){ - StringInfo stringInfo = new StringInfo(pool); - stringInfo.setIndex(iter.nextU2ToInt()); - pool.addConstantInfo(stringInfo); - } else { - throw new Exception("没有针对index=" + index + "没有处理"); - } - } - clzFile.setConstPool(pool); - }catch(Exception e){ - e.printStackTrace(); - } - } + private ClassFile clzFile = new ClassFile(); + + private ByteCodeIterator iter; + + private static final int MAGIC_NUMBER_LENGTH = 4; + + private static ConstantPool pool; + + public ClassFile parse(byte[] codes) { + iter = new ByteCodeIterator(codes); + iter.pos = MAGIC_NUMBER_LENGTH; + parseVersions(iter); + pool = new ConstantPool(); + parseConstantPool(iter); + return clzFile; + } + + private void parseVersions(ByteCodeIterator iter) { + int minorVersion = iter.nextU2ToInt(); + clzFile.setMinorVersion(minorVersion); + + int majorVersion = iter.nextU2ToInt(); + clzFile.setMajorVersion(majorVersion); + } + + private void parseAccessFlag(ByteCodeIterator iter) { + AccessFlag accessFlag = null; + + clzFile.setAccessFlag(accessFlag); + } + + private void parseClassIndex(ByteCodeIterator iter) { + ClassIndex classInfo = null; + + clzFile.setClassIndex(classInfo); + } + + private void parseConstantPool(ByteCodeIterator iter) { + + try { + //常量池个数 + int cnstSize = iter.nextU2ToInt(); + System.out.println("常量个数:" + (cnstSize - 1)); + for (int i = 0; i < cnstSize; i++) { + int index = 0; + + if(i == 0){ + continue; + } else { + index = iter.nextU1ToInt(); + } + + if (index == ConstantInfo.CLASS_INFO) { + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(iter.nextU2ToInt()); + pool.addConstantInfo(classInfo); + } else if (index == ConstantInfo.UTF8_INFO) { + UTF8Info utf8Info = new UTF8Info(pool); + int length = iter.nextU2ToInt(); + utf8Info.setLength(length); + utf8Info.setValue(iter.nextUxToHexString(length)); + pool.addConstantInfo(utf8Info); + } else if (index == ConstantInfo.METHOD_INFO) { + MethodRefInfo methodRefInfo = new MethodRefInfo(pool); + methodRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + methodRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(methodRefInfo); + } else if (index == ConstantInfo.NAME_AND_TYPE_INFO) { + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + nameAndTypeInfo.setIndex1(iter.nextU2ToInt()); + nameAndTypeInfo.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameAndTypeInfo); + } else if (index == ConstantInfo.FIELD_INFO) { + FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); + fieldRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + fieldRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(fieldRefInfo); + } else if (index == ConstantInfo.STRING_INFO) { + StringInfo stringInfo = new StringInfo(pool); + stringInfo.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(stringInfo); + } else { + throw new Exception("没有针对index=" + index + "没有处理"); + } + } + clzFile.setConstPool(pool); + } catch (Exception e) { + e.printStackTrace(); + } + } // private void parseInterfaces(ByteCodeIterator iter) { // int interfaceCount = iter.nextU2ToInt(); // From 699b8c225ed499e2f6203a1b42e8ea231f55cc54 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Mon, 24 Apr 2017 16:10:49 +0800 Subject: [PATCH 283/552] CircleQueue finished --- .../com/donaldy/basic/queue/CircleQueue.java | 74 +++++++++++++++++++ .../donaldy/basic/queue/CircleQueueTest.java | 33 +++++++++ .../src/com/donaldy/basic/queue/Josephus.java | 18 +++++ .../com/donaldy/basic/queue/JosephusTest.java | 27 +++++++ .../src/com/donaldy/basic/queue/Queue.java | 62 ++++++++++++++++ .../basic/queue/QueueWithTwoStacks.java | 47 ++++++++++++ 6 files changed, 261 insertions(+) create mode 100644 group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/Josephus.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/Queue.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java diff --git a/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java b/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..fbe5cdc6c8 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java @@ -0,0 +1,74 @@ +package com.donaldy.basic.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + //元素个数 + private int size = 0; + + public boolean isEmpty() { + + return this.size == 0; + + } + + public int size() { + return this.size; + } + + + + public void enQueue(E data) { + + if (this.size == DEFAULT_SIZE) { + throw new IndexOutOfBoundsException("size() : " + this.size()); + } + + this.elementData[this.rear] = data; + + this.rear = (this.rear + 1) % DEFAULT_SIZE; + + this.size ++; + + } + + public E deQueue() { + + if (this.isEmpty()) { + throw new IndexOutOfBoundsException("size() : " + this.size()); + } + + E oldElement = (E) this.elementData[this.front]; + + this.elementData[this.front] = null; + + this.front = (this.front + 1) % DEFAULT_SIZE; + + this.size --; + + return oldElement; + } + + public E getElement(int index) { + + if (index < 0 || index >= DEFAULT_SIZE) { + throw new IndexOutOfBoundsException("index : " + index); + } + + return (E)this.elementData[index]; + } +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java b/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..9489f917ca --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java @@ -0,0 +1,33 @@ +package com.donaldy.basic.queue; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by DonaldY on 2017/4/24. + */ +public class CircleQueueTest { + + @Test + public void test() { + CircleQueue cirQueue = new CircleQueue<>(); + + for (int i = 1; i <= 10; ++i) { + cirQueue.enQueue(i); + } + + Assert.assertEquals(10, cirQueue.size()); + + for (int i = 0; i < 10; ++i) { + Assert.assertEquals(i + 1, (int)cirQueue.getElement(i)); + } + + + for (int i = 0; i <= 5; ++i) { + Assert.assertEquals(i + 1, (int)cirQueue.deQueue()); + } + + Assert.assertEquals(4, cirQueue.size()); + + } +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/Josephus.java b/group24/448641125/src/com/donaldy/basic/queue/Josephus.java new file mode 100644 index 0000000000..237f562234 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/Josephus.java @@ -0,0 +1,18 @@ +package com.donaldy.basic.queue; + +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + return null; + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java b/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..dad206e942 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.donaldy.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/Queue.java b/group24/448641125/src/com/donaldy/basic/queue/Queue.java new file mode 100644 index 0000000000..d504367907 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/Queue.java @@ -0,0 +1,62 @@ +package com.donaldy.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..99ca88525f --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,47 @@ +package com.donaldy.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + + } + From d2f5bb873b808b883d548eb1d0d112afddb3babd Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Mon, 24 Apr 2017 16:57:24 +0800 Subject: [PATCH 284/552] =?UTF-8?q?JVM=E7=AC=AC=E4=B8=80=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/miniJVM/loader/ClassFileParser.java | 18 ++++++++----- .../java/miniJVM/ClassFileloaderTest.java | 26 +++++++++---------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index 167e6621b3..570dbceb5c 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -52,14 +52,16 @@ private void parseConstantPool(ByteCodeIterator iter) { int cnstSize = iter.nextU2ToInt(); System.out.println("常量个数:" + (cnstSize - 1)); for (int i = 0; i < cnstSize; i++) { - int index = 0; + int index = -1; if(i == 0){ - continue; - } else { - index = iter.nextU1ToInt(); - } + pool.addConstantInfo(null); + continue; + }else{ + index = iter.nextU1ToInt(); + } +// System.out.println("i -> " + i + ", index -> " + index); if (index == ConstantInfo.CLASS_INFO) { ClassInfo classInfo = new ClassInfo(pool); classInfo.setUtf8Index(iter.nextU2ToInt()); @@ -68,7 +70,7 @@ private void parseConstantPool(ByteCodeIterator iter) { UTF8Info utf8Info = new UTF8Info(pool); int length = iter.nextU2ToInt(); utf8Info.setLength(length); - utf8Info.setValue(iter.nextUxToHexString(length)); + utf8Info.setValue(new String(iter.getBytes(length), "utf8")); pool.addConstantInfo(utf8Info); } else if (index == ConstantInfo.METHOD_INFO) { MethodRefInfo methodRefInfo = new MethodRefInfo(pool); @@ -89,7 +91,9 @@ private void parseConstantPool(ByteCodeIterator iter) { StringInfo stringInfo = new StringInfo(pool); stringInfo.setIndex(iter.nextU2ToInt()); pool.addConstantInfo(stringInfo); - } else { + } else if(index == 0){ + pool.addConstantInfo(null); + } else { throw new Exception("没有针对index=" + index + "没有处理"); } } diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java b/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java index 5cb994146c..11299d5c20 100644 --- a/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java +++ b/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java @@ -114,50 +114,50 @@ public void testConstantPool(){ ConstantPool pool = clzFile.getConstantPool(); Assert.assertEquals(53, pool.getSize()); - + { ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); Assert.assertEquals(2, clzInfo.getUtf8Index()); - + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + Assert.assertEquals("com/coderising/jvm/test/EmployeeV1", utf8Info.getValue()); } { ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); Assert.assertEquals(4, clzInfo.getUtf8Index()); - + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); Assert.assertEquals("java/lang/Object", utf8Info.getValue()); } { UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); Assert.assertEquals("name", utf8Info.getValue()); - + utf8Info = (UTF8Info) pool.getConstantInfo(6); Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); - + utf8Info = (UTF8Info) pool.getConstantInfo(7); Assert.assertEquals("age", utf8Info.getValue()); - + utf8Info = (UTF8Info) pool.getConstantInfo(8); Assert.assertEquals("I", utf8Info.getValue()); - + utf8Info = (UTF8Info) pool.getConstantInfo(9); Assert.assertEquals("", 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()); @@ -169,7 +169,7 @@ public void testConstantPool(){ Assert.assertEquals(1, methodRef.getClassInfoIndex()); Assert.assertEquals(46, methodRef.getNameAndTypeIndex()); } - + { UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(53); Assert.assertEquals("EmployeeV1.java", utf8Info.getValue()); From 9c083aa975dd3ec0a78a5b6e21af087be838071d Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Mon, 24 Apr 2017 17:03:13 +0800 Subject: [PATCH 285/552] =?UTF-8?q?JVM=E7=AC=AC=E4=B8=80=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/miniJVM/loader/ClassFileParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index 570dbceb5c..353c16cdad 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -94,7 +94,7 @@ private void parseConstantPool(ByteCodeIterator iter) { } else if(index == 0){ pool.addConstantInfo(null); } else { - throw new Exception("没有针对index=" + index + "没有处理"); + throw new Exception("没有针对tag=" + index + "的数据进行处理"); } } clzFile.setConstPool(pool); From 6a0b5e32cb80b6665102ae24921ef3ad74cbbfaa Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Mon, 24 Apr 2017 17:05:18 +0800 Subject: [PATCH 286/552] stage files --- group24/.gitignore | 2 +- group24/75939388/.gitignore | 2 +- .../resources/classes/miniJVM/EmployeeV1.class | Bin 0 -> 1056 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 group24/75939388/learning2017/resources/classes/miniJVM/EmployeeV1.class diff --git a/group24/.gitignore b/group24/.gitignore index 2a5296f902..313344c8f2 100644 --- a/group24/.gitignore +++ b/group24/.gitignore @@ -1,4 +1,4 @@ -*.class +#*.class # Mobile Tools for Java (J2ME) .mtj.tmp/ diff --git a/group24/75939388/.gitignore b/group24/75939388/.gitignore index 596bd7346d..4923f59d8c 100644 --- a/group24/75939388/.gitignore +++ b/group24/75939388/.gitignore @@ -1,4 +1,4 @@ -*.class +#*.class target/ *.iml .idea/ \ No newline at end of file diff --git a/group24/75939388/learning2017/resources/classes/miniJVM/EmployeeV1.class b/group24/75939388/learning2017/resources/classes/miniJVM/EmployeeV1.class new file mode 100644 index 0000000000000000000000000000000000000000..c6c3c4a41546ae14b237a06a8f0868a61dc42cf5 GIT binary patch literal 1056 zcmah|?M@Rx6g^W)Kb93rYikjZ1yTEftSIUa3<)tBNGh6Onh<{tWrEx6cAM^&q>rTu zkZ9rq_)x|((;~rQ%x-4yow@hibI!Cse|`G_U=uIWNC>R7!oY2X$ExQ=UgyMZp9XHM zqS$>Cbp3FkRC6PZq(H7MPo?Wimb^b|t5z(K?8ra~_q~rjsJ@y*L0-feIuoK14Yd+#flv*C|NO#Gm#wZD&G&YSj18q z_pbSKFo zqck206pYW;F>F*&ri8AB^*dx3NROXV<zW&u2{pkVSAq|3&P2R7ekXatSzM=>9r9e) z&D1Vn*Xm~s7S1sH#WWPS=8@!@h zoMZKGYDKn`44lmtZNyM;7FE Date: Mon, 24 Apr 2017 17:06:35 +0800 Subject: [PATCH 287/552] stage files --- group24/75939388/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group24/75939388/.gitignore b/group24/75939388/.gitignore index 4923f59d8c..596bd7346d 100644 --- a/group24/75939388/.gitignore +++ b/group24/75939388/.gitignore @@ -1,4 +1,4 @@ -#*.class +*.class target/ *.iml .idea/ \ No newline at end of file From a05ae166984dc3d5348eb2b12cf6a5a29bc6aeea Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Mon, 24 Apr 2017 17:10:52 +0800 Subject: [PATCH 288/552] stage files --- group24/.gitignore | 2 +- group24/75939388/learning2017/pom.xml | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/group24/.gitignore b/group24/.gitignore index 313344c8f2..2a5296f902 100644 --- a/group24/.gitignore +++ b/group24/.gitignore @@ -1,4 +1,4 @@ -#*.class +*.class # Mobile Tools for Java (J2ME) .mtj.tmp/ diff --git a/group24/75939388/learning2017/pom.xml b/group24/75939388/learning2017/pom.xml index 44d3aab4e9..e298986c2a 100644 --- a/group24/75939388/learning2017/pom.xml +++ b/group24/75939388/learning2017/pom.xml @@ -4,18 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - me.wyc + tee.w learning2017 1.0 learning2017 pom https://github.com/macvis/coding2017 - 2017编程提高 + 码农翻身 - wyc + TerrenceWen https://github.com/macvis/ macvis@126.com @@ -60,20 +60,21 @@ 4.12 - + dom4j dom4j 1.6.1 - + + jaxen jaxen 1.1.6 - + commons-io commons-io From 6e777c5ace01fbb56a12cb9e2f84b5eb9c74807c Mon Sep 17 00:00:00 2001 From: gongxun Date: Mon, 24 Apr 2017 18:40:06 +0800 Subject: [PATCH 289/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A04=E6=9C=8823=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.16/cmd/BiPushCmd.java | 9 ++ .../785396327/4.16/cmd/ByteCodeCommand.java | 4 +- group17/785396327/4.16/cmd/GetFieldCmd.java | 7 ++ .../785396327/4.16/cmd/GetStaticFieldCmd.java | 7 ++ .../785396327/4.16/cmd/InvokeSpecialCmd.java | 7 ++ .../785396327/4.16/cmd/InvokeVirtualCmd.java | 7 ++ group17/785396327/4.16/cmd/LdcCmd.java | 7 ++ group17/785396327/4.16/cmd/NewObjectCmd.java | 9 +- group17/785396327/4.16/cmd/NoOperandCmd.java | 6 ++ group17/785396327/4.16/cmd/PutFieldCmd.java | 7 ++ .../4.23/engine/ExecutionResult.java | 55 +++++++++++ .../785396327/4.23/engine/ExecutorEngine.java | 29 ++++++ .../785396327/4.23/engine/FrameResult.java | 7 ++ group17/785396327/4.23/engine/Heap.java | 41 ++++++++ group17/785396327/4.23/engine/JavaObject.java | 73 ++++++++++++++ group17/785396327/4.23/engine/MethodArea.java | 70 ++++++++++++++ group17/785396327/4.23/engine/MiniJVM.java | 29 ++++++ group17/785396327/4.23/engine/StackFrame.java | 95 +++++++++++++++++++ group17/785396327/4.23/queue/CircleQueue.java | 36 +++++++ group17/785396327/4.23/queue/Josephus.java | 15 +++ .../785396327/4.23/queue/JosephusTest.java | 26 +++++ .../4.23/queue/QueueWithTwoStacks.java | 42 ++++++++ 22 files changed, 586 insertions(+), 2 deletions(-) create mode 100644 group17/785396327/4.23/engine/ExecutionResult.java create mode 100644 group17/785396327/4.23/engine/ExecutorEngine.java create mode 100644 group17/785396327/4.23/engine/FrameResult.java create mode 100644 group17/785396327/4.23/engine/Heap.java create mode 100644 group17/785396327/4.23/engine/JavaObject.java create mode 100644 group17/785396327/4.23/engine/MethodArea.java create mode 100644 group17/785396327/4.23/engine/MiniJVM.java create mode 100644 group17/785396327/4.23/engine/StackFrame.java create mode 100644 group17/785396327/4.23/queue/CircleQueue.java create mode 100644 group17/785396327/4.23/queue/Josephus.java create mode 100644 group17/785396327/4.23/queue/JosephusTest.java create mode 100644 group17/785396327/4.23/queue/QueueWithTwoStacks.java diff --git a/group17/785396327/4.16/cmd/BiPushCmd.java b/group17/785396327/4.16/cmd/BiPushCmd.java index 9353ea0412..79da192e67 100644 --- a/group17/785396327/4.16/cmd/BiPushCmd.java +++ b/group17/785396327/4.16/cmd/BiPushCmd.java @@ -2,6 +2,9 @@ import clz.ClassFile; import constant.ConstantPool; +import engine.ExecutionResult; +import engine.FrameResult; +import engine.StackFrame; /** * Created by william on 2017/4/17. @@ -17,4 +20,10 @@ public String toString(ConstantPool pool) { return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } + } diff --git a/group17/785396327/4.16/cmd/ByteCodeCommand.java b/group17/785396327/4.16/cmd/ByteCodeCommand.java index f10bfa21d3..66abdd0865 100644 --- a/group17/785396327/4.16/cmd/ByteCodeCommand.java +++ b/group17/785396327/4.16/cmd/ByteCodeCommand.java @@ -3,6 +3,8 @@ import clz.ClassFile; import constant.ConstantInfo; import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; import java.util.HashMap; import java.util.Map; @@ -125,5 +127,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame, FrameResult result); } diff --git a/group17/785396327/4.16/cmd/GetFieldCmd.java b/group17/785396327/4.16/cmd/GetFieldCmd.java index c7307abf56..59425edc38 100644 --- a/group17/785396327/4.16/cmd/GetFieldCmd.java +++ b/group17/785396327/4.16/cmd/GetFieldCmd.java @@ -2,6 +2,8 @@ import clz.ClassFile; import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; /** * Created by william on 2017/4/17. @@ -17,4 +19,9 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, FrameResult result) { + + } + } diff --git a/group17/785396327/4.16/cmd/GetStaticFieldCmd.java b/group17/785396327/4.16/cmd/GetStaticFieldCmd.java index 37ca3c7195..c21e230306 100644 --- a/group17/785396327/4.16/cmd/GetStaticFieldCmd.java +++ b/group17/785396327/4.16/cmd/GetStaticFieldCmd.java @@ -2,6 +2,8 @@ import clz.ClassFile; import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; /** * Created by IBM on 2017/4/17. @@ -17,4 +19,9 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } } diff --git a/group17/785396327/4.16/cmd/InvokeSpecialCmd.java b/group17/785396327/4.16/cmd/InvokeSpecialCmd.java index 80af63e860..3dd0c7b70e 100644 --- a/group17/785396327/4.16/cmd/InvokeSpecialCmd.java +++ b/group17/785396327/4.16/cmd/InvokeSpecialCmd.java @@ -2,6 +2,8 @@ import clz.ClassFile; import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; /** * Created by IBM on 2017/4/17. @@ -17,4 +19,9 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } } diff --git a/group17/785396327/4.16/cmd/InvokeVirtualCmd.java b/group17/785396327/4.16/cmd/InvokeVirtualCmd.java index 631e743c5f..254534a78f 100644 --- a/group17/785396327/4.16/cmd/InvokeVirtualCmd.java +++ b/group17/785396327/4.16/cmd/InvokeVirtualCmd.java @@ -2,6 +2,8 @@ import clz.ClassFile; import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; /** * Created by IBM on 2017/4/17. @@ -16,4 +18,9 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } } diff --git a/group17/785396327/4.16/cmd/LdcCmd.java b/group17/785396327/4.16/cmd/LdcCmd.java index 183a4010de..ce1f34df3c 100644 --- a/group17/785396327/4.16/cmd/LdcCmd.java +++ b/group17/785396327/4.16/cmd/LdcCmd.java @@ -4,6 +4,8 @@ import constant.ConstantInfo; import constant.ConstantPool; import constant.StringInfo; +import engine.FrameResult; +import engine.StackFrame; /** * Created by IBM on 2017/4/17. @@ -27,4 +29,9 @@ public String toString(ConstantPool pool) { return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } } diff --git a/group17/785396327/4.16/cmd/NewObjectCmd.java b/group17/785396327/4.16/cmd/NewObjectCmd.java index 6cd609aeb4..d284274f0b 100644 --- a/group17/785396327/4.16/cmd/NewObjectCmd.java +++ b/group17/785396327/4.16/cmd/NewObjectCmd.java @@ -2,9 +2,11 @@ import clz.ClassFile; import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; /** - * Created by IBM on 2017/4/17. + * Created by gongxun on 2017/4/17. */ public class NewObjectCmd extends TwoOperandCmd { public NewObjectCmd(ClassFile clzFile, String opCode){ @@ -17,4 +19,9 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } + @Override + public void execute(StackFrame frame, FrameResult result) { + + } + } diff --git a/group17/785396327/4.16/cmd/NoOperandCmd.java b/group17/785396327/4.16/cmd/NoOperandCmd.java index 7797d5218e..828ae2094e 100644 --- a/group17/785396327/4.16/cmd/NoOperandCmd.java +++ b/group17/785396327/4.16/cmd/NoOperandCmd.java @@ -2,6 +2,8 @@ import clz.ClassFile; import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; /** * Created by IBM on 2017/4/17. @@ -16,6 +18,10 @@ public String toString(ConstantPool pool) { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } + @Override + public void execute(StackFrame frame, FrameResult result) { + + } public int getLength(){ diff --git a/group17/785396327/4.16/cmd/PutFieldCmd.java b/group17/785396327/4.16/cmd/PutFieldCmd.java index 07c88273cc..f0994739a0 100644 --- a/group17/785396327/4.16/cmd/PutFieldCmd.java +++ b/group17/785396327/4.16/cmd/PutFieldCmd.java @@ -2,6 +2,8 @@ import clz.ClassFile; import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; /** * Created by IBM on 2017/4/17. @@ -16,4 +18,9 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } } diff --git a/group17/785396327/4.23/engine/ExecutionResult.java b/group17/785396327/4.23/engine/ExecutionResult.java new file mode 100644 index 0000000000..4dcb84fb62 --- /dev/null +++ b/group17/785396327/4.23/engine/ExecutionResult.java @@ -0,0 +1,55 @@ +package engine; + +import method.Method; + +/** + * Created by gongxun on 2017/4/24. + */ +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + +} diff --git a/group17/785396327/4.23/engine/ExecutorEngine.java b/group17/785396327/4.23/engine/ExecutorEngine.java new file mode 100644 index 0000000000..729d7c12be --- /dev/null +++ b/group17/785396327/4.23/engine/ExecutorEngine.java @@ -0,0 +1,29 @@ +package engine; + +import method.Method; +import stack.Stack; + +/** + * Created by gongxun on 2017/4/24. + */ +public class ExecutorEngine { + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } +} diff --git a/group17/785396327/4.23/engine/FrameResult.java b/group17/785396327/4.23/engine/FrameResult.java new file mode 100644 index 0000000000..7630e0a37a --- /dev/null +++ b/group17/785396327/4.23/engine/FrameResult.java @@ -0,0 +1,7 @@ +package engine; + +/** + * Created by gongxun on 2017/4/24. + */ +public class FrameResult { +} diff --git a/group17/785396327/4.23/engine/Heap.java b/group17/785396327/4.23/engine/Heap.java new file mode 100644 index 0000000000..dc7c2ccf6f --- /dev/null +++ b/group17/785396327/4.23/engine/Heap.java @@ -0,0 +1,41 @@ +package engine; + +/** + * Created by gongxun on 2017/4/24. + */ +public class Heap { + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group17/785396327/4.23/engine/JavaObject.java b/group17/785396327/4.23/engine/JavaObject.java new file mode 100644 index 0000000000..efd8adf5df --- /dev/null +++ b/group17/785396327/4.23/engine/JavaObject.java @@ -0,0 +1,73 @@ +package engine; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by gongxun on 2017/4/24. + */ +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } +} diff --git a/group17/785396327/4.23/engine/MethodArea.java b/group17/785396327/4.23/engine/MethodArea.java new file mode 100644 index 0000000000..3ede83b192 --- /dev/null +++ b/group17/785396327/4.23/engine/MethodArea.java @@ -0,0 +1,70 @@ +package engine; + +import clz.ClassFile; +import constant.MethodRefInfo; +import jvm_1.ClassFileLoader; +import method.Method; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by gongxun on 2017/4/24. + */ +public class MethodArea { + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group17/785396327/4.23/engine/MiniJVM.java b/group17/785396327/4.23/engine/MiniJVM.java new file mode 100644 index 0000000000..19094eee23 --- /dev/null +++ b/group17/785396327/4.23/engine/MiniJVM.java @@ -0,0 +1,29 @@ +package engine; + +import jvm_1.ClassFileLoader; + +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * Created by gongxun on 2017/4/24. + */ +public class MiniJVM { + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException { + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } +} diff --git a/group17/785396327/4.23/queue/CircleQueue.java b/group17/785396327/4.23/queue/CircleQueue.java new file mode 100644 index 0000000000..228bf1aba1 --- /dev/null +++ b/group17/785396327/4.23/queue/CircleQueue.java @@ -0,0 +1,36 @@ +package queue; + +/** + * Created by gongxun on 2017/4/24. + * 用数组实现循环队列 + */ +public class CircleQueue { + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return false; + + } + + public int size() { + return -1; + } + + + + public void enQueue(E data) { + + } + + public E deQueue() { + return null; + } +} diff --git a/group17/785396327/4.23/queue/Josephus.java b/group17/785396327/4.23/queue/Josephus.java new file mode 100644 index 0000000000..7d85d94a01 --- /dev/null +++ b/group17/785396327/4.23/queue/Josephus.java @@ -0,0 +1,15 @@ +package queue; + +import java.util.List; + +/** + * Created by gongxun on 2017/4/24. + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + */ +public class Josephus { + public static List execute(int n, int m) { + return null; + } +} diff --git a/group17/785396327/4.23/queue/JosephusTest.java b/group17/785396327/4.23/queue/JosephusTest.java new file mode 100644 index 0000000000..ba502d0ffb --- /dev/null +++ b/group17/785396327/4.23/queue/JosephusTest.java @@ -0,0 +1,26 @@ +package queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/24. + */ +public class JosephusTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } +} diff --git a/group17/785396327/4.23/queue/QueueWithTwoStacks.java b/group17/785396327/4.23/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..7f38a9c20c --- /dev/null +++ b/group17/785396327/4.23/queue/QueueWithTwoStacks.java @@ -0,0 +1,42 @@ +package queue; + +import stack.Stack; + +/** + * Created by gongxun on 2017/4/24. + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + +} From 3e956cb57f9dfff55b8860d7a3b3b03ba63889b5 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Mon, 24 Apr 2017 19:58:54 +0800 Subject: [PATCH 290/552] datastructure finished --- .../donaldy/basic/queue/CircleQueueTest.java | 2 + .../src/com/donaldy/basic/queue/Josephus.java | 50 +++++++++++++++++-- .../basic/queue/QueueWithTwoStacks.java | 45 ++++++++++++----- .../basic/queue/QueueWithTwoStacksTest.java | 23 +++++++++ 4 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java diff --git a/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java b/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java index 9489f917ca..f6516c7743 100644 --- a/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java +++ b/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java @@ -3,6 +3,8 @@ import org.junit.Assert; import org.junit.Test; + + /** * Created by DonaldY on 2017/4/24. */ diff --git a/group24/448641125/src/com/donaldy/basic/queue/Josephus.java b/group24/448641125/src/com/donaldy/basic/queue/Josephus.java index 237f562234..9d3d588148 100644 --- a/group24/448641125/src/com/donaldy/basic/queue/Josephus.java +++ b/group24/448641125/src/com/donaldy/basic/queue/Josephus.java @@ -1,18 +1,62 @@ package com.donaldy.basic.queue; +import java.util.ArrayList; import java.util.List; /** * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, + * 直到最后一个人留下来 * 该方法返回一个List, 包含了被杀死人的次序 * @author liuxin * */ public class Josephus { - public static List execute(int n, int m){ - return null; + public static List execute(int n, int m){ + + List killList = new ArrayList(); + + //用于存储 + Queue queue1 = new Queue<>(); + //用于操作 + Queue queue2 = new Queue<>(); + + for (int i = 0; i < n; ++i) { + + queue1.enQueue(i); + + } + + int cnt = 1; + + while (true) { + + if (queue1.size() < m) { + break; + } + + if (cnt % m == 0) { + + killList.add(queue1.deQueue()); + + } else { + + queue1.enQueue(queue1.deQueue()); + + } + + cnt ++; + + } + + while (!queue1.isEmpty()) { + killList.add(queue1.deQueue()); + } + + + return killList; } } diff --git a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java index 99ca88525f..98496b3e77 100644 --- a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java +++ b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java @@ -9,38 +9,59 @@ * @param */ public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - + //用于存储 + private Stack stack1; + //用于操作 + private Stack stack2; + public QueueWithTwoStacks() { stack1 = new Stack(); stack2 = new Stack(); } - - public boolean isEmpty() { - return false; + + return this.stack1.isEmpty(); + } - public int size() { - return -1; - } + return this.stack1.size(); + + } public void enQueue(E item) { - + this.stack1.push(item); } public E deQueue() { - return null; - } + if (this.size() <= 0) { + throw new IndexOutOfBoundsException("size : " + this.size()); + } + + while (!this.stack1.isEmpty()) { + + this.stack2.push(this.stack1.pop()); + + } + + E oldElement = this.stack2.pop(); + + while (!this.stack2.isEmpty()) { + + this.stack1.push(this.stack2.pop()); + + } + + return oldElement; + + } } diff --git a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..21dcd53b85 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,23 @@ +package com.donaldy.basic.queue; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by DonaldY on 2017/4/24. + */ +public class QueueWithTwoStacksTest { + + @Test + public void test() { + QueueWithTwoStacks qwStack = new QueueWithTwoStacks(); + + for (int i = 1; i <= 5; ++i) { + qwStack.enQueue(i); + } + + for (int i = 1; i <= 5; ++i) { + Assert.assertEquals(i, (int)qwStack.deQueue()); + } + } +} From 1c826c118fccb1433c1a991f9ec8f5e3a472dc1d Mon Sep 17 00:00:00 2001 From: GordenChow <513274874@qq.com> Date: Mon, 24 Apr 2017 19:59:37 +0800 Subject: [PATCH 291/552] =?UTF-8?q?JVM=E7=AC=AC=E4=BA=94=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JVM第五周作业,修改以往作业bug --- .../src/com/coding/basic/Stack.java | 65 --------- .../coding/basic/{ => array}/ArrayList.java | 6 +- .../com/coding/basic/{ => array}/List.java | 2 +- .../com/coding/basic/linklist/LinkedList.java | 2 +- .../src/com/coding/basic/stack/Stack.java | 4 +- .../basic/stack/expr/InfixExprTest.java | 9 ++ .../basic/stack/expr/InfixToPostfix.java | 57 ++++++++ .../coding/basic/stack/expr/PostfixExpr.java | 51 +++++++ .../basic/stack/expr/PostfixExprTest.java | 41 ++++++ .../coding/basic/stack/expr/PrefixExpr.java | 18 +++ .../basic/stack/expr/PrefixExprTest.java | 45 ++++++ .../com/coding/basic/stack/expr/Token.java | 50 +++++++ .../coding/basic/stack/expr/TokenParser.java | 57 ++++++++ .../basic/stack/expr/TokenParserTest.java | 41 ++++++ .../src/com/coderising/jvm/attr/CodeAttr.java | 22 ++- .../coderising/jvm/attr/LineNumberTable.java | 12 ++ .../jvm/attr/LocalVariableTable.java | 15 ++ .../src/com/coderising/jvm/clz/ClassFile.java | 20 ++- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 ++++ .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 85 ++++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 ++++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 ++++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 ++++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 +++++++++ .../coderising/jvm/constant/ClassInfo.java | 4 + .../coderising/jvm/constant/ConstantInfo.java | 11 ++ .../coderising/jvm/constant/FieldRefInfo.java | 4 + .../jvm/constant/MethodRefInfo.java | 5 + .../jvm/constant/NameAndTypeInfo.java | 6 + .../jvm/constant/NullConstantInfo.java | 4 + .../coderising/jvm/constant/StringInfo.java | 6 + .../com/coderising/jvm/constant/UTF8Info.java | 5 + .../src/com/coderising/jvm/method/Method.java | 22 +++ .../jvm/print/ClassFilePrinter.java | 45 ++++++ .../jvm/print/ConstantPoolPrinter.java | 83 ++++++++++++ .../jvm/test/ClassFileloaderTest.java | 77 +++++++++++ 43 files changed, 1220 insertions(+), 79 deletions(-) delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/Stack.java rename group27/513274874/data-structure/src/com/coding/basic/{ => array}/ArrayList.java (96%) rename group27/513274874/data-structure/src/com/coding/basic/{ => array}/List.java (81%) create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java diff --git a/group27/513274874/data-structure/src/com/coding/basic/Stack.java b/group27/513274874/data-structure/src/com/coding/basic/Stack.java deleted file mode 100644 index 034e4c7215..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,65 +0,0 @@ - -package com.coding.basic; - -/** - * author zhougd 20170306 - * - */ -public class Stack { - private List elementData = new ArrayList(); - - - public Stack() { - } - - /** - * 入栈 - * @param o - */ - public void push(Object o){ - elementData.add(o); - } - - /** - * 出栈 - * @return - */ - public Object pop(){ - if(this.isEmpty()){ - throw new IndexOutOfBoundsException("stack is empty!"); - } - Object element = elementData.get(size()-1); - elementData.remove(size()-1); - return element; - } - - /** - * 查看栈顶元素 - * @return Object - */ - public Object peek(){ - if(this.isEmpty()){ - throw new IndexOutOfBoundsException("stack is empty!"); - } - Object element = elementData.get(size()-1); - return element; - } - - /** - * 查看栈是否为空 - * @return boolean - */ - public boolean isEmpty(){ - - return elementData == null || elementData.size()<=0; - - } - - /** - * 获取栈大小 - * @return - */ - public int size(){ - return elementData.size(); - } -} \ No newline at end of file diff --git a/group27/513274874/data-structure/src/com/coding/basic/ArrayList.java b/group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java similarity index 96% rename from group27/513274874/data-structure/src/com/coding/basic/ArrayList.java rename to group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java index 9e55e92529..7d6d7a08f2 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/ArrayList.java +++ b/group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java @@ -1,5 +1,7 @@ -package com.coding.basic; +package com.coding.basic.array; + +import com.coding.basic.Iterator; import java.util.Arrays; @@ -78,7 +80,7 @@ public Object remove(int index) { } public int size() { - return this.size + 1; + return this.size; } public Iterator iterator() { diff --git a/group27/513274874/data-structure/src/com/coding/basic/List.java b/group27/513274874/data-structure/src/com/coding/basic/array/List.java similarity index 81% rename from group27/513274874/data-structure/src/com/coding/basic/List.java rename to group27/513274874/data-structure/src/com/coding/basic/array/List.java index 396b1f6416..2a07c92d6e 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/List.java +++ b/group27/513274874/data-structure/src/com/coding/basic/array/List.java @@ -1,4 +1,4 @@ -package com.coding.basic; +package com.coding.basic.array; public interface List { public void add(Object o); diff --git a/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java b/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java index e6d400f483..245affee80 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java +++ b/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java @@ -2,7 +2,7 @@ package com.coding.basic.linklist; import com.coding.basic.Iterator; -import com.coding.basic.List; +import com.coding.basic.array.List; import java.util.NoSuchElementException; diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java b/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java index 4a0980079b..3b8a9eeb5a 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java @@ -1,7 +1,8 @@ package com.coding.basic.stack; -import com.coding.basic.List; + +import com.coding.basic.array.List; import com.coding.basic.array.ArrayList; /** @@ -20,6 +21,7 @@ public Stack() { * @param o */ public void push(Object o){ + elementData.add(o); } diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java index 343683f11a..ddb1130398 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -42,7 +42,16 @@ public void testEvaluate() { InfixExpr expr = new InfixExpr("10-30+50"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } } + @Test + public void testConert(){ + new InfixToPostfix().convert("2*3*4+5"); + } + } diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..55eb061ce0 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +import java.util.ArrayList; +import java.util.List; + +public class InfixToPostfix { + private Stack operStack = new Stack(); + + public List convert(String expr) { + + List infixList = TokenParser.parse(expr); + List postfixList = new ArrayList<>(); + int i = 0; + while(i < infixList.size()){ + Token token = infixList.get(i); + if(token.isNumber()){ + //operand + postfixList.add(token); + + }else{ + //operator + if(operStack.isEmpty()) { + operStack.push(token); + i++; + continue; + } + + Token topToken = (Token)operStack.pop(); + + if(token.hasHigherPriority(topToken)){ + //the operator has higher priority than the arg operator + postfixList.add(infixList.get(++i)); + postfixList.add(token); + operStack.push(topToken); + + }else{ + postfixList.add(topToken); + operStack.push(token); + } + + } + i++; + } + //empty operStack + while(!operStack.isEmpty()){ + postfixList.add((Token)operStack.pop()); + } + for (Token token :postfixList){ + System.out.print(token.value); + } + System.out.println(); + return postfixList; + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..27b9ee9c31 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,51 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +import java.util.List; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List postfixExpr = TokenParser.parse(expr); + + Stack calc = new Stack(); + for(Token token :postfixExpr){ + if(token.isNumber()){ + //push number into stack until operator + calc.push(token.getIntValue()); + }else { + //operator : pop two numbers to calculate and then push the result into stack + int numberA = (int)calc.pop(); + int numberB = (int)calc.pop(); + + switch (token.value){ + case "+": + calc.push(numberB + numberA ); + break; + case "-": + calc.push(numberB - numberA); + break; + case "*": + calc.push(numberB * numberA); + break; + case "/": + calc.push(numberB / numberA); + break; + + default: + throw new RuntimeException(token.value + " is not a operator !"); + } + } + } + + //the result is the only value in the stack + float result = Float.parseFloat(calc.pop() + ""); + return result; + } +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..956927e2df --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,18 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..7ef3d1959c --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public static List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private static int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private static boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java index cf37bf22aa..da789aa68f 100644 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,6 +1,8 @@ package com.coderising.jvm.attr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -14,10 +16,10 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; @@ -84,6 +86,18 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { return codeAttr; } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..2bb36340f5 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java index aea9048ea4..c8e65ff493 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -21,4 +21,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java index 466b072244..88353df2d3 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -26,4 +26,15 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index 65475e194c..7ae71396ef 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,4 +51,8 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index 9568c571d8..c85d1c8ccd 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -49,6 +49,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index b9d9185ef8..e4f6d027e0 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -46,4 +46,10 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index 936736016f..41e0fd7e7a 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java index f1f8eb4ed4..6bfcb47273 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java index 5cac9f04f7..7db88a939e 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -26,6 +26,11 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java index 3d2c8e2554..d7716bf181 100644 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java @@ -3,6 +3,8 @@ import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; @@ -73,4 +75,24 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { return method; } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..ac8be13069 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMajorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "/Users/guodongchow/Desktop/coding2017/"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..460c003aac --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,83 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getNameIndex()).append(":#") + .append(info.getDescriptorIndex()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + + for(int i=1; i<=pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } + } +} \ No newline at end of file diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index bd32473909..8a522e4338 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.*; import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; @@ -264,6 +268,79 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand[] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From ccdb524d2d7648f8e7f6eef250be896bbe654c3b Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 24 Apr 2017 22:23:04 +0800 Subject: [PATCH 292/552] InfixToPostFix --- .../coding/basic/stack/expr/InfixExpr.java | 22 +++----- .../basic/stack/expr/InfixToPostfix.java | 50 +++++++++++-------- .../basic/stack/expr/InfixToPostfixTest.java | 41 +++++++++++++++ 3 files changed, 78 insertions(+), 35 deletions(-) create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java index 08918c490c..cebef21fa3 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java @@ -25,22 +25,16 @@ public float evaluate() { if (token.isOperator()){ - if(opStack.isEmpty()){ + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); - opStack.push(token); - } else{ - - while(!opStack.isEmpty() - && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(), f1,f2); - numStack.push(result); - - } - opStack.push(token); } + opStack.push(token); } if(token.isNumber()){ numStack.push(new Float(token.getIntValue())); diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java index d52ec73bd3..2288e3bd29 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -1,35 +1,43 @@ package com.coding.basic.stack.expr; +import java.util.ArrayList; import java.util.List; import java.util.Stack; public class InfixToPostfix { public static List convert(String expr) { - return null; - } - - public static void main(String[] args) { - Stack stack = new Stack(); - String expr = "1+((2+3)*4)-5"; - for(int i=0;i inFixTokens = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList<>(); + + Stack opStack = new Stack(); + for(Token token : inFixTokens){ + + if(token.isOperator()){ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + postFixTokens.add(opStack.pop()); + + } + opStack.push(token); + } - else if(c == ')'){ - System.out.print(stack.pop() + " "); - } - else if(c == '('){ - System.out.print(" "); - } else{ - System.out.print(c +" "); + if(token.isNumber()){ + + postFixTokens.add(token); + } } - System.out.println(""); + + while(!opStack.isEmpty()){ + postFixTokens.add(opStack.pop()); + } + + return postFixTokens; } + + } diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..f879f55f14 --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} From a6f8780f23b0d55588a8440aa292572c10d61779 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Mon, 24 Apr 2017 22:56:16 +0800 Subject: [PATCH 293/552] =?UTF-8?q?=EF=BC=88=E8=A1=A5=EF=BC=89=E8=A7=A3?= =?UTF-8?q?=E9=87=8A=E5=AD=97=E8=8A=82=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (补)解释字节码 --- .../src/com/coderising/jvm/attr/CodeAttr.java | 20 ++- .../src/com/coderising/jvm/clz/ClassFile.java | 21 ++- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 +++ .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 138 ++++++++++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 +++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 +++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 +++++++++ .../src/com/coderising/jvm/method/Method.java | 5 + .../jvm/print/ClassFilePrinter.java | 54 +++++++ .../jvm/print/ConstantPoolPrinter.java | 25 ++++ .../jvm/test/ClassFileloaderTest.java | 79 +++++++++- 19 files changed, 756 insertions(+), 11 deletions(-) create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java index 56c3bf2b0c..e5d5e522ee 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,6 +1,8 @@ package com.coderising.jvm.attr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -14,21 +16,21 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -45,9 +47,11 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxStack = iter.nextU2ToInt(); int maxLocals = iter.nextU2ToInt(); int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); - System.out.println(code); - CodeAttr attr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + ByteCodeCommand[] commands = CommandParser.parse(clzFile, code); + + CodeAttr attr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, commands); int expTableLen = iter.nextU2ToInt(); if(expTableLen > 0){ String expTable = iter.nextUxToHexString(expTableLen); diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java index 64d38df4a2..471f04d265 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -86,12 +86,12 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } @@ -101,4 +101,21 @@ public List getFields() { public void setFields(List fields) { this.fields = fields; } + + public Method getMethod(String methodName, String paramAndReturnType){ + for(Method m : this.methods){ + String mName = this.getConstantPool().getUTF8String(m.getNameIndex()); + String pAndRT = this.getConstantPool().getUTF8String(m.getDescriptorIndex()); + if(methodName.equals(mName) + && paramAndReturnType.equals(pAndRT)){ + return m; + } + } + + return null; + } + public Method getMainMethod(){ + + return getMethod("main", "([Ljava/lang/String;)V"); + } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..fca703c59a --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,138 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + List cmds = new ArrayList<>(); + CommandIterator iter = new CommandIterator(codes); + while(iter.hasNext()){ + String opCode = iter.next2CharAsString().toUpperCase(); + if(new_object.equals(opCode)){ + NewObjectCmd newObjCmd = new NewObjectCmd(clzFile, opCode); + newObjCmd.setOprand1(iter.next2CharAsInt()); + newObjCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(newObjCmd); + }else if(getfield.equals(opCode)){ + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, opCode); + getFieldCmd.setOprand1(iter.next2CharAsInt()); + getFieldCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(getFieldCmd); + }else if(getstatic.equals(opCode)){ + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, opCode); + getStaticFieldCmd.setOprand1(iter.next2CharAsInt()); + getStaticFieldCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(getStaticFieldCmd); + }else if(putfield.equals(opCode)){ + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, opCode); + putFieldCmd.setOprand1(iter.next2CharAsInt()); + putFieldCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(putFieldCmd); + }else if(invokevirtual.equals(opCode)){ + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, opCode); + invokeVirtualCmd.setOprand1(iter.next2CharAsInt()); + invokeVirtualCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(invokeVirtualCmd); + }else if(invokespecial.equals(opCode)){ + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, opCode); + invokeSpecialCmd.setOprand1(iter.next2CharAsInt()); + invokeSpecialCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(invokeSpecialCmd); + }else if(ldc.equals(opCode)){ + LdcCmd ldcCmd = new LdcCmd(clzFile, opCode); + ldcCmd.setOperand(iter.next2CharAsInt()); + cmds.add(ldcCmd); + }else if(bipush.equals(opCode)){ + BiPushCmd biPushCmd = new BiPushCmd(clzFile, opCode); + biPushCmd.setOperand(iter.next2CharAsInt()); + cmds.add(biPushCmd); + }else if(dup.equals(opCode) || aload_0.equals(opCode) + || aload_1.equals(opCode) || aload_2.equals(opCode) + || astore_1.equals(opCode) || voidreturn.equals(opCode) + || iload.equals(opCode) || iload_1.equals(opCode) + || iload_2.equals(opCode) || iload_3.equals(opCode)){ + NoOperandCmd noOpCmd = new NoOperandCmd(clzFile, opCode); + cmds.add(noOpCmd); + }else{ + throw new RuntimeException("cmd " + opCode + " has not bean implemented yet."); + } + } + calcuateOffset(cmds); + ByteCodeCommand[] byteCodeCmds = new ByteCodeCommand[cmds.size()]; + return cmds.toArray(byteCodeCmds); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/method/Method.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/method/Method.java index 8a7ce5bff5..3b47188bbf 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/method/Method.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/method/Method.java @@ -6,6 +6,7 @@ import com.coderising.jvm.attr.LocalVariableTable; import com.coderising.jvm.attr.StackMapTable; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -76,4 +77,8 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..14407bacbe --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; + +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..028161adc7 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,25 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index fb84048026..0d5f2b1685 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -9,6 +9,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -272,5 +276,78 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } - + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From e614acf8d08e275dd057d2405f713e89a7762d6d Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Mon, 24 Apr 2017 23:33:45 +0800 Subject: [PATCH 294/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E9=98=9F=E5=88=97=E4=B8=8EJosephus=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/array/ArrayList.java | 10 +++ .../com/coding/basic/queue/CircleQueue.java | 57 ++++++++++-- .../src/com/coding/basic/queue/Josephus.java | 19 +++- .../coding/basic/queue/CircleQueueTest.java | 87 +++++++++++++++++++ .../com/coding/basic/queue/JosephusTest.java | 2 +- 5 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/queue/CircleQueueTest.java diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java index 73f3b9649e..0333ac61b8 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java @@ -64,6 +64,16 @@ public Object[] toArray(){ return objArr; } + @Override + public String toString() { + + StringBuilder str = new StringBuilder(); + str.append("["); + for (int i = 0; i < size; i++) { + str.append(elementData[i].toString()+","); + } + return str.toString().substring(0, str.length()-1)+"]"; + } /** * 扩容,扩容因子为10 */ diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/queue/CircleQueue.java b/group12/2258659044/zj-2017/src/com/coding/basic/queue/CircleQueue.java index 4d99dc68e0..260f1735e7 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/queue/CircleQueue.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/queue/CircleQueue.java @@ -13,21 +13,68 @@ public class CircleQueue { private int rear = 0; public boolean isEmpty() { - return false; - + + return front == rear; } public int size() { - return -1; + + return rear-front>0?(rear-front):(rear-front+DEFAULT_SIZE); } public void enQueue(E data) { + rangeCheck(rear); + elementData[rear] = data; + rear = (rear+1)%DEFAULT_SIZE; + } + + @SuppressWarnings("unchecked") + public E deQueue() { + + if(isEmpty()){ + return null; + } + Object obj = elementData[front]; + front = (front+1)%DEFAULT_SIZE; + return (E) obj; } + + /** + * 数组最后一个空间不存放数据
+ * 用来区分队列的空或者满 + * @param rear + */ + private void rangeCheck(int rear) { + + if ((rear+1)%DEFAULT_SIZE == front) { + throw new IndexOutOfBoundsException("队列数据已满!"); + } + } + + @Override + public String toString() { - public E deQueue() { - return null; + if(isEmpty()){ + return "[]"; + } + + Object[] temp = new Object[DEFAULT_SIZE]; + System.arraycopy(elementData, 0, temp, 0, DEFAULT_SIZE); + + int frontTemp = front; + int rearTemp = rear; + + StringBuilder str = new StringBuilder(); + str.append("["); + while(!isEmpty()){ + str.append(this.deQueue().toString()+","); + } + + front = frontTemp; + rear = rearTemp; + return str.toString().substring(0, str.length()-1)+"]"; } } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/queue/Josephus.java b/group12/2258659044/zj-2017/src/com/coding/basic/queue/Josephus.java index 6ca15ac7f2..22c8214373 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/queue/Josephus.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/queue/Josephus.java @@ -1,6 +1,7 @@ package com.coding.basic.queue; import com.coding.basic.List; +import com.coding.basic.array.ArrayList; /** * 用Queue来实现Josephus问题 @@ -11,8 +12,22 @@ */ public class Josephus { - public static List execute(int n, int m){ - return null; + public static List execute(int n, int m){ + + CircleQueue queue = new CircleQueue<>(); + for (int i = 0; i < n; i++) { + queue.enQueue(i); + } + + List ls = new ArrayList<>(); + while(!queue.isEmpty()){ + int position = (m-1)%queue.size(); + for (int i = 0; i < position; i++) { + queue.enQueue(queue.deQueue()); + } + ls.add(queue.deQueue()); + } + return ls; } } diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/CircleQueueTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..1da8ca1957 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/CircleQueueTest.java @@ -0,0 +1,87 @@ +package test.com.coding.basic.queue; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.queue.CircleQueue; + +public class CircleQueueTest { + + CircleQueue qe;; + + @Before + public void setup() { + qe = new CircleQueue<>(); + } + + @Test + public void testIsEmpty() { + + Assert.assertEquals(true, qe.isEmpty()); + } + + @Test + public void testSize() { + + for (int i = 0; i < 9; i++) { + qe.enQueue(i); + } + Assert.assertEquals(9, qe.size()); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void testEnQueue() { + + for (int i = 0; i < 7; i++) { + qe.enQueue(i); + } + Assert.assertEquals("[0,1,2,3,4,5,6]", qe.toString()); + + //打开下面测试一场 + /*for (int i = 7; i < 10; i++) { + qe.enQueue(i); + }*/ + } + + @Test + public void testDeQueue() { + + for (int i = 0; i < 9; i++) { + qe.enQueue(i); + } + Assert.assertEquals(9,qe.size()); + + Assert.assertEquals(0,qe.deQueue()); + Assert.assertEquals("[1,2,3,4,5,6,7,8]", qe.toString()); + Assert.assertEquals(8,qe.size()); + + Assert.assertEquals(1,qe.deQueue()); + Assert.assertEquals("[2,3,4,5,6,7,8]", qe.toString()); + Assert.assertEquals(7,qe.size()); + + qe.enQueue(1); + Assert.assertEquals("[2,3,4,5,6,7,8,1]", qe.toString()); + Assert.assertEquals(8,qe.size()); + + qe.enQueue(0); + Assert.assertEquals("[2,3,4,5,6,7,8,1,0]", qe.toString()); + Assert.assertEquals(9,qe.size()); + + for (int i = 0; i < 9; i++) { + qe.deQueue(); + qe.enQueue(i); + } + Assert.assertEquals(9,qe.size()); + + qe.deQueue();qe.deQueue(); + Assert.assertEquals(7,qe.size()); + + qe.enQueue(4); + Assert.assertEquals(8,qe.size()); + + qe.enQueue(4); + Assert.assertEquals(9,qe.size()); + } + +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/JosephusTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/JosephusTest.java index 4b9176a8ca..44865ae373 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/JosephusTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/JosephusTest.java @@ -20,7 +20,7 @@ public void tearDown() throws Exception { @Test public void testExecute() { - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + Assert.assertEquals("[1,3,5,0,4,2,6]", Josephus.execute(7, 2).toString()); } From 31b6f764fbe56cbee9cd986cc97869784977d1c6 Mon Sep 17 00:00:00 2001 From: Patrick Date: Tue, 25 Apr 2017 00:01:01 +0800 Subject: [PATCH 295/552] refactor --- .../basic/{ => array}/ArrayList.java | 158 +++++++++--------- .../array/ArrayUtil.java | 2 +- .../array/ArrayUtilTest.java | 2 +- .../coding2017/basic/queue/CircleQueue.java | 41 +++++ .../coding2017/basic/queue/Josephus.java | 20 +++ .../coding2017/basic/queue/JosephusTest.java | 27 +++ .../coding2017/basic/{ => queue}/Queue.java | 2 +- .../basic/queue/QueueWithTwoStacks.java | 47 ++++++ .../ipk2015/coding2017/basic/stack/Stack.java | 4 +- .../coding2017/basic/test/ArrayListTest.java | 4 +- .../coding2017/basic/test/QueueTest.java | 2 +- 11 files changed, 226 insertions(+), 83 deletions(-) rename group24/121111914/src/com/github/ipk2015/coding2017/basic/{ => array}/ArrayList.java (82%) rename group24/121111914/src/com/github/ipk2015/coding2017/{coderising => basic}/array/ArrayUtil.java (99%) rename group24/121111914/src/com/github/ipk2015/coding2017/{coderising => basic}/array/ArrayUtilTest.java (92%) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/CircleQueue.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Josephus.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/JosephusTest.java rename group24/121111914/src/com/github/ipk2015/coding2017/basic/{ => queue}/Queue.java (83%) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/ArrayList.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/array/ArrayList.java similarity index 82% rename from group24/121111914/src/com/github/ipk2015/coding2017/basic/ArrayList.java rename to group24/121111914/src/com/github/ipk2015/coding2017/basic/array/ArrayList.java index e9c2a390fb..572ba54aaf 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/ArrayList.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/array/ArrayList.java @@ -1,77 +1,81 @@ -package com.github.ipk2015.coding2017.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - add(size,o); - } - /* - * 分两种情况,index的范围为0到size,超出则抛出异常 - * */ - public void add(int index, Object o){ - ListUtils.checkIndexInRange(index,size); - if(size==elementData.length){ - elementData=Arrays.copyOf(elementData, size+1); - } - if(indexindex;i--){ - elementData[i]=elementData[i-1]; - } - } - elementData[index]=o; - size++; - } - - public Object get(int index){ - ListUtils.checkIndexInRange(index,size-1); - return elementData[index]; - } - - public Object remove(int index){ - ListUtils.checkIndexInRange(index,size-1); - Object object=elementData[index]; - for(int i=index;iindex;i--){ + elementData[i]=elementData[i-1]; + } + } + elementData[index]=o; + size++; + } + + public Object get(int index){ + ListUtils.checkIndexInRange(index,size-1); + return elementData[index]; + } + + public Object remove(int index){ + ListUtils.checkIndexInRange(index,size-1); + Object object=elementData[index]; + for(int i=index;i + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return false; + + } + + public int size() { + return -1; + } + + + + public void enQueue(E data) { + + } + + public E deQueue() { + return null; + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Josephus.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Josephus.java new file mode 100644 index 0000000000..ab99e7a690 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Josephus.java @@ -0,0 +1,20 @@ +package com.github.ipk2015.coding2017.basic.queue; + + + +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + return null; + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/JosephusTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d319ce304 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.github.ipk2015.coding2017.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/Queue.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Queue.java similarity index 83% rename from group24/121111914/src/com/github/ipk2015/coding2017/basic/Queue.java rename to group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Queue.java index 5b13d3340a..e880b1f0af 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/Queue.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Queue.java @@ -1,4 +1,4 @@ -package com.github.ipk2015.coding2017.basic; +package com.github.ipk2015.coding2017.basic.queue; import com.github.ipk2015.coding2017.basic.linkedlist.LinkedList; diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..fccb33d907 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,47 @@ +package com.github.ipk2015.coding2017.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + + } + diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/Stack.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/Stack.java index ddb9b62dda..ca448a3862 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/Stack.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/Stack.java @@ -2,7 +2,9 @@ import java.util.EmptyStackException; -import com.github.ipk2015.coding2017.basic.ArrayList; +import com.github.ipk2015.coding2017.basic.array.ArrayList; + + public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/ArrayListTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/ArrayListTest.java index 72a9a84b66..43f1e50ca9 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/ArrayListTest.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/ArrayListTest.java @@ -5,7 +5,9 @@ import org.junit.Before; import org.junit.Test; -import com.github.ipk2015.coding2017.basic.ArrayList; +import com.github.ipk2015.coding2017.basic.array.ArrayList; + + public class ArrayListTest { ArrayList list; diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/QueueTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/QueueTest.java index 53c63d8564..f27c7b22f2 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/QueueTest.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/QueueTest.java @@ -5,7 +5,7 @@ import org.junit.Before; import org.junit.Test; -import com.github.ipk2015.coding2017.basic.Queue; +import com.github.ipk2015.coding2017.basic.queue.Queue; public class QueueTest { Queue queue; From 967db526a31068847846c388e91c81c36f8009cd Mon Sep 17 00:00:00 2001 From: Patrick Date: Tue, 25 Apr 2017 00:01:23 +0800 Subject: [PATCH 296/552] refactor --- .../ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java | 1 + 1 file changed, 1 insertion(+) diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java index fccb33d907..fb73e7e936 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java @@ -22,6 +22,7 @@ public QueueWithTwoStacks() { public boolean isEmpty() { + return false; } From a4fd3930e49bb75405a04da7bc7bf062284e5f84 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Tue, 25 Apr 2017 02:47:23 +0800 Subject: [PATCH 297/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=AD=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=BD=AC=E5=90=8E=E7=BC=80=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=EF=BC=8C=E4=BD=BF=E5=AE=83=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8B=AC=E5=8F=B7=EF=BC=8C=E4=BF=AE=E6=94=B9arraylist=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E5=AE=83=E6=94=AF=E6=8C=81=E8=BF=AD=E4=BB=A3=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../johnChnia/coding2017/basic/ArrayList.java | 30 +++++- .../com/johnChnia/coding2017/basic/List.java | 18 ++-- .../coding2017/basic/linklist/LinkedList.java | 8 +- .../basic/stack/expr/InfixExprTest.java | 84 ++++++++-------- .../basic/stack/expr/InfixToPostfix.java | 18 +++- .../coding2017/basic/stack/expr/Token.java | 95 +++++++++++-------- .../basic/stack/expr/TokenParser.java | 9 ++ .../coding2017/basic/ArrayListTest.java | 14 ++- 8 files changed, 182 insertions(+), 94 deletions(-) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java index 80bb60298e..d9a03f49a7 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java @@ -1,11 +1,13 @@ package com.johnChnia.coding2017.basic; import java.util.Arrays; +import java.util.Iterator; +import java.util.NoSuchElementException; /** * Created by john on 2017/3/8. * - * @// TODO: 2017/4/1 实现Iterator 接口 + * @// TODO: 学会多线程后,实现Iterator 的 remove 方法 */ public class ArrayList implements List { @@ -138,8 +140,32 @@ public int size() { return size; } + @Override + public Iterator iterator() { + return new Itr(); + } - /** + + private class Itr implements Iterator { + int cursor = 0; + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public E next() { + int i = cursor; + if (i >= size) { + throw new NoSuchElementException(); + } + Object[] elementData = ArrayList.this.elementData; + cursor = i + 1; + return (E) elementData[i]; + } + } + + /** * Increases the capacity to ensure that it can hold at least the * number of elements specified by the double length of list. */ diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/List.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/List.java index 6d5a8b01df..940403ce98 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/List.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/List.java @@ -1,16 +1,22 @@ package com.johnChnia.coding2017.basic; +import java.util.Iterator; + /** * Created by john on 2017/3/12. */ -public interface List { - public void add(E o); +public interface List extends Iterable{ + void add(E o); + + void add(int index, E o); + + E get(int index); + + E remove(int index); - public void add(int index, E o); + int size(); - public E get(int index); + Iterator iterator(); - public E remove(int index); - public int size(); } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java index 10f7edd0a6..c12f92a044 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java @@ -2,12 +2,13 @@ import com.johnChnia.coding2017.basic.List; +import java.util.Iterator; import java.util.NoSuchElementException; /** * Created by john on 2017/3/9. * - * @// TODO: 2017/4/1 支持Iterator + * @// TODO: 学会多线程后,实现Iterator 的 remove 方法 */ public class LinkedList implements List { @@ -223,6 +224,11 @@ public int size() { return size; } + @Override + public Iterator iterator() { + return null; + } + private void checkElementIndex(int index) { if (!isElementIndex(index)) { throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java index e47a8841da..3eb4a38819 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java @@ -8,45 +8,49 @@ public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("10-2*3+50"); - Assert.assertEquals(54, expr.evaluate(), 0.001f); - } - - } + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*(3+50)"); + Assert.assertEquals(-96, expr.evaluate(), 0.001f); + } + + } } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java index e361815f02..1efa28721f 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java @@ -8,6 +8,10 @@ /*** * Rule: + * 1、如果栈不为空且操作符的优先级比栈顶高且不是(、【、{,则弹出栈顶,并且放到Expr中 + * 2、如果为(、[、{ 则压入栈顶 + * 3、如果为)、]、}且栈不为空,且栈顶不为(、[、{,则弹出栈顶,并且放到Expr中,最后弹出(、[、{ + * 4、遍历剩下的operator,加入到Expr中 */ public class InfixToPostfix { @@ -21,11 +25,19 @@ public static List convert(String expr) { if (token.isNumber()) { list.add(token); } else if (token.isOperator()) { - while (!stack.empty() && !token.hasHigherPriority(stack.peek())) { - list.add(stack.pop()); + while (!stack.empty() + && !token.isOpeningParentheses() + && !token.hasHigherPriority(stack.peek())) { + list.add(stack.pop()); } stack.push(token); - + } else if (token.isOpeningParentheses()) { + stack.push(token); + } else if (token.isClosingParentheses()) { + while (!stack.empty() && !stack.peek().isOpeningParentheses()) { + list.add(stack.pop()); + } + stack.pop(); } } while (!stack.empty()) { diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java index f87a210587..3f99cdf609 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java @@ -6,45 +6,60 @@ import java.util.Map; class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + public static final List OPENINGPARENTHESES = Arrays.asList("(", "[", "{"); + public static final List CLOSINGPARENTHESES = Arrays.asList(")", "]", "}"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + priorities.put("(", 0); + priorities.put("[", 0); + priorities.put("{", 0); + } + + static final int OPERATOR = 1; + static final int NUMBER = 2; + static final int PARENTHESES = 3; + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + public boolean isOpeningParentheses() { + return OPENINGPARENTHESES.contains(this.value); + } + + public boolean isClosingParentheses() { + return CLOSINGPARENTHESES.contains(this.value); + } } \ No newline at end of file diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java index b9c8b80444..e66e4ff8c0 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java @@ -30,6 +30,10 @@ public List parse(String expr) { tokens.add(t); i = nextOperatorIndex; + } else if (isParentheses(c)) { + Token t = new Token(Token.PARENTHESES, String.valueOf(c)); + tokens.add(t); + i++; } else { System.out.println("char :[" + c + "] is not number or operator,ignore"); i++; @@ -55,4 +59,9 @@ private boolean isOperator(char c) { String sc = String.valueOf(c); return Token.OPERATORS.contains(sc); } + + private boolean isParentheses(char c) { + String sc = String.valueOf(c); + return Token.OPENINGPARENTHESES.contains(sc) || Token.CLOSINGPARENTHESES.contains(sc); + } } diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java index 4b8d986990..5109ea69ad 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java @@ -15,7 +15,7 @@ public class ArrayListTest { private ArrayList arrayList2; private ArrayList arrayList3; private ArrayList arrayList4; - private ArrayList arrayList5; + private ArrayList arrayList5; @Before public void setUp() throws Exception { @@ -23,6 +23,7 @@ public void setUp() throws Exception { arrayList2 = new ArrayList<>(3); arrayList3 = new ArrayList<>(3); arrayList4 = new ArrayList<>(3); + arrayList5 = new ArrayList<>(); } @Test @@ -58,5 +59,14 @@ public void testRemoveElementByIndex() { assertThat(arrayList4.size(), equalTo(5)); } - + @Test + public void testIterator() { + for (int i = 0; i < 6; i++) { + arrayList5.add(i); + } + for (int i: + arrayList5) { + System.out.println(i); + } + } } From 64aa2b1f7d828ee4337128c3a7cb0048f0a5d450 Mon Sep 17 00:00:00 2001 From: onlyLYJ <382266293@qq.com> Date: Tue, 25 Apr 2017 06:55:26 +0800 Subject: [PATCH 298/552] Queue done --- .../coding/basic/queue/CircleQueue.java | 71 ++++++++++++++ .../coding/basic/queue/CircleQueueTest.java | 64 +++++++++++++ .../coding/basic/queue/Josephus.java | 32 +++++++ .../coding/basic/queue/JosephusTest.java | 27 ++++++ .../382266293/coding/basic/queue/Queue.java | 61 ++++++++++++ .../basic/queue/QueueWithTwoStacks.java | 58 +++++++++++ .../coderising/download/FileDownloader.java | 2 +- .../download/FileDownloaderTest.java | 4 +- .../download/impl/ConnectionImpl.java | 2 +- .../jvm/engine/ExecutionResult.java | 56 +++++++++++ .../coderising/jvm/engine/ExecutorEngine.java | 35 +++++++ .../src/com/coderising/jvm/engine/Heap.java | 39 ++++++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++++++++ .../com/coderising/jvm/engine/MethodArea.java | 75 +++++++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 28 ++++++ .../com/coderising/jvm/engine/StackFrame.java | 95 +++++++++++++++++++ 16 files changed, 717 insertions(+), 3 deletions(-) create mode 100644 group12/382266293/coding/basic/queue/CircleQueue.java create mode 100644 group12/382266293/coding/basic/queue/CircleQueueTest.java create mode 100644 group12/382266293/coding/basic/queue/Josephus.java create mode 100644 group12/382266293/coding/basic/queue/JosephusTest.java create mode 100644 group12/382266293/coding/basic/queue/Queue.java create mode 100644 group12/382266293/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group12/382266293/src/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 group12/382266293/src/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 group12/382266293/src/com/coderising/jvm/engine/Heap.java create mode 100644 group12/382266293/src/com/coderising/jvm/engine/JavaObject.java create mode 100644 group12/382266293/src/com/coderising/jvm/engine/MethodArea.java create mode 100644 group12/382266293/src/com/coderising/jvm/engine/MiniJVM.java create mode 100644 group12/382266293/src/com/coderising/jvm/engine/StackFrame.java diff --git a/group12/382266293/coding/basic/queue/CircleQueue.java b/group12/382266293/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..d960510914 --- /dev/null +++ b/group12/382266293/coding/basic/queue/CircleQueue.java @@ -0,0 +1,71 @@ +package queue; + +/** + * 用数组实现循环队列 + * + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 11; + + // 用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + // 队头 + private int front = 0; + // 队尾 + private int rear = 0; + + public boolean isEmpty() { + return size() == 0; + + } + + public int size() { + return getIndex(front - rear); + } + + private int getIndex(int i) { + return i % DEFAULT_SIZE; + } + + public void enQueue(E data) { + checkCapacity(); + elementData[getIndex(front)] = data; + front++; + } + + private void checkCapacity() { + if (getIndex(front - rear + 1) == 0) { + throw new RuntimeException("Queue is full"); + } + } + + public E deQueue() { + if (size() == 0) { + return null; + } + Object o = elementData[getIndex(rear)]; + rear++; + return (E) o; + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < size(); i++) { + sb.append(elementData[getIndex(rear + i)]); + if (i != size() - 1) { + sb.append(","); + } + } + sb.append("]"); + return sb.toString(); + } + +} diff --git a/group12/382266293/coding/basic/queue/CircleQueueTest.java b/group12/382266293/coding/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..f74954c6d8 --- /dev/null +++ b/group12/382266293/coding/basic/queue/CircleQueueTest.java @@ -0,0 +1,64 @@ +package queue; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Test; + +public class CircleQueueTest { + + CircleQueue cq = new CircleQueue(); + + @After + public void tearDown() throws Exception { + cq = null; + } + + @Test + public void testIsEmpty() { + assertEquals(cq.size(),0); + } + + @Test + public void testSize() { + for (int i = 0; i < 10; i++) { + cq.enQueue(i); + } + + cq.deQueue(); + cq.deQueue(); + System.out.println(cq); + cq.enQueue(10); + cq.enQueue(11); + assertEquals(10,cq.size()); + System.out.println(cq); + + int i = 2; + while(cq.size() > 0) { + assertEquals(i++, cq.deQueue()); + } + } + + @Test + public void testEnQueue() { + for (int i = 0; i < 5; i++) { + cq.enQueue(i); + } + assertEquals(5,cq.size()); + } + + @Test + public void testDeQueue() { + for (int i = 0; i < 10; i++) { + cq.enQueue(i); + } + + int i = 0; + while(cq.size() > 0) { + assertEquals(i++, cq.deQueue()); + } + + + } + +} diff --git a/group12/382266293/coding/basic/queue/Josephus.java b/group12/382266293/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..e98409d5d8 --- /dev/null +++ b/group12/382266293/coding/basic/queue/Josephus.java @@ -0,0 +1,32 @@ +package queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + QueueWithTwoStacks cq = new QueueWithTwoStacks(); + for (int i = 0; i < n; i++) { + cq.enQueue(i); + } + List result = new ArrayList<>(); + while (cq.size() > 0) { + for (int i = 0; i < m-1; i++) { + cq.enQueue(cq.deQueue()); + } + result.add(cq.deQueue()); + } + + return result; + } + +} diff --git a/group12/382266293/coding/basic/queue/JosephusTest.java b/group12/382266293/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..ac258383db --- /dev/null +++ b/group12/382266293/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group12/382266293/coding/basic/queue/Queue.java b/group12/382266293/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..5b720fc5e3 --- /dev/null +++ b/group12/382266293/coding/basic/queue/Queue.java @@ -0,0 +1,61 @@ +package queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group12/382266293/coding/basic/queue/QueueWithTwoStacks.java b/group12/382266293/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..03d243d8c0 --- /dev/null +++ b/group12/382266293/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,58 @@ +package queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return stack2.size() + stack1.size(); + } + + public void enQueue(E item) { + if (stack2.size() != 0) { + drop(stack2, stack1, stack2.size()); + } + + stack1.push(item); + } + + private void drop(Stack stack2, Stack stack1, int num) { + for (int i = 0; i < num; i++) { + stack1.push(stack2.pop()); + } + } + + public E deQueue() { + if (size() <= 0) { + return null; + } + + if (stack1.size() != 0) { + drop(stack1, stack2, stack1.size() - 1); + return stack1.pop(); + } + + return stack2.pop(); + + } + +} diff --git a/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java index 311ebede84..ea8b3dce85 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloader.java +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -71,7 +71,7 @@ public void execute() { int length = conn.getContentLength(); System.out.println("file length:" + length); - setLocation("C:\\"); + setLocation("d:\\"); String name = conn.getFileName(); setFileName(name); diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index b9c458d2a6..c117b9d878 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -15,6 +15,8 @@ public class FileDownloaderTest { public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; + public static String Git = "https://github.com/onlyliuxin/coding2017/archive/master.zip"; + boolean downloadFinished = false; @Before public void setUp() throws Exception { @@ -28,7 +30,7 @@ public void testDownload() { String url = "http://localhost:8080/test.jpg"; - FileDownloader downloader = new FileDownloader(foxmail); + FileDownloader downloader = new FileDownloader(qq); ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java index 7c772bc665..2c89e4c883 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java @@ -3,12 +3,12 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.net.HttpURLConnection; import java.net.URL; import com.coderising.download.api.Connection; import com.coderising.download.api.ConnectionManager; -import sun.net.www.protocol.http.HttpURLConnection; public class ConnectionImpl implements Connection { diff --git a/group12/382266293/src/com/coderising/jvm/engine/ExecutionResult.java b/group12/382266293/src/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..8f6c51e52a --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/engine/ExecutorEngine.java b/group12/382266293/src/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..5d6b582879 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,35 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/engine/Heap.java b/group12/382266293/src/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..82ad210cef --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/engine/JavaObject.java b/group12/382266293/src/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..71ba382d9a --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/engine/MethodArea.java b/group12/382266293/src/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..83bb42f65f --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.engine; + +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = null; + try { + clzFile = this.clzLoader.loadClass(className); + } catch (UnsupportedEncodingException e) { + + e.printStackTrace(); + } + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group12/382266293/src/com/coderising/jvm/engine/MiniJVM.java b/group12/382266293/src/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..443524cc5f --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} From 90001263d0634aa37a7b399bde094b57741b2e86 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Tue, 25 Apr 2017 09:06:21 +0800 Subject: [PATCH 299/552] eighthweek homework --- .../8-EighthWeek/attr/AttributeInfo.java | 19 + .../Homework/8-EighthWeek/attr/CodeAttr.java | 70 ++++ .../8-EighthWeek/attr/LineNumberTable.java | 55 +++ .../8-EighthWeek/attr/LocalVariableItem.java | 39 ++ .../8-EighthWeek/attr/LocalVariableTable.java | 42 +++ .../8-EighthWeek/attr/StackMapTable.java | 30 ++ .../Homework/8-EighthWeek/clz/AccessFlag.java | 25 ++ .../Homework/8-EighthWeek/clz/ClassFile.java | 102 +++++ .../Homework/8-EighthWeek/clz/ClassIndex.java | 19 + .../Homework/8-EighthWeek/cmd/BiPushCmd.java | 31 ++ .../8-EighthWeek/cmd/ByteCodeCommand.java | 130 +++++++ .../8-EighthWeek/cmd/CommandParser.java | 85 +++++ .../8-EighthWeek/cmd/GetFieldCmd.java | 30 ++ .../8-EighthWeek/cmd/GetStaticFieldCmd.java | 31 ++ .../8-EighthWeek/cmd/InvokeSpecialCmd.java | 31 ++ .../8-EighthWeek/cmd/InvokeVirtualCmd.java | 29 ++ group24/Homework/8-EighthWeek/cmd/LdcCmd.java | 37 ++ .../8-EighthWeek/cmd/NewObjectCmd.java | 27 ++ .../8-EighthWeek/cmd/NoOperandCmd.java | 31 ++ .../8-EighthWeek/cmd/OneOperandCmd.java | 27 ++ .../8-EighthWeek/cmd/PutFieldCmd.java | 27 ++ .../8-EighthWeek/cmd/TwoOperandCmd.java | 67 ++++ .../8-EighthWeek/constant/ClassInfo.java | 28 ++ .../8-EighthWeek/constant/ConstantInfo.java | 40 ++ .../8-EighthWeek/constant/ConstantPool.java | 31 ++ .../8-EighthWeek/constant/FieldRefInfo.java | 58 +++ .../8-EighthWeek/constant/MethodRefInfo.java | 60 +++ .../constant/NameAndTypeInfo.java | 51 +++ .../constant/NullConstantInfo.java | 17 + .../8-EighthWeek/constant/StringInfo.java | 32 ++ .../8-EighthWeek/constant/UTF8Info.java | 37 ++ .../8-EighthWeek/engine/ExecutionResult.java | 56 +++ .../8-EighthWeek/engine/ExecutorEngine.java | 35 ++ .../Homework/8-EighthWeek/engine/Heap.java | 39 ++ .../8-EighthWeek/engine/JavaObject.java | 71 ++++ .../8-EighthWeek/engine/MethodArea.java | 68 ++++ .../Homework/8-EighthWeek/engine/MiniJVM.java | 28 ++ .../8-EighthWeek/engine/StackFrame.java | 95 +++++ .../Homework/8-EighthWeek/field/Field.java | 50 +++ .../8-EighthWeek/loader/ByteCodeIterator.java | 57 +++ .../8-EighthWeek/loader/ClassFileLoader.java | 140 +++++++ .../8-EighthWeek/loader/ClassFileParser.java | 62 +++ .../Homework/8-EighthWeek/method/Method.java | 80 ++++ .../8-EighthWeek/print/ClassFilePrinter.java | 54 +++ .../print/ConstantPoolPrinter.java | 25 ++ .../test/ClassFileloaderTest.java | 354 ++++++++++++++++++ .../8-EighthWeek/test/EmployeeV1.java | 28 ++ group24/Homework/8-EighthWeek/util/Util.java | 24 ++ 48 files changed, 2604 insertions(+) create mode 100644 group24/Homework/8-EighthWeek/attr/AttributeInfo.java create mode 100644 group24/Homework/8-EighthWeek/attr/CodeAttr.java create mode 100644 group24/Homework/8-EighthWeek/attr/LineNumberTable.java create mode 100644 group24/Homework/8-EighthWeek/attr/LocalVariableItem.java create mode 100644 group24/Homework/8-EighthWeek/attr/LocalVariableTable.java create mode 100644 group24/Homework/8-EighthWeek/attr/StackMapTable.java create mode 100644 group24/Homework/8-EighthWeek/clz/AccessFlag.java create mode 100644 group24/Homework/8-EighthWeek/clz/ClassFile.java create mode 100644 group24/Homework/8-EighthWeek/clz/ClassIndex.java create mode 100644 group24/Homework/8-EighthWeek/cmd/BiPushCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java create mode 100644 group24/Homework/8-EighthWeek/cmd/CommandParser.java create mode 100644 group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/LdcCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java create mode 100644 group24/Homework/8-EighthWeek/constant/ClassInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/ConstantInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/ConstantPool.java create mode 100644 group24/Homework/8-EighthWeek/constant/FieldRefInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/MethodRefInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/NullConstantInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/StringInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/UTF8Info.java create mode 100644 group24/Homework/8-EighthWeek/engine/ExecutionResult.java create mode 100644 group24/Homework/8-EighthWeek/engine/ExecutorEngine.java create mode 100644 group24/Homework/8-EighthWeek/engine/Heap.java create mode 100644 group24/Homework/8-EighthWeek/engine/JavaObject.java create mode 100644 group24/Homework/8-EighthWeek/engine/MethodArea.java create mode 100644 group24/Homework/8-EighthWeek/engine/MiniJVM.java create mode 100644 group24/Homework/8-EighthWeek/engine/StackFrame.java create mode 100644 group24/Homework/8-EighthWeek/field/Field.java create mode 100644 group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java create mode 100644 group24/Homework/8-EighthWeek/loader/ClassFileLoader.java create mode 100644 group24/Homework/8-EighthWeek/loader/ClassFileParser.java create mode 100644 group24/Homework/8-EighthWeek/method/Method.java create mode 100644 group24/Homework/8-EighthWeek/print/ClassFilePrinter.java create mode 100644 group24/Homework/8-EighthWeek/print/ConstantPoolPrinter.java create mode 100644 group24/Homework/8-EighthWeek/test/ClassFileloaderTest.java create mode 100644 group24/Homework/8-EighthWeek/test/EmployeeV1.java create mode 100644 group24/Homework/8-EighthWeek/util/Util.java diff --git a/group24/Homework/8-EighthWeek/attr/AttributeInfo.java b/group24/Homework/8-EighthWeek/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group24/Homework/8-EighthWeek/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group24/Homework/8-EighthWeek/attr/CodeAttr.java b/group24/Homework/8-EighthWeek/attr/CodeAttr.java new file mode 100644 index 0000000000..c4c0c4c6c5 --- /dev/null +++ b/group24/Homework/8-EighthWeek/attr/CodeAttr.java @@ -0,0 +1,70 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java b/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java b/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java new file mode 100644 index 0000000000..14db5dca46 --- /dev/null +++ b/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group24/Homework/8-EighthWeek/attr/StackMapTable.java b/group24/Homework/8-EighthWeek/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group24/Homework/8-EighthWeek/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group24/Homework/8-EighthWeek/clz/AccessFlag.java b/group24/Homework/8-EighthWeek/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group24/Homework/8-EighthWeek/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group24/Homework/8-EighthWeek/clz/ClassFile.java b/group24/Homework/8-EighthWeek/clz/ClassFile.java new file mode 100644 index 0000000000..2a8dfb6123 --- /dev/null +++ b/group24/Homework/8-EighthWeek/clz/ClassFile.java @@ -0,0 +1,102 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group24/Homework/8-EighthWeek/clz/ClassIndex.java b/group24/Homework/8-EighthWeek/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group24/Homework/8-EighthWeek/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java b/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java new file mode 100644 index 0000000000..1f60641d2d --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java b/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..e48d4e38f7 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java @@ -0,0 +1,130 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group24/Homework/8-EighthWeek/cmd/CommandParser.java b/group24/Homework/8-EighthWeek/cmd/CommandParser.java new file mode 100644 index 0000000000..2bb36340f5 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..c771d535f7 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6876c36bb --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java b/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..8d60e72341 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java b/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..a1f2d1a1c6 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + + + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/LdcCmd.java b/group24/Homework/8-EighthWeek/cmd/LdcCmd.java new file mode 100644 index 0000000000..1669aa3900 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/LdcCmd.java @@ -0,0 +1,37 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java b/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..caa2609928 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..c3cda9b52e --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..dc31cf084d --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/Homework/8-EighthWeek/constant/ClassInfo.java b/group24/Homework/8-EighthWeek/constant/ClassInfo.java new file mode 100644 index 0000000000..c8e65ff493 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group24/Homework/8-EighthWeek/constant/ConstantInfo.java b/group24/Homework/8-EighthWeek/constant/ConstantInfo.java new file mode 100644 index 0000000000..88353df2d3 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group24/Homework/8-EighthWeek/constant/ConstantPool.java b/group24/Homework/8-EighthWeek/constant/ConstantPool.java new file mode 100644 index 0000000000..7130eb3a9f --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java b/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ae71396ef --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java b/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java new file mode 100644 index 0000000000..036e6d9055 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java b/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..5cbbba6033 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java b/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java new file mode 100644 index 0000000000..41e0fd7e7a --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group24/Homework/8-EighthWeek/constant/StringInfo.java b/group24/Homework/8-EighthWeek/constant/StringInfo.java new file mode 100644 index 0000000000..6bfcb47273 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group24/Homework/8-EighthWeek/constant/UTF8Info.java b/group24/Homework/8-EighthWeek/constant/UTF8Info.java new file mode 100644 index 0000000000..7db88a939e --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group24/Homework/8-EighthWeek/engine/ExecutionResult.java b/group24/Homework/8-EighthWeek/engine/ExecutionResult.java new file mode 100644 index 0000000000..8f6c51e52a --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java b/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java new file mode 100644 index 0000000000..5d6b582879 --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java @@ -0,0 +1,35 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group24/Homework/8-EighthWeek/engine/Heap.java b/group24/Homework/8-EighthWeek/engine/Heap.java new file mode 100644 index 0000000000..82ad210cef --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/Homework/8-EighthWeek/engine/JavaObject.java b/group24/Homework/8-EighthWeek/engine/JavaObject.java new file mode 100644 index 0000000000..71ba382d9a --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/Homework/8-EighthWeek/engine/MethodArea.java b/group24/Homework/8-EighthWeek/engine/MethodArea.java new file mode 100644 index 0000000000..781e81acf1 --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/MethodArea.java @@ -0,0 +1,68 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group24/Homework/8-EighthWeek/engine/MiniJVM.java b/group24/Homework/8-EighthWeek/engine/MiniJVM.java new file mode 100644 index 0000000000..443524cc5f --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group24/Homework/8-EighthWeek/field/Field.java b/group24/Homework/8-EighthWeek/field/Field.java new file mode 100644 index 0000000000..c6eb0196f8 --- /dev/null +++ b/group24/Homework/8-EighthWeek/field/Field.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java b/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..6fb5570dff --- /dev/null +++ b/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java b/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java new file mode 100644 index 0000000000..33185d8175 --- /dev/null +++ b/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group24/Homework/8-EighthWeek/test/EmployeeV1.java b/group24/Homework/8-EighthWeek/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group24/Homework/8-EighthWeek/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group24/Homework/8-EighthWeek/util/Util.java b/group24/Homework/8-EighthWeek/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group24/Homework/8-EighthWeek/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 Date: Tue, 25 Apr 2017 10:58:47 +0800 Subject: [PATCH 300/552] Fieid method finish --- group06/1454385822/.classpath | 2 +- .../homework_04/jvm/attr/AttributeInfo.java | 19 +++ .../basic/homework_04/jvm/attr/CodeAttr.java | 146 ++++++++++++++++++ .../homework_04/jvm/attr/LineNumberTable.java | 65 ++++++++ .../jvm/attr/LocalVariableTable.java | 98 ++++++++++++ .../basic/homework_04/jvm/clz/ClassFile.java | 10 ++ .../homework_04/jvm/clz/ClassFileParser.java | 77 +++++---- .../basic/homework_04/jvm/field/Field.java | 41 +++++ .../basic/homework_04/jvm/method/Method.java | 88 +++++++++++ .../jvm/test/ClassFileloaderTest.java | 114 +++++++------- .../jvm/util/ByteCodeIterator.java | 7 +- 11 files changed, 578 insertions(+), 89 deletions(-) create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/AttributeInfo.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/CodeAttr.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/LineNumberTable.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/LocalVariableTable.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/field/Field.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/method/Method.java diff --git a/group06/1454385822/.classpath b/group06/1454385822/.classpath index 6e5d5ec9db..0449aa0e39 100644 --- a/group06/1454385822/.classpath +++ b/group06/1454385822/.classpath @@ -7,6 +7,6 @@ - + diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/AttributeInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..26cfa65b04 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coding.basic.homework_04.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/CodeAttr.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..93db2686f0 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/CodeAttr.java @@ -0,0 +1,146 @@ +package com.coding.basic.homework_04.jvm.attr; + +import java.io.UnsupportedEncodingException; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; +import com.coding.basic.homework_04.jvm.util.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo{ + + private int attrNameIndex; + private int attrLength; + private int maxStack; + private int maxLocals; + private String code; + private ClassFile clzFile; + private LineNumberTable lineNumberTable; + private LocalVariableTable localVariableTable; + + + public CodeAttr(int attrNameIndex, int attrLength, int maxStack, int maxLocals, String code, ClassFile clzFile){ + super(attrNameIndex, attrLength); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.code = code; + this.clzFile = clzFile; + } + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + /*for(int i=0;i 0){ + throw new RuntimeException("ExceptionTable has not been implemented"); + } + parseSubAttr(codeAttr, iterator, clzFile); + return codeAttr; + } + + private static void parseSubAttr(CodeAttr codeAttr, ByteCodeIterator iterator, ClassFile clzFile){ + int attributeCount = iterator.nextU2ToInt(); + for(int i=0; i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLength = iter.nextU4ToInt(); + LineNumberTable table = new LineNumberTable(attrNameIndex, attrLength); + int lineNumberTableLength = iter.nextU2ToInt(); + for(int i=0; i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLength = iter.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(attrNameIndex, attrLength); + int localVariableTableLength = iter.nextU2ToInt(); + for(int i=0; i fields = new ArrayList(); + private List methods = new ArrayList(); + public void addMethod(Method method){ + methods.add(method); + } + + public List getMethods() { + return methods; + } + public void addField(Field field){ fields.add(field); } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java index 794a7d82d8..450ee999b2 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java @@ -12,43 +12,58 @@ 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.method.Method; import com.coding.basic.homework_04.jvm.util.ByteCodeIterator; public class ClassFileParser { - private ClassFile classFile; + private ClassFile clzFile; 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()); + clzFile = new ClassFile(); + clzFile.setMagicNumber(iterator.nextU4ToHexString()); + clzFile.setMinorVersion(iterator.nextU2ToInt()); + clzFile.setMajorVersion(iterator.nextU2ToInt()); + clzFile.setConstantNum(iterator.nextU2ToInt()); - System.out.println("Constant Pool Count :" + classFile.getConstantNum()); + System.out.println("Constant Pool Count :" + clzFile.getConstantNum()); - try { - classFile.setConstantPool(parserConstantPool(iterator)); - } catch (UnsupportedEncodingException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - classFile.setAccessFlag(new AccessFlag(iterator.nextU2ToInt())); + clzFile.setConstantPool(parserConstantPool(iterator)); + + + clzFile.setAccessFlag(new AccessFlag(iterator.nextU2ToInt())); + + parseClzIndex(clzFile, iterator); + + parseInterface(iterator); + + parseField(clzFile, iterator); + + parseMethod(clzFile, iterator); + return clzFile; + } + + private void parseClzIndex(ClassFile clzFile, ByteCodeIterator iterator) { ClassIndex clzIndex = new ClassIndex(); clzIndex.setThisClassIndex(iterator.nextU2ToInt()); clzIndex.setSuperClassIndex(iterator.nextU2ToInt()); - classFile.setClzIndex(clzIndex); - parseInterface(iterator); - - parseField(classFile, iterator); + clzFile.setClzIndex(clzIndex); - return classFile; + } + + private void parseMethod(ClassFile clzFile, ByteCodeIterator iterator) { + int methodCount = iterator.nextU2ToInt(); + System.out.println("methodCount : " + methodCount); + for(int i=0; i 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + return field; + } + public String toString() { + String name = ((UTF8Info)constantPool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)constantPool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/method/Method.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/method/Method.java new file mode 100644 index 0000000000..6064cbe7e9 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/method/Method.java @@ -0,0 +1,88 @@ +package com.coding.basic.homework_04.jvm.method; + +import com.coding.basic.homework_04.jvm.attr.AttributeInfo; +import com.coding.basic.homework_04.jvm.attr.CodeAttr; +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; +import com.coding.basic.homework_04.jvm.util.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private CodeAttr codeAttr; + private ClassFile clzFile; + + + public int getAccessFlag() { + return accessFlag; + } + + + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + + + public int getNameIndex() { + return nameIndex; + } + + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + + public int getDescriptorIndex() { + return descriptorIndex; + } + + + public void setDescriptorIndex(int descriptorIndex) { + this.descriptorIndex = descriptorIndex; + } + + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + + public void setCodeAttr(CodeAttr codeAttr) { + this.codeAttr = codeAttr; + } + + + private Method(int accessFlag, int nameIndex, int descriptorIndex, ClassFile clzFile){ + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.clzFile = clzFile; + } + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iterator) { + int accessFlag = iterator.nextU2ToInt(); + int nameIndex = iterator.nextU2ToInt(); + int descriptorIndex = iterator.nextU2ToInt(); + Method method = new Method(accessFlag, nameIndex, descriptorIndex, clzFile); + int attributeCount = iterator.nextU2ToInt(); + System.out.println("attributeCount : "+attributeCount); + if(attributeCount > 0){ + int attrNameIndex = iterator.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + if(AttributeInfo.CODE.equals(attrName)){ + iterator.back(2); + CodeAttr codeAttr = CodeAttr.parse(clzFile, iterator); + method.setCodeAttr(codeAttr); + } + } + + return method; + } + + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java index dead6bbad5..26e3ad765b 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java @@ -16,6 +16,7 @@ import com.coding.basic.homework_04.jvm.info.NameAndTypeInfo; import com.coding.basic.homework_04.jvm.info.UTF8Info; import com.coding.basic.homework_04.jvm.loader.ClassFileLoader; +import com.coding.basic.homework_04.jvm.method.Method; @@ -23,8 +24,8 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "D:\\mygit\\coding2017-1\\group06\\1454385822\\bin"; -// static String path1 = "C:\\Users\\yanght\\Documents\\mygit\\coding2017-1\\group06\\1454385822\\bin"; +// static String path1 = "D:\\mygit\\coding2017-1\\group06\\1454385822\\bin"; + static String path1 = "C:\\Users\\yanght\\Documents\\mygit\\coding2017-1\\group06\\1454385822\\bin"; static String path2 = "D:\temp"; static ClassFile clzFile = null; static { @@ -218,60 +219,61 @@ public void testReadFields(){ Assert.assertEquals("age:I", f.toString()); } } -// @Test -// public void testMethods(){ -// -// List methods = clzFile.getMethods(); -// ConstantPool pool = clzFile.getConstantPool(); -// -// { -// Method m = methods.get(0); -// assertMethodEquals(pool,m, -// "", -// "(Ljava/lang/String;I)V", -// "2ab7000c2a2bb5000f2a1cb50011b1"); -// -// } -// { -// Method m = methods.get(1); -// assertMethodEquals(pool,m, -// "setName", -// "(Ljava/lang/String;)V", -// "2a2bb5000fb1"); -// -// } -// { -// Method m = methods.get(2); -// assertMethodEquals(pool,m, -// "setAge", -// "(I)V", -// "2a1bb50011b1"); -// } -// { -// Method m = methods.get(3); -// assertMethodEquals(pool,m, -// "sayHello", -// "()V", -// "b2001c1222b60024b1"); -// -// } -// { -// Method m = methods.get(4); -// assertMethodEquals(pool,m, -// "main", -// "([Ljava/lang/String;)V", -// "bb000159122b101db7002d4c2bb6002fb1"); -// } -// } -// -// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ -// String methodName = pool.getUTF8String(m.getNameIndex()); -// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); -// String code = m.getCodeAttr().getCode(); -// Assert.assertEquals(expectedName, methodName); -// Assert.assertEquals(expectedDesc, methodDesc); -// Assert.assertEquals(expectedCode, code); -// } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); +// System.out.println("code : " + code); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } \ No newline at end of file diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/ByteCodeIterator.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/ByteCodeIterator.java index c4518aa650..1e99d88145 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/ByteCodeIterator.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/util/ByteCodeIterator.java @@ -1,6 +1,5 @@ package com.coding.basic.homework_04.jvm.util; -import java.io.UnsupportedEncodingException; import java.util.Arrays; public class ByteCodeIterator { @@ -37,16 +36,16 @@ public int nextU4ToInt() { } public String nextU4ToHexString() { - return Util.byteToHexString(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); } - public String nextUxToHexString(int len) throws UnsupportedEncodingException { + public String nextUxToHexString(int len) { byte[] tmp = new byte[len]; for (int i = 0; i < len; i++) { tmp[i] = codes[pos++]; } - return new String(tmp, "utf8"); + return Util.byteToHexString(tmp).toLowerCase(); } From 9f8ce4e50ed9ea37137cf5a2d3ed96cc0c5cdbda Mon Sep 17 00:00:00 2001 From: orajavac Date: Tue, 25 Apr 2017 11:10:43 +0800 Subject: [PATCH 301/552] =?UTF-8?q?20170424=5F1110=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/queue/CircleQueue.java | 50 +++++++++++++++++++ .../coding2017/basic/queue/Josephus.java | 40 +++++++++++++++ .../basic/queue/QueueWithTwoStacks.java | 42 ++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/CircleQueue.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/QueueWithTwoStacks.java diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/CircleQueue.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..b26e98cd5d --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/CircleQueue.java @@ -0,0 +1,50 @@ +package com.github.orajavac.coding2017.basic.queue; + +public class CircleQueue { +private final static int DEFAULT_SIZE = 8; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + if (front==0&&rear==0){ + return true; + } + return false; + + } + + public int size() { + return DEFAULT_SIZE; + } + + + + public void enQueue(E data) { + if (rear==DEFAULT_SIZE&&elementData[0]==null){ + rear = 0; + elementData[rear]=data; + }else if (elementData[rear]==null){ + elementData[rear]=data; + }else{ + throw new RuntimeException("队列已满"); + } + rear++; + } + + @SuppressWarnings("unchecked") + public E deQueue() { + Object o = elementData[front]; + elementData[front] = null; + front++; + if (front == DEFAULT_SIZE){ + front = 0; + } + return (E)o; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java new file mode 100644 index 0000000000..05e692a8aa --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java @@ -0,0 +1,40 @@ +package com.github.orajavac.coding2017.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + CircleQueue q = new CircleQueue(); + List l = new ArrayList(); + for (int i=1;i<=n;i++){ + q.enQueue(i); + } + for (int i=0;i l = execute(8,4); + for (int i=0;i { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.size()==0; + } + + + + public int size() { + return stack1.size(); + } + + + + public void enQueue(E item) { + int len1 = stack1.size(); + for (int i=0;i Date: Tue, 25 Apr 2017 16:09:36 +0800 Subject: [PATCH 302/552] =?UTF-8?q?JVM=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=EF=BC=8C=E4=B8=AD=E5=BA=8F=E8=A1=A8=E8=BE=BE=E5=BC=8F?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=8E=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group24/75939388/learning2017/pom.xml | 2 +- .../dataStructure/stack/expr/InfixExpr.java | 83 +++++++++++++++++++ .../stack/expr/InfixToPostfix.java | 14 ++++ .../dataStructure/stack/expr/PostfixExpr.java | 18 ++++ .../dataStructure/stack/expr/PrefixExpr.java | 18 ++++ .../basic/dataStructure/stack/expr/Token.java | 55 ++++++++++++ .../dataStructure/stack/expr/TokenParser.java | 57 +++++++++++++ .../java/data_structure/InfixExprTest.java | 54 ++++++++++++ .../java/data_structure/PostfixExprTest.java | 38 +++++++++ .../java/data_structure/PrefixExprTest.java | 46 ++++++++++ .../java/data_structure/TokenParserTest.java | 42 ++++++++++ 11 files changed, 426 insertions(+), 1 deletion(-) create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Token.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/InfixExprTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/PostfixExprTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/PrefixExprTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/TokenParserTest.java diff --git a/group24/75939388/learning2017/pom.xml b/group24/75939388/learning2017/pom.xml index e298986c2a..ebdd03610c 100644 --- a/group24/75939388/learning2017/pom.xml +++ b/group24/75939388/learning2017/pom.xml @@ -66,7 +66,7 @@ dom4j 1.6.1 - + jaxen diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..cf7b117d9f --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java @@ -0,0 +1,83 @@ +package basic.dataStructure.stack.expr; + +import basic.dataStructure.stack.Stack; + +import java.util.List; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack numbers = new Stack(); + Stack operators = new Stack(); + + int temp = 0; + + for (Token token : tokens) { + if (token.isOperator()) { + operators.push(token); + } + + if (token.isNumber()) { + numbers.push(token); + } + + //先计算 + int opeSize = operators.size(); + int numSize = numbers.size(); + if (numSize == 3 && opeSize == 2) { + Token tmp = (Token) operators.pop(); + if (tmp.hasHigherPriority((Token) operators.peek())) { + //如果1+2*3,先计算numbers后两位 + numbers.push(new Token(Token.NUMBER, calculate(numbers, tmp) + "")); + } else { + //如果1*2+3,先计算numbers栈前两位 + //先保存 + Token sOper = (Token) operators.pop(); + Token sNum = (Token) numbers.pop(); + numbers.push(new Token(Token.NUMBER, calculate(numbers, sOper) + "")); + numbers.push(new Token(Token.NUMBER, sNum + "")); + + operators.push(new Token(Token.OPERATOR, tmp.toString())); + } + } + } + + if (numbers.size() == 2 && operators.size() == 1) { + return calculate(numbers, (Token) operators.pop()); + } else { + throw new RuntimeException("最后计算出错, numbers.size=" + numbers.size() + ", operators.size=" + operators.size()); + } + } + + private float calculate(Stack numbers, Token operator) { + Token token2 = (Token) numbers.pop(); + float val2 = token2.getFloatValue(); + + Token token1 = (Token) numbers.pop(); + float val1 = token1.getFloatValue(); + + String oper = operator.toString(); + float res = 0l; + if (oper.equals("*")) { + res = val1 * val2; + } else if (oper.equals("+")) { + res = val1 + val2; + } else if (oper.equals("-")) { + res = val1 - val2; + } else { + if (val2 == 0) throw new RuntimeException("不能除以0,计算取消"); + res = val1 / val2; + } +// System.out.println("计算结果: " + val1 + oper + val2 + "=" + res); + return res; + } + +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..77a0b392ab --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java @@ -0,0 +1,14 @@ +package basic.dataStructure.stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..0b15ac2fda --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java @@ -0,0 +1,18 @@ +package basic.dataStructure.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..907d9ed535 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java @@ -0,0 +1,18 @@ +package basic.dataStructure.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Token.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Token.java new file mode 100644 index 0000000000..d1fcecf24e --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Token.java @@ -0,0 +1,55 @@ +package basic.dataStructure.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + public float getFloatValue(){ + return Float.valueOf(value).floatValue(); + } + + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java new file mode 100644 index 0000000000..41e5ab1da6 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package basic.dataStructure.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/InfixExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/InfixExprTest.java new file mode 100644 index 0000000000..afdb5e27a1 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/InfixExprTest.java @@ -0,0 +1,54 @@ +package data_structure; + +import basic.dataStructure.stack.expr.InfixExpr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + +// { +// InfixExpr expr = new InfixExpr("2+3*4+5"); +// Assert.assertEquals(19.0, expr.evaluate(), 0.001f); +// } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/PostfixExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/PostfixExprTest.java new file mode 100644 index 0000000000..59331c4669 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/PostfixExprTest.java @@ -0,0 +1,38 @@ +package data_structure; + +import basic.dataStructure.stack.expr.PostfixExpr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/PrefixExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/PrefixExprTest.java new file mode 100644 index 0000000000..414a14713c --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/PrefixExprTest.java @@ -0,0 +1,46 @@ +package data_structure; + +import basic.dataStructure.stack.expr.PrefixExpr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/TokenParserTest.java b/group24/75939388/learning2017/src/test/java/data_structure/TokenParserTest.java new file mode 100644 index 0000000000..b8cde0cbed --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/TokenParserTest.java @@ -0,0 +1,42 @@ +package data_structure; + + +import basic.dataStructure.stack.expr.Token; +import basic.dataStructure.stack.expr.TokenParser; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From cb5cef050f796f032b9f2eef9f1ff08dcb7325ac Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 25 Apr 2017 16:11:57 +0800 Subject: [PATCH 303/552] stage files --- .../src/main/java/basic/dataStructure/stack/expr/InfixExpr.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java index cf7b117d9f..bc56e9892e 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java @@ -44,7 +44,7 @@ public float evaluate() { Token sNum = (Token) numbers.pop(); numbers.push(new Token(Token.NUMBER, calculate(numbers, sOper) + "")); numbers.push(new Token(Token.NUMBER, sNum + "")); - + operators.push(new Token(Token.OPERATOR, tmp.toString())); } } From fbb4bf8c9f8e401ecc28fbc7318f08eb8976527a Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 25 Apr 2017 16:15:10 +0800 Subject: [PATCH 304/552] file stage --- .../basic/dataStructure/stack/expr/InfixExpr.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java index bc56e9892e..21f5864a74 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java @@ -39,13 +39,15 @@ public float evaluate() { numbers.push(new Token(Token.NUMBER, calculate(numbers, tmp) + "")); } else { //如果1*2+3,先计算numbers栈前两位 - //先保存 - Token sOper = (Token) operators.pop(); + //先保存数字和运算符 Token sNum = (Token) numbers.pop(); - numbers.push(new Token(Token.NUMBER, calculate(numbers, sOper) + "")); + Token sOper = tmp; + + //需要进行计算的运算符 + Token oper = (Token) operators.pop(); + numbers.push(new Token(Token.NUMBER, calculate(numbers, oper) + "")); numbers.push(new Token(Token.NUMBER, sNum + "")); - - operators.push(new Token(Token.OPERATOR, tmp.toString())); + operators.push(new Token(Token.OPERATOR, sOper.toString())); } } } From 611e159472f08d635793759924cb639f62a77c21 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 25 Apr 2017 16:17:54 +0800 Subject: [PATCH 305/552] file stage --- .../dataStructure/stack/expr/InfixExpr.java | 2 +- .../java/miniJVM/ClassFileloaderTest.java | 323 +++++++++--------- 2 files changed, 167 insertions(+), 158 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java index 21f5864a74..d07b014136 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java @@ -42,7 +42,7 @@ public float evaluate() { //先保存数字和运算符 Token sNum = (Token) numbers.pop(); Token sOper = tmp; - + //需要进行计算的运算符 Token oper = (Token) operators.pop(); numbers.push(new Token(Token.NUMBER, calculate(numbers, oper) + "")); diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java b/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java index 11299d5c20..a1e230b9f0 100644 --- a/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java +++ b/group24/75939388/learning2017/src/test/java/miniJVM/ClassFileloaderTest.java @@ -1,13 +1,22 @@ package miniJVM; import miniJVM.clz.ClassFile; +import miniJVM.clz.ClassIndex; +import miniJVM.cmd.BiPushCmd; +import miniJVM.cmd.ByteCodeCommand; +import miniJVM.cmd.OneOperandCmd; +import miniJVM.cmd.TwoOperandCmd; import miniJVM.constant.*; +import miniJVM.field.Field; import miniJVM.loader.ClassFileLoader; +import miniJVM.method.Method; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.List; + public class ClassFileloaderTest { @@ -176,162 +185,162 @@ public void testConstantPool(){ } } -// @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()); -// } -// -// /** -// * 下面是第三次JVM课应实现的测试用例 -// */ -// @Test -// public void testReadFields(){ -// -// List fields = clzFile.getFields(); -// Assert.assertEquals(2, fields.size()); -// { -// Field f = fields.get(0); -// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); -// } -// { -// Field f = fields.get(1); -// Assert.assertEquals("age:I", f.toString()); -// } -// } -// @Test -// public void testMethods(){ -// -// List methods = clzFile.getMethods(); -// ConstantPool pool = clzFile.getConstantPool(); -// -// { -// Method m = methods.get(0); -// assertMethodEquals(pool,m, -// "", -// "(Ljava/lang/String;I)V", -// "2ab7000c2a2bb5000f2a1cb50011b1"); -// -// } -// { -// Method m = methods.get(1); -// assertMethodEquals(pool,m, -// "setName", -// "(Ljava/lang/String;)V", -// "2a2bb5000fb1"); -// -// } -// { -// Method m = methods.get(2); -// assertMethodEquals(pool,m, -// "setAge", -// "(I)V", -// "2a1bb50011b1"); -// } -// { -// Method m = methods.get(3); -// assertMethodEquals(pool,m, -// "sayHello", -// "()V", -// "b2001c1222b60024b1"); -// -// } -// { -// Method m = methods.get(4); -// assertMethodEquals(pool,m, -// "main", -// "([Ljava/lang/String;)V", -// "bb000159122b101db7002d4c2bb6002fb1"); -// } -// } -// -// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ -// String methodName = pool.getUTF8String(m.getNameIndex()); -// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); -// String code = m.getCodeAttr().getCode(); -// Assert.assertEquals(expectedName, methodName); -// Assert.assertEquals(expectedDesc, methodDesc); -// Assert.assertEquals(expectedCode, code); -// } -// -// @Test -// public void testByteCodeCommand(){ -// { -// Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); -// ByteCodeCommand [] cmds = initMethod.getCmds(); -// -// assertOpCodeEquals("0: aload_0", cmds[0]); -// assertOpCodeEquals("1: invokespecial #12", cmds[1]); -// assertOpCodeEquals("4: aload_0", cmds[2]); -// assertOpCodeEquals("5: aload_1", cmds[3]); -// assertOpCodeEquals("6: putfield #15", cmds[4]); -// assertOpCodeEquals("9: aload_0", cmds[5]); -// assertOpCodeEquals("10: iload_2", cmds[6]); -// assertOpCodeEquals("11: putfield #17", cmds[7]); -// assertOpCodeEquals("14: return", cmds[8]); -// } -// -// { -// Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); -// ByteCodeCommand [] cmds = setNameMethod.getCmds(); -// -// assertOpCodeEquals("0: aload_0", cmds[0]); -// assertOpCodeEquals("1: aload_1", cmds[1]); -// assertOpCodeEquals("2: putfield #15", cmds[2]); -// assertOpCodeEquals("5: return", cmds[3]); -// -// } -// -// { -// Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); -// ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); -// -// assertOpCodeEquals("0: getstatic #28", cmds[0]); -// assertOpCodeEquals("3: ldc #34", cmds[1]); -// assertOpCodeEquals("5: invokevirtual #36", cmds[2]); -// assertOpCodeEquals("8: return", cmds[3]); -// -// } -// -// { -// Method mainMethod = this.clzFile.getMainMethod(); -// -// ByteCodeCommand [] cmds = mainMethod.getCmds(); -// -// assertOpCodeEquals("0: new #1", cmds[0]); -// assertOpCodeEquals("3: dup", cmds[1]); -// assertOpCodeEquals("4: ldc #43", cmds[2]); -// assertOpCodeEquals("6: bipush 29", cmds[3]); -// assertOpCodeEquals("8: invokespecial #45", cmds[4]); -// assertOpCodeEquals("11: astore_1", cmds[5]); -// assertOpCodeEquals("12: aload_1", cmds[6]); -// assertOpCodeEquals("13: invokevirtual #47", cmds[7]); -// assertOpCodeEquals("16: return", cmds[8]); -// } -// -// } -// -// private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ -// -// String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); -// -// if(cmd instanceof OneOperandCmd){ -// if(cmd instanceof BiPushCmd){ -// acctual += " " + ((OneOperandCmd)cmd).getOperand(); -// } else{ -// acctual += " #" + ((OneOperandCmd)cmd).getOperand(); -// } -// } -// if(cmd instanceof TwoOperandCmd){ -// acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); -// } -// Assert.assertEquals(expected, acctual); -// } + @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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand[] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From 7ee46c8762fafb706754bb7498bc282c614a38fc Mon Sep 17 00:00:00 2001 From: patrickfeng Date: Tue, 25 Apr 2017 16:46:37 +0800 Subject: [PATCH 306/552] =?UTF-8?q?=E6=9C=AC=E5=91=A8=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=9Aqueue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group24/121111914/.classpath | 20 ++++++++--------- .../coding2017/basic/queue/CircleQueue.java | 22 ++++++++++++++----- .../coding2017/basic/queue/Josephus.java | 20 ++++++++++++++++- .../basic/queue/QueueWithTwoStacks.java | 16 ++++++++++---- 4 files changed, 58 insertions(+), 20 deletions(-) diff --git a/group24/121111914/.classpath b/group24/121111914/.classpath index 3e9442280c..23c456e3e2 100644 --- a/group24/121111914/.classpath +++ b/group24/121111914/.classpath @@ -1,10 +1,10 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/CircleQueue.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/CircleQueue.java index 2440fb1771..03e0a48e26 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/CircleQueue.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/CircleQueue.java @@ -19,23 +19,35 @@ public class CircleQueue { private int front = 0; //队尾 private int rear = 0; - + private int size = 0; public boolean isEmpty() { - return false; + return size == 0; } public int size() { - return -1; + return size; } public void enQueue(E data) { - + if(size == DEFAULT_SIZE){ + throw new RuntimeException("queue size is max"); + } + elementData[rear] = data; + rear = (rear+1)%DEFAULT_SIZE; + size++; } public E deQueue() { - return null; + if(size == 0){ + throw new RuntimeException("queue size is 0"); + } + E e = (E)elementData[front]; + elementData[front] = null; + front = (front+1)%DEFAULT_SIZE; + size--; + return e; } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Josephus.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Josephus.java index ab99e7a690..ea50564c1f 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Josephus.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/Josephus.java @@ -2,6 +2,7 @@ +import java.util.ArrayList; import java.util.List; /** @@ -14,7 +15,24 @@ public class Josephus { public static List execute(int n, int m){ - return null; + CircleQueue queue = new CircleQueue(); + for(int i = 0;i list = new ArrayList(); + Integer element = null; + while(!queue.isEmpty()){ + element = (Integer) queue.deQueue(); + if(i == m){ + list.add(element); + i = 1; + }else{ + queue.enQueue(element); + i++; + } + } + return list; } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java index fb73e7e936..c9e724aa4a 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/queue/QueueWithTwoStacks.java @@ -23,23 +23,31 @@ public QueueWithTwoStacks() { public boolean isEmpty() { - return false; + return stack1.isEmpty() && stack2.isEmpty(); } public int size() { - return -1; + return stack1.size()+stack2.size(); } public void enQueue(E item) { - + stack1.push(item); } public E deQueue() { - return null; + if(size() == 0){ + throw new RuntimeException("queue size is 0"); + } + if(stack2.isEmpty()){ + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + } + return stack2.pop(); } From f37a22e525145c1d5fa3bbf13c11105ac1eb4594 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 25 Apr 2017 17:50:38 +0800 Subject: [PATCH 307/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/miniJVM/clz/ClassIndex.java | 7 +- .../src/main/java/miniJVM/field/Field.java | 44 +++++---- .../java/miniJVM/loader/ClassFileParser.java | 90 ++++++++++++++----- .../src/main/java/miniJVM/method/Method.java | 8 +- 4 files changed, 99 insertions(+), 50 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassIndex.java b/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassIndex.java index 9c3f512e99..5c406c3e66 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassIndex.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassIndex.java @@ -3,7 +3,12 @@ public class ClassIndex { private int thisClassIndex; private int superClassIndex; - + + public ClassIndex(int thisClassIndex, int superClassIndex){ + this.thisClassIndex = thisClassIndex; + this.superClassIndex = superClassIndex; + } + public int getThisClassIndex() { return thisClassIndex; } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/field/Field.java b/group24/75939388/learning2017/src/main/java/miniJVM/field/Field.java index bfcf0e9bf0..cfaccf116c 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/field/Field.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/field/Field.java @@ -1,50 +1,46 @@ package miniJVM.field; - import miniJVM.constant.ConstantPool; import miniJVM.constant.UTF8Info; -import miniJVM.loader.ByteCodeIterator; public class Field { private int accessFlag; private int nameIndex; private int descriptorIndex; - - - + private int attributeCount; + private ConstantPool pool; - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - + public Field( int accessFlag, int nameIndex, int descriptorIndex, int attributeCount, ConstantPool pool) { this.accessFlag = accessFlag; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; + this.attributeCount = attributeCount; this.pool = pool; } public String toString() { String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); return name +":"+ desc; } - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); - //System.out.println("field attribute count:"+ attribCount); - - Field f = new Field(accessFlag, nameIndex, descIndex,pool); - - if(attribCount > 0){ - throw new RuntimeException("Field Attribute has not been implemented"); - } - - return f; - } +// public static Field parse(ConstantPool pool,ByteCodeIterator iter){ +// +// int accessFlag = iter.nextU2ToInt(); +// int nameIndex = iter.nextU2ToInt(); +// int descIndex = iter.nextU2ToInt(); +// int attrCount = iter.nextU2ToInt(); +// //System.out.println("field attribute count:"+ attribCount); +// +// Field f = new Field(accessFlag, nameIndex, descIndex,pool); +// +// if(attrCount > 0){ +// throw new RuntimeException("Field Attribute has not been implemented"); +// } +// +// return f; +// } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index 353c16cdad..a1c65e963d 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -5,6 +5,7 @@ import miniJVM.clz.ClassFile; import miniJVM.clz.ClassIndex; import miniJVM.constant.*; +import miniJVM.field.Field; public class ClassFileParser { @@ -19,9 +20,22 @@ public class ClassFileParser { public ClassFile parse(byte[] codes) { iter = new ByteCodeIterator(codes); iter.pos = MAGIC_NUMBER_LENGTH; + //1. 版本信息 parseVersions(iter); + //2. 常量池 pool = new ConstantPool(); parseConstantPool(iter); + //TODO 3. 访问标记 + parseAccessFlag(iter); + //TODO 4. classIndex superClassIndex + parseClassIndex(iter); + //TODO 5. 接口,即便没有也要调用,因为字节码里是固定有的 + parseInterfaces(iter); + //TODO 6. 字段 + parseFields(iter); + //TODO 7. 方法 + parseMethods(iter); + return clzFile; } @@ -34,14 +48,15 @@ private void parseVersions(ByteCodeIterator iter) { } private void parseAccessFlag(ByteCodeIterator iter) { - AccessFlag accessFlag = null; - + int accessValue = iter.nextU2ToInt(); + AccessFlag accessFlag = new AccessFlag(accessValue); clzFile.setAccessFlag(accessFlag); } private void parseClassIndex(ByteCodeIterator iter) { - ClassIndex classInfo = null; - + int thisClass = iter.nextU2ToInt(); + int superClass = iter.nextU2ToInt(); + ClassIndex classInfo = new ClassIndex(thisClass, superClass); clzFile.setClassIndex(classInfo); } @@ -102,20 +117,55 @@ private void parseConstantPool(ByteCodeIterator iter) { e.printStackTrace(); } } -// private void parseInterfaces(ByteCodeIterator iter) { -// int interfaceCount = iter.nextU2ToInt(); -// -// System.out.println("interfaceCount:" + interfaceCount); -// -// // TODO : 如果实现了interface, 这里需要解析 -// } -// -// private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { -// -// -// } -// -// private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { -// -// } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFields(ByteCodeIterator iter) { + int fieldsCount = iter.nextU2ToInt(); + + for(int i = 0 ; i < fieldsCount; i++){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributeCount = iter.nextU2ToInt(); + + Field field = new Field(accessFlag, nameIndex, descriptorIndex, attributeCount, pool); + clzFile.addField(field); + } + } + + private void parseMethods(ByteCodeIterator iter) { + int methodCount = iter.nextU2ToInt(); + + for(int i = 0; i < methodCount; i++){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributeCount = iter.nextU2ToInt(); + int attributeCountTemp = attributeCount; + while(attributeCountTemp > 0){ + int attributeNameIndex = iter.nextU2ToInt(); + UTF8Info attributeName = (UTF8Info) pool.getConstantInfo(attributeNameIndex); + if(attributeName.getValue().equalsIgnoreCase("code")){ + int attributeLength = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLength = iter.nextU4ToInt(); + int codeLengthTemp = codeLength; + while(codeLengthTemp > 0){ + + codeLengthTemp--; + } + } + + attributeCountTemp--; + } + } + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java b/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java index e899983237..16ef5b5928 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java @@ -5,7 +5,6 @@ import miniJVM.cmd.ByteCodeCommand; import miniJVM.constant.ConstantPool; import miniJVM.constant.UTF8Info; -import miniJVM.loader.ByteCodeIterator; public class Method { @@ -66,10 +65,9 @@ public String toString() { return buffer.toString(); } - public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ - return null; - - } +// public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ +// return null; +// } public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); From f622e290b06d02f455846639b52778751a34aa5a Mon Sep 17 00:00:00 2001 From: gongxun Date: Tue, 25 Apr 2017 18:46:39 +0800 Subject: [PATCH 308/552] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group17/785396327/4.23/queue/CircleQueue.java | 35 +++++++++-- .../785396327/4.23/queue/CircleQueueTest.java | 62 +++++++++++++++++++ group17/785396327/4.23/queue/Josephus.java | 26 +++++++- .../785396327/4.23/queue/JosephusTest.java | 2 +- 4 files changed, 117 insertions(+), 8 deletions(-) create mode 100644 group17/785396327/4.23/queue/CircleQueueTest.java diff --git a/group17/785396327/4.23/queue/CircleQueue.java b/group17/785396327/4.23/queue/CircleQueue.java index 228bf1aba1..a7ab62bf55 100644 --- a/group17/785396327/4.23/queue/CircleQueue.java +++ b/group17/785396327/4.23/queue/CircleQueue.java @@ -1,5 +1,7 @@ package queue; +import java.util.Arrays; + /** * Created by gongxun on 2017/4/24. * 用数组实现循环队列 @@ -8,7 +10,7 @@ public class CircleQueue { private final static int DEFAULT_SIZE = 10; //用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE] ; + private Object[] elementData = new Object[DEFAULT_SIZE]; //队头 private int front = 0; @@ -16,21 +18,42 @@ public class CircleQueue { private int rear = 0; public boolean isEmpty() { - return false; + return front == rear && elementData[front] == null; } public int size() { - return -1; + if (isEmpty()) + return 0; + return front - rear > 0 ? DEFAULT_SIZE - front + rear : front - rear < 0 ? rear - front : DEFAULT_SIZE; } - public void enQueue(E data) { - + if (size() != DEFAULT_SIZE) { + elementData[rear] = data; + if (rear == DEFAULT_SIZE - 1) + rear = 0; + else + rear++; + } } public E deQueue() { - return null; + E removeEle = null; + if (!isEmpty()) { + removeEle = (E) elementData[front]; + elementData[front] = null; + if (front == DEFAULT_SIZE - 1) + front = 0; + else + front++; + } + return removeEle; + } + + @Override + public String toString() { + return Arrays.toString(elementData); } } diff --git a/group17/785396327/4.23/queue/CircleQueueTest.java b/group17/785396327/4.23/queue/CircleQueueTest.java new file mode 100644 index 0000000000..1a3f97d9bf --- /dev/null +++ b/group17/785396327/4.23/queue/CircleQueueTest.java @@ -0,0 +1,62 @@ +package queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/25. + */ +public class CircleQueueTest { + @Before + public void startUp() { + + } + + @After + public void tearDown() { + + } + + @Test + public void testEnQueue() { + CircleQueue circleQueue = new CircleQueue(); + { + for (int i = 0; i < 9; i++) { + circleQueue.enQueue(i); + } + } + + { + + Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, null]", circleQueue.toString()); + Assert.assertEquals(9, circleQueue.size()); + + circleQueue.enQueue(9); + Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); + Assert.assertEquals(10, circleQueue.size()); + + circleQueue.enQueue(10); + Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); + Assert.assertEquals(10, circleQueue.size()); + } + + { + int removeEle = circleQueue.deQueue(); + Assert.assertEquals(0, removeEle); + circleQueue.deQueue(); + circleQueue.deQueue(); + circleQueue.deQueue(); + Assert.assertEquals("[null, null, null, null, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); + } + { + circleQueue.enQueue(-1); + Assert.assertEquals("[-1, null, null, null, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); + Assert.assertEquals(7, circleQueue.size()); + } + + } + + +} diff --git a/group17/785396327/4.23/queue/Josephus.java b/group17/785396327/4.23/queue/Josephus.java index 7d85d94a01..7285c64dfe 100644 --- a/group17/785396327/4.23/queue/Josephus.java +++ b/group17/785396327/4.23/queue/Josephus.java @@ -1,5 +1,6 @@ package queue; +import java.util.ArrayList; import java.util.List; /** @@ -10,6 +11,29 @@ */ public class Josephus { public static List execute(int n, int m) { - return null; + if (m <= 0) + return null; + List origin = new ArrayList(); + List sequence = new ArrayList(); + for (int i = 0; i < n; i++) { + origin.add(i); + } + int count = 1;//计数器 + int index = count - 1;//当前元素的索引 + while (origin.size() > 1) { + if (count == m) { + sequence.add(origin.remove(index)); + count = 1;//删除一个元素,则重新计数 + } else { + count++; + if (index == origin.size() - 1) + //遍历到最后一个元素,重回头索引 + index = 0; + else + index++; + } + } + sequence.add(origin.get(0)); + return sequence; } } diff --git a/group17/785396327/4.23/queue/JosephusTest.java b/group17/785396327/4.23/queue/JosephusTest.java index ba502d0ffb..87fe65211d 100644 --- a/group17/785396327/4.23/queue/JosephusTest.java +++ b/group17/785396327/4.23/queue/JosephusTest.java @@ -21,6 +21,6 @@ public void tearDown() throws Exception { public void testExecute() { Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); - + Assert.assertEquals("[1, 0, 2]", Josephus.execute(3, 2).toString()); } } From 45d118b1cb5edccc39335133951f292e9b138e78 Mon Sep 17 00:00:00 2001 From: "yanght1454385822@qq.com" Date: Tue, 25 Apr 2017 20:24:10 +0800 Subject: [PATCH 309/552] =?UTF-8?q?=E5=AD=97=E8=8A=82=E7=A0=81=E6=8C=87?= =?UTF-8?q?=E4=BB=A4=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/homework_04/jvm/attr/CodeAttr.java | 35 +++-- .../basic/homework_04/jvm/clz/ClassFile.java | 35 +++++ .../homework_04/jvm/clz/ClassFileParser.java | 8 +- .../basic/homework_04/jvm/cmd/BiPushCmd.java | 27 ++++ .../homework_04/jvm/cmd/ByteCodeCommand.java | 127 +++++++++++++++ .../homework_04/jvm/cmd/CommandParser.java | 146 ++++++++++++++++++ .../homework_04/jvm/cmd/GetFieldCmd.java | 27 ++++ .../jvm/cmd/GetStaticFieldCmd.java | 25 +++ .../homework_04/jvm/cmd/InvokeSpecialCmd.java | 27 ++++ .../homework_04/jvm/cmd/InvokeVirtualCmd.java | 26 ++++ .../basic/homework_04/jvm/cmd/LdcCmd.java | 35 +++++ .../homework_04/jvm/cmd/NewObjectCmd.java | 25 +++ .../homework_04/jvm/cmd/NoOperandCmd.java | 29 ++++ .../homework_04/jvm/cmd/OneOperandCmd.java | 27 ++++ .../homework_04/jvm/cmd/PutFieldCmd.java | 25 +++ .../homework_04/jvm/cmd/TwoOperandCmd.java | 67 ++++++++ .../jvm/constant/ConstantInfo.java | 22 ++- .../basic/homework_04/jvm/info/ClassInfo.java | 8 + .../homework_04/jvm/info/FieldRefInfo.java | 8 + .../homework_04/jvm/info/MethodRefInfo.java | 8 + .../homework_04/jvm/info/NameAndTypeInfo.java | 28 ++-- .../jvm/info/NullConstantInfo.java | 11 ++ .../homework_04/jvm/info/StringInfo.java | 8 + .../basic/homework_04/jvm/info/UTF8Info.java | 8 + .../jvm/loader/ClassFileLoader.java | 5 - .../basic/homework_04/jvm/method/Method.java | 7 +- .../jvm/print/ClassFilePrinter.java | 45 ++++++ .../jvm/print/ConstantPoolPrinter.java | 105 +++++++++++++ .../jvm/test/ClassFileloaderTest.java | 84 +++++++++- .../homework_06/expr/InfixToPostfix.java | 33 ++++ .../homework_06/expr/InfixToPostfixTest.java | 39 +++++ .../basic/homework_06/expr/PostfixExpr.java | 46 ++++++ .../homework_06/expr/PostfixExprTest.java | 37 +++++ .../basic/homework_06/expr/PrefixExpr.java | 45 ++++++ .../homework_06/expr/PrefixExprTest.java | 44 ++++++ .../basic/homework_06/expr/TokenParser.java | 14 +- 36 files changed, 1249 insertions(+), 47 deletions(-) create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/BiPushCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/ByteCodeCommand.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/CommandParser.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/GetFieldCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/LdcCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/NewObjectCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/NoOperandCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/OneOperandCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/PutFieldCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/TwoOperandCmd.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/print/ClassFilePrinter.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_04/jvm/print/ConstantPoolPrinter.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/InfixToPostfix.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/InfixToPostfixTest.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/PostfixExpr.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/PostfixExprTest.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/PrefixExpr.java create mode 100644 group06/1454385822/src/com/coding/basic/homework_06/expr/PrefixExprTest.java diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/CodeAttr.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/CodeAttr.java index 93db2686f0..c82682e272 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/CodeAttr.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/attr/CodeAttr.java @@ -1,8 +1,8 @@ package com.coding.basic.homework_04.jvm.attr; -import java.io.UnsupportedEncodingException; - import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.cmd.ByteCodeCommand; +import com.coding.basic.homework_04.jvm.cmd.CommandParser; import com.coding.basic.homework_04.jvm.constant.ConstantPool; import com.coding.basic.homework_04.jvm.util.ByteCodeIterator; @@ -12,25 +12,34 @@ public class CodeAttr extends AttributeInfo{ private int attrLength; private int maxStack; private int maxLocals; + private int codeLen; private String code; + private ByteCodeCommand[] cmds ; + + + private ClassFile clzFile; private LineNumberTable lineNumberTable; private LocalVariableTable localVariableTable; + public ByteCodeCommand[] getCmds() { + return cmds; + } - public CodeAttr(int attrNameIndex, int attrLength, int maxStack, int maxLocals, String code, ClassFile clzFile){ - super(attrNameIndex, attrLength); + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; + this.codeLen = codeLen; this.code = code; - this.clzFile = clzFile; + this.cmds = cmds; } public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - /*for(int i=0;i 0){ throw new RuntimeException("ExceptionTable has not been implemented"); } @@ -63,7 +71,6 @@ private static void parseSubAttr(CodeAttr codeAttr, ByteCodeIterator iterator, C for(int i=0; i fields = new ArrayList(); private List methods = new ArrayList(); + + public Method getMethod(String methodName, String paramAndReturnType){ + for(Method method : methods){ + String name = constantPool.getUTF8String(method.getNameIndex()); + String descriptor = constantPool.getUTF8String(method.getDescriptorIndex()); + if(name.equals(methodName) && descriptor.equals(paramAndReturnType)){ + return method; + } + } + + return null; + } + public Method getMainMethod(){ + for(Method method : methods){ + String name = constantPool.getUTF8String(method.getNameIndex()); + String descriptor = constantPool.getUTF8String(method.getDescriptorIndex()); + if(name.equals("main") && descriptor.equals("([Ljava/lang/String;)V")){ + return method; + } + } + return null; + } + public void addMethod(Method method){ methods.add(method); } @@ -124,6 +148,17 @@ public void setConstantPool(ConstantPool constantPool) { public List getFields() { return fields; } + + public String getClassName() { + ClassInfo clzInfo = (ClassInfo)constantPool.getConstantInfo(1); + String clzName = clzInfo.getClassName(); + return clzName; + } + public String getSuperClassName() { + ClassInfo clzInfo = (ClassInfo)constantPool.getConstantInfo(3); + String clzName = clzInfo.getClassName(); + return clzName; + } } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java index 450ee999b2..ba3575a309 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/clz/ClassFileParser.java @@ -29,7 +29,6 @@ public ClassFile parser(byte[] codes) { clzFile.setMajorVersion(iterator.nextU2ToInt()); clzFile.setConstantNum(iterator.nextU2ToInt()); - System.out.println("Constant Pool Count :" + clzFile.getConstantNum()); clzFile.setConstantPool(parserConstantPool(iterator)); @@ -59,7 +58,6 @@ private void parseClzIndex(ClassFile clzFile, ByteCodeIterator iterator) { private void parseMethod(ClassFile clzFile, ByteCodeIterator iterator) { int methodCount = iterator.nextU2ToInt(); - System.out.println("methodCount : " + methodCount); for(int i=0; i codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + +// public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/CommandParser.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..7ee414f8a8 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/CommandParser.java @@ -0,0 +1,146 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + //?为啥是大写的 + codes = codes.toUpperCase(); + + CommandIterator iterator = new CommandIterator(codes); + List commands = new ArrayList(); + while(iterator.hasNext()){ + String opCode = iterator.next2CharAsString(); + if(new_object.equals(opCode)){ + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(ldc.equals(opCode)){ + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(bipush.equals(opCode)){ + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(invokespecial.equals(opCode)){ + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(invokevirtual.equals(opCode)){ + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(getfield.equals(opCode)){ + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(putfield.equals(opCode)){ + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(getstatic.equals(opCode)){ + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(dup.equals(opCode) || astore_1.equals(opCode) || aload_0.equals(opCode) || + aload_1.equals(opCode) || aload_2.equals(opCode) || iload.equals(opCode) || iload_1.equals(opCode)|| iload_2.equals(opCode) || iload_3.equals(opCode) || fload_3.equals(opCode) || + voidreturn.equals(opCode)){ + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + commands.add(cmd); + }else{ + throw new RuntimeException("sorry , the java instruction " + opCode + "has not implemented"); + } + } + //计算偏移量 + calcuateOffset(commands); + + ByteCodeCommand[] result = new ByteCodeCommand[commands.size()]; + commands.toArray(result); + + return result; + } + + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} \ No newline at end of file diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/GetFieldCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2ffe6d14a1 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,27 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +// @Override +// public void execute(StackFrame frame, ExecutionResult result) { +// +// +// } + + + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/GetStaticFieldCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..a5876317fc --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,25 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +// @Override +// public void execute(StackFrame frame, ExecutionResult result) { +// +// +// } + +} \ No newline at end of file diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/InvokeSpecialCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..38f77637e0 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,27 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + +// @Override +// public void execute(StackFrame frame, ExecutionResult result) { +// +// +// } + + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/InvokeVirtualCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..4eb977e204 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,26 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + +// @Override +// public void execute(StackFrame frame, ExecutionResult result) { +// +// } + + + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/LdcCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..227b3d6477 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/LdcCmd.java @@ -0,0 +1,35 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantInfo; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; +import com.coding.basic.homework_04.jvm.info.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +// @Override +// public void execute(StackFrame frame, ExecutionResult result) { +// +// +// } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/NewObjectCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..86b76c0a05 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,25 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + +// @Override +// public void execute(StackFrame frame, ExecutionResult result) { +// +// +// } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/NoOperandCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..8565eba0c6 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,29 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +// @Override +// public void execute(StackFrame frame, ExecutionResult result) { +// +// +// } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/OneOperandCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..65de0df3ae --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/PutFieldCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..ac3e4929cb --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,25 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +// @Override +// public void execute(StackFrame frame, ExecutionResult result) { +// +// +// } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/TwoOperandCmd.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..8057b9ec45 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coding.basic.homework_04.jvm.cmd; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.constant.ConstantInfo; +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; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantInfo.java index c7209b72b5..df41a0dc70 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantInfo.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/constant/ConstantInfo.java @@ -1,8 +1,13 @@ package com.coding.basic.homework_04.jvm.constant; -import org.omg.CORBA.PRIVATE_MEMBER; +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.StringInfo; +import com.coding.basic.homework_04.jvm.info.UTF8Info; -public class ConstantInfo { +public abstract class ConstantInfo { public static final int CLASS_INFO = 7; public static final int UTF8_INFO = 1; @@ -19,5 +24,18 @@ public ConstantInfo(ConstantPool pool) { this.pool = pool; } + public abstract int getType(); + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/ClassInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/ClassInfo.java index c30a15f36d..bd202dfb3d 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/ClassInfo.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/ClassInfo.java @@ -34,6 +34,14 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)pool.getConstantInfo(utf8Index); return utf8Info.getValue(); } + @Override + public int getType() { + return tag; + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/FieldRefInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/FieldRefInfo.java index d29e5564eb..aa9ad43af1 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/FieldRefInfo.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/FieldRefInfo.java @@ -30,5 +30,13 @@ public void setNameAndType_index(int nameAndType_index) { public int getTag() { return tag; } + @Override + public int getType() { + return tag; + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/MethodRefInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/MethodRefInfo.java index 1467cf94d0..bbd3330f69 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/MethodRefInfo.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/MethodRefInfo.java @@ -31,6 +31,14 @@ public void setNameAndType_index(int nameAndType_index) { public int getTag() { return tag; } + @Override + public int getType() { + return tag; + } + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NameAndTypeInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NameAndTypeInfo.java index 49d26d5083..51d2d98ea4 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NameAndTypeInfo.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NameAndTypeInfo.java @@ -6,8 +6,8 @@ public class NameAndTypeInfo extends ConstantInfo { private int tag = ConstantInfo.NAMEANDTYPE_INFO; - private int clz_index; - private int descriptor_index; + private int index1; + private int index2; public NameAndTypeInfo(ConstantPool pool) { super(pool); @@ -18,22 +18,30 @@ public NameAndTypeInfo() { } - public int getClz_index() { - return clz_index; + public int getIndex1() { + return index1; } - public void setClz_index(int clz_index) { - this.clz_index = clz_index; + public void setIndex1(int index1) { + this.index1 = index1; } - public int getDescriptor_index() { - return descriptor_index; + public int getIndex2() { + return index2; } - public void setDescriptor_index(int descriptor_index) { - this.descriptor_index = descriptor_index; + public void setIndex2(int index2) { + this.index2 = index2; } public int getTag() { return tag; } + @Override + public int getType() { + return tag; + } + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NullConstantInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NullConstantInfo.java index 8b44232f31..18c2b1d078 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NullConstantInfo.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/NullConstantInfo.java @@ -13,4 +13,15 @@ public NullConstantInfo(ConstantPool pool) { public NullConstantInfo() { // TODO Auto-generated constructor stub } + + @Override + public int getType() { + return -1; + } + + @Override + public void accept(Visitor visitor) { + + + } } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/StringInfo.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/StringInfo.java index 3399821e58..f4228e649f 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/StringInfo.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/StringInfo.java @@ -22,6 +22,14 @@ public void setString_index(int string_index) { public int getTag() { return tag; } + @Override + public int getType() { + return tag; + } + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/UTF8Info.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/UTF8Info.java index abc51a4c33..45a5ec4f45 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/UTF8Info.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/info/UTF8Info.java @@ -32,6 +32,14 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public int getType() { + return tag; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/loader/ClassFileLoader.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/loader/ClassFileLoader.java index 6cc1f20181..631fbf0db5 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/loader/ClassFileLoader.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/loader/ClassFileLoader.java @@ -64,11 +64,7 @@ private byte[] readFile(File file){ * @return */ private String getPath(String path ,String className){ -// System.out.println(className); String [] ways = className.split("\\."); -// for (String string : ways) { -// System.out.println(string); -// } StringBuilder builder = new StringBuilder(); builder.append(path); for (String string : ways) { @@ -77,7 +73,6 @@ private String getPath(String path ,String className){ builder.append(string); } builder.append(".class"); -// System.out.println(builder.toString()); return builder.toString(); } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/method/Method.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/method/Method.java index 6064cbe7e9..899427c304 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/method/Method.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/method/Method.java @@ -3,7 +3,7 @@ import com.coding.basic.homework_04.jvm.attr.AttributeInfo; import com.coding.basic.homework_04.jvm.attr.CodeAttr; import com.coding.basic.homework_04.jvm.clz.ClassFile; -import com.coding.basic.homework_04.jvm.constant.ConstantPool; +import com.coding.basic.homework_04.jvm.cmd.ByteCodeCommand; import com.coding.basic.homework_04.jvm.util.ByteCodeIterator; public class Method { @@ -69,7 +69,6 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iterator) { int descriptorIndex = iterator.nextU2ToInt(); Method method = new Method(accessFlag, nameIndex, descriptorIndex, clzFile); int attributeCount = iterator.nextU2ToInt(); - System.out.println("attributeCount : "+attributeCount); if(attributeCount > 0){ int attrNameIndex = iterator.nextU2ToInt(); String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); @@ -83,6 +82,8 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iterator) { return method; } - + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/print/ClassFilePrinter.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..14fcf61930 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/print/ClassFilePrinter.java @@ -0,0 +1,45 @@ +package com.coding.basic.homework_04.jvm.print; + +import com.coding.basic.homework_04.jvm.clz.ClassFile; +import com.coding.basic.homework_04.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\yanght\\Documents\\mygit\\coding2017-1\\group06\\1454385822\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coding.basic.homework_04.jvm.test.EmployeeV2"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/print/ConstantPoolPrinter.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..08aaedcfe9 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,105 @@ +package com.coding.basic.homework_04.jvm.print; + +import com.coding.basic.homework_04.jvm.constant.ConstantInfo; +import com.coding.basic.homework_04.jvm.constant.ConstantInfo.Visitor; +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.StringInfo; +import com.coding.basic.homework_04.jvm.info.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor consoleVisitor = new Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder builder = new StringBuilder(); + int stringIndex = info.getString_index(); + + builder.append("String #").append(stringIndex) + .append(" //" + pool.getUTF8String(stringIndex)); + + System.out.println(builder.toString()); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder builder = new StringBuilder(); + int index1 = info.getIndex1(); + int index2 = info.getIndex2(); + + builder.append("NameAndType #").append(index1 +":#") + .append(index2) + .append(" //" + pool.getUTF8String(index1)) + .append(":" + pool.getUTF8String(index2)); + + System.out.println(builder.toString()); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder builder = new StringBuilder(); + int clzIndex = info.getClass_index(); + int nameAndTypeIndex = info.getNameAndType_index(); + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(clzIndex); + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex); + + builder.append("MethodRef #").append(clzIndex+".#") + .append(nameAndTypeIndex) + .append(" //"+ clzInfo.getClassName()) + .append("." + pool.getUTF8String(nameAndTypeInfo.getIndex1()) + ":") + .append(pool.getUTF8String(nameAndTypeInfo.getIndex2())); + + System.out.println(builder.toString()); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder builder = new StringBuilder(); + int clzIndex = info.getClz_index(); + int nameAndTypeIndex = info.getNameAndType_index(); + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(clzIndex); + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex); + + builder.append("FieldRef #").append(clzIndex + ".#") + .append(nameAndTypeIndex) + .append(" //" + clzInfo.getClassName()) + .append("." + pool.getUTF8String(nameAndTypeInfo.getIndex1()) + ":") + .append(pool.getUTF8String(nameAndTypeInfo.getIndex2())); + + System.out.println(builder.toString()); + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder builder = new StringBuilder(); + builder.append("Class #").append(info.getUtf8Index()+" //") + .append(info.getClassName()); + System.out.println(builder.toString()); + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder builder = new StringBuilder(); + builder.append("Utf8 ").append(info.getValue()); + System.out.println(builder.toString()); + } + }; + + for(int i = 1; i <= pool.getSize(); i++){ + System.out.print("#" + i + " = "); + pool.getConstantInfo(i).accept(consoleVisitor); + } + + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java b/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java index 26e3ad765b..89c199d990 100644 --- a/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java +++ b/group06/1454385822/src/com/coding/basic/homework_04/jvm/test/ClassFileloaderTest.java @@ -9,6 +9,10 @@ import com.coding.basic.homework_04.jvm.clz.ClassFile; import com.coding.basic.homework_04.jvm.clz.ClassIndex; +import com.coding.basic.homework_04.jvm.cmd.BiPushCmd; +import com.coding.basic.homework_04.jvm.cmd.ByteCodeCommand; +import com.coding.basic.homework_04.jvm.cmd.OneOperandCmd; +import com.coding.basic.homework_04.jvm.cmd.TwoOperandCmd; import com.coding.basic.homework_04.jvm.constant.ConstantPool; import com.coding.basic.homework_04.jvm.field.Field; import com.coding.basic.homework_04.jvm.info.ClassInfo; @@ -175,8 +179,8 @@ public void testConstantPool(){ { NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(13); - Assert.assertEquals(9, nameAndType.getClz_index()); - Assert.assertEquals(14, nameAndType.getDescriptor_index()); + Assert.assertEquals(9, nameAndType.getIndex1()); + Assert.assertEquals(14, nameAndType.getIndex2()); } //抽查几个吧 { @@ -269,11 +273,83 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName String methodName = pool.getUTF8String(m.getNameIndex()); String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); String code = m.getCodeAttr().getCode(); -// System.out.println("code : " + code); Assert.assertEquals(expectedName, methodName); Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } -} \ No newline at end of file +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixToPostfix.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixToPostfix.java new file mode 100644 index 0000000000..387f0001f7 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixToPostfix.java @@ -0,0 +1,33 @@ +package com.coding.basic.homework_06.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + List infixToken = new TokenParser().parse(expr); + List posToken = new ArrayList(); + Stack stack = new Stack(); + + for (Token token : infixToken) { + if(token.isOperator()){ + while(!stack.empty() && !token.hasHigherPriority(stack.peek())){ + posToken.add(stack.pop()); + } + stack.push(token); + } + if(token.isNumber()){ + posToken.add(token); + } + } + while(!stack.isEmpty()){ + posToken.add(stack.pop()); + } + + return posToken; + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixToPostfixTest.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..b3a7661a20 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/InfixToPostfixTest.java @@ -0,0 +1,39 @@ +package com.coding.basic.homework_06.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/PostfixExpr.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/PostfixExpr.java new file mode 100644 index 0000000000..9e20e78e99 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/PostfixExpr.java @@ -0,0 +1,46 @@ +package com.coding.basic.homework_06.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack numStack = new Stack(); + + for(int i=0; i < tokens.size(); i++){ + if(tokens.get(i).isOperator()){ + float f1 = numStack.pop(); + float f2 = numStack.pop(); + numStack.push(getResult(f1, f2, tokens.get(i).value)); + }else + if(tokens.get(i).isNumber()){ + numStack.push(Float.valueOf(tokens.get(i).getIntValue())); + } + } + return numStack.pop(); + } + + private float getResult(float float1, float float2, String operator){ + if(operator.equals("+")){ + return float1 + float2; + }else if(operator.equals("-")){ + return float2 - float1; + }else if(operator.equals("*")){ + return float1 * float2; + }else if(operator.equals("/")){ + return float2 / float1; + }else{ + throw new RuntimeException(operator + " is not supported"); + } + } + + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/PostfixExprTest.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/PostfixExprTest.java new file mode 100644 index 0000000000..453349b6d8 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/PostfixExprTest.java @@ -0,0 +1,37 @@ +package com.coding.basic.homework_06.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/PrefixExpr.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/PrefixExpr.java new file mode 100644 index 0000000000..bafc6db694 --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/PrefixExpr.java @@ -0,0 +1,45 @@ +package com.coding.basic.homework_06.expr; + +import java.util.List; +import java.util.Stack; + + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack numStack = new Stack(); + + for(int i=tokens.size()-1; i>=0; i--){ + if(tokens.get(i).isOperator()){ + float f1 = numStack.pop(); + float f2 = numStack.pop(); + numStack.push(getResult(f2, f1, tokens.get(i).value)); + }else + if(tokens.get(i).isNumber()){ + numStack.push(Float.valueOf(tokens.get(i).getIntValue())); + } + } + return numStack.pop(); + } + + private float getResult(float float1, float float2, String operator){ + if(operator.equals("+")){ + return float1 + float2; + }else if(operator.equals("-")){ + return float2 - float1; + }else if(operator.equals("*")){ + return float1 * float2; + }else if(operator.equals("/")){ + return float2 / float1; + }else{ + throw new RuntimeException(operator + " is not supported"); + } + } +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/PrefixExprTest.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/PrefixExprTest.java new file mode 100644 index 0000000000..54afaf1e6e --- /dev/null +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/PrefixExprTest.java @@ -0,0 +1,44 @@ +package com.coding.basic.homework_06.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParser.java b/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParser.java index f158fdd933..5447f608bc 100644 --- a/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParser.java +++ b/group06/1454385822/src/com/coding/basic/homework_06/expr/TokenParser.java @@ -15,11 +15,18 @@ public List parse(String expr){ tokens.add(t); i++; } else if(Character.isDigit(c)){ - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); + int nextOperatorIndex = indexOfNextOperatorSpace(i, expr); + if(nextOperatorIndex == i){ + nextOperatorIndex = i + 1; + } + String value = expr.substring(i, nextOperatorIndex); + System.out.println(value); Token token = new Token(Token.NUMBER, value); tokens.add(token); i = nextOperatorIndex; + }else if(Character.isSpaceChar(c)){ + i++; + continue; }else{ System.out.println("char :["+c+"] is not number or operator,ignore"); i++; @@ -28,7 +35,8 @@ public List parse(String expr){ return tokens; } - private int indexOfNextOperator (int i, String expr){ + + private int indexOfNextOperatorSpace (int i, String expr){ while(Character.isDigit(expr.charAt(i))){ i++; if (i == expr.length()) { From 0e272c9e8389a3989baf32e9139500da51f25190 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Tue, 25 Apr 2017 21:13:30 +0800 Subject: [PATCH 310/552] update --- .../src/com/donaldy/jvm/cmd/BiPushCmd.java | 10 +- .../com/donaldy/jvm/cmd/ByteCodeCommand.java | 6 +- .../src/com/donaldy/jvm/cmd/GetFieldCmd.java | 8 +- .../donaldy/jvm/cmd/GetStaticFieldCmd.java | 8 ++ .../com/donaldy/jvm/cmd/InvokeSpecialCmd.java | 8 +- .../com/donaldy/jvm/cmd/InvokeVirtualCmd.java | 7 +- .../src/com/donaldy/jvm/cmd/LdcCmd.java | 8 ++ .../src/com/donaldy/jvm/cmd/NewObjectCmd.java | 7 ++ .../src/com/donaldy/jvm/cmd/NoOperandCmd.java | 9 ++ .../src/com/donaldy/jvm/cmd/PutFieldCmd.java | 8 ++ .../donaldy/jvm/engine/ExecutionResult.java | 56 +++++++++++ .../donaldy/jvm/engine/ExecutorEngine.java | 35 +++++++ .../src/com/donaldy/jvm/engine/Heap.java | 39 ++++++++ .../com/donaldy/jvm/engine/JavaObject.java | 71 ++++++++++++++ .../com/donaldy/jvm/engine/MethodArea.java | 68 +++++++++++++ .../src/com/donaldy/jvm/engine/MiniJVM.java | 28 ++++++ .../com/donaldy/jvm/engine/StackFrame.java | 95 +++++++++++++++++++ 17 files changed, 464 insertions(+), 7 deletions(-) create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/Heap.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java index 266edbc5e8..4126097c3f 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java @@ -3,6 +3,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantInfo; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -17,7 +19,11 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } - - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java index 48ded9618a..a611d4273b 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java @@ -6,6 +6,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantInfo; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public abstract class ByteCodeCommand { @@ -123,6 +125,6 @@ public String getReadableCodeText(){ } return txt; } - - //public abstract void execute(StackFrame frame,FrameResult result); + + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java index 9fe5244f8a..6644fe958d 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -16,7 +18,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java index 21236d26c6..7b4cc9896f 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java @@ -5,6 +5,8 @@ import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.FieldRefInfo; import com.donaldy.jvm.constant.UTF8Info; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -20,4 +22,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java index 7b56e9009b..b646011143 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java @@ -3,6 +3,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -18,6 +20,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java index 58e1d1ff5e..8b51e481af 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java @@ -2,6 +2,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -16,7 +18,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java index 28fe64a88d..d55d8ef409 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java @@ -4,6 +4,8 @@ import com.donaldy.jvm.constant.ConstantInfo; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.StringInfo; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -25,5 +27,11 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java index 27c8cd13ca..2a30581935 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java @@ -2,6 +2,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -15,5 +17,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java index 40d11a7bce..c664210eda 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -20,4 +22,11 @@ public int getLength(){ return 1; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java index 4b3b8c1fab..9bf85ba44f 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java @@ -2,6 +2,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -16,4 +18,10 @@ public String toString(ConstantPool pool) { } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..c90cc8fc65 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.donaldy.jvm.engine; + +import com.donaldy.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..1fb57626b9 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java @@ -0,0 +1,35 @@ +package com.donaldy.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.donaldy.jvm.attr.CodeAttr; +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.cmd.ByteCodeCommand; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/Heap.java b/group24/448641125/src/com/donaldy/jvm/engine/Heap.java new file mode 100644 index 0000000000..250d70504d --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.donaldy.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java b/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..d5c5884af2 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.donaldy.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java b/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..fea5102cd0 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java @@ -0,0 +1,68 @@ +package com.donaldy.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.loader.ClassFileLoader; +import com.donaldy.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java b/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..30f19e0d8c --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.donaldy.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.donaldy.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} From 50027e2327d849e9e5209f8897bda5a15e341f78 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Tue, 25 Apr 2017 21:40:16 +0800 Subject: [PATCH 311/552] =?UTF-8?q?=EF=BC=88=E8=A1=A5=EF=BC=89=E5=89=8D?= =?UTF-8?q?=E5=BA=8F=E3=80=81=E5=90=8E=E5=BA=8F=E3=80=81=E4=B8=AD=E5=BA=8F?= =?UTF-8?q?=E8=BD=AC=E5=90=8E=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (补)前序、后序、中序转后序 --- .../coding/basic/stack/expr/InfixExpr.java | 138 +++++++++++++----- .../basic/stack/expr/InfixToPostfix.java | 44 ++++++ .../coding/basic/stack/expr/PostfixExpr.java | 62 ++++++++ .../basic/stack/expr/PostfixExprTest.java | 42 ++++++ .../coding/basic/stack/expr/PrefixExpr.java | 85 +++++++++++ .../basic/stack/expr/PrefixExprTest.java | 45 ++++++ .../com/coding/basic/stack/expr/Token.java | 50 +++++++ .../coding/basic/stack/expr/TokenParser.java | 64 ++++++++ .../basic/stack/expr/TokenParserTest.java | 41 ++++++ 9 files changed, 531 insertions(+), 40 deletions(-) create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java index 5b91a03a95..eac007bb3e 100644 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java @@ -1,6 +1,7 @@ package com.coding.basic.stack.expr; -import com.coding.basic.stack.Stack; +import java.util.List; +import java.util.Stack; public class InfixExpr { String expr = null; @@ -10,50 +11,92 @@ public InfixExpr(String expr) { } public float evaluate() { - if(expr == null || "".equals(expr)){ - return 0; - } - Stack numStack = new Stack(); - Stack opStack = new Stack(); - String[] ss = expr.split(""); - boolean needOper = false;// 需要运算,遇到* / 后置为true - boolean foundOper = true;// 遇到运算符 - String ops = "+-*/"; - for (int i=0;i 1){ +// doAddOrSubOps(numStack, opStack); +// } +// return new Float((String)numStack.pop()); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + if(opStack.isEmpty()){ - }else{ - needOper = true; - } - }else if(!foundOper){// 未找到运算符前,字符串一直追加 - String tmp = ""; - Object obj = numStack.pop(); - if(obj != null){ - tmp = (String)obj; + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + + } + opStack.push(token); } - numStack.push(tmp + s); - }else if("1234567890".indexOf(s) != -1){ - numStack.push(s); - foundOper = false; - }else{ - throw new RuntimeException("InfixExpr not support " + s + " !"); - } - if((i == ss.length - 1) && needOper){ - doMulOrDivOp(numStack, (String)opStack.pop()); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); } } - if(numStack.size() > 1){ - doAddOrSubOps(numStack, opStack); + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); } - return new Float((String)numStack.pop()); + + + return numStack.pop().floatValue(); } /** @@ -98,4 +141,19 @@ private void doMulOrDivOp(Stack numStack, String op){ numStack.push(result); } + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } } \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..a518e43c13 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,44 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + // 3*20+12*5-40/2 --> 3 20 * 12 5 * + 40 2 / - + // 10-30+50 --> 10 30 - 50 + + List ret = new ArrayList<>(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack opStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + ret.add(token); + }else{ + while(!opStack.isEmpty() && opStack.peek().hasHigherPriority(token)){ + ret.add(opStack.pop()); + } + opStack.push(token); + } + } + while(!opStack.isEmpty()){ + ret.add(opStack.pop()); + } + return ret; + } + + public static String toString(List tokens){ + StringBuilder sb = new StringBuilder(); + for(Token token : tokens){ + sb.append(token.value); + } + return sb.toString(); + } + + public static void main(String[] args) { + System.out.println(toString(convert("10-30+50"))); + System.out.println(toString(convert("3*20+12*5-40/2"))); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..d4af19f583 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,62 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + Stack numStack = new Stack<>(); + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + for(Token token : tokens) { + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + }else{ + String op = token.value; + float num2 = numStack.pop(); + float num1 = numStack.pop(); + float result = calculate(op, num1, num2); + numStack.push(result); + } + } + return numStack.pop(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + private void reverse(Stack s){ + Stack tmp = new Stack(); + int len = s.size(); + for(int i=0;i i) { + tmp.push(s.pop()); + } + s.push(top); + while(tmp.size() > 0){ + s.push(tmp.pop()); + } + } + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..ad2b6dfd69 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,42 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 6*(3+5+(2+3)*8) + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..b5264d1362 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,85 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + int preContinueOp = 0; + int preContinueNum = 0; + for(Token token : tokens){ + if(token.isOperator()) { + opStack.push(token); + if(preContinueNum > 0){ + preContinueNum = 0; + preContinueOp = 1; + }else{ + preContinueOp++; + } + }else{ + numStack.push(new Float(token.getIntValue())); + preContinueNum++; + } + if(preContinueNum >= 2 && preContinueOp > 0){ + float num2 = numStack.pop(); + float num1 = numStack.pop(); + float result = calculate(opStack.pop().value, num1, num2); + numStack.push(result); + preContinueNum--; + preContinueOp--; + } + } + if(!opStack.isEmpty()){ + reverse(numStack); + } + while(!opStack.isEmpty()) { + String op = opStack.pop().value; + float num1 = numStack.pop(); + float num2 = numStack.pop(); + float result = calculate(op, num1, num2); + numStack.push(result); + } + return numStack.pop(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + private void reverse(Stack s){ + Stack tmp = new Stack(); + int len = s.size(); + for(int i=0;i i) { + tmp.push(s.pop()); + } + s.push(top); + while(tmp.size() > 0){ + s.push(tmp.pop()); + } + } + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..bf62a9df26 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,64 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + if(isBlank(c)){ + i++; + continue; + } + else if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } + + private boolean isBlank(char c){ + return c == 32; + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From 05a8b2d32ec268d5c063300f4905ef22e54444a6 Mon Sep 17 00:00:00 2001 From: guodongym Date: Tue, 25 Apr 2017 22:33:46 +0800 Subject: [PATCH 312/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/zhaogd/array/ArrayList.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayList.java b/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayList.java index d5c5fe04cc..f5cd3f3857 100644 --- a/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayList.java +++ b/group12/377401843/learning/src/main/java/com/zhaogd/array/ArrayList.java @@ -1,10 +1,10 @@ package com.zhaogd.array; -import java.util.Arrays; - import com.zhaogd.collection.Iterator; import com.zhaogd.collection.List; +import java.util.Arrays; + public class ArrayList implements List { private int size = 0; @@ -16,7 +16,6 @@ public class ArrayList implements List { * * @Method add * @param o - * @see com.zhaogd.collection.guodong.datastructure.List#add(java.lang.Object) */ public void add(Object o) { ensureCapacityInternal(size + 1); @@ -30,7 +29,6 @@ public void add(Object o) { * @Method add * @param index * @param o - * @see com.zhaogd.collection.guodong.datastructure.List#add(int, java.lang.Object) */ public void add(int index, Object o) { checkRangeForAdd(index); @@ -49,7 +47,6 @@ public void add(int index, Object o) { * @Method get * @param index * @return - * @see com.zhaogd.collection.guodong.datastructure.List#get(int) */ public Object get(int index) { checkRangeForGetOrRemove(index); @@ -63,7 +60,6 @@ public Object get(int index) { * @Method remove * @param index * @return - * @see com.zhaogd.collection.guodong.datastructure.List#remove(int) */ public Object remove(int index) { checkRangeForGetOrRemove(index); @@ -83,7 +79,6 @@ public Object remove(int index) { * * @Method size * @return - * @see com.zhaogd.collection.guodong.datastructure.List#size() */ public int size() { return size; From 0a589eb18fca8fba922456bfe7099ffacf182c27 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Tue, 25 Apr 2017 22:40:21 +0800 Subject: [PATCH 313/552] =?UTF-8?q?=EF=BC=88=E8=A1=A5=EF=BC=89javap?= =?UTF-8?q?=EF=BC=88=E5=88=B0=E5=B8=B8=E9=87=8F=E6=B1=A0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (补)javap(到常量池) --- .../leetcode/algorithms/OptimalDivision.java | 76 +++++++++++++++++++ .../algorithms/StudentAttendanceRecord1.java | 46 +++++++++++ .../src/me/practise/chapter2.java | 27 +++++++ .../coderising/jvm/constant/ClassInfo.java | 4 + .../coderising/jvm/constant/ConstantInfo.java | 12 +++ .../coderising/jvm/constant/ConstantPool.java | 2 +- .../coderising/jvm/constant/FieldRefInfo.java | 4 + .../jvm/constant/MethodRefInfo.java | 5 ++ .../jvm/constant/NameAndTypeInfo.java | 5 ++ .../jvm/constant/NullConstantInfo.java | 4 + .../coderising/jvm/constant/StringInfo.java | 5 ++ .../com/coderising/jvm/constant/UTF8Info.java | 4 + .../jvm/print/ClassFilePrinter.java | 2 +- .../jvm/print/ConstantPoolPrinter.java | 56 +++++++++++++- 14 files changed, 248 insertions(+), 4 deletions(-) create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/StudentAttendanceRecord1.java create mode 100644 group23/1028361767/java8-function-coding/src/me/practise/chapter2.java diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java new file mode 100644 index 0000000000..8821941630 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java @@ -0,0 +1,76 @@ +package com.coding.me.leetcode.algorithms; + +/** + * Given a list of positive integers, the adjacent integers will perform the + * float division. For example, [2,3,4] -> 2 / 3 / 4. + * + * However, you can add any number of parenthesis at any position to change the + * priority of operations. You should find out how to add parenthesis to get the + * maximum result, and return the corresponding expression in string format. + * Your expression should NOT contain redundant parenthesis. + * + * Example: Input: [1000,100,10,2] Output: "1000/(100/10/2)" Explanation: + * 1000/(100/10/2) = 1000/((100/10)/2) = 200 However, the bold parenthesis in + * "1000/((100/10)/2)" are redundant, since they don't influence the operation + * priority. So you should return "1000/(100/10/2)". + * + * Other cases: 1000/(100/10)/2 = 50 1000/(100/(10/2)) = 50 1000/100/10/2 = 0.5 + * 1000/100/(10/2) = 2 Note: + * + * The length of the input array is [1, 10]. Elements in the given array will be + * in range [2, 1000]. There is only one optimal division for each test case. + * + * @author hewj + * + */ +public class OptimalDivision { + + public static String mySolution(int[] nums) { + if(nums.length == 0 || nums.length > 10) { + return ""; + } + if(nums.length == 1) { + return "" + nums[0]; + } + straightInsertionSort(nums); + StringBuilder sb = new StringBuilder(); + sb.append(nums[0]).append("/"); + if(nums.length == 2){ + sb.append(nums[1]); + }else{ + sb.append("("); + for(int k=1;k lList = new ArrayList<>(); + for(int i=0;i 1 || lList.size() > 2){ + return false; + } + } + return true; + } + + public static void main(String[] args) { + System.out.println(mySolution("LPLPLPLPLPL")); + } +} diff --git a/group23/1028361767/java8-function-coding/src/me/practise/chapter2.java b/group23/1028361767/java8-function-coding/src/me/practise/chapter2.java new file mode 100644 index 0000000000..b43ac3f6d4 --- /dev/null +++ b/group23/1028361767/java8-function-coding/src/me/practise/chapter2.java @@ -0,0 +1,27 @@ +package me.practise; + +import java.awt.event.ActionListener; +import java.util.function.BinaryOperator; + +public class chapter2 { + + public static void main(String[] args) { + Runnable noArg = () -> System.out.println("runnable with no argument."); + Thread thread = new Thread(noArg); + thread.start(); + + ActionListener oneArg = event -> System.out.println("actionListener with one argument."); + + Runnable multiStatement = () -> { + System.out.println("Runnable with multi statement."); + System.out.println("Hello Java8!"); + }; + BinaryOperator add = (x, y) -> x + y; + BinaryOperator addExplicit = (Long x, Long y) -> x + y; + + String name = "abc"; + name = "def"; + //ActionListener oneArg1 = event -> System.out.println("actionListener with one argument." + name); + // 编译无法通过:方法块中使用的变量必须使用final声明或既成事实的final变量,即变成赋值成功后不能再赋值 + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java index aea9048ea4..92ac5b67eb 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -21,4 +21,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java index 466b072244..8d4fc6f0de 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -26,4 +26,16 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor { + void visitClassInfo(ClassInfo classInfo); + void visitFieldRefInfo(FieldRefInfo fieldRefInfo); + void visitMethodRefInfo(MethodRefInfo methodRefInfo); + void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo); + void visitNullConstantInfo(NullConstantInfo nullConstantInfo); + void visitStringInfo(StringInfo stringInfo); + void visitUTF8Info(UTF8Info utf8Info); + } + } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java index 86c0445695..93506b1e20 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index 65475e194c..cb31499dd3 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,4 +51,8 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRefInfo(this); + } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index 7f05870020..466b06f9ea 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -49,6 +49,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRefInfo(this); + } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index 402f9dec86..c13d8c4fc6 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,9 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndTypeInfo(this); + } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index 936736016f..655c273621 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + visitor.visitNullConstantInfo(this); + } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java index f1f8eb4ed4..84ae36c4ca 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -22,5 +22,10 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitStringInfo(this); + } } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java index 5cac9f04f7..7c4aeb1861 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -26,6 +26,10 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visitUTF8Info(this); + } diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java index 14407bacbe..f4f8ef8c58 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -40,7 +40,7 @@ public void print(){ } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "/Users/jie/Documents/git/gitRepository/coding2017/group23/1028361767/mini-jvm/bin"; ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); String className = "com.coderising.jvm.test.EmployeeV1"; diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java index 028161adc7..2e84c4b2f1 100644 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -1,11 +1,14 @@ package com.coderising.jvm.print; +import java.util.concurrent.SynchronousQueue; + import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; @@ -18,8 +21,57 @@ public void print(){ System.out.println("Constant Pool:"); + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitUTF8Info(UTF8Info utf8Info) { + System.out.println("UTF8 " + utf8Info.getValue()); + } + + @Override + public void visitStringInfo(StringInfo stringInfo) { + System.out.println("String " + stringInfo.toString()); + } + + @Override + public void visitNullConstantInfo(NullConstantInfo nullConstantInfo) { + + } + + @Override + public void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo) { + System.out.println("NameAndType " + nameAndTypeInfo.getIndex1() + ":" + nameAndTypeInfo.getIndex2() + + " // " + nameAndTypeInfo.getName() + ":" + nameAndTypeInfo.getTypeInfo()); + } + + @Override + public void visitMethodRefInfo(MethodRefInfo methodRefInfo) { + System.out.println("Methodref " + methodRefInfo.getClassInfoIndex() + "." + + methodRefInfo.getNameAndTypeIndex() + " // " + + methodRefInfo.getClassName() + "." + methodRefInfo.getMethodName() + + ":" + methodRefInfo.getParamAndReturnType()); + } + + @Override + public void visitFieldRefInfo(FieldRefInfo fieldRefInfo) { + System.out.println("Fieldref " + fieldRefInfo.getClassInfoIndex() + "." + + fieldRefInfo.getNameAndTypeIndex() + " // " + + fieldRefInfo.getClassName() + "." + fieldRefInfo.getFieldName() + ":" + + fieldRefInfo.getFieldType()); + } + + @Override + public void visitClassInfo(ClassInfo classInfo) { + System.out.println("Class " + classInfo.getUtf8Index() + " // " + classInfo.getClassName()); + } + }; - - + for(int i=1;i codeMap = new HashMap(); static{ @@ -105,18 +139,6 @@ public String getOpCode() { public abstract int getLength(); - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - public String getReadableCodeText(){ String txt = codeMap.get(opCode); if(txt == null){ diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java index 0dd0573ae5..d1bfdeb21b 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java @@ -7,40 +7,7 @@ public class CommandParser { - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { @@ -57,51 +24,58 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { while (iter.hasNext()) { String opCode = iter.next2CharAsString(); - if (new_object.equals(opCode)) { + if (ByteCodeCommand.new_object.equals(opCode)) { NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { + } else if (ByteCodeCommand.invokespecial.equals(opCode)) { InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); // System.out.println( cmd.toString(clzFile.getConstPool())); cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { + } else if (ByteCodeCommand.invokevirtual.equals(opCode)) { InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (getfield.equals(opCode)) { + } else if (ByteCodeCommand.getfield.equals(opCode)) { GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (getstatic.equals(opCode)) { + } else if (ByteCodeCommand.getstatic.equals(opCode)) { GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (putfield.equals(opCode)) { + } else if (ByteCodeCommand.putfield.equals(opCode)) { PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (ldc.equals(opCode)) { + } else if (ByteCodeCommand.ldc.equals(opCode)) { LdcCmd cmd = new LdcCmd(clzFile, opCode); cmd.setOperand(iter.next2CharAsInt()); cmds.add(cmd); - } else if (bipush.equals(opCode)) { + } else if (ByteCodeCommand.bipush.equals(opCode)) { BiPushCmd cmd = new BiPushCmd(clzFile, opCode); cmd.setOperand(iter.next2CharAsInt()); cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + } else if (ByteCodeCommand.dup.equals(opCode) + || ByteCodeCommand.aload_0.equals(opCode) + || ByteCodeCommand.aload_1.equals(opCode) + || ByteCodeCommand.aload_2.equals(opCode) + || ByteCodeCommand.iload_1.equals(opCode) + || ByteCodeCommand.iload_2.equals(opCode) + || ByteCodeCommand.iload_3.equals(opCode) + || ByteCodeCommand.fload_3.equals(opCode) + || ByteCodeCommand.voidreturn.equals(opCode) + || ByteCodeCommand.astore_1.equals(opCode)) { NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); cmds.add(cmd); diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java index aa268ca39e..f5b6932613 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -1,8 +1,9 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -12,16 +13,22 @@ public GetFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } @Override - public void execute(StackFrame frame, ExecutionResult result) { + public void execute(StackFrame frame,ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); - } - - + frame.getOprandStack().push(fieldValue); + + + + } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java index 54a85e2603..26ab9c8be0 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -1,8 +1,10 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -13,14 +15,24 @@ public GetStaticFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + //TODO 处理非System.out的情况 } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java index bdc4b00adc..01390d7b5a 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -1,9 +1,11 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.MethodArea; import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -13,15 +15,27 @@ public InvokeSpecialCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsMethod(pool); + return super.getOperandAsMethod(); } - @Override - public void execute(StackFrame frame, ExecutionResult result) { + public void execute(StackFrame frame,ExecutionResult result) { + + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + } - + } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java index 40a668437e..80071ef1c5 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -1,9 +1,12 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.MethodArea; import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -12,15 +15,69 @@ public InvokeVirtualCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsMethod(pool); + return super.getOperandAsMethod(); } + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } @Override - public void execute(StackFrame frame, ExecutionResult result) { + public void execute(StackFrame frame,ExecutionResult result) { + + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if(isSystemOutPrintlnMethod(className,methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while(currentClassName != null){ + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + + break; + + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(m); } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java index f6d22350a7..5d1985868a 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java @@ -5,6 +5,8 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -14,9 +16,9 @@ public LdcCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + ConstantInfo info = getConstantInfo(this.getOperand()); String value = "TBD"; if(info instanceof StringInfo){ @@ -27,9 +29,21 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { + public void execute(StackFrame frame,ExecutionResult result){ + + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java index ace90a27cd..f675956919 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -1,8 +1,10 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -12,15 +14,22 @@ public NewObjectCmd(ClassFile clzFile, String opCode){ } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsClassInfo(pool); + return super.getOperandAsClassInfo(); } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { + public void execute(StackFrame frame,ExecutionResult result){ + int index = this.getIndex(); - } - + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + + String clzName = info.getClassName(); + + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java index 662f5cf5ca..d5c7b87481 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -1,8 +1,9 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -12,19 +13,133 @@ public NoOperandCmd(ClassFile clzFile, String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + + + } public int getLength(){ return 1; } - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java index 6c17b72c46..cd93fba1d1 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -1,8 +1,11 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -12,15 +15,29 @@ public PutFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } - @Override - public void execute(StackFrame frame, ExecutionResult result) { + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); } -} + + +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java index 6cb42d2a83..6f4250f920 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -2,7 +2,6 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.MethodRefInfo; @@ -38,21 +37,22 @@ public int getIndex(){ return index; } - protected String getOperandAsClassInfo(ConstantPool pool){ + protected String getOperandAsClassInfo(){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + ClassInfo info = (ClassInfo)getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); } - protected String getOperandAsMethod(ConstantPool pool){ + protected String getOperandAsMethod(){ int index = getIndex(); String codeTxt = getReadableCodeText(); + //ConstantInfo constInfo = this.getConstantInfo(index); MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); } - protected String getOperandAsField(ConstantPool pool){ + protected String getOperandAsField(){ int index = getIndex(); String codeTxt = getReadableCodeText(); @@ -62,4 +62,4 @@ protected String getOperandAsField(ConstantPool pool){ public int getLength(){ return 3; } -} +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutorEngine.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutorEngine.java index dc0030932e..e22bb77838 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutorEngine.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -1,5 +1,8 @@ package com.coderising.jvm.engine; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.method.Method; import com.coding.basic.stack.Stack; @@ -13,8 +16,28 @@ public ExecutorEngine() { public void execute(Method mainMethod){ + //为main函数创建一个栈帧 + StackFrame mainFrame = StackFrame.create(mainMethod); + //main函数帧压栈 + stack.push(mainFrame); - + while(!stack.isEmpty()){ + + StackFrame frame = stack.peek(); + ExecutionResult result = frame.execute(); + + //判断执行结果是否暂停或者有新的函数帧生成 + if(result.isPauseAndRunNewFrame()){ + + Method method = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(method); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame,nextFrame); + stack.push(nextFrame); + }else{ + stack.pop(); + } + } } @@ -22,7 +45,24 @@ public void execute(Method mainMethod){ private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + Method nextMethod = nextFrame.getMethod(); + List paramList = nextMethod.getParameterList(); + + //加上1 是因为要把this也传递过去 + int paramNum = paramList.size() + 1; + List values = new ArrayList(); + //数据结构知识: 从栈中取出栈顶的x个元素 + while(paramNum>0){ + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + //数据结构知识: 把一个列表倒序排列 + List params = new ArrayList(); + for(int i=values.size()-1; i>=0 ;i--){ + params.add(values.get(i)); + } + nextFrame.setLocalVariableTable(params); } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MethodArea.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MethodArea.java index 9d21b55787..87b9d425f8 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MethodArea.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MethodArea.java @@ -32,7 +32,7 @@ public void setClassFileLoader(ClassFileLoader clzLoader){ this.clzLoader = clzLoader; } - public Method getMainMethod(String className) throws NotAClassFileException{ + public Method getMainMethod(String className){ ClassFile clzFile = this.findClassFile(className); @@ -40,30 +40,55 @@ public Method getMainMethod(String className) throws NotAClassFileException{ } - public ClassFile findClassFile(String className) throws NotAClassFileException{ + public ClassFile findClassFile(String className){ - if(map.get(className) != null){ - return map.get(className); + ClassFile clzFile = null; + try { + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + + } catch (NotAClassFileException e) { + e.printStackTrace(); } - // 看来该class 文件还没有load过 - ClassFile clzFile = this.clzLoader.loadClass(className); - - map.put(className, clzFile); - return clzFile; - } public Method getMethod(String className, String methodName, String paramAndReturnType){ - return null; + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if(m == null){ + + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; } public Method getMethod(MethodRefInfo methodRef){ - return null; + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MiniJVM.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MiniJVM.java index 7e933213cb..9d255d7ea6 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MiniJVM.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/MiniJVM.java @@ -26,4 +26,16 @@ public void run(String[]classPaths , String className) throws FileNotFoundExcept engine.execute(methodArea.getMainMethod(className)); } + public static void main(String[] args) { + + try { + MiniJVM jvm = new MiniJVM(); + String[] classPaths = {"E:\\githubRepository\\coding2017\\group12\\2258659044\\zj-2017\\bin"}; + String clzName = "test.com.coderising.jvm.EmployeeV1"; + + jvm.run(classPaths, clzName); + } catch (IOException | NotAClassFileException e) { + e.printStackTrace(); + } + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/StackFrame.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/StackFrame.java index 77c67f02ad..d985f417ce 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/StackFrame.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/engine/StackFrame.java @@ -64,8 +64,42 @@ public int getNextCommandIndex(int offset){ } public ExecutionResult execute(){ - return null; + ByteCodeCommand [] cmds = m.getCmds(); + + while(cmds.length>index){ + + ExecutionResult result = new ExecutionResult(); + //缺省值是执行下一条命令 + result.setNextAction(ExecutionResult.RUN_NEXT_CMD); + + System.out.println(cmds[index].toString()); + + cmds[index].execute(this,result); + + if(result.isRunNextCmd()){ + index++; + } + else if(result.isExitCurrentFrame()){ + return result; + } + else if(result.isPauseAndRunNewFrame()){ + index++; + return result; + } + else if(result.isJump()){ + int offset = result.getNextCmdOffset(); + this.index = getNextCommandIndex(offset); + } else{ + index++; + } + + } + + //当前StackFrmae的指令全部执行完毕,可以退出了 + ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + return result; } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java index 245ccdc558..05eb77e802 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java @@ -7,6 +7,7 @@ import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; public class Method { @@ -47,6 +48,66 @@ public ByteCodeCommand[] getCmds() { return null; } + private String getParamAndReturnType(){ + UTF8Info nameAndTypeInfo = (UTF8Info)pool.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + + public List getParameterList(){ + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } + public int getAccessFlag() { return accessFlag; } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group12/2258659044/zj-2017/src/com/coding/basic/queue/QueueWithTwoStacks.java index 7b1527e7b9..c844a2e1ca 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/queue/QueueWithTwoStacks.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -3,6 +3,7 @@ import com.coding.basic.stack.Stack; public class QueueWithTwoStacks { + private Stack stack1; private Stack stack2; @@ -11,28 +12,37 @@ public QueueWithTwoStacks() { stack1 = new Stack(); stack2 = new Stack(); } - - - - + public boolean isEmpty() { - return false; + return (stack1.isEmpty()&&stack2.isEmpty()); } public int size() { - return -1; + return (stack1.size()+stack2.size()); } - - public void enQueue(E item) { - + + if(item!=null){ + + while(!stack2.isEmpty()){ + stack1.push(stack2.pop()); + } + stack1.push(item); + } } public E deQueue() { - return null; + + if(isEmpty()){ + return null; + } + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + return stack2.pop(); } diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java index 2a18bee6d7..d6c9284201 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java @@ -28,8 +28,8 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "test/com/coderising/jvm/EmployeeV1"; - static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; - //static String path1 = "E:\\githubRepository\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + //static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + static String path1 = "E:\\githubRepository\\coding2017\\group12\\2258659044\\zj-2017\\bin"; static String path2 = "C:\temp"; diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/QueueWithTwoStacksTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..07e277912f --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,72 @@ +package test.com.coding.basic.queue; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.queue.QueueWithTwoStacks; + +public class QueueWithTwoStacksTest { + + private QueueWithTwoStacks queue; + + @Before + public void setUp() throws Exception { + queue = new QueueWithTwoStacks<>(); + } + + @Test + public void testIsEmpty() { + + Assert.assertEquals(true, queue.isEmpty()); + } + + @Test + public void testSize() { + + Assert.assertEquals(0, queue.size()); + + queue.enQueue("zj"); + Assert.assertEquals(1, queue.size()); + + for (int i = 0; i < 10; i++) { + queue.enQueue(i); + } + Assert.assertEquals(11, queue.size()); + + for (int i = 0; i < 5; i++) { + queue.deQueue(); + } + Assert.assertEquals(6, queue.size()); + } + + @Test + public void testEnQueue() { + + for (int i = 0; i < 10; i++) { + queue.enQueue(i); + } + + for (int i = 0; i < 10; i++) { + Assert.assertEquals(i, queue.deQueue()); + } + } + + @Test + public void testDeQueue() { + + Assert.assertEquals(null, queue.deQueue()); + + for (int i = 0; i < 10; i++) { + queue.enQueue(i); + } + + for (int i = 0; i < 5; i++) { + queue.deQueue(); + } + Assert.assertEquals(5, queue.size()); + Assert.assertEquals(false, queue.isEmpty()); + + } + +} From 9ca8c88f596ac409ad9b18b38f9150afd29a9539 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Tue, 25 Apr 2017 23:02:44 +0800 Subject: [PATCH 315/552] =?UTF-8?q?=E5=AE=9E=E7=8E=B0Linklist=20iterator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/linklist/LinkedList.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java index c12f92a044..31acd087d2 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java @@ -226,7 +226,31 @@ public int size() { @Override public Iterator iterator() { - return null; + return new Itr(); + } + + private class Itr implements Iterator { + /** + * Index of element to be returned by subsequent call to next. + */ + int cursor = 0; + + + @Override + public boolean hasNext() { + return cursor != size(); + } + + @Override + public E next() { + int i = cursor; + if (i >= size) { + throw new NoSuchElementException(); + } + E next = get(i); + cursor = i + 1; + return next; + } } private void checkElementIndex(int index) { From 02c15e8973b9c0165ac80565975302e55552deba Mon Sep 17 00:00:00 2001 From: maishihang <446031103@qq.com> Date: Tue, 25 Apr 2017 23:12:35 +0800 Subject: [PATCH 316/552] update jvm the third work --- .../datastructure/stack/expr/InfixExpr.java | 67 +++++++++++++++++++ .../stack/expr/InfixExprTest.java | 51 ++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java create mode 100644 group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java diff --git a/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java b/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..503f050d29 --- /dev/null +++ b/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java @@ -0,0 +1,67 @@ +package com.datastructure.stack.expr; + +import java.util.Objects; +import java.util.Stack; +import java.lang.String; +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + Stack sign = new Stack(); + Stack number = new Stack(); + int strCnt = 0; + int numberLen = 0; + String[] String = expr.split("[^\\d]"); + if(expr!=null){ + for (int i = 0,strLen = expr.length(); i < strLen; i++) { + char c=expr.charAt(i); + if(Objects.equals(c, '+')||Objects.equals(c, '-')){ + sign.push(c); + }else if(Objects.equals(c, '*')||Objects.equals(c, '/')){ + float number1=number.pop(); + float number2=Float.parseFloat(String[strCnt]); + float result=calculate(number1,number2,c); + numberLen = String[strCnt].length(); + number.push(result); + i += numberLen; + strCnt++; + }else{ + number.push(Float.parseFloat(String[strCnt])); + numberLen = String[strCnt].length(); + strCnt++; + i += (numberLen-1); + } + } + for (int i = 0,signS = sign.size(); i < signS; i++) { + float number1 = number.pop(); + float number2 =number.pop(); + char c = sign.pop(); + float result=calculate(number2,number1,c); + number.push(result); + } + } + return number.pop(); + } + + private float calculate(float number1,float number2,char c){ + float result = 0; + if(Objects.equals(c, '+')){ + result = number1 + number2; + }else if(Objects.equals(c, '-')){ + result = number1 - number2; + }else if(Objects.equals(c, '*')){ + result = number1 * number2; + }else if(Objects.equals(c, '/')){ + result = number1 / number2; + } + return result; + } + + + + +} diff --git a/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java b/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..1b64b3fcc7 --- /dev/null +++ b/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java @@ -0,0 +1,51 @@ +package com.datastructure.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + float a =expr.evaluate(); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} From 0b36bd7151b954c4fdd00adff4855194c320530a Mon Sep 17 00:00:00 2001 From: Patrick Date: Wed, 26 Apr 2017 00:26:29 +0800 Subject: [PATCH 317/552] =?UTF-8?q?jvm=E5=BC=95=E6=93=8E1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/minijvm/cmd/BiPushCmd.java | 8 ++ .../minijvm/cmd/ByteCodeCommand.java | 4 +- .../coding2017/minijvm/cmd/GetFieldCmd.java | 8 ++ .../minijvm/cmd/GetStaticFieldCmd.java | 8 ++ .../minijvm/cmd/InvokeSpecialCmd.java | 8 ++ .../minijvm/cmd/InvokeVirtualCmd.java | 8 ++ .../coding2017/minijvm/cmd/LdcCmd.java | 8 ++ .../coding2017/minijvm/cmd/NewObjectCmd.java | 8 ++ .../coding2017/minijvm/cmd/NoOperandCmd.java | 8 ++ .../coding2017/minijvm/cmd/PutFieldCmd.java | 8 ++ .../minijvm/engine/ExecutionResult.java | 56 +++++++++++ .../minijvm/engine/ExecutorEngine.java | 33 +++++++ .../coding2017/minijvm/engine/Heap.java | 39 ++++++++ .../coding2017/minijvm/engine/JavaObject.java | 71 ++++++++++++++ .../coding2017/minijvm/engine/MethodArea.java | 70 +++++++++++++ .../coding2017/minijvm/engine/MiniJVM.java | 30 ++++++ .../coding2017/minijvm/engine/StackFrame.java | 97 +++++++++++++++++++ 17 files changed, 471 insertions(+), 1 deletion(-) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutionResult.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/Heap.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/JavaObject.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MiniJVM.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/StackFrame.java diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java index 80d3076ea1..bbfccc5785 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java @@ -2,6 +2,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -15,6 +17,12 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java index f2c72d31f1..7541ecdb88 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java @@ -8,6 +8,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; @@ -128,5 +130,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java index ad694d7eec..22051b8339 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java @@ -2,6 +2,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -15,6 +17,12 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } + diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java index 87bfca3c7f..322a88505c 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java @@ -2,6 +2,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -16,4 +18,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java index e573129d76..4179d004b6 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java @@ -2,6 +2,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -16,6 +18,12 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java index 989c3f6fae..63e30d8c4f 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java @@ -2,6 +2,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -15,6 +17,12 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } + diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java index bc72a9f300..8d76f922d1 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java @@ -4,6 +4,8 @@ import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.constant.StringInfo; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -25,5 +27,11 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java index 973061d110..e710414837 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java @@ -2,6 +2,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -15,5 +17,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java index 62c51c2b3a..0f7e9013a8 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java @@ -2,6 +2,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -20,4 +22,10 @@ public int getLength(){ return 1; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java index e73ff203d5..b4250553cf 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java @@ -2,6 +2,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -15,5 +17,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutionResult.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..41fe9c7771 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.github.ipk2015.coding2017.minijvm.engine; + +import com.github.ipk2015.coding2017.minijvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..8a22074203 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java @@ -0,0 +1,33 @@ +package com.github.ipk2015.coding2017.minijvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.github.ipk2015.coding2017.minijvm.method.Method; + + + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/Heap.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/Heap.java new file mode 100644 index 0000000000..bfef12886a --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.github.ipk2015.coding2017.minijvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/JavaObject.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/JavaObject.java new file mode 100644 index 0000000000..07d2084f0a --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.github.ipk2015.coding2017.minijvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java new file mode 100644 index 0000000000..cfbfd629f8 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java @@ -0,0 +1,70 @@ +package com.github.ipk2015.coding2017.minijvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; +import com.github.ipk2015.coding2017.minijvm.loader.ClassFileLoader; +import com.github.ipk2015.coding2017.minijvm.method.Method; + + + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MiniJVM.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MiniJVM.java new file mode 100644 index 0000000000..45174b341f --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MiniJVM.java @@ -0,0 +1,30 @@ +package com.github.ipk2015.coding2017.minijvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.github.ipk2015.coding2017.minijvm.loader.ClassFileLoader; + + + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} From 19fd28a15a7e155667044438cedb7692905b1ce9 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Wed, 26 Apr 2017 10:41:46 +0800 Subject: [PATCH 318/552] stage files --- .../src/main/java/miniJVM/attr/CodeAttr.java | 2 +- .../java/miniJVM/cmd/ByteCodeCommand.java | 19 ++---------- .../main/java/miniJVM/cmd/CommandParser.java | 23 ++++++++++++-- .../main/java/miniJVM/cmd/NoOperandCmd.java | 31 +++++++++---------- .../java/miniJVM/loader/ClassFileParser.java | 9 +++--- 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java index 5657c2198a..3cc3138f67 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java @@ -22,7 +22,7 @@ public ByteCodeCommand[] getCmds() { private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java index ddb15c56bf..5f0a289a4b 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java @@ -7,9 +7,7 @@ import java.util.HashMap; import java.util.Map; - - -public abstract class ByteCodeCommand { +public abstract class ByteCodeCommand { String opCode; ClassFile clzFile; @@ -69,10 +67,6 @@ public abstract class ByteCodeCommand { codeMap.put("12", "ldc"); } - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ this.clzFile = clzFile; this.opCode = opCode; @@ -96,23 +90,16 @@ protected ConstantInfo getConstantInfo(int index){ protected ConstantPool getConstantPool(){ return this.getClassFile().getConstantPool(); } - - - + public String getOpCode() { return opCode; } public abstract int getLength(); - - - - + public String toString(){ - StringBuffer buffer = new StringBuffer(); buffer.append(this.opCode); - return buffer.toString(); } public abstract String toString(ConstantPool pool); diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java index 611f50c958..0bd0f3adcf 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java @@ -3,7 +3,10 @@ import miniJVM.clz.ClassFile; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class CommandParser { @@ -42,13 +45,29 @@ public class CommandParser { public static final String iadd = "60"; public static final String iinc = "84"; + public static final Map operandMap = new HashMap(){{ + put(aload_0, 0); + put(invokespecial, 2); + put(aload_1, 0); + put(putfield, 2); + put(iload_2, 0); + put(voidreturn, 0); + }}; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + CommandIterator ci = new CommandIterator(codes); + List cmds = new ArrayList(); + while (ci.hasNext()){ + String command = ci.next2CharAsString().toUpperCase(); + switch (command){ - + } + } return null; } - private static void calcuateOffset(List cmds) { + private static void calculateOffset(List cmds) { int offset = 0; for (ByteCodeCommand cmd : cmds) { diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java index ecce3f432f..e10bbabb66 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java @@ -4,21 +4,20 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantPool; -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } +public class NoOperandCmd extends ByteCodeCommand { + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); + } + + + public int getLength() { + return 1; + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index a1c65e963d..94387ed201 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -4,6 +4,8 @@ import miniJVM.clz.AccessFlag; import miniJVM.clz.ClassFile; import miniJVM.clz.ClassIndex; +import miniJVM.cmd.ByteCodeCommand; +import miniJVM.cmd.CommandParser; import miniJVM.constant.*; import miniJVM.field.Field; @@ -157,11 +159,8 @@ private void parseMethods(ByteCodeIterator iter) { int maxStack = iter.nextU2ToInt(); int maxLocals = iter.nextU2ToInt(); int codeLength = iter.nextU4ToInt(); - int codeLengthTemp = codeLength; - while(codeLengthTemp > 0){ - - codeLengthTemp--; - } + String cmdCodes = iter.nextUxToHexString(codeLength); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, cmdCodes); } attributeCountTemp--; From 333218df1978e315b71253e76d3aae389e8cbe89 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Wed, 26 Apr 2017 14:41:15 +0800 Subject: [PATCH 319/552] =?UTF-8?q?JVM=E5=AD=97=E6=AE=B5=E5=92=8C=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/miniJVM/attr/CodeAttr.java | 15 ++- .../java/miniJVM/attr/LineNumberTable.java | 18 +++- .../java/miniJVM/attr/LocalVariableTable.java | 17 ++- .../main/java/miniJVM/cmd/CommandParser.java | 73 ++++++++++--- .../java/miniJVM/loader/ClassFileParser.java | 101 ++++++++++-------- 5 files changed, 155 insertions(+), 69 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java index 3cc3138f67..9c6147cdb4 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/CodeAttr.java @@ -2,6 +2,7 @@ import miniJVM.clz.ClassFile; import miniJVM.cmd.ByteCodeCommand; +import miniJVM.cmd.CommandParser; import miniJVM.constant.ConstantPool; import miniJVM.loader.ByteCodeIterator; @@ -40,11 +41,17 @@ public void setLocalVariableTable(LocalVariableTable t) { } public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attributeNameIndex = iter.nextU2ToInt(); + int attributeLength = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLength = iter.nextU4ToInt(); + String cmdCodes = iter.nextUxToHexString(codeLength); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, cmdCodes); - return null; + return new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, cmdCodes, cmds); } - public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); //buffer.append("Code:").append(code).append("\n"); @@ -56,11 +63,9 @@ public String toString(ConstantPool pool){ buffer.append(this.localVarTable.toString(pool)); return buffer.toString(); } + private void setStackMapTable(StackMapTable t) { this.stackMapTable = t; } - - - } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/attr/LineNumberTable.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/LineNumberTable.java index a49f31a9c5..033b38faa3 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/attr/LineNumberTable.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/LineNumberTable.java @@ -12,6 +12,11 @@ public class LineNumberTable extends AttributeInfo { private static class LineNumberItem{ int startPC; int lineNum; + public LineNumberItem(int startPC, int lineNum){ + this.startPC = startPC; + this.lineNum = lineNum; + } + public int getStartPC() { return startPC; } @@ -34,8 +39,17 @@ public LineNumberTable(int attrNameIndex, int attrLen) { } public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; + int attributeNameIndex = iter.nextU2ToInt(); + int attributeLength = iter.nextU4ToInt(); + int lineNumberTableLength = iter.nextU2ToInt(); + LineNumberTable table = new LineNumberTable(attributeNameIndex, attributeLength); + for(int i = 0; i < lineNumberTableLength; i ++){ + int startPC = iter.nextU2ToInt(); + int lineNum = iter.nextU2ToInt(); + LineNumberItem item = new LineNumberItem(startPC, lineNum); + table.addLineNumberItem(item); + } + return table; } public String toString(){ diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableTable.java b/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableTable.java index e5bf39196e..0b46d90c3d 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableTable.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/attr/LocalVariableTable.java @@ -22,8 +22,21 @@ private void addLocalVariableItem(LocalVariableItem item) { } public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; + int attributeNameIndex = iter.nextU2ToInt(); + int attributeLength = iter.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(attributeNameIndex, attributeLength); + int localVariableTableLength = iter.nextU2ToInt(); + for(int i = 0; i < localVariableTableLength; i++){ + int startPC = iter.nextU2ToInt(); + int length = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int index = iter.nextU2ToInt(); + LocalVariableItem item = new LocalVariableItem(); + table.addLocalVariableItem(item); + } + + return table; } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java index 0bd0f3adcf..1d45ffc35b 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/CommandParser.java @@ -4,9 +4,7 @@ import miniJVM.clz.ClassFile; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; public class CommandParser { @@ -45,26 +43,71 @@ public class CommandParser { public static final String iadd = "60"; public static final String iinc = "84"; - public static final Map operandMap = new HashMap(){{ - put(aload_0, 0); - put(invokespecial, 2); - put(aload_1, 0); - put(putfield, 2); - put(iload_2, 0); - put(voidreturn, 0); - }}; - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { CommandIterator ci = new CommandIterator(codes); List cmds = new ArrayList(); while (ci.hasNext()){ - String command = ci.next2CharAsString().toUpperCase(); - switch (command){ - + String command = ci.next2CharAsString(); + if(command.equalsIgnoreCase(new_object)){ + NewObjectCmd cmd = new NewObjectCmd(clzFile, command); + cmd.setOprand1(ci.next2CharAsInt()); + cmd.setOprand2(ci.next2CharAsInt()); + cmds.add(cmd); + }else if(command.equalsIgnoreCase(invokespecial)){ + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, command); + cmd.setOprand1(ci.next2CharAsInt()); + cmd.setOprand2(ci.next2CharAsInt()); + cmds.add(cmd); + }else if(command.equalsIgnoreCase(invokevirtual)){ + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, command); + cmd.setOprand1(ci.next2CharAsInt()); + cmd.setOprand2(ci.next2CharAsInt()); + cmds.add(cmd); + }else if(command.equalsIgnoreCase(getfield)){ + GetFieldCmd cmd = new GetFieldCmd(clzFile, command); + cmd.setOprand1(ci.next2CharAsInt()); + cmd.setOprand2(ci.next2CharAsInt()); + cmds.add(cmd); + }else if(command.equalsIgnoreCase(getstatic)){ + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, command); + cmd.setOprand1(ci.next2CharAsInt()); + cmd.setOprand2(ci.next2CharAsInt()); + cmds.add(cmd); + }else if(command.equalsIgnoreCase(putfield)){ + PutFieldCmd cmd = new PutFieldCmd(clzFile, command); + cmd.setOprand1(ci.next2CharAsInt()); + cmd.setOprand2(ci.next2CharAsInt()); + cmds.add(cmd); + }else if(command.equalsIgnoreCase(ldc)){ + LdcCmd cmd = new LdcCmd(clzFile, command); + cmd.setOperand(ci.next2CharAsInt()); + cmds.add(cmd); + }else if(command.equalsIgnoreCase(bipush)){ + BiPushCmd cmd = new BiPushCmd(clzFile, command); + cmd.setOperand(ci.next2CharAsInt()); + cmds.add(cmd); + }else if (command.equalsIgnoreCase(dup) || + command.equalsIgnoreCase(aload_0) || + command.equalsIgnoreCase(aload_1) || + command.equalsIgnoreCase(aload_2) || + command.equalsIgnoreCase(iload_1) || + command.equalsIgnoreCase(iload_2) || + command.equalsIgnoreCase(iload_3) || + command.equalsIgnoreCase(fload_3) || + command.equalsIgnoreCase(voidreturn) || + command.equalsIgnoreCase(astore_1)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, command); + cmds.add(cmd); + }else{ + throw new RuntimeException("没有对指令=" + command + "进行处理"); } } - return null; + calculateOffset(cmds); + + ByteCodeCommand[] cmdArr = new ByteCodeCommand[cmds.size()]; + cmds.toArray(cmdArr); + return cmdArr; } private static void calculateOffset(List cmds) { diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java index 94387ed201..b10ead51b5 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/loader/ClassFileParser.java @@ -1,13 +1,16 @@ package miniJVM.loader; +import miniJVM.attr.CodeAttr; +import miniJVM.attr.LineNumberTable; +import miniJVM.attr.LocalVariableTable; +import miniJVM.attr.StackMapTable; import miniJVM.clz.AccessFlag; import miniJVM.clz.ClassFile; import miniJVM.clz.ClassIndex; -import miniJVM.cmd.ByteCodeCommand; -import miniJVM.cmd.CommandParser; import miniJVM.constant.*; import miniJVM.field.Field; +import miniJVM.method.Method; public class ClassFileParser { @@ -27,17 +30,18 @@ public ClassFile parse(byte[] codes) { //2. 常量池 pool = new ConstantPool(); parseConstantPool(iter); - //TODO 3. 访问标记 + //3. 访问标记 parseAccessFlag(iter); - //TODO 4. classIndex superClassIndex + //4. classIndex superClassIndex parseClassIndex(iter); - //TODO 5. 接口,即便没有也要调用,因为字节码里是固定有的 + //5. 接口,即便没有也要调用,因为字节码里是固定有的 parseInterfaces(iter); - //TODO 6. 字段 + //6. 字段 parseFields(iter); - //TODO 7. 方法 + //7. 方法 parseMethods(iter); - + //8. class文件结尾的stackMapTable, 只读取,不处理 + parseStackMapTable(iter); return clzFile; } @@ -67,16 +71,15 @@ private void parseConstantPool(ByteCodeIterator iter) { try { //常量池个数 int cnstSize = iter.nextU2ToInt(); - System.out.println("常量个数:" + (cnstSize - 1)); for (int i = 0; i < cnstSize; i++) { int index = -1; - if(i == 0){ - pool.addConstantInfo(null); - continue; - }else{ - index = iter.nextU1ToInt(); - } + if (i == 0) { + pool.addConstantInfo(null); + continue; + } else { + index = iter.nextU1ToInt(); + } // System.out.println("i -> " + i + ", index -> " + index); if (index == ConstantInfo.CLASS_INFO) { @@ -108,9 +111,9 @@ private void parseConstantPool(ByteCodeIterator iter) { StringInfo stringInfo = new StringInfo(pool); stringInfo.setIndex(iter.nextU2ToInt()); pool.addConstantInfo(stringInfo); - } else if(index == 0){ - pool.addConstantInfo(null); - } else { + } else if (index == 0) { + pool.addConstantInfo(null); + } else { throw new Exception("没有针对tag=" + index + "的数据进行处理"); } } @@ -120,18 +123,16 @@ private void parseConstantPool(ByteCodeIterator iter) { } } - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceCount = iter.nextU2ToInt(); - - System.out.println("interfaceCount:" + interfaceCount); - - // TODO : 如果实现了interface, 这里需要解析 - } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); +// System.out.println("interfaceCount:" + interfaceCount); + // TODO : 如果实现了interface, 这里需要解析 + } - private void parseFields(ByteCodeIterator iter) { + private void parseFields(ByteCodeIterator iter) { int fieldsCount = iter.nextU2ToInt(); - for(int i = 0 ; i < fieldsCount; i++){ + for (int i = 0; i < fieldsCount; i++) { int accessFlag = iter.nextU2ToInt(); int nameIndex = iter.nextU2ToInt(); int descriptorIndex = iter.nextU2ToInt(); @@ -140,31 +141,41 @@ private void parseFields(ByteCodeIterator iter) { Field field = new Field(accessFlag, nameIndex, descriptorIndex, attributeCount, pool); clzFile.addField(field); } - } + } - private void parseMethods(ByteCodeIterator iter) { + private void parseMethods(ByteCodeIterator iter) { int methodCount = iter.nextU2ToInt(); - for(int i = 0; i < methodCount; i++){ + for (int i = 0; i < methodCount; i++) { int accessFlag = iter.nextU2ToInt(); int nameIndex = iter.nextU2ToInt(); int descriptorIndex = iter.nextU2ToInt(); - int attributeCount = iter.nextU2ToInt(); - int attributeCountTemp = attributeCount; - while(attributeCountTemp > 0){ - int attributeNameIndex = iter.nextU2ToInt(); - UTF8Info attributeName = (UTF8Info) pool.getConstantInfo(attributeNameIndex); - if(attributeName.getValue().equalsIgnoreCase("code")){ - int attributeLength = iter.nextU4ToInt(); - int maxStack = iter.nextU2ToInt(); - int maxLocals = iter.nextU2ToInt(); - int codeLength = iter.nextU4ToInt(); - String cmdCodes = iter.nextUxToHexString(codeLength); - ByteCodeCommand[] cmds = CommandParser.parse(clzFile, cmdCodes); + Method method = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); + int attributeCount = iter.nextU2ToInt();//=1 + while(attributeCount > 0){ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + int exceptionTableLength = iter.nextU2ToInt(); + //异常先不处理 + String exceptionTable = iter.nextUxToHexString(exceptionTableLength); + + int subAttributeCount = iter.nextU2ToInt(); + while(subAttributeCount > 0){ + LineNumberTable lineNumberTable = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(lineNumberTable); + subAttributeCount--; + LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(localVariableTable); + subAttributeCount--; } - - attributeCountTemp--; + method.setCodeAttr(codeAttr); + attributeCount--; } + clzFile.addMethod(method); } - } + } + + private void parseStackMapTable(ByteCodeIterator iter){ + int stackMapCount = iter.nextU2ToInt(); + StackMapTable table = StackMapTable.parse(iter); + } } From ec55916fbce1b8c33dff2114bcd34206db80a503 Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Wed, 26 Apr 2017 15:45:48 +0800 Subject: [PATCH 320/552] =?UTF-8?q?=E9=98=9F=E5=88=97=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 队列相关作业 --- .../com/coding/basic/queue/CircleQueue.java | 57 +++++++++++++++++ .../basic/queue/EmptyQueueException.java | 14 +++++ .../basic/queue/FullQueueException.java | 14 +++++ .../src/com/coding/basic/queue/Josephus.java | 32 ++++++++++ .../com/coding/basic/queue/JosephusTest.java | 28 +++++++++ .../src/com/coding/basic/queue/Queue.java | 61 +++++++++++++++++++ .../basic/queue/QueueWithTwoStacks.java | 54 ++++++++++++++++ .../src/me/practise/chapter2.java | 17 ++++++ 8 files changed, 277 insertions(+) create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/Queue.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..eeed686419 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,57 @@ +package com.coding.basic.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + private int maxSize = DEFAULT_SIZE; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public CircleQueue(int maxSize){ + elementData = new Object[maxSize]; + this.maxSize = maxSize; + } + + public boolean isEmpty() { + return rear == front; + + } + + public int size() { + return rear - front; + } + + + + public void enQueue(E data) { + if((rear+1)%maxSize == front){ + throw new FullQueueException(); + } + elementData[rear] = data; + rear = (rear + 1) % maxSize; + } + + public E deQueue() { + if(rear == front){ + throw new EmptyQueueException(); + } + E data = (E)elementData[front]; + elementData[front] = null; + front = (front + 1) % maxSize; + return data; + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java new file mode 100644 index 0000000000..925c9de7ec --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java @@ -0,0 +1,14 @@ +package com.coding.basic.queue; + +public class EmptyQueueException extends RuntimeException { + + private static final long serialVersionUID = 7013504079461713464L; + + public EmptyQueueException() { + super(); + } + + public EmptyQueueException(String message) { + super(message); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java new file mode 100644 index 0000000000..96cc1ab4fb --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java @@ -0,0 +1,14 @@ +package com.coding.basic.queue; + +public class FullQueueException extends RuntimeException { + + private static final long serialVersionUID = 5782713639805661798L; + + public FullQueueException() { + super(); + } + + public FullQueueException(String message) { + super(message); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..8400d503b4 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,32 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + List numbers = new ArrayList<>(); + CircleQueue queue = new CircleQueue<>(n+1); + for(int i=0;i { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..d56e7b97ff --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,54 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return stack1.size() == 0; + } + + + + public int size() { + return stack1.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + E data = stack2.pop(); + while(!stack2.isEmpty()){ + stack1.push(stack2.pop()); + } + return data; + } + + + + } + diff --git a/group23/1028361767/java8-function-coding/src/me/practise/chapter2.java b/group23/1028361767/java8-function-coding/src/me/practise/chapter2.java index b43ac3f6d4..0782af1510 100644 --- a/group23/1028361767/java8-function-coding/src/me/practise/chapter2.java +++ b/group23/1028361767/java8-function-coding/src/me/practise/chapter2.java @@ -2,6 +2,7 @@ import java.awt.event.ActionListener; import java.util.function.BinaryOperator; +import java.util.function.Predicate; public class chapter2 { @@ -23,5 +24,21 @@ public static void main(String[] args) { name = "def"; //ActionListener oneArg1 = event -> System.out.println("actionListener with one argument." + name); // 编译无法通过:方法块中使用的变量必须使用final声明或既成事实的final变量,即变成赋值成功后不能再赋值 + + + Predicate atLeast5 = x -> x > 5; + System.out.println(atLeast5.test(6)); + +// BinaryOperator addE = (x,y) -> x + y;//编译不通过 + BinaryOperator addLongs = (x,y) -> x + y; + + } + + interface IntPred { + boolean test(Integer value); + } + interface A { + boolean check(Predicate predicate); + boolean check(IntPred predicate); } } From c21d3a463bf47be3f66ac0b29795a5911e775b05 Mon Sep 17 00:00:00 2001 From: vegetableDogBai Date: Wed, 26 Apr 2017 16:51:38 +0800 Subject: [PATCH 321/552] =?UTF-8?q?week8=20=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jvm/test/ClassFileloaderTest.java | 2 +- .../week8_datastructure/src/CircleQueue.java | 53 ++++++++++++++++ .../week8_datastructure/src/Josephus.java | 47 ++++++++++++++ .../week8_datastructure/src/JosephusTest.java | 28 +++++++++ .../week8_datastructure/src/Queue.java | 62 +++++++++++++++++++ .../src/QueueWithTwoStacks.java | 60 ++++++++++++++++++ 6 files changed, 251 insertions(+), 1 deletion(-) create mode 100644 group23/563253496/week8_datastructure/src/CircleQueue.java create mode 100644 group23/563253496/week8_datastructure/src/Josephus.java create mode 100644 group23/563253496/week8_datastructure/src/JosephusTest.java create mode 100644 group23/563253496/week8_datastructure/src/Queue.java create mode 100644 group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index 5657310e0d..8f8097325d 100644 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -31,7 +31,7 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "D:\\mygit\\coding2017\\group23\\563253496\\week7_jvm\\out\\production\\week7_jvm"; static String path2 = "C:\temp"; static ClassFile clzFile = null; diff --git a/group23/563253496/week8_datastructure/src/CircleQueue.java b/group23/563253496/week8_datastructure/src/CircleQueue.java new file mode 100644 index 0000000000..f69e5e6c5b --- /dev/null +++ b/group23/563253496/week8_datastructure/src/CircleQueue.java @@ -0,0 +1,53 @@ +/** + * Created by bdl19 on 2017/4/25. + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return this.front == this.rear; + } + + public int size() { + int size = this.rear - this.front; + return size < 0 ? size += DEFAULT_SIZE : size; + + } + + + public void enQueue(E data) { + if (this.isFull()) { + System.out.println("队列已满"); + return; + } + elementData[this.rear] = data; + this.rear = ++this.rear % DEFAULT_SIZE; + } + + + public E deQueue() { + if (this.isEmpty()) { + System.out.println("队列为空"); + return null; + } + E ele; + ele = (E) elementData[this.front]; + this.front = (++this.front) % DEFAULT_SIZE; + return ele; + } + + public boolean isFull() { + if ((this.rear + 1) % DEFAULT_SIZE == this.front) { + return true; + } else return false; + } +} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/Josephus.java b/group23/563253496/week8_datastructure/src/Josephus.java new file mode 100644 index 0000000000..3d1425e125 --- /dev/null +++ b/group23/563253496/week8_datastructure/src/Josephus.java @@ -0,0 +1,47 @@ +/** + * Created by bdl19 on 2017/4/25. + */ + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, + * N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * "[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2) + * + * @author liuxin + */ +public class Josephus { + + public static List execute(int n, int m) { + List result = new ArrayList<>(); + + List list = new LinkedList(); + int interval = m - 1; + + for (int i = 0; i < n; i++) { + list.add(i); + } + int index = 0; + while (list.size() > 0) { + /*for (int i = 0; i < m; i++) { + index = (++index) % list.size(); + + }*/ + index += interval; + index %= list.size(); + result.add(list.get(index)); + list.remove(index); + + } + + + return result; + } + +} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/JosephusTest.java b/group23/563253496/week8_datastructure/src/JosephusTest.java new file mode 100644 index 0000000000..fb38138a32 --- /dev/null +++ b/group23/563253496/week8_datastructure/src/JosephusTest.java @@ -0,0 +1,28 @@ +/** + * Created by bdl19 on 2017/4/25. + */ +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/Queue.java b/group23/563253496/week8_datastructure/src/Queue.java new file mode 100644 index 0000000000..e2f5ce9a41 --- /dev/null +++ b/group23/563253496/week8_datastructure/src/Queue.java @@ -0,0 +1,62 @@ +/** + * Created by bdl19 on 2017/4/25. + */ +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java b/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java new file mode 100644 index 0000000000..c960f09bbb --- /dev/null +++ b/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java @@ -0,0 +1,60 @@ +/** + * Created by bdl19 on 2017/4/25. + */ +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + + return stack1.isEmpty(); + } + + + + public int size() { + return stack1.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + E ele ; + if (stack1.size() == 0) { + throw new RuntimeException("队列为空!"); + } + while (stack1.size() > 1) { + stack2.push(stack1.pop()); + } + ele = stack1.pop(); + while(!stack2.isEmpty()){ + stack1.push(stack2.pop()); + } + + return ele; + } + + + +} \ No newline at end of file From 9c1f2f4113b05519d824253a5b2edeed150a10e0 Mon Sep 17 00:00:00 2001 From: patrickfeng Date: Wed, 26 Apr 2017 17:54:48 +0800 Subject: [PATCH 322/552] =?UTF-8?q?=20jvm=20=E6=89=A7=E8=A1=8C=E5=BC=95?= =?UTF-8?q?=E6=93=8E2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/minijvm/cmd/BiPushCmd.java | 7 +- .../minijvm/cmd/ByteCodeCommand.java | 35 ++++++ .../coding2017/minijvm/cmd/GetFieldCmd.java | 8 +- .../minijvm/cmd/GetStaticFieldCmd.java | 20 ++- .../minijvm/cmd/InvokeSpecialCmd.java | 15 ++- .../minijvm/cmd/InvokeVirtualCmd.java | 36 +++++- .../coding2017/minijvm/cmd/LdcCmd.java | 15 ++- .../coding2017/minijvm/cmd/NewObjectCmd.java | 9 +- .../coding2017/minijvm/cmd/NoOperandCmd.java | 116 +++++++++++++++++- .../coding2017/minijvm/cmd/PutFieldCmd.java | 17 ++- .../minijvm/engine/ExecutorEngine.java | 28 ++++- .../coding2017/minijvm/engine/MethodArea.java | 19 ++- .../coding2017/minijvm/engine/StackFrame.java | 24 +++- .../coding2017/minijvm/method/Method.java | 61 +++++++++ 14 files changed, 386 insertions(+), 24 deletions(-) diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java index bbfccc5785..66f2ac6275 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java @@ -3,6 +3,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.Heap; +import com.github.ipk2015.coding2017.minijvm.engine.JavaObject; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -20,8 +22,9 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub - + int operand = this.getOperand(); + JavaObject newInt = Heap.getInstance().newInt(operand); + frame.getOprandStack().push(newInt); } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java index 7541ecdb88..fb10cd1cfe 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java @@ -20,6 +20,41 @@ public abstract class ByteCodeCommand { ClassFile clzFile; private int offset; + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); static{ diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java index 22051b8339..55679f4223 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java @@ -2,7 +2,9 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.JavaObject; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -19,8 +21,12 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub + FieldRefInfo fieldRefInfo = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRefInfo.getFieldName(); + JavaObject javaObject = frame.getOprandStack().pop(); + JavaObject fieldValue = javaObject.getFieldValue(fieldName); + frame.getOprandStack().push(fieldValue); } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java index 322a88505c..81f7d534c4 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java @@ -2,7 +2,10 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.Heap; +import com.github.ipk2015.coding2017.minijvm.engine.JavaObject; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -20,7 +23,22 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + }else{ + throw new RuntimeException("className:"+className + +",fieldName:"+fieldName + +",fieldType:"+fieldType + +",not included"); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java index 4179d004b6..9a0bfa0376 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java @@ -2,8 +2,11 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.MethodArea; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; +import com.github.ipk2015.coding2017.minijvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -20,8 +23,16 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub - + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + Method method = MethodArea.getInstance().getMethod(methodRefInfo); + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(method); } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java index 63e30d8c4f..0fe36e278e 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java @@ -2,8 +2,12 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.JavaObject; +import com.github.ipk2015.coding2017.minijvm.engine.MethodArea; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; +import com.github.ipk2015.coding2017.minijvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -19,8 +23,36 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub - + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if("java/io/PrintStream".equals(className) && "println".equals(methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + System.err.println("-------------------"+jo.toString()+"----------------"); + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + return; + } + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject javaObject = frame.getOprandStack().peek(); + MethodArea methodArea = MethodArea.getInstance(); + Method m = null; + String currentClassName = javaObject.getClassName(); + while(null != currentClassName){ + ClassFile currentClassFile = methodArea.findClassFile(currentClassName); + m = currentClassFile.getMethod(methodRefInfo.getClassName(), methodRefInfo.getParamAndReturnType()); + if(null != m){ + break; + }else{ + currentClassName = currentClassFile.getSuperClassName(); + } + } + if(null == m){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(m); } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java index 8d76f922d1..76e1d8dc64 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java @@ -5,6 +5,8 @@ import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.constant.StringInfo; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.Heap; +import com.github.ipk2015.coding2017.minijvm.engine.JavaObject; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -30,8 +32,17 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub - + ConstantPool pool = this.getConstantPool(); + ConstantInfo constantInfo = pool.getConstantInfo(this.getOperand()); + if(constantInfo instanceof StringInfo){ + StringInfo stringInfo = (StringInfo)constantInfo; + String value = stringInfo.toString(); + JavaObject javaObject = Heap.getInstance().newString(value); + frame.getOprandStack().push(javaObject); + }else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java index e710414837..168e2b3626 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java @@ -1,8 +1,12 @@ package com.github.ipk2015.coding2017.minijvm.cmd; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.Heap; +import com.github.ipk2015.coding2017.minijvm.engine.JavaObject; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -19,8 +23,9 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub - + ClassInfo classInfo = (ClassInfo)this.getConstantInfo(this.getIndex()); + JavaObject newObject = Heap.getInstance().newObject(classInfo.getClassName()); + frame.getOprandStack().push(newObject); } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java index 0f7e9013a8..0d65211c65 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java @@ -3,6 +3,8 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.Heap; +import com.github.ipk2015.coding2017.minijvm.engine.JavaObject; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -24,7 +26,119 @@ public int getLength(){ @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub +String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java index b4250553cf..30d315d25b 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java @@ -1,8 +1,13 @@ package com.github.ipk2015.coding2017.minijvm.cmd; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; +import com.github.ipk2015.coding2017.minijvm.constant.NameAndTypeInfo; import com.github.ipk2015.coding2017.minijvm.engine.ExecutionResult; +import com.github.ipk2015.coding2017.minijvm.engine.JavaObject; import com.github.ipk2015.coding2017.minijvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -19,8 +24,16 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub - + FieldRefInfo fieldRefInfo = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + ClassInfo classInfo = (ClassInfo)this.getConstantInfo(fieldRefInfo.getClassInfoIndex()); + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRefInfo.getNameAndTypeIndex()); + // for example : name + String fieldName = nameAndTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameAndTypeInfo.getTypeInfo(); + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + objectRef.setFieldValue(fieldName, fieldValue); } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java index 8a22074203..3933323574 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java @@ -1,6 +1,7 @@ package com.github.ipk2015.coding2017.minijvm.engine; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Stack; @@ -17,17 +18,36 @@ public ExecutorEngine() { } public void execute(Method mainMethod){ + StackFrame stackFrame = StackFrame.create(mainMethod); + stack.push(stackFrame); - - + while(!stack.isEmpty()){ + StackFrame frame = stack.peek(); + ExecutionResult executionResult = frame.execute(); + if(executionResult.isPauseAndRunNewFrame()){ + Method nextMethod = executionResult.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame,nextFrame); + stack.push(nextFrame); + } + } } private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + Method nextMethod = nextFrame.getMethod(); + List parameterList = nextMethod.getParameterList(); - - + int paramSize = parameterList.size()+1; + List params = new ArrayList(); + while(paramSize > 0){ + params.add(currentFrame.getOprandStack().pop()); + paramSize--; + } + Collections.reverse(params); + nextFrame.setLocalVariableTable(params); } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java index cfbfd629f8..a204180875 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java @@ -57,14 +57,25 @@ public ClassFile findClassFile(String className){ public Method getMethod(String className, String methodName, String paramAndReturnType){ - - return null; + ClassFile clz = this.findClassFile(className); + Method method = clz.getMethod(methodName, paramAndReturnType); + if(null == method){ + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + return method; } public Method getMethod(MethodRefInfo methodRef){ - - return null; + ClassFile classFile = this.findClassFile(methodRef.getClassName()); + Method method = classFile.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + if(null == method){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + return method; } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/StackFrame.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/StackFrame.java index 123da8e9c1..8b2009a07c 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/StackFrame.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/StackFrame.java @@ -66,7 +66,29 @@ public int getNextCommandIndex(int offset){ } public ExecutionResult execute(){ - return null; + ByteCodeCommand[] cmds = m.getCmds(); + + while(index < cmds.length){ + ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.RUN_NEXT_CMD); + System.out.println(cmds[index].toString()); + cmds[index].execute(this, result); + if(result.isRunNextCmd()){ + index++; + }else if(result.isExitCurrentFrame()){ + return result; + }else if(result.isPauseAndRunNewFrame()){ + index++; + return result; + }else if(result.isJump()){ + index = getNextCommandIndex(result.getNextCmdOffset()); + }else{ + index++; + } + } + ExecutionResult exitResult = new ExecutionResult(); + exitResult.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + return exitResult; } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java index b8a3d7dca2..ff4df81b1c 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java @@ -1,5 +1,8 @@ package com.github.ipk2015.coding2017.minijvm.method; +import java.util.ArrayList; +import java.util.List; + import com.github.ipk2015.coding2017.minijvm.attr.AttributeInfo; import com.github.ipk2015.coding2017.minijvm.attr.CodeAttr; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; @@ -84,4 +87,62 @@ public String toString() { buffer.append(this.codeAttr.toString(pool)); return buffer.toString(); } + private String getParamAndReturnType(){ + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + public List getParameterList(){ + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } } From 417d7ca6e60ac7c2934fbb1eacf8f85d730f66e4 Mon Sep 17 00:00:00 2001 From: gongxun Date: Wed, 26 Apr 2017 18:37:36 +0800 Subject: [PATCH 323/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4.23/queue/QueueWithTwoStacks.java | 30 ++++++++++----- .../4.23/queue/QueueWithTwoStacksTest.java | 37 +++++++++++++++++++ 2 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 group17/785396327/4.23/queue/QueueWithTwoStacksTest.java diff --git a/group17/785396327/4.23/queue/QueueWithTwoStacks.java b/group17/785396327/4.23/queue/QueueWithTwoStacks.java index 7f38a9c20c..995bab9904 100644 --- a/group17/785396327/4.23/queue/QueueWithTwoStacks.java +++ b/group17/785396327/4.23/queue/QueueWithTwoStacks.java @@ -16,27 +16,39 @@ public QueueWithTwoStacks() { } - - public boolean isEmpty() { - return false; + return stack1.size() == 0; } - public int size() { - return -1; + return stack1.size(); } - public void enQueue(E item) { - + Stack temp = new Stack(); + stack1.push(item); + while (!stack2.isEmpty()) + temp.push(stack2.pop()); + temp.push(item); + while (!temp.isEmpty()) + stack2.push(temp.pop()); } public E deQueue() { - return null; + Stack temp = new Stack(); + E ele = stack2.pop(); + while (!stack1.isEmpty()) + temp.push(stack1.pop()); + temp.pop(); + while (!temp.isEmpty()) + stack1.push(temp.pop()); + return ele; } - + @Override + public String toString() { + return stack1.toString() + "\n" + stack2.toString(); + } } diff --git a/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java b/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..e0c90c4b66 --- /dev/null +++ b/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,37 @@ +package queue; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/26. + */ +public class QueueWithTwoStacksTest { + + private QueueWithTwoStacks queue; + + @Before + public void startUp() { + queue = new QueueWithTwoStacks(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + } + + @After + public void tearDown() { + + } + + @Test + public void enQueueTest() { + System.out.println(queue); + } + + @Test + public void deQueueTest() { + queue.deQueue(); + System.out.println(queue); + } +} From f27dcfa242be608a215002031c330f70e1e5ea9c Mon Sep 17 00:00:00 2001 From: luoziyihao Date: Wed, 26 Apr 2017 19:04:35 +0800 Subject: [PATCH 324/552] add home work count --- group17/article/20170416-20170423.md | 56 ++++++++++++++++++++++++++++ group17/count/homework.md | 2 + 2 files changed, 58 insertions(+) create mode 100644 group17/article/20170416-20170423.md diff --git a/group17/article/20170416-20170423.md b/group17/article/20170416-20170423.md new file mode 100644 index 0000000000..3d45ad0516 --- /dev/null +++ b/group17/article/20170416-20170423.md @@ -0,0 +1,56 @@ +# 自由写作 + +## 须知 +--- + +交作业时请在QQ 号后面填上各自的文章链接, 比如: + +51075907 http://m.blog.csdn.net/article/details?id=57083764 + +## 文章 +--- + +1204187480 + +102228177 + +876385982 + +785396327 + +1059107701 + +240094626 + +82427129 + +296910598 + +1264835468 + +516886559 + +1282579502 + +614982500 + +865797761 + +1540186032 + +176653813 + +116665530 + +51075907 + +1158154002 + +345450234 + +919764878 + +1368331120 + +517970312 + diff --git a/group17/count/homework.md b/group17/count/homework.md index 9422c2f12c..23e71c2fbe 100644 --- a/group17/count/homework.md +++ b/group17/count/homework.md @@ -22,3 +22,5 @@ * [20170402-20170409](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170402-20170409.md) * [20170409-20170416](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170409-20170416.md) + + * [20170416-20170423](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170416-20170423.md) From 74f8962a9c1ce09b26ddcc31ff794a5ca5c20ea2 Mon Sep 17 00:00:00 2001 From: learnGithubChen <729245768@qq.com> Date: Wed, 26 Apr 2017 19:23:25 +0800 Subject: [PATCH 325/552] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/coding_170423/jvm/cmd/BiPushCmd.java | 20 +++ .../jvm/cmd/ByteCodeCommand.java | 151 ++++++++++++++++++ .../coding_170423/jvm/cmd/CommandParser.java | 127 +++++++++++++++ .../coding_170423/jvm/cmd/GetFieldCmd.java | 19 +++ .../jvm/cmd/GetStaticFieldCmd.java | 20 +++ .../jvm/cmd/InvokeSpecialCmd.java | 19 +++ .../jvm/cmd/InvokeVirtualCmd.java | 24 +++ .../main/coding_170423/jvm/cmd/LdcCmd.java | 30 ++++ .../coding_170423/jvm/cmd/NewObjectCmd.java | 19 +++ .../coding_170423/jvm/cmd/NoOperandCmd.java | 22 +++ .../coding_170423/jvm/cmd/OneOperandCmd.java | 27 ++++ .../coding_170423/jvm/cmd/PutFieldCmd.java | 19 +++ .../coding_170423/jvm/cmd/TwoOperandCmd.java | 68 ++++++++ 13 files changed, 565 insertions(+) create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/BiPushCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/ByteCodeCommand.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/CommandParser.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/GetFieldCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/LdcCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/NewObjectCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/NoOperandCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/OneOperandCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/PutFieldCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/TwoOperandCmd.java diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/BiPushCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..e267c6a140 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/BiPushCmd.java @@ -0,0 +1,20 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class BiPushCmd extends OneOperandCmd{ + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return this.getOffset()+":"+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/ByteCodeCommand.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..89e6cf40be --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,151 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; +import main.coding_170423.jvm.constant.ConstantInfo; +import main.coding_170423.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by peterchen on 2017/4/26. + */ +public abstract class ByteCodeCommand { + String opCode; + ClassFile clzFile; + private int offset; + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/CommandParser.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..b3f16102e0 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/CommandParser.java @@ -0,0 +1,127 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peterchen on 2017/4/26. + */ +public class CommandParser { + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if (codes == null || codes.length() == 0 || (codes.length() % 2) != 0) { + throw new RuntimeException("the original code is not correct"); + } + + codes = codes.toUpperCase(); + + CommandIterator commandIterator = new CommandIterator(codes); + List byteCodeCommands = new ArrayList<>(); + while (commandIterator.hasNext()) { + String opCode = commandIterator.next2CharAsString(); + switch (opCode) { + case ByteCodeCommand.new_object: + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, opCode); + newObjectCmd.setOprand1(commandIterator.nextCharAsInt()); + newObjectCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(newObjectCmd); + break; + case ByteCodeCommand.invokespecial: + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, opCode); + invokeSpecialCmd.setOprand1(commandIterator.nextCharAsInt()); + invokeSpecialCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(invokeSpecialCmd); + break; + case ByteCodeCommand.invokevirtual: + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, opCode); + invokeVirtualCmd.setOprand1(commandIterator.nextCharAsInt()); + invokeVirtualCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(invokeVirtualCmd); + break; + case ByteCodeCommand.getfield: + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, opCode); + getFieldCmd.setOprand1(commandIterator.nextCharAsInt()); + getFieldCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(getFieldCmd); + break; + case ByteCodeCommand.getstatic: + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, opCode); + getStaticFieldCmd.setOprand1(commandIterator.nextCharAsInt()); + getStaticFieldCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(getStaticFieldCmd); + break; + case ByteCodeCommand.putfield: + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, opCode); + putFieldCmd.setOprand1(commandIterator.nextCharAsInt()); + putFieldCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(putFieldCmd); + break; + case ByteCodeCommand.ldc: + LdcCmd ldcCmd = new LdcCmd(clzFile, opCode); + ldcCmd.setOperand(commandIterator.nextCharAsInt()); + byteCodeCommands.add(ldcCmd); + break; + case ByteCodeCommand.bipush: + BiPushCmd biPushCmd = new BiPushCmd(clzFile, opCode); + biPushCmd.setOperand(commandIterator.nextCharAsInt()); + byteCodeCommands.add(biPushCmd); + break; + case ByteCodeCommand.dup: + case ByteCodeCommand.aload_0: + case ByteCodeCommand.aload_1: + case ByteCodeCommand.aload_2: + case ByteCodeCommand.iload_1: + case ByteCodeCommand.iload_2: + case ByteCodeCommand.iload_3: + case ByteCodeCommand.fload_3: + case ByteCodeCommand.voidreturn: + case ByteCodeCommand.astore_1: + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, opCode); + byteCodeCommands.add(noOperandCmd); + break; + default: + throw new RuntimeException("Sorry,the instruction " + opCode + " " + "has not implemented"); + + } + } + calcuateOffset(byteCodeCommands); + ByteCodeCommand[] result = new ByteCodeCommand[byteCodeCommands.size()]; + byteCodeCommands.toArray(result); + return result; + } + + + private static void calcuateOffset(List cmds) { + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String code) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int nextCharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/GetFieldCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..e1851171b4 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,19 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class GetFieldCmd extends TwoOperandCmd { + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/GetStaticFieldCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e3a05ed1fd --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class GetStaticFieldCmd extends TwoOperandCmd { + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/InvokeSpecialCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..f1ea0979ec --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,19 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class InvokeSpecialCmd extends TwoOperandCmd { + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/InvokeVirtualCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..5012d18559 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,24 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class InvokeVirtualCmd extends TwoOperandCmd { + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } + + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/LdcCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..8642973dbd --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; +import main.coding_170423.jvm.constant.ConstantInfo; +import main.coding_170423.jvm.constant.StringInfo; + +/** + * Created by peterchen on 2017/4/26. + */ +public class LdcCmd extends OneOperandCmd { + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + ConstantInfo info = getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/NewObjectCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..39caa72387 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class NewObjectCmd extends TwoOperandCmd { + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsClassInfo(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/NoOperandCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..18c4df13c4 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,22 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class NoOperandCmd extends ByteCodeCommand { + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString() { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + public int getLength(){ + return 1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/OneOperandCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..c36211d19d --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class OneOperandCmd extends ByteCodeCommand { + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/PutFieldCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..18b0a46be9 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class PutFieldCmd extends TwoOperandCmd { + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/TwoOperandCmd.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..60123a3f52 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,68 @@ +package main.coding_170423.jvm.cmd; + +import main.coding_170423.jvm.clz.ClassFile; +import main.coding_170423.jvm.constant.ClassInfo; +import main.coding_170423.jvm.constant.ConstantInfo; +import main.coding_170423.jvm.constant.FieldRefInfo; +import main.coding_170423.jvm.constant.MethodRefInfo; + +/** + * Created by peterchen on 2017/4/26. + */ +public class TwoOperandCmd extends ByteCodeCommand { + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} From 771c003d3b700759b83deaa1d04693a420232faf Mon Sep 17 00:00:00 2001 From: learnGithubChen <729245768@qq.com> Date: Wed, 26 Apr 2017 19:25:02 +0800 Subject: [PATCH 326/552] =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=B8=B8=E9=87=8F?= =?UTF-8?q?=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jvm/print/ClassFilePrinter.java | 33 +++++++++++++++++ .../jvm/print/ConstantPoolPrinter.java | 35 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/print/ClassFilePrinter.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170423/jvm/print/ConstantPoolPrinter.java diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/print/ClassFilePrinter.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..f97b535d71 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/print/ClassFilePrinter.java @@ -0,0 +1,33 @@ +package main.coding_170423.jvm.print; + +import main.coding_170423.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + } + + public static void main(String[] args) { + + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170423/jvm/print/ConstantPoolPrinter.java b/group11/729245768/DataStructure/src/main/coding_170423/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..fe8d5bb6e5 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170423/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,35 @@ +package main.coding_170423.jvm.print; + +import main.coding_170423.jvm.constant.*; + +/** + * Created by peterchen on 2017/4/26. + */ +public class ConstantPoolPrinter { + private ConstantPool pool; + + public ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + for (int i = 1; i < pool.getSizes(); i++) { + if (pool.getConstantInfo(i) instanceof ClassInfo) { + System.out.println("#"+i+" = Class "+"#"+((ClassInfo) pool.getConstantInfo(i)).getUtf8Index()); + } else if (pool.getConstantInfo(i) instanceof UTF8Info) { + System.out.println("#"+i+" = Utf8 "+"#"+((UTF8Info) pool.getConstantInfo(i)).getValue()); + } else if (pool.getConstantInfo(i) instanceof StringInfo) { + System.out.println("#"+i+" = String "+"#"+((StringInfo) pool.getConstantInfo(i)).getIndex()); + } else if (pool.getConstantInfo(i) instanceof MethodRefInfo) { + System.out.println("#"+i+" = Methodref "+"#"+((MethodRefInfo) pool.getConstantInfo(i)).getClassInfoIndex()+".#"+((MethodRefInfo) pool.getConstantInfo(i)).getNameAndTypeIndex()); + } else if (pool.getConstantInfo(i) instanceof FieldRefInfo) { + System.out.println("#"+i+" = Fieldref "+"#"+((FieldRefInfo) pool.getConstantInfo(i)).getClassInfoIndex()+".#"+((FieldRefInfo) pool.getConstantInfo(i)).getNameAndTypeIndex()); + } else if (pool.getConstantInfo(i) instanceof NameAndTypeInfo) { + System.out.println("#"+i+" = NameAndType "+"#"+((NameAndTypeInfo) pool.getConstantInfo(i)).getIndexA()+":#"+((NameAndTypeInfo) pool.getConstantInfo(i)).getIndexB()); + } else { + throw new RuntimeException("the constant has not implemented"); + } + } + + } +} From 2c0eaa6eb0d604f6c3dfc7258dbec7b5a7ab67dd Mon Sep 17 00:00:00 2001 From: Patrick Date: Wed, 26 Apr 2017 23:39:27 +0800 Subject: [PATCH 327/552] =?UTF-8?q?jvm=E5=BC=95=E6=93=8E=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/minijvm/clz/ClassFile.java | 1 + .../minijvm/cmd/InvokeVirtualCmd.java | 2 +- .../minijvm/engine/ExecutorEngine.java | 2 + .../coding2017/minijvm/engine/MethodArea.java | 3 +- .../minijvm/loader/ClassFileLoader.java | 6 +-- .../minijvm/loader/ClassFileParser.java | 2 +- .../minijvm/test/ClassFileloaderTest.java | 11 ++--- .../coding2017/minijvm/test/MiniJVMTest.java | 43 +++++++++++++++++++ 8 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/MiniJVMTest.java diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/clz/ClassFile.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/clz/ClassFile.java index 3a267144af..861e2417ea 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/clz/ClassFile.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/clz/ClassFile.java @@ -93,6 +93,7 @@ public String getSuperClassName(){ public Method getMethod(String methodName, String paramAndReturnType){ List list = getMethods(); for(Method m : list){ + String name = ((UTF8Info)pool.getConstantInfo(m.getNameIndex())).getValue(); String desc = ((UTF8Info)pool.getConstantInfo(m.getDescriptorIndex())).getValue(); if(name.equalsIgnoreCase(methodName) && desc.equalsIgnoreCase(paramAndReturnType)){ diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java index 0fe36e278e..f4aa2b403c 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java @@ -41,7 +41,7 @@ public void execute(StackFrame frame, ExecutionResult result) { String currentClassName = javaObject.getClassName(); while(null != currentClassName){ ClassFile currentClassFile = methodArea.findClassFile(currentClassName); - m = currentClassFile.getMethod(methodRefInfo.getClassName(), methodRefInfo.getParamAndReturnType()); + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), methodRefInfo.getParamAndReturnType()); if(null != m){ break; }else{ diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java index 3933323574..6906922ee4 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/ExecutorEngine.java @@ -30,6 +30,8 @@ public void execute(Method mainMethod){ nextFrame.setCallerFrame(frame); setupFunctionCallParams(frame,nextFrame); stack.push(nextFrame); + }else{ + stack.pop(); } } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java index a204180875..a4041c88bd 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/engine/MethodArea.java @@ -1,5 +1,6 @@ package com.github.ipk2015.coding2017.minijvm.engine; +import java.io.File; import java.util.HashMap; import java.util.Map; @@ -42,7 +43,7 @@ public Method getMainMethod(String className){ public ClassFile findClassFile(String className){ - + className = className.replace('.', File.separatorChar); if(map.get(className) != null){ return map.get(className); } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/loader/ClassFileLoader.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/loader/ClassFileLoader.java index 2f854174dd..0f6e9ed144 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/loader/ClassFileLoader.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/loader/ClassFileLoader.java @@ -28,12 +28,10 @@ public class ClassFileLoader { 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){ + if(codes != null && codes.length>0){ return codes; } } @@ -53,7 +51,7 @@ private byte[] loadClassFile(String clzFileName) { return IOUtils.toByteArray(new FileInputStream(f)); } catch (IOException e) { - e.printStackTrace(); +// e.printStackTrace(); return null; } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/loader/ClassFileParser.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/loader/ClassFileParser.java index b12e564b88..1c77ba1bfe 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/loader/ClassFileParser.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/loader/ClassFileParser.java @@ -164,7 +164,7 @@ private void meetUTF8Info(ConstantPool pool,ByteCodeIterator iter){ private void parseInterfaces(ByteCodeIterator iter) { int interfaceCount = iter.nextUNToInt(2); - System.out.println("interfaceCount:" + interfaceCount); +// System.out.println("interfaceCount:" + interfaceCount); // TODO : 如果实现了interface, 这里需要解析 } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java index 213046188c..a39c797c26 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java @@ -47,7 +47,7 @@ public class ClassFileloaderTest { // String className = "com.coderising.jvm.test.EmployeeV1"; String className = "EmployeeV1";//老师的class文件单独放在这里,只有类名 - clzFile = loader.loadClass(className); + clzFile = loader.loadClass(FULL_QUALIFIED_CLASS_NAME); clzFile.print(); } @@ -79,9 +79,7 @@ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path3); - String className = "EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); + byte[] byteCodes = loader.readBinaryCode(FULL_QUALIFIED_CLASS_NAME); // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 Assert.assertEquals(1056, byteCodes.length); @@ -93,8 +91,7 @@ public void testClassFileLength() { public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path3); - String className = "EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); + byte[] byteCodes = loader.readBinaryCode(FULL_QUALIFIED_CLASS_NAME); byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; @@ -137,7 +134,7 @@ public void testConstantPool(){ ConstantPool pool = clzFile.getConstantPool(); - System.out.println(""+pool.getSize()); + System.out.println("pool size:"+pool.getSize()); Assert.assertEquals(53, pool.getSize()); { diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/MiniJVMTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..16019f78ce --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/MiniJVMTest.java @@ -0,0 +1,43 @@ +package com.github.ipk2015.coding2017.minijvm.test; + +import static org.junit.Assert.*; + +import java.io.IOException; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.github.ipk2015.coding2017.minijvm.engine.MiniJVM; + +public class MiniJVMTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + MiniJVM jvm = new MiniJVM(); + String[] classPaths = new String[3]; + classPaths[0] = ClassFileloaderTest.path1; + classPaths[1] = ClassFileloaderTest.path2; + classPaths[2] = ClassFileloaderTest.path3; + String className = "com.coderising.jvm.test.EmployeeV1"; + try { + jvm.run(classPaths, className); + Assert.assertEquals(0,0); + } catch (IOException e) { + // TODO Auto-generated catch block + + e.printStackTrace(); + Assert.assertEquals(0,1); + } + } + +} From 9d5690bc7114821e84a2665d42adcda3d6035968 Mon Sep 17 00:00:00 2001 From: luoziyihao Date: Wed, 26 Apr 2017 23:41:59 +0800 Subject: [PATCH 328/552] com --- group17/1204187480/note/todo/homework.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 group17/1204187480/note/todo/homework.md diff --git a/group17/1204187480/note/todo/homework.md b/group17/1204187480/note/todo/homework.md new file mode 100644 index 0000000000..5f111a9ea6 --- /dev/null +++ b/group17/1204187480/note/todo/homework.md @@ -0,0 +1,8 @@ +# 0326 操作系统中的lru算法 + +ClassFileLoader + +LRUPageFrame + +深入理解java虚拟机 第6章 + From 951410b9a19188c2334eed7b76e93b3e9900ff46 Mon Sep 17 00:00:00 2001 From: luoziyihao Date: Thu, 27 Apr 2017 00:28:29 +0800 Subject: [PATCH 329/552] refactor --- .../1204187480/code/homework/basic/pom.xml | 12 - .../litestruts/{action => }/LoginAction.java | 2 +- .../coderising/src/main/resources/struts.xml | 2 +- .../main/java/com/coding/basic/ArrayList.java | 216 +++++++++--------- .../java/com/coding/basic/BinaryTreeNode.java | 64 +++--- .../main/java/com/coding/basic/Iterator.java | 14 +- .../java/com/coding/basic/LinkedList.java | 0 .../src/main/java/com/coding/basic/List.java | 20 +- .../src/main/java/com/coding/basic/Queue.java | 48 ++-- .../src/main/java/com/coding/basic/Stack.java | 60 ++--- .../test/java/com/coding/api/ArraysTest.java | 44 ++-- .../test/java/com/coding/api/SystemTest.java | 48 ++-- .../java/com/coding/basic/ArrayListTest.java | 68 +++--- .../java/com/coding/basic/LinkedListTest.java | 23 +- group17/1204187480/code/homework/pom.xml | 2 +- 15 files changed, 310 insertions(+), 313 deletions(-) delete mode 100644 group17/1204187480/code/homework/basic/pom.xml rename group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/{action => }/LoginAction.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/ArrayList.java (96%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/BinaryTreeNode.java (94%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/Iterator.java (93%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/LinkedList.java (100%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/List.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/Queue.java (93%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/Stack.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/test/java/com/coding/api/ArraysTest.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/test/java/com/coding/api/SystemTest.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/test/java/com/coding/basic/ArrayListTest.java (94%) rename group17/1204187480/code/homework/{basic => coding}/src/test/java/com/coding/basic/LinkedListTest.java (97%) diff --git a/group17/1204187480/code/homework/basic/pom.xml b/group17/1204187480/code/homework/basic/pom.xml deleted file mode 100644 index 17b2dea49e..0000000000 --- a/group17/1204187480/code/homework/basic/pom.xml +++ /dev/null @@ -1,12 +0,0 @@ - - 4.0.0 - basic - - com.coding - parent - 1.0-SNAPSHOT - ../parent/pom.xml - - - \ No newline at end of file diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java similarity index 95% rename from group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java rename to group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java index 85ae4dc47c..dcdbe226ed 100644 --- a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java @@ -1,4 +1,4 @@ -package com.coderising.litestruts.action; +package com.coderising.litestruts; /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 diff --git a/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml index c7ee86e436..876156eb4d 100644 --- a/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml +++ b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml @@ -1,6 +1,6 @@ - + /jsp/homepage.jsp /jsp/showLogin.jsp diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/ArrayList.java similarity index 96% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/ArrayList.java index d09d63c2fa..6ddf8cef58 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/ArrayList.java @@ -1,108 +1,108 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - private Iterator iterator = new ArrayListIterator(); - - private int length() { - return elementData.length; - } - - private static final int ENLARGE_LENGTH = 100; - - private Object[] enlarge(Object[] origin) { - return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH); - } - - private void enLargeElementData() { - if (size == length()) { - elementData = enlarge(elementData); - } - } - - public void add(Object o) { - enLargeElementData(); - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - checkForAdd(index); - enLargeElementData(); - // 备份 index 处及后面的数据 - Object[] elementsBehindIndex = backBehindElements(elementData, index); - // 给index处 设值 - elementData[index] = o; - // 追加 备份的数据 - appendElement(elementData, index, elementsBehindIndex); - size++; - } - - private void appendElement(Object[] origin, int pos, Object[] append) { - System.arraycopy(append, 0, origin, pos, append.length); - } - - private Object[] backBehindElements(Object[] elementData, int index) { - int backSize = size - index; - Object[] back = new Object[backSize]; - System.arraycopy(elementData, index, back, 0, backSize); - return back; - } - - public Object get(int index) { - checkIndex(index); - return elementData[index]; - } - - private void checkIndex(int index) { - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - private void checkForAdd(int index) { - if (index < 0 || index > size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - public Object remove(int index) { - checkIndex(index); - Object[] back = backBehindElements(elementData, index + 1); - System.arraycopy(back, 0, elementData, index, back.length); - Object ret = elementData[index]; - elementData[index] = null; - size--; - return ret; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return iterator; - } - - private class ArrayListIterator implements Iterator { - - int next = 0; - - @Override - public boolean hasNext() { - return next < size; - } - - @Override - public Object next() { - return elementData[next++]; - } - } - -} +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private Iterator iterator = new ArrayListIterator(); + + private int length() { + return elementData.length; + } + + private static final int ENLARGE_LENGTH = 100; + + private Object[] enlarge(Object[] origin) { + return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH); + } + + private void enLargeElementData() { + if (size == length()) { + elementData = enlarge(elementData); + } + } + + public void add(Object o) { + enLargeElementData(); + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + checkForAdd(index); + enLargeElementData(); + // 备份 index 处及后面的数据 + Object[] elementsBehindIndex = backBehindElements(elementData, index); + // 给index处 设值 + elementData[index] = o; + // 追加 备份的数据 + appendElement(elementData, index, elementsBehindIndex); + size++; + } + + private void appendElement(Object[] origin, int pos, Object[] append) { + System.arraycopy(append, 0, origin, pos, append.length); + } + + private Object[] backBehindElements(Object[] elementData, int index) { + int backSize = size - index; + Object[] back = new Object[backSize]; + System.arraycopy(elementData, index, back, 0, backSize); + return back; + } + + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + private void checkForAdd(int index) { + if (index < 0 || index > size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + public Object remove(int index) { + checkIndex(index); + Object[] back = backBehindElements(elementData, index + 1); + System.arraycopy(back, 0, elementData, index, back.length); + Object ret = elementData[index]; + elementData[index] = null; + size--; + return ret; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return iterator; + } + + private class ArrayListIterator implements Iterator { + + int next = 0; + + @Override + public boolean hasNext() { + return next < size; + } + + @Override + public Object next() { + return elementData[next++]; + } + } + +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java similarity index 94% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java index 266eff3d56..d7ac820192 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -1,32 +1,32 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java similarity index 93% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java index dbe8b9afb2..06ef6311b2 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java @@ -1,7 +1,7 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/LinkedList.java similarity index 100% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/LinkedList.java diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java similarity index 95% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java index 0a09990083..ef939ae2cc 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java @@ -1,10 +1,10 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - public Iterator iterator(); -} +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java similarity index 93% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java index 10560f969e..0f6caaec6f 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java @@ -1,24 +1,24 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class Queue { - - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return elementData.remove(0); - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return elementData.size(); - } -} +package com.coding.basic; + +import java.util.Arrays; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.remove(0); + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java similarity index 95% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java index 998ddf9768..7d91c326e0 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java @@ -1,30 +1,30 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (isEmpty()) { - throw new IllegalStateException("the stack is empty"); - } - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - if (isEmpty()) { - throw new IllegalStateException("the stack is empty"); - } - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) { + throw new IllegalStateException("the stack is empty"); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if (isEmpty()) { + throw new IllegalStateException("the stack is empty"); + } + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java similarity index 95% rename from group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java rename to group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java index 6c96193d82..eb41a7e262 100644 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java @@ -1,22 +1,22 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArraysTest { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - - @Test - public void testCopyOf(){ - Object[] a = new Object[]{1, 2, 3, 4}; - Object[] b = Arrays.copyOf(a, 10); - logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b)); - } -} +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArraysTest { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Test + public void testCopyOf(){ + Object[] a = new Object[]{1, 2, 3, 4}; + Object[] b = Arrays.copyOf(a, 10); + logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b)); + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java similarity index 95% rename from group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java rename to group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java index 6a23cb125e..efc4022378 100644 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java @@ -1,24 +1,24 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class SystemTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - public void testArrayCopy() { - int[] a = new int[]{1, 2, 3, 4, 5, 6, 7}; - int[] b = new int[]{11, 22, 33, 44, 55, 66, 77}; - System.arraycopy(a, 2, b, 4, 3); - logger.info("b={}", Arrays.toString(b)); - - } -} +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class SystemTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Test + public void testArrayCopy() { + int[] a = new int[]{1, 2, 3, 4, 5, 6, 7}; + int[] b = new int[]{11, 22, 33, 44, 55, 66, 77}; + System.arraycopy(a, 2, b, 4, 3); + logger.info("b={}", Arrays.toString(b)); + + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java similarity index 94% rename from group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java rename to group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java index 656ff54c06..9241fe72da 100644 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java @@ -1,35 +1,35 @@ -package com.coding.basic; - -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArrayListTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - - private List list = new ArrayList(); - - @Before - public void before() { - - } - - @Test - public void add() throws Exception { - list.add(1); - } - - @Test - public void get() throws Exception { - add(); - logger.info("{}", list.get(0)); - } - +package com.coding.basic; + +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArrayListTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + private List list = new ArrayList(); + + @Before + public void before() { + + } + + @Test + public void add() throws Exception { + list.add(1); + } + + @Test + public void get() throws Exception { + add(); + logger.info("{}", list.get(0)); + } + } \ No newline at end of file diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java similarity index 97% rename from group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java rename to group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java index 0424c2945e..e2007f6a2a 100644 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java @@ -61,18 +61,21 @@ public void removeFirstHalf() throws Exception { linkedList.removeFirstHalf(); Assert.assertEquals("[]", linkedList.toString()); } + @Test public void removeFirstHalf1() throws Exception { LinkedList linkedList = createAndFillLinkedList(1); linkedList.removeFirstHalf(); Assert.assertEquals("[1]", linkedList.toString()); } + @Test public void removeFirstHalf2() throws Exception { LinkedList linkedList = createAndFillLinkedList(2); linkedList.removeFirstHalf(); Assert.assertEquals("[2]", linkedList.toString()); } + @Test public void removeFirstHalf3() throws Exception { LinkedList linkedList = createAndFillLinkedList(3); @@ -102,37 +105,43 @@ public void remove1() throws Exception { list.remove(0, 0); Assert.assertEquals("[1,2,3,4]", list.toString()); } - @Test + + @Test public void remove2() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(0, 1); Assert.assertEquals("[2,3,4]", list.toString()); } - @Test + + @Test public void remove3() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 0); Assert.assertEquals("[1,2,3,4]", list.toString()); } - @Test + + @Test public void remove4() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 1); Assert.assertEquals("[1,3,4]", list.toString()); } -@Test + + @Test public void remove5() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 3); Assert.assertEquals("[1]", list.toString()); } -@Test + + @Test public void remove6() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 4); Assert.assertEquals("[1]", list.toString()); } -@Test + + @Test public void remove7() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 5); @@ -141,7 +150,7 @@ public void remove7() throws Exception { @Test public void getElements() throws Exception { - LinkedList listA= createAndFillLinkedList(0,8); + LinkedList listA = createAndFillLinkedList(0, 8); LinkedList listB = createAndFillLinkedList(4, 4); Assert.assertEquals("[4,5,6,7]", Arrays.toString(listA.getElements(listB))); diff --git a/group17/1204187480/code/homework/pom.xml b/group17/1204187480/code/homework/pom.xml index c8b94c2bc2..73e8c4160f 100644 --- a/group17/1204187480/code/homework/pom.xml +++ b/group17/1204187480/code/homework/pom.xml @@ -8,7 +8,7 @@ pom parent - basic + coding coderising From 398363a1198beb80872624e487a0e8e5d4d72647 Mon Sep 17 00:00:00 2001 From: luoziyihao Date: Thu, 27 Apr 2017 09:47:19 +0800 Subject: [PATCH 330/552] add homework 0326 --- .../jvm/loader/ClassFileLoader.java | 19 + .../jvm/test/ClassFileloaderTest.java | 355 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++ .../src/main/java/com/coding/basic/Queue.java | 2 +- .../src/main/java/com/coding/basic/Stack.java | 2 + .../coding/basic/{ => array}/ArrayList.java | 5 +- .../com/coding/basic}/array/ArrayUtil.java | 2 +- .../coding/basic/linklist/LRUPageFrame.java | 57 +++ .../basic/linklist/LRUPageFrameTest.java | 34 ++ .../basic/{ => linklist}/LinkedList.java | 5 +- .../java/com/coding/basic/ArrayListTest.java | 1 + .../java/com/coding/basic/LinkedListTest.java | 1 + 12 files changed, 507 insertions(+), 4 deletions(-) create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/EmployeeV1.java rename group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/{ => array}/ArrayList.java (96%) rename group17/1204187480/code/homework/{coderising/src/main/java/com/coderising => coding/src/main/java/com/coding/basic}/array/ArrayUtil.java (99%) create mode 100644 group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java rename group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/{ => linklist}/LinkedList.java (98%) diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..cb3c00fd9f --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.loader; + +/** + * Created by luoziyihao on 4/27/17. + */ +public class ClassFileLoader { + public void addClassPath(String path) { + + } + + + public String getClassPath() { + return null; + } + + public byte[] readBinaryCode(String className) { + return new byte[0]; + } +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..b2dceda3e5 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,355 @@ +package com.coderising.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +//import com.coderising.jvm.clz.ClassFile; +//import com.coderising.jvm.clz.ClassIndex; +//import com.coderising.jvm.cmd.BiPushCmd; +//import com.coderising.jvm.cmd.ByteCodeCommand; +//import com.coderising.jvm.cmd.OneOperandCmd; +//import com.coderising.jvm.cmd.TwoOperandCmd; +//import com.coderising.jvm.constant.ClassInfo; +//import com.coderising.jvm.constant.ConstantPool; +//import com.coderising.jvm.constant.MethodRefInfo; +//import com.coderising.jvm.constant.NameAndTypeInfo; +//import com.coderising.jvm.constant.UTF8Info; +//import com.coderising.jvm.field.Field; +import com.coderising.jvm.loader.ClassFileLoader; +//import com.coderising.jvm.method.Method; + + + + + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; + +// static ClassFile clzFile = null; +// static { +// ClassFileLoader loader = new ClassFileLoader(); +// loader.addClassPath(path1); +// String className = "com.coderising.jvm.test.EmployeeV1"; +// +// clzFile = loader.loadClass(className); +// +// } +// + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + 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()); +// } +// +// /** +// * 下面是第三次JVM课应实现的测试用例 +// */ +// @Test +// public void testReadFields(){ +// +// List fields = clzFile.getFields(); +// Assert.assertEquals(2, fields.size()); +// { +// Field f = fields.get(0); +// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); +// } +// { +// Field f = fields.get(1); +// Assert.assertEquals("age:I", f.toString()); +// } +// } +// @Test +// public void testMethods(){ +// +// List methods = clzFile.getMethods(); +// ConstantPool pool = clzFile.getConstantPool(); +// +// { +// Method m = methods.get(0); +// assertMethodEquals(pool,m, +// "", +// "(Ljava/lang/String;I)V", +// "2ab7000c2a2bb5000f2a1cb50011b1"); +// +// } +// { +// Method m = methods.get(1); +// assertMethodEquals(pool,m, +// "setName", +// "(Ljava/lang/String;)V", +// "2a2bb5000fb1"); +// +// } +// { +// Method m = methods.get(2); +// assertMethodEquals(pool,m, +// "setAge", +// "(I)V", +// "2a1bb50011b1"); +// } +// { +// Method m = methods.get(3); +// assertMethodEquals(pool,m, +// "sayHello", +// "()V", +// "b2001c1222b60024b1"); +// +// } +// { +// Method m = methods.get(4); +// assertMethodEquals(pool,m, +// "main", +// "([Ljava/lang/String;)V", +// "bb000159122b101db7002d4c2bb6002fb1"); +// } +// } +// +// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ +// String methodName = pool.getUTF8String(m.getNameIndex()); +// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); +// String code = m.getCodeAttr().getCode(); +// Assert.assertEquals(expectedName, methodName); +// Assert.assertEquals(expectedDesc, methodDesc); +// Assert.assertEquals(expectedCode, code); +// } +// +// @Test +// public void testByteCodeCommand(){ +// { +// Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); +// ByteCodeCommand [] cmds = initMethod.getCmds(); +// +// assertOpCodeEquals("0: aload_0", cmds[0]); +// assertOpCodeEquals("1: invokespecial #12", cmds[1]); +// assertOpCodeEquals("4: aload_0", cmds[2]); +// assertOpCodeEquals("5: aload_1", cmds[3]); +// assertOpCodeEquals("6: putfield #15", cmds[4]); +// assertOpCodeEquals("9: aload_0", cmds[5]); +// assertOpCodeEquals("10: iload_2", cmds[6]); +// assertOpCodeEquals("11: putfield #17", cmds[7]); +// assertOpCodeEquals("14: return", cmds[8]); +// } +// +// { +// Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); +// ByteCodeCommand [] cmds = setNameMethod.getCmds(); +// +// assertOpCodeEquals("0: aload_0", cmds[0]); +// assertOpCodeEquals("1: aload_1", cmds[1]); +// assertOpCodeEquals("2: putfield #15", cmds[2]); +// assertOpCodeEquals("5: return", cmds[3]); +// +// } +// +// { +// Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); +// ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); +// +// assertOpCodeEquals("0: getstatic #28", cmds[0]); +// assertOpCodeEquals("3: ldc #34", cmds[1]); +// assertOpCodeEquals("5: invokevirtual #36", cmds[2]); +// assertOpCodeEquals("8: return", cmds[3]); +// +// } +// +// { +// Method mainMethod = this.clzFile.getMainMethod(); +// +// ByteCodeCommand [] cmds = mainMethod.getCmds(); +// +// assertOpCodeEquals("0: new #1", cmds[0]); +// assertOpCodeEquals("3: dup", cmds[1]); +// assertOpCodeEquals("4: ldc #43", cmds[2]); +// assertOpCodeEquals("6: bipush 29", cmds[3]); +// assertOpCodeEquals("8: invokespecial #45", cmds[4]); +// assertOpCodeEquals("11: astore_1", cmds[5]); +// assertOpCodeEquals("12: aload_1", cmds[6]); +// assertOpCodeEquals("13: invokevirtual #47", cmds[7]); +// assertOpCodeEquals("16: return", cmds[8]); +// } +// +// } +// +// private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ +// +// String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); +// +// if(cmd instanceof OneOperandCmd){ +// if(cmd instanceof BiPushCmd){ +// acctual += " " + ((OneOperandCmd)cmd).getOperand(); +// } else{ +// acctual += " #" + ((OneOperandCmd)cmd).getOperand(); +// } +// } +// if(cmd instanceof TwoOperandCmd){ +// acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); +// } +// Assert.assertEquals(expected, acctual); +// } + +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/EmployeeV1.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java index 0f6caaec6f..e333496198 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java @@ -1,6 +1,6 @@ package com.coding.basic; -import java.util.Arrays; +import com.coding.basic.linklist.LinkedList; public class Queue { diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java index 7d91c326e0..7336dccfe9 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java @@ -1,5 +1,7 @@ package com.coding.basic; +import com.coding.basic.array.ArrayList; + public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/ArrayList.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java similarity index 96% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/ArrayList.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java index 6ddf8cef58..cbe1f87a05 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/ArrayList.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java @@ -1,4 +1,7 @@ -package com.coding.basic; +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; import java.util.Arrays; diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java similarity index 99% rename from group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java index 9aa6404d2a..42ec6efe57 100644 --- a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java @@ -1,4 +1,4 @@ -package com.coderising.array; +package com.coding.basic.array; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..994a241a3d --- /dev/null +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,57 @@ +package com.coding.basic.linklist; + + +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) { + + + } + + + 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/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/LinkedList.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java similarity index 98% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/LinkedList.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java index c0cce5af0a..d9c4ee3c7b 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/LinkedList.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java @@ -1,4 +1,7 @@ -package com.coding.basic; +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; public class LinkedList implements List { diff --git a/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java index 9241fe72da..fba6895d09 100644 --- a/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java @@ -1,5 +1,6 @@ package com.coding.basic; +import com.coding.basic.array.ArrayList; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; diff --git a/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java index e2007f6a2a..549553e696 100644 --- a/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java @@ -1,5 +1,6 @@ package com.coding.basic; +import com.coding.basic.linklist.LinkedList; import org.junit.Assert; import org.junit.Test; From 76b38962d8aa58d561e7fdb0378cc01f6c5cc834 Mon Sep 17 00:00:00 2001 From: luoziyihao Date: Thu, 27 Apr 2017 10:07:20 +0800 Subject: [PATCH 331/552] add homework 0326-1 --- .../jvm/loader/ClassFileLoader.java | 28 +++- .../1204187480/code/homework/parent/pom.xml | 150 +++++++++++++----- 2 files changed, 139 insertions(+), 39 deletions(-) diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java index cb3c00fd9f..a76de06aa1 100644 --- a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -1,16 +1,42 @@ package com.coderising.jvm.loader; +import org.apache.commons.lang3.StringUtils; + +import java.util.HashSet; +import java.util.Set; + /** * Created by luoziyihao on 4/27/17. */ public class ClassFileLoader { + + private Set clzPaths; + public void addClassPath(String path) { + if (clzPaths == null) { + clzPaths = new HashSet<>(5); + } + if (StringUtils.isBlank(path)) { + return; + } + clzPaths.add(path); } + private static final String SPLIT = ";"; + public String getClassPath() { - return null; + StringBuilder classPath = new StringBuilder(); + + for (String e : clzPaths) { + classPath.append(e) + .append(SPLIT); + } + if (classPath.length() > 1) { + classPath.deleteCharAt(classPath.length() - 1); + } + return classPath.toString(); } public byte[] readBinaryCode(String className) { diff --git a/group17/1204187480/code/homework/parent/pom.xml b/group17/1204187480/code/homework/parent/pom.xml index ace9bf9cc5..4b82387454 100644 --- a/group17/1204187480/code/homework/parent/pom.xml +++ b/group17/1204187480/code/homework/parent/pom.xml @@ -8,18 +8,66 @@ 1.0-SNAPSHOT https://github.com/luoziyihao/coding2017 + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot + + true + + + + + - UTF-8 UTF-8 UTF-8 - 1.8 + 1.8 + UTF-8 1.8 1.8 3.0 + 1.1.7 1.1.7 1.2 1.2.17 4.12 + 3.4 + 4.1 + 2.5 + 1.9.2 + 19.0 + 1.1.6 + 1.16.10 + 1.2.22 + 0.2.0 + 2.9.4 + @@ -41,6 +89,59 @@ ${log4j.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + commons-io + commons-io + ${commons-io.version} + + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + + + joda-time + joda-time + ${joda-time.version} + + + io.reactivex + rxjava + ${rxjava.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + com.shekhargulati + strman + ${strman.version} + + + junit @@ -49,33 +150,6 @@ - - - alimaven - aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - true - - - - - - alimaven - aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - true - - - - ${project.artifactId} @@ -92,13 +166,13 @@ - - - - org.apache.maven.plugins - maven-surefire-report-plugin - 2.19.1 - - - + + + + + + + + + \ No newline at end of file From 31d547da66afb0458704beb6b00b7111cb2dd4eb Mon Sep 17 00:00:00 2001 From: Jiandan1357 Date: Thu, 27 Apr 2017 10:35:45 +0800 Subject: [PATCH 332/552] 5week homew --- group23/601689050/.gitattributes | 17 +++ .../4LRU&JVM/JVM/ClassFileLoader.java | 63 --------- .../4LRU&JVM/JVM/ClassFileloaderTest.java | 88 ------------ .../JVM/loader/ClassFileLoader.java | 65 +++++++++ .../JVM/test/loader/ClassFileLoaderTest.java | 86 +++++++++++ .../JVM/test/loader}/EmployeeV1.java | 2 +- .../LRU/Iterator.java | 0 .../LRU/LRUPageFrame.java | 0 .../LRU/LRUPageFrameTest.java | 0 .../LRU/LinkedList.java | 0 .../{4LRU&JVM => 4weekLRU&JVM}/LRU/List.java | 0 group23/601689050/5weekStack/stack/Stack.java | 70 +++++++++ .../601689050/5weekStack/stack/StackUtil.java | 133 ++++++++++++++++++ .../5weekStack/test/StackUtilTest.java | 69 +++++++++ 14 files changed, 441 insertions(+), 152 deletions(-) create mode 100644 group23/601689050/.gitattributes delete mode 100644 group23/601689050/4LRU&JVM/JVM/ClassFileLoader.java delete mode 100644 group23/601689050/4LRU&JVM/JVM/ClassFileloaderTest.java create mode 100644 group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java create mode 100644 group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java rename group23/601689050/{4LRU&JVM/JVM => 4weekLRU&JVM/JVM/test/loader}/EmployeeV1.java (96%) rename group23/601689050/{4LRU&JVM => 4weekLRU&JVM}/LRU/Iterator.java (100%) rename group23/601689050/{4LRU&JVM => 4weekLRU&JVM}/LRU/LRUPageFrame.java (100%) rename group23/601689050/{4LRU&JVM => 4weekLRU&JVM}/LRU/LRUPageFrameTest.java (100%) rename group23/601689050/{4LRU&JVM => 4weekLRU&JVM}/LRU/LinkedList.java (100%) rename group23/601689050/{4LRU&JVM => 4weekLRU&JVM}/LRU/List.java (100%) create mode 100644 group23/601689050/5weekStack/stack/Stack.java create mode 100644 group23/601689050/5weekStack/stack/StackUtil.java create mode 100644 group23/601689050/5weekStack/test/StackUtilTest.java diff --git a/group23/601689050/.gitattributes b/group23/601689050/.gitattributes new file mode 100644 index 0000000000..bdb0cabc87 --- /dev/null +++ b/group23/601689050/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/group23/601689050/4LRU&JVM/JVM/ClassFileLoader.java b/group23/601689050/4LRU&JVM/JVM/ClassFileLoader.java deleted file mode 100644 index 6a7ab61bc0..0000000000 --- a/group23/601689050/4LRU&JVM/JVM/ClassFileLoader.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.loader; - -import java.io.*; -import java.util.ArrayList; -import java.util.Dictionary; -import java.util.List; - - - -public class ClassFileLoader { - - private List clzPaths = new ArrayList<>(); - - public byte[] readBinaryCode(String className) throws ClassNotFoundException { - - String fileName = className.replace('.',File.separatorChar)+".class"; - InputStream is = null; - try{ - is = new FileInputStream(fileName); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int length = 0; - while((length = is.read(buffer)) != -1){ - baos.write(buffer,0,length); - } - return baos.toByteArray(); - } catch (IOException e){ - e.printStackTrace(); - } finally { - if(is!=null){ - try{ - is.close(); - } catch (IOException e){ - e.printStackTrace(); - } - } - } - return null; - } - - - - - public void addClassPath(String path) { - - StringBuilder str = new StringBuilder(path); - - } - - - - public String getClassPath(){ - - String path = Thread.currentThread().getContextClassLoader().getResource("/").getPath(); - - return path; - } - - - - - -} diff --git a/group23/601689050/4LRU&JVM/JVM/ClassFileloaderTest.java b/group23/601689050/4LRU&JVM/JVM/ClassFileloaderTest.java deleted file mode 100644 index eae77d6dd4..0000000000 --- a/group23/601689050/4LRU&JVM/JVM/ClassFileloaderTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.test; - -import com.loader.ClassFileLoader; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - - -public class ClassFileloaderTest { - - - public static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - public static String path2 = "C:\\temp"; - - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() throws ClassNotFoundException { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length-1); - - } - - - @Test - public void testMagicNumber() throws ClassNotFoundException { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i 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,";"); + } + + +} diff --git a/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java b/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java new file mode 100644 index 0000000000..8e4e172f25 --- /dev/null +++ b/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java @@ -0,0 +1,86 @@ +package test.loader; + +import loader.ClassFileLoader; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ClassFileLoaderTest { + static String path1 = "D:\\JavaProject\\4week_minijvm\\out\\production\\4week_minijvm"; + static String path2 = "D:\\temp"; + + + + @Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: readBinaryCode(String className) +* +*/ +public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + +} + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "test.loader.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "test.loader.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Thu, 27 Apr 2017 15:12:03 +0800 Subject: [PATCH 333/552] contant pool print finished --- .../classes/miniJVM/EmployeeV1 verbose.txt | 164 ++++++++++++++++++ .../dataStructure/stack/expr/InfixExpr.java | 4 +- .../stack/expr/InfixToPostfix.java | 3 + .../dataStructure/stack/expr/PostfixExpr.java | 6 +- .../dataStructure/stack/expr/PrefixExpr.java | 6 +- .../src/main/java/miniJVM/clz/ClassFile.java | 14 +- .../java/miniJVM/cmd/ByteCodeCommand.java | 8 +- .../src/main/java/miniJVM/method/Method.java | 4 +- .../java/miniJVM/print/ClassFilePrinter.java | 8 +- .../miniJVM/print/ConstantPoolPrinter.java | 107 +++++++++++- 10 files changed, 295 insertions(+), 29 deletions(-) create mode 100644 group24/75939388/learning2017/resources/classes/miniJVM/EmployeeV1 verbose.txt diff --git a/group24/75939388/learning2017/resources/classes/miniJVM/EmployeeV1 verbose.txt b/group24/75939388/learning2017/resources/classes/miniJVM/EmployeeV1 verbose.txt new file mode 100644 index 0000000000..b161a0cd6e --- /dev/null +++ b/group24/75939388/learning2017/resources/classes/miniJVM/EmployeeV1 verbose.txt @@ -0,0 +1,164 @@ +youchaowendeMacBook-Pro:Downloads Tee$ javap -verbose EmployeeV1.class +Classfile /Users/Tee/Downloads/EmployeeV1.class + Last modified 2017-4-27; size 1056 bytes + MD5 checksum 8454b8999ccc9a2ae26a405d47558825 + Compiled from "EmployeeV1.java" +public class com.coderising.jvm.test.EmployeeV1 + minor version: 0 + major version: 52 + flags: ACC_PUBLIC, ACC_SUPER +Constant pool: + #1 = Class #2 // com/coderising/jvm/test/EmployeeV1 + #2 = Utf8 com/coderising/jvm/test/EmployeeV1 + #3 = Class #4 // java/lang/Object + #4 = Utf8 java/lang/Object + #5 = Utf8 name + #6 = Utf8 Ljava/lang/String; + #7 = Utf8 age + #8 = Utf8 I + #9 = Utf8 + #10 = Utf8 (Ljava/lang/String;I)V + #11 = Utf8 Code + #12 = Methodref #3.#13 // java/lang/Object."":()V + #13 = NameAndType #9:#14 // "":()V + #14 = Utf8 ()V + #15 = Fieldref #1.#16 // com/coderising/jvm/test/EmployeeV1.name:Ljava/lang/String; + #16 = NameAndType #5:#6 // name:Ljava/lang/String; + #17 = Fieldref #1.#18 // com/coderising/jvm/test/EmployeeV1.age:I + #18 = NameAndType #7:#8 // age:I + #19 = Utf8 LineNumberTable + #20 = Utf8 LocalVariableTable + #21 = Utf8 this + #22 = Utf8 Lcom/coderising/jvm/test/EmployeeV1; + #23 = Utf8 setName + #24 = Utf8 (Ljava/lang/String;)V + #25 = Utf8 setAge + #26 = Utf8 (I)V + #27 = Utf8 sayHello + #28 = Fieldref #29.#31 // java/lang/System.out:Ljava/io/PrintStream; + #29 = Class #30 // java/lang/System + #30 = Utf8 java/lang/System + #31 = NameAndType #32:#33 // out:Ljava/io/PrintStream; + #32 = Utf8 out + #33 = Utf8 Ljava/io/PrintStream; + #34 = String #35 // Hello , this is class Employee + #35 = Utf8 Hello , this is class Employee + #36 = Methodref #37.#39 // java/io/PrintStream.println:(Ljava/lang/String;)V + #37 = Class #38 // java/io/PrintStream + #38 = Utf8 java/io/PrintStream + #39 = NameAndType #40:#24 // println:(Ljava/lang/String;)V + #40 = Utf8 println + #41 = Utf8 main + #42 = Utf8 ([Ljava/lang/String;)V + #43 = String #44 // Andy + #44 = Utf8 Andy + #45 = Methodref #1.#46 // com/coderising/jvm/test/EmployeeV1."":(Ljava/lang/String;I)V + #46 = NameAndType #9:#10 // "":(Ljava/lang/String;I)V + #47 = Methodref #1.#48 // com/coderising/jvm/test/EmployeeV1.sayHello:()V + #48 = NameAndType #27:#14 // sayHello:()V + #49 = Utf8 args + #50 = Utf8 [Ljava/lang/String; + #51 = Utf8 p + #52 = Utf8 SourceFile + #53 = Utf8 EmployeeV1.java +{ + public com.coderising.jvm.test.EmployeeV1(java.lang.String, int); + descriptor: (Ljava/lang/String;I)V + flags: ACC_PUBLIC + Code: + stack=2, locals=3, args_size=3 + 0: aload_0 + 1: invokespecial #12 // Method java/lang/Object."":()V + 4: aload_0 + 5: aload_1 + 6: putfield #15 // Field name:Ljava/lang/String; + 9: aload_0 + 10: iload_2 + 11: putfield #17 // Field age:I + 14: return + LineNumberTable: + line 9: 0 + line 10: 4 + line 11: 9 + line 12: 14 + LocalVariableTable: + Start Length Slot Name Signature + 0 15 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 15 1 name Ljava/lang/String; + 0 15 2 age I + + public void setName(java.lang.String); + descriptor: (Ljava/lang/String;)V + flags: ACC_PUBLIC + Code: + stack=2, locals=2, args_size=2 + 0: aload_0 + 1: aload_1 + 2: putfield #15 // Field name:Ljava/lang/String; + 5: return + LineNumberTable: + line 15: 0 + line 16: 5 + LocalVariableTable: + Start Length Slot Name Signature + 0 6 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 6 1 name Ljava/lang/String; + + public void setAge(int); + descriptor: (I)V + flags: ACC_PUBLIC + Code: + stack=2, locals=2, args_size=2 + 0: aload_0 + 1: iload_1 + 2: putfield #17 // Field age:I + 5: return + LineNumberTable: + line 18: 0 + line 19: 5 + LocalVariableTable: + Start Length Slot Name Signature + 0 6 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 6 1 age I + + public void sayHello(); + descriptor: ()V + flags: ACC_PUBLIC + Code: + stack=2, locals=1, args_size=1 + 0: getstatic #28 // Field java/lang/System.out:Ljava/io/PrintStream; + 3: ldc #34 // String Hello , this is class Employee + 5: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V + 8: return + LineNumberTable: + line 21: 0 + line 22: 8 + LocalVariableTable: + Start Length Slot Name Signature + 0 9 0 this Lcom/coderising/jvm/test/EmployeeV1; + + public static void main(java.lang.String[]); + descriptor: ([Ljava/lang/String;)V + flags: ACC_PUBLIC, ACC_STATIC + Code: + stack=4, locals=2, args_size=1 + 0: new #1 // class com/coderising/jvm/test/EmployeeV1 + 3: dup + 4: ldc #43 // String Andy + 6: bipush 29 + 8: invokespecial #45 // Method "":(Ljava/lang/String;I)V + 11: astore_1 + 12: aload_1 + 13: invokevirtual #47 // Method sayHello:()V + 16: return + LineNumberTable: + line 24: 0 + line 25: 12 + line 27: 16 + LocalVariableTable: + Start Length Slot Name Signature + 0 17 0 args [Ljava/lang/String; + 12 5 1 p Lcom/coderising/jvm/test/EmployeeV1; +} +SourceFile: "EmployeeV1.java" +youchaowendeMacBook-Pro:Downloads Tee$ \ No newline at end of file diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java index d07b014136..56a5810c68 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java @@ -55,7 +55,7 @@ public float evaluate() { if (numbers.size() == 2 && operators.size() == 1) { return calculate(numbers, (Token) operators.pop()); } else { - throw new RuntimeException("最后计算出错, numbers.size=" + numbers.size() + ", operators.size=" + operators.size()); + throw new RuntimeException("last calculation exception, numbers.size=" + numbers.size() + ", operators.size=" + operators.size()); } } @@ -75,7 +75,7 @@ private float calculate(Stack numbers, Token operator) { } else if (oper.equals("-")) { res = val1 - val2; } else { - if (val2 == 0) throw new RuntimeException("不能除以0,计算取消"); + if (val2 == 0) throw new RuntimeException("cannot divide 0, calculation canceled"); res = val1 / val2; } // System.out.println("计算结果: " + val1 + oper + val2 + "=" + res); diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java index 77a0b392ab..c2b2934df3 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java @@ -2,6 +2,9 @@ import java.util.List; +/** + * 中序转后序 + */ public class InfixToPostfix { public static List convert(String expr) { diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java index 0b15ac2fda..bfc1daf5ed 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java @@ -1,8 +1,8 @@ package basic.dataStructure.stack.expr; -import java.util.List; -import java.util.Stack; - +/** + * 后序表达式 + */ public class PostfixExpr { String expr = null; diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java index 907d9ed535..1357e78871 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java @@ -1,8 +1,8 @@ package basic.dataStructure.stack.expr; -import java.util.List; -import java.util.Stack; - +/** + * 前序表达式 + */ public class PrefixExpr { String expr = null; diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassFile.java b/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassFile.java index 7c002e8e31..7e723f4a24 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassFile.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/clz/ClassFile.java @@ -92,12 +92,16 @@ public String getSuperClassName(){ } public Method getMethod(String methodName, String paramAndReturnType){ - - - return null; + for(Method me : methods){ + String meName = pool.getUTF8String(me.getNameIndex()); + String meParamReturnType = pool.getUTF8String(me.getDescriptorIndex()); + if (meName.equals(methodName) && meParamReturnType.equals(paramAndReturnType)){ + return me; + } + } + throw new RuntimeException("methodName = " + methodName + " and paramAndReturnType=" + paramAndReturnType + "'s method not found"); } public Method getMainMethod(){ - - return null; + return getMethod("main", "([Ljava/lang/String;)V"); } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java index 5f0a289a4b..294add94b5 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java @@ -99,15 +99,17 @@ public String getOpCode() { public String toString(){ StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); + + buffer.append(this.offset).append(": ").append(getReadableCodeText()); + return buffer.toString(); } public abstract String toString(ConstantPool pool); public String getReadableCodeText(){ - String txt = codeMap.get(opCode); + String txt = codeMap.get(opCode.toUpperCase()); if(txt == null){ - return opCode; + return this.opCode; } return txt; } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java b/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java index 16ef5b5928..d2e2ae2a27 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java @@ -70,6 +70,8 @@ public String toString() { // } public ByteCodeCommand[] getCmds() { - return this.getCodeAttr().getCmds(); + ByteCodeCommand[] cmds = this.getCodeAttr().getCmds(); + + return cmds; } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/print/ClassFilePrinter.java b/group24/75939388/learning2017/src/main/java/miniJVM/print/ClassFilePrinter.java index e9c6e9b89f..9d3d79bc85 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/print/ClassFilePrinter.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/print/ClassFilePrinter.java @@ -25,17 +25,13 @@ public void print(){ ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); cnstPoolPrinter.print(); - - - - } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "resources/classes/miniJVM"; ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "EmployeeV1"; ClassFile clzFile = loader.loadClass(className); diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java b/group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java index 426fad2a8f..c776f49f01 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java @@ -1,7 +1,7 @@ package miniJVM.print; -import miniJVM.constant.ConstantPool; +import miniJVM.constant.*; public class ConstantPoolPrinter { ConstantPool pool; @@ -9,11 +9,106 @@ public class ConstantPoolPrinter { this.pool = pool; } public void print(){ - System.out.println("Constant Pool:"); - - - - + int poolSize = pool.getSize(); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + public void visitClassInfo(ClassInfo info) { + StringBuilder sb = new StringBuilder(); + sb.append("Class "); + sb.append("#" + info.getUtf8Index()); + sb.append(" //" + info.getClassName()); + System.out.println(sb.toString()); + } + + public void visitFieldRef(FieldRefInfo info) { + StringBuilder sb = new StringBuilder(); + sb.append("Fieldref "); + sb.append("#" + info.getClassInfoIndex()); + sb.append("." + info.getNameAndTypeIndex()); + sb.append(" //" + info.getClassName()); + sb.append("." + info.getFieldName()); + sb.append(":" + info.getFieldType()); + System.out.println(sb.toString()); + } + + public void visitMethodRef(MethodRefInfo info) { + StringBuilder sb = new StringBuilder(); + sb.append("MethodRef "); + sb.append("#" + info.getClassInfoIndex()); + sb.append(".").append("#" + info.getNameAndTypeIndex()); + sb.append(" //" + info.getClassName()); + sb.append("." + info.getMethodName()); + sb.append(":" + info.getParamAndReturnType()); + System.out.println(sb.toString()); + } + + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder sb = new StringBuilder(); + sb.append("NameAndType "); + sb.append("#" + info.getIndex1()); + sb.append(":#" + info.getIndex2()); + sb.append(" //" + info.getName()); + sb.append(":" + info.getTypeInfo()); + System.out.println(sb.toString()); + } + + public void visitString(StringInfo info) { + StringBuilder sb = new StringBuilder(); + sb.append("String "); + sb.append("#" + info.getIndex()); + sb.append(" //" + info.toString()); + System.out.println(sb.toString()); + } + + public void visitUTF8(UTF8Info info) { + StringBuilder sb = new StringBuilder(); + sb.append("Utf8 "); + sb.append(info.getValue()); + System.out.println(sb.toString()); + } + }; + + for(int i = 1; i < poolSize; i++){ + System.out.print(i + "# = "); + ConstantInfo cnst = pool.getConstantInfo(i); + cnst.accept(visitor); +// if(cnst instanceof ClassInfo){ +// sb.append("Class "); +// sb.append("#" + ((ClassInfo) cnst).getUtf8Index()); +// sb.append(" //" + ((ClassInfo) cnst).getClassName()); +// }else if(cnst instanceof UTF8Info){ +// sb.append("Utf8 "); +// sb.append(((UTF8Info) cnst).getValue()); +// }else if(cnst instanceof MethodRefInfo){ +// sb.append("MethodRef "); +// sb.append("#" + ((MethodRefInfo) cnst).getClassInfoIndex()); +// sb.append(".").append("#" + ((MethodRefInfo) cnst).getNameAndTypeIndex()); +// sb.append(" //" + ((MethodRefInfo) cnst).getClassName()); +// sb.append("." + ((MethodRefInfo) cnst).getMethodName()); +// sb.append(":" + ((MethodRefInfo) cnst).getParamAndReturnType()); +// }else if(cnst instanceof NameAndTypeInfo){ +// sb.append("NameAndType "); +// sb.append("#" + ((NameAndTypeInfo) cnst).getIndex1()); +// sb.append(":#" + ((NameAndTypeInfo) cnst).getIndex2()); +// sb.append(" //" + ((NameAndTypeInfo) cnst).getName()); +// sb.append(":" + ((NameAndTypeInfo) cnst).getTypeInfo()); +// }else if(cnst instanceof FieldRefInfo){ +// sb.append("Fieldref "); +// sb.append("#" + ((FieldRefInfo) cnst).getClassInfoIndex()); +// sb.append("." + ((FieldRefInfo) cnst).getNameAndTypeIndex()); +// sb.append(" //" + ((FieldRefInfo) cnst).getClassName()); +// sb.append("." + ((FieldRefInfo) cnst).getFieldName()); +// sb.append(":" + ((FieldRefInfo) cnst).getFieldType()); +// }else if(cnst instanceof StringInfo){ +// sb.append("String "); +// sb.append("#" + ((StringInfo) cnst).getIndex()); +// sb.append(" //" + cnst.toString()); +// }else{ +// throw new RuntimeException(cnst.getType() + "not processed"); +// } + +// System.out.println(sb.toString()); + } } } From e351d94786bc3ba84566ab33c8902be433cb8c76 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Thu, 27 Apr 2017 16:28:12 +0800 Subject: [PATCH 334/552] add mini-jvm test --- .../com/coderising/jvm/test/MiniJVMTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..787c0d954d --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + + } + +} From 6d0a3c444266ba7f65d9641dab31b07133dc317c Mon Sep 17 00:00:00 2001 From: zheng <765324639@qq.com> Date: Thu, 27 Apr 2017 17:11:10 +0800 Subject: [PATCH 335/552] Revert "update" --- .../275150374Learning/.idea/description.html | 16 +- .../basic/linklist/LRUPageFrame.java | 245 ----- .../basic/linklist/LRUPageFrameTest.java | 29 - .../coding2017/basic/linklist/LinkedList.java | 290 ------ .../coding2017/basic/queue/CircleQueue.java | 50 - .../coding2017/basic/queue/Josephus.java | 40 - .../basic/queue/QueueWithTwoStacks.java | 42 - .../coding2017/basic/stack/Stack.java | 49 - .../coding2017/basic/stack/StackUtil.java | 102 -- .../basic/stack/expr/InfixExpr.java | 95 -- .../basic/stack/expr/InfixExprTest.java | 55 -- .../basic/stack/expr/PostfixExpr.java | 81 -- .../basic/stack/expr/PostfixExprTest.java | 35 - .../basic/stack/expr/PrefixExpr.java | 68 -- .../basic/stack/expr/PrefixExprTest.java | 42 - .../coding2017/jvm/attr/AttributeInfo.java | 19 - .../coding2017/jvm/attr/CodeAttr.java | 93 -- .../coding2017/jvm/attr/LineNumberTable.java | 40 - .../jvm/attr/LocalVariableItem.java | 39 - .../jvm/attr/LocalVariableTable.java | 49 - .../coding2017/jvm/attr/StackMapTable.java | 28 - .../coding2017/jvm/clz/AccessFlag.java | 24 - .../coding2017/jvm/clz/ClassFile.java | 91 -- .../coding2017/jvm/clz/ClassIndex.java | 19 - .../coding2017/jvm/cmd/BiPushCmd.java | 23 - .../coding2017/jvm/cmd/ByteCodeCommand.java | 128 --- .../coding2017/jvm/cmd/CommandParser.java | 85 -- .../coding2017/jvm/cmd/GetFieldCmd.java | 22 - .../coding2017/jvm/cmd/GetStaticFieldCmd.java | 23 - .../coding2017/jvm/cmd/InvokeSpecialCmd.java | 23 - .../coding2017/jvm/cmd/InvokeVirtualCmd.java | 22 - .../orajavac/coding2017/jvm/cmd/LdcCmd.java | 29 - .../coding2017/jvm/cmd/NewObjectCmd.java | 19 - .../coding2017/jvm/cmd/NoOperandCmd.java | 23 - .../coding2017/jvm/cmd/OneOperandCmd.java | 27 - .../coding2017/jvm/cmd/PutFieldCmd.java | 19 - .../coding2017/jvm/cmd/TwoOperandCmd.java | 67 -- .../coding2017/jvm/constant/ClassInfo.java | 30 - .../coding2017/jvm/constant/ConstantInfo.java | 40 - .../coding2017/jvm/constant/ConstantPool.java | 28 - .../coding2017/jvm/constant/FieldRefInfo.java | 60 -- .../jvm/constant/MethodRefInfo.java | 59 -- .../jvm/constant/NameAndTypeInfo.java | 51 - .../jvm/constant/NullConstantInfo.java | 19 - .../coding2017/jvm/constant/StringInfo.java | 30 - .../coding2017/jvm/constant/UTF8Info.java | 35 - .../orajavac/coding2017/jvm/field/Field.java | 50 - .../jvm/loader/ByteCodeIterator.java | 56 -- .../jvm/loader/ClassFileLoader.java | 131 --- .../jvm/loader/ClassFileParser.java | 139 --- .../orajavac/coding2017/jvm/loader/test.java | 21 - .../coding2017/jvm/method/Method.java | 85 -- .../jvm/print/ClassFilePrinter.java | 53 -- .../jvm/print/ConstantPoolPrinter.java | 60 -- .../jvm/test/ClassFileloaderTest.java | 264 ------ .../coding2017/jvm/test/EmployeeV1.java | 26 - .../orajavac/coding2017/jvm/util/Util.java | 50 - group02/727171008/.classpath | 1 - .../HarryHook/coding2017/array/ArrayUtil.java | 561 ++++++----- .../coding2017/array/ArrayUtilTest.java | 291 +++--- .../coding2017/basic/ArrayListTest.java | 14 +- .../coding2017/basic/BinaryTreeNode.java | 202 ++-- .../coding2017/basic/BinaryTreeNodeTest.java | 55 +- .../HarryHook/coding2017/basic/Iterator.java | 8 +- .../coding2017/basic/LinkedListTest.java | 631 +++++++------ .../HarryHook/coding2017/basic/List.java | 22 +- .../HarryHook/coding2017/basic/ListTest.java | 212 +++-- .../coding2017/basic/MyArrayList.java | 279 +++--- .../coding2017/basic/MyLinkedList.java | 886 ++++++++++-------- .../HarryHook/coding2017/basic/MyQueue.java | 78 +- .../HarryHook/coding2017/basic/MyStack.java | 83 +- .../HarryHook/coding2017/basic/QueueTest.java | 46 +- .../HarryHook/coding2017/basic/StackTest.java | 54 +- .../coding2017/download/DownloadThread.java | 76 +- .../coding2017/download/FileDownloader.java | 153 +-- .../download/FileDownloaderTest.java | 84 +- .../coding2017/download/api/Connection.java | 40 +- .../download/api/ConnectionManager.java | 13 +- .../download/impl/ConnectionImpl.java | 94 +- .../download/impl/ConnectionManagerImpl.java | 8 +- .../coding2017/jvm/attr/AttributeInfo.java | 19 - .../coding2017/jvm/attr/CodeAttr.java | 111 --- .../coding2017/jvm/attr/LineNumberTable.java | 69 -- .../jvm/attr/LocalVariableItem.java | 49 - .../jvm/attr/LocalVariableTable.java | 51 - .../coding2017/jvm/attr/StackMapTable.java | 29 - .../coding2017/jvm/clz/AccessFlag.java | 26 - .../coding2017/jvm/clz/ClassFile.java | 133 --- .../coding2017/jvm/clz/ClassIndex.java | 22 - .../coding2017/jvm/cmd/BiPushCmd.java | 23 - .../coding2017/jvm/cmd/ByteCodeCommand.java | 128 --- .../coding2017/jvm/cmd/CommandParser.java | 155 --- .../coding2017/jvm/cmd/GetFieldCmd.java | 18 - .../coding2017/jvm/cmd/GetStaticFieldCmd.java | 24 - .../coding2017/jvm/cmd/InvokeSpecialCmd.java | 23 - .../coding2017/jvm/cmd/InvokeVirtualCmd.java | 21 - .../HarryHook/coding2017/jvm/cmd/LdcCmd.java | 29 - .../coding2017/jvm/cmd/NewObjectCmd.java | 19 - .../coding2017/jvm/cmd/NoOperandCmd.java | 23 - .../coding2017/jvm/cmd/OneOperandCmd.java | 27 - .../coding2017/jvm/cmd/PutFieldCmd.java | 19 - .../coding2017/jvm/cmd/TwoOperandCmd.java | 67 -- .../coding2017/jvm/constant/ClassInfo.java | 32 - .../coding2017/jvm/constant/ConstantInfo.java | 43 - .../coding2017/jvm/constant/ConstantPool.java | 31 - .../coding2017/jvm/constant/FieldRefInfo.java | 63 -- .../jvm/constant/MethodRefInfo.java | 62 -- .../jvm/constant/NameAndTypeInfo.java | 54 -- .../jvm/constant/NullConstantInfo.java | 19 - .../coding2017/jvm/constant/StringInfo.java | 33 - .../coding2017/jvm/constant/UTF8Info.java | 42 - .../HarryHook/coding2017/jvm/field/Field.java | 44 - .../jvm/loader/ByteCodeIterator.java | 58 -- .../jvm/loader/ClassFileLoader.java | 92 -- .../jvm/loader/ClassFileParser.java | 151 --- .../coding2017/jvm/method/Method.java | 87 -- .../jvm/print/ClassFilePrinter.java | 51 - .../jvm/print/ConstantPoolPrinter.java | 25 - .../jvm/test/ClassFileloaderTest.java | 342 ------- .../coding2017/jvm/test/EmployeeV1.java | 30 - .../HarryHook/coding2017/jvm/util/Util.java | 22 - .../coding2017/linklist/LRUPageFrame.java | 125 --- .../coding2017/linklist/LRUPageFrameTest.java | 34 - .../coding2017/litestruts/Configuration.java | 157 ++-- .../litestruts/ConfigurationException.java | 21 +- .../litestruts/ConfigurationTest.java | 67 +- .../coding2017/litestruts/LoginAction.java | 35 +- .../coding2017/litestruts/ReflectionUtil.java | 112 +-- .../litestruts/ReflectionUtilTest.java | 177 ++-- .../coding2017/litestruts/Struts.java | 42 +- .../coding2017/litestruts/StrutsTest.java | 68 +- .../HarryHook/coding2017/litestruts/View.java | 53 +- .../coding2017/queue/CircleQueue.java | 38 - .../HarryHook/coding2017/queue/Josephus.java | 18 - .../coding2017/queue/JosephusTest.java | 25 - .../HarryHook/coding2017/queue/Queue.java | 55 -- .../coding2017/queue/QueueWithTwoStacks.java | 37 - .../HarryHook/coding2017/stack/StackUtil.java | 138 --- .../coding2017/stack/StackUtilTest.java | 78 -- .../coding2017/stack/expr/InfixExpr.java | 103 -- .../coding2017/stack/expr/InfixExprTest.java | 47 - .../coding2017/stack/expr/InfixToPostfix.java | 53 -- .../coding2017/stack/expr/PostfixExpr.java | 54 -- .../stack/expr/PostfixExprTest.java | 37 - .../coding2017/stack/expr/PrefixExpr.java | 58 -- .../coding2017/stack/expr/PrefixExprTest.java | 43 - .../coding2017/stack/expr/Token.java | 50 - .../coding2017/stack/expr/TokenParser.java | 56 -- .../stack/expr/TokenParserTest.java | 39 - group02/812350401/.gitignore | 5 +- group02/812350401/pom.xml | 26 - .../miniyk2012/coding2017/basic/Stack.java | 25 + .../basic/linklist/LRUPageFrame.java | 148 --- .../basic/linklist/LRUPageFrameTest.java | 62 -- .../coding2017/basic/stack/Stack.java | 43 - .../coding2017/basic/stack/StackUtil.java | 158 ---- .../basic/stack/expr/InfixExpr.java | 134 --- .../basic/stack/expr/InfixExprTest.java | 52 - .../coderising/jvm/clz/AccessFlag.java | 25 - .../coderising/jvm/clz/ClassFile.java | 73 -- .../coderising/jvm/clz/ClassIndex.java | 19 - .../coderising/jvm/constant/ClassInfo.java | 24 - .../coderising/jvm/constant/ConstantInfo.java | 29 - .../coderising/jvm/constant/ConstantPool.java | 31 - .../coderising/jvm/constant/FieldRefInfo.java | 53 -- .../jvm/constant/MethodRefInfo.java | 56 -- .../jvm/constant/NameAndTypeInfo.java | 47 - .../jvm/constant/NullConstantInfo.java | 13 - .../coderising/jvm/constant/StringInfo.java | 26 - .../coderising/jvm/constant/UTF8Info.java | 30 - .../jvm/loader/ByteCodeIterator.java | 79 -- .../jvm/loader/ClassFileLoader.java | 89 -- .../jvm/loader/ClassFileParser.java | 112 --- .../jvm/test/ClassFileloaderTest.java | 176 ---- .../coderising/jvm/test/EmployeeV1.java | 28 - .../coding2017/coderising/jvm/util/Util.java | 26 - .../coderising/litestruts/Struts.java | 26 +- .../coderising/litestruts}/struts.xml | 0 .../coding2017/jvm/test/EmployeeV1.class | Bin 1056 -> 0 bytes .../miniyk2012/coding2017/basic/ListTest.java | 6 - .../basic/{stack => }/StackTest.java | 4 +- .../coding2017/basic/stack/StackUtilTest.java | 86 -- .../download/FileDownloaderTest.java | 13 +- .../jvm/loader/ClassFileParserTest.java | 53 -- .../coderising/litestruts/StrutsTest.java | 8 +- .../coderising/jvm/attr/AttributeInfo.java | 76 -- .../src/com/coderising/jvm/attr/CodeAttr.java | 103 -- .../jvm/attr/ConstantValueAttr.java | 30 - .../coderising/jvm/attr/LineNumberTable.java | 60 -- .../jvm/attr/LocalVariableItem.java | 40 - .../jvm/attr/LocalVariableTable.java | 47 - .../coderising/jvm/attr/StackMapTable.java | 36 - .../com/coderising/jvm/clz/AccessFlag.java | 24 - .../src/com/coderising/jvm/clz/ClassFile.java | 120 --- .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../src/com/coderising/jvm/cmd/BiPushCmd.java | 21 - .../coderising/jvm/cmd/ByteCodeCommand.java | 125 --- .../com/coderising/jvm/cmd/CommandParser.java | 155 --- .../com/coderising/jvm/cmd/GetFieldCmd.java | 21 - .../coderising/jvm/cmd/GetStaticFieldCmd.java | 19 - .../coderising/jvm/cmd/InvokeSpecialCmd.java | 21 - .../coderising/jvm/cmd/InvokeVirtualCmd.java | 21 - .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 - .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 - .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 - .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 - .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 - .../com/coderising/jvm/cmd/TwoOperandCmd.java | 65 -- .../coderising/jvm/constant/ClassInfo.java | 29 - .../coderising/jvm/constant/ConstantInfo.java | 41 - .../coderising/jvm/constant/ConstantPool.java | 46 - .../coderising/jvm/constant/FieldRefInfo.java | 59 -- .../jvm/constant/MethodRefInfo.java | 61 -- .../jvm/constant/NameAndTypeInfo.java | 50 - .../jvm/constant/NullConstantInfo.java | 17 - .../coderising/jvm/constant/StringInfo.java | 32 - .../com/coderising/jvm/constant/UTF8Info.java | 34 - .../exception/AddAnotherParserException.java | 10 - .../exception/NoNextByteCodeException.java | 10 - .../jvm/exception/NotAClassFileException.java | 11 - .../src/com/coderising/jvm/field/Field.java | 65 -- .../jvm/loader/ByteCodeIterator.java | 113 --- .../jvm/loader/ClassFileLoader.java | 14 +- .../ClassFileLoaderUtil.java} | 26 +- .../jvm/loader/ClassFileParser.java | 154 --- .../src/com/coderising/jvm/method/Method.java | 77 -- .../jvm/print/ClassFilePrinter.java | 52 - .../jvm/print/ConstantPoolPrinter.java | 112 --- .../src/com/coding/basic/BinaryTree.java | 10 +- .../src/com/coding/basic/BinaryTreeNode.java | 74 +- .../src/com/coding/basic/Iterator.java | 16 +- .../zj-2017/src/com/coding/basic/List.java | 18 +- .../zj-2017/src/com/coding/basic/Queue.java | 8 +- .../zj-2017/src/com/coding/basic/Stack.java | 30 + .../src/com/coding/basic/array/ArrayList.java | 37 +- .../src/com/coding/basic/array/ArrayUtil.java | 10 +- .../com/coding/basic/linklist/LinkedList.java | 71 +- .../src/com/coding/basic/stack/Stack.java | 46 - .../src/com/coding/basic/stack/StackUtil.java | 158 ---- .../coding/basic/stack/expr/InfixExpr.java | 120 --- .../coding/basic/stack/expr/PostfixExpr.java | 46 - .../coding/basic/stack/expr/PrefixExpr.java | 47 - .../basic/stack/expr/util/ExprIterator.java | 31 - .../basic/stack/expr/util/FixExprUtil.java | 174 ---- .../basic/stack/expr/util/Operator.java | 70 -- .../coderising/jvm/ClassFileloaderTest.java | 349 ------- .../test/com/coderising/jvm/EmployeeV1.java | 28 - .../jvm/loader}/ClassFileloaderTest.java | 178 ++-- .../coderising/jvm/loader}/EmployeeV1.java | 56 +- .../test/com/coding/basic/BinaryTreeTest.java | 117 ++- .../src/test/com/coding/basic/QueueTest.java | 128 +-- .../coding/basic/{stack => }/StackTest.java | 152 +-- .../com/coding/basic/array/ArrayListTest.java | 4 +- .../com/coding/basic/array/ArrayUtilTest.java | 2 +- .../coding/basic/linklist/LinkedListTest.java | 14 +- .../com/coding/basic/stack/StackUtilTest.java | 95 -- .../basic/stack/expr/InfixExprTest.java | 48 - .../basic/stack/expr/PostfixExprTest.java | 38 - .../basic/stack/expr/PrefixExprTest.java | 46 - .../structure/week2/ArrayUtilTest.java | 1 + .../247565311/structure/week6/StackUtil.java | 40 +- .../structure/week6/StackUtilTest.java | 7 +- .../247565311/structure/week7/InfixExpr.java | 93 +- .../structure/week7/InfixExprTest.java | 112 +-- .../week567_miniJVM/attr/AttrFactory.java | 80 -- .../week567_miniJVM/attr/AttributeInfo.java | 19 +- .../week567_miniJVM/attr/CodeAttr.java | 53 +- .../week567_miniJVM/attr/LineNumberTable.java | 18 +- .../attr/LocalVariableItem.java | 7 - .../attr/LocalVariableTable.java | 6 +- .../week567_miniJVM/attr/StackMapTable.java | 2 +- .../week567_miniJVM/clz/ClassFile.java | 76 +- .../constant/ConstantPool.java | 6 + .../week567_miniJVM/constant/InfoFactory.java | 54 -- .../week567_miniJVM/constant/UTF8Info.java | 3 + .../week567_miniJVM/field/Field.java | 33 +- .../loader/ByteCodeIterator.java | 34 +- .../loader/ClassFileLoader.java | 24 +- .../loader/ClassFileParser.java | 105 +-- .../week567_miniJVM/method/Method.java | 47 +- .../{loader => test}/ClassFileLoaderTest.java | 44 +- .../week567_miniJVM/test/EmployeeV1.java | 15 +- .../247565311/week567_miniJVM/util/Util.java | 3 + .../main/java/com/zhaogd/array/ArrayList.java | 9 +- .../coding/basic/stack/StackUtil.java | 14 +- .../coding/basic/stack/expr/InfixExpr.java | 96 +- .../coding/basic/stack/expr/InfixExprS.java | 102 -- .../basic/stack/expr/InfixExprTest.java | 42 +- .../basic/stack/expr/InfixToPostfix.java | 51 - .../coding/basic/stack/expr/PostfixExpr.java | 51 - .../basic/stack/expr/PostfixExprTest.java | 41 - .../coding/basic/stack/expr/PrefixExpr.java | 56 -- .../basic/stack/expr/PrefixExprTest.java | 45 - .../coding/basic/stack/expr/TParser.java | 85 -- .../coding/basic/stack/expr/Token.java | 77 -- .../coding/basic/stack/expr/TokenParser.java | 57 -- .../basic/stack/expr/TokenParserTest.java | 66 -- group12/382266293/src/array/ArrayUtil.java | 256 ++--- .../382266293/src/array/ArrayUtilTest.java | 140 ++- .../coderising/download/DownloadThread.java | 23 +- .../com/coderising/download/DownloadUtil.java | 34 +- .../coderising/download/FileDownloader.java | 98 +- .../download/FileDownloaderTest.java | 12 +- .../coderising/download/api/Connection.java | 30 +- .../download/impl/ConnectionImpl.java | 52 +- .../download/impl/ConnectionManagerImpl.java | 18 +- .../download/impl/DownloadUtil.java | 8 +- .../src/com/coderising/jvm/attr/CodeAttr.java | 95 +- .../coderising/jvm/attr/LineNumberTable.java | 50 +- .../jvm/attr/LocalVariableItem.java | 30 +- .../jvm/attr/LocalVariableTable.java | 57 +- .../coderising/jvm/attr/StackMapTable.java | 12 +- .../com/coderising/jvm/clz/AccessFlag.java | 18 +- .../src/com/coderising/jvm/clz/ClassFile.java | 108 +-- .../com/coderising/jvm/clz/ClassIndex.java | 16 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 - .../coderising/jvm/cmd/ByteCodeCommand.java | 128 --- .../com/coderising/jvm/cmd/CommandParser.java | 179 ---- .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 - .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 - .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 - .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 - .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 - .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 - .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 - .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 - .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 - .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 -- .../coderising/jvm/constant/ClassInfo.java | 23 +- .../coderising/jvm/constant/ConstantInfo.java | 12 +- .../coderising/jvm/constant/ConstantPool.java | 11 +- .../coderising/jvm/constant/FieldRefInfo.java | 55 +- .../jvm/constant/MethodRefInfo.java | 51 +- .../jvm/constant/NameAndTypeInfo.java | 33 +- .../jvm/constant/NullConstantInfo.java | 11 - .../coderising/jvm/constant/StringInfo.java | 18 +- .../com/coderising/jvm/constant/UTF8Info.java | 24 +- .../src/com/coderising/jvm/field/Field.java | 42 +- .../jvm/loader/ByteCodeIterator.java | 68 +- .../jvm/loader/ClassFileLoader.java | 72 +- .../jvm/loader/ClassFileParser.java | 74 +- .../src/com/coderising/jvm/method/Method.java | 85 +- .../jvm/print/ClassFilePrinter.java | 52 - .../jvm/print/ConstantPoolPrinter.java | 92 -- .../coderising/jvm/print/PrintVisitor.java | 23 - .../jvm/test/ClassFileloaderTest.java | 219 ++--- .../com/coderising/jvm/test/EmployeeV1.java | 48 +- .../src/com/coderising/jvm/util/Util.java | 10 +- .../coderising/litestruts/LoginAction.java | 24 +- .../src/litestruts/ActionXMLreader.java | 1 - .../src/litestruts/Configuration.java | 110 ++- group12/382266293/src/litestruts/Struts.java | 100 +- .../382266293/src/litestruts/StrutsTest.java | 20 +- group12/382266293/src/litestruts/View.java | 8 +- group12/382266293/src/test.java | 59 +- .../coderising/jvm/attr/AttributeInfo.java | 19 - .../src/com/coderising/jvm/attr/CodeAttr.java | 56 -- .../coderising/jvm/attr/LineNumberTable.java | 42 - .../jvm/attr/LocalVariableItem.java | 39 - .../jvm/attr/LocalVariableTable.java | 28 - .../coderising/jvm/attr/StackMapTable.java | 30 - .../src/com/coderising/jvm/field/Field.java | 33 - .../jvm/loader/ByteCodeIterator.java | 54 +- .../jvm/loader/ClassFileLoader.java | 2 +- .../jvm/loader/ClassFileParser.java | 117 +-- .../src/com/coderising/jvm/method/Method.java | 57 -- .../jvm/test/ClassFileloaderTest.java | 9 +- .../datastructure/linklist/LRUPageFrame.java | 144 +++ .../com/datastructure/stack/StackUtil.java | 53 +- .../datastructure/stack/StackUtilTest.java | 80 -- .../datastructure/stack/expr/InfixExpr.java | 67 -- .../stack/expr/InfixExprTest.java | 51 - .../src/task7/expr/InfixExpr.java | 79 -- .../src/task7/expr/InfixExprTest.java | 56 -- .../src/task7/expr/PostfixExpr.java | 45 - .../src/task7/expr/PostfixExprTest.java | 37 - .../src/task7/expr/PrefixExpr.java | 47 - .../src/task7/expr/PrefixExprTest.java | 44 - .../1507_977996067/src/task7/expr/Token.java | 53 -- .../src/task7/expr/TokenParser.java | 57 -- .../src/task7/jvm/attr/AttributeInfo.java | 19 - .../src/task7/jvm/attr/CodeAttr.java | 120 --- .../src/task7/jvm/attr/LineNumberTable.java | 72 -- .../src/task7/jvm/attr/LocalVariableItem.java | 39 - .../task7/jvm/attr/LocalVariableTable.java | 57 -- .../src/task7/jvm/attr/StackMapTable.java | 30 - .../src/task7/jvm/clz/AccessFlag.java | 25 - .../src/task7/jvm/clz/ClassFile.java | 134 --- .../src/task7/jvm/clz/ClassIndex.java | 19 - .../src/task7/jvm/cmd/BiPushCmd.java | 23 - .../src/task7/jvm/cmd/ByteCodeCommand.java | 128 --- .../src/task7/jvm/cmd/CommandParser.java | 124 --- .../src/task7/jvm/cmd/GetFieldCmd.java | 22 - .../src/task7/jvm/cmd/GetStaticFieldCmd.java | 23 - .../src/task7/jvm/cmd/InvokeSpecialCmd.java | 23 - .../src/task7/jvm/cmd/InvokeVirtualCmd.java | 22 - .../src/task7/jvm/cmd/LdcCmd.java | 29 - .../src/task7/jvm/cmd/NewObjectCmd.java | 19 - .../src/task7/jvm/cmd/NoOperandCmd.java | 23 - .../src/task7/jvm/cmd/OneOperandCmd.java | 27 - .../src/task7/jvm/cmd/PutFieldCmd.java | 19 - .../src/task7/jvm/cmd/TwoOperandCmd.java | 67 -- .../src/task7/jvm/constant/ClassInfo.java | 31 - .../src/task7/jvm/constant/ConstantInfo.java | 35 - .../src/task7/jvm/constant/ConstantPool.java | 37 - .../src/task7/jvm/constant/FieldRefInfo.java | 65 -- .../src/task7/jvm/constant/MethodRefInfo.java | 65 -- .../task7/jvm/constant/NameAndTypeInfo.java | 56 -- .../task7/jvm/constant/NullConstantInfo.java | 21 - .../src/task7/jvm/constant/StringInfo.java | 35 - .../src/task7/jvm/constant/UTF8Info.java | 45 - .../src/task7/jvm/field/Field.java | 48 - .../task7/jvm/loader/ByteCodeIterator.java | 56 -- .../src/task7/jvm/loader/ClassFileLoader.java | 122 --- .../src/task7/jvm/loader/ClassFileParser.java | 112 --- .../src/task7/jvm/method/Method.java | 91 -- .../src/task7/jvm/print/ClassFilePrinter.java | 44 - .../task7/jvm/print/ConstantInfoVisitor.java | 18 - .../jvm/print/ConstantInfoVisitorImpl.java | 51 - .../task7/jvm/print/ConstantPoolPrinter.java | 26 - .../task7/jvm/test/ClassFileloaderTest.java | 191 ---- .../src/task7/jvm/test/EmployeeV1.java | 29 - .../src/task7/jvm/util/Util.java | 23 - group15/1512_656512403/.idea/description.html | 16 +- group17/102228177/work2_26/.classpath | 16 +- .../src/com/coderising/array/ArrayUtil.java | 19 +- .../jvm/loader/ClassFileLoader.java | 81 -- .../com/coderising/jvm/test/EmployeeV1.java | 28 - .../coding/basic/linklist/LRUPageFrame.java | 150 --- .../basic/linklist/LRUPageFrameTest.java | 31 - .../src/com/coderising/data/LinkedList.java | 42 +- .../com/coderising/data/LinkedListTest.java | 7 +- .../coderising/download/DownloadThread.java | 2 +- .../coderising/download/FileDownloader.java | 2 +- .../download/FileDownloaderTest.java | 5 +- .../download/impl/ConnectionImpl.java | 2 +- .../download/impl/ConnectionManagerImpl.java | 2 +- .../com/coderising/jvm/clz/AccessFlag.java | 25 - .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../coderising/jvm/constant/ClassInfo.java | 33 - .../coderising/jvm/constant/ConstantInfo.java | 38 - .../coderising/jvm/constant/ConstantPool.java | 39 - .../coderising/jvm/constant/FieldRefInfo.java | 54 -- .../jvm/constant/MethodRefInfo.java | 55 -- .../jvm/constant/NameAndTypeInfo.java | 45 - .../jvm/constant/NullConstantInfo.java | 13 - .../coderising/jvm/constant/StringInfo.java | 26 - .../com/coderising/jvm/constant/UTF8Info.java | 32 - .../jvm/loader/ByteCodeIterator.java | 49 - .../jvm/loader/ClassFileLoader.java | 137 --- .../jvm/loader/ClassFileParser.java | 115 --- .../jvm/test/ClassFileloaderTest.java | 203 ---- .../com/coderising/jvm/test/EmployeeV1.java | 28 - .../src/com/coderising/jvm/util/Util.java | 24 - .../src/com/coding/basic/stack/ArrayList.java | 150 --- .../src/com/coding/basic/stack/Iterator.java | 8 - .../src/com/coding/basic/stack/List.java | 10 - .../src/com/coding/basic/stack/Stack.java | 48 - .../src/com/coding/basic/stack/StackUtil.java | 112 --- .../com/coding/basic/stack/StackUtilTest.java | 44 - .../coderising/jvm/attr/AttributeInfo.java | 19 - .../src/com/coderising/jvm/attr/CodeAttr.java | 116 --- .../coderising/jvm/attr/LineNumberTable.java | 68 -- .../jvm/attr/LocalVariableItem.java | 39 - .../jvm/attr/LocalVariableTable.java | 58 -- .../coderising/jvm/attr/StackMapTable.java | 30 - .../com/coderising/jvm/clz/AccessFlag.java | 25 - .../src/com/coderising/jvm/clz/ClassFile.java | 92 -- .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../coderising/jvm/constant/ClassInfo.java | 33 - .../coderising/jvm/constant/ConstantInfo.java | 38 - .../coderising/jvm/constant/ConstantPool.java | 39 - .../coderising/jvm/constant/FieldRefInfo.java | 54 -- .../jvm/constant/MethodRefInfo.java | 55 -- .../jvm/constant/NameAndTypeInfo.java | 45 - .../jvm/constant/NullConstantInfo.java | 13 - .../coderising/jvm/constant/StringInfo.java | 26 - .../com/coderising/jvm/constant/UTF8Info.java | 32 - .../src/com/coderising/jvm/field/Field.java | 45 - .../jvm/loader/ByteCodeIterator.java | 53 -- .../jvm/loader/ClassFileLoader.java | 137 --- .../jvm/loader/ClassFileParser.java | 143 --- .../src/com/coderising/jvm/method/Method.java | 91 -- .../com/coderising/jvm/test/EmployeeV1.java | 28 - .../src/com/coderising/jvm/util/Util.java | 24 - .../src/com/coding/basic/stack/ArrayList.java | 150 --- .../src/com/coding/basic/stack/InfixExpr.java | 74 -- .../com/coding/basic/stack/InfixExprTest.java | 47 - .../src/com/coding/basic/stack/Iterator.java | 8 - .../src/com/coding/basic/stack/List.java | 10 - .../src/com/coding/basic/stack/Stack.java | 48 - .../src/com/coding/basic/stack/StackUtil.java | 66 -- .../src/com/coding/basic/stack/Token.java | 49 - .../com/coding/basic/stack/TokenParser.java | 56 -- group17/1158154002/.classpath | 2 - .../src/test04/loader/ClassFileLoader.java | 61 -- .../test04/loader/ClassFileloaderTest.java | 84 -- .../src/test04/loader/EmployeeV1.java | 28 - .../src/test04/lru/LRUPageFrame.java | 112 --- .../src/test04/lru/LRUPageFrameTest.java | 29 - .../1158154002/src/test05/stack/Stack.java | 43 - .../src/test05/stack/StackTest.java | 52 - .../src/test05/stack/StackUtil.java | 151 --- .../1158154002/src/test06/expr/InfixExpr.java | 92 -- .../src/test06/expr/InfixExprTest.java | 45 - .../src/test07/expr/InfixToPostfix.java | 56 -- .../src/test07/expr/InfixToPostfixTest.java | 12 - .../src/test07/expr/PostfixExpr.java | 48 - .../src/test07/expr/PostfixExprTest.java | 36 - .../src/test07/expr/PrefixExpr.java | 49 - .../src/test07/expr/PrefixExprTest.java | 43 - group17/1158154002/src/test07/expr/Token.java | 54 -- .../src/test07/expr/TokenParser.java | 55 -- .../src/test07/expr/TokenParserTest.java | 37 - .../1204187480/code/homework/basic/pom.xml | 12 + .../java/com/coding/basic}/ArrayList.java | 219 +++-- .../com/coding/basic}/BinaryTreeNode.java | 64 +- .../main/java}/com/coding/basic/Iterator.java | 0 .../java/com/coding/basic}/LinkedList.java | 5 +- .../src/main/java/com/coding/basic/List.java | 20 +- .../src/main/java/com/coding/basic/Queue.java | 48 +- .../src/main/java/com/coding/basic/Stack.java | 62 +- .../test/java/com/coding/api/ArraysTest.java | 44 +- .../test/java/com/coding/api/SystemTest.java | 48 +- .../java/com/coding/basic/ArrayListTest.java | 69 +- .../java/com/coding/basic/LinkedListTest.java | 24 +- .../java/com/coderising}/array/ArrayUtil.java | 2 +- .../jvm/loader/ClassFileLoader.java | 45 - .../jvm/test/ClassFileloaderTest.java | 355 ------- .../litestruts/{ => action}/LoginAction.java | 2 +- .../coderising/src/main/resources/struts.xml | 2 +- .../java/com/coding/basic/BinaryTreeNode.java | 32 - .../coding/basic/linklist/LRUPageFrame.java | 57 -- .../basic/linklist/LRUPageFrameTest.java | 34 - .../1204187480/code/homework/parent/pom.xml | 150 +-- group17/1204187480/code/homework/pom.xml | 2 +- group17/1204187480/note/todo/homework.md | 8 - .../1264835468/src/assignment/BinaryTree.java | 10 +- .../assignment/{Queue.java => MyQueue.java} | 2 +- .../1264835468/src/assignment/MyStack.java | 39 + group17/1264835468/src/assignment/Stack.java | 53 -- .../assignment0326/jvm/clz/AccessFlag.java | 25 - .../src/assignment0326/jvm/clz/ClassFile.java | 77 -- .../assignment0326/jvm/clz/ClassIndex.java | 19 - .../jvm/constant/ClassInfo.java | 24 - .../jvm/constant/ConstantInfo.java | 29 - .../jvm/constant/ConstantPool.java | 29 - .../jvm/constant/FieldRefInfo.java | 54 -- .../jvm/constant/MethodRefInfo.java | 55 -- .../jvm/constant/NameAndTypeInfo.java | 45 - .../jvm/constant/NullConstantInfo.java | 13 - .../jvm/constant/StringInfo.java | 26 - .../assignment0326/jvm/constant/UTF8Info.java | 32 - .../jvm/loader/ByteCodeIterator.java | 42 - .../jvm/loader/ClassFileLoader.java | 80 +- .../jvm/loader/ClassFileParser.java | 133 --- .../jvm/test/ClassFileLoaderTest.java | 129 +-- .../src/assignment0326/jvm/util/Util.java | 24 - .../src/assignment0326/lru/Clock.java | 99 ++ .../src/assignment0405/StackUtil.java | 107 --- .../src/assignment0405/StackUtilTest.java | 67 -- .../com/coderising/jvm/test/EmployeeV1.java | 28 - .../com/coderising/download/net_multisoc.htm | 15 - .../coderising/jvm/attr/AttributeInfo.java | 48 - .../src/com/coderising/jvm/attr/CodeAttr.java | 94 -- .../attr/InvalidAttributeInfoException.java | 7 - .../coderising/jvm/attr/LineNumberTable.java | 53 -- .../jvm/attr/LocalVariableItem.java | 71 -- .../jvm/attr/LocalVariableTable.java | 40 - .../coderising/jvm/attr/StackMapTable.java | 30 - .../com/coderising/jvm/clz/AccessFlag.java | 25 - .../src/com/coderising/jvm/clz/ClassFile.java | 95 -- .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../coderising/jvm/constant/ClassInfo.java | 24 - .../coderising/jvm/constant/ConstantInfo.java | 29 - .../jvm/constant/ConstantInfoFactory.java | 93 -- .../coderising/jvm/constant/ConstantPool.java | 37 - .../coderising/jvm/constant/FieldRefInfo.java | 54 -- .../coderising/jvm/constant/FloatRefInfo.java | 15 - .../coderising/jvm/constant/IntegerInfo.java | 22 - .../InvalidConstantInfoTypeException.java | 11 - .../jvm/constant/MethodRefInfo.java | 55 -- .../jvm/constant/NameAndTypeInfo.java | 45 - .../jvm/constant/NullConstantInfo.java | 13 - .../coderising/jvm/constant/StringInfo.java | 26 - .../com/coderising/jvm/constant/UTF8Info.java | 32 - .../src/com/coderising/jvm/field/Field.java | 50 - .../coderising/jvm/interfaze/Interfaze.java | 5 - .../interfaze/InvalidInterfaceException.java | 7 - .../jvm/loader/ByteCodeIterator.java | 84 -- .../jvm/loader/ClassFileLoader.java | 20 +- .../jvm/loader/ClassFileParser.java | 165 ---- .../method/InvalidMethodInfoException.java | 7 - .../src/com/coderising/jvm/method/Method.java | 87 -- .../jvm/test/ByteCodeIteratorTest.java | 51 - .../jvm/test/ClassFileloaderTest.java | 385 ++------ .../jvm/test/ClassFileloaderTest2.java | 52 - .../src/com/coderising/jvm/util/Util.java | 24 - .../src/com/coding/basic/stack/Stack.java | 24 - .../src/com/coding/basic/stack/StackUtil.java | 109 --- .../coding/basic/stack/expr/InfixExpr.java | 184 ---- .../basic/stack/expr/InfixExprTest.java | 60 -- group17/785396327/2.26/list/ArrayList.java | 14 +- .../785396327/3.26/jvm_1/ClassFileLoader.java | 9 - .../3.26/jvm_1/ClassFileloaderTest.java | 2 +- group17/785396327/4.16/cmd/BiPushCmd.java | 29 - .../785396327/4.16/cmd/ByteCodeCommand.java | 131 --- group17/785396327/4.16/cmd/CommandParser.java | 214 ----- group17/785396327/4.16/cmd/GetFieldCmd.java | 27 - .../785396327/4.16/cmd/GetStaticFieldCmd.java | 27 - .../785396327/4.16/cmd/InvokeSpecialCmd.java | 27 - .../785396327/4.16/cmd/InvokeVirtualCmd.java | 26 - group17/785396327/4.16/cmd/LdcCmd.java | 37 - group17/785396327/4.16/cmd/NewObjectCmd.java | 27 - group17/785396327/4.16/cmd/NoOperandCmd.java | 30 - group17/785396327/4.16/cmd/OneOperandCmd.java | 27 - group17/785396327/4.16/cmd/PutFieldCmd.java | 26 - group17/785396327/4.16/cmd/TwoOperandCmd.java | 65 -- .../4.16/print/ClassFilePrinter.java | 44 - .../4.16/print/ConstantPoolPrinter.java | 114 --- .../4.23/engine/ExecutionResult.java | 55 -- .../785396327/4.23/engine/ExecutorEngine.java | 29 - .../785396327/4.23/engine/FrameResult.java | 7 - group17/785396327/4.23/engine/Heap.java | 41 - group17/785396327/4.23/engine/JavaObject.java | 73 -- group17/785396327/4.23/engine/MethodArea.java | 70 -- group17/785396327/4.23/engine/MiniJVM.java | 29 - group17/785396327/4.23/engine/StackFrame.java | 95 -- group17/785396327/4.23/queue/CircleQueue.java | 59 -- .../785396327/4.23/queue/CircleQueueTest.java | 62 -- group17/785396327/4.23/queue/Josephus.java | 39 - .../785396327/4.23/queue/JosephusTest.java | 26 - .../4.23/queue/QueueWithTwoStacks.java | 54 -- .../4.23/queue/QueueWithTwoStacksTest.java | 37 - group17/785396327/4.5/clz/AccessFlag.java | 28 - group17/785396327/4.5/clz/ClassFile.java | 120 --- group17/785396327/4.5/clz/ClassIndex.java | 25 - group17/785396327/4.5/constant/ClassInfo.java | 32 - .../785396327/4.5/constant/ConstantInfo.java | 50 - .../785396327/4.5/constant/ConstantPool.java | 32 - .../785396327/4.5/constant/FieldRefInfo.java | 62 -- .../785396327/4.5/constant/MethodRefInfo.java | 58 -- .../4.5/constant/NameAndTypeInfo.java | 57 -- .../4.5/constant/NullConstantInfo.java | 20 - .../785396327/4.5/constant/StringInfo.java | 34 - group17/785396327/4.5/constant/UTF8Info.java | 39 - .../4.5/iterator/ByteCodeIterator.java | 64 -- .../785396327/4.5/parse/ClassFilePaser.java | 121 --- group17/785396327/4.5/stack/MyStack.java | 35 - group17/785396327/4.5/stack/StackUtil.java | 115 --- .../785396327/4.5/stack/StackUtilTest.java | 101 -- .../4.5/test/ClassFileloaderTest.java | 348 ------- group17/785396327/4.5/util/Util.java | 28 - group17/785396327/4.9/attr/AttributeInfo.java | 20 - group17/785396327/4.9/attr/CodeAttr.java | 88 -- .../785396327/4.9/attr/LineNumberTable.java | 54 -- .../785396327/4.9/attr/LocalVariableItem.java | 42 - .../4.9/attr/LocalVariableTable.java | 43 - group17/785396327/4.9/attr/StackMapTable.java | 31 - group17/785396327/4.9/expr/ExprParser.java | 37 - group17/785396327/4.9/expr/InfixExpr.java | 75 -- group17/785396327/4.9/expr/InfixExprTest.java | 57 -- .../785396327/4.9/expr/InfixToPostfix.java | 43 - .../4.9/expr/InfixToPostfixTest.java | 41 - group17/785396327/4.9/expr/OperEnum.java | 21 - group17/785396327/4.9/expr/PostfixExpr.java | 48 - .../785396327/4.9/expr/PostfixExprTest.java | 38 - group17/785396327/4.9/expr/PrefixExpr.java | 48 - .../785396327/4.9/expr/PrefixExprTest.java | 45 - group17/785396327/4.9/expr/Token.java | 52 - group17/785396327/4.9/expr/TokenParser.java | 58 -- .../785396327/4.9/expr/TokenParserTest.java | 47 - group17/785396327/4.9/field/Field.java | 41 - group17/785396327/4.9/method/Method.java | 67 -- group17/82427129/.gitignore | 4 +- .../coderising/jvm/attr/AttributeInfo.java | 40 - .../com/coderising/jvm/attr/CodeAttr.java | 129 --- .../coderising/jvm/attr/LineNumberTable.java | 77 -- .../jvm/attr/LocalVariableTable.java | 93 -- .../coderising/jvm/attr/StackMapTable.java | 13 - .../com/coderising/jvm/clz/AccessFlag.java | 24 - .../com/coderising/jvm/clz/ClassFile.java | 109 --- .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../coderising/jvm/constant/ClassInfo.java | 39 - .../coderising/jvm/constant/ConstantInfo.java | 37 - .../coderising/jvm/constant/ConstantPool.java | 38 - .../coderising/jvm/constant/DoubleInfo.java | 14 - .../coderising/jvm/constant/FieldRefInfo.java | 66 -- .../coderising/jvm/constant/FloatInfo.java | 15 - .../coderising/jvm/constant/IntegerInfo.java | 25 - .../com/coderising/jvm/constant/LongInfo.java | 15 - .../jvm/constant/MethodRefInfo.java | 67 -- .../jvm/constant/NameAndTypeInfo.java | 58 -- .../jvm/constant/NullConstantInfo.java | 14 - .../coderising/jvm/constant/StringInfo.java | 43 - .../com/coderising/jvm/constant/UTF8Info.java | 47 - .../java/com/coderising/jvm/field/Field.java | 115 --- .../jvm/loader/ByteCodeIterator.java | 48 - .../jvm/loader/ClassFileLoader.java | 34 +- .../jvm/loader/ClassFileParser.java | 195 ---- .../com/coderising/jvm/method/Method.java | 126 --- .../java/com/coderising/jvm/util/Util.java | 24 - .../com/coding/basic/{stack => }/Stack.java | 16 +- .../com/coding/basic/stack/StackUtil.java | 147 --- .../coding/basic/stack/expr/InfixExpr.java | 114 --- .../com/coding/basic/stack/expr/Token.java | 85 -- .../jvm/loader/ClassFileLoaderTest.java | 185 +--- .../com/coding/basic/stack/StackUtilTest.java | 65 -- .../basic/stack/expr/InfixExprTest.java | 35 - group17/article/20170326-20170402.md | 2 +- group17/article/20170402-20170409.md | 8 +- group17/article/20170409-20170416.md | 56 -- group17/article/20170416-20170423.md | 56 -- group17/article/template.md | 2 +- group17/count/homework.md | 5 +- .../org/xukai/coderising/stack/InfixExpr.java | 173 ++-- .../xukai/coderising/stack/InfixExpr2.java | 104 -- .../coderising/stack/InfixToPostfix2.java | 87 -- .../xukai/coderising/stack/PostfixExpr.java | 57 -- .../coderising/stack/PostfixExprTest.java | 47 - .../xukai/coderising/stack/PrefixExpr.java | 60 -- .../coderising/stack/PrefixExprTest.java | 45 - .../org/xukai/coderising/stack/Token.java | 50 - .../xukai/coderising/stack/TokenParser.java | 57 -- .../java/org/xukai/jvm/attr/CodeAttr.java | 21 +- .../java/org/xukai/jvm/clz/ClassFile.java | 32 +- .../java/org/xukai/jvm/cmd/BiPushCmd.java | 22 - .../org/xukai/jvm/cmd/ByteCodeCommand.java | 129 --- .../java/org/xukai/jvm/cmd/CommandParser.java | 156 --- .../java/org/xukai/jvm/cmd/GetFieldCmd.java | 22 - .../org/xukai/jvm/cmd/GetStaticFieldCmd.java | 20 - .../org/xukai/jvm/cmd/InvokeSpecialCmd.java | 22 - .../org/xukai/jvm/cmd/InvokeVirtualCmd.java | 22 - .../main/java/org/xukai/jvm/cmd/LdcCmd.java | 30 - .../java/org/xukai/jvm/cmd/NewObjectCmd.java | 20 - .../java/org/xukai/jvm/cmd/NoOperandCmd.java | 24 - .../java/org/xukai/jvm/cmd/OneOperandCmd.java | 28 - .../java/org/xukai/jvm/cmd/PutFieldCmd.java | 20 - .../java/org/xukai/jvm/cmd/TwoOperandCmd.java | 67 -- .../org/xukai/jvm/constant/ClassInfo.java | 7 +- .../org/xukai/jvm/constant/ConstantInfo.java | 19 - .../org/xukai/jvm/constant/ConstantPool.java | 2 +- .../org/xukai/jvm/constant/FieldRefInfo.java | 7 +- .../org/xukai/jvm/constant/MethodRefInfo.java | 7 +- .../xukai/jvm/constant/NameAndTypeInfo.java | 9 +- .../xukai/jvm/constant/NullConstantInfo.java | 7 +- .../org/xukai/jvm/constant/StringInfo.java | 7 +- .../java/org/xukai/jvm/constant/UTF8Info.java | 6 - .../java/org/xukai/jvm/method/Method.java | 13 +- .../org/xukai/jvm/print/ClassFilePrinter.java | 48 - .../xukai/jvm/print/ConstantPoolPrinter.java | 85 -- .../xukai/jvm/test/ClassFileloaderTest.java | 83 +- .../src/main/java/me/lzb/basic/InfixExpr.java | 161 ++++ .../main/java/me/lzb/basic/expr/CalUtil.java | 108 --- .../java/me/lzb/basic/expr/InfixExpr.java | 71 -- .../me/lzb/basic/expr/InfixToPostfix.java | 79 -- .../src/main/java/me/lzb/basic/expr/Node.java | 28 - .../java/me/lzb/basic/expr/PostfixExpr.java | 46 - .../java/me/lzb/basic/expr/PrefixExpr.java | 46 - .../lzb/basic/{expr => }/InfixExprTest.java | 2 +- .../me/lzb/basic/expr/InfixToPostfixTest.java | 42 - .../me/lzb/basic/expr/PostfixExprTest.java | 43 - .../me/lzb/basic/expr/PrefixExprTest.java | 47 - .../main/java/me/lzb/jvm/attr/CodeAttr.java | 13 +- .../main/java/me/lzb/jvm/clz/AccessFlag.java | 12 +- .../main/java/me/lzb/jvm/clz/ClassFile.java | 59 +- .../main/java/me/lzb/jvm/cmd/BiPushCmd.java | 21 - .../java/me/lzb/jvm/cmd/ByteCodeCommand.java | 124 --- .../main/java/me/lzb/jvm/cmd/GetFieldCmd.java | 20 - .../me/lzb/jvm/cmd/GetStaticFieldCmd.java | 19 - .../java/me/lzb/jvm/cmd/InvokeSpecialCmd.java | 21 - .../java/me/lzb/jvm/cmd/InvokeVirtualCmd.java | 19 - .../src/main/java/me/lzb/jvm/cmd/LdcCmd.java | 29 - .../java/me/lzb/jvm/cmd/NewObjectCmd.java | 19 - .../java/me/lzb/jvm/cmd/NoOperandCmd.java | 22 - .../java/me/lzb/jvm/cmd/OneOperandCmd.java | 29 - .../main/java/me/lzb/jvm/cmd/PutFieldCmd.java | 20 - .../java/me/lzb/jvm/cmd/TwoOperandCmd.java | 64 -- .../java/me/lzb/jvm/constant/ClassInfo.java | 7 - .../me/lzb/jvm/constant/ConstantInfo.java | 16 +- .../me/lzb/jvm/constant/FieldRefInfo.java | 7 - .../me/lzb/jvm/constant/MethodRefInfo.java | 7 - .../me/lzb/jvm/constant/NameAndTypeInfo.java | 7 - .../me/lzb/jvm/constant/NullConstantInfo.java | 7 - .../java/me/lzb/jvm/constant/StringInfo.java | 7 - .../java/me/lzb/jvm/constant/UTF8Info.java | 7 - .../me/lzb/jvm/loader/ClassFileParser.java | 8 +- .../java/me/lzb/jvm/loader/CommandParser.java | 188 ---- .../main/java/me/lzb/jvm/method/Method.java | 26 +- .../java/me/lzb/jvm/print/ClassPrinter.java | 36 - .../src/main/java/me/lzb/jvm/print/Print.java | 10 - .../java/me/lzb/jvm/print/PrintFormat.java | 57 -- .../java/me/lzb/jvm/print/PrintVisitor.java | 23 - .../java/me/lzb/jvm/ClassFileloaderTest.java | 95 +- .../basic/stack/expr/InfixExpr.java | 19 +- .../basic/stack/expr/InfixToPostfix.java | 67 -- .../basic/stack/expr/InfixToPostfixTest.java | 32 - .../basic/stack/expr/PostfixExpr.java | 35 - .../basic/stack/expr/PostfixExprTest.java | 41 - .../basic/stack/expr/PrefixExpr.java | 36 - .../basic/stack/expr/PrefixExprTest.java | 44 - .../coding2017/basic/stack/expr/Token.java | 64 -- .../basic/stack/expr/TokenParser.java | 57 -- .../basic/stack/expr/TokenParserTest.java | 41 - .../coding2017/minijvm/attr/CodeAttr.java | 32 +- .../minijvm/attr/LineNumberTable.java | 12 +- .../minijvm/attr/LocalVariableTable.java | 15 +- .../coding2017/minijvm/clz/ClassFile.java | 20 +- .../coding2017/minijvm/cmd/BiPushCmd.java | 21 - .../minijvm/cmd/ByteCodeCommand.java | 132 --- .../coding2017/minijvm/cmd/CommandParser.java | 143 --- .../coding2017/minijvm/cmd/GetFieldCmd.java | 21 - .../minijvm/cmd/GetStaticFieldCmd.java | 19 - .../minijvm/cmd/InvokeSpecialCmd.java | 21 - .../minijvm/cmd/InvokeVirtualCmd.java | 21 - .../coding2017/minijvm/cmd/LdcCmd.java | 29 - .../coding2017/minijvm/cmd/NewObjectCmd.java | 19 - .../coding2017/minijvm/cmd/NoOperandCmd.java | 23 - .../coding2017/minijvm/cmd/OneOperandCmd.java | 29 - .../coding2017/minijvm/cmd/PutFieldCmd.java | 19 - .../coding2017/minijvm/cmd/TwoOperandCmd.java | 67 -- .../minijvm/constant/ClassInfo.java | 4 - .../minijvm/constant/ConstantInfo.java | 11 - .../minijvm/constant/ConstantPool.java | 2 +- .../minijvm/constant/FieldRefInfo.java | 5 - .../minijvm/constant/MethodRefInfo.java | 5 - .../minijvm/constant/NameAndTypeInfo.java | 5 - .../minijvm/constant/NullConstantInfo.java | 4 - .../minijvm/constant/StringInfo.java | 6 - .../coding2017/minijvm/constant/UTF8Info.java | 4 - .../coding2017/minijvm/method/Method.java | 17 - .../minijvm/print/ClassFilePrinter.java | 47 - .../minijvm/print/ConstantPoolPrinter.java | 88 -- .../minijvm/test/ClassFileloaderTest.java | 77 -- .../basic/stack/expr/InfixExpr.java | 19 - .../basic/stack/expr/InfixExprTest.java | 52 - .../basic/stack/expr/InfixToPostfix.java | 37 - .../coding2017/basic/stack/expr/Operator.java | 42 - .../basic/stack/expr/PostfixExpr.java | 36 - .../basic/stack/expr/PostfixExprTest.java | 41 - .../basic/stack/expr/PrefixExpr.java | 25 - .../basic/stack/expr/PrefixExprTest.java | 45 - .../coding2017/basic/stack/expr/Token.java | 50 - .../basic/stack/expr/TokenParser.java | 58 -- .../basic/stack/expr/TokenParserTest.java | 39 - .../main/java/jvm/loader/ClassFileLoader.java | 57 -- .../src/main/java/jvm/loader/Directory.java | 81 -- .../java/jvm/test/ClassFileloaderTest.java | 83 -- .../src/main/java/jvm/test/EmployeeV1.java | 31 - .../donaldy/basic/expr/InfixToPostfix.java | 59 -- .../basic/expr/InfixToPostfixTest.java | 22 - .../com/donaldy/basic/expr/PostfixExpr.java | 67 -- .../donaldy/basic/expr/PostfixExprTest.java | 41 - .../com/donaldy/basic/expr/PrefixExpr.java | 69 -- .../donaldy/basic/expr/PrefixExprTest.java | 45 - .../src/com/donaldy/basic/expr/Token.java | 50 - .../com/donaldy/basic/expr/TokenParser.java | 57 -- .../donaldy/basic/expr/TokenParserTest.java | 41 - .../com/donaldy/basic/queue/CircleQueue.java | 74 -- .../donaldy/basic/queue/CircleQueueTest.java | 35 - .../src/com/donaldy/basic/queue/Josephus.java | 62 -- .../com/donaldy/basic/queue/JosephusTest.java | 27 - .../src/com/donaldy/basic/queue/Queue.java | 62 -- .../basic/queue/QueueWithTwoStacks.java | 68 -- .../basic/queue/QueueWithTwoStacksTest.java | 23 - .../src/com/donaldy/jvm/attr/CodeAttr.java | 102 +- .../donaldy/jvm/attr/LocalVariableTable.java | 23 +- .../src/com/donaldy/jvm/clz/ClassFile.java | 33 +- .../src/com/donaldy/jvm/cmd/BiPushCmd.java | 29 - .../com/donaldy/jvm/cmd/ByteCodeCommand.java | 130 --- .../com/donaldy/jvm/cmd/CommandParser.java | 158 ---- .../src/com/donaldy/jvm/cmd/GetFieldCmd.java | 28 - .../donaldy/jvm/cmd/GetStaticFieldCmd.java | 31 - .../com/donaldy/jvm/cmd/InvokeSpecialCmd.java | 29 - .../com/donaldy/jvm/cmd/InvokeVirtualCmd.java | 27 - .../src/com/donaldy/jvm/cmd/LdcCmd.java | 37 - .../src/com/donaldy/jvm/cmd/NewObjectCmd.java | 26 - .../src/com/donaldy/jvm/cmd/NoOperandCmd.java | 32 - .../com/donaldy/jvm/cmd/OneOperandCmd.java | 27 - .../src/com/donaldy/jvm/cmd/PutFieldCmd.java | 27 - .../com/donaldy/jvm/cmd/TwoOperandCmd.java | 67 -- .../com/donaldy/jvm/constant/ClassInfo.java | 4 - .../donaldy/jvm/constant/ConstantInfo.java | 11 - .../donaldy/jvm/constant/ConstantPool.java | 4 +- .../donaldy/jvm/constant/FieldRefInfo.java | 4 - .../donaldy/jvm/constant/MethodRefInfo.java | 5 - .../donaldy/jvm/constant/NameAndTypeInfo.java | 6 - .../jvm/constant/NullConstantInfo.java | 4 - .../com/donaldy/jvm/constant/StringInfo.java | 6 - .../com/donaldy/jvm/constant/UTF8Info.java | 5 - .../donaldy/jvm/engine/ExecutionResult.java | 56 -- .../donaldy/jvm/engine/ExecutorEngine.java | 35 - .../src/com/donaldy/jvm/engine/Heap.java | 39 - .../com/donaldy/jvm/engine/JavaObject.java | 71 -- .../com/donaldy/jvm/engine/MethodArea.java | 68 -- .../src/com/donaldy/jvm/engine/MiniJVM.java | 28 - .../com/donaldy/jvm/engine/StackFrame.java | 95 -- .../donaldy/jvm/loader/ClassFileLoader.java | 1 - .../src/com/donaldy/jvm/method/Method.java | 60 +- .../donaldy/jvm/print/ClassFilePrinter.java | 52 - .../jvm/print/ConstantPoolPrinter.java | 133 --- .../donaldy/jvm/test/ClassFileloaderTest.java | 88 -- group24/494800949/EmployeeV1-javap.txt | 164 ---- .../coderising/jvm/attr/AttributeInfo.java | 19 - .../src/com/coderising/jvm/attr/CodeAttr.java | 93 -- .../coderising/jvm/attr/LineNumberTable.java | 52 - .../jvm/attr/LocalVariableItem.java | 39 - .../jvm/attr/LocalVariableTable.java | 39 - .../coderising/jvm/attr/StackMapTable.java | 30 - .../src/com/coderising/jvm/clz/ClassFile.java | 66 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 21 - .../coderising/jvm/cmd/ByteCodeCommand.java | 127 --- .../com/coderising/jvm/cmd/CommandParser.java | 150 --- .../com/coderising/jvm/cmd/GetFieldCmd.java | 21 - .../coderising/jvm/cmd/GetStaticFieldCmd.java | 20 - .../coderising/jvm/cmd/InvokeSpecialCmd.java | 22 - .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 - .../src/com/coderising/jvm/cmd/LdcCmd.java | 30 - .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 - .../com/coderising/jvm/cmd/NoOperandCmd.java | 24 - .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 - .../com/coderising/jvm/cmd/PutFieldCmd.java | 20 - .../com/coderising/jvm/cmd/TwoOperandCmd.java | 63 -- .../coderising/jvm/constant/ClassInfo.java | 7 +- .../coderising/jvm/constant/ConstantInfo.java | 13 +- .../coderising/jvm/constant/FieldRefInfo.java | 9 +- .../jvm/constant/MethodRefInfo.java | 7 +- .../jvm/constant/NameAndTypeInfo.java | 9 +- .../jvm/constant/NullConstantInfo.java | 6 +- .../coderising/jvm/constant/StringInfo.java | 7 +- .../com/coderising/jvm/constant/UTF8Info.java | 6 - .../src/com/coderising/jvm/field/Field.java | 38 - .../jvm/loader/ByteCodeIterator.java | 31 +- .../jvm/loader/ClassFileParser.java | 31 +- .../src/com/coderising/jvm/method/Method.java | 69 -- .../jvm/print/ClassFilePrinter.java | 45 - .../jvm/print/ConstantPoolPrinter.java | 34 - .../coderising/jvm/print/SimpleVistor.java | 56 -- .../src/main/java/com/coding/weak1/Stack.java | 2 - .../java/com/coding/week6/expr/InfixExpr.java | 127 --- .../java/com/coding/week6/expr/Token.java | 52 - .../com/coding/week6/exprNew/InfixExpr.java | 57 -- .../com/coding/week6/exprNew/Operator.java | 75 -- .../java/com/coding/week6/exprNew/Token.java | 63 -- .../com/coding/week6/exprNew/TokenParser.java | 60 -- .../java/com/coding/week7/InfixToPostfix.java | 69 -- .../java/com/coding/week7/PostfixExpr.java | 39 - .../java/com/coding/week7/PrefixExpr.java | 43 - .../mini_jvm/test/ClassFileloaderTest.java | 163 +--- .../coding/week6/expr/InfixExprTestTest.java | 77 -- .../week6/exprNew/InfixExprTestTest.java | 78 -- .../coding/week6/exprNew/TokenParserTest.java | 18 - .../com/coding/week7/InfixToPostfixTest.java | 34 - .../com/coding/week7/PostfixExprTest.java | 41 - .../java/com/coding/week7/PrefixExprTest.java | 45 - .../java/basic/dataStructure/ArrayList.java | 115 --- .../java/basic/dataStructure/ArrayUtil.java | 245 ----- .../basic/dataStructure/BinaryTreeNode.java | 58 -- .../java/basic/dataStructure/LinkedList.java | 341 ------- .../main/java/basic/dataStructure/List.java | 12 - .../main/java/basic/dataStructure/Queue.java | 72 -- .../main/java/basic/dataStructure/Stack.java | 41 - .../java/basic/liteStruts/LoginAction.java | 39 - .../main/java/basic/liteStruts/ReadXML.java | 28 - .../main/java/basic/liteStruts/Struts.java | 78 -- .../src/main/java/basic/liteStruts/View.java | 23 - .../src/main/java/miniJVM/Demo.java | 7 - .../java/thread/download/DownloadThread.java | 39 - .../java/thread/download/FileDownloader.java | 106 --- .../java/thread/download/api/Connection.java | 23 - .../download/api/ConnectionException.java | 8 - .../download/api/ConnectionManager.java | 10 - .../thread/download/api/DownloadListener.java | 5 - .../thread/download/impl/ConnectionImpl.java | 93 -- .../download/impl/ConnectionManagerImpl.java | 20 - .../java/data_structure/ArrayListTest.java | 69 -- .../java/data_structure/ArrayUtilTest.java | 67 -- .../data_structure/BinaryNodeTreeTest.java | 29 - .../java/data_structure/LinkedListTest.java | 151 --- .../test/java/data_structure/QueueTest.java | 50 - .../test/java/data_structure/StackTest.java | 49 - .../java/download/FileDownloaderTest.java | 54 -- .../src/test/java/liteStruts/StrutsTest.java | 42 - group24/Homework/1-FirstWeek/ArrayList.java | 35 - group24/Homework/1-FirstWeek/Iterator.java | 7 - group24/Homework/1-FirstWeek/LinkedList.java | 125 --- group24/Homework/1-FirstWeek/Queue.java | 61 -- group24/Homework/1-FirstWeek/Stack.java | 24 - .../2-SecondWeek/litestruts/LoginAction.java | 39 - .../2-SecondWeek/litestruts/Struts.java | 34 - .../2-SecondWeek/litestruts/StrutsTest.java | 43 - .../2-SecondWeek/litestruts/View.java | 23 - group24/Homework/3-ThirdWeek/LinkedList.java | 125 --- .../3-ThirdWeek/download/DownloadThread.java | 20 - .../3-ThirdWeek/download/FileDownloader.java | 73 -- .../download/FileDownloaderTest.java | 59 -- .../3-ThirdWeek/download/api/Connection.java | 23 - .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 27 - .../download/impl/ConnectionManagerImpl.java | 15 - group24/Homework/4-FourWeek/LRUPageFrame.java | 57 -- .../Homework/4-FourWeek/LRUPageFrameTest.java | 34 - .../jvm/loader/ClassFileLoader .java | 25 - .../jvm/test/ClassFileloaderTest.java | 92 -- .../4-FourWeek/jvm/test/EmployeeV1.java | 0 group24/Homework/5-FifthWeek/README.txt | 3 - group24/Homework/5-FifthWeek/StackUtil.java | 48 - .../Homework/5-FifthWeek/StackUtilTest.java | 65 -- .../5-FifthWeek/jvm/clz/AccessFlag.java | 23 - .../5-FifthWeek/jvm/clz/ClassFile .java | 58 -- .../5-FifthWeek/jvm/clz/ClassIndex.java | 17 - .../5-FifthWeek/jvm/constant/ClassInfo.java | 28 - .../jvm/constant/ConstantInfo.java | 40 - .../jvm/constant/ConstantPool.java | 31 - .../jvm/constant/FieldRefInfo.java | 58 -- .../jvm/constant/MethodRefInfo.java | 60 -- .../jvm/constant/NameAndTypeInfo.java | 51 - .../jvm/constant/NullConstantInfo.java | 17 - .../5-FifthWeek/jvm/constant/StringInfo.java | 32 - .../5-FifthWeek/jvm/constant/UTF8Info.java | 37 - .../jvm/loader/ByteCodeIterator.java | 18 - .../jvm/loader/ClassFileLoader.java | 62 -- .../jvm/loader/ClassFileParser.java | 62 -- .../jvm/test/ClassFileloaderTest.java | 208 ---- .../5-FifthWeek/jvm/test/EmployeeV1.java | 28 - .../Homework/5-FifthWeek/jvm/util/Util.java | 24 - group24/Homework/6-SixWeek/InfixExpr.java | 15 - group24/Homework/6-SixWeek/InfixExprTest.java | 52 - group24/Homework/6-SixWeek/README.txt | 3 - .../6-SixWeek/jvm/attr/AttributeInfo.java | 19 - .../Homework/6-SixWeek/jvm/attr/CodeAttr.java | 70 -- .../6-SixWeek/jvm/attr/LineNumberTable.java | 55 -- .../6-SixWeek/jvm/attr/LocalVariableItem.java | 39 - .../jvm/attr/LocalVariableTable.java | 42 - .../6-SixWeek/jvm/attr/StackMapTable.java | 30 - .../6-SixWeek/jvm/clz/AccessFlag.java | 25 - .../Homework/6-SixWeek/jvm/clz/ClassFile.java | 102 -- .../6-SixWeek/jvm/clz/ClassIndex.java | 19 - .../6-SixWeek/jvm/constant/ClassInfo.java | 28 - .../6-SixWeek/jvm/constant/ConstantInfo.java | 40 - .../6-SixWeek/jvm/constant/ConstantPool.java | 31 - .../6-SixWeek/jvm/constant/FieldRefInfo.java | 58 -- .../6-SixWeek/jvm/constant/MethodRefInfo.java | 60 -- .../jvm/constant/NameAndTypeInfo.java | 51 - .../jvm/constant/NullConstantInfo.java | 17 - .../6-SixWeek/jvm/constant/StringInfo.java | 32 - .../6-SixWeek/jvm/constant/UTF8Info.java | 37 - .../Homework/6-SixWeek/jvm/field/Field.java | 50 - .../jvm/loader/ByteCodeIterator.java | 57 -- .../6-SixWeek/jvm/loader/ClassFileLoader.java | 140 --- .../6-SixWeek/jvm/loader/ClassFileParser.java | 62 -- .../Homework/6-SixWeek/jvm/method/Method.java | 80 -- .../jvm/test/ClassFileloaderTest.java | 282 ------ .../6-SixWeek/jvm/test/EmployeeV1.java | 28 - group24/Homework/6-SixWeek/jvm/util/Util.java | 24 - .../Homework/7-SevenWeek/InfixToPostfix.java | 14 - group24/Homework/7-SevenWeek/PostfixExpr.java | 18 - .../Homework/7-SevenWeek/PostfixExprTest.java | 41 - group24/Homework/7-SevenWeek/README.txt | 4 - .../7-SevenWeek/jvm/attr/AttributeInfo.java | 19 - .../7-SevenWeek/jvm/attr/CodeAttr.java | 70 -- .../7-SevenWeek/jvm/attr/LineNumberTable.java | 55 -- .../jvm/attr/LocalVariableItem.java | 39 - .../jvm/attr/LocalVariableTable.java | 42 - .../7-SevenWeek/jvm/attr/StackMapTable.java | 30 - .../7-SevenWeek/jvm/clz/AccessFlag.java | 25 - .../7-SevenWeek/jvm/clz/ClassFile.java | 102 -- .../7-SevenWeek/jvm/clz/ClassIndex.java | 19 - .../7-SevenWeek/jvm/cmd/BiPushCmd.java | 23 - .../7-SevenWeek/jvm/cmd/ByteCodeCommand.java | 128 --- .../7-SevenWeek/jvm/cmd/CommandParser.java | 85 -- .../7-SevenWeek/jvm/cmd/GetFieldCmd.java | 22 - .../jvm/cmd/GetStaticFieldCmd.java | 23 - .../7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java | 23 - .../7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java | 22 - .../Homework/7-SevenWeek/jvm/cmd/LdcCmd.java | 29 - .../7-SevenWeek/jvm/cmd/NewObjectCmd.java | 19 - .../7-SevenWeek/jvm/cmd/NoOperandCmd.java | 23 - .../7-SevenWeek/jvm/cmd/OneOperandCmd.java | 27 - .../7-SevenWeek/jvm/cmd/PutFieldCmd.java | 19 - .../7-SevenWeek/jvm/cmd/TwoOperandCmd.java | 67 -- .../7-SevenWeek/jvm/constant/ClassInfo.java | 28 - .../jvm/constant/ConstantInfo.java | 40 - .../jvm/constant/ConstantPool.java | 31 - .../jvm/constant/FieldRefInfo.java | 58 -- .../jvm/constant/MethodRefInfo.java | 60 -- .../jvm/constant/NameAndTypeInfo.java | 51 - .../jvm/constant/NullConstantInfo.java | 17 - .../7-SevenWeek/jvm/constant/StringInfo.java | 32 - .../7-SevenWeek/jvm/constant/UTF8Info.java | 37 - .../Homework/7-SevenWeek/jvm/field/Field.java | 50 - .../jvm/loader/ByteCodeIterator.java | 57 -- .../jvm/loader/ClassFileLoader.java | 140 --- .../jvm/loader/ClassFileParser.java | 62 -- .../7-SevenWeek/jvm/method/Method.java | 80 -- .../jvm/print/ClassFilePrinter.java | 54 -- .../jvm/print/ConstantPoolPrinter.java | 25 - .../jvm/test/ClassFileloaderTest.java | 354 ------- .../7-SevenWeek/jvm/test/EmployeeV1.java | 28 - .../Homework/7-SevenWeek/jvm/util/Util.java | 24 - .../8-EighthWeek/attr/AttributeInfo.java | 19 - .../Homework/8-EighthWeek/attr/CodeAttr.java | 70 -- .../8-EighthWeek/attr/LineNumberTable.java | 55 -- .../8-EighthWeek/attr/LocalVariableItem.java | 39 - .../8-EighthWeek/attr/LocalVariableTable.java | 42 - .../8-EighthWeek/attr/StackMapTable.java | 30 - .../Homework/8-EighthWeek/clz/AccessFlag.java | 25 - .../Homework/8-EighthWeek/clz/ClassFile.java | 102 -- .../Homework/8-EighthWeek/clz/ClassIndex.java | 19 - .../Homework/8-EighthWeek/cmd/BiPushCmd.java | 31 - .../8-EighthWeek/cmd/ByteCodeCommand.java | 130 --- .../8-EighthWeek/cmd/CommandParser.java | 85 -- .../8-EighthWeek/cmd/GetFieldCmd.java | 30 - .../8-EighthWeek/cmd/GetStaticFieldCmd.java | 31 - .../8-EighthWeek/cmd/InvokeSpecialCmd.java | 31 - .../8-EighthWeek/cmd/InvokeVirtualCmd.java | 29 - group24/Homework/8-EighthWeek/cmd/LdcCmd.java | 37 - .../8-EighthWeek/cmd/NewObjectCmd.java | 27 - .../8-EighthWeek/cmd/NoOperandCmd.java | 31 - .../8-EighthWeek/cmd/OneOperandCmd.java | 27 - .../8-EighthWeek/cmd/PutFieldCmd.java | 27 - .../8-EighthWeek/cmd/TwoOperandCmd.java | 67 -- .../8-EighthWeek/constant/ClassInfo.java | 28 - .../8-EighthWeek/constant/ConstantInfo.java | 40 - .../8-EighthWeek/constant/ConstantPool.java | 31 - .../8-EighthWeek/constant/FieldRefInfo.java | 58 -- .../8-EighthWeek/constant/MethodRefInfo.java | 60 -- .../constant/NameAndTypeInfo.java | 51 - .../constant/NullConstantInfo.java | 17 - .../8-EighthWeek/constant/StringInfo.java | 32 - .../8-EighthWeek/constant/UTF8Info.java | 37 - .../8-EighthWeek/engine/ExecutionResult.java | 56 -- .../8-EighthWeek/engine/ExecutorEngine.java | 35 - .../Homework/8-EighthWeek/engine/Heap.java | 39 - .../8-EighthWeek/engine/JavaObject.java | 71 -- .../8-EighthWeek/engine/MethodArea.java | 68 -- .../Homework/8-EighthWeek/engine/MiniJVM.java | 28 - .../8-EighthWeek/engine/StackFrame.java | 95 -- .../Homework/8-EighthWeek/field/Field.java | 50 - .../8-EighthWeek/loader/ByteCodeIterator.java | 57 -- .../8-EighthWeek/loader/ClassFileLoader.java | 140 --- .../8-EighthWeek/loader/ClassFileParser.java | 62 -- .../Homework/8-EighthWeek/method/Method.java | 80 -- .../8-EighthWeek/print/ClassFilePrinter.java | 54 -- .../print/ConstantPoolPrinter.java | 25 - .../test/ClassFileloaderTest.java | 354 ------- .../8-EighthWeek/test/EmployeeV1.java | 28 - group24/Homework/8-EighthWeek/util/Util.java | 24 - group27/383117348/.classpath | 3 +- .../com/coding/basic/queue/CircleQueue.java | 5 - .../com/coding/basic/queue/Josephus.java | 42 - .../com/coding/basic/queue/JosephusTest.java | 26 - .../basic/queue/QueueWithTwoStacks.java | 38 - .../coding/basic/stack/expr/InfixExpr.java | 181 ---- .../basic/stack/expr/InfixExprTest.java | 46 - .../basic/stack/expr/InfixToPostfix.java | 59 -- .../basic/stack/expr/InfixToPrevfix.java | 54 -- .../coding/basic/stack/expr/PostfixExpr.java | 55 -- .../basic/stack/expr/PostfixExprTest.java | 36 - .../coding/basic/stack/expr/PrefixExpr.java | 49 - .../basic/stack/expr/PrefixExprTest.java | 44 - .../com/coding/basic/stack/expr/Token.java | 49 - .../coding/basic/stack/expr/TokenParser.java | 56 -- .../basic/stack/expr/TokenParserTest.java | 40 - .../coderising/jvm/attr/AttributeInfo.java | 17 - .../com/coderising/jvm/attr/CodeAttr.java | 108 --- .../coderising/jvm/attr/LineNumberTable.java | 70 -- .../jvm/attr/LocalVariableItem.java | 39 - .../jvm/attr/LocalVariableTable.java | 54 -- .../coderising/jvm/attr/StackMapTable.java | 29 - .../com/coderising/jvm/clz/ClassFile.java | 124 --- .../com/coderising/jvm/cmd/BiPushCmd.java | 23 - .../coderising/jvm/cmd/ByteCodeCommand.java | 128 --- .../com/coderising/jvm/cmd/CommandParser.java | 144 --- .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 - .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 - .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 - .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 - .../com/coderising/jvm/cmd/LdcCmd.java | 29 - .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 - .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 - .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 - .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 - .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 -- .../com/coderising/jvm/field/Field.java | 42 - .../com/coderising/jvm/method/Method.java | 76 -- .../jvm/print/ClassFilePrinter.java | 54 -- .../jvm/print/ConstantPoolPrinter.java | 25 - .../jvm/test/ClassFileloaderTest.java | 353 ------- .../coderising/download/DownloadThread.java | 0 .../coderising/download/FileDownloader.java | 0 .../download/FileDownloaderTest.java | 0 .../coderising/download/api/Connection.java | 0 .../download/api/ConnectionException.java | 0 .../download/api/ConnectionManager.java | 0 .../download/api/DownloadListener.java | 0 .../download/impl/ConnectionImpl.java | 0 .../download/impl/ConnectionManagerImpl.java | 0 .../com/coderising/jvm/clz/AccessFlag.java | 0 .../src/com/coderising/jvm/clz/ClassFile.java | 150 +-- .../com/coderising/jvm/clz/ClassIndex.java | 0 .../coderising/jvm/constant/ClassInfo.java | 0 .../coderising/jvm/constant/ConstantInfo.java | 0 .../coderising/jvm/constant/ConstantPool.java | 0 .../coderising/jvm/constant/FieldRefInfo.java | 0 .../coderising/jvm/constant/FloatInfo.java | 0 .../coderising/jvm/constant/IntegerInfo.java | 0 .../jvm/constant/MethodRefInfo.java | 0 .../jvm/constant/NameAndTypeInfo.java | 0 .../jvm/constant/NullConstantInfo.java | 0 .../coderising/jvm/constant/StringInfo.java | 0 .../com/coderising/jvm/constant/UTF8Info.java | 0 .../jvm/loader/ByteCodeIterator.java | 16 - .../jvm/loader/ClassFileLoader.java | 0 .../jvm/loader/ClassFileLoader_backup.java | 0 .../jvm/loader/ClassFileParser.java | 45 +- .../jvm/test/ClassFileloaderTest.java | 401 ++++---- .../com/coderising/jvm/test/EmployeeV1.java | 0 .../com/coderising/jvm/util/Util.java | 0 .../coderising/litestruts/LoginAction.java | 0 .../com/coderising/litestruts/Struts.java | 0 .../com/coderising/litestruts/StrutsTest.java | 0 .../com/coderising/litestruts/View.java | 0 .../com/coderising/litestruts/struts.xml | 0 .../com/coding/basic/BinaryTreeNode.java | 0 .../src}/com/coding/basic/Iterator.java | 14 +- .../com/coding/basic/List.java | 0 .../queue => src/com/coding/basic}/Queue.java | 2 +- .../com/coding/basic/array/ArrayList.java | 0 .../com/coding/basic/array/ArrayUtil.java | 0 .../coding/basic/linklist/LRUPageFrame.java | 0 .../basic/linklist/LRUPageFrameTest.java | 0 .../com/coding/basic/linklist/LinkedList.java | 0 .../com/coding/basic/stack/Stack.java | 0 .../com/coding/basic/stack/StackUtil.java | 0 .../basic/stack/test/StackUtilTest.java | 0 .../coding/basic/{array => }/ArrayList.java | 6 +- .../src/com/coding/basic}/List.java | 18 +- .../src/com/coding/basic/Stack.java | 65 ++ .../src/com/coding/basic/array/List.java | 9 - .../com/coding/basic/linklist/LinkedList.java | 2 +- .../src/com/coding/basic/stack/Stack.java | 4 +- .../src/com/coding/basic/stack/StackUtil.java | 26 +- .../com/coding/basic/stack/StackUtilTest.java | 76 -- .../coding/basic/stack/expr/InfixExpr.java | 98 -- .../basic/stack/expr/InfixExprTest.java | 57 -- .../basic/stack/expr/InfixToPostfix.java | 57 -- .../coding/basic/stack/expr/PostfixExpr.java | 51 - .../basic/stack/expr/PostfixExprTest.java | 41 - .../coding/basic/stack/expr/PrefixExpr.java | 18 - .../basic/stack/expr/PrefixExprTest.java | 45 - .../com/coding/basic/stack/expr/Token.java | 50 - .../coding/basic/stack/expr/TokenParser.java | 57 -- .../basic/stack/expr/TokenParserTest.java | 41 - .../coderising/jvm/attr/AttributeInfo.java | 19 - .../src/com/coderising/jvm/attr/CodeAttr.java | 108 --- .../coderising/jvm/attr/LineNumberTable.java | 67 -- .../jvm/attr/LocalVariableItem.java | 39 - .../jvm/attr/LocalVariableTable.java | 58 -- .../coderising/jvm/attr/StackMapTable.java | 30 - .../src/com/coderising/jvm/clz/ClassFile.java | 35 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 - .../coderising/jvm/cmd/ByteCodeCommand.java | 128 --- .../com/coderising/jvm/cmd/CommandParser.java | 85 -- .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 - .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 - .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 - .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 - .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 - .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 - .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 - .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 - .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 - .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 -- .../coderising/jvm/constant/ClassInfo.java | 4 - .../coderising/jvm/constant/ConstantInfo.java | 16 +- .../coderising/jvm/constant/ConstantPool.java | 4 +- .../coderising/jvm/constant/FieldRefInfo.java | 4 - .../jvm/constant/MethodRefInfo.java | 8 +- .../jvm/constant/NameAndTypeInfo.java | 6 - .../jvm/constant/NullConstantInfo.java | 4 - .../coderising/jvm/constant/StringInfo.java | 6 - .../com/coderising/jvm/constant/UTF8Info.java | 5 - .../src/com/coderising/jvm/field/Field.java | 47 - .../jvm/loader/ByteCodeIterator.java | 44 +- .../jvm/loader/ClassFileParser.java | 32 - .../src/com/coderising/jvm/method/Method.java | 98 -- .../jvm/print/ClassFilePrinter.java | 45 - .../jvm/print/ConstantPoolPrinter.java | 83 -- .../jvm/test/ClassFileloaderTest.java | 167 +--- .../coding/basic/stack/expr/InfixExpr.java | 22 +- .../basic/stack/expr/InfixToPostfix.java | 50 +- .../basic/stack/expr/InfixToPostfixTest.java | 41 - .../com/coderising/jvm/test/MiniJVMTest.java | 28 - 1296 files changed, 6100 insertions(+), 61104 deletions(-) delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrameTest.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LinkedList.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/CircleQueue.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/QueueWithTwoStacks.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackUtil.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExpr.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExprTest.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExpr.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LineNumberTable.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/test.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ClassFilePrinter.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ConstantPoolPrinter.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/test/ClassFileloaderTest.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java delete mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java delete mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java rename group02/812350401/src/main/{resources/struts => java/com/github/miniyk2012/coding2017/coderising/litestruts}/struts.xml (100%) delete mode 100644 group02/812350401/src/main/resources/jvm/com/github/miniyk2012/coding2017/jvm/test/EmployeeV1.class rename group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/{stack => }/StackTest.java (86%) delete mode 100644 group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/stack/StackUtilTest.java delete mode 100644 group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java rename group12/2258659044/zj-2017/src/com/coderising/jvm/{util/Util.java => loader/ClassFileLoaderUtil.java} (69%) delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java delete mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Stack.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java rename {group17/102228177/work3_26/src/com/coderising/jvm/test => group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader}/ClassFileloaderTest.java (79%) rename {group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test => group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader}/EmployeeV1.java (88%) rename group12/2258659044/zj-2017/src/test/com/coding/basic/{stack => }/StackTest.java (82%) delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java delete mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java delete mode 100644 group12/247565311/week567_miniJVM/attr/AttrFactory.java delete mode 100644 group12/247565311/week567_miniJVM/constant/InfoFactory.java rename group12/247565311/week567_miniJVM/{loader => test}/ClassFileLoaderTest.java (93%) delete mode 100644 group12/382266293/coding/basic/stack/expr/InfixExprS.java delete mode 100644 group12/382266293/coding/basic/stack/expr/InfixToPostfix.java delete mode 100644 group12/382266293/coding/basic/stack/expr/PostfixExpr.java delete mode 100644 group12/382266293/coding/basic/stack/expr/PostfixExprTest.java delete mode 100644 group12/382266293/coding/basic/stack/expr/PrefixExpr.java delete mode 100644 group12/382266293/coding/basic/stack/expr/PrefixExprTest.java delete mode 100644 group12/382266293/coding/basic/stack/expr/TParser.java delete mode 100644 group12/382266293/coding/basic/stack/expr/Token.java delete mode 100644 group12/382266293/coding/basic/stack/expr/TokenParser.java delete mode 100644 group12/382266293/coding/basic/stack/expr/TokenParserTest.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java delete mode 100644 group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java delete mode 100644 group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java delete mode 100644 group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java delete mode 100644 group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group12/446031103/src/com/coderising/jvm/field/Field.java delete mode 100644 group12/446031103/src/com/coderising/jvm/method/Method.java delete mode 100644 group12/446031103/src/com/datastructure/stack/StackUtilTest.java delete mode 100644 group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java delete mode 100644 group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java delete mode 100644 group15/1507_977996067/src/task7/expr/InfixExpr.java delete mode 100644 group15/1507_977996067/src/task7/expr/InfixExprTest.java delete mode 100644 group15/1507_977996067/src/task7/expr/PostfixExpr.java delete mode 100644 group15/1507_977996067/src/task7/expr/PostfixExprTest.java delete mode 100644 group15/1507_977996067/src/task7/expr/PrefixExpr.java delete mode 100644 group15/1507_977996067/src/task7/expr/PrefixExprTest.java delete mode 100644 group15/1507_977996067/src/task7/expr/Token.java delete mode 100644 group15/1507_977996067/src/task7/expr/TokenParser.java delete mode 100644 group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java delete mode 100644 group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java delete mode 100644 group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java delete mode 100644 group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java delete mode 100644 group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java delete mode 100644 group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java delete mode 100644 group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java delete mode 100644 group15/1507_977996067/src/task7/jvm/clz/ClassFile.java delete mode 100644 group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/StringInfo.java delete mode 100644 group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java delete mode 100644 group15/1507_977996067/src/task7/jvm/field/Field.java delete mode 100644 group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java delete mode 100644 group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java delete mode 100644 group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java delete mode 100644 group15/1507_977996067/src/task7/jvm/method/Method.java delete mode 100644 group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java delete mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java delete mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java delete mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java delete mode 100644 group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java delete mode 100644 group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java delete mode 100644 group15/1507_977996067/src/task7/jvm/util/Util.java delete mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrame.java delete mode 100644 group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/AccessFlag.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassIndex.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ClassInfo.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ConstantPool.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java delete mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/ArrayList.java delete mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java delete mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/List.java delete mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java delete mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java delete mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/method/Method.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/ArrayList.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/List.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Token.java delete mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java delete mode 100644 group17/1158154002/src/test04/loader/ClassFileLoader.java delete mode 100644 group17/1158154002/src/test04/loader/ClassFileloaderTest.java delete mode 100644 group17/1158154002/src/test04/loader/EmployeeV1.java delete mode 100644 group17/1158154002/src/test04/lru/LRUPageFrame.java delete mode 100644 group17/1158154002/src/test04/lru/LRUPageFrameTest.java delete mode 100644 group17/1158154002/src/test05/stack/Stack.java delete mode 100644 group17/1158154002/src/test05/stack/StackTest.java delete mode 100644 group17/1158154002/src/test05/stack/StackUtil.java delete mode 100644 group17/1158154002/src/test06/expr/InfixExpr.java delete mode 100644 group17/1158154002/src/test06/expr/InfixExprTest.java delete mode 100644 group17/1158154002/src/test07/expr/InfixToPostfix.java delete mode 100644 group17/1158154002/src/test07/expr/InfixToPostfixTest.java delete mode 100644 group17/1158154002/src/test07/expr/PostfixExpr.java delete mode 100644 group17/1158154002/src/test07/expr/PostfixExprTest.java delete mode 100644 group17/1158154002/src/test07/expr/PrefixExpr.java delete mode 100644 group17/1158154002/src/test07/expr/PrefixExprTest.java delete mode 100644 group17/1158154002/src/test07/expr/Token.java delete mode 100644 group17/1158154002/src/test07/expr/TokenParser.java delete mode 100644 group17/1158154002/src/test07/expr/TokenParserTest.java create mode 100644 group17/1204187480/code/homework/basic/pom.xml rename group17/1204187480/code/homework/{coding/src/main/java/com/coding/basic/array => basic/src/main/java/com/coding/basic}/ArrayList.java (95%) rename {group24/Homework/1-FirstWeek => group17/1204187480/code/homework/basic/src/main/java/com/coding/basic}/BinaryTreeNode.java (94%) rename {group27/383117348/data-structure => group17/1204187480/code/homework/basic/src/main/java}/com/coding/basic/Iterator.java (100%) rename group17/1204187480/code/homework/{coding/src/main/java/com/coding/basic/linklist => basic/src/main/java/com/coding/basic}/LinkedList.java (98%) rename group17/1204187480/code/homework/{coding => basic}/src/main/java/com/coding/basic/List.java (95%) rename group17/1204187480/code/homework/{coding => basic}/src/main/java/com/coding/basic/Queue.java (87%) rename group17/1204187480/code/homework/{coding => basic}/src/main/java/com/coding/basic/Stack.java (93%) rename group17/1204187480/code/homework/{coding => basic}/src/test/java/com/coding/api/ArraysTest.java (95%) rename group17/1204187480/code/homework/{coding => basic}/src/test/java/com/coding/api/SystemTest.java (95%) rename group17/1204187480/code/homework/{coding => basic}/src/test/java/com/coding/basic/ArrayListTest.java (93%) rename group17/1204187480/code/homework/{coding => basic}/src/test/java/com/coding/basic/LinkedListTest.java (96%) rename group17/1204187480/code/homework/{coding/src/main/java/com/coding/basic => coderising/src/main/java/com/coderising}/array/ArrayUtil.java (99%) delete mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java rename group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/{ => action}/LoginAction.java (95%) delete mode 100644 group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java delete mode 100644 group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java delete mode 100644 group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java delete mode 100644 group17/1204187480/note/todo/homework.md rename group17/1264835468/src/assignment/{Queue.java => MyQueue.java} (95%) create mode 100644 group17/1264835468/src/assignment/MyStack.java delete mode 100644 group17/1264835468/src/assignment/Stack.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java delete mode 100644 group17/1264835468/src/assignment0326/jvm/util/Util.java create mode 100644 group17/1264835468/src/assignment0326/lru/Clock.java delete mode 100644 group17/1264835468/src/assignment0405/StackUtil.java delete mode 100644 group17/1264835468/src/assignment0405/StackUtilTest.java delete mode 100644 group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/attr/InvalidAttributeInfoException.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/field/Field.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/method/InvalidMethodInfoException.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/method/Method.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/test/ByteCodeIteratorTest.java mode change 100755 => 100644 group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java delete mode 100755 group17/1282579502/src/com/coderising/jvm/util/Util.java delete mode 100755 group17/1282579502/src/com/coding/basic/stack/Stack.java delete mode 100755 group17/1282579502/src/com/coding/basic/stack/StackUtil.java delete mode 100644 group17/1282579502/src/com/coding/basic/stack/expr/InfixExpr.java delete mode 100644 group17/1282579502/src/com/coding/basic/stack/expr/InfixExprTest.java delete mode 100644 group17/785396327/4.16/cmd/BiPushCmd.java delete mode 100644 group17/785396327/4.16/cmd/ByteCodeCommand.java delete mode 100644 group17/785396327/4.16/cmd/CommandParser.java delete mode 100644 group17/785396327/4.16/cmd/GetFieldCmd.java delete mode 100644 group17/785396327/4.16/cmd/GetStaticFieldCmd.java delete mode 100644 group17/785396327/4.16/cmd/InvokeSpecialCmd.java delete mode 100644 group17/785396327/4.16/cmd/InvokeVirtualCmd.java delete mode 100644 group17/785396327/4.16/cmd/LdcCmd.java delete mode 100644 group17/785396327/4.16/cmd/NewObjectCmd.java delete mode 100644 group17/785396327/4.16/cmd/NoOperandCmd.java delete mode 100644 group17/785396327/4.16/cmd/OneOperandCmd.java delete mode 100644 group17/785396327/4.16/cmd/PutFieldCmd.java delete mode 100644 group17/785396327/4.16/cmd/TwoOperandCmd.java delete mode 100644 group17/785396327/4.16/print/ClassFilePrinter.java delete mode 100644 group17/785396327/4.16/print/ConstantPoolPrinter.java delete mode 100644 group17/785396327/4.23/engine/ExecutionResult.java delete mode 100644 group17/785396327/4.23/engine/ExecutorEngine.java delete mode 100644 group17/785396327/4.23/engine/FrameResult.java delete mode 100644 group17/785396327/4.23/engine/Heap.java delete mode 100644 group17/785396327/4.23/engine/JavaObject.java delete mode 100644 group17/785396327/4.23/engine/MethodArea.java delete mode 100644 group17/785396327/4.23/engine/MiniJVM.java delete mode 100644 group17/785396327/4.23/engine/StackFrame.java delete mode 100644 group17/785396327/4.23/queue/CircleQueue.java delete mode 100644 group17/785396327/4.23/queue/CircleQueueTest.java delete mode 100644 group17/785396327/4.23/queue/Josephus.java delete mode 100644 group17/785396327/4.23/queue/JosephusTest.java delete mode 100644 group17/785396327/4.23/queue/QueueWithTwoStacks.java delete mode 100644 group17/785396327/4.23/queue/QueueWithTwoStacksTest.java delete mode 100644 group17/785396327/4.5/clz/AccessFlag.java delete mode 100644 group17/785396327/4.5/clz/ClassFile.java delete mode 100644 group17/785396327/4.5/clz/ClassIndex.java delete mode 100644 group17/785396327/4.5/constant/ClassInfo.java delete mode 100644 group17/785396327/4.5/constant/ConstantInfo.java delete mode 100644 group17/785396327/4.5/constant/ConstantPool.java delete mode 100644 group17/785396327/4.5/constant/FieldRefInfo.java delete mode 100644 group17/785396327/4.5/constant/MethodRefInfo.java delete mode 100644 group17/785396327/4.5/constant/NameAndTypeInfo.java delete mode 100644 group17/785396327/4.5/constant/NullConstantInfo.java delete mode 100644 group17/785396327/4.5/constant/StringInfo.java delete mode 100644 group17/785396327/4.5/constant/UTF8Info.java delete mode 100644 group17/785396327/4.5/iterator/ByteCodeIterator.java delete mode 100644 group17/785396327/4.5/parse/ClassFilePaser.java delete mode 100644 group17/785396327/4.5/stack/MyStack.java delete mode 100644 group17/785396327/4.5/stack/StackUtil.java delete mode 100644 group17/785396327/4.5/stack/StackUtilTest.java delete mode 100644 group17/785396327/4.5/test/ClassFileloaderTest.java delete mode 100644 group17/785396327/4.5/util/Util.java delete mode 100644 group17/785396327/4.9/attr/AttributeInfo.java delete mode 100644 group17/785396327/4.9/attr/CodeAttr.java delete mode 100644 group17/785396327/4.9/attr/LineNumberTable.java delete mode 100644 group17/785396327/4.9/attr/LocalVariableItem.java delete mode 100644 group17/785396327/4.9/attr/LocalVariableTable.java delete mode 100644 group17/785396327/4.9/attr/StackMapTable.java delete mode 100644 group17/785396327/4.9/expr/ExprParser.java delete mode 100644 group17/785396327/4.9/expr/InfixExpr.java delete mode 100644 group17/785396327/4.9/expr/InfixExprTest.java delete mode 100644 group17/785396327/4.9/expr/InfixToPostfix.java delete mode 100644 group17/785396327/4.9/expr/InfixToPostfixTest.java delete mode 100644 group17/785396327/4.9/expr/OperEnum.java delete mode 100644 group17/785396327/4.9/expr/PostfixExpr.java delete mode 100644 group17/785396327/4.9/expr/PostfixExprTest.java delete mode 100644 group17/785396327/4.9/expr/PrefixExpr.java delete mode 100644 group17/785396327/4.9/expr/PrefixExprTest.java delete mode 100644 group17/785396327/4.9/expr/Token.java delete mode 100644 group17/785396327/4.9/expr/TokenParser.java delete mode 100644 group17/785396327/4.9/expr/TokenParserTest.java delete mode 100644 group17/785396327/4.9/field/Field.java delete mode 100644 group17/785396327/4.9/method/Method.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java rename group17/82427129/JavaUtil/src/main/java/com/coding/basic/{stack => }/Stack.java (58%) delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java delete mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java delete mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java delete mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java delete mode 100644 group17/article/20170409-20170416.md delete mode 100644 group17/article/20170416-20170423.md delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java delete mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java rename group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/{expr => }/InfixExprTest.java (97%) delete mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java delete mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfixTest.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExprTest.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PrefixExpr.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PrefixExprTest.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/Token.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java delete mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java delete mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java delete mode 100644 group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java delete mode 100644 group24/315863321/src/main/java/jvm/loader/Directory.java delete mode 100644 group24/315863321/src/main/java/jvm/test/ClassFileloaderTest.java delete mode 100644 group24/315863321/src/main/java/jvm/test/EmployeeV1.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/InfixToPostfix.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/InfixToPostfixTest.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/PostfixExpr.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/PostfixExprTest.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/PrefixExpr.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/PrefixExprTest.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/Token.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/TokenParser.java delete mode 100644 group24/448641125/src/com/donaldy/basic/expr/TokenParserTest.java delete mode 100644 group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java delete mode 100644 group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java delete mode 100644 group24/448641125/src/com/donaldy/basic/queue/Josephus.java delete mode 100644 group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java delete mode 100644 group24/448641125/src/com/donaldy/basic/queue/Queue.java delete mode 100644 group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java delete mode 100644 group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/engine/Heap.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java delete mode 100644 group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java delete mode 100644 group24/494800949/EmployeeV1-javap.txt delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java delete mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java delete mode 100644 group24/494800949/src/main/java/com/coding/week6/expr/InfixExpr.java delete mode 100644 group24/494800949/src/main/java/com/coding/week6/expr/Token.java delete mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java delete mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java delete mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java delete mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java delete mode 100644 group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java delete mode 100644 group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java delete mode 100644 group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java delete mode 100644 group24/494800949/src/test/java/com/coding/week6/expr/InfixExprTestTest.java delete mode 100644 group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java delete mode 100644 group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java delete mode 100644 group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java delete mode 100644 group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java delete mode 100644 group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayUtil.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/List.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/liteStruts/LoginAction.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/liteStruts/ReadXML.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/liteStruts/Struts.java delete mode 100644 group24/75939388/learning2017/src/main/java/basic/liteStruts/View.java delete mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/Demo.java delete mode 100644 group24/75939388/learning2017/src/main/java/thread/download/DownloadThread.java delete mode 100644 group24/75939388/learning2017/src/main/java/thread/download/FileDownloader.java delete mode 100644 group24/75939388/learning2017/src/main/java/thread/download/api/Connection.java delete mode 100644 group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionException.java delete mode 100644 group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionManager.java delete mode 100644 group24/75939388/learning2017/src/main/java/thread/download/api/DownloadListener.java delete mode 100644 group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionImpl.java delete mode 100644 group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionManagerImpl.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/StackTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/download/FileDownloaderTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/liteStruts/StrutsTest.java delete mode 100644 group24/Homework/1-FirstWeek/ArrayList.java delete mode 100644 group24/Homework/1-FirstWeek/Iterator.java delete mode 100644 group24/Homework/1-FirstWeek/LinkedList.java delete mode 100644 group24/Homework/1-FirstWeek/Queue.java delete mode 100644 group24/Homework/1-FirstWeek/Stack.java delete mode 100644 group24/Homework/2-SecondWeek/litestruts/LoginAction.java delete mode 100644 group24/Homework/2-SecondWeek/litestruts/Struts.java delete mode 100644 group24/Homework/2-SecondWeek/litestruts/StrutsTest.java delete mode 100644 group24/Homework/2-SecondWeek/litestruts/View.java delete mode 100644 group24/Homework/3-ThirdWeek/LinkedList.java delete mode 100644 group24/Homework/3-ThirdWeek/download/DownloadThread.java delete mode 100644 group24/Homework/3-ThirdWeek/download/FileDownloader.java delete mode 100644 group24/Homework/3-ThirdWeek/download/FileDownloaderTest.java delete mode 100644 group24/Homework/3-ThirdWeek/download/api/Connection.java delete mode 100644 group24/Homework/3-ThirdWeek/download/api/ConnectionException.java delete mode 100644 group24/Homework/3-ThirdWeek/download/api/ConnectionManager.java delete mode 100644 group24/Homework/3-ThirdWeek/download/api/DownloadListener.java delete mode 100644 group24/Homework/3-ThirdWeek/download/impl/ConnectionImpl.java delete mode 100644 group24/Homework/3-ThirdWeek/download/impl/ConnectionManagerImpl.java delete mode 100644 group24/Homework/4-FourWeek/LRUPageFrame.java delete mode 100644 group24/Homework/4-FourWeek/LRUPageFrameTest.java delete mode 100644 group24/Homework/4-FourWeek/jvm/loader/ClassFileLoader .java delete mode 100644 group24/Homework/4-FourWeek/jvm/test/ClassFileloaderTest.java delete mode 100644 group24/Homework/4-FourWeek/jvm/test/EmployeeV1.java delete mode 100644 group24/Homework/5-FifthWeek/README.txt delete mode 100644 group24/Homework/5-FifthWeek/StackUtil.java delete mode 100644 group24/Homework/5-FifthWeek/StackUtilTest.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/clz/AccessFlag.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/clz/ClassFile .java delete mode 100644 group24/Homework/5-FifthWeek/jvm/clz/ClassIndex.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/ClassInfo.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/ConstantInfo.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/ConstantPool.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/FieldRefInfo.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/MethodRefInfo.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/NameAndTypeInfo.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/NullConstantInfo.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/StringInfo.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/constant/UTF8Info.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/loader/ByteCodeIterator.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/loader/ClassFileLoader.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/loader/ClassFileParser.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/test/ClassFileloaderTest.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/test/EmployeeV1.java delete mode 100644 group24/Homework/5-FifthWeek/jvm/util/Util.java delete mode 100644 group24/Homework/6-SixWeek/InfixExpr.java delete mode 100644 group24/Homework/6-SixWeek/InfixExprTest.java delete mode 100644 group24/Homework/6-SixWeek/README.txt delete mode 100644 group24/Homework/6-SixWeek/jvm/attr/AttributeInfo.java delete mode 100644 group24/Homework/6-SixWeek/jvm/attr/CodeAttr.java delete mode 100644 group24/Homework/6-SixWeek/jvm/attr/LineNumberTable.java delete mode 100644 group24/Homework/6-SixWeek/jvm/attr/LocalVariableItem.java delete mode 100644 group24/Homework/6-SixWeek/jvm/attr/LocalVariableTable.java delete mode 100644 group24/Homework/6-SixWeek/jvm/attr/StackMapTable.java delete mode 100644 group24/Homework/6-SixWeek/jvm/clz/AccessFlag.java delete mode 100644 group24/Homework/6-SixWeek/jvm/clz/ClassFile.java delete mode 100644 group24/Homework/6-SixWeek/jvm/clz/ClassIndex.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/ClassInfo.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/ConstantInfo.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/ConstantPool.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/FieldRefInfo.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/MethodRefInfo.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/NameAndTypeInfo.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/NullConstantInfo.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/StringInfo.java delete mode 100644 group24/Homework/6-SixWeek/jvm/constant/UTF8Info.java delete mode 100644 group24/Homework/6-SixWeek/jvm/field/Field.java delete mode 100644 group24/Homework/6-SixWeek/jvm/loader/ByteCodeIterator.java delete mode 100644 group24/Homework/6-SixWeek/jvm/loader/ClassFileLoader.java delete mode 100644 group24/Homework/6-SixWeek/jvm/loader/ClassFileParser.java delete mode 100644 group24/Homework/6-SixWeek/jvm/method/Method.java delete mode 100644 group24/Homework/6-SixWeek/jvm/test/ClassFileloaderTest.java delete mode 100644 group24/Homework/6-SixWeek/jvm/test/EmployeeV1.java delete mode 100644 group24/Homework/6-SixWeek/jvm/util/Util.java delete mode 100644 group24/Homework/7-SevenWeek/InfixToPostfix.java delete mode 100644 group24/Homework/7-SevenWeek/PostfixExpr.java delete mode 100644 group24/Homework/7-SevenWeek/PostfixExprTest.java delete mode 100644 group24/Homework/7-SevenWeek/README.txt delete mode 100644 group24/Homework/7-SevenWeek/jvm/attr/AttributeInfo.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/attr/CodeAttr.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/attr/LineNumberTable.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/attr/LocalVariableItem.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/attr/LocalVariableTable.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/attr/StackMapTable.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/clz/AccessFlag.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/clz/ClassFile.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/clz/ClassIndex.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/BiPushCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/ByteCodeCommand.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/CommandParser.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/GetFieldCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/LdcCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/NewObjectCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/NoOperandCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/OneOperandCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/PutFieldCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/TwoOperandCmd.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/ClassInfo.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/ConstantInfo.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/ConstantPool.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/FieldRefInfo.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/MethodRefInfo.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/NameAndTypeInfo.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/NullConstantInfo.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/StringInfo.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/constant/UTF8Info.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/field/Field.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/loader/ByteCodeIterator.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/loader/ClassFileLoader.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/loader/ClassFileParser.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/method/Method.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/print/ClassFilePrinter.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/print/ConstantPoolPrinter.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/test/ClassFileloaderTest.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/test/EmployeeV1.java delete mode 100644 group24/Homework/7-SevenWeek/jvm/util/Util.java delete mode 100644 group24/Homework/8-EighthWeek/attr/AttributeInfo.java delete mode 100644 group24/Homework/8-EighthWeek/attr/CodeAttr.java delete mode 100644 group24/Homework/8-EighthWeek/attr/LineNumberTable.java delete mode 100644 group24/Homework/8-EighthWeek/attr/LocalVariableItem.java delete mode 100644 group24/Homework/8-EighthWeek/attr/LocalVariableTable.java delete mode 100644 group24/Homework/8-EighthWeek/attr/StackMapTable.java delete mode 100644 group24/Homework/8-EighthWeek/clz/AccessFlag.java delete mode 100644 group24/Homework/8-EighthWeek/clz/ClassFile.java delete mode 100644 group24/Homework/8-EighthWeek/clz/ClassIndex.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/BiPushCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/CommandParser.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/LdcCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java delete mode 100644 group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java delete mode 100644 group24/Homework/8-EighthWeek/constant/ClassInfo.java delete mode 100644 group24/Homework/8-EighthWeek/constant/ConstantInfo.java delete mode 100644 group24/Homework/8-EighthWeek/constant/ConstantPool.java delete mode 100644 group24/Homework/8-EighthWeek/constant/FieldRefInfo.java delete mode 100644 group24/Homework/8-EighthWeek/constant/MethodRefInfo.java delete mode 100644 group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java delete mode 100644 group24/Homework/8-EighthWeek/constant/NullConstantInfo.java delete mode 100644 group24/Homework/8-EighthWeek/constant/StringInfo.java delete mode 100644 group24/Homework/8-EighthWeek/constant/UTF8Info.java delete mode 100644 group24/Homework/8-EighthWeek/engine/ExecutionResult.java delete mode 100644 group24/Homework/8-EighthWeek/engine/ExecutorEngine.java delete mode 100644 group24/Homework/8-EighthWeek/engine/Heap.java delete mode 100644 group24/Homework/8-EighthWeek/engine/JavaObject.java delete mode 100644 group24/Homework/8-EighthWeek/engine/MethodArea.java delete mode 100644 group24/Homework/8-EighthWeek/engine/MiniJVM.java delete mode 100644 group24/Homework/8-EighthWeek/engine/StackFrame.java delete mode 100644 group24/Homework/8-EighthWeek/field/Field.java delete mode 100644 group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java delete mode 100644 group24/Homework/8-EighthWeek/loader/ClassFileLoader.java delete mode 100644 group24/Homework/8-EighthWeek/loader/ClassFileParser.java delete mode 100644 group24/Homework/8-EighthWeek/method/Method.java delete mode 100644 group24/Homework/8-EighthWeek/print/ClassFilePrinter.java delete mode 100644 group24/Homework/8-EighthWeek/print/ConstantPoolPrinter.java delete mode 100644 group24/Homework/8-EighthWeek/test/ClassFileloaderTest.java delete mode 100644 group24/Homework/8-EighthWeek/test/EmployeeV1.java delete mode 100644 group24/Homework/8-EighthWeek/util/Util.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/queue/Josephus.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java delete mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java delete mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java rename group27/383117348/{data-structure => src}/com/coderising/download/DownloadThread.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/download/FileDownloader.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/download/FileDownloaderTest.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/download/api/Connection.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/download/api/ConnectionException.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/download/api/ConnectionManager.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/download/api/DownloadListener.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/download/impl/ConnectionImpl.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/download/impl/ConnectionManagerImpl.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/clz/AccessFlag.java (100%) rename {group17/102228177/work4_09 => group27/383117348}/src/com/coderising/jvm/clz/ClassFile.java (95%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/clz/ClassIndex.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/ClassInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/ConstantInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/ConstantPool.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/FieldRefInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/FloatInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/IntegerInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/MethodRefInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/NameAndTypeInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/NullConstantInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/StringInfo.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/constant/UTF8Info.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/loader/ByteCodeIterator.java (73%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/loader/ClassFileLoader.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/loader/ClassFileLoader_backup.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/loader/ClassFileParser.java (75%) rename {group17/102228177/work4_16 => group27/383117348}/src/com/coderising/jvm/test/ClassFileloaderTest.java (94%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/test/EmployeeV1.java (100%) rename group27/383117348/{mini-jvm => src}/com/coderising/jvm/util/Util.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/litestruts/LoginAction.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/litestruts/Struts.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/litestruts/StrutsTest.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/litestruts/View.java (100%) rename group27/383117348/{data-structure => src}/com/coderising/litestruts/struts.xml (100%) rename group27/383117348/{data-structure => src}/com/coding/basic/BinaryTreeNode.java (100%) rename {group17/1204187480/code/homework/coding/src/main/java => group27/383117348/src}/com/coding/basic/Iterator.java (93%) rename group27/383117348/{data-structure => src}/com/coding/basic/List.java (100%) rename group27/383117348/{data-structure/com/coding/basic/queue => src/com/coding/basic}/Queue.java (91%) rename group27/383117348/{data-structure => src}/com/coding/basic/array/ArrayList.java (100%) rename group27/383117348/{data-structure => src}/com/coding/basic/array/ArrayUtil.java (100%) rename group27/383117348/{data-structure => src}/com/coding/basic/linklist/LRUPageFrame.java (100%) rename group27/383117348/{data-structure => src}/com/coding/basic/linklist/LRUPageFrameTest.java (100%) rename group27/383117348/{data-structure => src}/com/coding/basic/linklist/LinkedList.java (100%) rename group27/383117348/{data-structure => src}/com/coding/basic/stack/Stack.java (100%) rename group27/383117348/{data-structure => src}/com/coding/basic/stack/StackUtil.java (100%) rename group27/383117348/{data-structure => src}/com/coding/basic/stack/test/StackUtilTest.java (100%) rename group27/513274874/data-structure/src/com/coding/basic/{array => }/ArrayList.java (96%) rename {group24/Homework/1-FirstWeek => group27/513274874/data-structure/src/com/coding/basic}/List.java (95%) create mode 100644 group27/513274874/data-structure/src/com/coding/basic/Stack.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/array/List.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java delete mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java delete mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java delete mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java diff --git a/group01/275150374/275150374Learning/.idea/description.html b/group01/275150374/275150374Learning/.idea/description.html index 0f928c44a1..db5f129556 100644 --- a/group01/275150374/275150374Learning/.idea/description.html +++ b/group01/275150374/275150374Learning/.idea/description.html @@ -1,15 +1 @@ -Simple Java application that includes a class with main() method \ No newline at end of file +Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java deleted file mode 100644 index 482157d08c..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java +++ /dev/null @@ -1,245 +0,0 @@ -package com.github.orajavac.coding2017.basic.linklist; - -public class LRUPageFrame { -private static class Node { - - Node prev; - Node next; - Object pageNum=10000; - String flag; - - Node() { - } - } - - private int capacity; - private int length; - - - private Node first;// 链表头 - private Node last;// 链表尾 - - public LRUPageFrame(){ - init(); - } - - public LRUPageFrame(int capacity) { - - this.capacity = capacity; - - init(); - } - - public void init(){ - first = new Node(); - last = new Node(); - last.flag = "last"; //用来标识最后一个节点是链表尾,在这里链表尾并不算做内存页 - first.flag = "first"; //用来标识链表头,在这里链表头并不算做内存页 - first.next = last; - last.prev=first; - } - - /** - * 获取缓存中对象 - * - * @param key - * @return - */ - public void access(int pageNum) { - if(lookup(pageNum)){ - ; - }else{ - if (lengthlen||index<=0){ - throw new RuntimeException("下标不存在"+index); - } - Node e = head; - int i=0; - while (e.next != null){ - i++; - if (i == index){ - return e.next.data; - } - e=e.next; - } - return null; - } - - public Object remove(int index){ - int len=Integer.parseInt(head.data.toString()); - if (index>len||index<=0){ - throw new RuntimeException("下标不存在"+index); - } - Node e = head; - Object data = null; - int i=0; - while (e.next != null){ - i++; - if (i == index){ - len--; - head.data = len; - data = e.next.data; - e.next = e.next.next; - return data; - } - e=e.next; - } - return null; - } - - public Object removeFirst(){ - return remove(1); - } - - public Object removeLast(){ - return remove(Integer.parseInt(head.data.toString())); - } - - public void addFirst(Object o){ - Node e = head.next; - Node n = new Node(); - n.data=o; - n.next=e; - size++; - head.next=n; - head.data=size; - } - - public void addLast(Object o){ - add(o); - } - - public int size(){ - return Integer.parseInt(head.data.toString()); - } - - public void listNode(){ - Node n = head; - StringBuffer buffer = new StringBuffer(); - while (n.next!=null){ - buffer.append(n.next.data + " -> "); - n=n.next; - } - if(buffer.length()>0){ - System.out.print(buffer.substring(0,buffer.length()-3)); - System.out.println(); - } - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - if (i <= 0 || length<=0){ - throw new RuntimeException("起始值、结束值都不能小于0等于"); - } - int len = length + i; - if (len > size){ - throw new RuntimeException("删除索引长度超过了链表长度"); - } - Node e = head; - int y = 0; - while (e.next != null){ - y++; - if (y == i){ - Node n = e.next; - while (n!=null){ - n = n.next; - if (y == length){ - break; - } - y++; - n=n.next; - } - } - e=e.next; - } - } - - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - if (list==null||list.head==null){ - throw new RuntimeException("集合没有初始化"); - } - int[] elements = new int[Integer.parseInt(list.head.data.toString())]; - Node l = list.head; - Node n = head; - int len = 0; - int i = 0; - while (l.next!=null){ - len = 0; - n=head; - while(n.next!=null){ - len++; - if(len==Integer.parseInt(l.next.data.toString())){ - elements[i]=Integer.parseInt(n.next.data.toString()); - i++; - break; - } - n=n.next; - } - l = l.next; - } - return elements; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在list中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - if (list==null||list.head==null){ - throw new RuntimeException("集合没有初始化"); - } - Node l = list.head; - Node n = head; - int i = 0; - while (l.next!=null){ - n=head; - i=0; - while(n.next!=null){ - i++; - if(n.next.data.equals(l.next.data)){ - remove(i); - break; - } - n=n.next; - } - l = l.next; - } - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * 11->101->201->301->401->501->601->701 - * @param min - * @param max - */ - public void removeRange(int min, int max){ - if (min<=0||max<=0||min>max){ - throw new RuntimeException("录入不正确:"+min+","+max+" 应该大于min且小于max的元素"); - } - Node n = head; - int data = 0; - Node p = null; - while(n.next != null){ - data=Integer.parseInt(n.next.data.toString()); //11 - if(data>min&&data{ -private final static int DEFAULT_SIZE = 8; - - //用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE] ; - - //队头 - private int front = 0; - //队尾 - private int rear = 0; - - public boolean isEmpty() { - if (front==0&&rear==0){ - return true; - } - return false; - - } - - public int size() { - return DEFAULT_SIZE; - } - - - - public void enQueue(E data) { - if (rear==DEFAULT_SIZE&&elementData[0]==null){ - rear = 0; - elementData[rear]=data; - }else if (elementData[rear]==null){ - elementData[rear]=data; - }else{ - throw new RuntimeException("队列已满"); - } - rear++; - } - - @SuppressWarnings("unchecked") - public E deQueue() { - Object o = elementData[front]; - elementData[front] = null; - front++; - if (front == DEFAULT_SIZE){ - front = 0; - } - return (E)o; - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java deleted file mode 100644 index 05e692a8aa..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.orajavac.coding2017.basic.queue; - -import java.util.ArrayList; -import java.util.List; - -/** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * 该方法返回一个List, 包含了被杀死人的次序 - * @author liuxin - * - */ -public class Josephus { - - public static List execute(int n, int m){ - CircleQueue q = new CircleQueue(); - List l = new ArrayList(); - for (int i=1;i<=n;i++){ - q.enQueue(i); - } - for (int i=0;i l = execute(8,4); - for (int i=0;i { - private Stack stack1; - private Stack stack2; - - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - public boolean isEmpty() { - return stack1.size()==0; - } - - - - public int size() { - return stack1.size(); - } - - - - public void enQueue(E item) { - int len1 = stack1.size(); - for (int i=0;i operator = new HashMap(); - - private Stack oper = new Stack(); - - private Stack num = new Stack(); - - public InfixExpr(String expr) { - this.expr = expr; - this.operator.put(this.ADD,1); - this.operator.put(this.SUB,1); - this.operator.put(this.MUL,2); - this.operator.put(this.DIV,2); - } - - public float evaluate() { - Object[] obj = Util.parseOperNumToArray(this.expr); - String key = null; - for (int i=0;i level2){ //2+3*4+5 栈顶运算符大于即将入压运算符 - operation(op,num.pop(),num.pop()); - }else if (level1 == level2){ //3-20+2 栈顶运算符等于即将入压运算符 - operation(op,num.pop(),num.pop()); - }else{ - oper.push(op); //把刚刚弹出,再压入栈 - oper.push(key); - } - } - if (oper.length() == 0){ - oper.push(key); - } - } - - public void operation(Object oper,Object num1,Object num2){ - Integer result = null; - if(oper.equals("*")){ - result = Integer.parseInt(num1.toString()) * Integer.parseInt(num2.toString()); - num.push(result); - } - if(oper.equals("/")){ - result = Integer.parseInt(num2.toString()) / Integer.parseInt(num1.toString()); - num.push(result); - } - if(oper.equals("+")){ - result = Integer.parseInt(num1.toString()) + Integer.parseInt(num2.toString()); - num.push(result); - } - if(oper.equals("-")){ - result = Integer.parseInt(num2.toString()) - Integer.parseInt(num1.toString()); - num.push(result); - } - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index 733f48c7bb..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.github.orajavac.coding2017.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2+6"); - Assert.assertEquals(106.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3-4*5+2"); - Assert.assertEquals(-15, expr.evaluate(), 0.001f); - } - - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index c3528d0abe..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.github.orajavac.coding2017.basic.stack.expr; - -import java.util.HashMap; -import java.util.Map; -import com.github.orajavac.coding2017.basic.stack.Stack; -import com.github.orajavac.coding2017.jvm.util.Util; - -/* - * 后序表达式 - */ -public class PostfixExpr { - - String expr = null; - - private final String ADD = "+"; - - private final String SUB = "-"; - - private final String MUL = "*"; - - private final String DIV = "/"; - - private Map operator = new HashMap(); - - private Stack num = new Stack(); - - public PostfixExpr(String expr) { - this.expr = expr; - this.operator.put(this.ADD,1); - this.operator.put(this.SUB,1); - this.operator.put(this.MUL,2); - this.operator.put(this.DIV,2); - } - - public float evaluate() { - String[] expr = Util.parseOperatorToArray(this.expr); - for (int i=0;i operator = new HashMap(); - - private Stack num = new Stack(); - - public PrefixExpr(String expr) { - this.expr = expr; - this.operator.put(this.ADD,1); - this.operator.put(this.SUB,1); - this.operator.put(this.MUL,2); - this.operator.put(this.DIV,2); - } - - public float evaluate() { - String[] expr = Util.parseOperatorToArray(this.expr); - /** - * 4*2 + 6+9*2/3 -8 - * - + + 6 / *2 9 3 * 4 2 8 - */ - for (int i=expr.length-1;i>=0;i--){ - if (this.operator.containsKey(expr[i])){ - num.push(calculate(expr[i], - Float.parseFloat(num.pop().toString()), - Float.parseFloat(num.pop().toString()))); - }else{ - num.push(expr[i]); - } - } - return Float.parseFloat(num.pop().toString()); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java deleted file mode 100644 index a27e05caa9..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.orajavac.coding2017.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PrefixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3 * 4 5"); - Assert.assertEquals(26.0, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); - Assert.assertEquals(12.0, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29.0, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16.0, expr.evaluate(),0.001f); - } - - - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java deleted file mode 100644 index 77ea35c265..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.orajavac.coding2017.jvm.attr; - -public abstract class AttributeInfo { - - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java deleted file mode 100644 index acffda0f88..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.github.orajavac.coding2017.jvm.attr; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.cmd.ByteCodeCommand; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; -import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; - -public class CodeAttr extends AttributeInfo{ - - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - int maxStack = iter.nextU2ToInt(); - int maxLocals = iter.nextU2ToInt(); - int codeLen = iter.nextU4ToInt(); - String code = iter.nextUxToHexString(codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); - int exceptionTableLen = iter.nextU2ToInt(); - if (exceptionTableLen>0){ - String exTable = iter.nextUxToHexString(exceptionTableLen); - } - int subAttrCount = iter.nextU2ToInt(); - for (int x=1;x<=subAttrCount;x++){ - int subAttrIndex = iter.nextU2ToInt(); - String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); - iter.back(2); - if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ - LineNumberTable t = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(t); - }else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ - LocalVariableTable t = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(t); - }else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ - StackMapTable t = StackMapTable.parse(iter); - codeAttr.setStackMapTable(t); - }else{ - throw new RuntimeException("need code to process"); - } - } - return null; - } - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - for(int i=0;i items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 5ddd8ce997..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.github.orajavac.coding2017.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 3228616eac..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.github.orajavac.coding2017.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; -import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo{ - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - LocalVariableTable table = new LocalVariableTable(index,len); - int itemLen = iter.nextU2ToInt(); - for (int i=1;i<=itemLen;i++){ - LocalVariableItem item = new LocalVariableItem(); - item.setStartPC(iter.nextU2ToInt()); - item.setLength(iter.nextU2ToInt()); - item.setNameIndex(iter.nextU2ToInt()); - item.setDescIndex(iter.nextU2ToInt()); - item.setIndex(iter.nextU2ToInt()); - table.addLocalVariableItem(item); - } - return table; - } - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java deleted file mode 100644 index e9d5430659..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.orajavac.coding2017.jvm.attr; - -import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java deleted file mode 100644 index 5bcce47ff1..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.orajavac.coding2017.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; - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java deleted file mode 100644 index f29ce707e1..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.github.orajavac.coding2017.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.github.orajavac.coding2017.jvm.constant.ClassInfo; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; -import com.github.orajavac.coding2017.jvm.field.Field; -import com.github.orajavac.coding2017.jvm.method.Method; - -public class ClassFile { - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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()); - - - } - - public String getClassName(){ - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java deleted file mode 100644 index 4959c05a2d..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.orajavac.coding2017.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; - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java deleted file mode 100644 index 7ecc43d30e..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index 62e56ecfc9..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java deleted file mode 100644 index 7223cb7afc..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - - return null; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index acd1d7202f..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index 7bdc7ca76b..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ClassInfo; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; -import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; -import com.github.orajavac.coding2017.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index f467b84f3f..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; -import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index f210141c66..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java deleted file mode 100644 index 41f73494e7..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; -import com.github.orajavac.coding2017.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 52d280cc0b..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 7a6781c152..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index f9d005287f..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 1fd6b367e1..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 4deb99ecd2..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.github.orajavac.coding2017.jvm.cmd; - -import com.github.orajavac.coding2017.jvm.clz.ClassFile; -import com.github.orajavac.coding2017.jvm.constant.ClassInfo; -import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; -import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; -import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java deleted file mode 100644 index 61dcdd9d3f..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.orajavac.coding2017.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(); - } - - @Override - public void accept(Visistor visitor) { - visitor.visitClassInfo(this); - - } -} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java deleted file mode 100644 index 37055df0a2..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.orajavac.coding2017.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); - } - - public abstract void accept(Visistor visistor); - - public static interface Visistor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visitUTF8(UTF8Info info); - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java deleted file mode 100644 index 304e78f8ba..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.orajavac.coding2017.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 int getSize() { - return this.constantInfos.size() -1; - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java deleted file mode 100644 index c9a06f397d..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.github.orajavac.coding2017.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(); - } - - @Override - public void accept(Visistor visitor) { - visitor.visitFieldRef(this); - - } -} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 6e53f8db5c..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.github.orajavac.coding2017.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(); - } - - @Override - public void accept(Visistor visitor) { - visitor.visitMethodRef(this); - - } - -} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 0f25bb4ef6..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.github.orajavac.coding2017.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()+")"; - } - - @Override - public void accept(Visistor visitor) { - visitor.visitNameAndType(this); - - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 64eff24eef..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.orajavac.coding2017.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - - @Override - public void accept(Visistor visitor) { - - - } - -} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java deleted file mode 100644 index 2224a46e73..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.orajavac.coding2017.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); - } - - @Override - public void accept(Visistor visitor) { - visitor.visitString(this); - } -} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java deleted file mode 100644 index bdceafe0f2..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.github.orajavac.coding2017.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; - } - - @Override - public void accept(Visistor visitor) { - visitor.visitUTF8(this); - } - -} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java deleted file mode 100644 index 40c8ad3a2c..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.github.orajavac.coding2017.jvm.field; - -import com.github.orajavac.coding2017.jvm.constant.ConstantPool; -import com.github.orajavac.coding2017.jvm.constant.UTF8Info; -import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public String toString() { - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - return name +":"+ desc; - } - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); - //System.out.println("field attribute count:"+ attribCount); - - Field f = new Field(accessFlag, nameIndex, descIndex,pool); - - if(attribCount > 0){ - throw new RuntimeException("Field Attribute has not been implemented"); - } - - return f; - } - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 9cc6d5d9b9..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.github.orajavac.coding2017.jvm.loader; - -import java.util.Arrays; - -import com.github.orajavac.coding2017.jvm.util.Util; - -public class ByteCodeIterator { - - private byte[] codes; - - private int pos; - - public ByteCodeIterator(byte[] codes){ - this.codes = codes; - } - - public byte[] getBytes(int len){ - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public String nextU4ToHexString(){ - return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); - } - - public int nextU1ToInt(){ - return Util.byteToInt(new byte[]{codes[pos++]}); - } - - public int nextU2ToInt(){ - return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); - } - - public int nextU4ToInt(){ - return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java deleted file mode 100644 index ba0d450054..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.github.orajavac.coding2017.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.github.orajavac.coding2017.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()); - } - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java deleted file mode 100644 index 81d0ba0e20..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.orajavac.coding2017.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(); - - } -} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java deleted file mode 100644 index cd3db5e063..0000000000 --- a/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.github.orajavac.coding2017.jvm.util; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -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 l = new ArrayList(); - while(mat.find()){ - l.add(mat.group()); - } - /*Object[] obj = l.toArray(); - for (int i=0;i - diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java index 613163b38a..d5cca25bf4 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java @@ -4,236 +4,367 @@ import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = - * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * - * @param origin - * @return - */ - public void reverseArray(int[] origin) { - if (origin == null || origin.length == 0) { - return; - } - - for (int i = 0, j = origin.length - 1; i < j; i++, j--) { - int t = origin[i]; - origin[i] = origin[j]; - origin[j] = t; - } - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} - * - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray) { - - if (oldArray == null) { - return null; - } - - int count = 0; // 统计非零元素个数 - int b[] = new int[oldArray.length]; - // 先统计非零元素个数,并将非零元素存入一个和原数组同样大小的新数组 - for (int i = 0; i < oldArray.length; i++) { - if (oldArray[i] != 0) { - b[count++] = oldArray[i]; - } - } - // 将非零元素copy到新数组 - return Arrays.copyOf(b, count); - - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = - * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2) { - if (array1 == null) { - return array2; - } - if (array2 == null) { - return array1; - } - int[] newArray = new int[array1.length + array2.length]; - // 应该让a1,a2两个数组先进行比较 比较后插入元素 - int i = 0; // array1下标 - int j = 0; // array2下标 - int count = 0; // array3下标 - while (i < array1.length && j < array2.length) { - if (array1[i] < array2[j]) { - newArray[count++] = array1[i++]; - } else if (array1[i] > array2[j]) { - newArray[count++] = array2[j++]; - } else if (array1[i] == array2[j]) { - newArray[count++] = array1[i++] = array2[j++]; - } - } - while (j == array2.length && i < array1.length) { - newArray[count++] = array1[i++]; - } - while (i == array1.length && j < array2.length) { - newArray[count++] = array2[j++]; +public class ArrayUtil +{ + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin) + { + if(origin == null || origin.length == 0) + { + return ; + } + + for(int i=0, j = origin.length-1; i array2[j]) + { + newArray[count++] = array2[j++]; + } + else if(array1[i] == array2[j]) + { + newArray[count++] = array2[j++]; + i++; + } + } + while(i==array1.length && j= max) { - break; - } else { - count++; - } + return Arrays.copyOf(newArray, count); } - - return Arrays.copyOf(a, count); - } - - /** - * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * - * @param max - * @return - */ - public int[] getPrimes(int max) { - /* - * 思路:先生成素数数组,数组的最大值小于max + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + * @throws Exception */ - // max小于3时,返回空数组 - if (max < 3) { - return new int[0]; - } - int[] array = new int[max]; - int count = 0; - - for (int n = 2; n < max; n++) { - if (isPrime(n)) { - array[count++] = n; - } + public int[] grow(int [] oldArray, int size) + { + if(oldArray == null) + { + return null; + } + if(size < 0) + throw new IndexOutOfBoundsException("size小于0"); + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; } - - return Arrays.copyOf(array, count); - } - - private boolean isPrime(int n) { - // 判断当前n是不是素数 - int i = 2; - while (i < n) { - if (n % i == 0) - break; - if (n % i != 0) - i++; + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max) + { + if(max == 1) + { + return new int[0]; + } + if(max == 2) + { + return new int[] {1, 1}; + } + //先将max设置为数组长度,但会浪费空间 + int[] a = new int[max]; + a[0] = 1; + a[1] = 1; + int count = 2; + for(int i=2; i= max) + { + break; + } + else + { + count++; + } + } + + return Arrays.copyOf(a, count); } - return i == n; - } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) + { + /* + * 思路:先生成素数数组,数组的最大值小于max + */ + //max小于3时,返回空数组 + if(max < 3) + { + return new int[0]; + } + int[] array = new int[max]; + int count = 0; - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) { - if (max < 0) { - return null; + for(int n = 2; n < max; n++) + { + if(isPrime(n)) + { + array[count++] = n; + } + } + + return Arrays.copyOf(array, count); } - int[] array = new int[max]; - int count = 0; - for (int n = 2; n < max; n++) { - int sum = 0; - for (int i = 1; i < n; i++) { - if (n % i == 0) { - sum += i; - } - } - if (sum == n) { - array[count++] = n; - } + private boolean isPrime(int n) + { + //判断当前n是不是素数 + int i = 2; + while(i < n) + { + if(n % i == 0) + break; + if(n % i != 0) + i++; + } + return i == n; } - - return Arrays.copyOf(array, count); - } - - /** - * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" - * - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator) { - if (array == null) { - return null; + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) + { + if(max < 0) + { + return null; + } + int[] array = new int[max]; + int count = 0; + + for(int n = 2; n < max; n++) + { + int sum = 0; + for(int i=1; i5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 - * ,删除以后的值为7,8,10 - * - */ - @Test - public void testRemoveFirstHalf() { - aLinkedList.removeFirstHalf(); - assertEquals(0, aLinkedList.size()); - - aLinkedList.add(2); - aLinkedList.add(5); - aLinkedList.add(7); - aLinkedList.add(8); // [2,5,7,8] - - aLinkedList.removeFirstHalf(); // [7,8] - assertEquals(2, aLinkedList.size()); - assertEquals(7, aLinkedList.get(0)); - assertEquals(8, aLinkedList.get(1)); - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * - * @param i - * @param length - */ - @Test - public void testRemoveIntInt() { - - for (int i = 0; i < 4; i++) { - aLinkedList.add(i); // [0,1,2,3] + + @Test + public void testRemoveFirst() { + aLinkedList.addLast("hello"); + aLinkedList.addLast("world"); + + aLinkedList.removeFirst(); + assertEquals("world", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeFirst(); + assertEquals(0, aLinkedList.size()); } - - aLinkedList.remove(0, 2); // [2,3] - assertEquals(2, aLinkedList.get(0)); - assertEquals(3, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - - aLinkedList.remove(1, 0); - aLinkedList.remove(0, 0); - assertEquals(2, aLinkedList.size()); - - aLinkedList.remove(1, 1); // [2] - assertEquals(1, aLinkedList.size()); - assertEquals(2, aLinkedList.get(0)); - - aLinkedList.remove(0, 1); // [] - assertEquals(0, aLinkedList.size()); - - expectedEx.expect(Exception.class); - aLinkedList.remove(1, 3); - } - - /** - * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = - * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * - * @param list - */ - @Test - public void testGetElements() { - for (int i = 0; i < 4; i++) { - aLinkedList.add(i * i); // [0,1,4,9] + + @Test + public void testRemoveLast() { + aLinkedList.addFirst("world"); + aLinkedList.addFirst("hello"); + + aLinkedList.removeLast(); + assertEquals("hello", aLinkedList.get(0)); + assertEquals(1, aLinkedList.size()); + + aLinkedList.removeLast(); + assertEquals(0, aLinkedList.size()); } - - MyLinkedList bLinkedList = new MyLinkedList(); - int[] z1 = aLinkedList.getElements(bLinkedList); // [] - assertArrayEquals(z1, new int[0]); - - bLinkedList.add(1); - bLinkedList.add(3); // [1, 3] - - z1 = aLinkedList.getElements(bLinkedList); // [1, 9] - assertArrayEquals(new int[] { 1, 9 }, z1); - - bLinkedList.add(1, 2); // bLinkedList = [1, 2, 3] - z1 = aLinkedList.getElements(bLinkedList); // [1, 4, 9] - assertArrayEquals(new int[] { 1, 4, 9 }, z1); - - bLinkedList.add(0, 0); // bLinkedList = [0, 1, 2, 3] - z1 = aLinkedList.getElements(bLinkedList); // [0, 1, 4, 9] - assertArrayEquals(new int[] { 0, 1, 4, 9 }, z1); - - // aLinkedList不应该变化 - assertEquals(4, aLinkedList.size()); - for (int i = 0; i < 4; i++) { - assertEquals(i * i, aLinkedList.get(i)); // [0,1,4,9] + + @Test + public void testLinkedListFunctional() { + for (int i=1; i<4; i++) { + aLinkedList.add(i); // [1,2,3] + } + aLinkedList.remove(1); // [1,3] + + aLinkedList.add(1, 0); // [1,0,3] + for (int i=4; i<6; i++) { + aLinkedList.addFirst(i); // [5, 4, 1, 0, 3] + } + assertEquals(5, aLinkedList.size()); + assertEquals(5, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(0, aLinkedList.get(3)); + + aLinkedList.remove(3); // [5, 4, 1, 3] + assertEquals(3, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeLast(); // [5, 4, 1] + assertEquals(1, aLinkedList.get(aLinkedList.size()-1)); + aLinkedList.removeFirst(); // [4,1] + + assertEquals(4, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); } - - // Exception - bLinkedList.add(5); // bLinkedList = [0, 1, 2, 3, 5] - expectedEx.expect(Exception.class); - z1 = aLinkedList.getElements(bLinkedList); - } - - @Test - public void TestSubtract() { - // 传进的list为null,什么都不干 - MyLinkedList list = null; - for (int i = 0; i < 6; i++) { - aLinkedList.add(i); // [0,1,2,3,4,5] + + @Test + public void testReverse() { + // 测试当aLinkedList为空时的情况 + aLinkedList.reverse(); + assertEquals(0, aLinkedList.size()); + + // 测试当aLinkedList长度为1时的情况 + aLinkedList.add(4); + aLinkedList.reverse(); + assertEquals(1, aLinkedList.size()); + assertEquals(4, aLinkedList.get(0)); + + for (int i=1; i<4; i++) + { + aLinkedList.add(i); // [4,1,2,3] + } + + aLinkedList.reverse(); + assertEquals(4, aLinkedList.size()); + assertEquals(3, aLinkedList.get(0)); + assertEquals(2, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + } - aLinkedList.subtract(list); - assertEquals(6, aLinkedList.size()); - - // 传进的list为空 - list = new MyLinkedList(); - aLinkedList.subtract(list); - assertEquals(6, aLinkedList.size()); - - aLinkedList.add(1, 1); // [0,1,1,2,3,4,5] - aLinkedList.add(4, 3); // [0,1, 1, 2, 3, 3, 4, 5] - - // list添加元素[0, 1, 3, 7] - list.add(0); - list.add(1); - list.add(3); - list.add(7); - - aLinkedList.subtract(list); // [ 2, 4, 5] - - assertEquals(2, aLinkedList.get(0)); - assertEquals(4, aLinkedList.get(1)); - assertEquals(5, aLinkedList.get(2)); - assertEquals(3, aLinkedList.size()); - } - - @Test - public void testRemoveDuplicateValues() { - aLinkedList.removeDuplicateValues(); - assertEquals(0, aLinkedList.size()); - - aLinkedList.add(3); - aLinkedList.add(3); - aLinkedList.add(4); - aLinkedList.add(4); - aLinkedList.add(5); - aLinkedList.add(6); - aLinkedList.add(6); // [3, 3, 4, 4, 5, 6, 6] - aLinkedList.removeDuplicateValues(); // [3, 4, 5, 6] - - assertEquals(3, aLinkedList.get(0)); - assertEquals(4, aLinkedList.get(1)); - assertEquals(5, aLinkedList.get(2)); - assertEquals(6, aLinkedList.get(3)); - assertEquals(4, aLinkedList.size()); - - } - - @Test - public void testRemoveRange() { - for (int i = 0; i < 6; i++) { - aLinkedList.add(i); // [0, 1, 2, 3, 4, 5] //考虑重复元素 + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + @Test + public void testRemoveFirstHalf() { + aLinkedList.removeFirstHalf(); + assertEquals(0, aLinkedList.size()); + + aLinkedList.add(2); + aLinkedList.add(5); + aLinkedList.add(7); + aLinkedList.add(8); // [2,5,7,8] + + aLinkedList.removeFirstHalf(); // [7,8] + assertEquals(2, aLinkedList.size()); + assertEquals(7, aLinkedList.get(0)); + assertEquals(8, aLinkedList.get(1)); } - aLinkedList.addFirst(0); // [0, 0, 1, 2, 3, 4, 5] - aLinkedList.add(3, 2); // [0, 0, 1, 2, 2, 3, 4, 5] - - aLinkedList.removeRange(1, 4); // 大于1小于4 [0, 0, 1, 4, 5] - assertEquals(0, aLinkedList.get(0)); - assertEquals(0, aLinkedList.get(1)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(4, aLinkedList.get(3)); - assertEquals(5, aLinkedList.get(4)); - assertEquals(5, aLinkedList.size()); - - // 若出现 min >= max的情况,什么都不做 - aLinkedList.removeRange(4, 1); - assertEquals(0, aLinkedList.get(0)); - assertEquals(0, aLinkedList.get(1)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(4, aLinkedList.get(3)); - assertEquals(5, aLinkedList.get(4)); - assertEquals(5, aLinkedList.size()); - - // 将整个链表中的元素删除 - aLinkedList.removeRange(-1, 8); - assertEquals(0, aLinkedList.size()); - } - - @Test - public void testIntersection() { - for (int i = 0; i < 6; i++) { - aLinkedList.add(i); + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + @Test + public void testRemoveIntInt() { + + for (int i=0; i<4; i++) { + aLinkedList.add(i); // [0,1,2,3] + } + + aLinkedList.remove(0, 2); // [2,3] + assertEquals(2, aLinkedList.get(0)); + assertEquals(3, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + + aLinkedList.remove(1, 0); + aLinkedList.remove(0, 0); + assertEquals(2, aLinkedList.size()); + + aLinkedList.remove(1, 1); // [2] + assertEquals(1, aLinkedList.size()); + assertEquals(2, aLinkedList.get(0)); + + aLinkedList.remove(0, 1); // [] + assertEquals(0, aLinkedList.size()); + + expectedEx.expect(Exception.class); + aLinkedList.remove(1, 3); } - aLinkedList.add(6); - aLinkedList.add(7); // [0, 1, 2, 3, 4, 5, 6, 7] - // list为null - MyLinkedList list = null; - MyLinkedList newList1 = aLinkedList.intersection(list); - assertNull(newList1); - - // list为空链表 - list = new MyLinkedList(); - MyLinkedList newList2 = aLinkedList.intersection(list); - assertEquals(0, newList2.size()); - - list.add(0); - list.add(3); - list.add(4); - list.add(6); - list.add(7); // [0, 3, 4, 6, 7] - MyLinkedList newList3 = aLinkedList.intersection(list); - - assertEquals(0, newList3.get(0)); - assertEquals(3, newList3.get(1)); - assertEquals(4, newList3.get(2)); - assertEquals(6, newList3.get(3)); - assertEquals(7, newList3.get(4)); - assertEquals(5, newList3.size()); - } + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + @Test + public void testGetElements() { + for (int i=0; i<4; i++) { + aLinkedList.add(i * i); // [0,1,4,9] + } + + MyLinkedList bLinkedList = new MyLinkedList(); + int[] z1 = aLinkedList.getElements(bLinkedList); // [] + assertArrayEquals( z1, new int[0]); + + bLinkedList.add(1); + bLinkedList.add(3); // [1, 3] + + z1 = aLinkedList.getElements(bLinkedList); // [1, 9] + assertArrayEquals(new int[] {1,9}, z1); + + bLinkedList.add(1, 2); // bLinkedList = [1, 2, 3] + z1 = aLinkedList.getElements(bLinkedList); // [1, 4, 9] + assertArrayEquals(new int[] {1,4,9}, z1); + + bLinkedList.add(0, 0); // bLinkedList = [0, 1, 2, 3] + z1 = aLinkedList.getElements(bLinkedList); // [0, 1, 4, 9] + assertArrayEquals(new int[] {0,1,4,9}, z1); + + // aLinkedList不应该变化 + assertEquals(4, aLinkedList.size()); + for (int i=0; i<4; i++) { + assertEquals(i*i, aLinkedList.get(i)); // [0,1,4,9] + } + + // Exception + bLinkedList.add(5); // bLinkedList = [0, 1, 2, 3, 5] + expectedEx.expect(Exception.class); + z1 = aLinkedList.getElements(bLinkedList); + } + + @Test + public void TestSubtract() + { + //传进的list为null,什么都不干 + MyLinkedList list = null; + for (int i=0; i<6; i++) + { + aLinkedList.add(i); //[0,1,2,3,4,5] + } + aLinkedList.subtract(list); + assertEquals(6, aLinkedList.size()); + + //传进的list为空 + list = new MyLinkedList(); + aLinkedList.subtract(list); + assertEquals(6, aLinkedList.size()); + + aLinkedList.add(1, 1); //[0,1,1,2,3,4,5] + aLinkedList.add(4, 3); //[0,1, 1, 2, 3, 3, 4, 5] + + // list添加元素[0, 1, 3, 7] + list.add(0); + list.add(1); + list.add(3); + list.add(7); + + aLinkedList.subtract(list); //[ 2, 4, 5] + + assertEquals(2, aLinkedList.get(0)); + assertEquals(4, aLinkedList.get(1)); + assertEquals(5, aLinkedList.get(2)); + assertEquals(3, aLinkedList.size()); + } + @Test + public void testRemoveDuplicateValues() + { + aLinkedList.removeDuplicateValues(); + assertEquals(0, aLinkedList.size()); + + aLinkedList.add(3); + aLinkedList.add(3); + aLinkedList.add(4); + aLinkedList.add(4); + aLinkedList.add(5); + aLinkedList.add(6); + aLinkedList.add(6); //[3, 3, 4, 4, 5, 6, 6] + + aLinkedList.removeDuplicateValues(); //[3, 4, 5, 6] + + assertEquals(3, aLinkedList.get(0)); + assertEquals(4, aLinkedList.get(1)); + assertEquals(5, aLinkedList.get(2)); + assertEquals(6, aLinkedList.get(3)); + assertEquals(4, aLinkedList.size()); + + } + @Test + public void testRemoveRange() + { + for (int i=0; i<6; i++) + { + aLinkedList.add(i); // [0, 1, 2, 3, 4, 5] //考虑重复元素 + } + aLinkedList.addFirst(0); // [0, 0, 1, 2, 3, 4, 5] + aLinkedList.add(3, 2); // [0, 0, 1, 2, 2, 3, 4, 5] + + aLinkedList.removeRange(1, 4); // 大于1小于4 [0, 0, 1, 4, 5] + + assertEquals(0, aLinkedList.get(0)); + assertEquals(0, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + assertEquals(5, aLinkedList.get(4)); + assertEquals(5, aLinkedList.size()); + + //若出现 min >= max的情况,什么都不做 + aLinkedList.removeRange(4, 1); + assertEquals(0, aLinkedList.get(0)); + assertEquals(0, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + assertEquals(5, aLinkedList.get(4)); + assertEquals(5, aLinkedList.size()); + + //将整个链表中的元素删除 + aLinkedList.removeRange(-1, 8); + assertEquals(0, aLinkedList.size()); + } + @Test + public void testIntersection() + { + for (int i=0; i<6; i++) + { + aLinkedList.add(i); + } + aLinkedList.add(6); + aLinkedList.add(7); // [0, 1, 2, 3, 4, 5, 6, 7] + //list为null + MyLinkedList list = null; + MyLinkedList newList1 = aLinkedList.intersection(list); + assertNull(newList1); + + //list为空链表 + list = new MyLinkedList(); + MyLinkedList newList2 = aLinkedList.intersection(list); + assertEquals(0, newList2.size()); + + list.add(0); + list.add(3); + list.add(4); + list.add(6); + list.add(7); // [0, 3, 4, 6, 7] + MyLinkedList newList3 = aLinkedList.intersection(list); + + assertEquals(0, newList3.get(0)); + assertEquals(3, newList3.get(1)); + assertEquals(4, newList3.get(2)); + assertEquals(6, newList3.get(3)); + assertEquals(7, newList3.get(4)); + assertEquals(5, newList3.size()); + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java index e73700ec53..f2299e8e83 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java @@ -1,16 +1,14 @@ package com.github.HarryHook.coding2017.basic; -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); - - public Iterator iterator(); +public interface List +{ + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + + public Iterator iterator(); } + diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java index 113b32f4d2..92f84b687c 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java @@ -10,109 +10,113 @@ public class ListTest { - protected static List aList; - - @Test - public void testFunctional() { - aList.add(1); - aList.add(2); - assertEquals(1, aList.get(0)); - assertEquals(2, aList.get(1)); - - aList.add(3); - aList.add(0, 5); - aList.add(2, 11); - assertEquals(5, aList.get(0)); - assertEquals(11, aList.get(2)); - - aList.add("hi"); - assertEquals("hi", aList.get(5)); - assertEquals(6, aList.size()); - - aList.remove(1); - assertEquals(11, aList.get(1)); - assertEquals(2, aList.get(2)); - - assertEquals(5, aList.size()); - } - - @Test - public void testAdd() { - for (int i = 0; i < 100; i++) - aList.add(i); - assertEquals(0, aList.get(0)); - assertEquals(99, aList.get(99)); - assertEquals(44, aList.get(44)); - } - - @Test - public void testRemove() { - aList.add(1); - aList.add(2); - aList.add(3); - int u = (Integer) aList.remove(2); - assertEquals(3, u); - assertEquals(2, aList.size()); - - aList.add(1, 5); - u = (Integer) aList.remove(0); - assertEquals(1, u); - assertEquals(5, aList.get(0)); - assertEquals(2, aList.get(1)); - assertEquals(2, aList.size()); - - aList.remove(0); - aList.remove(0); - assertEquals(0, aList.size()); - - } - - @Test - public void testSize() { - for (int i = 0; i < 10; i++) - aList.add(i * 2); - assertEquals(10, aList.size()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testException() { - expectedEx.expect(Exception.class); - aList.remove(1); - aList.add(3); - aList.add(2, 5); - expectedEx.expect(Exception.class); - } - - @Test - - public void testIterator() { - Iterator it = aList.iterator(); - assertEquals(false, it.hasNext()); - - aList.add(1); - aList.add(2); - aList.add(3); - - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(2, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - aList.remove(1); - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - expectedEx.expect(Exception.class); - it.next(); - - } + protected static List aList; + + @Test + public void testFunctional() { + aList.add(1); + aList.add(2); + assertEquals(1, aList.get(0)); + assertEquals(2, aList.get(1)); + + aList.add(3); + aList.add(0, 5); + aList.add(2, 11); + assertEquals(5, aList.get(0)); + assertEquals(11, aList.get(2)); + + aList.add("hi"); + assertEquals("hi", aList.get(5)); + assertEquals(6, aList.size()); + + aList.remove(1); + assertEquals(11, aList.get(1)); + assertEquals(2, aList.get(2)); + + assertEquals(5, aList.size()); + } + + @Test + public void testAdd() { + for (int i=0; i<100; i++) + aList.add(i); + assertEquals(0, aList.get(0)); + assertEquals(99, aList.get(99)); + assertEquals(44, aList.get(44)); + } + + @Test + public void testRemove() { + aList.add(1); + aList.add(2); + aList.add(3); + int u = (Integer)aList.remove(2); + assertEquals(3, u); + assertEquals(2, aList.size()); + + aList.add(1, 5); + u = (Integer)aList.remove(0); + assertEquals(1, u); + assertEquals(5, aList.get(0)); + assertEquals(2, aList.get(1)); + assertEquals(2, aList.size()); + + aList.remove(0); + aList.remove(0); + assertEquals(0, aList.size()); + + + } + + @Test + public void testSize() { + for (int i=0; i<10; i++) + aList.add(i*2); + assertEquals(10, aList.size()); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testException() { + expectedEx.expect(Exception.class); + aList.remove(1); + aList.add(3); + aList.add(2, 5); + expectedEx.expect(Exception.class); + } + + @Test + + public void testIterator() + { + Iterator it = aList.iterator(); + assertEquals(false, it.hasNext()); + + aList.add(1); + aList.add(2); + aList.add(3); + + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(2, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + aList.remove(1); + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + expectedEx.expect(Exception.class); + it.next(); + + } + + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java index e8cc041978..dbfd8aae19 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java @@ -7,136 +7,161 @@ import java.util.Arrays; import java.util.NoSuchElementException; -public class MyArrayList implements List { - private int size = 0; // 数组元素个数 - - private Object[] elementData = new Object[10]; // 初始化数组大小为10 - - // 将元素添加到数组尾部 - public void add(Object o) { // 需要判断数组空间是否够用 - ensureCapacity(size + 1); - elementData[size++] = o; - } - - // 在指定位置添加元素 - public void add(int index, Object o) { - // 判断下标记是否越界 - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - ensureCapacity(size + 1); - // 判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移 - if (elementData[index] == null) { - elementData[index] = o; - } else { - for (int i = elementData.length - 1; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - elementData[index] = o; +public class MyArrayList implements List +{ + private int size = 0; //数组元素个数 + + private Object[] elementData = new Object[10]; //初始化数组大小为10 + + //将元素添加到数组尾部 + public void add(Object o) + { //需要判断数组空间是否够用 + ensureCapacity(size + 1); + elementData[size++] = o; } - size++; - - /* - * //判断索引位置是否正确 if (index > size || index < 0) throw new - * IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); - * //扩容检测 ensureCapacity(size+1); /* 对源数组进行复制处理(位移),从index + - * 1到size-index。 主要目的就是空出index位置供数据插入, 即向右移动当前位于该位置的元素以及所有后续元素。 - * - * System.arraycopy(elementData, index, elementData, index + 1, size - - * index); //在指定位置赋值 elementData[index] = 0; size++; - * - */ - } - - public Object get(int index) { - // 若index超出size应该抛出异常 - if (index >= size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - return elementData[index]; - - } - - public Object remove(int index) { // 涉及到元素移位 - Object oldValue = elementData[index]; - for (int i = index; i < elementData.length - 1; i++) - elementData[i] = elementData[i + 1]; - elementData[--size] = null; - - return oldValue; - } - - // 判断是否需要给数组扩容 - public void ensureCapacity(int minCapacity) { - - int oldCapacity = elementData.length; - if (minCapacity > oldCapacity) { - // Object oldData[] = elementData; - // //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存 - int newCapacity = (oldCapacity * 3) / 2 + 1; // 增加50%+1 - if (newCapacity < minCapacity) - newCapacity = minCapacity; - // minCapacity is usually close to size, so this is a win: - elementData = Arrays.copyOf(elementData, newCapacity); + //在指定位置添加元素 + public void add(int index, Object o) + { + //判断下标记是否越界 + if (index > size || index < 0) + throw new IndexOutOfBoundsException( + "Index: " + index + ", Size: " + size); + ensureCapacity(size + 1); + //判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移 + if(elementData[index] == null) + { + elementData[index] = o; + } + else + { + for(int i=elementData.length-1; i>index; i--) + { + elementData[i] = elementData[i-1]; + } + elementData[index] = o; + } + size++; + + /* + //判断索引位置是否正确 + if (index > size || index < 0) + throw new IndexOutOfBoundsException( + "Index: " + index + ", Size: " + size); + //扩容检测 + ensureCapacity(size+1); + /* + * 对源数组进行复制处理(位移),从index + 1到size-index。 + * 主要目的就是空出index位置供数据插入, + * 即向右移动当前位于该位置的元素以及所有后续元素。 + + System.arraycopy(elementData, index, elementData, index + 1, + size - index); + //在指定位置赋值 + elementData[index] = 0; + size++; + + */ } - } - - // 返回数组的大小 - public int size() { - return size; - } - - public Iterator iterator() { - return new MyArrayListIterator(); - } - - private class MyArrayListIterator implements Iterator { - private int cursor = 0; // 记录索引位置 - - public boolean hasNext() { - return cursor != size; + + public Object get(int index) + { + //若index超出size应该抛出异常 + if(index >= size) + throw new IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); + return elementData[index]; + } - - public Object next() { - try { - Object next = get(cursor); - cursor++; - return next; - - } catch (IndexOutOfBoundsException e) { - throw new NoSuchElementException(); - } - + + public Object remove(int index) + { //涉及到元素移位 + Object oldValue = elementData[index]; + for(int i=index; i oldCapacity) + { + //Object oldData[] = elementData; //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存 + int newCapacity = (oldCapacity * 3)/2 + 1; //增加50%+1 + if (newCapacity < minCapacity) + newCapacity = minCapacity; + // minCapacity is usually close to size, so this is a win: + elementData = Arrays.copyOf(elementData, newCapacity); + } + } + + //返回数组的大小 + public int size() + { + return size; + } + + public Iterator iterator() + { + return new MyArrayListIterator(); + } + + private class MyArrayListIterator implements Iterator + { + private int cursor = 0; //记录索引位置 + public boolean hasNext() + { + return cursor != size; + } + public Object next() + { + try { + Object next = get(cursor); + cursor++; + return next; + + } catch (IndexOutOfBoundsException e) + { + throw new NoSuchElementException(); + } + + } + } + + public static void main(String[] args) + { + MyArrayList myArrays = new MyArrayList(); + myArrays.add(3); + myArrays.add(0, 11); + myArrays.add(1, 2); + myArrays.add(3, 5); + myArrays.add(2, 1); + myArrays.add(7); + Print(myArrays); + + for(int i = 0; i < 19; i++) + myArrays.add(i, 55); + + System.out.println("获取指定位置元素: " + myArrays.get(2)); + System.out.println("删除指定位置元素: " + myArrays.remove(1)); + System.out.println("当前元素个数:" + myArrays.size()); + + Print(myArrays); + + } + public static void Print(MyArrayList myArrays) + { + Iterator it = myArrays.iterator(); + System.out.println("对链表中的元素进行打印:"); + while(it.hasNext()) + System.out.print(it.next() + " "); + System.out.println(""); + System.out.println("当前元素个数: " + myArrays.size()); + } + } + diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java index e1c3478907..9a668faaf0 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java @@ -5,409 +5,549 @@ package com.github.HarryHook.coding2017.basic; -public class MyLinkedList implements List { - private Node head = null; // 头指针 - private int size = 0; - - private static class Node { - Object data; - Node next; - } - - public void add(Object o) { - addLast(o); - } - - // 在指定位置添加元素 - public void add(int index, Object o) { - - if (index > size || index < 0) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - - // 存在插入头结点的情况 - if (index == 0) { - addFirst(o); - } else { // 即 index != 0 的情况 - // p保存待插入节点的前一节点,x指向要插入的节点 - Node x = head; - Node p = null; - int i = 0; - while (i < index) { - p = x; - x = x.next; - i++; - } - Node n = new Node(); - p.next = n; - n.next = x; - n.data = o; - size++; - } - - } - - // 返回指定位置元素 - public Object get(int index) { - if (index >= size) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - Node x = head; - int i = 0; - while (i < index && x != null) { - x = x.next; - i++; +public class MyLinkedList implements List +{ + private Node head = null; //头指针 + private int size = 0; + private static class Node + { + Object data; + Node next; } - return x.data; - } - - // 移除指定位置节点 - public Object remove(int index) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + public void add(Object o) + { + addLast(o); } - // 先判断是否是头节点 - if (index == 0) { - return removeFirst(); - } else { - Node x = head; - Node pre = null; - int i = 0; - while (i < index) { - pre = x; - x = x.next; - i++; - } - Object Data = pre.next.data; - pre.next = x.next; - x = null; - size--; - return Data; + //在指定位置添加元素 + public void add(int index , Object o) + { + + if (index > size || index < 0) + { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + + //存在插入头结点的情况 + if(index == 0) + { + addFirst(o); + } + else + { //即 index != 0 的情况 + // p保存待插入节点的前一节点,x指向要插入的节点 + Node x = head; + Node p = null; + int i = 0; + while(i < index) + { + p = x; + x = x.next; + i++; + } + Node n = new Node(); + p.next = n; + n.next = x; + n.data = o; + size++; + } + } - - } - - // 头部添加节点 - public void addFirst(Object o) { - Node n = new Node(); - n.next = head; - head = n; - n.data = o; - size++; - } - - // 尾部添加节点 - public void addLast(Object o) { - if (head == null) { - head = new Node(); - head.data = o; - } else { - Node x = head; - while (x.next != null) { - x = x.next; - } - Node n = new Node(); - x.next = n; - n.next = null; - n.data = o; + //返回指定位置元素 + public Object get(int index) + { + if(index >= size) + { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + Node x = head; + int i = 0; + while(i < index && x != null) + { + x = x.next; + i++; + } + return x.data; } - size++; - } - - // 移除第一个节点 - public Object removeFirst() { - Node n = head; - Object Data = n.data; - head = head.next; - n = null; - size--; - return Data; - } + + //移除指定位置节点 + public Object remove(int index) + { + if (index > size || index < 0) + { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + } + //先判断是否是头节点 + if( index == 0) + { + return removeFirst(); + } + else + { + Node x = head; + Node pre = null; + int i = 0; + while(i < index) + { + pre = x; + x = x.next; + i++; + } + Object Data = pre.next.data; + pre.next = x.next; + x = null; + size--; + return Data; + } - // 移除最后一个节点 - public Object removeLast() { - Node x = head; - Node p = null; - if (x.next == null) { - return removeFirst(); - } else { - while (x.next != null) { - p = x; - x = x.next; - } - Object Data = x.data; - p.next = null; - x = null; // 删除最后一个节点 - size--; - return Data; } - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new MyLinkedListIterator(); - } - - private class MyLinkedListIterator implements Iterator { - private int cursor = 0; // 记录索引位置 - - public boolean hasNext() { - return cursor != size; + //头部添加节点 + public void addFirst(Object o) + { + Node n = new Node(); + n.next = head; + head = n; + n.data = o; + size++; } - - public Object next() { - Object next = get(cursor); - cursor++; - return next; + //尾部添加节点 + public void addLast(Object o) + { + if (head == null) + { + head = new Node(); + head.data = o; + } + else + { + Node x = head; + while(x.next != null) + { + x = x.next; + } + Node n = new Node(); + x.next = n; + n.next = null; + n.data = o; + } + size++; } - } - - /** - * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse() { - if (head == null) { - return; + //移除第一个节点 + public Object removeFirst() + { + Node n = head; + Object Data = n.data; + head = head.next; + n = null; + size--; + return Data; } - Node p1, p2, p3; - p1 = head; - p2 = p1.next; - while (p2 != null) { - p3 = p2.next; - p2.next = p1; - p1 = p2; - p2 = p3; + + //移除最后一个节点 + public Object removeLast() + { + Node x = head; + Node p = null; + if(x.next == null) + { + return removeFirst(); + } + else + { + while(x.next != null) + { + p = x; + x = x.next; + } + Object Data = x.data; + p.next = null; + x = null; //删除最后一个节点 + size--; + return Data; + } } - head.next = null; - head = p1; - } - - /** - * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 - * ,删除以后的值为7,8,10 - * - */ - public void removeFirstHalf() { - if (size == 0) { - return; + public int size() + { + return size; } - Node p = head; - Node q = null; - int i = size / 2; - int j = 0; - while (j < i) { - j++; - q = p; - p = p.next; + public Iterator iterator() + { + return new MyLinkedListIterator(); } - head = p; - q.next = null; - size = size - i; - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * - * @param i - * @param length - */ - public void remove(int i, int length) { - Node p = head; - Node q = null; - int index = 0; - int j = 0; - - while (index < i) { - q = p; - p = p.next; - index++; + private class MyLinkedListIterator implements Iterator + { + private int cursor = 0; //记录索引位置 + public boolean hasNext() + { + return cursor != size; + } + public Object next() + { + Object next = get(cursor); + cursor ++; + return next; + } } - - while (p != null && j < length) { - p = p.next; - j++; + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() + { + if(head == null) + { + return ; + } + Node p1, p2, p3; + p1 = head; + p2 = p1.next; + while(p2 != null) + { + p3 = p2.next; + p2.next = p1; + p1 = p2; + p2 = p3; + } + head.next = null; + head = p1; } - if (i == 0) // 从头开始移除元素 + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf() { - if (p == null) // 元素全被删光 - { - head = null; - size = 0; - } else // 从头删length个元素 - { + if(size == 0) + { + return ; + } + Node p = head; + Node q = null; + int i = size / 2; + int j = 0; + while(j < i) + { + j++; + q = p; + p = p.next; + } head = p; - size = size - length; - } - } else // 从中间开始移除元素 - { - if (p == null) { q.next = null; - size = size - j; - } else { - q.next = p; - size = size - length; - } - } + size = size - i; - } - - /** - * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = - * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * - * @param list - */ - public int[] getElements(MyLinkedList list) { - if (list == null) { - return new int[0]; - } - int i = 0; - int[] array = new int[list.size()]; - while (i < list.size()) { - array[i] = (int) this.get((int) list.get(i)); - i++; - } - return array; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 从当前链表中中删除在list中出现的元素 - * - * @param list - */ - - public void subtract(MyLinkedList list) { - int i = 0; - if (list == null) { - return; } - while (i < list.size()) { - for (int index = 0; index < this.size(); index++) { - Node p = head; // 当前节点 - Node q = null; // 前驱节点 - while (list.get(i) != p.data && p.next != null) { - q = p; - p = p.next; - } - if (p.data == list.get(i)) { // 删除找到的节点 + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length) + { + Node p = head; + Node q = null; + int index = 0; + int j = 0; - if (p == head) { - head = head.next; - } else { - q.next = p.next; - } - size--; - } - } - - i++; + while(index < i) + { + q = p; + p = p.next; + index ++; + } + + while(p != null && j < length) + { + p = p.next; + j++; + } + if(i==0) //从头开始移除元素 + { + if(p == null) //元素全被删光 + { + head = null; + size = 0; + } + else //从头删length个元素 + { + head = p; + size = size - length; + } + } + else //从中间开始移除元素 + { + if(p == null) + { + q.next = null; + size = size - j ; + } + else + { + q.next = p; + size = size - length; + } + } + } - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues() { - if (head == null) { - return; + + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(MyLinkedList list) + { + if(list == null) + { + return new int[0]; + } + int i = 0 ; + int[] array = new int[list.size()]; + while(i < list.size()) + { + array[i] = (int) this.get((int)list.get(i)); + i++; + } + return array; } - Node p = head; - Node q = head; // 前驱 - while (p.next != null) { - p = p.next; + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 - while (p.data == q.data) { - size--; - if (p.next == null) { - q.next = null; - break; - } - q.next = p.next; - p = p.next; - if (p == null) - break; - } - q = q.next; + * @param list + */ + + public void subtract(MyLinkedList list) + { + int i = 0; + if(list == null) + { + return ; + } + while(i < list.size()) + { + for(int index = 0; index < this.size(); index++) + { + Node p = head; //当前节点 + Node q = null; //前驱节点 + while(list.get(i) != p.data && p.next != null) + { + q = p; + p = p.next; + } + if(p.data == list.get(i)) //删除找到的节点 + { + if(p == head) + head = head.next; + else + { + q.next = p.next; + } + size--; + } + } + + i++; + } } - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * - * @param min - * @param max - */ - public void removeRange(int min, int max) { - - Node p = head; // 当前节点 - Node q = head; // 前驱节点 - while (p.next != null && ((int) p.data <= min || (int) p.data >= max)) { // 未找到继续遍历 - q = p; - p = p.next; + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() + { + if(head == null) + { + return ; + } + Node p = head; + Node q = head; //前驱 + while(p.next != null) + { + p = p.next; + + while(p.data == q.data) + { + size--; + if(p.next == null) + { + q.next = null; + break; + } + q.next = p.next; + p = p.next; + if(p == null) + break; + } + q = q.next; + } } - while ((int) p.data > min && (int) p.data < max) { // 删除找到的节点 - p = p.next; - size--; - - if (size == 0) // 删完所有元素 - break; + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max) + { + + Node p = head; //当前节点 + Node q = head; //前驱节点 + while(p.next != null && ((int)p.data <= min || (int)p.data >= max)) //未找到继续遍历 + { + q = p; + p = p.next; + } + while((int)p.data > min && (int)p.data < max) //删除找到的节点 + { + p = p.next; + size--; + + if(size == 0) //删完所有元素 + break ; + } + if(q == head) //头结点被删掉 + { + head = p; + } + else + { + q.next = p; + } + } - if (q == head) { // 头结点被删掉 - head = p; - } else { - q.next = p; + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public MyLinkedList intersection(MyLinkedList list) + { + if(list == null || this == null) + { + return null; + } + Node p1 = list.head; + Node p2 = this.head; + MyLinkedList newList = new MyLinkedList(); + + while(p1 != null && p2 != null) + { + while(((int) p1.data < (int) p2.data) && p1.next != null) + { + p1 = p1.next; + } + while(((int) p1.data > (int) p2.data) && p2.next != null) + { + p2 = p2.next; + } + if(p1.data == p2.data) + { + newList.add(p1.data); + p1 = p1.next; + p2 = p2.next; + } + + if(p1 == null && p2 == null) //若最后两个元素相等 + { + break; + } + } + return newList; } + + + public static void main(String[] args) + { + MyLinkedList myList = new MyLinkedList(); + myList.add(1); + myList.add(1); + myList.add(3); + myList.add(4); + myList.add(5); + myList.add(5); + myList.add(7); + myList.add(8); + myList.add(8); + myList.add(9); + Print(myList); + /* + MyLinkedList list = new MyLinkedList(); + list.add(0); + list.add(3); + list.add(5); + list.add(6); + list.add(9); + list.add(19); + //Print(list); + //myList.removeDuplicateValues(); + //myList.subtract(list); + */ + + myList.removeRange(-11, 10); + Print(myList); + /* + MyLinkedList list1 = myList.intersection(list); + System.out.println("打印交集:"); + Print(list1); + /* reverse() + myList.reverse(); + Print(myList); + */ + + //System.out.println("从第二个元素开始,移除三个元素"); + //myList.remove(1, 1); + //Print(myList); + + // getElements() + MyLinkedList list = new MyLinkedList(); + + int[] array = myList.getElements(list); + System.out.println("输出:"+array[0]); + for(int i=0; i (int) p2.data) && p2.next != null) { - p2 = p2.next; - } - if (p1.data == p2.data) { - newList.add(p1.data); - p1 = p1.next; - p2 = p2.next; - } - - if (p1 == null && p2 == null) { // 若最后两个元素相等 - break; - } + + public static void Print(MyLinkedList myList) + { + Iterator it = myList.iterator(); + System.out.println("对链表中的元素进行打印:"); + while(it.hasNext()) + System.out.print(it.next() + " "); + System.out.println(""); + System.out.println("当前元素个数: " + myList.size()); + System.out.println(""); } - return newList; - } - - public static void Print(MyLinkedList myList) { - Iterator it = myList.iterator(); - System.out.println("对链表中的元素进行打印:"); - while (it.hasNext()) - System.out.print(it.next() + " "); - System.out.println(""); - System.out.println("当前元素个数: " + myList.size()); - System.out.println(""); - } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java index 3d6cd9df0a..9b713eaea9 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java @@ -3,38 +3,52 @@ * 实现简单的队列 */ package com.github.HarryHook.coding2017.basic; - import java.util.*; - -public class MyQueue { - private MyArrayList elementData = new MyArrayList(); - private int size = 0; - - // 入队 - public void enQueue(Object o) { - elementData.add(o); - size++; - } - - // 出队 - public Object deQueue() { - if (isEmpty()) { - throw new NoSuchElementException(); +public class MyQueue +{ + private MyArrayList elementData = new MyArrayList(); + private int size = 0; + //入队 + public void enQueue(Object o) + { + elementData.add(o); + size++; + } + //出队 + public Object deQueue() + { + if(isEmpty()) + throw new NoSuchElementException(); + Object Data = elementData.remove(0); + size--; + return Data; + } + //判断队列是否为空 + public boolean isEmpty() + { + return size() == 0; + } + //队列中元素个数 + public int size() + { + return size; + } + public static void main(String[] args) + { + MyQueue mq = new MyQueue(); + mq.enQueue(1); + mq.enQueue(2); + mq.enQueue(3); + mq.enQueue(4); + System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + System.out.println("队列中元素个数: " + mq.size()); + System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + System.out.println("队列中元素个数: " + mq.size()); + System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + System.out.println("队列中元素个数: " + mq.size()); + System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + System.out.println("队列中元素个数: " + mq.size()); + //System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); + //System.out.println("队列中元素个数: " + mq.size()); } - Object Data = elementData.remove(0); - size--; - return Data; - } - - // 判断队列是否为空 - public boolean isEmpty() { - return size() == 0; - } - - // 队列中元素个数 - public int size() { - return size; - } - - } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java index 2702c66a07..c7f87c04e6 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java @@ -6,39 +6,54 @@ import java.util.*; -public class MyStack { - private MyArrayList elementData = new MyArrayList(); - private int size = 0; - - // 入栈操作 - public void push(Object o) { - elementData.add(o); - size++; - } - - // 出栈操作 - public Object pop() { - Object obj = peek(); - elementData.remove(size() - 1); - size--; - return obj; - } - - // 获取当前栈顶元素,不用出栈 - public Object peek() { - if (isEmpty()) { - throw new EmptyStackException(); +public class MyStack +{ + private MyArrayList elementData = new MyArrayList(); + private int size = 0; + + //入栈操作 + public void push(Object o) + { + elementData.add(o); + size++; + } + //出栈操作 + public Object pop() + { + Object obj = peek(); + elementData.remove(size() - 1); + size--; + return obj; + } + //获取当前栈顶元素,不用出栈 + public Object peek() + { + if(isEmpty()) + throw new EmptyStackException(); + return elementData.get(size() - 1); + } + //判断栈是否为空 + public boolean isEmpty() + { + return size() == 0; + } + //返回栈内元素个数 + public int size(){ + return size; + } + + public static void main(String[] args) + { + MyStack ms = new MyStack(); + + ms.push(1); + ms.push(2); + ms.push(13); + System.out.println("当前栈顶元素是: " + ms.peek()); + System.out.println("出栈元素是: " + ms.pop()); + System.out.println("出栈元素是: " + ms.pop()); + ms.push(12); + System.out.println("出栈元素是: " + ms.pop()); + System.out.println("当前栈顶元素是: " + ms.peek()); } - return elementData.get(size() - 1); - } - - // 判断栈是否为空 - public boolean isEmpty() { - return size() == 0; - } - - // 返回栈内元素个数 - public int size() { - return size; - } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java index 0b89de7c0a..340f79d240 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java @@ -6,28 +6,28 @@ import com.github.HarryHook.coding2017.basic.MyQueue; public class QueueTest { - private MyQueue queue; - - @Before - public void setUpQueue() { - queue = new MyQueue(); - } - - @Test - public void testQueueFunctional() { - assertEquals(true, queue.isEmpty()); - queue.enQueue(4); - queue.enQueue(2); - assertEquals(2, queue.size()); - assertEquals(false, queue.isEmpty()); - - int i = (Integer) queue.deQueue(); - assertEquals(4, i); - i = (Integer) queue.deQueue(); - assertEquals(2, i); - - assertEquals(0, queue.size()); - assertEquals(true, queue.isEmpty()); - } + private MyQueue queue; + + @Before + public void setUpQueue() { + queue = new MyQueue(); + } + + @Test + public void testQueueFunctional() { + assertEquals(true, queue.isEmpty()); + queue.enQueue(4); + queue.enQueue(2); + assertEquals(2, queue.size()); + assertEquals(false, queue.isEmpty()); + + int i = (Integer)queue.deQueue(); + assertEquals(4, i); + i = (Integer)queue.deQueue(); + assertEquals(2, i); + + assertEquals(0, queue.size()); + assertEquals(true, queue.isEmpty()); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java index 89f56d8006..26160faef6 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java @@ -9,32 +9,32 @@ public class StackTest { - private MyStack stack; - - @Before - public void setUpStack() { - stack = new MyStack(); - } - - @Test - public void testStackFunctional() { - assertEquals(true, stack.isEmpty()); - stack.push(4); - stack.push(2); - assertEquals(2, stack.size()); - assertEquals(false, stack.isEmpty()); - - int i = (Integer) stack.pop(); - assertEquals(2, i); - - i = (Integer) stack.peek(); - assertEquals(4, i); - - i = (Integer) stack.pop(); - assertEquals(4, i); - - assertEquals(0, stack.size()); - assertEquals(true, stack.isEmpty()); - } + private MyStack stack; + + @Before + public void setUpStack() { + stack = new MyStack(); + } + + @Test + public void testStackFunctional() { + assertEquals(true, stack.isEmpty()); + stack.push(4); + stack.push(2); + assertEquals(2, stack.size()); + assertEquals(false, stack.isEmpty()); + + int i = (Integer)stack.pop(); + assertEquals(2, i); + + i = (Integer)stack.peek(); + assertEquals(4, i); + + i = (Integer)stack.pop(); + assertEquals(4, i); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java index 122c71eae6..c7b05e46c0 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java @@ -6,46 +6,46 @@ public class DownloadThread extends Thread { - Connection conn; - int startPos; - int endPos; - boolean downloadFinsh = false; - - public DownloadThread(Connection conn, int startPos, int endPos) { - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - - public void run() { - - RandomAccessFile outFile = null; - try { - - byte[] buffer = conn.read(startPos, endPos); - // 在本地创建一个与服务器大小一致的可随机写入文件 - outFile = new RandomAccessFile("bd_logo.png", "rwd"); - outFile.seek(startPos); - outFile.write(buffer); - FileDownloader fileloader = new FileDownloader(""); - fileloader.getListener(); - - } catch (Exception e) { - - e.printStackTrace(); - - } finally { - + Connection conn; + int startPos; + int endPos; + boolean downloadFinsh = false; + public DownloadThread( Connection conn, int startPos, int endPos) { + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + + public void run() { + + RandomAccessFile outFile = null; try { - outFile.close(); - - } catch (Exception e) { - + + byte[] buffer = conn.read(startPos, endPos); + // 在本地创建一个与服务器大小一致的可随机写入文件 + outFile = new RandomAccessFile("bd_logo.png", "rwd"); + outFile.seek(startPos); + outFile.write(buffer); + FileDownloader fileloader = new FileDownloader(""); + fileloader.getListener(); + + }catch(Exception e) { + e.printStackTrace(); + + }finally { + + try { + outFile.close(); + + } catch(Exception e) { + + e.printStackTrace(); + } + + } - } - } - + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java index 1bb64c1050..ac5b6606d4 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java @@ -5,86 +5,87 @@ import com.github.HarryHook.coding2017.download.api.ConnectionManager; import com.github.HarryHook.coding2017.download.api.DownloadListener; -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - public FileDownloader(String _url) { - - this.url = _url; - - } - - public void execute() { - - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, - // endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, - // 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - - Connection conn = null; - - try { - - conn = cm.open(this.url); - int fileLength = conn.getContentLength(); - int threadCount = 3; - int blockSize = fileLength / 1024 / threadCount; - - for (int threadId = 1; threadId <= threadCount; threadId++) { - - int startPos = (threadId - 1) * blockSize; - int endPos = threadId * blockSize - 1; - if (threadId == threadCount) { - endPos = fileLength; +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + + this.url = _url; + + } + + public void execute() { + + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + + Connection conn = null; + + try { + + conn = cm.open(this.url); + int fileLength = conn.getContentLength(); + int threadCount = 3; + int blockSize = fileLength / 1024 / threadCount; + + for (int threadId=1; threadId<=threadCount; threadId++) { + + int startPos = (threadId-1) * blockSize; + int endPos = threadId * blockSize - 1; + if (threadId == threadCount) { + endPos = fileLength; + } + + new DownloadThread(conn, startPos, endPos).start(); } - - new DownloadThread(conn, startPos, endPos).start(); - } - - } catch (ConnectionException e) { - - e.printStackTrace(); - - } finally { - - if (conn != null) { - + + } catch(ConnectionException e) { + + e.printStackTrace(); + + }finally { + + if(conn != null) { + conn.close(); - + + } } + + } + + public void setListener(DownloadListener listener) { + + this.listener = listener; } - } - - public void setListener(DownloadListener listener) { - - this.listener = listener; - } - - public void setConnectionManager(ConnectionManager ucm) { - - this.cm = ucm; - } - - public DownloadListener getListener() { - - return this.listener; - } - + public void setConnectionManager(ConnectionManager ucm) { + + this.cm = ucm; + } + + public DownloadListener getListener() { + + return this.listener; + } + + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java index adf7dad676..91ddbfa6f8 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java @@ -9,52 +9,52 @@ import com.github.HarryHook.coding2017.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { + + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + + } - boolean downloadFinished = false; - - @Before - public void setUp() throws Exception { - - } - - @After - public void tearDown() throws Exception { - - } - - @Test - public void testDownload() { - - String url = "https://www.baidu.com/img/bd_logo.png"; - - FileDownloader downloader = new FileDownloader(url); - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { + @After + public void tearDown() throws Exception { + + } - downloadFinished = true; + @Test + public void testDownload() { + + String url = "https://www.baidu.com/img/bd_logo.png"; + + FileDownloader downloader = new FileDownloader(url); + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + + downloadFinished = true; + } + }); + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + + try { + System.out.println("还没有下载完成,休眠两秒"); + //休眠2秒 + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } } - }); - - downloader.execute(); + System.out.println("下载完成!"); + - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - - try { - System.out.println("还没有下载完成,休眠两秒"); - // 休眠2秒 - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } } - System.out.println("下载完成!"); - - } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java index 7f6a13f3e0..92b2fe1050 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java @@ -3,26 +3,22 @@ import java.io.IOException; public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * - * @param startPos - * 开始位置, 从0开始 - * @param endPos - * 结束位置 - * @return - */ - public byte[] read(int startPos, int endPos) throws IOException; - - /** - * 得到数据内容的长度 - * - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java index be85791a50..57368f7b35 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java @@ -1,11 +1,10 @@ package com.github.HarryHook.coding2017.download.api; public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java index 84a55784f7..2932ec1ddb 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java @@ -9,57 +9,57 @@ import com.github.HarryHook.coding2017.download.api.Connection; public class ConnectionImpl implements Connection { - - private String url; - - public ConnectionImpl(String url) { - - this.url = url; - } - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - - URL url = new URL(this.url); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - // conn.setRequestMethod("GET"); - // 设置500毫秒为超时值 - // conn.setReadTimeout(5000); - conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); - BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - - byte[] buffer = new byte[1024]; - int size = 0; - while ((size = in.read(buffer)) != -1) { - out.write(buffer, 0, size); + + private String url; + + public ConnectionImpl(String url) { + + this.url = url; } - byte[] b = out.toByteArray(); - out.close(); - in.close(); - - return b; - } - @Override - public int getContentLength() { - - try { - URL url1 = new URL(url); - HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); - return conn.getContentLength(); - - } catch (Exception e) { - - e.printStackTrace(); + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + URL url = new URL(this.url); + HttpURLConnection conn = (HttpURLConnection)url.openConnection(); + //conn.setRequestMethod("GET"); + // 设置500毫秒为超时值 + // conn.setReadTimeout(5000); + conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); + + byte[] buffer = new byte[1024]; + int size = 0; + while ((size = in.read(buffer)) != -1) { + out.write(buffer, 0, size); + } + byte[] b = out.toByteArray(); + out.close(); + in.close(); + + return b; } - return -1; - } - - @Override - public void close() { + @Override + public int getContentLength() { + + try { + URL url1 = new URL(url); + HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); + return conn.getContentLength(); + + }catch(Exception e) { + + e.printStackTrace(); + } + + return -1; + } - } + @Override + public void close() { + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java index ee40d1e943..2ce38b1f79 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java @@ -6,9 +6,9 @@ public class ConnectionManagerImpl implements ConnectionManager { - @Override - public Connection open(String url) throws ConnectionException { - return new ConnectionImpl(url); - } + @Override + public Connection open(String url) throws ConnectionException { + return new ConnectionImpl(url); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java deleted file mode 100644 index 33b7dda5c6..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen; - - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java deleted file mode 100644 index 9ecd803572..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.attr; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; -import com.github.HarryHook.coding2017.jvm.cmd.CommandParser; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; -import com.sun.org.apache.bcel.internal.generic.NEW; - -public class CodeAttr extends AttributeInfo { - private int maxStack; - private int maxLocals; - private int codeLen; - private String code; - - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds; - - public ByteCodeCommand[] getCmds() { - return cmds; - } - - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, - ByteCodeCommand[] cmds) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { - - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - int maxStack = iter.nextU2ToInt(); - int maxLocals = iter.nextU2ToInt(); - int codeLen = iter.nextU4ToInt(); - - String code = iter.nextUxToHexString(codeLen); - System.out.println(code); - - ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); - - int exceptionLength = iter.nextU2ToInt(); - if (exceptionLength > 0) { - String exceptionTable = iter.nextUxToHexString(exceptionLength); - System.out.println("exception Table has not complemented" + exceptionTable); - } - // 解析子属性 - int subAttrCount = iter.nextU2ToInt(); - - for (int j = 1; j <= subAttrCount; j++) { - - int subAttrIndex = iter.nextU2ToInt(); - String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); - iter.back(2); - - if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { - LineNumberTable t = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(t); - - } else if (AttributeInfo.LOCAL_VAR_TABLE.equals(subAttrName)) { - LocalVariableTable t = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(t); - - } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { - StackMapTable t = StackMapTable.parse(iter); - codeAttr.setStackMapTable(t); - } else { - throw new RuntimeException("Need implement" + subAttrName); - } - } - return codeAttr; - } - - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - - } - - public String toString(ConstantPool pool) { - StringBuffer buffer = new StringBuffer(); - for(int i=0;i items = new ArrayList(); - - private static class LineNumberItem { - int startPC; - int lineNum; - - public int getStartPC() { - return startPC; - } - - public void setStartPC(int startPC) { - this.startPC = startPC; - } - - public int getLineNum() { - return lineNum; - } - - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - - public void addLineNumberItem(LineNumberItem item) { - this.items.add(item); - } - - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter) { - int attrNameIndex = iter.nextU2ToInt(); - int attrLength = iter.nextU4ToInt(); - LineNumberTable table = new LineNumberTable(attrNameIndex, attrLength); - int itemLength = iter.nextU2ToInt(); - - for (int i = 1; i <= itemLength; i++) { - LineNumberItem item = new LineNumberItem(); - item.setStartPC(iter.nextU2ToInt()); - item.setLineNum(iter.nextU2ToInt()); - table.addLineNumberItem(item); - } - - return table; - } - - public String toString() { - StringBuilder buffer = new StringBuilder(); - buffer.append("Line Number Table:\n"); - for (LineNumberItem item : items) { - buffer.append("startPC:" + item.getStartPC()).append(","); - buffer.append("lineNum:" + item.getLineNum()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java deleted file mode 100644 index f442ea5698..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - - public int getStartPC() { - return startPC; - } - - public void setStartPC(int startPC) { - this.startPC = startPC; - } - - public int getLength() { - return length; - } - - public void setLength(int length) { - this.length = length; - } - - public int getNameIndex() { - return nameIndex; - } - - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - - public int getDescIndex() { - return descIndex; - } - - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - - public int getIndex() { - return index; - } - - public void setIndex(int index) { - this.index = index; - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 106ae86460..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.attr; - -import java.util.ArrayList; -import java.util.List; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; - -import sun.util.logging.resources.logging; - -public class LocalVariableTable extends AttributeInfo { - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter) { - int attrNameIndex = iter.nextU2ToInt(); - int attrlength = iter.nextU4ToInt(); - - LocalVariableTable table = new LocalVariableTable(attrNameIndex, attrlength); - int itemLength = iter.nextU2ToInt(); - for (int i = 1; i <= itemLength; i++) { - LocalVariableItem item = new LocalVariableItem(); - item.setStartPC(iter.nextU2ToInt()); - item.setLength(iter.nextU2ToInt()); - item.setNameIndex(iter.nextU2ToInt()); - item.setDescIndex(iter.nextU2ToInt()); - item.setIndex(iter.nextU2ToInt()); - table.addLocalVariableItem(item); - } - return table; - } - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); -} -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java deleted file mode 100644 index 745a2fdc70..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.attr; - -import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo { - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter) { - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index, len); - - // 后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java deleted file mode 100644 index fedc174261..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.HarryHook.coding2017.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; - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java deleted file mode 100644 index 799a40cea7..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.field.Field; -import com.github.HarryHook.coding2017.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - public ClassIndex getClzIndex() { - return clzIndex; - } - - public void setClzIndex(ClassIndex clzIndex) { - this.clzIndex = 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 setConstantPool(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()); - - } - - public String getClassName() { - int thisClassIndex = clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - - public String getSuperClassName() { - ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - - public void addField(Field f) { - fields.add(f); - } - - public List getFields() { - return fields; - } - - public void addMethod(Method m) { - methods.add(m); - - } - - public List getMethods() { - return methods; - } - - public Method getMethod(String methodName, String paramAndReturnType) { - - for (Method m : methods) { - - int nameIndex = m.getNameIndex(); - int descriptionIndex = m.getDescriptorIndex(); - - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descriptionIndex); - if (name.equals(methodName) && desc.equals(paramAndReturnType)) { - return m; - } - } - return null; - } - - public Method getMainMethod() { - for (Method m : methods) { - int nameIndex = m.getNameIndex(); - int descIndex = m.getDescriptorIndex(); - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descIndex); - if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { - return m; - } - } - return null; - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java deleted file mode 100644 index 9b6162360d..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.github.HarryHook.coding2017.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/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java deleted file mode 100644 index 6b1c020682..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index f5e6705a8a..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java deleted file mode 100644 index b982fa7aa4..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { - throw new RuntimeException("the orignal code is not correct"); - - } - - codes = codes.toUpperCase(); - - CommandIterator iter = new CommandIterator(codes); - List cmds = new ArrayList(); - - while (iter.hasNext()) { - String opCode = iter.next2CharAsString(); - - if (new_object.equals(opCode)) { - NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - // System.out.println( cmd.toString(clzFile.getConstPool())); - cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { - InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (getfield.equals(opCode)) { - GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (getstatic.equals(opCode)) { - GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (putfield.equals(opCode)) { - PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (ldc.equals(opCode)) { - LdcCmd cmd = new LdcCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (bipush.equals(opCode)) { - BiPushCmd cmd = new BiPushCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { - - NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); - cmds.add(cmd); - } else { - throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); - } - - } - - calcuateOffset(cmds); - - ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; - cmds.toArray(result); - return result; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index ec34e7b4a7..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index 1090e17374..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index 4afc337f47..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index 6b494dceda..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java deleted file mode 100644 index 073ddd73a9..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 9c959e31dd..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 554eac0690..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 77bf40708b..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index f3a197114c..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 13edc86215..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.cmd; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java deleted file mode 100644 index e4822e2bbb..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.github.HarryHook.coding2017.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java deleted file mode 100644 index 6c502016a3..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.github.HarryHook.coding2017.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); - } - - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java deleted file mode 100644 index 92d1b381d1..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.github.HarryHook.coding2017.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 int getSize() { - return this.constantInfos.size() - 1; - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java deleted file mode 100644 index d2d6a19f90..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.github.HarryHook.coding2017.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java deleted file mode 100644 index a1055932a0..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.github.HarryHook.coding2017.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 29495489f4..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.HarryHook.coding2017.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() + ")"; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - - } -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java deleted file mode 100644 index b0f5ad9b80..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo() { - - } - - @Override - public int getType() { - return -1; - } - - @Override - public void accept(Visitor visitor) { - - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java deleted file mode 100644 index 442405aa36..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.github.HarryHook.coding2017.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); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java deleted file mode 100644 index 5c740bf402..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.github.HarryHook.coding2017.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 void setValue(String value) { - this.value = value; - } - - public String getValue() { - return value; - } - - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java deleted file mode 100644 index 9d33d90d96..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java +++ /dev/null @@ -1,44 +0,0 @@ - -package com.github.HarryHook.coding2017.jvm.field; - -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; -import com.sun.istack.internal.Pool; -import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private ConstantPool pool; - - public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public static Field parse(ConstantPool pool, ByteCodeIterator iter) { - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descriptorIndex = iter.nextU2ToInt(); - int attributesCount = iter.nextU2ToInt(); - System.out.println("field attributes Count: " + attributesCount); - Field f = new Field(accessFlag, nameIndex, descriptorIndex, pool); - if(attributesCount > 0) { - throw new RuntimeException("Field has not complemented attribute"); - } - return f; - } - - public String toString() { - String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); - String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); - return name +":" + desc; - } - - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index b773b6b584..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.loader; - -import java.util.Arrays; - -import com.github.HarryHook.coding2017.jvm.util.Util; - -public class ByteCodeIterator { - byte[] codes; - int pos = 0; - - public ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - public byte[] getByte(int len) { - if (pos + len > codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public String nextU4ToHexString() { - - return Util.byteToHexString(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public int nextU1ToInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 2f2c9c4345..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.github.HarryHook.coding2017.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 com.github.HarryHook.coding2017.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) { - BufferedInputStream bis = null; - try { - File f = new File(clzFileName); - bis = new BufferedInputStream(new FileInputStream(f)); - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - - byte[] buffer = new byte[1024]; - int length = 0; - while ((length = bis.read(buffer)) != -1) { - out.write(buffer, 0, length); - } - return out.toByteArray(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (bis != null) { - try { - bis.close(); - } 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() { - - StringBuilder buffer = new StringBuilder(); - - for (int i = 0; i < clzPaths.size(); i++) { - - buffer.append(clzPaths.get(i)); - if (i < clzPaths.size() - 1) { - buffer.append(";"); - } - } - return buffer.toString(); - } - - public ClassFile loadClass(String className) { - byte[] codes = this.readBinaryCode(className); - ClassFileParser parser = new ClassFileParser(); - return parser.parse(codes); - - } - public static void main(String[] args) { - ClassFile clzFile = null; - ClassFileLoader loader = new ClassFileLoader(); - String path1 = "F:\\Coding2017\\group02\\727171008\\bin"; - loader.addClassPath(path1); - String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; - clzFile = loader.loadClass(className); - clzFile.print(); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java deleted file mode 100644 index 40608823e9..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.loader; - -import java.io.UnsupportedEncodingException; - - -import com.github.HarryHook.coding2017.jvm.clz.AccessFlag; -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.clz.ClassIndex; -import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; -import com.github.HarryHook.coding2017.jvm.constant.NullConstantInfo; -import com.github.HarryHook.coding2017.jvm.constant.StringInfo; -import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; -import com.github.HarryHook.coding2017.jvm.field.Field; -import com.github.HarryHook.coding2017.jvm.method.Method; - -public class ClassFileParser { - - public ClassFile parse(byte[] codes) { - - ClassFile clzFile = new ClassFile(); - ByteCodeIterator iter = new ByteCodeIterator(codes); - String magicNumber = iter.nextU4ToHexString(); - if (!"cafebabe".equals(magicNumber)) { - return null; - } - - clzFile.setMinorVersion(iter.nextU2ToInt()); - clzFile.setMajorVersion(iter.nextU2ToInt()); - - ConstantPool pool = parseConstantPool(iter); - clzFile.setConstantPool(pool); - - AccessFlag flag = parseAccessFlag(iter); - clzFile.setAccessFlag(flag); - - ClassIndex clzIndex = parseClassIndex(iter); - clzFile.setClzIndex(clzIndex); - - parseInterfaces(iter); - - parseField(clzFile, iter); - - parseMethod(clzFile, iter); - return clzFile; - } - - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - - AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); - return flag; - } - - private ClassIndex parseClassIndex(ByteCodeIterator iter) { - - int thisClassIndex = iter.nextU2ToInt(); - int superClassIndex = iter.nextU2ToInt(); - ClassIndex clzIndex = new ClassIndex(); - clzIndex.setThisClassIndex(thisClassIndex); - clzIndex.setSuperClassIndex(superClassIndex); - - return clzIndex; - - } - - private ConstantPool parseConstantPool(ByteCodeIterator iter) { - int constPoolCount = iter.nextU2ToInt(); - System.out.println("const Pool Count : " + constPoolCount); - ConstantPool pool = new ConstantPool(); - pool.addConstantInfo(new NullConstantInfo()); - for (int i = 1; i <= constPoolCount - 1; i++) { - int tag = iter.nextU1ToInt(); - if (tag == 7) { - // Class Info - int utf8Index = iter.nextU2ToInt(); - ClassInfo clzInfo = new ClassInfo(pool); - clzInfo.setUtf8Index(utf8Index); - pool.addConstantInfo(clzInfo); - } else if (tag == 1) { - // UTF8 String - int len = iter.nextU2ToInt(); - byte[] data = iter.getByte(len); - String value = null; - try { - value = new String(data, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - - } - UTF8Info utf8Str = new UTF8Info(pool); - utf8Str.setLength(len); - utf8Str.setValue(value); - pool.addConstantInfo(utf8Str); - } else if (tag == 8) { - StringInfo info = new StringInfo(pool); - info.setIndex(iter.nextU2ToInt()); - pool.addConstantInfo(info); - } else if (tag == 9) { - FieldRefInfo field = new FieldRefInfo(pool); - field.setClassInfoIndex(iter.nextU2ToInt()); - field.setNameAndTypeIndex(iter.nextU2ToInt()); - pool.addConstantInfo(field); - } else if (tag == 10) { - MethodRefInfo method = new MethodRefInfo(pool); - method.setClassInfoIndex(iter.nextU2ToInt()); - method.setNameAndTypeIndex(iter.nextU2ToInt()); - pool.addConstantInfo(method); - } else if (tag == 12) { - NameAndTypeInfo nameType = new NameAndTypeInfo(pool); - nameType.setIndex1(iter.nextU2ToInt()); - nameType.setIndex2(iter.nextU2ToInt()); - pool.addConstantInfo(nameType); - } else { - throw new RuntimeException("the constant pool tag" + tag + "has not complemented"); - } - - } - System.out.println("Finished reading Constant Pool "); - - return pool; - } - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceCount = iter.nextU2ToInt(); - - System.out.println("interfaceCount:" + interfaceCount); - - // TODO : 如果实现了interface, 这里需要解析 - } - - private void parseField(ClassFile clzFile, ByteCodeIterator iter){ - int fieldCount = iter.nextU2ToInt(); - for(int i=1; i<=fieldCount; i++) { - Field f = Field.parse(clzFile.getConstantPool(), iter); - clzFile.addField(f); - - } - } - - private void parseMethod(ClassFile clzFile, ByteCodeIterator iter){ - int methodCount = iter.nextU2ToInt(); - for(int i=1; i<=methodCount; i++) { - Method m = Method.parse(clzFile, iter); - clzFile.addMethod(m); - } - } - - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java deleted file mode 100644 index 08b8ff029b..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java +++ /dev/null @@ -1,87 +0,0 @@ - -package com.github.HarryHook.coding2017.jvm.method; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; - -import javax.management.RuntimeErrorException; - -import com.github.HarryHook.coding2017.jvm.attr.AttributeInfo; -import com.github.HarryHook.coding2017.jvm.attr.CodeAttr; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; -import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; - -public class Method { - - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private CodeAttr codeAttr; - - private ClassFile clzFile; - - public ClassFile getClzFile() { - return clzFile; - } - - public int getNameIndex() { - return nameIndex; - } - - public int getDescriptorIndex() { - return descriptorIndex; - } - - public CodeAttr getCodeAttr() { - return codeAttr; - } - - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } - - public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - } - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descriptorIndex = iter.nextU2ToInt(); - int attributeCount = iter.nextU2ToInt(); - - Method m = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); - - for(int i=1; i<=attributeCount; i++) { - int attrNameIndex = iter.nextU2ToInt(); - String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); - iter.back(2); - - if(AttributeInfo.CODE.equalsIgnoreCase(attrName)) { - CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); - m.setCodeAttr(codeAttr); - } else { - throw new RuntimeException("only Attribute is complemented!"); - } - - } - return m; - - } - public String toString(ConstantPool pool) { - StringBuffer buffer = new StringBuffer(); - String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); - String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); - buffer.append(name).append(":").append(desc).append("\n"); - buffer.append(this.codeAttr.toString(pool)); - return buffer.toString(); - } - public ByteCodeCommand[] getCmds() { - return this.getCodeAttr().getCmds(); -} -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java deleted file mode 100644 index 6ede47692c..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.print; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; -import com.github.HarryHook.coding2017.jvm.constant.StringInfo; -import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; -import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; - -public class ClassFilePrinter { - ClassFile clzFile = null; - - public ClassFilePrinter(ClassFile clzFile) { - this.clzFile = clzFile; - } - - public void print() { - - if (clzFile.getAccessFlag().isPublicClass()) { - System.out.println("Access flag : public "); - } - System.out.println("Class Name:" + clzFile.getClassName()); - - System.out.println("Super Class Name:" + clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMinorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - cnstPoolPrinter.print(); - - } - - public static void main(String[] args) { - String path = "F:\\Coding2017\\group02\\727171008\\bin"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; - - ClassFile clzFile = loader.loadClass(className); - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java deleted file mode 100644 index 3d6c791185..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.print; - -import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; -import com.github.HarryHook.coding2017.jvm.constant.StringInfo; -import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; - -public class ConstantPoolPrinter { - ConstantPool pool; - ConstantPoolPrinter(ConstantPool pool){ - this.pool = pool; - } - public void print(){ - - System.out.println("Constant Pool:"); - - - - - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java deleted file mode 100644 index ee7e3b3092..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java +++ /dev/null @@ -1,342 +0,0 @@ -package com.github.HarryHook.coding2017.jvm.test; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.clz.ClassIndex; -import com.github.HarryHook.coding2017.jvm.cmd.BiPushCmd; -import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; -import com.github.HarryHook.coding2017.jvm.cmd.OneOperandCmd; -import com.github.HarryHook.coding2017.jvm.cmd.TwoOperandCmd; -import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; -import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; -import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; -import com.github.HarryHook.coding2017.jvm.field.Field; -import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; -import com.github.HarryHook.coding2017.jvm.method.Method; - - -public class ClassFileloaderTest { - - private static final String FULL_QUALIFIED_CLASS_NAME = "com/github/HarryHook/coding2017/jvm/test/EmployeeV1"; - static String path1 = "F:\\Coding2017\\group02\\727171008\\bin"; - // F:\Coding2017\group02\727171008\bin\com\github\HarryHook\coding2017\jvm\test - static String path2 = "F:\\temp"; - - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; - clzFile = loader.loadClass(className); - clzFile.print(); - } - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath() { - - ClassFileLoader loader = new ClassFileLoader(); - - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1 + ";" + path2, clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - // jdk_1.8.0_111 - Assert.assertEquals(1090, byteCodes.length); - - } - - @Test - public void testMagicNumber() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - private String byteToHexString(byte[] codes) { - - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } - - @Test - public void testVersion() { - - Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); - - } - - @Test - public void testConstantPool() { - - ConstantPool pool = clzFile.getConstantPool(); - - Assert.assertEquals(53, pool.getSize()); - - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); - Assert.assertEquals(2, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); - } - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); - Assert.assertEquals(4, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); - Assert.assertEquals("java/lang/Object", utf8Info.getValue()); - } - { - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); - Assert.assertEquals("name", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(6); - Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(7); - Assert.assertEquals("age", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(8); - Assert.assertEquals("I", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(9); - Assert.assertEquals("", 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()); - } - /** - * 下面是第三次JVM课应实现的测试用例 - */ - - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - /* - * 第四次测试 - */ - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java deleted file mode 100644 index 8926e19e1e..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.HarryHook.coding2017.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/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java deleted file mode 100644 index 0a05d3f49c..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.github.HarryHook.coding2017.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 < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java deleted file mode 100644 index b2cf16ceaa..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.github.HarryHook.coding2017.linklist; - -/** - * 用双向链表实现LRU算法 - * - * @author HarryHook - * - */ -public class LRUPageFrame { - - private static class Node { - - Node prev; - Node next; - int pageNum; - - Node() { - - } - } - - private int capacity; - private int currentSize = 0; - - private Node first;// 链表头 - private Node last;// 链表尾 - - public LRUPageFrame(int capacity) { - - this.capacity = capacity; - - } - - /** - * 获取缓存中对象 - * - * @param pageNum - * @return - */ - - public void access(int pageNum) { - - if (currentSize == 0) { - Node node = new Node(); - node.pageNum = pageNum; - node.prev = node.next = null; - first = last = node; - currentSize++; - } else { - - if (first.pageNum == pageNum) { - return; - } - - if (currentSize == 1) { - addToFirst(pageNum); - } else { - - if (last.pageNum == pageNum) { - moveLastToFirst(); - return; - } - Node iteratorNode = first; - while (iteratorNode.next != null && iteratorNode.pageNum != pageNum) { - iteratorNode = iteratorNode.next; - } - if (iteratorNode == last) { - addToFirst(pageNum); - // 若缓存已满,移除最后一个节点 - if (currentSize > capacity) { - last = last.prev; - last.next = null; - } - } else { - moveToFirst(iteratorNode); - } - } - } - } - - // 将节点/缓存页添加到fitrst - public void addToFirst(int pageNum) { - Node node = new Node(); - node.pageNum = pageNum; - node.prev = null; - node.next = first; - first.prev = node; - first = node; - currentSize++; - } - - // 将last节点移动到first - public void moveLastToFirst() { - last.next = first; - first.prev = last; - first = last; - last = last.prev; - last.next = null; - first.prev = null; - } - - // 将最近使用的已有缓存页移动到first - public void moveToFirst(Node iteratorNode) { - iteratorNode.prev.next = iteratorNode.next; - iteratorNode.next.prev = iteratorNode.prev; - iteratorNode.prev = null; - iteratorNode.next = first; - first.prev = iteratorNode; - first = iteratorNode; - } - - 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/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java deleted file mode 100644 index f25cb5d5e9..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.HarryHook.coding2017.linklist; - -import org.junit.Assert; - -import org.junit.Test; - -public class LRUPageFrameTest { - - @Test - public void testAccess() { - LRUPageFrame frame = new LRUPageFrame(3); - frame.access(7); - Assert.assertEquals("7", frame.toString()); - frame.access(0); - Assert.assertEquals("0,7", frame.toString()); - frame.access(7); - Assert.assertEquals("7,0", frame.toString()); - frame.access(1); - Assert.assertEquals("1,7,0", frame.toString()); - frame.access(2); - Assert.assertEquals("2,1,7", 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()); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java index f2db5581f5..c44457c58f 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java @@ -10,93 +10,88 @@ import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; -public class Configuration { - Map actions = new HashMap<>(); - - public Configuration(String fileName) { - String packageName = this.getClass().getPackage().getName(); - - packageName = packageName.replace('.', '/'); - - InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); - - parseXML(is); - - try { - is.close(); - } catch (IOException e) { - throw new ConfigurationException(e); - } - } - - private void parseXML(InputStream is) { - SAXBuilder builder = new SAXBuilder(); - try { - Document doc = builder.build(is); - - Element root = doc.getRootElement(); - - for (Element actionElement : root.getChildren("action")) { - String actionName = actionElement.getAttributeValue("name"); - String clzName = actionElement.getAttributeValue("class"); - - ActionConfig ac = new ActionConfig(actionName, clzName); - - for (Element resultElement : actionElement.getChildren("result")) { - String resultName = resultElement.getAttributeValue("name"); - String viewName = resultElement.getText().trim(); - - ac.addViewResult(resultName, viewName); +public class Configuration { + Map actions = new HashMap<>(); + + public Configuration(String fileName) { + String packageName = this.getClass().getPackage().getName(); + + packageName = packageName.replace('.', '/'); + + InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); + + parseXML(is); + + try { + is.close(); + }catch(IOException e) { + throw new ConfigurationException(e); } - this.actions.put(actionName, ac); - } - } catch (JDOMException e) { - throw new ConfigurationException(e); - - } catch (IOException e) { - throw new ConfigurationException(e); - } - } - - public String getClassName(String action) { - ActionConfig ac = this.actions.get(action); - if (ac == null) { - return null; - } - return ac.getClassName(); - } - - public String getResultView(String action, String resultName) { - ActionConfig ac = this.actions.get(action); - if (ac == null) { - return null; - } - return ac.getViewName(resultName); - } - - private static class ActionConfig { - String name; - String clzName; - Map viewResult = new HashMap<>(); - - public ActionConfig(String actionName, String clzName) { - this.clzName = clzName; - this.name = actionName; + private void parseXML(InputStream is) { + SAXBuilder builder = new SAXBuilder(); + + try { + Document doc = builder.build(is); + + Element root = doc.getRootElement(); + + for(Element actionElement : root.getChildren("action")) { + String actionName = actionElement.getAttributeValue("name"); + String clzName = actionElement.getAttributeValue("class"); + + ActionConfig ac = new ActionConfig(actionName, clzName); + + for(Element resultElement : actionElement.getChildren("result")) { + String resultName = resultElement.getAttributeValue("name"); + String viewName = resultElement.getText().trim(); + + ac.addViewResult(resultName, viewName); + } + this.actions.put(actionName, ac); + } + }catch(JDOMException e) { + throw new ConfigurationException(e); + + }catch(IOException e) { + throw new ConfigurationException(e); + + } } - public String getClassName() { - return clzName; + public String getClassName(String action) { + ActionConfig ac = this.actions.get(action); + if(ac == null) { + return null; + } + return ac.getClassName(); } - - public void addViewResult(String name, String viewName) { - viewResult.put(name, viewName); + public String getResultView(String action, String resultName) { + ActionConfig ac = this.actions.get(action); + if(ac == null) { + return null; + } + return ac.getViewName(resultName); } - - public String getViewName(String resultName) { - return viewResult.get(resultName); + private static class ActionConfig { + String name; + String clzName; + Map viewResult = new HashMap<>(); + + public ActionConfig(String actionName, String clzName) { + this.clzName = clzName; + this.name = actionName; + } + public String getClassName() { + return clzName; + } + public void addViewResult(String name, String viewName) { + viewResult.put(name, viewName); + } + public String getViewName(String resultName) { + return viewResult.get(resultName); + } + } - - } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java index 83ab2dbe85..df763a0ab4 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java @@ -1,19 +1,18 @@ package com.github.HarryHook.coding2017.litestruts; + import java.io.IOException; import org.jdom2.JDOMException; public class ConfigurationException extends RuntimeException { - public ConfigurationException(String msg) { - super(msg); - } - - public ConfigurationException(JDOMException e) { - super(e); - } - - public ConfigurationException(IOException e) { - super(e); - } + public ConfigurationException(String msg) { + super(msg); + } + public ConfigurationException(JDOMException e) { + super(e); + } + public ConfigurationException(IOException e) { + super(e); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java index 114104c87e..9e25a7974e 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java @@ -6,39 +6,38 @@ import org.junit.Test; public class ConfigurationTest { - - Configuration cfg = new Configuration("struts.xml"); - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testGetClassName() { - String clzName = cfg.getClassName("login"); - Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LoginAction", clzName); - - clzName = cfg.getClassName("logout"); - Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LogoutAction", clzName); - } - - @Test - public void testGetResultView() { - String jsp = cfg.getResultView("login", "success"); - Assert.assertEquals("/jsp/homepage.jsp", jsp); - - jsp = cfg.getResultView("login", "fail"); - Assert.assertEquals("/jsp/showLogin.jsp", jsp); - - jsp = cfg.getResultView("logout", "success"); - Assert.assertEquals("/jsp/welcome.jsp", jsp); - - jsp = cfg.getResultView("logout", "error"); - Assert.assertEquals("/jsp/error.jsp", jsp); - } + + Configuration cfg = new Configuration("struts.xml"); + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testGetClassName() { + String clzName = cfg.getClassName("login"); + Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LoginAction", clzName); + + clzName = cfg.getClassName("logout"); + Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LogoutAction", clzName); + } + + @Test + public void testGetResultView() { + String jsp = cfg.getResultView("login", "success"); + Assert.assertEquals("/jsp/homepage.jsp", jsp); + + jsp = cfg.getResultView("login", "fail"); + Assert.assertEquals("/jsp/showLogin.jsp", jsp); + + jsp = cfg.getResultView("logout", "success"); + Assert.assertEquals("/jsp/welcome.jsp", jsp); + + jsp = cfg.getResultView("logout", "error"); + Assert.assertEquals("/jsp/error.jsp", jsp); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java index 120d72f1e0..d42f7b0cd6 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java @@ -2,42 +2,41 @@ /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * * @author liuxin * */ public class LoginAction { - - private String name; + + private String name ; private String password; private String message; - public String getName() { - return name; + public String getName() { + return name; } public String getPassword() { - return password; + return password; } public String execute() { - if ("test".equals(name) && "1234".equals(password)) { - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; + if("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; } - + public void setName(String name) { - this.name = name; + this.name = name; } - + public void setPassword(String password) { - this.password = password; + this.password = password; } - + public String getMessage() { - return this.message; + return this.message; } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java index 850f644a2b..1efcb21574 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java @@ -7,74 +7,76 @@ import java.util.List; import java.util.Map; -public class ReflectionUtil { - public static List getSetterMethods(Class clz) { +public class ReflectionUtil +{ - return getMethods(clz, "set"); - } - - public static void setParameters(Object o, Map params) { - - List methods = getSetterMethods(o.getClass()); - - for (String name : params.keySet()) { - - String methodName = "set" + name; - - for (Method m : methods) { - - if (m.getName().equalsIgnoreCase(methodName)) { - try { - m.invoke(o, params.get(name)); + public static List getSetterMethods(Class clz) { + + return getMethods(clz, "set"); + } - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); + public static void setParameters(Object o, Map params) { + + List methods = getSetterMethods(o.getClass()); + + for(String name : params.keySet()) { + + String methodName = "set" + name; + + for(Method m : methods) { + + if(m.getName().equalsIgnoreCase(methodName)) { + try { + m.invoke(o, params.get(name)); + + }catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } } } } + } - } - - public static List getGetterMethods(Class clz) { - - return getMethods(clz, "get"); - } - - public static List getMethods(Class clz, String startWithName) { + public static List getGetterMethods(Class clz) { + + return getMethods(clz, "get"); + } - List methods = new ArrayList<>(); - for (Method m : clz.getDeclaredMethods()) { + public static List getMethods(Class clz, String startWithName) { + + List methods = new ArrayList<>(); + for(Method m : clz.getDeclaredMethods()) { - if (m.getName().startsWith(startWithName)) { - methods.add(m); + if(m.getName().startsWith(startWithName)) { + methods.add(m); + } } + + return methods; } - return methods; - } - - public static Map getParameterMap(Object o) { - - Map params = new HashMap<>(); - - List methods = getGetterMethods(o.getClass()); - - for (Method m : methods) { - - String methodName = m.getName(); - String name = methodName.replaceFirst("get", "").toLowerCase(); - - try { - Object value = m.invoke(o); - params.put(name, value); - - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); + public static Map getParameterMap(Object o) { + + Map params = new HashMap<>(); + + List methods = getGetterMethods(o.getClass()); + + for(Method m : methods) { + + String methodName = m.getName(); + String name = methodName.replaceFirst("get", "").toLowerCase(); + + try { + Object value = m.invoke(o); + params.put(name, value); + + }catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } } + + return params; } - - return params; - } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java index 043b2d3050..ff4c30f05d 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java @@ -14,99 +14,100 @@ import org.junit.Before; import org.junit.Test; -public class ReflectionUtilTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testGetSetterMethod() throws Exception { - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - List methods = ReflectionUtil.getSetterMethods(clz); - - Assert.assertEquals(2, methods.size()); - - List expectedNames = new ArrayList<>(); - expectedNames.add("setName"); - expectedNames.add("setPassword"); - - Set acctualNames = new HashSet<>(); - for (Method m : methods) { +public class ReflectionUtilTest { - acctualNames.add(m.getName()); + @Before + public void setUp() throws Exception { } - Assert.assertTrue(acctualNames.containsAll(expectedNames)); - } - - @Test - public void testSetParameters() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - Object o = clz.newInstance(); - - Map params = new HashMap(); - params.put("name", "test"); - params.put("password", "1234"); - - ReflectionUtil.setParameters(o, params); - - Field f = clz.getDeclaredField("name"); - - f.setAccessible(true); - Assert.assertEquals("test", f.get(o)); - - f = clz.getDeclaredField("password"); - f.setAccessible(true); - Assert.assertEquals("1234", f.get(o)); - } - - @Test - public void testGetGetterMethod() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - List methods = ReflectionUtil.getGetterMethods(clz); - - Assert.assertEquals(3, methods.size()); - - List expectedNames = new ArrayList<>(); - expectedNames.add("getMessage"); - expectedNames.add("getName"); - expectedNames.add("getPassword"); - - Set acctualNames = new HashSet<>(); - for (Method m : methods) { - - acctualNames.add(m.getName()); + @After + public void tearDown() throws Exception { } - Assert.assertTrue(acctualNames.containsAll(expectedNames)); - - } - - @Test - public void testGetParameters() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - LoginAction action = (LoginAction) clz.newInstance(); - action.setName("test"); - action.setPassword("1234"); - - Map params = ReflectionUtil.getParameterMap(action); - Assert.assertEquals(3, params.size()); - Assert.assertEquals(null, params.get("message")); - Assert.assertEquals("test", params.get("name")); - Assert.assertEquals("1234", params.get("password")); - } + @Test + public void testGetSetterMethod() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getSetterMethods(clz); + + Assert.assertEquals(2, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("setName"); + expectedNames.add("setPassword"); + + Set acctualNames = new HashSet<>(); + for(Method m : methods) { + + acctualNames.add(m.getName()); + } + + Assert.assertTrue(acctualNames.containsAll(expectedNames)); + } + + @Test + public void testSetParameters() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + Object o = clz.newInstance(); + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + ReflectionUtil.setParameters(o, params); + + Field f = clz.getDeclaredField("name"); + + f.setAccessible(true); + Assert.assertEquals("test", f.get(o)); + + f = clz.getDeclaredField("password"); + f.setAccessible(true); + Assert.assertEquals("1234", f.get(o)); + } + + @Test + public void testGetGetterMethod() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getGetterMethods(clz); + + Assert.assertEquals(3, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("getMessage"); + expectedNames.add("getName"); + expectedNames.add("getPassword"); + + Set acctualNames = new HashSet<>(); + for(Method m : methods) { + + acctualNames.add(m.getName()); + } + + Assert.assertTrue(acctualNames.containsAll(expectedNames)); + + } + + @Test + public void testGetParameters() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + LoginAction action = (LoginAction)clz.newInstance(); + action.setName("test"); + action.setPassword("1234"); + + Map params = ReflectionUtil.getParameterMap(action); + Assert.assertEquals(3, params.size()); + Assert.assertEquals(null, params.get("message")); + Assert.assertEquals("test", params.get("name")); + Assert.assertEquals("1234", params.get("password")); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java index 4a55b6c2d1..270e26a57d 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java @@ -4,43 +4,45 @@ import java.util.Map; public class Struts { - + private final static Configuration cfg = new Configuration("struts.xml"); - - public static View runAction(String actionName, Map parameters) { - + + public static View runAction(String actionName, Map parameters) { + String clzName = cfg.getClassName(actionName); - - if (clzName == null) { - + + if(clzName == null) { + return null; - } - + } + + try { - - Class clz = Class.forName(clzName); + + Class clz = Class.forName(clzName); Object action = clz.newInstance(); - + ReflectionUtil.setParameters(action, parameters); - + Method m = clz.getDeclaredMethod("execute"); - String resultName = (String) m.invoke(action); + String resultName = (String)m.invoke(action); + Map params = ReflectionUtil.getParameterMap(action); String resultView = cfg.getResultView(actionName, resultName); - + View view = new View(); view.setParameters(params); view.setJsp(resultView); return view; - - } catch (Exception e) { - + + }catch(Exception e) { + e.printStackTrace(); } - + return null; - + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java index 26b12d610c..23dd0a0845 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java @@ -8,43 +8,43 @@ public class StrutsTest { - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name", "test"); - params.put("password", "1234"); - - View view; - - view = Struts.runAction(actionName, params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - - } - - @Test - public void testLoginActionFailed() { - - String actionName = "login"; - Map params = new HashMap(); - params.put("name", "test"); - params.put("password", "123456"); // 密码和预设的不一致 - - try { - + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + View view; - + view = Struts.runAction(actionName, params); - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } catch (Exception e) { - e.printStackTrace(); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } - } + @Test + public void testLoginActionFailed() { + + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + try { + + View view; + + view = Struts.runAction(actionName,params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + + }catch(Exception e) { + e.printStackTrace(); + } + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java index 258b376ae2..3e35a849c3 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java @@ -2,31 +2,30 @@ import java.util.Map; -public class View { - private String jsp; - private Map parameters; - - // 对应action获取Jsp - public String getJsp() { - - return jsp; - } - - public View setJsp(String jsp) { - - this.jsp = jsp; - return this; - } - - // execute()获取对应参数 - public Map getParameters() { - - return parameters; - } - - public View setParameters(Map parameters) { - - this.parameters = parameters; - return this; - } +public class View +{ + private String jsp; + private Map parameters; + + //对应action获取Jsp + public String getJsp() { + + return jsp; + } + public View setJsp(String jsp) { + + this.jsp = jsp; + return this; + } + + //execute()获取对应参数 + public Map getParameters() { + + return parameters; + } + public View setParameters(Map parameters) { + + this.parameters = parameters; + return this; + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java deleted file mode 100644 index cd82fb2550..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.github.HarryHook.coding2017.queue; - -/** - * 用数组实现循环队列 - * - * @author liuxin - * - * @param - */ -public class CircleQueue { - - private final static int DEFAULT_SIZE = 10; - - // 用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE]; - - // 队头 - private int front = 0; - // 队尾 - private int rear = 0; - - public boolean isEmpty() { - return false; - - } - - public int size() { - return -1; - } - - public void enQueue(E data) { - - } - - public E deQueue() { - return null; - } -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java deleted file mode 100644 index 7b5fe53f5e..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.github.HarryHook.coding2017.queue; - -import java.util.List; - -/** - * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), - * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 - * - * @author liuxin - * - */ -public class Josephus { - - public static List execute(int n, int m) { - return null; - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java deleted file mode 100644 index 39d2ef9971..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.github.HarryHook.coding2017.queue; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class JosephusTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testExecute() { - - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); - - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java deleted file mode 100644 index 3be0147770..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.github.HarryHook.coding2017.queue; - -import java.util.NoSuchElementException; - -public class Queue { - private Node first; - private Node last; - private int size; - - private static class Node { - private E item; - private Node next; - } - - public Queue() { - first = null; - last = null; - size = 0; - } - - public boolean isEmpty() { - return first == null; - } - - public int size() { - return size; - } - - public void enQueue(E data) { - Node oldlast = last; - last = new Node(); - last.item = data; - last.next = null; - if (isEmpty()) { - first = last; - } else { - oldlast.next = last; - } - size++; - } - - public E deQueue() { - if (isEmpty()) { - throw new NoSuchElementException("Queue underflow"); - } - E item = first.item; - first = first.next; - size--; - if (isEmpty()) { - last = null; - } - return item; - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java deleted file mode 100644 index c72abadcd2..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.HarryHook.coding2017.queue; - -import java.util.Stack; - -/** - * 用两个栈来实现一个队列 - * - * @author liuxin - * - * @param - */ -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - public boolean isEmpty() { - return false; - } - - public int size() { - return -1; - } - - public void enQueue(E item) { - - } - - public E deQueue() { - return null; - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java deleted file mode 100644 index 32bbc0da28..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.github.HarryHook.coding2017.stack; - -import com.github.HarryHook.coding2017.basic.MyStack; - -public class StackUtil { - - /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - */ - - public void reverse(MyStack s) { - - if (s.isEmpty()) { - return; - } - // 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。 - Object tmp1 = s.pop(); - reverse(s); - if (s.isEmpty()) { - s.push(tmp1); - return; - } - Object temp2 = s.pop(); - reverse(s); - s.push(tmp1); - reverse(s); - s.push(temp2); - - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public void remove(MyStack s, Object o) { - if (s.isEmpty()) { - return; - } - MyStack stack = new MyStack(); - while (!(s.isEmpty())) { - if (s.peek() != o) { - stack.push(s.pop()); - } else { - s.pop(); - } - } - while (!(stack.isEmpty())) { - s.push(stack.pop()); - } - - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, - * 可以使用另外一个栈来辅助 - * - * @param len - * @return - */ - public Object[] getTop(MyStack s, int len) { - if (s.isEmpty() || len <= 0) { - return null; - } - if (len > s.size()) { - len = s.size(); - } - Object[] array = new Object[len]; - - int i = 0; - while (i < len) { - array[i++] = s.pop(); - } - while (i != 0) { - s.push(array[--i]); - } - return array; - } - - /** - * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s = - * "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true 如果 s = "([b{x]y})", - * 则该字符串中的括号不是成对出现的, 该方法返回false; - * - * @param s - * @return - */ - public boolean isValidPairs(String s) { - if (s == null || s == "") { - return false; - } - MyStack stack = new MyStack(); - for (int i = 0; i < s.length(); i++) { - if (s.charAt(i) == '(') { - stack.push(s.charAt(i)); - } else if (s.charAt(i) == ')') { - if (stack.isEmpty()) { - return false; - } else { - char outOfStackChar = (char) stack.pop(); - if (outOfStackChar != '(') { - return false; - } - } - } - - if (s.charAt(i) == '{') { - stack.push(s.charAt(i)); - } else if (s.charAt(i) == '}') { - if (stack.isEmpty()) { - return false; - } else { - char outOfStackChar = (char) stack.pop(); - if (outOfStackChar != '{') { - return false; - } - } - } - - if (s.charAt(i) == '[') { - stack.push(s.charAt(i)); - } else if (s.charAt(i) == ']') { - if (stack.isEmpty()) { - return false; - } else { - char outOfStackChar = (char) stack.pop(); - if (outOfStackChar != '[') { - return false; - } - } - } - - } - return true; - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java deleted file mode 100644 index 59f1fa1a40..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.github.HarryHook.coding2017.stack; -import com.github.HarryHook.coding2017.basic.MyStack; -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class StackUtilTest { - private StackUtil sk; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testReverse() { - sk = new StackUtil(); - MyStack stack = new MyStack(); - stack.push(1); - stack.push(2); - stack.push(3); - sk.reverse(stack); - assertEquals(1, stack.pop()); - assertEquals(2, stack.pop()); - assertEquals(3, stack.pop()); - } - @Test - public void testRemove() { - sk = new StackUtil(); - MyStack stack = new MyStack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(2); - stack.push(5); - sk.remove(stack, 2); - assertEquals(5, stack.pop()); - assertEquals(3, stack.pop()); - assertEquals(1, stack.pop()); - } - @Test - public void testGetTop() { - sk = new StackUtil(); - MyStack stack = new MyStack(); - - Object[] array = sk.getTop(stack, 3); - assertNull(array); - - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(2); - stack.push(5); - array = sk.getTop(stack, 3); - assertArrayEquals(array, new Object[] {5, 2, 3}); - array = sk.getTop(stack, 6); - assertArrayEquals(array, new Object[] {5, 2, 3, 2, 1}); - array = sk.getTop(stack, -1); - assertNull(array); - } - @Test - public void testIsValidPairs() { - sk = new StackUtil(); - String expr = null; - assertEquals(false, sk.isValidPairs(expr)); - expr = ""; - assertEquals(false, sk.isValidPairs(expr)); - expr = "{xx[x]t)yyza]}"; - assertEquals(false, sk.isValidPairs(expr)); - expr = "asd{[(asds)]sx}"; - assertEquals(true, sk.isValidPairs(expr)); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java deleted file mode 100644 index b9667fdaac..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import com.github.HarryHook.coding2017.basic.MyStack; - -public class InfixExpr { - - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - char[] ch = expr.toCharArray(); - MyStack stackOfOperator = new MyStack(); - MyStack stackOfNumber = new MyStack(); - - for (int i = 0; i < ch.length; i++) { - - if (Character.isDigit(ch[i])) { - float tmp = Float.parseFloat("" + ch[i]); - while (i < ch.length - 1 && Character.isDigit(ch[++i])) { - tmp = tmp * 10 + Float.parseFloat("" + ch[i]); - } - - stackOfNumber.push(tmp); - - } - if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') { - stackOfOperator.push(ch[i]); - } - - char operator = (char) stackOfOperator.peek(); - if (operator == '*' || operator == '/') { - float tmp = Float.parseFloat("" + ch[++i]); - while (i < ch.length - 1 && Character.isDigit(ch[++i])) { - tmp = tmp * 10 + Float.parseFloat("" + ch[i]); - } - if (i != ch.length - 1) { - i--; - } - stackOfNumber.push(tmp); - - float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); - float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); - if (operator == '*') { - stackOfNumber.push(tmp1 * tmp2); - } else { - stackOfNumber.push(tmp2 / tmp1); - } - - stackOfOperator.pop(); - } - - } - // 将栈中的数字和运算符逆置,从左往右结合 - reverse(stackOfNumber); - reverse(stackOfOperator); - - while (!(stackOfOperator.isEmpty())) { - char operator = (char) stackOfOperator.peek(); - if (operator == '+' || operator == '-') { - float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); - float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); - if (operator == '+') { - stackOfNumber.push(tmp1 + tmp2); - } else { - stackOfNumber.push(tmp1 - tmp2); - } - } - - stackOfOperator.pop(); - } - - return Float.parseFloat("" + stackOfNumber.pop()); - } - - private void reverse(MyStack s) { - - if (s.isEmpty()) { - return; - } - // 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。 - Object tmp1 = s.pop(); - reverse(s); - if (s.isEmpty()) { - s.push(tmp1); - return; - } - Object temp2 = s.pop(); - reverse(s); - s.push(tmp1); - reverse(s); - s.push(temp2); - - } - - public static void main(String[] args) { - InfixExpr expr = new InfixExpr("2+3*4+5"); - System.out.println(expr.evaluate()); - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java deleted file mode 100644 index 4abd227502..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import org.junit.Assert; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - // InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java deleted file mode 100644 index 10088e28cd..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; - -//中序表达式: 3*20+12*5-40/2 转换成后续表达式:3 20 * 12 5 * + 40 2 / - -//思路:当前token依次从左往右读取, 数字依次append, 当前入栈的运算符的优先级小于等于栈顶的运算符,栈顶操作符出栈 -public class InfixToPostfix { - - public List convert(String expr) { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - - List listOfTokens = new ArrayList<>(); - - Stack opsStack = new Stack<>(); - - for (Token token : tokens) { - - if (token.isNumber()) { - listOfTokens.add(token); - } else if (token.isOperator()) { // 还需判断当前操作符和栈顶操作符的优先级 - if (opsStack.isEmpty()) { - opsStack.push(token); - } else { - if (!token.hasHigherPriority(opsStack.peek())) { - listOfTokens.add(opsStack.pop()); - } - opsStack.push(token); - } - - } - } - while (!(opsStack.isEmpty())) { // exprStack 为空,但操作符栈还有元素 - listOfTokens.add(opsStack.pop()); - } - return listOfTokens; - } - - public static void main(String[] args) { - InfixToPostfix toPostfix = new InfixToPostfix(); - List t = new ArrayList(); - String expr = "3+20+12*5+40/2"; - t = toPostfix.convert(expr); - System.out.println("expr: " + expr); - System.out.println("PostfixExpr: " + t); - } - -} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java deleted file mode 100644 index 49bebad1a7..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import java.util.List; -import java.util.Stack; - -public class PostfixExpr { - String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - Stack numStack = new Stack<>(); - for (Token token : tokens) { - - if (token.isNumber()) { - numStack.push(new Float(token.getIntValue())); - } else { - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(), f1, f2)); - } - } - return numStack.pop().floatValue(); - } - - // 注意,此时计算的顺序和前序的次序相反 - private Float calculate(String op, Float f1, Float f2) { - if (op.equals("+")) { - return f1 + f2; - } - if (op.equals("-")) { - return f1 - f2; - } - if (op.equals("*")) { - return f1 * f2; - } - if (op.equals("/")) { - return f1 / f2; - } - throw new RuntimeException(op + " is not supported"); - } - - public static void main(String[] args) { - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - System.out.println("The result of the expression: " + expr.evaluate()); - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java deleted file mode 100644 index 7e78fa3997..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(), 0.0f); - } - { - // 9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(), 0.0f); - } - - { - // 10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(), 0.0f); - } - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java deleted file mode 100644 index d93b6e32fe..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import java.util.List; -import java.util.Stack; - -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - Stack exprStack = new Stack<>(); - Stack numStack = new Stack<>(); - for (Token token : tokens) { - exprStack.push(token); - } - System.out.println(tokens); - while (!exprStack.isEmpty()) { - Token t = exprStack.pop(); - if (t.isNumber()) { - numStack.push(new Float(t.getIntValue())); - } else if(t.isOperator()){ - Float f1 = numStack.pop(); - Float f2 = numStack.pop(); - numStack.push(calculate(t.toString(), f1, f2)); - } - } - return numStack.pop().floatValue(); - } - - private Float calculate(String op, Float f1, Float f2) { - if (op.equals("+")) { - return f1 + f2; - } - if (op.equals("-")) { - return f1 - f2; - } - if (op.equals("*")) { - return f1 * f2; - } - if (op.equals("/")) { - return f1 / f2; - } - throw new RuntimeException(op + " is not supported"); - } - - public static void main(String[] args) { - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - System.out.println("The result of the expression: " + expr.evaluate()); - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java deleted file mode 100644 index 3dbef83ca2..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(), 0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(), 0.001f); - } - { - // (3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(), 0.001f); - } - { - // 1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(), 0.001f); - } - - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java deleted file mode 100644 index 097d635bd2..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - - public Token(int type, String value) { - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - - public String toString() { - return value; - } - - public boolean hasHigherPriority(Token t) { - if (!this.isOperator() && !t.isOperator()) { - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java deleted file mode 100644 index 8d520fd68a..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else { - System.out.println("char :[" + c + "] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java deleted file mode 100644 index 3067467a10..0000000000 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.github.HarryHook.coding2017.stack.expr; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} \ No newline at end of file diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 8380fddb34..0a2df7bbee 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -1,7 +1,4 @@ target/ .idea/ src/main/java/train/ -!src/main/resources/**/*.class -!src/main/resources/**/*.xml -src/main/resources/**/*.png -src/main/java/assignments +src/main/resources/ \ No newline at end of file diff --git a/group02/812350401/pom.xml b/group02/812350401/pom.xml index 596d874817..9a637781ce 100644 --- a/group02/812350401/pom.xml +++ b/group02/812350401/pom.xml @@ -7,7 +7,6 @@ coding2017 812350401 1.0-SNAPSHOT - jar @@ -33,32 +32,7 @@ dom4j 1.6.1 - - org.jetbrains - annotations - RELEASE - - - - commons-io - commons-io - 2.5 - - - - org.apache.commons - commons-lang3 - 3.4 - - - - io.reactivex.rxjava2 - rxjava - 2.0.8 - - - \ No newline at end of file diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java new file mode 100644 index 0000000000..ddfe76f774 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java @@ -0,0 +1,25 @@ +package com.github.miniyk2012.coding2017.basic; + +public class Stack { + + // 栈顶 《-》 1,2,3,4 栈底 + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(0, o); + } + + public Object pop(){ + return elementData.remove(0); + } + + public Object peek(){ + return elementData.get(0); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java deleted file mode 100644 index b29b385d31..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.linklist; - -/** - * 用双向链表实现LRU算法 - * @author liuxin - * - */ -public class LRUPageFrame { - - private static class Node { - - Node prev; - Node next; - int pageNum; - - Node() { - } - - Node(int pageNum) { - this.pageNum = pageNum; - } - } - - private int capacity; - private int size; - - private Node first;// 链表头 - private Node last;// 链表尾 - - - public LRUPageFrame(int capacity) { - - this.capacity = capacity; - - } - - /** - * 获取缓存中对象 - * - * @param pageNum: page值 - * @return - */ - public void access(int pageNum) { - Node hitNode = get(pageNum); - if (null == hitNode) { - hitNode = new Node(pageNum); - addTop(hitNode); - if (size > capacity) { - delBottom(); - } - } else { - switchTop(hitNode); - } - } - - /** - * 获取值为pageNum的Node,如果没有返回null - * @param pageNum - * @return - */ - private Node get(int pageNum) { - Node currentNode = first; - while (currentNode != null) { - if (currentNode.pageNum == pageNum) return currentNode; - currentNode = currentNode.next; - } - return null; - } - - /** - * 往顶部放一个Node - * @param node - */ - private void addTop(Node node) { - size++; - if (first == null) { - first = last = node; - } else { - node.next = first; - first.prev = node; - first = node; - } - } - - /** - * 把node和顶部做交换 - * @param node - */ - private void switchTop(Node node) { - if (node == first) return; - Node preNode = node.prev; - Node nextNode = node.next; - preNode.next = nextNode; - if (nextNode != null) { - nextNode.prev = preNode; - } else { - last = preNode; - } - node.next = node.prev = null; - addTop(node); - size--; - } - - /** - * 把底部的踢掉 - */ - private void delBottom() { - size--; - if (last == first) first = null; - Node temp = last; - last = last.prev; - temp.prev = null; - last.next = 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(); - } - - /** - * 测试双向链表逆序输出 - * @return - */ - public String lastToString(){ - StringBuilder buffer = new StringBuilder(); - Node node = last; - while(node != null){ - buffer.append(node.pageNum); - - node = node.prev; - if(node != null){ - buffer.append(","); - } - } - return buffer.toString(); - } - -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java deleted file mode 100644 index 9f93ca8fc6..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.linklist; - -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); - Assert.assertEquals("0,7", frame.toString()); - Assert.assertEquals("7,0", frame.lastToString()); - frame.access(1); - Assert.assertEquals("1,0,7", frame.toString()); - Assert.assertEquals("7,0,1", frame.lastToString()); - frame.access(2); - Assert.assertEquals("2,1,0", frame.toString()); - Assert.assertEquals("0,1,2", frame.lastToString()); - frame.access(0); - Assert.assertEquals("0,2,1", frame.toString()); - Assert.assertEquals("1,2,0", frame.lastToString()); - frame.access(0); - Assert.assertEquals("0,2,1", frame.toString()); - Assert.assertEquals("1,2,0", frame.lastToString()); - frame.access(3); - Assert.assertEquals("3,0,2", frame.toString()); - Assert.assertEquals("2,0,3", frame.lastToString()); - frame.access(0); - Assert.assertEquals("0,3,2", frame.toString()); - Assert.assertEquals("2,3,0", frame.lastToString()); - frame.access(4); - Assert.assertEquals("4,0,3", frame.toString()); - Assert.assertEquals("3,0,4", frame.lastToString()); - frame.access(4); - Assert.assertEquals("4,0,3", frame.toString()); - Assert.assertEquals("3,0,4", frame.lastToString()); - frame.access(4); - Assert.assertEquals("4,0,3", frame.toString()); - Assert.assertEquals("3,0,4", frame.lastToString()); - frame.access(0); - Assert.assertEquals("0,4,3", frame.toString()); - Assert.assertEquals("3,4,0", frame.lastToString()); - frame.access(7); - Assert.assertEquals("7,0,4", frame.toString()); - Assert.assertEquals("4,0,7", frame.lastToString()); - frame.access(4); - Assert.assertEquals("4,7,0", frame.toString()); - Assert.assertEquals("0,7,4", frame.lastToString()); - - LRUPageFrame frame2 = new LRUPageFrame(1); - Assert.assertEquals("", frame2.toString()); - frame2.access(7); - Assert.assertEquals("7", frame2.toString()); - frame2.access(0); - Assert.assertEquals("0", frame2.toString()); - } - -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java deleted file mode 100644 index 19cd662268..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.stack; - -import com.github.miniyk2012.coding2017.basic.ArrayList; - -public class Stack { - - // 栈顶 《-》 1,2,3,4 栈底 - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(0, o); - } - - // 如果队列已经没有值了,则抛出ArrayIndexOutOfBoundsException的异常 - public Object pop(){ - try { - return elementData.remove(0); - } catch (Exception e) { - throw new NullStackException(); - } - } - - public Object peek(){ - return elementData.get(0); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } - - public static void main(String[] args) { - Stack s = new Stack(); - s.pop(); - } - - public static class NullStackException extends RuntimeException { - NullStackException() { - super("Null Stack!"); - } - } -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java deleted file mode 100644 index c4e253d92b..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.stack; - -import com.github.miniyk2012.coding2017.basic.Queue; -import java.util.*; - -/** - * Created by thomas_young on 5/4/2017. - */ -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) { - Queue q = new Queue(); - while (!s.isEmpty()) { - q.enQueue(s.pop()); - } - while (!q.isEmpty()) { - s.push(q.deQueue()); - } - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s,Object o) { - Stack tempS = new Stack(); - boolean found = false; - while (!s.isEmpty()) { - if (!found && Objects.equals(s.peek(), o)) { - s.pop(); - found = true; - } else { - tempS.push(s.pop()); - } - } - while (!tempS.isEmpty()) { - s.push(tempS.pop()); - } - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param len - * @return - */ - public static Object[] getTop(Stack s, int len) { - if (len < 0) { - return null; - } - Stack tempS = new Stack(); - while (tempS.size() matchBrackets = new HashMap() {{ - put("{", "}"); - put("[", "]"); - put("(", ")"); - }}; - - Stack stack = new Stack(); - for (int i=0; i evaluate(Token operator, Token number1, Token number2) { - float ret; - switch (operator.value) { - case PLUS: - ret = number1.getValue() + number2.getValue(); - break; - case SUB: - ret = number1.getValue() - number2.getValue(); - break; - case MUL: - ret = number1.getValue() * number2.getValue(); - break; - case DIV: - ret = number1.getValue() / number2.getValue(); - break; - default: - throw new RuntimeException("运算符不存在"); - } - return new Token(ret, true); - } - - - public float evaluate() { - List tokens= Token.parse(expr); - Stack> numberStack = new Stack<>(); - Stack> operatorStack = new Stack<>(); - for (Token t : tokens) { - if (t.isNumber()) { - numberStack.push(t); - } else { - if (operatorStack.isEmpty()) { - operatorStack.push(t); - } else { - Token preT = operatorStack.peek(); - if ((preT.value).priority >= ((Operator)t.value).priority) { - Token number2 = numberStack.pop(); - Token number1 = numberStack.pop(); - operatorStack.pop(); - numberStack.push(evaluate(preT, number1, number2)); - } - operatorStack.push(t); - - } - } - } - while (!operatorStack.isEmpty()) { - Token number2 = numberStack.pop(); - Token number1 = numberStack.pop(); - Token operator = operatorStack.pop(); - numberStack.push(evaluate(operator, number1, number2)); - } - return numberStack.pop().getValue(); - } - - - private static class Token { - private boolean number; // 是数字/操作符 - private T value; - public boolean isNumber() { - return number; - } - public T getValue() { - return value; - } - - public Token(T value, boolean number) { - this.value = value; - this.number = number; - } - public static List parse(String expr) { - int i = 0; - int size = expr.length(); - String current; - List tokens = new LinkedList<>(); - String value = ""; - while (i < size) { - current = expr.substring(i,i+1); - if (isOperator(current)) { - tokens.add(new Token(Float.parseFloat(value), true)); - value = ""; - tokens.add(new Token(Operator.parseOperator(current), false)); - } else { - value += current; - } - i++; - } - tokens.add(new Token(Float.parseFloat(value), true)); - return tokens; - } - - private static boolean isOperator(String value) { - for (Operator c : Operator.values()) { - if (c.value.equals(value)) { - return true; - } - } - return false; - } - } - - public static void main(String[] args) { - - - } -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index 706aaea86e..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.github.miniyk2012.coding2017.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3"); - Assert.assertEquals(5.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java deleted file mode 100644 index 75a579e3cb..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java deleted file mode 100644 index c4d13704f2..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.jvm.clz; - - -import com.github.miniyk2012.coding2017.coderising.jvm.constant.ClassInfo; -import com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java deleted file mode 100644 index b71f919b66..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java deleted file mode 100644 index e818dcb72b..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java deleted file mode 100644 index 3ec050d100..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java deleted file mode 100644 index 09370db1e5..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.jvm.constant; - -import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; - -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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 98c5ced1a9..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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(); - return classInfo.getClassName(); - - } - - 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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index a3cf910c99..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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()); - ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(classInfoIndex); - return clzInfo.getClassName(); - } - - public String getMethodName(){ - // ConstantPool pool = this.getConstantPool(); - // NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); - NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(nameAndTypeIndex); - return typeInfo.getName(); - } - - public String getParamAndReturnType(){ - // ConstantPool pool = this.getConstantPool(); - // NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); - NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(nameAndTypeIndex); - return typeInfo.getTypeInfo(); - } - -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 79f421bdd1..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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); - UTF8Info utf8Info1 = (UTF8Info)getConstantInfo(index1); - return utf8Info1.getValue(); - } - - public String getTypeInfo(){ - // ConstantPool pool = this.getConstantPool(); - // UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2); - UTF8Info utf8Info2 = (UTF8Info)getConstantInfo(index2); - return utf8Info2.getValue(); - } - - public String toString(){ - return "(" + getName() + "," + getTypeInfo()+")"; - } -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 2a16601a40..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index 428191ee6a..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index 3247ec1656..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 73eb2fc1ff..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.jvm.loader; - -import com.github.miniyk2012.coding2017.coderising.jvm.util.Util; -import org.apache.commons.lang3.ArrayUtils; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; - -public class ByteCodeIterator { - private byte[] codes; - private int point = 0; - - public ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - public int nextU1toInt() { - byte[] u1 = new byte[] {codes[point++]}; - return Util.byteToInt(u1); - } - - public int nextU2toInt() { - byte[] u2 = new byte[] {codes[point++], codes[point++]}; - return Util.byteToInt(u2); - } - - /** - * 读取n个字节,并编码成UTF-8输出,point自动增加 - * @param n - * @return - */ - public String readUtf8(int n) - { - byte[] info = Arrays.copyOfRange(codes, point, point+n); - String utf8; - try { - utf8 = new String(info, "UTF-8"); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("常量池UTF-8编码错误"); - } - point += n; - return utf8; - } - - /** - * 返回当前位置 - * @return - */ - public int position() { - return point; - } - - /** - * n可正可负 - * @param n - */ - public void skip(int n) { - point = point + n; - } - - public void seek(int n) { - if (n >= codes.length || n < 0) throw new IndexOutOfBoundsException(); - point = n; - } - - public static void main(String[] args) throws UnsupportedEncodingException { - byte[] codes = {0x00, 0x34, 0x00}; - ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes); - System.out.println(byteCodeIterator.nextU2toInt()); - System.out.println(byteCodeIterator.nextU1toInt()); - - byte[] codes2 = "Employee".getBytes("UTF-8"); - byte[] codes3 = ArrayUtils.addAll(codes2, codes); - byteCodeIterator = new ByteCodeIterator(codes3); - System.out.println(byteCodeIterator.readUtf8(codes2.length)); - System.out.println(byteCodeIterator.nextU2toInt()); - System.out.println(byteCodeIterator.nextU1toInt()); - } -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 650afcb6c1..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.jvm.loader; - -import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; -import org.apache.commons.io.FileUtils; -import java.io.*; -import java.util.ArrayList; -import java.util.List; - -public class ClassFileLoader { - - private List clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - - String classPath = className.replace(".", File.separator) + ".class"; - for (String parentPath: clzPaths) { - try { - String fullPath = parentPath + File.separator + classPath; - return FileUtils.readFileToByteArray(new File(fullPath)); - } catch (IOException e) { - continue; - } - } - return null; - } - - public void addClassPath(String path) { - clzPaths.add(path); - } - - public String getClassPath(){ - return String.join(";", clzPaths); - } - - public ClassFile loadClass(String className) { - byte[] codes = this.readBinaryCode(className); - ClassFileParser parser = new ClassFileParser(); - return parser.parse(codes); - - } - - // backup - public byte[] readBinaryCodeV1(String className) { - byte[] ret = null; - String classPath = className.replace(".", File.separator) + ".class"; - for (String parentPath: clzPaths) { - String fullPath = parentPath + File.separator + classPath; - ret = readFileToByteArray(fullPath); - if (null != ret) { - return ret; - } - - } - return ret; - - } - - private byte[] readFileToByteArray(String fullPath) { - InputStream is = null; - ByteArrayOutputStream bas = null; - byte[] ret = null; - try { - is = new BufferedInputStream(new FileInputStream(new File(fullPath))); - bas = new ByteArrayOutputStream(); - byte[] buf = new byte[1024]; - int bytesRead = 0; - while ((bytesRead = is.read(buf)) != -1) { - bas.write(buf, 0, bytesRead); - } - ret = bas.toByteArray(); - } catch (IOException e) { -// e.printStackTrace(); - } finally { - try { - if (is != null) - is.close(); - if (bas != null) - bas.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return ret; - } - - public static void main(String[] args) { - new ClassFileLoader().readBinaryCode(""); - } -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java deleted file mode 100644 index 7b84a15899..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.jvm.loader; - -import com.github.miniyk2012.coding2017.coderising.jvm.clz.AccessFlag; -import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; -import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassIndex; -import com.github.miniyk2012.coding2017.coderising.jvm.constant.*; - - -public class ClassFileParser { - - public ClassFile parse(byte[] codes) { - - ClassFile clzFile = new ClassFile(); - ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes); - byteCodeIterator.skip(4); // skip magic - int minorVersion = byteCodeIterator.nextU2toInt(); - int majorVersion = byteCodeIterator.nextU2toInt(); - ConstantPool constantPool = parseConstantPool(byteCodeIterator); - AccessFlag accessFlag = parseAccessFlag(byteCodeIterator); - ClassIndex classIndex = parseClassInfex(byteCodeIterator); - - clzFile.setMinorVersion(minorVersion); - clzFile.setMajorVersion(majorVersion); - clzFile.setConstPool(constantPool); - clzFile.setAccessFlag(accessFlag); - clzFile.setClassIndex(classIndex); - return clzFile; - } - - protected AccessFlag parseAccessFlag(ByteCodeIterator iter) { - int access_flags = iter.nextU2toInt(); - AccessFlag accessFlag = new AccessFlag(access_flags); - return accessFlag; - } - - protected ClassIndex parseClassInfex(ByteCodeIterator iter) { - ClassIndex classIndex = new ClassIndex(); - int thisClassIndex = iter.nextU2toInt(); - int superClassIndex = iter.nextU2toInt(); - classIndex.setThisClassIndex(thisClassIndex); - classIndex.setSuperClassIndex(superClassIndex); - return classIndex; - } - - protected ConstantPool parseConstantPool(ByteCodeIterator iter) { - ConstantPool constantPool = new ConstantPool(); - int constant_pool_count = iter.nextU2toInt(); - ConstantInfo constantInfo; - constantPool.addConstantInfo(new NullConstantInfo()); - for (int i=1; 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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java deleted file mode 100644 index 10cf71d576..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java deleted file mode 100644 index 2f1d3e929b..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.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 parameters) throws Exception { + public static View runAction(String actionName, Map parameters) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { /* @@ -95,9 +93,10 @@ private static Map getFields() return map; } - private static void readXml() throws DocumentException, URISyntaxException { - URL url = Struts.class.getClassLoader().getResource("struts/struts.xml"); - File aFile = new File(url.toURI()); + private static void readXml() throws DocumentException { + String fileName = Thread.currentThread().getContextClassLoader().getResource("").getPath() + + "com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml"; + File aFile = new File(fileName); SAXReader xmlReader = new SAXReader(); doc = xmlReader.read(aFile); } @@ -162,16 +161,13 @@ private static void generateObject(String actionName) } - public static void main(String args[]) throws Exception + public static void main(String args[]) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { -// Map params = new HashMap(); -// params.put("name","test"); -// params.put("password","1234"); -// View view = runAction("login", params); -// logger.info(view.toString()); - System.out.println(Struts.class.getResource("")); - System.out.println(Struts.class.getResource("/")); - System.out.println(Struts.class.getClassLoader().getResource("")); + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + View view = runAction("login", params); + logger.info(view.toString()); } } diff --git a/group02/812350401/src/main/resources/struts/struts.xml b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml similarity index 100% rename from group02/812350401/src/main/resources/struts/struts.xml rename to group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml diff --git a/group02/812350401/src/main/resources/jvm/com/github/miniyk2012/coding2017/jvm/test/EmployeeV1.class b/group02/812350401/src/main/resources/jvm/com/github/miniyk2012/coding2017/jvm/test/EmployeeV1.class deleted file mode 100644 index c6c3c4a41546ae14b237a06a8f0868a61dc42cf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1056 zcmah|?M@Rx6g^W)Kb93rYikjZ1yTEftSIUa3<)tBNGh6Onh<{tWrEx6cAM^&q>rTu zkZ9rq_)x|((;~rQ%x-4yow@hibI!Cse|`G_U=uIWNC>R7!oY2X$ExQ=UgyMZp9XHM zqS$>Cbp3FkRC6PZq(H7MPo?Wimb^b|t5z(K?8ra~_q~rjsJ@y*L0-feIuoK14Yd+#flv*C|NO#Gm#wZD&G&YSj18q z_pbSKFo zqck206pYW;F>F*&ri8AB^*dx3NROXV<zW&u2{pkVSAq|3&P2R7ekXatSzM=>9r9e) z&D1Vn*Xm~s7S1sH#WWPS=8@!@h zoMZKGYDKn`44lmtZNyM;7FE -* @since
Apr 6, 2017
-* @version 1.0 -*/ -public class StackUtilTest { - - private StackUtil sk; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testReverse() { - sk = new StackUtil(); - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - sk.reverse(stack); - assertEquals(1, stack.pop()); - assertEquals(2, stack.pop()); - assertEquals(3, stack.pop()); - } - @Test - public void testRemove() { - sk = new StackUtil(); - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(2); - stack.push(5); - sk.remove(stack, 2); - assertEquals(5, stack.pop()); - assertEquals(3, stack.pop()); - assertEquals(2, stack.pop()); - assertEquals(1, stack.pop()); - } - @Test - public void testGetTop() { - sk = new StackUtil(); - Stack stack = new Stack(); - - Object[] array = sk.getTop(stack, 3); - assertArrayEquals(array, new Object[0]); - - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(2); - stack.push(5); - array = sk.getTop(stack, 3); - assertArrayEquals(array, new Object[] {5, 2, 3}); - array = sk.getTop(stack, 6); - assertArrayEquals(new Object[] {5, 2, 3, 2, 1}, array); - array = sk.getTop(stack, -1); - assertNull(array); - } - @Test - public void testIsValidPairs() { - sk = new StackUtil(); - String expr = ""; - assertEquals(true, sk.isValidPairs(expr)); - expr = "{xx[])yyza]}"; - assertEquals(false, sk.isValidPairs(expr)); - expr = "asd{[(asds)]sx}"; - assertEquals(true, sk.isValidPairs(expr)); - } - -} diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java index 0b5276fda5..501326dae0 100644 --- a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java @@ -3,7 +3,9 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; + import com.github.miniyk2012.coding2017.coderising.download.api.ConnectionManager; +import com.github.miniyk2012.coding2017.coderising.download.api.DownloadListener; import com.github.miniyk2012.coding2017.coderising.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { @@ -22,12 +24,17 @@ public void testDownload() { String url = "http://inews.gtimg.com/newsapp_bt/0/1209438116/1000"; // String url = "https://www.baidu.com/img/bd_logo.png"; - String filePath = "src/main/resources/downloads/test.png"; - FileDownloader downloader = new FileDownloader(url, filePath); + + FileDownloader downloader = new FileDownloader(url, "test.png"); ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); - downloader.setListener(() -> downloadFinished = true); + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + }); downloader.execute(); diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java deleted file mode 100644 index 6aa66225b7..0000000000 --- a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.github.miniyk2012.coding2017.coderising.jvm.loader; - -import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; -import com.github.miniyk2012.coding2017.coderising.jvm.constant.UTF8Info; -import com.github.miniyk2012.coding2017.coderising.jvm.test.ClassFileloaderTest; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by thomas_young on 9/4/2017. - */ -public class ClassFileParserTest { - private static ClassFileParser parser; - private static byte[] byteCodes; - - @BeforeClass - public static void setUp() { - String path = ClassFileloaderTest.class.getClassLoader().getResource("jvm").getPath(); - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1"; - byteCodes = loader.readBinaryCode(className); - parser = new ClassFileParser(); - } - - @Test - public void parse() throws Exception { - - } - - @Test - public void parseAccessFlag() throws Exception { - - } - - @Test - public void parseClassInfex() throws Exception { - - } - - @Test - public void parseConstantPool() throws Exception { - ByteCodeIterator byteCodeIterator = new ByteCodeIterator(byteCodes); - byteCodeIterator.skip(8); // skip magic,minor_version,major_version - ConstantPool constantPool = parser.parseConstantPool(byteCodeIterator); - UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(5); - assertEquals("name", utf8Info.getValue()); - } - -} \ No newline at end of file diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java index f183d9a778..15e569a766 100644 --- a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java @@ -13,7 +13,7 @@ public class StrutsTest { @Test - public void testLoginActionSuccess() throws Exception { + public void testLoginActionSuccess() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { String actionName = "login"; @@ -29,7 +29,7 @@ public void testLoginActionSuccess() throws Exception { } @Test - public void testLoginActionFailed() throws Exception { + public void testLoginActionFailed() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { String actionName = "login"; Map params = new HashMap(); params.put("name","test"); @@ -42,7 +42,7 @@ public void testLoginActionFailed() throws Exception { } @Test - public void testLogoutActionSuccess() throws Exception { + public void testLogoutActionSuccess() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { String actionName = "logout"; @@ -58,7 +58,7 @@ public void testLogoutActionSuccess() throws Exception { } @Test - public void testLogoutActionFailed() throws Exception { + public void testLogoutActionFailed() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { String actionName = "logout"; Map params = new HashMap(); params.put("name","test"); diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index a1369ab554..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.exception.AddAnotherParserException; -import com.coderising.jvm.loader.ByteCodeIterator; - -public abstract class AttributeInfo { - - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - - int attrNameIndex; - int attrLen ; - - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - /** - * 解析属性 - * @param pool - * @param iter - * @return - */ - public static List parseAttributes(ConstantPool pool,ByteCodeIterator iter){ - - List attributeInfos = new ArrayList(); - try { - - int attrCount = iter.nextU2ToInt(); - for (int i = 0; i < attrCount; i++) { - - AttributeInfo attr = null; - String attrName = pool.getUTF8String(iter.nextU2ToInt()); - iter.back(ByteCodeIterator.numberTwo); - - switch (attrName) { - case AttributeInfo.CONST_VALUE: - attr = ConstantValueAttr.parse(iter); - break; - case AttributeInfo.CODE: - attr = CodeAttr.parse(pool,iter); - break; - case AttributeInfo.EXCEPTIONS: - //TODE - break; - case AttributeInfo.LINE_NUM_TABLE: - attr = LineNumberTable.parse(iter); - break; - case AttributeInfo.LOCAL_VAR_TABLE: - attr = LocalVariableTable.parse(iter); - break; - case AttributeInfo.STACK_MAP_TABLE: - attr = StackMapTable.parse(iter); - break; - default: - throw new AddAnotherParserException(); - } - attributeInfos.add(attr); - - } - } catch (AddAnotherParserException e) { - e.printStackTrace(); - } - return attributeInfos; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index 64e6226561..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.CommandParser; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class CodeAttr extends AttributeInfo { - - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - private ByteCodeCommand[] cmds ; - private List attributeInfos = new ArrayList<>(); - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - - public static CodeAttr parse(ConstantPool pool,ByteCodeIterator iter){ - - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - int maxStack = iter.nextU2ToInt(); - int maxLocals = iter.nextU2ToInt(); - int codeLen = iter.nextU4ToInt(); - String code = iter.nextUxToHexString(codeLen); - ByteCodeCommand[] cmds = CommandParser.parse(pool.getClzFile(),code); - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code,cmds); - - //解析exception_table start TODO - @SuppressWarnings("unused") - int exceptionTabLen = iter.nextU2ToInt(); - //System.out.println("exception_table 的个数为"+exceptionTabLen); - //解析exception_table end TODO - - codeAttr.setAttributeInfos(AttributeInfo.parseAttributes(pool, iter)); - - return codeAttr; - } - - public ByteCodeCommand[] getCmds() { - return cmds; - } - - public int getMaxStack() { - return maxStack; - } - - - public void setMaxStack(int maxStack) { - this.maxStack = maxStack; - } - - - public int getMaxLocals() { - return maxLocals; - } - - - public void setMaxLocals(int maxLocals) { - this.maxLocals = maxLocals; - } - - - public int getCodeLen() { - return codeLen; - } - - - public void setCodeLen(int codeLen) { - this.codeLen = codeLen; - } - - - public String getCode() { - return code; - } - - - public void setCode(String code) { - this.code = code; - } - - public List getAttributeInfos() { - return attributeInfos; - } - - - public void setAttributeInfos(List attributeInfos) { - this.attributeInfos = attributeInfos; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java deleted file mode 100644 index 697b484657..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class ConstantValueAttr extends AttributeInfo{ - - private int constantValueIndex; - - public int getConstantValueIndex() { - return constantValueIndex; - } - - public void setConstantValueIndex(int constantValueIndex) { - this.constantValueIndex = constantValueIndex; - } - - public ConstantValueAttr(int attrNameIndex, int attrLen,int constantValueIndex) { - super(attrNameIndex, attrLen); - this.constantValueIndex = constantValueIndex; - } - - public static ConstantValueAttr parse(ByteCodeIterator iter){ - - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - int constantValueIndex = iter.nextU2ToInt(); - return new ConstantValueAttr(attrNameIndex,attrLen,constantValueIndex); - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java deleted file mode 100644 index 6029bf4253..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.loader.ByteCodeIterator; - -@SuppressWarnings("unused") -public class LineNumberTable extends AttributeInfo { - - List items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - int nameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - LineNumberTable lineNumberTable = new LineNumberTable(nameIndex,attrLen); - - int tableLen = iter.nextU2ToInt(); - - for (int i = 0; i < tableLen; i++) { - - int startPC = iter.nextU2ToInt(); - int lineNum = iter.nextU2ToInt(); - - LineNumberItem item = new LineNumberItem(); - item.setLineNum(startPC); - item.setLineNum(lineNum); - - lineNumberTable.addLineNumberItem(item); - } - - return lineNumberTable; - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java deleted file mode 100644 index c7209a435e..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem { - - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 463b110458..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo{ - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - int nameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - LocalVariableTable localVariableTable = new LocalVariableTable(nameIndex,attrLen); - - int tableLen = iter.nextU2ToInt(); - - for (int i = 0; i < tableLen; i++) { - - int startPC = iter.nextU2ToInt(); - int len = iter.nextU2ToInt(); - int nameindex = iter.nextU2ToInt(); - int descrIndex = iter.nextU2ToInt(); - int index = iter.nextU2ToInt(); - - LocalVariableItem item = new LocalVariableItem(); - item.setStartPC(startPC); - item.setNameIndex(nameindex); - item.setLength(len); - item.setDescIndex(descrIndex); - item.setIndex(index); - localVariableTable.addLocalVariableItem(item); - } - return localVariableTable; - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index 033b6bb179..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - - int nameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - StackMapTable t = null; - t = new StackMapTable(nameIndex,attrLen); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(attrLen); - t.setOriginalCode(code); - - return t; - } - - - private void setOriginalCode(String code) { - this.originalCode = code; - - } - - public String getOriginalCode() { - return originalCode; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java deleted file mode 100644 index 5abd9961ac..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java deleted file mode 100644 index 534bc36cba..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - public Method getMethod(String methodName, String paramAndReturnType){ - - for(Method m :methods){ - - int nameIndex = m.getNameIndex(); - int descriptionIndex = m.getDescriptorIndex(); - - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descriptionIndex); - if(name.equals(methodName) && desc.equals(paramAndReturnType)){ - return m; - } - } - return null; - } - - public Method getMainMethod(){ - for(Method m :methods){ - int nameIndex = m.getNameIndex(); - int descIndex = m.getDescriptorIndex(); - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descIndex); - if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ - return m; - } - } - return null; - } - - 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()); - - - } - - public String getClassName(){ - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java deleted file mode 100644 index 7750d4439d..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java deleted file mode 100644 index 03db32ccc9..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index 4c8b21ab09..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } -} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java deleted file mode 100644 index 0dd0573ae5..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { - throw new RuntimeException("the orignal code is not correct"); - - } - - codes = codes.toUpperCase(); - - CommandIterator iter = new CommandIterator(codes); - List cmds = new ArrayList(); - - while (iter.hasNext()) { - String opCode = iter.next2CharAsString(); - - if (new_object.equals(opCode)) { - NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - // System.out.println( cmd.toString(clzFile.getConstPool())); - cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { - InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (getfield.equals(opCode)) { - GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (getstatic.equals(opCode)) { - GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (putfield.equals(opCode)) { - PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (ldc.equals(opCode)) { - LdcCmd cmd = new LdcCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (bipush.equals(opCode)) { - BiPushCmd cmd = new BiPushCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { - - NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); - cmds.add(cmd); - } else { - throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); - } - - } - - calcuateOffset(cmds); - - ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; - cmds.toArray(result); - return result; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 92fe286363..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index 52a7550d12..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index c6efbae530..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index a17c51a81d..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java deleted file mode 100644 index 00f9a5a699..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index a43c8bd964..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 461bb4e2a5..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 6b1b8c284c..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 00b29e1fbc..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 6cb42d2a83..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java deleted file mode 100644 index c837b9d838..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java deleted file mode 100644 index 35a3d873a9..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coderising.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); - } - - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java deleted file mode 100644 index d641ea15c0..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coderising.jvm.constant; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; - -public class ConstantPool { - - private List constantInfos = new ArrayList(); - - private ClassFile clzFile; - - public ConstantPool(ClassFile clzFile){ - this.clzFile = clzFile; - } - - 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 int getSize() { - return this.constantInfos.size() -1; - } - - public List getConstantInfos() { - return constantInfos; - } - - public void setConstantInfos(List constantInfos) { - this.constantInfos = constantInfos; - } - - public ClassFile getClzFile() { - return clzFile; - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 804e41a393..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - - visitor.visitFieldRef(this); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 68d84ad685..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.coderising.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(); - } - - @Override - public void accept(Visitor visitor) { - - visitor.visitMethodRef(this); - } - - - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index c22a7bfbca..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coderising.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()+")"; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 80cc827f18..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - @Override - public void accept(Visitor visitor) { - - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index 56f5daa724..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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); - } - - @Override - public void accept(Visitor visitor) { - - visitor.visitString(this); - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index 858f1b212d..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coderising.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; - } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java deleted file mode 100644 index 9754f36adf..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderising.jvm.exception; - -public class AddAnotherParserException extends Exception{ - - private static final long serialVersionUID = 5171999484216739737L; - - public AddAnotherParserException(){ - super("you should add another parser to solve the unknown AttributeInfo or Constant!"); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java deleted file mode 100644 index 8819309841..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderising.jvm.exception; - -public class NoNextByteCodeException extends Exception{ - - private static final long serialVersionUID = -904433109427354744L; - - public NoNextByteCodeException(int byteNum){ - super("already haven't "+byteNum+" byte data!"); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java deleted file mode 100644 index a627baf742..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.coderising.jvm.exception; - -public class NotAClassFileException extends Exception{ - - private static final long serialVersionUID = -3645339333237670145L; - - public NotAClassFileException() { - super("this file not a java class file!"); - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java deleted file mode 100644 index f29420615a..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coderising.jvm.field; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.attr.AttributeInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class Field { - - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private List attributeInfos = new ArrayList<>(); - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public int getAccessFlag() { - return accessFlag; - } - - public void setAccessFlag(int accessFlag) { - this.accessFlag = accessFlag; - } - - public List getAttributeInfos() { - return attributeInfos; - } - - public void setAttributeInfos(List attributeInfos) { - this.attributeInfos = attributeInfos; - } - - @Override - public String toString() { - - String fieldName = pool.getUTF8String(nameIndex); - String fieldDesc = pool.getUTF8String(descriptorIndex); - - return (fieldName+":"+fieldDesc); - } - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descriptorIndex = iter.nextU2ToInt(); - - Field field = new Field(accessFlag,nameIndex,descriptorIndex,pool); - field.setAttributeInfos(AttributeInfo.parseAttributes(pool,iter)); - - return field; - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index e69ae7b0b3..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.coderising.jvm.loader; - -import com.coderising.jvm.exception.NoNextByteCodeException; -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - - private byte[] codes; - private int cursor; - - public static int numberOne = 1; - public static int numberTwo = 2; - public static int numberFour = 4; - - public ByteCodeIterator(byte[] codes){ - this.codes = codes; - } - - public boolean hasNext(int len) { - return (cursor+len) <= codes.length; - } - - public byte[] next(int len){ - - byte[] data = new byte[len]; - - int j = 0; - for (int i = cursor; j < len; i++) { - data[j] = codes[i]; - j++; - } - cursor += len; - - return data; - } - - public int nextU2ToInt(){ - - if(!hasNext(numberTwo)){ - try { - throw new NoNextByteCodeException(numberTwo); - } catch (NoNextByteCodeException e) { - e.printStackTrace(); - } - } - return Util.byteToInt(next(numberTwo)); - } - - public int nextU4ToInt(){ - - if(!hasNext(numberFour)){ - try { - throw new NoNextByteCodeException(numberFour); - } catch (NoNextByteCodeException e) { - e.printStackTrace(); - } - } - return Util.byteToInt(next(numberFour)); - } - - public int nextInt(){ - - if(!hasNext(numberOne)){ - try { - throw new NoNextByteCodeException(numberOne); - } catch (NoNextByteCodeException e) { - e.printStackTrace(); - } - } - return Util.byteToInt(next(numberOne)); - } - - public String nextStr(int len){ - - if(!hasNext(len)){ - try { - throw new NoNextByteCodeException(len); - } catch (NoNextByteCodeException e) { - e.printStackTrace(); - } - } - char[] arr = new char[len]; - for (int i = 0; i < len; i++) { - arr[i] = (char)nextInt(); - } - return new String(arr); - } - - public String nextUxToHexString(int len) { - - if(!hasNext(len)){ - try { - throw new NoNextByteCodeException(len); - } catch (NoNextByteCodeException e) { - e.printStackTrace(); - } - } - return Util.byteToHexString(next(len)).toLowerCase(); - - } - - /** - * 回退 - */ - public void back(int backLen){ - - if( backLen<= this.cursor ){ - this.cursor -= backLen; - }else{ - this.cursor = 0; - } - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java index 4ba2613f1a..59d12540fc 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -4,19 +4,15 @@ import java.util.ArrayList; import java.util.List; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.exception.NotAClassFileException; -import com.coderising.jvm.util.Util; - public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - File clzFile = Util.getClzFile(clzPaths,className); + File clzFile = ClassFileLoaderUtil.getClzFile(clzPaths,className); - return Util.readClz(clzFile); + return ClassFileLoaderUtil.readClz(clzFile); } @@ -34,10 +30,4 @@ public String getClassPath(){ return buff.substring(0, buff.length()-1); } - public ClassFile loadClass(String className) throws NotAClassFileException { - byte[] codes = this.readBinaryCode(className); - ClassFileParser parser = new ClassFileParser(); - return parser.parse(codes); - - } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java similarity index 69% rename from group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java rename to group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java index d0456fead2..61faafb77d 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java @@ -1,4 +1,4 @@ -package com.coderising.jvm.util; +package com.coderising.jvm.loader; import java.io.ByteArrayOutputStream; import java.io.File; @@ -7,27 +7,8 @@ import java.io.InputStream; import java.util.List; -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 attributeInfos = new ArrayList<>(); - - - public Method(ConstantPool pool,int accessFlag, int nameIndex, int descriptorIndex) { - this.pool = pool; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - } - - public static Method parse(ConstantPool pool, ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descriptorIndex = iter.nextU2ToInt(); - - Method method = new Method(pool,accessFlag,nameIndex,descriptorIndex); - method.setAttributeInfos(AttributeInfo.parseAttributes(pool,iter)); - - return method; - } - - public ByteCodeCommand[] getCmds() { - - for (AttributeInfo attributeInfo : attributeInfos) { - if(attributeInfo instanceof CodeAttr){ - return ((CodeAttr) attributeInfo).getCmds(); - } - } - return null; - } - - public int getAccessFlag() { - return accessFlag; - } - - public void setAccessFlag(int accessFlag) { - this.accessFlag = accessFlag; - } - - public ConstantPool getPool() { - return pool; - } - - public int getNameIndex() { - return nameIndex; - } - public int getDescriptorIndex() { - return descriptorIndex; - } - - - public List getAttributeInfos() { - return attributeInfos; - } - - public void setAttributeInfos(List attributeInfos) { - this.attributeInfos = attributeInfos; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java deleted file mode 100644 index e0be352da4..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coderising.jvm.print; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.exception.NotAClassFileException; -import com.coderising.jvm.loader.ClassFileLoader; - -public class ClassFilePrinter { - - ClassFile clzFile = null; - public ClassFilePrinter(ClassFile clzFile){ - this.clzFile = clzFile; - } - - public void print(){ - - if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag:public "); - } - System.out.println("Class Name:"+ clzFile.getClassName()); - - System.out.println("Super ClassName:"+ clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMinorVersion()+"\n"); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - cnstPoolPrinter.print(); - - - - - } - - public static void main(String[] args){ - String path = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "test.com.coderising.jvm.EmployeeV1"; - - ClassFile clzFile = null; - try { - clzFile = loader.loadClass(className); - } catch (NotAClassFileException e) { - e.printStackTrace(); - } - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java deleted file mode 100644 index f2327a8029..0000000000 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.coderising.jvm.print; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.constant.UTF8Info; - -public class ConstantPoolPrinter { - - ConstantPool pool; - ConstantPoolPrinter(ConstantPool pool){ - this.pool = pool; - } - public void print(){ - - System.out.println("Constant Pool:"); - - ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { - - @Override - public void visitString(StringInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append(printConsName("string")).append("#"+info.getIndex()); - System.out.println(buffer); - - } - - @Override - public void visitNameAndType(NameAndTypeInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append(printConsName("NameAndType")).append("#"+info.getIndex1()).append(":#") - .append(info.getIndex2()); - System.out.println(buffer); - - } - - @Override - public void visitMethodRef(MethodRefInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append(printConsName("MethodRef")).append("#"+info.getClassInfoIndex()).append(".#") - .append(info.getNameAndTypeIndex()); - System.out.println(buffer); - - } - - @Override - public void visitFieldRef(FieldRefInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append(printConsName("FieldRef")).append("#"+info.getClassInfoIndex()).append(".#") - .append(info.getNameAndTypeIndex()); - System.out.println(buffer); - - } - - @Override - public void visitClassInfo(ClassInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append(printConsName("Class")).append("#"+info.getUtf8Index()) - .append(" ").append(info.getClassName()); - - System.out.println(buffer); - - } - - @Override - public void visistUTF8(UTF8Info info) { - StringBuilder buffer = new StringBuilder(); - buffer.append(printConsName("UTF8")).append(info.getValue()); - System.out.println(buffer); - - } - }; - - int size = pool.getSize(); - for(int i=1; i<=size; i++){ - ConstantInfo constantInfo = pool.getConstantInfo(i); - String space = genaralSpace(size,i); - System.out.print(space+"#"+i+"="); - constantInfo.accept(visitor); - } - } - - private String genaralSpace(int size,int i){ - - int s1 = String.valueOf(size).length();//数字的位数 - int s2 = String.valueOf(i).length();//数字的位数 - StringBuffer str = new StringBuffer(); - for (int j = 0; j < s1-s2; j++) { - str.append(" "); - } - return str.toString(); - } - - /** - * 输出常量名称后面的空格 - * @param consBeforStr - */ - private String printConsName(String consName){ - - String bashStr = "NameAndType"; - int bashLen = bashStr.length(); - int offset = bashLen-consName.length(); - for (int i = 0; i < offset; i++) { - consName+= " "; - } - return consName+" "; - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java index 3fe9965b5e..0b8eafc282 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java @@ -5,7 +5,7 @@ public class BinaryTree { //根节点 - private BinaryTreeNode root; + private BinaryTreeNode root; @SuppressWarnings({ "rawtypes", "unchecked" }) public > BinaryTreeNode insert(T o){ @@ -44,12 +44,12 @@ public > BinaryTreeNode insert(T o){ * @param node * @return */ - public List traversalBefore(BinaryTreeNode node){ + public List traversalBefore(BinaryTreeNode node){ //所有数据集合 - List datas = new ArrayList<>(); + List datas = new ArrayList(); return traversal(node,datas); } - private List traversal(BinaryTreeNode node,List datas){ + private List traversal(BinaryTreeNode node,List datas){ if(node !=null){ datas.add(node.getData()); @@ -59,7 +59,7 @@ private List traversal(BinaryTreeNode node,List datas return datas; } - public BinaryTreeNode getRoot() { + public BinaryTreeNode getRoot() { return root; } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java index 5e8c90fa54..a8e6b66edd 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java @@ -1,37 +1,37 @@ -package com.coding.basic; -public class BinaryTreeNode { - - private E data; - //父节点 - private BinaryTreeNode parent; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public E getData() { - return data; - } - public void setData(E data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode getParent() { - return parent; - } - public void setParent(BinaryTreeNode parent) { - this.parent = parent; - } -} +package com.coding.basic; +public class BinaryTreeNode { + + private Object data; + //父节点 + private BinaryTreeNode parent; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode getParent() { + return parent; + } + public void setParent(BinaryTreeNode parent) { + this.parent = parent; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java index d72c308c07..c854120212 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java @@ -1,8 +1,8 @@ -package com.coding.basic; - -public interface Iterator { - - public boolean hasNext(); - public Object next(); - -} +package com.coding.basic; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/List.java b/group12/2258659044/zj-2017/src/com/coding/basic/List.java index 7fd5915bae..a5a3688eb6 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/List.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/List.java @@ -1,10 +1,10 @@ -package com.coding.basic; - -public interface List { - - public void add(E o); - public void add(int index, E o); - public E get(int index); - public E remove(int index); - public int size(); +package com.coding.basic; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java index 169fc0dcb9..aa8429ac59 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java @@ -2,16 +2,16 @@ import com.coding.basic.linklist.LinkedList; -public class Queue { +public class Queue { - private LinkedList element = new LinkedList(); + private LinkedList element = new LinkedList(); - public void enQueue(E o){ + public void enQueue(Object o){ element.add(o); } - public E deQueue(){ + public Object deQueue(){ return element.removeFirst(); } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java b/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..2b08e856c1 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java @@ -0,0 +1,30 @@ +package com.coding.basic; + +import com.coding.basic.array.ArrayList; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + + elementData.add(o); + } + + public Object pop(){ + + return elementData.remove(size()-1); + } + + public Object peek(){ + + return elementData.get(size()-1); + } + public boolean isEmpty(){ + + return size()==0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java index 73f3b9649e..4bbf60adf9 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java @@ -5,7 +5,7 @@ import com.coding.basic.Iterator; import com.coding.basic.List; -public class ArrayList implements List { +public class ArrayList implements List { private int size = 0; /*扩容因子*/ @@ -15,12 +15,12 @@ public class ArrayList implements List { /*扩容引用*/ private Object[] newElementData; - public void add(E o){ + public void add(Object o){ grow(); elementData[size] = o; size ++; } - public void add(int index, E o){ + public void add(int index, Object o){ if(index<0||index>size){ throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); @@ -36,21 +36,19 @@ public void add(int index, E o){ size ++; } - public E get(int index){ + public Object get(int index){ - rangeCheck(index); - return elementData(index); + if(index<0||index>size){ + throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); + } + return elementData[index]; } - public E remove(int index){ + public Object remove(int index){ - rangeCheck(index); - E o = elementData(index); - int i = this.size - index - 1; - if (i > 0) { - System.arraycopy(this.elementData, index + 1, this.elementData, index, i); - } - this.elementData[(--this.size)] = null; + Object o = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, size-(index+1)); + size --; return o; } @@ -76,17 +74,6 @@ private void grow(){ } } - private void rangeCheck(int index) { - - if (index >= this.size) { - throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); - } - } - - @SuppressWarnings("unchecked") - E elementData(int index) { - return (E) elementData[index]; - } public Iterator iterator(){ diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java index 0bd2cef66b..de11fdbca5 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java @@ -112,7 +112,7 @@ public int[] merge2(int[] array1, int[] array2){ bitmap[array2[i]]=true; } - ArrayList ls = new ArrayList<>(); + ArrayList ls = new ArrayList(); for (int i = 0; i < bitmap.length; i++) { if(bitmap[i]==true){ ls.add(i); @@ -149,7 +149,7 @@ public int[] fibonacci(int max){ int[] array = {}; if(max <= 1)return array; //生成 斐波那契数列的ArrayList集合 - ArrayList ls = new ArrayList<>(); + ArrayList ls = new ArrayList(); ls.add(1);ls.add(1); int next;int i = 1; while(true){ @@ -171,7 +171,7 @@ public int[] fibonacci(int max){ */ public int[] getPrimes(int max){ - ArrayList primesList = new ArrayList<>(); + ArrayList primesList = new ArrayList(); boolean flag; for (int i = 2; i < max; i++) { flag = false; @@ -197,7 +197,7 @@ public int[] getPrimes(int max){ public int[] getPerfectNumbers(int max){ int temp; - ArrayList perfectList = new ArrayList(); + ArrayList perfectList = new ArrayList(); for (int i = 6; i <= max; i++) { temp = 0; for (int j = 1; j <= (i/2); j++) { @@ -234,7 +234,7 @@ public String join(int[] array, String seperator){ * @param ls * @return */ - public int[] objList2int(ArrayList ls){ + public int[] objList2int(ArrayList ls){ Object[] objArr = ls.toArray(); int[] array = new int[ls.size()]; diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java b/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java index 5ee8881fa0..0132efaa00 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java @@ -4,57 +4,57 @@ import com.coding.basic.Iterator; import com.coding.basic.List; -import com.coding.basic.stack.Stack; +import com.coding.basic.Stack; -public class LinkedList implements List { +public class LinkedList implements List { - private Node head; + private Node head; private int size = 0; - public void add(E o){ + public void add(Object o){ - Node addNode = new Node<>(); + Node addNode = new Node(); addNode.data = o; if(size==0){ head = addNode; }else{ //获取最后一个节点 - Node lastNode = getPointNode(size-1); + Node lastNode = getPointNode(size-1); lastNode.next = addNode; } size++; } - public void add(int index , E o){ + public void add(int index , Object o){ - Node addNode = new Node<>(); + Node addNode = new Node(); addNode.data = o; if(index == 0){ //添加头结点 addFirst(o); }else if(index == size){//添加尾节点 addLast(o); }else{//在投节点与尾部添加节点 - Node prePointNode = getPointNode(index-1); - Node pointNode = prePointNode.next; + Node prePointNode = getPointNode(index-1); + Node pointNode = prePointNode.next; prePointNode.next = addNode; addNode.next = pointNode; size ++; } } - public E get(int index){ + public Object get(int index){ - Node node = getPointNode(index); + Node node = getPointNode(index); return node.data; } - public E remove(int index){ + public Object remove(int index){ - Node pointNode = getPointNode(index); - Node nextPointNode = pointNode.next; + Node pointNode = getPointNode(index); + Node nextPointNode = pointNode.next; if(index ==0){ head = nextPointNode; }else{ - Node prePointNode = getPointNode(index-1); + Node prePointNode = getPointNode(index-1); prePointNode.next = nextPointNode; } size --; @@ -65,10 +65,10 @@ public int size(){ return size; } - public void addFirst(E o){ + public void addFirst(Object o){ - Node secondNode = head; - head = new Node<>(); + Node secondNode = head; + head = new Node(); head.data = o; if(size>0){ head.next = secondNode; @@ -76,16 +76,16 @@ public void addFirst(E o){ size ++; } - public void addLast(E o){ + public void addLast(Object o){ add(o); } - public E removeFirst(){ + public Object removeFirst(){ return remove(0); } - public E removeLast(){ + public Object removeLast(){ return remove(size-1); } @@ -118,21 +118,21 @@ public Object next() { * 获取指定的节点 * @return */ - private Node getPointNode(int index){ + private Node getPointNode(int index){ if(index<0||index>size){ throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size+""); } - Node node = head; + Node node = head; for (int i = 0; i < index; i++) { node = node.next; } return node; } - private static class Node{ - E data; - Node next; + private static class Node{ + Object data; + Node next; } @@ -142,8 +142,8 @@ private static class Node{ */ public void reverse(){ - Stack stack = new Stack(); - Node node; + Stack stack = new Stack(); + Node node; //缓存原链表数据 for (node = head; node!=null;node = node.next) { stack.push(node.data); @@ -198,10 +198,10 @@ public void remove(int i, int length){ * 返回的结果应该是[101,301,401,601] * @param list */ - public int[] getElements(LinkedList list){ + public int[] getElements(LinkedList list){ int[] array = new int[list.size()]; for (int i = 0; i < array.length; i++) { - array[i] = (int) get(list.get(i)); + array[i] = (int) get((int)list.get(i)); } return array; } @@ -212,11 +212,12 @@ public int[] getElements(LinkedList list){ * @param list */ - public void subtract(LinkedList list){ + public void subtract(LinkedList list){ for (int i = 0; i < size; i++) { for (int j = 0; j < list.size(); j++) { if(get(i).equals(list.get(j))){ remove(i); + i--; } } } @@ -258,13 +259,13 @@ public void removeRange(int min, int max){ * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 * @param list */ - public LinkedList intersection( LinkedList list){ + public LinkedList intersection( LinkedList list){ - LinkedList newList = new LinkedList<>(); + LinkedList newList = new LinkedList(); for (int i = 0; i < size; i++) { for (int j = 0; j < list.size(); j++) { if(get(i).equals(list.get(j))){ - newList.add((E)get(i)); + newList.add(get(i)); } } } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java deleted file mode 100644 index f1ede1f8ab..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic.stack; - -import com.coding.basic.array.ArrayList; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(E o){ - - elementData.add(o); - } - - public E pop(){ - - return elementData.remove(size()-1); - } - - public E peek(){ - - return elementData.get(size()-1); - } - public boolean isEmpty(){ - - return size()==0; - } - public int size(){ - return elementData.size(); - } - - @Override - public String toString() { - - StringBuffer sBuffer = new StringBuffer(); - sBuffer.append("["); - - for (int i = size()-1; i >= 0; i--) { - if(i == 0){ - sBuffer.append(elementData.get(i)+"]"); - }else{ - sBuffer.append(elementData.get(i)+","); - } - } - return sBuffer.toString(); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java deleted file mode 100644 index 871b2fce69..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.coding.basic.stack; - -import java.util.HashMap; -import java.util.Map; - -public class StackUtil { - - private static Map markMap; - - static { - //初始化括号对 - markMap = new HashMap(); - markMap.put('(', ')'); - markMap.put('[', ']'); - markMap.put('{', '}'); - } - - /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param - */ - public static void reverse(Stack s) { - - if(s == null||s.isEmpty()){ - return; - } - E last = getBottom(s,s.pop()); - reverse(s); - s.push(last); - } - - /** - * 获取栈底部数据 - * @param - * @param s - * @return - */ - private static E getBottom(Stack s,E val){ - - if(s.isEmpty()){ - return val; - } - E lst = getBottom(s,s.pop()); - s.push(val); - return lst; - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param - * - * @param o - */ - public static void remove(Stack s,E o) { - - if(s == null||s.isEmpty()){ - return; - } - E res = s.pop(); - if(res.equals(o)){ - return; - } - remove(s,o); - s.push(res); - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param - * @param len - * @return - */ - - public static Object[] getTop(Stack s,int len) { - - if(s == null||s.isEmpty()||len <= 0){ - return null; - } - - //当len的长度大于栈s的长度时返回栈s全部数据 - int size = s.size()>=len? len:s.size(); - - Object[] objs = new Object[size]; - - putValueToArray(s,objs,0); - - return objs; - } - - /** - * 将获取的元素放到数组中 - * @param - * @param s - * @param objs - * @param count - */ - public static void putValueToArray(Stack s,Object[] objs,int count){ - - E res = s.pop(); - count++; - objs[count-1] = res; - if(count== objs.length){ - s.push(res); - return; - } - putValueToArray(s,objs,count); - s.push(res); - } - - /** - * 字符串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){ - - if(!validation(s)){ - return false; - } - Stack markStack = new Stack<>(); - char[] charArr = s.toCharArray(); - for (int i = 0; i < charArr.length; i++) { - if(markMap.containsKey(charArr[i])){ - markStack.push(charArr[i]); - } - if(markMap.containsValue(charArr[i])){ - if(markMap.get(markStack.pop()).equals(charArr[i])){ - continue; - }else{ - return false; - } - } - } - return markStack.size()==0; - } - - private static boolean validation(String s){ - - if(s!=null&&s.length()>0){ - if(s.contains("(")&&s.contains(")")){ - return true; - } - if(s.contains("[")&&s.contains("]")){ - return true; - } - if(s.contains("{")&&s.contains("}")){ - return true; - } - } - return false; - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java deleted file mode 100644 index a02d03c861..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.Stack; -import com.coding.basic.stack.StackUtil; -import com.coding.basic.stack.expr.util.ExprIterator; -import com.coding.basic.stack.expr.util.FixExprUtil; -import com.coding.basic.stack.expr.util.Operator; - -public class InfixExpr { - - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - //数据栈 - Stack dataStack = new Stack<>(); - //操作栈 - Stack operStack = new Stack<>(); - - parseExpr(dataStack,operStack); - - return summary(dataStack,operStack); - } - - - /** - * 拆分数据与运算符于两个栈中 - * - * @return - */ - private void parseExpr(Stack dataStack,Stack operStack) { - - ExprIterator it = new ExprIterator(expr); - while(it.hasNext()){ - String element = it.next(); - if (Operator.contains(element)) { - putOpersToStack(dataStack,operStack, element); - } else { - dataStack.push(Float.parseFloat(element)); - } - } - validationLastOpers(dataStack,operStack); - } - - /** - * 检查最后一个操作符优先级与之前是否保持统一, - * 若不统一则进行运算,使栈中运算符保持同一个优先级 - * @param stacks - */ - private void validationLastOpers(Stack dataStack,Stack operStack) { - - Object[] opers = StackUtil.getTop(operStack, 2); - Operator thisOper = (Operator) opers[0]; - Operator preOper = (Operator) opers[1]; - if(thisOper.getLevel()!=preOper.getLevel()){ - calculateToStack(dataStack,operStack,false); - } - } - - /** - * 运算符压栈 - * @param stacks - * @param c - */ - private void putOpersToStack(Stack dataStack,Stack operStack, String c) { - - Operator thisOper = Operator.getOperator(c); - if (!operStack.isEmpty()) { - Operator preOper = operStack.peek(); - if (preOper.getLevel() > thisOper.getLevel()) { - calculateToStack(dataStack,operStack,false); - } - } - operStack.push(thisOper); - } - - /** - * 运算距栈顶最近两个元素的值并压回原栈 - * @param stacks - * stacks[0]运算符,stacks[1]数据 - * @param isReverse - * 当isReversed为true时会交换两个元素的位置 - */ - private void calculateToStack(Stack dataStack,Stack operStack,boolean isReverse){ - - float a,b; - if(isReverse){ - a = dataStack.pop(); - b = dataStack.pop();; - }else{ - b = dataStack.pop();; - a = dataStack.pop();; - } - - Operator oper = operStack.pop(); - float res = FixExprUtil.calculate(a,oper,b); - dataStack.push(res); - } - - /** - * 汇总结果 - * @param stacks - * @return - */ - private float summary(Stack dataStack,Stack operStack) { - - StackUtil.reverse(dataStack); - StackUtil.reverse(operStack); - - while (!operStack.isEmpty()) { - calculateToStack(dataStack,operStack,true); - } - return dataStack.pop(); - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index cdd7605635..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.Stack; -import com.coding.basic.stack.expr.util.ExprIterator; -import com.coding.basic.stack.expr.util.FixExprUtil; -import com.coding.basic.stack.expr.util.Operator; - -public class PostfixExpr { - - String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - //数据栈 - Stack dataStack = new Stack<>(); - - parseExpr(dataStack,null); - - return dataStack.peek(); - } - - /** - * 解析表达式 - * @return - */ - private void parseExpr(Stack dataStack,Stack operStack) { - - ExprIterator it = new ExprIterator(expr); - float a,b,res; - while(it.hasNext()){ - String element = it.next(); - if (Operator.contains(element)) { - b = dataStack.pop(); - a = dataStack.pop(); - res = FixExprUtil.calculate(a, Operator.getOperator(element), b); - dataStack.push(res); - } else { - dataStack.push(Float.parseFloat(element)); - } - } - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java deleted file mode 100644 index 4a0b025cfe..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.Stack; -import com.coding.basic.stack.expr.util.ExprIterator; -import com.coding.basic.stack.expr.util.FixExprUtil; -import com.coding.basic.stack.expr.util.Operator; - -public class PrefixExpr { - - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - //数据栈 - Stack dataStack = new Stack<>(); - - parseExpr(dataStack,null); - - return dataStack.peek(); - } - - /** - * 解析表达式 - * @return - */ - private void parseExpr(Stack dataStack,Stack operStack) { - - ExprIterator it = new ExprIterator(FixExprUtil.reverse(expr)); - float a,b,res; - while(it.hasNext()){ - String element = it.next(); - if (Operator.contains(element)) { - a = dataStack.pop(); - b = dataStack.pop(); - res = FixExprUtil.calculate(a, Operator.getOperator(element), b); - dataStack.push(res); - } else { - dataStack.push(Float.parseFloat(element)); - } - } - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java deleted file mode 100644 index 59efc0907d..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic.stack.expr.util; - -import com.coding.basic.List; -import com.coding.basic.array.ArrayList; - -/** - * 表达式迭代器 - * @author zj - * @since 2017-4-17 - */ -public class ExprIterator{ - - private List data = new ArrayList(); - private int cursor; - - public ExprIterator(String expr){ - this.data = FixExprUtil.FixExprToArray(expr); - } - - public boolean hasNext() { - return cursor != (data.size()); - } - - public String next() { - - int i = cursor; - cursor = (i+1); - return data.get(i); - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java deleted file mode 100644 index 4f431f219d..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.coding.basic.stack.expr.util; - -import java.util.regex.Pattern; - -import com.coding.basic.List; -import com.coding.basic.array.ArrayList; -import com.coding.basic.stack.Stack; - -public class FixExprUtil { - - private static String LEFTBRACKRT= "("; - private static String RIGHTBRACKET= ")"; - - /** - * 运算 - * @param a 数字 - * @param oper 运算符 - * @param b 数字 - * @return - */ - public static float calculate(float a,Operator oper,float b) { - - String operFlag = oper.getFlag(); - - float res = 0f; - if (Operator.ADD.getFlag().equals(operFlag)) { - res = a + b; - } else if (Operator.SUB.getFlag().equals(operFlag)) { - res = a - b; - } else if (Operator.MULTY.getFlag().equals(operFlag)) { - res = a * b; - } else if (Operator.DIVIDE.getFlag().equals(operFlag)) { - res = a / b; - } - return res; - } - - /** - * 将字符串顺序逆置 - * @param str - * @return - */ - public static String reverse(String expr){ - - return new StringBuffer(expr).reverse().toString(); - } - - /** - * 判断字符串是否为数字 - * 注意:不包括小数 - * @param str - * @return - */ - public static boolean isNumeric(String str){ - Pattern pattern = Pattern.compile("[0-9]*"); - return pattern.matcher(str).matches(); - } - - /** - * 将中缀表达式装换为后缀表达式 - * @param expr - * @return - */ - public static String InfixCovertToPostfix(String expr){ - - ExprIterator it = new ExprIterator(expr); - Stack stack = new Stack<>(); - List postFixList = new ArrayList(); - - while(it.hasNext()){ - - String element = it.next(); - //数字直接输出 - if(FixExprUtil.isNumeric(element)){ - postFixList.add(element); - }else if(RIGHTBRACKET.equals(element)){//去除左右括号 - do { - postFixList.add(stack.pop()); - } while (!LEFTBRACKRT.equals(stack.pop())); - }else{ - int preLevel = 0; - int thisLevel = Operator.getLevelByFlag(element); - //当栈顶运算符优先级大于本次运算优先级时(左括号除外)出栈至栈顶优先级小于本次运算优先级 - while(preLevel>thisLevel&&preLevel!=3&&!stack.isEmpty()){ - String oprFlag = stack.pop(); - preLevel = Operator.getLevelByFlag(oprFlag); - postFixList.add(oprFlag); - } - stack.push(element); - } - - } - //将栈中剩余元素出栈 - while(!stack.isEmpty()){ - postFixList.add(stack.pop()); - } - //格式化输出 - StringBuffer postFix = new StringBuffer(); - for (int i = 0; i < postFixList.size(); i++) { - postFix.append(postFixList.get(i)+" "); - } - return postFix.toString(); - } - - /** - * 中缀表达式转前缀表达式 - * @param expr - * @return - */ - public static String InfixCovertToPrefix(String expr){ - - String post = InfixCovertToPostfix(expr); - return reverse(post); - } - - /** - * 后缀表达式转前缀表达式 - * @param expr - * @return - */ - public static String postfixCovertToPrefix(String expr){ - return reverse(expr); - } - - /** - * 前缀表达式转后缀表达式 - * @param expr - * @return - */ - public static String prefixCovertToPostfix(String expr){ - return reverse(expr); - } - - /** - * 将表达式字符串转换为List - * @param expr - * @return - */ - public static List FixExprToArray(String expr){ - - List ls = new ArrayList<>(); - - String[] strArr = expr.split(" "); - for (String str : strArr) { - parse(str,ls); - } - - return ls; - } - - public static void parse(String str,List ls){ - - char[] chr = str.toCharArray(); - StringBuilder token = new StringBuilder(); - - for (char c : chr) { - String element = String.valueOf(c); - if(Operator.contains(element)){ - if(!"".equals(token.toString())){ - ls.add(token.toString()); - token = new StringBuilder(); - } - ls.add(c+""); - }else{ - token.append(c); - } - } - if(!"".equals(token.toString())){ - ls.add(token.toString()); - } - - } - -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java deleted file mode 100644 index 3e76c3b805..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.coding.basic.stack.expr.util; - -public enum Operator { - - ADD("+",1),SUB("-",1),MULTY("*",2),DIVIDE("/",2) - ,LEFTBRACKRT("(",3),RIGHTBRACKET(")",3); - - private String flag; - private int level; - - private Operator(String flag,int level){ - this.flag = flag; - this.level = level; - } - - public static int getLevelByFlag(String flag){ - - Operator[] opers = Operator.values(); - for (Operator operator : opers) { - if(operator.flag.equals(flag)){ - return operator.level; - } - } - return -1; - } - - public static Operator getOperator(String flag){ - - if(ADD.flag.equals(flag)){ - return ADD; - }else if(SUB.flag.equals(flag)){ - return SUB; - }else if(MULTY.flag.equals(flag)){ - return MULTY; - }else if(DIVIDE.flag.equals(flag)){ - return DIVIDE; - }else if(LEFTBRACKRT.flag.equals(flag)){ - return LEFTBRACKRT; - }else if(RIGHTBRACKET.flag.equals(flag)){ - return RIGHTBRACKET; - } - return null; - } - - public static boolean contains(String flag){ - - if(ADD.flag.equals(flag)){ - return true; - }else if(SUB.flag.equals(flag)){ - return true; - }else if(MULTY.flag.equals(flag)){ - return true; - }else if(DIVIDE.flag.equals(flag)){ - return true; - }else if(LEFTBRACKRT.flag.equals(flag)){ - return true; - }else if(RIGHTBRACKET.flag.equals(flag)){ - return true; - } - return false; - } - public String getFlag() { - return flag; - } - - public int getLevel() { - return level; - } - -} diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java deleted file mode 100644 index 2a18bee6d7..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java +++ /dev/null @@ -1,349 +0,0 @@ -package test.com.coderising.jvm; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.attr.CodeAttr; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.cmd.BiPushCmd; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.OneOperandCmd; -import com.coderising.jvm.cmd.TwoOperandCmd; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.exception.NotAClassFileException; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.loader.ClassFileLoader; -import com.coderising.jvm.method.Method; - -public class ClassFileloaderTest { - - private static final String FULL_QUALIFIED_CLASS_NAME = "test/com/coderising/jvm/EmployeeV1"; - - static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; - //static String path1 = "E:\\githubRepository\\coding2017\\group12\\2258659044\\zj-2017\\bin"; - static String path2 = "C:\temp"; - - - static ClassFile clzFile = null; - static { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "test.com.coderising.jvm.EmployeeV1"; - - try { - clzFile = loader.loadClass(className); - } catch (NotAClassFileException e) { - e.printStackTrace(); - } - clzFile.print(); - } - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "test.com.coderising.jvm.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "test.com.coderising.jvm.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - private String byteToHexString(byte[] codes ){ - 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()); - } - - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - //String code = m.getCodeAttr().getCode(); - CodeAttr codeAttr = (CodeAttr)m.getAttributeInfos().get(0); - String code = codeAttr.getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } -} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java deleted file mode 100644 index 9692355ed6..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package test.com.coderising.jvm; - -@SuppressWarnings("unused") -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(); - - } -} diff --git a/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java similarity index 79% rename from group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java rename to group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java index 1e51c27361..b274338091 100644 --- a/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java @@ -1,93 +1,87 @@ -package com.coderising.jvm.test; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.loader.ClassFileLoader; - - - - - -public class ClassFileloaderTest { - - -// static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path1 = "D:\\git\\coding2017\\group17\\102228177\\work3_26\\bin"; - static String path2 = "C:\temp"; - - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "com.coderising.jvm.test.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i node = tree.insert(4); - Assert.assertEquals((int)node.getParent().getData(), 2); - Assert.assertEquals((int)node.getParent().getLeft().getData(), 1); - - BinaryTreeNode node2 = tree.insert(8); - Assert.assertEquals((int)node2.getParent().getData(), 7); - Assert.assertEquals((int)node2.getParent().getLeft().getData(), 6); - } - - @Test - public void traversal(){ - - insert(); - //以根节点为起点先序遍历 - List treeList = tree.traversalBefore(tree.getRoot()); - //expected value - int[] exValue = {5,2,1,4,7,6,8}; - for (int i = 0; i < exValue.length; i++) { - Assert.assertEquals((int)treeList.get(i),exValue[i]); - } - - //以数据2位起点先序遍历 - List treeList2 = tree.traversalBefore(tree.getRoot().getLeft()); - //expected value - int[] exValue2 = {2,1,4}; - for (int i = 0; i < exValue2.length; i++) { - Assert.assertEquals((int)treeList2.get(i),exValue2[i]); - } - } -} +package test.com.coding.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.BinaryTree; +import com.coding.basic.BinaryTreeNode; +import com.coding.basic.List; + +public class BinaryTreeTest { + + BinaryTree tree ; + + @Before + public void setup() { + + tree = new BinaryTree(); + Assert.assertEquals(tree.getRoot(), null); + tree.insert(5); + tree.insert(2); + tree.insert(7); + tree.insert(1); + tree.insert(6); + } + @Test + public void insert(){ + + BinaryTreeNode node = tree.insert(4); + Assert.assertEquals(node.getParent().getData(), 2); + Assert.assertEquals(node.getParent().getLeft().getData(), 1); + + BinaryTreeNode node2 = tree.insert(8); + Assert.assertEquals(node2.getParent().getData(), 7); + Assert.assertEquals(node2.getParent().getLeft().getData(), 6); + } + + @Test + public void traversal(){ + + insert(); + //以根节点为起点先序遍历 + List treeList = tree.traversalBefore(tree.getRoot()); + //expected value + int[] exValue = {5,2,1,4,7,6,8}; + for (int i = 0; i < exValue.length; i++) { + Assert.assertEquals(treeList.get(i),exValue[i]); + } + + //以数据2位起点先序遍历 + List treeList2 = tree.traversalBefore(tree.getRoot().getLeft()); + //expected value + int[] exValue2 = {2,1,4}; + for (int i = 0; i < exValue2.length; i++) { + Assert.assertEquals(treeList2.get(i),exValue2[i]); + } + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java index b12d23cdbd..75af57b371 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java @@ -1,64 +1,64 @@ -package test.com.coding.basic; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Queue; - -public class QueueTest { - - Queue qe ; - - @Before - public void setup() { - qe = new Queue<>(); - for (int i = 0; i < 10; i++) { - qe.enQueue(i); - } - } - - @Test - public void enQueue(){ - - Assert.assertEquals(qe.size(), 10); - qe.enQueue("abcd"); - Assert.assertEquals(qe.size(), 11); - } - - @Test//(expected = IndexOutOfBoundsException.class) - public void deQueue(){ - - Assert.assertEquals(qe.size(), 10); - for (int i = 0; i < 10; i++) { - Assert.assertEquals(qe.deQueue(), i); - } - Assert.assertEquals(qe.size(), 0); - //打开下列语句与期望异常测试 - //qe.deQueue(); - } - - public void isEmpty(){ - - Assert.assertEquals(qe.isEmpty(),false); - for (int i = 0; i < 10; i++) { - qe.deQueue(); - } - Assert.assertEquals(qe.isEmpty(),true); - Queue qe1 = new Queue<>(); - Assert.assertEquals(qe1.isEmpty(), true); - } - - public void size(){ - - Assert.assertEquals(qe.size(),10); - qe.enQueue("lk"); - qe.enQueue('h'); - Assert.assertEquals(qe.size(),12); - for (int i = 0; i < 12; i++) { - qe.deQueue(); - } - Assert.assertEquals(qe.size(),0); - Queue qe1 = new Queue<>(); - Assert.assertEquals(qe1.size(), 0); - } -} +package test.com.coding.basic; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.Queue; + +public class QueueTest { + + Queue qe ; + + @Before + public void setup() { + qe = new Queue(); + for (int i = 0; i < 10; i++) { + qe.enQueue(i); + } + } + + @Test + public void enQueue(){ + + Assert.assertEquals(qe.size(), 10); + qe.enQueue("abcd"); + Assert.assertEquals(qe.size(), 11); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void deQueue(){ + + Assert.assertEquals(qe.size(), 10); + for (int i = 0; i < 10; i++) { + Assert.assertEquals(qe.deQueue(), i); + } + Assert.assertEquals(qe.size(), 0); + //打开下列语句与期望异常测试 + //qe.deQueue(); + } + + public void isEmpty(){ + + Assert.assertEquals(qe.isEmpty(),false); + for (int i = 0; i < 10; i++) { + qe.deQueue(); + } + Assert.assertEquals(qe.isEmpty(),true); + Queue qe1 = new Queue(); + Assert.assertEquals(qe1.isEmpty(), true); + } + + public void size(){ + + Assert.assertEquals(qe.size(),10); + qe.enQueue("lk"); + qe.enQueue('h'); + Assert.assertEquals(qe.size(),12); + for (int i = 0; i < 12; i++) { + qe.deQueue(); + } + Assert.assertEquals(qe.size(),0); + Queue qe1 = new Queue(); + Assert.assertEquals(qe1.size(), 0); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java similarity index 82% rename from group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java rename to group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java index d43b6f1914..5d9fcd0f16 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java @@ -1,76 +1,76 @@ -package test.com.coding.basic.stack; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.stack.Stack; - -public class StackTest { - - Stack st ; - - @Before - public void setup() { - st = new Stack<>(); - for (int i = 0; i < 10; i++) { - st.push(i); - } - } - - @Test - public void push(){ - - Assert.assertEquals(st.size(), 10); - st.push(10); - st.push('a'); - Assert.assertEquals(st.size(), 12); - } - - @Test//(expected = IndexOutOfBoundsException.class) - public void pop(){ - - Assert.assertEquals(st.size(), 10); - for (int i = 9; i >= 0; i--) { - Assert.assertEquals(st.pop(), i); - } - //打开下列语句抛出期望异常 - //st.pop(); - } - - @Test - public void peek(){ - - Assert.assertEquals(st.size(), 10); - Assert.assertEquals(st.peek(), 9); - Assert.assertEquals(st.size(), 10); - } - - @Test - public void isEmpty(){ - - Assert.assertEquals(st.isEmpty(), false); - for (int i = 0; i < 10; i++) { - st.pop(); - } - Assert.assertEquals(st.isEmpty(), true); - Stack st1 = new Stack<>(); - Assert.assertEquals(st1.isEmpty(), true); - } - - public void size(){ - - Assert.assertEquals(st.size(),10); - st.push("lk"); - st.push('h'); - Assert.assertEquals(st.size(),12); - for (int i = 0; i < 12; i++) { - st.pop(); - } - Assert.assertEquals(st.size(),0); - st.peek(); - Assert.assertEquals(st.size(),0); - Stack st1 = new Stack<>(); - Assert.assertEquals(st1.size(), 0); - } -} +package test.com.coding.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.Stack; + +public class StackTest { + + Stack st ; + + @Before + public void setup() { + st = new Stack(); + for (int i = 0; i < 10; i++) { + st.push(i); + } + } + + @Test + public void push(){ + + Assert.assertEquals(st.size(), 10); + st.push(10); + st.push('a'); + Assert.assertEquals(st.size(), 12); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void pop(){ + + Assert.assertEquals(st.size(), 10); + for (int i = 9; i >= 0; i--) { + Assert.assertEquals(st.pop(), i); + } + //打开下列语句抛出期望异常 + //st.pop(); + } + + @Test + public void peek(){ + + Assert.assertEquals(st.size(), 10); + Assert.assertEquals(st.peek(), 9); + Assert.assertEquals(st.size(), 10); + } + + @Test + public void isEmpty(){ + + Assert.assertEquals(st.isEmpty(), false); + for (int i = 0; i < 10; i++) { + st.pop(); + } + Assert.assertEquals(st.isEmpty(), true); + Stack st1 = new Stack(); + Assert.assertEquals(st1.isEmpty(), true); + } + + public void size(){ + + Assert.assertEquals(st.size(),10); + st.push("lk"); + st.push('h'); + Assert.assertEquals(st.size(),12); + for (int i = 0; i < 12; i++) { + st.pop(); + } + Assert.assertEquals(st.size(),0); + st.peek(); + Assert.assertEquals(st.size(),0); + Stack st1 = new Stack(); + Assert.assertEquals(st1.size(), 0); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java index ee20d2e038..9c4d91e8b3 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java @@ -9,10 +9,10 @@ public class ArrayListTest { - ArrayList ls ; + ArrayList ls ; @Before public void setup() { - ls = new ArrayList<>(); + ls = new ArrayList(); } /** diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java index c7dce9c1aa..e8303b8aba 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java @@ -94,7 +94,7 @@ public void testJoin() { @Test public void testObjList2int() { - ArrayList ls = new ArrayList<>(); + ArrayList ls = new ArrayList(); for (int i = 0; i < 10; i++) { ls.add(i); } diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java index 26d95dbc98..9a6e86000e 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java @@ -9,10 +9,10 @@ public class LinkedListTest { - LinkedList ls ; + LinkedList ls ; @Before public void setup() { - ls = new LinkedList<>(); + ls = new LinkedList(); } /** @@ -169,7 +169,7 @@ public void testGetElements(){ ls.add(201);ls.add(301); ls.add(401);ls.add(501); ls.add(601);ls.add(701); - LinkedList list = new LinkedList<>(); + LinkedList list = new LinkedList(); list.add(1);list.add(3); list.add(4);list.add(6); int[] exceptArr = {101,301,401,601}; @@ -189,7 +189,7 @@ public void testSubtract(){ ls.add(8); ls.add(10); - LinkedList list = new LinkedList<>(); + LinkedList list = new LinkedList(); list.add(2); list.add(5); @@ -236,19 +236,19 @@ public void testIntersection(){ ls.add(3); ls.add(5); - LinkedList list = new LinkedList<>(); + LinkedList list = new LinkedList(); list.add(-1); list.add(0); list.add(5); list.add(9); - LinkedList newList = ls.intersection(list); + LinkedList newList = ls.intersection(list); int[] exceptArr = {-1,0,5}; exceptResult(newList,exceptArr); } - private void exceptResult(LinkedList ls,int[] exceptArr){ + private void exceptResult(LinkedList ls,int[] exceptArr){ Assert.assertEquals(ls.size(), exceptArr.length); for (int i = 0; i < exceptArr.length; i++) { diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java deleted file mode 100644 index d09f893de2..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package test.com.coding.basic.stack; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.stack.Stack; -import com.coding.basic.stack.StackUtil; - -public class StackUtilTest { - - Stack s ; - - @Before - public void setup() { - //初始化栈元素:5,4,3,2,1 - s = new Stack<>(); - for (int i = 1; i <= 5; i++) { - s.push(i); - } - } - - @Test - public void testReverse() { - - StackUtil.reverse(s); - Assert.assertEquals(s.size(), 5); - Assert.assertEquals("[1,2,3,4,5]", s.toString()); - } - - @Test - public void testRemove() { - - StackUtil.remove(s, 5); - Assert.assertEquals("[4,3,2,1]", s.toString()); - - StackUtil.remove(s, 1); - Assert.assertEquals("[4,3,2]", s.toString()); - - StackUtil.remove(s, 4); - Assert.assertEquals("[3,2]", s.toString()); - } - - @Test - public void testGetTop() { - - Object[] obj = StackUtil.getTop(s, 6); - Assert.assertEquals(5, obj.length); - Assert.assertEquals(s.toString(),arrayToString(obj)); - - Object[] obj1 = StackUtil.getTop(s, 2); - Assert.assertEquals(2, obj1.length); - Assert.assertEquals("[5,4]",arrayToString(obj1)); - - } - - @Test - public void testIsValidPairs() { - - String s0 = "([e{d}f])"; - Assert.assertEquals(true,StackUtil.isValidPairs(s0)); - - String s1 = "(]e{d}f[)"; - Assert.assertEquals(false,StackUtil.isValidPairs(s1)); - - String s2 = "([b{x]y})"; - Assert.assertEquals(false,StackUtil.isValidPairs(s2)); - - String s3 = "()((()()))()"; - Assert.assertEquals(true,StackUtil.isValidPairs(s3)); - - String s4 = "(fs{fs[fs("; - Assert.assertEquals(false,StackUtil.isValidPairs(s4)); - - String s5 = "gshsg54fs"; - Assert.assertEquals(false,StackUtil.isValidPairs(s5)); - - - } - - private static String arrayToString(Object[] objs){ - - StringBuffer sBuffer = new StringBuffer(); - sBuffer.append("["); - - for (int i = 0; i < objs.length; i++) { - if(i == objs.length-1){ - sBuffer.append(objs[i]+"]"); - }else{ - sBuffer.append(objs[i]+","); - } - } - return sBuffer.toString(); - } -} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index d22f51a98b..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package test.com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.stack.expr.InfixExpr; - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } -} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java deleted file mode 100644 index 97ec425a7b..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package test.com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.stack.expr.PostfixExpr; - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } -} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java deleted file mode 100644 index e866223a4e..0000000000 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package test.com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.stack.expr.PrefixExpr; - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group12/247565311/structure/week2/ArrayUtilTest.java b/group12/247565311/structure/week2/ArrayUtilTest.java index 3d249b7225..c1b414d725 100644 --- a/group12/247565311/structure/week2/ArrayUtilTest.java +++ b/group12/247565311/structure/week2/ArrayUtilTest.java @@ -8,6 +8,7 @@ public class ArrayUtilTest { ArrayUtil u = null; @Before public void setUp() throws Exception { + System.out.println("ʼһµIJ"); u = new ArrayUtil(); } diff --git a/group12/247565311/structure/week6/StackUtil.java b/group12/247565311/structure/week6/StackUtil.java index 4529372e4c..9895f02f30 100644 --- a/group12/247565311/structure/week6/StackUtil.java +++ b/group12/247565311/structure/week6/StackUtil.java @@ -2,10 +2,20 @@ import java.util.Stack; public class StackUtil { - + public static void bad_reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + s = tmpStack; + } + /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * 閸嬪洩顔曢弽鍫滆厬閻ㄥ嫬鍘撶槐鐘虫ЦInteger, 娴犲孩鐖ゆい璺哄煂閺嶅牆绨抽弰锟� 5,4,3,2,1 鐠嬪啰鏁ょ拠銉︽煙濞夋洖鎮楅敍锟介崗鍐濞嗏�绨崣妯硅礋: 1,2,3,4,5 + * 濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И */ public static void reverse(Stack s){ if(s == null || s.isEmpty()) return; @@ -17,26 +27,22 @@ public static void reverse(Stack s){ } while(!s1.isEmpty()) s.push(s1.pop()); - for(int i=0;ii) s1.push(s.pop()); - } s.push(integer); - while(!s1.isEmpty()) + while(s1.size()>0) s.push(s1.pop()); } } - // 原地翻转栈也可以使用递归的方式,就是不好理解 + // 閫氳繃閫掑綊鍙互涓嶄娇鐢ㄥ爢鏍堝畬鎴愯繖涓�姛鑳� public static void reverse2(Stack s) { if(s == null || s.isEmpty()){ return; } Integer top = s.pop(); - reverse2(s); + reverse(s); addToBottom(s,top); } public static void addToBottom(Stack s, Integer value){ @@ -49,7 +55,7 @@ public static void addToBottom(Stack s, Integer value){ } } /** - * 移出栈中的某个元素,只能使用push,pop,peek,isEmpty这几种操作 + * 閸掔娀娅庨弽鍫滆厬閻ㄥ嫭鐓囨稉顏勫帗缁憋拷濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И * * @param o */ @@ -70,7 +76,7 @@ public static void remove(Stack s,Object o) { } /** - * 获取栈顶的len个元素,只能使用push,pop,peek,isEmpty这几种操作来完成 + * 娴犲孩鐖ゆい璺哄絿瀵版en娑擃亜鍘撶槐锟�閸樼喐娼甸惃鍕垽娑擃厼鍘撶槐鐘辩箽閹镐椒绗夐崣锟� * 濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И * @param len * @return */ @@ -92,10 +98,10 @@ public static Object[] getTop(Stack s,int len) { return result; } /** - * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz - * 使用堆栈检查字符串s中的括号是不是成对出现的。 - * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true - * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; + * 鐎涙顑佹稉鐬�閸欘垵鍏橀崠鍛儓鏉╂瑤绨虹�妤冾儊閿涳拷 ( ) [ ] { }, a,b,c... x,yz + * 娴h法鏁ら崼鍡樼垽濡拷鐓$�妤冾儊娑撶灚娑擃厾娈戦幏顒�娇閺勵垯绗夐弰顖涘灇鐎电懓鍤悳鎵畱閵嗭拷 + * 娓氬顩 = "([e{d}f])" , 閸掓瑨顕氱�妤冾儊娑撹弓鑵戦惃鍕閸欓攱妲搁幋鎰嚠閸戣櫣骞囬敍锟界拠銉︽煙濞夋洝绻戦崶鐎焤ue + * 婵″倹鐏�s = "([b{x]y})", 閸掓瑨顕氱�妤冾儊娑撹弓鑵戦惃鍕閸欒渹绗夐弰顖涘灇鐎电懓鍤悳鎵畱閿涳拷鐠囥儲鏌熷▔鏇$箲閸ョ�alse; * @param s * @return */ diff --git a/group12/247565311/structure/week6/StackUtilTest.java b/group12/247565311/structure/week6/StackUtilTest.java index 74c10b3ffd..f1a8aec8ac 100644 --- a/group12/247565311/structure/week6/StackUtilTest.java +++ b/group12/247565311/structure/week6/StackUtilTest.java @@ -1,12 +1,13 @@ package structure.week6; +import static org.junit.Assert.fail; + import java.util.Stack; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; - public class StackUtilTest { @Before @@ -23,8 +24,11 @@ public void testAddToBottom() { s.push(1); s.push(2); s.push(3); + StackUtil.addToBottom(s, 0); + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + } @Test public void testReverse() { @@ -70,4 +74,5 @@ public void testIsValidPairs() { Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); } + } \ No newline at end of file diff --git a/group12/247565311/structure/week7/InfixExpr.java b/group12/247565311/structure/week7/InfixExpr.java index 1cb09a5d0b..4fc4d13fbe 100644 --- a/group12/247565311/structure/week7/InfixExpr.java +++ b/group12/247565311/structure/week7/InfixExpr.java @@ -1,20 +1,17 @@ package structure.week7; -import structure.week1.Stack; -// 使用表达式树来完成这个运算 +// 姹傝В琛ㄨ揪寮忓瓧绗︿覆锛岄鍏堝皢琛ㄨ揪寮忓垱寤烘垚涓�5琛ㄨ揪寮忔爲锛岄渶瑕佹牴鎹繍绠楃鐨勪紭鍏堢骇鏉ュ垱寤� public class InfixExpr { String expr = null; Element getElem = null; public InfixExpr(String expr) { - this.expr = "0+"+expr; // 由于遇到优先级变化会生成单独节点,必须以最低优先级开头 + this.expr = expr; getElem = new Element(expr); } public float evaluate() throws Exception{ - Node root = createNode(null); + Node node = new Node('\0',getElem.getNextNum()); + Node root = createNode(node); return (float) getValue(root); } - public double evaluate_stack(){ - return 0.0; - } class Element{ private int index; private String str; @@ -22,35 +19,7 @@ public Element(String _str){ index = 0; str = _str; } - public double peekNextNum(){ - int lastindex = index; - double resl = 0,resr=0; - int fbits = 0; - char ch = str.charAt(index); - boolean hasp = false; - while(ch=='.' || (ch<='9' && '0'<=ch)){ - index += 1; - if(ch == '.') hasp = true; - else{ - if(hasp){ - fbits -= 1; - resr += (double)(ch-'0') * Math.pow(10,fbits); - }else{ - resl *= 10; - resl += (ch-'0'); - } - } - if(hasNext()) ch = str.charAt(index); - else break; - } - index = lastindex; - return resl+resr; - } - public double getNextNum() throws Exception{ - if(!hasNext()) { - int a = index -2; - throw new Exception("表达式格式错误,在位置"+a+"处缺少操作数。"); - } + public double getNextNum(){ double resl = 0,resr=0; int fbits = 0; char ch = str.charAt(index); @@ -72,18 +41,6 @@ public double getNextNum() throws Exception{ } return resl+resr; } - public char peekNextOper(){ - int lastindex = index; - char ch = '\0'; - while(hasNext()){ - ch = str.charAt(index); - index += 1; - if(ch=='+'||ch=='-'||ch=='*'||ch=='/') break; - ch = '\0'; - } - index = lastindex; - return ch; - } public char getNextOper(){ if(hasNext()){ char ch = str.charAt(index); @@ -111,37 +68,23 @@ class Node{ val =v; } } - private Node createNode(Node node) throws Exception{ - if(getElem.peekNextOper() == '\0') return node; - if(node == null){ - node = new Node('\0',getElem.getNextNum()); - } + private Node createNode(Node root){ char ch = getElem.getNextOper(); - Node root = new Node(ch,0); - root.left = node; - char chn = getElem.peekNextOper(); - if(operUpDowm(ch,chn)<0){ // 操作符优先级提升 - root.right = createNode(null); - }else if(operUpDowm(ch,chn)>0){ // 操作符优先级下降 - root.right = new Node('\0',getElem.getNextNum()); - return root; // 这里是遍历完一个连续乘除法,需要返回节点,考虑5-2*3-4,不返回会导致5-2*3+4 + if(ch == '\0'){ + }else{ - root.right = new Node('\0',getElem.getNextNum()); + } - return createNode(root); - } - private int operUpDowm(char c1,char c2){ - int temp1 = 0,temp2=0; - if(c1=='+'||c1=='-')temp1 = 0; - else if(c1=='*'||c1=='/')temp1 = 1; - if(c2=='+'||c2=='-')temp2 = 0; - else if(c2=='*'||c2=='/')temp2 = 1; - return temp1-temp2; + Node node = new Node(getElem.getNextOper(),0); + node.left = root; + node.right = null; + // todo + return node; } private double getValue(Node root) throws Exception{ - if(root == null) throw new Exception("解析表达式出现异常"); + if(root == null) throw new Exception("表达式非法"); switch(root.op){ - case '+': + case '+': return getValue(root.left)+getValue(root.right); case '-': return getValue(root.left)-getValue(root.right); @@ -149,10 +92,8 @@ private double getValue(Node root) throws Exception{ return getValue(root.left)*getValue(root.right); case '/': return getValue(root.left)/getValue(root.right); - case '\0': - return root.val; default: - throw new Exception("目前还不支持 "+new StringBuilder().append(root.op).toString()+" 运算符。"); + return root.val; } } } diff --git a/group12/247565311/structure/week7/InfixExprTest.java b/group12/247565311/structure/week7/InfixExprTest.java index 730e623126..21680594de 100644 --- a/group12/247565311/structure/week7/InfixExprTest.java +++ b/group12/247565311/structure/week7/InfixExprTest.java @@ -6,66 +6,58 @@ public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - @After - public void tearDown() throws Exception { - } - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - try { - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } + @Before + public void setUp() throws Exception { + } + @After + public void tearDown() throws Exception { + } + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + try { + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - try { - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + try { + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } - { - InfixExpr expr = new InfixExpr("3*20/2"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - { - InfixExpr expr = new InfixExpr("4*2*5+5-4*5/5*3/2*4-2+4*2+2/1"); - try { - Assert.assertEquals(29, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - } + { + InfixExpr expr = new InfixExpr("10-30+50"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + } } \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/attr/AttrFactory.java b/group12/247565311/week567_miniJVM/attr/AttrFactory.java deleted file mode 100644 index 71992f4302..0000000000 --- a/group12/247565311/week567_miniJVM/attr/AttrFactory.java +++ /dev/null @@ -1,80 +0,0 @@ -package week567_miniJVM.attr; - -import week567_miniJVM.clz.ClassFile; -import week567_miniJVM.constant.ConstantInfo; -import week567_miniJVM.constant.UTF8Info; -import week567_miniJVM.loader.ByteCodeIterator; -import week567_miniJVM.attr.LineNumberTable; - -public class AttrFactory{ - private static AttrFactory instance = new AttrFactory(); - public static AttrFactory Instance(){ - return instance; - } - public AttributeInfo parse(ClassFile clzFile,ByteCodeIterator iter){ - int attrNameIndex = iter.nextU2ToInt(); - ConstantInfo info = clzFile.getConstantPool().getConstantInfo(attrNameIndex); - if(info.getType()==1&&"Code".equals(((UTF8Info) info).getValue())){ - int attrLen = iter.nextU4ToInt(); - int maxStack = iter.nextU2ToInt(); - int maxLocal = iter.nextU2ToInt(); - int codeLen = iter.nextU4ToInt(); - String code = iter.nextUxToHexString(codeLen); - CodeAttr codeattr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocal,codeLen,code); - - int exceptLen = iter.nextU2ToInt(); // 쳣 - while(exceptLen>0){ - exceptLen -= 1; - int startPc = iter.nextU2ToInt(); - int endPc = iter.nextU2ToInt(); - int handlerPc = iter.nextU2ToInt(); - int catchType = iter.nextU2ToInt(); - // TODO - } - int attributeLen = iter.nextU2ToInt(); // »Եĸ - while(attributeLen>0){ - attributeLen -= 1; - AttributeInfo chattr = AttrFactory.Instance().parse(clzFile, iter); - codeattr.addAttr(chattr); - } - return codeattr; - }else if(info.getType()==1&&"LineNumberTable".equals(((UTF8Info) info).getValue())){ - int attrLen = iter.nextU4ToInt(); - int lineNum = iter.nextU2ToInt(); - LineNumberTable linetable = new LineNumberTable(attrNameIndex,lineNum); - while(lineNum>0){ - lineNum -= 1; - int startPc = iter.nextU2ToInt(); - int lineNumber = iter.nextU2ToInt(); - linetable.addLineNumberItem(startPc,lineNumber); - } - return linetable; - }else if(info.getType()==1&&"LocalVariableTable".equals(((UTF8Info) info).getValue())){ - int attrLen = iter.nextU4ToInt(); - int localVarNum = iter.nextU2ToInt(); - LocalVariableTable lvartable = new LocalVariableTable(attrNameIndex,localVarNum); - while(localVarNum>0){ - localVarNum -= 1; - int startPc = iter.nextU2ToInt(); - int length = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int index = iter.nextU2ToInt(); - LocalVariableItem item = new LocalVariableItem(startPc,length,nameIndex,descIndex,index); - lvartable.addLocalVariableItem(item); - } - return lvartable; - }else if(info.getType()==1&&"StackMapTable".equals(((UTF8Info) info).getValue())){ - int attrLen = iter.nextU4ToInt(); - int entryNum = iter.nextU2ToInt(); - StackMapTable stacktable = new StackMapTable(attrNameIndex,entryNum); - stacktable.parse(iter); - //while(entryNum>0){ - // entryNum -= 1; - - //} - return stacktable; - } - return null; - } -} \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/attr/AttributeInfo.java b/group12/247565311/week567_miniJVM/attr/AttributeInfo.java index fb310678bf..e97ebe0065 100644 --- a/group12/247565311/week567_miniJVM/attr/AttributeInfo.java +++ b/group12/247565311/week567_miniJVM/attr/AttributeInfo.java @@ -1,6 +1,7 @@ package week567_miniJVM.attr; -import structure.week1.ArrayList; + + public abstract class AttributeInfo { public static final String CODE = "Code"; @@ -11,19 +12,13 @@ public abstract class AttributeInfo { public static final String STACK_MAP_TABLE = "StackMapTable"; int attrNameIndex; int attrLen ; - private String attrName; - ArrayList attrs = new ArrayList(); - public AttributeInfo( int attrNameIndex,int attrLen,String attrname) { - this.attrNameIndex = attrNameIndex; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; this.attrLen = attrLen; - this.attrName = attrname; - } - public String getAttrName(){ - return attrName; - } - public void addAttr(AttributeInfo attrinfo){ - attrs.add(attrinfo); } + + } diff --git a/group12/247565311/week567_miniJVM/attr/CodeAttr.java b/group12/247565311/week567_miniJVM/attr/CodeAttr.java index 15e0a027f2..b32d6aada9 100644 --- a/group12/247565311/week567_miniJVM/attr/CodeAttr.java +++ b/group12/247565311/week567_miniJVM/attr/CodeAttr.java @@ -1,10 +1,13 @@ + + package week567_miniJVM.attr; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.constant.ConstantPool; import week567_miniJVM.loader.ByteCodeIterator; + public class CodeAttr extends AttributeInfo { private int maxStack ; private int maxLocals ; @@ -13,40 +16,46 @@ public class CodeAttr extends AttributeInfo { public String getCode() { return code; } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen,AttributeInfo.CODE); + super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; + //this.cmds = cmds; } - public LineNumberTable getLineNumberTable() { - for(int i=0;i items = new ArrayList(); public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen,AttributeInfo.LOCAL_VAR_TABLE); + super(attrNameIndex, attrLen); } + public static LocalVariableTable parse(ByteCodeIterator iter){ return null; } - public void addLocalVariableItem(LocalVariableItem item) { + private void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } - } diff --git a/group12/247565311/week567_miniJVM/attr/StackMapTable.java b/group12/247565311/week567_miniJVM/attr/StackMapTable.java index aaf8d2944d..c6b72f2655 100644 --- a/group12/247565311/week567_miniJVM/attr/StackMapTable.java +++ b/group12/247565311/week567_miniJVM/attr/StackMapTable.java @@ -9,7 +9,7 @@ public class StackMapTable extends AttributeInfo{ private String originalCode; public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen,AttributeInfo.STACK_MAP_TABLE); + super(attrNameIndex, attrLen); } public static StackMapTable parse(ByteCodeIterator iter){ diff --git a/group12/247565311/week567_miniJVM/clz/ClassFile.java b/group12/247565311/week567_miniJVM/clz/ClassFile.java index 5db5b1dba8..91226364b8 100644 --- a/group12/247565311/week567_miniJVM/clz/ClassFile.java +++ b/group12/247565311/week567_miniJVM/clz/ClassFile.java @@ -7,48 +7,65 @@ import structure.week1.ArrayList; public class ClassFile { - public int minorVersion,majorVersion; - private AccessFlag accessFlag = null; - private ClassIndex clzIndex = null; - private ConstantPool constPool = null; - private ArrayList methods = null; - private ArrayList fields = null; - + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + + public ClassIndex getClzIndex() { return clzIndex; } - public void setClzIndex(ClassIndex clz){ - clzIndex = clz; - } public AccessFlag getAccessFlag() { return accessFlag; } - public void setAccessFlag(AccessFlag acsFlag){ - accessFlag = acsFlag; - } - public ConstantPool getConstantPool() { - return constPool; + public void setAccessFlag(AccessFlag accessFlag) { + this.accessFlag = accessFlag; + } + + + + public ConstantPool getConstantPool() { + return pool; } - public void setConstantPool(ConstantPool pool){ - constPool = pool; - } public int getMinorVersion() { return minorVersion; } + public void setMinorVersion(int minorVersion) { + this.minorVersion = minorVersion; + } public int getMajorVersion() { return majorVersion; } - public void setVersion(int minor,int major){ - minorVersion = minor; - majorVersion = major; - } + 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("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); @@ -59,18 +76,9 @@ private String getSuperClassName(){ return superClass.getClassName(); } public ArrayList getMethods() { - return methods; + return null; } public ArrayList getFields() { - return fields; - } - public void setClassIndex(ClassIndex parseClassIndex) { - clzIndex = parseClassIndex; - } - public void setFields(ArrayList parseFields) { - fields = parseFields; - } - public void setMethods(ArrayList parseMethods) { - methods = parseMethods; + return null; } } diff --git a/group12/247565311/week567_miniJVM/constant/ConstantPool.java b/group12/247565311/week567_miniJVM/constant/ConstantPool.java index 23c1c32dce..fb35f6c253 100644 --- a/group12/247565311/week567_miniJVM/constant/ConstantPool.java +++ b/group12/247565311/week567_miniJVM/constant/ConstantPool.java @@ -4,13 +4,19 @@ 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); } diff --git a/group12/247565311/week567_miniJVM/constant/InfoFactory.java b/group12/247565311/week567_miniJVM/constant/InfoFactory.java deleted file mode 100644 index 8c8bdc12f4..0000000000 --- a/group12/247565311/week567_miniJVM/constant/InfoFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -package week567_miniJVM.constant; -import week567_miniJVM.loader.ByteCodeIterator; -public class InfoFactory{ - private static InfoFactory infoFact = new InfoFactory(); - public static InfoFactory Invoke(){ - return infoFact; - } - public ConstantInfo getInfoObj(int tag,ByteCodeIterator iter,ConstantPool pool){ - switch(tag){ - case 1:{ - UTF8Info info = new UTF8Info(pool); - info.setLength(iter.nextU2ToInt()); - info.setValue(iter.nextUxToHexString(info.getLength())); - return info;} - case 7:{ - ClassInfo info = new ClassInfo(pool); - info.setUtf8Index(iter.nextU2ToInt()); - return info; } - case 8:{ - StringInfo info = new StringInfo(pool); - info.setIndex(iter.nextU2ToInt()); - return info;} - case 9:{ - FieldRefInfo info = new FieldRefInfo(pool); - info.setClassInfoIndex(iter.nextU2ToInt()); - info.setNameAndTypeIndex(iter.nextU2ToInt()); - return info;} - case 10:{ - MethodRefInfo info = new MethodRefInfo(pool); - info.setClassInfoIndex(iter.nextU2ToInt()); - info.setNameAndTypeIndex(iter.nextU2ToInt()); - return info;} - case 12:{ - NameAndTypeInfo info = new NameAndTypeInfo(pool); - info.setIndex1(iter.nextU2ToInt()); - info.setIndex2(iter.nextU2ToInt()); - return info;} - default: - new RuntimeException("tag 为"+tag+" 的常亮项尚不支持!").printStackTrace(); - break; - } - return null; - } -} - - - - - - - - - - diff --git a/group12/247565311/week567_miniJVM/constant/UTF8Info.java b/group12/247565311/week567_miniJVM/constant/UTF8Info.java index 40dbb7f126..ac2341bda9 100644 --- a/group12/247565311/week567_miniJVM/constant/UTF8Info.java +++ b/group12/247565311/week567_miniJVM/constant/UTF8Info.java @@ -26,4 +26,7 @@ public String getValue() { public void setValue(String value) { this.value = value; } + + + } diff --git a/group12/247565311/week567_miniJVM/field/Field.java b/group12/247565311/week567_miniJVM/field/Field.java index dd7510510a..47eac5a308 100644 --- a/group12/247565311/week567_miniJVM/field/Field.java +++ b/group12/247565311/week567_miniJVM/field/Field.java @@ -1,24 +1,33 @@ package week567_miniJVM.field; -import structure.week1.ArrayList; import week567_miniJVM.constant.ConstantPool; +import week567_miniJVM.constant.UTF8Info; import week567_miniJVM.loader.ByteCodeIterator; + + public class Field { - private int accessFlag,nameIndex,descIndex; + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + private ConstantPool pool; - public Field( int accessFlag, int nameIndex, int descIndex,ConstantPool pool) { + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + this.accessFlag = accessFlag; this.nameIndex = nameIndex; - this.descIndex = descIndex; + this.descriptorIndex = descriptorIndex; this.pool = pool; } - public void parse(ConstantPool pool,ByteCodeIterator iter){ - int propNum = iter.nextU2ToInt(); - while(propNum>0){ - propNum -= 1; - int prop = iter.nextU2ToInt(); - // TODO - } - return ; + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + return null; } + } \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java b/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java index a3cf1f4578..d38345b3fe 100644 --- a/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java +++ b/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java @@ -1,38 +1,20 @@ package week567_miniJVM.loader; public class ByteCodeIterator { - private byte[] bytes = null; - int index = 0; - public ByteCodeIterator(byte[] _byte){ - bytes = _byte; - } - public void skip(int i){ - index += i; - } - public int nextU1ToInt(){ - byte a = bytes[index]; - System.out.print(a); - index += 1; - return (int)(a&0xff); - } + public int nextU2ToInt() { - return nextU1ToInt()*256+nextU1ToInt(); + // TODO Զɵķ + return 0; } public int nextU4ToInt() { - return nextU1ToInt()*256*256*256+nextU1ToInt()*256*256+nextU1ToInt()*256+nextU1ToInt(); + // TODO Զɵķ + return 0; } public String nextUxToHexString(int len) { - String res = ""; - while(len>0){ - len -= 1; - int a = nextU1ToInt(); - res += (char)(a&0xff); - } - return res; + // TODO Զɵķ + return null; } - public boolean hasNext(){ - return index clzPaths = new ArrayList(); - public ClassFile loadClass(String className){ - - byte[] bytes = readBinaryCode(className); - ClassFile clzFile = new ClassFileParser().parse(bytes); - - return clzFile; - } - public byte[] readBinaryCode(String className) { + public byte[] readBinaryCode(String className) throws Exception { for(String s:clzPaths){ String filename = s+className+".class"; File file = new File(filename); @@ -26,26 +20,32 @@ public byte[] readBinaryCode(String className) { } return null; } - private byte[] loadClassFile(String clzFileName) { + public ClassFile loadClass(String className){ + return null; + } + private byte[] loadClassFile(String clzFileName) throws Exception { File file = new File(clzFileName); long filelength = file.length(); byte[]res = null; - if(filelength>Integer.MAX_VALUE) new IOException("ļ").printStackTrace(); + if(filelength>Integer.MAX_VALUE)throw new IOException("ļ"); try { FileInputStream fileinput = new FileInputStream(file); res = new byte[(int) filelength]; int offset=0,length=0; while(offset-1)) offset += length; - if(fileinput!=null)fileinput.close(); - } catch (Exception e) { + fileinput.close(); + } catch (FileNotFoundException e) { e.printStackTrace(); } return res; } + public void addClassPath(String path) { clzPaths.add(path); } + + public String getClassPath(){ String res = ""; int size = clzPaths.size(); diff --git a/group12/247565311/week567_miniJVM/loader/ClassFileParser.java b/group12/247565311/week567_miniJVM/loader/ClassFileParser.java index c3858dbaf6..5a23889b50 100644 --- a/group12/247565311/week567_miniJVM/loader/ClassFileParser.java +++ b/group12/247565311/week567_miniJVM/loader/ClassFileParser.java @@ -1,91 +1,44 @@ package week567_miniJVM.loader; -import structure.week1.ArrayList; +import java.io.UnsupportedEncodingException; + import week567_miniJVM.clz.AccessFlag; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.clz.ClassIndex; -import week567_miniJVM.constant.ConstantInfo; +import week567_miniJVM.constant.ClassInfo; import week567_miniJVM.constant.ConstantPool; -import week567_miniJVM.constant.InfoFactory; +import week567_miniJVM.constant.FieldRefInfo; +import week567_miniJVM.constant.MethodRefInfo; +import week567_miniJVM.constant.NameAndTypeInfo; import week567_miniJVM.constant.NullConstantInfo; -import week567_miniJVM.field.Field; -import week567_miniJVM.method.Method; - +import week567_miniJVM.constant.StringInfo; +import week567_miniJVM.constant.UTF8Info; public class ClassFileParser { - public ClassFile parse(byte[] bytes) { - ClassFile clzFile = new ClassFile(); - ByteCodeIterator iter = new ByteCodeIterator(bytes); - if(!"cafebabe".equals(iter.nextUxToHexString(4))) return null; - - clzFile.setVersion(iter.nextU2ToInt(),iter.nextU2ToInt()); - - ConstantPool pool = parseConstantPool(iter); - clzFile.setConstantPool(pool); - - clzFile.setAccessFlag(parseAccessFlag(iter)); - clzFile.setClassIndex(parseClassIndex(iter)); - - int collectionNum = iter.nextU2ToInt(); - iter.skip(collectionNum*2); - - clzFile.setFields(parseFields(iter,pool)); - clzFile.setMethods(parseMethods(clzFile,iter)); - return clzFile; - } - - private ConstantPool parseConstantPool(ByteCodeIterator iter){ - ConstantPool pool = new ConstantPool(); - pool.addConstantInfo(new NullConstantInfo()); - int lenpool = iter.nextU2ToInt(); - while(lenpool>1){ - lenpool -= 1; - int tag = iter.nextU1ToInt(); - ConstantInfo info = InfoFactory.Invoke().getInfoObj(tag,iter,pool); - pool.addConstantInfo(info); - } - return pool; + + public ClassFile parse(byte[] codes) { + + + + + return null; } - + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - AccessFlag caflag = new AccessFlag(iter.nextU2ToInt()); - return caflag; + + return null; } - - private ClassIndex parseClassIndex(ByteCodeIterator iter) { - ClassIndex clzIndex = new ClassIndex(); - clzIndex.setThisClassIndex(iter.nextU2ToInt()); - clzIndex.setSuperClassIndex(iter.nextU2ToInt()); - return clzIndex; + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + + return null; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + + return null; + } + - private ArrayList parseFields(ByteCodeIterator iter,ConstantPool pool){ - ArrayList fields = new ArrayList(); - int fieldNum = iter.nextU2ToInt(); - while(fieldNum>0){ - fieldNum -= 1; - int accflag = iter.nextU2ToInt(); // 例如是public - int nameIndex = iter.nextU2ToInt();// 指向常量池的入口 - int descIndex = iter.nextU2ToInt(); // 指向常量池的入口 - Field field = new Field(accflag,nameIndex,descIndex,pool); - field.parse(pool,iter); - fields.add(field); - } - return fields; - } - - private ArrayList parseMethods(ClassFile clzFile,ByteCodeIterator iter){ - ArrayList methods = new ArrayList(); - int methodNum = iter.nextU2ToInt(); - while(methodNum>0){ - methodNum -= 1; - int accflag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - Method method = new Method(clzFile,accflag,nameIndex,descIndex); - method.parse(clzFile,iter); - methods.add(method); - } - return methods; - } } diff --git a/group12/247565311/week567_miniJVM/method/Method.java b/group12/247565311/week567_miniJVM/method/Method.java index ceabffec1b..aadd29e9a6 100644 --- a/group12/247565311/week567_miniJVM/method/Method.java +++ b/group12/247565311/week567_miniJVM/method/Method.java @@ -1,51 +1,58 @@ package week567_miniJVM.method; + import week567_miniJVM.clz.ClassFile; -import week567_miniJVM.constant.ConstantInfo; -import week567_miniJVM.constant.UTF8Info; -import week567_miniJVM.loader.ByteCodeIterator; -import week567_miniJVM.attr.AttrFactory; import week567_miniJVM.attr.AttributeInfo; import week567_miniJVM.attr.CodeAttr; +import week567_miniJVM.constant.ConstantPool; +import week567_miniJVM.constant.UTF8Info; +import week567_miniJVM.loader.ByteCodeIterator; + + public class Method { - private int accessFlag,nameIndex,descIndex; + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private CodeAttr codeAttr; + private ClassFile clzFile; + public ClassFile getClzFile() { return clzFile; } - public int getAccessFlag(){ - return accessFlag; - } + public int getNameIndex() { return nameIndex; } public int getDescriptorIndex() { - return descIndex; + return descriptorIndex; } + public CodeAttr getCodeAttr() { return codeAttr; } + public void setCodeAttr(CodeAttr code) { this.codeAttr = code; } - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descIndex) { + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { this.clzFile = clzFile; this.accessFlag = accessFlag; this.nameIndex = nameIndex; - this.descIndex = descIndex; + this.descriptorIndex = descriptorIndex; } - - public void parse(ClassFile clzFile, ByteCodeIterator iter){ - int attributeNum = iter.nextU2ToInt(); - while(attributeNum>0){ - attributeNum -= 1; - AttributeInfo attrinfo = AttrFactory.Instance().parse(clzFile, iter); - if(attrinfo == null) continue; - - } + + + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + return null; + } } diff --git a/group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java b/group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java similarity index 93% rename from group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java rename to group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java index c235413b3b..ed81eaa399 100644 --- a/group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java +++ b/group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java @@ -1,7 +1,7 @@ -package week567_miniJVM.loader; - +package week567_miniJVM.test; import structure.week1.ArrayList; +import structure.week1.List; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.clz.ClassIndex; import week567_miniJVM.constant.ClassInfo; @@ -19,15 +19,23 @@ import org.junit.Test; public class ClassFileLoaderTest { - private static final String FULL_QUALIFIED_CLASS_NAME = "EmployeeV1.class"; - static String path1 = "F:\\code_language\\demo\\Homework\\bin\\week567_miniJVM\\test\\"; + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + static String path1 = "F:\\code_language\\demo\\Homework\\bin\\week567_miniJVM\\test"; static String path2 = "C:\temp"; + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } + + @Before - public void setUp() throws Exception { - int = 1; - += 1; - System.out.print(); + public void setUp() throws Exception { } @After public void tearDown() throws Exception { @@ -51,8 +59,7 @@ public void testClassFileLength() { } catch (Exception e) { e.printStackTrace(); } - // .classļֽ - System.out.print(byteCodes.length); + // 这里断言.class文件的字节数 Assert.assertEquals(267, byteCodes.length); } @Test @@ -84,17 +91,8 @@ private String byteToHexString(byte[] codes ){ return buffer.toString(); } /** - * miniJVMڶҵ + * miniJVM第二次作业测试用例 */ - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "week567_miniJVM.test.EmployeeV1"; - - clzFile = loader.loadClass(className); - clzFile.print(); - } @Test public void testVersion(){ Assert.assertEquals(0, clzFile.getMinorVersion()); @@ -142,7 +140,7 @@ public void testConstantPool(){ Assert.assertEquals(9, nameAndType.getIndex1()); Assert.assertEquals(14, nameAndType.getIndex2()); } - // һ + // 随机抽查一个 { MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45); Assert.assertEquals(1, methodRef.getClassInfoIndex()); @@ -162,7 +160,7 @@ public void testClassIndex(){ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } /** - * miniJVMҵ + * miniJVM第三次作业测试用例 */ @Test public void testReadFields(){ @@ -225,4 +223,4 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } -} +} \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/test/EmployeeV1.java b/group12/247565311/week567_miniJVM/test/EmployeeV1.java index bfa4460096..b9855461ae 100644 --- a/group12/247565311/week567_miniJVM/test/EmployeeV1.java +++ b/group12/247565311/week567_miniJVM/test/EmployeeV1.java @@ -1,18 +1,5 @@ package week567_miniJVM.test; public class EmployeeV1 { - private int age; - private String name; - public void setAge(int _age){ - age = _age; - } - public int getAge(){ - return age; - } - public void setName(String _name){ - name = _name; - } - public String getName(){ - return name; - } + } diff --git a/group12/247565311/week567_miniJVM/util/Util.java b/group12/247565311/week567_miniJVM/util/Util.java index 9c7baeb915..c10eaee6f2 100644 --- a/group12/247565311/week567_miniJVM/util/Util.java +++ b/group12/247565311/week567_miniJVM/util/Util.java @@ -5,6 +5,9 @@ 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 */ - public static void reverse(Stack stack) { + public static void reverse(Stack stack) { if (stack.isEmpty()) { return; } - E i = getAndRemoveLastElement(stack); + int i = getAndRemoveLastElement(stack); reverse(stack); stack.push(i); } - - public static E getAndRemoveLastElement(Stack stack) { - E result = stack.pop(); + public static int getAndRemoveLastElement(Stack stack) { + int result = stack.pop(); if (stack.isEmpty()) { return result; } else { - E last = getAndRemoveLastElement(stack); + int last = getAndRemoveLastElement(stack); stack.push(result); return last; } diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index c143116ec4..eade1dc743 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -1,78 +1,18 @@ -package stack.expr; - -import java.util.List; -import java.util.Stack; - - -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - - Stack opStack = new Stack<>(); - Stack numStack = new Stack<>(); - - for(Token token : tokens){ - - if (token.isOperator()){ - - if(opStack.isEmpty()){ - - opStack.push(token); - } else{ - - while(!opStack.isEmpty() - && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(), f1,f2); - numStack.push(result); - - } - opStack.push(token); - } - } - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - - while(!opStack.isEmpty()){ - Token token = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(), f1,f2)); - } - - - return numStack.pop().floatValue(); - } - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - - - -} +package stack.expr; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + return 0.0f; + } + + + + +} diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprS.java b/group12/382266293/coding/basic/stack/expr/InfixExprS.java deleted file mode 100644 index 7600cccb93..0000000000 --- a/group12/382266293/coding/basic/stack/expr/InfixExprS.java +++ /dev/null @@ -1,102 +0,0 @@ -package stack.expr; - -import java.util.Stack; -import stack.StackUtil; - -public class InfixExprS{ - String expr = null; - - public InfixExprS(String expr) { - this.expr = expr; - } - - public float evaluate() { - - TParser tp = new TParser(); - tp.parse(expr); - Stack ints = new Stack(); - Stack signs = new Stack(); - - int i1 = tp.nextInt(); - String sign1 = tp.nextSign(); - - ints.push(i1); - signs.push(sign1); - - while (tp.hasNextInt()) { - - int i2 = tp.nextInt(); - String sign2 = tp.nextSign(); - - if (tp.hasNextInt()) { - - if (highPrioritySign(sign1)) { - - i1 = ints.pop(); - sign1 = signs.pop(); - i2 = calculate(i1, i2, sign1); - - } - - ints.push(i2); - signs.push(sign2); - sign1 = sign2; - - } - - } - - signs.pop(); - StackUtil.reverse(ints); - StackUtil.reverse(signs); - - while (!ints.isEmpty()) { - - int firstInt = ints.pop(); - - if (ints.isEmpty()) { - return (float) firstInt; - } - - int secInt = ints.pop(); - String sign = signs.pop(); - int result = calculate(firstInt, secInt, sign); - ints.push(result); - - } - - System.out.println("we shall not reach here"); - return (float) ints.peek(); - } - - private int calculate(int firstInt, int secInt, String lowsign) { - - int result; - if (lowsign.equals("+")) { - result = firstInt + secInt; - } else if (lowsign.equals("-")) { - result = firstInt - secInt; - } else if (lowsign.equals("*")) { - result = firstInt * secInt; - } else if (lowsign.equals("/")) { - result = firstInt / secInt; - } else { - throw new RuntimeException(lowsign + " has not been supported yet!"); - } - - return result; - - } - - private boolean highPrioritySign(String sign) { - - if (sign.equals("*") || sign.equals("/")) { - - return true; - - } - - return false; - } - -} diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java index 836848ac91..bb047629bd 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java @@ -5,6 +5,7 @@ import org.junit.Before; import org.junit.Test; + public class InfixExprTest { @Before @@ -17,62 +18,31 @@ public void tearDown() throws Exception { @Test public void testEvaluate() { - - { - InfixExpr expr = new InfixExpr("1*2*2-1"); - Assert.assertEquals(3.0, expr.evaluate(), 0.001f); - } - + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); { InfixExpr expr = new InfixExpr("2+3*4+5"); Assert.assertEquals(19.0, expr.evaluate(), 0.001f); } - { - InfixExpr expr = new InfixExpr("2+3*4+5*1+1"); - Assert.assertEquals(20.0, expr.evaluate(), 0.001f); + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); } - { - InfixExpr expr = new InfixExpr("2+3*4/2+1"); - Assert.assertEquals(9, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("2-3*4/2-1"); - Assert.assertEquals(-5.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("6-1*5+2+0"); - Assert.assertEquals(3.0, expr.evaluate(), 0.001f); - } - { InfixExpr expr = new InfixExpr("3*20/2"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - { - InfixExpr expr = new InfixExpr("3*20/2+1"); - Assert.assertEquals(31, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2+1-1"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - { InfixExpr expr = new InfixExpr("20/2*3"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - + { InfixExpr expr = new InfixExpr("10-30+50"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - + } } diff --git a/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java b/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java deleted file mode 100644 index a293ddfeee..0000000000 --- a/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,51 +0,0 @@ -package stack.expr; - -import java.util.List; -import java.util.Stack; - -public class InfixToPostfix { - - public static List convert(String expr) { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - List pTokens = new Stack<>(); - Stack opStack = new Stack<>(); - - for (Token token : tokens) { - if (token.isNumber()) { - pTokens.add(token); - } else { - if (token.isLeftSquare()) { - opStack.push(token); - } else if (token.isRightSquare()) { - while (!opStack.peek().isLeftSquare()) { - pTokens.add(opStack.pop()); - } - opStack.pop(); - } else { - if (opStack.isEmpty() || token.hasHigherPriority(opStack.peek())) { - opStack.add(token); - } else { - while (!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())) { - pTokens.add(opStack.pop()); - } - opStack.add(token); - } - } - } - } - - while(!opStack.isEmpty()) { - pTokens.add(opStack.pop()); - } - - System.out.println(pTokens); - return pTokens; - } - - public static void main(String[] args) { - convert("10-2*3+50"); - } - -} diff --git a/group12/382266293/coding/basic/stack/expr/PostfixExpr.java b/group12/382266293/coding/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index e4eaa4bfe6..0000000000 --- a/group12/382266293/coding/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,51 +0,0 @@ -package stack.expr; - -import java.util.List; -import java.util.Stack; - -public class PostfixExpr { -String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - Stack numStack = new Stack<>(); - - for(Token token : tokens){ - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } else { - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(), f1,f2)); - } - } - - return numStack.pop().floatValue(); - } - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - - - -} diff --git a/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java b/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java deleted file mode 100644 index 1a6137e537..0000000000 --- a/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package stack.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group12/382266293/coding/basic/stack/expr/PrefixExpr.java b/group12/382266293/coding/basic/stack/expr/PrefixExpr.java deleted file mode 100644 index 1628810d68..0000000000 --- a/group12/382266293/coding/basic/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,56 +0,0 @@ -package stack.expr; - -import java.util.List; -import java.util.Stack; - -import stack.StackUtil; - -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - System.out.println(tokens); - Stack exprStack = new Stack<>(); - Stack numStack = new Stack<>(); - for(Token token : tokens){ - exprStack.push(token); - } - System.out.println(exprStack); - while(!exprStack.isEmpty()){ - Token t = exprStack.pop(); - if(t.isNumber()){ - numStack.push(new Float(t.getIntValue())); - }else{ - Float f1 = numStack.pop(); - Float f2 = numStack.pop(); - numStack.push(calculate(t.toString(),f1,f2)); - - } - } - return numStack.pop().floatValue(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - - -} diff --git a/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java b/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java deleted file mode 100644 index 85b68a1020..0000000000 --- a/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group12/382266293/coding/basic/stack/expr/TParser.java b/group12/382266293/coding/basic/stack/expr/TParser.java deleted file mode 100644 index 06c543efd3..0000000000 --- a/group12/382266293/coding/basic/stack/expr/TParser.java +++ /dev/null @@ -1,85 +0,0 @@ -package stack.expr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Queue; -import java.util.concurrent.LinkedBlockingDeque; - -public class TParser { - - Queue intQ; - Queue signQ; - static final List signs = new ArrayList(); - { - signs.add("+"); - signs.add("-"); - signs.add("*"); - signs.add("/"); - } - - public TParser() { - intQ = new LinkedBlockingDeque(); - signQ = new LinkedBlockingDeque(); - } - - public void parse(String expr) { - - String[] tokens = expr.split(""); - String number = ""; - - for (int i = 0; i < tokens.length; i++) { - - String c = tokens[i]; - - if (isSign(c)) { - - signQ.add(c); - - int num = Integer.parseInt(number); - intQ.add(num); - number = ""; - - } else { - - number += tokens[i]; - - } - - } - - int num = Integer.parseInt(number); - intQ.add(num); - - int intSize = intQ.size(); - if (intSize < 2 || intSize - signQ.size() > 1) { - throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ); - } - - intQ.add(0); - - } - - private boolean isSign(String c) { - if (signs.contains(c)) { - return true; - } - return false; - } - - public int nextInt() { - return intQ.poll(); - } - - public String nextSign() { - return signQ.poll(); - } - - public boolean hasNextInt() { - return !intQ.isEmpty(); - } - - public boolean hasNextSign() { - return !signQ.isEmpty(); - } - -} diff --git a/group12/382266293/coding/basic/stack/expr/Token.java b/group12/382266293/coding/basic/stack/expr/Token.java deleted file mode 100644 index 670663d358..0000000000 --- a/group12/382266293/coding/basic/stack/expr/Token.java +++ /dev/null @@ -1,77 +0,0 @@ -package stack.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/", "(", ")"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - priorities.put("(", 0); - priorities.put(")", 3); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public boolean isLeftSquare() { - if (!isOperator()) { - return false; - } - - return priorities.get(this.value) == 0; - } - - public boolean isRightSquare() { - if (!isOperator()) { - return false; - } - - return priorities.get(this.value) == 3; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - public boolean isSquare() { - - return isLeftSquare() || isRightSquare(); - } - - - - - -} \ No newline at end of file diff --git a/group12/382266293/coding/basic/stack/expr/TokenParser.java b/group12/382266293/coding/basic/stack/expr/TokenParser.java deleted file mode 100644 index 5f4be41e00..0000000000 --- a/group12/382266293/coding/basic/stack/expr/TokenParser.java +++ /dev/null @@ -1,57 +0,0 @@ -package stack.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group12/382266293/coding/basic/stack/expr/TokenParserTest.java b/group12/382266293/coding/basic/stack/expr/TokenParserTest.java deleted file mode 100644 index 427f887edd..0000000000 --- a/group12/382266293/coding/basic/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package stack.expr; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - - @Test - public void test1() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("9+(3-1)*3+10/2"); - System.out.println(tokens); -// //9+(3-1)*3+10/2 -// PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); -// Assert.assertEquals(20, expr.evaluate(),0.0f); [9, 3, 1, -, 3, *, +, 10, 2, /, +] - -// Assert.assertEquals(300, tokens.get(0).getIntValue()); -// Assert.assertEquals("*", tokens.get(1).toString()); -// Assert.assertEquals(20, tokens.get(2).getIntValue()); -// Assert.assertEquals("+", tokens.get(3).toString()); -// Assert.assertEquals(12, tokens.get(4).getIntValue()); -// Assert.assertEquals("*", tokens.get(5).toString()); -// Assert.assertEquals(5, tokens.get(6).getIntValue()); -// Assert.assertEquals("-", tokens.get(7).toString()); -// Assert.assertEquals(20, tokens.get(8).getIntValue()); -// Assert.assertEquals("/", tokens.get(9).toString()); -// Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - - - -} diff --git a/group12/382266293/src/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java index 0abca4577f..ea847fd386 100644 --- a/group12/382266293/src/array/ArrayUtil.java +++ b/group12/382266293/src/array/ArrayUtil.java @@ -8,38 +8,106 @@ public class ArrayUtil { - public static void initialArray(int[] arr, int j) { - for (int i = 0; i < arr.length; i++) { - arr[i] = j; + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + + int temp; + int index = origin.length - 1; + int numbersToReverse = origin.length / 2; + for (int i = 0; i < numbersToReverse; i++) { + temp = origin[i]; + origin[i] = origin[index - i]; + origin[index - i] = temp; } } - public static boolean isPerfectNum(int num) { + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ - int sum = 0; - for (int i = 1; i <= num / 2; i++) { - if (num % i == 0) - sum += i; + public int[] removeZero(int[] oldArray) { + + BitSet check = new BitSet(oldArray.length); + boolean isZero; + for (int i = 0; i < oldArray.length; i++) { + isZero = (oldArray[i] == 0) ? true : false; + check.set(i, isZero); } - return (num == sum) ? true : false; + int newSize = oldArray.length - check.cardinality(); + int[] newArr = new int[newSize]; + + int nextIndex = check.nextClearBit(0); + for (int i = 0; i < newSize; i++) { + newArr[i] = oldArray[nextIndex]; + nextIndex = check.nextClearBit(nextIndex + 1); + } + return newArr; } - public static boolean isPrime(int num) { + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ - if (num <= 1) - return false; + public int[] merge(int[] array1, int[] array2) { - if (num == 2) - return true; + int len1 = array1.length; + int len2 = array2.length; + int len3 = array1[len1 - 1] < array2[len2 - 1] ? array2[len2 - 1] + 1 : array1[len1 - 1] + 1; + int[] newArr = new int[len3]; + initialArray(newArr, -1); + for (int i = 0; i < len1; i++) { + newArr[array1[i]] = 0; + } + for (int i = 0; i < len2; i++) { + newArr[array2[i]] = 0; + } + int mergedLength = 0; + for (int i = 0; i < len3; i++) { + if (newArr[i] != -1) + newArr[mergedLength++] = i; + } + return Arrays.copyOf(newArr, mergedLength); + } - for (int i = 2; i <= Math.sqrt(num) + 1; i++) { - if (num % i == 0) - return false; + public static void initialArray(int[] arr, int j) { + for (int i = 0; i < arr.length; i++) { + arr[i] = j; } + } - return true; + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + + int[] newArr = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArr[i] = oldArray[i]; + } + return newArr; } /** @@ -63,30 +131,6 @@ public int[] fibonacci(int max) { return Arrays.copyOf(result, ++count); } - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) { - - int count = 0; - ArrayList myList = new ArrayList(); - for (int i = 1; i < max; i++) { - if (isPerfectNum(i)) { - count++; - myList.add(i); - } - } - int[] result = new int[count]; - Iterator iterator = myList.iterator(); - for (int i = 0; i < count; i++) { - result[i] = iterator.next(); - } - return result; - } - /** * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] * @@ -110,117 +154,73 @@ public int[] getPrimes(int max) { return result; } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * - * @param oldArray - * @param size - * @return - */ - public int[] grow(int[] oldArray, int size) { + public static boolean isPrime(int num) { - int[] newArr = new int[oldArray.length + size]; - for (int i = 0; i < oldArray.length; i++) { - newArr[i] = oldArray[i]; - } - return newArr; - } + if (num <= 1) + return false; - /** - * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" - * - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < array.length; i++) { - sb.append(array[i]); - if (i < array.length - 1) - sb.append(seperator); + if (num == 2) + return true; + + for (int i = 2; i <= Math.sqrt(num) + 1; i++) { + if (num % i == 0) + return false; } - return sb.toString(); + + return true; } /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = - * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 * - * @param array1 - * @param array2 + * @param max * @return */ + public int[] getPerfectNumbers(int max) { - public int[] merge(int[] array1, int[] array2) { - - int len1 = array1.length; - int len2 = array2.length; - int len3 = array1[len1 - 1] < array2[len2 - 1] ? array2[len2 - 1] + 1 : array1[len1 - 1] + 1; - int[] newArr = new int[len3]; - initialArray(newArr, -1); - for (int i = 0; i < len1; i++) { - newArr[array1[i]] = 0; - } - for (int i = 0; i < len2; i++) { - newArr[array2[i]] = 0; + int count = 0; + ArrayList myList = new ArrayList(); + for (int i = 1; i < max; i++) { + if (isPerfectNum(i)) { + count++; + myList.add(i); + } } - int mergedLength = 0; - for (int i = 0; i < len3; i++) { - if (newArr[i] != -1) - newArr[mergedLength++] = i; + int[] result = new int[count]; + Iterator iterator = myList.iterator(); + for (int i = 0; i < count; i++) { + result[i] = iterator.next(); } - return Arrays.copyOf(newArr, mergedLength); + return result; } - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} - * - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray) { + public static boolean isPerfectNum(int num) { - BitSet check = new BitSet(oldArray.length); - boolean isZero; - for (int i = 0; i < oldArray.length; i++) { - isZero = (oldArray[i] == 0) ? true : false; - check.set(i, isZero); + int sum = 0; + for (int i = 1; i <= num / 2; i++) { + if (num % i == 0) + sum += i; } - int newSize = oldArray.length - check.cardinality(); - int[] newArr = new int[newSize]; - - int nextIndex = check.nextClearBit(0); - for (int i = 0; i < newSize; i++) { - newArr[i] = oldArray[nextIndex]; - nextIndex = check.nextClearBit(nextIndex + 1); - } + return (num == sum) ? true : false; - return newArr; } /** - * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = - * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" * - * @param origin + * @param array + * @param s * @return */ - public void reverseArray(int[] origin) { - - int temp; - int index = origin.length - 1; - int numbersToReverse = origin.length / 2; - for (int i = 0; i < numbersToReverse; i++) { - temp = origin[i]; - origin[i] = origin[index - i]; - origin[index - i] = temp; + public String join(int[] array, String seperator) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if (i < array.length - 1) + sb.append(seperator); } + return sb.toString(); } } \ No newline at end of file diff --git a/group12/382266293/src/array/ArrayUtilTest.java b/group12/382266293/src/array/ArrayUtilTest.java index d86ecde1fc..031ef6c09b 100644 --- a/group12/382266293/src/array/ArrayUtilTest.java +++ b/group12/382266293/src/array/ArrayUtilTest.java @@ -1,14 +1,10 @@ package array; -import static junit.framework.TestCase.assertEquals; -import static org.junit.Assert.assertArrayEquals; -import static util.TestUtil.getRandomIntArray; -import static util.TestUtil.getRandomNumber; - +import static org.junit.Assert.*; +import static util.TestUtil.*; import java.util.Arrays; import java.util.Iterator; import java.util.TreeSet; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -29,61 +25,43 @@ public void tearDown() throws Exception { } @Test - public void testFibonacci() { - int[] expected = new int[] { 1, 1, 2, 3, 5, 8, 13 }; - int[] acutal = new int[expected.length]; - actual = au.fibonacci(15); - assertArrayEquals(expected, actual); - } + public void testReverseArray() { - @Test - public void testGetPerfectNumbers() { + int size = getRandomNumber(); + int[] expected = getRandomIntArray(size); + actual = Arrays.copyOf(expected, size); - int[] expected = new int[] { 6, 28, 496, 8128 }; - int[] acutal = new int[expected.length]; - actual = au.getPerfectNumbers(10000); - assertArrayEquals(expected, actual); - } + au.reverseArray(actual); - @Test - public void testGetPrimes() { + for (int i = 0; i < size; i++) { + assertEquals(expected[i], actual[size - 1 - i]); + } - int[] expected = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }; - int[] acutal = new int[expected.length]; - actual = au.getPrimes(23); - assertArrayEquals(expected, actual); } @Test - public void testGrow() { - int[] expected = getRandomIntArray(getRandomNumber()); - int growSize = getRandomNumber(); - int[] actual = au.grow(expected, growSize); + public void testRemoveZero() { - assertEquals(expected.length + growSize, actual.length); + int size = getRandomNumber(10000); + int[] expected = getRandomIntArray(size); - for (int i = 0; i < actual.length; i++) { - if (i < expected.length) { - assertEquals(expected[i], actual[i]); - } else { - assertEquals(0, actual[i]); - } + int zeros = getRandomNumber(size - 1); + TreeSet t = new TreeSet(); + while (t.size() != zeros) { + t.add(getRandomNumber(size)); } - } - - @Test - public void testJoin() { - - int[] expected = getRandomIntArray(getRandomNumber()); - String seperator = "-"; - String joinedString = au.join(expected, seperator); + for (Integer i : t) { + expected[i] = 0; + } - String[] actual = joinedString.split(seperator); + int expectedSize = size - zeros; + actual = au.removeZero(expected); + assertEquals(expectedSize, actual.length); - assertEquals(expected.length, actual.length); - for (int i = 0; i < expected.length; i++) { - assertEquals(expected[i], Integer.parseInt(actual[i])); + for (int i = 0, j = 0; i < size; i++) { + if (expected[i] != 0) + assertEquals(expected[i], actual[j++]); } } @@ -114,43 +92,61 @@ public void testMerge() { } @Test - public void testRemoveZero() { + public void testGrow() { + int[] expected = getRandomIntArray(getRandomNumber()); + int growSize = getRandomNumber(); + int[] actual = au.grow(expected, growSize); - int size = getRandomNumber(10000); - int[] expected = getRandomIntArray(size); + assertEquals(expected.length + growSize, actual.length); - int zeros = getRandomNumber(size - 1); - TreeSet t = new TreeSet(); - while (t.size() != zeros) { - t.add(getRandomNumber(size)); + for (int i = 0; i < actual.length; i++) { + if (i < expected.length) { + assertEquals(expected[i], actual[i]); + } else { + assertEquals(0, actual[i]); + } } - for (Integer i : t) { - expected[i] = 0; - } + } - int expectedSize = size - zeros; - actual = au.removeZero(expected); - assertEquals(expectedSize, actual.length); + @Test + public void testFibonacci() { + int[] expected = new int[] { 1, 1, 2, 3, 5, 8, 13 }; + int[] acutal = new int[expected.length]; + actual = au.fibonacci(15); + assertArrayEquals(expected, actual); + } - for (int i = 0, j = 0; i < size; i++) { - if (expected[i] != 0) - assertEquals(expected[i], actual[j++]); - } + @Test + public void testGetPrimes() { + int[] expected = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }; + int[] acutal = new int[expected.length]; + actual = au.getPrimes(23); + assertArrayEquals(expected, actual); } @Test - public void testReverseArray() { + public void testGetPerfectNumbers() { - int size = getRandomNumber(); - int[] expected = getRandomIntArray(size); - actual = Arrays.copyOf(expected, size); + int[] expected = new int[] { 6, 28, 496, 8128 }; + int[] acutal = new int[expected.length]; + actual = au.getPerfectNumbers(10000); + assertArrayEquals(expected, actual); + } - au.reverseArray(actual); + @Test + public void testJoin() { - for (int i = 0; i < size; i++) { - assertEquals(expected[i], actual[size - 1 - i]); + int[] expected = getRandomIntArray(getRandomNumber()); + String seperator = "-"; + String joinedString = au.join(expected, seperator); + + String[] actual = joinedString.split(seperator); + + assertEquals(expected.length, actual.length); + for (int i = 0; i < expected.length; i++) { + assertEquals(expected[i], Integer.parseInt(actual[i])); } } diff --git a/group12/382266293/src/com/coderising/download/DownloadThread.java b/group12/382266293/src/com/coderising/download/DownloadThread.java index 11df6109e3..38f92f6677 100644 --- a/group12/382266293/src/com/coderising/download/DownloadThread.java +++ b/group12/382266293/src/com/coderising/download/DownloadThread.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.IOException; + import java.io.RandomAccessFile; import com.coderising.download.api.Connection; @@ -21,15 +22,6 @@ public DownloadThread(Connection conn, int startPos, int endPos) { this.endPos = endPos; } - public void close() { - this.conn.close(); - - } - - public void notifyFinished() { - fileDownloader.setThreadFinished(); - } - @Override public void run() { System.out.println(this.getName() + " is running"); @@ -57,12 +49,21 @@ public void run() { } } + public void setFileDownloader(FileDownloader fileDownloader) { + this.fileDownloader = fileDownloader; + } + + public void notifyFinished() { + fileDownloader.setThreadFinished(); + } + public void setDest(String dest) { this.dest = dest; } - public void setFileDownloader(FileDownloader fileDownloader) { - this.fileDownloader = fileDownloader; + public void close() { + this.conn.close(); + } } diff --git a/group12/382266293/src/com/coderising/download/DownloadUtil.java b/group12/382266293/src/com/coderising/download/DownloadUtil.java index 8e54afc2f9..c169214476 100644 --- a/group12/382266293/src/com/coderising/download/DownloadUtil.java +++ b/group12/382266293/src/com/coderising/download/DownloadUtil.java @@ -9,15 +9,8 @@ public class DownloadUtil { private static final int MIN_CONNECTIONS = 3; private static final int MAX_CONNECTIONS = 10; - public static int calculateConnects(int length) { - int conns = length / 1024 / 1024 / 10; - if (conns < MIN_CONNECTIONS) { - return MIN_CONNECTIONS; - } else if (conns > MAX_CONNECTIONS) { - return MAX_CONNECTIONS; - } else { - return conns; - } + public static long getCurrentTime() { + return System.currentTimeMillis(); } public static void createTempFile(String tempName, int len) { @@ -51,14 +44,15 @@ public static void createTempFile(String tempName, int len) { } } - public static long getCurrentTime() { - return System.currentTimeMillis(); - } - - public static void printDownloadReport(int length, long start, long end) { - int time = (int) ((end - start) / 1000); - float speed = (float) length / 1024 / 1024 / time; - System.out.println("共耗时:" + time + "s,下载速度: " + (float) (Math.round(speed * 100)) / 100 + "Mb/s"); + public static int calculateConnects(int length) { + int conns = length / 1024 / 1024 / 10; + if (conns < MIN_CONNECTIONS) { + return MIN_CONNECTIONS; + } else if (conns > MAX_CONNECTIONS) { + return MAX_CONNECTIONS; + } else { + return conns; + } } public static boolean rename(String from, String to) { @@ -70,4 +64,10 @@ public static boolean rename(String from, String to) { return false; } + public static void printDownloadReport(int length, long start, long end) { + int time = (int) ((end - start) / 1000); + float speed = (float) length / 1024 / 1024 / time; + System.out.println("共耗时:" + time + "s,下载速度: " + (float) (Math.round(speed * 100)) / 100 + "Mb/s"); + } + } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java index 311ebede84..671ff7243c 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloader.java +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -9,45 +9,20 @@ public class FileDownloader { private final static String EXT = "lyj"; private static DownloadThread[] threadPool; - private static String fileName; - private static String tempName; - private int finishedCount; public String downloadLocation; + String url; ConnectionManager cm; DownloadListener listener; + private static String fileName; + private static String tempName; public FileDownloader(String _url) { this.url = _url; this.finishedCount = 0; } - private boolean checkFinish(int links) { - - while (finishedCount != links) { - try { - Thread.sleep(5000); - System.out.println("Unfinshed threads number: " + (links - finishedCount)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - return true; - } - - private void checkLength(int length, Connection conn) { - if (length <= 0) { - try { - throw new ConnectionException("file does not exist"); - } catch (ConnectionException e) { - e.printStackTrace(); - } finally { - conn.close(); - } - } - } - public void execute() { // 在这里实现你的代码, 注意: 需要用多线程实现下载 // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 @@ -100,6 +75,44 @@ public void execute() { } } + private void checkLength(int length, Connection conn) { + if (length <= 0) { + try { + throw new ConnectionException("file does not exist"); + } catch (ConnectionException e) { + e.printStackTrace(); + } finally { + conn.close(); + } + } + } + + private void setTempName(String name) { + String temp = name.substring(0, name.lastIndexOf(".") + 1) + EXT; + FileDownloader.tempName = downloadLocation + temp; + } + + private void setFileName(String name) { + FileDownloader.fileName = downloadLocation + name; + } + + private void setLocation(String downloadLocation) { + this.downloadLocation = downloadLocation; + } + + private boolean checkFinish(int links) { + + while (finishedCount != links) { + try { + Thread.sleep(5000); + System.out.println("Unfinshed threads number: " + (links - finishedCount)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + return true; + } + private void freeDownloadThread() { if (threadPool != null) { for (int i = 0; i < threadPool.length; i++) { @@ -121,12 +134,6 @@ public DownloadListener getListener() { return this.listener; } - private void setAndStartThread(DownloadThread downloadThread, String dest) { - downloadThread.setDest(dest); - downloadThread.setFileDownloader(this); - downloadThread.start(); - } - private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, int length) throws ConnectionException { int connectionNumbers = threadPool.length; @@ -149,29 +156,22 @@ private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, } } + private void setAndStartThread(DownloadThread downloadThread, String dest) { + downloadThread.setDest(dest); + downloadThread.setFileDownloader(this); + downloadThread.start(); + } + public void setConnectionManager(ConnectionManager ucm) { this.cm = ucm; } - private void setFileName(String name) { - FileDownloader.fileName = downloadLocation + name; + public void setThreadFinished() { + finishedCount++; } public void setListener(DownloadListener listener) { this.listener = listener; } - private void setLocation(String downloadLocation) { - this.downloadLocation = downloadLocation; - } - - private void setTempName(String name) { - String temp = name.substring(0, name.lastIndexOf(".") + 1) + EXT; - FileDownloader.tempName = downloadLocation + temp; - } - - public void setThreadFinished() { - finishedCount++; - } - } diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index b9c458d2a6..88a5dba40e 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -9,20 +9,20 @@ import com.coderising.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { - public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; - - public static String picture = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; - - public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; - boolean downloadFinished = false; + @Before public void setUp() throws Exception { } + @After public void tearDown() throws Exception { } + public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; + public static String picture = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; + public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; + @Test public void testDownload() { diff --git a/group12/382266293/src/com/coderising/download/api/Connection.java b/group12/382266293/src/com/coderising/download/api/Connection.java index 53293962a0..11a0eab3d8 100644 --- a/group12/382266293/src/com/coderising/download/api/Connection.java +++ b/group12/382266293/src/com/coderising/download/api/Connection.java @@ -4,10 +4,15 @@ public interface Connection { /** - * 关闭连接 + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * + * @param startPos + * 开始位置, 从0开始 + * @param endPos + * 结束位置 + * @return */ - - public void close(); + public byte[] read(int startPos, int endPos) throws IOException; /** * 得到数据内容的长度 @@ -16,20 +21,15 @@ public interface Connection { */ public int getContentLength(); - public String getFileName(); - - public boolean isFinished(); - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * - * @param startPos - * 开始位置, 从0开始 - * @param endPos - * 结束位置 - * @return + * 关闭连接 */ - public byte[] read(int startPos, int endPos) throws IOException; + + public void close(); + + public String getFileName(); public void setFinished(); + + public boolean isFinished(); } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java index 7c772bc665..a4fa5c15ad 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java @@ -12,8 +12,8 @@ public class ConnectionImpl implements Connection { - private static int buffer_size = 1024; private ConnectionManager cm; + private static int buffer_size = 1024; private HttpURLConnection httpConn; private URL url; private boolean finished = false; @@ -28,31 +28,6 @@ public ConnectionImpl(ConnectionManager cm, String _url) { } } - @Override - public void close() { - httpConn.disconnect(); - } - - @Override - public int getContentLength() { - int len = httpConn.getContentLength(); - - return len; - - } - - @Override - public String getFileName() { - String fileName = httpConn.getURL().getFile(); - fileName = fileName.substring(fileName.lastIndexOf('/') + 1); - return fileName; - } - - @Override - public boolean isFinished() { - return finished; - } - @Override public byte[] read(int startPos, int endPos) throws IOException { InputStream in = null; @@ -85,9 +60,34 @@ public byte[] read(int startPos, int endPos) throws IOException { return null; } + @Override + public int getContentLength() { + int len = httpConn.getContentLength(); + + return len; + + } + + @Override + public void close() { + httpConn.disconnect(); + } + + @Override + public String getFileName() { + String fileName = httpConn.getURL().getFile(); + fileName = fileName.substring(fileName.lastIndexOf('/') + 1); + return fileName; + } + @Override public void setFinished() { finished = true; } + @Override + public boolean isFinished() { + return finished; + } + } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java index c4634733d5..122073e37b 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -16,15 +16,6 @@ public ConnectionManagerImpl() { this.connections = 0; } - private void checkConnectionSize() { - if (connections > MAX_CONNECTION_SIZE) - try { - throw new NoFreeSourceException("No free connections available."); - } catch (NoFreeSourceException e) { - e.printStackTrace(); - } - } - @Override public Connection open(String url) throws ConnectionException { this.url = url; @@ -42,4 +33,13 @@ public Connection open(String url) throws ConnectionException { return null; } + private void checkConnectionSize() { + if (connections > MAX_CONNECTION_SIZE) + try { + throw new NoFreeSourceException("No free connections available."); + } catch (NoFreeSourceException e) { + e.printStackTrace(); + } + } + } diff --git a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java index 34521a5cd7..834a68d702 100644 --- a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java +++ b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java @@ -6,6 +6,10 @@ public class DownloadUtil { + public static long getCurrentTime() { + return System.currentTimeMillis(); + } + public static void createTempFile(String tempName, int len) { File file = new File(tempName); if (file.exists()) { @@ -37,8 +41,4 @@ public static void createTempFile(String tempName, int len) { } } - public static long getCurrentTime() { - return System.currentTimeMillis(); - } - } diff --git a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java index 99c0183e02..68a628ec61 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,18 +1,52 @@ package com.coderising.jvm.attr; -import java.util.Arrays; +import java.io.UnsupportedEncodingException; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); + System.out.println("attrIndex " + attrNameIndex); + int attrLen = iter.nextU4ToInt(); int maxStack = iter.nextU2ToInt(); @@ -23,13 +57,11 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ System.out.println("codeLen " + codeLen); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, "Code"); + String code = iter.nextUxToHexString(codeLen); - ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); - - System.out.println("Code is " + code); - System.out.println(Arrays.toString(cmds)); + System.out.println("Code is " + code); int exceptionTableLen = iter.nextU2ToInt(); @@ -72,35 +104,6 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ return codeAttr; } - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - public String getCode() { - return code; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } private void setStackMapTable(StackMapTable t) { @@ -108,22 +111,8 @@ private void setStackMapTable(StackMapTable t) { } - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - for(int i=0;i items = new ArrayList(); + private static class LineNumberItem{ int startPC; int lineNum; - public int getLineNum() { - return lineNum; - } public int getStartPC() { return startPC; } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } public void setStartPC(int startPC) { this.startPC = startPC; } - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - int attrNameIndex = iter.nextU2ToInt(); - - int attrLen = iter.nextU4ToInt(); - - int line_number_table_length = iter.nextU2ToInt(); - - LineNumberTable lnt = new LineNumberTable(attrNameIndex, attrLen); - - - for (int i = 0; i < line_number_table_length; i++) { - - LineNumberItem lni = new LineNumberItem(); - - int start_pc = iter.nextU2ToInt(); - lni.setStartPC(start_pc); - - int line_number = iter.nextU2ToInt(); - lni.setLineNum(line_number); - - lnt.addLineNumberItem(lni); + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; } - - - - return lnt; } - List items = new ArrayList(); + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } public LineNumberTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; } diff --git a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java index 80f3af5cd5..3eb2654e36 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java +++ b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -6,34 +6,34 @@ public class LocalVariableItem { private int nameIndex; private int descIndex; private int index; - public int getDescIndex() { - return descIndex; + public int getStartPC() { + return startPC; } - public int getIndex() { - return index; + public void setStartPC(int startPC) { + this.startPC = startPC; } public int getLength() { return length; } + public void setLength(int length) { + this.length = length; + } public int getNameIndex() { return nameIndex; } - public int getStartPC() { - return startPC; + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; } public void setDescIndex(int descIndex) { this.descIndex = descIndex; } + public int getIndex() { + return index; + } public void setIndex(int index) { this.index = index; } - public void setLength(int length) { - this.length = length; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } } diff --git a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java index 8a63e31269..fa69dc9bdb 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java +++ b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -5,67 +5,24 @@ import java.util.List; import com.coderising.jvm.constant.ConstantPool; + import com.coderising.jvm.loader.ByteCodeIterator; public class LocalVariableTable extends AttributeInfo{ - public static LocalVariableTable parse(ByteCodeIterator iter){ - int attrNameIndex = iter.nextU2ToInt(); - - int attrLen = iter.nextU4ToInt(); - - int local_variable_table_length = iter.nextU2ToInt(); - - LocalVariableTable lvt = new LocalVariableTable(attrNameIndex, attrLen); - - - for (int i = 0; i < local_variable_table_length; i++) { - - LocalVariableItem lvi = new LocalVariableItem(); - - int start_pc = iter.nextU2ToInt(); - lvi.setStartPC(start_pc); - - int length = iter.nextU2ToInt(); - lvi.setLength(length); - - int name_index = iter.nextU2ToInt(); - lvi.setNameIndex(name_index); - - int desc_index = iter.nextU2ToInt(); - lvi.setDescIndex(desc_index); - - int index = iter.nextU2ToInt(); - lvi.setIndex(index); - - lvt.addLocalVariableItem(lvi); - } - - return lvt; - } - List items = new ArrayList(); - + public LocalVariableTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } private void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } - } diff --git a/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java b/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java index 0dd885a940..44c5d90d46 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java +++ b/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java @@ -5,6 +5,12 @@ public class StackMapTable extends AttributeInfo{ + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + public static StackMapTable parse(ByteCodeIterator iter){ int index = iter.nextU2ToInt(); int len = iter.nextU4ToInt(); @@ -17,12 +23,6 @@ public static StackMapTable parse(ByteCodeIterator iter){ return t; } - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - private void setOriginalCode(String code) { this.originalCode = code; diff --git a/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java b/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java index 20e86330df..17dd61f8b6 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java +++ b/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java @@ -3,11 +3,6 @@ import com.coderising.jvm.loader.ByteCodeIterator; public class AccessFlag { - public static AccessFlag parseAccessFlag(ByteCodeIterator iter) { - AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); - return accessFlag; - } - private int flagValue; public AccessFlag(int value) { @@ -18,15 +13,20 @@ public int getFlagValue() { return flagValue; } - public boolean isFinalClass() { - return (this.flagValue & 0x0010) != 0; + public void setFlagValue(int flag) { + this.flagValue = flag; } public boolean isPublicClass() { return (this.flagValue & 0x0001) != 0; } - public void setFlagValue(int flag) { - this.flagValue = flag; + public boolean isFinalClass() { + return (this.flagValue & 0x0010) != 0; + } + + public static AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); + return accessFlag; } } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java index 111cb247d3..6e37d03643 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java +++ b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java @@ -5,7 +5,6 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; @@ -20,57 +19,45 @@ public class ClassFile { private List fields = new ArrayList(); private List methods = new ArrayList(); - public void addField(Field field) { - - this.fields.add(field); - - } - - public void addMethod(Method method) { - - this.methods.add(method); - + public ClassIndex getClzIndex() { + return clzIndex; } public AccessFlag getAccessFlag() { return accessFlag; } - public String getClassName() { - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - - public ClassIndex getClzIndex() { - return clzIndex; + public void setAccessFlag(AccessFlag accessFlag) { + this.accessFlag = accessFlag; } public ConstantPool getConstantPool() { return pool; } - public List getFields() { + public int getMinorVersion() { + return minorVersion; + } - return fields; + public void setMinorVersion(int minorVersion) { + this.minorVersion = minorVersion; } public int getMajorVersion() { return majorVersion; } - public List getMethods() { - - return methods; + public void setMajorVersion(int majorVersion) { + this.majorVersion = majorVersion; } - public int getMinorVersion() { - return minorVersion; + public void setConstPool(ConstantPool pool) { + this.pool = pool; + } - public String getSuperClassName() { - ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); + public void setClassIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; } public void print() { @@ -84,17 +71,20 @@ public void print() { } - public void setAccessFlag(AccessFlag accessFlag) { - this.accessFlag = accessFlag; + private String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); } - public void setClassIndex(ClassIndex clzIndex) { - this.clzIndex = clzIndex; + private String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); } - - public void setConstPool(ConstantPool pool) { - this.pool = pool; + public List getFields() { + + return fields; } public void setFields(List fields) { @@ -102,51 +92,27 @@ public void setFields(List fields) { this.fields = fields; } - - public void setMajorVersion(int majorVersion) { - this.majorVersion = majorVersion; - } - public void setMethods(List methods) { + public void addField(Field field) { - this.methods = methods; + this.fields.add(field); } - - public void setMinorVersion(int minorVersion) { - this.minorVersion = minorVersion; + + public List getMethods() { + + return methods; } - - public Method getMethod(String methodName, String paramAndReturnType){ - + public void setMethods(List methods) { - for (Method m : methods) { - - int nameIndex = m.getNameIndex(); - int descriptorIndex= m.getDescriptorIndex(); - String name = ((UTF8Info)pool.getConstantInfo(nameIndex)).getValue(); - String desc = ((UTF8Info)pool.getConstantInfo(descriptorIndex)).getValue(); - if (name.equals(methodName) && desc.equals(paramAndReturnType)) { - return m; - } - } + this.methods = methods; - return null; } - public Method getMainMethod(){ + + public void addMethod(Method method) { - for (Method m : methods) { - - int nameIndex = m.getNameIndex(); - int descriptorIndex= m.getDescriptorIndex(); - String name = ((UTF8Info)pool.getConstantInfo(nameIndex)).getValue(); - String desc = ((UTF8Info)pool.getConstantInfo(descriptorIndex)).getValue(); - if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { - return m; - } - } + this.methods.add(method); - return null; } } diff --git a/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java b/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java index 213fb9163f..0212bc9fb3 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java +++ b/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java @@ -4,19 +4,19 @@ public class ClassIndex { private int thisClassIndex; private int superClassIndex; - public int getSuperClassIndex() { - return superClassIndex; - } - public int getThisClassIndex() { return thisClassIndex; } - public void setSuperClassIndex(int superClassIndex) { - this.superClassIndex = superClassIndex; - } - 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/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java deleted file mode 100644 index cd0fbd4848..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index a3abeacc82..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java b/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java deleted file mode 100644 index 9a4be8a37a..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,179 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { - throw new RuntimeException("the orignal code is not correct"); - - } - - List cmds = new ArrayList(); - codes = codes.toUpperCase(); - CommandIterator iter = new CommandIterator(codes); - - while (iter.hasNext()) { - String opCode = iter.next2CharAsString(); - - if (new_object.equals(opCode)) { - - NewObjectCmd cmd = new NewObjectCmd(clzFile,opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { - - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile,opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { - - InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile,opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (getfield.equals(opCode)) { - - GetFieldCmd cmd = new GetFieldCmd(clzFile,opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (putfield.equals(opCode)) { - - PutFieldCmd cmd = new PutFieldCmd(clzFile,opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (getstatic.equals(opCode)) { - - GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile,opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (ldc.equals(opCode)) { - - LdcCmd cmd = new LdcCmd(clzFile,opCode); - - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (bipush.equals(opCode)) { - - BiPushCmd cmd = new BiPushCmd(clzFile,opCode); - - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { - - NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); - - cmds.add(cmd); - } else { - throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); - } - - calculateOffset(cmds); - - - } - - - ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; - cmds.toArray(result); - - - return result; - } - - private static void calculateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 2e6061edd2..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e6cf9d5960..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index ac228d0e4d..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index c15d827797..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java deleted file mode 100644 index ffb66f811c..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 33813b5d59..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 56c28fefe2..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 963d064257..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 85bb369c19..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 6c0cf53082..0000000000 --- a/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java b/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java index b6ddbad601..4b593e7347 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java @@ -1,7 +1,5 @@ package com.coderising.jvm.constant; -import com.coderising.jvm.print.PrintVisitor; - public class ClassInfo extends ConstantInfo { private int type = ConstantInfo.CLASS_INFO; private int utf8Index; @@ -10,17 +8,6 @@ public ClassInfo(ConstantPool pool) { super(pool); } - public String getClassName() { - int index = getUtf8Index(); - UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); - return utf8Info.getValue(); - } - - @Override - public int getType() { - return type; - } - public int getUtf8Index() { return utf8Index; } @@ -29,9 +16,13 @@ public void setUtf8Index(int utf8Index) { this.utf8Index = utf8Index; } - @Override - public void accept(PrintVisitor visitor) { - visitor.visit(this); + public int getType() { + return type; } + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java b/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java index a2d0153f93..96845046b3 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java @@ -1,7 +1,5 @@ package com.coderising.jvm.constant; -import com.coderising.jvm.print.PrintVisitor; - public abstract class ConstantInfo { public static final int UTF8_INFO = 1; public static final int FLOAT_INFO = 4; @@ -21,16 +19,14 @@ public ConstantInfo(ConstantPool pool) { pool.addConstantInfo(this); } - public ConstantInfo getConstantInfo(int index) { - return this.constantPool.getConstantInfo(index); - } + public abstract int getType(); public ConstantPool getConstantPool() { return constantPool; } - public abstract int getType(); - - public abstract void accept(PrintVisitor visitor); + public ConstantInfo getConstantInfo(int index) { + return this.constantPool.getConstantInfo(index); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java b/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java index 40f95c7d77..95c44dde8f 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java @@ -21,17 +21,12 @@ public ConstantInfo getConstantInfo(int index) { //System.out.println(this.constantInfos.get(index)); return this.constantInfos.get(index); } - - public List getConstantInfos() { - return constantInfos; + public String getUTF8String(int index) { + return ((UTF8Info) this.constantInfos.get(index)).getValue(); } - public int getSize() { + public Object getSize() { return this.constantInfos.size() - 1; } - - public String getUTF8String(int index) { - return ((UTF8Info) this.constantInfos.get(index)).getValue(); - } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java index 7e353c3009..e9f34e550c 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -1,7 +1,5 @@ package com.coderising.jvm.constant; -import com.coderising.jvm.print.PrintVisitor; - public class FieldRefInfo extends ConstantInfo { private int type = ConstantInfo.FIELD_INFO; private int classInfoIndex; @@ -11,10 +9,33 @@ 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()); @@ -34,34 +55,4 @@ public String getFieldType() { NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - - public int getNameAndTypeIndex() { - return nameAndTypeIndex; - } - - @Override - public int getType() { - return type; - } - - public void setClassInfoIndex(int classInfoIndex) { - this.classInfoIndex = classInfoIndex; - } - - public void setNameAndTypeIndex(int nameAndTypeIndex) { - this.nameAndTypeIndex = nameAndTypeIndex; - } - - @Override - public String toString() { - - NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); - - return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]"; - } - - @Override - public void accept(PrintVisitor visitor) { - visitor.visit(this); - } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java index 05882cd5f2..d58de16f72 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -1,7 +1,5 @@ package com.coderising.jvm.constant; -import com.coderising.jvm.print.PrintVisitor; - public class MethodRefInfo extends ConstantInfo { private int type = ConstantInfo.METHOD_INFO; @@ -13,10 +11,31 @@ 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()); @@ -29,38 +48,10 @@ public String getMethodName() { return typeInfo.getName(); } - public int getNameAndTypeIndex() { - return nameAndTypeIndex; - } - public String getParamAndReturnType() { ConstantPool pool = this.getConstantPool(); NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - @Override - public int getType() { - return type; - } - - public void setClassInfoIndex(int classInfoIndex) { - this.classInfoIndex = classInfoIndex; - } - - public void setNameAndTypeIndex(int nameAndTypeIndex) { - this.nameAndTypeIndex = nameAndTypeIndex; - } - - @Override - public String toString() { - - return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType(); - } - - @Override - public void accept(PrintVisitor visitor) { - visitor.visit(this); - } - } diff --git a/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java index 78dbe514b3..a792e2dc13 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -1,7 +1,5 @@ package com.coderising.jvm.constant; -import com.coderising.jvm.print.PrintVisitor; - public class NameAndTypeInfo extends ConstantInfo { public int type = ConstantInfo.NAME_AND_TYPE_INFO; @@ -16,42 +14,35 @@ public int getIndex1() { return index1; } + public void setIndex1(int index1) { + this.index1 = index1; + } + public int getIndex2() { return index2; } - public String getName() { - ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(index1); - return utf8Info1.getValue(); + public void setIndex2(int index2) { + this.index2 = index2; } - @Override 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 void setIndex1(int index1) { - this.index1 = index1; - } - - public void setIndex2(int index2) { - this.index2 = index2; - } - - @Override public String toString() { return "(" + getName() + "," + getTypeInfo() + ")"; } - - @Override - public void accept(PrintVisitor visitor) { - visitor.visit(this); - } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java b/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java index a787901905..7d1abf7699 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -1,7 +1,5 @@ package com.coderising.jvm.constant; -import com.coderising.jvm.print.PrintVisitor; - public class NullConstantInfo extends ConstantInfo { public NullConstantInfo() { @@ -13,13 +11,4 @@ public int getType() { return -1; } - @Override - public void accept(PrintVisitor visitor) { - visitor.visit(this); - - } - - - - } diff --git a/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java b/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java index f713523450..0ea1f6bdac 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java @@ -1,7 +1,5 @@ package com.coderising.jvm.constant; -import com.coderising.jvm.print.PrintVisitor; - public class StringInfo extends ConstantInfo { private int type = ConstantInfo.STRING_INFO; private int index; @@ -10,28 +8,20 @@ public StringInfo(ConstantPool pool) { super(pool); } - public int getIndex() { - return index; - } - - @Override public int getType() { return type; } + public int getIndex() { + return index; + } + public void setIndex(int index) { this.index = index; } - @Override public String toString() { return this.getConstantPool().getUTF8String(index); } - - @Override - public void accept(PrintVisitor visitor) { - visitor.visit(this); - - } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java b/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java index f0e548debf..a7e88969a4 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java @@ -1,7 +1,5 @@ package com.coderising.jvm.constant; -import com.coderising.jvm.print.PrintVisitor; - public class UTF8Info extends ConstantInfo { private int type = ConstantInfo.UTF8_INFO; private int length; @@ -15,21 +13,12 @@ public int getLength() { return length; } - @Override - public int getType() { - return type; - } - - public String getValue() { - return value; - } - public void setLength(int length) { this.length = length; } - public void setValue(String value) { - this.value = value; + public int getType() { + return type; } @Override @@ -37,11 +26,12 @@ public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]"; } - @Override - public void accept(PrintVisitor visitor) { - visitor.visit(this); - + public String getValue() { + return value; } + public void setValue(String value) { + this.value = value; + } } diff --git a/group12/382266293/src/com/coderising/jvm/field/Field.java b/group12/382266293/src/com/coderising/jvm/field/Field.java index 1349de930d..2b0c549685 100644 --- a/group12/382266293/src/com/coderising/jvm/field/Field.java +++ b/group12/382266293/src/com/coderising/jvm/field/Field.java @@ -1,34 +1,17 @@ package com.coderising.jvm.field; +import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; public class Field { - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int access_flags = iter.nextU2ToInt(); - int name_index = iter.nextU2ToInt(); - int descriptor_index = iter.nextU2ToInt(); - int attrbutes_count = iter.nextU2ToInt(); - - if (attrbutes_count != 0) { - throw new RuntimeException("field attrbutes_count is " + attrbutes_count); - } - - Field field = new Field(access_flags,name_index,descriptor_index,pool); - - return field; - } private int accessFlag; private int nameIndex; - private int descriptorIndex; - - private ConstantPool pool; - - + private ConstantPool pool; public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { @@ -38,9 +21,28 @@ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool po this.pool = pool; } + + + @Override public String toString() { return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex) ; } + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int access_flags = iter.nextU2ToInt(); + int name_index = iter.nextU2ToInt(); + int descriptor_index = iter.nextU2ToInt(); + int attrbutes_count = iter.nextU2ToInt(); + + if (attrbutes_count != 0) { + throw new RuntimeException("field attrbutes_count is " + attrbutes_count); + } + + Field field = new Field(access_flags,name_index,descriptor_index,pool); + + return field; + } + } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java index 5fa9ba7661..4b554a434a 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -11,59 +11,59 @@ public ByteCodeIterator(byte[] codes) { this.codes = codes; } - public void back(int i) { - currPos = currPos - 2; - } - - public String byteToHexString(byte[] codes) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); + public String nextU4ToHexString() { + byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; + return Util.byteToHexString(u4); } - public byte[] nextNbytesToHexString(int length) { - byte[] bytes = new byte[length]; - int len = currPos + length; - for(int j = 0; currPos < len; j++) { - bytes[j] = codes[currPos++]; - } - - return bytes; - } - public int nextU1ToInt() { byte[] u1 = new byte[] { codes[currPos++] }; return Util.byteToInt(u1); } - - + public int nextU2ToInt() { byte[] u2 = new byte[] { codes[currPos++], codes[currPos++] }; return Util.byteToInt(u2); } - public String nextU4ToHexString() { - byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; - return Util.byteToHexString(u4); - } - public int nextU4ToInt() { byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; return Util.byteToInt(u4); } - + + + public byte[] nextNbytesToHexString(int length) { + byte[] bytes = new byte[length]; + int len = currPos + length; + for(int j = 0; currPos < len; j++) { + bytes[j] = codes[currPos++]; + } + + return bytes; + } + public String nextUxToHexString(int length) { byte[] codes = nextNbytesToHexString(length); return byteToHexString(codes); } + + public String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } + + public void back(int i) { + currPos = currPos - 2; + } } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java index 135cf41dee..71a8b6fefa 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -14,40 +14,10 @@ public class ClassFileLoader { private List clzPaths = new ArrayList(); - public void addClassPath(String path) { - clzPaths.add(path); - } - - private File getClassFile(String clzFileName) { - - for (String path : clzPaths) { - File file = new File(path + "//" + clzFileName); - if (file.exists()) { - return file; - } - } - return null; - - } - - public String getClassPath() { - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < clzPaths.size(); i++) { - - sb.append(clzPaths.get(i)); - if (i < clzPaths.size() - 1) { - sb.append(";"); - } - - } - - return sb.toString(); - } - - public String getClassPath_V1() { + public byte[] readBinaryCode(String className) { - return null; + String clzFileName = "//" + className.replaceAll("\\.", "//") + ".class"; + return loadClassFile(clzFileName); } public ClassFile loadClass(String className) throws UnsupportedEncodingException { @@ -95,10 +65,40 @@ private byte[] loadClassFile(String clzFileName) { } - public byte[] readBinaryCode(String className) { + private File getClassFile(String clzFileName) { - String clzFileName = "//" + className.replaceAll("\\.", "//") + ".class"; - return loadClassFile(clzFileName); + for (String path : clzPaths) { + File file = new File(path + "//" + clzFileName); + if (file.exists()) { + return file; + } + } + return null; + + } + + public void addClassPath(String path) { + clzPaths.add(path); + } + + public String getClassPath_V1() { + + return null; + } + + public String getClassPath() { + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < clzPaths.size(); i++) { + + sb.append(clzPaths.get(i)); + if (i < clzPaths.size() - 1) { + sb.append(";"); + } + + } + + return sb.toString(); } } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java index b9a2383303..e1c997d3d0 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java @@ -1,6 +1,10 @@ package com.coderising.jvm.loader; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; @@ -15,6 +19,7 @@ import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; +import com.coderising.jvm.util.Util; public class ClassFileParser { @@ -37,6 +42,7 @@ public ClassFile parse(byte[] codes) { System.out.println("majorVersion is " + majorVersion); clzFile.setMajorVersion(majorVersion); + ConstantPool pool = parseConstantPool(iter); clzFile.setConstPool(pool); @@ -56,6 +62,39 @@ public ClassFile parse(byte[] codes) { return clzFile; } + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + + int methodNum = iter.nextU2ToInt(); + + ConstantPool pool = clzFile.getConstantPool(); + for (int i = 0; i < methodNum; i++) { + Method method = Method.parse(clzFile,iter); + clzFile.addMethod(method); + } + + } + + private void parseFields(ClassFile clzFile, ByteCodeIterator iter) { + + int fieldNum = iter.nextU2ToInt(); + + ConstantPool pool = clzFile.getConstantPool(); + for (int i = 0; i < fieldNum; i++) { + Field field = Field.parse(pool,iter); + clzFile.addField(field); + } + + } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceNum = iter.nextU2ToInt(); + + if (0 != interfaceNum) { + throw new RuntimeException("interface parser not finsihed yet, pls check!"); + } + + } + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { return AccessFlag.parseAccessFlag(iter); @@ -97,7 +136,7 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { // utf8-info UTF8Info utf8Info = new UTF8Info(pool); int length = iter.nextU2ToInt(); - //System.out.println("length is " + length); + System.out.println("length is " + length); utf8Info.setLength(length); byte[] bytes = iter.nextNbytesToHexString(length); String value = ""; @@ -106,7 +145,7 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } catch (UnsupportedEncodingException e) { e.printStackTrace(); } - //System.out.println("value is " + value); + System.out.println("value is " + value); utf8Info.setValue(value); } else if (tag == 8) { @@ -149,35 +188,4 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { return pool; } - private void parseFields(ClassFile clzFile, ByteCodeIterator iter) { - - int fieldNum = iter.nextU2ToInt(); - - ConstantPool pool = clzFile.getConstantPool(); - for (int i = 0; i < fieldNum; i++) { - Field field = Field.parse(pool,iter); - clzFile.addField(field); - } - - } - - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceNum = iter.nextU2ToInt(); - - if (0 != interfaceNum) { - throw new RuntimeException("interface parser not finsihed yet, pls check!"); - } - - } - - private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { - - int methodNum = iter.nextU2ToInt(); - for (int i = 0; i < methodNum; i++) { - Method method = Method.parse(clzFile,iter); - clzFile.addMethod(method); - } - - } - } diff --git a/group12/382266293/src/com/coderising/jvm/method/Method.java b/group12/382266293/src/com/coderising/jvm/method/Method.java index 2bb53cdf06..3c3e026a40 100644 --- a/group12/382266293/src/com/coderising/jvm/method/Method.java +++ b/group12/382266293/src/com/coderising/jvm/method/Method.java @@ -1,27 +1,45 @@ package com.coderising.jvm.method; +import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ByteCodeIterator; +import com.sun.org.apache.bcel.internal.classfile.Code; public class Method { - - + private int accessFlag; private int nameIndex; - private int descriptorIndex; private CodeAttr codeAttr; - private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { this.clzFile = clzFile; @@ -29,13 +47,15 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; } - + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ int access_flags = iter.nextU2ToInt(); int name_index = iter.nextU2ToInt(); int descriptor_index = iter.nextU2ToInt(); int attrbutes_count = iter.nextU2ToInt(); + System.out.println("count1 = " + attrbutes_count); Method method = new Method(clzFile, access_flags,name_index,descriptor_index); @@ -45,12 +65,10 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ iter.back(2); if (AttributeInfo.CODE.equalsIgnoreCase("Code")) { - CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); method.setCodeAttr(codeAttr); - } else { - throw new RuntimeException(att_name + " has not been implemented"); + throw new RuntimeException(att_name + "has not been implemented"); } } @@ -60,51 +78,4 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } - - - - - - - - public ByteCodeCommand[] getCmds() { - return this.getCodeAttr().getCmds(); - } - - public ClassFile getClzFile() { - return clzFile; - } - - public CodeAttr getCodeAttr() { - return codeAttr; - } - - public int getDescriptorIndex() { - return descriptorIndex; - } - - public int getNameIndex() { - return nameIndex; - } - - - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } - - public String toString() { - - ConstantPool pool = this.clzFile.getConstantPool(); - StringBuilder buffer = new StringBuilder(); - - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - - buffer.append(name).append(":").append(desc).append("\n"); - - buffer.append(this.codeAttr.toString(pool)); - - return buffer.toString(); - } } diff --git a/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java b/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java deleted file mode 100644 index 1f958aac6a..0000000000 --- a/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coderising.jvm.print; - -import java.io.UnsupportedEncodingException; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.loader.ClassFileLoader; - -public class ClassFilePrinter { - ClassFile clzFile = null; - public ClassFilePrinter(ClassFile clzFile){ - this.clzFile = clzFile; - } - - public void print(){ - - if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag : public "); - } - System.out.println("Class Name:"+ clzFile.getClassName()); - - System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMajorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - cnstPoolPrinter.print(); - - - - - } - - public static void main(String[] args){ - String path = "C:\\Users\\steve\\workspace\\coding2017n\\group12\\382266293\\bin"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "com.coderising.jvm.test.EmployeeV1"; - - ClassFile clzFile = null; - try { - clzFile = loader.loadClass(className); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} diff --git a/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java deleted file mode 100644 index 012aeb7001..0000000000 --- a/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.coderising.jvm.print; - -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.NullConstantInfo; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.constant.UTF8Info; - -public class ConstantPoolPrinter implements PrintVisitor { - ConstantPool pool; - ConstantPoolPrinter(ConstantPool pool){ - this.pool = pool; - } - - public void print(){ - - System.out.println("Constant Pool:"); - int size = pool.getSize(); - - for (int i = 1; i <= size; i++) { - ConstantInfo info = pool.getConstantInfo(i); - System.out.print("#" + i + " = "); - info.accept(this); - } - - } - - @Override - public void visit(StringInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("String #").append(info.getIndex()); - System.out.println(buffer); - } - - @Override - public void visit(NameAndTypeInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("NameAndType #").append(info.getIndex1()).append(":#") - .append(info.getIndex2()); - System.out.println(buffer); - - } - - @Override - public void visit(MethodRefInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") - .append(info.getNameAndTypeIndex()); - System.out.println(buffer); - - } - - @Override - public void visit(FieldRefInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") - .append(info.getNameAndTypeIndex()); - System.out.println(buffer); - - } - - @Override - public void visit(ClassInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("Class #").append(info.getUtf8Index()) - .append(" ").append(info.getClassName()); - - System.out.println(buffer); - - } - - @Override - public void visit(UTF8Info info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("UTF8 ").append(info.getValue()); - System.out.println(buffer); - - } - - - @Override - public void visit(NullConstantInfo nullConstantInfo) { - - } - -} diff --git a/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java b/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java deleted file mode 100644 index 31aa70b955..0000000000 --- a/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.print; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.NullConstantInfo; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.constant.UTF8Info; - -public interface PrintVisitor { - - void visit(ClassInfo pool); - void visit(FieldRefInfo info); - void visit(MethodRefInfo info); - void visit(NameAndTypeInfo info); - void visit(StringInfo info); - void visit(UTF8Info info); - void visit(NullConstantInfo nullConstantInfo); - -} diff --git a/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java index 883ad99c05..d4f255a763 100644 --- a/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,6 +1,7 @@ package com.coderising.jvm.test; import java.io.UnsupportedEncodingException; +import java.util.Arrays; import java.util.List; import org.junit.After; @@ -10,15 +11,7 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.cmd.BiPushCmd; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.OneOperandCmd; -import com.coderising.jvm.cmd.TwoOperandCmd; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.constant.*; import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; import com.coderising.jvm.method.Method; @@ -27,8 +20,9 @@ public class ClassFileloaderTest { static String path1 = "C:\\Users\\steve\\workspace\\coding2017n\\group12\\382266293\\bin"; static String path2 = "C:\temp"; - static ClassFile clzFile = null; + String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); @@ -42,30 +36,6 @@ public class ClassFileloaderTest { } clzFile.print(); } - String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - private String byteToHexString(byte[] codes) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } @Before public void setUp() throws Exception { @@ -75,6 +45,19 @@ public void setUp() throws Exception { public void tearDown() throws Exception { } + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + @Test public void testClassFileLength() { @@ -91,26 +74,37 @@ public void testClassFileLength() { } @Test - public void testClassIndex() { + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; - ClassIndex clzIndex = clzFile.getClzIndex(); - ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex()); - ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex()); + String acctualValue = this.byteToHexString(codes); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); - Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); + Assert.assertEquals("cafebabe", acctualValue); } - @Test - public void testClassPath() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); + private String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } - String clzPath = loader.getClassPath(); + @Test + public void testVersion() { - Assert.assertEquals(path1 + ";" + path2, clzPath); + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); } @@ -183,19 +177,31 @@ public void testConstantPool() { } @Test - public void testMagicNumber() { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; + public void testClassIndex() { - String acctualValue = this.byteToHexString(codes); + ClassIndex clzIndex = clzFile.getClzIndex(); + ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex()); + ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex()); - Assert.assertEquals("cafebabe", acctualValue); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); + Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } @Test public void testMethods(){ @@ -241,102 +247,15 @@ public void testMethods(){ "bb000159122b101db7002d4c2bb6002fb1"); } } - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testVersion() { - - Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); - - } - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); } - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - } diff --git a/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java b/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java index 9a36573dd3..d36b122f60 100644 --- a/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java +++ b/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java @@ -1,28 +1,30 @@ package com.coderising.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(); - - } + 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/382266293/src/com/coderising/jvm/util/Util.java b/group12/382266293/src/com/coderising/jvm/util/Util.java index c2042deaac..1f9e087bb9 100644 --- a/group12/382266293/src/com/coderising/jvm/util/Util.java +++ b/group12/382266293/src/com/coderising/jvm/util/Util.java @@ -1,6 +1,11 @@ package com.coderising.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 < codes.length; i++) { @@ -14,9 +19,4 @@ public static String byteToHexString(byte[] codes) { } return buffer.toString(); } - - public static int byteToInt(byte[] codes) { - String s1 = byteToHexString(codes); - return Integer.valueOf(s1, 16).intValue(); - } } diff --git a/group12/382266293/src/com/coderising/litestruts/LoginAction.java b/group12/382266293/src/com/coderising/litestruts/LoginAction.java index 7d1cf06a48..95fd144d4d 100644 --- a/group12/382266293/src/com/coderising/litestruts/LoginAction.java +++ b/group12/382266293/src/com/coderising/litestruts/LoginAction.java @@ -11,6 +11,14 @@ public class LoginAction { private String password; private String message; + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + public String execute() { if ("test".equals(name) && "1234".equals(password)) { this.message = "login successful"; @@ -20,18 +28,6 @@ public String execute() { return "fail"; } - public String getMessage() { - return this.message; - } - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - public void setName(String name) { this.name = name; } @@ -39,4 +35,8 @@ public void setName(String name) { public void setPassword(String password) { this.password = password; } + + public String getMessage() { + return this.message; + } } \ No newline at end of file diff --git a/group12/382266293/src/litestruts/ActionXMLreader.java b/group12/382266293/src/litestruts/ActionXMLreader.java index 53d815c174..92e700edc4 100644 --- a/group12/382266293/src/litestruts/ActionXMLreader.java +++ b/group12/382266293/src/litestruts/ActionXMLreader.java @@ -1,7 +1,6 @@ package litestruts; import java.util.List; - import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; diff --git a/group12/382266293/src/litestruts/Configuration.java b/group12/382266293/src/litestruts/Configuration.java index 44b85c9b45..731a4218b0 100644 --- a/group12/382266293/src/litestruts/Configuration.java +++ b/group12/382266293/src/litestruts/Configuration.java @@ -1,47 +1,25 @@ package litestruts; -import static util.Print.println; - import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; - import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; +import static util.Print.*; public class Configuration { - private static class ActionCfg { - - String name; - String clz; - Map viewResult = new HashMap<>(); - - public ActionCfg(String name, String clz) { - this.name = name; - this.clz = clz; - } - - public void addViewResult(String result, String jsp) { - viewResult.put(result, jsp); - - } + Map actions = new HashMap<>(); - public String getClassName() { - return clz; - } + private static Configuration cfg = new Configuration(); - public Map getViewResult() { - return viewResult; - } + private Configuration() { } - private static Configuration cfg = new Configuration(); - public static Configuration getNewInstance() { if (cfg == null) { @@ -50,36 +28,6 @@ public static Configuration getNewInstance() { return cfg; } - public static void main(String[] args) { - Configuration cfg = new Configuration(); - cfg.parse("struts.xml"); - String clz = cfg.getClassName("login"); - println(clz); - - } - - Map actions = new HashMap<>(); - - private Configuration() { - - } - - public String getClassName(String action) { - ActionCfg cfg = this.actions.get(action); - if (cfg == null) { - return null; - } - return cfg.getClassName(); - } - - public String getResultView(String action, String resultName) { - ActionCfg cfg = this.actions.get(action); - if (cfg == null) { - return null; - } - return cfg.getViewResult().get(resultName); - } - public void parse(String fileName) { String src = this.getClass().getPackage().getName(); @@ -125,4 +73,54 @@ public void parseXML(InputStream is) { } } + public String getClassName(String action) { + ActionCfg cfg = this.actions.get(action); + if (cfg == null) { + return null; + } + return cfg.getClassName(); + } + + public String getResultView(String action, String resultName) { + ActionCfg cfg = this.actions.get(action); + if (cfg == null) { + return null; + } + return cfg.getViewResult().get(resultName); + } + + public static void main(String[] args) { + Configuration cfg = new Configuration(); + cfg.parse("struts.xml"); + String clz = cfg.getClassName("login"); + println(clz); + + } + + private static class ActionCfg { + + String name; + String clz; + Map viewResult = new HashMap<>(); + + public Map getViewResult() { + return viewResult; + } + + public ActionCfg(String name, String clz) { + this.name = name; + this.clz = clz; + } + + public void addViewResult(String result, String jsp) { + viewResult.put(result, jsp); + + } + + public String getClassName() { + return clz; + } + + } + } diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index 2371cdbcd8..b84e2e6264 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -1,5 +1,6 @@ package litestruts; +import util.ActionXMLreader; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -8,26 +9,33 @@ import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; - import org.dom4j.Node; -import util.ActionXMLreader; - public class Struts { private static Object actionObj = null; private static String address = "src/litestruts/struts.xml"; private static ActionXMLreader reader = new ActionXMLreader(); - private static BeanInfo getBeanInfo(Object obj) { + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters) { - BeanInfo bi = null; - try { - bi = Introspector.getBeanInfo(obj.getClass(), Object.class); - } catch (IntrospectionException e) { - e.printStackTrace(); - } - return bi; + Node root = reader.getRootNode(address); + String clazz = reader.parseClass(root, actionName); + actionObj = getObj(clazz); + BeanInfo bi = getBeanInfo(actionObj); + PropertyDescriptor[] pd = bi.getPropertyDescriptors(); + + setParameters(actionObj, pd, parameters); + String executeResult = getResult(actionObj, bi, "execute"); + String jsp = reader.parseResult(root, actionName, executeResult); + Map readParamters = getReadParameters(actionObj, pd); + + View view = new View(); + view.setJsp(jsp); + view.setParameters(readParamters); + + return view; } private static Object getObj(String clazz) { @@ -45,22 +53,28 @@ private static Object getObj(String clazz) { return null; } - @SuppressWarnings("rawtypes") - public static Map getReadParameters(Object obj, PropertyDescriptor[] pd) { + private static BeanInfo getBeanInfo(Object obj) { - Map viewParams = new HashMap(); + BeanInfo bi = null; + try { + bi = Introspector.getBeanInfo(obj.getClass(), Object.class); + } catch (IntrospectionException e) { + e.printStackTrace(); + } + return bi; + } + + private static void setParameters(Object obj, PropertyDescriptor[] pd, Map parameters) { for (int i = 0; i < pd.length; i++) { - String readMethod = pd[i].getReadMethod().getName().substring(3); - String value = null; - try { - value = (String) pd[i].getReadMethod().invoke(obj); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } - viewParams.put(readMethod.toLowerCase(), value); + String name = pd[i].getName(); + if (parameters.containsKey(name)) + try { + pd[i].getWriteMethod().invoke(obj, parameters.get(name)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } } - return viewParams; } private static String getResult(Object obj, BeanInfo bi, String execute) { @@ -77,38 +91,22 @@ private static String getResult(Object obj, BeanInfo bi, String execute) { return null; } - @SuppressWarnings("unchecked") - public static View runAction(String actionName, Map parameters) { - - Node root = reader.getRootNode(address); - String clazz = reader.parseClass(root, actionName); - actionObj = getObj(clazz); - BeanInfo bi = getBeanInfo(actionObj); - PropertyDescriptor[] pd = bi.getPropertyDescriptors(); - - setParameters(actionObj, pd, parameters); - String executeResult = getResult(actionObj, bi, "execute"); - String jsp = reader.parseResult(root, actionName, executeResult); - Map readParamters = getReadParameters(actionObj, pd); - - View view = new View(); - view.setJsp(jsp); - view.setParameters(readParamters); - - return view; - } + @SuppressWarnings("rawtypes") + public static Map getReadParameters(Object obj, PropertyDescriptor[] pd) { - private static void setParameters(Object obj, PropertyDescriptor[] pd, Map parameters) { + Map viewParams = new HashMap(); for (int i = 0; i < pd.length; i++) { - String name = pd[i].getName(); - if (parameters.containsKey(name)) - try { - pd[i].getWriteMethod().invoke(obj, parameters.get(name)); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } + String readMethod = pd[i].getReadMethod().getName().substring(3); + String value = null; + try { + value = (String) pd[i].getReadMethod().invoke(obj); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + viewParams.put(readMethod.toLowerCase(), value); } + return viewParams; } } \ No newline at end of file diff --git a/group12/382266293/src/litestruts/StrutsTest.java b/group12/382266293/src/litestruts/StrutsTest.java index 8d70a91cb3..b450d7a935 100644 --- a/group12/382266293/src/litestruts/StrutsTest.java +++ b/group12/382266293/src/litestruts/StrutsTest.java @@ -9,30 +9,30 @@ public class StrutsTest { @Test - public void testLoginActionFailed() { + public void testLoginActionSuccess() { + String actionName = "login"; + Map params = new HashMap(); params.put("name", "test"); - params.put("password", "123456"); // 密码和预设的不一致 + params.put("password", "1234"); View view = Struts.runAction(actionName, params); - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); } @Test - public void testLoginActionSuccess() { - + public void testLoginActionFailed() { String actionName = "login"; - Map params = new HashMap(); params.put("name", "test"); - params.put("password", "1234"); + params.put("password", "123456"); // 密码和预设的不一致 View view = Struts.runAction(actionName, params); - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); } } diff --git a/group12/382266293/src/litestruts/View.java b/group12/382266293/src/litestruts/View.java index 41152f3214..0c917dcb35 100644 --- a/group12/382266293/src/litestruts/View.java +++ b/group12/382266293/src/litestruts/View.java @@ -10,15 +10,15 @@ public String getJsp() { return jsp; } - public Map getParameters() { - return parameters; - } - public View setJsp(String jsp) { this.jsp = jsp; return this; } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { this.parameters = parameters; return this; diff --git a/group12/382266293/src/test.java b/group12/382266293/src/test.java index 3910b896af..b3a32d2556 100644 --- a/group12/382266293/src/test.java +++ b/group12/382266293/src/test.java @@ -6,7 +6,6 @@ import java.io.InputStream; import java.net.URL; import java.util.LinkedList; - import sun.net.www.protocol.http.HttpURLConnection; public class test { @@ -17,6 +16,30 @@ public class test { public static String tempName = ""; public static String fileName = ""; + LinkedList a; + + private static void createTempFile1(String from) { + long length = 0; + URL url = null; + HttpURLConnection conn = null; + try { + url = new URL(from); + conn = (HttpURLConnection) url.openConnection(); + String file = conn.getURL().getFile(); + fileName = file.substring(file.lastIndexOf('/') + 1); + tempName = fileName.substring(0, fileName.lastIndexOf('.') + 1) + "lyj"; + length = conn.getContentLength(); + conn.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + conn.disconnect(); + } + tempName = downloadLocation + tempName; + fileName = downloadLocation + fileName; + bufferFile(tempName, length); + } + public static void bufferFile(String name, long len) { FileOutputStream temp = null; @@ -43,28 +66,6 @@ public static void bufferFile(String name, long len) { } } - private static void createTempFile1(String from) { - long length = 0; - URL url = null; - HttpURLConnection conn = null; - try { - url = new URL(from); - conn = (HttpURLConnection) url.openConnection(); - String file = conn.getURL().getFile(); - fileName = file.substring(file.lastIndexOf('/') + 1); - tempName = fileName.substring(0, fileName.lastIndexOf('.') + 1) + "lyj"; - length = conn.getContentLength(); - conn.disconnect(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - conn.disconnect(); - } - tempName = downloadLocation + tempName; - fileName = downloadLocation + fileName; - bufferFile(tempName, length); - } - public static void download(String src) { createTempFile1(src); @@ -94,12 +95,6 @@ public static void download(String src) { } - public static void main(String[] args) throws IOException { - - download(url2); - - } - public static boolean rename(String temp) { File file = new File(temp); File f1 = new File(fileName); @@ -112,6 +107,10 @@ public static boolean rename(String temp) { return false; } - LinkedList a; + public static void main(String[] args) throws IOException { + + download(url2); + + } } diff --git a/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java b/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 88f60c77f6..0000000000 --- a/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java b/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index ee7d423c3b..0000000000 --- a/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - - return null; - } - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - - } - - - - - -} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java b/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java deleted file mode 100644 index d88752e323..0000000000 --- a/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LineNumberTable extends AttributeInfo { - List items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; - } - - - -} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 962c3b8bc4..0000000000 --- a/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java deleted file mode 100644 index e4d3df0e77..0000000000 --- a/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.jvm.attr; - - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo{ - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; - } - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - -} diff --git a/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java b/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index 18f2ad0360..0000000000 --- a/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group12/446031103/src/com/coderising/jvm/field/Field.java b/group12/446031103/src/com/coderising/jvm/field/Field.java deleted file mode 100644 index 0d1c64587c..0000000000 --- a/group12/446031103/src/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - return null; - } - -} diff --git a/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java index 6fb5570dff..9c9fac2839 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -1,57 +1,5 @@ package com.coderising.jvm.loader; -import java.util.Arrays; +public class ByteCodeIterator { -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - byte[] codes; - int pos = 0; - - ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - - - public byte[] getBytes(int len) { - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public int nextU1toInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextU4ToHexString() { - return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } } diff --git a/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java index 070a0ba10b..33185d8175 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -9,7 +9,7 @@ import java.util.List; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import com.coderising.jvm.clz.ClassFile; diff --git a/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java index a30cb22ad1..8e29f14a0c 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java @@ -13,139 +13,32 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; public class ClassFileParser { public ClassFile parse(byte[] codes) { - ClassFile clzFile = new ClassFile(); - - ByteCodeIterator iter = new ByteCodeIterator(codes); - - String magicNumber = iter.nextU4ToHexString(); - - if (!"cafebabe".equals(magicNumber)) { - return null; - } - - clzFile.setMinorVersion(iter.nextU2ToInt()); - clzFile.setMajorVersion(iter.nextU2ToInt()); - - ConstantPool pool = parseConstantPool(iter); - clzFile.setConstPool(pool); - - AccessFlag flag = parseAccessFlag(iter); - clzFile.setAccessFlag(flag); - - ClassIndex clzIndex = parseClassInfex(iter); - clzFile.setClassIndex(clzIndex); - - parseInterfaces(iter); - - return clzFile; + + return null; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); - // System.out.println("Is public class: " + flag.isPublicClass()); - // System.out.println("Is final class : " + flag.isFinalClass()); - - return flag; + return null; } private ClassIndex parseClassInfex(ByteCodeIterator iter) { - int thisClassIndex = iter.nextU2ToInt(); - int superClassIndex = iter.nextU2ToInt(); - - ClassIndex clzIndex = new ClassIndex(); - - clzIndex.setThisClassIndex(thisClassIndex); - clzIndex.setSuperClassIndex(superClassIndex); - - return clzIndex; + return null; } private ConstantPool parseConstantPool(ByteCodeIterator iter) { - int constPoolCount = iter.nextU2ToInt(); - - System.out.println("Constant Pool Count :" + constPoolCount); - - ConstantPool pool = new ConstantPool(); - - pool.addConstantInfo(new NullConstantInfo()); - - for (int i = 1; i <= constPoolCount - 1; i++) { - - int tag = iter.nextU1toInt(); - - if (tag == 7) { - // Class Info - int utf8Index = iter.nextU2ToInt(); - ClassInfo clzInfo = new ClassInfo(pool); - clzInfo.setUtf8Index(utf8Index); - - pool.addConstantInfo(clzInfo); - } else if (tag == 1) { - // UTF-8 String - int len = iter.nextU2ToInt(); - byte[] data = iter.getBytes(len); - String value = null; - try { - value = new String(data, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - - UTF8Info utf8Str = new UTF8Info(pool); - utf8Str.setLength(len); - utf8Str.setValue(value); - pool.addConstantInfo(utf8Str); - }else if (tag == 8) { - StringInfo info = new StringInfo(pool); - info.setIndex(iter.nextU2ToInt()); - pool.addConstantInfo(info); - } else if (tag == 9) { - FieldRefInfo field = new FieldRefInfo(pool); - field.setClassInfoIndex(iter.nextU2ToInt()); - field.setNameAndTypeIndex(iter.nextU2ToInt()); - pool.addConstantInfo(field); - } else if (tag == 10) { - // MethodRef - MethodRefInfo method = new MethodRefInfo(pool); - method.setClassInfoIndex(iter.nextU2ToInt()); - method.setNameAndTypeIndex(iter.nextU2ToInt()); - pool.addConstantInfo(method); - } else if (tag == 12) { - // Name and Type Info - NameAndTypeInfo nameType = new NameAndTypeInfo(pool); - nameType.setIndex1(iter.nextU2ToInt()); - nameType.setIndex2(iter.nextU2ToInt()); - pool.addConstantInfo(nameType); - } else { - throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet."); - } - } - - System.out.println("Finished reading Constant pool "); - - return pool; - } - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceCount = iter.nextU2ToInt(); - - System.out.println("interfaceCount:" + interfaceCount); - - // TODO : 如果实现了interface, 这里需要解析 + return null; } - } diff --git a/group12/446031103/src/com/coderising/jvm/method/Method.java b/group12/446031103/src/com/coderising/jvm/method/Method.java deleted file mode 100644 index b57ef592d2..0000000000 --- a/group12/446031103/src/com/coderising/jvm/method/Method.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coderising.jvm.method; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.attr.AttributeInfo; -import com.coderising.jvm.attr.CodeAttr; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - - -public class Method { - - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private CodeAttr codeAttr; - - private ClassFile clzFile; - - - public ClassFile getClzFile() { - return clzFile; - } - - public int getNameIndex() { - return nameIndex; - } - public int getDescriptorIndex() { - return descriptorIndex; - } - - public CodeAttr getCodeAttr() { - return codeAttr; - } - - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } - - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - } - - - - - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ - return null; - - } -} diff --git a/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java index a0cbf7a626..26407abbef 100644 --- a/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -23,16 +23,15 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - //模拟windows中的path,path用;连接,要在这串path中寻找jvm - //static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path1 = "E:\\mygit\\coding2017\\group12\\446031103\\bin"; - static String path2 = "E:\temp"; + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "com.coderising.jvm.test.EmployeeV1"; + clzFile = loader.loadClass(className); clzFile.print(); } diff --git a/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java b/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java index 00be77f3d0..cdb42d1fdd 100644 --- a/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java +++ b/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java @@ -165,6 +165,150 @@ public String toString(){ return buffer.toString(); } + /*private static class Node { + + Node prev; + Node next; + int pageNum; + + Node(Node prev,Node next,int pageNum) { + this.prev = prev; + this.next = next; + this.pageNum = pageNum; + } + Node(){ + + } + } + + private int capacity; + private int addCnt ; + private int size; + private Node first;// 链表头 + private Node last;// 链表尾 + + + public LRUPageFrame(int capacity) { + + this.capacity = capacity; + first = new Node(); + } + + *//** + * 获取缓存中对象 + * + * @param key + * @return + *//* + public void access(int pageNum) { + if(null==this.last){ + this.last = new Node(this.first,null,pageNum); + this.first.next = this.last; + addCnt++; + size++; + return; + } + if(contain(pageNum)){ + if(Objects.equals(this.first.next.pageNum, pageNum)){ + return; + } + boolean temp = Objects.equals(getLastNode(size).pageNum, pageNum); + Node currentNode = getNode(pageNum); + Node nextNode = currentNode.next; + Node preNode = currentNode.prev; + + currentNode.prev = this.first; + currentNode.next = this.first.next; + this.first.next = currentNode; + + if(temp){ + preNode.next = null; + if(null==preNode.prev) + preNode.prev = currentNode; + }else{ + preNode.prev = currentNode; + preNode.next = nextNode; + nextNode.next = null; + nextNode.prev = preNode; + } + this.last = getLastNode(size); + return; + } + Node addNode = new Node(this.first,this.first.next,pageNum); + Node oldFirstnode=this.first.next ; + oldFirstnode.prev = addNode; + this.first.next = addNode; + if(isOut()){ + + addCnt++; + if(this.size !=this.capacity ) + size++; + if(addCnt>size) + this.last.prev.next = null; + this.last = getLastNode(size); + }else{ + this.last.prev.next = null; + } + + + } + private boolean isOut(){ + return this.addCnt<=this.capacity; + } + + private Node getLastNode(int sizes) { + Node node=this.first; + for (int i = 0; i < sizes; i++) { + node = node.next; + } + return node; + } + + private boolean contain(Object o){ + Node node = this.first; + + while(null!=node.next){ + + node = node.next; + + if(Objects.equals(node.pageNum,o)){ + return true; + } + + } + return false; + } + + private Node getNode(Object o){ + Node node = this.first; + + while(null!=node.next){ + + node = node.next; + + if(Objects.equals(node.pageNum,o)){ + return node; + } + + } + return null; + } + + + + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + Node node = first; + while(node.next != null){ + node = node.next; + buffer.append(node.pageNum); + if(node.next != null){ + buffer.append(","); + } + } + return buffer.toString(); + }*/ } \ No newline at end of file diff --git a/group12/446031103/src/com/datastructure/stack/StackUtil.java b/group12/446031103/src/com/datastructure/stack/StackUtil.java index 2d4040d25d..7cab99ede3 100644 --- a/group12/446031103/src/com/datastructure/stack/StackUtil.java +++ b/group12/446031103/src/com/datastructure/stack/StackUtil.java @@ -7,40 +7,13 @@ 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) { + public static void reverse(Stack s) { Stack temp = new Stack(); while(!s.isEmpty()){ temp.push(s.pop()); } s = temp; - }*/ - public static void reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - - Stack tmp = new Stack(); - while(!s.isEmpty()){ - tmp.push(s.pop()); - } - while(!tmp.isEmpty()){ - Object top = tmp.pop(); - addToBottom(s,top); - } - - - } - public static void addToBottom(Stack s, Object value){ - if(s.isEmpty()){ - s.push(value); - } else{ - Object top = s.pop(); - addToBottom(s,value); - s.push(top); - } } - /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 @@ -48,9 +21,6 @@ public static void addToBottom(Stack s, Object value){ * @param o */ public static void remove(Stack s,Object o) { - if(s == null || s.isEmpty()){ - return; - } Stack temp = new Stack(); while(!s.isEmpty()){ Object result=s.pop(); @@ -105,7 +75,7 @@ public static boolean isValidPairs(String s){ } } }else{ - char result=c[clength/2]; + char result=c[clength/2+1]; if(contain(result)){ return false; }; @@ -113,7 +83,7 @@ public static boolean isValidPairs(String s){ if(i s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - - StackUtil.addToBottom(s, 0); - - Assert.assertEquals("[0, 1, 2, 3]", s.toString()); - - } - @Test - public void testReverse() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); - } - - @Test - public void testRemove() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("[1, 3]", s.toString()); - } - - @Test - public void testGetTop() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } - } - - @Test - public void testIsValidPairs() { - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } - -} diff --git a/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java b/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java deleted file mode 100644 index 503f050d29..0000000000 --- a/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.datastructure.stack.expr; - -import java.util.Objects; -import java.util.Stack; -import java.lang.String; -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - Stack sign = new Stack(); - Stack number = new Stack(); - int strCnt = 0; - int numberLen = 0; - String[] String = expr.split("[^\\d]"); - if(expr!=null){ - for (int i = 0,strLen = expr.length(); i < strLen; i++) { - char c=expr.charAt(i); - if(Objects.equals(c, '+')||Objects.equals(c, '-')){ - sign.push(c); - }else if(Objects.equals(c, '*')||Objects.equals(c, '/')){ - float number1=number.pop(); - float number2=Float.parseFloat(String[strCnt]); - float result=calculate(number1,number2,c); - numberLen = String[strCnt].length(); - number.push(result); - i += numberLen; - strCnt++; - }else{ - number.push(Float.parseFloat(String[strCnt])); - numberLen = String[strCnt].length(); - strCnt++; - i += (numberLen-1); - } - } - for (int i = 0,signS = sign.size(); i < signS; i++) { - float number1 = number.pop(); - float number2 =number.pop(); - char c = sign.pop(); - float result=calculate(number2,number1,c); - number.push(result); - } - } - return number.pop(); - } - - private float calculate(float number1,float number2,char c){ - float result = 0; - if(Objects.equals(c, '+')){ - result = number1 + number2; - }else if(Objects.equals(c, '-')){ - result = number1 - number2; - }else if(Objects.equals(c, '*')){ - result = number1 * number2; - }else if(Objects.equals(c, '/')){ - result = number1 / number2; - } - return result; - } - - - - -} diff --git a/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java b/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java deleted file mode 100644 index 1b64b3fcc7..0000000000 --- a/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.datastructure.stack.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - float a =expr.evaluate(); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group15/1507_977996067/src/task7/expr/InfixExpr.java b/group15/1507_977996067/src/task7/expr/InfixExpr.java deleted file mode 100644 index 1a18634382..0000000000 --- a/group15/1507_977996067/src/task7/expr/InfixExpr.java +++ /dev/null @@ -1,79 +0,0 @@ -package task7.expr; - -import org.junit.Assert; -import task5.stack.Stack; - -import java.util.Arrays; - -public class InfixExpr { - - private String expr; - - private Stack numberStack = new Stack<>(); - - private Stack resultStack = new Stack<>(); - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - Assert.assertNotNull(expr); - - String[] operators = expr.split("[\\d]+"); - - int length = operators.length; - - Arrays.stream(expr.split("[+\\-*/]+")) - .map(Float::parseFloat) - .forEach(numberStack::push); - - numberStack = reverse(numberStack); - - resultStack.push(numberStack.pop()); - - for (int i = 1; i < length; i++) { - String currentOperator = operators[i]; -// 先做乘除,结果放resultStack里面 - switch (currentOperator) { - case "*": - resultStack.push(resultStack.pop() * numberStack.pop()); - break; - case "/": - resultStack.push(resultStack.pop() / numberStack.pop()); - break; - case "+": - resultStack.push(numberStack.pop()); - break; - case "-": - resultStack.push(numberStack.pop()); - break; - } - } - - resultStack = reverse(resultStack); - -// 做加减 - for (int i = 1; i < length; i++) { - String currentOperator = operators[i]; - if ("+".equals(currentOperator)) { - Float num1 = resultStack.pop(); - Float num2 = resultStack.pop(); - resultStack.push(num1 + num2); - } else if ("-".equals(currentOperator)) { - Float num1 = resultStack.pop(); - Float num2 = resultStack.pop(); - resultStack.push(num1 - num2); - } - } - return resultStack.peek(); - } - - private Stack reverse(Stack stackToReverse) { - Stack temp = new Stack<>(); - while (!stackToReverse.isEmpty()) - temp.push(stackToReverse.pop()); - return temp; - } -} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/InfixExprTest.java b/group15/1507_977996067/src/task7/expr/InfixExprTest.java deleted file mode 100644 index f9eb14cbdf..0000000000 --- a/group15/1507_977996067/src/task7/expr/InfixExprTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package task7.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - - @Test - public void testExprSplit() { - String expr = "3*20+12*5-40/2"; - Arrays.stream(expr.split("[+\\-*/]+")).forEach(System.out::println); - Arrays.stream(expr.split("[\\d]+")).forEach(System.out::println); - } - -} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/PostfixExpr.java b/group15/1507_977996067/src/task7/expr/PostfixExpr.java deleted file mode 100644 index 369e52c203..0000000000 --- a/group15/1507_977996067/src/task7/expr/PostfixExpr.java +++ /dev/null @@ -1,45 +0,0 @@ -package task7.expr; - -import task5.stack.Stack; - -import java.util.List; - -public class PostfixExpr { - private String expr = null; - - private Stack numberStack = new Stack<>(); - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - List parse = new TokenParser().parse(expr); - for (int i = 0; i < parse.size(); i++) { - Token token = parse.get(i); -// 后缀表达式:从左向右遍历 遇到操作数入栈,遇到操作符弹出操作数栈的两个数计算再入栈 - if (token.isNumber()) - numberStack.push((float) token.getIntValue()); - else - numberStack.push(cal(token.toString(), numberStack.pop(), numberStack.pop())); - } - /*while (!operatorStack.isEmpty()) { - numberStack.push(cal(operatorStack.pop(), numberStack.pop(), numberStack.pop())); - }*/ - return numberStack.peek(); - } - - private static float cal(String operator, float var1, float var2) { - switch (operator) { - case "+": - return var2 + var1; - case "-": - return var2 - var1; - case "*": - return var2 * var1; - case "/": - return var2 / var1; - } - return -1; - } -} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/PostfixExprTest.java b/group15/1507_977996067/src/task7/expr/PostfixExprTest.java deleted file mode 100644 index 172d397011..0000000000 --- a/group15/1507_977996067/src/task7/expr/PostfixExprTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package task7.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(), 0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(), 0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(), 0.0f); - } - } - -} diff --git a/group15/1507_977996067/src/task7/expr/PrefixExpr.java b/group15/1507_977996067/src/task7/expr/PrefixExpr.java deleted file mode 100644 index fe5cb137f0..0000000000 --- a/group15/1507_977996067/src/task7/expr/PrefixExpr.java +++ /dev/null @@ -1,47 +0,0 @@ -package task7.expr; - -import task5.stack.Stack; - -import java.util.List; - -public class PrefixExpr { - - private String expr; - - private Stack numberStack = new Stack<>(); - - public PrefixExpr(String expr) { - this.expr = expr; - - } - - public float evaluate() { - List parse = new TokenParser().parse(expr); - for (int i = parse.size() - 1; i >= 0; i--) { - Token token = parse.get(i); -// 前缀表达式:从右向左遍历 遇到操作数入栈,遇到操作符弹出操作数栈的两个数计算再入栈 - if (token.isNumber()) - numberStack.push((float) token.getIntValue()); - else - numberStack.push(cal(token.toString(), numberStack.pop(), numberStack.pop())); - } - /*while (!operatorStack.isEmpty()) { - numberStack.push(cal(operatorStack.pop(), numberStack.pop(), numberStack.pop())); - }*/ - return numberStack.peek(); - } - - private static float cal(String operator, float var1, float var2) { - switch (operator) { - case "+": - return var1 + var2; - case "-": - return var1 - var2; - case "*": - return var1 * var2; - case "/": - return var1 / var2; - } - return -1; - } -} diff --git a/group15/1507_977996067/src/task7/expr/PrefixExprTest.java b/group15/1507_977996067/src/task7/expr/PrefixExprTest.java deleted file mode 100644 index 9ac8f9936f..0000000000 --- a/group15/1507_977996067/src/task7/expr/PrefixExprTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package task7.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(), 0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(), 0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(), 0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(), 0.001f); - } - - - } - -} diff --git a/group15/1507_977996067/src/task7/expr/Token.java b/group15/1507_977996067/src/task7/expr/Token.java deleted file mode 100644 index 5ca7b1aef8..0000000000 --- a/group15/1507_977996067/src/task7/expr/Token.java +++ /dev/null @@ -1,53 +0,0 @@ -package task7.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - - public Token(int type, String value) { - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value); - } - - public String toString() { - return value; - } - - public boolean hasHigherPriority(Token t) { - if (!this.isOperator() && !t.isOperator()) { - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - -} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/TokenParser.java b/group15/1507_977996067/src/task7/expr/TokenParser.java deleted file mode 100644 index 45d75ffc12..0000000000 --- a/group15/1507_977996067/src/task7/expr/TokenParser.java +++ /dev/null @@ -1,57 +0,0 @@ -package task7.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else { -// System.out.println("char :[" + c + "] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java b/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java deleted file mode 100644 index aba714c39b..0000000000 --- a/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package task7.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java b/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java deleted file mode 100644 index e3784bec44..0000000000 --- a/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,120 +0,0 @@ -package task7.jvm.attr; - - -import task7.jvm.clz.ClassFile; -import task7.jvm.cmd.ByteCodeCommand; -import task7.jvm.cmd.CommandParser; -import task7.jvm.constant.ConstantPool; -import task7.jvm.loader.ByteCodeIterator; - -public class CodeAttr extends AttributeInfo { - private int maxStack; - private int maxLocals; - private int codeLen; - private String code; - - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds; - - public ByteCodeCommand[] getCmds() { - return cmds; - } - - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { - - int attrNameIndex = iter.next2Bytes(); - int attrLen = iter.next4Bytes(); - int maxStack = iter.next2Bytes(); - int maxLocals = iter.next2Bytes(); - int codeLen = iter.next4Bytes(); - - String code = iter.nextUxToHexString(codeLen); - - System.out.println(code); - - ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); - - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); - - int exceptionTableLen = iter.next2Bytes(); - //TODO 处理exception - if (exceptionTableLen > 0) { - String exTable = iter.nextUxToHexString(exceptionTableLen); - System.out.println("Encountered exception table , just ignore it :" + exTable); - - } - - - int subAttrCount = iter.next2Bytes(); - - for (int x = 1; x <= subAttrCount; x++) { - int subAttrIndex = iter.next2Bytes(); - String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); - - //已经向前移动了U2, 现在退回去。 - iter.back(2); - //line item table - if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { - - LineNumberTable t = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(t); - } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { - LocalVariableTable t = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(t); - } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { - StackMapTable t = StackMapTable.parse(iter); - codeAttr.setStackMapTable(t); - } else { - throw new RuntimeException("Need code to process " + subAttrName); - } - - - } - - return codeAttr; - } - - - public String toString(ConstantPool pool) { - StringBuilder buffer = new StringBuilder(); - buffer.append("Code:").append(code).append("\n"); - for (int i = 0; i < cmds.length; i++) { - buffer.append(cmds[i].toString(pool)).append("\n"); - } - buffer.append("\n"); - buffer.append(this.lineNumTable.toString()); - buffer.append(this.localVarTable.toString(pool)); - return buffer.toString(); - } - - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - - } - - -} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java b/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java deleted file mode 100644 index ebaec852b9..0000000000 --- a/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java +++ /dev/null @@ -1,72 +0,0 @@ -package task7.jvm.attr; - -import task7.jvm.loader.ByteCodeIterator; - -import java.util.ArrayList; -import java.util.List; - -public class LineNumberTable extends AttributeInfo { - List items = new ArrayList(); - - private static class LineNumberItem { - int startPC; - int lineNum; - - public int getStartPC() { - return startPC; - } - - public void setStartPC(int startPC) { - this.startPC = startPC; - } - - public int getLineNum() { - return lineNum; - } - - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - - public void addLineNumberItem(LineNumberItem item) { - this.items.add(item); - } - - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter) { - - int index = iter.next2Bytes(); - int len = iter.next4Bytes(); - - LineNumberTable table = new LineNumberTable(index, len); - - int itemLen = iter.next2Bytes(); - - for (int i = 1; i <= itemLen; i++) { - LineNumberItem item = new LineNumberItem(); - item.setStartPC(iter.next2Bytes()); - item.setLineNum(iter.next2Bytes()); - table.addLineNumberItem(item); - } - return table; - } - - public String toString() { - StringBuilder buffer = new StringBuilder(); - buffer.append("Line Number Table:\n"); - for (LineNumberItem item : items) { - buffer.append("startPC:" + item.getStartPC()).append(","); - buffer.append("lineNum:" + item.getLineNum()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - - } - - -} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java deleted file mode 100644 index fbb27e8812..0000000000 --- a/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package task7.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 7bcf199b3c..0000000000 --- a/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,57 +0,0 @@ -package task7.jvm.attr; - - -import task7.jvm.constant.ConstantPool; -import task7.jvm.loader.ByteCodeIterator; - -import java.util.ArrayList; -import java.util.List; - -public class LocalVariableTable extends AttributeInfo { - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - int index = iter.next2Bytes(); - int len = iter.next4Bytes(); - - LocalVariableTable table = new LocalVariableTable(index,len); - - int itemLen = iter.next2Bytes(); - - for(int i=1; i<=itemLen; i++){ - LocalVariableItem item = new LocalVariableItem(); - item.setStartPC(iter.next2Bytes()); - item.setLength(iter.next2Bytes()); - item.setNameIndex(iter.next2Bytes()); - item.setDescIndex(iter.next2Bytes()); - item.setIndex(iter.next2Bytes()); - table.addLocalVariableItem(item); - } - return table; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } -} diff --git a/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java b/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java deleted file mode 100644 index f57144783d..0000000000 --- a/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package task7.jvm.attr; - - -import task7.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo { - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.next2Bytes(); - int len = iter.next4Bytes(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java b/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java deleted file mode 100644 index e333b4621d..0000000000 --- a/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package task7.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/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java b/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java deleted file mode 100644 index 1587998e29..0000000000 --- a/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java +++ /dev/null @@ -1,134 +0,0 @@ -package task7.jvm.clz; - -import task7.jvm.constant.ClassInfo; -import task7.jvm.constant.ConstantPool; -import task7.jvm.field.Field; -import task7.jvm.method.Method; - -import java.util.ArrayList; -import java.util.List; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - - private List fields = new ArrayList<>(); - private List methods = new ArrayList<>(); - - public void setClzIndex(ClassIndex clzIndex) { - this.clzIndex = clzIndex; - } - - public ConstantPool getPool() { - return pool; - } - - public void setPool(ConstantPool pool) { - this.pool = pool; - } - - public List getFields() { - return fields; - } - - public void setFields(List fields) { - this.fields = fields; - } - - public List getMethods() { - return methods; - } - - public void setMethods(List methods) { - this.methods = methods; - } - - 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()); - - - } - - public String getClassName() { - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - - public String getSuperClassName() { - ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - - public Method getMethod(String methodName, String paramAndReturnType) { - - for (Method method : methods) { - int nameIndex = method.getNameIndex(); - int descriptorIndex = method.getDescriptorIndex(); - String name = getConstantPool().getUTF8String(nameIndex); - String descriptor = getConstantPool().getUTF8String(descriptorIndex); - if (methodName.equalsIgnoreCase(name) && paramAndReturnType.equalsIgnoreCase(descriptor)) { - return method; - } - } - return null; - } - - public Method getMainMethod() { - - return getMethod("main", "([Ljava/lang/String;)"); - } -} diff --git a/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java b/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java deleted file mode 100644 index b4342d6557..0000000000 --- a/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package task7.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/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java deleted file mode 100644 index b80f830944..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantInfo; -import task7.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java b/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index e4c9e2ac2d..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package task7.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantInfo; -import task7.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - -// public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java b/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java deleted file mode 100644 index f6a12e1701..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,124 +0,0 @@ -package task7.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import task7.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - codes = codes.toUpperCase(); - System.out.println("=========> codes: " + codes); - CommandIterator iterator = new CommandIterator(codes); - List commands = new ArrayList<>(); - while (iterator.hasNext()) { - String opCode = iterator.next2CharAsString(); - switch (opCode) { - case new_object: - NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, codes); - newObjectCmd.setOprand1(iterator.next2CharAsInt()); - newObjectCmd.setOprand2(iterator.next2CharAsInt()); - commands.add(newObjectCmd); - break; - case ldc: - LdcCmd ldcCmd = new LdcCmd(clzFile, codes); - ldcCmd.setOperand(iterator.next2CharAsInt()); - commands.add(ldcCmd); - break; - case bipush: - BiPushCmd biPushCmd = new BiPushCmd(clzFile, codes); - biPushCmd.setOperand(iterator.next2CharAsInt()); - commands.add(biPushCmd); - break; - case invokespecial: - InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, codes); - invokeSpecialCmd.setOprand1(iterator.next2CharAsInt()); - invokeSpecialCmd.setOprand2(iterator.next2CharAsInt()); - commands.add(invokeSpecialCmd); - break; - case invokevirtual: - InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, codes); - invokeVirtualCmd.setOprand1(iterator.next2CharAsInt()); - invokeVirtualCmd.setOprand2(iterator.next2CharAsInt()); - commands.add(invokeVirtualCmd); - break; - default: - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, codes); - commands.add(noOperandCmd); - } - } - calcuateOffset(commands); - return commands.toArray(new ByteCodeCommand[commands.size()]); - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16); - } - - } -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 531770d8b9..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index 7f43150ca2..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ClassInfo; -import task7.jvm.constant.ConstantPool; -import task7.jvm.constant.FieldRefInfo; -import task7.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index ffe71dfb15..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantPool; -import task7.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index de80616b39..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java deleted file mode 100644 index 143b070968..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantInfo; -import task7.jvm.constant.ConstantPool; -import task7.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 09ffc20c19..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 16810f3874..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 713610e243..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index df2b895c03..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 9cf2fded56..0000000000 --- a/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package task7.jvm.cmd; - -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ClassInfo; -import task7.jvm.constant.ConstantInfo; -import task7.jvm.constant.ConstantPool; -import task7.jvm.constant.FieldRefInfo; -import task7.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java b/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java deleted file mode 100644 index 8c2af5157a..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,31 +0,0 @@ -package task7.jvm.constant; - -import task7.jvm.print.ConstantInfoVisitor; - -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; - } - - @Override - public void accept(ConstantInfoVisitor visitor) { - visitor.visitClassInfo(this); - } - - public String getClassName() { - int index = getUtf8Index(); - UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); - return utf8Info.getValue(); - } -} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java b/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java deleted file mode 100644 index 24922e29d3..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,35 +0,0 @@ -package task7.jvm.constant; - -import task7.jvm.print.ConstantInfoVisitor; - -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 abstract void accept(ConstantInfoVisitor visitor); - - public ConstantPool getConstantPool() { - return constantPool; - } - - public ConstantInfo getConstantInfo(int index) { - return this.constantPool.getConstantInfo(index); - } - -} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java b/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java deleted file mode 100644 index 485f0dd7c2..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,37 +0,0 @@ -package task7.jvm.constant; - -import java.util.ArrayList; -import java.util.List; - -public class ConstantPool { - - private List constantInfos; - - public ConstantPool() { - this.constantInfos = new ArrayList<>(); - } - - public ConstantPool(int size) { - this.constantInfos = new ArrayList<>(size); - - addConstantInfo(new NullConstantInfo()); - } - - 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/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java b/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 01474d2dd6..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,65 +0,0 @@ -package task7.jvm.constant; - -import task7.jvm.print.ConstantInfoVisitor; - -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; - } - - @Override - public void accept(ConstantInfoVisitor visitor) { - visitor.visitFieldRefInfo(this); - } - - 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/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java b/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 104b798e59..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,65 +0,0 @@ -package task7.jvm.constant; - -import task7.jvm.print.ConstantInfoVisitor; - -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; - } - - @Override - public void accept(ConstantInfoVisitor visitor) { - visitor.visitMethodRefInfo(this); - } - - 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/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java b/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 18089a2008..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,56 +0,0 @@ -package task7.jvm.constant; - -import task7.jvm.print.ConstantInfoVisitor; - -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; - } - - @Override - public void accept(ConstantInfoVisitor visitor) { - visitor.visitNameAndTypeInfo(this); - } - - - 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/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java b/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 216b03a449..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,21 +0,0 @@ -package task7.jvm.constant; - -import task7.jvm.print.ConstantInfoVisitor; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo() { - - } - - @Override - public int getType() { - return -1; - } - - @Override - public void accept(ConstantInfoVisitor visitor) { - // non impl - } - -} diff --git a/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java b/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java deleted file mode 100644 index 0b601e3adb..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java +++ /dev/null @@ -1,35 +0,0 @@ -package task7.jvm.constant; - -import task7.jvm.print.ConstantInfoVisitor; - -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; - } - - @Override - public void accept(ConstantInfoVisitor visitor) { - visitor.visitStringInfo(this); - } - - public int getIndex() { - return index; - } - - public void setIndex(int index) { - this.index = index; - } - - - public String toString() { - return this.getConstantPool().getUTF8String(index); - } - -} diff --git a/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java b/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java deleted file mode 100644 index 53686ca0a8..0000000000 --- a/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,45 +0,0 @@ -package task7.jvm.constant; - -import task7.jvm.print.ConstantInfoVisitor; - -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 void accept(ConstantInfoVisitor visitor) { - visitor.visitUtf8Info(this); - } - - @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/group15/1507_977996067/src/task7/jvm/field/Field.java b/group15/1507_977996067/src/task7/jvm/field/Field.java deleted file mode 100644 index 989f3316c4..0000000000 --- a/group15/1507_977996067/src/task7/jvm/field/Field.java +++ /dev/null @@ -1,48 +0,0 @@ -package task7.jvm.field; - - -import task7.jvm.constant.ConstantPool; -import task7.jvm.constant.UTF8Info; -import task7.jvm.loader.ByteCodeIterator; - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private ConstantPool pool; - - public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public String toString() { - String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); - return name + ":" + desc; - } - - - public static Field parse(ConstantPool pool, ByteCodeIterator iter) { - - int accessFlag = iter.next2Bytes(); - int nameIndex = iter.next2Bytes(); - int descIndex = iter.next2Bytes(); - int attribCount = iter.next2Bytes(); - //System.out.println("field attribute count:"+ attribCount); - - Field f = new Field(accessFlag, nameIndex, descIndex, pool); - - if (attribCount > 0) { - throw new RuntimeException("Field Attribute has not been implemented"); - } - - return f; - } - -} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java b/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 81c268cdc9..0000000000 --- a/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,56 +0,0 @@ -package task7.jvm.loader; - -import task7.jvm.util.Util; - -import java.util.Arrays; - -public class ByteCodeIterator { - - private int position; - - private byte[] bytes; - - public ByteCodeIterator(byte[] bytes) { - this.bytes = bytes; - } - - public String getMagicNumber() { - position = 0; - byte[] bytes = Arrays.copyOf(this.bytes, 4); - position += 4; - return Util.byteToHexString(bytes); - } - - public int next2Bytes() { - return nextBytes(2); - } - - public int next4Bytes() { - return nextBytes(4); - } - - public int nextFlag() { - return nextBytes(1); - } - - public void back(int length) { - position -= length; - } - - public byte[] getBytes(int length) { - byte[] bytes = Arrays.copyOfRange(this.bytes, position, position + length); - position += length; - return bytes; - } - - public String nextUxToHexString(int length) { - return new String(getBytes(length)); - } - - private int nextBytes(int size) { - byte[] bytes = Arrays.copyOfRange(this.bytes, position, position + size); - position += size; - return Util.byteToInt(bytes); - } - -} diff --git a/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java b/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 350d8b92f4..0000000000 --- a/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,122 +0,0 @@ -package task7.jvm.loader; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; -import task7.jvm.clz.ClassFile; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; - -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 < this.clzPaths.size(); i++) { - buffer.append(this.clzPaths.get(i)); - if (i < this.clzPaths.size() - 1) { - buffer.append(";"); - } - } - return buffer.toString(); - } - - private byte[] loadClassFile_V1(String clzFileName) { - - BufferedInputStream bis = null; - - try { - - File f = new File(clzFileName); - - - bis = new BufferedInputStream(new FileInputStream(f)); - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - - byte[] buffer = new byte[1024]; - int length = -1; - - while ((length = bis.read(buffer)) != -1) { - bos.write(buffer, 0, length); - } - - byte[] codes = bos.toByteArray(); - - return codes; - - } catch (IOException e) { - e.printStackTrace(); - - } finally { - if (bis != null) { - try { - bis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return null; - - } - - -} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java b/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java deleted file mode 100644 index eeea785114..0000000000 --- a/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java +++ /dev/null @@ -1,112 +0,0 @@ -package task7.jvm.loader; - -import task7.jvm.clz.AccessFlag; -import task7.jvm.clz.ClassFile; -import task7.jvm.clz.ClassIndex; -import task7.jvm.constant.*; -import task7.jvm.field.Field; -import task7.jvm.method.Method; - -import java.util.ArrayList; -import java.util.List; - -public class ClassFileParser { - - private ConstantPool constantPool; - - public ClassFile parse(byte[] codes) { - ClassFile classFile = new ClassFile(); - ByteCodeIterator iterator = new ByteCodeIterator(codes); - System.out.println(iterator.getMagicNumber()); - - classFile.setMinorVersion(iterator.next2Bytes()); - classFile.setMajorVersion(iterator.next2Bytes()); - - parseConstantPool(iterator); - classFile.setConstPool(constantPool); - classFile.setAccessFlag(parseAccessFlag(iterator)); - classFile.setClassIndex(parseClassIndex(iterator));//task5 over - - iterator.next2Bytes(); // interface - - classFile.setFields(parseFileds(iterator)); - classFile.setMethods(parseMethods(classFile, iterator));//task6 over - return classFile; - } - - - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - return new AccessFlag(iter.next2Bytes()); - } - - private ClassIndex parseClassIndex(ByteCodeIterator iter) { - ClassIndex clazIndex = new ClassIndex(); - clazIndex.setThisClassIndex(iter.next2Bytes()); - clazIndex.setSuperClassIndex(iter.next2Bytes()); - return clazIndex; - } - - private void parseConstantPool(ByteCodeIterator iter) { - int poolCount = iter.next2Bytes(); - ConstantPool pool = new ConstantPool(poolCount); - for (int i = 0; i < poolCount; i++) { - int tag = iter.nextFlag(); - if (tag == ConstantInfo.UTF8_INFO) { //utf-8 - int length = iter.next2Bytes(); - byte[] bytes = iter.getBytes(length); - UTF8Info utf8Info = new UTF8Info(pool); - utf8Info.setValue(new String(bytes)); - utf8Info.setLength(length); - pool.addConstantInfo(utf8Info); - } else if (tag == ConstantInfo.STRING_INFO) { - StringInfo stringInfo = new StringInfo(pool); - stringInfo.setIndex(iter.next2Bytes()); - pool.addConstantInfo(stringInfo); - } else if (tag == ConstantInfo.CLASS_INFO) { - ClassInfo classInfo = new ClassInfo(pool); - classInfo.setUtf8Index(iter.next2Bytes()); - pool.addConstantInfo(classInfo); - } else if (tag == ConstantInfo.FIELD_INFO) { - FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); - fieldRefInfo.setClassInfoIndex(iter.next2Bytes()); - fieldRefInfo.setNameAndTypeIndex(iter.next2Bytes()); - pool.addConstantInfo(fieldRefInfo); - } else if (tag == ConstantInfo.METHOD_INFO) { - MethodRefInfo methodRefInfo = new MethodRefInfo(pool); - methodRefInfo.setClassInfoIndex(iter.next2Bytes()); - methodRefInfo.setNameAndTypeIndex(iter.next2Bytes()); - pool.addConstantInfo(methodRefInfo); - } else if (tag == ConstantInfo.NAME_AND_TYPE_INFO) { - NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); - nameAndTypeInfo.setIndex1(iter.next2Bytes()); - nameAndTypeInfo.setIndex2(iter.next2Bytes()); - pool.addConstantInfo(nameAndTypeInfo); - } - } - this.constantPool = pool; - } - - private List parseFileds(ByteCodeIterator iter) { - int fieldCount = iter.next2Bytes(); - - List fieldList = new ArrayList<>(fieldCount); - - for (int i = 0; i < fieldCount; i++) { - Field f = Field.parse(constantPool, iter); - fieldList.add(f); - } - return fieldList; - } - - private List parseMethods(ClassFile classFile, ByteCodeIterator iter) { - int methodCount = iter.next2Bytes(); - - List methodList = new ArrayList<>(methodCount); - - for (int i = 0; i < methodCount; i++) { - Method m = Method.parse(classFile, iter); - methodList.add(m); - } - return methodList; - } -} diff --git a/group15/1507_977996067/src/task7/jvm/method/Method.java b/group15/1507_977996067/src/task7/jvm/method/Method.java deleted file mode 100644 index 13643df703..0000000000 --- a/group15/1507_977996067/src/task7/jvm/method/Method.java +++ /dev/null @@ -1,91 +0,0 @@ -package task7.jvm.method; - -import task7.jvm.attr.AttributeInfo; -import task7.jvm.attr.CodeAttr; -import task7.jvm.clz.ClassFile; -import task7.jvm.constant.ConstantPool; -import task7.jvm.constant.UTF8Info; -import task7.jvm.loader.ByteCodeIterator; - -public class Method { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private CodeAttr codeAttr; - - private ClassFile clzFile; - - - public ClassFile getClzFile() { - return clzFile; - } - - public int getNameIndex() { - return nameIndex; - } - - public int getDescriptorIndex() { - return descriptorIndex; - } - - public CodeAttr getCodeAttr() { - return codeAttr; - } - - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } - - public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - } - - - public String toString() { - - ConstantPool pool = this.clzFile.getConstantPool(); - StringBuilder buffer = new StringBuilder(); - - String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); - - buffer.append(name).append(":").append(desc).append("\n"); - - buffer.append(this.codeAttr.toString(pool)); - - return buffer.toString(); - } - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { - int accessFlag = iter.next2Bytes(); - int nameIndex = iter.next2Bytes(); - int descIndex = iter.next2Bytes(); - int attribCount = iter.next2Bytes(); - - - Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); - - for (int j = 1; j <= attribCount; j++) { - - int attrNameIndex = iter.next2Bytes(); - String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); - iter.back(2); - - if (AttributeInfo.CODE.equalsIgnoreCase(attrName)) { - CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); - m.setCodeAttr(codeAttr); - } else { - throw new RuntimeException("only CODE attribute is implemented , please implement the " + attrName); - } - - } - - return m; - - } -} diff --git a/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java b/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java deleted file mode 100644 index 3f4607a044..0000000000 --- a/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java +++ /dev/null @@ -1,44 +0,0 @@ -package task7.jvm.print; - -import task7.jvm.clz.ClassFile; -import task7.jvm.loader.ClassFileLoader; - -public class ClassFilePrinter { - ClassFile clzFile = null; - - public ClassFilePrinter(ClassFile clzFile) { - this.clzFile = clzFile; - } - - public void print() { - - if (clzFile.getAccessFlag().isPublicClass()) { - System.out.println("Access flag : public "); - } - System.out.println("Class Name:" + clzFile.getClassName()); - - System.out.println("Super Class Name:" + clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMinorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - cnstPoolPrinter.print(); - - - } - - public static void main(String[] args) { - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "com.coderising.jvm.test.EmployeeV1"; - - ClassFile clzFile = loader.loadClass(className); - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java deleted file mode 100644 index 40851fc1bf..0000000000 --- a/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java +++ /dev/null @@ -1,18 +0,0 @@ -package task7.jvm.print; - -import task7.jvm.constant.*; - -public interface ConstantInfoVisitor { - - void visitClassInfo(ClassInfo classInfo); - - void visitFieldRefInfo(FieldRefInfo fieldRefInfo); - - void visitMethodRefInfo(MethodRefInfo methodRefInfo); - - void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo); - - void visitStringInfo(StringInfo stringInfo); - - void visitUtf8Info(UTF8Info utf8Info); -} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java deleted file mode 100644 index 776d23bc79..0000000000 --- a/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -package task7.jvm.print; - -import task7.jvm.constant.*; - -public class ConstantInfoVisitorImpl implements ConstantInfoVisitor { - @Override - public void visitClassInfo(ClassInfo classInfo) { - StringBuilder sb = new StringBuilder(); - sb.append("Class\t#").append(classInfo.getUtf8Index()).append("\t").append(classInfo.getClassName()); - System.out.println(sb); - } - - @Override - public void visitFieldRefInfo(FieldRefInfo fieldRefInfo) { - StringBuilder sb = new StringBuilder(); - sb.append("FieldRef\t#").append(fieldRefInfo.getClassInfoIndex()).append("\t").append(fieldRefInfo.getFieldName()); - System.out.println(sb); - - } - - @Override - public void visitMethodRefInfo(MethodRefInfo methodRefInfo) { - StringBuilder sb = new StringBuilder(); - sb.append("MethodRef\t#").append(methodRefInfo.getMethodName()); - System.out.println(sb); - } - - @Override - public void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo) { - StringBuilder sb = new StringBuilder(); - sb.append("NameAndType\t#").append(nameAndTypeInfo.getName()).append("\t") - .append(nameAndTypeInfo.getIndex1()).append("\t") - .append(nameAndTypeInfo.getIndex2()).append("\t") - .append(nameAndTypeInfo.getTypeInfo()); - System.out.println(sb); - } - - @Override - public void visitStringInfo(StringInfo stringInfo) { - StringBuilder sb = new StringBuilder(); - sb.append("String\t#").append(stringInfo.getIndex()); - System.out.println(sb); - } - - @Override - public void visitUtf8Info(UTF8Info utf8Info) { - StringBuilder sb = new StringBuilder(); - sb.append("UTF8\t#").append(utf8Info.getValue()); - System.out.println(sb); - } -} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java b/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java deleted file mode 100644 index d6e87cad83..0000000000 --- a/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,26 +0,0 @@ -package task7.jvm.print; - -import task7.jvm.constant.ConstantInfo; -import task7.jvm.constant.ConstantPool; - -public class ConstantPoolPrinter { - - private ConstantPool pool; - - ConstantPoolPrinter(ConstantPool pool) { - this.pool = pool; - } - - public void print() { - - System.out.println("Constant Pool:"); - - ConstantInfoVisitor visitor = new ConstantInfoVisitorImpl(); - int size = (int) pool.getSize(); - for (int i = 0; i < size; i++) { - System.out.print("#" + i + "= "); - ConstantInfo constantInfo = pool.getConstantInfo(i); - constantInfo.accept(visitor); - } - } -} diff --git a/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java b/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java deleted file mode 100644 index 53bea9b04e..0000000000 --- a/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java +++ /dev/null @@ -1,191 +0,0 @@ -package task7.jvm.test; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import task7.jvm.clz.ClassFile; -import task7.jvm.clz.ClassIndex; -import task7.jvm.constant.*; -import task7.jvm.loader.ClassFileLoader; - -public class ClassFileloaderTest { - - - private static final String FULL_QUALIFIED_CLASS_NAME = "EmployeeV1"; - - static String path1 = "E:\\Idea\\coding2017\\group15\\1507_977996067\\out\\task5\\jvm\\test"; - static String path2 = "C:\temp"; - - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "EmployeeV1"; - - clzFile = loader.loadClass(className); -// clzFile.print(); - } - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1 + ";" + path2, clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1038, byteCodes.length); - - } - - - @Test - public void testMagicNumber() { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; - - String actualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", actualValue); - } - - - private String byteToHexString(byte[] codes) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } - - /** - * ---------------------------------------------------------------------- - */ - - - @Test - public void testVersion() { - - Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); - - } - - @Test - public void testConstantPool() { - - - ConstantPool pool = clzFile.getConstantPool(); - - Assert.assertEquals(53, pool.getSize()); - - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); - Assert.assertEquals(2, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); - } - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); - Assert.assertEquals(4, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); - Assert.assertEquals("java/lang/Object", utf8Info.getValue()); - } - { - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); - Assert.assertEquals("name", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(6); - Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(7); - Assert.assertEquals("age", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(8); - Assert.assertEquals("I", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(9); - Assert.assertEquals("", 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/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java b/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java deleted file mode 100644 index 866b94811a..0000000000 --- a/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,29 +0,0 @@ -package task7.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/group15/1507_977996067/src/task7/jvm/util/Util.java b/group15/1507_977996067/src/task7/jvm/util/Util.java deleted file mode 100644 index 60158ac03a..0000000000 --- a/group15/1507_977996067/src/task7/jvm/util/Util.java +++ /dev/null @@ -1,23 +0,0 @@ -package task7.jvm.util; - -public class Util { - public static int byteToInt(byte[] codes){ - String s1 = byteToHexString(codes); - return Integer.valueOf(s1, 16); - } - - - public static String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;iSimple Java application that includes a class with main() method \ No newline at end of file +Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group17/102228177/work2_26/.classpath b/group17/102228177/work2_26/.classpath index dfa83d7793..80437ca942 100644 --- a/group17/102228177/work2_26/.classpath +++ b/group17/102228177/work2_26/.classpath @@ -1,8 +1,8 @@ - - - - - - - - + + + + + + + + diff --git a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java index a0dc5262db..60949d043e 100644 --- a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java +++ b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java @@ -34,7 +34,7 @@ public static void main(String[] args) { // System.out.println(Arrays.toString(util.merge(a1, a2))); System.out.println(Arrays.toString(util.fibonacci(15))); -// System.out.println(Arrays.toString(util.getPrimes(23))); + System.out.println(Arrays.toString(util.getPrimes(23))); } /** @@ -115,15 +115,14 @@ public int[] grow(int [] oldArray, int size){ */ public int[] fibonacci(int max){ List list = new ArrayList(); - if (max <= 1) { - return new int[]{}; - } - int lo = 0; - int hi = 1; - while(hi clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - String name = ""; - for (int i = 0; i < className.length(); i++) { - if(className.charAt(i)=='.'){ - name += File.separatorChar; - }else{ - name += className.charAt(i); - } - } - File file = new File(getClassPath()+ File.separatorChar +name+".class"); - InputStream in = null; - ByteArrayOutputStream out = null; - try { - in = new FileInputStream(file); - out = new ByteArrayOutputStream(); - byte[] buff = new byte[1024*2]; - int len = 0; - while((len=in.read(buff))!=-1){ - out.write(buff, 0, len); - } - return out.toByteArray(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - finally { - if(in!=null){ - try { - in.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if(out!=null){ - try { - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - return null; - - - } - - - public void addClassPath(String path) { - clzPaths.add(path); - } - - - - public String getClassPath(){ - StringBuilder sb = new StringBuilder(); - for (String string : clzPaths) { - sb.append(string).append(";"); - } - sb = sb.deleteCharAt(sb.length()-1); - return sb.toString(); - } -} \ No newline at end of file diff --git a/group17/102228177/work3_26/src/com/coderising/jvm/test/EmployeeV1.java b/group17/102228177/work3_26/src/com/coderising/jvm/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group17/102228177/work3_26/src/com/coderising/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrame.java b/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrame.java deleted file mode 100644 index 839a34013f..0000000000 --- a/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrame.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.coding.basic.linklist; -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(); - } -} \ No newline at end of file diff --git a/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java deleted file mode 100644 index c323d03b3f..0000000000 --- a/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic.linklist; - -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()); - } - -} \ No newline at end of file diff --git a/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java index ee2a7fd554..22a72affaf 100644 --- a/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java +++ b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java @@ -292,19 +292,22 @@ public void removeRange(int min, int max){ throw new RuntimeException("LinkedList is empty!"); }else{ Node q = head; - Node p = head.next; + //头判断 + if((int)q.data>min && (int)q.datamin && (int)p.data 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/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 65475e194c..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 7f05870020..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 402f9dec86..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 936736016f..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - -} diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index f1f8eb4ed4..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index 5cac9f04f7..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 8334e80b63..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.Arrays; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - byte[] codes; - int pos = 0; - ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - public byte[] getBytes(int len) { - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public int nextU1toInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextU4ToHexString() { - return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } -} diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 81264ceed7..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.coderising.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 com.coderising.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(){ - - 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/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java b/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java b/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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= maxLen){ - grow(); - } - elements[size] = o; - size++; - } - - /** - * 数组扩容 - */ - private void grow(){ - maxLen = maxLen + (maxLen >> 1); - Object[] newArr = new Object[maxLen]; - System.arraycopy(elements, 0, newArr, 0, size); - elements = newArr; - } - - /** - * 在指定索引处添加元素 - * @param i 指定索引 - * @param o 添加元素 - */ - public void add(int i,Object o){ - //判断插入位置大于数组实际长度 - if(i > size){ - size = i; - if(size >= maxLen){//数组大小大于数组最大容量则需要扩容 - grow(); - } - } - //插入位置不大于数组实际长度时,将插入位置的元素向后移。 - for (int j = size; j > i ; j++) { - elements[j] = elements[j-1]; - } - elements[i] = o; - size++; - } - - /** - * 获取传入索引的元素 - * @param index 索引 - * @return 返回传入索引的元素 - */ - public Object get(int index){ - //索引不在实际范围内 - if(index < 0||index >= size){ - throw new ArrayIndexOutOfBoundsException(); - } - for (int i = 0; i < size; i++) { - return elements[index]; - } - return null; - } - - /** - * 删除指定索引元素并返回 - * @param index - * @return 该索引处元素 - */ - public Object remove(int index){ - //索引不在实际范围内 - if(index < 0||index >= size){ - throw new ArrayIndexOutOfBoundsException(); - }else{ - for (int j = index; j < size-1; j++) { - elements[j]=elements[j+1]; - } - size--; - return elements[index]; - } - } - - /** - * 获取大小 - * @return - */ - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator{ - int cursor; - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - int i = cursor; - if(i >= size){ - throw new NoSuchElementException(); - } - if (i >= elements.length){ - throw new ConcurrentModificationException(); - } - cursor = i+1; - return elements[i]; - } - } - - public static void main(String[] args) { - ArrayList list = new ArrayList(); - list.add(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(6, 6); - list.remove(3); - for (int i = 0; i < list.size(); i++) { - System.out.println(i+":"+list.get(i)); - } - - Iterator it = list.iterator(); - while (it.hasNext()) { - System.out.println(it.next()); - } - } -} diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java deleted file mode 100644 index f51a971a1c..0000000000 --- a/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic.stack; - -public interface Iterator { - - public boolean hasNext(); - public Object next(); - -} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/List.java b/group17/102228177/work4_09/src/com/coding/basic/stack/List.java deleted file mode 100644 index 2d2c693e0d..0000000000 --- a/group17/102228177/work4_09/src/com/coding/basic/stack/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic.stack; - -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java deleted file mode 100644 index 42b6362e2f..0000000000 --- a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.basic.stack; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData; - private int elementCount; - - public Stack() { - this.elementData = new ArrayList(); - this.elementCount = 0; - } - public void push(Object o){ - elementData.add(o); - elementCount++; - } - - public Object pop(){ - Object object = elementData.remove(elementCount-1); - elementCount--; - return object; - } - - public Object peek(){ - if(isEmpty()){ - throw new EmptyStackException(); - } - return elementData.get(elementCount-1); - } - public boolean isEmpty(){ - return elementCount==0; - } - public int size(){ - return elementCount; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i = 0; i < elementData.size(); i++) { - sb.append(elementData.get(i)).append(","); - } - sb = sb.deleteCharAt(sb.length()-1); - sb.append("]"); - return sb.toString(); - } -} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java deleted file mode 100644 index 5b8019e2b7..0000000000 --- a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.coding.basic.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) { - if(s.isEmpty()){ - return ; - } - int temp1 = (int) s.pop(); - reverse(s); - if(s.isEmpty()){ - s.push(temp1); - return ; - } - int temp2 = (int) s.pop(); - reverse(s); - s.push(temp1); - reverse(s); - s.push(temp2); - } - - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s,Object o) { - if(s.isEmpty()){ - return ; - } - Stack stack = new Stack(); - while(!s.isEmpty()){ - Object pop = s.pop(); - if(!pop.equals(o)){ - stack.push(pop); - } - } - while(!stack.isEmpty()){ - s.push(stack.pop()); - } - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param len - * @return - */ - public static Object[] getTop(Stack s,int len) { - int i = 0; - Stack stack = new Stack(); - Object[] objects = new Object[len]; - while(i < len){ - Object o = s.pop(); - stack.push(o); - objects[i] = o; - i++; - } - while(!stack.isEmpty()){ - s.push(stack.pop()); - } - return objects; - } - /** - * 字符串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){ - Stack stack = new Stack(); - for (int i = 0; i < s.length(); i++) { - char c = s.charAt(i); - switch (c) { - case '(': - case '[': - case '{': - stack.push(c); - break; - case ')': - if((char)stack.pop()!='('){ - return false; - } - break; - case ']': - if((char)stack.pop()!='['){ - return false; - } - break; - case '}': - if((char)stack.pop()!='{'){ - return false; - } - break; - } - } - if(stack.isEmpty()){ - return true; - } - return false; - } - - -} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java deleted file mode 100644 index 722dd25846..0000000000 --- a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coding.basic.stack; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class StackUtilTest { - Stack stack ; - { - stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - } - @Before - public void setUp() throws Exception { - - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testReverse() { - StackUtil.reverse(stack); - Assert.assertEquals("[5,4,3,2,1]", stack.toString()); - } - @Test - public void testRemove() { - StackUtil.remove(stack, 3); - Assert.assertEquals("[1,2,4,5]", stack.toString()); - } - @Test - public void testGetTop(){ - Assert.assertEquals(new Object[]{5,4}, StackUtil.getTop(stack, 2)); - Assert.assertEquals("[1,2,3,4,5]", stack.toString()); - } -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 88f60c77f6..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index a334a13d81..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - int maxStack = iter.nextU2ToInt(); - int maxLocals = iter.nextU2ToInt(); - int codeLen = iter.nextU4ToInt(); - - String code = iter.nextUxToHexString(codeLen); - - System.out.println(code); - - //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); - - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); - - int exceptionTableLen = iter.nextU2ToInt(); - //TODO 处理exception - if(exceptionTableLen>0){ - String exTable = iter.nextUxToHexString(exceptionTableLen); - System.out.println("Encountered exception table , just ignore it :" + exTable); - - } - - - int subAttrCount = iter.nextU2ToInt(); - - for(int x=1; x<=subAttrCount; x++){ - int subAttrIndex = iter.nextU2ToInt(); - String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); - - //已经向前移动了U2, 现在退回去。 - iter.back(2); - //line item table - if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ - - LineNumberTable t = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(t); - } - else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ - LocalVariableTable t = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(t); - } - else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ - StackMapTable t = StackMapTable.parse(iter); - codeAttr.setStackMapTable(t); - } - else{ - throw new RuntimeException("Need code to process " + subAttrName); - } - - - } - - return codeAttr; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Code:").append(code).append("\n"); - /*for(int i=0;i items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - - LineNumberTable table = new LineNumberTable(index,len); - - int itemLen = iter.nextU2ToInt(); - - for(int i=1; i<=itemLen; i++){ - LineNumberItem item = new LineNumberItem(); - item.setStartPC(iter.nextU2ToInt()); - item.setLineNum(iter.nextU2ToInt()); - table.addLineNumberItem(item); - } - return table; - } - - public String toString(){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Line Number Table:\n"); - for(LineNumberItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("lineNum:"+item.getLineNum()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - - } - - - -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 962c3b8bc4..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 88f677b2c8..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.jvm.attr; - - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo{ - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - - LocalVariableTable table = new LocalVariableTable(index,len); - - int itemLen = iter.nextU2ToInt(); - - for(int i=1; i<=itemLen; i++){ - LocalVariableItem item = new LocalVariableItem(); - item.setStartPC(iter.nextU2ToInt()); - item.setLength(iter.nextU2ToInt()); - item.setNameIndex(iter.nextU2ToInt()); - item.setDescIndex(iter.nextU2ToInt()); - item.setIndex(iter.nextU2ToInt()); - table.addLocalVariableItem(item); - } - return table; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index 18f2ad0360..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java deleted file mode 100644 index faae056835..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java deleted file mode 100644 index 4755266987..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java deleted file mode 100644 index e424f284b3..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java deleted file mode 100644 index af1e6bc65f..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.coderising.jvm.constant; - -/** - - * @Description 类常量信息 - - * @author REEFE - - * @time 2017年4月9日 - - */ -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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java deleted file mode 100644 index 855b581f95..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.coderising.jvm.constant; - -/** - - * @Description 常见常量项 - - * @author REEFE - - * @time 2017年4月9日 - - */ -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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java deleted file mode 100644 index d4f91262b8..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.constant; - -import java.util.ArrayList; -import java.util.List; - - -/** - - * @Description:常量池 - - * @author:REEFE - - * @time:2017年4月9日 - - */ -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/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 65475e194c..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 7f05870020..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 402f9dec86..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 936736016f..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index f1f8eb4ed4..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index 5cac9f04f7..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java b/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java deleted file mode 100644 index 7bc2656653..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public String toString() { - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - return name +":"+ desc; - } - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); - - Field f = new Field(accessFlag, nameIndex, descIndex,pool); - - if(attribCount > 0){ - throw new RuntimeException("Field Attribute has not been implemented"); - } - - return f; - } -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 2eb83f3983..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.Arrays; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - byte[] codes; - int pos = 0; - ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - public byte[] getBytes(int len) { - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public int nextU1toInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextU4ToHexString() { - return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } -} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 81264ceed7..0000000000 --- a/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.coderising.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 com.coderising.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(){ - - StringBuffer buffer = new StringBuffer(); - for(int i=0;i= maxLen){ - grow(); - } - elements[size] = o; - size++; - } - - /** - * 数组扩容 - */ - private void grow(){ - maxLen = maxLen + (maxLen >> 1); - Object[] newArr = new Object[maxLen]; - System.arraycopy(elements, 0, newArr, 0, size); - elements = newArr; - } - - /** - * 在指定索引处添加元素 - * @param i 指定索引 - * @param o 添加元素 - */ - public void add(int i,Object o){ - //判断插入位置大于数组实际长度 - if(i > size){ - size = i; - if(size >= maxLen){//数组大小大于数组最大容量则需要扩容 - grow(); - } - } - //插入位置不大于数组实际长度时,将插入位置的元素向后移。 - for (int j = size; j > i ; j++) { - elements[j] = elements[j-1]; - } - elements[i] = o; - size++; - } - - /** - * 获取传入索引的元素 - * @param index 索引 - * @return 返回传入索引的元素 - */ - public Object get(int index){ - //索引不在实际范围内 - if(index < 0||index >= size){ - throw new ArrayIndexOutOfBoundsException(); - } - for (int i = 0; i < size; i++) { - return elements[index]; - } - return null; - } - - /** - * 删除指定索引元素并返回 - * @param index - * @return 该索引处元素 - */ - public Object remove(int index){ - //索引不在实际范围内 - if(index < 0||index >= size){ - throw new ArrayIndexOutOfBoundsException(); - }else{ - for (int j = index; j < size-1; j++) { - elements[j]=elements[j+1]; - } - size--; - return elements[index]; - } - } - - /** - * 获取大小 - * @return - */ - public int size(){ - return size; - } - - public Iterator iterator(){ - return new ArrayListIterator(); - } - - private class ArrayListIterator implements Iterator{ - int cursor; - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - int i = cursor; - if(i >= size){ - throw new NoSuchElementException(); - } - if (i >= elements.length){ - throw new ConcurrentModificationException(); - } - cursor = i+1; - return elements[i]; - } - } - - public static void main(String[] args) { - ArrayList list = new ArrayList(); - list.add(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(6, 6); - list.remove(3); - for (int i = 0; i < list.size(); i++) { - System.out.println(i+":"+list.get(i)); - } - - Iterator it = list.iterator(); - while (it.hasNext()) { - System.out.println(it.next()); - } - } -} diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java deleted file mode 100644 index a092602897..0000000000 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.coding.basic.stack; -import java.util.List; -import java.util.Stack; -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - - Stack opStack = new Stack<>(); - Stack numStack = new Stack<>(); - - for(Token token : tokens){ - - if (token.isOperator()){ - - if(opStack.isEmpty()){ - - opStack.push(token); - } else{ - - while(!opStack.isEmpty() - && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(), f1,f2); - numStack.push(result); - - } - opStack.push(token); - } - } - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - - while(!opStack.isEmpty()){ - Token token = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(), f1,f2)); - } - - - return numStack.pop().floatValue(); - } - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - - -} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java deleted file mode 100644 index 7774cf98b0..0000000000 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coding.basic.stack; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - -} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java deleted file mode 100644 index f51a971a1c..0000000000 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic.stack; - -public interface Iterator { - - public boolean hasNext(); - public Object next(); - -} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/List.java b/group17/102228177/work4_16/src/com/coding/basic/stack/List.java deleted file mode 100644 index 2d2c693e0d..0000000000 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coding.basic.stack; - -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java deleted file mode 100644 index 42b6362e2f..0000000000 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.basic.stack; - -import java.util.EmptyStackException; - -public class Stack { - private ArrayList elementData; - private int elementCount; - - public Stack() { - this.elementData = new ArrayList(); - this.elementCount = 0; - } - public void push(Object o){ - elementData.add(o); - elementCount++; - } - - public Object pop(){ - Object object = elementData.remove(elementCount-1); - elementCount--; - return object; - } - - public Object peek(){ - if(isEmpty()){ - throw new EmptyStackException(); - } - return elementData.get(elementCount-1); - } - public boolean isEmpty(){ - return elementCount==0; - } - public int size(){ - return elementCount; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i = 0; i < elementData.size(); i++) { - sb.append(elementData.get(i)).append(","); - } - sb = sb.deleteCharAt(sb.length()-1); - sb.append("]"); - return sb.toString(); - } -} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java deleted file mode 100644 index 33fd75f6f1..0000000000 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.coding.basic.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) { - if(!s.isEmpty()){ - Object last = getBottom(s,s.pop()); - reverse(s); - s.push(last); - } - } - - private static Object getBottom(Stack s,Object t){ - if(s.isEmpty()){ - return t; - } - Object last = getBottom(s, s.pop()); - s.push(t); - return last; - } - /** - * 删除栈中的某个元素 注意:只能使用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; - } - - public static void main(String[] args) { - Stack stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - reverse(stack); - System.out.println(stack); - } - -} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java deleted file mode 100644 index 364fe104f5..0000000000 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.coding.basic.stack; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - - -} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java b/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java deleted file mode 100644 index c45a23aed1..0000000000 --- a/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.coding.basic.stack; -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} \ No newline at end of file diff --git a/group17/1158154002/.classpath b/group17/1158154002/.classpath index 44f39c3ace..2d7497573f 100644 --- a/group17/1158154002/.classpath +++ b/group17/1158154002/.classpath @@ -3,7 +3,5 @@ - - diff --git a/group17/1158154002/src/test04/loader/ClassFileLoader.java b/group17/1158154002/src/test04/loader/ClassFileLoader.java deleted file mode 100644 index 0f144fbb43..0000000000 --- a/group17/1158154002/src/test04/loader/ClassFileLoader.java +++ /dev/null @@ -1,61 +0,0 @@ -package test04.loader; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; - - -public class ClassFileLoader { - private List clzPaths = new ArrayList(); - - - public byte[] readBinaryCode(String className) { - className=className.replace(".", File.separator)+".class"; - for (String path : clzPaths) { - String clzFileName=path+File.separator+className; - byte[] codes=loadClassFile(clzFileName); - if (codes!=null) { - return codes; - } - } - return null; - - - } - - private byte[] loadClassFile(String clzFileName) { - File file=new File(clzFileName); - try { - return IOUtils.toByteArray(new FileInputStream(file)); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - return null; - } - - } - - - - public void addClassPath(String path) { - if (this.clzPaths.contains(path)) { - return; - } - this.clzPaths.add(path); - } - - public String getClassPath_V1(){ - - return null; - } - - public String getClassPath(){ - return StringUtils.join(this.clzPaths,";"); - } -} diff --git a/group17/1158154002/src/test04/loader/ClassFileloaderTest.java b/group17/1158154002/src/test04/loader/ClassFileloaderTest.java deleted file mode 100644 index 8897e72c91..0000000000 --- a/group17/1158154002/src/test04/loader/ClassFileloaderTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package test04.loader; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class ClassFileloaderTest { - - static String path1 = "D:/mygit/coding2017/group17/1158154002/bin/"; - static String path2 = "file:/"; - - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - System.out.println(clzPath); - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "test04.loader.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1036, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "test04.loader.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i { - private ArrayList elementData = new ArrayList(); - - public void push(T o){ - elementData.add(o); - } - - public T pop(){ - return elementData.remove(size()-1); - } - - public T peek(){ - if (size()>0) { - return elementData.get(size()-1); - } else { - return null; - } - - } - - public boolean isEmpty(){ - return elementData.size()==0; - } - - public int size(){ - return elementData.size(); - } - - @Override - public String toString() { - StringBuffer sb=new StringBuffer(); - while (peek()!=null) { - sb.append(pop()).append(","); - } - - return sb.substring(0, sb.length()-1); - } - -} diff --git a/group17/1158154002/src/test05/stack/StackTest.java b/group17/1158154002/src/test05/stack/StackTest.java deleted file mode 100644 index a5d6b39344..0000000000 --- a/group17/1158154002/src/test05/stack/StackTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package test05.stack; - -import java.util.Arrays; - -import org.junit.Test; - -public class StackTest { - @Test - public void testReverse(){ - Stack stack=new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - - StackUtil.reverse(stack); - System.out.println(stack.toString()); - } - - @Test - public void testRemove(){ - Stack stack=new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - - StackUtil.remove(stack,3); - System.out.println(stack.toString()); - } - //isValidPairs - @Test - public void testGetTop(){ - Stack stack=new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - - System.out.println(Arrays.toString(StackUtil.getTop(stack,6))); - System.out.println(stack.toString()); - } - - @Test - public void testIsValidPairs(){ - System.out.println(StackUtil.isValidPairs("([e{d}f])")); - System.out.println(StackUtil.isValidPairs("([b{x]y})")); - } -} diff --git a/group17/1158154002/src/test05/stack/StackUtil.java b/group17/1158154002/src/test05/stack/StackUtil.java deleted file mode 100644 index 2904bec41c..0000000000 --- a/group17/1158154002/src/test05/stack/StackUtil.java +++ /dev/null @@ -1,151 +0,0 @@ -package test05.stack; - - - -public class StackUtil { - /** - * 假设栈中的元素是T, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param - */ - public static void reverse(Stack s) { - Stack temp=new Stack(); - while (s.peek()!=null) { - temp.push(s.pop()); - } - Stack temp2=new Stack(); - while (temp.peek()!=null) { - temp2.push(temp.pop()); - } - while (temp2.peek()!=null) { - s.push(temp2.pop()); - } - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s,Object o) { - Stack temp=new Stack(); - while (s.peek()!=null) { - Object obj=s.pop(); - if (!obj.equals(o)) { - temp.push(obj); - } - } - while (temp.peek()!=null) { - s.push(temp.pop()); - } - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param len - * @return - * @throws Exception - */ - public static Object[] getTop(Stack s,int len) { - if (len<=s.size()) { - Stack temp=new Stack(); - Object[] result=new Object[len]; - for (int i = 0; i < s.size(); i++) { - Object o=s.pop(); - temp.push(o); - if (i= 0; i--) { -// char c = s.charAt(i); -// if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { -// s2.push(c); -// } -// } -// -// for (int i = 0; i < s1.size() / 2; i++) { -// char a = (char) s1.pop(); -// char b = (char) s2.pop(); -// if (a == '(' && b != ')') { -// return false; -// } else if (a == ')' && b != '(') { -// return false; -// } else if (a == '[' && b != ']') { -// return false; -// } else if (a == ']' && b != '[') { -// return false; -// } else if (a == '{' && b != '}') { -// return false; -// } else if (a == '}' && b != '{') { -// return false; -// } -// } -// -// return true; -// } - -public static boolean isValidPairs(String s){ - - Stack stack = new Stack(); - for(int i=0;i symbol = new Stack<>(); - Stack num = new Stack<>(); - - for (int i = 0; i < str.length; i++) { - num.push(Float.valueOf(str[i])); - } - - for (int i = 0; i < expr.length(); i++) { - char c = expr.charAt(i); - if (c == '+' || c == '-' || c == '*' || c == '/') { - symbol.push(c); - } - } - // 逆置 - StackUtil.reverse(symbol); - StackUtil.reverse(num); - - // 取数,符号计算 - float result = 0; - while (num.size() > 1) { - float a = num.pop(); - float b = num.pop(); - - char s1 = symbol.pop(); - char s2 = ' '; - if (symbol.size() > 0) { - s2 = symbol.pop(); - if (s1 == '*') { - result = a * b; - symbol.push(s2); - } else if (s1 == '/') { - result = a / b; - symbol.push(s2); - } else if (s2 != ' ') { - if (s2 == '*' || s2 == '/') { - if (s2 == '*') { - result = b * num.pop(); - } else if (s2 == '/') { - result = b / num.pop(); - } - if (s1 == '+') { - result = a + result; - } else if (s1 == '-') { - result = a - result; - } - } else { - if (s1 == '+') { - result = a + b; - symbol.push(s2); - } else if (s1 == '-') { - result = a - b; - symbol.push(s2); - } - } - } - num.push(result); - System.out.println(result); - } else { - if (s1 == '+') { - result = a + b; - } else if (s1 == '-') { - result = a - b; - } else if (s1 == '*') { - result = a * b; - } else if (s1 == '/') { - result = a / b; - } - System.out.println(result); - } - } - - return result; - } -} diff --git a/group17/1158154002/src/test06/expr/InfixExprTest.java b/group17/1158154002/src/test06/expr/InfixExprTest.java deleted file mode 100644 index 5c03c1a06d..0000000000 --- a/group17/1158154002/src/test06/expr/InfixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package test06.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } -// - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } -} diff --git a/group17/1158154002/src/test07/expr/InfixToPostfix.java b/group17/1158154002/src/test07/expr/InfixToPostfix.java deleted file mode 100644 index e88f211eb8..0000000000 --- a/group17/1158154002/src/test07/expr/InfixToPostfix.java +++ /dev/null @@ -1,56 +0,0 @@ -package test07.expr; - -import java.util.ArrayList; -import java.util.List; - -import test05.stack.Stack; - -public class InfixToPostfix { - // 2+3*4-8/2 2 3 4 * + 8 2 / - - // 2+3*4-8/2+3 - // 2+3*4*5*5-8/2 2 3 4 * 5 * 5 * + 8 2 / - - // 2+3*4*5*5-8/2/2 2 3 4 * 5 * 5 * + 8 2 / - - public static List convert(String expr) { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - List result = new ArrayList(); - - Stack opStack = new Stack<>(); - for (Token token : tokens) { - - if (token.isOperator()) { - - if (opStack.isEmpty()) { - opStack.push(token); - } else { - - if (token.hasHigherPriority()&&!opStack.peek().hasHigherPriority()) { - opStack.push(token); - } else if (!token.hasHigherPriority()&&opStack.peek().hasHigherPriority()) { - if (opStack.size() > 1) { - while (opStack.size() > 0) { - result.add(opStack.pop()); - } - } - opStack.push(token); - } - else { - result.add(token); - } - } - } - if (token.isNumber()) { - result.add(token); - } - } - while (opStack.size() > 0) { - result.add(opStack.pop()); - } - for (Token token : result) { - System.out.print(token.value + " "); - } - System.out.println(); - return result; - } -} diff --git a/group17/1158154002/src/test07/expr/InfixToPostfixTest.java b/group17/1158154002/src/test07/expr/InfixToPostfixTest.java deleted file mode 100644 index eb11aae32d..0000000000 --- a/group17/1158154002/src/test07/expr/InfixToPostfixTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package test07.expr; - -public class InfixToPostfixTest { - - public static void main(String[] args) { - //2+3*4-8/2 - //2+3*4*5*5-8/2 - InfixToPostfix.convert("2+3*4*5*5-8/2/2"); - InfixToPostfix.convert("2+3"); - } - -} diff --git a/group17/1158154002/src/test07/expr/PostfixExpr.java b/group17/1158154002/src/test07/expr/PostfixExpr.java deleted file mode 100644 index 5e4e35433c..0000000000 --- a/group17/1158154002/src/test07/expr/PostfixExpr.java +++ /dev/null @@ -1,48 +0,0 @@ -package test07.expr; - -import java.util.List; -import java.util.Stack; - -public class PostfixExpr { - String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - Stack numStack = new Stack<>(); - - for(Token token : tokens){ - - if (token.isOperator()){ - Float f2=numStack.pop(); - Float f1=numStack.pop(); - numStack.push(calculate(token.toString(), f1, f2)); - } - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - - return numStack.pop().floatValue(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } -} diff --git a/group17/1158154002/src/test07/expr/PostfixExprTest.java b/group17/1158154002/src/test07/expr/PostfixExprTest.java deleted file mode 100644 index 11e17fc804..0000000000 --- a/group17/1158154002/src/test07/expr/PostfixExprTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package test07.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } -} diff --git a/group17/1158154002/src/test07/expr/PrefixExpr.java b/group17/1158154002/src/test07/expr/PrefixExpr.java deleted file mode 100644 index c02253ab1c..0000000000 --- a/group17/1158154002/src/test07/expr/PrefixExpr.java +++ /dev/null @@ -1,49 +0,0 @@ -package test07.expr; - -import java.util.List; -import java.util.Stack; - -import test05.stack.StackUtil; - -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - Stack numStack = new Stack<>(); - - for (int i = tokens.size()-1; i >=0; i--) { - Token token=tokens.get(i); - if (token.isOperator()){ - Float f2=numStack.pop(); - Float f1=numStack.pop(); - numStack.push(calculate(token.toString(), f2, f1)); - } - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - return numStack.pop().floatValue(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } -} diff --git a/group17/1158154002/src/test07/expr/PrefixExprTest.java b/group17/1158154002/src/test07/expr/PrefixExprTest.java deleted file mode 100644 index 04ed04ad0a..0000000000 --- a/group17/1158154002/src/test07/expr/PrefixExprTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package test07.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } -} diff --git a/group17/1158154002/src/test07/expr/Token.java b/group17/1158154002/src/test07/expr/Token.java deleted file mode 100644 index 7cd540bb3d..0000000000 --- a/group17/1158154002/src/test07/expr/Token.java +++ /dev/null @@ -1,54 +0,0 @@ -package test07.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - public boolean hasHigherPriority(){ - if(!this.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) -1 > 0; - } -} diff --git a/group17/1158154002/src/test07/expr/TokenParser.java b/group17/1158154002/src/test07/expr/TokenParser.java deleted file mode 100644 index 7e3a4db91b..0000000000 --- a/group17/1158154002/src/test07/expr/TokenParser.java +++ /dev/null @@ -1,55 +0,0 @@ -package test07.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group17/1158154002/src/test07/expr/TokenParserTest.java b/group17/1158154002/src/test07/expr/TokenParserTest.java deleted file mode 100644 index 926a03e70e..0000000000 --- a/group17/1158154002/src/test07/expr/TokenParserTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package test07.expr; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } -} diff --git a/group17/1204187480/code/homework/basic/pom.xml b/group17/1204187480/code/homework/basic/pom.xml new file mode 100644 index 0000000000..17b2dea49e --- /dev/null +++ b/group17/1204187480/code/homework/basic/pom.xml @@ -0,0 +1,12 @@ + + 4.0.0 + basic + + com.coding + parent + 1.0-SNAPSHOT + ../parent/pom.xml + + + \ No newline at end of file diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java similarity index 95% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java rename to group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java index cbe1f87a05..d09d63c2fa 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java @@ -1,111 +1,108 @@ -package com.coding.basic.array; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - private Iterator iterator = new ArrayListIterator(); - - private int length() { - return elementData.length; - } - - private static final int ENLARGE_LENGTH = 100; - - private Object[] enlarge(Object[] origin) { - return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH); - } - - private void enLargeElementData() { - if (size == length()) { - elementData = enlarge(elementData); - } - } - - public void add(Object o) { - enLargeElementData(); - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - checkForAdd(index); - enLargeElementData(); - // 备份 index 处及后面的数据 - Object[] elementsBehindIndex = backBehindElements(elementData, index); - // 给index处 设值 - elementData[index] = o; - // 追加 备份的数据 - appendElement(elementData, index, elementsBehindIndex); - size++; - } - - private void appendElement(Object[] origin, int pos, Object[] append) { - System.arraycopy(append, 0, origin, pos, append.length); - } - - private Object[] backBehindElements(Object[] elementData, int index) { - int backSize = size - index; - Object[] back = new Object[backSize]; - System.arraycopy(elementData, index, back, 0, backSize); - return back; - } - - public Object get(int index) { - checkIndex(index); - return elementData[index]; - } - - private void checkIndex(int index) { - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - private void checkForAdd(int index) { - if (index < 0 || index > size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - public Object remove(int index) { - checkIndex(index); - Object[] back = backBehindElements(elementData, index + 1); - System.arraycopy(back, 0, elementData, index, back.length); - Object ret = elementData[index]; - elementData[index] = null; - size--; - return ret; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return iterator; - } - - private class ArrayListIterator implements Iterator { - - int next = 0; - - @Override - public boolean hasNext() { - return next < size; - } - - @Override - public Object next() { - return elementData[next++]; - } - } - -} +package com.coding.basic; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private Iterator iterator = new ArrayListIterator(); + + private int length() { + return elementData.length; + } + + private static final int ENLARGE_LENGTH = 100; + + private Object[] enlarge(Object[] origin) { + return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH); + } + + private void enLargeElementData() { + if (size == length()) { + elementData = enlarge(elementData); + } + } + + public void add(Object o) { + enLargeElementData(); + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + checkForAdd(index); + enLargeElementData(); + // 备份 index 处及后面的数据 + Object[] elementsBehindIndex = backBehindElements(elementData, index); + // 给index处 设值 + elementData[index] = o; + // 追加 备份的数据 + appendElement(elementData, index, elementsBehindIndex); + size++; + } + + private void appendElement(Object[] origin, int pos, Object[] append) { + System.arraycopy(append, 0, origin, pos, append.length); + } + + private Object[] backBehindElements(Object[] elementData, int index) { + int backSize = size - index; + Object[] back = new Object[backSize]; + System.arraycopy(elementData, index, back, 0, backSize); + return back; + } + + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + private void checkForAdd(int index) { + if (index < 0 || index > size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + public Object remove(int index) { + checkIndex(index); + Object[] back = backBehindElements(elementData, index + 1); + System.arraycopy(back, 0, elementData, index, back.length); + Object ret = elementData[index]; + elementData[index] = null; + size--; + return ret; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return iterator; + } + + private class ArrayListIterator implements Iterator { + + int next = 0; + + @Override + public boolean hasNext() { + return next < size; + } + + @Override + public Object next() { + return elementData[next++]; + } + } + +} diff --git a/group24/Homework/1-FirstWeek/BinaryTreeNode.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java similarity index 94% rename from group24/Homework/1-FirstWeek/BinaryTreeNode.java rename to group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java index d7ac820192..266eff3d56 100644 --- a/group24/Homework/1-FirstWeek/BinaryTreeNode.java +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -1,32 +1,32 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/Iterator.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/Iterator.java rename to group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java similarity index 98% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java rename to group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java index d9c4ee3c7b..c0cce5af0a 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java @@ -1,7 +1,4 @@ -package com.coding.basic.linklist; - -import com.coding.basic.Iterator; -import com.coding.basic.List; +package com.coding.basic; public class LinkedList implements List { diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java similarity index 95% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java rename to group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java index ef939ae2cc..0a09990083 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java @@ -1,10 +1,10 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - public Iterator iterator(); -} +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java similarity index 87% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java rename to group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java index e333496198..10560f969e 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java @@ -1,24 +1,24 @@ -package com.coding.basic; - -import com.coding.basic.linklist.LinkedList; - -public class Queue { - - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return elementData.remove(0); - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return elementData.size(); - } -} +package com.coding.basic; + +import java.util.Arrays; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.remove(0); + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java similarity index 93% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java rename to group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java index 7336dccfe9..998ddf9768 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java +++ b/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java @@ -1,32 +1,30 @@ -package com.coding.basic; - -import com.coding.basic.array.ArrayList; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (isEmpty()) { - throw new IllegalStateException("the stack is empty"); - } - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - if (isEmpty()) { - throw new IllegalStateException("the stack is empty"); - } - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) { + throw new IllegalStateException("the stack is empty"); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if (isEmpty()) { + throw new IllegalStateException("the stack is empty"); + } + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java similarity index 95% rename from group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java rename to group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java index eb41a7e262..6c96193d82 100644 --- a/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java +++ b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java @@ -1,22 +1,22 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArraysTest { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - - @Test - public void testCopyOf(){ - Object[] a = new Object[]{1, 2, 3, 4}; - Object[] b = Arrays.copyOf(a, 10); - logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b)); - } -} +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArraysTest { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Test + public void testCopyOf(){ + Object[] a = new Object[]{1, 2, 3, 4}; + Object[] b = Arrays.copyOf(a, 10); + logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b)); + } +} diff --git a/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java similarity index 95% rename from group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java rename to group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java index efc4022378..6a23cb125e 100644 --- a/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java +++ b/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java @@ -1,24 +1,24 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class SystemTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - public void testArrayCopy() { - int[] a = new int[]{1, 2, 3, 4, 5, 6, 7}; - int[] b = new int[]{11, 22, 33, 44, 55, 66, 77}; - System.arraycopy(a, 2, b, 4, 3); - logger.info("b={}", Arrays.toString(b)); - - } -} +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class SystemTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Test + public void testArrayCopy() { + int[] a = new int[]{1, 2, 3, 4, 5, 6, 7}; + int[] b = new int[]{11, 22, 33, 44, 55, 66, 77}; + System.arraycopy(a, 2, b, 4, 3); + logger.info("b={}", Arrays.toString(b)); + + } +} diff --git a/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java similarity index 93% rename from group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java rename to group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java index fba6895d09..656ff54c06 100644 --- a/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java +++ b/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java @@ -1,36 +1,35 @@ -package com.coding.basic; - -import com.coding.basic.array.ArrayList; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArrayListTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - - private List list = new ArrayList(); - - @Before - public void before() { - - } - - @Test - public void add() throws Exception { - list.add(1); - } - - @Test - public void get() throws Exception { - add(); - logger.info("{}", list.get(0)); - } - +package com.coding.basic; + +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArrayListTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + private List list = new ArrayList(); + + @Before + public void before() { + + } + + @Test + public void add() throws Exception { + list.add(1); + } + + @Test + public void get() throws Exception { + add(); + logger.info("{}", list.get(0)); + } + } \ No newline at end of file diff --git a/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java b/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java similarity index 96% rename from group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java rename to group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java index 549553e696..0424c2945e 100644 --- a/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java +++ b/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java @@ -1,6 +1,5 @@ package com.coding.basic; -import com.coding.basic.linklist.LinkedList; import org.junit.Assert; import org.junit.Test; @@ -62,21 +61,18 @@ public void removeFirstHalf() throws Exception { linkedList.removeFirstHalf(); Assert.assertEquals("[]", linkedList.toString()); } - @Test public void removeFirstHalf1() throws Exception { LinkedList linkedList = createAndFillLinkedList(1); linkedList.removeFirstHalf(); Assert.assertEquals("[1]", linkedList.toString()); } - @Test public void removeFirstHalf2() throws Exception { LinkedList linkedList = createAndFillLinkedList(2); linkedList.removeFirstHalf(); Assert.assertEquals("[2]", linkedList.toString()); } - @Test public void removeFirstHalf3() throws Exception { LinkedList linkedList = createAndFillLinkedList(3); @@ -106,43 +102,37 @@ public void remove1() throws Exception { list.remove(0, 0); Assert.assertEquals("[1,2,3,4]", list.toString()); } - - @Test + @Test public void remove2() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(0, 1); Assert.assertEquals("[2,3,4]", list.toString()); } - - @Test + @Test public void remove3() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 0); Assert.assertEquals("[1,2,3,4]", list.toString()); } - - @Test + @Test public void remove4() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 1); Assert.assertEquals("[1,3,4]", list.toString()); } - - @Test +@Test public void remove5() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 3); Assert.assertEquals("[1]", list.toString()); } - - @Test +@Test public void remove6() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 4); Assert.assertEquals("[1]", list.toString()); } - - @Test +@Test public void remove7() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 5); @@ -151,7 +141,7 @@ public void remove7() throws Exception { @Test public void getElements() throws Exception { - LinkedList listA = createAndFillLinkedList(0, 8); + LinkedList listA= createAndFillLinkedList(0,8); LinkedList listB = createAndFillLinkedList(4, 4); Assert.assertEquals("[4,5,6,7]", Arrays.toString(listA.getElements(listB))); diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java similarity index 99% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java rename to group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java index 42ec6efe57..9aa6404d2a 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java @@ -1,4 +1,4 @@ -package com.coding.basic.array; +package com.coderising.array; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java deleted file mode 100644 index a76de06aa1..0000000000 --- a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coderising.jvm.loader; - -import org.apache.commons.lang3.StringUtils; - -import java.util.HashSet; -import java.util.Set; - -/** - * Created by luoziyihao on 4/27/17. - */ -public class ClassFileLoader { - - private Set clzPaths; - - public void addClassPath(String path) { - if (clzPaths == null) { - clzPaths = new HashSet<>(5); - } - if (StringUtils.isBlank(path)) { - return; - } - clzPaths.add(path); - - } - - - private static final String SPLIT = ";"; - - public String getClassPath() { - StringBuilder classPath = new StringBuilder(); - - for (String e : clzPaths) { - classPath.append(e) - .append(SPLIT); - } - if (classPath.length() > 1) { - classPath.deleteCharAt(classPath.length() - 1); - } - return classPath.toString(); - } - - public byte[] readBinaryCode(String className) { - return new byte[0]; - } -} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java deleted file mode 100644 index b2dceda3e5..0000000000 --- a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java +++ /dev/null @@ -1,355 +0,0 @@ -package com.coderising.jvm.test; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -//import com.coderising.jvm.clz.ClassFile; -//import com.coderising.jvm.clz.ClassIndex; -//import com.coderising.jvm.cmd.BiPushCmd; -//import com.coderising.jvm.cmd.ByteCodeCommand; -//import com.coderising.jvm.cmd.OneOperandCmd; -//import com.coderising.jvm.cmd.TwoOperandCmd; -//import com.coderising.jvm.constant.ClassInfo; -//import com.coderising.jvm.constant.ConstantPool; -//import com.coderising.jvm.constant.MethodRefInfo; -//import com.coderising.jvm.constant.NameAndTypeInfo; -//import com.coderising.jvm.constant.UTF8Info; -//import com.coderising.jvm.field.Field; -import com.coderising.jvm.loader.ClassFileLoader; -//import com.coderising.jvm.method.Method; - - - - - -public class ClassFileloaderTest { - - - private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path2 = "C:\temp"; - -// static ClassFile clzFile = null; -// static { -// ClassFileLoader loader = new ClassFileLoader(); -// loader.addClassPath(path1); -// String className = "com.coderising.jvm.test.EmployeeV1"; -// -// clzFile = loader.loadClass(className); -// -// } -// - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "com.coderising.jvm.test.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - private String byteToHexString(byte[] codes ){ - 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()); -// } -// -// /** -// * 下面是第三次JVM课应实现的测试用例 -// */ -// @Test -// public void testReadFields(){ -// -// List fields = clzFile.getFields(); -// Assert.assertEquals(2, fields.size()); -// { -// Field f = fields.get(0); -// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); -// } -// { -// Field f = fields.get(1); -// Assert.assertEquals("age:I", f.toString()); -// } -// } -// @Test -// public void testMethods(){ -// -// List methods = clzFile.getMethods(); -// ConstantPool pool = clzFile.getConstantPool(); -// -// { -// Method m = methods.get(0); -// assertMethodEquals(pool,m, -// "", -// "(Ljava/lang/String;I)V", -// "2ab7000c2a2bb5000f2a1cb50011b1"); -// -// } -// { -// Method m = methods.get(1); -// assertMethodEquals(pool,m, -// "setName", -// "(Ljava/lang/String;)V", -// "2a2bb5000fb1"); -// -// } -// { -// Method m = methods.get(2); -// assertMethodEquals(pool,m, -// "setAge", -// "(I)V", -// "2a1bb50011b1"); -// } -// { -// Method m = methods.get(3); -// assertMethodEquals(pool,m, -// "sayHello", -// "()V", -// "b2001c1222b60024b1"); -// -// } -// { -// Method m = methods.get(4); -// assertMethodEquals(pool,m, -// "main", -// "([Ljava/lang/String;)V", -// "bb000159122b101db7002d4c2bb6002fb1"); -// } -// } -// -// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ -// String methodName = pool.getUTF8String(m.getNameIndex()); -// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); -// String code = m.getCodeAttr().getCode(); -// Assert.assertEquals(expectedName, methodName); -// Assert.assertEquals(expectedDesc, methodDesc); -// Assert.assertEquals(expectedCode, code); -// } -// -// @Test -// public void testByteCodeCommand(){ -// { -// Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); -// ByteCodeCommand [] cmds = initMethod.getCmds(); -// -// assertOpCodeEquals("0: aload_0", cmds[0]); -// assertOpCodeEquals("1: invokespecial #12", cmds[1]); -// assertOpCodeEquals("4: aload_0", cmds[2]); -// assertOpCodeEquals("5: aload_1", cmds[3]); -// assertOpCodeEquals("6: putfield #15", cmds[4]); -// assertOpCodeEquals("9: aload_0", cmds[5]); -// assertOpCodeEquals("10: iload_2", cmds[6]); -// assertOpCodeEquals("11: putfield #17", cmds[7]); -// assertOpCodeEquals("14: return", cmds[8]); -// } -// -// { -// Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); -// ByteCodeCommand [] cmds = setNameMethod.getCmds(); -// -// assertOpCodeEquals("0: aload_0", cmds[0]); -// assertOpCodeEquals("1: aload_1", cmds[1]); -// assertOpCodeEquals("2: putfield #15", cmds[2]); -// assertOpCodeEquals("5: return", cmds[3]); -// -// } -// -// { -// Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); -// ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); -// -// assertOpCodeEquals("0: getstatic #28", cmds[0]); -// assertOpCodeEquals("3: ldc #34", cmds[1]); -// assertOpCodeEquals("5: invokevirtual #36", cmds[2]); -// assertOpCodeEquals("8: return", cmds[3]); -// -// } -// -// { -// Method mainMethod = this.clzFile.getMainMethod(); -// -// ByteCodeCommand [] cmds = mainMethod.getCmds(); -// -// assertOpCodeEquals("0: new #1", cmds[0]); -// assertOpCodeEquals("3: dup", cmds[1]); -// assertOpCodeEquals("4: ldc #43", cmds[2]); -// assertOpCodeEquals("6: bipush 29", cmds[3]); -// assertOpCodeEquals("8: invokespecial #45", cmds[4]); -// assertOpCodeEquals("11: astore_1", cmds[5]); -// assertOpCodeEquals("12: aload_1", cmds[6]); -// assertOpCodeEquals("13: invokevirtual #47", cmds[7]); -// assertOpCodeEquals("16: return", cmds[8]); -// } -// -// } -// -// private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ -// -// String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); -// -// if(cmd instanceof OneOperandCmd){ -// if(cmd instanceof BiPushCmd){ -// acctual += " " + ((OneOperandCmd)cmd).getOperand(); -// } else{ -// acctual += " #" + ((OneOperandCmd)cmd).getOperand(); -// } -// } -// if(cmd instanceof TwoOperandCmd){ -// acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); -// } -// Assert.assertEquals(expected, acctual); -// } - -} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java similarity index 95% rename from group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java rename to group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java index dcdbe226ed..85ae4dc47c 100644 --- a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java @@ -1,4 +1,4 @@ -package com.coderising.litestruts; +package com.coderising.litestruts.action; /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 diff --git a/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml index 876156eb4d..c7ee86e436 100644 --- a/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml +++ b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml @@ -1,6 +1,6 @@ - + /jsp/homepage.jsp /jsp/showLogin.jsp diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java deleted file mode 100644 index 994a241a3d..0000000000 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.linklist; - - -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) { - - - } - - - 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/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java deleted file mode 100644 index 7fd72fc2b4..0000000000 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.basic.linklist; - -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/group17/1204187480/code/homework/parent/pom.xml b/group17/1204187480/code/homework/parent/pom.xml index 4b82387454..ace9bf9cc5 100644 --- a/group17/1204187480/code/homework/parent/pom.xml +++ b/group17/1204187480/code/homework/parent/pom.xml @@ -8,66 +8,18 @@ 1.0-SNAPSHOT https://github.com/luoziyihao/coding2017 - - - alimaven - aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - true - - - - - - alimaven - aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - true - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot - - true - - - - - + UTF-8 UTF-8 UTF-8 - 1.8 - UTF-8 + 1.8 1.8 1.8 3.0 - 1.1.7 1.1.7 1.2 1.2.17 4.12 - 3.4 - 4.1 - 2.5 - 1.9.2 - 19.0 - 1.1.6 - 1.16.10 - 1.2.22 - 0.2.0 - 2.9.4 - @@ -89,59 +41,6 @@ ${log4j.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - commons-io - commons-io - ${commons-io.version} - - - commons-beanutils - commons-beanutils - ${commons-beanutils.version} - - - com.google.guava - guava - ${guava.version} - - - org.projectlombok - lombok - ${lombok.version} - - - joda-time - joda-time - ${joda-time.version} - - - io.reactivex - rxjava - ${rxjava.version} - - - com.alibaba - fastjson - ${fastjson.version} - - - com.shekhargulati - strman - ${strman.version} - - - junit @@ -150,6 +49,33 @@ + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + ${project.artifactId} @@ -166,13 +92,13 @@ - - - - - - - - - + + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.19.1 + + + \ No newline at end of file diff --git a/group17/1204187480/code/homework/pom.xml b/group17/1204187480/code/homework/pom.xml index 73e8c4160f..c8b94c2bc2 100644 --- a/group17/1204187480/code/homework/pom.xml +++ b/group17/1204187480/code/homework/pom.xml @@ -8,7 +8,7 @@ pom parent - coding + basic coderising diff --git a/group17/1204187480/note/todo/homework.md b/group17/1204187480/note/todo/homework.md deleted file mode 100644 index 5f111a9ea6..0000000000 --- a/group17/1204187480/note/todo/homework.md +++ /dev/null @@ -1,8 +0,0 @@ -# 0326 操作系统中的lru算法 - -ClassFileLoader - -LRUPageFrame - -深入理解java虚拟机 第6章 - diff --git a/group17/1264835468/src/assignment/BinaryTree.java b/group17/1264835468/src/assignment/BinaryTree.java index 882a87f6ed..1d76a7ce2c 100644 --- a/group17/1264835468/src/assignment/BinaryTree.java +++ b/group17/1264835468/src/assignment/BinaryTree.java @@ -53,10 +53,10 @@ public String toString() { * */ private class BFSNodeQueue { - private Queue> nodeQueue; + private MyQueue> nodeQueue; public BFSNodeQueue() { - nodeQueue = new Queue<>(); + nodeQueue = new MyQueue<>(); } public boolean isEmpty() { @@ -79,9 +79,9 @@ public BinaryTreeNode deQueue() { } // 把所有出队节点放进另一个队列中 - public Queue> getResult() { + public MyQueue> getResult() { prepare(); - Queue> result = new Queue<>(); + MyQueue> result = new MyQueue<>(); while (!isEmpty()) { result.enQueue(deQueue()); } @@ -121,7 +121,7 @@ private class BFSIterator implements Iterator> { Iterator> iterator; public BFSIterator() { - Queue> BFSQueue = new BFSNodeQueue().getResult(); + MyQueue> BFSQueue = new BFSNodeQueue().getResult(); list = new MyArrayList<>(); while (!BFSQueue.isEmpty()) { list.add(BFSQueue.deQueue()); diff --git a/group17/1264835468/src/assignment/Queue.java b/group17/1264835468/src/assignment/MyQueue.java similarity index 95% rename from group17/1264835468/src/assignment/Queue.java rename to group17/1264835468/src/assignment/MyQueue.java index eb3b474e75..c5e3e8ce88 100644 --- a/group17/1264835468/src/assignment/Queue.java +++ b/group17/1264835468/src/assignment/MyQueue.java @@ -1,6 +1,6 @@ package assignment; -public class Queue { +public class MyQueue { private MyLinkedList elementData = new MyLinkedList<>(); public void enQueue(T o) { diff --git a/group17/1264835468/src/assignment/MyStack.java b/group17/1264835468/src/assignment/MyStack.java new file mode 100644 index 0000000000..0c3d30337b --- /dev/null +++ b/group17/1264835468/src/assignment/MyStack.java @@ -0,0 +1,39 @@ +package assignment; + +public class MyStack { + private MyArrayList elementData = new MyArrayList<>(); + + public void push(T o) { + elementData.add(o); + } + + public T pop() { + if (!isEmpty()) { + T data = elementData.remove(elementData.size() - 1); + return data; + } + throw new StackIsEmptyException(); + } + + public T peek() { + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } +} + +class StackIsEmptyException extends RuntimeException { + public StackIsEmptyException() { + super(); + } + + public StackIsEmptyException(String string) { + super(string); + } +} diff --git a/group17/1264835468/src/assignment/Stack.java b/group17/1264835468/src/assignment/Stack.java deleted file mode 100644 index 9100544ee3..0000000000 --- a/group17/1264835468/src/assignment/Stack.java +++ /dev/null @@ -1,53 +0,0 @@ -package assignment; - -public class Stack { - private MyArrayList elementData = new MyArrayList<>(); - - public void push(T o) { - elementData.add(o); - } - - public T pop() { - if (!isEmpty()) { - T data = elementData.remove(elementData.size() - 1); - return data; - } - throw new EmptyStackException(); - } - - public T peek() { - if(!isEmpty()) - return elementData.get(elementData.size() - 1); - throw new EmptyStackException(); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } - - @Override - public String toString() { - StringBuilder stringBuilder = new StringBuilder(); - for (int i = elementData.size()-1; i >=0; i--) { - stringBuilder.append(elementData.get(i)); - if (i != 0) { - stringBuilder.append(", "); - } - } - return stringBuilder.toString(); - } -} - -class EmptyStackException extends RuntimeException { - public EmptyStackException() { - super(); - } - - public EmptyStackException(String string) { - super(string); - } -} diff --git a/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java b/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java deleted file mode 100644 index f95bc2e902..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java b/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java deleted file mode 100644 index 2cb501297d..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java +++ /dev/null @@ -1,77 +0,0 @@ -package assignment0326.jvm.clz; - - -import assignment0326.jvm.constant.ClassInfo; -import assignment0326.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/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java b/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java deleted file mode 100644 index a3e5c3d350..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java deleted file mode 100644 index 4a7397478e..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java deleted file mode 100644 index f6acdc0580..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java b/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java deleted file mode 100644 index 96f40534da..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,29 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java deleted file mode 100644 index d0beb7f1f2..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 3678f46c39..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,55 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 7659657b94..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java deleted file mode 100644 index d8f8bda26e..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package assignment0326.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - -} diff --git a/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java deleted file mode 100644 index eb6b9b4d7e..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java +++ /dev/null @@ -1,26 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java b/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java deleted file mode 100644 index 80f3389bd9..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,32 +0,0 @@ -package assignment0326.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/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 09d87c13b6..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,42 +0,0 @@ -package assignment0326.jvm.loader; - -public class ByteCodeIterator { - int curPos; - byte[] bytes; - - public ByteCodeIterator(byte[] bytes) { - curPos = 0; - this.bytes = bytes; - } - - public boolean hasNext() { - return !(curPos >= bytes.length); - } - - public byte nextByte() { - return bytes[curPos++]; - } - - public int nextByteToInt() { - return Byte.toUnsignedInt(nextByte()); - } - - public int next2BytesToInt() { - int hi = Byte.toUnsignedInt(nextByte()); - int lo = Byte.toUnsignedInt(nextByte()); - int i = hi << 8 | lo; - return i; - } - - public byte[] nextNBytes(int n) { - byte[] bytes = new byte[n]; - for (int i = 0; i < n; i++) { - bytes[i] = nextByte(); - } - return bytes; - } - - public void skip(int n) { - curPos += n; - } -} diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java index 3b05a1f761..a5add91113 100644 --- a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java +++ b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java @@ -1,13 +1,9 @@ package assignment0326.jvm.loader; -import assignment0326.jvm.clz.ClassFile; - import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @@ -17,67 +13,47 @@ public class ClassFileLoader { - private List clzPaths = new ArrayList<>(); - - public byte[] readBinaryCode(String className) { - String path = className.replace(".", File.separator); - File classFile = null; - for (String p : clzPaths) { - classFile = new File(p + File.separator + path + ".class"); - if (classFile.exists()) - break; - } - if (classFile == null) - throw new RuntimeException("no such class file"); + private List clzPaths = new ArrayList(); - byte[] bytes = new byte[(int) classFile.length()]; - try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(classFile))) { - bufferedInputStream.read(bytes, 0, bytes.length); - - } catch (IOException e) { - e.printStackTrace(); - } - return bytes; - } + public byte[] readBinaryCode(String className) { + String path = className.replace(".", File.separator); + File classFile=null; + for (String p: clzPaths) { + classFile=new File(p+File.separator+path+".class"); + if(classFile.exists()) + break; + } + if(classFile==null) + throw new RuntimeException("no such class file"); + byte[] bytes=new byte[(int)classFile.length()]; + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(classFile))){ + bufferedInputStream.read(bytes, 0, bytes.length); - public void addClassPath(String path) { - if (this.clzPaths.contains(path)) { - return; + } catch (IOException e) { + e.printStackTrace(); + } + return bytes; } - clzPaths.add(path); - } - public String getClassPath() { - StringBuilder stringBuilder = new StringBuilder(); - for (int i = 0; i < clzPaths.size() - 1; i++) { - stringBuilder.append(clzPaths.get(i) + ";"); + public void addClassPath(String path) { + clzPaths.add(path); } - stringBuilder.append(clzPaths.get(clzPaths.size() - 1)); - return stringBuilder.toString(); - } - private byte[] loadClassFile(String clzFileName) { - try { - - return Files.readAllBytes(Paths.get(clzFileName)); - - - } catch (IOException e) { - e.printStackTrace(); - return null; + public String getClassPath(){ + StringBuilder stringBuilder=new StringBuilder(); + 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()); - } - - } \ No newline at end of file diff --git a/group17/1264835468/src/assignment0326/jvm/util/Util.java b/group17/1264835468/src/assignment0326/jvm/util/Util.java deleted file mode 100644 index 5855550bf8..0000000000 --- a/group17/1264835468/src/assignment0326/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package assignment0326.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 strings=new ArrayList<>(); + for (int i = 0; i <10; i++) { + strings.add(String.valueOf(new Random().nextInt(3000))); + } + System.out.println(strings); + System.out.println(strings.stream().map(s-> s.charAt(0)).sorted().distinct().limit(5).collect(Collectors.toList())); + } + + public int findMinDifference(List timePoints) { + List list=new ArrayList<>(); + + for (String s:timePoints) { + list.add(parse(s)); + } + Collections.sort(list); + int min=Integer.MAX_VALUE; + for (int i = 0; i < list.size()-1; i++) { + min=Math.min(min,Math.min(Math.abs(list.get(i+1)-list.get(i)),24*60-Math.abs(list.get(i+1)-list.get(i)))); + } + return min; + } + + private Integer parse(String s) { + return Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(3, 5)); + } +} diff --git a/group17/1264835468/src/assignment0405/StackUtil.java b/group17/1264835468/src/assignment0405/StackUtil.java deleted file mode 100644 index dcaf1992dd..0000000000 --- a/group17/1264835468/src/assignment0405/StackUtil.java +++ /dev/null @@ -1,107 +0,0 @@ -package assignment0405; - -import assignment.Stack; - -import java.util.Objects; - -/** - * Created by Administrator on 2017/4/6. - */ -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 stack1 = new Stack(); - Stack stack2 = new Stack(); - popAllToAnotherStack(s, stack1); - popAllToAnotherStack(stack1, stack2); - popAllToAnotherStack(stack2, s); - } - - private static void popAllToAnotherStack(Stack s, Stack another) { - while (!s.isEmpty()) { - another.push(s.pop()); - } - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s, Object o) { - Stack stack2 = new Stack(); - while (!s.isEmpty()) { - Object top = s.pop(); - //Objects.equals(null, null) == true - if (!Objects.equals(top, o)) { - stack2.push(top); - } - } - popAllToAnotherStack(stack2, s); - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param len - * @return - */ - public static Object[] getTop(Stack s, int len) { - if (len > s.size()) - throw new RuntimeException("Stack size:" + s.size() + " < " + len); - Object[] objects = new Object[len]; - for (int i = 0; i < len; i++) { - objects[i] = s.pop(); - } - for (int i = len - 1; i >= 0; i--) { - s.push(objects[i]); - } - return objects; - } - - /** - * 字符串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) { - Stack stack = new Stack<>(); - - for (char c : s.toCharArray()) { - if (isLeft(c)) { - stack.push(c); - continue; - } - if (isRight(c)) { - if (stack.isEmpty() || !match(stack.pop(), c)) { - return false; - } - } - } - return stack.isEmpty(); - } - - private static boolean isLeft(char c) { - return c == '[' || c == '(' || c == '{'; - } - - private static boolean isRight(char c) { - return c == ']' || c == ')' || c == '}'; - } - - private static boolean match(char left, char right) { - return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}'); - } - - -} diff --git a/group17/1264835468/src/assignment0405/StackUtilTest.java b/group17/1264835468/src/assignment0405/StackUtilTest.java deleted file mode 100644 index d36a17c29d..0000000000 --- a/group17/1264835468/src/assignment0405/StackUtilTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package assignment0405; - -import assignment.Stack; -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by Administrator on 2017/4/9. - */ -public class StackUtilTest { - @Test - public void reverse() throws Exception { - Stack stack = new Stack(); - pushAll(stack, 1, 2, 3, 4); - Assert.assertEquals("4, 3, 2, 1", stack.toString()); - StackUtil.reverse(stack); - Assert.assertEquals("1, 2, 3, 4", stack.toString()); - StackUtil.reverse(stack); - Assert.assertEquals("4, 3, 2, 1", stack.toString()); - - } - - - @Test - public void remove() throws Exception { - Stack stack = new Stack(); - pushAll(stack, 0, 1, 2, 3); - StackUtil.remove(stack, 1); - Assert.assertEquals("3, 2, 0", stack.toString()); - pushAll(stack, 4, 5, 6, 5); - Assert.assertEquals("5, 6, 5, 4, 3, 2, 0", stack.toString()); - StackUtil.remove(stack, 5); - Assert.assertEquals("6, 4, 3, 2, 0", stack.toString()); - pushAll(stack, null, 7, null); - Assert.assertEquals("null, 7, null, 6, 4, 3, 2, 0", stack.toString()); - StackUtil.remove(stack, null); - Assert.assertEquals("7, 6, 4, 3, 2, 0", stack.toString()); - - - } - - @Test(expected = RuntimeException.class) - public void getTop() throws Exception { - Stack stack = new Stack(); - pushAll(stack, 1, 2, 3, 4, 5); - Assert.assertArrayEquals(new Object[]{5, 4, 3}, StackUtil.getTop(stack, 3)); - Assert.assertArrayEquals(new Object[]{5}, StackUtil.getTop(stack, 1)); - Assert.assertArrayEquals(new Object[]{5, 4, 3, 2, 1}, StackUtil.getTop(stack, 5)); - //异常 - StackUtil.getTop(stack, 6); - } - - @Test - public void isValidPairs() throws Exception { - Assert.assertTrue(StackUtil.isValidPairs("()[]{}([])")); - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - Assert.assertFalse(StackUtil.isValidPairs("((a)[]{b(c)}")); - } - - private void pushAll(Stack s, Object... objects) { - for (Object object : objects) { - s.push(object); - } - } - -} \ No newline at end of file diff --git a/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java b/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java deleted file mode 100644 index 8ba6ebd501..0000000000 --- a/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group17/1282579502/src/com/coderising/download/net_multisoc.htm b/group17/1282579502/src/com/coderising/download/net_multisoc.htm index 852129b19a..5ddcba89af 100644 --- a/group17/1282579502/src/com/coderising/download/net_multisoc.htm +++ b/group17/1282579502/src/com/coderising/download/net_multisoc.htm @@ -488,18 +488,3 @@

Result

- \ No newline at end of file diff --git a/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java b/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 1e4c513330..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - public static AttributeInfo parse(ClassFile file, ByteCodeIterator iter) throws InvalidAttributeInfoException{ - AttributeInfo attrInfo = null; - int attributeType = iter.getNextNBytesInteger(2); - String attributeTag = file.getConstantPool().getUTF8String(attributeType); - System.out.println("attribute type: " + attributeType + " utf8 val: " + file.getConstantPool().getUTF8String(attributeType)); - - if(attributeTag.equals(CODE)){ - System.out.println("about to parse CODE attribute"); - //ClassFile clzFile, ByteCodeIterator iter, int attributeNameIndex - attrInfo = CodeAttr.parse(file, iter, attributeType); - } - else if(attributeTag.equals(LINE_NUM_TABLE)){ - System.out.println("about to parse LINE_NUM_TABLE attribute"); - attrInfo = LineNumberTable.parse(iter); - } - else if(attributeTag.equals(LOCAL_VAR_TABLE)){ - System.out.println("about to parse LOCAL_VAR_TABLE attribute"); - attrInfo = LocalVariableTable.parse(iter, file, attributeType); - } - else{ - System.out.println("about to throw attribute"); - throw new InvalidAttributeInfoException("Unimplemented attribute exception."); - } - - return attrInfo; - } -} diff --git a/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java b/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index 12d151d575..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; -import com.coderising.jvm.method.InvalidMethodInfoException; - - -public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter, int attributeNameIndex) throws InvalidAttributeInfoException{ - System.out.println("parsing CodeAttr..."); - - int attributeLength = iter.getNextNBytesInteger(4); - int maxStack = iter.getNextNBytesInteger(2); - int maxLocalVar = iter.getNextNBytesInteger(2); - int codeLength = iter.getNextNBytesInteger(4); - - - System.out.println("attribute length: " + attributeLength); - System.out.println("max stack: " + maxStack); - System.out.println("max local variable: " + maxLocalVar); - System.out.println("code length: " + codeLength); - - String realCode = iter.getNextNHexString(codeLength); - System.out.println("real cdoe: " + realCode); - - int exceptionCount = iter.getNextNBytesInteger(2); - System.out.println("exception count: " + exceptionCount); - if(exceptionCount>0){ - throw new InvalidAttributeInfoException("Exception parser un-implemented."); - } - //int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code - CodeAttr code = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocalVar, codeLength, realCode); - - int subAttributeCount = iter.getNextNBytesInteger(2); - System.out.println("sub attribute count : " + subAttributeCount); - for(int i = 0; i items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - int attributeLength = iter.getNextNBytesInteger(4); - int lineNumberTableLength = iter.getNextNBytesInteger(2); - System.out.println("attribute length: " + attributeLength); - System.out.println("line number table length: " + lineNumberTableLength); - LineNumberTable table = new LineNumberTable(attributeLength, lineNumberTableLength); - for(int i = 0; i items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - -public static LocalVariableTable parse(ByteCodeIterator iter, ClassFile clz, int nameIndex){ - LocalVariableTable attrInfo = null; - int attributeLength = iter.getNextNBytesInteger(4); - int localVarTableLength = iter.getNextNBytesInteger(2); - System.out.println("attribute length: " + attributeLength); - System.out.println("local variable table length: " + localVarTableLength); - attrInfo = new LocalVariableTable(nameIndex, attributeLength); - for(int i = 0;i fields; - private List methods; - - 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(); - } - - public void setFields(List fields){ - this.fields = fields; - } - - public void setMethods(List methods){ - this.methods = methods; - } - - public List getFields(){ - return fields; - } - - public List getMethods(){ - return methods; - } -} diff --git a/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java b/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java deleted file mode 100755 index e424f284b3..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java deleted file mode 100755 index aea9048ea4..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java deleted file mode 100755 index 4ddac90612..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.constant; - -public abstract class ConstantInfo { - public static final int UTF8_INFO = 1; - public static final int INTEGER_INFO = 3; - 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/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java deleted file mode 100644 index ce35409add..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.coderising.jvm.constant; - -import java.io.UnsupportedEncodingException; - -import com.coderising.jvm.loader.ByteCodeIterator; -import com.coderising.jvm.util.Util; - -public class ConstantInfoFactory { - public ByteCodeIterator iter = null; - public ConstantPool pool = null; - public ConstantInfoFactory(ByteCodeIterator iter, ConstantPool pool){ - this.iter = iter; - this.pool = pool; - } - - public void fillNextConstantInfo() throws InvalidConstantInfoTypeException, UnsupportedEncodingException{ - int constantIdentifier = iter.getNextByte(); - ConstantInfo var = null; - //System.out.println("constant identifyer: " + constantIdentifier); - var = classify(constantIdentifier); - pool.addConstantInfo(var); - } - - public ConstantInfo classify(int constantInfoTypeId) throws InvalidConstantInfoTypeException, UnsupportedEncodingException{ - ConstantInfo ret = null; - switch(constantInfoTypeId){ - case ConstantInfo.CLASS_INFO: - ClassInfo classInfo = new ClassInfo(pool); - byte[] utf8Index = iter.getNextNBytes(2); - //System.out.println("constant classInfo: utf index: " + Util.byteToInt(utf8Index)); - classInfo.setUtf8Index(Util.byteToInt(utf8Index)); - ret = classInfo; - - break; - case ConstantInfo.FIELD_INFO: - FieldRefInfo fieldInfo = new FieldRefInfo(pool); - int classInfoIndex = Util.byteToInt(iter.getNextNBytes(2)); - fieldInfo.setClassInfoIndex(classInfoIndex); - int nameAndTypeIndex = Util.byteToInt(iter.getNextNBytes(2)); - fieldInfo.setNameAndTypeIndex(nameAndTypeIndex); - ret = fieldInfo; - break; - case ConstantInfo.INTEGER_INFO: - IntegerInfo integerInfo = new IntegerInfo(pool); - int val = Util.byteToInt(iter.getNextNBytes(4)); - integerInfo.setInteger(val); - ret = integerInfo; - break; - case ConstantInfo.FLOAT_INFO: - FloatRefInfo floatInfo = new FloatRefInfo(pool); - ret = floatInfo; - throw new InvalidConstantInfoTypeException("Flat info has not been properly implemented yet"); - //break; - case ConstantInfo.METHOD_INFO: - MethodRefInfo methodInfo = new MethodRefInfo(pool); - int methodClassInfoIndex = Util.byteToInt(iter.getNextNBytes(2)); - methodInfo.setClassInfoIndex(methodClassInfoIndex); - int methodNameAndTypeIndex = Util.byteToInt(iter.getNextNBytes(2)); - methodInfo.setNameAndTypeIndex(methodNameAndTypeIndex); - ret = methodInfo; - break; - case ConstantInfo.NAME_AND_TYPE_INFO: - NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); - int nameIndex = Util.byteToInt(iter.getNextNBytes(2)); - nameAndTypeInfo.setIndex1(nameIndex); - int descriptorIndex = Util.byteToInt(iter.getNextNBytes(2)); - nameAndTypeInfo.setIndex2(descriptorIndex); - ret = nameAndTypeInfo; - break; - case ConstantInfo.STRING_INFO: - StringInfo stringInfo = new StringInfo(pool); - int index = Util.byteToInt(iter.getNextNBytes(2)); - stringInfo.setIndex(index); - ret = stringInfo; - break; - case ConstantInfo.UTF8_INFO: - UTF8Info utfInfo = new UTF8Info(pool); - int length = Util.byteToInt(iter.getNextNBytes(2)); - utfInfo.setLength(length); - - String utf8Val = new String(iter.getNextNBytes(length), "UTF-8"); - System.out.println("UTF 8 content " + utf8Val); - - utfInfo.setValue(utf8Val); - ret = utfInfo; - break; - - default: - throw new InvalidConstantInfoTypeException(); - } - return ret; - } -} diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java deleted file mode 100755 index 59ad734f25..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.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){ - System.out.println("added: " + info.getClass().getName() + " current size; " + constantInfos.size()); - 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 int getSize() { - return this.constantInfos.size() -1; - } - - public String toString(){ - StringBuilder sb = new StringBuilder(); - for(int i = 0; i attributeList = new ArrayList<>(); - for(int i = 0; i0){ - throw new InvalidAttributeInfoException("Attribute infomation is NOT valid."); - } - Field newField = new Field(accessFlag, nameIndex, descriptorIndex,pool); - return newField; - } - - public String toString(){ - return pool.getUTF8String(nameIndex) + ":" +pool.getUTF8String( descriptorIndex); - } - -} diff --git a/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java b/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java deleted file mode 100644 index 7d1f90c030..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.jvm.interfaze; - -public class Interfaze { - -} diff --git a/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java b/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java deleted file mode 100644 index b5eed64afc..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coderising.jvm.interfaze; - -public class InvalidInterfaceException extends Exception{ - public InvalidInterfaceException(String message){ - super(message); - } -} diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100755 index b34c2c6736..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.coderising.jvm.loader; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - - byte[] source = null; - int currentPos = 0; - - public ByteCodeIterator(byte[] source){ - this.source = source; - } - - public byte getNextByte(){ - if(currentPos > source.length -1){ - throw new IndexOutOfBoundsException(); - } - return getByteAt(currentPos++); - } - - public byte[] getNextNBytes(int n){ - byte[] retArray = new byte[n]; - for(int i = 0; isource.length-1){ - throw new IndexOutOfBoundsException(); - } - return source[n]; - } - - - public String getNextHexString(){ - byte b1 = getNextByte(); - int i1 = b1 & 0xFF; - String strVal = Integer.toHexString(i1); - if(strVal.length() < 2){ - strVal = "0".concat(strVal); - } - return strVal; - } - - public String getNextNHexString(int n){ - StringBuilder sb = new StringBuilder(); - while(n-->0){ - sb.append(getNextHexString()); - } - - return sb.toString(); - } - - public String peekNextNHex(int n){ - String val = getNextNHexString(n); - backOffNBytes(n); - return val; - } - - public void backOffNBytes(int n){ - if(n < currentPos){ - currentPos -=n; - } - else{ - System.err.println("Don't have enough bytes."); - } - } - - public int getNextNBytesInteger(int n){ - byte[] barray = getNextNBytes(n); - return Util.byteToInt(barray); - } - - - public static void printByteInNumber(byte b){ - int tmp = b; - System.out.println(Integer.toBinaryString(tmp)); - int tmp1 = tmp & 0xFF; - System.out.println(Integer.toBinaryString(tmp1)); - System.out.println(Integer.toHexString(tmp1)); - } -} diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java index ec9ea83caf..6d669e294f 100644 --- a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -9,24 +9,18 @@ import java.util.Collection; import java.util.List; -import com.coderising.jvm.clz.ClassFile; - public class ClassFileLoader { private List clzPaths = new ArrayList(); - public ClassFileLoader(){ - - } - public byte[] readBinaryCode(String className) { String classPath = convertToFilePath(className); File targetFile = null; for(int i = 0; i< clzPaths.size(); i++){ String fullPath = clzPaths.get(i)+File.separator+classPath; - //System.out.println("path: " + fullPath); + System.out.println("path: " + fullPath); File temp = new File(fullPath); if(temp.exists()) { targetFile = temp; @@ -35,10 +29,10 @@ public byte[] readBinaryCode(String className) { } if(targetFile != null){ - //System.out.println("targetFile: " + targetFile.getAbsolutePath()); + System.out.println("targetFile: " + targetFile.getAbsolutePath()); } long fileLength = targetFile.length(); - //System.out.println("File length: " + fileLength); + System.out.println("File length: " + fileLength); byte[] byteArray = new byte[(int)fileLength]; FileInputStream is = null; try { @@ -67,14 +61,6 @@ public byte[] readBinaryCode(String className) { } - public ClassFile loadClass(String className){ - byte[] ba = readBinaryCode(className); - ClassFileParser parser = new ClassFileParser(); - return parser.parse(ba); - } - - - private String convertToFilePath(String className){ return className.replaceAll("\\.", File.separator) + ".class"; } diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java deleted file mode 100755 index c168129abc..0000000000 --- a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.coderising.jvm.loader; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import com.coderising.jvm.attr.InvalidAttributeInfoException; -import com.coderising.jvm.clz.AccessFlag; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantInfoFactory; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.InvalidConstantInfoTypeException; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.NullConstantInfo; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.interfaze.Interfaze; -import com.coderising.jvm.interfaze.InvalidInterfaceException; -import com.coderising.jvm.method.InvalidMethodInfoException; -import com.coderising.jvm.method.Method; - -public class ClassFileParser { - ClassFile clz = null; - public ClassFile parse(byte[] codes) { - clz = new ClassFile(); - ByteCodeIterator iter = new ByteCodeIterator(codes); - String magicHex = iter.getNextNHexString(4); - System.out.println("Magic Number: "+magicHex); - try{ - String minorHex = iter.getNextHexString() + iter.getNextHexString(); - int minorVersionInt = Integer.parseInt(minorHex, 16); - String majorHex = iter.getNextHexString() + iter.getNextHexString(); - int majorVersionInt = Integer.parseInt(majorHex, 16); - clz.setMajorVersion(majorVersionInt);clz.setMinorVersion(minorVersionInt); - System.out.println("Major version: " + majorVersionInt + " minor version: " + minorVersionInt); - clz.setConstPool(parseConstantPool(iter)); - fillClassInfo(clz, clz.getConstantPool()); - System.out.println(iter.peekNextNHex(8)); - parseAccessFlag(iter); - parseClassInfex(iter);parseClassInfex(iter); - parseInterface(iter); - parseFields(iter); - parseMethods(iter); - } - catch(Exception e){ - e.printStackTrace(); - } - return clz; - } - - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - - ConstantPool cp = clz.getConstantPool(); - int visitFlagIndex = iter.getNextNBytesInteger(2); - System.out.println("visit flag index: " + visitFlagIndex + " variable value: " + cp.getUTF8String(visitFlagIndex)); - return null; - } - - private ClassIndex parseClassInfex(ByteCodeIterator iter) { - int classInfIndex = iter.getNextNBytesInteger(2); - System.out.println("class info: " + classInfIndex); - return null; - - } - - private List parseInterface(ByteCodeIterator iter) throws InvalidInterfaceException{ - int interfaceCount = iter.getNextNBytesInteger(2); - if(interfaceCount>0){ - throw new InvalidInterfaceException("Unimplemented interface parser: " + interfaceCount); - } - return null; - } - - private void parseFields(ByteCodeIterator iter){ - int fieldsCount = iter.getNextNBytesInteger(2); - System.out.println("Fields count: " + fieldsCount); - List fields = new LinkedList<>(); - for(int i = 0; i methods = new ArrayList<>(); - for(int i = 0; i 1){ - try { - constantInfoFactory.fillNextConstantInfo(); - } catch ( Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - break; - } - - } - -// 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()); - } - - - - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - -} +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.loader.ClassFileLoader; + + + + + +public class ClassFileloaderTest { + + + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; + static String path3 = "/Users/erlisuo/Documents/workspace/codeRising2017working/1282579502/bin"; + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + loader.addClassPath(path3); + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path3); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + @Test + public void testToHexString(){ + byte b1 = 'a'; + byte b2 = 'b'; + System.out.println("Binary: " + Integer.toBinaryString(b1) + " decimal: " + Integer.toString(b1) + " hex: " + Integer.toHexString(b1)); + System.out.println("Binary: " + Integer.toBinaryString(b2) + " decimal: " + Integer.toString(b2) + " hex: " + Integer.toHexString(b2)); + + byte[] bArray = new byte[]{b1, b2}; + System.out.println(byteToHexString(bArray)); + } + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i priorityMap = null; - List exprTokens = null; - public InfixExpr(String expr) { - priorityMap = new HashMap(); - init(); - this.expr = expr; - exprTokens = parse(); - } - - public void init(){ - priorityMap.put('+', 0); - priorityMap.put('-', 0); - priorityMap.put('*', 1); - priorityMap.put('/', 1); - } - - public float evaluate() { - Stack operatorStack = new Stack<>(); - Stack operandStack = new Stack<>(); - - Float operandOne, operandTwo; - - int index = 0; - - while(index < exprTokens.size()){ - String cc = exprTokens.get(index); - try{ - if(isFloat(cc)){ - System.out.println("push operand: " + cc); - operandStack.push(Float.parseFloat(cc)); - System.out.println("peek: " + operandStack.peek()); - - } - else if(priorityMap.get(cc.charAt(0)) != null){ - char c = cc.charAt(0); - if(operatorStack.isEmpty()){ - System.out.println("push operator: " + cc); - operatorStack.push(c); - } - else{ - int preOperatorPriority = getPriority(operatorStack.peek()); - int curOperatorPriority = getPriority(c); - if(curOperatorPriority <= preOperatorPriority){ - //do precalculation first - operandTwo = operandStack.pop(); - operandOne = operandStack.pop(); - char operator = operatorStack.pop(); - float result = doCalculation(operandOne, operandTwo, operator); - - operandStack.push(result); - operatorStack.push(c); - } - else{ - System.out.println("push operator: " + cc); - operatorStack.push(c); - } - } - } - else{ - throw new Exception("Unsupported character: " + cc); - } - } - catch(Exception e){ - e.printStackTrace(); - } - index ++; - } - System.out.println("dumpping operator stack:"); - dumpStack(operatorStack); - System.out.println("dumpping operand stack:"); - dumpStack(operandStack); - try{ - while(!operatorStack.isEmpty()){ - operandTwo = operandStack.pop(); - operandOne = operandStack.pop(); - char operator = operatorStack.pop(); - float result = doCalculation(operandOne, operandTwo, operator); - - operandStack.push(result); - } - }catch(Exception e){ - e.printStackTrace(); - } - - if(operandStack.size() > 1){ - System.err.println("More than one result reminded in operands stack."); - } - return operandStack.pop(); - } - - private float doCalculation(float operandOne, float operandTwo, char operator) throws Exception{ - System.out.println("operand 1: " + operandOne + " operand 2: " + operandTwo + " operator: " + operator); - float result = 0f; - if(operator == '+'){ - result = operandOne + operandTwo; - } - else if(operator == '-'){ - result = operandOne - operandTwo; - } - else if(operator == '*'){ - result = operandOne * operandTwo; - } - else if(operator == '/'){ - result = operandOne / operandTwo; - } - else{ - throw new Exception("Unsupported operator"); - } - System.out.println("result: " + result); - return result; - } - - private int getPriority(Character c){ - return priorityMap.get(c); - } - - private boolean isFloat(String v){ - try{ - Float.parseFloat(v); - return true; - } - catch(Exception e){ - return false; - } - } - - private List parse(){ - List vals = new ArrayList<>(); - int p1 = 0; - int p2 = 1; - while(p2 size)) { - throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); - } else if (!isAdd && (index < 0 || index >= size)) + private void checkBounds(int index) { + if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); } diff --git a/group17/785396327/3.26/jvm_1/ClassFileLoader.java b/group17/785396327/3.26/jvm_1/ClassFileLoader.java index 66f209f161..95f68a5a7f 100644 --- a/group17/785396327/3.26/jvm_1/ClassFileLoader.java +++ b/group17/785396327/3.26/jvm_1/ClassFileLoader.java @@ -1,8 +1,5 @@ package jvm_1; -import clz.ClassFile; -import parse.ClassFilePaser; - import java.io.*; import java.util.ArrayList; import java.util.List; @@ -50,10 +47,4 @@ public String getClassPath() { } return sb.substring(0, sb.length() - 1); } - - public ClassFile loadClass(String className) { - byte[] bytes = readBinaryCode(className); - ClassFilePaser classFilePaser = new ClassFilePaser(); - return classFilePaser.parse(bytes); - } } diff --git a/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java b/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java index 5a298da661..067cd93c2b 100644 --- a/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java +++ b/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java @@ -9,7 +9,7 @@ * Created by william on 2017/4/5. */ public class ClassFileloaderTest { - static String path1 = "G:\\Git\\homework\\coding2017\\group17\\785396327\\3.12\\out\\production\\785396327"; + static String path1 = "D:\\workspace\\IDEA\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; static String path2 = "C:\temp"; diff --git a/group17/785396327/4.16/cmd/BiPushCmd.java b/group17/785396327/4.16/cmd/BiPushCmd.java deleted file mode 100644 index 79da192e67..0000000000 --- a/group17/785396327/4.16/cmd/BiPushCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantPool; -import engine.ExecutionResult; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by william on 2017/4/17. - */ -public class BiPushCmd extends OneOperandCmd { - public BiPushCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } - -} diff --git a/group17/785396327/4.16/cmd/ByteCodeCommand.java b/group17/785396327/4.16/cmd/ByteCodeCommand.java deleted file mode 100644 index 66abdd0865..0000000000 --- a/group17/785396327/4.16/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,131 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantInfo; -import constant.ConstantPool; -import engine.FrameResult; -import engine.StackFrame; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by william on 2017/4/17. - */ -public abstract class ByteCodeCommand { - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - public abstract void execute(StackFrame frame, FrameResult result); -} diff --git a/group17/785396327/4.16/cmd/CommandParser.java b/group17/785396327/4.16/cmd/CommandParser.java deleted file mode 100644 index 02d06cd275..0000000000 --- a/group17/785396327/4.16/cmd/CommandParser.java +++ /dev/null @@ -1,214 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ClassInfo; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by william on 2017/4/17. - */ -public class CommandParser { - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - CommandIterator commandIterator = new CommandIterator(codes); - List commandList = new ArrayList(); - while (commandIterator.hasNext()) { - String command = commandIterator.next2CharAsString().toUpperCase(); - if (command.equals(aconst_null)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(new_object)) { - NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, command); - newObjectCmd.setOprand1(commandIterator.next2CharAsInt()); - newObjectCmd.setOprand2(commandIterator.next2CharAsInt()); - newObjectCmd.setOffset(newObjectCmd.getLength()); - commandList.add(newObjectCmd); - } else if (command.equals(lstore)) { - - } else if (command.equals(invokespecial)) { - InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, command); - invokeSpecialCmd.setOprand1(commandIterator.next2CharAsInt()); - invokeSpecialCmd.setOprand2(commandIterator.next2CharAsInt()); - invokeSpecialCmd.setOffset(invokeSpecialCmd.getLength()); - commandList.add(invokeSpecialCmd); - } else if (command.equals(invokevirtual)) { - InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, command); - invokeVirtualCmd.setOprand1(commandIterator.next2CharAsInt()); - invokeVirtualCmd.setOprand2(commandIterator.next2CharAsInt()); - invokeVirtualCmd.setOffset(invokeVirtualCmd.getLength()); - commandList.add(invokeVirtualCmd); - } else if (command.equals(getfield)) { - GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, command); - getFieldCmd.setOprand1(commandIterator.next2CharAsInt()); - getFieldCmd.setOprand2(commandIterator.next2CharAsInt()); - getFieldCmd.setOffset(getFieldCmd.getLength()); - commandList.add(getFieldCmd); - } else if (command.equals(putfield)) { - PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, command); - putFieldCmd.setOprand1(commandIterator.next2CharAsInt()); - putFieldCmd.setOprand2(commandIterator.next2CharAsInt()); - putFieldCmd.setOffset(putFieldCmd.getLength()); - commandList.add(putFieldCmd); - } else if (command.equals(getstatic)) { - GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, command); - getStaticFieldCmd.setOprand1(commandIterator.next2CharAsInt()); - getStaticFieldCmd.setOprand2(commandIterator.next2CharAsInt()); - getStaticFieldCmd.setOffset(getStaticFieldCmd.getLength()); - commandList.add(getStaticFieldCmd); - } else if (command.equals(ldc)) { - LdcCmd ldcCmd = new LdcCmd(clzFile, command); - ldcCmd.setOperand(commandIterator.next2CharAsInt()); - ldcCmd.setOffset(ldcCmd.getLength()); - commandList.add(ldcCmd); - } else if (command.equals(dup)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(bipush)) { - BiPushCmd biPushCmd = new BiPushCmd(clzFile, command); - biPushCmd.setOperand(commandIterator.next2CharAsInt()); - biPushCmd.setOffset(biPushCmd.getLength()); - commandList.add(biPushCmd); - } else if (command.equals(aload_0)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(aload_1)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(aload_2)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(iload)) { - - } else if (command.equals(iload_2)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(iload_1)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(iload_3)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(fload_3)) { - - } else if (command.equals(voidreturn)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(ireturn)) { - - } else if (command.equals(freturn)) { - - } else if (command.equals(astore_1)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); - noOperandCmd.setOffset(noOperandCmd.getLength()); - commandList.add(noOperandCmd); - } else if (command.equals(if_icmp_ge)) { - - } else if (command.equals(if_icmple)) { - - } else if (command.equals(goto_no_condition)) { - - } else if (command.equals(iconst_0)) { - - } else if (command.equals(iconst_1)) { - - } else if (command.equals(istore_1)) { - - } else if (command.equals(istore_2)) { - - } else if (command.equals(iadd)) { - - } else if (command.equals(iinc)) { - - } else { - throw new RuntimeException("wrong command : " + command); - } - } - calcuateOffset(commandList); - return commandList.toArray(new ByteCodeCommand[commandList.size()]); - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - /** - * 从字符串中截取前两个字符 - * - * @return - */ - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group17/785396327/4.16/cmd/GetFieldCmd.java b/group17/785396327/4.16/cmd/GetFieldCmd.java deleted file mode 100644 index 59425edc38..0000000000 --- a/group17/785396327/4.16/cmd/GetFieldCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantPool; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by william on 2017/4/17. - */ -public class GetFieldCmd extends TwoOperandCmd { - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } - -} diff --git a/group17/785396327/4.16/cmd/GetStaticFieldCmd.java b/group17/785396327/4.16/cmd/GetStaticFieldCmd.java deleted file mode 100644 index c21e230306..0000000000 --- a/group17/785396327/4.16/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantPool; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by IBM on 2017/4/17. - */ -public class GetStaticFieldCmd extends TwoOperandCmd { - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } -} diff --git a/group17/785396327/4.16/cmd/InvokeSpecialCmd.java b/group17/785396327/4.16/cmd/InvokeSpecialCmd.java deleted file mode 100644 index 3dd0c7b70e..0000000000 --- a/group17/785396327/4.16/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantPool; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by IBM on 2017/4/17. - */ -public class InvokeSpecialCmd extends TwoOperandCmd { - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } -} diff --git a/group17/785396327/4.16/cmd/InvokeVirtualCmd.java b/group17/785396327/4.16/cmd/InvokeVirtualCmd.java deleted file mode 100644 index 254534a78f..0000000000 --- a/group17/785396327/4.16/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,26 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantPool; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by IBM on 2017/4/17. - */ -public class InvokeVirtualCmd extends TwoOperandCmd { - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } -} diff --git a/group17/785396327/4.16/cmd/LdcCmd.java b/group17/785396327/4.16/cmd/LdcCmd.java deleted file mode 100644 index ce1f34df3c..0000000000 --- a/group17/785396327/4.16/cmd/LdcCmd.java +++ /dev/null @@ -1,37 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantInfo; -import constant.ConstantPool; -import constant.StringInfo; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by IBM on 2017/4/17. - */ -public class LdcCmd extends OneOperandCmd { - public LdcCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if (info instanceof StringInfo) { - StringInfo strInfo = (StringInfo) info; - value = strInfo.toString(); - } - - return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; - - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } -} diff --git a/group17/785396327/4.16/cmd/NewObjectCmd.java b/group17/785396327/4.16/cmd/NewObjectCmd.java deleted file mode 100644 index d284274f0b..0000000000 --- a/group17/785396327/4.16/cmd/NewObjectCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantPool; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by gongxun on 2017/4/17. - */ -public class NewObjectCmd extends TwoOperandCmd { - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } - -} diff --git a/group17/785396327/4.16/cmd/NoOperandCmd.java b/group17/785396327/4.16/cmd/NoOperandCmd.java deleted file mode 100644 index 828ae2094e..0000000000 --- a/group17/785396327/4.16/cmd/NoOperandCmd.java +++ /dev/null @@ -1,30 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantPool; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by IBM on 2017/4/17. - */ -public class NoOperandCmd extends ByteCodeCommand { - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } - - - public int getLength(){ - return 1; - } -} diff --git a/group17/785396327/4.16/cmd/OneOperandCmd.java b/group17/785396327/4.16/cmd/OneOperandCmd.java deleted file mode 100644 index 4f3dbc9feb..0000000000 --- a/group17/785396327/4.16/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package cmd; - -import clz.ClassFile; - -/** - * Created by IBM on 2017/4/17. - */ -public abstract class OneOperandCmd extends ByteCodeCommand { - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } -} diff --git a/group17/785396327/4.16/cmd/PutFieldCmd.java b/group17/785396327/4.16/cmd/PutFieldCmd.java deleted file mode 100644 index f0994739a0..0000000000 --- a/group17/785396327/4.16/cmd/PutFieldCmd.java +++ /dev/null @@ -1,26 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.ConstantPool; -import engine.FrameResult; -import engine.StackFrame; - -/** - * Created by IBM on 2017/4/17. - */ -public class PutFieldCmd extends TwoOperandCmd { - public PutFieldCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - @Override - public void execute(StackFrame frame, FrameResult result) { - - } -} diff --git a/group17/785396327/4.16/cmd/TwoOperandCmd.java b/group17/785396327/4.16/cmd/TwoOperandCmd.java deleted file mode 100644 index a12df75e52..0000000000 --- a/group17/785396327/4.16/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,65 +0,0 @@ -package cmd; - -import clz.ClassFile; -import constant.*; - -/** - * Created by IBM on 2017/4/17. - */ -public abstract class TwoOperandCmd extends ByteCodeCommand { - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group17/785396327/4.16/print/ClassFilePrinter.java b/group17/785396327/4.16/print/ClassFilePrinter.java deleted file mode 100644 index 7d8c878553..0000000000 --- a/group17/785396327/4.16/print/ClassFilePrinter.java +++ /dev/null @@ -1,44 +0,0 @@ -package print; - -import clz.ClassFile; -import jvm_1.ClassFileLoader; - -/** - * Created by gongxun on 2017/4/21. - */ -public class ClassFilePrinter { - ClassFile clzFile = null; - public ClassFilePrinter(ClassFile clzFile){ - this.clzFile = clzFile; - } - - public void print(){ - - if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag : public "); - } - System.out.println("Class Name:"+ clzFile.getClassName()); - - System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMinorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - cnstPoolPrinter.print(); - } - - public static void main(String[] args){ - String path = "G:\\Git\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "jvm_1.EmployeeV1"; - - ClassFile clzFile = loader.loadClass(className); - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} diff --git a/group17/785396327/4.16/print/ConstantPoolPrinter.java b/group17/785396327/4.16/print/ConstantPoolPrinter.java deleted file mode 100644 index 6c4d4fee4a..0000000000 --- a/group17/785396327/4.16/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,114 +0,0 @@ -package print; - -import constant.*; - -/** - * Created by gongxun on 2017/4/21. - */ -public class ConstantPoolPrinter { - ConstantPool pool; - - ConstantPoolPrinter(ConstantPool pool) { - this.pool = pool; - } - - public void print() { - System.out.println("Constant Pool:"); - - ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { - @Override - public void visitClassInfo(ClassInfo info) { - // #7 = Class #44 // jvm_1/EmployeeV1 - StringBuilder sb = new StringBuilder(); - sb.append("Class") - .append("\t\t\t") - .append("#" + info.getUtf8Index()) - .append("\t\t\t\t") - .append("//\t") - .append(info.getClassName()); - System.out.println(sb.toString()); - } - - @Override - public void visitFieldRef(FieldRefInfo info) { - // #2 = Fieldref #7.#37 // jvm_1/EmployeeV1.name:Ljava/lang/String; - StringBuilder sb = new StringBuilder(); - sb.append("Fieldref") - .append("\t\t") - .append("#" + info.getClassInfoIndex()) - .append(".") - .append("#" + info.getNameAndTypeIndex()) - .append("\t\t\t") - .append("//\t") - .append(info.getClassName()) - .append(".") - .append(info.getFieldName()) - .append(info.getFieldType()); - System.out.println(sb.toString()); - } - - @Override - public void visitMethodRef(MethodRefInfo info) { - // #1 = Methodref #11.#36 // java/lang/Object."":()V - StringBuilder sb = new StringBuilder(); - sb.append("Methodref") - .append("\t\t") - .append("#" + info.getClassInfoIndex()) - .append(".") - .append("#" + info.getNameAndTypeIndex()) - .append("\t\t\t") - .append("//\t") - .append(info.getClassName()) - .append(".") - .append(info.getMethodName()); - System.out.println(sb.toString()); - } - - @Override - public void visitNameAndType(NameAndTypeInfo info) { - // #36 = NameAndType #16:#28 // "":()V - StringBuilder sb = new StringBuilder(); - sb.append("NameAndType") - .append("\t\t") - .append("#" + info.getIndex1()) - .append(":") - .append("#" + info.getIndex2()) - .append("\t\t\t") - .append("//\t") - .append(info.getTypeInfo()) - .append(":") - .append(info.getName()); - System.out.println(sb.toString()); - } - - @Override - public void visitString(StringInfo info) { - // #5 = String #41 // Hello , this is class Employee - StringBuilder sb = new StringBuilder(); - sb.append("String") - .append("\t\t\t") - .append("#" + info.getIndex()) - .append("\t\t\t\t") - .append("//\t") - .append(((UTF8Info) info.getConstantInfo(info.getIndex())).getValue()); - System.out.println(sb.toString()); - } - - @Override - public void visistUTF8(UTF8Info info) { - // #32 = Utf8 [Ljava/lang/String; - StringBuilder sb = new StringBuilder(); - sb.append("Utf8") - .append("\t\t\t") - .append(info.getValue()); - System.out.println(sb.toString()); - } - }; - - for (int i = 1; i < (Integer) pool.getSize(); i++) { - ConstantInfo constantInfo = pool.getConstantInfo(i); - System.out.print("#" + i + "\t=\t"); - constantInfo.accept(visitor); - } - } -} diff --git a/group17/785396327/4.23/engine/ExecutionResult.java b/group17/785396327/4.23/engine/ExecutionResult.java deleted file mode 100644 index 4dcb84fb62..0000000000 --- a/group17/785396327/4.23/engine/ExecutionResult.java +++ /dev/null @@ -1,55 +0,0 @@ -package engine; - -import method.Method; - -/** - * Created by gongxun on 2017/4/24. - */ -public class ExecutionResult { - public static final int RUN_NEXT_CMD = 1; - public static final int JUMP = 2; - public static final int EXIT_CURRENT_FRAME = 3; - public static final int PAUSE_AND_RUN_NEW_FRAME = 4; - - private int nextAction = RUN_NEXT_CMD; - - private int nextCmdOffset = 0; - - private Method nextMethod; - - public Method getNextMethod() { - return nextMethod; - } - public void setNextMethod(Method nextMethod) { - this.nextMethod = nextMethod; - } - - - - public void setNextAction(int action){ - this.nextAction = action; - } - public boolean isPauseAndRunNewFrame(){ - return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; - } - public boolean isExitCurrentFrame(){ - return this.nextAction == EXIT_CURRENT_FRAME; - } - - public boolean isRunNextCmd(){ - return this.nextAction == RUN_NEXT_CMD; - } - - public boolean isJump(){ - return this.nextAction == JUMP; - } - - public int getNextCmdOffset() { - return nextCmdOffset; - } - - public void setNextCmdOffset(int nextCmdOffset) { - this.nextCmdOffset = nextCmdOffset; - } - -} diff --git a/group17/785396327/4.23/engine/ExecutorEngine.java b/group17/785396327/4.23/engine/ExecutorEngine.java deleted file mode 100644 index 729d7c12be..0000000000 --- a/group17/785396327/4.23/engine/ExecutorEngine.java +++ /dev/null @@ -1,29 +0,0 @@ -package engine; - -import method.Method; -import stack.Stack; - -/** - * Created by gongxun on 2017/4/24. - */ -public class ExecutorEngine { - private Stack stack = new Stack(); - - public ExecutorEngine() { - - } - - public void execute(Method mainMethod){ - - - - } - - - - private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { - - - - } -} diff --git a/group17/785396327/4.23/engine/FrameResult.java b/group17/785396327/4.23/engine/FrameResult.java deleted file mode 100644 index 7630e0a37a..0000000000 --- a/group17/785396327/4.23/engine/FrameResult.java +++ /dev/null @@ -1,7 +0,0 @@ -package engine; - -/** - * Created by gongxun on 2017/4/24. - */ -public class FrameResult { -} diff --git a/group17/785396327/4.23/engine/Heap.java b/group17/785396327/4.23/engine/Heap.java deleted file mode 100644 index dc7c2ccf6f..0000000000 --- a/group17/785396327/4.23/engine/Heap.java +++ /dev/null @@ -1,41 +0,0 @@ -package engine; - -/** - * Created by gongxun on 2017/4/24. - */ -public class Heap { - /** - * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 - */ - - private static Heap instance = new Heap(); - private Heap() { - } - public static Heap getInstance(){ - return instance; - } - public JavaObject newObject(String clzName){ - - JavaObject jo = new JavaObject(JavaObject.OBJECT); - jo.setClassName(clzName); - return jo; - } - - public JavaObject newString(String value){ - JavaObject jo = new JavaObject(JavaObject.STRING); - jo.setStringValue(value); - return jo; - } - - public JavaObject newFloat(float value){ - JavaObject jo = new JavaObject(JavaObject.FLOAT); - jo.setFloatValue(value); - return jo; - } - public JavaObject newInt(int value){ - JavaObject jo = new JavaObject(JavaObject.INT); - jo.setIntValue(value); - return jo; - } - -} diff --git a/group17/785396327/4.23/engine/JavaObject.java b/group17/785396327/4.23/engine/JavaObject.java deleted file mode 100644 index efd8adf5df..0000000000 --- a/group17/785396327/4.23/engine/JavaObject.java +++ /dev/null @@ -1,73 +0,0 @@ -package engine; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by gongxun on 2017/4/24. - */ -public class JavaObject { - public static final int OBJECT = 1; - public static final int STRING = 2; - public static final int INT = 3; - public static final int FLOAT = 4; - - int type; - private String className; - - private Map fieldValues = new HashMap(); - - private String stringValue; - - private int intValue; - - private float floatValue; - - public void setFieldValue(String fieldName, JavaObject fieldValue){ - fieldValues.put(fieldName, fieldValue); - } - public JavaObject(int type){ - this.type = type; - } - public void setClassName(String className){ - this.className = className; - } - public void setStringValue(String value){ - stringValue = value; - } - public String getStringValue(){ - return this.stringValue; - } - public void setIntValue(int value) { - this.intValue = value; - } - public int getIntValue(){ - return this.intValue; - } - public int getType(){ - return type; - } - public JavaObject getFieldValue(String fieldName){ - return this.fieldValues.get(fieldName); - } - public String toString(){ - switch(this.getType()){ - case INT: - return String.valueOf(this.intValue); - case STRING: - return this.stringValue; - case OBJECT: - return this.className +":"+ this.fieldValues; - case FLOAT : - return String.valueOf(this.floatValue); - default: - return null; - } - } - public String getClassName(){ - return this.className; - } - public void setFloatValue(float value) { - this.floatValue = value; - } -} diff --git a/group17/785396327/4.23/engine/MethodArea.java b/group17/785396327/4.23/engine/MethodArea.java deleted file mode 100644 index 3ede83b192..0000000000 --- a/group17/785396327/4.23/engine/MethodArea.java +++ /dev/null @@ -1,70 +0,0 @@ -package engine; - -import clz.ClassFile; -import constant.MethodRefInfo; -import jvm_1.ClassFileLoader; -import method.Method; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by gongxun on 2017/4/24. - */ -public class MethodArea { - public static final MethodArea instance = new MethodArea(); - - /** - * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 - */ - - private ClassFileLoader clzLoader = null; - - Map map = new HashMap(); - - private MethodArea(){ - } - - public static MethodArea getInstance(){ - return instance; - } - - public void setClassFileLoader(ClassFileLoader clzLoader){ - this.clzLoader = clzLoader; - } - - public Method getMainMethod(String className){ - - ClassFile clzFile = this.findClassFile(className); - - return clzFile.getMainMethod(); - } - - - public ClassFile findClassFile(String className){ - - if(map.get(className) != null){ - return map.get(className); - } - // 看来该class 文件还没有load过 - ClassFile clzFile = this.clzLoader.loadClass(className); - - map.put(className, clzFile); - - return clzFile; - - } - - - public Method getMethod(String className, String methodName, String paramAndReturnType){ - - return null; - } - - - public Method getMethod(MethodRefInfo methodRef){ - - return null; - - } -} diff --git a/group17/785396327/4.23/engine/MiniJVM.java b/group17/785396327/4.23/engine/MiniJVM.java deleted file mode 100644 index 19094eee23..0000000000 --- a/group17/785396327/4.23/engine/MiniJVM.java +++ /dev/null @@ -1,29 +0,0 @@ -package engine; - -import jvm_1.ClassFileLoader; - -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * Created by gongxun on 2017/4/24. - */ -public class MiniJVM { - public void run(String[]classPaths , String className) throws FileNotFoundException, IOException { - - ClassFileLoader loader = new ClassFileLoader(); - for(int i=0;i localVariableTable = new ArrayList(); - private Stack oprandStack = new Stack(); - - int index = 0; - - private Method m = null; - - private StackFrame callerFrame = null; - - public StackFrame getCallerFrame() { - return callerFrame; - } - - public void setCallerFrame(StackFrame callerFrame) { - this.callerFrame = callerFrame; - } - - - - - public static StackFrame create(Method m){ - - StackFrame frame = new StackFrame( m ); - - return frame; - } - - - private StackFrame(Method m) { - this.m = m; - - } - - - - public JavaObject getLocalVariableValue(int index){ - return this.localVariableTable.get(index); - } - - public Stack getOprandStack(){ - return this.oprandStack; - } - - public int getNextCommandIndex(int offset){ - - ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); - for(int i=0;i values){ - this.localVariableTable = values; - } - - public void setLocalVariableValue(int index, JavaObject jo){ - //问题: 为什么要这么做?? - if(this.localVariableTable.size()-1 < index){ - for(int i=this.localVariableTable.size(); i<=index; i++){ - this.localVariableTable.add(null); - } - } - this.localVariableTable.set(index, jo); - - - } - - public Method getMethod(){ - return m; - } -} diff --git a/group17/785396327/4.23/queue/CircleQueue.java b/group17/785396327/4.23/queue/CircleQueue.java deleted file mode 100644 index a7ab62bf55..0000000000 --- a/group17/785396327/4.23/queue/CircleQueue.java +++ /dev/null @@ -1,59 +0,0 @@ -package queue; - -import java.util.Arrays; - -/** - * Created by gongxun on 2017/4/24. - * 用数组实现循环队列 - */ -public class CircleQueue { - private final static int DEFAULT_SIZE = 10; - - //用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE]; - - //队头 - private int front = 0; - //队尾 - private int rear = 0; - - public boolean isEmpty() { - return front == rear && elementData[front] == null; - - } - - public int size() { - if (isEmpty()) - return 0; - return front - rear > 0 ? DEFAULT_SIZE - front + rear : front - rear < 0 ? rear - front : DEFAULT_SIZE; - } - - - public void enQueue(E data) { - if (size() != DEFAULT_SIZE) { - elementData[rear] = data; - if (rear == DEFAULT_SIZE - 1) - rear = 0; - else - rear++; - } - } - - public E deQueue() { - E removeEle = null; - if (!isEmpty()) { - removeEle = (E) elementData[front]; - elementData[front] = null; - if (front == DEFAULT_SIZE - 1) - front = 0; - else - front++; - } - return removeEle; - } - - @Override - public String toString() { - return Arrays.toString(elementData); - } -} diff --git a/group17/785396327/4.23/queue/CircleQueueTest.java b/group17/785396327/4.23/queue/CircleQueueTest.java deleted file mode 100644 index 1a3f97d9bf..0000000000 --- a/group17/785396327/4.23/queue/CircleQueueTest.java +++ /dev/null @@ -1,62 +0,0 @@ -package queue; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by gongxun on 2017/4/25. - */ -public class CircleQueueTest { - @Before - public void startUp() { - - } - - @After - public void tearDown() { - - } - - @Test - public void testEnQueue() { - CircleQueue circleQueue = new CircleQueue(); - { - for (int i = 0; i < 9; i++) { - circleQueue.enQueue(i); - } - } - - { - - Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, null]", circleQueue.toString()); - Assert.assertEquals(9, circleQueue.size()); - - circleQueue.enQueue(9); - Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); - Assert.assertEquals(10, circleQueue.size()); - - circleQueue.enQueue(10); - Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); - Assert.assertEquals(10, circleQueue.size()); - } - - { - int removeEle = circleQueue.deQueue(); - Assert.assertEquals(0, removeEle); - circleQueue.deQueue(); - circleQueue.deQueue(); - circleQueue.deQueue(); - Assert.assertEquals("[null, null, null, null, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); - } - { - circleQueue.enQueue(-1); - Assert.assertEquals("[-1, null, null, null, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); - Assert.assertEquals(7, circleQueue.size()); - } - - } - - -} diff --git a/group17/785396327/4.23/queue/Josephus.java b/group17/785396327/4.23/queue/Josephus.java deleted file mode 100644 index 7285c64dfe..0000000000 --- a/group17/785396327/4.23/queue/Josephus.java +++ /dev/null @@ -1,39 +0,0 @@ -package queue; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by gongxun on 2017/4/24. - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * 该方法返回一个List, 包含了被杀死人的次序 - */ -public class Josephus { - public static List execute(int n, int m) { - if (m <= 0) - return null; - List origin = new ArrayList(); - List sequence = new ArrayList(); - for (int i = 0; i < n; i++) { - origin.add(i); - } - int count = 1;//计数器 - int index = count - 1;//当前元素的索引 - while (origin.size() > 1) { - if (count == m) { - sequence.add(origin.remove(index)); - count = 1;//删除一个元素,则重新计数 - } else { - count++; - if (index == origin.size() - 1) - //遍历到最后一个元素,重回头索引 - index = 0; - else - index++; - } - } - sequence.add(origin.get(0)); - return sequence; - } -} diff --git a/group17/785396327/4.23/queue/JosephusTest.java b/group17/785396327/4.23/queue/JosephusTest.java deleted file mode 100644 index 87fe65211d..0000000000 --- a/group17/785396327/4.23/queue/JosephusTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package queue; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by gongxun on 2017/4/24. - */ -public class JosephusTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testExecute() { - - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); - Assert.assertEquals("[1, 0, 2]", Josephus.execute(3, 2).toString()); - } -} diff --git a/group17/785396327/4.23/queue/QueueWithTwoStacks.java b/group17/785396327/4.23/queue/QueueWithTwoStacks.java deleted file mode 100644 index 995bab9904..0000000000 --- a/group17/785396327/4.23/queue/QueueWithTwoStacks.java +++ /dev/null @@ -1,54 +0,0 @@ -package queue; - -import stack.Stack; - -/** - * Created by gongxun on 2017/4/24. - */ -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - - public boolean isEmpty() { - return stack1.size() == 0; - } - - - public int size() { - return stack1.size(); - } - - - public void enQueue(E item) { - Stack temp = new Stack(); - stack1.push(item); - while (!stack2.isEmpty()) - temp.push(stack2.pop()); - temp.push(item); - while (!temp.isEmpty()) - stack2.push(temp.pop()); - } - - public E deQueue() { - Stack temp = new Stack(); - E ele = stack2.pop(); - while (!stack1.isEmpty()) - temp.push(stack1.pop()); - temp.pop(); - while (!temp.isEmpty()) - stack1.push(temp.pop()); - return ele; - } - - @Override - public String toString() { - return stack1.toString() + "\n" + stack2.toString(); - } -} diff --git a/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java b/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java deleted file mode 100644 index e0c90c4b66..0000000000 --- a/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package queue; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by gongxun on 2017/4/26. - */ -public class QueueWithTwoStacksTest { - - private QueueWithTwoStacks queue; - - @Before - public void startUp() { - queue = new QueueWithTwoStacks(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - } - - @After - public void tearDown() { - - } - - @Test - public void enQueueTest() { - System.out.println(queue); - } - - @Test - public void deQueueTest() { - queue.deQueue(); - System.out.println(queue); - } -} diff --git a/group17/785396327/4.5/clz/AccessFlag.java b/group17/785396327/4.5/clz/AccessFlag.java deleted file mode 100644 index bbdf7c8818..0000000000 --- a/group17/785396327/4.5/clz/AccessFlag.java +++ /dev/null @@ -1,28 +0,0 @@ -package clz; - -/** - * Created by IBM on 2017/4/10. - */ -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; - } - -} diff --git a/group17/785396327/4.5/clz/ClassFile.java b/group17/785396327/4.5/clz/ClassFile.java deleted file mode 100644 index f53199e6bb..0000000000 --- a/group17/785396327/4.5/clz/ClassFile.java +++ /dev/null @@ -1,120 +0,0 @@ -package clz; - -import constant.ClassInfo; -import constant.ConstantInfo; -import constant.ConstantPool; -import field.Field; -import method.Method; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by IBM on 2017/4/10. - */ -public class ClassFile { - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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()); - - System.out.println("Constant pool:"); - - - } - - public String getClassName(){ - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - - public Method getMethod(String methodName, String paramAndReturnType) { - if (methods != null) { - for (Method method : methods) { - String name = getConstantPool().getUTF8String(method.getNameIndex()); - String desc = getConstantPool().getUTF8String(method.getDescriptorIndex()); - if(name.equals(methodName)&&desc.equals(paramAndReturnType)) - return method; - } - } - return null; - } - public Method getMainMethod(){ - if (methods != null) { - for (Method method : methods) { - String name = getConstantPool().getUTF8String(method.getNameIndex()); - String desc = getConstantPool().getUTF8String(method.getDescriptorIndex()); - if(name.equals("main")&&desc.equals("([Ljava/lang/String;)V")) - return method; - } - } - return null; - } -} diff --git a/group17/785396327/4.5/clz/ClassIndex.java b/group17/785396327/4.5/clz/ClassIndex.java deleted file mode 100644 index d0eb281a09..0000000000 --- a/group17/785396327/4.5/clz/ClassIndex.java +++ /dev/null @@ -1,25 +0,0 @@ -package clz; - -/** - * Created by IBM on 2017/4/10. - */ -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; - } -} diff --git a/group17/785396327/4.5/constant/ClassInfo.java b/group17/785396327/4.5/constant/ClassInfo.java deleted file mode 100644 index 02aa4b2699..0000000000 --- a/group17/785396327/4.5/constant/ClassInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package constant; - -/** - * Created by IBM on 2017/4/10. - */ -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; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } - - public String getClassName() { - int index = getUtf8Index(); - UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); - return utf8Info.getValue(); - } -} diff --git a/group17/785396327/4.5/constant/ConstantInfo.java b/group17/785396327/4.5/constant/ConstantInfo.java deleted file mode 100644 index 156d96827d..0000000000 --- a/group17/785396327/4.5/constant/ConstantInfo.java +++ /dev/null @@ -1,50 +0,0 @@ -package constant; - -/** - * Created by IBM on 2017/4/10. - */ -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); - } - - public abstract void accept(Visitor visitor); - - public interface Visitor { - void visitClassInfo(ClassInfo info); - - void visitFieldRef(FieldRefInfo info); - - void visitMethodRef(MethodRefInfo info); - - void visitNameAndType(NameAndTypeInfo info); - - void visitString(StringInfo info); - - void visistUTF8(UTF8Info info); - - } -} diff --git a/group17/785396327/4.5/constant/ConstantPool.java b/group17/785396327/4.5/constant/ConstantPool.java deleted file mode 100644 index 396ccee230..0000000000 --- a/group17/785396327/4.5/constant/ConstantPool.java +++ /dev/null @@ -1,32 +0,0 @@ -package constant; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by IBM on 2017/4/10. - */ -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/group17/785396327/4.5/constant/FieldRefInfo.java b/group17/785396327/4.5/constant/FieldRefInfo.java deleted file mode 100644 index 2f3d2ee351..0000000000 --- a/group17/785396327/4.5/constant/FieldRefInfo.java +++ /dev/null @@ -1,62 +0,0 @@ -package constant; - -/** - * Created by IBM on 2017/4/10. - */ -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; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } - - 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/group17/785396327/4.5/constant/MethodRefInfo.java b/group17/785396327/4.5/constant/MethodRefInfo.java deleted file mode 100644 index 7a95d2a6bb..0000000000 --- a/group17/785396327/4.5/constant/MethodRefInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package constant; - -/** - * Created by IBM on 2017/4/10. - */ -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; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - - 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.getNameAndTypeIndex(); - } - - 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(); - } - -} diff --git a/group17/785396327/4.5/constant/NameAndTypeInfo.java b/group17/785396327/4.5/constant/NameAndTypeInfo.java deleted file mode 100644 index c7e720c0e3..0000000000 --- a/group17/785396327/4.5/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,57 +0,0 @@ -package constant; - -/** - * Created by IBM on 2017/4/10. - */ -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; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - } - - - 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/group17/785396327/4.5/constant/NullConstantInfo.java b/group17/785396327/4.5/constant/NullConstantInfo.java deleted file mode 100644 index c49d937c76..0000000000 --- a/group17/785396327/4.5/constant/NullConstantInfo.java +++ /dev/null @@ -1,20 +0,0 @@ -package constant; - -/** - * Created by IBM on 2017/4/10. - */ -public class NullConstantInfo extends ConstantInfo { - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - - @Override - public void accept(Visitor visitor) { - System.out.println("null Constant info"); - } - -} diff --git a/group17/785396327/4.5/constant/StringInfo.java b/group17/785396327/4.5/constant/StringInfo.java deleted file mode 100644 index 6953e7cdf8..0000000000 --- a/group17/785396327/4.5/constant/StringInfo.java +++ /dev/null @@ -1,34 +0,0 @@ -package constant; - -/** - * Created by IBM on 2017/4/10. - */ -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; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - } - - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } - - - public String toString(){ - return this.getConstantPool().getUTF8String(index); - } - -} diff --git a/group17/785396327/4.5/constant/UTF8Info.java b/group17/785396327/4.5/constant/UTF8Info.java deleted file mode 100644 index 814615f4f2..0000000000 --- a/group17/785396327/4.5/constant/UTF8Info.java +++ /dev/null @@ -1,39 +0,0 @@ -package constant; - -/** - * Created by IBM on 2017/4/10. - */ -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 void accept(Visitor visitor) { - visitor.visistUTF8(this); - } - - @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/group17/785396327/4.5/iterator/ByteCodeIterator.java b/group17/785396327/4.5/iterator/ByteCodeIterator.java deleted file mode 100644 index adfc288cc2..0000000000 --- a/group17/785396327/4.5/iterator/ByteCodeIterator.java +++ /dev/null @@ -1,64 +0,0 @@ -package iterator; - -import util.Util; - -import java.util.Arrays; - -/** - * Created by IBM on 2017/4/11. - */ -public class ByteCodeIterator { - - byte[] codes; - - public ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - public String nextU4ToHexString() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < 4; i++) { - byte code = codes[i]; - int value = code & 0xff; - sb.append(Integer.toHexString(value)); - } - codes = Arrays.copyOfRange(codes, 4, codes.length); - return sb.toString(); - } - - public int nextU2ToInt() { - byte[] buff = new byte[]{codes[0], codes[1]}; - codes = Arrays.copyOfRange(codes, 2, codes.length); - return Util.byteToInt(buff); - } - - public int nextU1ToInt() { - byte[] buff = new byte[]{codes[0]}; - codes = Arrays.copyOfRange(codes, 1, codes.length); - return Util.byteToInt(buff); - } - - public byte[] nextLengthBytes(int length) { - byte[] result = new byte[length]; - for (int i = 0; i < length; i++) { - result[i] = codes[i]; - } - codes = Arrays.copyOfRange(codes, length, codes.length); - return result; - } - - public String nextLengthString(int length) { - byte[] result = new byte[length]; - for (int i = 0; i < length; i++) { - result[i] = codes[i]; - } - codes = Arrays.copyOfRange(codes, length, codes.length); - return Util.byteToHexString(result); - } - - public int nextU4ToInt() { - byte[] buff = new byte[]{codes[0], codes[1], codes[2], codes[3]}; - codes = Arrays.copyOfRange(codes, 4, codes.length); - return Util.byteToInt(buff); - } -} diff --git a/group17/785396327/4.5/parse/ClassFilePaser.java b/group17/785396327/4.5/parse/ClassFilePaser.java deleted file mode 100644 index eb6514f449..0000000000 --- a/group17/785396327/4.5/parse/ClassFilePaser.java +++ /dev/null @@ -1,121 +0,0 @@ -package parse; - -import clz.AccessFlag; -import clz.ClassFile; -import clz.ClassIndex; -import com.sun.corba.se.impl.orbutil.closure.Constant; -import constant.*; -import field.Field; -import iterator.ByteCodeIterator; -import method.Method; -import util.Util; - -import java.util.List; - -/** - * Created by william on 2017/4/11. - */ -public class ClassFilePaser { - private ClassFile classFile; - - public ClassFile parse(byte[] codes) { - classFile = new ClassFile(); - - ByteCodeIterator iterator = new ByteCodeIterator(codes); - String magic = iterator.nextU4ToHexString(); - if (!"cafebabe".equals(magic)) - return null; - - classFile.setMinorVersion(iterator.nextU2ToInt()); - classFile.setMajorVersion(iterator.nextU2ToInt()); - - ConstantPool constantPool = parseConstantPool(iterator); - classFile.setConstPool(constantPool); - - AccessFlag accessFlag = parseAccessFlag(iterator); - classFile.setAccessFlag(accessFlag); - - ClassIndex classIndex = parseClassIndex(iterator); - classFile.setClassIndex(classIndex); - - iterator.nextU2ToInt();//没有接口直接读取两个字节 - - int fieldCount = iterator.nextU2ToInt(); - for (int i = 0; i < fieldCount; i++) { - Field field = parseField(iterator, constantPool); - classFile.addField(field); - } - - int methodCount = iterator.nextU2ToInt(); - for (int i = 0; i < methodCount; i++) { - Method method = parseMethod(iterator, classFile); - classFile.addMethod(method); - } - return classFile; - } - - private Method parseMethod(ByteCodeIterator iterator, ClassFile classFile) { - return Method.parse(classFile,iterator); - } - - private Field parseField(ByteCodeIterator iterator, ConstantPool constantPool) { - return Field.parse(constantPool, iterator); - } - - private ClassIndex parseClassIndex(ByteCodeIterator iterator) { - ClassIndex classIndex = new ClassIndex(); - classIndex.setThisClassIndex(iterator.nextU2ToInt()); - classIndex.setSuperClassIndex(iterator.nextU2ToInt()); - return classIndex; - } - - private AccessFlag parseAccessFlag(ByteCodeIterator iterator) { - AccessFlag accessFlag = new AccessFlag(iterator.nextU2ToInt()); - return accessFlag; - } - - private ConstantPool parseConstantPool(ByteCodeIterator iterator) { - int poolSize = iterator.nextU2ToInt(); - System.out.println("constant pool size = " + (poolSize - 1)); - - ConstantPool constantPool = new ConstantPool(); - - constantPool.addConstantInfo(new NullConstantInfo()); - for (int i = 1; i < poolSize; i++) { - int tag = iterator.nextU1ToInt(); - if (tag == ConstantInfo.CLASS_INFO) { - ClassInfo classInfo = new ClassInfo(constantPool); - classInfo.setUtf8Index(iterator.nextU2ToInt()); - constantPool.addConstantInfo(classInfo); - } else if (tag == ConstantInfo.METHOD_INFO) { - MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool); - methodRefInfo.setClassInfoIndex(iterator.nextU2ToInt()); - methodRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt()); - constantPool.addConstantInfo(methodRefInfo); - } else if (tag == ConstantInfo.FIELD_INFO) { - FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool); - fieldRefInfo.setClassInfoIndex(iterator.nextU2ToInt()); - fieldRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt()); - constantPool.addConstantInfo(fieldRefInfo); - } else if (tag == ConstantInfo.STRING_INFO) { - StringInfo stringInfo = new StringInfo(constantPool); - stringInfo.setIndex(iterator.nextU2ToInt()); - constantPool.addConstantInfo(stringInfo); - } else if (tag == ConstantInfo.NAME_AND_TYPE_INFO) { - NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool); - nameAndTypeInfo.setIndex1(iterator.nextU2ToInt()); - nameAndTypeInfo.setIndex2(iterator.nextU2ToInt()); - constantPool.addConstantInfo(nameAndTypeInfo); - } else if (tag == ConstantInfo.UTF8_INFO) { - UTF8Info utf8Info = new UTF8Info(constantPool); - int length = iterator.nextU2ToInt(); - utf8Info.setLength(length); - utf8Info.setValue(new String(iterator.nextLengthBytes(length))); - constantPool.addConstantInfo(utf8Info); - } else { - System.out.println("other class info "); - } - } - return constantPool; - } -} diff --git a/group17/785396327/4.5/stack/MyStack.java b/group17/785396327/4.5/stack/MyStack.java deleted file mode 100644 index 80ee0fdd62..0000000000 --- a/group17/785396327/4.5/stack/MyStack.java +++ /dev/null @@ -1,35 +0,0 @@ -package stack; - -import java.util.ArrayList; - -/** - * Created by gongxun on 2017/4/12. - */ -public class MyStack { - private ArrayList elementData = new ArrayList(); - - public void push(T o) { - elementData.add(0, o); - } - - public T pop() { - return elementData.remove(0); - } - - public T peek() { - return elementData.get(0); - } - - public boolean isEmpty() { - return elementData.isEmpty(); - } - - public int size() { - return elementData.size(); - } - - @Override - public String toString() { - return elementData.toString(); - } -} diff --git a/group17/785396327/4.5/stack/StackUtil.java b/group17/785396327/4.5/stack/StackUtil.java deleted file mode 100644 index afaa5fce1b..0000000000 --- a/group17/785396327/4.5/stack/StackUtil.java +++ /dev/null @@ -1,115 +0,0 @@ -package stack; - -/** - * Created by gongxun on 2017/4/12. - */ -public class StackUtil { - public static void bad_reverse(MyStack s) { - - } - - - public static void reverse_247565311(MyStack s) { - - } - - - /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - */ - public static void reverse(MyStack s) { - MyStack tempStack = new MyStack(); - while (!s.isEmpty()) - addToBottom(tempStack, s.pop()); - while (!tempStack.isEmpty()) - s.push(tempStack.pop()); - } - - public static void addToBottom(MyStack s, Integer value) { - MyStack reserveStack = new MyStack(); - while (!s.isEmpty()) - reserveStack.push(s.pop()); - s.push(value); - while (!reserveStack.isEmpty()) - s.push(reserveStack.pop()); - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(MyStack s, Object o) { - if (null == o) - return; - MyStack tempStack = new MyStack(); - while (!s.isEmpty()) { - if (!s.peek().equals(o)) { - tempStack.push(s.pop()); - } else { - s.pop(); - break; - } - } - while (!tempStack.isEmpty()) - s.push(tempStack.pop()); - } - - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param len - * @return - */ - public static Object[] getTop(MyStack s, int len) { - if (len > s.size()) - return null; - Object[] datas = new Object[len]; - for (int i = 0; i < len; i++) { - datas[i] = s.pop(); - } - return datas; - } - - /** - * 字符串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) { - if (s == null || s.trim().isEmpty()) - return false; - String[] arr = s.split(""); - MyStack stack = new MyStack(); - for (int i = 0; i < arr.length; i++) { - if ("(".equals(arr[i]) || "[".equals(arr[i]) || "{".equals(arr[i])) - stack.push(arr[i]); - if (")".equals(arr[i])) { - if (stack.peek().equals("(")) - stack.pop(); - else - return false; - } - if ("]".equals(arr[i])) { - if (stack.peek().equals("[")) - stack.pop(); - else - return false; - } - if ("}".equals(arr[i])) { - if (stack.peek().equals("{")) - stack.pop(); - else - return false; - } - } - return stack.size() == 0;//最后判断stack中没有元素了,可能有单个括号 - } -} diff --git a/group17/785396327/4.5/stack/StackUtilTest.java b/group17/785396327/4.5/stack/StackUtilTest.java deleted file mode 100644 index bf411a953a..0000000000 --- a/group17/785396327/4.5/stack/StackUtilTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package stack; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by gongxun on 2017/4/12. - */ -public class StackUtilTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - /** - * [头元素,...,尾元素] - */ - @Test - public void testStack() { - MyStack stack = new MyStack(); - stack.push(1); - stack.push(2); - System.out.println(stack); - } - - @Test - public void testAddToBottom() { - MyStack s = new MyStack(); - s.push(1); - s.push(2); - s.push(3); - - StackUtil.addToBottom(s, 0); - - Assert.assertEquals("[3, 2, 1, 0]", s.toString()); - - } - - @Test - public void testReverse() { - MyStack s = new MyStack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - } - - @Test - public void testReverse_247565311() { - MyStack s = new MyStack(); - s.push(1); - s.push(2); - s.push(3); - - Assert.assertEquals("[1, 2, 3]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[3, 2, 1]", s.toString()); - } - - @Test - public void testRemove() { - MyStack s = new MyStack(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("[3, 1]", s.toString()); - } - - @Test - public void testGetTop() { - MyStack s = new MyStack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } - } - - @Test - public void testIsValidPairs() { - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } - -} diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java deleted file mode 100644 index 2276ee4eaf..0000000000 --- a/group17/785396327/4.5/test/ClassFileloaderTest.java +++ /dev/null @@ -1,348 +0,0 @@ -package test; - -import clz.ClassFile; -import clz.ClassIndex; -import cmd.BiPushCmd; -import cmd.ByteCodeCommand; -import cmd.OneOperandCmd; -import cmd.TwoOperandCmd; -import constant.*; -import field.Field; -import jvm_1.ClassFileLoader; -import method.Method; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.util.List; - -/** - * Created by IBM on 2017/4/10. - */ -public class ClassFileloaderTest { - private static final String FULL_QUALIFIED_CLASS_NAME = "jvm_1/EmployeeV1"; - - static String path1 = "G:\\Git\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; - static String path2 = "C:\temp"; - - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "jvm_1.EmployeeV1"; - - clzFile = loader.loadClass(className); - clzFile.print(); - } - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "jvm_1.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1020, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(17); - Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(18); - Assert.assertEquals("Code", utf8Info.getValue()); - } - - { - MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(1); - Assert.assertEquals(11, methodRef.getClassInfoIndex()); - Assert.assertEquals(36, 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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab700012a2bb500022a1cb50003b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb50002b1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50003b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b200041205b60006b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb0007591208101db700094c2bb6000ab1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #1", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #2", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #3", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #2", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #4", cmds[0]); - assertOpCodeEquals("3: ldc #5", cmds[1]); - assertOpCodeEquals("5: invokevirtual #6", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #7", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #8", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #9", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #10", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - - -} diff --git a/group17/785396327/4.5/util/Util.java b/group17/785396327/4.5/util/Util.java deleted file mode 100644 index e35332238c..0000000000 --- a/group17/785396327/4.5/util/Util.java +++ /dev/null @@ -1,28 +0,0 @@ -package util; - -/** - * Created by william on 2017/4/10. - */ -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 items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter,int attributeNameIndex) { - int attributeLength = iter.nextU4ToInt(); - int lineNumberTableLength = iter.nextU2ToInt(); - LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex,attributeLength); - for (int i = 0; i < lineNumberTableLength; i++) { - int start_pc = iter.nextU2ToInt(); - int lineNumber = iter.nextU2ToInt(); - LineNumberItem lineNumberItem = new LineNumberItem(); - lineNumberItem.setLineNum(lineNumber); - lineNumberItem.setStartPC(start_pc); - lineNumberTable.addLineNumberItem(lineNumberItem); - } - return lineNumberTable; - } - - -} diff --git a/group17/785396327/4.9/attr/LocalVariableItem.java b/group17/785396327/4.9/attr/LocalVariableItem.java deleted file mode 100644 index d0213e92f5..0000000000 --- a/group17/785396327/4.9/attr/LocalVariableItem.java +++ /dev/null @@ -1,42 +0,0 @@ -package attr; - -/** - * Created by IBM on 2017/4/12. - */ -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group17/785396327/4.9/attr/LocalVariableTable.java b/group17/785396327/4.9/attr/LocalVariableTable.java deleted file mode 100644 index 9cb74c9697..0000000000 --- a/group17/785396327/4.9/attr/LocalVariableTable.java +++ /dev/null @@ -1,43 +0,0 @@ -package attr; - -import iterator.ByteCodeIterator; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by william on 2017/4/12. - */ -public class LocalVariableTable extends AttributeInfo { - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter, int attributeNameIndex) { - int attributeLength = iter.nextU4ToInt(); - int localVariableTableLength = iter.nextU2ToInt(); - LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex, attributeLength); - for (int i = 0; i < localVariableTableLength; i++) { - int startPc = iter.nextU2ToInt(); - int length = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int index = iter.nextU2ToInt(); - LocalVariableItem localVariableItem = new LocalVariableItem(); - localVariableItem.setStartPC(startPc); - localVariableItem.setLength(length); - localVariableItem.setNameIndex(nameIndex); - localVariableItem.setDescIndex(descIndex); - localVariableItem.setIndex(index); - localVariableTable.addLocalVariableItem(localVariableItem); - } - return localVariableTable; - } - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - -} diff --git a/group17/785396327/4.9/attr/StackMapTable.java b/group17/785396327/4.9/attr/StackMapTable.java deleted file mode 100644 index fce272fd9f..0000000000 --- a/group17/785396327/4.9/attr/StackMapTable.java +++ /dev/null @@ -1,31 +0,0 @@ -package attr; - -import iterator.ByteCodeIterator; - -/** - * Created by william on 2017/4/12. - */ -public class StackMapTable extends AttributeInfo { - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter,int index){ -// int len = iter.nextU4ToInt(); -// StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 -// String code = iter.nextUxToHexString(len); -// t.setOriginalCode(code); - -// return t; - return null; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group17/785396327/4.9/expr/ExprParser.java b/group17/785396327/4.9/expr/ExprParser.java deleted file mode 100644 index 09a909fbad..0000000000 --- a/group17/785396327/4.9/expr/ExprParser.java +++ /dev/null @@ -1,37 +0,0 @@ -package expr; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by IBM on 2017/4/15. - */ -public class ExprParser { - - public static List parse(InfixExpr infixExpr) { - if (infixExpr == null || infixExpr.expr == null || infixExpr.expr.trim().isEmpty()) - return null; - String[] split = infixExpr.expr.split(""); - List results = new ArrayList(); - StringBuilder numberBuffer = new StringBuilder(); - for (int i = 0; i < split.length; i++) { - String ele = split[i]; - if (ele.equals(OperEnum.ADD.getOperator()) || ele.equals(OperEnum.SUBTRACT.getOperator()) || ele.equals(OperEnum.MINUS.getOperator()) || ele.equals(OperEnum.MULTIPLY.getOperator())) { - results.add(numberBuffer.toString()); - numberBuffer.delete(0, numberBuffer.length()); - results.add(ele); - } else - numberBuffer.append(ele); - } - results.add(numberBuffer.toString()); - return results; - } - - public static boolean belongsHighPriority(String operEle) { - return belongsOperator(operEle) && (operEle.trim().equals(OperEnum.MINUS.getOperator()) || operEle.trim().equals(OperEnum.MULTIPLY.getOperator())); - } - - public static boolean belongsOperator(String operEle) { - return (operEle != null) && (operEle.trim().equals(OperEnum.ADD.getOperator()) || operEle.trim().equals(OperEnum.SUBTRACT.getOperator()) || operEle.trim().equals(OperEnum.MULTIPLY.getOperator()) || operEle.trim().equals(OperEnum.MINUS.getOperator())); - } -} diff --git a/group17/785396327/4.9/expr/InfixExpr.java b/group17/785396327/4.9/expr/InfixExpr.java deleted file mode 100644 index 9845d45809..0000000000 --- a/group17/785396327/4.9/expr/InfixExpr.java +++ /dev/null @@ -1,75 +0,0 @@ -package expr; - -import stack.MyStack; - -import java.util.List; - -/** - * Created by william on 2017/4/13. - */ -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - List operList = ExprParser.parse(this); - MyStack numberStack = new MyStack(); - MyStack operatorStack = new MyStack(); - if (operList != null) { - for (String operEle : operList) { - if (ExprParser.belongsOperator(operEle)) - operatorStack.push(operEle); - else { - numberStack.push(operEle); - if (!operatorStack.isEmpty() && ExprParser.belongsHighPriority(operatorStack.peek())) { - String highPriorityValue = calcHighOper(numberStack, operatorStack); - numberStack.push(highPriorityValue); - } - } - } - } - if (numberStack.size() != operatorStack.size() + 1) - throw new RuntimeException(" wrong operation number "); - return Float.parseFloat(calcSameOper(numberStack, operatorStack)); - } - - private String calcHighOper(MyStack numberStack, MyStack operatorStack) { - Float rightNumber = Float.parseFloat((String) numberStack.pop()); - Float leftNumber = Float.parseFloat((String) numberStack.pop()); - String oper = operatorStack.pop(); - return calc(rightNumber, leftNumber, oper); - } - - private String calcSameOper(MyStack numberStack, MyStack operatorStack) { - MyStack allStack = new MyStack(); - while (!operatorStack.isEmpty()) { - allStack.push(numberStack.pop()); - allStack.push(operatorStack.pop()); - } - allStack.push(numberStack.pop()); - while (allStack.size() != 1) { - Float leftNumber = Float.parseFloat((String) allStack.pop()); - String oper = (String) allStack.pop(); - Float rightNumber = Float.parseFloat((String) allStack.pop()); - allStack.push(calc(rightNumber, leftNumber, oper)); - } - return (String) allStack.pop(); - } - - private String calc(Float rightNumber, Float leftNumber, String oper) { - if (oper.equals(OperEnum.ADD.getOperator())) - return leftNumber + rightNumber + ""; - else if (oper.equals(OperEnum.SUBTRACT.getOperator())) - return leftNumber - rightNumber + ""; - else if (oper.equals(OperEnum.MULTIPLY.getOperator())) - return leftNumber * rightNumber + ""; - else if (oper.equals(OperEnum.MINUS.getOperator())) - return leftNumber / rightNumber + ""; - else - throw new RuntimeException("not support " + leftNumber + " " + oper + " " + rightNumber + " operation"); - } - -} diff --git a/group17/785396327/4.9/expr/InfixExprTest.java b/group17/785396327/4.9/expr/InfixExprTest.java deleted file mode 100644 index 1249bbf04b..0000000000 --- a/group17/785396327/4.9/expr/InfixExprTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.util.List; - -/** - * Created by IBM on 2017/4/13. - */ -public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - - @Test - public void testExprParser() { - InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - List parse = ExprParser.parse(expr); - System.out.println(parse); - } -} diff --git a/group17/785396327/4.9/expr/InfixToPostfix.java b/group17/785396327/4.9/expr/InfixToPostfix.java deleted file mode 100644 index 58fb60ef2b..0000000000 --- a/group17/785396327/4.9/expr/InfixToPostfix.java +++ /dev/null @@ -1,43 +0,0 @@ -package expr; - -import stack.MyStack; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by gongxun on 2017/4/22. - * 遇到数组直接放入集合等待输出 - * 遇到运算符入栈,如果栈顶元素的优先级较待入栈运算符的优先级高,将栈顶元素取出放入集合等待输出,否则直接入栈 - */ -public class InfixToPostfix { - public static List convert(String expr) { - List result = new ArrayList(); - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse(expr); - MyStack stack = new MyStack(); - if (tokens != null) { - for (Token token : tokens) { - if (token.isNumber()) - result.add(token); - else { - while (!stack.isEmpty()) { - Token prevOper = stack.peek(); - if (token.hasHigherPriority(prevOper)) { - stack.push(token); - break; - } else { - result.add(stack.pop()); - } - } - //和+或者-同优先级或者更高优先级的都已经弹栈,只剩空栈 - if (stack.isEmpty()) stack.push(token); - } - } - } - //将剩余的所有符号出栈 - while (!stack.isEmpty()) - result.add(stack.pop()); - return result; - } -} diff --git a/group17/785396327/4.9/expr/InfixToPostfixTest.java b/group17/785396327/4.9/expr/InfixToPostfixTest.java deleted file mode 100644 index f1dcd3f466..0000000000 --- a/group17/785396327/4.9/expr/InfixToPostfixTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by IBM on 2017/4/23. - */ -public class InfixToPostfixTest { - - - @Before - public void setUp() { - - } - - @After - public void tearDown() { - - } - - @Test - public void testConvert() { - { - Assert.assertEquals("[2, 3, 4, *, +, 5, +]", InfixToPostfix.convert("2+3*4+5").toString()); - } - { - Assert.assertEquals("[3, 20, *, 12, 5, *, +, 40, 2, /, -]", InfixToPostfix.convert("3*20+12*5-40/2").toString()); - } - - { - Assert.assertEquals("[3, 20, *, 2, /]", InfixToPostfix.convert("3*20/2").toString()); - } - - { - Assert.assertEquals("[20, 2, /, 3, *]", InfixToPostfix.convert("20/2*3").toString()); - } - } -} diff --git a/group17/785396327/4.9/expr/OperEnum.java b/group17/785396327/4.9/expr/OperEnum.java deleted file mode 100644 index adb41b75ff..0000000000 --- a/group17/785396327/4.9/expr/OperEnum.java +++ /dev/null @@ -1,21 +0,0 @@ -package expr; - -/** - * Created by IBM on 2017/4/15. - */ -public enum OperEnum { - ADD("+"), SUBTRACT("-"), MULTIPLY("*"), MINUS("/"); - private String operator; - - OperEnum(String operator) { - this.operator = operator; - } - - public String getOperator() { - return operator; - } - - public void setOperator(String operator) { - this.operator = operator; - } -} diff --git a/group17/785396327/4.9/expr/PostfixExpr.java b/group17/785396327/4.9/expr/PostfixExpr.java deleted file mode 100644 index c22b7788aa..0000000000 --- a/group17/785396327/4.9/expr/PostfixExpr.java +++ /dev/null @@ -1,48 +0,0 @@ -package expr; - -import stack.MyStack; - -import java.util.List; - -/** - * Created by gongxun on 2017/4/22. - */ -public class PostfixExpr { - String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser tokenParser = new TokenParser(); - if (expr == null) - throw new RuntimeException("wrong expr !"); - MyStack stack = new MyStack(); - List tokens = tokenParser.parse(expr); - if (tokens != null) { - for (Token token : tokens) { - if (token.isNumber()) - stack.push(((Integer) token.getIntValue()).floatValue()); - else { - Float value = calcValue(token, stack); - stack.push(value); - } - } - } - return stack.pop(); - } - - private Float calcValue(Token token, MyStack stack) { - String operator = token.toString(); - Float rightNum = stack.pop(); - Float leftNum = stack.pop(); - if (operator.equals("+")) - return leftNum + rightNum; - else if (operator.equals("-")) - return leftNum - rightNum; - else if (operator.equals("*")) - return leftNum * rightNum; - return leftNum / rightNum; - } -} diff --git a/group17/785396327/4.9/expr/PostfixExprTest.java b/group17/785396327/4.9/expr/PostfixExprTest.java deleted file mode 100644 index 378e8f2407..0000000000 --- a/group17/785396327/4.9/expr/PostfixExprTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by gongxun on 2017/4/22. - */ -public class PostfixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(), 0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } -} diff --git a/group17/785396327/4.9/expr/PrefixExpr.java b/group17/785396327/4.9/expr/PrefixExpr.java deleted file mode 100644 index b29ffa0c64..0000000000 --- a/group17/785396327/4.9/expr/PrefixExpr.java +++ /dev/null @@ -1,48 +0,0 @@ -package expr; - -import stack.MyStack; - -import java.util.List; - -/** - * Created by gongxun on 2017/4/22. - * 从后向前遍历入栈 - */ -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser tokenParser = new TokenParser(); - if (expr == null) - throw new RuntimeException("wrong expr !"); - MyStack stack = new MyStack(); - List tokens = tokenParser.parse(expr); - for (int i = tokens.size() - 1; i >= 0; i--) { - Token token = tokens.get(i); - if (token.isNumber()) - stack.push(((Integer) token.getIntValue()).floatValue()); - else { - Float value = calcValue(stack, token.toString()); - stack.push(value); - } - } - return stack.pop(); - } - - - private Float calcValue(MyStack stack, String operator) { - Float leftNum = stack.pop(); - Float rightNum = stack.pop(); - if (operator.equals("+")) - return leftNum + rightNum; - else if (operator.equals("-")) - return leftNum - rightNum; - else if (operator.equals("*")) - return leftNum * rightNum; - return leftNum / rightNum; - } -} diff --git a/group17/785396327/4.9/expr/PrefixExprTest.java b/group17/785396327/4.9/expr/PrefixExprTest.java deleted file mode 100644 index 326bfd9f2c..0000000000 --- a/group17/785396327/4.9/expr/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by gongxun on 2017/4/22. - */ -public class PrefixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(), 0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(), 0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(), 0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(), 0.001f); - } - - - } -} diff --git a/group17/785396327/4.9/expr/Token.java b/group17/785396327/4.9/expr/Token.java deleted file mode 100644 index 093be5c416..0000000000 --- a/group17/785396327/4.9/expr/Token.java +++ /dev/null @@ -1,52 +0,0 @@ -package expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by gongxun on 2017/4/22. - */ -public class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - -} diff --git a/group17/785396327/4.9/expr/TokenParser.java b/group17/785396327/4.9/expr/TokenParser.java deleted file mode 100644 index 6c54890a42..0000000000 --- a/group17/785396327/4.9/expr/TokenParser.java +++ /dev/null @@ -1,58 +0,0 @@ -package expr; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by gongxun on 2017/4/22. - */ -public class TokenParser { - public List parse(String expr) { - List tokens = new ArrayList(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ -// System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group17/785396327/4.9/expr/TokenParserTest.java b/group17/785396327/4.9/expr/TokenParserTest.java deleted file mode 100644 index 793ba1fe0b..0000000000 --- a/group17/785396327/4.9/expr/TokenParserTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.util.List; - -/** - * Created by gongxun on 2017/4/22. - */ -public class TokenParserTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - - @Test - public void testPostfixExprParser() { - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse("6 5 2 3 + 8 * + 3 + *"); - System.out.println(tokens); - } -} diff --git a/group17/785396327/4.9/field/Field.java b/group17/785396327/4.9/field/Field.java deleted file mode 100644 index dda04d2d4b..0000000000 --- a/group17/785396327/4.9/field/Field.java +++ /dev/null @@ -1,41 +0,0 @@ -package field; - -import constant.ConstantPool; -import iterator.ByteCodeIterator; - -/** - * Created by IBM on 2017/4/12. - */ -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - private ConstantPool pool; - - public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - - public static Field parse(ConstantPool pool, ByteCodeIterator iter) { - int accessFlags = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descriptor_index = iter.nextU2ToInt(); - int attributesCount = iter.nextU2ToInt(); - if (attributesCount > 0) { - throw new RuntimeException("Field字段表,暂时不支持存在属性"); - } - return new Field(accessFlags, nameIndex, descriptor_index, pool); - } - - @Override - public String toString() { - return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex); - } -} diff --git a/group17/785396327/4.9/method/Method.java b/group17/785396327/4.9/method/Method.java deleted file mode 100644 index 1b5daa244b..0000000000 --- a/group17/785396327/4.9/method/Method.java +++ /dev/null @@ -1,67 +0,0 @@ -package method; - -import attr.CodeAttr; -import clz.ClassFile; -import cmd.ByteCodeCommand; -import iterator.ByteCodeIterator; -import util.Util; - -/** - * Created by IBM on 2017/4/12. - */ -public class Method { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private CodeAttr codeAttr; - - private ClassFile clzFile; - - - public ClassFile getClzFile() { - return clzFile; - } - - public int getNameIndex() { - return nameIndex; - } - - public int getDescriptorIndex() { - return descriptorIndex; - } - - public CodeAttr getCodeAttr() { - return codeAttr; - } - - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } - - public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - } - - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { - int accessFlags = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descriptorIndex = iter.nextU2ToInt(); - int attributesCount = iter.nextU2ToInt();//有几个属性 - Method method = new Method(clzFile, accessFlags, nameIndex, descriptorIndex); - for (int i = 0; i < attributesCount; i++) { - CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); - method.setCodeAttr(codeAttr); - } - return method; - - } - - public ByteCodeCommand[] getCmds() { - return this.getCodeAttr().getCmds(); - } -} diff --git a/group17/82427129/.gitignore b/group17/82427129/.gitignore index 35cadcc5f6..090f729088 100644 --- a/group17/82427129/.gitignore +++ b/group17/82427129/.gitignore @@ -14,6 +14,4 @@ .project -Test.java - -Algorithms/ \ No newline at end of file +Test.java \ No newline at end of file diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 8fb9e91d57..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex;// u2 attribute_name_index - int attrLen;// u4 attribute_length - - public abstract String getType(); - public AttributeInfo(int attrNameIndex, int attrLen) { - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - public static AttributeInfo parse(ConstantPool pool, ByteCodeIterator itr) { - int attrNameIndex = itr.nextU2toInt(); - String attrName = ((UTF8Info) pool.getConstantInfo(attrNameIndex)) - .getValue(); - itr.back(2); - switch (attrName) { - case CODE: - return CodeAttr.parse(pool, itr); - case LINE_NUM_TABLE: - return LineNumberTable.parse(pool, itr); - case LOCAL_VAR_TABLE: - return LocalVariableTable.parse(pool, itr); - default: - throw new RuntimeException( - "attributeInfo exclude CodeAttr hasn't implemented"); - } - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index 1f9cfdc169..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class CodeAttr extends AttributeInfo { - - private static String TYPE = CODE; - private int maxStack;//u2 max_stack - private int maxLocals;//u2 max_locals - private int codeLenth;//u4 code_length - private String code;//u1 code[code_length] - private int exceptionTableLength;//u2 exception_table_length; - /* - * { u2 start_pc; - u2 end_pc; - u2 handler_pc; - u2 catch_type; - } exception_table[exception_table_length]; - private ExceptionTable exceptionTable;//unimplemented*/ - private int attrCount;//u2 attributes_count - private List AttrList = new ArrayList();//attribute_info attributes[attributes_count]; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, - int maxLocals, int codeLenth, String code, - int exceptionTableLength, int attrCount) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLenth = codeLenth; - this.code = code; - this.exceptionTableLength = exceptionTableLength; - this.attrCount = attrCount; - } - - /** - * 给CodeAttr 增加属性 - * @param a - */ - public void addAttr(AttributeInfo a){ - this.AttrList.add(a); - } - - @Override - public String getType() { - return TYPE; - } - - public static CodeAttr parse(ConstantPool pool, ByteCodeIterator itr) { - int attrNameIndex = itr.nextU2toInt(); - int attrLen = itr.nextU4toInt(); - int maxStack = itr.nextU2toInt(); - int maxLocals = itr.nextU2toInt(); - int codeLenth = itr.nextU4toInt(); - String code = itr.nextUxtoHexString(codeLenth); - int exceptionTableLength = itr.nextU2toInt(); - int attrCount = itr.nextU2toInt(); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, - codeLenth, code, exceptionTableLength, attrCount); - for (int i = 0; i < attrCount; i++) { - codeAttr.addAttr(AttributeInfo.parse(pool, itr)); - } - return codeAttr; - } - /* - * getter setter - */ - public int getMaxStack() { - return maxStack; - } - - public void setMaxStack(int maxStack) { - this.maxStack = maxStack; - } - - public int getMaxLocals() { - return maxLocals; - } - - public void setMaxLocals(int maxLocals) { - this.maxLocals = maxLocals; - } - - public int getCodeLenth() { - return codeLenth; - } - - public void setCodeLenth(int codeLenth) { - this.codeLenth = codeLenth; - } - - public void setCode(String code) { - this.code = code; - } - - public String getCode() { - return code; - } - - public int getAttrCount() { - return attrCount; - } - - public void setAttrCount(int attrCount) { - this.attrCount = attrCount; - } - - public List getAttrList() { - return AttrList; - } - - public void setAttrList(List attrList) { - AttrList = attrList; - } - - public int getExceptionTableLength() { - return exceptionTableLength; - } - - public void setExceptionTableLength(int exceptionTableLength) { - this.exceptionTableLength = exceptionTableLength; - } - - - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java deleted file mode 100644 index 4cce2e0368..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LineNumberTable extends AttributeInfo { - - private static String TYPE = LINE_NUM_TABLE; - private int lineNumberTableLength; - private List lineNumberTable = new ArrayList(); - - public LineNumberTable(int attrNameIndex, int attrLen, - int lineNumberTableLength) { - super(attrNameIndex, attrLen); - this.lineNumberTableLength = lineNumberTableLength; - } - - public void addLineNumberItem(LineNumberItem e) { - this.lineNumberTable.add(e); - } - - @Override - public String getType() { - return TYPE; - } - public static LineNumberTable parse(ConstantPool pool, ByteCodeIterator itr) { - int attrNameIndex = itr.nextU2toInt(); - int attrLen = itr.nextU4toInt(); - int lineNumberTableLength = itr.nextU2toInt(); - LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex, - attrLen, lineNumberTableLength); - for (int i = 0; i < lineNumberTableLength; i++) { - lineNumberTable.addLineNumberItem(LineNumberItem.parse(pool, itr)); - } - return lineNumberTable; - } - - /** - * - * @author Meng - * - */ - private static class LineNumberItem { - @SuppressWarnings("unused") - private int startPc; - @SuppressWarnings("unused") - private int lineNum; - - public LineNumberItem(int startPc, int lineNum) { - super(); - this.startPc = startPc; - this.lineNum = lineNum; - } - - public static LineNumberItem parse(ConstantPool pool, - ByteCodeIterator itr) { - int startPc = itr.nextU2toInt(); - int lineNum = itr.nextU2toInt(); - return new LineNumberTable.LineNumberItem(startPc, lineNum); - } - } - - /* - * getter setter - */ - public int getLineNumberTableLength() { - return lineNumberTableLength; - } - - public void setLineNumberTableLength(int lineNumberTableLength) { - this.lineNumberTableLength = lineNumberTableLength; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java deleted file mode 100644 index b5d5147a3f..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo { - - private static String TYPE = LOCAL_VAR_TABLE; - private int localVarTableLength;// u2 local_variable_table_length - private List itemList = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen, - int localVarTableLength) { - super(attrNameIndex, attrLen); - this.localVarTableLength = localVarTableLength; - } - - public void addItemList(LocalVariableItem item) { - this.itemList.add(item); - } - - @Override - public String getType() { - return TYPE; - } - public static LocalVariableTable parse(ConstantPool pool, - ByteCodeIterator itr) { - int attrNameIndex = itr.nextU2toInt(); - int attrLen = itr.nextU4toInt(); - int localVarTableLength = itr.nextU2toInt(); - LocalVariableTable table = new LocalVariableTable(attrNameIndex, - attrLen, localVarTableLength); - for (int i = 0; i < localVarTableLength; i++) { - table.addItemList(LocalVariableItem.parse(pool, itr)); - } - return table; - } - - /** - * inner class - * - * @author Meng - * - */ - public static class LocalVariableItem { - @SuppressWarnings("unused") - private int startPc; - @SuppressWarnings("unused") - private int length; - @SuppressWarnings("unused") - private int nameIndex; - @SuppressWarnings("unused") - private int descriptorIndex; - @SuppressWarnings("unused") - private int index; - - public LocalVariableItem(int startPc, int length, int nameIndex, - int descriptorIndex, int index) { - super(); - this.startPc = startPc; - this.length = length; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.index = index; - } - - public static LocalVariableItem parse(ConstantPool pool, - ByteCodeIterator itr) { - int startPc = itr.nextU2toInt(); - int length = itr.nextU2toInt(); - int nameIndex = itr.nextU2toInt(); - int descriptorIndex = itr.nextU2toInt(); - int index = itr.nextU2toInt(); - LocalVariableItem item = new LocalVariableItem(startPc, length, nameIndex, descriptorIndex, index); - return item; - } - } - - /* - * getter setter - */ - public int getLocalVarTableLength() { - return localVarTableLength; - } - - public void setLocalVarTableLength(int localVarTableLength) { - this.localVarTableLength = localVarTableLength; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index 01b80b0471..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coderising.jvm.attr; - -public class StackMapTable extends AttributeInfo{ - - private static String TYPE = STACK_MAP_TABLE; - @Override - public String getType() { - return TYPE; - } - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java deleted file mode 100644 index ee70c4305c..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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; - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java deleted file mode 100644 index 7460b4953b..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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()); - } - - public String getClassName() { - int index = this.clzIndex.getThisClassIndex(); - ClassInfo c = (ClassInfo) pool.getConstantInfo(index); - return c.getClassName(); - } - - public String getSuperClassName() { - int index = this.clzIndex.getSuperClassIndex(); - ClassInfo c = (ClassInfo) pool.getConstantInfo(index); - return c.getClassName(); - } - - public void addFields(Field f) { - this.fields.add(f); - } - - public void addMethods(Method m) { - this.methods.add(m); - } - - /* - * getter setter - */ - 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 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 ConstantPool getConstantPool() { - return pool; - } - - public void setPool(ConstantPool pool) { - this.pool = pool; - } - - public List getFields() { - return fields; - } - - public void setFields(List fl) { - this.fields = fl; - } - - public List getMethods() { - return methods; - } - - public void setMethods(List ml) { - this.methods = ml; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java deleted file mode 100644 index 7750d4439d..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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; - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java deleted file mode 100644 index 8758755887..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.constant; - -public class ClassInfo extends ConstantInfo { - private int type = CLASS_INFO;// u1 tag - private int utf8Index;// u2 name_index - - public ClassInfo(ConstantPool c) { - super(c); - } - - @Override - public int getType() { - return type; - } - - @Override - public void print() { - System.out.println("u1 tag:" + getType() + " ClassInfo" - + ",u2 name_index:" + getUtf8Index()); - } - - public String getClassName() { - int name_index = getUtf8Index(); - UTF8Info utf8 = (UTF8Info) this.constantPool - .getConstantInfo(name_index); - return utf8.getValue(); - } - - /* - * getter setter - */ - public int getUtf8Index() { - return utf8Index; - } - - public void setUtf8Index(int name_index) { - this.utf8Index = name_index; - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java deleted file mode 100644 index a485aa25f9..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.jvm.constant; - -public abstract class ConstantInfo { - public static final int UTF8_INFO = 1; - public static final int INTEGER_INFO = 3; - public static final int FLOAT_INFO = 4; - public static final int LONG_INFO = 5; - public static final int DOUBLE_INFO = 6; - 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 cp){ - this.constantPool = cp; - } - - public abstract int getType(); - - public abstract void print(); - - /* - * getter setter - */ - public ConstantPool getConstantPool(){ - return this.constantPool; - } - - public ConstantInfo getConstantInfo(int index){ - return this.constantPool.getConstantInfo(index); - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java deleted file mode 100644 index c1239d9220..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.coderising.jvm.constant; - -import java.util.ArrayList; -import java.util.List; - -public class ConstantPool { - private List cl = new ArrayList(); - - public void addConstantInfo(ConstantInfo e){ - cl.add(e); - } - - public ConstantInfo getConstantInfo(int index) { - return cl.get(index); - } - - public int getSize() { - return cl.size() - 1;// 减去常量池的长度一项 - } - - public String getUTF8String(int nameIndex) { - return ((UTF8Info)getConstantInfo(nameIndex)).getValue(); - } - - public String print(){ - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < cl.size(); i++) { - ConstantInfo c = cl.get(i); - if(i<10){ - System.out.print("0"+i+". "); - }else{ - System.out.print(i+". "); - } - c.print(); - } - return sb.toString(); - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java deleted file mode 100644 index 25a0628678..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.coderising.jvm.constant; - -public class DoubleInfo extends ConstantInfo { - private int type = DOUBLE_INFO; - - @Override - public int getType() { - return type; - } - @Override - public void print() { - - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 3170fa25d1..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.coderising.jvm.constant; - -public class FieldRefInfo extends ConstantInfo { - private int type = FIELD_INFO;// u1 tag - private int class_index;// u2 class_index - private int name_and_type_index;// u2 name_and_type_index - - public FieldRefInfo(ConstantPool pool) { - super(pool); - } - - @Override - public int getType() { - return type; - } - - @Override - public void print() { - System.out.println("u1 tag:" + getType() + " FieldInfo" - + ",u2 class_index:" + getClass_index() - + ",u2 name_and_type_index:" + getName_and_type_index()); - } - - @Override - public String toString() { - return getClassName() + ":" + getFieldName() + " : " + getFieldType(); - } - - public String getClassName() { - ClassInfo classInfo = (ClassInfo) this.constantPool - .getConstantInfo(class_index); - return classInfo.getClassName(); - } - - public String getFieldName() { - NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.constantPool - .getConstantInfo(name_and_type_index); - return nameAndTypeInfo.getName(); - } - - public String getFieldType() { - NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.constantPool - .getConstantInfo(name_and_type_index); - return nameAndTypeInfo.getTypeInfo(); - } - - /* - * getter setter - */ - public int getClass_index() { - return class_index; - } - - public void setClass_index(int class_index) { - this.class_index = class_index; - } - - public int getName_and_type_index() { - return name_and_type_index; - } - - public void setName_and_type_index(int name_and_type_index) { - this.name_and_type_index = name_and_type_index; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java deleted file mode 100644 index c20ebee388..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.coderising.jvm.constant; - -public class FloatInfo extends ConstantInfo { - private int type = FLOAT_INFO; - - @Override - public int getType() { - return type; - } - @Override - public void print() { - // TODO Auto-generated method stub - - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java deleted file mode 100644 index 35da3f20ef..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderising.jvm.constant; - -public class IntegerInfo extends ConstantInfo { - private int type = INTEGER_INFO; - private int Num; - - @Override - public int getType() { - return type; - } - @Override - public void print() { - // TODO Auto-generated method stub - - } - - public int getNum() { - return Num; - } - - public void setNum(int num) { - Num = num; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java deleted file mode 100644 index 61a19f320c..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.coderising.jvm.constant; - -public class LongInfo extends ConstantInfo { - private int type = LONG_INFO; - - @Override - public int getType() { - return type; - } - @Override - public void print() { - // TODO Auto-generated method stub - - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index ad59210e84..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.constant; - -public class MethodRefInfo extends ConstantInfo { - private int type = METHOD_INFO;// u1 tag - private int classInfoIndex;// u2 class_index - private int nameAndTypeIndex;// u2 name_and_type_index - - public MethodRefInfo(ConstantPool pool) { - super(pool); - } - - public String getClassName() { - ClassInfo c = (ClassInfo) this.constantPool - .getConstantInfo(classInfoIndex); - return c.getClassName(); - } - - public String getMethodName() { - NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool - .getConstantInfo(nameAndTypeIndex); - return nt.getName(); - } - - public String getParamsAndReturnType() { - NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool - .getConstantInfo(nameAndTypeIndex); - return nt.getTypeInfo(); - } - - @Override - public int getType() { - return type; - } - - @Override - public void print() { - System.out.println("u1 tag:" + getType() + " MethodInfo" - + ",u2 class_index:" + getClassInfoIndex() - + ",u2 name_and_type_index" + getNameAndTypeIndex()); - } - - @Override - public String toString() { - return getClassName() + ":" + getMethodName() + ":" - + getParamsAndReturnType(); - } - - /* - * getter setter - */ - public int getClassInfoIndex() { - return classInfoIndex; - } - - public void setClassInfoIndex(int class_index) { - this.classInfoIndex = class_index; - } - - public int getNameAndTypeIndex() { - return nameAndTypeIndex; - } - - public void setNameAndTypeIndex(int name_and_type_index) { - this.nameAndTypeIndex = name_and_type_index; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 08e9b6a0f2..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.jvm.constant; - -public class NameAndTypeInfo extends ConstantInfo { - private int type = NAME_AND_TYPE_INFO;// u1 tag - private int name_index;// u2 name_index - private int descriptor_index;// u2 descriptor_index - - public NameAndTypeInfo(ConstantPool pool) { - super(pool); - } - - @Override - public int getType() { - return type; - } - - @Override - public void print() { - System.out.println("u1 tag:" + getType() + " NameAndTypeInfo" - + ",u2 name_index:" + getName_index() + ",u2 descriptor_index:" - + getDescriptor_index()); - } - - @Override - public String toString() { - return "(" + getName() + "," + getTypeInfo() + ")"; - } - - public String getName() { - UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(name_index); - return u.getValue(); - } - - public String getTypeInfo() { - UTF8Info u = (UTF8Info) this.constantPool - .getConstantInfo(descriptor_index); - return u.getValue(); - } - - /* - * getter setter - */ - public int getName_index() { - return name_index; - } - - public void setName_index(int name_index) { - this.name_index = name_index; - } - - public int getDescriptor_index() { - return descriptor_index; - } - - public void setDescriptor_index(int descriptor_index) { - this.descriptor_index = descriptor_index; - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 2c67e88d37..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo{ - - @Override - public int getType() { - return -1; - } - @Override - public void print() { - System.out.println("NullConstantInfo"); - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index 4fac07f7cc..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.jvm.constant; - -public class StringInfo extends ConstantInfo { - private int type = STRING_INFO;// u1 tag - private int string_index;// u2 string_index - - public StringInfo(ConstantPool cp) { - super(cp); - } - - @Override - public int getType() { - return type; - } - - @Override - public void print() { - System.out.println("u1 tag:" + getType() + " StringInfo" - + ",u2 string_index:" + getString_index()); - } - - public String getString() { - UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(string_index); - return u.getValue(); - } - - @Override - public String toString() { - return getString(); - } - - /* - * getter setter - */ - public int getString_index() { - return string_index; - } - - public void setString_index(int string_index) { - this.string_index = string_index; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index ef5eef58a2..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coderising.jvm.constant; - -public class UTF8Info extends ConstantInfo { - private int type = UTF8_INFO;// u1 tag - private int length;// u2 length - private String value;// n 个 u1 - - public UTF8Info(ConstantPool pool) { - super(pool); - } - - @Override - public int getType() { - return type; - } - - @Override - public void print() { - System.out.println("u1 tag:" + getType() + " UTF8Info" + ",u2 length:" - + getLength() + ",u1 bytes[" + getLength() + "] " + getValue()); - } - - @Override - public String toString() { - return "UTF8Info [type=" + type + ",length=" + length + ",value=" - + value + "]"; - } - - /* - * getter setter - */ - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public int getLength() { - return length; - } - - public void setLength(int length) { - this.length = length; - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java deleted file mode 100644 index fee1d06d95..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.coderising.jvm.field; - -import java.util.List; - -import com.coderising.jvm.attr.AttributeInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class Field { - private int accessFlag;// u2 access_flags - private int nameIndex;// u2 name_index - private int descriptorIndex;// u2 descriptor_index - private int attrCount;//u2 attributes_count - private List attributeInfos;//attribute_info attributes[attributes_count]; - - private ConstantPool cp; - - public Field(){} - - public Field(int accessFlag, int nameIndex, int descriptorIndex, - int attrCount, ConstantPool cp) { - super(); - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.attrCount = attrCount; - this.cp = cp; - } - - /** - * 读取字段
- * field_info {
- * u2 access_flags,
- * u2 name_index,
- * u2 descriptor_index,
- * u2 attributes_count,
- * attribute_info attributes[attributes_count]
- * } - * - * @param itr - * @return Field - */ - public static Field parse(ConstantPool pool, ByteCodeIterator itr) { - int accessFlag = itr.nextU2toInt(); - int nameIndex = itr.nextU2toInt(); - int descriptorIndex = itr.nextU2toInt(); - int attrCount = itr.nextU2toInt(); - Field field = new Field(accessFlag, nameIndex, descriptorIndex, attrCount, pool); - for (int i = 0; i < attrCount; i++) { - field.addAttributeInfo(AttributeInfo.parse(pool, itr)); - } - return field; - } - - public void addAttributeInfo(AttributeInfo a) { - this.attributeInfos.add(a); - } - @Override - public String toString() { - UTF8Info utf8Info1 = (UTF8Info)this.cp.getConstantInfo(this.nameIndex); - UTF8Info utf8Info2 = (UTF8Info)this.cp.getConstantInfo(this.descriptorIndex); - return utf8Info1.getValue()+":"+utf8Info2.getValue(); - } - - /* - * getter setter - */ - public int getAccessFlag() { - return accessFlag; - } - - public void setAccessFlag(int accessFlag) { - this.accessFlag = accessFlag; - } - - public int getNameIndex() { - return nameIndex; - } - - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - - public int getDescriptorIndex() { - return descriptorIndex; - } - - public void setDescriptorIndex(int descriptorIndex) { - this.descriptorIndex = descriptorIndex; - } - - public int getAttrCount() { - return attrCount; - } - - public void setAttrCount(int attrCount) { - this.attrCount = attrCount; - } - - public List getAttributeInfos() { - return attributeInfos; - } - - public void setAttributeInfos(List attributeInfos) { - this.attributeInfos = attributeInfos; - } - public ConstantPool getCp() { - return cp; - } - public void setCp(ConstantPool cp) { - this.cp = cp; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 5cdf37fdaf..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coderising.jvm.loader; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - private byte[] codes; - private int pos = 0; - - public void back(int length) { - if (pos - length < 0) { - throw new RuntimeException("back length is too long:" + length - + ",pos:" + pos); - } - pos -= length; - } - - public ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - public int nextU1toInt() { - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2toInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4toInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], - codes[pos++], codes[pos++] }); - } - - public String nextUxtoHexString(int len) { - byte[] bytes = new byte[len]; - for (int i = 0; i < len; i++) { - bytes[i] = codes[pos++]; - } - return Util.byteToHexString(bytes); - } - public String nextUxtoAscii(int len){ - byte[] bytes = new byte[len]; - for (int i = 0; i < len; i++) { - bytes[i] = codes[pos++]; - } - return Util.byteToAscii(bytes); - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java index 0c02adef66..fafac43407 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -8,29 +8,10 @@ import java.util.ArrayList; import java.util.List; -import com.coderising.jvm.clz.ClassFile; - public class ClassFileLoader { private static final int BUFFERSIZE = 1024; private List clzPaths = new ArrayList(); - /** - * 装载class文件 - * 读取二进制字节流,并解析成ClassFile对象 - * @param className - * @return ClassFile - */ - public ClassFile loadClass(String className) { - byte[] codes = this.readBinaryCode(className); - ClassFileParser parser = new ClassFileParser(); - return parser.parse(codes); - } - - /** - * 从.class文件读取二进制字节流 - * @param className - * @return - */ public byte[] readBinaryCode(String className) { if (clzPaths.size()<=0){ return null; @@ -55,7 +36,7 @@ public byte[] readBinaryCode(String className) { /** * 文件读取二进制字节流 * @param f - * @return byte[] + * @return * @throws FileNotFoundException */ private byte[] readFile(File f) throws FileNotFoundException { @@ -82,18 +63,10 @@ private byte[] readFile(File f) throws FileNotFoundException { return baos.toByteArray(); } - /** - * 增加类加载路径,加载时按增加时的先后顺序加载 - * @param path - */ public void addClassPath(String path) { clzPaths.add(path); } - /** - * 获取类加载路径 - * @return - */ public String getClassPath() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < clzPaths.size(); i++) { @@ -123,4 +96,9 @@ private String convertName(String className) { return sb.toString(); } + public static void main(String[] args) { + String d = "com.taiji.array.Load"; + ClassFileLoader cc = new ClassFileLoader(); + System.out.print(cc.convertName(d)); + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java deleted file mode 100644 index b9887d3b30..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.coderising.jvm.loader; - -import com.coderising.jvm.clz.AccessFlag; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.NullConstantInfo; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFileParser { - /** - * 读取ClassFile对象 - * - * @param codes - * @return - */ - public ClassFile parse(byte[] codes) { - ClassFile cf = new ClassFile(); - ByteCodeIterator itr = new ByteCodeIterator(codes); - String magicNumber = itr.nextUxtoHexString(4);// 1读取魔数 - if (!magicNumber.equals("cafebabe")) { - throw new RuntimeException("magicNum not ok"); - } - cf.setMinorVersion(itr.nextU2toInt());// 3读取次版本号 - cf.setMajorVersion(itr.nextU2toInt());// 2读取主版本号 - - ConstantPool pool = parseConstantPool(itr);// 4、5读取常量池 - pool.print();// 打印常量池 - cf.setPool(pool); - - cf.setAccessFlag(new AccessFlag(itr.nextU2toInt()));// 6读取访问标志 - - ClassIndex classIndex = parseClassIndex(itr);// 读取类引用7this和8super - cf.setClzIndex(classIndex); - - int interfaceCount = itr.nextU2toInt();//读取接口信息 - if (interfaceCount != 0) { - throw new RuntimeException( - "the interface isn't 0,parser has not been implemented yet."); - } - - int FieldCount = itr.nextU2toInt();//读取字段信息 - for (int i = 0; i < FieldCount; i++) { - Field f = Field.parse(pool, itr); - cf.addFields(f); - } - - int MethodCount = itr.nextU2toInt(); - for (int i = 0; i < MethodCount; i++) {//读取方法信息 - Method m = Method.parse(pool, itr); - cf.addMethods(m); - } - - return cf; - } - - /** - * 读取this super对象引用
- * classIndex_Info {
- * u2 this_class,
- * u2 super_class
- * } - * - * @param itr - * @return - */ - public ClassIndex parseClassIndex(ByteCodeIterator itr) { - ClassIndex classIndex = new ClassIndex(); - classIndex.setThisClassIndex(itr.nextU2toInt()); - classIndex.setSuperClassIndex(itr.nextU2toInt()); - return classIndex; - } - - /** - * 读取常量池 - * - * @param itr - * @return - */ - public ConstantPool parseConstantPool(ByteCodeIterator itr) { - int count = itr.nextU2toInt(); - ConstantPool pool = new ConstantPool(); - pool.addConstantInfo(new NullConstantInfo());// 占住常量池的第一个,常量池是的index从1开始 - - for (int i = 1; i < count; i++) { - int tag = itr.nextU1toInt(); - switch (tag) { - case ConstantInfo.CLASS_INFO: - ClassInfo classInfo = new ClassInfo(pool); - classInfo.setUtf8Index(itr.nextU2toInt()); - pool.addConstantInfo(classInfo); - - /* - * System.out.println(i + ". u1 tag:" + - * classInfo.getType()+" ClassInfo" + ",u2 name_index:" + - * classInfo.getUtf8Index()); - */ - break; - - case ConstantInfo.UTF8_INFO: - UTF8Info utf8Info = new UTF8Info(pool); - int length = itr.nextU2toInt(); - String value = itr.nextUxtoAscii(length); - utf8Info.setLength(length); - utf8Info.setValue(value); - pool.addConstantInfo(utf8Info); - - /* - * System.out.println(i + ". u1 tag:" + utf8Info.getType() + - * " UTF8Info" + ",u2 length:" + utf8Info.getLength() + - * ",u1 bytes[" + utf8Info.getLength() + "] " + - * utf8Info.getValue()); - */ - break; - - case ConstantInfo.STRING_INFO: - StringInfo si = new StringInfo(pool); - si.setString_index(itr.nextU2toInt()); - pool.addConstantInfo(si); - - /* - * System.out.println(i + ". u1 tag:" + - * si.getType()+" StringInfo" + ",u2 string_index:" + - * si.getString_index()); - */ - break; - - case ConstantInfo.NAME_AND_TYPE_INFO: - NameAndTypeInfo nt = new NameAndTypeInfo(pool); - nt.setName_index(itr.nextU2toInt()); - nt.setDescriptor_index(itr.nextU2toInt()); - pool.addConstantInfo(nt); - - /* - * System.out.println(i + ". u1 tag:" + nt.getType()+ - * " NameAndTypeInfo" + ",u2 name_index:" + nt.getName_index() + - * ",u2 descriptor_index:" + nt.getDescriptor_index()); - */ - break; - - case ConstantInfo.METHOD_INFO: - MethodRefInfo m = new MethodRefInfo(pool); - m.setClassInfoIndex(itr.nextU2toInt()); - m.setNameAndTypeIndex(itr.nextU2toInt()); - pool.addConstantInfo(m); - - /* - * System.out.println(i + ". u1 tag:" + m.getType()+ - * " MethodInfo" + ",u2 class_index:" + m.getClassInfoIndex() + - * ",u2 name_and_type_index" + m.getNameAndTypeIndex()); - */ - break; - - case ConstantInfo.FIELD_INFO: - FieldRefInfo f = new FieldRefInfo(pool); - f.setClass_index(itr.nextU2toInt()); - f.setName_and_type_index(itr.nextU2toInt()); - pool.addConstantInfo(f); - - /* - * System.out.println(i + ". u1 tag:" + f.getType()+ - * " FieldInfo" + ",u2 class_index:" + f.getClass_index() + - * ",u2 name_and_type_index:" + f.getName_and_type_index()); - */ - break; - - /* - * case ConstantInfo.FLOAT_INFO: - * - * break; - * - * case ConstantInfo.INTEGER_INFO: break; - * - * case ConstantInfo.DOUBLE_INFO: break; - * - * case ConstantInfo.LONG_INFO: break; - */ - - default: - throw new RuntimeException("the constant pool tag " + tag - + " has not been implemented yet."); - } - } - return pool; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java deleted file mode 100644 index 867e6eed5e..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.coderising.jvm.method; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.attr.AttributeInfo; -import com.coderising.jvm.attr.CodeAttr; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class Method { - private int accessFlag;// u2 access_flags - private int nameIndex;// u2 name_index - private int descriptorIndex;// u2 descriptor_index - private int attrCount;// u2 attributes_count - /* - * attributes[attributes_count]; - */ - private List attributeInfos = new ArrayList(); - - public Method() {} - - public Method(int accessFlag, int nameIndex, int descriptorIndex, - int attrCount) { - super(); - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.attrCount = attrCount; - } - - private ClassFile clzFile; - - /** - * 读取方法 method_info {
- * u2 access_flags,
- * u2 name_index,
- * u2 descriptor_index,
- * u2 attributes_count,
- * attribute_info attributes[attributes_count]
- * } - * - * @param itr - * @return Method - */ - public static Method parse(ConstantPool cp, ByteCodeIterator itr) { - int accessFlag = itr.nextU2toInt(); - int nameIndex = itr.nextU2toInt(); - int descriptorIndex = itr.nextU2toInt(); - int attrCount = itr.nextU2toInt(); - Method method = new Method(accessFlag, nameIndex, descriptorIndex, - attrCount); - for (int i = 0; i < attrCount; i++) { - method.addAttributeInfo(AttributeInfo.parse(cp, itr)); - } - return method; - } - - /** - * 专门用来获取code属性的方法 - * - * @return - */ - public CodeAttr getCodeAttr() { - for (int i = 0; i < attributeInfos.size(); i++) { - AttributeInfo attributeInfo = attributeInfos.get(i); - if(AttributeInfo.CODE.equals(attributeInfo.getType())){ - return (CodeAttr)attributeInfo; - } - } - return null; - } - - public void addAttributeInfo(AttributeInfo a) { - this.attributeInfos.add(a); - } - - /* - * getter setter - */ - public int getAccessFlag() { - return accessFlag; - } - - public void setAccessFlag(int accessFlag) { - this.accessFlag = accessFlag; - } - - public int getNameIndex() { - return nameIndex; - } - - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - - public int getDescriptorIndex() { - return descriptorIndex; - } - - public void setDescriptorIndex(int descriptorIndex) { - this.descriptorIndex = descriptorIndex; - } - - public List getAttributeInfos() { - return attributeInfos; - } - - public void setAttributeInfos(List attributeInfos) { - this.attributeInfos = attributeInfos; - } - - public ClassFile getClzFile() { - return clzFile; - } - - public int getAttrCount() { - return attrCount; - } - - public void setAttrCount(int attrCount) { - this.attrCount = attrCount; - } - -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java deleted file mode 100644 index c69ba73610..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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 < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } - public static String byteToAscii(byte[] codes){ - return new String(codes); - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java similarity index 58% rename from group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java rename to group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java index 5cde9073f3..6bde3e3105 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java @@ -1,9 +1,7 @@ -package com.coding.basic.stack; +package com.coding.basic; import java.util.EmptyStackException; -import com.coding.basic.ArrayList; - public class Stack { private ArrayList elementData = new ArrayList(); @@ -31,16 +29,4 @@ public boolean isEmpty(){ public int size(){ return elementData.size(); } - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i = 0; i < size(); i++) { - sb.append(elementData.get(i)).append(", "); - } - sb.deleteCharAt(sb.length()-1); - sb.deleteCharAt(sb.length()-1); - sb.append("]"); - return sb.toString(); - } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java deleted file mode 100644 index 1a29d59e48..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.coding.basic.stack; - -public class StackUtil { - /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - */ - public static void reverse_useTwoStack(Stack s) { - if (s.size() < 2) { - return; - } - Stack stack1 = new Stack<>(); - Stack stack2 = new Stack<>(); - int length = s.size(); - for (int i = 0; i < length; i++) { - stack1.push(s.pop()); - } - for (int i = 0; i < length; i++) { - stack2.push(stack1.pop()); - } - for (int i = 0; i < length; i++) { - s.push(stack2.pop()); - } - } - - public static void reverse(Stack s) { - if (s.size() < 2) { - return; - } - Stack tmp = new Stack<>(); - int length = s.size(); - for (int i = 0; i < length; i++) { - tmp.push(s.pop()); - } - for (int i = 0; i < length; i++) { - addToBottom(s, tmp.pop()); - } - } - - /** - * 添加元素到栈底部 - * - * @param s - * @param value - */ - public static void addToBottom(Stack s, Integer value) { - /* - * Stack stack = new Stack<>(); for (int i = 0; i < s.size(); - * i++) { stack.push(s.pop()); } s.push(value); for (int i = 0; i < - * s.size(); i++) { s.push(stack.pop()); } - */ - if (s.isEmpty()) { - s.push(value); - } else { - Integer top = s.pop(); - addToBottom(s, value); - s.push(top); - } - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static boolean remove(Stack s, Object o) { - if (s.isEmpty()) { - throw new RuntimeException("stack is empty"); - } - boolean flag = false; - Stack tmp = new Stack<>(); - while (!s.isEmpty()) { - tmp.push(s.pop()); - if (tmp.peek().equals(o)) { - flag = true; - - tmp.pop(); - for (int i = 0; i < tmp.size(); i++) { - s.push(tmp.pop()); - } - break; - } - } - return flag; - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, - * 可以使用另外一个栈来辅助 - * - * @param len - * @return - */ - public static Object[] getTop(Stack s, int len) { - Object[] result = new Object[len]; - Stack tmp = new Stack<>(); - for (int i = 0; i < len; i++) { - result[i] = s.peek(); - tmp.push(s.pop()); - } - for (int i = 0; i < len; i++) { - s.push(tmp.pop()); - } - return result; - } - - /** - * 字符串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) { - Stack stack = new Stack<>(); - char[] strCharArr = s.toCharArray(); - for (int i = 0; i < strCharArr.length; i++) { - char cc = strCharArr[i]; - int c = cc&0xffff; - if (isBracket(c)) { - if (c == 40 || c == 91 || c == 123) { - stack.push(c); - }else{ - int left = stack.pop(); - if(left+1!=c&&left+2!=c){ - return false; - } - } - } - } - return true; - } - - /** - * judge is Bracket or not - * @param c - * @return - */ - private static boolean isBracket(int c) { - if (c == 40 || c == 41 || c == 91 || c == 93 || c == 123 || c == 125) { - return true; - } else { - return false; - } - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java deleted file mode 100644 index b498fc2758..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -import com.coding.basic.stack.StackUtil; - -public class InfixExpr { - String expr = null; - private List tokenList = new ArrayList<>(); - private final static String regex = "-|\\+|\\*|/|\\(|\\)"; - - public InfixExpr(String expr) { - this.expr = expr; - init(); - } - - private void init() { - if (StackUtil.isValidPairs(expr)) { - initTokens(); - } else { - throw new RuntimeException( - "Syntax error, ( ) is not completed in your Expression"); - } - } - - /** - * 表达式分解并入栈 - */ - private void initTokens() { - String[] nums = expr.split(regex); - ArrayList arrayList = new ArrayList(); - for (int i = 0; i < nums.length; i++) { - if (!nums[i].equals("")) { - arrayList.add(nums[i]); - } - } - char[] exChars = expr.toCharArray(); - int numInx = 0; - for (int i = 0; i < exChars.length;) { - char ex = exChars[i]; - int item = ex & 0xffff; - if (item >= 48 && item <= 57) { - int numSize = arrayList.get(numInx++).length(); - String num = new String(exChars, i, numSize); - Token token = new Token(num, Token.NUMBER); - tokenList.add(token); - i += numSize; - } else { - Token token = new Token(String.valueOf(ex), Token.OPERA); - tokenList.add(token); - i += 1; - } - } - } - - /** - * 从左向右扫描所有token,当遇到同优先级或低优先级的操作符时,把之前的操作符依次出栈并计算结果 - * 扫描完所有token后,依次出栈所有操作数并计算结果 - * - * @return - */ - public float evaluate() { - Stack opStack = new Stack<>(); - Stack numStack = new Stack<>(); - for (int i = 0; i < tokenList.size(); i++) { - Token token = tokenList.get(i); - switch (token.getType()) { - case Token.NUMBER: - numStack.push(token.getNumValue()); - break; - case Token.OPERA: - if (opStack.isEmpty()) { - opStack.push(token); - } else { - while (!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())) { - Token preOper = opStack.pop(); - Float latter = numStack.pop(); - Float former = numStack.pop(); - Float result = caculate(preOper, latter, former); - numStack.push(result); - } - opStack.push(token); - } - break; - default: - throw new RuntimeException(" error not Number not Operate "); - } - } - while (!opStack.isEmpty()) { - Token pre = opStack.pop(); - Float f1 = numStack.pop(); - Float f2 = numStack.pop(); - Float result = caculate(pre, f1, f2); - numStack.push(result); - } - return numStack.pop(); - } - private Float caculate(Token t, Float latter,Float former){ - switch (t.getValue()) { - case "+": - return latter + former; - case "-": - return former - latter; - case "*": - return latter * former; - case "/": - return former / latter; - default: - throw new RuntimeException("operation"+t.getValue()+" isn't implemented"); - } - } -} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java deleted file mode 100644 index bc6945c757..0000000000 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.HashMap; - -/** - * 表达式中的数字或者操作符的抽象实体类 - * - * @author Walker - * - */ -public class Token { - private final static HashMap priority = new HashMap<>(4); - static { - priority.put("+", 1); - priority.put("-", 1); - priority.put("*", 2); - priority.put("/", 2); - } - private String value; - - public static final int NUMBER = 1; - public static final int OPERA = 2; - private int type; - - public Token(String v, int t) { - this.value = v; - this.type = t; - } - - public boolean isNum() { - return type == NUMBER; - } - - public boolean isOpera() { - return type == OPERA; - } - - @Override - public String toString() { - return value; - } - - public float getNumValue() { - return Float.parseFloat(value); - } - - public boolean hasLowerPriority(Token t) { - if (!this.isOpera() || !t.isOpera()) { - throw new RuntimeException("numbers can't compare priority"); - } - return priority.get(this.value) - priority.get(t.value) < 0; - } - public boolean hasHigherPriority(Token t) { - if (!this.isOpera() || !t.isOpera()) { - throw new RuntimeException("numbers can't compare priority"); - } - return priority.get(this.value) - priority.get(t.value) > 0; - } - public boolean hasEqualPriority(Token t) { - if (!this.isOpera() || !t.isOpera()) { - throw new RuntimeException("numbers can't compare priority"); - } - return priority.get(this.value) - priority.get(t.value) == 0; - } - - /* - * getter setter - */ - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public int getType() { - return type; - } - - public void setType(int type) { - this.type = type; - } - -} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java index bcc79dc6d8..e2ed056cc3 100644 --- a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java +++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java @@ -1,36 +1,13 @@ package com.coderising.jvm.loader; -import java.util.List; - import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - public class ClassFileLoaderTest { - private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "C:\\workPrograms\\GitRepo\\coding2017\\group17\\82427129\\JavaUtil\\target\\classes"; + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; static String path2 = "D:\\workProgram\\GitRepo\\coding2017\\group17\\82427129\\JavaUtil\\target\\classes"; - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - String className = "com.coderising.jvm.test.EmployeeV1"; - - clzFile = loader.loadClass(className); - clzFile.print(); - } @Before public void setUp() throws Exception { } @@ -43,7 +20,6 @@ public void tearDown() throws Exception { public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); loader.addClassPath(path2); String className = "com.coderising.jvm.test.EmployeeV1"; @@ -69,7 +45,6 @@ public void testGetClassPath() { @Test public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); loader.addClassPath(path2); String className = "com.coderising.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); @@ -80,93 +55,7 @@ public void testMagicNumber(){ Assert.assertEquals("cafebabe", acctualValue); } - - @Test - public void testVersion(){ - Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(51, clzFile.getMajorVersion()); - } - @Test - public void testConstantPool(){ - - - ConstantPool pool = clzFile.getConstantPool(); - - Assert.assertEquals(53, pool.getSize()); - - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); - Assert.assertEquals(2, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); - } - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); - Assert.assertEquals(4, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); - Assert.assertEquals("java/lang/Object", utf8Info.getValue()); - } - { - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); - Assert.assertEquals("name", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(6); - Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(7); - Assert.assertEquals("age", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(8); - Assert.assertEquals("I", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(9); - Assert.assertEquals("", 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.getName_index()); - Assert.assertEquals(14, nameAndType.getDescriptor_index()); - } - //抽查几个吧 - { - 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()); - } - private String byteToHexString(byte[] codes) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < codes.length; i++) { @@ -180,77 +69,5 @@ private String byteToHexString(byte[] codes) { } return buffer.toString(); } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } } diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java deleted file mode 100644 index e47a5d44d4..0000000000 --- a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coding.basic.stack; - -import org.junit.Assert; -import org.junit.Test; - -public class StackUtilTest { - - @Test - public void testReverse() { - Stack s = new Stack<>(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); - } - - @Test - public void testAddToBottom() { - Stack s = new Stack<>(); - s.push(1); - s.push(2); - s.push(3); - - StackUtil.addToBottom(s, 0); - - Assert.assertEquals("[0, 1, 2, 3]", s.toString()); - } - - @Test - public void testRemove() { - Stack s = new Stack<>(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("[1, 3]", s.toString()); - } - - @Test - public void testGetTop() { - Stack s = new Stack<>(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } - } - - @Test - public void testIsValidPairs() { - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } - -} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index 4152869ad2..0000000000 --- a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.Assert; -import org.junit.Test; - -public class InfixExprTest { - - @Test - public void testEvaluate() { - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - } - -} diff --git a/group17/article/20170326-20170402.md b/group17/article/20170326-20170402.md index 0729404704..5df4ce08e6 100644 --- a/group17/article/20170326-20170402.md +++ b/group17/article/20170326-20170402.md @@ -22,7 +22,7 @@ 240094626 -82427129 http://blog.csdn.net/Walk_er/article/details/66971517 +82427129 296910598 diff --git a/group17/article/20170402-20170409.md b/group17/article/20170402-20170409.md index 2445f4a4c2..3d45ad0516 100644 --- a/group17/article/20170402-20170409.md +++ b/group17/article/20170402-20170409.md @@ -12,7 +12,7 @@ 1204187480 -102228177 http://note.youdao.com/noteshare?id=4be7978218219daddfb0bb85182be12e +102228177 876385982 @@ -22,15 +22,15 @@ 240094626 -82427129 http://blog.csdn.net/Walk_er/article/details/68486226 +82427129 296910598 -1264835468 http://www.jianshu.com/p/686572a97fb3 +1264835468 516886559 -1282579502 +1282579502 614982500 diff --git a/group17/article/20170409-20170416.md b/group17/article/20170409-20170416.md deleted file mode 100644 index 11360e66cb..0000000000 --- a/group17/article/20170409-20170416.md +++ /dev/null @@ -1,56 +0,0 @@ -# 自由写作 - -## 须知 ---- - -交作业时请在QQ 号后面填上各自的文章链接, 比如: - -51075907 http://m.blog.csdn.net/article/details?id=57083764 - -## 文章 ---- - -1204187480 - -102228177 http://note.youdao.com/noteshare?id=7a1c457bc3de9a140f4e077f6352fc11 - -876385982 - -785396327 - -1059107701 - -240094626 - -82427129 - -296910598 - -1264835468 - -516886559 - -1282579502 https://www.evernote.com/l/AZ3ajLOAlTVHw7foK2KLb-bWZ7kw6FjljDA - -614982500 - -865797761 - -1540186032 - -176653813 - -116665530 - -51075907 - -1158154002 - -345450234 - -919764878 - -1368331120 - -517970312 - diff --git a/group17/article/20170416-20170423.md b/group17/article/20170416-20170423.md deleted file mode 100644 index 3d45ad0516..0000000000 --- a/group17/article/20170416-20170423.md +++ /dev/null @@ -1,56 +0,0 @@ -# 自由写作 - -## 须知 ---- - -交作业时请在QQ 号后面填上各自的文章链接, 比如: - -51075907 http://m.blog.csdn.net/article/details?id=57083764 - -## 文章 ---- - -1204187480 - -102228177 - -876385982 - -785396327 - -1059107701 - -240094626 - -82427129 - -296910598 - -1264835468 - -516886559 - -1282579502 - -614982500 - -865797761 - -1540186032 - -176653813 - -116665530 - -51075907 - -1158154002 - -345450234 - -919764878 - -1368331120 - -517970312 - diff --git a/group17/article/template.md b/group17/article/template.md index 3d45ad0516..0b06ef733e 100644 --- a/group17/article/template.md +++ b/group17/article/template.md @@ -12,7 +12,7 @@ 1204187480 -102228177 +102228177 http://note.youdao.com/noteshare?id=1f8f4a9d861e24948cdf0219a0d39f4e 876385982 diff --git a/group17/count/homework.md b/group17/count/homework.md index 23e71c2fbe..640cf4698f 100644 --- a/group17/count/homework.md +++ b/group17/count/homework.md @@ -18,9 +18,6 @@ * [20170305-20170312](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170305-20170312.md) * [20170326-20170402](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170326-20170402.md) - * [20170402-20170409](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170402-20170409.md) - * [20170409-20170416](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170409-20170416.md) - - * [20170416-20170423](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170416-20170423.md) +20170326-20170402.md 20170402-20170409.md diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java index b285a214b8..bec5202645 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java @@ -1,76 +1,137 @@ package org.xukai.coderising.stack; -import java.util.List; -import java.util.Stack; +import com.google.common.collect.Maps; +import com.sun.org.apache.bcel.internal.generic.IFNE; +import java.util.HashMap; public class InfixExpr { + + public static enum TypeToken { + + add('+',0),substruct('-',1),devide('/',3),plus('*',2); + + TypeToken(char token, Integer priority) { + this.token = token; + this.priority = priority; + } + + private char token; + + private Integer priority; + } + String expr = null; public InfixExpr(String expr) { this.expr = expr; } +//3*20+12*5-40/2 + public Double evaluate() { + HashMap map = new HashMap<>(); + map.put("+",0); + map.put("-",1); + map.put("/",3); + map.put("*",2); + + + Stack tokenStack = new Stack(); + Stack numStack = new Stack(); + char[] chars = expr.toCharArray(); + boolean isNem = true; + for (int i = 0; i < expr.length(); i++) { +// if (expr.charAt(i) == TypeToken.add.token || expr.charAt(i) == TypeToken.substruct.token) { +// isNem = true; +// if (!tokenStack.isEmpty() && (char)tokenStack.pop() == '*') { +// Float num2 = Float.valueOf(numStack.pop().toString()); +// Float num1 = Float.valueOf(numStack.pop().toString()); +// numStack.push(num1*num2); +// } else if (!tokenStack.isEmpty() && ((char)tokenStack.pop()) == '/') { +// Float num2 = Float.valueOf(numStack.pop().toString()); +// Float num1 = Float.valueOf(numStack.pop().toString()); +// numStack.push(num1/num2); +// } +// tokenStack.push(expr.charAt(i)); +// } else if (expr.charAt(i) == TypeToken.devide.token){ +// isNem = true; +// tokenStack.push(expr.charAt(i)); +// } else if (expr.charAt(i) == TypeToken.plus.token){ +// isNem = true; +// tokenStack.push(expr.charAt(i)); +// } else if (String.valueOf(expr.charAt(i)).matches("\\d{1}")){ +// if (isNem) { +// numStack.push((expr.charAt(i))); +// } else { +// numStack.push(numStack.pop().toString() + (expr.charAt(i))); +// } +// isNem = false; +// +// } else { +// throw new RuntimeException(); +// } + String token = (expr.charAt(i)) + ""; + Integer priprity = map.get(token); - public float evaluate() { - - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - - Stack opStack = new Stack<>(); - Stack numStack = new Stack<>(); - - for(Token token : tokens){ - - if (token.isOperator()){ - - if(opStack.isEmpty()){ - - opStack.push(token); - } else{ - - while(!opStack.isEmpty() - && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(), f1,f2); - numStack.push(result); - + if (priprity != null) { + //表示是运算符 + if (!tokenStack.isEmpty() && priprity < map.get(tokenStack.peek())) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + String pop = tokenStack.pop()+""; + if (pop.equals("-")) { + numStack.push(num1 - num2); + } else if (pop.equals("*")){ + numStack.push(num1 * num2); + } else if (pop.equals("/")){ + numStack.push(num1 / num2); + } else { + throw new RuntimeException(); } - opStack.push(token); + + } + tokenStack.push(token); + isNem = true; + } else if(token.matches("\\d{1}")) { + //表示是数字 + if (isNem) { + numStack.push(token); + } else { + numStack.push(numStack.pop().toString() + token); } - } - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); + isNem = false; + } else { + throw new RuntimeException(); } } - - while(!opStack.isEmpty()){ - Token token = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(), f1,f2)); + while (!tokenStack.isEmpty()) { + System.out.println(tokenStack.size()); + if (tokenStack.peek().equals("+")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1+num2+""); + } else if (tokenStack.peek().equals("-")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1-num2+""); + } else if (tokenStack.peek().equals("/")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1/num2+""); + } else if (tokenStack.peek().equals("*")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1*num2+""); + } else { + throw new RuntimeException(); + } + tokenStack.pop(); } - - - return numStack.pop().floatValue(); +// System.out.println(Double.valueOf(numStack.pop().toString())); + return Double.valueOf(numStack.pop().toString()); } - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); + + public static void main(String[] args) { + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java deleted file mode 100644 index 00302fa05c..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.xukai.coderising.stack; - -import java.util.HashMap; - -public class InfixExpr2 { - - public static enum TypeToken { - - add('+',0),substruct('-',1),devide('/',3),plus('*',2); - - TypeToken(char token, Integer priority) { - this.token = token; - this.priority = priority; - } - - private char token; - - private Integer priority; - } - - String expr = null; - - public InfixExpr2(String expr) { - this.expr = expr; - } -//3*20+12*5-40/2 - public Double evaluate() { - HashMap map = new HashMap<>(); - map.put("+",0); - map.put("-",1); - map.put("/",3); - map.put("*",2); - - - Stack tokenStack = new Stack(); - Stack numStack = new Stack(); - char[] chars = expr.toCharArray(); - boolean isNem = true; - for (int i = 0; i < expr.length(); i++) { - String token = (expr.charAt(i)) + ""; - Integer priprity = map.get(token); - if (priprity != null) { - //表示是运算符 - if (!tokenStack.isEmpty() && priprity < map.get(tokenStack.peek())) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - String pop = tokenStack.pop()+""; - if (pop.equals("-")) { - numStack.push(num1 - num2); - } else if (pop.equals("*")){ - numStack.push(num1 * num2); - } else if (pop.equals("/")){ - numStack.push(num1 / num2); - } else { - throw new RuntimeException(); - } - - } - tokenStack.push(token); - isNem = true; - } else if(token.matches("\\d{1}")) { - //表示是数字 - if (isNem) { - numStack.push(token); - } else { - numStack.push(numStack.pop().toString() + token); - } - isNem = false; - } else { - throw new RuntimeException(); - } - } - while (!tokenStack.isEmpty()) { - System.out.println(tokenStack.size()); - if (tokenStack.peek().equals("+")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1+num2+""); - } else if (tokenStack.peek().equals("-")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1-num2+""); - } else if (tokenStack.peek().equals("/")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1/num2+""); - } else if (tokenStack.peek().equals("*")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1*num2+""); - } else { - throw new RuntimeException(); - } - tokenStack.pop(); - } -// System.out.println(Double.valueOf(numStack.pop().toString())); - return Double.valueOf(numStack.pop().toString()); - } - - - - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java deleted file mode 100644 index 71a483b29f..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.xukai.coderising.stack; - -import java.util.List; -import java.util.Stack; - -/** - * 将中缀表达式转换为后缀表达式: - 与转换为前缀表达式相似,遵循以下步骤: - (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; - (2) 从左至右扫描中缀表达式; - (3) 遇到操作数时,将其压入S2; - (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: - (4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈; - (4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况); - (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; - (5) 遇到括号时: - (5-1) 如果是左括号“(”,则直接压入S1; - (5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃; - (6) 重复步骤(2)至(5),直到表达式的最右边; - (7) 将S1中剩余的运算符依次弹出并压入S2; - (8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。 - - 例如,将中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下: - 扫描到的元素 S2(栈底->栈顶) S1 (栈底->栈顶) 说明 - 1 1 空 数字,直接入栈 - + 1 + S1为空,运算符直接入栈 - ( 1 + ( 左括号,直接入栈 - ( 1 + ( ( 同上 - 2 1 2 + ( ( 数字 - + 1 2 + ( ( + S1栈顶为左括号,运算符直接入栈 - 3 1 2 3 + ( ( + 数字 - ) 1 2 3 + + ( 右括号,弹出运算符直至遇到左括号 - × 1 2 3 + + ( × S1栈顶为左括号,运算符直接入栈 - 4 1 2 3 + 4 + ( × 数字 - ) 1 2 3 + 4 × + 右括号,弹出运算符直至遇到左括号 - - 1 2 3 + 4 × + - -与+优先级相同,因此弹出+,再压入- - 5 1 2 3 + 4 × + 5 - 数字 - 到达最右端 1 2 3 + 4 × + 5 - 空 S1中剩余的运算符 - 因此结果为“1 2 3 + 4 × + 5 -”(注意需要逆序输出)。 - * @author xukai - * @desc - * @date 2017-04-22-14:10 - */ -public class InfixToPostfix2 { - - - private static TokenParser tokenParser = new TokenParser(); - - public static String toPostFixExpr(String expr){ - - List tokens = tokenParser.parse(expr); - - Stack s1 = new Stack(); - Stack s2 = new Stack(); - - for (Token token : tokens) { - if (token.isNumber()) { - s2.push(token); - } else { - while (token.isOperator() && !s1.isEmpty()) { - if (!token.hasHigherPriority(s1.peek())) { - s2.push(s1.pop()); - continue; - } - break; - } - s1.push(token); - } - } - while (!s1.isEmpty()) { - s2.push(s1.pop()); - } - StringBuilder stringBuilder = new StringBuilder(); - while (!s2.isEmpty()) { - Token token = s2.pop(); - s1.push(token); - } - while (!s1.isEmpty()) { - Token token = s1.pop(); - stringBuilder.append(token.toString()).append(" "); - } - - return stringBuilder.substring(0,stringBuilder.length() - 1); - } - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java deleted file mode 100644 index 98e849c4ff..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.xukai.coderising.stack; - -import java.util.List; -import java.util.Stack; - -/** - * 与前缀表达式类似,只是顺序是从左至右: - 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。 - 例如后缀表达式“3 4 + 5 × 6 -”: - (1) 从左至右扫描,将3和4压入堆栈; - (2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈; - (3) 将5入栈; - (4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈; - (5) 将6入栈; - (6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 - */ -public class PostfixExpr { -String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - - Stack numStack = new Stack<>(); - for(Token token : tokens){ - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } else{ - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(),f1,f2)); - } - } - return numStack.pop().floatValue(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java deleted file mode 100644 index 178fc23836..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.xukai.coderising.stack; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - - @Test - public void testTo(){ - String poseExpr = InfixToPostfix2.toPostFixExpr("10-2*3+50"); - System.out.println(poseExpr); - } - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java deleted file mode 100644 index cab9831ec2..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.xukai.coderising.stack; - -import java.util.List; -import java.util.Stack; - -/** - * 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 - 例如前缀表达式“- × + 3 4 5 6”: - (1) 从右至左扫描,将6、5、4、3压入堆栈; - (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈; - (3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈; - (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 - 可以看出,用计算机计算前缀表达式的值是很容易的。 - * @author xukai - * @desc - * @date 2017-04-22-13:49 - */ -public class PrefixExpr { - - - private String expr; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate(){ - - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse(expr); - - Stack numStack = new Stack(); - Stack oprStack = new Stack(); - - for (int i = tokens.size() - 1; i > -1; i--) { - if (tokens.get(i).isNumber()) { - numStack.push(new Float(tokens.get(i).getIntValue())); - } else { - Float num1 = numStack.pop(); - Float num2 = numStack.pop(); - numStack.push(caculate(tokens.get(i).toString(), num1, num2)); - } - } - - return numStack.pop(); - } - - private Float caculate(String oper, Float num1, Float num2){ - if (oper.equals("+")) { - return num1 + num2; - } else if (oper.equals("-")) { - return num1 - num2; - } else if (oper.equals("/")) { - return num1 / num2; - } else if (oper.equals("*")) { - return num1 * num2; - } - throw new RuntimeException("illeagal operation token"); - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java deleted file mode 100644 index bc0e4b53e4..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.xukai.coderising.stack; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java deleted file mode 100644 index e10eabb1f4..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.xukai.coderising.stack; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - - -} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java deleted file mode 100644 index 03e214bf1b..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.xukai.coderising.stack; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java index fb08ebc8e2..d0c8ef4e32 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java @@ -2,8 +2,6 @@ import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.cmd.ByteCodeCommand; -import org.xukai.jvm.cmd.CommandParser; import org.xukai.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { @@ -18,23 +16,21 @@ public String getCode() { return code; } - private ByteCodeCommand[] cmds ; - - public ByteCodeCommand[] getCmds() { - return cmds; - } - + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code, ByteCodeCommand[] cmds) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - this.cmds = cmds; + //this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -52,14 +48,15 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxLocals = iter.nextToInt(2); int codeLength = iter.nextToInt(4); String code = iter.nextToString(codeLength); - ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, cmds); + System.out.println(code); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); int exceptionTableLength = iter.nextToInt(2); if (exceptionTableLength > 0) { iter.nextToInt(exceptionTableLength); System.out.println("解析exception"); } int subAttributeCount = iter.nextToInt(2); + System.out.println("subAttributeCount" + subAttributeCount); if (subAttributeCount > 0) { for (int i = 0; i < subAttributeCount; i++) { AttributeInfo attributeInfo = AttributeInfo.parseAttribute(iter, clzFile); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java index c8777fea97..a2b2dfb515 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java @@ -81,41 +81,13 @@ public void print(){ } - public String getClassName(){ + private String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - public String getSuperClassName(){ + private String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } - - public Method getMethod(String methodName, String paramAndReturnType){ - - for(Method m :methods){ - - int nameIndex = m.getNameIndex(); - int descriptionIndex = m.getDescriptorIndex(); - - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descriptionIndex); - if(name.equals(methodName) && desc.equals(paramAndReturnType)){ - return m; - } - } - return null; - } - public Method getMainMethod(){ - for(Method m :methods){ - int nameIndex = m.getNameIndex(); - int descIndex = m.getDescriptorIndex(); - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descIndex); - if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ - return m; - } - } - return null; - } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java deleted file mode 100644 index bd1eb4bf11..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantPool; - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile, String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index edb68e1256..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantInfo; -import org.xukai.jvm.constant.ConstantPool; - -import java.util.HashMap; -import java.util.Map; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java deleted file mode 100644 index e44fb1e05f..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,156 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; - -import java.util.ArrayList; -import java.util.List; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { - throw new RuntimeException("the orignal code is not correct"); - - } - - codes = codes.toUpperCase(); - - CommandIterator iter = new CommandIterator(codes); - List cmds = new ArrayList(); - - while (iter.hasNext()) { - String opCode = iter.next2CharAsString(); - - if (new_object.equals(opCode)) { - NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - // System.out.println( cmd.toString(clzFile.getConstPool())); - cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { - InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (getfield.equals(opCode)) { - GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (getstatic.equals(opCode)) { - GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (putfield.equals(opCode)) { - PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (ldc.equals(opCode)) { - LdcCmd cmd = new LdcCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (bipush.equals(opCode)) { - BiPushCmd cmd = new BiPushCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { - - NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); - cmds.add(cmd); - } else { - throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); - } - - } - - calcuateOffset(cmds); - - ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; - cmds.toArray(result); - return result; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index faa268b0d2..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantPool; - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile, String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index 4112f7cc56..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantPool; - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile, String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index 7dd0b62407..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantPool; - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile, String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index 77ba5c7460..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantPool; - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile, String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java deleted file mode 100644 index 2d8b1ae2f3..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantInfo; -import org.xukai.jvm.constant.ConstantPool; -import org.xukai.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile, String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 0ac1b33832..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd { - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 63683e3865..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand { - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 6498b64289..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 0a5987e4c3..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile, String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index b423f989ae..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.xukai.jvm.cmd; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.constant.ClassInfo; -import org.xukai.jvm.constant.ConstantInfo; -import org.xukai.jvm.constant.ConstantPool; -import org.xukai.jvm.constant.FieldRefInfo; -import org.xukai.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand { - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java index 1adde177f3..bf7171a966 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java @@ -15,12 +15,7 @@ public void setUtf8Index(int utf8Index) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } - + public String getClassName() { int index = getUtf8Index(); UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java index ffae0e4e83..24323692e9 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java @@ -25,24 +25,5 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - - public abstract void accept(Visitor visitor); - - public static interface Visitor { - - public void visitString(StringInfo info); - - public void visitNameAndType(NameAndTypeInfo info); - - public void visitMethodRef(MethodRefInfo info); - - public void visitFieldRef(FieldRefInfo info); - - public void visitClassInfo(ClassInfo info); - - public void visistUTF8(UTF8Info info); - - - } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java index d9cc6f0f56..ff4aa4b906 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public int getSize() { + public Object getSize() { return this.constantInfos.size() -1; } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java index d9b5281155..f0b846f47c 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java @@ -11,12 +11,7 @@ public FieldRefInfo(ConstantPool pool) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } - + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java index 28b80235d9..a0c02fedaf 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java @@ -14,12 +14,7 @@ public MethodRefInfo(ConstantPool pool) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java index 66d235641d..c88c848d3a 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java @@ -25,13 +25,8 @@ public void setIndex2(int index2) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - } - - + + public String getName(){ ConstantPool pool = this.getConstantPool(); UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java index 732e8a42cf..0aa452b866 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java @@ -9,10 +9,5 @@ public NullConstantInfo(){ public int getType() { return -1; } - - @Override - public void accept(Visitor visitor) { - - } - + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java index 0fc28b142c..31a3c52910 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java @@ -10,12 +10,7 @@ public StringInfo(ConstantPool pool) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - } - + public int getIndex() { return index; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java index ae5200371e..caf1c19918 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java @@ -16,12 +16,6 @@ public void setLength(int length) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - } - @Override public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java index 27585d73b1..6cd71db72c 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java @@ -4,7 +4,6 @@ import org.xukai.jvm.attr.AttributeInfo; import org.xukai.jvm.attr.CodeAttr; import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.cmd.ByteCodeCommand; import org.xukai.jvm.constant.UTF8Info; import org.xukai.jvm.loader.ByteCodeIterator; @@ -26,7 +25,6 @@ public ClassFile getClzFile() { public int getNameIndex() { return nameIndex; } - public int getDescriptorIndex() { return descriptorIndex; } @@ -57,10 +55,6 @@ public String getMethodName(){ public String getMethodDescription(){ return ((UTF8Info)clzFile.getConstantPool().getConstantInfo(this.descriptorIndex)).getValue(); } - - public ByteCodeCommand[] getCmds() { - return this.getCodeAttr().getCmds(); - } @@ -83,5 +77,12 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ } + public static void main(String[] args) { + CodeAttr codeAttr = new CodeAttr(1, 1, 1, 1, 1, ""); + System.out.println(codeAttr instanceof AttributeInfo); + AttributeInfo codeAttr2 = new CodeAttr(1, 1, 1, 1, 1, ""); + System.out.println(codeAttr2 instanceof CodeAttr); + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java deleted file mode 100644 index 4c78dc1796..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.xukai.jvm.print; - - -import org.xukai.jvm.clz.ClassFile; -import org.xukai.jvm.loader.ClassFileLoader; - -public class ClassFilePrinter { - - ClassFile clzFile = null; - public ClassFilePrinter(ClassFile clzFile){ - this.clzFile = clzFile; - } - - public void print(){ - - if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag : public "); - } - System.out.println("Class Name:"+ clzFile.getClassName()); - - System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMinorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - - cnstPoolPrinter.print(); - - - - - } - - public static void main(String[] args){ - String path = "D:\\java\\IDEA-Workspace\\coding2017\\group19\\527220084\\xukai_coding\\coding-common\\target\\classes"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "org.xukai.jvm.test.EmployeeV1"; - - ClassFile clzFile = loader.loadClass(className); - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java deleted file mode 100644 index b1ec2eda79..0000000000 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.xukai.jvm.print; - - -import org.xukai.jvm.constant.ClassInfo; -import org.xukai.jvm.constant.ConstantInfo; -import org.xukai.jvm.constant.ConstantPool; -import org.xukai.jvm.constant.FieldRefInfo; -import org.xukai.jvm.constant.MethodRefInfo; -import org.xukai.jvm.constant.NameAndTypeInfo; -import org.xukai.jvm.constant.StringInfo; -import org.xukai.jvm.constant.UTF8Info; - -public class ConstantPoolPrinter { - ConstantPool pool; - ConstantPoolPrinter(ConstantPool pool){ - this.pool = pool; - } - public void print(){ - - System.out.println("Constant Pool:"); - - ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { - - @Override - public void visitString(StringInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("String #").append(info.getIndex()); - System.out.println(buffer); - - } - - @Override - public void visitNameAndType(NameAndTypeInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("NameAndType #").append(info.getIndex1()).append(":#") - .append(info.getIndex2()); - System.out.println(buffer); - - } - - @Override - public void visitMethodRef(MethodRefInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") - .append(info.getNameAndTypeIndex()).append(" ").append(info.getClassName()).append(".").append - (info.getMethodName()).append(info.getParamAndReturnType()); - System.out.println(buffer); - - } - - @Override - public void visitFieldRef(FieldRefInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") - .append(info.getNameAndTypeIndex()); - System.out.println(buffer); - - } - - @Override - public void visitClassInfo(ClassInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("Class #").append(info.getUtf8Index()) - .append(" ").append(info.getClassName()); - - System.out.println(buffer); - - } - - @Override - public void visistUTF8(UTF8Info info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("UTF8 ").append(info.getValue()); - System.out.println(buffer); - - } - }; - - for(int i=1; i <= pool.getSize(); i++){ - ConstantInfo constantInfo = pool.getConstantInfo(i); - System.out.print("#"+i+"="); - constantInfo.accept(visitor); - } - } -} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java index 08e65bedce..c4fad12ff6 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java @@ -8,10 +8,6 @@ import org.junit.Test; import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.clz.ClassIndex; -import org.xukai.jvm.cmd.BiPushCmd; -import org.xukai.jvm.cmd.ByteCodeCommand; -import org.xukai.jvm.cmd.OneOperandCmd; -import org.xukai.jvm.cmd.TwoOperandCmd; import org.xukai.jvm.constant.ClassInfo; import org.xukai.jvm.constant.ConstantPool; import org.xukai.jvm.constant.MethodRefInfo; @@ -307,82 +303,7 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } - - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand[] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - - + + } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java new file mode 100644 index 0000000000..e30cc00cc2 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java @@ -0,0 +1,161 @@ +package me.lzb.basic; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +/** + * Created by LZB on 2017/4/15. + */ +public class InfixExpr { + + + private String expr; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + List list = processExpr(); + + Stack symbolStack = new Stack<>(); + Stack numberStack = new Stack<>(); + + boolean calLevel2 = false; + for (Node n : list) { + if (n.isNumber) { + numberStack.push(n.number); + if (calLevel2) { + calculate(symbolStack, numberStack, false); + calLevel2 = false; + } + } else { + symbolStack.push(n.symbol); + + if (n.isLevel2()) { + calLevel2 = true; + } + } + } + + + Stack tn = new Stack<>(); + int nsize = numberStack.size(); + for (int i = 0; i < nsize; i++) { + tn.push(numberStack.pop()); + } + + numberStack = tn; + + + Stack ts = new Stack<>(); + int ssize = symbolStack.size(); + for (int i = 0; i < ssize; i++) { + ts.push(symbolStack.pop()); + } + + symbolStack = ts; + + + while (!symbolStack.isEmpty()) { + calculate(symbolStack, numberStack, true); + } + + + return numberStack.pop(); + } + + + + private List processExpr() { + List list = new ArrayList<>(); + char[] array = this.expr.toCharArray(); + String number = ""; + for (int i = 0; i < array.length; i++) { + if (Character.isDigit(array[i])) { + number = number + String.valueOf(array[i]); + } else { + Node num = new Node(Float.valueOf(number), null, true, -1); + number = ""; + int calLevel = "+-".indexOf(array[i]) >= 0 ? 1 : 2; + Node sym = new Node(0, String.valueOf(array[i]), false, calLevel); + list.add(num); + list.add(sym); + } + } + + Node num = new Node(Float.valueOf(number), null, true, -1); + list.add(num); + return list; + } + + + private void calculate(Stack symbolStack, Stack numberStack, boolean isRe) { + if (symbolStack.isEmpty()) { + return; + } + + + String symbole = symbolStack.pop(); + + float right; + float left; + + if(isRe){ + left = numberStack.pop(); + right = numberStack.pop(); + }else { + right = numberStack.pop(); + left = numberStack.pop(); + } + + + + float r = calculate(symbole, left, right); + + numberStack.push(r); + } + + + private float calculate(String symbol, float left, float right) { + if ("+".equals(symbol)) { + return left + right; + } + + if ("-".equals(symbol)) { + return left - right; + } + + if ("*".equals(symbol)) { + return left * right; + } + + if ("/".equals(symbol)) { + return left / right; + } + + return 0; + } + + + private class Node { + float number; + String symbol; + boolean isNumber; + int calLevel;//加减1,乘除2 + + public Node(float number, String symbol, boolean isNumber, int calLevel) { + this.number = number; + this.symbol = symbol; + this.isNumber = isNumber; + this.calLevel = calLevel; + } + + private boolean isLevel2() { + return calLevel == 2; + } + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java deleted file mode 100644 index 5b52ab0863..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java +++ /dev/null @@ -1,108 +0,0 @@ -package me.lzb.basic.expr; - -import me.lzb.common.utils.StringUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -/** - * Created by LZB on 2017/4/20. - */ -public class CalUtil { - - - public static void calculate(Stack symbolStack, Stack numberStack, boolean isRe) { - if (symbolStack.isEmpty()) { - return; - } - - - String symbole = symbolStack.pop(); - - float right; - float left; - - if (isRe) { - left = numberStack.pop(); - right = numberStack.pop(); - } else { - right = numberStack.pop(); - left = numberStack.pop(); - } - - float r = calculate(symbole, left, right); - - numberStack.push(r); - } - - - public static float calculate(String symbol, float left, float right) { - if ("+".equals(symbol)) { - return left + right; - } - - if ("-".equals(symbol)) { - return left - right; - } - - if ("*".equals(symbol)) { - return left * right; - } - - if ("/".equals(symbol)) { - return left / right; - } - - return 0; - } - - - public static List processInfixExpr(String expr) { - List list = new ArrayList<>(); - char[] array = expr.toCharArray(); - String number = ""; - for (int i = 0; i < array.length; i++) { - if (Character.isDigit(array[i])) { - number = number + String.valueOf(array[i]); - } else { - if (StringUtils.isNotBlank(number)) { - Node num = new Node(Float.valueOf(number), null, -1); - number = ""; - list.add(num); - } - - int calLevel = 1; - - if ("*/".indexOf(array[i]) >= 0) { - calLevel = 2; - } - - if ("()".indexOf(array[i]) >= 0) { - calLevel = 3; - } - - Node sym = new Node(0, String.valueOf(array[i]), calLevel); - - list.add(sym); - } - } - if (StringUtils.isNotBlank(number)) { - Node num = new Node(Float.valueOf(number), null, -1); - list.add(num); - } - - return list; - } - - - public static boolean isLowLevel(Node stackTop, Node next) { - return stackTop.calLevel < next.calLevel; - } - - public static void main(String[] args) { - Node n = new Node(0, "*", 2); - Node m = new Node(0, "-", 1); - System.out.println(isLowLevel(n, m)); - } -} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java deleted file mode 100644 index 833ee8cfda..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java +++ /dev/null @@ -1,71 +0,0 @@ -package me.lzb.basic.expr; - -import java.util.List; -import java.util.Stack; - -/** - * 中序表达式 - * Created by LZB on 2017/4/15. - */ -public class InfixExpr { - - - private String expr; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - List list = CalUtil.processInfixExpr(expr); - - Stack symbolStack = new Stack<>(); - Stack numberStack = new Stack<>(); - - boolean calLevel2 = false; - for (Node n : list) { - if (n.isNumber()) { - numberStack.push(n.number); - if (calLevel2) { - CalUtil.calculate(symbolStack, numberStack, false); - calLevel2 = false; - } - } else { - symbolStack.push(n.symbol); - - if (n.isLevel2()) { - calLevel2 = true; - } - } - } - - - Stack tn = new Stack<>(); - int nsize = numberStack.size(); - for (int i = 0; i < nsize; i++) { - tn.push(numberStack.pop()); - } - - numberStack = tn; - - - Stack ts = new Stack<>(); - int ssize = symbolStack.size(); - for (int i = 0; i < ssize; i++) { - ts.push(symbolStack.pop()); - } - - symbolStack = ts; - - - while (!symbolStack.isEmpty()) { - CalUtil.calculate(symbolStack, numberStack, true); - } - - - return numberStack.pop(); - } - - -} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java deleted file mode 100644 index d9b1d3e5a6..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java +++ /dev/null @@ -1,79 +0,0 @@ -package me.lzb.basic.expr; - -import java.util.List; -import java.util.Stack; - -/** - * 中序转后序 - * Created by LZB on 2017/4/20. - */ -public class InfixToPostfix { - - private String infix; - - public InfixToPostfix(String infix) { - this.infix = infix; - } - - - public String change() { - StringBuffer sb = new StringBuffer(); - List list = CalUtil.processInfixExpr(infix); - Stack symbolStack = new Stack<>(); - - for (int i = 0; i < list.size(); i++) { - Node n = list.get(i); - //如果是数字,直接输出 - if (n.isNumber()) { - append(sb, n); - continue; - } - - //操作符部分 - - //操作符栈为空,操作符入栈 - if (symbolStack.isEmpty()) { - symbolStack.push(n); - continue; - } - - if (")".equals(n.symbol)) { - //当前操作符为),输出操作数栈内的操作符,直到遇到第一个( - while (!"(".equals(symbolStack.peek().symbol)) { - append(sb, symbolStack.pop()); - } - //遇到的第一个(, 出栈,完成一个括号 - symbolStack.pop(); - } else { - - //计算用,操作符 - //栈顶元素优先级更低,操作符入栈 - if (CalUtil.isLowLevel(symbolStack.peek(), n) || symbolStack.peek().isLevel3()) { - symbolStack.push(n); - } else { - //栈顶元素优先级高于等于当前操作符,输出操作符,直到遇到(,或者遇到优先级更低的操作符 - while (!symbolStack.isEmpty() && !symbolStack.peek().isLevel3() && !CalUtil.isLowLevel(symbolStack.peek(), n)) { - append(sb, symbolStack.pop()); - } - //当前操作符入栈 - symbolStack.push(n); - } - } - } - - - while (!symbolStack.isEmpty()) { - append(sb, symbolStack.pop()); - } - - return sb.toString().trim(); - } - - - private void append(StringBuffer sb, Node node) { - sb.append(" "); - sb.append(node.isNumber() ? (int) node.number : node.symbol); - } - - -} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java deleted file mode 100644 index 1c698f1101..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.lzb.basic.expr; - -/** - * Created by LZB on 2017/4/20. - */ -public class Node { - float number; - String symbol; - int calLevel;//加减1,乘除2, ()3, 数字-1 - - public Node(float number, String symbol, int calLevel) { - this.number = number; - this.symbol = symbol; - this.calLevel = calLevel; - } - - public boolean isLevel2() { - return calLevel == 2; - } - - public boolean isLevel3() { - return calLevel == 3; - } - - public boolean isNumber(){ - return calLevel == -1; - } -} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java deleted file mode 100644 index 22a0db2ee0..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.lzb.basic.expr; - -import me.lzb.common.utils.StringUtils; - -import java.util.Stack; - -/** - * 后缀表达式 - * Created by LZB on 2017/4/20. - */ -public class PostfixExpr { - - private String expr; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - Stack symbolStack = new Stack<>(); - Stack numberStack = new Stack<>(); - - char[] array = this.expr.toCharArray(); - String number = ""; - for (int i = 0; i < array.length; i++) { - if (Character.isDigit(array[i])) { - number = number + String.valueOf(array[i]); - } else { - if (StringUtils.isNotBlank(number)) { - numberStack.push(Float.valueOf(number)); - number = ""; - } - if (Character.isSpaceChar(array[i])) { - - - } else { - symbolStack.push(String.valueOf(array[i])); - CalUtil.calculate(symbolStack, numberStack, false); - } - } - } - return numberStack.pop(); - } - -} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java deleted file mode 100644 index 27b7b2f52d..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.lzb.basic.expr; - -import me.lzb.common.utils.StringUtils; - -import java.util.Stack; - -/** - * 前缀表达式 - * Created by LZB on 2017/4/20. - */ -public class PrefixExpr { - - private String expr; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - Stack symbolStack = new Stack<>(); - Stack numberStack = new Stack<>(); - - char[] array = this.expr.toCharArray(); - String number = ""; - for (int i = array.length - 1; i >= 0; i--) { - if (Character.isDigit(array[i])) { - number = number + String.valueOf(array[i]); - } else { - if (StringUtils.isNotBlank(number)) { - numberStack.push(Float.valueOf(number)); - number = ""; - } - if (Character.isSpaceChar(array[i])) { - - - } else { - symbolStack.push(String.valueOf(array[i])); - CalUtil.calculate(symbolStack, numberStack, true); - } - } - } - return numberStack.pop(); - } - -} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java similarity index 97% rename from group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java rename to group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java index 913f6ad2ee..5ca7621354 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java @@ -1,4 +1,4 @@ -package me.lzb.basic.expr; +package me.lzb.basic; import org.junit.After; import org.junit.Assert; diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java deleted file mode 100644 index de92921b42..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.lzb.basic.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by LZB on 2017/4/20. - */ -public class InfixToPostfixTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testChange() { - { - InfixToPostfix toPostfix = new InfixToPostfix("((2+3)*8+5+3)*6"); - Assert.assertEquals("2 3 + 8 * 5 + 3 + 6 *", toPostfix.change()); - } - - { - InfixToPostfix toPostfix = new InfixToPostfix("6*(5+(2+3)*8+3)"); - Assert.assertEquals("6 5 2 3 + 8 * + 3 + *", toPostfix.change()); - } - { - InfixToPostfix toPostfix = new InfixToPostfix("9+(3-1)*3+10/2"); - Assert.assertEquals("9 3 1 - 3 * + 10 2 / +", toPostfix.change()); - } - - { - InfixToPostfix toPostfix = new InfixToPostfix("10-2*3+50"); - Assert.assertEquals("10 2 3 * - 50 +", toPostfix.change()); - } - } -} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java deleted file mode 100644 index 4a1239bcf6..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.lzb.basic.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -/** - * 后缀表达式 - */ -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1 - 3 * + 10 2 / +"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java deleted file mode 100644 index 11691cda54..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.lzb.basic.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * 前缀表达式 - */ -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java index f2f30f004f..2addebeb39 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java @@ -1,7 +1,5 @@ package me.lzb.jvm.attr; -import me.lzb.jvm.cmd.ByteCodeCommand; - /** * Created by LZB on 2017/4/15. */ @@ -14,20 +12,13 @@ public class CodeAttr extends AttributeInfo { private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - - private ByteCodeCommand[] cmds; - - public ByteCodeCommand[] getCmds() { - return cmds; - } - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, ByteCodeCommand[] cmds) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - this.cmds = cmds; + //this.cmds = cmds; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java index cfb4f067e8..224714a010 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java @@ -18,20 +18,12 @@ public void setFlagValue(int flag) { this.flagValue = flag; } - public boolean isPublicClass() { + public boolean isPublicClass(){ return (this.flagValue & 0x0001) != 0; } - - public boolean isFinalClass() { + public boolean isFinalClass(){ return (this.flagValue & 0x0010) != 0; } - public String getFlagString(){ - if (isPublicClass()){ - return "public"; - }else { - return "not public"; - } - } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java index 5fd864b8a8..c5de9be5ce 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java @@ -1,11 +1,8 @@ package me.lzb.jvm.clz; -import me.lzb.jvm.constant.ClassInfo; import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.field.Field; import me.lzb.jvm.method.Method; -import me.lzb.jvm.print.Print; -import me.lzb.jvm.print.PrintVisitor; import java.util.ArrayList; import java.util.List; @@ -13,7 +10,7 @@ /** * Created by LZB on 2017/4/14. */ -public class ClassFile implements Print{ +public class ClassFile { private String magicNumber; @@ -75,6 +72,7 @@ public void setConstantPool(ConstantPool constantPool) { } + public List getFields() { return fields; } @@ -92,6 +90,9 @@ public void setMethods(List methods) { } + + + public ClassIndex getClzIndex() { return clzIndex; } @@ -101,62 +102,30 @@ public void setClzIndex(ClassIndex clzIndex) { } - public void print() { + public void print(){ -// if (this.accessFlag.isPublicClass()) { -// System.out.println("Access flag : public "); -// } -// System.out.println("Class Name:" + getClassName()); + if(this.accessFlag.isPublicClass()){ + System.out.println("Access flag : public "); + } +// System.out.println("Class Name:"+ getClassName()); // -// System.out.println("Super Class Name:" + getSuperClassName()); +// System.out.println("Super Class Name:"+ getSuperClassName()); } - public String getClassName() { - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName() { - ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } + public int getConstantPoolCount() { return constantPool.getSize(); } - public void addField(Field f) { + public void addField(Field f){ this.fields.add(f); } - public void addMethod(Method m) { + public void addMethod(Method m){ this.methods.add(m); } - public Method getMethod(String methodName, String paramAndReturnType) { - for (Method m : methods) { - int nameIndex = m.getNameIndex(); - int descIndex = m.getDescriptorIndex(); - - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descIndex); - - if (name.equals(methodName) && desc.equals(paramAndReturnType)) { - return m; - } - } - - return null; - } - - public Method getMainMethod() { - return getMethod("main", "([Ljava/lang/String;)V"); - } - - @Override - public void print(PrintVisitor visitor) { - visitor.visitBasicMsg(this); - } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java deleted file mode 100644 index 83eec1cbc7..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.lzb.jvm.cmd; - - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); - } - - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index 07e35cb0ce..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,124 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantInfo; -import me.lzb.jvm.constant.ConstantPool; - -import java.util.HashMap; -import java.util.Map; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static { - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - protected ByteCodeCommand(ClassFile clzFile, String opCode) { - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - - protected ConstantInfo getConstantInfo(int index) { - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool() { - return this.getClassFile().getConstantPool(); - } - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - public String toString() { - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText() { - String txt = codeMap.get(opCode); - if (txt == null) { - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index a5fe80425b..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,20 +0,0 @@ -package me.lzb.jvm.cmd; - - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index 2d4d8d53a6..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index 6af68455a0..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index 5d87c07505..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java deleted file mode 100644 index a34a64b5b0..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantInfo; -import me.lzb.jvm.constant.ConstantPool; -import me.lzb.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if (info instanceof StringInfo) { - StringInfo strInfo = (StringInfo) info; - value = strInfo.toString(); - } - - return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; - - } - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index ba7d9df3a7..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd { - - public NewObjectCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 242f02716a..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand { - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); - } - - - public int getLength() { - return 1; - } - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 00805c5dc7..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - - } - - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - - public int getLength() { - return 2; - } - - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index df00e5bb8e..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,20 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; - - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index b87faca257..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,64 +0,0 @@ -package me.lzb.jvm.cmd; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.*; - -public abstract class TwoOperandCmd extends ByteCodeCommand { - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - public int getIndex() { - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool) { - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo) pool.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool) { - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo) this.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); - } - - protected String getOperandAsField(ConstantPool pool) { - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); - } - - public int getLength() { - return 3; - } -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java index 16ea736db1..200e59834a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java @@ -1,7 +1,5 @@ package me.lzb.jvm.constant; -import me.lzb.jvm.print.PrintVisitor; - /** * Created by LZB on 2017/4/14. */ @@ -18,11 +16,6 @@ public int getType() { return type; } - @Override - public void print(PrintVisitor visitor) { - visitor.visitClassInfo(this); - } - public int getUtf8Index() { return utf8Index; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java index e1952a7a3e..3bbabf2180 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java @@ -1,12 +1,9 @@ package me.lzb.jvm.constant; -import me.lzb.jvm.print.Print; -import me.lzb.jvm.print.PrintVisitor; - /** * Created by LZB on 2017/4/14. */ -public abstract class ConstantInfo implements Print { +public abstract class ConstantInfo { public static final String MAGIC_NUMBER = "cafebabe"; @@ -23,10 +20,11 @@ public abstract class ConstantInfo implements Print { public static final int Utf8_info = 1; + protected ConstantPool constantPool; - public ConstantInfo() { + public ConstantInfo(){ } @@ -37,16 +35,10 @@ public ConstantInfo(ConstantPool pool) { public ConstantPool getConstantPool() { return constantPool; } - - public ConstantInfo getConstantInfo(int index) { + public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } public abstract int getType(); - - - @Override - public abstract void print(PrintVisitor visitor); - } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java index 36e77e84d9..0ebab33b39 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java @@ -1,7 +1,5 @@ package me.lzb.jvm.constant; -import me.lzb.jvm.print.PrintVisitor; - /** * Created by LZB on 2017/4/15. */ @@ -19,11 +17,6 @@ public int getType() { return type; } - @Override - public void print(PrintVisitor visitor) { - visitor.visitFieldRef(this); - } - public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java index bd921ccf67..263c185af5 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java @@ -1,7 +1,5 @@ package me.lzb.jvm.constant; -import me.lzb.jvm.print.PrintVisitor; - /** * Created by LZB on 2017/4/15. */ @@ -20,11 +18,6 @@ public int getType() { return type; } - @Override - public void print(PrintVisitor visitor) { - visitor.visitMethodRef(this); - } - public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java index 4cef60cc3f..bdf158ec37 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java @@ -1,7 +1,5 @@ package me.lzb.jvm.constant; -import me.lzb.jvm.print.PrintVisitor; - /** * Created by LZB on 2017/4/15. */ @@ -20,11 +18,6 @@ public int getType() { return type; } - @Override - public void print(PrintVisitor visitor) { - visitor.visitNameAndType(this); - } - public int getIndex1() { return index1; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java index 88b90ca6c1..7f9debba3b 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java @@ -1,7 +1,5 @@ package me.lzb.jvm.constant; -import me.lzb.jvm.print.PrintVisitor; - /** * Created by LZB on 2017/4/14. */ @@ -11,9 +9,4 @@ public class NullConstantInfo extends ConstantInfo{ public int getType() { return -1; } - - @Override - public void print(PrintVisitor visitor) { - - } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java index 5d5fc284af..8ba36d8cfc 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java @@ -1,7 +1,5 @@ package me.lzb.jvm.constant; -import me.lzb.jvm.print.PrintVisitor; - /** * Created by LZB on 2017/4/15. */ @@ -18,11 +16,6 @@ public int getType() { return type; } - @Override - public void print(PrintVisitor visitor) { - visitor.visitString(this); - } - public int getIndex() { return index; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java index 9a27b3c716..d3f35c2fd7 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java @@ -1,7 +1,5 @@ package me.lzb.jvm.constant; -import me.lzb.jvm.print.PrintVisitor; - /** * Created by LZB on 2017/4/15. */ @@ -22,11 +20,6 @@ public int getType() { return type; } - @Override - public void print(PrintVisitor visitor) { - visitor.visistUTF8(this); - } - public String getValue() { return value; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java index e265907158..bfd3cbc2c0 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java @@ -208,7 +208,7 @@ private void parserMethod(ClassFile classFile) { int attributesCount = nextBytesToInt(2); - Method method = new Method(classFile, accessFlags, nameIndex, descriptorIndex); + Method method = new Method(accessFlags, nameIndex, descriptorIndex); for (int j = 1; j <= attributesCount; j++) { @@ -239,11 +239,7 @@ private void parserCodeAttr(int attributeNameIndex, Method method, ClassFile cla int codeLength = nextBytesToInt(4); String code = nextBytesToString(codeLength); - - //处理cmd - CommandParser commandParser = new CommandParser(code); - - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, commandParser.parse(classFile)); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); int exceptionTableLength = nextBytesToInt(2); if (exceptionTableLength > 0) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java deleted file mode 100644 index 829b1670c7..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java +++ /dev/null @@ -1,188 +0,0 @@ -package me.lzb.jvm.loader; - -import me.lzb.common.utils.StringUtils; -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.cmd.*; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by LZB on 2017/4/22. - */ -public class CommandParser { - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - - private int index; - - private final char[] data; - - public CommandParser(String codes) { - if (StringUtils.isBlank(codes)) { - throw new RuntimeException("the orignal code is not correct!"); - } - codes = codes.toUpperCase(); - data = codes.toCharArray(); - } - - private char[] nextChars(int nextLength) { - char[] target = new char[nextLength]; - System.arraycopy(data, index, target, 0, nextLength); - index = index + nextLength; - return target; - } - - private int nextCharsToInt(int nextLength) { - return Integer.valueOf(String.valueOf(nextChars(nextLength)), 16).intValue(); - } - - private String nextCharsToString(int nextLength) { - return String.valueOf(nextChars(nextLength)); - } - - private boolean hasNext() { - return index < data.length; - } - - - public ByteCodeCommand[] parse(ClassFile clzFile) { - - List cmds = new ArrayList<>(); - - while (hasNext()) { - String opCode = nextCharsToString(2); - - if (new_object.equals(opCode)) { - NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); - - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - - cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - - cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - - cmds.add(cmd); - } else if (getfield.equals(opCode)) { - GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - - cmds.add(cmd); - } else if (getstatic.equals(opCode)) { - GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); - - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - - cmds.add(cmd); - } else if (putfield.equals(opCode)) { - PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - cmds.add(cmd); - } else if (ldc.equals(opCode)) { - LdcCmd cmd = new LdcCmd(clzFile, opCode); - cmd.setOperand(nextCharsToInt(2)); - cmds.add(cmd); - } else if (bipush.equals(opCode)) { - BiPushCmd cmd = new BiPushCmd(clzFile, opCode); - cmd.setOperand(nextCharsToInt(2)); - cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { - - NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); - cmds.add(cmd); - } else { - throw new RuntimeException("Sorry, the java instruction " + opCode + "has not been implement."); - } - } - - calcuateOffset(cmds); - - ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; - cmds.toArray(result); - return result; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java index 8c35d5aec5..9c3e9ad984 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java @@ -1,8 +1,6 @@ package me.lzb.jvm.method; import me.lzb.jvm.attr.CodeAttr; -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.cmd.ByteCodeCommand; /** * Created by LZB on 2017/4/15. @@ -14,11 +12,11 @@ public class Method { private CodeAttr codeAttr; - private ClassFile clzFile; +// private ClassFile clzFile; - public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; + public Method(/*ClassFile clzFile,*/ int accessFlag, int nameIndex, int descriptorIndex) { +// this.clzFile = clzFile; this.accessFlag = accessFlag; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; @@ -57,15 +55,11 @@ public void setCodeAttr(CodeAttr codeAttr) { this.codeAttr = codeAttr; } - public ClassFile getClzFile() { - return clzFile; - } - - public void setClzFile(ClassFile clzFile) { - this.clzFile = clzFile; - } - - public ByteCodeCommand[] getCmds() { - return this.getCodeAttr().getCmds(); - } +// public ClassFile getClzFile() { +// return clzFile; +// } +// +// public void setClzFile(ClassFile clzFile) { +// this.clzFile = clzFile; +// } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java deleted file mode 100644 index 0b1566669a..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java +++ /dev/null @@ -1,36 +0,0 @@ -package me.lzb.jvm.print; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantInfo; -import me.lzb.jvm.constant.ConstantPool; - -/** - * Created by LZB on 2017/4/23. - */ -public class ClassPrinter { - - private ClassFile classFile; - - private ConstantPool pool; - - public ClassPrinter(ClassFile classFile) { - this.classFile = classFile; - this.pool = classFile.getConstantPool(); - } - - - public void print() { - PrintVisitor visitor = new PrintFormat(); - - classFile.print(visitor); - - System.out.println("Constant Pool:"); - - for (int i = 1; i <= pool.getSize(); i++) { - ConstantInfo constantInfo = pool.getConstantInfo(i); - System.out.print("#" + i + " = "); - constantInfo.print(visitor); - } - } - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java deleted file mode 100644 index 1435d46814..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.lzb.jvm.print; - -/** - * Created by LZB on 2017/4/23. - */ -public interface Print { - - public void print(PrintVisitor visitor); - -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java deleted file mode 100644 index 663496de8e..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java +++ /dev/null @@ -1,57 +0,0 @@ -package me.lzb.jvm.print; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.*; - -/** - * Created by LZB on 2017/4/23. - */ -public class PrintFormat implements PrintVisitor { - - - @Override - public void visitBasicMsg(ClassFile info) { - System.out.println("Access flag : " + info.getAccessFlag().getFlagString()); - - System.out.println("Class Name:" + info.getClassName()); - - System.out.println("Super Class Name:" + info.getSuperClassName()); - - System.out.println("minor version:" + info.getMinorVersion()); - - System.out.println("major version:" + info.getMajorVersion()); - - System.out.println(); - } - - - @Override - public void visistUTF8(UTF8Info info) { - System.out.println("UTF8 " + info.getValue()); - } - - @Override - public void visitClassInfo(ClassInfo info) { - System.out.println("Class #" + info.getUtf8Index() + " " + info.getClassName()); - } - - @Override - public void visitFieldRef(FieldRefInfo info) { - System.out.println("FieldRef #" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); - } - - @Override - public void visitMethodRef(MethodRefInfo info) { - System.out.println("MethodRef #" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); - } - - @Override - public void visitNameAndType(NameAndTypeInfo info) { - System.out.println("NameAndType #" + info.getIndex1() + ":#" + info.getIndex2()); - } - - @Override - public void visitString(StringInfo info) { - System.out.println("String #" + info.getIndex()); - } -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java deleted file mode 100644 index 6d846786bc..0000000000 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java +++ /dev/null @@ -1,23 +0,0 @@ -package me.lzb.jvm.print; - -import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.*; - -/** - * Created by LZB on 2017/4/23. - */ -public interface PrintVisitor { - public void visitBasicMsg(ClassFile info); - - public void visitClassInfo(ClassInfo info); - - public void visitFieldRef(FieldRefInfo info); - - public void visitMethodRef(MethodRefInfo info); - - public void visitNameAndType(NameAndTypeInfo info); - - public void visitString(StringInfo info); - - public void visistUTF8(UTF8Info info); -} diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java index b4adbcf888..f41b313c97 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java @@ -3,15 +3,10 @@ import me.lzb.common.utils.ByteUtils; import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.clz.ClassIndex; -import me.lzb.jvm.cmd.BiPushCmd; -import me.lzb.jvm.cmd.ByteCodeCommand; -import me.lzb.jvm.cmd.OneOperandCmd; -import me.lzb.jvm.cmd.TwoOperandCmd; import me.lzb.jvm.constant.*; import me.lzb.jvm.field.Field; import me.lzb.jvm.loader.ClassFileLoader; import me.lzb.jvm.method.Method; -import me.lzb.jvm.print.ClassPrinter; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -25,11 +20,13 @@ public class ClassFileloaderTest { static String path1 = EmployeeV1.class.getResource("/").getPath(); +// static String path1 = "D:\\code\\learning\\coding2017\\group24\\1148285693\\learning2017\\mini-jvm\\target\\test-classes\\"; static String path2 = "C:\\temp"; static String className = "me.lzb.jvm.EmployeeV1"; private static final String FULL_QUALIFIED_CLASS_NAME = "me/lzb/jvm/EmployeeV1"; +// private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; @Before @@ -46,8 +43,8 @@ public void testPath() { String s = EmployeeV1.class.getResource("/").getPath(); String s2 = EmployeeV1.class.getResource("").getPath(); -// System.out.println(s); -// System.out.println(s2); + System.out.println(s); + System.out.println(s2); } @@ -269,88 +266,4 @@ private void assertMethodEquals(ConstantPool pool, Method m, String expectedName Assert.assertEquals(expectedCode, code); } - /** - * 第四次JVM - */ - - - @Test - public void testByteCodeCommand() { - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand[] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #1", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #2", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #3", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand[] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #2", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #4", cmds[0]); - assertOpCodeEquals("3: ldc #5", cmds[1]); - assertOpCodeEquals("5: invokevirtual #6", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand[] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #7", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #8", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #9", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #10", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd) { - - String acctual = cmd.getOffset() + ": " + cmd.getReadableCodeText(); - - if (cmd instanceof OneOperandCmd) { - if (cmd instanceof BiPushCmd) { - acctual += " " + ((OneOperandCmd) cmd).getOperand(); - } else { - acctual += " #" + ((OneOperandCmd) cmd).getOperand(); - } - } - if (cmd instanceof TwoOperandCmd) { - acctual += " #" + ((TwoOperandCmd) cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - - @Test - public void testPrint() { - ClassPrinter classPrinter = new ClassPrinter(clzFile); - classPrinter.print(); - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java index 87344ca452..1e597a2b24 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java @@ -33,7 +33,7 @@ private void manageMultiAndDivOper(String[] elements,Stack numStack,Stack operSt preElement = (Float)numStack.pop(); i++; nextElement = Float.valueOf(elements[i]); - numStack.push(Token.doBaseOper(preElement,nextElement,elements[i-1])); + numStack.push(doBaseOper(preElement,nextElement,elements[i-1])); } } } @@ -42,12 +42,27 @@ private void manageMultiAndDivOper(String[] elements,Stack numStack,Stack operSt private float manageAddAndMinusOper(Stack numStack,Stack operStack){ float result = 0f;; while(!operStack.isEmpty()){ - result = Token.doBaseOper(result,(Float)numStack.pop(),(String)operStack.pop()); + result = doBaseOper(result,(Float)numStack.pop(),(String)operStack.pop()); } result += (Float)numStack.pop(); return result; } + private float doBaseOper(float preData,float nextData,String oper){ + switch(oper){ + case "+": + return preData+nextData; + case "-": + return preData-nextData; + case "*": + return preData*nextData; + case "/": + return preData/nextData; + default: + throw new RuntimeException("could not recognise oper:"+oper); + } + } + public String[] getElementArray(String expression){ char[] charArray = expression.toCharArray(); StringBuffer stringBuffer = new StringBuffer(); diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java deleted file mode 100644 index d444fef039..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.github.ipk2015.coding2017.basic.stack.expr; - - - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Stack; - -public class InfixToPostfix { - - public static List convert(String expr) { - int len = expr.length(); - char c,temp; - Stack stack = new Stack(); - StringBuffer buffer = new StringBuffer(); - for(int i = 0;i tokens = InfixToPostfix.convert("3+(2-5)*6/3"); - - Assert.assertEquals(3, tokens.get(0).getIntValue()); - Assert.assertEquals(2, tokens.get(1).getIntValue()); - Assert.assertEquals(5, tokens.get(2).getIntValue()); - Assert.assertEquals("-", tokens.get(3).toString()); - Assert.assertEquals(6, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(3, tokens.get(6).getIntValue()); - Assert.assertEquals("/", tokens.get(7).toString()); - Assert.assertEquals("+", tokens.get(8).toString()); - } - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index af427fa948..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.github.ipk2015.coding2017.basic.stack.expr; - -import java.util.List; -import java.util.Stack; - -public class PostfixExpr { -String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List list = parser.parse(expr); - - Stack stack = new Stack(); - int len = list.size(); - float preNum,afterNum; - Token token; - for(int i = 0;i list = parser.parse(expr); - - Stack stack = new Stack(); - int len = list.size(); - float preNum,afterNum; - Token token; - for(int i = 0;i OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - public static float doBaseOper(float preData,float nextData,String oper){ - switch(oper){ - case "+": - return preData+nextData; - case "-": - return preData-nextData; - case "*": - return preData*nextData; - case "/": - return preData/nextData; - default: - throw new RuntimeException("could not recognise oper:"+oper); - } - } - - -} \ No newline at end of file diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java deleted file mode 100644 index 998d1e4c8e..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.github.ipk2015.coding2017.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java deleted file mode 100644 index 2543baec60..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.ipk2015.coding2017.basic.stack.expr; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java index c4455c6b2a..2f141a20a3 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java @@ -1,9 +1,6 @@ package com.github.ipk2015.coding2017.minijvm.attr; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; -import com.github.ipk2015.coding2017.minijvm.cmd.CommandParser; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { @@ -15,21 +12,21 @@ public String getCode() { return code; } - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - this.cmds = cmds; + //this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -47,10 +44,7 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxLocals = iter.nextUNToInt(2); int codeLen = iter.nextUNToInt(4); String code = iter.nextUNToHexString(codeLen); - - ByteCodeCommand[] commands = CommandParser.parse(clzFile, code); - - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code,commands); + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); int exceptionTableLen = iter.nextUNToInt(2); if(exceptionTableLen != 0){ throw new RuntimeException("code属性里的异常table长度为:"+exceptionTableLen); @@ -84,17 +78,7 @@ private static void addSonAttr(ClassFile clzFile,CodeAttr codeAttr,ByteCodeItera } } - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - for(int i=0;i list = getMethods(); - for(Method m : list){ - String name = ((UTF8Info)pool.getConstantInfo(m.getNameIndex())).getValue(); - String desc = ((UTF8Info)pool.getConstantInfo(m.getDescriptorIndex())).getValue(); - if(name.equalsIgnoreCase(methodName) && desc.equalsIgnoreCase(paramAndReturnType)){ - return m; - } - } - return null; - } - public Method getMainMethod(){ -// main:([Ljava/lang/String;)V - return getMethod("main","([Ljava/lang/String;)V"); - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java deleted file mode 100644 index 80d3076ea1..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java deleted file mode 100644 index f2c72d31f1..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - - - -import java.util.HashMap; -import java.util.Map; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - - - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java deleted file mode 100644 index d9c3c619e2..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - if(null == codes || codes.length() == 0){ - throw new RuntimeException("字节码不存在"); - } - codes = codes.toUpperCase(); - CommandIterator iterator = new CommandIterator(codes); - List commands = new ArrayList(); - while(iterator.hasNext()){ - String operatorCode = iterator.next2CharAsString(); - if(ldc.equals(operatorCode)){ - LdcCmd cmd = new LdcCmd(clzFile,operatorCode); - cmd.setOperand(iterator.next2CharAsInt()); - commands.add(cmd); - }else if(bipush.equals(operatorCode)){ - BiPushCmd cmd = new BiPushCmd(clzFile,operatorCode); - cmd.setOperand(iterator.next2CharAsInt()); - commands.add(cmd); - }else if(new_object.equals(operatorCode)){ - NewObjectCmd cmd = new NewObjectCmd(clzFile,operatorCode); - cmd.setOprand1(iterator.next2CharAsInt()); - cmd.setOprand2(iterator.next2CharAsInt()); - commands.add(cmd); - }else if(invokespecial.equals(operatorCode)){ - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile,operatorCode); - cmd.setOprand1(iterator.next2CharAsInt()); - cmd.setOprand2(iterator.next2CharAsInt()); - commands.add(cmd); - }else if(invokevirtual.equals(operatorCode)){ - InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile,operatorCode); - cmd.setOprand1(iterator.next2CharAsInt()); - cmd.setOprand2(iterator.next2CharAsInt()); - commands.add(cmd); - }else if(putfield.equals(operatorCode)){ - PutFieldCmd cmd = new PutFieldCmd(clzFile,operatorCode); - cmd.setOprand1(iterator.next2CharAsInt()); - cmd.setOprand2(iterator.next2CharAsInt()); - commands.add(cmd); - }else if(getfield.equals(operatorCode)){ - GetFieldCmd cmd = new GetFieldCmd(clzFile,operatorCode); - cmd.setOprand1(iterator.next2CharAsInt()); - cmd.setOprand2(iterator.next2CharAsInt()); - commands.add(cmd); - }else if(getstatic.equals(operatorCode)){ - GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile,operatorCode); - cmd.setOprand1(iterator.next2CharAsInt()); - cmd.setOprand2(iterator.next2CharAsInt()); - commands.add(cmd); - }else if(dup.equals(operatorCode) || aload_0.equals(operatorCode) || aload_1.equals(operatorCode) || - aload_2.equals(operatorCode) || astore_1.equals(operatorCode) || voidreturn.equals(operatorCode) - || iload.equals(operatorCode) || iload_1.equals(operatorCode) || iload_2.equals(operatorCode) - || iload_3.equals(operatorCode) || fload_3.equals(operatorCode) || iconst_0.equals(operatorCode) - || iconst_1.equals(operatorCode) || istore_1.equals(operatorCode) || istore_2.equals(operatorCode) - || iadd.equals(operatorCode)|| iinc.equals(operatorCode)){ - NoOperandCmd command = new NoOperandCmd(clzFile,operatorCode); - commands.add(command); - }else{ - throw new RuntimeException("this operator code not includes yet:"+operatorCode); - } - } - calcuateOffset(commands); - ByteCodeCommand[] result = new ByteCodeCommand[commands.size()]; - return commands.toArray(result); - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java deleted file mode 100644 index ad694d7eec..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index 87bfca3c7f..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index e573129d76..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index 989c3f6fae..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java deleted file mode 100644 index bc72a9f300..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; -import com.github.ipk2015.coding2017.minijvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java deleted file mode 100644 index 973061d110..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java deleted file mode 100644 index 62c51c2b3a..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java deleted file mode 100644 index ca6052b34c..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - - - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java deleted file mode 100644 index e73ff203d5..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 99c6b99455..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.cmd; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; -import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; -import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java index d8cba51f62..e2e0f50f61 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java @@ -23,8 +23,4 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java index 9275387556..663c493b57 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java @@ -25,16 +25,5 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java index d28601f4ba..ea0e135a23 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public int getSize() { + public Object getSize() { return this.constantInfos.size() -1; } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java index 521c010f7b..b74fb427ba 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java @@ -51,9 +51,4 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java index 287c907259..cc5352db6e 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java @@ -49,11 +49,6 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java index 990c0f6a01..d1cd005111 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java @@ -42,9 +42,4 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java index 06c20e5b4f..38eef91f32 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java @@ -9,9 +9,5 @@ public NullConstantInfo(){ public int getType() { return -1; } - @Override - public void accept(Visitor visitor) { - - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java index 00b9b9b706..8f23231e72 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java @@ -22,11 +22,5 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java index c0a7b4e0c5..d94a267bbc 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java @@ -26,10 +26,6 @@ public String getValue() { public void setValue(String value) { this.value = value; } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java index b8a3d7dca2..3298a36d6b 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java @@ -3,9 +3,6 @@ import com.github.ipk2015.coding2017.minijvm.attr.AttributeInfo; import com.github.ipk2015.coding2017.minijvm.attr.CodeAttr; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; -import com.github.ipk2015.coding2017.minijvm.constant.UTF8Info; import com.github.ipk2015.coding2017.minijvm.loader.ByteCodeIterator; public class Method { @@ -70,18 +67,4 @@ private static void addAttr(ClassFile clzFile,Method method,ByteCodeIterator ite throw new RuntimeException("方法的此属性不存在:"+attrName); } } - public ByteCodeCommand[] getCmds() { - return this.getCodeAttr().getCmds(); - } - - public String toString() { - - ConstantPool pool = this.clzFile.getConstantPool(); - StringBuilder buffer = new StringBuilder(); - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - buffer.append(name).append(":").append(desc).append("\n"); - buffer.append(this.codeAttr.toString(pool)); - return buffer.toString(); - } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java deleted file mode 100644 index 2d7967cb41..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.print; - -import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; -import com.github.ipk2015.coding2017.minijvm.loader.ClassFileLoader; - -public class ClassFilePrinter { - ClassFile clzFile = null; - public ClassFilePrinter(ClassFile clzFile){ - this.clzFile = clzFile; - } - - public void print(){ - - if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag : public "); - } - System.out.println("Class Name:"+ clzFile.getClassName()); - - System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMajorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - cnstPoolPrinter.print(); - - - - - } - - public static void main(String[] args){ -// String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - String path = "E:\\javaImprove\\git\\group24\\121111914\\src\\com\\github\\ipk2015\\coding2017\\minijvm\\bin"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); -// String className = "com.coderising.jvm.test.EmployeeV1"; - String className = "EmployeeV1"; - - ClassFile clzFile = loader.loadClass(className); - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java deleted file mode 100644 index 17b88d9932..0000000000 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.github.ipk2015.coding2017.minijvm.print; - -import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; -import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; -import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; -import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; -import com.github.ipk2015.coding2017.minijvm.constant.NameAndTypeInfo; -import com.github.ipk2015.coding2017.minijvm.constant.StringInfo; -import com.github.ipk2015.coding2017.minijvm.constant.UTF8Info; - -public class ConstantPoolPrinter { - ConstantPool pool; - ConstantPoolPrinter(ConstantPool pool){ - this.pool = pool; - } - public void print(){ - - System.out.println("Constant Pool:"); - - ConstantInfo.Visitor visitor = new ConstantInfo.Visitor(){ - - @Override - public void visitClassInfo(ClassInfo info) { - int utf8Index = info.getUtf8Index(); - String className = info.getClassName(); - sop("Class\t\t"+"#"+utf8Index+"\t\t// "+className); - } - - @Override - public void visitFieldRef(FieldRefInfo info) { - int classInfoIndex = info.getClassInfoIndex(); - int nameAndTypeIndex = info.getNameAndTypeIndex(); - String className = info.getClassName(); - String fieldName = info.getFieldName(); - String fieldType = info.getFieldType(); - sop("Fieldref\t\t"+"#"+classInfoIndex+".#"+nameAndTypeIndex+"\t\t// " - +className+"."+fieldName+":"+fieldType); - } - - @Override - public void visitMethodRef(MethodRefInfo info) { - int classInfoIndex = info.getClassInfoIndex(); - int nameAndTypeIndex = info.getNameAndTypeIndex(); - String className = info.getClassName(); - String methodName = info.getMethodName(); - String paramAndReturnType = info.getParamAndReturnType(); - sop("Methodref\t\t"+"#"+classInfoIndex+".#"+nameAndTypeIndex+"\t\t// " - +className+"."+methodName+":"+paramAndReturnType); - - } - - @Override - public void visitNameAndType(NameAndTypeInfo info) { - int index1 = info.getIndex1(); - int index2 = info.getIndex2(); - String name = info.getName(); - String typeInfo = info.getTypeInfo(); - sop("NameAndType\t"+"#"+index1+".#"+index2+"\t\t// "+name+":"+typeInfo); - } - - @Override - public void visitString(StringInfo info) { - int index = info.getIndex(); - String utf8String = info.getConstantPool().getUTF8String(index); - sop("String\t\t"+"#"+index+"\t\t// "+utf8String); - } - - @Override - public void visistUTF8(UTF8Info info) { - sop("Utf8\t\t"+info.getValue()); - } - - }; - - int size = pool.getSize(); - for(int i = 1;i < size+1;i++){ - ConstantInfo constantInfo = pool.getConstantInfo(i); - System.out.print("\t"+"#"+i+" = "); - constantInfo.accept(visitor); - } - - } - - public static void sop(String s){ - System.out.println(s); - } -} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java index 213046188c..0a3979119d 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java @@ -12,10 +12,6 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.clz.ClassIndex; -import com.github.ipk2015.coding2017.minijvm.cmd.BiPushCmd; -import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; -import com.github.ipk2015.coding2017.minijvm.cmd.OneOperandCmd; -import com.github.ipk2015.coding2017.minijvm.cmd.TwoOperandCmd; import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; @@ -283,78 +279,5 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java deleted file mode 100644 index d3e9afbf9b..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - - -import com.johnChnia.coding2017.basic.List; - -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - List tokens = InfixToPostfix.convert(this.expr); - return PostfixExpr.evaluate(tokens); - } - - -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index e47a8841da..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("10-2*3+50"); - Assert.assertEquals(54, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java deleted file mode 100644 index e361815f02..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - - -import com.johnChnia.coding2017.basic.ArrayList; -import com.johnChnia.coding2017.basic.List; -import com.johnChnia.coding2017.basic.stack.Stack; - - -/*** - * Rule: - */ -public class InfixToPostfix { - - public static List convert(String expr) { - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse(expr); - List list = new ArrayList<>(); - Stack stack = new Stack<>(); - for (int i = 0; i < tokens.size(); i++) { - Token token = tokens.get(i); - if (token.isNumber()) { - list.add(token); - } else if (token.isOperator()) { - while (!stack.empty() && !token.hasHigherPriority(stack.peek())) { - list.add(stack.pop()); - } - stack.push(token); - - } - } - while (!stack.empty()) { - list.add(stack.pop()); - } - return list; - } - -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java deleted file mode 100644 index adc1aac489..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - -import com.johnChnia.coding2017.basic.stack.Stack; - -/** - * Created by john on 2017/4/20. - */ -public class Operator { - - public void handlerToken(String fix, Stack stack, Token token) { - if (token.isNumber()) { - stack.push(Float.parseFloat(token.toString())); - } else if (token.isOperator()) { - float p = stack.pop(); - float q = stack.pop(); - stack.push(perform(fix, token.toString(), p, q)); - } - } - - - private float perform(String fix, String operator, float p, float q) { - float result = 0.0f; - if (operator.equals("+")) { - result = p + q; - } else if (operator.equals("-")) { - if (fix.equals("postfix")) { - result = q - p; - } else if (fix.equals("prefix")) { - result = p - q; - } - } else if (operator.equals("*")) { - result = p * q; - } else if (operator.equals("/")) { - if (fix.equals("postfix")) { - result = q / p; - } else if (fix.equals("prefix")) { - result = p / q; - } - } - return result; - } -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index 4046c13830..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - -import com.johnChnia.coding2017.basic.List; -import com.johnChnia.coding2017.basic.stack.Stack; - -public class PostfixExpr { - private String expr = null; - static Operator operator = new Operator(); - - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse(this.expr); - Stack stack = new Stack<>(); - for (int i = 0; i < tokens.size(); i++) { - operator.handlerToken("postfix", stack, tokens.get(i)); - - } - - return stack.pop(); - } - - public static float evaluate(List tokens) { - Stack stack = new Stack<>(); - for (int i = 0; i < tokens.size(); i++) { - operator.handlerToken("postfix", stack, tokens.get(i)); - } - return stack.pop(); - } - - -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java deleted file mode 100644 index 312eed28b3..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java deleted file mode 100644 index c16f529845..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - -import com.johnChnia.coding2017.basic.List; -import com.johnChnia.coding2017.basic.stack.Stack; - -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse(this.expr); - Operator operator = new Operator(); - Stack stack = new Stack<>(); - for (int i = tokens.size() - 1; i >= 0; i--) { - operator.handlerToken("prefix", stack, tokens.get(i)); - } - return stack.pop(); - } - - -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java deleted file mode 100644 index 30f67b2710..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(), 0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(), 0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(), 0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(), 0.001f); - } - - - } - -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java deleted file mode 100644 index f87a210587..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - - -} \ No newline at end of file diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java deleted file mode 100644 index b9c8b80444..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - - -import com.johnChnia.coding2017.basic.ArrayList; -import com.johnChnia.coding2017.basic.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else { - System.out.println("char :[" + c + "] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java deleted file mode 100644 index cdb3b091db..0000000000 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.johnChnia.coding2017.basic.stack.expr; - -import com.johnChnia.coding2017.basic.List; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} diff --git a/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java b/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java deleted file mode 100644 index a300edafc7..0000000000 --- a/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,57 +0,0 @@ -package jvm.loader; - - -import com.johnChnia.coding2017.basic.ArrayList; -import com.johnChnia.coding2017.basic.List; - -import java.io.*; - -/** - * @// TODO: 2017/4/20 改成 try... with...resource - * @// TODO: 2017/4/20 close inputstream - * @// TODO: 2017/4/20 修改TreeInfo直接返回File - */ -public class ClassFileLoader { - - private List clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - for (int i = 0; i < clzPaths.size(); i++) { - // 找到指定类文件 - Directory.TreeInfo treeInfo = Directory.walk(clzPaths.get(i), className); - if (treeInfo.files.size() > 0) { - try { - FileInputStream fis = new FileInputStream(treeInfo.files.get(0)); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 自动增长 - byte[] buff = new byte[1024]; - int len; - while ((len = fis.read(buff)) != -1) { - bos.write(buff, 0, len); - } - return bos.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return null; - - } - - - public void addClassPath(String path) { - clzPaths.add(path); - } - - - public String getClassPath() { - StringBuilder sb = new StringBuilder(); - for (int index = 0; index < clzPaths.size(); index++) { - sb.append(clzPaths.get(index)); - sb.append(";"); - } - return sb.toString().substring(0, sb.length() - 1); - } - - -} diff --git a/group24/315863321/src/main/java/jvm/loader/Directory.java b/group24/315863321/src/main/java/jvm/loader/Directory.java deleted file mode 100644 index 98f239434d..0000000000 --- a/group24/315863321/src/main/java/jvm/loader/Directory.java +++ /dev/null @@ -1,81 +0,0 @@ -package jvm.loader; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.regex.Pattern; - -/** - * Created by john on 2017/4/17. - * - * @// TODO: 2017/4/20 实现 List.addAll(), list implements Iterable - */ -public final class Directory { - - public static File[] local(File dir, final String regex) { - return dir.listFiles(new FilenameFilter() { // 文件过滤接口 - private Pattern pattern = Pattern.compile(regex); - - @Override - public boolean accept(File dir, String name) { - return pattern.matcher(new File(name).getName()).matches(); - } - }); - } - - public static File[] local(String path, final String regex) { - return local(new File(path), regex); - } - - public static class TreeInfo implements Iterable { - public List files = new ArrayList<>(); - public List dirs = new ArrayList<>(); - - @Override - public Iterator iterator() { - return files.iterator(); - } - - public void addAll(TreeInfo other) { - files.addAll(other.files); - dirs.addAll(other.dirs); - } - - @Override - public String toString() { - return "dirs: " + dirs + - "\n\nfiles: " + files; - } - } - - public static TreeInfo walk(String start, String regex) { - return recuresDirs(new File(start), regex); - } - - public static TreeInfo walk(File start, String regex) { - return recuresDirs(start, regex); - } - - public static TreeInfo walk(File start) { - return recuresDirs(start, ".*");// 全部 - } - - public static TreeInfo walk(String start) { - return recuresDirs(new File(start), ".*");// 全部 - } - - public static TreeInfo recuresDirs(File startDir, String regex) { - TreeInfo result = new TreeInfo(); - for (File item : startDir.listFiles()) { - if (item.isDirectory()) { - result.dirs.add(item); - result.addAll(recuresDirs(item, regex)); - } else if (item.getName().matches(regex)) - result.files.add(item); - } - return result; - } - -} \ No newline at end of file diff --git a/group24/315863321/src/main/java/jvm/test/ClassFileloaderTest.java b/group24/315863321/src/main/java/jvm/test/ClassFileloaderTest.java deleted file mode 100644 index 70d400cb28..0000000000 --- a/group24/315863321/src/main/java/jvm/test/ClassFileloaderTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package jvm.test; - -import jvm.loader.ClassFileLoader; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class ClassFileloaderTest { - - - static String path1 = "/Users/john/Documents/mygit/coding2017/group24/315863321/target/classes/jvm"; - static String path2 = "/Users/john/Documents"; - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1 + ";" + path2, clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "EmployeeV1.class"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1026, byteCodes.length); - - } - - - @Test - public void testMagicNumber() { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "EmployeeV1.class"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - private String byteToHexString(byte[] codes) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } - -} diff --git a/group24/315863321/src/main/java/jvm/test/EmployeeV1.java b/group24/315863321/src/main/java/jvm/test/EmployeeV1.java deleted file mode 100644 index 3fbdcef7bf..0000000000 --- a/group24/315863321/src/main/java/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,31 +0,0 @@ -package 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/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfix.java b/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfix.java deleted file mode 100644 index 54666845de..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfix.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.donaldy.basic.expr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -public class InfixToPostfix { - - public static List convert(String expr) { - - Stack opStack = new Stack<>(); - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - - List newTokens = new ArrayList<>(); - - for (Token token : tokens) { - - if (token.isOperator()) { - - while (true) { - if (opStack.isEmpty()) { - opStack.push(token); - - break; - } - - if (token.hasHigherPriority(opStack.peek())) { - - opStack.push(token); - - break; - } - - newTokens.add(opStack.pop()); - - } - - - } - - if (token.isNumber()) { - newTokens.add(token); - } - - } - - while (!opStack.isEmpty()) { - newTokens.add(opStack.pop()); - } - - - return newTokens; - } - - - -} diff --git a/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfixTest.java b/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfixTest.java deleted file mode 100644 index f6dda0ee18..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfixTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.donaldy.basic.expr; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by DonaldY on 2017/4/18. - */ -public class InfixToPostfixTest { - - @Test - public void test() { - - String expr = "9 + 3-1 *3+10/2"; - //Assert.assertEquals("9 3 1-3*+ 10 2/+", InfixToPostfix.convert(expr)); - - expr = "10-2*3+50"; - Assert.assertEquals("[10, 2, 3, *, -, 50, +]", InfixToPostfix.convert(expr).toString()); - - } - -} diff --git a/group24/448641125/src/com/donaldy/basic/expr/PostfixExpr.java b/group24/448641125/src/com/donaldy/basic/expr/PostfixExpr.java deleted file mode 100644 index ec175d192c..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/PostfixExpr.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.donaldy.basic.expr; - - -import java.util.List; -import java.util.Stack; - -/** - * 从左到右遍历, - * 1. 若为数字,则入栈 - * 2. 若为运算符,则calculate - */ -public class PostfixExpr { - - String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - Stack numStack = new Stack<>(); - - - for(Token token : tokens){ - - if (token.isOperator()){ - - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(), f1,f2)); - - } - - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - - - return numStack.pop().floatValue(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - - - - -} diff --git a/group24/448641125/src/com/donaldy/basic/expr/PostfixExprTest.java b/group24/448641125/src/com/donaldy/basic/expr/PostfixExprTest.java deleted file mode 100644 index 3195c7b3b2..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/PostfixExprTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.donaldy.basic.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group24/448641125/src/com/donaldy/basic/expr/PrefixExpr.java b/group24/448641125/src/com/donaldy/basic/expr/PrefixExpr.java deleted file mode 100644 index aaee04d871..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/PrefixExpr.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.donaldy.basic.expr; - -import java.util.List; -import java.util.Stack; - -/** - * 从右到左遍历 - * 1. 若为数字,则入栈 - * 2. 若为符号,则calculate - */ -public class PrefixExpr { - - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - Stack numStack = new Stack<>(); - Stack opStack = new Stack<>(); - - for(int i = tokens.size() - 1; i >= 0 ; --i){ - Token token = tokens.get(i); - - if (token.isOperator()){ - opStack.push(token.toString()); - Float f1 = numStack.pop(); - Float f2 = numStack.pop(); - numStack.push(calculate(opStack.pop(), f1,f2)); - } - - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - - while (!opStack.isEmpty()) { - Float f1 = numStack.pop(); - Float f2 = numStack.pop(); - numStack.push(calculate(opStack.pop(), f1,f2)); - } - - return numStack.pop().floatValue(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - - -} diff --git a/group24/448641125/src/com/donaldy/basic/expr/PrefixExprTest.java b/group24/448641125/src/com/donaldy/basic/expr/PrefixExprTest.java deleted file mode 100644 index 435a82d8b1..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.donaldy.basic.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3 * 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group24/448641125/src/com/donaldy/basic/expr/Token.java b/group24/448641125/src/com/donaldy/basic/expr/Token.java deleted file mode 100644 index db639bcbcf..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/Token.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.donaldy.basic.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - - -} \ No newline at end of file diff --git a/group24/448641125/src/com/donaldy/basic/expr/TokenParser.java b/group24/448641125/src/com/donaldy/basic/expr/TokenParser.java deleted file mode 100644 index 38d5225c4f..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/TokenParser.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.donaldy.basic.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group24/448641125/src/com/donaldy/basic/expr/TokenParserTest.java b/group24/448641125/src/com/donaldy/basic/expr/TokenParserTest.java deleted file mode 100644 index 03d3146213..0000000000 --- a/group24/448641125/src/com/donaldy/basic/expr/TokenParserTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.donaldy.basic.expr; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} diff --git a/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java b/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java deleted file mode 100644 index fbe5cdc6c8..0000000000 --- a/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.donaldy.basic.queue; - -/** - * 用数组实现循环队列 - * @author liuxin - * - * @param - */ -public class CircleQueue { - - private final static int DEFAULT_SIZE = 10; - - //用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE] ; - - //队头 - private int front = 0; - //队尾 - private int rear = 0; - //元素个数 - private int size = 0; - - public boolean isEmpty() { - - return this.size == 0; - - } - - public int size() { - return this.size; - } - - - - public void enQueue(E data) { - - if (this.size == DEFAULT_SIZE) { - throw new IndexOutOfBoundsException("size() : " + this.size()); - } - - this.elementData[this.rear] = data; - - this.rear = (this.rear + 1) % DEFAULT_SIZE; - - this.size ++; - - } - - public E deQueue() { - - if (this.isEmpty()) { - throw new IndexOutOfBoundsException("size() : " + this.size()); - } - - E oldElement = (E) this.elementData[this.front]; - - this.elementData[this.front] = null; - - this.front = (this.front + 1) % DEFAULT_SIZE; - - this.size --; - - return oldElement; - } - - public E getElement(int index) { - - if (index < 0 || index >= DEFAULT_SIZE) { - throw new IndexOutOfBoundsException("index : " + index); - } - - return (E)this.elementData[index]; - } -} diff --git a/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java b/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java deleted file mode 100644 index f6516c7743..0000000000 --- a/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.donaldy.basic.queue; - -import org.junit.Assert; -import org.junit.Test; - - - -/** - * Created by DonaldY on 2017/4/24. - */ -public class CircleQueueTest { - - @Test - public void test() { - CircleQueue cirQueue = new CircleQueue<>(); - - for (int i = 1; i <= 10; ++i) { - cirQueue.enQueue(i); - } - - Assert.assertEquals(10, cirQueue.size()); - - for (int i = 0; i < 10; ++i) { - Assert.assertEquals(i + 1, (int)cirQueue.getElement(i)); - } - - - for (int i = 0; i <= 5; ++i) { - Assert.assertEquals(i + 1, (int)cirQueue.deQueue()); - } - - Assert.assertEquals(4, cirQueue.size()); - - } -} diff --git a/group24/448641125/src/com/donaldy/basic/queue/Josephus.java b/group24/448641125/src/com/donaldy/basic/queue/Josephus.java deleted file mode 100644 index 9d3d588148..0000000000 --- a/group24/448641125/src/com/donaldy/basic/queue/Josephus.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.donaldy.basic.queue; - -import java.util.ArrayList; -import java.util.List; - -/** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: - * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, - * 直到最后一个人留下来 - * 该方法返回一个List, 包含了被杀死人的次序 - * @author liuxin - * - */ -public class Josephus { - - public static List execute(int n, int m){ - - List killList = new ArrayList(); - - //用于存储 - Queue queue1 = new Queue<>(); - //用于操作 - Queue queue2 = new Queue<>(); - - for (int i = 0; i < n; ++i) { - - queue1.enQueue(i); - - } - - int cnt = 1; - - while (true) { - - if (queue1.size() < m) { - break; - } - - if (cnt % m == 0) { - - killList.add(queue1.deQueue()); - - } else { - - queue1.enQueue(queue1.deQueue()); - - } - - cnt ++; - - } - - while (!queue1.isEmpty()) { - killList.add(queue1.deQueue()); - } - - - return killList; - } - -} diff --git a/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java b/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java deleted file mode 100644 index dad206e942..0000000000 --- a/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.donaldy.basic.queue; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class JosephusTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testExecute() { - - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); - - } - -} diff --git a/group24/448641125/src/com/donaldy/basic/queue/Queue.java b/group24/448641125/src/com/donaldy/basic/queue/Queue.java deleted file mode 100644 index d504367907..0000000000 --- a/group24/448641125/src/com/donaldy/basic/queue/Queue.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.donaldy.basic.queue; - -import java.util.NoSuchElementException; - -public class Queue { - private Node first; - private Node last; - private int size; - - - private static class Node { - private E item; - private Node next; - } - - - public Queue() { - first = null; - last = null; - size = 0; - } - - - public boolean isEmpty() { - return first == null; - } - - public int size() { - return size; - } - - - - public void enQueue(E data) { - Node oldlast = last; - last = new Node(); - last.item = data; - last.next = null; - if (isEmpty()) { - first = last; - } - else{ - oldlast.next = last; - } - size++; - } - - public E deQueue() { - - if (isEmpty()) { - throw new NoSuchElementException("Queue underflow"); - } - E item = first.item; - first = first.next; - size--; - if (isEmpty()) { - last = null; - } - return item; - } - -} diff --git a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java deleted file mode 100644 index 98496b3e77..0000000000 --- a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.donaldy.basic.queue; - -import java.util.Stack; - -/** - * 用两个栈来实现一个队列 - * @author liuxin - * - * @param - */ -public class QueueWithTwoStacks { - - //用于存储 - private Stack stack1; - //用于操作 - private Stack stack2; - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - - public boolean isEmpty() { - - return this.stack1.isEmpty(); - - } - - - public int size() { - - return this.stack1.size(); - - } - - - public void enQueue(E item) { - this.stack1.push(item); - } - - public E deQueue() { - - if (this.size() <= 0) { - throw new IndexOutOfBoundsException("size : " + this.size()); - } - - while (!this.stack1.isEmpty()) { - - this.stack2.push(this.stack1.pop()); - - } - - E oldElement = this.stack2.pop(); - - while (!this.stack2.isEmpty()) { - - this.stack1.push(this.stack2.pop()); - - } - - return oldElement; - - } - - - } - diff --git a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java deleted file mode 100644 index 21dcd53b85..0000000000 --- a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.donaldy.basic.queue; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by DonaldY on 2017/4/24. - */ -public class QueueWithTwoStacksTest { - - @Test - public void test() { - QueueWithTwoStacks qwStack = new QueueWithTwoStacks(); - - for (int i = 1; i <= 5; ++i) { - qwStack.enQueue(i); - } - - for (int i = 1; i <= 5; ++i) { - Assert.assertEquals(i, (int)qwStack.deQueue()); - } - } -} diff --git a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java index 9122f3690a..6b699e6991 100644 --- a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java +++ b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java @@ -1,8 +1,6 @@ package com.donaldy.jvm.attr; import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.cmd.ByteCodeCommand; -import com.donaldy.jvm.cmd.CommandParser; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.loader.ByteCodeIterator; @@ -16,23 +14,21 @@ public String getCode() { return code; } - private ByteCodeCommand[] cmds ; - - public ByteCodeCommand[] getCmds() { - return cmds; - } - + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - this.cmds = cmds; + //this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -40,83 +36,21 @@ public void setLineNumberTable(LineNumberTable t) { } public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; + this.localVarTable = t; } - + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - int maxStack = iter.nextU2ToInt(); - int maxLocals = iter.nextU2ToInt(); - int codeLen = iter.nextU4ToInt(); - - String code = iter.nextUxToHexString(codeLen); - - - ByteCodeCommand[] cmds = CommandParser.parse(clzFile,code); - - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code,cmds); - - int exceptionTableLen = iter.nextU2ToInt(); - //TODO 处理exception - if(exceptionTableLen>0){ - String exTable = iter.nextUxToHexString(exceptionTableLen); - System.out.println("Encountered exception table , just ignore it :" + exTable); - - } - - - int subAttrCount = iter.nextU2ToInt(); - - for(int x=1; x<=subAttrCount; x++){ - int subAttrIndex = iter.nextU2ToInt(); - String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); - - //已经向前移动了U2, 现在退回去。 - iter.back(2); - //line item table - if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ - - LineNumberTable t = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(t); - } - else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ - LocalVariableTable t = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(t); - } - else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ - StackMapTable t = StackMapTable.parse(iter); - codeAttr.setStackMapTable(t); - } - else{ - throw new RuntimeException("Need code to process " + subAttrName); - } - - - } - - return codeAttr; + + + return null; } - - - public String toString(ConstantPool pool) { - - StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - for(int i=0;i items = new ArrayList(); - + public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen); } - + public static LocalVariableTable parse(ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); int attrLen = iter.nextU4ToInt(); @@ -38,19 +38,8 @@ public static LocalVariableTable parse(ByteCodeIterator iter){ return lvTable; } private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); + this.items.add(item); } + + } diff --git a/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java b/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java index eafc13a4a9..c36e1940b1 100644 --- a/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java +++ b/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java @@ -80,42 +80,13 @@ public void print(){ } - public String getClassName(){ + private String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - public String getSuperClassName(){ + private String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } - - public Method getMethod(String methodName, String paramAndReturnType){ - - for (Method m : methods) { - int nameIndex = m.getNameIndex(); - int descIndex = m.getDescriptorIndex(); - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descIndex); - - if (name.equals(methodName) && desc.equals(paramAndReturnType)) { - return m; - } - } - - return null; - } - public Method getMainMethod(){ - - for (Method m : methods) { - int nameIndex = m.getNameIndex(); - int descIndex = m.getDescriptorIndex(); - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descIndex); - if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { - return m; - } - } - return null; - } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java deleted file mode 100644 index 4126097c3f..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantInfo; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index a611d4273b..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.donaldy.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantInfo; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - public abstract void execute(StackFrame frame,ExecutionResult result); -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java b/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java deleted file mode 100644 index b43e0d3a06..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.donaldy.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.donaldy.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - if ((codes == null) || (codes.length() == 0)) { - throw new RuntimeException("the orignal code is not correct!"); - } - - codes = codes.toUpperCase(); - - CommandIterator iter = new CommandIterator(codes); - List cmds = new ArrayList(); - - while (iter.hasNext()) { - String opCode = iter.next2CharAsString(); - - if (new_object.equals(opCode)) { - NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (getfield.equals(opCode)) { - GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (getstatic.equals(opCode)) { - GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); - - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - - cmds.add(cmd); - } else if (putfield.equals(opCode)) { - PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (ldc.equals(opCode)) { - LdcCmd cmd = new LdcCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (bipush.equals(opCode)) { - BiPushCmd cmd = new BiPushCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { - - NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); - cmds.add(cmd); - } else { - throw new RuntimeException("Sorry, the java instruction " + opCode + "has not been implement."); - } - } - - calcuateOffset(cmds); - - ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; - cmds.toArray(result); - return result; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 6644fe958d..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index 7b4cc9896f..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ClassInfo; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.constant.FieldRefInfo; -import com.donaldy.jvm.constant.UTF8Info; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index b646011143..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.constant.MethodRefInfo; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index 8b51e481af..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - } - - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java deleted file mode 100644 index d55d8ef409..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantInfo; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.constant.StringInfo; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 2a30581935..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index c664210eda..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 9a1709a9c7..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 9bf85ba44f..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.engine.ExecutionResult; -import com.donaldy.jvm.engine.StackFrame; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 1d38c8ed3f..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.donaldy.jvm.cmd; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ClassInfo; -import com.donaldy.jvm.constant.ConstantInfo; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.constant.FieldRefInfo; -import com.donaldy.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java index cbf71927be..71f31261e4 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java @@ -21,8 +21,4 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java index ff2a27bcd6..20cad6fcd5 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java @@ -26,15 +26,4 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java b/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java index 1698c2c657..77bdfc8e67 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java @@ -23,9 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public int getSize() { + public Object getSize() { return this.constantInfos.size() -1; } - - } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java index ffd7b835e0..6a6f72f5da 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java @@ -51,8 +51,4 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java index b370eff575..e65135279f 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java @@ -49,11 +49,6 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java index db48418b57..21ecd2b411 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java @@ -42,10 +42,4 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - - } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java index 74e491637f..3a2cc11017 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java @@ -9,9 +9,5 @@ public NullConstantInfo(){ public int getType() { return -1; } - @Override - public void accept(Visitor visitor) { - - } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java index 94325bfdbc..f59d34a497 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java @@ -22,11 +22,5 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java b/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java index 10c06dcf2a..7432e5b6c4 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java @@ -26,11 +26,6 @@ public String getValue() { public void setValue(String value) { this.value = value; } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - - } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java deleted file mode 100644 index c90cc8fc65..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.donaldy.jvm.engine; - -import com.donaldy.jvm.method.Method; - -public class ExecutionResult { - public static final int RUN_NEXT_CMD = 1; - public static final int JUMP = 2; - public static final int EXIT_CURRENT_FRAME = 3; - public static final int PAUSE_AND_RUN_NEW_FRAME = 4; - - private int nextAction = RUN_NEXT_CMD; - - private int nextCmdOffset = 0; - - private Method nextMethod; - - public Method getNextMethod() { - return nextMethod; - } - public void setNextMethod(Method nextMethod) { - this.nextMethod = nextMethod; - } - - - - public void setNextAction(int action){ - this.nextAction = action; - } - public boolean isPauseAndRunNewFrame(){ - return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; - } - public boolean isExitCurrentFrame(){ - return this.nextAction == EXIT_CURRENT_FRAME; - } - - public boolean isRunNextCmd(){ - return this.nextAction == RUN_NEXT_CMD; - } - - public boolean isJump(){ - return this.nextAction == JUMP; - } - - public int getNextCmdOffset() { - return nextCmdOffset; - } - - public void setNextCmdOffset(int nextCmdOffset) { - this.nextCmdOffset = nextCmdOffset; - } - - - - - -} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java deleted file mode 100644 index 1fb57626b9..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.donaldy.jvm.engine; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -import com.donaldy.jvm.attr.CodeAttr; -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.cmd.ByteCodeCommand; -import com.donaldy.jvm.constant.MethodRefInfo; -import com.donaldy.jvm.method.Method; - -public class ExecutorEngine { - - private Stack stack = new Stack(); - - public ExecutorEngine() { - - } - - public void execute(Method mainMethod){ - - - - } - - - - private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { - - - - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/Heap.java b/group24/448641125/src/com/donaldy/jvm/engine/Heap.java deleted file mode 100644 index 250d70504d..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/engine/Heap.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.donaldy.jvm.engine; - -public class Heap { - - /** - * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 - */ - - private static Heap instance = new Heap(); - private Heap() { - } - public static Heap getInstance(){ - return instance; - } - public JavaObject newObject(String clzName){ - - JavaObject jo = new JavaObject(JavaObject.OBJECT); - jo.setClassName(clzName); - return jo; - } - - public JavaObject newString(String value){ - JavaObject jo = new JavaObject(JavaObject.STRING); - jo.setStringValue(value); - return jo; - } - - public JavaObject newFloat(float value){ - JavaObject jo = new JavaObject(JavaObject.FLOAT); - jo.setFloatValue(value); - return jo; - } - public JavaObject newInt(int value){ - JavaObject jo = new JavaObject(JavaObject.INT); - jo.setIntValue(value); - return jo; - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java b/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java deleted file mode 100644 index d5c5884af2..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.donaldy.jvm.engine; - -import java.util.HashMap; -import java.util.Map; - -public class JavaObject { - public static final int OBJECT = 1; - public static final int STRING = 2; - public static final int INT = 3; - public static final int FLOAT = 4; - - int type; - private String className; - - private Map fieldValues = new HashMap(); - - private String stringValue; - - private int intValue; - - private float floatValue; - - public void setFieldValue(String fieldName, JavaObject fieldValue){ - fieldValues.put(fieldName, fieldValue); - } - public JavaObject(int type){ - this.type = type; - } - public void setClassName(String className){ - this.className = className; - } - public void setStringValue(String value){ - stringValue = value; - } - public String getStringValue(){ - return this.stringValue; - } - public void setIntValue(int value) { - this.intValue = value; - } - public int getIntValue(){ - return this.intValue; - } - public int getType(){ - return type; - } - public JavaObject getFieldValue(String fieldName){ - return this.fieldValues.get(fieldName); - } - public String toString(){ - switch(this.getType()){ - case INT: - return String.valueOf(this.intValue); - case STRING: - return this.stringValue; - case OBJECT: - return this.className +":"+ this.fieldValues; - case FLOAT : - return String.valueOf(this.floatValue); - default: - return null; - } - } - public String getClassName(){ - return this.className; - } - public void setFloatValue(float value) { - this.floatValue = value; - } - -} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java b/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java deleted file mode 100644 index fea5102cd0..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.donaldy.jvm.engine; - -import java.util.HashMap; -import java.util.Map; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.MethodRefInfo; -import com.donaldy.jvm.loader.ClassFileLoader; -import com.donaldy.jvm.method.Method; - -public class MethodArea { - - public static final MethodArea instance = new MethodArea(); - - /** - * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 - */ - - private ClassFileLoader clzLoader = null; - - Map map = new HashMap(); - - private MethodArea(){ - } - - public static MethodArea getInstance(){ - return instance; - } - - public void setClassFileLoader(ClassFileLoader clzLoader){ - this.clzLoader = clzLoader; - } - - public Method getMainMethod(String className){ - - ClassFile clzFile = this.findClassFile(className); - - return clzFile.getMainMethod(); - } - - - public ClassFile findClassFile(String className){ - - if(map.get(className) != null){ - return map.get(className); - } - // 看来该class 文件还没有load过 - ClassFile clzFile = this.clzLoader.loadClass(className); - - map.put(className, clzFile); - - return clzFile; - - } - - - public Method getMethod(String className, String methodName, String paramAndReturnType){ - - return null; - } - - - public Method getMethod(MethodRefInfo methodRef){ - - return null; - - } -} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java b/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java deleted file mode 100644 index 30f19e0d8c..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.donaldy.jvm.engine; -import java.io.FileNotFoundException; -import java.io.IOException; - -import com.donaldy.jvm.loader.ClassFileLoader; - - -public class MiniJVM { - - public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ - - ClassFileLoader loader = new ClassFileLoader(); - for(int i=0;i localVariableTable = new ArrayList(); - private Stack oprandStack = new Stack(); - - int index = 0; - - private Method m = null; - - private StackFrame callerFrame = null; - - public StackFrame getCallerFrame() { - return callerFrame; - } - - public void setCallerFrame(StackFrame callerFrame) { - this.callerFrame = callerFrame; - } - - - - - public static StackFrame create(Method m){ - - StackFrame frame = new StackFrame( m ); - - return frame; - } - - - private StackFrame(Method m) { - this.m = m; - - } - - - - public JavaObject getLocalVariableValue(int index){ - return this.localVariableTable.get(index); - } - - public Stack getOprandStack(){ - return this.oprandStack; - } - - public int getNextCommandIndex(int offset){ - - ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); - for(int i=0;i values){ - this.localVariableTable = values; - } - - public void setLocalVariableValue(int index, JavaObject jo){ - //问题: 为什么要这么做?? - if(this.localVariableTable.size()-1 < index){ - for(int i=this.localVariableTable.size(); i<=index; i++){ - this.localVariableTable.add(null); - } - } - this.localVariableTable.set(index, jo); - - - } - - public Method getMethod(){ - return m; - } - - -} diff --git a/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java b/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java index 17f25799c2..e1132dd023 100644 --- a/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java +++ b/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java @@ -58,7 +58,6 @@ public String getClassPath() { } public ClassFile loadClass(String className) { - byte[] codes = this.readBinaryCode(className); ClassFileParser parser = new ClassFileParser(); return parser.parse(codes); diff --git a/group24/448641125/src/com/donaldy/jvm/method/Method.java b/group24/448641125/src/com/donaldy/jvm/method/Method.java index 8720da21b7..a69ff696b8 100644 --- a/group24/448641125/src/com/donaldy/jvm/method/Method.java +++ b/group24/448641125/src/com/donaldy/jvm/method/Method.java @@ -2,7 +2,6 @@ import com.donaldy.jvm.attr.*; import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.cmd.ByteCodeCommand; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.UTF8Info; import com.donaldy.jvm.loader.ByteCodeIterator; @@ -49,42 +48,8 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ - int accessFlag = iter.nextU2ToInt(); int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); - - - /*System.out.println("name = " + clzFile.getConstantPool().getUTF8String(nameIndex) - + ", desc = " + clzFile.getConstantPool().getUTF8String(descIndex));*/ - - Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); - - //attribCount == 1 - for( int j = 1; j <= attribCount; j++){ - - int attrNameIndex = iter.nextU2ToInt(); - /*System.out.println("attrNameIndex : " + attrNameIndex);*/ - String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); - /*System.out.println("attrName : " + attrName);*/ - iter.back(2); - - if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){ - /*System.out.println("j : " + j );*/ - CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); - m.setCodeAttr(codeAttr); - } else{ - throw new RuntimeException("only CODE attribute is implemented , please implement the "+ attrName); - } - - } - - return m ; - - //////////////////////Backup/////////////////////// - /*int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); int descriptorIndex = iter.nextU2ToInt(); int attributeCount = iter.nextU2ToInt(); @@ -94,7 +59,6 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ if (!"Code".equals(clzFile.getConstantPool().getUTF8String(attrNameIndex))) throw new RuntimeException("attributeInfo : " + attrNameIndex); - //CodeAttr.parse int attrLen = iter.nextU4ToInt(); int maxStack = iter.nextU2ToInt(); int maxLocals = iter.nextU2ToInt(); @@ -119,29 +83,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ Method method = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); method.setCodeAttr(codeAttr); - return method;*/ + return method; } - - public String toString() { - - ConstantPool pool = this.clzFile.getConstantPool(); - StringBuilder buffer = new StringBuilder(); - - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - - buffer.append(name).append(":").append(desc).append("\n"); - - buffer.append(this.codeAttr.toString(pool)); - - return buffer.toString(); - } - - public ByteCodeCommand[] getCmds() { - - return this.getCodeAttr().getCmds(); - - } } diff --git a/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java b/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java deleted file mode 100644 index 740a9aa9aa..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.donaldy.jvm.print; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ClassInfo; -import com.donaldy.jvm.constant.ConstantInfo; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.constant.FieldRefInfo; -import com.donaldy.jvm.constant.MethodRefInfo; -import com.donaldy.jvm.constant.NameAndTypeInfo; - -import com.donaldy.jvm.constant.StringInfo; -import com.donaldy.jvm.constant.UTF8Info; -import com.donaldy.jvm.loader.ClassFileLoader; - -public class ClassFilePrinter { - ClassFile clzFile = null; - public ClassFilePrinter(ClassFile clzFile){ - this.clzFile = clzFile; - } - - public void print(){ - - if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag : public "); - } - System.out.println("Class Name:"+ clzFile.getClassName()); - - System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMajorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - - cnstPoolPrinter.print(); - - } - - public static void main(String[] args){ - String path = "D:\\tools\\Code\\Y_Repository\\coding2017\\group24\\448641125\\out\\production\\448641125\\"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "com.donaldy.jvm.test.EmployeeV1"; - - ClassFile clzFile = loader.loadClass(className); - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} diff --git a/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java b/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java deleted file mode 100644 index 910494d803..0000000000 --- a/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.donaldy.jvm.print; - -import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.clz.ClassIndex; -import com.donaldy.jvm.constant.ClassInfo; -import com.donaldy.jvm.constant.ConstantInfo; -import com.donaldy.jvm.constant.ConstantPool; -import com.donaldy.jvm.constant.FieldRefInfo; -import com.donaldy.jvm.constant.MethodRefInfo; -import com.donaldy.jvm.constant.NameAndTypeInfo; -import com.donaldy.jvm.constant.StringInfo; -import com.donaldy.jvm.constant.UTF8Info; - -public class ConstantPoolPrinter { - ConstantPool pool; - ConstantPoolPrinter(ConstantPool pool){ - this.pool = pool; - } - public void print(){ - - System.out.println("Constant Pool:"); - - ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { - - @Override - public void visitString(StringInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("String #").append(info.getIndex()); - System.out.println(buffer); - - } - - @Override - public void visitNameAndType(NameAndTypeInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("NameAndType #").append(info.getIndex1()).append(":#") - .append(info.getIndex2()); - System.out.println(buffer); - - } - - @Override - public void visitMethodRef(MethodRefInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") - .append(info.getNameAndTypeIndex()); - System.out.println(buffer); - - } - - @Override - public void visitFieldRef(FieldRefInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") - .append(info.getNameAndTypeIndex()); - System.out.println(buffer); - - } - - @Override - public void visitClassInfo(ClassInfo info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("Class #").append(info.getUtf8Index()) - .append(" ").append(info.getClassName()); - - System.out.println(buffer); - - } - - @Override - public void visistUTF8(UTF8Info info) { - StringBuilder buffer = new StringBuilder(); - buffer.append("UTF8 ").append(info.getValue()); - System.out.println(buffer); - - } - }; - - for(int i=1; i<=pool.getSize(); i++){ - ConstantInfo constantInfo = pool.getConstantInfo(i); - System.out.print("#"+i+"="); - constantInfo.accept(visitor); - } - } - /*public void print(){ - - System.out.println("Constant Pool:"); - - for (int i = 0; i <= this.pool.getSize(); ++i) { - ConstantInfo cnstInfo = this.pool.getConstantInfo(i); - - if (cnstInfo instanceof ClassInfo) { - ClassInfo info = (ClassInfo)cnstInfo; - - StringBuilder buffer = new StringBuilder(); - buffer.append("Class #").append(info.getUtf8Index()) - .append(" ").append(info.getClassName()); - - System.out.println(buffer); - } - - if (cnstInfo instanceof UTF8Info) { - - UTF8Info info = (UTF8Info) cnstInfo; - StringBuilder buffer = new StringBuilder(); - buffer.append("UTF8 ").append(info.getValue()); - System.out.println(buffer); - } - - - - *//*int type = constInfo.getType(); - System.out.println("type : " + type); - - if (type == ClassInfo.UTF8_INFO) { - - } else if (type == ClassInfo.FLOAT_INFO) { - - } else if (type == ClassInfo.CLASS_INFO) { - - } else if (type == ClassInfo.STRING_INFO) { - - } else if (type == ClassInfo.FIELD_INFO) { - - } else if (type == ClassInfo.METHOD_INFO) { - - } else if (type == ClassInfo.NAME_AND_TYPE_INFO) { - - }*//* - } - - }*/ -} diff --git a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java index 7c30dedb17..8610fda4c9 100644 --- a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java +++ b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java @@ -2,10 +2,6 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.clz.ClassIndex; -import com.donaldy.jvm.cmd.BiPushCmd; -import com.donaldy.jvm.cmd.ByteCodeCommand; -import com.donaldy.jvm.cmd.OneOperandCmd; -import com.donaldy.jvm.cmd.TwoOperandCmd; import com.donaldy.jvm.constant.*; import com.donaldy.jvm.field.Field; import com.donaldy.jvm.method.Method; @@ -280,88 +276,4 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedCode, code); } - - /** - * 第四次 JVM作业 - */ - - @Test - public void testByteCodeCommand(){ - { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(this.path1); - this.clzFile = loader.loadClass("com.donaldy.jvm.test.EmployeeV1"); - - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand[] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - - } diff --git a/group24/494800949/EmployeeV1-javap.txt b/group24/494800949/EmployeeV1-javap.txt deleted file mode 100644 index 466714a1dd..0000000000 --- a/group24/494800949/EmployeeV1-javap.txt +++ /dev/null @@ -1,164 +0,0 @@ -$ javap -verbose EmployeeV1 -警告: 二进制文件EmployeeV1包含com.coderising.jvm.test.EmployeeV1 -Classfile /H:/sourceCode/coding2017/group24/494800949/EmployeeV1.class - Last modified 2017-4-9; size 1056 bytes - MD5 checksum 8454b8999ccc9a2ae26a405d47558825 - Compiled from "EmployeeV1.java" -public class com.coderising.jvm.test.EmployeeV1 - minor version: 0 - major version: 52 - flags: ACC_PUBLIC, ACC_SUPER -Constant pool: - #1 = Class #2 // com/coderising/jvm/test/EmployeeV1 - #2 = Utf8 com/coderising/jvm/test/EmployeeV1 - #3 = Class #4 // java/lang/Object - #4 = Utf8 java/lang/Object - #5 = Utf8 name - #6 = Utf8 Ljava/lang/String; - #7 = Utf8 age - #8 = Utf8 I - #9 = Utf8 - #10 = Utf8 (Ljava/lang/String;I)V - #11 = Utf8 Code - #12 = Methodref #3.#13 // java/lang/Object."":()V - #13 = NameAndType #9:#14 // "":()V - #14 = Utf8 ()V - #15 = Fieldref #1.#16 // com/coderising/jvm/test/EmployeeV1.name:Ljava/lang/String; - #16 = NameAndType #5:#6 // name:Ljava/lang/String; - #17 = Fieldref #1.#18 // com/coderising/jvm/test/EmployeeV1.age:I - #18 = NameAndType #7:#8 // age:I - #19 = Utf8 LineNumberTable - #20 = Utf8 LocalVariableTable - #21 = Utf8 this - #22 = Utf8 Lcom/coderising/jvm/test/EmployeeV1; - #23 = Utf8 setName - #24 = Utf8 (Ljava/lang/String;)V - #25 = Utf8 setAge - #26 = Utf8 (I)V - #27 = Utf8 sayHello - #28 = Fieldref #29.#31 // java/lang/System.out:Ljava/io/PrintStream; - #29 = Class #30 // java/lang/System - #30 = Utf8 java/lang/System - #31 = NameAndType #32:#33 // out:Ljava/io/PrintStream; - #32 = Utf8 out - #33 = Utf8 Ljava/io/PrintStream; - #34 = String #35 // Hello , this is class Employee - #35 = Utf8 Hello , this is class Employee - #36 = Methodref #37.#39 // java/io/PrintStream.println:(Ljava/lang/String;)V - #37 = Class #38 // java/io/PrintStream - #38 = Utf8 java/io/PrintStream - #39 = NameAndType #40:#24 // println:(Ljava/lang/String;)V - #40 = Utf8 println - #41 = Utf8 main - #42 = Utf8 ([Ljava/lang/String;)V - #43 = String #44 // Andy - #44 = Utf8 Andy - #45 = Methodref #1.#46 // com/coderising/jvm/test/EmployeeV1."":(Ljava/lang/String;I)V - #46 = NameAndType #9:#10 // "":(Ljava/lang/String;I)V - #47 = Methodref #1.#48 // com/coderising/jvm/test/EmployeeV1.sayHello:()V - #48 = NameAndType #27:#14 // sayHello:()V - #49 = Utf8 args - #50 = Utf8 [Ljava/lang/String; - #51 = Utf8 p - #52 = Utf8 SourceFile - #53 = Utf8 EmployeeV1.java -{ - public com.coderising.jvm.test.EmployeeV1(java.lang.String, int); - descriptor: (Ljava/lang/String;I)V - flags: ACC_PUBLIC - Code: - stack=2, locals=3, args_size=3 - 0: aload_0 - 1: invokespecial #12 // Method java/lang/Object."":()V - 4: aload_0 - 5: aload_1 - 6: putfield #15 // Field name:Ljava/lang/String; - 9: aload_0 - 10: iload_2 - 11: putfield #17 // Field age:I - 14: return - LineNumberTable: - line 9: 0 - line 10: 4 - line 11: 9 - line 12: 14 - LocalVariableTable: - Start Length Slot Name Signature - 0 15 0 this Lcom/coderising/jvm/test/EmployeeV1; - 0 15 1 name Ljava/lang/String; - 0 15 2 age I - - public void setName(java.lang.String); - descriptor: (Ljava/lang/String;)V - flags: ACC_PUBLIC - Code: - stack=2, locals=2, args_size=2 - 0: aload_0 - 1: aload_1 - 2: putfield #15 // Field name:Ljava/lang/String; - 5: return - LineNumberTable: - line 15: 0 - line 16: 5 - LocalVariableTable: - Start Length Slot Name Signature - 0 6 0 this Lcom/coderising/jvm/test/EmployeeV1; - 0 6 1 name Ljava/lang/String; - - public void setAge(int); - descriptor: (I)V - flags: ACC_PUBLIC - Code: - stack=2, locals=2, args_size=2 - 0: aload_0 - 1: iload_1 - 2: putfield #17 // Field age:I - 5: return - LineNumberTable: - line 18: 0 - line 19: 5 - LocalVariableTable: - Start Length Slot Name Signature - 0 6 0 this Lcom/coderising/jvm/test/EmployeeV1; - 0 6 1 age I - - public void sayHello(); - descriptor: ()V - flags: ACC_PUBLIC - Code: - stack=2, locals=1, args_size=1 - 0: getstatic #28 // Field java/lang/System.out:Ljava/io/PrintStream; - 3: ldc #34 // String Hello , this is class Employee - 5: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V - 8: return - LineNumberTable: - line 21: 0 - line 22: 8 - LocalVariableTable: - Start Length Slot Name Signature - 0 9 0 this Lcom/coderising/jvm/test/EmployeeV1; - - public static void main(java.lang.String[]); - descriptor: ([Ljava/lang/String;)V - flags: ACC_PUBLIC, ACC_STATIC - Code: - stack=4, locals=2, args_size=1 - 0: new #1 // class com/coderising/jvm/test/EmployeeV1 - 3: dup - 4: ldc #43 // String Andy - 6: bipush 29 - 8: invokespecial #45 // Method "":(Ljava/lang/String;I)V - 11: astore_1 - 12: aload_1 - 13: invokevirtual #47 // Method sayHello:()V - 16: return - LineNumberTable: - line 24: 0 - line 25: 12 - line 27: 16 - LocalVariableTable: - Start Length Slot Name Signature - 0 17 0 args [Ljava/lang/String; - 12 5 1 p Lcom/coderising/jvm/test/EmployeeV1; -} -SourceFile: "EmployeeV1.java" diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 7db7a49c32..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index b1685c4314..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.attr; - - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; -import com.coding.mini_jvm.src.com.coderising.jvm.cmd.CommandParser; -import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; - -public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds; - - public ByteCodeCommand[] getCmds() { - return cmds; - } - - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code ,ByteCodeCommand[] cmds) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - //回退2个字节 - iter.back(ByteCodeIterator.U2); - int attrNameIndex = iter.readTwoBytesToInt(); - int attrLen = iter.readFourBytesToInt(); - int maxStack = iter.readTwoBytesToInt(); - int maxLocal = iter.readTwoBytesToInt(); - int codeLen = iter.readFourBytesToInt(); - String code = iter.readBytesToHexString(codeLen); - ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocal, codeLen, code, cmds); - //异常表长度 - int exceptionTableLen = iter.readTwoBytesToInt(); - if (exceptionTableLen > 0) { - throw new RuntimeException("not impl yet"); - } - - //子属性个数 - int attrCount = iter.readTwoBytesToInt(); - for (int i = 0; i < attrCount; i++) { - attrNameIndex = iter.readTwoBytesToInt(); - String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); - if ("LineNumberTable".equals(attrName)) { - LineNumberTable lineNumberTable = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(lineNumberTable); - } else if ("LocalVariableTable".equals(attrName)) { - LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(localVariableTable); - } else if ("StackMapTable".equals(attrName)) { - StackMapTable stackMapTable = StackMapTable.parse(iter); - codeAttr.setStackMapTable(stackMapTable); - } else { - throw new RuntimeException("not impl yet"); - } - } - - return codeAttr; - } - - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - } - - - - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LineNumberTable.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LineNumberTable.java deleted file mode 100644 index 93e7d9b7a8..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LineNumberTable.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.attr; - -import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; - -import java.util.ArrayList; -import java.util.List; - - -public class LineNumberTable extends AttributeInfo { - List items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - iter.back(ByteCodeIterator.U2); - int attrNameIndex = iter.readTwoBytesToInt(); - int attrLen = iter.readFourBytesToInt(); - LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex, attrLen); - int itemCount = iter.readTwoBytesToInt(); - for (int i = 0; i < itemCount; i++) { - LineNumberItem lineNumberItem = new LineNumberItem(); - lineNumberItem.setStartPC(iter.readTwoBytesToInt()); - lineNumberItem.setLineNum(iter.readTwoBytesToInt()); - lineNumberTable.addLineNumberItem(lineNumberItem); - } - return lineNumberTable; - } - - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 9e9e1d9e21..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 2900349fa5..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.attr; - - -import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; - -import java.util.ArrayList; -import java.util.List; - -public class LocalVariableTable extends AttributeInfo{ - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - iter.back(ByteCodeIterator.U2); - int attrNameIdex = iter.readTwoBytesToInt(); - int attrLen = iter.readFourBytesToInt(); - LocalVariableTable localVariableTable = new LocalVariableTable(attrNameIdex, attrLen); - int varCount = iter.readTwoBytesToInt(); - for (int i = 0; i < varCount; i++) { - LocalVariableItem item = new LocalVariableItem(); - item.setStartPC(iter.readTwoBytesToInt()); - item.setLength(iter.readTwoBytesToInt()); - item.setNameIndex(iter.readTwoBytesToInt()); - item.setDescIndex(iter.readTwoBytesToInt()); - item.setIndex(iter.readTwoBytesToInt()); - localVariableTable.addLocalVariableItem(item); - } - return localVariableTable; - } - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index a6e55353f1..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.attr; - - -import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - iter.back(ByteCodeIterator.U2); - int index = iter.readTwoBytesToInt(); - int len = iter.readFourBytesToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.readBytesToString(len); - t.setOriginalCode(code); - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java index 6c88b9fff5..0d2525e416 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -3,51 +3,28 @@ import com.coding.mini_jvm.src.com.coderising.jvm.constant.ClassInfo; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; -import com.coding.mini_jvm.src.com.coderising.jvm.field.Field; -import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; - -import java.util.ArrayList; -import java.util.List; public class ClassFile { - - private static final String MAIN_METHOD_NAME = "main"; + private int minorVersion; private int majorVersion; - + private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - + + public ClassIndex getClzIndex() { return clzIndex; } - public AccessFlag getAccessFlag() { return accessFlag; } - public void setAccessFlag(AccessFlag accessFlag) { this.accessFlag = accessFlag; } - - public void addField(Field f) { - this.fields.add(f); - } - - public List getFields() { - return this.fields; - } - - public void addMethod(Method m) { - this.methods.add(m); - } - - public List getMethods() { - return methods; - } + + public ConstantPool getConstantPool() { return pool; @@ -72,41 +49,28 @@ 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()); + + } - public String getClassName(){ + private String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - public String getSuperClassName(){ + private String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } - - public Method getMethod(String methodName, String paramAndReturnType){ - for (Method method : methods) { - String name = method.getClzFile().getConstantPool().getUTF8String(method.getNameIndex()); - if (methodName.equals(name)) { - return method; - } - } - - return null; - } - public Method getMainMethod(){ - for (Method method : methods) { - String name = method.getClzFile().getConstantPool().getUTF8String(method.getNameIndex()); - if (MAIN_METHOD_NAME.equals(name)) { - return method; - } - } - return null; - } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java deleted file mode 100644 index eb7dafa79d..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index b44d66c880..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -import java.util.HashMap; -import java.util.Map; - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static { - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java deleted file mode 100644 index dd01d38872..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; - -import java.util.ArrayList; -import java.util.List; -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - CommandIterator cmdIter = new CommandIterator(codes); - List cmds = new ArrayList<>(); - //2ab7000c2a2bb5000f2a1cb50011b1 - while (cmdIter.hasNext()) { - String operCode = cmdIter.next2CharAsString().toUpperCase(); - switch (operCode) { - case bipush: - BiPushCmd cmd = new BiPushCmd(clzFile, operCode); - cmd.setOperand(cmdIter.next2CharAsInt()); - cmds.add(cmd); - break; - case getfield: - GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, operCode); - getFieldCmd.setOprand1(cmdIter.next2CharAsInt()); - getFieldCmd.setOprand2(cmdIter.next2CharAsInt()); - cmds.add(getFieldCmd); - break; - case getstatic: - GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, operCode); - getStaticFieldCmd.setOprand1(cmdIter.next2CharAsInt()); - getStaticFieldCmd.setOprand2(cmdIter.next2CharAsInt()); - cmds.add(getStaticFieldCmd); - break; - case invokespecial: - InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, operCode); - invokeSpecialCmd.setOprand1(cmdIter.next2CharAsInt()); - invokeSpecialCmd.setOprand2(cmdIter.next2CharAsInt()); - cmds.add(invokeSpecialCmd); - break; - case invokevirtual: - InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, operCode); - invokeVirtualCmd.setOprand1(cmdIter.next2CharAsInt()); - invokeVirtualCmd.setOprand2(cmdIter.next2CharAsInt()); - cmds.add(invokeVirtualCmd); - break; - case ldc: - LdcCmd ldcCmd = new LdcCmd(clzFile, operCode); - ldcCmd.setOperand(cmdIter.next2CharAsInt()); - cmds.add(ldcCmd); - break; - case new_object: - NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, operCode); - newObjectCmd.setOprand1(cmdIter.next2CharAsInt()); - newObjectCmd.setOprand2(cmdIter.next2CharAsInt()); - cmds.add(newObjectCmd); - break; - case putfield: - PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, operCode); - putFieldCmd.setOprand1(cmdIter.next2CharAsInt()); - putFieldCmd.setOprand2(cmdIter.next2CharAsInt()); - cmds.add(putFieldCmd); - break; - case astore_1: - case aload_0: - case aload_1: - case iload_1: - case iload_2: - case istore_1: - case voidreturn: - case dup: - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, operCode); - cmds.add(noOperandCmd); - break; - default: - throw new RuntimeException("this oper [ " +operCode+ " ]not impl yet"); - } - } - calcuateOffset(cmds); - return cmds.toArray(new ByteCodeCommand[cmds.size()]); - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 5801068cb0..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e577d1b56c..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index 2900bb2c60..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index ff7f0fdf14..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java deleted file mode 100644 index abaeae3a9e..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index db90b82a35..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 3cd045f6d3..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 696764c3e7..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 6f6ecd0eb1..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 78475ac911..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.cmd; - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java index 489e8c7c7c..227bb010a1 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -15,15 +15,10 @@ public void setUtf8Index(int utf8Index) { public int getType() { return type; } - + public String getClassName() { int index = getUtf8Index(); UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } - - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java index 7a9200f669..e7c849ca59 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -2,6 +2,7 @@ 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; @@ -24,15 +25,5 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index bca8e0b32b..1808a35c65 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -11,7 +11,7 @@ public FieldRefInfo(ConstantPool pool) { public int getType() { return type; } - + public int getClassInfoIndex() { return classInfoIndex; } @@ -51,11 +51,4 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - - - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } - } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index 4664a79cf4..dc62d438e6 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -14,12 +14,7 @@ public MethodRefInfo(ConstantPool pool) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index f1c59a0d5e..b8b9da7353 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -25,13 +25,8 @@ public void setIndex2(int index2) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - } - - + + public String getName(){ ConstantPool pool = this.getConstantPool(); UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index 16ec6a1e2f..bf19f681d8 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,9 +9,5 @@ public NullConstantInfo(){ public int getType() { return -1; } - - @Override - public void accept(Visitor visitor) { - } - + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java index d18ac12305..05a4afad6a 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -10,12 +10,7 @@ public StringInfo(ConstantPool pool) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - } - + public int getIndex() { return index; } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java index 81160db29e..61f20ed8f1 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -16,12 +16,6 @@ public void setLength(int length) { public int getType() { return type; } - - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - } - @Override public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java deleted file mode 100644 index 18bcdb2851..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.field; - - -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; -import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - private ConstantPool pool; - - public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - int accessFlag = iter.readTwoBytesToInt(); - int nameIndex = iter.readTwoBytesToInt(); - int descIndex = iter.readTwoBytesToInt(); - int attributesCount = iter.readTwoBytesToInt(); - if (attributesCount > 0) - throw new RuntimeException("attributeCount of field not impl"); - return new Field(accessFlag, nameIndex, descIndex, pool); - } - - - @Override - public String toString() { - return pool.getUTF8String(nameIndex)+":"+pool.getUTF8String(descriptorIndex); - } -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java index cf2db01a36..27d0c63af0 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -3,10 +3,10 @@ import com.coding.mini_jvm.src.com.coderising.jvm.util.Util; public class ByteCodeIterator { - public static final int U1 = 1; - public static final int U2 = 2; - public static final int U4 = 4; - public static final int U8 = 8; + private static final int U1 = 1; + private static final int U2 = 2; + private static final int U4 = 4; + private static final int U8 = 8; private byte[] bytes; private int cursor; @@ -27,27 +27,12 @@ public String readBytesToString(int len) { } - public String readBytesToHexString(int len) { - byte[] bs = new byte[len]; - System.arraycopy(bytes, cursor, bs, 0, len); - String ret = Util.byteToHexString(bs); - cursor += len; - return ret; - } - - public int readTwoBytesToInt() { int ret = Util.bytes2Int(bytes, cursor, U2); cursor += U2; return ret; } - public int readFourBytesToInt() { - int ret = Util.bytes2Int(bytes, cursor, U4); - cursor += U4; - return ret; - } - public int readByteToInt() { int ret = Util.bytes2Int(bytes, cursor, U1); cursor += U1; @@ -64,12 +49,4 @@ public int skip(int len) { cursor += len; return cursor; } - - public int back(int len) { - if (cursor + len < 0 || cursor + len > bytes.length - 1) { - throw new IndexOutOfBoundsException(); - } - cursor -= len; - return cursor; - } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileParser.java index afe40a2156..542968c809 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -4,8 +4,6 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassIndex; import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; -import com.coding.mini_jvm.src.com.coderising.jvm.field.Field; -import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; public class ClassFileParser { @@ -20,22 +18,11 @@ public ClassFile parse(byte[] codes) { //主版本号 classFile.setMajorVersion(iterator.readTwoBytesToInt()); //解析常量池 - ConstantPool constantPool = parseConstantPool(iterator); - classFile.setConstPool(constantPool); + classFile.setConstPool(parseConstantPool(iterator)); //访问限制符 classFile.setAccessFlag(parseAccessFlag(iterator)); //当前类/父类 classFile.setClassIndex(parseClassIndex(iterator)); - - //接口数量暂时不实现 - int intefaceCount = iterator.readTwoBytesToInt(); - if (intefaceCount > 0) { - throw new RuntimeException(); - } - //解析字段 - parseFields(classFile,iterator, constantPool); - //解析方法 - parseMethod(classFile, iterator, constantPool); return classFile; } @@ -112,19 +99,5 @@ private ConstantPool parseConstantPool(ByteCodeIterator iterator) { return constantPool; } - - private void parseFields(ClassFile classFile, ByteCodeIterator iterator, ConstantPool constantPool) { - int fieldCount = iterator.readTwoBytesToInt(); - for (int i = 0; i < fieldCount; i++) - classFile.addField(Field.parse(constantPool, iterator)); - } - - - private void parseMethod(ClassFile clzFile, ByteCodeIterator iter, ConstantPool pool) { - int methodCount = iter.readTwoBytesToInt(); - for (int i = 0; i < methodCount; i++) { - clzFile.addMethod(Method.parse(clzFile, iter)); - } - } - + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java deleted file mode 100644 index b848e6b515..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.method; - - -import com.coding.mini_jvm.src.com.coderising.jvm.attr.CodeAttr; -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; -import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; - -public class Method { - - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - private CodeAttr codeAttr; - - private ClassFile clzFile; - - public ClassFile getClzFile() { - return clzFile; - } - - public int getNameIndex() { - return nameIndex; - } - - public int getDescriptorIndex() { - return descriptorIndex; - } - - public CodeAttr getCodeAttr() { - return codeAttr; - } - - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } - - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { - this.clzFile = clzFile; - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - } - - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ - int accessFlag = iter.readTwoBytesToInt(); - int nameIndex = iter.readTwoBytesToInt(); - int descIndex = iter.readTwoBytesToInt(); - Method method = new Method(clzFile, accessFlag, nameIndex, descIndex); - int attrCount = iter.readTwoBytesToInt(); - if (attrCount > 1) - throw new RuntimeException("other attrbute not impl yet"); - for (int i = 0; i < attrCount; i++) { - int attrNameIndex = iter.readTwoBytesToInt(); - if ("Code".equals(clzFile.getConstantPool().getUTF8String(attrNameIndex))) { - CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); - method.setCodeAttr(codeAttr); - } else - throw new RuntimeException(" attribute[ " + attrNameIndex + " ] not impl yet"); - } - return method; - } - - public ByteCodeCommand[] getCmds() { - return this.getCodeAttr().getCmds(); - } -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java deleted file mode 100644 index 39553dd48c..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.print; - -import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import com.coding.mini_jvm.src.com.coderising.jvm.loader.ClassFileLoader; - -public class ClassFilePrinter { - ClassFile clzFile = null; - public ClassFilePrinter(ClassFile clzFile){ - this.clzFile = clzFile; - } - - public void print(){ - - if(clzFile.getAccessFlag().isPublicClass()){ - System.out.println("Access flag : public "); - } - System.out.println("Class Name:"+ clzFile.getClassName()); - - System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); - - System.out.println("minor version:" + clzFile.getMinorVersion()); - - System.out.println("major version:" + clzFile.getMinorVersion()); - - ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); - cnstPoolPrinter.print(); - - - - - } - - public static void main(String[] args){ - String path = "H:\\sourceCode\\coding2017\\group24\\494800949"; - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path); - String className = "EmployeeV1"; - - ClassFile clzFile = loader.loadClass(className); - - ClassFilePrinter printer = new ClassFilePrinter(clzFile); - - printer.print(); - } -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java deleted file mode 100644 index baa0e8ead4..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.print; - - -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; -import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; - -import java.util.Formatter; - -public class ConstantPoolPrinter { - ConstantPool pool; - - ConstantPoolPrinter(ConstantPool pool) { - this.pool = pool; - } - - public void print() { - - System.out.println("Constant Pool:"); - - for (int i = 1; i <= (int)pool.getSize(); i++){ - ConstantInfo constantInfo = pool.getConstantInfo(i); - Formatter formatter = new Formatter(System.out); - formatter.format("%5s", "#"+i); - constantInfo.accept(new SimpleVistor()); - } - } - - public static void main(String[] args) { -// Formatter f = new Formatter(System.out); -// f.format("%-15s %-5s %-10s\n", "Item", "Qty", "Price"); -// f.format("%-15s %-5s %-10s\n", "----", "----", "-----"); - - } -} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java deleted file mode 100644 index e10e7885ba..0000000000 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.coding.mini_jvm.src.com.coderising.jvm.print; - -import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; - -import java.util.Formatter; - -/** - * Created by Administrator on 2017/4/23 0023. - */ -public class SimpleVistor implements ConstantInfo.Visitor { - private Formatter formatter = new Formatter(System.out); - private String format = " = %-20s %-20s %-100s\n"; - private static final String HASH_KEY = "#"; - private static final String DOUBLE_SLASH = "// "; - private static final String DOT = "."; - private static final String COLON = ":"; - - @Override - public void visitClassInfo(ClassInfo info) { - formatter.format(format, "Class", - HASH_KEY + info.getUtf8Index(), - DOUBLE_SLASH + info.getClassName()); - } - - @Override - public void visitFieldRef(FieldRefInfo info) { - NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)info.getConstantInfo(info.getNameAndTypeIndex()); - formatter.format(format, "Fieldref", - HASH_KEY + info.getClassInfoIndex() + DOT + HASH_KEY + info.getNameAndTypeIndex(), - DOUBLE_SLASH + info.getClassName() + DOT + nameAndTypeInfo.getName() + COLON + nameAndTypeInfo.getTypeInfo()); - } - - @Override - public void visitMethodRef(MethodRefInfo info) { - formatter.format(format, "Methodref", - HASH_KEY + info.getClassInfoIndex() + DOT + HASH_KEY + info.getNameAndTypeIndex(), - DOUBLE_SLASH + info.getClassName() + DOT + info.getMethodName()); - } - - @Override - public void visitNameAndType(NameAndTypeInfo info) { - formatter.format(format, "NameAndType", - HASH_KEY + info.getIndex1() + COLON + HASH_KEY + info.getIndex2(), - DOUBLE_SLASH + info.getName() + COLON + info.getTypeInfo()); - } - - @Override - public void visitString(StringInfo info) { - formatter.format(format, "String", HASH_KEY + info.getIndex(), DOUBLE_SLASH + info.toString()); - } - - @Override - public void visistUTF8(UTF8Info info) { - formatter.format(format, "Utf8", info.getValue(), ""); - } -} diff --git a/group24/494800949/src/main/java/com/coding/weak1/Stack.java b/group24/494800949/src/main/java/com/coding/weak1/Stack.java index 0eecd9d684..ffa00f99e7 100644 --- a/group24/494800949/src/main/java/com/coding/weak1/Stack.java +++ b/group24/494800949/src/main/java/com/coding/weak1/Stack.java @@ -18,8 +18,6 @@ public Object pop(){ } public Object peek(){ - if (size() == 0) - return null; return elementData.get(elementData.size()-1); } public boolean isEmpty(){ diff --git a/group24/494800949/src/main/java/com/coding/week6/expr/InfixExpr.java b/group24/494800949/src/main/java/com/coding/week6/expr/InfixExpr.java deleted file mode 100644 index 34c1b15123..0000000000 --- a/group24/494800949/src/main/java/com/coding/week6/expr/InfixExpr.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.coding.week6.expr; - -import com.coding.weak1.Stack; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class InfixExpr { - String expr = null; - private Stack numberStack; - private Stack operatorStack; - private List tokens; - public InfixExpr(String expr) { - this.expr = expr; - this.numberStack = new Stack(); - this.operatorStack = new Stack(); - tokens = new ArrayList<>(); - } - - - public float evaluate() { - fillStack(); - while (!operatorStack.isEmpty()) { - char symbol = (char) operatorStack.pop(); - float operTop1 = (float) numberStack.pop(); - float operTop2 = (float) numberStack.pop(); - numberStack.push(caculate(symbol, operTop2, operTop1)); - } - return (float)numberStack.pop(); - } - - public void parseTokens() { - char[] chars = expr.toCharArray(); - for (int i = 0; i < chars.length; i++) { - char c = chars[i]; - if (Token.isOperator(c)) { - Token token = new Token(c+""); - tokens.add(token); - } else { - String t = ""; - while (Token.isDigit(c)){ - t += c; - i++; - if (i == chars.length) - break; - c = chars[i]; - } - Token token = new Token(t); - tokens.add(token); - i--; - } - } - } - - - public void fillStack() { - parseTokens(); - Iterator iterator = tokens.iterator(); - while (iterator.hasNext()) { - Token token = iterator.next(); - if (token.isNumber()) { - numberStack.push((float)token.parseInt()); - continue; - } - if (token.isOperator()) { - char operator = token.parseOperator(); - if (operatorStack.isEmpty()) { - operatorStack.push(operator); - }else { - char topSymbol = (char)operatorStack.peek(); - if (compare(operator, topSymbol) > 0) { - operatorStack.push(operator); - } else { - float operTop1 = (float) numberStack.pop(); - float operTop2 = (float) numberStack.pop(); - numberStack.push(caculate(topSymbol, operTop2, operTop1)); - operatorStack.pop(); - operatorStack.push(operator); - } - } - } - - } - } - - - private float caculate(char symbol, float oper1, float oper2) { - if ('*' == symbol) - return oper1 * oper2; - else if ('/' == symbol) - return oper1 / oper2; - else if ('+' == symbol) - return oper1 + oper2; - else if ('-' == symbol) - return oper1 - oper2; - else - throw new RuntimeException("this operation has not implement"); - } - - public int compare(char opertor1, char opertor2) { - if (!Token.isOperator(opertor1) ) - throw new IllegalArgumentException(opertor1 + "is not supported opertor"); - if (!Token.isOperator(opertor2)) - throw new IllegalArgumentException(opertor2 + "is not supported opertor"); - if (Token.isAddOrSub(opertor1)) { - if (Token.isAddOrSub(opertor2)) - return 0; - else - return -1; - } - else { - if (Token.isAddOrSub(opertor2)) - return 1; - else - return 0; - } - } - - public String printNumberStack() { - return numberStack.toString(); - } - - public String printOperatorStack() { - return operatorStack.toString(); - } -} diff --git a/group24/494800949/src/main/java/com/coding/week6/expr/Token.java b/group24/494800949/src/main/java/com/coding/week6/expr/Token.java deleted file mode 100644 index b58aa36968..0000000000 --- a/group24/494800949/src/main/java/com/coding/week6/expr/Token.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coding.week6.expr; - -/** - * Created by Administrator on 2017/4/16 0016. - */ -public class Token { - - private String symbol; - - public Token(String symbol) { - this.symbol = symbol; - } - - public boolean isNumber() { - return symbol.matches("^\\d+$"); - } - - - public boolean isOperator() { - return symbol.matches("^[\\+|\\*|\\-|\\/]$"); - } - - public int parseInt() { - return Integer.valueOf(symbol); - } - - public char parseOperator() { - return symbol.charAt(0); - } - - - public static boolean isOperator(char c) { - return isAddOrSub(c) || isMulityOrDivide(c); - } - - public static boolean isAddOrSub(char c) { - return c == '+' || c == '-'; - } - - public static boolean isMulityOrDivide(char c) { - return c == '/' || c == '*'; - } - - public static boolean isDigit(char c) { - return c >= '0' && c <= '9'; - } - - @Override - public String toString(){ - return symbol; - } -} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java deleted file mode 100644 index 3962b49fce..0000000000 --- a/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.week6.exprNew; - -import com.coding.weak1.Stack; - -import java.util.List; - -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - - public float evaluate() { - - Stack operatorStack = new Stack(); - Stack numberStack = new Stack(); - fillStack(numberStack, operatorStack); - while (!operatorStack.isEmpty()) { - Operator symbol = (Operator) operatorStack.pop(); - float operTop1 = (float) numberStack.pop(); - float operTop2 = (float) numberStack.pop(); - numberStack.push(symbol.apply(operTop2, operTop1)); - } - return (float)numberStack.pop(); - } - - public void fillStack(Stack numberStack, Stack operatorStack) { - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse(expr); - for (Token token : tokens) { - if (token.isNumber()) { - numberStack.push(token.getFloatValue()); - } - else if (token.isOperator()) { - Operator o = token.getOperator(); - if (operatorStack.isEmpty()) { - operatorStack.push(o); - }else { - Operator top = (Operator)operatorStack.peek(); - if (o.hasHigherPriority(top)) { - operatorStack.push(o); - } else { - float operTop1 = (float) numberStack.pop(); - float operTop2 = (float) numberStack.pop(); - numberStack.push(top.apply(operTop2, operTop1)); - operatorStack.pop(); - operatorStack.push(o); - } - } - } - - } - } - -} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java deleted file mode 100644 index f6b4681e46..0000000000 --- a/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coding.week6.exprNew; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by Administrator on 2017/4/22 0022. - */ -public enum Operator { - ADD("+", 1) { - public float apply(float x, float y){ - return x + y; - } - }, - - SUB("-", 1) { - @Override - public float apply(float x, float y) { - return x - y; - } - }, - - MULT("*", 2) { - @Override - public float apply(float x, float y) { - return x * y; - } - }, - - DIVI("/", 2) { - @Override - public float apply(float x, float y) { - return x / y; - } - }; - private String symbol; - private int priority; - - Operator(String symbol, int priority) { - this.symbol = symbol; - this.priority = priority; - } - - public boolean hasHigherPriority(Operator o) { - return this.priority > o.priority; - } - - public String symbol() { - return symbol; - } - - public static List symbols() { - List symbos = new ArrayList<>(); - for (Operator o : Operator.values()) { - symbos.add(o.symbol); - } - return symbos; - } - - public abstract float apply(float x, float y); - - private static final Map map = new HashMap(); - - static { - for (Operator o : Operator.values()) { - map.put(o.symbol, o); - } - } - - public static Map getOperatorMap() { - return map; - } -} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java deleted file mode 100644 index c925a22705..0000000000 --- a/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.coding.week6.exprNew; - -/** - * Created by Administrator on 2017/4/22 0022. - */ -public class Token { - - private int type; - private String value; - - static final int NUMBER = 1; - static final int OPERATOR = 2; - static final int LEFT_BRACKET = 3; - static final int RIGHT_BRACKET = 4; - public Token(int type, String value) { - this.type = type; - this.value = value; - } - - - public boolean isNumber(){ - return type == NUMBER; - } - - public boolean isOperator(){ - return type == OPERATOR; - } - - public boolean isLeftBracket() { - return type == LEFT_BRACKET; - } - - public boolean isRightBracket() { - return type == RIGHT_BRACKET; - } - - public float getFloatValue() { - if (isNumber()) - return Integer.valueOf(value); - else - throw new RuntimeException("not a number"); - } - - public String toString() { - return value; - } - - - public Operator getOperator() { - if (isOperator()) { - return Operator.getOperatorMap().get(value); - } else { - throw new RuntimeException("not a operator"); - } - } - - - public String getValue() { - return value; - } - - -} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java deleted file mode 100644 index 52757dc0c7..0000000000 --- a/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coding.week6.exprNew; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Administrator on 2017/4/22 0022. - */ -public class TokenParser { - - private static List operators = Operator.symbols(); - public List parse(String expr) { - List tokens = new ArrayList<>(); - int i = 0; - while (i < expr.length()) { - char c = expr.charAt(i); - Token token; - if (Character.isDigit(c)) { - int nextOperIndex = getNextOperIndex(i, expr); - String n = expr.substring(i, nextOperIndex); - token = new Token(Token.NUMBER, n); - tokens.add(token); - i = nextOperIndex; - } else if (isOperator(c)) { - token = new Token(Token.OPERATOR, c+""); - tokens.add(token); - i++; - } else if (String.valueOf(c).matches("\\s")){ - i++; - } else if (c == '(') { - token = new Token(Token.LEFT_BRACKET, String.valueOf(c)); - tokens.add(token); - i++; - } else if (c == ')') { - token = new Token(Token.RIGHT_BRACKET, String.valueOf(c)); - tokens.add(token); - i++; - } else { - throw new RuntimeException(c +" is not number or support operator"); - } - } - return tokens; - } - - private int getNextOperIndex(int i, String expr) { - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - } - - private boolean isOperator(char c) { - return operators.contains(String.valueOf(c)); - } - - -} diff --git a/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java b/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java deleted file mode 100644 index 6717f571ee..0000000000 --- a/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.coding.week7; - -import com.coding.week6.exprNew.Operator; -import com.coding.week6.exprNew.Token; -import com.coding.week6.exprNew.TokenParser; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -public class InfixToPostfix { - - public static List convert(String expr) { - /** - 1 建立符号栈 - 2 顺序扫描中序表达式 - a) 是数字, 直接输出 - b) 是运算符 - i : “(” 直接入栈 - ii : “)” 将符号栈中的元素依次出栈并输出, 直到 “(“, “(“只出栈, 不输出 - iii: 其他符号, 将符号栈中的元素依次出栈并输出, 直到 遇到比当前符号优先级更低的符号或者”(“。 将当前符号入栈。 - 3 扫描完后, 将栈中剩余符号依次输出 - */ - List targetTokens = new ArrayList<>(); - TokenParser tokenParser = new TokenParser(); - List sourceTokes = tokenParser.parse(expr); - Stack operStack = new Stack(); - for (Token token : sourceTokes) { - if (token.isNumber()) { - targetTokens.add(token); - } else { - //左括号 - if (token.isLeftBracket()) { - operStack.push(token); - //右括号 - } else if (token.isRightBracket()) { - while (!operStack.isEmpty()) { - Token t = operStack.peek(); - if (t.isLeftBracket()) { - operStack.pop(); - break; - } else { - targetTokens.add(operStack.pop()); - } - } - //普通运算符 - } else { - Operator oper = token.getOperator(); - if (!operStack.isEmpty()) { - Token t = operStack.peek(); - while (!t.isLeftBracket() && !oper.hasHigherPriority(t.getOperator()) && !operStack.isEmpty()) { - t = operStack.pop(); - targetTokens.add(t); - } - } - operStack.push(token); - } - } - } - //将栈中操作符全部输出 - while (!operStack.isEmpty()) { - targetTokens.add(operStack.pop()); - } - return targetTokens; - } - - - -} diff --git a/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java b/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java deleted file mode 100644 index 8fb78e6a8d..0000000000 --- a/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coding.week7; - -import com.coding.week6.exprNew.Operator; -import com.coding.week6.exprNew.Token; -import com.coding.week6.exprNew.TokenParser; - -import java.util.List; -import java.util.Stack; - -public class PostfixExpr { - String expr = null; - final Stack numStack; - final Stack operStack; - - public PostfixExpr(String expr) { - this.expr = expr; - this.numStack = new Stack<>(); - this.operStack = new Stack<>(); - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - for (Token token : tokens) { - if (token.isNumber()) { - numStack.push(token.getFloatValue()); - } else if (token.isOperator()) { - if (numStack.size() >= 2) { - Float num1 = numStack.pop(); - Float num2 = numStack.pop(); - Float result = token.getOperator().apply(num2, num1); - numStack.push(result); - } - } - } - return numStack.pop(); - } - -} diff --git a/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java b/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java deleted file mode 100644 index 1bb8e4fd8a..0000000000 --- a/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coding.week7; - -import com.coding.week6.exprNew.Operator; -import com.coding.week6.exprNew.Token; -import com.coding.week6.exprNew.TokenParser; - -import java.util.Collections; -import java.util.List; -import java.util.Stack; - -public class PrefixExpr { - String expr = null; - final Stack numStack; - final Stack operStack; - - public PrefixExpr(String expr) { - this.expr = expr; - numStack = new Stack<>(); - operStack = new Stack<>(); - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - parser.parse(expr); - List tokens = parser.parse(expr); - Collections.reverse(tokens); - for (Token token : tokens) { - if (token.isNumber()) { - numStack.push(token.getFloatValue()); - } else if (token.isOperator()) { - if (numStack.size() >= 2) { - Float num1 = numStack.pop(); - Float num2 = numStack.pop(); - Float result = token.getOperator().apply(num1, num2); - numStack.push(result); - } - } - } - return numStack.pop(); - } - - -} diff --git a/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java b/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java index b9561f243b..a03f29c0c3 100644 --- a/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java +++ b/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java @@ -2,27 +2,23 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassIndex; -import com.coding.mini_jvm.src.com.coderising.jvm.cmd.BiPushCmd; -import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; -import com.coding.mini_jvm.src.com.coderising.jvm.cmd.OneOperandCmd; -import com.coding.mini_jvm.src.com.coderising.jvm.cmd.TwoOperandCmd; import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; -import com.coding.mini_jvm.src.com.coderising.jvm.field.Field; import com.coding.mini_jvm.src.com.coderising.jvm.loader.ClassFileLoader; -import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; import com.coding.mini_jvm.src.com.coderising.jvm.util.Util; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import java.util.List; + + + public class ClassFileloaderTest { - static String path1 = "H:\\sourceCode\\coding2017\\group24\\494800949"; + static String path1 = "H:\\sourceCode\\coding2017\\group24\\494800949\\build\\classes\\test"; static String path2 = "C:\temp"; private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; @@ -31,7 +27,7 @@ public class ClassFileloaderTest { static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "EmployeeV1"; + String className = "com.coding.mini_jvm.test.EmployeeV1"; clzFile = loader.loadClass(className); // clzFile.print(); @@ -174,153 +170,4 @@ public void testClassIndex(){ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } - - - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - /***************************第四次jvm测试用例 **************************/ - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand[] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } } diff --git a/group24/494800949/src/test/java/com/coding/week6/expr/InfixExprTestTest.java b/group24/494800949/src/test/java/com/coding/week6/expr/InfixExprTestTest.java deleted file mode 100644 index 7ef4b9ccfa..0000000000 --- a/group24/494800949/src/test/java/com/coding/week6/expr/InfixExprTestTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.coding.week6.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Administrator on 2017/4/16 0016. - */ -public class InfixExprTestTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - - - @Test - public void testFillStack() { - InfixExpr expr = new InfixExpr("10-30+50"); - expr.fillStack(); - Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); - Assert.assertEquals(expr.printOperatorStack(), "+"); - expr = new InfixExpr("3*20+12*5-40/2"); - expr.fillStack(); - Assert.assertEquals(expr.printNumberStack(), "2.0,40.0,60.0,60.0"); - Assert.assertEquals(expr.printOperatorStack(), "/,-,+"); - expr = new InfixExpr("3*20/2"); - expr.fillStack(); - Assert.assertEquals(expr.printNumberStack(), "2.0,60.0"); - Assert.assertEquals(expr.printOperatorStack(), "/"); - expr = new InfixExpr("20/2*3"); - expr.fillStack(); - Assert.assertEquals(expr.printNumberStack(), "3.0,10.0"); - Assert.assertEquals(expr.printOperatorStack(), "*"); - expr = new InfixExpr("10-30+50"); - expr.fillStack(); - Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); - Assert.assertEquals(expr.printOperatorStack(), "+"); - } - - - -} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java b/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java deleted file mode 100644 index 9939878611..0000000000 --- a/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.coding.week6.exprNew; - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Administrator on 2017/4/16 0016. - */ -public class InfixExprTestTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3|"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - - -// @Test -// public void testFillStack() { -// InfixExpr expr = new InfixExpr("10-30+50"); -// expr.fillStack(); -// Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); -// Assert.assertEquals(expr.printOperatorStack(), "+"); -// expr = new InfixExpr("3*20+12*5-40/2"); -// expr.fillStack(); -// Assert.assertEquals(expr.printNumberStack(), "2.0,40.0,60.0,60.0"); -// Assert.assertEquals(expr.printOperatorStack(), "/,-,+"); -// expr = new InfixExpr("3*20/2"); -// expr.fillStack(); -// Assert.assertEquals(expr.printNumberStack(), "2.0,60.0"); -// Assert.assertEquals(expr.printOperatorStack(), "/"); -// expr = new InfixExpr("20/2*3"); -// expr.fillStack(); -// Assert.assertEquals(expr.printNumberStack(), "3.0,10.0"); -// Assert.assertEquals(expr.printOperatorStack(), "*"); -// expr = new InfixExpr("10-30+50"); -// expr.fillStack(); -// Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); -// Assert.assertEquals(expr.printOperatorStack(), "+"); -// } - - - -} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java b/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java deleted file mode 100644 index 1e202ed615..0000000000 --- a/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.coding.week6.exprNew; - -import org.junit.Test; - -import java.util.List; - -/** - * Created by Administrator on 2017/4/22 0022. - */ -public class TokenParserTest { - - @Test - public void testParse() throws Exception { - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse("3* 20+1 2*5-40/2"); - System.out.println(tokens); - } -} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java b/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java deleted file mode 100644 index 54a59316d6..0000000000 --- a/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.week7; - -import com.coding.week6.exprNew.Token; -import org.junit.Assert; -import org.junit.Test; - -import java.util.List; - -/** - * Created by Administrator on 2017/4/23 0023. - */ -public class InfixToPostfixTest { - - @Test - public void testConvert() throws Exception { - { - String expr = "9+(3-1)*3+10/2";//"9 3 1-3*+ 10 2/+" - List tokens = InfixToPostfix.convert(expr); - System.out.println(tokens); - Assert.assertEquals("9", tokens.get(0).toString()); - Assert.assertEquals("3", tokens.get(1).toString()); - Assert.assertEquals("1", tokens.get(2).toString()); - Assert.assertEquals("-", tokens.get(3).toString()); - Assert.assertEquals("3", tokens.get(4).toString()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals("+", tokens.get(6).toString()); - Assert.assertEquals("10", tokens.get(7).toString()); - Assert.assertEquals("2", tokens.get(8).toString()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals("+", tokens.get(10).toString()); - } - - } -} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java b/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java deleted file mode 100644 index bde078a97e..0000000000 --- a/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.week7; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java b/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java deleted file mode 100644 index bb2061303e..0000000000 --- a/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.week7; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java deleted file mode 100644 index 8ae862da33..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java +++ /dev/null @@ -1,115 +0,0 @@ -package basic.dataStructure; - -/** - * Created by macvi on 2017/4/2. - */ -public class ArrayList implements List { - private int size = 10; - //每次扩容的长度,默认为10 - private int extendSize = 10; - - private Object[] data = new Object[size]; - - public ArrayList(Object o) { - this.add(o); - } - - public ArrayList(){} - - public void add(Object o) { - if (this.size() == this.size) { - this.size += extendSize; - Object[] newData = new Object[this.size]; - System.arraycopy(this.data, 0, newData, 0, this.data.length); - this.data = newData; - } - - for (int i = 0; i < this.data.length; i++) { - if (data[i] == null) { - data[i] = o; - break; - } else continue; - } - } - - public void add(int index, Object o) { - if (index > this.size() || index < 0) { - throw new IndexOutOfBoundsException(); - } - - if(this.size() == this.size){ - this.size += extendSize; - } - - Object[] newData = new Object[this.size]; - - System.arraycopy(this.data, 0, newData, 0, index); - newData[index] = o; - System.arraycopy(this.data, index, newData, index + 1, this.size() - index); - - this.data = newData; - } - - public Object get(int index) { - if(index > this.size() || index < 0){ - throw new IndexOutOfBoundsException(); - } - for(int i = 0; i < this.size(); i ++){ - if(index == i){ - return this.data[i]; - } - } - - return null; - } - - public Object remove(int index) { - if(index > this.size() || index < 0){ - throw new IndexOutOfBoundsException(); - } - - Object[] newData = new Object[this.size]; - Object removed = this.get(index); - - System.arraycopy(this.data, 0, newData, 0, index); - System.arraycopy(this.data, index + 1, newData, index, this.size() - index); - this.data = newData; - return removed; - } - - public int size() { - int size = 0; - for(Object obj : this.data){ - if(obj != null){ - size += 1; - } - } - - return size; - } - - public boolean contains(Object obj){ - for(int i = 0; i < this.size(); i++){ - if(obj == this.get(i)){ - return true; - } - } - - return false; - } - - @Override - public String toString() { - StringBuffer sb = new StringBuffer(); - for(Object obj : data){ - if(obj != null){ - sb.append(obj.toString()).append(","); - }else { -// sb.append("null,"); - continue; - } - } - - return sb.toString(); - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayUtil.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayUtil.java deleted file mode 100644 index 22bccaaf5b..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayUtil.java +++ /dev/null @@ -1,245 +0,0 @@ -package basic.dataStructure; - -/** - * @author : 温友朝 - * @date : 2017/4/5 - */ -public class ArrayUtil { - /** - * 给定一个整形数组a , 对该数组的值进行置换 - * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * - * @param origin - * @return - */ - public void reverseArray(int[] origin) { - int length = origin.length; - int[] reversed = new int[length]; - for (int i = length - 1; i >= 0; i--) { - reversed[length - i - 1] = origin[i]; - } - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray) { - int length = oldArray.length; - int[] arr = new int[length]; - int index = 0; - for (int i = 0; i < length; i++) { - if (oldArray[i] != 0) { - arr[index] = oldArray[i]; - index++; - } - } - //非0的数据个数 - int[] newArr = new int[index]; - System.arraycopy(arr, 0, newArr, 0, index); - return newArr; - } - - public static Object[] remove(Object[] oldArray, Object value){ - int length = oldArray.length; - Object[] arr = new Object[length]; - int index = 0; - for (int i = 0; i < length; i++) { - if (oldArray[i] != value) { - arr[index] = oldArray[i]; - index++; - } - } - Object[] newArr = new Object[index]; - System.arraycopy(arr, 0, newArr, 0, index); - return newArr; - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2) { - int length1 = array1.length; - int length2 = array2.length; - int[] arr = new int[length1 + length2]; - - System.arraycopy(array1, 0, arr, 0, length1); - System.arraycopy(array2, 0, arr, length1, length2); - - //去重 - for(int i = 0; i < arr.length; i++){ - for(int j = 0; j < arr.length; j++){ - if(i != j && arr[i] == arr[j]){ - arr[j] = 0; - } - } - } - - - int[] data = removeZero(arr); - int length = data.length; - - //排序 - for (int i = 0; i < length; i++) { - for(int j = 0; j < length; j++){ - if(data[i] < data[j]){ - int tmp = data[i]; - data[i] = data[j]; - data[j] = tmp; - } - } - } - return data; - } - - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * - * @param oldArray - * @param size - * @return - */ - public int[] grow(int[] oldArray, int size) { - int[] arr = new int[oldArray.length + size]; - System.arraycopy(oldArray, 0, arr, 0, oldArray.length); - return arr; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) - * @param max - * @return - */ - public int[] fibonacci(int max) { - int[] empty = {}; - int[] arr2 = {1, 1}; - - switch (max){ - case 0 : return empty; - case 1 : return empty; - case 2 : return arr2; - default: { - int[] data = arr2; - int d = data[0] + data[1]; - while (d < max){ - int length = data.length; - d = data[length - 1] + data[length - 2]; - if(d > max){ - return data; - } - int[] temp = new int[data.length + 1]; - System.arraycopy(data, 0, temp, 0, length); - temp[length] = d; - - data = temp; - } - } - } - - return null; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * - * @param max - * @return - */ - public int[] getPrimes(int max) { - int[] data = new int[max]; - int index = 0; - for(int i = 1; i < max; i++){ - int divided = 0; - for(int j = i; j >= 1; j--){ - if(i % j == 0){ - divided++; - } - if(divided > 2){ - break; - }else if(j == 1 && divided == 2){ - data[index] = i; - index ++; - } - } - } - - int[] result = new int[index]; - System.arraycopy(data, 0, result, 0, index); - return result; - - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) { - int[] perfd = new int[max]; - int perfIndex = 0; - for(int i = 1; i <= max; i++){ - int index = 0; - int[] data = new int[i]; - for(int j = i - 1; j >= 1; j--){ - if(i % j == 0){ - data[index] = j; - index ++; - } - - if(j == 1 && getSum(data) == i){ - perfd[perfIndex] = i; - perfIndex++; - } - } - } - - return removeZero(perfd); - } - - private int getSum(int[] arr){ - int sum = 0; - for(int i : arr){ - sum += i; - } - return sum; - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * - * @param array - * @param seperator - * @return - */ - public String join(int[] array, String seperator) { - StringBuffer sb = new StringBuffer(); - for(int i : array){ - sb.append(i).append(seperator); - } - return sb.substring(0, sb.length() - 1).toString(); - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java deleted file mode 100644 index 5050ae3c95..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java +++ /dev/null @@ -1,58 +0,0 @@ -package basic.dataStructure; - -/** - * Created by macvi on 2017/4/4. - */ -public class BinaryTreeNode { - private int data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - private BinaryTreeNode(){} - - public BinaryTreeNode(int data){ - this.data = data; - this.left = null; - this.right = null; - } - - public void setData(int data){ - BinaryTreeNode node = new BinaryTreeNode(data); - if(compareTo(data)){ - if(this.left == null){ - this.left = node; - }else{ - this.left.setData(data); - } - }else{ - if(this.right == null){ - this.right = node; - }else{ - this.right.setData(data); - } - } - } - - public int getData(){ - return data; - } - - private boolean compareTo(int d) { - System.out.println("data=" + this.data + ", d=" + d); - return this.data > d; - } - - private StringBuffer dataStr = new StringBuffer(); - private int index = 0; -// public String toString(BinaryTreeNode node) { -// while (node.left != null || node.right != null){ -// dataStr.append(index + "层,数据=").append(node.data).append("|"); -// if(node.left != null){ -// dataStr.append(node.left.data) -// } -// index ++; -// } -// -// return dataStr.toString(); -// } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java deleted file mode 100644 index 3ac85ad37b..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java +++ /dev/null @@ -1,341 +0,0 @@ -package basic.dataStructure; - -/** - * Created by macvi on 2017/4/3. - */ -public class LinkedList implements List { - private Node head; - - public LinkedList() { - this.head = new Node(); - } - - public void add(Object o) { - if (this.head.data == null) { - this.head = new Node(o, null); - } else { - Node temp = this.head; - while (temp.next != null) { - temp = temp.next; - } - temp.next = new Node(o, null); - } - } - - public void add(int index, Object o) { - if (index > this.size() || index < 0) { - throw new IndexOutOfBoundsException(); - } - - if(index == 0){ - Node newNode = new Node(o, this.head); - this.head = newNode; - return; - } - - if(index == this.size()){ - this.add(o); - return; - } - - Node before = getNode(index - 1); - Node next = getNode(index); - Node newNode = new Node(o, next); - before.next = newNode; - - } - - private Node getNode(int index) { - int i = 0; - Node temp = this.head; - while (temp.data != null) { - if (index == i) { - return temp; - } - - if (temp.next != null) { - temp = temp.next; - } else break; - - i++; - } - - return null; - } - - public Object get(int index) { - if (index > this.size() || index < 0) { - throw new IndexOutOfBoundsException(); - } - - return this.getNode(index).data; - } - - public Object remove(int index) { - if(index > this.size() || index < 0){ - throw new IndexOutOfBoundsException(); - } - - Object removed = get(index); - - Node before = getNode(index - 1); - Node next = getNode(index + 1); - before.next = next; - - return removed; - } - - public int size() { - int size = 0; - Node temp = this.head; - while (temp.data != null) { - size++; - if (temp.next != null) { - temp = temp.next; - } else break; - } - - return size; - } - - public void asList(Object[] array){ - LinkedList list = new LinkedList(); - for(int i = 0; i < array.length; i++){ - list.add(array[i]); - } - - this.head = list.head; - } - - public Object[] toArray(LinkedList list){ - int size = list.size(); - Object[] arr = new Object[size]; - for(int i = 0; i < size; i++){ - arr[i] = list.get(i); - } - - return arr; - } - - public String toString() { - StringBuffer sb = new StringBuffer(); - Node temp = this.head; - while (temp.data != null) { - sb.append(temp.data.toString()).append(","); - if (temp.next != null) { - temp = temp.next; - } else break; - } - - return sb.toString(); - } - - private static class Node { - Object data; - Node next; - - public Node() {} - - public Node(Object obj, Node next) { - this.data = obj; - this.next = next; - } - - } - - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - int size = this.size(); - - if(size == 1){ - return; - } - - Object[] data = new Object[size]; - for(int i = 0; i < size; i++){ - data[i] = this.get(i); - } - - this.head = new Node(); - - for(int i = size - 1; i >= 0; i--){ - this.add(data[i]); - } - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - int size = this.size(); - int index = this.size()/2; - ArrayList al = new ArrayList(); - for(int i = index; i < size; i++){ - al.add(this.get(i)); - } - - this.head = new Node(); - - for(int i = 0; i < al.size(); i++){ - this.add(al.get(i)); - } - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - for(int j = i; j < i + length; j++){ - this.remove(i); - } - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - int size = list.size(); - int[] arr = new int[size]; - for(int i = 0; i < size; i++){ - int index = (Integer) list.get(i); - arr[i] = (Integer) this.get(index); - } - - return arr; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - Object[] arr1 = toArray(this); - Object[] arr2 = toArray(list); - for(int i = 0; i < arr2.length; i++){ - arr1 = ArrayUtil.remove(arr1, arr2[i]); - } - - asList(arr1); - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - int size = this.size(); - ArrayList indexList = new ArrayList(); - ArrayList valueList = new ArrayList(); - for(int i = 0; i < size; i ++){ - int valueI = (Integer)this.get(i); - int index = 0; - for(int j = i + 1; j < size; j++){ - if(valueList.contains(valueI)){ - continue; - } - int valueJ = (Integer) this.get(j); - if(valueJ == valueI){ - index++; - } - - if(index > 0){ - indexList.add(j); - valueList.add(valueJ); - } - } - } - - Object[] arr = new Object[size]; - for(int i = 0; i < size; i++){ - arr[i] = indexList.contains(i) ? false : this.get(i); - } - - ArrayUtil au = new ArrayUtil(); - arr = au.remove(arr, false); - - asList(arr); - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - int size = this.size(); - int[] range = new int[max - min]; - int index = 0; - for(int i = 0; i < size; i++){ - int value = (Integer) this.get(i); - if(value > min && value < max){ - range[index] = value; - index++; - } - } - - Object[] arr = new Object[size]; - for(int i = 0; i < size; i++){ - arr[i] = this.get(i); - } - - for(int i = 0; i < range.length; i++){ - arr = ArrayUtil.remove(arr, range[i]); - } - - asList(arr); - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - //组合成新的链表 - int listSize = list.size(); - for(int i = 0 ; i < listSize; i ++){ - this.add(list.get(i)); - } - - //转化成数组 - int size = this.size(); - int[] arr = new int[size]; - for(int i = 0; i < size; i++){ - arr[i] = (Integer)this.get(i); - } - //排序 - for(int i = 0; i < size - 1; i ++){ - for(int j = 0; j < size - i - 1; j ++){ - if(arr[j] >= arr[j + 1]){ - int temp = arr[j]; - arr[j] = arr[j + 1]; - arr[j + 1] = temp; - } - } - } - - //组装 - LinkedList li = new LinkedList(); - for(int i = 0; i < size; i ++){ - li.add(arr[i]); - } - return li; - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/List.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/List.java deleted file mode 100644 index dc2a62aab3..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/List.java +++ /dev/null @@ -1,12 +0,0 @@ -package basic.dataStructure; - -/** - * Created by macvi on 2017/4/2. - */ -public interface List { - void add(Object o); - void add(int index, Object o); - Object get(int index); - Object remove(int index); - int size(); -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java deleted file mode 100644 index 36ca7e9647..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java +++ /dev/null @@ -1,72 +0,0 @@ -package basic.dataStructure; - -/** - * Created by macvi on 2017/4/4. - */ -public class Queue { - private Object[] data; - - private int size = 10; - - private int extendedSize = 10; - - public Queue(){ - this.data = new Object[size]; - } - - public Queue(Object o){ - this.data = new Object[size]; - data[0] = o; - } - - public void enQueue(Object o){ - //被添加的位置 - int index = this.size(); - if(this.size() == this.size){ - this.size += extendedSize; - Object[] newData = new Object[this.size]; - System.arraycopy(this.data, 0, newData, 0, index); - newData[index] = o; - this.data = newData; - }else{ - this.data[index] = o; - } - } - - public Object deQueue(){ - Object[] newData = new Object[this.size]; - Object d = this.data[0]; - System.arraycopy(this.data, 1, newData, 0, this.size - 1); - this.data = newData; - - return d; - } - - public Object peek(){ - return this.data[0]; - } - - public boolean isEmpty(){ - return peek() == null; - } - - public int size(){ - int size = 0; - for(Object obj : this.data){ - size += obj == null ? 0 : 1; - } - - return size; - } - - @Override - public String toString() { - StringBuffer sb = new StringBuffer(); - for(Object obj : this.data){ - if(obj != null){ - sb.append(obj.toString()).append(","); - }else break; - } - return sb.toString(); - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java deleted file mode 100644 index bea16033fa..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java +++ /dev/null @@ -1,41 +0,0 @@ -package basic.dataStructure; - -/** - * Created by macvi on 2017/4/4. - */ -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - this.elementData.add(o); - } - - public Object pop(){ - int index = elementData.size() - 1; - Object obj = elementData.remove(index); - - return obj; - } - - public Object peek(){ - int index = elementData.size() - 1; - return elementData.get(index); - } - public boolean isEmpty(){ - return peek() == null; - } - public int size(){ - return elementData.size(); - } - - @Override - public String toString() { - StringBuffer sb = new StringBuffer(); - for(int i = this.size() - 1; i >= 0; i--){ - sb.append(elementData.get(i).toString()).append(","); - } - - return sb.toString(); - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/liteStruts/LoginAction.java b/group24/75939388/learning2017/src/main/java/basic/liteStruts/LoginAction.java deleted file mode 100644 index 14b8aba8e2..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/liteStruts/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package basic.liteStruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/liteStruts/ReadXML.java b/group24/75939388/learning2017/src/main/java/basic/liteStruts/ReadXML.java deleted file mode 100644 index 458b247e18..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/liteStruts/ReadXML.java +++ /dev/null @@ -1,28 +0,0 @@ -package basic.liteStruts; - -import org.dom4j.Document; -import org.dom4j.io.SAXReader; - -import java.io.File; - -/** - * @author : 温友朝 - * @date : 2017/4/10 - */ -public class ReadXML { - Document document; - - public ReadXML(String filePath) throws Exception{ - SAXReader reader = new SAXReader(); - document = reader.read(new File(ReadXML.class.getResource("/").getFile()) + filePath); - } - - public String getActionClass(String actionName){ - return document.selectSingleNode("//action[@name='" + actionName + "']").valueOf("@class"); - } - - public String getJspPage(String actionName, String result){ - return document.selectSingleNode("//action[@name='" + actionName + "']") - .selectSingleNode("//result[@name='" + result + "']").getText(); - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/liteStruts/Struts.java b/group24/75939388/learning2017/src/main/java/basic/liteStruts/Struts.java deleted file mode 100644 index 3b28f2bf60..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/liteStruts/Struts.java +++ /dev/null @@ -1,78 +0,0 @@ -package basic.liteStruts; - -import java.lang.reflect.Method; -import java.util.Map; - - -public class Struts { - /** - * 0. 读取配置文件struts.xml - *

- * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - * ("name"="test" , "password"="1234") , - * 那就应该调用 setName和setPassword方法 - *

- * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - *

- * 3. 通过反射找到对象的所有getter方法(例如 getMessage), - * 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - * 放到View对象的parameters - *

- * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - * 放到View对象的jsp字段中。 - */ - public static View runAction(String actionName, Map parameters) { - try{ - //0. 读取配置文件struts.xml - ReadXML read = new ReadXML("/resources/struts.xml"); - //1. 找到对应的class - String className = read.getActionClass(actionName); - Class clz = Class.forName(className); - //得到对象 - Object la = clz.newInstance(); - setNameAndPassword(clz, la, parameters); - //2. 调用execute方法 - String result = invokeExecute(clz, la); - //3. 找到对象的所有getter方法 - getResultMap(clz, la, parameters); - //4. 确定使用哪一个jsp - String viewName = read.getJspPage(actionName, result); - View view = new View(); - view.setJsp(viewName); - view.setParameters(parameters); - return view; - }catch(Exception e){ - e.printStackTrace(); - return null; - } - } - - private static void setNameAndPassword(Class clz, Object la, Map parameters) throws Exception { - Method setName = clz.getDeclaredMethod("setName", String.class); - setName.invoke(la, parameters.get("name")); - - Method setPassword = clz.getDeclaredMethod("setPassword", String.class); - setPassword.invoke(la, parameters.get("password")); - } - - private static String invokeExecute(Class clz, Object la)throws Exception{ - Method execute = clz.getDeclaredMethod("execute", null); - Method getMessage = clz.getDeclaredMethod("getMessage", null); - execute.invoke(la, null); - return getMessage.invoke(la, null).toString(); - } - - private static void getResultMap(Class clz, Object la, Map parameters) throws Exception{ - Method[] methods = clz.getMethods(); - for(Method me : methods){ - if(me.getName().startsWith("get")){ - String info = me.invoke(la, null).toString(); - String method= me.getName(); - String key = method.substring(3, method.length()).toLowerCase(); - parameters.put(key, info); - }else continue; - } - - } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/liteStruts/View.java b/group24/75939388/learning2017/src/main/java/basic/liteStruts/View.java deleted file mode 100644 index 777380b8f9..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/liteStruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package basic.liteStruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java b/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java deleted file mode 100644 index 565983ab06..0000000000 --- a/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java +++ /dev/null @@ -1,7 +0,0 @@ -package miniJVM; - -/** - * Created by macvi on 2017/4/11. - */ -public class Demo { -} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/DownloadThread.java b/group24/75939388/learning2017/src/main/java/thread/download/DownloadThread.java deleted file mode 100644 index 190cae6423..0000000000 --- a/group24/75939388/learning2017/src/main/java/thread/download/DownloadThread.java +++ /dev/null @@ -1,39 +0,0 @@ -package thread.download; - - -import thread.download.api.Connection; - -import java.io.RandomAccessFile; -import java.util.concurrent.CyclicBarrier; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - - String localFile = ""; - - CyclicBarrier barrier; - - public DownloadThread(Connection conn, int startPos, int endPos, String localFileName, CyclicBarrier barrier){ - this.localFile = localFileName; - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - this.barrier = barrier; - } - public void run(){ - try{ - RandomAccessFile file = new RandomAccessFile(localFile, "rw"); - byte[] buffer = this.conn.read(this.startPos, this.endPos); - file.seek(startPos); - file.write(buffer); - file.close(); - this.conn.close(); - barrier.await(); - }catch(Exception e){ - e.printStackTrace(); - } - } -} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/FileDownloader.java b/group24/75939388/learning2017/src/main/java/thread/download/FileDownloader.java deleted file mode 100644 index f50560b8be..0000000000 --- a/group24/75939388/learning2017/src/main/java/thread/download/FileDownloader.java +++ /dev/null @@ -1,106 +0,0 @@ -package thread.download; - -import thread.download.api.Connection; -import thread.download.api.ConnectionManager; -import thread.download.api.DownloadListener; - -import java.io.File; -import java.io.RandomAccessFile; -import java.util.concurrent.CyclicBarrier; - -public class FileDownloader { - - String url; - String fileLocation; - DownloadListener listener; - ConnectionManager cm; - - RandomAccessFile file; - - int length; - - private static final int MAX_THREAD_NUM = 5; - - - public FileDownloader(String _url, String fileLocation) { - this.url = _url; - this.fileLocation = fileLocation; - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - - try { - CyclicBarrier barrier = new CyclicBarrier(MAX_THREAD_NUM, new Runnable() { - public void run() { - listener.notifyFinished(); - } - }); - - conn = cm.open(this.url); - this.length = conn.getContentLength(); - - file = getEmptyFile(); - - int divided = length/MAX_THREAD_NUM; - int[] pos = new int[MAX_THREAD_NUM + 1]; - for(int i = 0; i < MAX_THREAD_NUM; i++){ - pos[i] = i == 0 ? 0 : divided * i; - } - pos[MAX_THREAD_NUM] = length; - - for(int i = 0; i < MAX_THREAD_NUM; i++){ - new DownloadThread(conn, pos[i], pos[i + 1] - 1, this.fileLocation, barrier).start(); - } - - - File file2 = new File(fileLocation); - System.out.println("file.length=" + file2.length()); - } catch (Exception e) { - e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } - } - } - - public RandomAccessFile getEmptyFile(){ - try{ - RandomAccessFile file = new RandomAccessFile(this.fileLocation, "rw"); - byte[] empty = new byte[this.length]; - file.write(empty); - file.close(); - return file; - }catch(Exception e){ - e.printStackTrace(); - } - return null; - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - -} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/api/Connection.java b/group24/75939388/learning2017/src/main/java/thread/download/api/Connection.java deleted file mode 100644 index 08a85b35dd..0000000000 --- a/group24/75939388/learning2017/src/main/java/thread/download/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package thread.download.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos, int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionException.java b/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionException.java deleted file mode 100644 index e8fac91d1e..0000000000 --- a/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionException.java +++ /dev/null @@ -1,8 +0,0 @@ -package thread.download.api; - -public class ConnectionException extends Exception { - - public ConnectionException(String msg){ - super(msg); - } -} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionManager.java b/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionManager.java deleted file mode 100644 index f5f6c2ff70..0000000000 --- a/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package thread.download.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - Connection open(String url) throws ConnectionException; -} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/api/DownloadListener.java b/group24/75939388/learning2017/src/main/java/thread/download/api/DownloadListener.java deleted file mode 100644 index 16393c4dd9..0000000000 --- a/group24/75939388/learning2017/src/main/java/thread/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package thread.download.api; - -public interface DownloadListener { - void notifyFinished(); -} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionImpl.java b/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionImpl.java deleted file mode 100644 index 2e2544ab27..0000000000 --- a/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package thread.download.impl; - -import thread.download.api.Connection; -import thread.download.api.ConnectionException; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.ConnectException; -import java.net.HttpURLConnection; -import java.net.URL; - -public class ConnectionImpl implements Connection { - - private int length = 0; - - private URL url; - - private HttpURLConnection conn; - - private InputStream is; - - private ByteArrayOutputStream baos; - - private ConnectionImpl() {} - - public ConnectionImpl(URL url) { - this.url = url; - try { - this.conn = (HttpURLConnection) url.openConnection(); - this.conn.setRequestMethod("GET"); - this.conn.setReadTimeout(5000); - int responseCode = this.conn.getResponseCode(); - System.out.println("连接状态=" + responseCode); - if (responseCode != 200) { - throw new ConnectionException("连接到" + url.toURI() + "失败"); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public byte[] read(int startPos, int endPos) throws IOException { - try { - //设置读取段落 - this.conn = (HttpURLConnection) url.openConnection(); - this.conn.setRequestMethod("GET"); - this.conn.setReadTimeout(5000); - this.conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); - //获取返回值 - int response = conn.getResponseCode(); - if(response != 200 && response != 206){ - throw new ConnectException("没有连接上" + url.toURI() + ", 状态码为" + response); - } - //开始读取 - int length = endPos - startPos + 1; - this.is = conn.getInputStream(); - byte[] buffer = new byte[1024]; - baos = new ByteArrayOutputStream(length); - while(-1 != is.read(buffer)){ - baos.write(buffer); - } - System.out.println(startPos + "-" + endPos + "文件段读取完成"); - return baos.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } finally { - this.close(); - } - } - - public int getContentLength() { - try { - this.length = this.conn.getContentLength(); - System.out.println("获取的文件长度=" + length); - return this.length; - } catch (Exception e) { - e.printStackTrace(); - return -1; - } - } - - public void close() { - try { - if(is != null){ - is.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionManagerImpl.java b/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionManagerImpl.java deleted file mode 100644 index ede8ccac00..0000000000 --- a/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package thread.download.impl; - -import thread.download.api.Connection; -import thread.download.api.ConnectionException; -import thread.download.api.ConnectionManager; - -import java.net.URL; - -public class ConnectionManagerImpl implements ConnectionManager { - - public Connection open(String url) throws ConnectionException { - Connection conn = null; - try{ - conn = new ConnectionImpl(new URL(url)); - }catch(Exception e){ - e.printStackTrace(); - } - return conn; - } -} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java deleted file mode 100644 index ee8ee6b0d0..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package data_structure; - -import org.junit.Test; -import basic.dataStructure.ArrayList; - -/** - * Created by macvi on 2017/4/2. - */ -public class ArrayListTest { - - @Test - public void TestAdd(){ - ArrayList al = new ArrayList(); - for(int i = 0; i < 32; i++){ - al.add(i + ""); - } - - System.out.println("ArrayList.content-->" + al.toString()); - } - - - @Test - public void testIndexAdd(){ - ArrayList al = new ArrayList(); - for(int i = 0; i < 17; i ++){ - al.add(i + ""); - } - - al.add(3, "xxoo"); - al.add(11, "abcd"); - al.add(0, "efgh"); - al.add(al.size(), "ijkl"); - - System.out.println("al.toString-->" + al.toString()); - System.out.println("size-->" + al.size()); - } - - @Test - public void testGet(){ - ArrayList al = new ArrayList(); - for(int i = 0; i < 18; i ++){ - al.add(i + "zxcd"); - } - - System.out.println("get-->" + al.get(13)); - } - - @Test - public void testRemove(){ - ArrayList al = new ArrayList(); - for(int i = 0; i < 18; i ++){ - al.add(i + ""); - } - System.out.println("size1-->" + al.size()); - System.out.println("al.toString1-->" + al.toString()); - String re = (String)al.remove(12); - System.out.println("remove index=12 :"); - System.out.println("re-->" + re); - System.out.println("size2-->" + al.size()); - System.out.println("al.toString2-->" + al.toString()); - - String re1 = (String)al.remove(1); - System.out.println("remove index=1 :"); - System.out.println("re-->" + re1); - System.out.println("size2-->" + al.size()); - System.out.println("al.toString2-->" + al.toString()); - } - -} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java b/group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java deleted file mode 100644 index 1dc1a6f263..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package data_structure; - -import org.junit.Test; -import basic.dataStructure.ArrayUtil; - -import java.util.Arrays; - -/** - * @author : 温友朝 - * @date : 2017/4/5 - */ -public class ArrayUtilTest { - ArrayUtil au = new ArrayUtil(); - - @Test - public void testReverse(){ - int[] arr = {1, 2, 3, 4, 5}; - this.au.reverseArray(arr); - } - - @Test - public void testTrim(){ - int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; - int[] arr = this.au.removeZero(oldArr); - System.out.println(Arrays.toString(arr)); - } - - @Test - public void testMerge(){ - int[] a1 = {3, 5, 7,8}; - int[] a2 = {4, 5, 6,7}; - - int[] arr = this.au.merge(a1, a2); - System.out.println(Arrays.toString(arr)); - } - - @Test - public void testGrow(){ - int[] arr = {1, 2, 3, 4, 5}; - int[] arr2 = this.au.grow(arr, 4); - System.out.println(Arrays.toString(arr2)); - } - - @Test - public void testFibonacci(){ - int[] arr = this.au.fibonacci(100); - System.out.println(Arrays.toString(arr)); - } - - @Test - public void testPrimes(){ - int[] arr = this.au.getPrimes(100000); - System.out.println(Arrays.toString(arr)); - } - - @Test - public void testPerfectNumbers(){ - int[] arr = this.au.getPerfectNumbers(10000); - System.out.println(Arrays.toString(arr)); - } - - @Test - public void testJoin(){ - int[] arr = this.au.getPerfectNumbers(10000); - System.out.println(this.au.join(arr, "-")); - } -} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java deleted file mode 100644 index df976147e3..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package data_structure; - -import org.junit.Test; -import basic.dataStructure.BinaryTreeNode; - -/** - * @author : 温友朝 - * @date : 2017/4/5 - */ -public class BinaryNodeTreeTest { - -// @Test -// public BinaryTreeNode getTree(){ -// BinaryTreeNode btn = new BinaryTreeNode(5); -// btn.setData(3); -// -// return btn; -// } - - @Test - public void testAdd(){ - BinaryTreeNode btn = new BinaryTreeNode(5); - btn.setData(3); - btn.setData(7); - btn.setData(10); - btn.setData(6); - btn.setData(4); - } -} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java deleted file mode 100644 index c98a305623..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java +++ /dev/null @@ -1,151 +0,0 @@ -package data_structure; - -import basic.dataStructure.LinkedList; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; - -/** - * Created by macvi on 2017/4/3. - */ -public class LinkedListTest { - - LinkedList ll = new LinkedList(); - - @Before - public void init(){ - for(int i = 0; i < 10; i++){ - ll.add(i); - } - } - - @After - public void print(){ - - } - - - @Test - public void testLinkedListAdd(){ - LinkedList ll = new LinkedList(); - ll.add("123"); - ll.add("456"); - ll.add("asdf"); - ll.add("zxcv"); - - - System.out.println("ll.toString-->" + ll); - System.out.println("ll.size--->" + ll.size()); - } - - @Test - public void testLinkedListIndexAdd(){ - System.out.println("12345"); - } - - @Test - public void testGet(){ - LinkedList ll = new LinkedList(); - for(int i = 0; i < 10; i ++){ - ll.add(i + ""); - } - - System.out.println("get-->" + ll.get(9)); - System.out.println("ll.toString-->" + ll.toString() + "\nsize-->" + ll.size()); - } - - @Test - public void testIndexAdd(){ - LinkedList ll = new LinkedList(); - for(int i = 0; i < 5; i ++){ - ll.add(i + ""); - } - - ll.add(5, "xxoo"); - System.out.println("index get-->" + ll.get(0)); - System.out.println("ll.toString2-->" + ll.toString() + "\nsize-->" + ll.size()); - } - - @Test - public void testRemove(){ - LinkedList ll = new LinkedList(); - for(int i = 0; i < 6; i ++){ - ll.add(i + ""); - } - - Object removed = ll.remove(-1); - System.out.println("ll.toString-->" + ll.toString() + "\nsize-->" + ll.size()); - System.out.println("removed-->" + removed.toString()); - } - - @Test - public void testReverse(){ - ll.reverse(); - System.out.println("ll.reverse-->" + ll.toString()); - } - - @Test - public void testRemoveFirstHalf(){ - ll.removeFirstHalf(); - System.out.println("ll.removeFirstHalf-->" + ll.toString()); - } - - @Test - public void testRemoveL(){ - ll.remove(2, 5); - System.out.println("ll.toString-->" + ll.toString()); - } - - @Test - public void testGetElements(){ - LinkedList l2 = new LinkedList(); - l2.add(3); - l2.add(5); - l2.add(9); - l2.add(0); - - int[] arr = ll.getElements(l2); - System.out.println("arr->" + Arrays.toString(arr)); - } - - @Test - public void testRemoveDuplicate(){ - ll.add(1); - ll.add(3); - ll.add(4); - ll.add(10); - ll.add(11); - ll.removeDuplicateValues(); - System.out.println("ll.toString-->" + ll.toString()); - } - - @Test - public void testRemoveRange(){ - ll.removeRange(2, 6); - System.out.println("ll.toString-->" + ll.toString()); - } - - @Test - public void testSubtract(){ - LinkedList list = new LinkedList(); - list.add(1); - list.add(2); - list.add(5); - - ll.subtract(list); - System.out.println("ll.toString-->" + ll); - } - - @Test - public void testIntersection(){ - LinkedList list = new LinkedList(); - list.add(1); - list.add(2); - list.add(5); - - LinkedList list2 = ll.intersection(list); - System.out.println(list2); - } -} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java b/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java deleted file mode 100644 index 3db6d82e49..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package data_structure; - -import org.junit.Assert; -import org.junit.Test; -import basic.dataStructure.Queue; - -/** - * Created by macvi on 2017/4/4. - */ -public class QueueTest { - - private Queue newQueue(){ - Queue q = new Queue(); - for(int i = 0; i < 13; i++){ - q.enQueue(i + ""); - } - - return q; - } - - @Test - public void testEnqueue(){ - Queue q = newQueue(); - q.enQueue(10 + ""); - q.enQueue( "xxoo"); - System.out.println("queue-->" + q.toString()); - } - - @Test - public void testSize(){ - Queue q = newQueue(); - - Assert.assertEquals(13, q.size()); - } - - @Test - public void testDequeue(){ - Queue q = newQueue(); - Object obj = q.deQueue(); - - Assert.assertEquals("0", obj); - } - - @Test - public void testIsEmpty(){ - Queue q = newQueue(); - - Assert.assertEquals(false, q.isEmpty()); - } -} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java b/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java deleted file mode 100644 index b933b8b63e..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package data_structure; - -import org.junit.Assert; -import org.junit.Test; -import basic.dataStructure.Stack; - -/** - * Created by macvi on 2017/4/4. - */ -public class StackTest { - - private Stack getStack(){ - Stack s = new Stack(); - for(int i = 0; i < 14; i ++){ - s.push(i + ""); - } - - return s; - } - - @Test - public void pushTest(){ - Stack s = getStack(); - - System.out.println("stack-->" + s.toString()); - } - - @Test - public void testSize(){ - Stack s = getStack(); - - Assert.assertEquals(14, s.size()); - } - - @Test - public void testPeek(){ - Stack s = getStack(); - - Assert.assertEquals("13", s.peek()); - } - - @Test - public void testPop(){ - Stack s = getStack(); - - Assert.assertEquals("13", s.pop()); - Assert.assertEquals(13, s.size()); - } -} diff --git a/group24/75939388/learning2017/src/test/java/download/FileDownloaderTest.java b/group24/75939388/learning2017/src/test/java/download/FileDownloaderTest.java deleted file mode 100644 index 0dc8536269..0000000000 --- a/group24/75939388/learning2017/src/test/java/download/FileDownloaderTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import thread.download.FileDownloader; -import thread.download.api.ConnectionManager; -import thread.download.api.DownloadListener; -import thread.download.impl.ConnectionManagerImpl; - - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url = "https://www.baidu.com/img/bd_logo1.png"; - String fileLocation = "D:\\Tee\\JavaLearnin\\test.png"; - FileDownloader downloader = new FileDownloader(url, fileLocation); - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - public void notifyFinished() { - downloadFinished = true; - } - - }); - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - } - -} diff --git a/group24/75939388/learning2017/src/test/java/liteStruts/StrutsTest.java b/group24/75939388/learning2017/src/test/java/liteStruts/StrutsTest.java deleted file mode 100644 index 4477c5f51b..0000000000 --- a/group24/75939388/learning2017/src/test/java/liteStruts/StrutsTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package liteStruts; - -import org.junit.Assert; -import org.junit.Test; -import basic.liteStruts.Struts; -import basic.liteStruts.View; - -import java.util.HashMap; -import java.util.Map; - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group24/Homework/1-FirstWeek/ArrayList.java b/group24/Homework/1-FirstWeek/ArrayList.java deleted file mode 100644 index 4576c016af..0000000000 --- a/group24/Homework/1-FirstWeek/ArrayList.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic.array; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group24/Homework/1-FirstWeek/Iterator.java b/group24/Homework/1-FirstWeek/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group24/Homework/1-FirstWeek/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group24/Homework/1-FirstWeek/LinkedList.java b/group24/Homework/1-FirstWeek/LinkedList.java deleted file mode 100644 index f4c7556a2e..0000000000 --- a/group24/Homework/1-FirstWeek/LinkedList.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.coding.basic.linklist; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group24/Homework/1-FirstWeek/Queue.java b/group24/Homework/1-FirstWeek/Queue.java deleted file mode 100644 index c4c4b7325e..0000000000 --- a/group24/Homework/1-FirstWeek/Queue.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.coding.basic.queue; - -import java.util.NoSuchElementException; - -public class Queue { - private Node first; - private Node last; - private int size; - - - private static class Node { - private E item; - private Node next; - } - - - public Queue() { - first = null; - last = null; - size = 0; - } - - - public boolean isEmpty() { - return first == null; - } - - public int size() { - return size; - } - - - - public void enQueue(E data) { - Node oldlast = last; - last = new Node(); - last.item = data; - last.next = null; - if (isEmpty()) { - first = last; - } - else{ - oldlast.next = last; - } - size++; - } - - public E deQueue() { - if (isEmpty()) { - throw new NoSuchElementException("Queue underflow"); - } - E item = first.item; - first = first.next; - size--; - if (isEmpty()) { - last = null; - } - return item; - } - -} diff --git a/group24/Homework/1-FirstWeek/Stack.java b/group24/Homework/1-FirstWeek/Stack.java deleted file mode 100644 index fedb243604..0000000000 --- a/group24/Homework/1-FirstWeek/Stack.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic.stack; - -import com.coding.basic.array.ArrayList; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group24/Homework/2-SecondWeek/litestruts/LoginAction.java b/group24/Homework/2-SecondWeek/litestruts/LoginAction.java deleted file mode 100644 index dcdbe226ed..0000000000 --- a/group24/Homework/2-SecondWeek/litestruts/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.litestruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/group24/Homework/2-SecondWeek/litestruts/Struts.java b/group24/Homework/2-SecondWeek/litestruts/Struts.java deleted file mode 100644 index 85e2e22de3..0000000000 --- a/group24/Homework/2-SecondWeek/litestruts/Struts.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - - - -public class Struts { - - public static View runAction(String actionName, Map parameters) { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - return null; - } - -} diff --git a/group24/Homework/2-SecondWeek/litestruts/StrutsTest.java b/group24/Homework/2-SecondWeek/litestruts/StrutsTest.java deleted file mode 100644 index b8c81faf3c..0000000000 --- a/group24/Homework/2-SecondWeek/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group24/Homework/2-SecondWeek/litestruts/View.java b/group24/Homework/2-SecondWeek/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group24/Homework/2-SecondWeek/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group24/Homework/3-ThirdWeek/LinkedList.java b/group24/Homework/3-ThirdWeek/LinkedList.java deleted file mode 100644 index f4c7556a2e..0000000000 --- a/group24/Homework/3-ThirdWeek/LinkedList.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.coding.basic.linklist; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group24/Homework/3-ThirdWeek/download/DownloadThread.java b/group24/Homework/3-ThirdWeek/download/DownloadThread.java deleted file mode 100644 index 900a3ad358..0000000000 --- a/group24/Homework/3-ThirdWeek/download/DownloadThread.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - - public DownloadThread( Connection conn, int startPos, int endPos){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - public void run(){ - - } -} diff --git a/group24/Homework/3-ThirdWeek/download/FileDownloader.java b/group24/Homework/3-ThirdWeek/download/FileDownloader.java deleted file mode 100644 index c3c8a3f27d..0000000000 --- a/group24/Homework/3-ThirdWeek/download/FileDownloader.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; - - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String _url) { - this.url = _url; - - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - try { - - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - new DownloadThread(conn,0,length-1).start(); - - } catch (ConnectionException e) { - e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } - } - - - - - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - -} diff --git a/group24/Homework/3-ThirdWeek/download/FileDownloaderTest.java b/group24/Homework/3-ThirdWeek/download/FileDownloaderTest.java deleted file mode 100644 index 4ff7f46ae0..0000000000 --- a/group24/Homework/3-ThirdWeek/download/FileDownloaderTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.coderising.download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; -import com.coderising.download.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url = "http://localhost:8080/test.jpg"; - - FileDownloader downloader = new FileDownloader(url); - - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); - - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} diff --git a/group24/Homework/3-ThirdWeek/download/api/Connection.java b/group24/Homework/3-ThirdWeek/download/api/Connection.java deleted file mode 100644 index 0957eaf7f4..0000000000 --- a/group24/Homework/3-ThirdWeek/download/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.download.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group24/Homework/3-ThirdWeek/download/api/ConnectionException.java b/group24/Homework/3-ThirdWeek/download/api/ConnectionException.java deleted file mode 100644 index 1551a80b3d..0000000000 --- a/group24/Homework/3-ThirdWeek/download/api/ConnectionException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public class ConnectionException extends Exception { - -} diff --git a/group24/Homework/3-ThirdWeek/download/api/ConnectionManager.java b/group24/Homework/3-ThirdWeek/download/api/ConnectionManager.java deleted file mode 100644 index ce045393b1..0000000000 --- a/group24/Homework/3-ThirdWeek/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderising.download.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group24/Homework/3-ThirdWeek/download/api/DownloadListener.java b/group24/Homework/3-ThirdWeek/download/api/DownloadListener.java deleted file mode 100644 index bf9807b307..0000000000 --- a/group24/Homework/3-ThirdWeek/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group24/Homework/3-ThirdWeek/download/impl/ConnectionImpl.java b/group24/Homework/3-ThirdWeek/download/impl/ConnectionImpl.java deleted file mode 100644 index 36a9d2ce15..0000000000 --- a/group24/Homework/3-ThirdWeek/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.download.impl; - -import java.io.IOException; - -import com.coderising.download.api.Connection; - -public class ConnectionImpl implements Connection{ - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - - return null; - } - - @Override - public int getContentLength() { - - return 0; - } - - @Override - public void close() { - - - } - -} diff --git a/group24/Homework/3-ThirdWeek/download/impl/ConnectionManagerImpl.java b/group24/Homework/3-ThirdWeek/download/impl/ConnectionManagerImpl.java deleted file mode 100644 index 172371dd55..0000000000 --- a/group24/Homework/3-ThirdWeek/download/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.coderising.download.impl; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; - -public class ConnectionManagerImpl implements ConnectionManager { - - @Override - public Connection open(String url) throws ConnectionException { - - return null; - } - -} diff --git a/group24/Homework/4-FourWeek/LRUPageFrame.java b/group24/Homework/4-FourWeek/LRUPageFrame.java deleted file mode 100644 index 994a241a3d..0000000000 --- a/group24/Homework/4-FourWeek/LRUPageFrame.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.linklist; - - -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) { - - - } - - - 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/group24/Homework/4-FourWeek/LRUPageFrameTest.java b/group24/Homework/4-FourWeek/LRUPageFrameTest.java deleted file mode 100644 index 7fd72fc2b4..0000000000 --- a/group24/Homework/4-FourWeek/LRUPageFrameTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.basic.linklist; - -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/group24/Homework/4-FourWeek/jvm/loader/ClassFileLoader .java b/group24/Homework/4-FourWeek/jvm/loader/ClassFileLoader .java deleted file mode 100644 index 55b4b70974..0000000000 --- a/group24/Homework/4-FourWeek/jvm/loader/ClassFileLoader .java +++ /dev/null @@ -1,25 +0,0 @@ -public class ClassFileLoader { - - private List clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - - return null; - } - - - public void addClassPath(String path) { - - } - - - - public String getClassPath(){ - - } - - - - - -} \ No newline at end of file diff --git a/group24/Homework/4-FourWeek/jvm/test/ClassFileloaderTest.java b/group24/Homework/4-FourWeek/jvm/test/ClassFileloaderTest.java deleted file mode 100644 index 77f1b93eb8..0000000000 --- a/group24/Homework/4-FourWeek/jvm/test/ClassFileloaderTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.coderising.jvm.test; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.loader.ClassFileLoader; - - - - - -public class ClassFileloaderTest { - - - static String path1 = "C:\\workspace\\min-jvm\\bin"; - static String path2 = "C:\temp"; - - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "com.coderising.jvm.test.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - int i=byteCodes.length; - // ע⣺ֽܺJVM汾йϵ Կõൽж - Assert.assertEquals(2048, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i 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/group24/Homework/5-FifthWeek/StackUtilTest.java b/group24/Homework/5-FifthWeek/StackUtilTest.java deleted file mode 100644 index 76f2cb7668..0000000000 --- a/group24/Homework/5-FifthWeek/StackUtilTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coding.basic.stack; - -import java.util.Stack; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -public class StackUtilTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - - @Test - public void testReverse() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); - } - - @Test - public void testRemove() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("[1, 3]", s.toString()); - } - - @Test - public void testGetTop() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } - } - - @Test - public void testIsValidPairs() { - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } - -} diff --git a/group24/Homework/5-FifthWeek/jvm/clz/AccessFlag.java b/group24/Homework/5-FifthWeek/jvm/clz/AccessFlag.java deleted file mode 100644 index 2d93c5cebf..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,23 +0,0 @@ -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/group24/Homework/5-FifthWeek/jvm/clz/ClassFile .java b/group24/Homework/5-FifthWeek/jvm/clz/ClassFile .java deleted file mode 100644 index 0406ec7b46..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/clz/ClassFile .java +++ /dev/null @@ -1,58 +0,0 @@ -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(); - } \ No newline at end of file diff --git a/group24/Homework/5-FifthWeek/jvm/clz/ClassIndex.java b/group24/Homework/5-FifthWeek/jvm/clz/ClassIndex.java deleted file mode 100644 index f1505a5050..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,17 +0,0 @@ -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/group24/Homework/5-FifthWeek/jvm/constant/ClassInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/ClassInfo.java deleted file mode 100644 index c8e65ff493..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } -} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/ConstantInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/ConstantInfo.java deleted file mode 100644 index 88353df2d3..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coderising.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); - } - - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } -} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/ConstantPool.java b/group24/Homework/5-FifthWeek/jvm/constant/ConstantPool.java deleted file mode 100644 index 7130eb3a9f..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.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 int getSize() { - return this.constantInfos.size() -1; - } - - -} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/FieldRefInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 7ae71396ef..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } -} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/MethodRefInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 036e6d9055..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coderising.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - - - -} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/NameAndTypeInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 5cbbba6033..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.coderising.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()+")"; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - - } -} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/NullConstantInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 41e0fd7e7a..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - @Override - public void accept(Visitor visitor) { - - } - -} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/StringInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/StringInfo.java deleted file mode 100644 index 6bfcb47273..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/StringInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } - -} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/UTF8Info.java b/group24/Homework/5-FifthWeek/jvm/constant/UTF8Info.java deleted file mode 100644 index 7db88a939e..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.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; - } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - - } - - - -} diff --git a/group24/Homework/5-FifthWeek/jvm/loader/ByteCodeIterator.java b/group24/Homework/5-FifthWeek/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index b3a25fa8c8..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.Arrays; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - private byte[] codes; - private int pos; - - public ByteCodeIterator(byte[] codes){ - this.codes = codes; - } - - - - -} diff --git a/group24/Homework/5-FifthWeek/jvm/loader/ClassFileLoader.java b/group24/Homework/5-FifthWeek/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 3b8ddb6a17..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.coderising.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.coderising.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; - - - - } - - 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) { - - return null; - } - -} \ No newline at end of file diff --git a/group24/Homework/5-FifthWeek/jvm/loader/ClassFileParser.java b/group24/Homework/5-FifthWeek/jvm/loader/ClassFileParser.java deleted file mode 100644 index a29d9572cd..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/loader/ClassFileParser.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.coderising.jvm.loader; - -import java.io.UnsupportedEncodingException; - -import com.coderising.jvm.clz.AccessFlag; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.NullConstantInfo; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFileParser { - - public ClassFile parse(byte[] codes) { - - - - - return null; - } - - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - - return null; - } - - private ClassIndex parseClassInfex(ByteCodeIterator iter) { - - return null; - - } - - private ConstantPool parseConstantPool(ByteCodeIterator iter) { - return null; - } - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceCount = iter.nextU2ToInt(); - - System.out.println("interfaceCount:" + interfaceCount); - - // TODO : 如果实现了interface, 这里需要解析 - } - - private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { - - - } - - private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { - - - - } - -} diff --git a/group24/Homework/5-FifthWeek/jvm/test/ClassFileloaderTest.java b/group24/Homework/5-FifthWeek/jvm/test/ClassFileloaderTest.java deleted file mode 100644 index 657bf296f6..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/test/ClassFileloaderTest.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.coderising.jvm.test; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.cmd.BiPushCmd; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.OneOperandCmd; -import com.coderising.jvm.cmd.TwoOperandCmd; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.loader.ClassFileLoader; -import com.coderising.jvm.method.Method; - - - - - -public class ClassFileloaderTest { - - - private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path2 = "C:\temp"; - - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - - clzFile = loader.loadClass(className); - - } - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "com.coderising.jvm.test.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - private String byteToHexString(byte[] codes ){ - 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()); - } - -} \ No newline at end of file diff --git a/group24/Homework/5-FifthWeek/jvm/test/EmployeeV1.java b/group24/Homework/5-FifthWeek/jvm/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group24/Homework/5-FifthWeek/jvm/util/Util.java b/group24/Homework/5-FifthWeek/jvm/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group24/Homework/5-FifthWeek/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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 items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; - } - - public String toString(){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Line Number Table:\n"); - for(LineNumberItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("lineNum:"+item.getLineNum()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - - } - - - -} diff --git a/group24/Homework/6-SixWeek/jvm/attr/LocalVariableItem.java b/group24/Homework/6-SixWeek/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 962c3b8bc4..0000000000 --- a/group24/Homework/6-SixWeek/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group24/Homework/6-SixWeek/jvm/attr/LocalVariableTable.java b/group24/Homework/6-SixWeek/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 14db5dca46..0000000000 --- a/group24/Homework/6-SixWeek/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coderising.jvm.attr; - - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo{ - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } -} diff --git a/group24/Homework/6-SixWeek/jvm/attr/StackMapTable.java b/group24/Homework/6-SixWeek/jvm/attr/StackMapTable.java deleted file mode 100644 index 18f2ad0360..0000000000 --- a/group24/Homework/6-SixWeek/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group24/Homework/6-SixWeek/jvm/clz/AccessFlag.java b/group24/Homework/6-SixWeek/jvm/clz/AccessFlag.java deleted file mode 100644 index faae056835..0000000000 --- a/group24/Homework/6-SixWeek/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderising.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/group24/Homework/6-SixWeek/jvm/clz/ClassFile.java b/group24/Homework/6-SixWeek/jvm/clz/ClassFile.java deleted file mode 100644 index 2a8dfb6123..0000000000 --- a/group24/Homework/6-SixWeek/jvm/clz/ClassFile.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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()); - - - } - - public String getClassName(){ - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - - public Method getMethod(String methodName, String paramAndReturnType){ - - - return null; - } - public Method getMainMethod(){ - - return null; - } -} diff --git a/group24/Homework/6-SixWeek/jvm/clz/ClassIndex.java b/group24/Homework/6-SixWeek/jvm/clz/ClassIndex.java deleted file mode 100644 index e424f284b3..0000000000 --- a/group24/Homework/6-SixWeek/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group24/Homework/6-SixWeek/jvm/constant/ClassInfo.java b/group24/Homework/6-SixWeek/jvm/constant/ClassInfo.java deleted file mode 100644 index c8e65ff493..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } -} diff --git a/group24/Homework/6-SixWeek/jvm/constant/ConstantInfo.java b/group24/Homework/6-SixWeek/jvm/constant/ConstantInfo.java deleted file mode 100644 index 88353df2d3..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coderising.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); - } - - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } -} diff --git a/group24/Homework/6-SixWeek/jvm/constant/ConstantPool.java b/group24/Homework/6-SixWeek/jvm/constant/ConstantPool.java deleted file mode 100644 index 7130eb3a9f..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.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 int getSize() { - return this.constantInfos.size() -1; - } - - -} diff --git a/group24/Homework/6-SixWeek/jvm/constant/FieldRefInfo.java b/group24/Homework/6-SixWeek/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 7ae71396ef..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } -} diff --git a/group24/Homework/6-SixWeek/jvm/constant/MethodRefInfo.java b/group24/Homework/6-SixWeek/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 036e6d9055..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coderising.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - - - -} diff --git a/group24/Homework/6-SixWeek/jvm/constant/NameAndTypeInfo.java b/group24/Homework/6-SixWeek/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 5cbbba6033..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.coderising.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()+")"; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - - } -} diff --git a/group24/Homework/6-SixWeek/jvm/constant/NullConstantInfo.java b/group24/Homework/6-SixWeek/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 41e0fd7e7a..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - @Override - public void accept(Visitor visitor) { - - } - -} diff --git a/group24/Homework/6-SixWeek/jvm/constant/StringInfo.java b/group24/Homework/6-SixWeek/jvm/constant/StringInfo.java deleted file mode 100644 index 6bfcb47273..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/StringInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } - -} diff --git a/group24/Homework/6-SixWeek/jvm/constant/UTF8Info.java b/group24/Homework/6-SixWeek/jvm/constant/UTF8Info.java deleted file mode 100644 index 7db88a939e..0000000000 --- a/group24/Homework/6-SixWeek/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.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; - } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - - } - - - -} diff --git a/group24/Homework/6-SixWeek/jvm/field/Field.java b/group24/Homework/6-SixWeek/jvm/field/Field.java deleted file mode 100644 index c6eb0196f8..0000000000 --- a/group24/Homework/6-SixWeek/jvm/field/Field.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public String toString() { - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - return name +":"+ desc; - } - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); - //System.out.println("field attribute count:"+ attribCount); - - Field f = new Field(accessFlag, nameIndex, descIndex,pool); - - if(attribCount > 0){ - throw new RuntimeException("Field Attribute has not been implemented"); - } - - return f; - } - -} diff --git a/group24/Homework/6-SixWeek/jvm/loader/ByteCodeIterator.java b/group24/Homework/6-SixWeek/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 6fb5570dff..0000000000 --- a/group24/Homework/6-SixWeek/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.Arrays; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - byte[] codes; - int pos = 0; - - ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - - - public byte[] getBytes(int len) { - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public int nextU1toInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextU4ToHexString() { - return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } -} diff --git a/group24/Homework/6-SixWeek/jvm/loader/ClassFileLoader.java b/group24/Homework/6-SixWeek/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 33185d8175..0000000000 --- a/group24/Homework/6-SixWeek/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.coderising.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.coderising.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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - - -} diff --git a/group24/Homework/6-SixWeek/jvm/test/EmployeeV1.java b/group24/Homework/6-SixWeek/jvm/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group24/Homework/6-SixWeek/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group24/Homework/6-SixWeek/jvm/util/Util.java b/group24/Homework/6-SixWeek/jvm/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group24/Homework/6-SixWeek/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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 convert(String expr) { - - return null; - } - - - -} diff --git a/group24/Homework/7-SevenWeek/PostfixExpr.java b/group24/Homework/7-SevenWeek/PostfixExpr.java deleted file mode 100644 index dcbb18be4b..0000000000 --- a/group24/Homework/7-SevenWeek/PostfixExpr.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.List; -import java.util.Stack; - -public class PostfixExpr { -String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - return 0.0f; - } - - -} diff --git a/group24/Homework/7-SevenWeek/PostfixExprTest.java b/group24/Homework/7-SevenWeek/PostfixExprTest.java deleted file mode 100644 index c0435a2db5..0000000000 --- a/group24/Homework/7-SevenWeek/PostfixExprTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic.stack.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group24/Homework/7-SevenWeek/README.txt b/group24/Homework/7-SevenWeek/README.txt deleted file mode 100644 index 6adfb7dc34..0000000000 --- a/group24/Homework/7-SevenWeek/README.txt +++ /dev/null @@ -1,4 +0,0 @@ -1. ָֽתΪjava Ҫʵֵࣺ CommandParser.java -2. ʵƵjavap ҪʵֵࣺClassFilePrinter.java -3. ݽṹ ʵǰ׺ʽPrefixExpr.java ׺ʽ PostfixExpr.java -׺ʽת׺ʽ InfixToPostfix.java \ No newline at end of file diff --git a/group24/Homework/7-SevenWeek/jvm/attr/AttributeInfo.java b/group24/Homework/7-SevenWeek/jvm/attr/AttributeInfo.java deleted file mode 100644 index 88f60c77f6..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/attr/CodeAttr.java b/group24/Homework/7-SevenWeek/jvm/attr/CodeAttr.java deleted file mode 100644 index c4c0c4c6c5..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.CommandParser; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - return null; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - for(int i=0;i items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; - } - - public String toString(){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Line Number Table:\n"); - for(LineNumberItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("lineNum:"+item.getLineNum()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - - } - - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableItem.java b/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 962c3b8bc4..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableTable.java b/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 14db5dca46..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coderising.jvm.attr; - - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo{ - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/attr/StackMapTable.java b/group24/Homework/7-SevenWeek/jvm/attr/StackMapTable.java deleted file mode 100644 index 18f2ad0360..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/clz/AccessFlag.java b/group24/Homework/7-SevenWeek/jvm/clz/AccessFlag.java deleted file mode 100644 index faae056835..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderising.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/group24/Homework/7-SevenWeek/jvm/clz/ClassFile.java b/group24/Homework/7-SevenWeek/jvm/clz/ClassFile.java deleted file mode 100644 index 2a8dfb6123..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/clz/ClassFile.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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()); - - - } - - public String getClassName(){ - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - - public Method getMethod(String methodName, String paramAndReturnType){ - - - return null; - } - public Method getMainMethod(){ - - return null; - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/clz/ClassIndex.java b/group24/Homework/7-SevenWeek/jvm/clz/ClassIndex.java deleted file mode 100644 index e424f284b3..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group24/Homework/7-SevenWeek/jvm/cmd/BiPushCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/BiPushCmd.java deleted file mode 100644 index cd0fbd4848..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/ByteCodeCommand.java b/group24/Homework/7-SevenWeek/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index a3abeacc82..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/CommandParser.java b/group24/Homework/7-SevenWeek/jvm/cmd/CommandParser.java deleted file mode 100644 index 2bb36340f5..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - - return null; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/GetFieldCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 2e6061edd2..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/GetStaticFieldCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e6cf9d5960..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index ac228d0e4d..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index c15d827797..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/LdcCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/LdcCmd.java deleted file mode 100644 index ffb66f811c..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/NewObjectCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 33813b5d59..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/NoOperandCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 56c28fefe2..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/OneOperandCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 963d064257..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/PutFieldCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 85bb369c19..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/TwoOperandCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 6c0cf53082..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/ClassInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/ClassInfo.java deleted file mode 100644 index c8e65ff493..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/ConstantInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/ConstantInfo.java deleted file mode 100644 index 88353df2d3..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coderising.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); - } - - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/ConstantPool.java b/group24/Homework/7-SevenWeek/jvm/constant/ConstantPool.java deleted file mode 100644 index 7130eb3a9f..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.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 int getSize() { - return this.constantInfos.size() -1; - } - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/FieldRefInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 7ae71396ef..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/MethodRefInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 036e6d9055..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coderising.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/NameAndTypeInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 5cbbba6033..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.coderising.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()+")"; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/NullConstantInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 41e0fd7e7a..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - @Override - public void accept(Visitor visitor) { - - } - -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/StringInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/StringInfo.java deleted file mode 100644 index 6bfcb47273..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/StringInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } - -} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/UTF8Info.java b/group24/Homework/7-SevenWeek/jvm/constant/UTF8Info.java deleted file mode 100644 index 7db88a939e..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.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; - } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - - } - - - -} diff --git a/group24/Homework/7-SevenWeek/jvm/field/Field.java b/group24/Homework/7-SevenWeek/jvm/field/Field.java deleted file mode 100644 index c6eb0196f8..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/field/Field.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public String toString() { - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - return name +":"+ desc; - } - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); - //System.out.println("field attribute count:"+ attribCount); - - Field f = new Field(accessFlag, nameIndex, descIndex,pool); - - if(attribCount > 0){ - throw new RuntimeException("Field Attribute has not been implemented"); - } - - return f; - } - -} diff --git a/group24/Homework/7-SevenWeek/jvm/loader/ByteCodeIterator.java b/group24/Homework/7-SevenWeek/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 6fb5570dff..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.Arrays; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - byte[] codes; - int pos = 0; - - ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - - - public byte[] getBytes(int len) { - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public int nextU1toInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextU4ToHexString() { - return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } -} diff --git a/group24/Homework/7-SevenWeek/jvm/loader/ClassFileLoader.java b/group24/Homework/7-SevenWeek/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 33185d8175..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.coderising.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.coderising.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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - -} diff --git a/group24/Homework/7-SevenWeek/jvm/test/EmployeeV1.java b/group24/Homework/7-SevenWeek/jvm/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group24/Homework/7-SevenWeek/jvm/util/Util.java b/group24/Homework/7-SevenWeek/jvm/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group24/Homework/7-SevenWeek/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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 items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; - } - - public String toString(){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Line Number Table:\n"); - for(LineNumberItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("lineNum:"+item.getLineNum()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - - } - - - -} diff --git a/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java b/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java deleted file mode 100644 index 962c3b8bc4..0000000000 --- a/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java b/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java deleted file mode 100644 index 14db5dca46..0000000000 --- a/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coderising.jvm.attr; - - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo{ - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } -} diff --git a/group24/Homework/8-EighthWeek/attr/StackMapTable.java b/group24/Homework/8-EighthWeek/attr/StackMapTable.java deleted file mode 100644 index 18f2ad0360..0000000000 --- a/group24/Homework/8-EighthWeek/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group24/Homework/8-EighthWeek/clz/AccessFlag.java b/group24/Homework/8-EighthWeek/clz/AccessFlag.java deleted file mode 100644 index faae056835..0000000000 --- a/group24/Homework/8-EighthWeek/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderising.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/group24/Homework/8-EighthWeek/clz/ClassFile.java b/group24/Homework/8-EighthWeek/clz/ClassFile.java deleted file mode 100644 index 2a8dfb6123..0000000000 --- a/group24/Homework/8-EighthWeek/clz/ClassFile.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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()); - - - } - - public String getClassName(){ - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - - public Method getMethod(String methodName, String paramAndReturnType){ - - - return null; - } - public Method getMainMethod(){ - - return null; - } -} diff --git a/group24/Homework/8-EighthWeek/clz/ClassIndex.java b/group24/Homework/8-EighthWeek/clz/ClassIndex.java deleted file mode 100644 index e424f284b3..0000000000 --- a/group24/Homework/8-EighthWeek/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java b/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java deleted file mode 100644 index 1f60641d2d..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - - - -} diff --git a/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java b/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java deleted file mode 100644 index e48d4e38f7..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - public abstract void execute(StackFrame frame,ExecutionResult result); -} diff --git a/group24/Homework/8-EighthWeek/cmd/CommandParser.java b/group24/Homework/8-EighthWeek/cmd/CommandParser.java deleted file mode 100644 index 2bb36340f5..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/CommandParser.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - - return null; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java deleted file mode 100644 index c771d535f7..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - - - - -} diff --git a/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e6876c36bb..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java b/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java deleted file mode 100644 index 8d60e72341..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - - - -} diff --git a/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java b/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java deleted file mode 100644 index a1f2d1a1c6..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - } - - - - -} diff --git a/group24/Homework/8-EighthWeek/cmd/LdcCmd.java b/group24/Homework/8-EighthWeek/cmd/LdcCmd.java deleted file mode 100644 index 1669aa3900..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/LdcCmd.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java b/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java deleted file mode 100644 index caa2609928..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - - -} diff --git a/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java deleted file mode 100644 index c3cda9b52e..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - -} diff --git a/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java deleted file mode 100644 index 963d064257..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java deleted file mode 100644 index dc31cf084d..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.engine.ExecutionResult; -import com.coderising.jvm.engine.StackFrame; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } - - -} diff --git a/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java deleted file mode 100644 index 6c0cf53082..0000000000 --- a/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group24/Homework/8-EighthWeek/constant/ClassInfo.java b/group24/Homework/8-EighthWeek/constant/ClassInfo.java deleted file mode 100644 index c8e65ff493..0000000000 --- a/group24/Homework/8-EighthWeek/constant/ClassInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } -} diff --git a/group24/Homework/8-EighthWeek/constant/ConstantInfo.java b/group24/Homework/8-EighthWeek/constant/ConstantInfo.java deleted file mode 100644 index 88353df2d3..0000000000 --- a/group24/Homework/8-EighthWeek/constant/ConstantInfo.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coderising.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); - } - - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } -} diff --git a/group24/Homework/8-EighthWeek/constant/ConstantPool.java b/group24/Homework/8-EighthWeek/constant/ConstantPool.java deleted file mode 100644 index 7130eb3a9f..0000000000 --- a/group24/Homework/8-EighthWeek/constant/ConstantPool.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.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 int getSize() { - return this.constantInfos.size() -1; - } - - -} diff --git a/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java b/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java deleted file mode 100644 index 7ae71396ef..0000000000 --- a/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } -} diff --git a/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java b/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java deleted file mode 100644 index 036e6d9055..0000000000 --- a/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coderising.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - - - -} diff --git a/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java b/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java deleted file mode 100644 index 5cbbba6033..0000000000 --- a/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.coderising.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()+")"; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - - } -} diff --git a/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java b/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java deleted file mode 100644 index 41e0fd7e7a..0000000000 --- a/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - @Override - public void accept(Visitor visitor) { - - } - -} diff --git a/group24/Homework/8-EighthWeek/constant/StringInfo.java b/group24/Homework/8-EighthWeek/constant/StringInfo.java deleted file mode 100644 index 6bfcb47273..0000000000 --- a/group24/Homework/8-EighthWeek/constant/StringInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } - -} diff --git a/group24/Homework/8-EighthWeek/constant/UTF8Info.java b/group24/Homework/8-EighthWeek/constant/UTF8Info.java deleted file mode 100644 index 7db88a939e..0000000000 --- a/group24/Homework/8-EighthWeek/constant/UTF8Info.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.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; - } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - - } - - - -} diff --git a/group24/Homework/8-EighthWeek/engine/ExecutionResult.java b/group24/Homework/8-EighthWeek/engine/ExecutionResult.java deleted file mode 100644 index 8f6c51e52a..0000000000 --- a/group24/Homework/8-EighthWeek/engine/ExecutionResult.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.coderising.jvm.engine; - -import com.coderising.jvm.method.Method; - -public class ExecutionResult { - public static final int RUN_NEXT_CMD = 1; - public static final int JUMP = 2; - public static final int EXIT_CURRENT_FRAME = 3; - public static final int PAUSE_AND_RUN_NEW_FRAME = 4; - - private int nextAction = RUN_NEXT_CMD; - - private int nextCmdOffset = 0; - - private Method nextMethod; - - public Method getNextMethod() { - return nextMethod; - } - public void setNextMethod(Method nextMethod) { - this.nextMethod = nextMethod; - } - - - - public void setNextAction(int action){ - this.nextAction = action; - } - public boolean isPauseAndRunNewFrame(){ - return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; - } - public boolean isExitCurrentFrame(){ - return this.nextAction == EXIT_CURRENT_FRAME; - } - - public boolean isRunNextCmd(){ - return this.nextAction == RUN_NEXT_CMD; - } - - public boolean isJump(){ - return this.nextAction == JUMP; - } - - public int getNextCmdOffset() { - return nextCmdOffset; - } - - public void setNextCmdOffset(int nextCmdOffset) { - this.nextCmdOffset = nextCmdOffset; - } - - - - - -} diff --git a/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java b/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java deleted file mode 100644 index 5d6b582879..0000000000 --- a/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coderising.jvm.engine; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -import com.coderising.jvm.attr.CodeAttr; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.method.Method; - -public class ExecutorEngine { - - private Stack stack = new Stack(); - - public ExecutorEngine() { - - } - - public void execute(Method mainMethod){ - - - - } - - - - private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { - - - - } - -} diff --git a/group24/Homework/8-EighthWeek/engine/Heap.java b/group24/Homework/8-EighthWeek/engine/Heap.java deleted file mode 100644 index 82ad210cef..0000000000 --- a/group24/Homework/8-EighthWeek/engine/Heap.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.engine; - -public class Heap { - - /** - * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 - */ - - private static Heap instance = new Heap(); - private Heap() { - } - public static Heap getInstance(){ - return instance; - } - public JavaObject newObject(String clzName){ - - JavaObject jo = new JavaObject(JavaObject.OBJECT); - jo.setClassName(clzName); - return jo; - } - - public JavaObject newString(String value){ - JavaObject jo = new JavaObject(JavaObject.STRING); - jo.setStringValue(value); - return jo; - } - - public JavaObject newFloat(float value){ - JavaObject jo = new JavaObject(JavaObject.FLOAT); - jo.setFloatValue(value); - return jo; - } - public JavaObject newInt(int value){ - JavaObject jo = new JavaObject(JavaObject.INT); - jo.setIntValue(value); - return jo; - } - -} diff --git a/group24/Homework/8-EighthWeek/engine/JavaObject.java b/group24/Homework/8-EighthWeek/engine/JavaObject.java deleted file mode 100644 index 71ba382d9a..0000000000 --- a/group24/Homework/8-EighthWeek/engine/JavaObject.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.coderising.jvm.engine; - -import java.util.HashMap; -import java.util.Map; - -public class JavaObject { - public static final int OBJECT = 1; - public static final int STRING = 2; - public static final int INT = 3; - public static final int FLOAT = 4; - - int type; - private String className; - - private Map fieldValues = new HashMap(); - - private String stringValue; - - private int intValue; - - private float floatValue; - - public void setFieldValue(String fieldName, JavaObject fieldValue){ - fieldValues.put(fieldName, fieldValue); - } - public JavaObject(int type){ - this.type = type; - } - public void setClassName(String className){ - this.className = className; - } - public void setStringValue(String value){ - stringValue = value; - } - public String getStringValue(){ - return this.stringValue; - } - public void setIntValue(int value) { - this.intValue = value; - } - public int getIntValue(){ - return this.intValue; - } - public int getType(){ - return type; - } - public JavaObject getFieldValue(String fieldName){ - return this.fieldValues.get(fieldName); - } - public String toString(){ - switch(this.getType()){ - case INT: - return String.valueOf(this.intValue); - case STRING: - return this.stringValue; - case OBJECT: - return this.className +":"+ this.fieldValues; - case FLOAT : - return String.valueOf(this.floatValue); - default: - return null; - } - } - public String getClassName(){ - return this.className; - } - public void setFloatValue(float value) { - this.floatValue = value; - } - -} diff --git a/group24/Homework/8-EighthWeek/engine/MethodArea.java b/group24/Homework/8-EighthWeek/engine/MethodArea.java deleted file mode 100644 index 781e81acf1..0000000000 --- a/group24/Homework/8-EighthWeek/engine/MethodArea.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.coderising.jvm.engine; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.loader.ClassFileLoader; -import com.coderising.jvm.method.Method; - -public class MethodArea { - - public static final MethodArea instance = new MethodArea(); - - /** - * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 - */ - - private ClassFileLoader clzLoader = null; - - Map map = new HashMap(); - - private MethodArea(){ - } - - public static MethodArea getInstance(){ - return instance; - } - - public void setClassFileLoader(ClassFileLoader clzLoader){ - this.clzLoader = clzLoader; - } - - public Method getMainMethod(String className){ - - ClassFile clzFile = this.findClassFile(className); - - return clzFile.getMainMethod(); - } - - - public ClassFile findClassFile(String className){ - - if(map.get(className) != null){ - return map.get(className); - } - // 看来该class 文件还没有load过 - ClassFile clzFile = this.clzLoader.loadClass(className); - - map.put(className, clzFile); - - return clzFile; - - } - - - public Method getMethod(String className, String methodName, String paramAndReturnType){ - - return null; - } - - - public Method getMethod(MethodRefInfo methodRef){ - - return null; - - } -} diff --git a/group24/Homework/8-EighthWeek/engine/MiniJVM.java b/group24/Homework/8-EighthWeek/engine/MiniJVM.java deleted file mode 100644 index 443524cc5f..0000000000 --- a/group24/Homework/8-EighthWeek/engine/MiniJVM.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.jvm.engine; -import java.io.FileNotFoundException; -import java.io.IOException; - -import com.coderising.jvm.loader.ClassFileLoader; - - -public class MiniJVM { - - public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ - - ClassFileLoader loader = new ClassFileLoader(); - for(int i=0;i localVariableTable = new ArrayList(); - private Stack oprandStack = new Stack(); - - int index = 0; - - private Method m = null; - - private StackFrame callerFrame = null; - - public StackFrame getCallerFrame() { - return callerFrame; - } - - public void setCallerFrame(StackFrame callerFrame) { - this.callerFrame = callerFrame; - } - - - - - public static StackFrame create(Method m){ - - StackFrame frame = new StackFrame( m ); - - return frame; - } - - - private StackFrame(Method m) { - this.m = m; - - } - - - - public JavaObject getLocalVariableValue(int index){ - return this.localVariableTable.get(index); - } - - public Stack getOprandStack(){ - return this.oprandStack; - } - - public int getNextCommandIndex(int offset){ - - ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); - for(int i=0;i values){ - this.localVariableTable = values; - } - - public void setLocalVariableValue(int index, JavaObject jo){ - //问题: 为什么要这么做?? - if(this.localVariableTable.size()-1 < index){ - for(int i=this.localVariableTable.size(); i<=index; i++){ - this.localVariableTable.add(null); - } - } - this.localVariableTable.set(index, jo); - - - } - - public Method getMethod(){ - return m; - } - - -} diff --git a/group24/Homework/8-EighthWeek/field/Field.java b/group24/Homework/8-EighthWeek/field/Field.java deleted file mode 100644 index c6eb0196f8..0000000000 --- a/group24/Homework/8-EighthWeek/field/Field.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public String toString() { - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - return name +":"+ desc; - } - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); - //System.out.println("field attribute count:"+ attribCount); - - Field f = new Field(accessFlag, nameIndex, descIndex,pool); - - if(attribCount > 0){ - throw new RuntimeException("Field Attribute has not been implemented"); - } - - return f; - } - -} diff --git a/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java b/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java deleted file mode 100644 index 6fb5570dff..0000000000 --- a/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.Arrays; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - byte[] codes; - int pos = 0; - - ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - - - public byte[] getBytes(int len) { - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public int nextU1toInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextU4ToHexString() { - return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } -} diff --git a/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java b/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java deleted file mode 100644 index 33185d8175..0000000000 --- a/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.coderising.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.coderising.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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - -} diff --git a/group24/Homework/8-EighthWeek/test/EmployeeV1.java b/group24/Homework/8-EighthWeek/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group24/Homework/8-EighthWeek/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group24/Homework/8-EighthWeek/util/Util.java b/group24/Homework/8-EighthWeek/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group24/Homework/8-EighthWeek/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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 - + - diff --git a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java deleted file mode 100644 index ff94d5e21a..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coding.basic.queue; - -public class CircleQueue { - -} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java deleted file mode 100644 index 9ff4187a53..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coding.basic.queue; - -import java.util.ArrayList; -import java.util.List; - -/** - * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), - * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * - * @author liuxin - * - */ -public class Josephus { - - public static List execute(int n, int m) { - if (n < m || n <= 0 || m <= 0) { - throw new RuntimeException("传入参数有误,执行失败!"); - } - //保存被杀掉的数 - List ints = new ArrayList(); - //报数 - int count = 0; - while(ints.size()!=n){ - - for(int i=0;i list = execute(7, 2); - System.out.println(list); - } - -} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java b/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java deleted file mode 100644 index 12a3ec45be..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coding.basic.queue; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class JosephusTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testExecute() { - - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); - - } - -} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java deleted file mode 100644 index 7a6a11a3e4..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.coding.basic.queue; -import java.util.Stack; - -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - - - - public boolean isEmpty() { - return false; - } - - - - public int size() { - return -1; - } - - - - public void enQueue(E item) { - - } - - public E deQueue() { - return null; - } - - - } diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java deleted file mode 100644 index 4406d7d304..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; - -import com.coding.basic.stack.Stack; -import com.coding.basic.stack.StackUtil; - -public class InfixExpr { - private String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - /** - * 对expr进行解析计算 - * @return - */ - public float evaluate() { - float f = 0.0f; - //如果不为空继续解析 - if (expr != null || expr.length() > 0) { - //如果符号不对称,抛出异常 - if (!StackUtil.isValidPairs(expr)) { - try { - throw new Exception("格式不正确,解析表达式失败!"); - } catch (Exception e) { - e.printStackTrace(); - } - }; - //将字符串转化为集合 - ArrayList list=getStringList(expr); - //根据获得的集合转化为后序表达式集合 - ArrayList postOrder = getPostOrder(list); - Stack stack = new Stack(); - for (int i = 0; i < postOrder.size(); i++) { - //如果为数字,则压入栈 - if(Character.isDigit(postOrder.get(i).charAt(0))){ - stack.push(Float.parseFloat(postOrder.get(i))); - }else{ - //否则,取出栈顶两个元素进行计算. - Float back = (Float)stack.pop(); - Float front = (Float)stack.pop(); - Float res = 0.0f; - switch (postOrder.get(i).charAt(0)) { - case '+': - res = front + back; - break; - case '-': - res = front - back; - break; - case '*': - res = front * back; - break; - case '/': - res = front / back; - break; - } - //将结果再压回栈中 - stack.push(res); - } - } - //最终计算结果出栈; - f = (Float)stack.pop(); - - } else { - //为空抛出异常 - try { - throw new Exception("表达式内容为空,解析失败!"); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - return f; - } - /** - * 将字符串转换为集合方法 - * @param str - * @return - */ - private ArrayList getStringList(String str) { - ArrayList result = new ArrayList(); - String num = ""; - for (int i = 0; i < str.length(); i++) { - //如果为数字,叠加到num字符串中 - if (Character.isDigit(str.charAt(i))) { - num = num + str.charAt(i); - } else { - //如果num不为空,表示数字字符凑够了,加到集合里 - if (num != "") { - result.add(num); - } - //然后再把非数字字符也加到集合中,清空num字符串 - result.add(str.charAt(i) + ""); - num = ""; - } - } - //最后判断下,num中还有值没,有的话加到集合里 - if (num != "") { - result.add(num); - } - //返回结果 - return result; - } - - /** - * 中序表达式转后序表达式 - * @param list - * @return - */ - private ArrayList getPostOrder(ArrayList list) { - - ArrayList result = new ArrayList(); - Stack stack = new Stack(); - for (int i = 0; i < list.size(); i++) { - //如果为数字,加到集合里 - if (Character.isDigit(list.get(i).charAt(0))) { - result.add(list.get(i)); - } else { - switch (list.get(i).charAt(0)) { - //如果有左括号,先压入操作符栈中 - case '(': - stack.push(list.get(i)); - break; - //ok,等到右括号了 - case ')': - //先看看操作符栈顶是不是左括号头头 - while (!stack.peek().equals("(")) { - //不是左括号头头,就把操作符栈中的操作符弹出来一个,加到集合里,一直弹到见到左括号为止 - result.add((String) stack.pop()); - } - //最后把左括号也弹出来,这样就只有加减乘除没有括号了 - stack.pop(); - break; - default: - //这里全是处理加减乘除的操作 - //如果操作符栈不为空,比较下当前操作符和操作符栈顶的操作符优先级大小 - while (!stack.isEmpty() && compare((String) stack.peek(), list.get(i))) { - //如果栈顶操作符优先级大于当前,则栈中的操作符弹出加到集合里 - result.add((String) stack.pop()); - } - //否则继续压到栈中,或者之前栈中元素已经弹出,再将优先级小的操作符加到操作符栈中. - stack.push(list.get(i)); - break; - } - } - } - while (!stack.isEmpty()) { - //最后看下操作符栈还有操作符没,有了加到集合末尾 - result.add((String) stack.pop()); - } - return result; - } - /** - * 操作符优先级比较算法 - * @param peek - * @param cur - * @return - */ - public static boolean compare(String peek, String cur) { - //乘除优先级大于加减 - //如果操作符栈顶操作符的优先级大于当前操作符的优先级,则返回true - if ("*".equals(peek) && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-".equals(cur))) { - return true; - } else if ("/".equals(peek) && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-".equals(cur))) { - return true; - } else if ("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))) { - return true; - } else if ("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))) { - return true; - } - //如果当前操作符的优先级大于栈顶的操作符优先级,返回false - return false; - } - - public static void main(String[] args) { - InfixExpr expr = new InfixExpr("3*20+13*5-40/2"); - float f = expr.evaluate(); - System.out.println(f); - } -} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index e2de427e62..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java deleted file mode 100644 index 2e7243ecb2..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Assert; - -import com.coding.basic.stack.Stack; - - -public class InfixToPostfix { - - public static List convert(String expr) { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - List result = getPostOrder(tokens); - - return result; - } - - /** - * 中序表达式转后序表达式 - * - * @param list - * @return - */ - private static List getPostOrder(List tokens) { - - List result = new ArrayList(); - Stack stack = new Stack(); - for (int i = 0; i < tokens.size(); i++) { - // 如果为数字,加到集合里 - if (tokens.get(i).isNumber()) { - result.add(tokens.get(i)); - } else { - Token token = null; - if(!stack.isEmpty()){ - token = (Token)stack.peek(); - } - while(!stack.isEmpty() && token.hasHigherPriority(tokens.get(i))){ - result.add((Token)stack.pop()); - } - stack.push(tokens.get(i)); - } - } - while (!stack.isEmpty()) { - // 最后看下操作符栈还有操作符没,有了加到集合末尾 - result.add((Token) stack.pop()); - } - return result; - } - - - - public static void main(String[] args) { - List list = InfixToPostfix.convert("300*20+12*5-20/4"); - Assert.assertEquals("[300, 20, *, 12, 5, *, +, 20, 4, /, -]", list.toString()); - } -} \ No newline at end of file diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java deleted file mode 100644 index d824284eda..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -import org.junit.Assert; - -import com.coding.basic.stack.Stack; - -public class InfixToPrevfix { - - public static List convert(String expr) { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - - return PrevOrderExpr(tokens); - } - - public static List PrevOrderExpr(List tokens) { - List result = new ArrayList(); - Stack operator = new Stack(); - Stack num = new Stack(); - for (int i = tokens.size() - 1; i >= 0; i--) { - if (tokens.get(i).isNumber()) { - num.push(tokens.get(i)); - } - if (tokens.get(i).isOperator()) { - Token token = null; - if (!operator.isEmpty()) { - token = (Token) operator.peek(); - } - while (!operator.isEmpty() && token.hasHigherPriority(tokens.get(i))) { - num.push((Token) operator.pop()); - } - operator.push(tokens.get(i)); - } - } - while(!operator.isEmpty()){ - num.push(operator.pop()); - } - while (!num.isEmpty()) { - result.add((Token) num.pop()); - } - - - return result; - } - - - public static void main(String[] args) { - List list = InfixToPrevfix.convert("300*20+12*5-20/4"); - Assert.assertEquals("[+, *, 300, 20, -, *, 12, 5, /, 20, 4]", list.toString()); - } -} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index 2040814b2c..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.List; -import java.util.Stack; - - -public class PostfixExpr { - String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - Stack stack = new Stack(); - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - for(Token token :tokens){ - if(token.isNumber()){ - stack.push(token.toString()); - } - if(token.isOperator()){ - int num1 = Integer.parseInt(stack.pop()); - int num2 = Integer.parseInt(stack.pop()); - String result = parseToResult(num1,num2,token.toString()); - stack.push(result); - } - } - - - - return Float.parseFloat(stack.pop()); - } - - private String parseToResult(int num1, int num2, String oper) { - // TODO Auto-generated method stub - String result = ""; - if(oper.equals("*")) - result = (num1*num2)+""; - if(oper.equals("/")) - result = (num2/num1)+""; - if(oper.equals("+")) - result = (num1+num2)+""; - if(oper.equals("-")) - result = (num2-num1)+""; - return result; - } - - public static void main(String[] args) { - //9+(3-1)*3+10/2 - PostfixExpr pos = new PostfixExpr("9 3 1-3*+ 10 2/+"); - float f =pos.evaluate(); - System.out.println(f); - } -} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java deleted file mode 100644 index cc7efb5d40..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PostfixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java deleted file mode 100644 index c06a960bfe..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.Collections; -import java.util.List; -import java.util.Stack; - -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - Stack stack = new Stack(); - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - Collections.reverse(tokens); - for(Token token :tokens){ - if(token.isNumber()){ - stack.push(token.toString()); - } - if(token.isOperator()){ - int num1 = Integer.parseInt(stack.pop()); - int num2 = Integer.parseInt(stack.pop()); - String result = parseToResult(num1,num2,token.toString()); - stack.push(result); - } - } - - return Float.parseFloat(stack.pop()); - } - - - private String parseToResult(int num1, int num2, String oper) { - // TODO Auto-generated method stub - String result = ""; - if(oper.equals("*")) - result = (num1*num2)+""; - if(oper.equals("/")) - result = (num1/num2)+""; - if(oper.equals("+")) - result = (num1+num2)+""; - if(oper.equals("-")) - result = (num1-num2)+""; - return result; - } - -} \ No newline at end of file diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java deleted file mode 100644 index 9cfaa64570..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coding.basic.stack.expr; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java deleted file mode 100644 index 2d78610e7a..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.coding.basic.stack.expr; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - - -} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java deleted file mode 100644 index 58ee229f9a..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.coding.basic.stack.expr; -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java deleted file mode 100644 index 3562e42508..0000000000 --- a/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coding.basic.stack.expr; -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 85156946eb..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coderising.jvm.attr; - -public class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index a47357ec09..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.CommandParser; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class CodeAttr extends AttributeInfo { - private int maxStack; - private int maxLocals; - private int codeLen; - private String code; - - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds; - - public ByteCodeCommand[] getCmds() { - return cmds; - } - - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, - String code ,ByteCodeCommand[] cmds ) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { - int attributeNameIndex = iter.nextU2Int(); - int attributeLength = iter.nextU4Integer(); - int maxStack = iter.nextU2Int(); - int maxLocals = iter.nextU2Int(); - int length = iter.nextU4Integer(); - String code = iter.nextUxToHexString(length); - - ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); - - - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, length, code,cmds); - - int exceptionTableLength = iter.nextU2Int(); - if (exceptionTableLength > 0) { - String exceptionTable = iter.nextUxToHexString(exceptionTableLength); - throw new RuntimeException("解析异常表异常:" + exceptionTable); - } - - int attributesCount = iter.nextU2Int(); - for (int i = 0; i < attributesCount; i++) { - int subAttributeNameIndex = iter.nextU2Int(); - iter.back(2); - - String subAttributeName = clzFile.getConstantPool().getUTF8String(subAttributeNameIndex); - - if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { - - LineNumberTable lineNumberTable = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(lineNumberTable); - - } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LOCAL_VAR_TABLE)) { - - LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(localVariableTable); - - } else { - throw new RuntimeException("解析subAttribute异常-subAttributeName:" + subAttributeName); - } - - } - - return codeAttr; - } - - public String toString(ConstantPool pool) { - StringBuilder buffer = new StringBuilder(); - // buffer.append("Code:").append(code).append("\n"); - for (int i = 0; i < cmds.length; i++) { - buffer.append(cmds[i].toString(pool)).append("\n"); - } - buffer.append("\n"); - buffer.append(this.lineNumTable.toString()); - buffer.append(this.localVarTable.toString(pool)); - return buffer.toString(); - } - - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - - } -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java deleted file mode 100644 index 8a5b17f7e2..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LineNumberTable extends AttributeInfo { - List items = new ArrayList(); - - private static class LineNumberItem { - int startPC; - int lineNum; - - public int getStartPC() { - return startPC; - } - - public void setStartPC(int startPC) { - this.startPC = startPC; - } - - public int getLineNum() { - return lineNum; - } - - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - - public void addLineNumberItem(LineNumberItem item) { - this.items.add(item); - } - - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter) { - int attributeNameIndex = iter.nextU2Int(); - int attributeLength = iter.nextU4Integer(); - LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex, attributeLength); - - int lineNumberTableLength = iter.nextU2Int(); - for (int i = 0; i < lineNumberTableLength; i++) { - LineNumberItem lineNumberItem = new LineNumberItem(); - lineNumberItem.setStartPC(iter.nextU2Int()); - lineNumberItem.setLineNum(iter.nextU2Int()); - lineNumberTable.addLineNumberItem(lineNumberItem); - } - - return lineNumberTable; - } - - - public String toString(){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Line Number Table:\n"); - for(LineNumberItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("lineNum:"+item.getLineNum()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - - } - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 3eb2654e36..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 40495c9756..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo { - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter) { - int attributeNameIndex = iter.nextU2Int(); - int attributeLength = iter.nextU4Integer(); - - LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex, attributeLength); - - int localVariableTableLength = iter.nextU2Int(); - for (int i = 0; i < localVariableTableLength; i++) { - LocalVariableItem localVariableItem = new LocalVariableItem(); - localVariableItem.setStartPC(iter.nextU2Int()); - localVariableItem.setLength(iter.nextU2Int()); - localVariableItem.setNameIndex(iter.nextU2Int()); - localVariableItem.setDescIndex(iter.nextU2Int()); - localVariableItem.setIndex(iter.nextU2Int()); - localVariableTable.addLocalVariableItem(localVariableItem); - } - - return localVariableTable; - } - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index 70387e2bb2..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2Int(); - int len = iter.nextU4Integer(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java deleted file mode 100644 index 48c856053a..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f) { - this.fields.add(f); - } - - public List getFields() { - return this.fields; - } - - public void addMethod(Method m) { - this.methods.add(m); - } - - public List getMethods() { - return methods; - } - - 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()); - - } - - public String getClassName() { - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - - public String getSuperClassName() { - ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - - public Method getMethod(String methodName, String paramAndReturnType) { - Method method = null; - for(Method m : methods){ - String name = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - if(name.equalsIgnoreCase(methodName) && methodDesc.equalsIgnoreCase(paramAndReturnType)){ - method = m; - } - } - return method; - } - - public Method getMainMethod() { - Method method = null; - for(Method m : methods){ - String name = pool.getUTF8String(m.getNameIndex()); - if(name.equalsIgnoreCase("main")){ - method = m; - } - } - return method; - } - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java deleted file mode 100644 index cd0fbd4848..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index 4006ca69e1..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(getReadableCodeText()); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode.toUpperCase()); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java deleted file mode 100644 index e86d3de1de..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - if (codes == null || codes.length() <= 0) { - throw new RuntimeException("字节码指令解析错误!"); - } - List cmds = new ArrayList(); - CommandIterator iter = new CommandIterator(codes); - while (iter.hasNext()) { - String opcmd = iter.next2CharAsString(); - System.out.println("opcmd:" + opcmd); - if (bipush.equalsIgnoreCase(opcmd)) { - BiPushCmd cmd = new BiPushCmd(clzFile, opcmd); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (getfield.equalsIgnoreCase(opcmd)) { - GetFieldCmd cmd = new GetFieldCmd(clzFile, opcmd); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (getstatic.equalsIgnoreCase(opcmd)) { - GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opcmd); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (invokespecial.equalsIgnoreCase(opcmd)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opcmd); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (invokevirtual.equalsIgnoreCase(opcmd)) { - InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opcmd); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (ldc.equalsIgnoreCase(opcmd)) { - LdcCmd cmd = new LdcCmd(clzFile, opcmd); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (new_object.equalsIgnoreCase(opcmd)) { - NewObjectCmd cmd = new NewObjectCmd(clzFile, opcmd); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (putfield.equalsIgnoreCase(opcmd)) { - PutFieldCmd cmd = new PutFieldCmd(clzFile, opcmd); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (dup.equalsIgnoreCase(opcmd) || aload_0.equalsIgnoreCase(opcmd) || aload_1.equalsIgnoreCase(opcmd) - || aload_2.equalsIgnoreCase(opcmd) || iload_1.equalsIgnoreCase(opcmd) - || iload_2.equalsIgnoreCase(opcmd) || iload_3.equalsIgnoreCase(opcmd) - || fload_3.equalsIgnoreCase(opcmd) || voidreturn.equalsIgnoreCase(opcmd) - || astore_1.equalsIgnoreCase(opcmd)) { - NoOperandCmd cmd = new NoOperandCmd(clzFile, opcmd); - cmds.add(cmd); - } else { - throw new RuntimeException("暂不支持的指令类型!"); - } - } - calcuateOffset(cmds); - ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; - cmds.toArray(result); - return result; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 2e6061edd2..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e6cf9d5960..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index ac228d0e4d..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index c15d827797..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java deleted file mode 100644 index ffb66f811c..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 33813b5d59..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 56c28fefe2..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 963d064257..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 85bb369c19..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 6c0cf53082..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java deleted file mode 100644 index 1d03d962e4..0000000000 --- a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - Field field = new Field(iter.nextU2Int(), iter.nextU2Int(), iter.nextU2Int(),pool); - int attributeCount=iter.nextU2Int(); - System.out.println("attributeCount:"+attributeCount); - for(int j=0;j", 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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - System.out.println("field_size:"+fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - System.out.println("methods_size:"+methods.size()); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - /*第四次测试代码*/ - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } -} diff --git a/group27/383117348/data-structure/com/coderising/download/DownloadThread.java b/group27/383117348/src/com/coderising/download/DownloadThread.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/DownloadThread.java rename to group27/383117348/src/com/coderising/download/DownloadThread.java diff --git a/group27/383117348/data-structure/com/coderising/download/FileDownloader.java b/group27/383117348/src/com/coderising/download/FileDownloader.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/FileDownloader.java rename to group27/383117348/src/com/coderising/download/FileDownloader.java diff --git a/group27/383117348/data-structure/com/coderising/download/FileDownloaderTest.java b/group27/383117348/src/com/coderising/download/FileDownloaderTest.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/FileDownloaderTest.java rename to group27/383117348/src/com/coderising/download/FileDownloaderTest.java diff --git a/group27/383117348/data-structure/com/coderising/download/api/Connection.java b/group27/383117348/src/com/coderising/download/api/Connection.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/api/Connection.java rename to group27/383117348/src/com/coderising/download/api/Connection.java diff --git a/group27/383117348/data-structure/com/coderising/download/api/ConnectionException.java b/group27/383117348/src/com/coderising/download/api/ConnectionException.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/api/ConnectionException.java rename to group27/383117348/src/com/coderising/download/api/ConnectionException.java diff --git a/group27/383117348/data-structure/com/coderising/download/api/ConnectionManager.java b/group27/383117348/src/com/coderising/download/api/ConnectionManager.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/api/ConnectionManager.java rename to group27/383117348/src/com/coderising/download/api/ConnectionManager.java diff --git a/group27/383117348/data-structure/com/coderising/download/api/DownloadListener.java b/group27/383117348/src/com/coderising/download/api/DownloadListener.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/api/DownloadListener.java rename to group27/383117348/src/com/coderising/download/api/DownloadListener.java diff --git a/group27/383117348/data-structure/com/coderising/download/impl/ConnectionImpl.java b/group27/383117348/src/com/coderising/download/impl/ConnectionImpl.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/impl/ConnectionImpl.java rename to group27/383117348/src/com/coderising/download/impl/ConnectionImpl.java diff --git a/group27/383117348/data-structure/com/coderising/download/impl/ConnectionManagerImpl.java b/group27/383117348/src/com/coderising/download/impl/ConnectionManagerImpl.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/download/impl/ConnectionManagerImpl.java rename to group27/383117348/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/clz/AccessFlag.java b/group27/383117348/src/com/coderising/jvm/clz/AccessFlag.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/clz/AccessFlag.java rename to group27/383117348/src/com/coderising/jvm/clz/AccessFlag.java diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassFile.java b/group27/383117348/src/com/coderising/jvm/clz/ClassFile.java similarity index 95% rename from group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassFile.java rename to group27/383117348/src/com/coderising/jvm/clz/ClassFile.java index 650ca8375d..1b5a8b95a6 100644 --- a/group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassFile.java +++ b/group27/383117348/src/com/coderising/jvm/clz/ClassFile.java @@ -1,75 +1,75 @@ -package com.coderising.jvm.clz; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.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(); - } -} +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassIndex.java b/group27/383117348/src/com/coderising/jvm/clz/ClassIndex.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassIndex.java rename to group27/383117348/src/com/coderising/jvm/clz/ClassIndex.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java b/group27/383117348/src/com/coderising/jvm/constant/ClassInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/ClassInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java b/group27/383117348/src/com/coderising/jvm/constant/ConstantInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/ConstantInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java b/group27/383117348/src/com/coderising/jvm/constant/ConstantPool.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java rename to group27/383117348/src/com/coderising/jvm/constant/ConstantPool.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java b/group27/383117348/src/com/coderising/jvm/constant/FieldRefInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/FieldRefInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java b/group27/383117348/src/com/coderising/jvm/constant/FloatInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/FloatInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java b/group27/383117348/src/com/coderising/jvm/constant/IntegerInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/IntegerInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java b/group27/383117348/src/com/coderising/jvm/constant/MethodRefInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/MethodRefInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/383117348/src/com/coderising/jvm/constant/NameAndTypeInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/NameAndTypeInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java b/group27/383117348/src/com/coderising/jvm/constant/NullConstantInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/NullConstantInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java b/group27/383117348/src/com/coderising/jvm/constant/StringInfo.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java rename to group27/383117348/src/com/coderising/jvm/constant/StringInfo.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java b/group27/383117348/src/com/coderising/jvm/constant/UTF8Info.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java rename to group27/383117348/src/com/coderising/jvm/constant/UTF8Info.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java b/group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java similarity index 73% rename from group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java rename to group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java index 8e85a3d0ab..2688ae5810 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group27/383117348/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -48,20 +48,4 @@ private byte[] getByteBySize(int size){ } return by; } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = code[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - public int getPos(){ - return pos; - } - public void back(int n) { - this.pos -= n; - } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java b/group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java rename to group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader_backup.java b/group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader_backup.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileLoader_backup.java rename to group27/383117348/src/com/coderising/jvm/loader/ClassFileLoader_backup.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java b/group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java similarity index 75% rename from group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java rename to group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java index 970c06e082..209ee78d36 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java +++ b/group27/383117348/src/com/coderising/jvm/loader/ClassFileParser.java @@ -1,8 +1,6 @@ package com.coderising.jvm.loader; import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; @@ -17,8 +15,6 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; public class ClassFileParser { @@ -37,23 +33,12 @@ public ClassFile parse(byte[] codes) { ConstantPool constant = parseConstantPool(by); AccessFlag flag = parseAccessFlag(by); ClassIndex index = parseClassIndex(by); - parseInterfaces(by); + file.setMinorVersion(minVersion); file.setMajorVersion(majorVersion); file.setAccessFlag(flag); file.setClassIndex(index); file.setConstPool(constant); - List fields = parseField(by,constant); - List methods = parseMethod(by,file); - - - for(Field field:fields){ - file.addField(field); - } - for(Method method:methods){ - file.addMethod(method); - } - return file; } @@ -120,32 +105,6 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } return pool; } - - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceCount = iter.nextU2Int(); - System.out.println("interfaceCount:" + interfaceCount); - } - - private List parseField(ByteCodeIterator by,ConstantPool pool) { - // TODO Auto-generated method stub - List result = new ArrayList(); - int fieldCount = by.nextU2Int(); - for(int i=0;i parseMethod(ByteCodeIterator by,ClassFile file) { - // TODO Auto-generated method stub - List result = new ArrayList(); - int methodCount = by.nextU2Int(); - 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()); - } - - - -} +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + static String path1 = "E:\\MyGit\\coding2017\\group27\\383117348\\bin"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + 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/group27/383117348/mini-jvm/com/coderising/jvm/test/EmployeeV1.java b/group27/383117348/src/com/coderising/jvm/test/EmployeeV1.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/test/EmployeeV1.java rename to group27/383117348/src/com/coderising/jvm/test/EmployeeV1.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/util/Util.java b/group27/383117348/src/com/coderising/jvm/util/Util.java similarity index 100% rename from group27/383117348/mini-jvm/com/coderising/jvm/util/Util.java rename to group27/383117348/src/com/coderising/jvm/util/Util.java diff --git a/group27/383117348/data-structure/com/coderising/litestruts/LoginAction.java b/group27/383117348/src/com/coderising/litestruts/LoginAction.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/litestruts/LoginAction.java rename to group27/383117348/src/com/coderising/litestruts/LoginAction.java diff --git a/group27/383117348/data-structure/com/coderising/litestruts/Struts.java b/group27/383117348/src/com/coderising/litestruts/Struts.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/litestruts/Struts.java rename to group27/383117348/src/com/coderising/litestruts/Struts.java diff --git a/group27/383117348/data-structure/com/coderising/litestruts/StrutsTest.java b/group27/383117348/src/com/coderising/litestruts/StrutsTest.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/litestruts/StrutsTest.java rename to group27/383117348/src/com/coderising/litestruts/StrutsTest.java diff --git a/group27/383117348/data-structure/com/coderising/litestruts/View.java b/group27/383117348/src/com/coderising/litestruts/View.java similarity index 100% rename from group27/383117348/data-structure/com/coderising/litestruts/View.java rename to group27/383117348/src/com/coderising/litestruts/View.java diff --git a/group27/383117348/data-structure/com/coderising/litestruts/struts.xml b/group27/383117348/src/com/coderising/litestruts/struts.xml similarity index 100% rename from group27/383117348/data-structure/com/coderising/litestruts/struts.xml rename to group27/383117348/src/com/coderising/litestruts/struts.xml diff --git a/group27/383117348/data-structure/com/coding/basic/BinaryTreeNode.java b/group27/383117348/src/com/coding/basic/BinaryTreeNode.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/BinaryTreeNode.java rename to group27/383117348/src/com/coding/basic/BinaryTreeNode.java diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java b/group27/383117348/src/com/coding/basic/Iterator.java similarity index 93% rename from group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java rename to group27/383117348/src/com/coding/basic/Iterator.java index 06ef6311b2..dbe8b9afb2 100644 --- a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java +++ b/group27/383117348/src/com/coding/basic/Iterator.java @@ -1,7 +1,7 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group27/383117348/data-structure/com/coding/basic/List.java b/group27/383117348/src/com/coding/basic/List.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/List.java rename to group27/383117348/src/com/coding/basic/List.java diff --git a/group27/383117348/data-structure/com/coding/basic/queue/Queue.java b/group27/383117348/src/com/coding/basic/Queue.java similarity index 91% rename from group27/383117348/data-structure/com/coding/basic/queue/Queue.java rename to group27/383117348/src/com/coding/basic/Queue.java index 11b191bf89..4bd32c067b 100644 --- a/group27/383117348/data-structure/com/coding/basic/queue/Queue.java +++ b/group27/383117348/src/com/coding/basic/Queue.java @@ -1,4 +1,4 @@ -package com.coding.basic.queue; +package com.coding.basic; import org.junit.Test; diff --git a/group27/383117348/data-structure/com/coding/basic/array/ArrayList.java b/group27/383117348/src/com/coding/basic/array/ArrayList.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/array/ArrayList.java rename to group27/383117348/src/com/coding/basic/array/ArrayList.java diff --git a/group27/383117348/data-structure/com/coding/basic/array/ArrayUtil.java b/group27/383117348/src/com/coding/basic/array/ArrayUtil.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/array/ArrayUtil.java rename to group27/383117348/src/com/coding/basic/array/ArrayUtil.java diff --git a/group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrame.java b/group27/383117348/src/com/coding/basic/linklist/LRUPageFrame.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrame.java rename to group27/383117348/src/com/coding/basic/linklist/LRUPageFrame.java diff --git a/group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrameTest.java b/group27/383117348/src/com/coding/basic/linklist/LRUPageFrameTest.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrameTest.java rename to group27/383117348/src/com/coding/basic/linklist/LRUPageFrameTest.java diff --git a/group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java b/group27/383117348/src/com/coding/basic/linklist/LinkedList.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java rename to group27/383117348/src/com/coding/basic/linklist/LinkedList.java diff --git a/group27/383117348/data-structure/com/coding/basic/stack/Stack.java b/group27/383117348/src/com/coding/basic/stack/Stack.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/stack/Stack.java rename to group27/383117348/src/com/coding/basic/stack/Stack.java diff --git a/group27/383117348/data-structure/com/coding/basic/stack/StackUtil.java b/group27/383117348/src/com/coding/basic/stack/StackUtil.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/stack/StackUtil.java rename to group27/383117348/src/com/coding/basic/stack/StackUtil.java diff --git a/group27/383117348/data-structure/com/coding/basic/stack/test/StackUtilTest.java b/group27/383117348/src/com/coding/basic/stack/test/StackUtilTest.java similarity index 100% rename from group27/383117348/data-structure/com/coding/basic/stack/test/StackUtilTest.java rename to group27/383117348/src/com/coding/basic/stack/test/StackUtilTest.java diff --git a/group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java b/group27/513274874/data-structure/src/com/coding/basic/ArrayList.java similarity index 96% rename from group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java rename to group27/513274874/data-structure/src/com/coding/basic/ArrayList.java index 7d6d7a08f2..9e55e92529 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java +++ b/group27/513274874/data-structure/src/com/coding/basic/ArrayList.java @@ -1,7 +1,5 @@ -package com.coding.basic.array; - -import com.coding.basic.Iterator; +package com.coding.basic; import java.util.Arrays; @@ -80,7 +78,7 @@ public Object remove(int index) { } public int size() { - return this.size; + return this.size + 1; } public Iterator iterator() { diff --git a/group24/Homework/1-FirstWeek/List.java b/group27/513274874/data-structure/src/com/coding/basic/List.java similarity index 95% rename from group24/Homework/1-FirstWeek/List.java rename to group27/513274874/data-structure/src/com/coding/basic/List.java index 10d13b5832..396b1f6416 100644 --- a/group24/Homework/1-FirstWeek/List.java +++ b/group27/513274874/data-structure/src/com/coding/basic/List.java @@ -1,9 +1,9 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/Stack.java b/group27/513274874/data-structure/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..034e4c7215 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/Stack.java @@ -0,0 +1,65 @@ + +package com.coding.basic; + +/** + * author zhougd 20170306 + * + */ +public class Stack { + private List elementData = new ArrayList(); + + + public Stack() { + } + + /** + * 入栈 + * @param o + */ + public void push(Object o){ + elementData.add(o); + } + + /** + * 出栈 + * @return + */ + public Object pop(){ + if(this.isEmpty()){ + throw new IndexOutOfBoundsException("stack is empty!"); + } + Object element = elementData.get(size()-1); + elementData.remove(size()-1); + return element; + } + + /** + * 查看栈顶元素 + * @return Object + */ + public Object peek(){ + if(this.isEmpty()){ + throw new IndexOutOfBoundsException("stack is empty!"); + } + Object element = elementData.get(size()-1); + return element; + } + + /** + * 查看栈是否为空 + * @return boolean + */ + public boolean isEmpty(){ + + return elementData == null || elementData.size()<=0; + + } + + /** + * 获取栈大小 + * @return + */ + public int size(){ + return elementData.size(); + } +} \ No newline at end of file diff --git a/group27/513274874/data-structure/src/com/coding/basic/array/List.java b/group27/513274874/data-structure/src/com/coding/basic/array/List.java deleted file mode 100644 index 2a07c92d6e..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/array/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic.array; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java b/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java index 245affee80..e6d400f483 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java +++ b/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java @@ -2,7 +2,7 @@ package com.coding.basic.linklist; import com.coding.basic.Iterator; -import com.coding.basic.array.List; +import com.coding.basic.List; import java.util.NoSuchElementException; diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java b/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java index 3b8a9eeb5a..4a0980079b 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java @@ -1,8 +1,7 @@ package com.coding.basic.stack; - -import com.coding.basic.array.List; +import com.coding.basic.List; import com.coding.basic.array.ArrayList; /** @@ -21,7 +20,6 @@ public Stack() { * @param o */ public void push(Object o){ - elementData.add(o); } diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java index fa8a8c0325..e53e38ca4b 100755 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java @@ -1,6 +1,5 @@ package com.coding.basic.stack; -import java.util.Stack; public class StackUtil { /** @@ -8,27 +7,14 @@ public class StackUtil { * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 */ public static void reverse(Stack s) { - if(null == s || s.isEmpty()){ - return; + Stack temp = new Stack(); + //先清空s + while (!s.isEmpty()) { + temp.push(s.pop()); } - Object object = s.pop(); - reverse(s); - addToBottom(s,object); } - public static void addToBottom(Stack s ,Object num){ - if(s.isEmpty()){ - s.push(num); - - }else{ - Object o = s.pop(); - addToBottom(s,num); - s.push(o); - } - } - - /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 * @@ -115,7 +101,7 @@ public static boolean isValidPairs(String s) { break; case ']': temp = (byte) stack.peek(); - if (temp != '[') { + if (temp != ']') { return false; } else { stack.pop(); @@ -123,7 +109,7 @@ public static boolean isValidPairs(String s) { break; case '}': temp = (byte) stack.peek(); - if (temp != '{') { + if (temp != ']') { return false; } else { stack.pop(); diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java deleted file mode 100644 index d183607f63..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.coding.basic.stack; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.util.Stack; -public class StackUtilTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testAddToBottom() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - - StackUtil.addToBottom(s, 0); - - Assert.assertEquals("[0, 1, 2, 3]", s.toString()); - - } - @Test - public void testReverse() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); - } - - @Test - public void testRemove() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("[1, 3]", s.toString()); - } - - @Test - public void testGetTop() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } - } - - @Test - public void testIsValidPairs() { - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } - -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java deleted file mode 100644 index ddd255e4a0..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.StackUtil; - -import java.util.Stack; - -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - char[] chars = expr.toCharArray(); - System.out.println(chars); - - Stack numStack = new Stack(); - Stack operStack = new Stack(); - //当前数,有可能是操作数,有可能是运算符 - String curr = ""; - OperIterator operIterator = new OperIterator(chars); - int num = operIterator.nextNumber(); - numStack.push(num); - while(operIterator.hasNext()){ - int numB = 0; - char oper = operIterator.nextOperator(); - switch (oper){ - case '+': - case '-': - operStack.push(oper); - numStack.push(operIterator.nextNumber()); - continue; - case '*': - numB = operIterator.nextNumber(); - numStack.push(Double.parseDouble(numStack.pop() + "") * numB); - continue; - case '/': - numB = operIterator.nextNumber(); - numStack.push(Double.parseDouble(numStack.pop()+"") / numB); - continue; - } - } - - //清算站内数据 - if(operStack.isEmpty()) return Float.parseFloat(numStack.pop() + ""); - - StackUtil.reverse(operStack); - StackUtil.reverse(numStack); - while(!operStack.isEmpty()){ - char oper = (char)operStack.pop(); - - numStack.push(operate(Float.parseFloat(numStack.pop()+""),Float.parseFloat(numStack.pop() +""),oper)); - } - - return (float) numStack.pop(); - } - - private float operate(float a,float b,char oper){ - switch (oper){ - case '-': - return a-b; - case '+': - return a+b; - case '*': - return a*b; - case '/': - return a/b; - } - return 0.00f; - } - - class OperIterator { - private char[] expr ; - private int pos = 0; - - public OperIterator(char[] expr) { - this.expr = expr; - } - - public char nextOperator(){ - return expr[pos++]; - } - public int nextNumber(){ - StringBuffer num = new StringBuffer(""); - while(pos <= expr.length-1 && expr[pos] != '+' && expr[pos] != '-' && expr[pos] != '*' && expr[pos] != '/'){ - num.append(expr[pos++]); - } - return Integer.parseInt(num.toString()); - } - - public boolean hasNext(){ - return pos < expr.length-1; - } - } - -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index ddb1130398..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("10-2*3+50"); - Assert.assertEquals(54, expr.evaluate(), 0.001f); - } - - } - - @Test - public void testConert(){ - new InfixToPostfix().convert("2*3*4+5"); - } - -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java deleted file mode 100644 index 55eb061ce0..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.Stack; - -import java.util.ArrayList; -import java.util.List; - -public class InfixToPostfix { - private Stack operStack = new Stack(); - - public List convert(String expr) { - - List infixList = TokenParser.parse(expr); - List postfixList = new ArrayList<>(); - int i = 0; - while(i < infixList.size()){ - Token token = infixList.get(i); - if(token.isNumber()){ - //operand - postfixList.add(token); - - }else{ - //operator - if(operStack.isEmpty()) { - operStack.push(token); - i++; - continue; - } - - Token topToken = (Token)operStack.pop(); - - if(token.hasHigherPriority(topToken)){ - //the operator has higher priority than the arg operator - postfixList.add(infixList.get(++i)); - postfixList.add(token); - operStack.push(topToken); - - }else{ - postfixList.add(topToken); - operStack.push(token); - } - - } - i++; - } - //empty operStack - while(!operStack.isEmpty()){ - postfixList.add((Token)operStack.pop()); - } - for (Token token :postfixList){ - System.out.print(token.value); - } - System.out.println(); - return postfixList; - } - -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index 27b9ee9c31..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.Stack; - -import java.util.List; - -public class PostfixExpr { -String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - List postfixExpr = TokenParser.parse(expr); - - Stack calc = new Stack(); - for(Token token :postfixExpr){ - if(token.isNumber()){ - //push number into stack until operator - calc.push(token.getIntValue()); - }else { - //operator : pop two numbers to calculate and then push the result into stack - int numberA = (int)calc.pop(); - int numberB = (int)calc.pop(); - - switch (token.value){ - case "+": - calc.push(numberB + numberA ); - break; - case "-": - calc.push(numberB - numberA); - break; - case "*": - calc.push(numberB * numberA); - break; - case "/": - calc.push(numberB / numberA); - break; - - default: - throw new RuntimeException(token.value + " is not a operator !"); - } - } - } - - //the result is the only value in the stack - float result = Float.parseFloat(calc.pop() + ""); - return result; - } -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java deleted file mode 100644 index c0435a2db5..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic.stack.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java deleted file mode 100644 index 956927e2df..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.List; -import java.util.Stack; - -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - return 0.0f; - } - - -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java deleted file mode 100644 index 5cec210e75..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java deleted file mode 100644 index 8579743fe9..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - - -} \ No newline at end of file diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java deleted file mode 100644 index 7ef3d1959c..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public static List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private static int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private static boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java deleted file mode 100644 index 399d3e857e..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic.stack.expr; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 89fb53394e..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index da789aa68f..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class CodeAttr extends AttributeInfo { - private int maxStack; - private int maxLocals; - private int codeLen; - private String code; - - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { - - int attributeNameIndex = iter.nextU2Int(); - int attributeLength = iter.nextU4Int(); - int maxStack = iter.nextU2Int(); - int maxLocals = iter.nextU2Int(); - - int codeLength = iter.nextU4Int(); - String code = iter.nextUxToHexString(codeLength); - - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); - - //exception - int exceptionTableLength = iter.nextU2Int(); - if (exceptionTableLength > 0) { - String exceptionTable = iter.nextUxToHexString(exceptionTableLength); - throw new RuntimeException("there's exception to be implemented !!"); - } - - //attribute table of the code - int attributesCount = iter.nextU2Int(); - for (int i = 0; i < attributesCount; i++) { - int subAttributeNameIndex = iter.nextU2Int(); - iter.back(2); - - String subAttributeName = clzFile.getConstantPool().getUTF8String(subAttributeNameIndex); - - if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { - - LineNumberTable lineNumberTable = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(lineNumberTable); - - } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LOCAL_VAR_TABLE)) { - - LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(localVariableTable); - - } else { - throw new RuntimeException("there's other sub attribute to added : name = " + subAttributeName); - } - - } - - return codeAttr; - } - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - for(int i=0;i items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - int attributeNameIndex = iter.nextU2Int(); - int attributeLength = iter.nextU4Int(); - LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex,attributeLength); - - //lineNumberItem block - int lineNumberTableLength = iter.nextU2Int(); - for(int i = 0 ;i items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - int attributeNameIndex = iter.nextU2Int(); - int attributeLength = iter.nextU4Int(); - - LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex,attributeLength); - - int localVariableTableLength = iter.nextU2Int(); - for(int i = 0 ;i < localVariableTableLength;i++){ - LocalVariableItem localVariableItem = new LocalVariableItem(); - localVariableItem.setStartPC(iter.nextU2Int()); - localVariableItem.setLength(iter.nextU2Int()); - localVariableItem.setNameIndex(iter.nextU2Int()); - localVariableItem.setDescIndex(iter.nextU2Int()); - localVariableItem.setIndex(iter.nextU2Int()); - localVariableTable.addLocalVariableItem(localVariableItem); - } - - - return localVariableTable; - } - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } - - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index 3a8b6b8013..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2Int(); - int len = iter.nextU4Int(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java index 32a2a0a64d..650ca8375d 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -2,11 +2,6 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -import java.util.ArrayList; -import java.util.List; public class ClassFile { @@ -16,8 +11,7 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); + public ClassIndex getClzIndex() { return clzIndex; @@ -54,18 +48,7 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - public void addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } + public void print(){ @@ -80,23 +63,13 @@ public void print(){ } - public String getClassName(){ + private String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - public String getSuperClassName(){ + private String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } - - public Method getMethod(String methodName, String paramAndReturnType){ - - - return null; - } - public Method getMainMethod(){ - - return null; - } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java deleted file mode 100644 index cd0fbd4848..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index a3abeacc82..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java deleted file mode 100644 index 2bb36340f5..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - - return null; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 2e6061edd2..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e6cf9d5960..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index ac228d0e4d..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index c15d827797..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java deleted file mode 100644 index ffb66f811c..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 33813b5d59..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 56c28fefe2..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 963d064257..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 85bb369c19..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 6c0cf53082..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java index c8e65ff493..aea9048ea4 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -21,8 +21,4 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java index 88353df2d3..5d66317801 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -18,6 +18,11 @@ public ConstantInfo(ConstantPool pool) { this.constantPool = pool; } public abstract int getType(); + + @Override + public String toString(){ + return super.toString(); + } public ConstantPool getConstantPool() { return constantPool; @@ -26,15 +31,4 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java index 86c0445695..f92c8028b9 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -1,11 +1,11 @@ package com.coderising.jvm.constant; -import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; public class ConstantPool { - private List constantInfos = new ArrayList(); + private List constantInfos = new LinkedList(); public ConstantPool(){ diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index 7ae71396ef..65475e194c 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,8 +51,4 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index c85d1c8ccd..65c586916c 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -27,7 +27,8 @@ public int getNameAndTypeIndex() { public void setNameAndTypeIndex(int nameAndTypeIndex) { this.nameAndTypeIndex = nameAndTypeIndex; } - + + @Override public String toString(){ return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ; @@ -49,11 +50,6 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index e4f6d027e0..b9d9185ef8 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -46,10 +46,4 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - - } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index 41e0fd7e7a..936736016f 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,9 +9,5 @@ public NullConstantInfo(){ public int getType() { return -1; } - @Override - public void accept(Visitor visitor) { - - } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java index 6bfcb47273..f1f8eb4ed4 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -22,11 +22,5 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java index 7db88a939e..5cac9f04f7 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -26,11 +26,6 @@ public String getValue() { public void setValue(String value) { this.value = value; } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - - } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java deleted file mode 100644 index acbb77410a..0000000000 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - private ConstantPool pool; - - public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - @Override - public String toString() { - String name = pool.getUTF8String(nameIndex); - String descr = pool.getUTF8String(descriptorIndex); - - return name+":"+descr; - } - - public static Field parse(ConstantPool pool, ByteCodeIterator iter) { - int accessFlag = iter.nextU2Int(); - int nameIndex = iter.nextU2Int(); - int descriptorIndex = iter.nextU2Int(); - - int attributsCount = iter.nextU2Int(); - - if (attributsCount > 0) { - throw new RuntimeException("field : " + ((UTF8Info) pool.getConstantInfo(nameIndex)).getValue() + "has attributes to be implemented !!"); - } - - Field field = new Field(accessFlag,nameIndex,descriptorIndex,pool); - return field; - } - -} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java index 59d072ef0b..e4c5c83681 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -5,50 +5,30 @@ import java.util.Arrays; public class ByteCodeIterator { - private byte[] code; + private byte[] code ; private int pos = 0; public ByteCodeIterator(byte[] code) { this.code = code; } - public byte[] getBytes(int length) { - if (pos + length >= code.length) { - throw new IndexOutOfBoundsException("not enough bytes!"); - } - byte[] bytes = Arrays.copyOfRange(code, pos, pos + length); - pos += length; - return bytes; - } - - public int nextU1Int() { + public int nextU1Int(){ return Util.byteToInt(new byte[]{code[pos++]}); } + public int nextU2Int(){ - public int nextU2Int() { - - return Util.byteToInt(new byte[]{code[pos++], code[pos++]}); + return Util.byteToInt(new byte[]{code[pos++],code[pos++]}); } - - public int nextU4Int() { - return Util.byteToInt(new byte[]{code[pos++], code[pos++], code[pos++], code[pos++]}); + public String nextU4HexString(){ + return Util.byteToHexString(new byte[]{code[pos++],code[pos++],code[pos++],code[pos++]}); } - public String nextU4HexString() { - return Util.byteToHexString(new byte[]{code[pos++], code[pos++], code[pos++], code[pos++]}); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = code[pos++]; + public byte[] getBytes(int length){ + if(pos+length >= code.length){ + throw new IndexOutOfBoundsException("not enough bytes!"); } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; + byte[] bytes = Arrays.copyOfRange(code,pos,pos+length); + pos += length; + return bytes; } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java index e9bfa54720..0c35bca807 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -4,8 +4,6 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; import com.coderising.jvm.constant.*; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; import java.io.UnsupportedEncodingException; @@ -28,10 +26,6 @@ public ClassFile parse(byte[] codes) { clzFile.setAccessFlag(parseAccessFlag(iterator)); clzFile.setClassIndex(parseClassIndex(iterator)); - parseInterfaces(iterator); - parseFields(clzFile,iterator); - parseMethods(clzFile,iterator); - return clzFile; } @@ -108,34 +102,8 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } } - System.out.println("Finished reading Constant pool "); return pool; } - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceCount = iter.nextU2Int(); - - System.out.println("interfaceCount:" + interfaceCount); - - // TODO : 如果实现了interface, 这里需要解析 - } - - private void parseFields(ClassFile clazzFile,ByteCodeIterator iterator){ - int fieldCount = iterator.nextU2Int(); - for (int i = 0 ;i fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool, m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool, m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool, m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool, m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand[] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand[] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand[] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } } diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java index cebef21fa3..08918c490c 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java @@ -25,16 +25,22 @@ public float evaluate() { if (token.isOperator()){ - while(!opStack.isEmpty() - && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(), f1,f2); - numStack.push(result); + if(opStack.isEmpty()){ + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + + } + opStack.push(token); } - opStack.push(token); } if(token.isNumber()){ numStack.push(new Float(token.getIntValue())); diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java index 2288e3bd29..d52ec73bd3 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -1,43 +1,35 @@ package com.coding.basic.stack.expr; -import java.util.ArrayList; import java.util.List; import java.util.Stack; public class InfixToPostfix { public static List convert(String expr) { - List inFixTokens = new TokenParser().parse(expr); - - List postFixTokens = new ArrayList<>(); - - Stack opStack = new Stack(); - for(Token token : inFixTokens){ - - if(token.isOperator()){ - - while(!opStack.isEmpty() - && !token.hasHigherPriority(opStack.peek())){ - postFixTokens.add(opStack.pop()); - - } - opStack.push(token); - + return null; + } + + public static void main(String[] args) { + Stack stack = new Stack(); + String expr = "1+((2+3)*4)-5"; + for(int i=0;i tokens = InfixToPostfix.convert("2+3"); - Assert.assertEquals("[2, 3, +]", tokens.toString()); - } - { - - List tokens = InfixToPostfix.convert("2+3*4"); - Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); - } - - { - - List tokens = InfixToPostfix.convert("2-3*4+5"); - Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); - } - } - -} diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java deleted file mode 100644 index 787c0d954d..0000000000 --- a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.jvm.test; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.engine.MiniJVM; - -public class MiniJVMTest { - - static final String PATH = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testMain() throws Exception{ - String[] classPaths = {PATH}; - MiniJVM jvm = new MiniJVM(); - jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); - - } - -} From e2181b2201d405ed031cadc3e575ba5b1bc1e546 Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Thu, 27 Apr 2017 17:12:50 +0800 Subject: [PATCH 336/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/queue/CircleQueue.java | 36 ++++++- .../com/coding/basic/queue/Josephus.java | 7 +- .../basic/queue/QueueWithTwoStacks.java | 17 +++- .../com/coderising/jvm/cmd/BiPushCmd.java | 8 ++ .../coderising/jvm/cmd/ByteCodeCommand.java | 4 +- .../com/coderising/jvm/cmd/GetFieldCmd.java | 8 +- .../coderising/jvm/cmd/GetStaticFieldCmd.java | 9 +- .../coderising/jvm/cmd/InvokeSpecialCmd.java | 9 +- .../coderising/jvm/cmd/InvokeVirtualCmd.java | 7 +- .../com/coderising/jvm/cmd/LdcCmd.java | 8 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 8 +- .../com/coderising/jvm/cmd/NoOperandCmd.java | 10 +- .../com/coderising/jvm/cmd/PutFieldCmd.java | 8 +- .../coderising/jvm/constant/ClassInfo.java | 5 + .../coderising/jvm/constant/ConstantInfo.java | 12 +++ .../coderising/jvm/constant/ConstantPool.java | 2 +- .../coderising/jvm/constant/FieldRefInfo.java | 5 + .../coderising/jvm/constant/FloatInfo.java | 6 ++ .../coderising/jvm/constant/IntegerInfo.java | 6 ++ .../jvm/constant/MethodRefInfo.java | 6 ++ .../jvm/constant/NameAndTypeInfo.java | 6 ++ .../jvm/constant/NullConstantInfo.java | 5 + .../coderising/jvm/constant/StringInfo.java | 6 ++ .../com/coderising/jvm/constant/UTF8Info.java | 5 + .../jvm/engine/ExecutionResult.java | 56 +++++++++++ .../coderising/jvm/engine/ExecutorEngine.java | 35 +++++++ .../com/coderising/jvm/engine/Heap.java | 39 ++++++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++++++++ .../com/coderising/jvm/engine/MethodArea.java | 68 +++++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 28 ++++++ .../com/coderising/jvm/engine/StackFrame.java | 95 +++++++++++++++++++ .../jvm/print/ClassFilePrinter.java | 2 +- .../jvm/print/ConstantPoolPrinter.java | 60 ++++++++++++ 33 files changed, 638 insertions(+), 19 deletions(-) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/engine/Heap.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/engine/JavaObject.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/engine/MethodArea.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/engine/MiniJVM.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/engine/StackFrame.java diff --git a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java index ff94d5e21a..82596ad296 100644 --- a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java +++ b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java @@ -1,5 +1,39 @@ package com.coding.basic.queue; -public class CircleQueue { +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return false; + + } + public int size() { + return -1; + } + + + + public void enQueue(E data) { + + } + + public E deQueue() { + return null; + } } diff --git a/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java index 9ff4187a53..0a483e878b 100644 --- a/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java +++ b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java @@ -3,10 +3,11 @@ import java.util.ArrayList; import java.util.List; + /** - * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), - * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 * @author liuxin * */ diff --git a/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java index 7a6a11a3e4..e43d094b49 100644 --- a/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java +++ b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java @@ -1,8 +1,15 @@ package com.coding.basic.queue; + import java.util.Stack; +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ public class QueueWithTwoStacks { - private Stack stack1; + private Stack stack1; private Stack stack2; @@ -12,16 +19,16 @@ public QueueWithTwoStacks() { } - + public boolean isEmpty() { - return false; + return false; } public int size() { - return -1; + return -1; } @@ -35,4 +42,6 @@ public E deQueue() { } + } + diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java index cd0fbd4848..1c4168903e 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java @@ -3,6 +3,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -17,6 +19,12 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java index 4006ca69e1..75324bccc8 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -6,6 +6,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public abstract class ByteCodeCommand { @@ -124,5 +126,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java index 2e6061edd2..7b16cc6243 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -16,7 +18,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java index e6cf9d5960..eaf0ec1562 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -5,6 +5,8 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -19,5 +21,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java index ac228d0e4d..c746056c70 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -3,6 +3,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -17,7 +19,12 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java index c15d827797..46807110fe 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -15,7 +17,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java index ffb66f811c..ea483169cf 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java @@ -4,6 +4,8 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -26,4 +28,10 @@ public String toString(ConstantPool pool) { } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java index 33813b5d59..2d7a2558c5 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -14,6 +16,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java index 56c28fefe2..e9d27995d7 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -13,11 +15,15 @@ public NoOperandCmd(ClassFile clzFile, String opCode) { public String toString(ConstantPool pool) { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } - - public int getLength(){ return 1; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO Auto-generated method stub + + } + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java index 85bb369c19..2918d3dcdc 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -14,6 +16,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java index e12b3e164e..2896ae38bd 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java @@ -21,4 +21,9 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java index a3a0b53b76..05639417c7 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java @@ -27,4 +27,16 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java index 0e940b78d0..805de5cd39 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java index 7ff9d5fb77..4e5ca460c7 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,4 +51,9 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java index dc3765720c..dc970c5dcb 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java @@ -23,4 +23,10 @@ public float getValue() { public void setValue(float value) { this.value = value; } + + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java index 06e66c6e08..1c5202a9e9 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java @@ -23,6 +23,12 @@ public int getValue() { public void setValue(int value) { this.value = value; } + + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java index 0feffa65b5..5ceaaaa1a3 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java @@ -49,6 +49,12 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + visitor.visitMethodRef(this); + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java index dcac7f97c4..d47b0b5b15 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,10 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java index fa90d110fe..64626490df 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,10 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java index d01065fd53..b07e783aa1 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java index b7407d146f..3f239c8b99 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java @@ -26,6 +26,11 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + visitor.visistUTF8(this); + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutionResult.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..87ae484b01 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..52e40ce079 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,35 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/Heap.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..7df6548625 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/JavaObject.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..be6d3470be --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/MethodArea.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..64bf6c4c2a --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,68 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/MiniJVM.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..9b7e92ebdc --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java b/group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java index 14407bacbe..1786b7f4f4 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java @@ -40,7 +40,7 @@ public void print(){ } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "E:\\MyGit\\coding2017\\group27\\383117348\\bin"; ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); String className = "com.coderising.jvm.test.EmployeeV1"; diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java b/group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java index 028161adc7..412f4c8651 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -18,7 +18,67 @@ public void print(){ System.out.println("Constant Pool:"); + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + for(int i=1; i<=pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } } From cdc61e654dc20037661aec13bdca63adc4c92c6e Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Thu, 27 Apr 2017 17:40:28 +0800 Subject: [PATCH 337/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataStructure/stack/expr/Calculator.java | 23 ++++ .../dataStructure/stack/expr/InfixExpr.java | 38 ++----- .../stack/expr/InfixToPostfix.java | 23 +++- .../dataStructure/stack/expr/PostfixExpr.java | 31 +++++- .../dataStructure/stack/expr/PrefixExpr.java | 12 +- .../dataStructure/stack/expr/TokenParser.java | 6 +- .../test/java/data_structure/ExprTest.java | 103 ++++++++++++++++++ .../java/data_structure/InfixExprTest.java | 54 --------- .../java/data_structure/PostfixExprTest.java | 38 ------- .../java/data_structure/PrefixExprTest.java | 46 -------- 10 files changed, 194 insertions(+), 180 deletions(-) create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Calculator.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/InfixExprTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/PostfixExprTest.java delete mode 100644 group24/75939388/learning2017/src/test/java/data_structure/PrefixExprTest.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Calculator.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Calculator.java new file mode 100644 index 0000000000..fe6510b532 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Calculator.java @@ -0,0 +1,23 @@ +package basic.dataStructure.stack.expr; + +/** + * @author : 温友朝 + * @date : 2017/4/27 + */ +public class Calculator { + public static float getFloat(float val1, float val2, String oper) { + float res = 0l; + if (oper.equals("*")) { + res = val1 * val2; + } else if (oper.equals("+")) { + res = val1 + val2; + } else if (oper.equals("-")) { + res = val1 - val2; + } else { + if (val2 == 0) throw new RuntimeException("cannot divide 0, calculation canceled"); + res = val1 / val2; + } +// System.out.println("计算结果: " + val1 + oper + val2 + "=" + res); + return res; + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java index 56a5810c68..c31fe35737 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixExpr.java @@ -12,9 +12,7 @@ public InfixExpr(String expr) { } public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - + List tokens = TokenParser.parse(expr); Stack numbers = new Stack(); Stack operators = new Stack(); @@ -32,11 +30,14 @@ public float evaluate() { //先计算 int opeSize = operators.size(); int numSize = numbers.size(); + + float val1 = ((Token) numbers.pop()).getFloatValue(); + float val2 = ((Token) numbers.pop()).getFloatValue(); if (numSize == 3 && opeSize == 2) { Token tmp = (Token) operators.pop(); if (tmp.hasHigherPriority((Token) operators.peek())) { //如果1+2*3,先计算numbers后两位 - numbers.push(new Token(Token.NUMBER, calculate(numbers, tmp) + "")); + numbers.push(new Token(Token.NUMBER, Calculator.getFloat(val1, val2, tmp.toString()) + "")); } else { //如果1*2+3,先计算numbers栈前两位 //先保存数字和运算符 @@ -45,7 +46,7 @@ public float evaluate() { //需要进行计算的运算符 Token oper = (Token) operators.pop(); - numbers.push(new Token(Token.NUMBER, calculate(numbers, oper) + "")); + numbers.push(new Token(Token.NUMBER, Calculator.getFloat(val1, val2, oper.toString()) + "")); numbers.push(new Token(Token.NUMBER, sNum + "")); operators.push(new Token(Token.OPERATOR, sOper.toString())); } @@ -53,33 +54,12 @@ public float evaluate() { } if (numbers.size() == 2 && operators.size() == 1) { - return calculate(numbers, (Token) operators.pop()); + float val1 = ((Token) numbers.pop()).getFloatValue(); + float val2 = ((Token) numbers.pop()).getFloatValue(); + return Calculator.getFloat(val1, val2, (operators.pop()).toString()); } else { throw new RuntimeException("last calculation exception, numbers.size=" + numbers.size() + ", operators.size=" + operators.size()); } } - private float calculate(Stack numbers, Token operator) { - Token token2 = (Token) numbers.pop(); - float val2 = token2.getFloatValue(); - - Token token1 = (Token) numbers.pop(); - float val1 = token1.getFloatValue(); - - String oper = operator.toString(); - float res = 0l; - if (oper.equals("*")) { - res = val1 * val2; - } else if (oper.equals("+")) { - res = val1 + val2; - } else if (oper.equals("-")) { - res = val1 - val2; - } else { - if (val2 == 0) throw new RuntimeException("cannot divide 0, calculation canceled"); - res = val1 / val2; - } -// System.out.println("计算结果: " + val1 + oper + val2 + "=" + res); - return res; - } - } diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java index c2b2934df3..5ad70ddb22 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java @@ -8,10 +8,27 @@ public class InfixToPostfix { public static List convert(String expr) { - + //括号问题 + if(!(has(expr, "(") && has(expr, ")") && hasPair(expr, "(", ")"))){ + throw new RuntimeException("brackets are not in pair"); + } + return null; } - - + + private static boolean hasPair(String expr, String sym1, String sym2){ + int leftBracketIndex = expr.indexOf(sym1); + int rightBracketIndex = expr.indexOf(sym2); + String subStr = expr.substring(leftBracketIndex, rightBracketIndex + 1); + + } + + private static boolean has(String expr, String sym){ + return expr.indexOf(sym) > 0; + } + + public static void main(String[] args){ + convert("(2+3)*2"); + } } diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java index bfc1daf5ed..cfbd67c5bf 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PostfixExpr.java @@ -1,17 +1,42 @@ package basic.dataStructure.stack.expr; +import basic.dataStructure.stack.Stack; + +import java.util.List; + /** * 后序表达式 */ public class PostfixExpr { -String expr = null; - + String expr = null; + + /** + * 23*21-/341-*+ + */ public PostfixExpr(String expr) { this.expr = expr; } public float evaluate() { - return 0.0f; + List tokens = TokenParser.parse(expr); + + Stack numbers = new Stack(); + Stack opers = new Stack(); + + for(Token t : tokens){ + if(t.isNumber()) numbers.push(t); + if(t.isOperator()) opers.push(t); + + if(opers.size() == 1){ + float num1 = ((Token)numbers.pop()).getFloatValue(); + float num2 = ((Token)numbers.pop()).getFloatValue(); + String oper = (opers.pop()).toString(); + float res = Calculator.getFloat(num1, num2, oper); + numbers.push(new Token(Token.NUMBER, res + "")); + } + } + + return ((Token) numbers.pop()).getFloatValue(); } diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java index 1357e78871..0f85c42f47 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/PrefixExpr.java @@ -1,18 +1,22 @@ package basic.dataStructure.stack.expr; +import org.apache.commons.lang3.StringUtils; + /** * 前序表达式 */ public class PrefixExpr { String expr = null; - + + /** + * +/*23-21*3-41 + * @param expr + */ public PrefixExpr(String expr) { this.expr = expr; } public float evaluate() { - return 0.0f; + return new PostfixExpr(StringUtils.reverse(expr)).evaluate(); } - - } diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java index 41e5ab1da6..f66d1b5d5a 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java @@ -6,7 +6,7 @@ public class TokenParser { - public List parse(String expr) { + public static List parse(String expr) { List tokens = new ArrayList(); int i = 0; @@ -38,7 +38,7 @@ public List parse(String expr) { return tokens; } - private int indexOfNextOperator(int i, String expr) { + private static int indexOfNextOperator(int i, String expr) { while (Character.isDigit(expr.charAt(i))) { i++; @@ -50,7 +50,7 @@ private int indexOfNextOperator(int i, String expr) { } - private boolean isOperator(char c) { + private static boolean isOperator(char c) { String sc = String.valueOf(c); return Token.OPERATORS.contains(sc); } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java new file mode 100644 index 0000000000..1064cb2839 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java @@ -0,0 +1,103 @@ +package data_structure; + +import basic.dataStructure.stack.expr.InfixExpr; +import basic.dataStructure.stack.expr.PostfixExpr; +import basic.dataStructure.stack.expr.PrefixExpr; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author : 温友朝 + * @date : 2017/4/27 + */ +public class ExprTest { + + + @Test + public void testInfixEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + +// { +// InfixExpr expr = new InfixExpr("2+3*4+5"); +// Assert.assertEquals(19.0, expr.evaluate(), 0.001f); +// } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + } + + + @Test + public void testPostfixEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + + @Test + public void testPrefixEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + } + + @Test + public void textInfixToPostfixExpr(){ + { + //9+(3-1)*3+10/2 = 9 3 1-3*+ 10 2/+ + + } + { + //10-2*3+50 = 10 2 3 * - 50 + + + } + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/InfixExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/InfixExprTest.java deleted file mode 100644 index afdb5e27a1..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/InfixExprTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package data_structure; - -import basic.dataStructure.stack.expr.InfixExpr; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - -// { -// InfixExpr expr = new InfixExpr("2+3*4+5"); -// Assert.assertEquals(19.0, expr.evaluate(), 0.001f); -// } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("10-2*3+50"); - Assert.assertEquals(54, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/PostfixExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/PostfixExprTest.java deleted file mode 100644 index 59331c4669..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/PostfixExprTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package data_structure; - -import basic.dataStructure.stack.expr.PostfixExpr; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/PrefixExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/PrefixExprTest.java deleted file mode 100644 index 414a14713c..0000000000 --- a/group24/75939388/learning2017/src/test/java/data_structure/PrefixExprTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package data_structure; - -import basic.dataStructure.stack.expr.PrefixExpr; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} From 714956c1b4d376d48c7ca8c8dde13577de3abc35 Mon Sep 17 00:00:00 2001 From: Andy <14703250@qq.com> Date: Thu, 27 Apr 2017 20:13:45 +0800 Subject: [PATCH 338/552] Delete description.html --- .../275150374Learning/.idea/description.html | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 group01/275150374/275150374Learning/.idea/description.html diff --git a/group01/275150374/275150374Learning/.idea/description.html b/group01/275150374/275150374Learning/.idea/description.html deleted file mode 100644 index 0f928c44a1..0000000000 --- a/group01/275150374/275150374Learning/.idea/description.html +++ /dev/null @@ -1,15 +0,0 @@ -Simple Java application that includes a class with main() method \ No newline at end of file From bda8a386dae79e675bec7665a7a3187835ad78f3 Mon Sep 17 00:00:00 2001 From: zheng <765324639@qq.com> Date: Thu, 27 Apr 2017 22:02:32 +0800 Subject: [PATCH 339/552] Revert "Revert "update"" --- .../275150374Learning/.idea/description.html | 16 +- .../basic/linklist/LRUPageFrame.java | 245 +++++ .../basic/linklist/LRUPageFrameTest.java | 29 + .../coding2017/basic/linklist/LinkedList.java | 290 ++++++ .../coding2017/basic/queue/CircleQueue.java | 50 + .../coding2017/basic/queue/Josephus.java | 40 + .../basic/queue/QueueWithTwoStacks.java | 42 + .../coding2017/basic/stack/Stack.java | 49 + .../coding2017/basic/stack/StackUtil.java | 102 ++ .../basic/stack/expr/InfixExpr.java | 95 ++ .../basic/stack/expr/InfixExprTest.java | 55 ++ .../basic/stack/expr/PostfixExpr.java | 81 ++ .../basic/stack/expr/PostfixExprTest.java | 35 + .../basic/stack/expr/PrefixExpr.java | 68 ++ .../basic/stack/expr/PrefixExprTest.java | 42 + .../coding2017/jvm/attr/AttributeInfo.java | 19 + .../coding2017/jvm/attr/CodeAttr.java | 93 ++ .../coding2017/jvm/attr/LineNumberTable.java | 40 + .../jvm/attr/LocalVariableItem.java | 39 + .../jvm/attr/LocalVariableTable.java | 49 + .../coding2017/jvm/attr/StackMapTable.java | 28 + .../coding2017/jvm/clz/AccessFlag.java | 24 + .../coding2017/jvm/clz/ClassFile.java | 91 ++ .../coding2017/jvm/clz/ClassIndex.java | 19 + .../coding2017/jvm/cmd/BiPushCmd.java | 23 + .../coding2017/jvm/cmd/ByteCodeCommand.java | 128 +++ .../coding2017/jvm/cmd/CommandParser.java | 85 ++ .../coding2017/jvm/cmd/GetFieldCmd.java | 22 + .../coding2017/jvm/cmd/GetStaticFieldCmd.java | 23 + .../coding2017/jvm/cmd/InvokeSpecialCmd.java | 23 + .../coding2017/jvm/cmd/InvokeVirtualCmd.java | 22 + .../orajavac/coding2017/jvm/cmd/LdcCmd.java | 29 + .../coding2017/jvm/cmd/NewObjectCmd.java | 19 + .../coding2017/jvm/cmd/NoOperandCmd.java | 23 + .../coding2017/jvm/cmd/OneOperandCmd.java | 27 + .../coding2017/jvm/cmd/PutFieldCmd.java | 19 + .../coding2017/jvm/cmd/TwoOperandCmd.java | 67 ++ .../coding2017/jvm/constant/ClassInfo.java | 30 + .../coding2017/jvm/constant/ConstantInfo.java | 40 + .../coding2017/jvm/constant/ConstantPool.java | 28 + .../coding2017/jvm/constant/FieldRefInfo.java | 60 ++ .../jvm/constant/MethodRefInfo.java | 59 ++ .../jvm/constant/NameAndTypeInfo.java | 51 + .../jvm/constant/NullConstantInfo.java | 19 + .../coding2017/jvm/constant/StringInfo.java | 30 + .../coding2017/jvm/constant/UTF8Info.java | 35 + .../orajavac/coding2017/jvm/field/Field.java | 50 + .../jvm/loader/ByteCodeIterator.java | 56 ++ .../jvm/loader/ClassFileLoader.java | 131 +++ .../jvm/loader/ClassFileParser.java | 139 +++ .../orajavac/coding2017/jvm/loader/test.java | 21 + .../coding2017/jvm/method/Method.java | 85 ++ .../jvm/print/ClassFilePrinter.java | 53 ++ .../jvm/print/ConstantPoolPrinter.java | 60 ++ .../jvm/test/ClassFileloaderTest.java | 264 ++++++ .../coding2017/jvm/test/EmployeeV1.java | 26 + .../orajavac/coding2017/jvm/util/Util.java | 50 + group02/727171008/.classpath | 1 + .../HarryHook/coding2017/array/ArrayUtil.java | 561 +++++------ .../coding2017/array/ArrayUtilTest.java | 291 +++--- .../coding2017/basic/ArrayListTest.java | 14 +- .../coding2017/basic/BinaryTreeNode.java | 202 ++-- .../coding2017/basic/BinaryTreeNodeTest.java | 55 +- .../HarryHook/coding2017/basic/Iterator.java | 8 +- .../coding2017/basic/LinkedListTest.java | 631 ++++++------- .../HarryHook/coding2017/basic/List.java | 22 +- .../HarryHook/coding2017/basic/ListTest.java | 212 ++--- .../coding2017/basic/MyArrayList.java | 279 +++--- .../coding2017/basic/MyLinkedList.java | 886 ++++++++---------- .../HarryHook/coding2017/basic/MyQueue.java | 78 +- .../HarryHook/coding2017/basic/MyStack.java | 83 +- .../HarryHook/coding2017/basic/QueueTest.java | 46 +- .../HarryHook/coding2017/basic/StackTest.java | 54 +- .../coding2017/download/DownloadThread.java | 76 +- .../coding2017/download/FileDownloader.java | 153 ++- .../download/FileDownloaderTest.java | 84 +- .../coding2017/download/api/Connection.java | 40 +- .../download/api/ConnectionManager.java | 13 +- .../download/impl/ConnectionImpl.java | 94 +- .../download/impl/ConnectionManagerImpl.java | 8 +- .../coding2017/jvm/attr/AttributeInfo.java | 19 + .../coding2017/jvm/attr/CodeAttr.java | 111 +++ .../coding2017/jvm/attr/LineNumberTable.java | 69 ++ .../jvm/attr/LocalVariableItem.java | 49 + .../jvm/attr/LocalVariableTable.java | 51 + .../coding2017/jvm/attr/StackMapTable.java | 29 + .../coding2017/jvm/clz/AccessFlag.java | 26 + .../coding2017/jvm/clz/ClassFile.java | 133 +++ .../coding2017/jvm/clz/ClassIndex.java | 22 + .../coding2017/jvm/cmd/BiPushCmd.java | 23 + .../coding2017/jvm/cmd/ByteCodeCommand.java | 128 +++ .../coding2017/jvm/cmd/CommandParser.java | 155 +++ .../coding2017/jvm/cmd/GetFieldCmd.java | 18 + .../coding2017/jvm/cmd/GetStaticFieldCmd.java | 24 + .../coding2017/jvm/cmd/InvokeSpecialCmd.java | 23 + .../coding2017/jvm/cmd/InvokeVirtualCmd.java | 21 + .../HarryHook/coding2017/jvm/cmd/LdcCmd.java | 29 + .../coding2017/jvm/cmd/NewObjectCmd.java | 19 + .../coding2017/jvm/cmd/NoOperandCmd.java | 23 + .../coding2017/jvm/cmd/OneOperandCmd.java | 27 + .../coding2017/jvm/cmd/PutFieldCmd.java | 19 + .../coding2017/jvm/cmd/TwoOperandCmd.java | 67 ++ .../coding2017/jvm/constant/ClassInfo.java | 32 + .../coding2017/jvm/constant/ConstantInfo.java | 43 + .../coding2017/jvm/constant/ConstantPool.java | 31 + .../coding2017/jvm/constant/FieldRefInfo.java | 63 ++ .../jvm/constant/MethodRefInfo.java | 62 ++ .../jvm/constant/NameAndTypeInfo.java | 54 ++ .../jvm/constant/NullConstantInfo.java | 19 + .../coding2017/jvm/constant/StringInfo.java | 33 + .../coding2017/jvm/constant/UTF8Info.java | 42 + .../HarryHook/coding2017/jvm/field/Field.java | 44 + .../jvm/loader/ByteCodeIterator.java | 58 ++ .../jvm/loader/ClassFileLoader.java | 92 ++ .../jvm/loader/ClassFileParser.java | 151 +++ .../coding2017/jvm/method/Method.java | 87 ++ .../jvm/print/ClassFilePrinter.java | 51 + .../jvm/print/ConstantPoolPrinter.java | 25 + .../jvm/test/ClassFileloaderTest.java | 342 +++++++ .../coding2017/jvm/test/EmployeeV1.java | 30 + .../HarryHook/coding2017/jvm/util/Util.java | 22 + .../coding2017/linklist/LRUPageFrame.java | 125 +++ .../coding2017/linklist/LRUPageFrameTest.java | 34 + .../coding2017/litestruts/Configuration.java | 157 ++-- .../litestruts/ConfigurationException.java | 21 +- .../litestruts/ConfigurationTest.java | 67 +- .../coding2017/litestruts/LoginAction.java | 35 +- .../coding2017/litestruts/ReflectionUtil.java | 112 ++- .../litestruts/ReflectionUtilTest.java | 177 ++-- .../coding2017/litestruts/Struts.java | 42 +- .../coding2017/litestruts/StrutsTest.java | 68 +- .../HarryHook/coding2017/litestruts/View.java | 53 +- .../coding2017/queue/CircleQueue.java | 38 + .../HarryHook/coding2017/queue/Josephus.java | 18 + .../coding2017/queue/JosephusTest.java | 25 + .../HarryHook/coding2017/queue/Queue.java | 55 ++ .../coding2017/queue/QueueWithTwoStacks.java | 37 + .../HarryHook/coding2017/stack/StackUtil.java | 138 +++ .../coding2017/stack/StackUtilTest.java | 78 ++ .../coding2017/stack/expr/InfixExpr.java | 103 ++ .../coding2017/stack/expr/InfixExprTest.java | 47 + .../coding2017/stack/expr/InfixToPostfix.java | 53 ++ .../coding2017/stack/expr/PostfixExpr.java | 54 ++ .../stack/expr/PostfixExprTest.java | 37 + .../coding2017/stack/expr/PrefixExpr.java | 58 ++ .../coding2017/stack/expr/PrefixExprTest.java | 43 + .../coding2017/stack/expr/Token.java | 50 + .../coding2017/stack/expr/TokenParser.java | 56 ++ .../stack/expr/TokenParserTest.java | 39 + group02/812350401/.gitignore | 5 +- group02/812350401/pom.xml | 26 + .../miniyk2012/coding2017/basic/Stack.java | 25 - .../basic/linklist/LRUPageFrame.java | 148 +++ .../basic/linklist/LRUPageFrameTest.java | 62 ++ .../coding2017/basic/stack/Stack.java | 43 + .../coding2017/basic/stack/StackUtil.java | 158 ++++ .../basic/stack/expr/InfixExpr.java | 134 +++ .../basic/stack/expr/InfixExprTest.java | 52 + .../coderising/jvm/clz/AccessFlag.java | 25 + .../coderising/jvm/clz/ClassFile.java | 73 ++ .../coderising/jvm/clz/ClassIndex.java | 19 + .../coderising/jvm/constant/ClassInfo.java | 24 + .../coderising/jvm/constant/ConstantInfo.java | 29 + .../coderising/jvm/constant/ConstantPool.java | 31 + .../coderising/jvm/constant/FieldRefInfo.java | 53 ++ .../jvm/constant/MethodRefInfo.java | 56 ++ .../jvm/constant/NameAndTypeInfo.java | 47 + .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 + .../coderising/jvm/constant/UTF8Info.java | 30 + .../jvm/loader/ByteCodeIterator.java | 79 ++ .../jvm/loader/ClassFileLoader.java | 89 ++ .../jvm/loader/ClassFileParser.java | 112 +++ .../jvm/test/ClassFileloaderTest.java | 176 ++++ .../coderising/jvm/test/EmployeeV1.java | 28 + .../coding2017/coderising/jvm/util/Util.java | 26 + .../coderising/litestruts/Struts.java | 26 +- .../coding2017/jvm/test/EmployeeV1.class | Bin 0 -> 1056 bytes .../struts}/struts.xml | 0 .../miniyk2012/coding2017/basic/ListTest.java | 6 + .../basic/{ => stack}/StackTest.java | 4 +- .../coding2017/basic/stack/StackUtilTest.java | 86 ++ .../download/FileDownloaderTest.java | 13 +- .../jvm/loader/ClassFileParserTest.java | 53 ++ .../coderising/litestruts/StrutsTest.java | 8 +- .../coderising/jvm/attr/AttributeInfo.java | 76 ++ .../src/com/coderising/jvm/attr/CodeAttr.java | 103 ++ .../jvm/attr/ConstantValueAttr.java | 30 + .../coderising/jvm/attr/LineNumberTable.java | 60 ++ .../jvm/attr/LocalVariableItem.java | 40 + .../jvm/attr/LocalVariableTable.java | 47 + .../coderising/jvm/attr/StackMapTable.java | 36 + .../com/coderising/jvm/clz/AccessFlag.java | 24 + .../src/com/coderising/jvm/clz/ClassFile.java | 120 +++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../src/com/coderising/jvm/cmd/BiPushCmd.java | 21 + .../coderising/jvm/cmd/ByteCodeCommand.java | 125 +++ .../com/coderising/jvm/cmd/CommandParser.java | 155 +++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 21 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 19 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 21 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 21 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 + .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 + .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 + .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 65 ++ .../coderising/jvm/constant/ClassInfo.java | 29 + .../coderising/jvm/constant/ConstantInfo.java | 41 + .../coderising/jvm/constant/ConstantPool.java | 46 + .../coderising/jvm/constant/FieldRefInfo.java | 59 ++ .../jvm/constant/MethodRefInfo.java | 61 ++ .../jvm/constant/NameAndTypeInfo.java | 50 + .../jvm/constant/NullConstantInfo.java | 17 + .../coderising/jvm/constant/StringInfo.java | 32 + .../com/coderising/jvm/constant/UTF8Info.java | 34 + .../exception/AddAnotherParserException.java | 10 + .../exception/NoNextByteCodeException.java | 10 + .../jvm/exception/NotAClassFileException.java | 11 + .../src/com/coderising/jvm/field/Field.java | 65 ++ .../jvm/loader/ByteCodeIterator.java | 113 +++ .../jvm/loader/ClassFileLoader.java | 14 +- .../jvm/loader/ClassFileParser.java | 154 +++ .../src/com/coderising/jvm/method/Method.java | 77 ++ .../jvm/print/ClassFilePrinter.java | 52 + .../jvm/print/ConstantPoolPrinter.java | 112 +++ .../Util.java} | 26 +- .../src/com/coding/basic/BinaryTree.java | 10 +- .../src/com/coding/basic/BinaryTreeNode.java | 74 +- .../src/com/coding/basic/Iterator.java | 16 +- .../zj-2017/src/com/coding/basic/List.java | 18 +- .../zj-2017/src/com/coding/basic/Queue.java | 8 +- .../zj-2017/src/com/coding/basic/Stack.java | 30 - .../src/com/coding/basic/array/ArrayList.java | 37 +- .../src/com/coding/basic/array/ArrayUtil.java | 10 +- .../com/coding/basic/linklist/LinkedList.java | 71 +- .../src/com/coding/basic/stack/Stack.java | 46 + .../src/com/coding/basic/stack/StackUtil.java | 158 ++++ .../coding/basic/stack/expr/InfixExpr.java | 120 +++ .../coding/basic/stack/expr/PostfixExpr.java | 46 + .../coding/basic/stack/expr/PrefixExpr.java | 47 + .../basic/stack/expr/util/ExprIterator.java | 31 + .../basic/stack/expr/util/FixExprUtil.java | 174 ++++ .../basic/stack/expr/util/Operator.java | 70 ++ .../coderising/jvm/ClassFileloaderTest.java | 349 +++++++ .../test/com/coderising/jvm/EmployeeV1.java | 28 + .../test/com/coding/basic/BinaryTreeTest.java | 117 +-- .../src/test/com/coding/basic/QueueTest.java | 128 +-- .../com/coding/basic/array/ArrayListTest.java | 4 +- .../com/coding/basic/array/ArrayUtilTest.java | 2 +- .../coding/basic/linklist/LinkedListTest.java | 14 +- .../coding/basic/{ => stack}/StackTest.java | 152 +-- .../com/coding/basic/stack/StackUtilTest.java | 95 ++ .../basic/stack/expr/InfixExprTest.java | 48 + .../basic/stack/expr/PostfixExprTest.java | 38 + .../basic/stack/expr/PrefixExprTest.java | 46 + .../structure/week2/ArrayUtilTest.java | 1 - .../247565311/structure/week6/StackUtil.java | 40 +- .../structure/week6/StackUtilTest.java | 7 +- .../247565311/structure/week7/InfixExpr.java | 93 +- .../structure/week7/InfixExprTest.java | 112 ++- .../week567_miniJVM/attr/AttrFactory.java | 80 ++ .../week567_miniJVM/attr/AttributeInfo.java | 19 +- .../week567_miniJVM/attr/CodeAttr.java | 53 +- .../week567_miniJVM/attr/LineNumberTable.java | 18 +- .../attr/LocalVariableItem.java | 7 + .../attr/LocalVariableTable.java | 6 +- .../week567_miniJVM/attr/StackMapTable.java | 2 +- .../week567_miniJVM/clz/ClassFile.java | 76 +- .../constant/ConstantPool.java | 6 - .../week567_miniJVM/constant/InfoFactory.java | 54 ++ .../week567_miniJVM/constant/UTF8Info.java | 3 - .../week567_miniJVM/field/Field.java | 33 +- .../loader/ByteCodeIterator.java | 34 +- .../loader/ClassFileLoader.java | 24 +- .../{test => loader}/ClassFileLoaderTest.java | 44 +- .../loader/ClassFileParser.java | 105 ++- .../week567_miniJVM/method/Method.java | 47 +- .../week567_miniJVM/test/EmployeeV1.java | 15 +- .../247565311/week567_miniJVM/util/Util.java | 3 - .../main/java/com/zhaogd/array/ArrayList.java | 9 +- .../coding/basic/stack/StackUtil.java | 14 +- .../coding/basic/stack/expr/InfixExpr.java | 96 +- .../coding/basic/stack/expr/InfixExprS.java | 102 ++ .../basic/stack/expr/InfixExprTest.java | 42 +- .../basic/stack/expr/InfixToPostfix.java | 51 + .../coding/basic/stack/expr/PostfixExpr.java | 51 + .../basic/stack/expr/PostfixExprTest.java | 41 + .../coding/basic/stack/expr/PrefixExpr.java | 56 ++ .../basic/stack/expr/PrefixExprTest.java | 45 + .../coding/basic/stack/expr/TParser.java | 85 ++ .../coding/basic/stack/expr/Token.java | 77 ++ .../coding/basic/stack/expr/TokenParser.java | 57 ++ .../basic/stack/expr/TokenParserTest.java | 66 ++ group12/382266293/src/array/ArrayUtil.java | 256 ++--- .../382266293/src/array/ArrayUtilTest.java | 140 +-- .../coderising/download/DownloadThread.java | 23 +- .../com/coderising/download/DownloadUtil.java | 34 +- .../coderising/download/FileDownloader.java | 98 +- .../download/FileDownloaderTest.java | 12 +- .../coderising/download/api/Connection.java | 30 +- .../download/impl/ConnectionImpl.java | 52 +- .../download/impl/ConnectionManagerImpl.java | 18 +- .../download/impl/DownloadUtil.java | 8 +- .../src/com/coderising/jvm/attr/CodeAttr.java | 95 +- .../coderising/jvm/attr/LineNumberTable.java | 50 +- .../jvm/attr/LocalVariableItem.java | 30 +- .../jvm/attr/LocalVariableTable.java | 57 +- .../coderising/jvm/attr/StackMapTable.java | 12 +- .../com/coderising/jvm/clz/AccessFlag.java | 18 +- .../src/com/coderising/jvm/clz/ClassFile.java | 108 ++- .../com/coderising/jvm/clz/ClassIndex.java | 16 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 + .../coderising/jvm/cmd/ByteCodeCommand.java | 128 +++ .../com/coderising/jvm/cmd/CommandParser.java | 179 ++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 + .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 + .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 + .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 ++ .../coderising/jvm/constant/ClassInfo.java | 23 +- .../coderising/jvm/constant/ConstantInfo.java | 12 +- .../coderising/jvm/constant/ConstantPool.java | 11 +- .../coderising/jvm/constant/FieldRefInfo.java | 55 +- .../jvm/constant/MethodRefInfo.java | 51 +- .../jvm/constant/NameAndTypeInfo.java | 33 +- .../jvm/constant/NullConstantInfo.java | 11 + .../coderising/jvm/constant/StringInfo.java | 18 +- .../com/coderising/jvm/constant/UTF8Info.java | 24 +- .../src/com/coderising/jvm/field/Field.java | 42 +- .../jvm/loader/ByteCodeIterator.java | 68 +- .../jvm/loader/ClassFileLoader.java | 72 +- .../jvm/loader/ClassFileParser.java | 74 +- .../src/com/coderising/jvm/method/Method.java | 85 +- .../jvm/print/ClassFilePrinter.java | 52 + .../jvm/print/ConstantPoolPrinter.java | 92 ++ .../coderising/jvm/print/PrintVisitor.java | 23 + .../jvm/test/ClassFileloaderTest.java | 219 +++-- .../com/coderising/jvm/test/EmployeeV1.java | 48 +- .../src/com/coderising/jvm/util/Util.java | 10 +- .../coderising/litestruts/LoginAction.java | 24 +- .../src/litestruts/ActionXMLreader.java | 1 + .../src/litestruts/Configuration.java | 110 +-- group12/382266293/src/litestruts/Struts.java | 100 +- .../382266293/src/litestruts/StrutsTest.java | 20 +- group12/382266293/src/litestruts/View.java | 8 +- group12/382266293/src/test.java | 59 +- .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 56 ++ .../coderising/jvm/attr/LineNumberTable.java | 42 + .../jvm/attr/LocalVariableItem.java | 39 + .../jvm/attr/LocalVariableTable.java | 28 + .../coderising/jvm/attr/StackMapTable.java | 30 + .../src/com/coderising/jvm/field/Field.java | 33 + .../jvm/loader/ByteCodeIterator.java | 54 +- .../jvm/loader/ClassFileLoader.java | 2 +- .../jvm/loader/ClassFileParser.java | 117 ++- .../src/com/coderising/jvm/method/Method.java | 57 ++ .../jvm/test/ClassFileloaderTest.java | 9 +- .../datastructure/linklist/LRUPageFrame.java | 144 --- .../com/datastructure/stack/StackUtil.java | 53 +- .../datastructure/stack/StackUtilTest.java | 80 ++ .../datastructure/stack/expr/InfixExpr.java | 67 ++ .../stack/expr/InfixExprTest.java | 51 + .../src/task7/expr/InfixExpr.java | 79 ++ .../src/task7/expr/InfixExprTest.java | 56 ++ .../src/task7/expr/PostfixExpr.java | 45 + .../src/task7/expr/PostfixExprTest.java | 37 + .../src/task7/expr/PrefixExpr.java | 47 + .../src/task7/expr/PrefixExprTest.java | 44 + .../1507_977996067/src/task7/expr/Token.java | 53 ++ .../src/task7/expr/TokenParser.java | 57 ++ .../src/task7/jvm/attr/AttributeInfo.java | 19 + .../src/task7/jvm/attr/CodeAttr.java | 120 +++ .../src/task7/jvm/attr/LineNumberTable.java | 72 ++ .../src/task7/jvm/attr/LocalVariableItem.java | 39 + .../task7/jvm/attr/LocalVariableTable.java | 57 ++ .../src/task7/jvm/attr/StackMapTable.java | 30 + .../src/task7/jvm/clz/AccessFlag.java | 25 + .../src/task7/jvm/clz/ClassFile.java | 134 +++ .../src/task7/jvm/clz/ClassIndex.java | 19 + .../src/task7/jvm/cmd/BiPushCmd.java | 23 + .../src/task7/jvm/cmd/ByteCodeCommand.java | 128 +++ .../src/task7/jvm/cmd/CommandParser.java | 124 +++ .../src/task7/jvm/cmd/GetFieldCmd.java | 22 + .../src/task7/jvm/cmd/GetStaticFieldCmd.java | 23 + .../src/task7/jvm/cmd/InvokeSpecialCmd.java | 23 + .../src/task7/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/task7/jvm/cmd/LdcCmd.java | 29 + .../src/task7/jvm/cmd/NewObjectCmd.java | 19 + .../src/task7/jvm/cmd/NoOperandCmd.java | 23 + .../src/task7/jvm/cmd/OneOperandCmd.java | 27 + .../src/task7/jvm/cmd/PutFieldCmd.java | 19 + .../src/task7/jvm/cmd/TwoOperandCmd.java | 67 ++ .../src/task7/jvm/constant/ClassInfo.java | 31 + .../src/task7/jvm/constant/ConstantInfo.java | 35 + .../src/task7/jvm/constant/ConstantPool.java | 37 + .../src/task7/jvm/constant/FieldRefInfo.java | 65 ++ .../src/task7/jvm/constant/MethodRefInfo.java | 65 ++ .../task7/jvm/constant/NameAndTypeInfo.java | 56 ++ .../task7/jvm/constant/NullConstantInfo.java | 21 + .../src/task7/jvm/constant/StringInfo.java | 35 + .../src/task7/jvm/constant/UTF8Info.java | 45 + .../src/task7/jvm/field/Field.java | 48 + .../task7/jvm/loader/ByteCodeIterator.java | 56 ++ .../src/task7/jvm/loader/ClassFileLoader.java | 122 +++ .../src/task7/jvm/loader/ClassFileParser.java | 112 +++ .../src/task7/jvm/method/Method.java | 91 ++ .../src/task7/jvm/print/ClassFilePrinter.java | 44 + .../task7/jvm/print/ConstantInfoVisitor.java | 18 + .../jvm/print/ConstantInfoVisitorImpl.java | 51 + .../task7/jvm/print/ConstantPoolPrinter.java | 26 + .../task7/jvm/test/ClassFileloaderTest.java | 191 ++++ .../src/task7/jvm/test/EmployeeV1.java | 29 + .../src/task7/jvm/util/Util.java | 23 + group15/1512_656512403/.idea/description.html | 16 +- group17/102228177/work2_26/.classpath | 16 +- .../src/com/coderising/array/ArrayUtil.java | 19 +- .../jvm/loader/ClassFileLoader.java | 81 ++ .../jvm/test}/ClassFileloaderTest.java | 178 ++-- .../com/coderising/jvm/test}/EmployeeV1.java | 56 +- .../coding/basic/linklist/LRUPageFrame.java | 150 +++ .../basic/linklist/LRUPageFrameTest.java | 31 + .../src/com/coderising/data/LinkedList.java | 42 +- .../com/coderising/data/LinkedListTest.java | 7 +- .../coderising/download/DownloadThread.java | 2 +- .../coderising/download/FileDownloader.java | 2 +- .../download/FileDownloaderTest.java | 5 +- .../download/impl/ConnectionImpl.java | 2 +- .../download/impl/ConnectionManagerImpl.java | 2 +- .../com/coderising/jvm/clz/AccessFlag.java | 25 + .../src/com/coderising/jvm/clz/ClassFile.java | 150 +-- .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../coderising/jvm/constant/ClassInfo.java | 33 + .../coderising/jvm/constant/ConstantInfo.java | 38 + .../coderising/jvm/constant/ConstantPool.java | 39 + .../coderising/jvm/constant/FieldRefInfo.java | 54 ++ .../jvm/constant/MethodRefInfo.java | 55 ++ .../jvm/constant/NameAndTypeInfo.java | 45 + .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 + .../com/coderising/jvm/constant/UTF8Info.java | 32 + .../jvm/loader/ByteCodeIterator.java | 49 + .../jvm/loader/ClassFileLoader.java | 137 +++ .../jvm/loader/ClassFileParser.java | 115 +++ .../jvm/test/ClassFileloaderTest.java | 401 ++++---- .../com/coderising/jvm/test/EmployeeV1.java | 28 + .../src/com/coderising/jvm/util/Util.java | 24 + .../src/com/coding/basic/stack/ArrayList.java | 150 +++ .../src/com/coding/basic/stack/Iterator.java | 8 + .../src/com/coding/basic/stack/List.java | 10 + .../src/com/coding/basic/stack/Stack.java | 48 + .../src/com/coding/basic/stack/StackUtil.java | 112 +++ .../com/coding/basic/stack/StackUtilTest.java | 44 + .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 116 +++ .../coderising/jvm/attr/LineNumberTable.java | 68 ++ .../jvm/attr/LocalVariableItem.java | 39 + .../jvm/attr/LocalVariableTable.java | 58 ++ .../coderising/jvm/attr/StackMapTable.java | 30 + .../com/coderising/jvm/clz/AccessFlag.java | 25 + .../src/com/coderising/jvm/clz/ClassFile.java | 92 ++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../coderising/jvm/constant/ClassInfo.java | 33 + .../coderising/jvm/constant/ConstantInfo.java | 38 + .../coderising/jvm/constant/ConstantPool.java | 39 + .../coderising/jvm/constant/FieldRefInfo.java | 54 ++ .../jvm/constant/MethodRefInfo.java | 55 ++ .../jvm/constant/NameAndTypeInfo.java | 45 + .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 + .../com/coderising/jvm/constant/UTF8Info.java | 32 + .../src/com/coderising/jvm/field/Field.java | 45 + .../jvm/loader/ByteCodeIterator.java | 53 ++ .../jvm/loader/ClassFileLoader.java | 137 +++ .../jvm/loader/ClassFileParser.java | 143 +++ .../src/com/coderising/jvm/method/Method.java | 91 ++ .../jvm/test/ClassFileloaderTest.java | 203 ++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 + .../src/com/coderising/jvm/util/Util.java | 24 + .../src/com/coding/basic/stack/ArrayList.java | 150 +++ .../src/com/coding/basic/stack/InfixExpr.java | 74 ++ .../com/coding/basic/stack/InfixExprTest.java | 47 + .../src/com/coding/basic/stack/Iterator.java | 8 + .../src/com/coding/basic/stack/List.java | 10 + .../src/com/coding/basic/stack/Stack.java | 48 + .../src/com/coding/basic/stack/StackUtil.java | 66 ++ .../src/com/coding/basic/stack/Token.java | 49 + .../com/coding/basic/stack/TokenParser.java | 56 ++ group17/1158154002/.classpath | 2 + .../src/test04/loader/ClassFileLoader.java | 61 ++ .../test04/loader/ClassFileloaderTest.java | 84 ++ .../src/test04/loader/EmployeeV1.java | 28 + .../src/test04/lru/LRUPageFrame.java | 112 +++ .../src/test04/lru/LRUPageFrameTest.java | 29 + .../1158154002/src/test05/stack/Stack.java | 43 + .../src/test05/stack/StackTest.java | 52 + .../src/test05/stack/StackUtil.java | 151 +++ .../1158154002/src/test06/expr/InfixExpr.java | 92 ++ .../src/test06/expr/InfixExprTest.java | 45 + .../src/test07/expr/InfixToPostfix.java | 56 ++ .../src/test07/expr/InfixToPostfixTest.java | 12 + .../src/test07/expr/PostfixExpr.java | 48 + .../src/test07/expr/PostfixExprTest.java | 36 + .../src/test07/expr/PrefixExpr.java | 49 + .../src/test07/expr/PrefixExprTest.java | 43 + group17/1158154002/src/test07/expr/Token.java | 54 ++ .../src/test07/expr/TokenParser.java | 55 ++ .../src/test07/expr/TokenParserTest.java | 37 + .../1204187480/code/homework/basic/pom.xml | 12 - .../jvm/loader/ClassFileLoader.java | 45 + .../jvm/test/ClassFileloaderTest.java | 355 +++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 + .../litestruts/{action => }/LoginAction.java | 2 +- .../coderising/src/main/resources/struts.xml | 2 +- .../java/com/coding/basic/BinaryTreeNode.java | 64 +- .../main/java}/com/coding/basic/Iterator.java | 14 +- .../src/main/java/com/coding/basic/List.java | 20 +- .../src/main/java/com/coding/basic/Queue.java | 48 +- .../src/main/java/com/coding/basic/Stack.java | 62 +- .../com/coding/basic/array}/ArrayList.java | 219 ++--- .../com/coding/basic}/array/ArrayUtil.java | 2 +- .../coding/basic/linklist/LRUPageFrame.java | 57 ++ .../basic/linklist/LRUPageFrameTest.java | 34 + .../coding/basic/linklist}/LinkedList.java | 5 +- .../test/java/com/coding/api/ArraysTest.java | 44 +- .../test/java/com/coding/api/SystemTest.java | 48 +- .../java/com/coding/basic/ArrayListTest.java | 69 +- .../java/com/coding/basic/LinkedListTest.java | 24 +- .../1204187480/code/homework/parent/pom.xml | 150 ++- group17/1204187480/code/homework/pom.xml | 2 +- group17/1204187480/note/todo/homework.md | 8 + .../1264835468/src/assignment/BinaryTree.java | 10 +- .../1264835468/src/assignment/MyStack.java | 39 - .../assignment/{MyQueue.java => Queue.java} | 2 +- group17/1264835468/src/assignment/Stack.java | 53 ++ .../assignment0326/jvm/clz/AccessFlag.java | 25 + .../src/assignment0326/jvm/clz/ClassFile.java | 77 ++ .../assignment0326/jvm/clz/ClassIndex.java | 19 + .../jvm/constant/ClassInfo.java | 24 + .../jvm/constant/ConstantInfo.java | 29 + .../jvm/constant/ConstantPool.java | 29 + .../jvm/constant/FieldRefInfo.java | 54 ++ .../jvm/constant/MethodRefInfo.java | 55 ++ .../jvm/constant/NameAndTypeInfo.java | 45 + .../jvm/constant/NullConstantInfo.java | 13 + .../jvm/constant/StringInfo.java | 26 + .../assignment0326/jvm/constant/UTF8Info.java | 32 + .../jvm/loader/ByteCodeIterator.java | 42 + .../jvm/loader/ClassFileLoader.java | 80 +- .../jvm/loader/ClassFileParser.java | 133 +++ .../jvm/test/ClassFileLoaderTest.java | 129 ++- .../src/assignment0326/jvm/util/Util.java | 24 + .../src/assignment0326/lru/Clock.java | 99 -- .../src/assignment0405/StackUtil.java | 107 +++ .../src/assignment0405/StackUtilTest.java | 67 ++ .../com/coderising/jvm/test/EmployeeV1.java | 28 + .../com/coderising/download/net_multisoc.htm | 15 + .../coderising/jvm/attr/AttributeInfo.java | 48 + .../src/com/coderising/jvm/attr/CodeAttr.java | 94 ++ .../attr/InvalidAttributeInfoException.java | 7 + .../coderising/jvm/attr/LineNumberTable.java | 53 ++ .../jvm/attr/LocalVariableItem.java | 71 ++ .../jvm/attr/LocalVariableTable.java | 40 + .../coderising/jvm/attr/StackMapTable.java | 30 + .../com/coderising/jvm/clz/AccessFlag.java | 25 + .../src/com/coderising/jvm/clz/ClassFile.java | 95 ++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../coderising/jvm/constant/ClassInfo.java | 24 + .../coderising/jvm/constant/ConstantInfo.java | 29 + .../jvm/constant/ConstantInfoFactory.java | 93 ++ .../coderising/jvm/constant/ConstantPool.java | 37 + .../coderising/jvm/constant/FieldRefInfo.java | 54 ++ .../coderising/jvm/constant/FloatRefInfo.java | 15 + .../coderising/jvm/constant/IntegerInfo.java | 22 + .../InvalidConstantInfoTypeException.java | 11 + .../jvm/constant/MethodRefInfo.java | 55 ++ .../jvm/constant/NameAndTypeInfo.java | 45 + .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 + .../com/coderising/jvm/constant/UTF8Info.java | 32 + .../src/com/coderising/jvm/field/Field.java | 50 + .../coderising/jvm/interfaze/Interfaze.java | 5 + .../interfaze/InvalidInterfaceException.java | 7 + .../jvm/loader/ByteCodeIterator.java | 84 ++ .../jvm/loader/ClassFileLoader.java | 20 +- .../jvm/loader/ClassFileParser.java | 165 ++++ .../method/InvalidMethodInfoException.java | 7 + .../src/com/coderising/jvm/method/Method.java | 87 ++ .../jvm/test/ByteCodeIteratorTest.java | 51 + .../jvm/test/ClassFileloaderTest.java | 385 ++++++-- .../jvm/test/ClassFileloaderTest2.java | 52 + .../src/com/coderising/jvm/util/Util.java | 24 + .../src/com/coding/basic/stack/Stack.java | 24 + .../src/com/coding/basic/stack/StackUtil.java | 109 +++ .../coding/basic/stack/expr/InfixExpr.java | 184 ++++ .../basic/stack/expr/InfixExprTest.java | 60 ++ group17/785396327/2.26/list/ArrayList.java | 14 +- .../785396327/3.26/jvm_1/ClassFileLoader.java | 9 + .../3.26/jvm_1/ClassFileloaderTest.java | 2 +- group17/785396327/4.16/cmd/BiPushCmd.java | 29 + .../785396327/4.16/cmd/ByteCodeCommand.java | 131 +++ group17/785396327/4.16/cmd/CommandParser.java | 214 +++++ group17/785396327/4.16/cmd/GetFieldCmd.java | 27 + .../785396327/4.16/cmd/GetStaticFieldCmd.java | 27 + .../785396327/4.16/cmd/InvokeSpecialCmd.java | 27 + .../785396327/4.16/cmd/InvokeVirtualCmd.java | 26 + group17/785396327/4.16/cmd/LdcCmd.java | 37 + group17/785396327/4.16/cmd/NewObjectCmd.java | 27 + group17/785396327/4.16/cmd/NoOperandCmd.java | 30 + group17/785396327/4.16/cmd/OneOperandCmd.java | 27 + group17/785396327/4.16/cmd/PutFieldCmd.java | 26 + group17/785396327/4.16/cmd/TwoOperandCmd.java | 65 ++ .../4.16/print/ClassFilePrinter.java | 44 + .../4.16/print/ConstantPoolPrinter.java | 114 +++ .../4.23/engine/ExecutionResult.java | 55 ++ .../785396327/4.23/engine/ExecutorEngine.java | 29 + .../785396327/4.23/engine/FrameResult.java | 7 + group17/785396327/4.23/engine/Heap.java | 41 + group17/785396327/4.23/engine/JavaObject.java | 73 ++ group17/785396327/4.23/engine/MethodArea.java | 70 ++ group17/785396327/4.23/engine/MiniJVM.java | 29 + group17/785396327/4.23/engine/StackFrame.java | 95 ++ group17/785396327/4.23/queue/CircleQueue.java | 59 ++ .../785396327/4.23/queue/CircleQueueTest.java | 62 ++ group17/785396327/4.23/queue/Josephus.java | 39 + .../785396327/4.23/queue/JosephusTest.java | 26 + .../4.23/queue/QueueWithTwoStacks.java | 54 ++ .../4.23/queue/QueueWithTwoStacksTest.java | 37 + group17/785396327/4.5/clz/AccessFlag.java | 28 + group17/785396327/4.5/clz/ClassFile.java | 120 +++ group17/785396327/4.5/clz/ClassIndex.java | 25 + group17/785396327/4.5/constant/ClassInfo.java | 32 + .../785396327/4.5/constant/ConstantInfo.java | 50 + .../785396327/4.5/constant/ConstantPool.java | 32 + .../785396327/4.5/constant/FieldRefInfo.java | 62 ++ .../785396327/4.5/constant/MethodRefInfo.java | 58 ++ .../4.5/constant/NameAndTypeInfo.java | 57 ++ .../4.5/constant/NullConstantInfo.java | 20 + .../785396327/4.5/constant/StringInfo.java | 34 + group17/785396327/4.5/constant/UTF8Info.java | 39 + .../4.5/iterator/ByteCodeIterator.java | 64 ++ .../785396327/4.5/parse/ClassFilePaser.java | 121 +++ group17/785396327/4.5/stack/MyStack.java | 35 + group17/785396327/4.5/stack/StackUtil.java | 115 +++ .../785396327/4.5/stack/StackUtilTest.java | 101 ++ .../4.5/test/ClassFileloaderTest.java | 348 +++++++ group17/785396327/4.5/util/Util.java | 28 + group17/785396327/4.9/attr/AttributeInfo.java | 20 + group17/785396327/4.9/attr/CodeAttr.java | 88 ++ .../785396327/4.9/attr/LineNumberTable.java | 54 ++ .../785396327/4.9/attr/LocalVariableItem.java | 42 + .../4.9/attr/LocalVariableTable.java | 43 + group17/785396327/4.9/attr/StackMapTable.java | 31 + group17/785396327/4.9/expr/ExprParser.java | 37 + group17/785396327/4.9/expr/InfixExpr.java | 75 ++ group17/785396327/4.9/expr/InfixExprTest.java | 57 ++ .../785396327/4.9/expr/InfixToPostfix.java | 43 + .../4.9/expr/InfixToPostfixTest.java | 41 + group17/785396327/4.9/expr/OperEnum.java | 21 + group17/785396327/4.9/expr/PostfixExpr.java | 48 + .../785396327/4.9/expr/PostfixExprTest.java | 38 + group17/785396327/4.9/expr/PrefixExpr.java | 48 + .../785396327/4.9/expr/PrefixExprTest.java | 45 + group17/785396327/4.9/expr/Token.java | 52 + group17/785396327/4.9/expr/TokenParser.java | 58 ++ .../785396327/4.9/expr/TokenParserTest.java | 47 + group17/785396327/4.9/field/Field.java | 41 + group17/785396327/4.9/method/Method.java | 67 ++ group17/82427129/.gitignore | 4 +- .../coderising/jvm/attr/AttributeInfo.java | 40 + .../com/coderising/jvm/attr/CodeAttr.java | 129 +++ .../coderising/jvm/attr/LineNumberTable.java | 77 ++ .../jvm/attr/LocalVariableTable.java | 93 ++ .../coderising/jvm/attr/StackMapTable.java | 13 + .../com/coderising/jvm/clz/AccessFlag.java | 24 + .../com/coderising/jvm/clz/ClassFile.java | 109 +++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../coderising/jvm/constant/ClassInfo.java | 39 + .../coderising/jvm/constant/ConstantInfo.java | 37 + .../coderising/jvm/constant/ConstantPool.java | 38 + .../coderising/jvm/constant/DoubleInfo.java | 14 + .../coderising/jvm/constant/FieldRefInfo.java | 66 ++ .../coderising/jvm/constant/FloatInfo.java | 15 + .../coderising/jvm/constant/IntegerInfo.java | 25 + .../com/coderising/jvm/constant/LongInfo.java | 15 + .../jvm/constant/MethodRefInfo.java | 67 ++ .../jvm/constant/NameAndTypeInfo.java | 58 ++ .../jvm/constant/NullConstantInfo.java | 14 + .../coderising/jvm/constant/StringInfo.java | 43 + .../com/coderising/jvm/constant/UTF8Info.java | 47 + .../java/com/coderising/jvm/field/Field.java | 115 +++ .../jvm/loader/ByteCodeIterator.java | 48 + .../jvm/loader/ClassFileLoader.java | 34 +- .../jvm/loader/ClassFileParser.java | 195 ++++ .../com/coderising/jvm/method/Method.java | 126 +++ .../java/com/coderising/jvm/util/Util.java | 24 + .../com/coding/basic/{ => stack}/Stack.java | 16 +- .../com/coding/basic/stack/StackUtil.java | 147 +++ .../coding/basic/stack/expr/InfixExpr.java | 114 +++ .../com/coding/basic/stack/expr/Token.java | 85 ++ .../jvm/loader/ClassFileLoaderTest.java | 185 +++- .../com/coding/basic/stack/StackUtilTest.java | 65 ++ .../basic/stack/expr/InfixExprTest.java | 35 + group17/article/20170326-20170402.md | 2 +- group17/article/20170402-20170409.md | 8 +- group17/article/20170409-20170416.md | 56 ++ group17/article/20170416-20170423.md | 56 ++ group17/article/template.md | 2 +- group17/count/homework.md | 5 +- .../org/xukai/coderising/stack/InfixExpr.java | 173 ++-- .../xukai/coderising/stack/InfixExpr2.java | 104 ++ .../coderising/stack/InfixToPostfix2.java | 87 ++ .../xukai/coderising/stack/PostfixExpr.java | 57 ++ .../coderising/stack/PostfixExprTest.java | 47 + .../xukai/coderising/stack/PrefixExpr.java | 60 ++ .../coderising/stack/PrefixExprTest.java | 45 + .../org/xukai/coderising/stack/Token.java | 50 + .../xukai/coderising/stack/TokenParser.java | 57 ++ .../java/org/xukai/jvm/attr/CodeAttr.java | 21 +- .../java/org/xukai/jvm/clz/ClassFile.java | 32 +- .../java/org/xukai/jvm/cmd/BiPushCmd.java | 22 + .../org/xukai/jvm/cmd/ByteCodeCommand.java | 129 +++ .../java/org/xukai/jvm/cmd/CommandParser.java | 156 +++ .../java/org/xukai/jvm/cmd/GetFieldCmd.java | 22 + .../org/xukai/jvm/cmd/GetStaticFieldCmd.java | 20 + .../org/xukai/jvm/cmd/InvokeSpecialCmd.java | 22 + .../org/xukai/jvm/cmd/InvokeVirtualCmd.java | 22 + .../main/java/org/xukai/jvm/cmd/LdcCmd.java | 30 + .../java/org/xukai/jvm/cmd/NewObjectCmd.java | 20 + .../java/org/xukai/jvm/cmd/NoOperandCmd.java | 24 + .../java/org/xukai/jvm/cmd/OneOperandCmd.java | 28 + .../java/org/xukai/jvm/cmd/PutFieldCmd.java | 20 + .../java/org/xukai/jvm/cmd/TwoOperandCmd.java | 67 ++ .../org/xukai/jvm/constant/ClassInfo.java | 7 +- .../org/xukai/jvm/constant/ConstantInfo.java | 19 + .../org/xukai/jvm/constant/ConstantPool.java | 2 +- .../org/xukai/jvm/constant/FieldRefInfo.java | 7 +- .../org/xukai/jvm/constant/MethodRefInfo.java | 7 +- .../xukai/jvm/constant/NameAndTypeInfo.java | 9 +- .../xukai/jvm/constant/NullConstantInfo.java | 7 +- .../org/xukai/jvm/constant/StringInfo.java | 7 +- .../java/org/xukai/jvm/constant/UTF8Info.java | 6 + .../java/org/xukai/jvm/method/Method.java | 13 +- .../org/xukai/jvm/print/ClassFilePrinter.java | 48 + .../xukai/jvm/print/ConstantPoolPrinter.java | 85 ++ .../xukai/jvm/test/ClassFileloaderTest.java | 83 +- .../src/main/java/me/lzb/basic/InfixExpr.java | 161 ---- .../main/java/me/lzb/basic/expr/CalUtil.java | 108 +++ .../java/me/lzb/basic/expr/InfixExpr.java | 71 ++ .../me/lzb/basic/expr/InfixToPostfix.java | 79 ++ .../src/main/java/me/lzb/basic/expr/Node.java | 28 + .../java/me/lzb/basic/expr/PostfixExpr.java | 46 + .../java/me/lzb/basic/expr/PrefixExpr.java | 46 + .../lzb/basic/{ => expr}/InfixExprTest.java | 2 +- .../me/lzb/basic/expr/InfixToPostfixTest.java | 42 + .../me/lzb/basic/expr/PostfixExprTest.java | 43 + .../me/lzb/basic/expr/PrefixExprTest.java | 47 + .../main/java/me/lzb/jvm/attr/CodeAttr.java | 13 +- .../main/java/me/lzb/jvm/clz/AccessFlag.java | 12 +- .../main/java/me/lzb/jvm/clz/ClassFile.java | 59 +- .../main/java/me/lzb/jvm/cmd/BiPushCmd.java | 21 + .../java/me/lzb/jvm/cmd/ByteCodeCommand.java | 124 +++ .../main/java/me/lzb/jvm/cmd/GetFieldCmd.java | 20 + .../me/lzb/jvm/cmd/GetStaticFieldCmd.java | 19 + .../java/me/lzb/jvm/cmd/InvokeSpecialCmd.java | 21 + .../java/me/lzb/jvm/cmd/InvokeVirtualCmd.java | 19 + .../src/main/java/me/lzb/jvm/cmd/LdcCmd.java | 29 + .../java/me/lzb/jvm/cmd/NewObjectCmd.java | 19 + .../java/me/lzb/jvm/cmd/NoOperandCmd.java | 22 + .../java/me/lzb/jvm/cmd/OneOperandCmd.java | 29 + .../main/java/me/lzb/jvm/cmd/PutFieldCmd.java | 20 + .../java/me/lzb/jvm/cmd/TwoOperandCmd.java | 64 ++ .../java/me/lzb/jvm/constant/ClassInfo.java | 7 + .../me/lzb/jvm/constant/ConstantInfo.java | 16 +- .../me/lzb/jvm/constant/FieldRefInfo.java | 7 + .../me/lzb/jvm/constant/MethodRefInfo.java | 7 + .../me/lzb/jvm/constant/NameAndTypeInfo.java | 7 + .../me/lzb/jvm/constant/NullConstantInfo.java | 7 + .../java/me/lzb/jvm/constant/StringInfo.java | 7 + .../java/me/lzb/jvm/constant/UTF8Info.java | 7 + .../me/lzb/jvm/loader/ClassFileParser.java | 8 +- .../java/me/lzb/jvm/loader/CommandParser.java | 188 ++++ .../main/java/me/lzb/jvm/method/Method.java | 26 +- .../java/me/lzb/jvm/print/ClassPrinter.java | 36 + .../src/main/java/me/lzb/jvm/print/Print.java | 10 + .../java/me/lzb/jvm/print/PrintFormat.java | 57 ++ .../java/me/lzb/jvm/print/PrintVisitor.java | 23 + .../java/me/lzb/jvm/ClassFileloaderTest.java | 95 +- .../basic/stack/expr/InfixExpr.java | 19 +- .../basic/stack/expr/InfixToPostfix.java | 67 ++ .../basic/stack/expr/InfixToPostfixTest.java | 32 + .../basic/stack/expr/PostfixExpr.java | 35 + .../basic/stack/expr/PostfixExprTest.java | 41 + .../basic/stack/expr/PrefixExpr.java | 36 + .../basic/stack/expr/PrefixExprTest.java | 44 + .../coding2017/basic/stack/expr/Token.java | 64 ++ .../basic/stack/expr/TokenParser.java | 57 ++ .../basic/stack/expr/TokenParserTest.java | 41 + .../coding2017/minijvm/attr/CodeAttr.java | 32 +- .../minijvm/attr/LineNumberTable.java | 12 +- .../minijvm/attr/LocalVariableTable.java | 15 +- .../coding2017/minijvm/clz/ClassFile.java | 20 +- .../coding2017/minijvm/cmd/BiPushCmd.java | 21 + .../minijvm/cmd/ByteCodeCommand.java | 132 +++ .../coding2017/minijvm/cmd/CommandParser.java | 143 +++ .../coding2017/minijvm/cmd/GetFieldCmd.java | 21 + .../minijvm/cmd/GetStaticFieldCmd.java | 19 + .../minijvm/cmd/InvokeSpecialCmd.java | 21 + .../minijvm/cmd/InvokeVirtualCmd.java | 21 + .../coding2017/minijvm/cmd/LdcCmd.java | 29 + .../coding2017/minijvm/cmd/NewObjectCmd.java | 19 + .../coding2017/minijvm/cmd/NoOperandCmd.java | 23 + .../coding2017/minijvm/cmd/OneOperandCmd.java | 29 + .../coding2017/minijvm/cmd/PutFieldCmd.java | 19 + .../coding2017/minijvm/cmd/TwoOperandCmd.java | 67 ++ .../minijvm/constant/ClassInfo.java | 4 + .../minijvm/constant/ConstantInfo.java | 11 + .../minijvm/constant/ConstantPool.java | 2 +- .../minijvm/constant/FieldRefInfo.java | 5 + .../minijvm/constant/MethodRefInfo.java | 5 + .../minijvm/constant/NameAndTypeInfo.java | 5 + .../minijvm/constant/NullConstantInfo.java | 4 + .../minijvm/constant/StringInfo.java | 6 + .../coding2017/minijvm/constant/UTF8Info.java | 4 + .../coding2017/minijvm/method/Method.java | 17 + .../minijvm/print/ClassFilePrinter.java | 47 + .../minijvm/print/ConstantPoolPrinter.java | 88 ++ .../minijvm/test/ClassFileloaderTest.java | 77 ++ .../basic/stack/expr/InfixExpr.java | 19 + .../basic/stack/expr/InfixExprTest.java | 52 + .../basic/stack/expr/InfixToPostfix.java | 37 + .../coding2017/basic/stack/expr/Operator.java | 42 + .../basic/stack/expr/PostfixExpr.java | 36 + .../basic/stack/expr/PostfixExprTest.java | 41 + .../basic/stack/expr/PrefixExpr.java | 25 + .../basic/stack/expr/PrefixExprTest.java | 45 + .../coding2017/basic/stack/expr/Token.java | 50 + .../basic/stack/expr/TokenParser.java | 58 ++ .../basic/stack/expr/TokenParserTest.java | 39 + .../main/java/jvm/loader/ClassFileLoader.java | 57 ++ .../src/main/java/jvm/loader/Directory.java | 81 ++ .../java/jvm/test/ClassFileloaderTest.java | 83 ++ .../src/main/java/jvm/test/EmployeeV1.java | 31 + .../donaldy/basic/expr/InfixToPostfix.java | 59 ++ .../basic/expr/InfixToPostfixTest.java | 22 + .../com/donaldy/basic/expr/PostfixExpr.java | 67 ++ .../donaldy/basic/expr/PostfixExprTest.java | 41 + .../com/donaldy/basic/expr/PrefixExpr.java | 69 ++ .../donaldy/basic/expr/PrefixExprTest.java | 45 + .../src/com/donaldy/basic/expr/Token.java | 50 + .../com/donaldy/basic/expr/TokenParser.java | 57 ++ .../donaldy/basic/expr/TokenParserTest.java | 41 + .../com/donaldy/basic/queue/CircleQueue.java | 74 ++ .../donaldy/basic/queue/CircleQueueTest.java | 35 + .../src/com/donaldy/basic/queue/Josephus.java | 62 ++ .../com/donaldy/basic/queue/JosephusTest.java | 27 + .../src/com/donaldy/basic/queue/Queue.java | 62 ++ .../basic/queue/QueueWithTwoStacks.java | 68 ++ .../basic/queue/QueueWithTwoStacksTest.java | 23 + .../src/com/donaldy/jvm/attr/CodeAttr.java | 102 +- .../donaldy/jvm/attr/LocalVariableTable.java | 23 +- .../src/com/donaldy/jvm/clz/ClassFile.java | 33 +- .../src/com/donaldy/jvm/cmd/BiPushCmd.java | 29 + .../com/donaldy/jvm/cmd/ByteCodeCommand.java | 130 +++ .../com/donaldy/jvm/cmd/CommandParser.java | 158 ++++ .../src/com/donaldy/jvm/cmd/GetFieldCmd.java | 28 + .../donaldy/jvm/cmd/GetStaticFieldCmd.java | 31 + .../com/donaldy/jvm/cmd/InvokeSpecialCmd.java | 29 + .../com/donaldy/jvm/cmd/InvokeVirtualCmd.java | 27 + .../src/com/donaldy/jvm/cmd/LdcCmd.java | 37 + .../src/com/donaldy/jvm/cmd/NewObjectCmd.java | 26 + .../src/com/donaldy/jvm/cmd/NoOperandCmd.java | 32 + .../com/donaldy/jvm/cmd/OneOperandCmd.java | 27 + .../src/com/donaldy/jvm/cmd/PutFieldCmd.java | 27 + .../com/donaldy/jvm/cmd/TwoOperandCmd.java | 67 ++ .../com/donaldy/jvm/constant/ClassInfo.java | 4 + .../donaldy/jvm/constant/ConstantInfo.java | 11 + .../donaldy/jvm/constant/ConstantPool.java | 4 +- .../donaldy/jvm/constant/FieldRefInfo.java | 4 + .../donaldy/jvm/constant/MethodRefInfo.java | 5 + .../donaldy/jvm/constant/NameAndTypeInfo.java | 6 + .../jvm/constant/NullConstantInfo.java | 4 + .../com/donaldy/jvm/constant/StringInfo.java | 6 + .../com/donaldy/jvm/constant/UTF8Info.java | 5 + .../donaldy/jvm/engine/ExecutionResult.java | 56 ++ .../donaldy/jvm/engine/ExecutorEngine.java | 35 + .../src/com/donaldy/jvm/engine/Heap.java | 39 + .../com/donaldy/jvm/engine/JavaObject.java | 71 ++ .../com/donaldy/jvm/engine/MethodArea.java | 68 ++ .../src/com/donaldy/jvm/engine/MiniJVM.java | 28 + .../com/donaldy/jvm/engine/StackFrame.java | 95 ++ .../donaldy/jvm/loader/ClassFileLoader.java | 1 + .../src/com/donaldy/jvm/method/Method.java | 60 +- .../donaldy/jvm/print/ClassFilePrinter.java | 52 + .../jvm/print/ConstantPoolPrinter.java | 133 +++ .../donaldy/jvm/test/ClassFileloaderTest.java | 88 ++ group24/494800949/EmployeeV1-javap.txt | 164 ++++ .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 93 ++ .../coderising/jvm/attr/LineNumberTable.java | 52 + .../jvm/attr/LocalVariableItem.java | 39 + .../jvm/attr/LocalVariableTable.java | 39 + .../coderising/jvm/attr/StackMapTable.java | 30 + .../src/com/coderising/jvm/clz/ClassFile.java | 66 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 21 + .../coderising/jvm/cmd/ByteCodeCommand.java | 127 +++ .../com/coderising/jvm/cmd/CommandParser.java | 150 +++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 21 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 20 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 22 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 30 + .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 24 + .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 + .../com/coderising/jvm/cmd/PutFieldCmd.java | 20 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 63 ++ .../coderising/jvm/constant/ClassInfo.java | 7 +- .../coderising/jvm/constant/ConstantInfo.java | 13 +- .../coderising/jvm/constant/FieldRefInfo.java | 9 +- .../jvm/constant/MethodRefInfo.java | 7 +- .../jvm/constant/NameAndTypeInfo.java | 9 +- .../jvm/constant/NullConstantInfo.java | 6 +- .../coderising/jvm/constant/StringInfo.java | 7 +- .../com/coderising/jvm/constant/UTF8Info.java | 6 + .../src/com/coderising/jvm/field/Field.java | 38 + .../jvm/loader/ByteCodeIterator.java | 31 +- .../jvm/loader/ClassFileParser.java | 31 +- .../src/com/coderising/jvm/method/Method.java | 69 ++ .../jvm/print/ClassFilePrinter.java | 45 + .../jvm/print/ConstantPoolPrinter.java | 34 + .../coderising/jvm/print/SimpleVistor.java | 56 ++ .../src/main/java/com/coding/weak1/Stack.java | 2 + .../java/com/coding/week6/expr/InfixExpr.java | 127 +++ .../java/com/coding/week6/expr/Token.java | 52 + .../com/coding/week6/exprNew/InfixExpr.java | 57 ++ .../com/coding/week6/exprNew/Operator.java | 75 ++ .../java/com/coding/week6/exprNew/Token.java | 63 ++ .../com/coding/week6/exprNew/TokenParser.java | 60 ++ .../java/com/coding/week7/InfixToPostfix.java | 69 ++ .../java/com/coding/week7/PostfixExpr.java | 39 + .../java/com/coding/week7/PrefixExpr.java | 43 + .../mini_jvm/test/ClassFileloaderTest.java | 163 +++- .../coding/week6/expr/InfixExprTestTest.java | 77 ++ .../week6/exprNew/InfixExprTestTest.java | 78 ++ .../coding/week6/exprNew/TokenParserTest.java | 18 + .../com/coding/week7/InfixToPostfixTest.java | 34 + .../com/coding/week7/PostfixExprTest.java | 41 + .../java/com/coding/week7/PrefixExprTest.java | 45 + .../java/basic/dataStructure/ArrayList.java | 115 +++ .../java/basic/dataStructure/ArrayUtil.java | 245 +++++ .../basic/dataStructure/BinaryTreeNode.java | 58 ++ .../java/basic/dataStructure/LinkedList.java | 341 +++++++ .../main/java/basic/dataStructure/List.java | 12 + .../main/java/basic/dataStructure/Queue.java | 72 ++ .../main/java/basic/dataStructure/Stack.java | 41 + .../java/basic/liteStruts/LoginAction.java | 39 + .../main/java/basic/liteStruts/ReadXML.java | 28 + .../main/java/basic/liteStruts/Struts.java | 78 ++ .../src/main/java/basic/liteStruts/View.java | 23 + .../src/main/java/miniJVM/Demo.java | 7 + .../java/thread/download/DownloadThread.java | 39 + .../java/thread/download/FileDownloader.java | 106 +++ .../java/thread/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 8 + .../download/api/ConnectionManager.java | 10 + .../thread/download/api/DownloadListener.java | 5 + .../thread/download/impl/ConnectionImpl.java | 93 ++ .../download/impl/ConnectionManagerImpl.java | 20 + .../java/data_structure/ArrayListTest.java | 69 ++ .../java/data_structure/ArrayUtilTest.java | 67 ++ .../data_structure/BinaryNodeTreeTest.java | 29 + .../java/data_structure/LinkedListTest.java | 151 +++ .../test/java/data_structure/QueueTest.java | 50 + .../test/java/data_structure/StackTest.java | 49 + .../java/download/FileDownloaderTest.java | 54 ++ .../src/test/java/liteStruts/StrutsTest.java | 42 + group24/Homework/1-FirstWeek/ArrayList.java | 35 + .../Homework/1-FirstWeek/BinaryTreeNode.java | 32 + group24/Homework/1-FirstWeek/Iterator.java | 7 + group24/Homework/1-FirstWeek/LinkedList.java | 125 +++ .../Homework/1-FirstWeek}/List.java | 18 +- group24/Homework/1-FirstWeek/Queue.java | 61 ++ group24/Homework/1-FirstWeek/Stack.java | 24 + .../2-SecondWeek/litestruts/LoginAction.java | 39 + .../2-SecondWeek/litestruts/Struts.java | 34 + .../2-SecondWeek/litestruts/StrutsTest.java | 43 + .../2-SecondWeek/litestruts/View.java | 23 + group24/Homework/3-ThirdWeek/LinkedList.java | 125 +++ .../3-ThirdWeek/download/DownloadThread.java | 20 + .../3-ThirdWeek/download/FileDownloader.java | 73 ++ .../download/FileDownloaderTest.java | 59 ++ .../3-ThirdWeek/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 + .../download/impl/ConnectionManagerImpl.java | 15 + group24/Homework/4-FourWeek/LRUPageFrame.java | 57 ++ .../Homework/4-FourWeek/LRUPageFrameTest.java | 34 + .../jvm/loader/ClassFileLoader .java | 25 + .../jvm/test/ClassFileloaderTest.java | 92 ++ .../4-FourWeek/jvm/test/EmployeeV1.java | 0 group24/Homework/5-FifthWeek/README.txt | 3 + group24/Homework/5-FifthWeek/StackUtil.java | 48 + .../Homework/5-FifthWeek/StackUtilTest.java | 65 ++ .../5-FifthWeek/jvm/clz/AccessFlag.java | 23 + .../5-FifthWeek/jvm/clz/ClassFile .java | 58 ++ .../5-FifthWeek/jvm/clz/ClassIndex.java | 17 + .../5-FifthWeek/jvm/constant/ClassInfo.java | 28 + .../jvm/constant/ConstantInfo.java | 40 + .../jvm/constant/ConstantPool.java | 31 + .../jvm/constant/FieldRefInfo.java | 58 ++ .../jvm/constant/MethodRefInfo.java | 60 ++ .../jvm/constant/NameAndTypeInfo.java | 51 + .../jvm/constant/NullConstantInfo.java | 17 + .../5-FifthWeek/jvm/constant/StringInfo.java | 32 + .../5-FifthWeek/jvm/constant/UTF8Info.java | 37 + .../jvm/loader/ByteCodeIterator.java | 18 + .../jvm/loader/ClassFileLoader.java | 62 ++ .../jvm/loader/ClassFileParser.java | 62 ++ .../jvm/test/ClassFileloaderTest.java | 208 ++++ .../5-FifthWeek/jvm/test/EmployeeV1.java | 28 + .../Homework/5-FifthWeek/jvm/util/Util.java | 24 + group24/Homework/6-SixWeek/InfixExpr.java | 15 + group24/Homework/6-SixWeek/InfixExprTest.java | 52 + group24/Homework/6-SixWeek/README.txt | 3 + .../6-SixWeek/jvm/attr/AttributeInfo.java | 19 + .../Homework/6-SixWeek/jvm/attr/CodeAttr.java | 70 ++ .../6-SixWeek/jvm/attr/LineNumberTable.java | 55 ++ .../6-SixWeek/jvm/attr/LocalVariableItem.java | 39 + .../jvm/attr/LocalVariableTable.java | 42 + .../6-SixWeek/jvm/attr/StackMapTable.java | 30 + .../6-SixWeek/jvm/clz/AccessFlag.java | 25 + .../Homework/6-SixWeek/jvm/clz/ClassFile.java | 102 ++ .../6-SixWeek/jvm/clz/ClassIndex.java | 19 + .../6-SixWeek/jvm/constant/ClassInfo.java | 28 + .../6-SixWeek/jvm/constant/ConstantInfo.java | 40 + .../6-SixWeek/jvm/constant/ConstantPool.java | 31 + .../6-SixWeek/jvm/constant/FieldRefInfo.java | 58 ++ .../6-SixWeek/jvm/constant/MethodRefInfo.java | 60 ++ .../jvm/constant/NameAndTypeInfo.java | 51 + .../jvm/constant/NullConstantInfo.java | 17 + .../6-SixWeek/jvm/constant/StringInfo.java | 32 + .../6-SixWeek/jvm/constant/UTF8Info.java | 37 + .../Homework/6-SixWeek/jvm/field/Field.java | 50 + .../jvm/loader/ByteCodeIterator.java | 57 ++ .../6-SixWeek/jvm/loader/ClassFileLoader.java | 140 +++ .../6-SixWeek/jvm/loader/ClassFileParser.java | 62 ++ .../Homework/6-SixWeek/jvm/method/Method.java | 80 ++ .../jvm/test/ClassFileloaderTest.java | 282 ++++++ .../6-SixWeek/jvm/test/EmployeeV1.java | 28 + group24/Homework/6-SixWeek/jvm/util/Util.java | 24 + .../Homework/7-SevenWeek/InfixToPostfix.java | 14 + group24/Homework/7-SevenWeek/PostfixExpr.java | 18 + .../Homework/7-SevenWeek/PostfixExprTest.java | 41 + group24/Homework/7-SevenWeek/README.txt | 4 + .../7-SevenWeek/jvm/attr/AttributeInfo.java | 19 + .../7-SevenWeek/jvm/attr/CodeAttr.java | 70 ++ .../7-SevenWeek/jvm/attr/LineNumberTable.java | 55 ++ .../jvm/attr/LocalVariableItem.java | 39 + .../jvm/attr/LocalVariableTable.java | 42 + .../7-SevenWeek/jvm/attr/StackMapTable.java | 30 + .../7-SevenWeek/jvm/clz/AccessFlag.java | 25 + .../7-SevenWeek/jvm/clz/ClassFile.java | 102 ++ .../7-SevenWeek/jvm/clz/ClassIndex.java | 19 + .../7-SevenWeek/jvm/cmd/BiPushCmd.java | 23 + .../7-SevenWeek/jvm/cmd/ByteCodeCommand.java | 128 +++ .../7-SevenWeek/jvm/cmd/CommandParser.java | 85 ++ .../7-SevenWeek/jvm/cmd/GetFieldCmd.java | 22 + .../jvm/cmd/GetStaticFieldCmd.java | 23 + .../7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java | 23 + .../7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java | 22 + .../Homework/7-SevenWeek/jvm/cmd/LdcCmd.java | 29 + .../7-SevenWeek/jvm/cmd/NewObjectCmd.java | 19 + .../7-SevenWeek/jvm/cmd/NoOperandCmd.java | 23 + .../7-SevenWeek/jvm/cmd/OneOperandCmd.java | 27 + .../7-SevenWeek/jvm/cmd/PutFieldCmd.java | 19 + .../7-SevenWeek/jvm/cmd/TwoOperandCmd.java | 67 ++ .../7-SevenWeek/jvm/constant/ClassInfo.java | 28 + .../jvm/constant/ConstantInfo.java | 40 + .../jvm/constant/ConstantPool.java | 31 + .../jvm/constant/FieldRefInfo.java | 58 ++ .../jvm/constant/MethodRefInfo.java | 60 ++ .../jvm/constant/NameAndTypeInfo.java | 51 + .../jvm/constant/NullConstantInfo.java | 17 + .../7-SevenWeek/jvm/constant/StringInfo.java | 32 + .../7-SevenWeek/jvm/constant/UTF8Info.java | 37 + .../Homework/7-SevenWeek/jvm/field/Field.java | 50 + .../jvm/loader/ByteCodeIterator.java | 57 ++ .../jvm/loader/ClassFileLoader.java | 140 +++ .../jvm/loader/ClassFileParser.java | 62 ++ .../7-SevenWeek/jvm/method/Method.java | 80 ++ .../jvm/print/ClassFilePrinter.java | 54 ++ .../jvm/print/ConstantPoolPrinter.java | 25 + .../jvm/test/ClassFileloaderTest.java | 354 +++++++ .../7-SevenWeek/jvm/test/EmployeeV1.java | 28 + .../Homework/7-SevenWeek/jvm/util/Util.java | 24 + .../8-EighthWeek/attr/AttributeInfo.java | 19 + .../Homework/8-EighthWeek/attr/CodeAttr.java | 70 ++ .../8-EighthWeek/attr/LineNumberTable.java | 55 ++ .../8-EighthWeek/attr/LocalVariableItem.java | 39 + .../8-EighthWeek/attr/LocalVariableTable.java | 42 + .../8-EighthWeek/attr/StackMapTable.java | 30 + .../Homework/8-EighthWeek/clz/AccessFlag.java | 25 + .../Homework/8-EighthWeek/clz/ClassFile.java | 102 ++ .../Homework/8-EighthWeek/clz/ClassIndex.java | 19 + .../Homework/8-EighthWeek/cmd/BiPushCmd.java | 31 + .../8-EighthWeek/cmd/ByteCodeCommand.java | 130 +++ .../8-EighthWeek/cmd/CommandParser.java | 85 ++ .../8-EighthWeek/cmd/GetFieldCmd.java | 30 + .../8-EighthWeek/cmd/GetStaticFieldCmd.java | 31 + .../8-EighthWeek/cmd/InvokeSpecialCmd.java | 31 + .../8-EighthWeek/cmd/InvokeVirtualCmd.java | 29 + group24/Homework/8-EighthWeek/cmd/LdcCmd.java | 37 + .../8-EighthWeek/cmd/NewObjectCmd.java | 27 + .../8-EighthWeek/cmd/NoOperandCmd.java | 31 + .../8-EighthWeek/cmd/OneOperandCmd.java | 27 + .../8-EighthWeek/cmd/PutFieldCmd.java | 27 + .../8-EighthWeek/cmd/TwoOperandCmd.java | 67 ++ .../8-EighthWeek/constant/ClassInfo.java | 28 + .../8-EighthWeek/constant/ConstantInfo.java | 40 + .../8-EighthWeek/constant/ConstantPool.java | 31 + .../8-EighthWeek/constant/FieldRefInfo.java | 58 ++ .../8-EighthWeek/constant/MethodRefInfo.java | 60 ++ .../constant/NameAndTypeInfo.java | 51 + .../constant/NullConstantInfo.java | 17 + .../8-EighthWeek/constant/StringInfo.java | 32 + .../8-EighthWeek/constant/UTF8Info.java | 37 + .../8-EighthWeek/engine/ExecutionResult.java | 56 ++ .../8-EighthWeek/engine/ExecutorEngine.java | 35 + .../Homework/8-EighthWeek/engine/Heap.java | 39 + .../8-EighthWeek/engine/JavaObject.java | 71 ++ .../8-EighthWeek/engine/MethodArea.java | 68 ++ .../Homework/8-EighthWeek/engine/MiniJVM.java | 28 + .../8-EighthWeek/engine/StackFrame.java | 95 ++ .../Homework/8-EighthWeek/field/Field.java | 50 + .../8-EighthWeek/loader/ByteCodeIterator.java | 57 ++ .../8-EighthWeek/loader/ClassFileLoader.java | 140 +++ .../8-EighthWeek/loader/ClassFileParser.java | 62 ++ .../Homework/8-EighthWeek/method/Method.java | 80 ++ .../8-EighthWeek/print/ClassFilePrinter.java | 54 ++ .../print/ConstantPoolPrinter.java | 25 + .../test/ClassFileloaderTest.java | 354 +++++++ .../8-EighthWeek/test/EmployeeV1.java | 28 + group24/Homework/8-EighthWeek/util/Util.java | 24 + group27/383117348/.classpath | 3 +- .../coderising/download/DownloadThread.java | 0 .../coderising/download/FileDownloader.java | 0 .../download/FileDownloaderTest.java | 0 .../coderising/download/api/Connection.java | 0 .../download/api/ConnectionException.java | 0 .../download/api/ConnectionManager.java | 0 .../download/api/DownloadListener.java | 0 .../download/impl/ConnectionImpl.java | 0 .../download/impl/ConnectionManagerImpl.java | 0 .../coderising/litestruts/LoginAction.java | 0 .../com/coderising/litestruts/Struts.java | 0 .../com/coderising/litestruts/StrutsTest.java | 0 .../com/coderising/litestruts/View.java | 0 .../com/coderising/litestruts/struts.xml | 0 .../com/coding/basic/BinaryTreeNode.java | 0 .../com/coding/basic/Iterator.java | 0 .../com/coding/basic/List.java | 0 .../com/coding/basic/array/ArrayList.java | 0 .../com/coding/basic/array/ArrayUtil.java | 0 .../coding/basic/linklist/LRUPageFrame.java | 0 .../basic/linklist/LRUPageFrameTest.java | 0 .../com/coding/basic/linklist/LinkedList.java | 0 .../com/coding/basic/queue/CircleQueue.java | 5 + .../com/coding/basic/queue/Josephus.java | 42 + .../com/coding/basic/queue/JosephusTest.java | 26 + .../com/coding/basic/queue}/Queue.java | 2 +- .../basic/queue/QueueWithTwoStacks.java | 38 + .../com/coding/basic/stack/Stack.java | 0 .../com/coding/basic/stack/StackUtil.java | 0 .../coding/basic/stack/expr/InfixExpr.java | 181 ++++ .../basic/stack/expr/InfixExprTest.java | 46 + .../basic/stack/expr/InfixToPostfix.java | 59 ++ .../basic/stack/expr/InfixToPrevfix.java | 54 ++ .../coding/basic/stack/expr/PostfixExpr.java | 55 ++ .../basic/stack/expr/PostfixExprTest.java | 36 + .../coding/basic/stack/expr/PrefixExpr.java | 49 + .../basic/stack/expr/PrefixExprTest.java | 44 + .../com/coding/basic/stack/expr/Token.java | 49 + .../coding/basic/stack/expr/TokenParser.java | 56 ++ .../basic/stack/expr/TokenParserTest.java | 40 + .../basic/stack/test/StackUtilTest.java | 0 .../coderising/jvm/attr/AttributeInfo.java | 17 + .../com/coderising/jvm/attr/CodeAttr.java | 108 +++ .../coderising/jvm/attr/LineNumberTable.java | 70 ++ .../jvm/attr/LocalVariableItem.java | 39 + .../jvm/attr/LocalVariableTable.java | 54 ++ .../coderising/jvm/attr/StackMapTable.java | 29 + .../com/coderising/jvm/clz/AccessFlag.java | 0 .../com/coderising/jvm/clz/ClassFile.java | 124 +++ .../com/coderising/jvm/clz/ClassIndex.java | 0 .../com/coderising/jvm/cmd/BiPushCmd.java | 23 + .../coderising/jvm/cmd/ByteCodeCommand.java | 128 +++ .../com/coderising/jvm/cmd/CommandParser.java | 144 +++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../com/coderising/jvm/cmd/LdcCmd.java | 29 + .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 + .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 + .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 ++ .../coderising/jvm/constant/ClassInfo.java | 0 .../coderising/jvm/constant/ConstantInfo.java | 0 .../coderising/jvm/constant/ConstantPool.java | 0 .../coderising/jvm/constant/FieldRefInfo.java | 0 .../coderising/jvm/constant/FloatInfo.java | 0 .../coderising/jvm/constant/IntegerInfo.java | 0 .../jvm/constant/MethodRefInfo.java | 0 .../jvm/constant/NameAndTypeInfo.java | 0 .../jvm/constant/NullConstantInfo.java | 0 .../coderising/jvm/constant/StringInfo.java | 0 .../com/coderising/jvm/constant/UTF8Info.java | 0 .../com/coderising/jvm/field/Field.java | 42 + .../jvm/loader/ByteCodeIterator.java | 16 + .../jvm/loader/ClassFileLoader.java | 0 .../jvm/loader/ClassFileLoader_backup.java | 0 .../jvm/loader/ClassFileParser.java | 45 +- .../com/coderising/jvm/method/Method.java | 76 ++ .../jvm/print/ClassFilePrinter.java | 54 ++ .../jvm/print/ConstantPoolPrinter.java | 25 + .../jvm/test/ClassFileloaderTest.java | 353 +++++++ .../com/coderising/jvm/test/EmployeeV1.java | 0 .../com/coderising/jvm/util/Util.java | 0 .../src/com/coding/basic/Stack.java | 65 -- .../coding/basic/{ => array}/ArrayList.java | 6 +- .../src/com/coding/basic/array/List.java | 9 + .../com/coding/basic/linklist/LinkedList.java | 2 +- .../src/com/coding/basic/stack/Stack.java | 4 +- .../src/com/coding/basic/stack/StackUtil.java | 26 +- .../com/coding/basic/stack/StackUtilTest.java | 76 ++ .../coding/basic/stack/expr/InfixExpr.java | 98 ++ .../basic/stack/expr/InfixExprTest.java | 57 ++ .../basic/stack/expr/InfixToPostfix.java | 57 ++ .../coding/basic/stack/expr/PostfixExpr.java | 51 + .../basic/stack/expr/PostfixExprTest.java | 41 + .../coding/basic/stack/expr/PrefixExpr.java | 18 + .../basic/stack/expr/PrefixExprTest.java | 45 + .../com/coding/basic/stack/expr/Token.java | 50 + .../coding/basic/stack/expr/TokenParser.java | 57 ++ .../basic/stack/expr/TokenParserTest.java | 41 + .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 108 +++ .../coderising/jvm/attr/LineNumberTable.java | 67 ++ .../jvm/attr/LocalVariableItem.java | 39 + .../jvm/attr/LocalVariableTable.java | 58 ++ .../coderising/jvm/attr/StackMapTable.java | 30 + .../src/com/coderising/jvm/clz/ClassFile.java | 35 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 + .../coderising/jvm/cmd/ByteCodeCommand.java | 128 +++ .../com/coderising/jvm/cmd/CommandParser.java | 85 ++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 + .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 + .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 + .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 ++ .../coderising/jvm/constant/ClassInfo.java | 4 + .../coderising/jvm/constant/ConstantInfo.java | 16 +- .../coderising/jvm/constant/ConstantPool.java | 4 +- .../coderising/jvm/constant/FieldRefInfo.java | 4 + .../jvm/constant/MethodRefInfo.java | 8 +- .../jvm/constant/NameAndTypeInfo.java | 6 + .../jvm/constant/NullConstantInfo.java | 4 + .../coderising/jvm/constant/StringInfo.java | 6 + .../com/coderising/jvm/constant/UTF8Info.java | 5 + .../src/com/coderising/jvm/field/Field.java | 47 + .../jvm/loader/ByteCodeIterator.java | 44 +- .../jvm/loader/ClassFileParser.java | 32 + .../src/com/coderising/jvm/method/Method.java | 98 ++ .../jvm/print/ClassFilePrinter.java | 45 + .../jvm/print/ConstantPoolPrinter.java | 83 ++ .../jvm/test/ClassFileloaderTest.java | 167 +++- .../coding/basic/stack/expr/InfixExpr.java | 22 +- .../basic/stack/expr/InfixToPostfix.java | 50 +- .../basic/stack/expr/InfixToPostfixTest.java | 41 + .../com/coderising/jvm/test/MiniJVMTest.java | 28 + 1296 files changed, 61104 insertions(+), 6100 deletions(-) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrameTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LinkedList.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/CircleQueue.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/queue/QueueWithTwoStacks.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackUtil.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExpr.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExprTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExpr.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LineNumberTable.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileParser.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/test.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/method/Method.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ClassFilePrinter.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/print/ConstantPoolPrinter.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/test/ClassFileloaderTest.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LineNumberTable.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java delete mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java create mode 100644 group02/812350401/src/main/resources/jvm/com/github/miniyk2012/coding2017/jvm/test/EmployeeV1.class rename group02/812350401/src/main/{java/com/github/miniyk2012/coding2017/coderising/litestruts => resources/struts}/struts.xml (100%) rename group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/{ => stack}/StackTest.java (86%) create mode 100644 group02/812350401/src/test/java/com/github/miniyk2012/coding2017/basic/stack/StackUtilTest.java create mode 100644 group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java rename group12/2258659044/zj-2017/src/com/coderising/jvm/{loader/ClassFileLoaderUtil.java => util/Util.java} (69%) delete mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/Stack.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java rename group12/2258659044/zj-2017/src/test/com/coding/basic/{ => stack}/StackTest.java (82%) create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group12/247565311/week567_miniJVM/attr/AttrFactory.java create mode 100644 group12/247565311/week567_miniJVM/constant/InfoFactory.java rename group12/247565311/week567_miniJVM/{test => loader}/ClassFileLoaderTest.java (93%) create mode 100644 group12/382266293/coding/basic/stack/expr/InfixExprS.java create mode 100644 group12/382266293/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group12/382266293/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group12/382266293/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group12/382266293/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group12/382266293/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group12/382266293/coding/basic/stack/expr/TParser.java create mode 100644 group12/382266293/coding/basic/stack/expr/Token.java create mode 100644 group12/382266293/coding/basic/stack/expr/TokenParser.java create mode 100644 group12/382266293/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group12/446031103/src/com/coderising/jvm/field/Field.java create mode 100644 group12/446031103/src/com/coderising/jvm/method/Method.java create mode 100644 group12/446031103/src/com/datastructure/stack/StackUtilTest.java create mode 100644 group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java create mode 100644 group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java create mode 100644 group15/1507_977996067/src/task7/expr/InfixExpr.java create mode 100644 group15/1507_977996067/src/task7/expr/InfixExprTest.java create mode 100644 group15/1507_977996067/src/task7/expr/PostfixExpr.java create mode 100644 group15/1507_977996067/src/task7/expr/PostfixExprTest.java create mode 100644 group15/1507_977996067/src/task7/expr/PrefixExpr.java create mode 100644 group15/1507_977996067/src/task7/expr/PrefixExprTest.java create mode 100644 group15/1507_977996067/src/task7/expr/Token.java create mode 100644 group15/1507_977996067/src/task7/expr/TokenParser.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java create mode 100644 group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java create mode 100644 group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java create mode 100644 group15/1507_977996067/src/task7/jvm/clz/ClassFile.java create mode 100644 group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/StringInfo.java create mode 100644 group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java create mode 100644 group15/1507_977996067/src/task7/jvm/field/Field.java create mode 100644 group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java create mode 100644 group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java create mode 100644 group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java create mode 100644 group15/1507_977996067/src/task7/jvm/method/Method.java create mode 100644 group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java create mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java create mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java create mode 100644 group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java create mode 100644 group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java create mode 100644 group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java create mode 100644 group15/1507_977996067/src/task7/jvm/util/Util.java create mode 100644 group17/102228177/work3_26/src/com/coderising/jvm/loader/ClassFileLoader.java rename {group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader => group17/102228177/work3_26/src/com/coderising/jvm/test}/ClassFileloaderTest.java (79%) rename {group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader => group17/102228177/work3_26/src/com/coderising/jvm/test}/EmployeeV1.java (88%) create mode 100644 group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/AccessFlag.java rename {group27/383117348 => group17/102228177/work4_09}/src/com/coderising/jvm/clz/ClassFile.java (95%) create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileParser.java rename {group27/383117348 => group17/102228177/work4_09}/src/com/coderising/jvm/test/ClassFileloaderTest.java (94%) create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/ArrayList.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/List.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java create mode 100644 group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/method/Method.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/ArrayList.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/List.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/Token.java create mode 100644 group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java create mode 100644 group17/1158154002/src/test04/loader/ClassFileLoader.java create mode 100644 group17/1158154002/src/test04/loader/ClassFileloaderTest.java create mode 100644 group17/1158154002/src/test04/loader/EmployeeV1.java create mode 100644 group17/1158154002/src/test04/lru/LRUPageFrame.java create mode 100644 group17/1158154002/src/test04/lru/LRUPageFrameTest.java create mode 100644 group17/1158154002/src/test05/stack/Stack.java create mode 100644 group17/1158154002/src/test05/stack/StackTest.java create mode 100644 group17/1158154002/src/test05/stack/StackUtil.java create mode 100644 group17/1158154002/src/test06/expr/InfixExpr.java create mode 100644 group17/1158154002/src/test06/expr/InfixExprTest.java create mode 100644 group17/1158154002/src/test07/expr/InfixToPostfix.java create mode 100644 group17/1158154002/src/test07/expr/InfixToPostfixTest.java create mode 100644 group17/1158154002/src/test07/expr/PostfixExpr.java create mode 100644 group17/1158154002/src/test07/expr/PostfixExprTest.java create mode 100644 group17/1158154002/src/test07/expr/PrefixExpr.java create mode 100644 group17/1158154002/src/test07/expr/PrefixExprTest.java create mode 100644 group17/1158154002/src/test07/expr/Token.java create mode 100644 group17/1158154002/src/test07/expr/TokenParser.java create mode 100644 group17/1158154002/src/test07/expr/TokenParserTest.java delete mode 100644 group17/1204187480/code/homework/basic/pom.xml create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/EmployeeV1.java rename group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/{action => }/LoginAction.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/BinaryTreeNode.java (94%) rename {group27/383117348/src => group17/1204187480/code/homework/coding/src/main/java}/com/coding/basic/Iterator.java (93%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/List.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/Queue.java (87%) rename group17/1204187480/code/homework/{basic => coding}/src/main/java/com/coding/basic/Stack.java (93%) rename group17/1204187480/code/homework/{basic/src/main/java/com/coding/basic => coding/src/main/java/com/coding/basic/array}/ArrayList.java (95%) rename group17/1204187480/code/homework/{coderising/src/main/java/com/coderising => coding/src/main/java/com/coding/basic}/array/ArrayUtil.java (99%) create mode 100644 group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java rename group17/1204187480/code/homework/{basic/src/main/java/com/coding/basic => coding/src/main/java/com/coding/basic/linklist}/LinkedList.java (98%) rename group17/1204187480/code/homework/{basic => coding}/src/test/java/com/coding/api/ArraysTest.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/test/java/com/coding/api/SystemTest.java (95%) rename group17/1204187480/code/homework/{basic => coding}/src/test/java/com/coding/basic/ArrayListTest.java (93%) rename group17/1204187480/code/homework/{basic => coding}/src/test/java/com/coding/basic/LinkedListTest.java (96%) create mode 100644 group17/1204187480/note/todo/homework.md delete mode 100644 group17/1264835468/src/assignment/MyStack.java rename group17/1264835468/src/assignment/{MyQueue.java => Queue.java} (95%) create mode 100644 group17/1264835468/src/assignment/Stack.java create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java create mode 100644 group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java create mode 100644 group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java create mode 100644 group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java create mode 100644 group17/1264835468/src/assignment0326/jvm/loader/ClassFileParser.java create mode 100644 group17/1264835468/src/assignment0326/jvm/util/Util.java delete mode 100644 group17/1264835468/src/assignment0326/lru/Clock.java create mode 100644 group17/1264835468/src/assignment0405/StackUtil.java create mode 100644 group17/1264835468/src/assignment0405/StackUtilTest.java create mode 100644 group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/InvalidAttributeInfoException.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group17/1282579502/src/com/coderising/jvm/attr/StackMapTable.java create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/AccessFlag.java create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/ClassFile.java create mode 100755 group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/FloatRefInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/IntegerInfo.java create mode 100644 group17/1282579502/src/com/coderising/jvm/constant/InvalidConstantInfoTypeException.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/StringInfo.java create mode 100755 group17/1282579502/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group17/1282579502/src/com/coderising/jvm/field/Field.java create mode 100644 group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java create mode 100644 group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java create mode 100755 group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100755 group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group17/1282579502/src/com/coderising/jvm/method/InvalidMethodInfoException.java create mode 100644 group17/1282579502/src/com/coderising/jvm/method/Method.java create mode 100644 group17/1282579502/src/com/coderising/jvm/test/ByteCodeIteratorTest.java mode change 100644 => 100755 group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java create mode 100755 group17/1282579502/src/com/coderising/jvm/util/Util.java create mode 100755 group17/1282579502/src/com/coding/basic/stack/Stack.java create mode 100755 group17/1282579502/src/com/coding/basic/stack/StackUtil.java create mode 100644 group17/1282579502/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group17/1282579502/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group17/785396327/4.16/cmd/BiPushCmd.java create mode 100644 group17/785396327/4.16/cmd/ByteCodeCommand.java create mode 100644 group17/785396327/4.16/cmd/CommandParser.java create mode 100644 group17/785396327/4.16/cmd/GetFieldCmd.java create mode 100644 group17/785396327/4.16/cmd/GetStaticFieldCmd.java create mode 100644 group17/785396327/4.16/cmd/InvokeSpecialCmd.java create mode 100644 group17/785396327/4.16/cmd/InvokeVirtualCmd.java create mode 100644 group17/785396327/4.16/cmd/LdcCmd.java create mode 100644 group17/785396327/4.16/cmd/NewObjectCmd.java create mode 100644 group17/785396327/4.16/cmd/NoOperandCmd.java create mode 100644 group17/785396327/4.16/cmd/OneOperandCmd.java create mode 100644 group17/785396327/4.16/cmd/PutFieldCmd.java create mode 100644 group17/785396327/4.16/cmd/TwoOperandCmd.java create mode 100644 group17/785396327/4.16/print/ClassFilePrinter.java create mode 100644 group17/785396327/4.16/print/ConstantPoolPrinter.java create mode 100644 group17/785396327/4.23/engine/ExecutionResult.java create mode 100644 group17/785396327/4.23/engine/ExecutorEngine.java create mode 100644 group17/785396327/4.23/engine/FrameResult.java create mode 100644 group17/785396327/4.23/engine/Heap.java create mode 100644 group17/785396327/4.23/engine/JavaObject.java create mode 100644 group17/785396327/4.23/engine/MethodArea.java create mode 100644 group17/785396327/4.23/engine/MiniJVM.java create mode 100644 group17/785396327/4.23/engine/StackFrame.java create mode 100644 group17/785396327/4.23/queue/CircleQueue.java create mode 100644 group17/785396327/4.23/queue/CircleQueueTest.java create mode 100644 group17/785396327/4.23/queue/Josephus.java create mode 100644 group17/785396327/4.23/queue/JosephusTest.java create mode 100644 group17/785396327/4.23/queue/QueueWithTwoStacks.java create mode 100644 group17/785396327/4.23/queue/QueueWithTwoStacksTest.java create mode 100644 group17/785396327/4.5/clz/AccessFlag.java create mode 100644 group17/785396327/4.5/clz/ClassFile.java create mode 100644 group17/785396327/4.5/clz/ClassIndex.java create mode 100644 group17/785396327/4.5/constant/ClassInfo.java create mode 100644 group17/785396327/4.5/constant/ConstantInfo.java create mode 100644 group17/785396327/4.5/constant/ConstantPool.java create mode 100644 group17/785396327/4.5/constant/FieldRefInfo.java create mode 100644 group17/785396327/4.5/constant/MethodRefInfo.java create mode 100644 group17/785396327/4.5/constant/NameAndTypeInfo.java create mode 100644 group17/785396327/4.5/constant/NullConstantInfo.java create mode 100644 group17/785396327/4.5/constant/StringInfo.java create mode 100644 group17/785396327/4.5/constant/UTF8Info.java create mode 100644 group17/785396327/4.5/iterator/ByteCodeIterator.java create mode 100644 group17/785396327/4.5/parse/ClassFilePaser.java create mode 100644 group17/785396327/4.5/stack/MyStack.java create mode 100644 group17/785396327/4.5/stack/StackUtil.java create mode 100644 group17/785396327/4.5/stack/StackUtilTest.java create mode 100644 group17/785396327/4.5/test/ClassFileloaderTest.java create mode 100644 group17/785396327/4.5/util/Util.java create mode 100644 group17/785396327/4.9/attr/AttributeInfo.java create mode 100644 group17/785396327/4.9/attr/CodeAttr.java create mode 100644 group17/785396327/4.9/attr/LineNumberTable.java create mode 100644 group17/785396327/4.9/attr/LocalVariableItem.java create mode 100644 group17/785396327/4.9/attr/LocalVariableTable.java create mode 100644 group17/785396327/4.9/attr/StackMapTable.java create mode 100644 group17/785396327/4.9/expr/ExprParser.java create mode 100644 group17/785396327/4.9/expr/InfixExpr.java create mode 100644 group17/785396327/4.9/expr/InfixExprTest.java create mode 100644 group17/785396327/4.9/expr/InfixToPostfix.java create mode 100644 group17/785396327/4.9/expr/InfixToPostfixTest.java create mode 100644 group17/785396327/4.9/expr/OperEnum.java create mode 100644 group17/785396327/4.9/expr/PostfixExpr.java create mode 100644 group17/785396327/4.9/expr/PostfixExprTest.java create mode 100644 group17/785396327/4.9/expr/PrefixExpr.java create mode 100644 group17/785396327/4.9/expr/PrefixExprTest.java create mode 100644 group17/785396327/4.9/expr/Token.java create mode 100644 group17/785396327/4.9/expr/TokenParser.java create mode 100644 group17/785396327/4.9/expr/TokenParserTest.java create mode 100644 group17/785396327/4.9/field/Field.java create mode 100644 group17/785396327/4.9/method/Method.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java rename group17/82427129/JavaUtil/src/main/java/com/coding/basic/{ => stack}/Stack.java (58%) create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java create mode 100644 group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group17/article/20170409-20170416.md create mode 100644 group17/article/20170416-20170423.md create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java rename group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/{ => expr}/InfixExprTest.java (97%) create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfixTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExprTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PrefixExpr.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PrefixExprTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/Token.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java create mode 100644 group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java create mode 100644 group24/315863321/src/main/java/jvm/loader/Directory.java create mode 100644 group24/315863321/src/main/java/jvm/test/ClassFileloaderTest.java create mode 100644 group24/315863321/src/main/java/jvm/test/EmployeeV1.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/InfixToPostfix.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/InfixToPostfixTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/PostfixExpr.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/PostfixExprTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/PrefixExpr.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/PrefixExprTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/Token.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/TokenParser.java create mode 100644 group24/448641125/src/com/donaldy/basic/expr/TokenParserTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/Josephus.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/Queue.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java create mode 100644 group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/Heap.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java create mode 100644 group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java create mode 100644 group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java create mode 100644 group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java create mode 100644 group24/494800949/EmployeeV1-javap.txt create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/expr/InfixExpr.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/expr/Token.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java create mode 100644 group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java create mode 100644 group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java create mode 100644 group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java create mode 100644 group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java create mode 100644 group24/494800949/src/test/java/com/coding/week6/expr/InfixExprTestTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayUtil.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/List.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/liteStruts/LoginAction.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/liteStruts/ReadXML.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/liteStruts/Struts.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/liteStruts/View.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/Demo.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/DownloadThread.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/FileDownloader.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/api/Connection.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionException.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionManager.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/api/DownloadListener.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionImpl.java create mode 100644 group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionManagerImpl.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/StackTest.java create mode 100644 group24/75939388/learning2017/src/test/java/download/FileDownloaderTest.java create mode 100644 group24/75939388/learning2017/src/test/java/liteStruts/StrutsTest.java create mode 100644 group24/Homework/1-FirstWeek/ArrayList.java create mode 100644 group24/Homework/1-FirstWeek/BinaryTreeNode.java create mode 100644 group24/Homework/1-FirstWeek/Iterator.java create mode 100644 group24/Homework/1-FirstWeek/LinkedList.java rename {group27/513274874/data-structure/src/com/coding/basic => group24/Homework/1-FirstWeek}/List.java (95%) create mode 100644 group24/Homework/1-FirstWeek/Queue.java create mode 100644 group24/Homework/1-FirstWeek/Stack.java create mode 100644 group24/Homework/2-SecondWeek/litestruts/LoginAction.java create mode 100644 group24/Homework/2-SecondWeek/litestruts/Struts.java create mode 100644 group24/Homework/2-SecondWeek/litestruts/StrutsTest.java create mode 100644 group24/Homework/2-SecondWeek/litestruts/View.java create mode 100644 group24/Homework/3-ThirdWeek/LinkedList.java create mode 100644 group24/Homework/3-ThirdWeek/download/DownloadThread.java create mode 100644 group24/Homework/3-ThirdWeek/download/FileDownloader.java create mode 100644 group24/Homework/3-ThirdWeek/download/FileDownloaderTest.java create mode 100644 group24/Homework/3-ThirdWeek/download/api/Connection.java create mode 100644 group24/Homework/3-ThirdWeek/download/api/ConnectionException.java create mode 100644 group24/Homework/3-ThirdWeek/download/api/ConnectionManager.java create mode 100644 group24/Homework/3-ThirdWeek/download/api/DownloadListener.java create mode 100644 group24/Homework/3-ThirdWeek/download/impl/ConnectionImpl.java create mode 100644 group24/Homework/3-ThirdWeek/download/impl/ConnectionManagerImpl.java create mode 100644 group24/Homework/4-FourWeek/LRUPageFrame.java create mode 100644 group24/Homework/4-FourWeek/LRUPageFrameTest.java create mode 100644 group24/Homework/4-FourWeek/jvm/loader/ClassFileLoader .java create mode 100644 group24/Homework/4-FourWeek/jvm/test/ClassFileloaderTest.java create mode 100644 group24/Homework/4-FourWeek/jvm/test/EmployeeV1.java create mode 100644 group24/Homework/5-FifthWeek/README.txt create mode 100644 group24/Homework/5-FifthWeek/StackUtil.java create mode 100644 group24/Homework/5-FifthWeek/StackUtilTest.java create mode 100644 group24/Homework/5-FifthWeek/jvm/clz/AccessFlag.java create mode 100644 group24/Homework/5-FifthWeek/jvm/clz/ClassFile .java create mode 100644 group24/Homework/5-FifthWeek/jvm/clz/ClassIndex.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/ClassInfo.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/ConstantInfo.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/ConstantPool.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/FieldRefInfo.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/MethodRefInfo.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/NameAndTypeInfo.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/NullConstantInfo.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/StringInfo.java create mode 100644 group24/Homework/5-FifthWeek/jvm/constant/UTF8Info.java create mode 100644 group24/Homework/5-FifthWeek/jvm/loader/ByteCodeIterator.java create mode 100644 group24/Homework/5-FifthWeek/jvm/loader/ClassFileLoader.java create mode 100644 group24/Homework/5-FifthWeek/jvm/loader/ClassFileParser.java create mode 100644 group24/Homework/5-FifthWeek/jvm/test/ClassFileloaderTest.java create mode 100644 group24/Homework/5-FifthWeek/jvm/test/EmployeeV1.java create mode 100644 group24/Homework/5-FifthWeek/jvm/util/Util.java create mode 100644 group24/Homework/6-SixWeek/InfixExpr.java create mode 100644 group24/Homework/6-SixWeek/InfixExprTest.java create mode 100644 group24/Homework/6-SixWeek/README.txt create mode 100644 group24/Homework/6-SixWeek/jvm/attr/AttributeInfo.java create mode 100644 group24/Homework/6-SixWeek/jvm/attr/CodeAttr.java create mode 100644 group24/Homework/6-SixWeek/jvm/attr/LineNumberTable.java create mode 100644 group24/Homework/6-SixWeek/jvm/attr/LocalVariableItem.java create mode 100644 group24/Homework/6-SixWeek/jvm/attr/LocalVariableTable.java create mode 100644 group24/Homework/6-SixWeek/jvm/attr/StackMapTable.java create mode 100644 group24/Homework/6-SixWeek/jvm/clz/AccessFlag.java create mode 100644 group24/Homework/6-SixWeek/jvm/clz/ClassFile.java create mode 100644 group24/Homework/6-SixWeek/jvm/clz/ClassIndex.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/ClassInfo.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/ConstantInfo.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/ConstantPool.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/FieldRefInfo.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/MethodRefInfo.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/NameAndTypeInfo.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/NullConstantInfo.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/StringInfo.java create mode 100644 group24/Homework/6-SixWeek/jvm/constant/UTF8Info.java create mode 100644 group24/Homework/6-SixWeek/jvm/field/Field.java create mode 100644 group24/Homework/6-SixWeek/jvm/loader/ByteCodeIterator.java create mode 100644 group24/Homework/6-SixWeek/jvm/loader/ClassFileLoader.java create mode 100644 group24/Homework/6-SixWeek/jvm/loader/ClassFileParser.java create mode 100644 group24/Homework/6-SixWeek/jvm/method/Method.java create mode 100644 group24/Homework/6-SixWeek/jvm/test/ClassFileloaderTest.java create mode 100644 group24/Homework/6-SixWeek/jvm/test/EmployeeV1.java create mode 100644 group24/Homework/6-SixWeek/jvm/util/Util.java create mode 100644 group24/Homework/7-SevenWeek/InfixToPostfix.java create mode 100644 group24/Homework/7-SevenWeek/PostfixExpr.java create mode 100644 group24/Homework/7-SevenWeek/PostfixExprTest.java create mode 100644 group24/Homework/7-SevenWeek/README.txt create mode 100644 group24/Homework/7-SevenWeek/jvm/attr/AttributeInfo.java create mode 100644 group24/Homework/7-SevenWeek/jvm/attr/CodeAttr.java create mode 100644 group24/Homework/7-SevenWeek/jvm/attr/LineNumberTable.java create mode 100644 group24/Homework/7-SevenWeek/jvm/attr/LocalVariableItem.java create mode 100644 group24/Homework/7-SevenWeek/jvm/attr/LocalVariableTable.java create mode 100644 group24/Homework/7-SevenWeek/jvm/attr/StackMapTable.java create mode 100644 group24/Homework/7-SevenWeek/jvm/clz/AccessFlag.java create mode 100644 group24/Homework/7-SevenWeek/jvm/clz/ClassFile.java create mode 100644 group24/Homework/7-SevenWeek/jvm/clz/ClassIndex.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/BiPushCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/ByteCodeCommand.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/CommandParser.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/GetFieldCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/LdcCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/NewObjectCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/NoOperandCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/OneOperandCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/PutFieldCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/cmd/TwoOperandCmd.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/ClassInfo.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/ConstantInfo.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/ConstantPool.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/FieldRefInfo.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/MethodRefInfo.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/NameAndTypeInfo.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/NullConstantInfo.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/StringInfo.java create mode 100644 group24/Homework/7-SevenWeek/jvm/constant/UTF8Info.java create mode 100644 group24/Homework/7-SevenWeek/jvm/field/Field.java create mode 100644 group24/Homework/7-SevenWeek/jvm/loader/ByteCodeIterator.java create mode 100644 group24/Homework/7-SevenWeek/jvm/loader/ClassFileLoader.java create mode 100644 group24/Homework/7-SevenWeek/jvm/loader/ClassFileParser.java create mode 100644 group24/Homework/7-SevenWeek/jvm/method/Method.java create mode 100644 group24/Homework/7-SevenWeek/jvm/print/ClassFilePrinter.java create mode 100644 group24/Homework/7-SevenWeek/jvm/print/ConstantPoolPrinter.java create mode 100644 group24/Homework/7-SevenWeek/jvm/test/ClassFileloaderTest.java create mode 100644 group24/Homework/7-SevenWeek/jvm/test/EmployeeV1.java create mode 100644 group24/Homework/7-SevenWeek/jvm/util/Util.java create mode 100644 group24/Homework/8-EighthWeek/attr/AttributeInfo.java create mode 100644 group24/Homework/8-EighthWeek/attr/CodeAttr.java create mode 100644 group24/Homework/8-EighthWeek/attr/LineNumberTable.java create mode 100644 group24/Homework/8-EighthWeek/attr/LocalVariableItem.java create mode 100644 group24/Homework/8-EighthWeek/attr/LocalVariableTable.java create mode 100644 group24/Homework/8-EighthWeek/attr/StackMapTable.java create mode 100644 group24/Homework/8-EighthWeek/clz/AccessFlag.java create mode 100644 group24/Homework/8-EighthWeek/clz/ClassFile.java create mode 100644 group24/Homework/8-EighthWeek/clz/ClassIndex.java create mode 100644 group24/Homework/8-EighthWeek/cmd/BiPushCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java create mode 100644 group24/Homework/8-EighthWeek/cmd/CommandParser.java create mode 100644 group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/LdcCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java create mode 100644 group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java create mode 100644 group24/Homework/8-EighthWeek/constant/ClassInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/ConstantInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/ConstantPool.java create mode 100644 group24/Homework/8-EighthWeek/constant/FieldRefInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/MethodRefInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/NullConstantInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/StringInfo.java create mode 100644 group24/Homework/8-EighthWeek/constant/UTF8Info.java create mode 100644 group24/Homework/8-EighthWeek/engine/ExecutionResult.java create mode 100644 group24/Homework/8-EighthWeek/engine/ExecutorEngine.java create mode 100644 group24/Homework/8-EighthWeek/engine/Heap.java create mode 100644 group24/Homework/8-EighthWeek/engine/JavaObject.java create mode 100644 group24/Homework/8-EighthWeek/engine/MethodArea.java create mode 100644 group24/Homework/8-EighthWeek/engine/MiniJVM.java create mode 100644 group24/Homework/8-EighthWeek/engine/StackFrame.java create mode 100644 group24/Homework/8-EighthWeek/field/Field.java create mode 100644 group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java create mode 100644 group24/Homework/8-EighthWeek/loader/ClassFileLoader.java create mode 100644 group24/Homework/8-EighthWeek/loader/ClassFileParser.java create mode 100644 group24/Homework/8-EighthWeek/method/Method.java create mode 100644 group24/Homework/8-EighthWeek/print/ClassFilePrinter.java create mode 100644 group24/Homework/8-EighthWeek/print/ConstantPoolPrinter.java create mode 100644 group24/Homework/8-EighthWeek/test/ClassFileloaderTest.java create mode 100644 group24/Homework/8-EighthWeek/test/EmployeeV1.java create mode 100644 group24/Homework/8-EighthWeek/util/Util.java rename group27/383117348/{src => data-structure}/com/coderising/download/DownloadThread.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/FileDownloader.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/FileDownloaderTest.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/api/Connection.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/api/ConnectionException.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/api/ConnectionManager.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/api/DownloadListener.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/impl/ConnectionImpl.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/download/impl/ConnectionManagerImpl.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/LoginAction.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/Struts.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/StrutsTest.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/View.java (100%) rename group27/383117348/{src => data-structure}/com/coderising/litestruts/struts.xml (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/BinaryTreeNode.java (100%) rename {group17/1204187480/code/homework/basic/src/main/java => group27/383117348/data-structure}/com/coding/basic/Iterator.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/List.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/array/ArrayList.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/array/ArrayUtil.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LRUPageFrame.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LRUPageFrameTest.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/linklist/LinkedList.java (100%) create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/Josephus.java create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java rename group27/383117348/{src/com/coding/basic => data-structure/com/coding/basic/queue}/Queue.java (91%) create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java rename group27/383117348/{src => data-structure}/com/coding/basic/stack/Stack.java (100%) rename group27/383117348/{src => data-structure}/com/coding/basic/stack/StackUtil.java (100%) create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java rename group27/383117348/{src => data-structure}/com/coding/basic/stack/test/StackUtilTest.java (100%) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/clz/AccessFlag.java (100%) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/clz/ClassIndex.java (100%) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ClassInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ConstantInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/ConstantPool.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/FieldRefInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/FloatInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/IntegerInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/MethodRefInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/NameAndTypeInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/NullConstantInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/StringInfo.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/constant/UTF8Info.java (100%) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ByteCodeIterator.java (73%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileLoader.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileLoader_backup.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/loader/ClassFileParser.java (75%) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/test/EmployeeV1.java (100%) rename group27/383117348/{src => mini-jvm}/com/coderising/jvm/util/Util.java (100%) delete mode 100644 group27/513274874/data-structure/src/com/coding/basic/Stack.java rename group27/513274874/data-structure/src/com/coding/basic/{ => array}/ArrayList.java (96%) create mode 100644 group27/513274874/data-structure/src/com/coding/basic/array/List.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/method/Method.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group27/513274874/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java diff --git a/group01/275150374/275150374Learning/.idea/description.html b/group01/275150374/275150374Learning/.idea/description.html index db5f129556..0f928c44a1 100644 --- a/group01/275150374/275150374Learning/.idea/description.html +++ b/group01/275150374/275150374Learning/.idea/description.html @@ -1 +1,15 @@ -Simple Java application that includes a class with main() method \ No newline at end of file +Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..482157d08c --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/linklist/LRUPageFrame.java @@ -0,0 +1,245 @@ +package com.github.orajavac.coding2017.basic.linklist; + +public class LRUPageFrame { +private static class Node { + + Node prev; + Node next; + Object pageNum=10000; + String flag; + + Node() { + } + } + + private int capacity; + private int length; + + + private Node first;// 链表头 + private Node last;// 链表尾 + + public LRUPageFrame(){ + init(); + } + + public LRUPageFrame(int capacity) { + + this.capacity = capacity; + + init(); + } + + public void init(){ + first = new Node(); + last = new Node(); + last.flag = "last"; //用来标识最后一个节点是链表尾,在这里链表尾并不算做内存页 + first.flag = "first"; //用来标识链表头,在这里链表头并不算做内存页 + first.next = last; + last.prev=first; + } + + /** + * 获取缓存中对象 + * + * @param key + * @return + */ + public void access(int pageNum) { + if(lookup(pageNum)){ + ; + }else{ + if (lengthlen||index<=0){ + throw new RuntimeException("下标不存在"+index); + } + Node e = head; + int i=0; + while (e.next != null){ + i++; + if (i == index){ + return e.next.data; + } + e=e.next; + } + return null; + } + + public Object remove(int index){ + int len=Integer.parseInt(head.data.toString()); + if (index>len||index<=0){ + throw new RuntimeException("下标不存在"+index); + } + Node e = head; + Object data = null; + int i=0; + while (e.next != null){ + i++; + if (i == index){ + len--; + head.data = len; + data = e.next.data; + e.next = e.next.next; + return data; + } + e=e.next; + } + return null; + } + + public Object removeFirst(){ + return remove(1); + } + + public Object removeLast(){ + return remove(Integer.parseInt(head.data.toString())); + } + + public void addFirst(Object o){ + Node e = head.next; + Node n = new Node(); + n.data=o; + n.next=e; + size++; + head.next=n; + head.data=size; + } + + public void addLast(Object o){ + add(o); + } + + public int size(){ + return Integer.parseInt(head.data.toString()); + } + + public void listNode(){ + Node n = head; + StringBuffer buffer = new StringBuffer(); + while (n.next!=null){ + buffer.append(n.next.data + " -> "); + n=n.next; + } + if(buffer.length()>0){ + System.out.print(buffer.substring(0,buffer.length()-3)); + System.out.println(); + } + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + if (i <= 0 || length<=0){ + throw new RuntimeException("起始值、结束值都不能小于0等于"); + } + int len = length + i; + if (len > size){ + throw new RuntimeException("删除索引长度超过了链表长度"); + } + Node e = head; + int y = 0; + while (e.next != null){ + y++; + if (y == i){ + Node n = e.next; + while (n!=null){ + n = n.next; + if (y == length){ + break; + } + y++; + n=n.next; + } + } + e=e.next; + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + if (list==null||list.head==null){ + throw new RuntimeException("集合没有初始化"); + } + int[] elements = new int[Integer.parseInt(list.head.data.toString())]; + Node l = list.head; + Node n = head; + int len = 0; + int i = 0; + while (l.next!=null){ + len = 0; + n=head; + while(n.next!=null){ + len++; + if(len==Integer.parseInt(l.next.data.toString())){ + elements[i]=Integer.parseInt(n.next.data.toString()); + i++; + break; + } + n=n.next; + } + l = l.next; + } + return elements; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + if (list==null||list.head==null){ + throw new RuntimeException("集合没有初始化"); + } + Node l = list.head; + Node n = head; + int i = 0; + while (l.next!=null){ + n=head; + i=0; + while(n.next!=null){ + i++; + if(n.next.data.equals(l.next.data)){ + remove(i); + break; + } + n=n.next; + } + l = l.next; + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * 11->101->201->301->401->501->601->701 + * @param min + * @param max + */ + public void removeRange(int min, int max){ + if (min<=0||max<=0||min>max){ + throw new RuntimeException("录入不正确:"+min+","+max+" 应该大于min且小于max的元素"); + } + Node n = head; + int data = 0; + Node p = null; + while(n.next != null){ + data=Integer.parseInt(n.next.data.toString()); //11 + if(data>min&&data{ +private final static int DEFAULT_SIZE = 8; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + if (front==0&&rear==0){ + return true; + } + return false; + + } + + public int size() { + return DEFAULT_SIZE; + } + + + + public void enQueue(E data) { + if (rear==DEFAULT_SIZE&&elementData[0]==null){ + rear = 0; + elementData[rear]=data; + }else if (elementData[rear]==null){ + elementData[rear]=data; + }else{ + throw new RuntimeException("队列已满"); + } + rear++; + } + + @SuppressWarnings("unchecked") + public E deQueue() { + Object o = elementData[front]; + elementData[front] = null; + front++; + if (front == DEFAULT_SIZE){ + front = 0; + } + return (E)o; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java new file mode 100644 index 0000000000..05e692a8aa --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/queue/Josephus.java @@ -0,0 +1,40 @@ +package com.github.orajavac.coding2017.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + CircleQueue q = new CircleQueue(); + List l = new ArrayList(); + for (int i=1;i<=n;i++){ + q.enQueue(i); + } + for (int i=0;i l = execute(8,4); + for (int i=0;i { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.size()==0; + } + + + + public int size() { + return stack1.size(); + } + + + + public void enQueue(E item) { + int len1 = stack1.size(); + for (int i=0;i operator = new HashMap(); + + private Stack oper = new Stack(); + + private Stack num = new Stack(); + + public InfixExpr(String expr) { + this.expr = expr; + this.operator.put(this.ADD,1); + this.operator.put(this.SUB,1); + this.operator.put(this.MUL,2); + this.operator.put(this.DIV,2); + } + + public float evaluate() { + Object[] obj = Util.parseOperNumToArray(this.expr); + String key = null; + for (int i=0;i level2){ //2+3*4+5 栈顶运算符大于即将入压运算符 + operation(op,num.pop(),num.pop()); + }else if (level1 == level2){ //3-20+2 栈顶运算符等于即将入压运算符 + operation(op,num.pop(),num.pop()); + }else{ + oper.push(op); //把刚刚弹出,再压入栈 + oper.push(key); + } + } + if (oper.length() == 0){ + oper.push(key); + } + } + + public void operation(Object oper,Object num1,Object num2){ + Integer result = null; + if(oper.equals("*")){ + result = Integer.parseInt(num1.toString()) * Integer.parseInt(num2.toString()); + num.push(result); + } + if(oper.equals("/")){ + result = Integer.parseInt(num2.toString()) / Integer.parseInt(num1.toString()); + num.push(result); + } + if(oper.equals("+")){ + result = Integer.parseInt(num1.toString()) + Integer.parseInt(num2.toString()); + num.push(result); + } + if(oper.equals("-")){ + result = Integer.parseInt(num2.toString()) - Integer.parseInt(num1.toString()); + num.push(result); + } + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..733f48c7bb --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,55 @@ +package com.github.orajavac.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2+6"); + Assert.assertEquals(106.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3-4*5+2"); + Assert.assertEquals(-15, expr.evaluate(), 0.001f); + } + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..c3528d0abe --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,81 @@ +package com.github.orajavac.coding2017.basic.stack.expr; + +import java.util.HashMap; +import java.util.Map; +import com.github.orajavac.coding2017.basic.stack.Stack; +import com.github.orajavac.coding2017.jvm.util.Util; + +/* + * 后序表达式 + */ +public class PostfixExpr { + + String expr = null; + + private final String ADD = "+"; + + private final String SUB = "-"; + + private final String MUL = "*"; + + private final String DIV = "/"; + + private Map operator = new HashMap(); + + private Stack num = new Stack(); + + public PostfixExpr(String expr) { + this.expr = expr; + this.operator.put(this.ADD,1); + this.operator.put(this.SUB,1); + this.operator.put(this.MUL,2); + this.operator.put(this.DIV,2); + } + + public float evaluate() { + String[] expr = Util.parseOperatorToArray(this.expr); + for (int i=0;i operator = new HashMap(); + + private Stack num = new Stack(); + + public PrefixExpr(String expr) { + this.expr = expr; + this.operator.put(this.ADD,1); + this.operator.put(this.SUB,1); + this.operator.put(this.MUL,2); + this.operator.put(this.DIV,2); + } + + public float evaluate() { + String[] expr = Util.parseOperatorToArray(this.expr); + /** + * 4*2 + 6+9*2/3 -8 + * - + + 6 / *2 9 3 * 4 2 8 + */ + for (int i=expr.length-1;i>=0;i--){ + if (this.operator.containsKey(expr[i])){ + num.push(calculate(expr[i], + Float.parseFloat(num.pop().toString()), + Float.parseFloat(num.pop().toString()))); + }else{ + num.push(expr[i]); + } + } + return Float.parseFloat(num.pop().toString()); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..a27e05caa9 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,42 @@ +package com.github.orajavac.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3 * 4 5"); + Assert.assertEquals(26.0, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); + Assert.assertEquals(12.0, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29.0, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16.0, expr.evaluate(),0.001f); + } + + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..77ea35c265 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.github.orajavac.coding2017.jvm.attr; + +public abstract class AttributeInfo { + + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..acffda0f88 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/CodeAttr.java @@ -0,0 +1,93 @@ +package com.github.orajavac.coding2017.jvm.attr; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.cmd.ByteCodeCommand; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo{ + + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); + int exceptionTableLen = iter.nextU2ToInt(); + if (exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + } + int subAttrCount = iter.nextU2ToInt(); + for (int x=1;x<=subAttrCount;x++){ + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + iter.back(2); + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + }else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + }else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + }else{ + throw new RuntimeException("need code to process"); + } + } + return null; + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..5ddd8ce997 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.github.orajavac.coding2017.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..3228616eac --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/LocalVariableTable.java @@ -0,0 +1,49 @@ +package com.github.orajavac.coding2017.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(index,len); + int itemLen = iter.nextU2ToInt(); + for (int i=1;i<=itemLen;i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..e9d5430659 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/attr/StackMapTable.java @@ -0,0 +1,28 @@ +package com.github.orajavac.coding2017.jvm.attr; + +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..5bcce47ff1 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/AccessFlag.java @@ -0,0 +1,24 @@ +package com.github.orajavac.coding2017.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; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..f29ce707e1 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassFile.java @@ -0,0 +1,91 @@ +package com.github.orajavac.coding2017.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.github.orajavac.coding2017.jvm.constant.ClassInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.field.Field; +import com.github.orajavac.coding2017.jvm.method.Method; + +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..4959c05a2d --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.github.orajavac.coding2017.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; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..7ecc43d30e --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..62e56ecfc9 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..7223cb7afc --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..acd1d7202f --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..7bdc7ca76b --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ClassInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; +import com.github.orajavac.coding2017.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..f467b84f3f --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..f210141c66 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..41f73494e7 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..52d280cc0b --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..7a6781c152 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..f9d005287f --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..1fd6b367e1 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..4deb99ecd2 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.github.orajavac.coding2017.jvm.cmd; + +import com.github.orajavac.coding2017.jvm.clz.ClassFile; +import com.github.orajavac.coding2017.jvm.constant.ClassInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantInfo; +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.FieldRefInfo; +import com.github.orajavac.coding2017.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..61dcdd9d3f --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ClassInfo.java @@ -0,0 +1,30 @@ +package com.github.orajavac.coding2017.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(); + } + + @Override + public void accept(Visistor visitor) { + visitor.visitClassInfo(this); + + } +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..37055df0a2 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.github.orajavac.coding2017.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); + } + + public abstract void accept(Visistor visistor); + + public static interface Visistor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visitUTF8(UTF8Info info); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..304e78f8ba --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/ConstantPool.java @@ -0,0 +1,28 @@ +package com.github.orajavac.coding2017.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 int getSize() { + return this.constantInfos.size() -1; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..c9a06f397d --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/FieldRefInfo.java @@ -0,0 +1,60 @@ +package com.github.orajavac.coding2017.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(); + } + + @Override + public void accept(Visistor visitor) { + visitor.visitFieldRef(this); + + } +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..6e53f8db5c --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/MethodRefInfo.java @@ -0,0 +1,59 @@ +package com.github.orajavac.coding2017.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(); + } + + @Override + public void accept(Visistor visitor) { + visitor.visitMethodRef(this); + + } + +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..0f25bb4ef6 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.github.orajavac.coding2017.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()+")"; + } + + @Override + public void accept(Visistor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..64eff24eef --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/NullConstantInfo.java @@ -0,0 +1,19 @@ +package com.github.orajavac.coding2017.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + + @Override + public void accept(Visistor visitor) { + + + } + +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..2224a46e73 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/StringInfo.java @@ -0,0 +1,30 @@ +package com.github.orajavac.coding2017.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); + } + + @Override + public void accept(Visistor visitor) { + visitor.visitString(this); + } +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..bdceafe0f2 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/constant/UTF8Info.java @@ -0,0 +1,35 @@ +package com.github.orajavac.coding2017.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; + } + + @Override + public void accept(Visistor visitor) { + visitor.visitUTF8(this); + } + +} \ No newline at end of file diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java new file mode 100644 index 0000000000..40c8ad3a2c --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.github.orajavac.coding2017.jvm.field; + +import com.github.orajavac.coding2017.jvm.constant.ConstantPool; +import com.github.orajavac.coding2017.jvm.constant.UTF8Info; +import com.github.orajavac.coding2017.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..9cc6d5d9b9 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,56 @@ +package com.github.orajavac.coding2017.jvm.loader; + +import java.util.Arrays; + +import com.github.orajavac.coding2017.jvm.util.Util; + +public class ByteCodeIterator { + + private byte[] codes; + + private int pos; + + public ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + + public byte[] getBytes(int len){ + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public String nextU4ToHexString(){ + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public int nextU1ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); + } + + public int nextU4ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..ba0d450054 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/loader/ClassFileLoader.java @@ -0,0 +1,131 @@ +package com.github.orajavac.coding2017.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.github.orajavac.coding2017.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()); + } + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..81d0ba0e20 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/test/EmployeeV1.java @@ -0,0 +1,26 @@ +package com.github.orajavac.coding2017.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(); + + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java new file mode 100644 index 0000000000..cd3db5e063 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/jvm/util/Util.java @@ -0,0 +1,50 @@ +package com.github.orajavac.coding2017.jvm.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +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 l = new ArrayList(); + while(mat.find()){ + l.add(mat.group()); + } + /*Object[] obj = l.toArray(); + for (int i=0;i + diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java index d5cca25bf4..613163b38a 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/array/ArrayUtil.java @@ -4,367 +4,236 @@ import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; -public class ArrayUtil -{ - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin) - { - if(origin == null || origin.length == 0) - { - return ; - } - - for(int i=0, j = origin.length-1; i array2[j]) - { - newArray[count++] = array2[j++]; - } - else if(array1[i] == array2[j]) - { - newArray[count++] = array2[j++]; - i++; - } - } - while(i==array1.length && j= max) - { - break; - } - else - { - count++; - } - } - - return Arrays.copyOf(a, count); + // 将非零元素copy到新数组 + return Arrays.copyOf(b, count); + + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + if (array1 == null) { + return array2; } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max) - { - /* - * 思路:先生成素数数组,数组的最大值小于max - */ - //max小于3时,返回空数组 - if(max < 3) - { - return new int[0]; - } - int[] array = new int[max]; - int count = 0; + if (array2 == null) { + return array1; + } + int[] newArray = new int[array1.length + array2.length]; + // 应该让a1,a2两个数组先进行比较 比较后插入元素 + int i = 0; // array1下标 + int j = 0; // array2下标 + int count = 0; // array3下标 + while (i < array1.length && j < array2.length) { + if (array1[i] < array2[j]) { + newArray[count++] = array1[i++]; + } else if (array1[i] > array2[j]) { + newArray[count++] = array2[j++]; + } else if (array1[i] == array2[j]) { + newArray[count++] = array1[i++] = array2[j++]; + } + } + while (j == array2.length && i < array1.length) { + newArray[count++] = array1[i++]; + } + while (i == array1.length && j < array2.length) { + newArray[count++] = array2[j++]; + } + return Arrays.copyOf(newArray, count); + } - for(int n = 2; n < max; n++) - { - if(isPrime(n)) - { - array[count++] = n; - } - } - - return Arrays.copyOf(array, count); + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + * @throws Exception + */ + public int[] grow(int[] oldArray, int size) { + if (oldArray == null) { + return null; } + if (size < 0) { + throw new IndexOutOfBoundsException("size小于0"); + } + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; + } - private boolean isPrime(int n) - { - //判断当前n是不是素数 - int i = 2; - while(i < n) - { - if(n % i == 0) - break; - if(n % i != 0) - i++; - } - return i == n; + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if (max == 1) { + return new int[0]; } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) - { - if(max < 0) - { - return null; - } - int[] array = new int[max]; - int count = 0; - - for(int n = 2; n < max; n++) - { - int sum = 0; - for(int i=1; i= max) { + break; + } else { + count++; + } } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param s - * @return + + return Arrays.copyOf(a, count); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + /* + * 思路:先生成素数数组,数组的最大值小于max */ - public String join(int[] array, String seperator) - { - if(array == null ) - { - return null; - } - if(array.length == 0) - { - return ""; - } - - StringBuilder buffer = new StringBuilder(); - for(int i=0; i5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - @Test - public void testRemoveFirstHalf() { - aLinkedList.removeFirstHalf(); - assertEquals(0, aLinkedList.size()); - - aLinkedList.add(2); - aLinkedList.add(5); - aLinkedList.add(7); - aLinkedList.add(8); // [2,5,7,8] - - aLinkedList.removeFirstHalf(); // [7,8] - assertEquals(2, aLinkedList.size()); - assertEquals(7, aLinkedList.get(0)); - assertEquals(8, aLinkedList.get(1)); + assertEquals(4, aLinkedList.get(0)); + assertEquals(1, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + } + + @Test + public void testReverse() { + // 测试当aLinkedList为空时的情况 + aLinkedList.reverse(); + assertEquals(0, aLinkedList.size()); + + // 测试当aLinkedList长度为1时的情况 + aLinkedList.add(4); + aLinkedList.reverse(); + assertEquals(1, aLinkedList.size()); + assertEquals(4, aLinkedList.get(0)); + + for (int i = 1; i < 4; i++) { + aLinkedList.add(i); // [4,1,2,3] } - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - @Test - public void testRemoveIntInt() { - - for (int i=0; i<4; i++) { - aLinkedList.add(i); // [0,1,2,3] - } - - aLinkedList.remove(0, 2); // [2,3] - assertEquals(2, aLinkedList.get(0)); - assertEquals(3, aLinkedList.get(1)); - assertEquals(2, aLinkedList.size()); - - aLinkedList.remove(1, 0); - aLinkedList.remove(0, 0); - assertEquals(2, aLinkedList.size()); - - aLinkedList.remove(1, 1); // [2] - assertEquals(1, aLinkedList.size()); - assertEquals(2, aLinkedList.get(0)); - - aLinkedList.remove(0, 1); // [] - assertEquals(0, aLinkedList.size()); - - expectedEx.expect(Exception.class); - aLinkedList.remove(1, 3); + aLinkedList.reverse(); + assertEquals(4, aLinkedList.size()); + assertEquals(3, aLinkedList.get(0)); + assertEquals(2, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + + } + + /** + * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 + * ,删除以后的值为7,8,10 + * + */ + @Test + public void testRemoveFirstHalf() { + aLinkedList.removeFirstHalf(); + assertEquals(0, aLinkedList.size()); + + aLinkedList.add(2); + aLinkedList.add(5); + aLinkedList.add(7); + aLinkedList.add(8); // [2,5,7,8] + + aLinkedList.removeFirstHalf(); // [7,8] + assertEquals(2, aLinkedList.size()); + assertEquals(7, aLinkedList.get(0)); + assertEquals(8, aLinkedList.get(1)); + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + @Test + public void testRemoveIntInt() { + + for (int i = 0; i < 4; i++) { + aLinkedList.add(i); // [0,1,2,3] } - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - @Test - public void testGetElements() { - for (int i=0; i<4; i++) { - aLinkedList.add(i * i); // [0,1,4,9] - } - - MyLinkedList bLinkedList = new MyLinkedList(); - int[] z1 = aLinkedList.getElements(bLinkedList); // [] - assertArrayEquals( z1, new int[0]); - - bLinkedList.add(1); - bLinkedList.add(3); // [1, 3] - - z1 = aLinkedList.getElements(bLinkedList); // [1, 9] - assertArrayEquals(new int[] {1,9}, z1); - - bLinkedList.add(1, 2); // bLinkedList = [1, 2, 3] - z1 = aLinkedList.getElements(bLinkedList); // [1, 4, 9] - assertArrayEquals(new int[] {1,4,9}, z1); - - bLinkedList.add(0, 0); // bLinkedList = [0, 1, 2, 3] - z1 = aLinkedList.getElements(bLinkedList); // [0, 1, 4, 9] - assertArrayEquals(new int[] {0,1,4,9}, z1); - - // aLinkedList不应该变化 - assertEquals(4, aLinkedList.size()); - for (int i=0; i<4; i++) { - assertEquals(i*i, aLinkedList.get(i)); // [0,1,4,9] - } - - // Exception - bLinkedList.add(5); // bLinkedList = [0, 1, 2, 3, 5] - expectedEx.expect(Exception.class); - z1 = aLinkedList.getElements(bLinkedList); + aLinkedList.remove(0, 2); // [2,3] + assertEquals(2, aLinkedList.get(0)); + assertEquals(3, aLinkedList.get(1)); + assertEquals(2, aLinkedList.size()); + + aLinkedList.remove(1, 0); + aLinkedList.remove(0, 0); + assertEquals(2, aLinkedList.size()); + + aLinkedList.remove(1, 1); // [2] + assertEquals(1, aLinkedList.size()); + assertEquals(2, aLinkedList.get(0)); + + aLinkedList.remove(0, 1); // [] + assertEquals(0, aLinkedList.size()); + + expectedEx.expect(Exception.class); + aLinkedList.remove(1, 3); + } + + /** + * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = + * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + @Test + public void testGetElements() { + for (int i = 0; i < 4; i++) { + aLinkedList.add(i * i); // [0,1,4,9] } - - @Test - public void TestSubtract() - { - //传进的list为null,什么都不干 - MyLinkedList list = null; - for (int i=0; i<6; i++) - { - aLinkedList.add(i); //[0,1,2,3,4,5] - } - aLinkedList.subtract(list); - assertEquals(6, aLinkedList.size()); - - //传进的list为空 - list = new MyLinkedList(); - aLinkedList.subtract(list); - assertEquals(6, aLinkedList.size()); - - aLinkedList.add(1, 1); //[0,1,1,2,3,4,5] - aLinkedList.add(4, 3); //[0,1, 1, 2, 3, 3, 4, 5] - - // list添加元素[0, 1, 3, 7] - list.add(0); - list.add(1); - list.add(3); - list.add(7); - - aLinkedList.subtract(list); //[ 2, 4, 5] - - assertEquals(2, aLinkedList.get(0)); - assertEquals(4, aLinkedList.get(1)); - assertEquals(5, aLinkedList.get(2)); - assertEquals(3, aLinkedList.size()); + + MyLinkedList bLinkedList = new MyLinkedList(); + int[] z1 = aLinkedList.getElements(bLinkedList); // [] + assertArrayEquals(z1, new int[0]); + + bLinkedList.add(1); + bLinkedList.add(3); // [1, 3] + + z1 = aLinkedList.getElements(bLinkedList); // [1, 9] + assertArrayEquals(new int[] { 1, 9 }, z1); + + bLinkedList.add(1, 2); // bLinkedList = [1, 2, 3] + z1 = aLinkedList.getElements(bLinkedList); // [1, 4, 9] + assertArrayEquals(new int[] { 1, 4, 9 }, z1); + + bLinkedList.add(0, 0); // bLinkedList = [0, 1, 2, 3] + z1 = aLinkedList.getElements(bLinkedList); // [0, 1, 4, 9] + assertArrayEquals(new int[] { 0, 1, 4, 9 }, z1); + + // aLinkedList不应该变化 + assertEquals(4, aLinkedList.size()); + for (int i = 0; i < 4; i++) { + assertEquals(i * i, aLinkedList.get(i)); // [0,1,4,9] } - @Test - public void testRemoveDuplicateValues() - { - aLinkedList.removeDuplicateValues(); - assertEquals(0, aLinkedList.size()); - - aLinkedList.add(3); - aLinkedList.add(3); - aLinkedList.add(4); - aLinkedList.add(4); - aLinkedList.add(5); - aLinkedList.add(6); - aLinkedList.add(6); //[3, 3, 4, 4, 5, 6, 6] - - aLinkedList.removeDuplicateValues(); //[3, 4, 5, 6] - - assertEquals(3, aLinkedList.get(0)); - assertEquals(4, aLinkedList.get(1)); - assertEquals(5, aLinkedList.get(2)); - assertEquals(6, aLinkedList.get(3)); - assertEquals(4, aLinkedList.size()); - + + // Exception + bLinkedList.add(5); // bLinkedList = [0, 1, 2, 3, 5] + expectedEx.expect(Exception.class); + z1 = aLinkedList.getElements(bLinkedList); + } + + @Test + public void TestSubtract() { + // 传进的list为null,什么都不干 + MyLinkedList list = null; + for (int i = 0; i < 6; i++) { + aLinkedList.add(i); // [0,1,2,3,4,5] } - @Test - public void testRemoveRange() - { - for (int i=0; i<6; i++) - { - aLinkedList.add(i); // [0, 1, 2, 3, 4, 5] //考虑重复元素 - } - aLinkedList.addFirst(0); // [0, 0, 1, 2, 3, 4, 5] - aLinkedList.add(3, 2); // [0, 0, 1, 2, 2, 3, 4, 5] - - aLinkedList.removeRange(1, 4); // 大于1小于4 [0, 0, 1, 4, 5] - - assertEquals(0, aLinkedList.get(0)); - assertEquals(0, aLinkedList.get(1)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(4, aLinkedList.get(3)); - assertEquals(5, aLinkedList.get(4)); - assertEquals(5, aLinkedList.size()); - - //若出现 min >= max的情况,什么都不做 - aLinkedList.removeRange(4, 1); - assertEquals(0, aLinkedList.get(0)); - assertEquals(0, aLinkedList.get(1)); - assertEquals(1, aLinkedList.get(2)); - assertEquals(4, aLinkedList.get(3)); - assertEquals(5, aLinkedList.get(4)); - assertEquals(5, aLinkedList.size()); - - //将整个链表中的元素删除 - aLinkedList.removeRange(-1, 8); - assertEquals(0, aLinkedList.size()); + aLinkedList.subtract(list); + assertEquals(6, aLinkedList.size()); + + // 传进的list为空 + list = new MyLinkedList(); + aLinkedList.subtract(list); + assertEquals(6, aLinkedList.size()); + + aLinkedList.add(1, 1); // [0,1,1,2,3,4,5] + aLinkedList.add(4, 3); // [0,1, 1, 2, 3, 3, 4, 5] + + // list添加元素[0, 1, 3, 7] + list.add(0); + list.add(1); + list.add(3); + list.add(7); + + aLinkedList.subtract(list); // [ 2, 4, 5] + + assertEquals(2, aLinkedList.get(0)); + assertEquals(4, aLinkedList.get(1)); + assertEquals(5, aLinkedList.get(2)); + assertEquals(3, aLinkedList.size()); + } + + @Test + public void testRemoveDuplicateValues() { + aLinkedList.removeDuplicateValues(); + assertEquals(0, aLinkedList.size()); + + aLinkedList.add(3); + aLinkedList.add(3); + aLinkedList.add(4); + aLinkedList.add(4); + aLinkedList.add(5); + aLinkedList.add(6); + aLinkedList.add(6); // [3, 3, 4, 4, 5, 6, 6] + + aLinkedList.removeDuplicateValues(); // [3, 4, 5, 6] + + assertEquals(3, aLinkedList.get(0)); + assertEquals(4, aLinkedList.get(1)); + assertEquals(5, aLinkedList.get(2)); + assertEquals(6, aLinkedList.get(3)); + assertEquals(4, aLinkedList.size()); + + } + + @Test + public void testRemoveRange() { + for (int i = 0; i < 6; i++) { + aLinkedList.add(i); // [0, 1, 2, 3, 4, 5] //考虑重复元素 } - @Test - public void testIntersection() - { - for (int i=0; i<6; i++) - { - aLinkedList.add(i); - } - aLinkedList.add(6); - aLinkedList.add(7); // [0, 1, 2, 3, 4, 5, 6, 7] - //list为null - MyLinkedList list = null; - MyLinkedList newList1 = aLinkedList.intersection(list); - assertNull(newList1); - - //list为空链表 - list = new MyLinkedList(); - MyLinkedList newList2 = aLinkedList.intersection(list); - assertEquals(0, newList2.size()); - - list.add(0); - list.add(3); - list.add(4); - list.add(6); - list.add(7); // [0, 3, 4, 6, 7] - MyLinkedList newList3 = aLinkedList.intersection(list); - - assertEquals(0, newList3.get(0)); - assertEquals(3, newList3.get(1)); - assertEquals(4, newList3.get(2)); - assertEquals(6, newList3.get(3)); - assertEquals(7, newList3.get(4)); - assertEquals(5, newList3.size()); + aLinkedList.addFirst(0); // [0, 0, 1, 2, 3, 4, 5] + aLinkedList.add(3, 2); // [0, 0, 1, 2, 2, 3, 4, 5] + + aLinkedList.removeRange(1, 4); // 大于1小于4 [0, 0, 1, 4, 5] + + assertEquals(0, aLinkedList.get(0)); + assertEquals(0, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + assertEquals(5, aLinkedList.get(4)); + assertEquals(5, aLinkedList.size()); + + // 若出现 min >= max的情况,什么都不做 + aLinkedList.removeRange(4, 1); + assertEquals(0, aLinkedList.get(0)); + assertEquals(0, aLinkedList.get(1)); + assertEquals(1, aLinkedList.get(2)); + assertEquals(4, aLinkedList.get(3)); + assertEquals(5, aLinkedList.get(4)); + assertEquals(5, aLinkedList.size()); + + // 将整个链表中的元素删除 + aLinkedList.removeRange(-1, 8); + assertEquals(0, aLinkedList.size()); + } + + @Test + public void testIntersection() { + for (int i = 0; i < 6; i++) { + aLinkedList.add(i); } - + aLinkedList.add(6); + aLinkedList.add(7); // [0, 1, 2, 3, 4, 5, 6, 7] + // list为null + MyLinkedList list = null; + MyLinkedList newList1 = aLinkedList.intersection(list); + assertNull(newList1); + + // list为空链表 + list = new MyLinkedList(); + MyLinkedList newList2 = aLinkedList.intersection(list); + assertEquals(0, newList2.size()); + + list.add(0); + list.add(3); + list.add(4); + list.add(6); + list.add(7); // [0, 3, 4, 6, 7] + MyLinkedList newList3 = aLinkedList.intersection(list); + + assertEquals(0, newList3.get(0)); + assertEquals(3, newList3.get(1)); + assertEquals(4, newList3.get(2)); + assertEquals(6, newList3.get(3)); + assertEquals(7, newList3.get(4)); + assertEquals(5, newList3.size()); + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java index f2299e8e83..e73700ec53 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/List.java @@ -1,14 +1,16 @@ package com.github.HarryHook.coding2017.basic; +public interface List { -public interface List -{ - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - - public Iterator iterator(); -} + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + public Object remove(int index); + + public int size(); + + public Iterator iterator(); +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java index 92f84b687c..113b32f4d2 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/ListTest.java @@ -10,113 +10,109 @@ public class ListTest { - protected static List aList; - - @Test - public void testFunctional() { - aList.add(1); - aList.add(2); - assertEquals(1, aList.get(0)); - assertEquals(2, aList.get(1)); - - aList.add(3); - aList.add(0, 5); - aList.add(2, 11); - assertEquals(5, aList.get(0)); - assertEquals(11, aList.get(2)); - - aList.add("hi"); - assertEquals("hi", aList.get(5)); - assertEquals(6, aList.size()); - - aList.remove(1); - assertEquals(11, aList.get(1)); - assertEquals(2, aList.get(2)); - - assertEquals(5, aList.size()); - } - - @Test - public void testAdd() { - for (int i=0; i<100; i++) - aList.add(i); - assertEquals(0, aList.get(0)); - assertEquals(99, aList.get(99)); - assertEquals(44, aList.get(44)); - } - - @Test - public void testRemove() { - aList.add(1); - aList.add(2); - aList.add(3); - int u = (Integer)aList.remove(2); - assertEquals(3, u); - assertEquals(2, aList.size()); - - aList.add(1, 5); - u = (Integer)aList.remove(0); - assertEquals(1, u); - assertEquals(5, aList.get(0)); - assertEquals(2, aList.get(1)); - assertEquals(2, aList.size()); - - aList.remove(0); - aList.remove(0); - assertEquals(0, aList.size()); - - - } - - @Test - public void testSize() { - for (int i=0; i<10; i++) - aList.add(i*2); - assertEquals(10, aList.size()); - } - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - - @Test - public void testException() { - expectedEx.expect(Exception.class); - aList.remove(1); - aList.add(3); - aList.add(2, 5); - expectedEx.expect(Exception.class); - } - - @Test - - public void testIterator() - { - Iterator it = aList.iterator(); - assertEquals(false, it.hasNext()); - - aList.add(1); - aList.add(2); - aList.add(3); - - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(2, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - aList.remove(1); - it = aList.iterator(); - assertEquals(true, it.hasNext()); - assertEquals(1, it.next()); - assertEquals(3, it.next()); - assertEquals(false, it.hasNext()); - - expectedEx.expect(Exception.class); - it.next(); - - } - - + protected static List aList; + + @Test + public void testFunctional() { + aList.add(1); + aList.add(2); + assertEquals(1, aList.get(0)); + assertEquals(2, aList.get(1)); + + aList.add(3); + aList.add(0, 5); + aList.add(2, 11); + assertEquals(5, aList.get(0)); + assertEquals(11, aList.get(2)); + + aList.add("hi"); + assertEquals("hi", aList.get(5)); + assertEquals(6, aList.size()); + + aList.remove(1); + assertEquals(11, aList.get(1)); + assertEquals(2, aList.get(2)); + + assertEquals(5, aList.size()); + } + + @Test + public void testAdd() { + for (int i = 0; i < 100; i++) + aList.add(i); + assertEquals(0, aList.get(0)); + assertEquals(99, aList.get(99)); + assertEquals(44, aList.get(44)); + } + + @Test + public void testRemove() { + aList.add(1); + aList.add(2); + aList.add(3); + int u = (Integer) aList.remove(2); + assertEquals(3, u); + assertEquals(2, aList.size()); + + aList.add(1, 5); + u = (Integer) aList.remove(0); + assertEquals(1, u); + assertEquals(5, aList.get(0)); + assertEquals(2, aList.get(1)); + assertEquals(2, aList.size()); + + aList.remove(0); + aList.remove(0); + assertEquals(0, aList.size()); + + } + + @Test + public void testSize() { + for (int i = 0; i < 10; i++) + aList.add(i * 2); + assertEquals(10, aList.size()); + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void testException() { + expectedEx.expect(Exception.class); + aList.remove(1); + aList.add(3); + aList.add(2, 5); + expectedEx.expect(Exception.class); + } + + @Test + + public void testIterator() { + Iterator it = aList.iterator(); + assertEquals(false, it.hasNext()); + + aList.add(1); + aList.add(2); + aList.add(3); + + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(2, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + aList.remove(1); + it = aList.iterator(); + assertEquals(true, it.hasNext()); + assertEquals(1, it.next()); + assertEquals(3, it.next()); + assertEquals(false, it.hasNext()); + + expectedEx.expect(Exception.class); + it.next(); + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java index dbfd8aae19..e8cc041978 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyArrayList.java @@ -7,161 +7,136 @@ import java.util.Arrays; import java.util.NoSuchElementException; -public class MyArrayList implements List -{ - private int size = 0; //数组元素个数 - - private Object[] elementData = new Object[10]; //初始化数组大小为10 - - //将元素添加到数组尾部 - public void add(Object o) - { //需要判断数组空间是否够用 - ensureCapacity(size + 1); - elementData[size++] = o; - } - //在指定位置添加元素 - public void add(int index, Object o) - { - //判断下标记是否越界 - if (index > size || index < 0) - throw new IndexOutOfBoundsException( - "Index: " + index + ", Size: " + size); - ensureCapacity(size + 1); - //判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移 - if(elementData[index] == null) - { - elementData[index] = o; - } - else - { - for(int i=elementData.length-1; i>index; i--) - { - elementData[i] = elementData[i-1]; - } - elementData[index] = o; - } - size++; - - /* - //判断索引位置是否正确 - if (index > size || index < 0) - throw new IndexOutOfBoundsException( - "Index: " + index + ", Size: " + size); - //扩容检测 - ensureCapacity(size+1); - /* - * 对源数组进行复制处理(位移),从index + 1到size-index。 - * 主要目的就是空出index位置供数据插入, - * 即向右移动当前位于该位置的元素以及所有后续元素。 - - System.arraycopy(elementData, index, elementData, index + 1, - size - index); - //在指定位置赋值 - elementData[index] = 0; - size++; - - */ - } - - public Object get(int index) - { - //若index超出size应该抛出异常 - if(index >= size) - throw new IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); - return elementData[index]; - - } - - public Object remove(int index) - { //涉及到元素移位 - Object oldValue = elementData[index]; - for(int i=index; i oldCapacity) - { - //Object oldData[] = elementData; //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存 - int newCapacity = (oldCapacity * 3)/2 + 1; //增加50%+1 - if (newCapacity < minCapacity) - newCapacity = minCapacity; - // minCapacity is usually close to size, so this is a win: - elementData = Arrays.copyOf(elementData, newCapacity); - } - } - - //返回数组的大小 - public int size() - { - return size; - } - - public Iterator iterator() - { - return new MyArrayListIterator(); +public class MyArrayList implements List { + private int size = 0; // 数组元素个数 + + private Object[] elementData = new Object[10]; // 初始化数组大小为10 + + // 将元素添加到数组尾部 + public void add(Object o) { // 需要判断数组空间是否够用 + ensureCapacity(size + 1); + elementData[size++] = o; + } + + // 在指定位置添加元素 + public void add(int index, Object o) { + // 判断下标记是否越界 + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + ensureCapacity(size + 1); + // 判断当前位置是否有元素,没有元素添加到当前位置;若有,当前元素及之后元素向右移 + if (elementData[index] == null) { + elementData[index] = o; + } else { + for (int i = elementData.length - 1; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + elementData[index] = o; } - - private class MyArrayListIterator implements Iterator - { - private int cursor = 0; //记录索引位置 - public boolean hasNext() - { - return cursor != size; - } - public Object next() - { - try { - Object next = get(cursor); - cursor++; - return next; - - } catch (IndexOutOfBoundsException e) - { - throw new NoSuchElementException(); - } - - } + size++; + + /* + * //判断索引位置是否正确 if (index > size || index < 0) throw new + * IndexOutOfBoundsException( "Index: " + index + ", Size: " + size); + * //扩容检测 ensureCapacity(size+1); /* 对源数组进行复制处理(位移),从index + + * 1到size-index。 主要目的就是空出index位置供数据插入, 即向右移动当前位于该位置的元素以及所有后续元素。 + * + * System.arraycopy(elementData, index, elementData, index + 1, size - + * index); //在指定位置赋值 elementData[index] = 0; size++; + * + */ + } + + public Object get(int index) { + // 若index超出size应该抛出异常 + if (index >= size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); + return elementData[index]; + + } + + public Object remove(int index) { // 涉及到元素移位 + Object oldValue = elementData[index]; + for (int i = index; i < elementData.length - 1; i++) + elementData[i] = elementData[i + 1]; + elementData[--size] = null; + + return oldValue; + } + + // 判断是否需要给数组扩容 + public void ensureCapacity(int minCapacity) { + + int oldCapacity = elementData.length; + if (minCapacity > oldCapacity) { + // Object oldData[] = elementData; + // //防止copyof()执行的过程中新内存或者其他进程分配内存时占用旧内存 + int newCapacity = (oldCapacity * 3) / 2 + 1; // 增加50%+1 + if (newCapacity < minCapacity) + newCapacity = minCapacity; + // minCapacity is usually close to size, so this is a win: + elementData = Arrays.copyOf(elementData, newCapacity); } - - public static void main(String[] args) - { - MyArrayList myArrays = new MyArrayList(); - myArrays.add(3); - myArrays.add(0, 11); - myArrays.add(1, 2); - myArrays.add(3, 5); - myArrays.add(2, 1); - myArrays.add(7); - Print(myArrays); - - for(int i = 0; i < 19; i++) - myArrays.add(i, 55); - - System.out.println("获取指定位置元素: " + myArrays.get(2)); - System.out.println("删除指定位置元素: " + myArrays.remove(1)); - System.out.println("当前元素个数:" + myArrays.size()); - - Print(myArrays); - + } + + // 返回数组的大小 + public int size() { + return size; + } + + public Iterator iterator() { + return new MyArrayListIterator(); + } + + private class MyArrayListIterator implements Iterator { + private int cursor = 0; // 记录索引位置 + + public boolean hasNext() { + return cursor != size; } - public static void Print(MyArrayList myArrays) - { - Iterator it = myArrays.iterator(); - System.out.println("对链表中的元素进行打印:"); - while(it.hasNext()) - System.out.print(it.next() + " "); - System.out.println(""); - System.out.println("当前元素个数: " + myArrays.size()); + + public Object next() { + try { + Object next = get(cursor); + cursor++; + return next; + + } catch (IndexOutOfBoundsException e) { + throw new NoSuchElementException(); + } } - -} + } + + public static void main(String[] args) { + MyArrayList myArrays = new MyArrayList(); + myArrays.add(3); + myArrays.add(0, 11); + myArrays.add(1, 2); + myArrays.add(3, 5); + myArrays.add(2, 1); + myArrays.add(7); + Print(myArrays); + for (int i = 0; i < 19; i++) + myArrays.add(i, 55); + + System.out.println("获取指定位置元素: " + myArrays.get(2)); + System.out.println("删除指定位置元素: " + myArrays.remove(1)); + System.out.println("当前元素个数:" + myArrays.size()); + + Print(myArrays); + + } + + public static void Print(MyArrayList myArrays) { + Iterator it = myArrays.iterator(); + System.out.println("对链表中的元素进行打印:"); + while (it.hasNext()) + System.out.print(it.next() + " "); + System.out.println(""); + System.out.println("当前元素个数: " + myArrays.size()); + + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java index 9a668faaf0..e1c3478907 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyLinkedList.java @@ -5,549 +5,409 @@ package com.github.HarryHook.coding2017.basic; -public class MyLinkedList implements List -{ - private Node head = null; //头指针 - private int size = 0; - private static class Node - { - Object data; - Node next; +public class MyLinkedList implements List { + private Node head = null; // 头指针 + private int size = 0; + + private static class Node { + Object data; + Node next; + } + + public void add(Object o) { + addLast(o); + } + + // 在指定位置添加元素 + public void add(int index, Object o) { + + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } - public void add(Object o) - { - addLast(o); + + // 存在插入头结点的情况 + if (index == 0) { + addFirst(o); + } else { // 即 index != 0 的情况 + // p保存待插入节点的前一节点,x指向要插入的节点 + Node x = head; + Node p = null; + int i = 0; + while (i < index) { + p = x; + x = x.next; + i++; + } + Node n = new Node(); + p.next = n; + n.next = x; + n.data = o; + size++; } - //在指定位置添加元素 - public void add(int index , Object o) - { - - if (index > size || index < 0) - { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - - //存在插入头结点的情况 - if(index == 0) - { - addFirst(o); - } - else - { //即 index != 0 的情况 - // p保存待插入节点的前一节点,x指向要插入的节点 - Node x = head; - Node p = null; - int i = 0; - while(i < index) - { - p = x; - x = x.next; - i++; - } - Node n = new Node(); - p.next = n; - n.next = x; - n.data = o; - size++; - } - + + } + + // 返回指定位置元素 + public Object get(int index) { + if (index >= size) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } - //返回指定位置元素 - public Object get(int index) - { - if(index >= size) - { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - Node x = head; - int i = 0; - while(i < index && x != null) - { - x = x.next; - i++; - } - return x.data; + Node x = head; + int i = 0; + while (i < index && x != null) { + x = x.next; + i++; } - - //移除指定位置节点 - public Object remove(int index) - { - if (index > size || index < 0) - { - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); - } - //先判断是否是头节点 - if( index == 0) - { - return removeFirst(); - } - else - { - Node x = head; - Node pre = null; - int i = 0; - while(i < index) - { - pre = x; - x = x.next; - i++; - } - Object Data = pre.next.data; - pre.next = x.next; - x = null; - size--; - return Data; - } + return x.data; + } + // 移除指定位置节点 + public Object remove(int index) { + if (index > size || index < 0) { + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } - //头部添加节点 - public void addFirst(Object o) - { - Node n = new Node(); - n.next = head; - head = n; - n.data = o; - size++; + // 先判断是否是头节点 + if (index == 0) { + return removeFirst(); + } else { + Node x = head; + Node pre = null; + int i = 0; + while (i < index) { + pre = x; + x = x.next; + i++; + } + Object Data = pre.next.data; + pre.next = x.next; + x = null; + size--; + return Data; } - //尾部添加节点 - public void addLast(Object o) - { - if (head == null) - { - head = new Node(); - head.data = o; - } - else - { - Node x = head; - while(x.next != null) - { - x = x.next; - } - Node n = new Node(); - x.next = n; - n.next = null; - n.data = o; - } - size++; + + } + + // 头部添加节点 + public void addFirst(Object o) { + Node n = new Node(); + n.next = head; + head = n; + n.data = o; + size++; + } + + // 尾部添加节点 + public void addLast(Object o) { + if (head == null) { + head = new Node(); + head.data = o; + } else { + Node x = head; + while (x.next != null) { + x = x.next; + } + Node n = new Node(); + x.next = n; + n.next = null; + n.data = o; } - //移除第一个节点 - public Object removeFirst() - { - Node n = head; - Object Data = n.data; - head = head.next; - n = null; - size--; - return Data; + size++; + } + + // 移除第一个节点 + public Object removeFirst() { + Node n = head; + Object Data = n.data; + head = head.next; + n = null; + size--; + return Data; + } + + // 移除最后一个节点 + public Object removeLast() { + Node x = head; + Node p = null; + if (x.next == null) { + return removeFirst(); + } else { + while (x.next != null) { + p = x; + x = x.next; + } + Object Data = x.data; + p.next = null; + x = null; // 删除最后一个节点 + size--; + return Data; } - - //移除最后一个节点 - public Object removeLast() - { - Node x = head; - Node p = null; - if(x.next == null) - { - return removeFirst(); - } - else - { - while(x.next != null) - { - p = x; - x = x.next; - } - Object Data = x.data; - p.next = null; - x = null; //删除最后一个节点 - size--; - return Data; - } + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new MyLinkedListIterator(); + } + + private class MyLinkedListIterator implements Iterator { + private int cursor = 0; // 记录索引位置 + + public boolean hasNext() { + return cursor != size; } - public int size() - { - return size; + + public Object next() { + Object next = get(cursor); + cursor++; + return next; } - public Iterator iterator() - { - return new MyLinkedListIterator(); + } + + /** + * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + if (head == null) { + return; } - private class MyLinkedListIterator implements Iterator - { - private int cursor = 0; //记录索引位置 - public boolean hasNext() - { - return cursor != size; - } - public Object next() - { - Object next = get(cursor); - cursor ++; - return next; - } + Node p1, p2, p3; + p1 = head; + p2 = p1.next; + while (p2 != null) { + p3 = p2.next; + p2.next = p1; + p1 = p2; + p2 = p3; } - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse() - { - if(head == null) - { - return ; - } - Node p1, p2, p3; - p1 = head; - p2 = p1.next; - while(p2 != null) - { - p3 = p2.next; - p2.next = p1; - p1 = p2; - p2 = p3; - } - head.next = null; - head = p1; + head.next = null; + head = p1; + } + + /** + * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 + * ,删除以后的值为7,8,10 + * + */ + public void removeFirstHalf() { + if (size == 0) { + return; } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf() + Node p = head; + Node q = null; + int i = size / 2; + int j = 0; + while (j < i) { + j++; + q = p; + p = p.next; + } + head = p; + q.next = null; + size = size - i; + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + Node p = head; + Node q = null; + int index = 0; + int j = 0; + + while (index < i) { + q = p; + p = p.next; + index++; + } + + while (p != null && j < length) { + p = p.next; + j++; + } + if (i == 0) // 从头开始移除元素 { - if(size == 0) - { - return ; - } - Node p = head; - Node q = null; - int i = size / 2; - int j = 0; - while(j < i) - { - j++; - q = p; - p = p.next; - } + if (p == null) // 元素全被删光 + { + head = null; + size = 0; + } else // 从头删length个元素 + { head = p; + size = size - length; + } + } else // 从中间开始移除元素 + { + if (p == null) { q.next = null; - size = size - i; + size = size - j; + } else { + q.next = p; + size = size - length; + } + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = + * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + public int[] getElements(MyLinkedList list) { + if (list == null) { + return new int[0]; } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length) - { - Node p = head; - Node q = null; - int index = 0; - int j = 0; - - while(index < i) - { - q = p; - p = p.next; - index ++; - } + int i = 0; + int[] array = new int[list.size()]; + while (i < list.size()) { + array[i] = (int) this.get((int) list.get(i)); + i++; + } + return array; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 从当前链表中中删除在list中出现的元素 + * + * @param list + */ + + public void subtract(MyLinkedList list) { + int i = 0; + if (list == null) { + return; + } + while (i < list.size()) { + for (int index = 0; index < this.size(); index++) { + Node p = head; // 当前节点 + Node q = null; // 前驱节点 + while (list.get(i) != p.data && p.next != null) { + q = p; + p = p.next; + } + if (p.data == list.get(i)) { // 删除找到的节点 - while(p != null && j < length) - { - p = p.next; - j++; - } - if(i==0) //从头开始移除元素 - { - if(p == null) //元素全被删光 - { - head = null; - size = 0; - } - else //从头删length个元素 - { - head = p; - size = size - length; - } - } - else //从中间开始移除元素 - { - if(p == null) - { - q.next = null; - size = size - j ; - } - else - { - q.next = p; - size = size - length; - } - } - + if (p == head) { + head = head.next; + } else { + q.next = p.next; + } + size--; + } + } + + i++; } - - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(MyLinkedList list) - { - if(list == null) - { - return new int[0]; - } - int i = 0 ; - int[] array = new int[list.size()]; - while(i < list.size()) - { - array[i] = (int) this.get((int)list.get(i)); - i++; - } - return array; + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() { + if (head == null) { + return; } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在list中出现的元素 + Node p = head; + Node q = head; // 前驱 + while (p.next != null) { + p = p.next; - * @param list - */ - - public void subtract(MyLinkedList list) - { - int i = 0; - if(list == null) - { - return ; - } - while(i < list.size()) - { - for(int index = 0; index < this.size(); index++) - { - Node p = head; //当前节点 - Node q = null; //前驱节点 - while(list.get(i) != p.data && p.next != null) - { - q = p; - p = p.next; - } - if(p.data == list.get(i)) //删除找到的节点 - { - if(p == head) - head = head.next; - else - { - q.next = p.next; - } - size--; - } - } - - i++; - } + while (p.data == q.data) { + size--; + if (p.next == null) { + q.next = null; + break; + } + q.next = p.next; + p = p.next; + if (p == null) + break; + } + q = q.next; } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues() - { - if(head == null) - { - return ; - } - Node p = head; - Node q = head; //前驱 - while(p.next != null) - { - p = p.next; - - while(p.data == q.data) - { - size--; - if(p.next == null) - { - q.next = null; - break; - } - q.next = p.next; - p = p.next; - if(p == null) - break; - } - q = q.next; - } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * + * @param min + * @param max + */ + public void removeRange(int min, int max) { + + Node p = head; // 当前节点 + Node q = head; // 前驱节点 + while (p.next != null && ((int) p.data <= min || (int) p.data >= max)) { // 未找到继续遍历 + q = p; + p = p.next; } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max) - { - - Node p = head; //当前节点 - Node q = head; //前驱节点 - while(p.next != null && ((int)p.data <= min || (int)p.data >= max)) //未找到继续遍历 - { - q = p; - p = p.next; - } - while((int)p.data > min && (int)p.data < max) //删除找到的节点 - { - p = p.next; - size--; - - if(size == 0) //删完所有元素 - break ; - } - if(q == head) //头结点被删掉 - { - head = p; - } - else - { - q.next = p; - } - + while ((int) p.data > min && (int) p.data < max) { // 删除找到的节点 + p = p.next; + size--; + + if (size == 0) // 删完所有元素 + break; } + if (q == head) { // 头结点被删掉 - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public MyLinkedList intersection(MyLinkedList list) - { - if(list == null || this == null) - { - return null; - } - Node p1 = list.head; - Node p2 = this.head; - MyLinkedList newList = new MyLinkedList(); - - while(p1 != null && p2 != null) - { - while(((int) p1.data < (int) p2.data) && p1.next != null) - { - p1 = p1.next; - } - while(((int) p1.data > (int) p2.data) && p2.next != null) - { - p2 = p2.next; - } - if(p1.data == p2.data) - { - newList.add(p1.data); - p1 = p1.next; - p2 = p2.next; - } - - if(p1 == null && p2 == null) //若最后两个元素相等 - { - break; - } - } - return newList; + head = p; + } else { + q.next = p; } - - - public static void main(String[] args) - { - MyLinkedList myList = new MyLinkedList(); - myList.add(1); - myList.add(1); - myList.add(3); - myList.add(4); - myList.add(5); - myList.add(5); - myList.add(7); - myList.add(8); - myList.add(8); - myList.add(9); - Print(myList); - /* - MyLinkedList list = new MyLinkedList(); - list.add(0); - list.add(3); - list.add(5); - list.add(6); - list.add(9); - list.add(19); - //Print(list); - //myList.removeDuplicateValues(); - //myList.subtract(list); - */ - - myList.removeRange(-11, 10); - Print(myList); - /* - MyLinkedList list1 = myList.intersection(list); - System.out.println("打印交集:"); - Print(list1); - /* reverse() - myList.reverse(); - Print(myList); - */ - - //System.out.println("从第二个元素开始,移除三个元素"); - //myList.remove(1, 1); - //Print(myList); - - // getElements() - MyLinkedList list = new MyLinkedList(); - - int[] array = myList.getElements(list); - System.out.println("输出:"+array[0]); - for(int i=0; i (int) p2.data) && p2.next != null) { + p2 = p2.next; + } + if (p1.data == p2.data) { + newList.add(p1.data); + p1 = p1.next; + p2 = p2.next; + } + + if (p1 == null && p2 == null) { // 若最后两个元素相等 + break; + } } + return newList; + } + + public static void Print(MyLinkedList myList) { + Iterator it = myList.iterator(); + System.out.println("对链表中的元素进行打印:"); + while (it.hasNext()) + System.out.print(it.next() + " "); + System.out.println(""); + System.out.println("当前元素个数: " + myList.size()); + System.out.println(""); + } - } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java index 9b713eaea9..3d6cd9df0a 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyQueue.java @@ -3,52 +3,38 @@ * 实现简单的队列 */ package com.github.HarryHook.coding2017.basic; + import java.util.*; -public class MyQueue -{ - private MyArrayList elementData = new MyArrayList(); - private int size = 0; - //入队 - public void enQueue(Object o) - { - elementData.add(o); - size++; - } - //出队 - public Object deQueue() - { - if(isEmpty()) - throw new NoSuchElementException(); - Object Data = elementData.remove(0); - size--; - return Data; - } - //判断队列是否为空 - public boolean isEmpty() - { - return size() == 0; - } - //队列中元素个数 - public int size() - { - return size; - } - public static void main(String[] args) - { - MyQueue mq = new MyQueue(); - mq.enQueue(1); - mq.enQueue(2); - mq.enQueue(3); - mq.enQueue(4); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - System.out.println("队列中元素个数: " + mq.size()); - //System.out.println("队列出栈,出栈元素为: " + mq.deQueue()); - //System.out.println("队列中元素个数: " + mq.size()); + +public class MyQueue { + private MyArrayList elementData = new MyArrayList(); + private int size = 0; + + // 入队 + public void enQueue(Object o) { + elementData.add(o); + size++; + } + + // 出队 + public Object deQueue() { + if (isEmpty()) { + throw new NoSuchElementException(); } + Object Data = elementData.remove(0); + size--; + return Data; + } + + // 判断队列是否为空 + public boolean isEmpty() { + return size() == 0; + } + + // 队列中元素个数 + public int size() { + return size; + } + + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java index c7f87c04e6..2702c66a07 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/MyStack.java @@ -6,54 +6,39 @@ import java.util.*; -public class MyStack -{ - private MyArrayList elementData = new MyArrayList(); - private int size = 0; - - //入栈操作 - public void push(Object o) - { - elementData.add(o); - size++; - } - //出栈操作 - public Object pop() - { - Object obj = peek(); - elementData.remove(size() - 1); - size--; - return obj; - } - //获取当前栈顶元素,不用出栈 - public Object peek() - { - if(isEmpty()) - throw new EmptyStackException(); - return elementData.get(size() - 1); - } - //判断栈是否为空 - public boolean isEmpty() - { - return size() == 0; - } - //返回栈内元素个数 - public int size(){ - return size; - } - - public static void main(String[] args) - { - MyStack ms = new MyStack(); - - ms.push(1); - ms.push(2); - ms.push(13); - System.out.println("当前栈顶元素是: " + ms.peek()); - System.out.println("出栈元素是: " + ms.pop()); - System.out.println("出栈元素是: " + ms.pop()); - ms.push(12); - System.out.println("出栈元素是: " + ms.pop()); - System.out.println("当前栈顶元素是: " + ms.peek()); +public class MyStack { + private MyArrayList elementData = new MyArrayList(); + private int size = 0; + + // 入栈操作 + public void push(Object o) { + elementData.add(o); + size++; + } + + // 出栈操作 + public Object pop() { + Object obj = peek(); + elementData.remove(size() - 1); + size--; + return obj; + } + + // 获取当前栈顶元素,不用出栈 + public Object peek() { + if (isEmpty()) { + throw new EmptyStackException(); } + return elementData.get(size() - 1); + } + + // 判断栈是否为空 + public boolean isEmpty() { + return size() == 0; + } + + // 返回栈内元素个数 + public int size() { + return size; + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java index 340f79d240..0b89de7c0a 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/QueueTest.java @@ -6,28 +6,28 @@ import com.github.HarryHook.coding2017.basic.MyQueue; public class QueueTest { - private MyQueue queue; - - @Before - public void setUpQueue() { - queue = new MyQueue(); - } - - @Test - public void testQueueFunctional() { - assertEquals(true, queue.isEmpty()); - queue.enQueue(4); - queue.enQueue(2); - assertEquals(2, queue.size()); - assertEquals(false, queue.isEmpty()); - - int i = (Integer)queue.deQueue(); - assertEquals(4, i); - i = (Integer)queue.deQueue(); - assertEquals(2, i); - - assertEquals(0, queue.size()); - assertEquals(true, queue.isEmpty()); - } + private MyQueue queue; + + @Before + public void setUpQueue() { + queue = new MyQueue(); + } + + @Test + public void testQueueFunctional() { + assertEquals(true, queue.isEmpty()); + queue.enQueue(4); + queue.enQueue(2); + assertEquals(2, queue.size()); + assertEquals(false, queue.isEmpty()); + + int i = (Integer) queue.deQueue(); + assertEquals(4, i); + i = (Integer) queue.deQueue(); + assertEquals(2, i); + + assertEquals(0, queue.size()); + assertEquals(true, queue.isEmpty()); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java index 26160faef6..89f56d8006 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/basic/StackTest.java @@ -9,32 +9,32 @@ public class StackTest { - private MyStack stack; - - @Before - public void setUpStack() { - stack = new MyStack(); - } - - @Test - public void testStackFunctional() { - assertEquals(true, stack.isEmpty()); - stack.push(4); - stack.push(2); - assertEquals(2, stack.size()); - assertEquals(false, stack.isEmpty()); - - int i = (Integer)stack.pop(); - assertEquals(2, i); - - i = (Integer)stack.peek(); - assertEquals(4, i); - - i = (Integer)stack.pop(); - assertEquals(4, i); - - assertEquals(0, stack.size()); - assertEquals(true, stack.isEmpty()); - } + private MyStack stack; + + @Before + public void setUpStack() { + stack = new MyStack(); + } + + @Test + public void testStackFunctional() { + assertEquals(true, stack.isEmpty()); + stack.push(4); + stack.push(2); + assertEquals(2, stack.size()); + assertEquals(false, stack.isEmpty()); + + int i = (Integer) stack.pop(); + assertEquals(2, i); + + i = (Integer) stack.peek(); + assertEquals(4, i); + + i = (Integer) stack.pop(); + assertEquals(4, i); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java index c7b05e46c0..122c71eae6 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/DownloadThread.java @@ -6,46 +6,46 @@ public class DownloadThread extends Thread { - Connection conn; - int startPos; - int endPos; - boolean downloadFinsh = false; - public DownloadThread( Connection conn, int startPos, int endPos) { - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - - public void run() { - - RandomAccessFile outFile = null; + Connection conn; + int startPos; + int endPos; + boolean downloadFinsh = false; + + public DownloadThread(Connection conn, int startPos, int endPos) { + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + + public void run() { + + RandomAccessFile outFile = null; + try { + + byte[] buffer = conn.read(startPos, endPos); + // 在本地创建一个与服务器大小一致的可随机写入文件 + outFile = new RandomAccessFile("bd_logo.png", "rwd"); + outFile.seek(startPos); + outFile.write(buffer); + FileDownloader fileloader = new FileDownloader(""); + fileloader.getListener(); + + } catch (Exception e) { + + e.printStackTrace(); + + } finally { + try { - - byte[] buffer = conn.read(startPos, endPos); - // 在本地创建一个与服务器大小一致的可随机写入文件 - outFile = new RandomAccessFile("bd_logo.png", "rwd"); - outFile.seek(startPos); - outFile.write(buffer); - FileDownloader fileloader = new FileDownloader(""); - fileloader.getListener(); - - }catch(Exception e) { - + outFile.close(); + + } catch (Exception e) { + e.printStackTrace(); - - }finally { - - try { - outFile.close(); - - } catch(Exception e) { - - e.printStackTrace(); - } - - } + } - + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java index ac5b6606d4..1bb64c1050 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloader.java @@ -5,87 +5,86 @@ import com.github.HarryHook.coding2017.download.api.ConnectionManager; import com.github.HarryHook.coding2017.download.api.DownloadListener; - public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String _url) { - - this.url = _url; - - } - - public void execute() { - - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - - Connection conn = null; - - try { - - conn = cm.open(this.url); - int fileLength = conn.getContentLength(); - int threadCount = 3; - int blockSize = fileLength / 1024 / threadCount; - - for (int threadId=1; threadId<=threadCount; threadId++) { - - int startPos = (threadId-1) * blockSize; - int endPos = threadId * blockSize - 1; - if (threadId == threadCount) { - endPos = fileLength; - } - - new DownloadThread(conn, startPos, endPos).start(); + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + public FileDownloader(String _url) { + + this.url = _url; + + } + + public void execute() { + + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, + // endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, + // 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + + Connection conn = null; + + try { + + conn = cm.open(this.url); + int fileLength = conn.getContentLength(); + int threadCount = 3; + int blockSize = fileLength / 1024 / threadCount; + + for (int threadId = 1; threadId <= threadCount; threadId++) { + + int startPos = (threadId - 1) * blockSize; + int endPos = threadId * blockSize - 1; + if (threadId == threadCount) { + endPos = fileLength; } - - } catch(ConnectionException e) { - - e.printStackTrace(); - - }finally { - - if(conn != null) { - + + new DownloadThread(conn, startPos, endPos).start(); + } + + } catch (ConnectionException e) { + + e.printStackTrace(); + + } finally { + + if (conn != null) { + conn.close(); - - } + } - - } - - public void setListener(DownloadListener listener) { - - this.listener = listener; } - public void setConnectionManager(ConnectionManager ucm) { - - this.cm = ucm; - } - - public DownloadListener getListener() { - - return this.listener; - } - - + } + + public void setListener(DownloadListener listener) { + + this.listener = listener; + } + + public void setConnectionManager(ConnectionManager ucm) { + + this.cm = ucm; + } + + public DownloadListener getListener() { + + return this.listener; + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java index 91ddbfa6f8..adf7dad676 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/FileDownloaderTest.java @@ -9,52 +9,52 @@ import com.github.HarryHook.coding2017.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { - - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - - } - @After - public void tearDown() throws Exception { - - } + boolean downloadFinished = false; + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testDownload() { + + String url = "https://www.baidu.com/img/bd_logo.png"; - @Test - public void testDownload() { - - String url = "https://www.baidu.com/img/bd_logo.png"; - - FileDownloader downloader = new FileDownloader(url); - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - - downloadFinished = true; - } - }); - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - - try { - System.out.println("还没有下载完成,休眠两秒"); - //休眠2秒 - Thread.sleep(2000); - } catch (InterruptedException e) { - e.printStackTrace(); - } + FileDownloader downloader = new FileDownloader(url); + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + + downloadFinished = true; } - System.out.println("下载完成!"); - + }); + + downloader.execute(); + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + + try { + System.out.println("还没有下载完成,休眠两秒"); + // 休眠2秒 + Thread.sleep(2000); + } catch (InterruptedException e) { + e.printStackTrace(); + } } + System.out.println("下载完成!"); + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java index 92b2fe1050..7f6a13f3e0 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/Connection.java @@ -3,22 +3,26 @@ import java.io.IOException; public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * + * @param startPos + * 开始位置, 从0开始 + * @param endPos + * 结束位置 + * @return + */ + public byte[] read(int startPos, int endPos) throws IOException; + + /** + * 得到数据内容的长度 + * + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java index 57368f7b35..be85791a50 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/api/ConnectionManager.java @@ -1,10 +1,11 @@ package com.github.HarryHook.coding2017.download.api; public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; + /** + * 给定一个url , 打开一个连接 + * + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java index 2932ec1ddb..84a55784f7 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionImpl.java @@ -9,57 +9,57 @@ import com.github.HarryHook.coding2017.download.api.Connection; public class ConnectionImpl implements Connection { - - private String url; - - public ConnectionImpl(String url) { - - this.url = url; - } - @Override - public byte[] read(int startPos, int endPos) throws IOException { - - URL url = new URL(this.url); - HttpURLConnection conn = (HttpURLConnection)url.openConnection(); - //conn.setRequestMethod("GET"); - // 设置500毫秒为超时值 - // conn.setReadTimeout(5000); - conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); - BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); - ByteArrayOutputStream out = new ByteArrayOutputStream(1024); - - byte[] buffer = new byte[1024]; - int size = 0; - while ((size = in.read(buffer)) != -1) { - out.write(buffer, 0, size); - } - byte[] b = out.toByteArray(); - out.close(); - in.close(); - - return b; - } + private String url; + + public ConnectionImpl(String url) { + + this.url = url; + } - @Override - public int getContentLength() { - - try { - URL url1 = new URL(url); - HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); - return conn.getContentLength(); - - }catch(Exception e) { - - e.printStackTrace(); - } - - return -1; + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + URL url = new URL(this.url); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + // conn.setRequestMethod("GET"); + // 设置500毫秒为超时值 + // conn.setReadTimeout(5000); + conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); + + byte[] buffer = new byte[1024]; + int size = 0; + while ((size = in.read(buffer)) != -1) { + out.write(buffer, 0, size); } + byte[] b = out.toByteArray(); + out.close(); + in.close(); + + return b; + } - @Override - public void close() { - + @Override + public int getContentLength() { + + try { + URL url1 = new URL(url); + HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); + return conn.getContentLength(); + + } catch (Exception e) { + + e.printStackTrace(); } + return -1; + } + + @Override + public void close() { + + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java index 2ce38b1f79..ee40d1e943 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/download/impl/ConnectionManagerImpl.java @@ -6,9 +6,9 @@ public class ConnectionManagerImpl implements ConnectionManager { - @Override - public Connection open(String url) throws ConnectionException { - return new ConnectionImpl(url); - } + @Override + public Connection open(String url) throws ConnectionException { + return new ConnectionImpl(url); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..33b7dda5c6 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..9ecd803572 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java @@ -0,0 +1,111 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; +import com.github.HarryHook.coding2017.jvm.cmd.CommandParser; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; +import com.sun.org.apache.bcel.internal.generic.NEW; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, + ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + System.out.println(code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); + + int exceptionLength = iter.nextU2ToInt(); + if (exceptionLength > 0) { + String exceptionTable = iter.nextUxToHexString(exceptionLength); + System.out.println("exception Table has not complemented" + exceptionTable); + } + // 解析子属性 + int subAttrCount = iter.nextU2ToInt(); + + for (int j = 1; j <= subAttrCount; j++) { + + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + iter.back(2); + + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + + } else if (AttributeInfo.LOCAL_VAR_TABLE.equals(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need implement" + subAttrName); + } + } + return codeAttr; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + public String toString(ConstantPool pool) { + StringBuffer buffer = new StringBuffer(); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + int attrNameIndex = iter.nextU2ToInt(); + int attrLength = iter.nextU4ToInt(); + LineNumberTable table = new LineNumberTable(attrNameIndex, attrLength); + int itemLength = iter.nextU2ToInt(); + + for (int i = 1; i <= itemLength; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + + return table; + } + + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for (LineNumberItem item : items) { + buffer.append("startPC:" + item.getStartPC()).append(","); + buffer.append("lineNum:" + item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..f442ea5698 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableItem.java @@ -0,0 +1,49 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..106ae86460 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/LocalVariableTable.java @@ -0,0 +1,51 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +import java.util.ArrayList; +import java.util.List; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; + +import sun.util.logging.resources.logging; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter) { + int attrNameIndex = iter.nextU2ToInt(); + int attrlength = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(attrNameIndex, attrlength); + int itemLength = iter.nextU2ToInt(); + for (int i = 1; i <= itemLength; i++) { + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); +} +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..745a2fdc70 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/StackMapTable.java @@ -0,0 +1,29 @@ +package com.github.HarryHook.coding2017.jvm.attr; + +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo { + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter) { + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index, len); + + // 后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..fedc174261 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/AccessFlag.java @@ -0,0 +1,26 @@ +package com.github.HarryHook.coding2017.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; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..799a40cea7 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassFile.java @@ -0,0 +1,133 @@ +package com.github.HarryHook.coding2017.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.field.Field; +import com.github.HarryHook.coding2017.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + public ClassIndex getClzIndex() { + return clzIndex; + } + + public void setClzIndex(ClassIndex clzIndex) { + this.clzIndex = 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 setConstantPool(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()); + + } + + public String getClassName() { + int thisClassIndex = clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public void addField(Field f) { + fields.add(f); + } + + public List getFields() { + return fields; + } + + public void addMethod(Method m) { + methods.add(m); + + } + + public List getMethods() { + return methods; + } + + public Method getMethod(String methodName, String paramAndReturnType) { + + for (Method m : methods) { + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if (name.equals(methodName) && desc.equals(paramAndReturnType)) { + return m; + } + } + return null; + } + + public Method getMainMethod() { + for (Method m : methods) { + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { + return m; + } + } + return null; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..9b6162360d --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/clz/ClassIndex.java @@ -0,0 +1,22 @@ +package com.github.HarryHook.coding2017.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/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..6b1c020682 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..f5e6705a8a --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..b982fa7aa4 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java @@ -0,0 +1,155 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + // System.out.println( cmd.toString(clzFile.getConstPool())); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..ec34e7b4a7 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,18 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..1090e17374 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,24 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..4afc337f47 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..6b494dceda --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,21 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..073ddd73a9 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..9c959e31dd --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..554eac0690 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..77bf40708b --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..f3a197114c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..13edc86215 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.github.HarryHook.coding2017.jvm.cmd; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..e4822e2bbb --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java @@ -0,0 +1,32 @@ +package com.github.HarryHook.coding2017.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..6c502016a3 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java @@ -0,0 +1,43 @@ +package com.github.HarryHook.coding2017.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..92d1b381d1 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.github.HarryHook.coding2017.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 int getSize() { + return this.constantInfos.size() - 1; + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..d2d6a19f90 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/FieldRefInfo.java @@ -0,0 +1,63 @@ +package com.github.HarryHook.coding2017.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..a1055932a0 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/MethodRefInfo.java @@ -0,0 +1,62 @@ +package com.github.HarryHook.coding2017.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..29495489f4 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,54 @@ +package com.github.HarryHook.coding2017.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() + ")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..b0f5ad9b80 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/NullConstantInfo.java @@ -0,0 +1,19 @@ +package com.github.HarryHook.coding2017.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } + + @Override + public void accept(Visitor visitor) { + + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..442405aa36 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/StringInfo.java @@ -0,0 +1,33 @@ +package com.github.HarryHook.coding2017.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5c740bf402 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/UTF8Info.java @@ -0,0 +1,42 @@ +package com.github.HarryHook.coding2017.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 void setValue(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java new file mode 100644 index 0000000000..9d33d90d96 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/field/Field.java @@ -0,0 +1,44 @@ + +package com.github.HarryHook.coding2017.jvm.field; + +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; +import com.sun.istack.internal.Pool; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributesCount = iter.nextU2ToInt(); + System.out.println("field attributes Count: " + attributesCount); + Field f = new Field(accessFlag, nameIndex, descriptorIndex, pool); + if(attributesCount > 0) { + throw new RuntimeException("Field has not complemented attribute"); + } + return f; + } + + public String toString() { + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":" + desc; + } + + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..b773b6b584 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,58 @@ +package com.github.HarryHook.coding2017.jvm.loader; + +import java.util.Arrays; + +import com.github.HarryHook.coding2017.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public byte[] getByte(int len) { + if (pos + len > codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public String nextU4ToHexString() { + + return Util.byteToHexString(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public int nextU1ToInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..2f2c9c4345 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileLoader.java @@ -0,0 +1,92 @@ +package com.github.HarryHook.coding2017.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 com.github.HarryHook.coding2017.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) { + BufferedInputStream bis = null; + try { + File f = new File(clzFileName); + bis = new BufferedInputStream(new FileInputStream(f)); + ByteArrayOutputStream out = new ByteArrayOutputStream(1024); + + byte[] buffer = new byte[1024]; + int length = 0; + while ((length = bis.read(buffer)) != -1) { + out.write(buffer, 0, length); + } + return out.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (bis != null) { + try { + bis.close(); + } 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() { + + StringBuilder buffer = new StringBuilder(); + + for (int i = 0; i < clzPaths.size(); i++) { + + buffer.append(clzPaths.get(i)); + if (i < clzPaths.size() - 1) { + buffer.append(";"); + } + } + return buffer.toString(); + } + + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } + public static void main(String[] args) { + ClassFile clzFile = null; + ClassFileLoader loader = new ClassFileLoader(); + String path1 = "F:\\Coding2017\\group02\\727171008\\bin"; + loader.addClassPath(path1); + String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; + clzFile = loader.loadClass(className); + clzFile.print(); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..40608823e9 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/loader/ClassFileParser.java @@ -0,0 +1,151 @@ +package com.github.HarryHook.coding2017.jvm.loader; + +import java.io.UnsupportedEncodingException; + + +import com.github.HarryHook.coding2017.jvm.clz.AccessFlag; +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.clz.ClassIndex; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.constant.NullConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.StringInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; +import com.github.HarryHook.coding2017.jvm.field.Field; +import com.github.HarryHook.coding2017.jvm.method.Method; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + String magicNumber = iter.nextU4ToHexString(); + if (!"cafebabe".equals(magicNumber)) { + return null; + } + + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstantPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex clzIndex = parseClassIndex(iter); + clzFile.setClzIndex(clzIndex); + + parseInterfaces(iter); + + parseField(clzFile, iter); + + parseMethod(clzFile, iter); + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + return flag; + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + ClassIndex clzIndex = new ClassIndex(); + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + + return clzIndex; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + int constPoolCount = iter.nextU2ToInt(); + System.out.println("const Pool Count : " + constPoolCount); + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + for (int i = 1; i <= constPoolCount - 1; i++) { + int tag = iter.nextU1ToInt(); + if (tag == 7) { + // Class Info + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setUtf8Index(utf8Index); + pool.addConstantInfo(clzInfo); + } else if (tag == 1) { + // UTF8 String + int len = iter.nextU2ToInt(); + byte[] data = iter.getByte(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + + } + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + } else if (tag == 8) { + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == 9) { + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == 10) { + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == 12) { + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setIndex1(iter.nextU2ToInt()); + nameType.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag" + tag + "has not complemented"); + } + + } + System.out.println("Finished reading Constant Pool "); + + return pool; + } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseField(ClassFile clzFile, ByteCodeIterator iter){ + int fieldCount = iter.nextU2ToInt(); + for(int i=1; i<=fieldCount; i++) { + Field f = Field.parse(clzFile.getConstantPool(), iter); + clzFile.addField(f); + + } + } + + private void parseMethod(ClassFile clzFile, ByteCodeIterator iter){ + int methodCount = iter.nextU2ToInt(); + for(int i=1; i<=methodCount; i++) { + Method m = Method.parse(clzFile, iter); + clzFile.addMethod(m); + } + } + + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java new file mode 100644 index 0000000000..08b8ff029b --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java @@ -0,0 +1,87 @@ + +package com.github.HarryHook.coding2017.jvm.method; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; + +import javax.management.RuntimeErrorException; + +import com.github.HarryHook.coding2017.jvm.attr.AttributeInfo; +import com.github.HarryHook.coding2017.jvm.attr.CodeAttr; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; +import com.github.HarryHook.coding2017.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributeCount = iter.nextU2ToInt(); + + Method m = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); + + for(int i=1; i<=attributeCount; i++) { + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if(AttributeInfo.CODE.equalsIgnoreCase(attrName)) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else { + throw new RuntimeException("only Attribute is complemented!"); + } + + } + return m; + + } + public String toString(ConstantPool pool) { + StringBuffer buffer = new StringBuffer(); + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + buffer.append(name).append(":").append(desc).append("\n"); + buffer.append(this.codeAttr.toString(pool)); + return buffer.toString(); + } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); +} +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..6ede47692c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ClassFilePrinter.java @@ -0,0 +1,51 @@ +package com.github.HarryHook.coding2017.jvm.print; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.constant.StringInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; +import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + + public ClassFilePrinter(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public void print() { + + if (clzFile.getAccessFlag().isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name:" + clzFile.getClassName()); + + System.out.println("Super Class Name:" + clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + } + + public static void main(String[] args) { + String path = "F:\\Coding2017\\group02\\727171008\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..3d6c791185 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,25 @@ +package com.github.HarryHook.coding2017.jvm.print; + +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.constant.StringInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..ee7e3b3092 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,342 @@ +package com.github.HarryHook.coding2017.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.clz.ClassIndex; +import com.github.HarryHook.coding2017.jvm.cmd.BiPushCmd; +import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; +import com.github.HarryHook.coding2017.jvm.cmd.OneOperandCmd; +import com.github.HarryHook.coding2017.jvm.cmd.TwoOperandCmd; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; +import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; +import com.github.HarryHook.coding2017.jvm.field.Field; +import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; +import com.github.HarryHook.coding2017.jvm.method.Method; + + +public class ClassFileloaderTest { + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/github/HarryHook/coding2017/jvm/test/EmployeeV1"; + static String path1 = "F:\\Coding2017\\group02\\727171008\\bin"; + // F:\Coding2017\group02\727171008\bin\com\github\HarryHook\coding2017\jvm\test + static String path2 = "F:\\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; + clzFile = loader.loadClass(className); + clzFile.print(); + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + // jdk_1.8.0_111 + Assert.assertEquals(1090, byteCodes.length); + + } + + @Test + public void testMagicNumber() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + private String byteToHexString(byte[] codes) { + + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } + + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool() { + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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()); + } + /** + * 下面是第三次JVM课应实现的测试用例 + */ + + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + /* + * 第四次测试 + */ + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..8926e19e1e --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/EmployeeV1.java @@ -0,0 +1,30 @@ +package com.github.HarryHook.coding2017.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/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java new file mode 100644 index 0000000000..0a05d3f49c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/util/Util.java @@ -0,0 +1,22 @@ +package com.github.HarryHook.coding2017.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..b2cf16ceaa --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrame.java @@ -0,0 +1,125 @@ +package com.github.HarryHook.coding2017.linklist; + +/** + * 用双向链表实现LRU算法 + * + * @author HarryHook + * + */ +public class LRUPageFrame { + + private static class Node { + + Node prev; + Node next; + int pageNum; + + Node() { + + } + } + + private int capacity; + private int currentSize = 0; + + private Node first;// 链表头 + private Node last;// 链表尾 + + public LRUPageFrame(int capacity) { + + this.capacity = capacity; + + } + + /** + * 获取缓存中对象 + * + * @param pageNum + * @return + */ + + public void access(int pageNum) { + + if (currentSize == 0) { + Node node = new Node(); + node.pageNum = pageNum; + node.prev = node.next = null; + first = last = node; + currentSize++; + } else { + + if (first.pageNum == pageNum) { + return; + } + + if (currentSize == 1) { + addToFirst(pageNum); + } else { + + if (last.pageNum == pageNum) { + moveLastToFirst(); + return; + } + Node iteratorNode = first; + while (iteratorNode.next != null && iteratorNode.pageNum != pageNum) { + iteratorNode = iteratorNode.next; + } + if (iteratorNode == last) { + addToFirst(pageNum); + // 若缓存已满,移除最后一个节点 + if (currentSize > capacity) { + last = last.prev; + last.next = null; + } + } else { + moveToFirst(iteratorNode); + } + } + } + } + + // 将节点/缓存页添加到fitrst + public void addToFirst(int pageNum) { + Node node = new Node(); + node.pageNum = pageNum; + node.prev = null; + node.next = first; + first.prev = node; + first = node; + currentSize++; + } + + // 将last节点移动到first + public void moveLastToFirst() { + last.next = first; + first.prev = last; + first = last; + last = last.prev; + last.next = null; + first.prev = null; + } + + // 将最近使用的已有缓存页移动到first + public void moveToFirst(Node iteratorNode) { + iteratorNode.prev.next = iteratorNode.next; + iteratorNode.next.prev = iteratorNode.prev; + iteratorNode.prev = null; + iteratorNode.next = first; + first.prev = iteratorNode; + first = iteratorNode; + } + + 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/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..f25cb5d5e9 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.github.HarryHook.coding2017.linklist; + +import org.junit.Assert; + +import org.junit.Test; + +public class LRUPageFrameTest { + + @Test + public void testAccess() { + LRUPageFrame frame = new LRUPageFrame(3); + frame.access(7); + Assert.assertEquals("7", frame.toString()); + frame.access(0); + Assert.assertEquals("0,7", frame.toString()); + frame.access(7); + Assert.assertEquals("7,0", frame.toString()); + frame.access(1); + Assert.assertEquals("1,7,0", frame.toString()); + frame.access(2); + Assert.assertEquals("2,1,7", 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()); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java index c44457c58f..f2db5581f5 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Configuration.java @@ -10,88 +10,93 @@ import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; - public class Configuration { - Map actions = new HashMap<>(); - - public Configuration(String fileName) { - String packageName = this.getClass().getPackage().getName(); - - packageName = packageName.replace('.', '/'); - - InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); - - parseXML(is); - - try { - is.close(); - }catch(IOException e) { - throw new ConfigurationException(e); - } + Map actions = new HashMap<>(); + + public Configuration(String fileName) { + String packageName = this.getClass().getPackage().getName(); + + packageName = packageName.replace('.', '/'); + + InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName); + + parseXML(is); + + try { + is.close(); + } catch (IOException e) { + throw new ConfigurationException(e); } - private void parseXML(InputStream is) { - SAXBuilder builder = new SAXBuilder(); - - try { - Document doc = builder.build(is); - - Element root = doc.getRootElement(); - - for(Element actionElement : root.getChildren("action")) { - String actionName = actionElement.getAttributeValue("name"); - String clzName = actionElement.getAttributeValue("class"); - - ActionConfig ac = new ActionConfig(actionName, clzName); - - for(Element resultElement : actionElement.getChildren("result")) { - String resultName = resultElement.getAttributeValue("name"); - String viewName = resultElement.getText().trim(); - - ac.addViewResult(resultName, viewName); - } - this.actions.put(actionName, ac); - } - }catch(JDOMException e) { - throw new ConfigurationException(e); - - }catch(IOException e) { - throw new ConfigurationException(e); - + } + + private void parseXML(InputStream is) { + SAXBuilder builder = new SAXBuilder(); + + try { + Document doc = builder.build(is); + + Element root = doc.getRootElement(); + + for (Element actionElement : root.getChildren("action")) { + String actionName = actionElement.getAttributeValue("name"); + String clzName = actionElement.getAttributeValue("class"); + + ActionConfig ac = new ActionConfig(actionName, clzName); + + for (Element resultElement : actionElement.getChildren("result")) { + String resultName = resultElement.getAttributeValue("name"); + String viewName = resultElement.getText().trim(); + + ac.addViewResult(resultName, viewName); } + this.actions.put(actionName, ac); + } + } catch (JDOMException e) { + throw new ConfigurationException(e); + + } catch (IOException e) { + throw new ConfigurationException(e); + } + } - public String getClassName(String action) { - ActionConfig ac = this.actions.get(action); - if(ac == null) { - return null; - } - return ac.getClassName(); + public String getClassName(String action) { + ActionConfig ac = this.actions.get(action); + if (ac == null) { + return null; } - public String getResultView(String action, String resultName) { - ActionConfig ac = this.actions.get(action); - if(ac == null) { - return null; - } - return ac.getViewName(resultName); + return ac.getClassName(); + } + + public String getResultView(String action, String resultName) { + ActionConfig ac = this.actions.get(action); + if (ac == null) { + return null; } - private static class ActionConfig { - String name; - String clzName; - Map viewResult = new HashMap<>(); - - public ActionConfig(String actionName, String clzName) { - this.clzName = clzName; - this.name = actionName; - } - public String getClassName() { - return clzName; - } - public void addViewResult(String name, String viewName) { - viewResult.put(name, viewName); - } - public String getViewName(String resultName) { - return viewResult.get(resultName); - } - + return ac.getViewName(resultName); + } + + private static class ActionConfig { + String name; + String clzName; + Map viewResult = new HashMap<>(); + + public ActionConfig(String actionName, String clzName) { + this.clzName = clzName; + this.name = actionName; + } + + public String getClassName() { + return clzName; + } + + public void addViewResult(String name, String viewName) { + viewResult.put(name, viewName); + } + + public String getViewName(String resultName) { + return viewResult.get(resultName); } + + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java index df763a0ab4..83ab2dbe85 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationException.java @@ -1,18 +1,19 @@ package com.github.HarryHook.coding2017.litestruts; - import java.io.IOException; import org.jdom2.JDOMException; public class ConfigurationException extends RuntimeException { - public ConfigurationException(String msg) { - super(msg); - } - public ConfigurationException(JDOMException e) { - super(e); - } - public ConfigurationException(IOException e) { - super(e); - } + public ConfigurationException(String msg) { + super(msg); + } + + public ConfigurationException(JDOMException e) { + super(e); + } + + public ConfigurationException(IOException e) { + super(e); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java index 9e25a7974e..114104c87e 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ConfigurationTest.java @@ -6,38 +6,39 @@ import org.junit.Test; public class ConfigurationTest { - - Configuration cfg = new Configuration("struts.xml"); - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testGetClassName() { - String clzName = cfg.getClassName("login"); - Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LoginAction", clzName); - - clzName = cfg.getClassName("logout"); - Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LogoutAction", clzName); - } - - @Test - public void testGetResultView() { - String jsp = cfg.getResultView("login", "success"); - Assert.assertEquals("/jsp/homepage.jsp", jsp); - - jsp = cfg.getResultView("login", "fail"); - Assert.assertEquals("/jsp/showLogin.jsp", jsp); - - jsp = cfg.getResultView("logout", "success"); - Assert.assertEquals("/jsp/welcome.jsp", jsp); - - jsp = cfg.getResultView("logout", "error"); - Assert.assertEquals("/jsp/error.jsp", jsp); - } + + Configuration cfg = new Configuration("struts.xml"); + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testGetClassName() { + String clzName = cfg.getClassName("login"); + Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LoginAction", clzName); + + clzName = cfg.getClassName("logout"); + Assert.assertEquals("com.github.HarryHook.coding2017.litestruts.LogoutAction", clzName); + } + + @Test + public void testGetResultView() { + String jsp = cfg.getResultView("login", "success"); + Assert.assertEquals("/jsp/homepage.jsp", jsp); + + jsp = cfg.getResultView("login", "fail"); + Assert.assertEquals("/jsp/showLogin.jsp", jsp); + + jsp = cfg.getResultView("logout", "success"); + Assert.assertEquals("/jsp/welcome.jsp", jsp); + + jsp = cfg.getResultView("logout", "error"); + Assert.assertEquals("/jsp/error.jsp", jsp); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java index d42f7b0cd6..120d72f1e0 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/LoginAction.java @@ -2,41 +2,42 @@ /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * * @author liuxin * */ public class LoginAction { - - private String name ; + + private String name; private String password; private String message; - public String getName() { - return name; + public String getName() { + return name; } public String getPassword() { - return password; + return password; } public String execute() { - if("test".equals(name) && "1234".equals(password)) { - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; } - + public void setName(String name) { - this.name = name; + this.name = name; } - + public void setPassword(String password) { - this.password = password; + this.password = password; } - + public String getMessage() { - return this.message; + return this.message; } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java index 1efcb21574..850f644a2b 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtil.java @@ -7,76 +7,74 @@ import java.util.List; import java.util.Map; +public class ReflectionUtil { -public class ReflectionUtil -{ + public static List getSetterMethods(Class clz) { - public static List getSetterMethods(Class clz) { - - return getMethods(clz, "set"); - } + return getMethods(clz, "set"); + } + + public static void setParameters(Object o, Map params) { + + List methods = getSetterMethods(o.getClass()); + + for (String name : params.keySet()) { + + String methodName = "set" + name; + + for (Method m : methods) { - public static void setParameters(Object o, Map params) { - - List methods = getSetterMethods(o.getClass()); - - for(String name : params.keySet()) { - - String methodName = "set" + name; - - for(Method m : methods) { - - if(m.getName().equalsIgnoreCase(methodName)) { - try { - m.invoke(o, params.get(name)); - - }catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } + if (m.getName().equalsIgnoreCase(methodName)) { + try { + m.invoke(o, params.get(name)); + + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); } } } - } - public static List getGetterMethods(Class clz) { - - return getMethods(clz, "get"); - } + } - public static List getMethods(Class clz, String startWithName) { - - List methods = new ArrayList<>(); - for(Method m : clz.getDeclaredMethods()) { + public static List getGetterMethods(Class clz) { - if(m.getName().startsWith(startWithName)) { - methods.add(m); - } + return getMethods(clz, "get"); + } + + public static List getMethods(Class clz, String startWithName) { + + List methods = new ArrayList<>(); + for (Method m : clz.getDeclaredMethods()) { + + if (m.getName().startsWith(startWithName)) { + methods.add(m); } - - return methods; } - public static Map getParameterMap(Object o) { - - Map params = new HashMap<>(); - - List methods = getGetterMethods(o.getClass()); - - for(Method m : methods) { - - String methodName = m.getName(); - String name = methodName.replaceFirst("get", "").toLowerCase(); - - try { - Object value = m.invoke(o); - params.put(name, value); - - }catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } + return methods; + } + + public static Map getParameterMap(Object o) { + + Map params = new HashMap<>(); + + List methods = getGetterMethods(o.getClass()); + + for (Method m : methods) { + + String methodName = m.getName(); + String name = methodName.replaceFirst("get", "").toLowerCase(); + + try { + Object value = m.invoke(o); + params.put(name, value); + + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); } - - return params; } + + return params; + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java index ff4c30f05d..043b2d3050 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/ReflectionUtilTest.java @@ -14,100 +14,99 @@ import org.junit.Before; import org.junit.Test; - public class ReflectionUtilTest { - @Before - public void setUp() throws Exception { - } + @Before + public void setUp() throws Exception { + } - @After - public void tearDown() throws Exception { - } + @After + public void tearDown() throws Exception { + } - @Test - public void testGetSetterMethod() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - List methods = ReflectionUtil.getSetterMethods(clz); - - Assert.assertEquals(2, methods.size()); - - List expectedNames = new ArrayList<>(); - expectedNames.add("setName"); - expectedNames.add("setPassword"); - - Set acctualNames = new HashSet<>(); - for(Method m : methods) { - - acctualNames.add(m.getName()); - } - - Assert.assertTrue(acctualNames.containsAll(expectedNames)); - } - - @Test - public void testSetParameters() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - Object o = clz.newInstance(); - - Map params = new HashMap(); - params.put("name", "test"); - params.put("password", "1234"); - - ReflectionUtil.setParameters(o, params); - - Field f = clz.getDeclaredField("name"); - - f.setAccessible(true); - Assert.assertEquals("test", f.get(o)); - - f = clz.getDeclaredField("password"); - f.setAccessible(true); - Assert.assertEquals("1234", f.get(o)); - } - - @Test - public void testGetGetterMethod() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - List methods = ReflectionUtil.getGetterMethods(clz); - - Assert.assertEquals(3, methods.size()); - - List expectedNames = new ArrayList<>(); - expectedNames.add("getMessage"); - expectedNames.add("getName"); - expectedNames.add("getPassword"); - - Set acctualNames = new HashSet<>(); - for(Method m : methods) { - - acctualNames.add(m.getName()); - } - - Assert.assertTrue(acctualNames.containsAll(expectedNames)); - + @Test + public void testGetSetterMethod() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getSetterMethods(clz); + + Assert.assertEquals(2, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("setName"); + expectedNames.add("setPassword"); + + Set acctualNames = new HashSet<>(); + for (Method m : methods) { + + acctualNames.add(m.getName()); } - - @Test - public void testGetParameters() throws Exception { - - String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; - Class clz = Class.forName(name); - LoginAction action = (LoginAction)clz.newInstance(); - action.setName("test"); - action.setPassword("1234"); - - Map params = ReflectionUtil.getParameterMap(action); - Assert.assertEquals(3, params.size()); - Assert.assertEquals(null, params.get("message")); - Assert.assertEquals("test", params.get("name")); - Assert.assertEquals("1234", params.get("password")); + + Assert.assertTrue(acctualNames.containsAll(expectedNames)); + } + + @Test + public void testSetParameters() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + Object o = clz.newInstance(); + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + ReflectionUtil.setParameters(o, params); + + Field f = clz.getDeclaredField("name"); + + f.setAccessible(true); + Assert.assertEquals("test", f.get(o)); + + f = clz.getDeclaredField("password"); + f.setAccessible(true); + Assert.assertEquals("1234", f.get(o)); + } + + @Test + public void testGetGetterMethod() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + List methods = ReflectionUtil.getGetterMethods(clz); + + Assert.assertEquals(3, methods.size()); + + List expectedNames = new ArrayList<>(); + expectedNames.add("getMessage"); + expectedNames.add("getName"); + expectedNames.add("getPassword"); + + Set acctualNames = new HashSet<>(); + for (Method m : methods) { + + acctualNames.add(m.getName()); } + Assert.assertTrue(acctualNames.containsAll(expectedNames)); + + } + + @Test + public void testGetParameters() throws Exception { + + String name = "com.github.HarryHook.coding2017.litestruts.LoginAction"; + Class clz = Class.forName(name); + LoginAction action = (LoginAction) clz.newInstance(); + action.setName("test"); + action.setPassword("1234"); + + Map params = ReflectionUtil.getParameterMap(action); + Assert.assertEquals(3, params.size()); + Assert.assertEquals(null, params.get("message")); + Assert.assertEquals("test", params.get("name")); + Assert.assertEquals("1234", params.get("password")); + } + } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java index 270e26a57d..4a55b6c2d1 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/Struts.java @@ -4,45 +4,43 @@ import java.util.Map; public class Struts { - + private final static Configuration cfg = new Configuration("struts.xml"); - - public static View runAction(String actionName, Map parameters) { - + + public static View runAction(String actionName, Map parameters) { + String clzName = cfg.getClassName(actionName); - - if(clzName == null) { - + + if (clzName == null) { + return null; - } - - + } + try { - - Class clz = Class.forName(clzName); + + Class clz = Class.forName(clzName); Object action = clz.newInstance(); - + ReflectionUtil.setParameters(action, parameters); - + Method m = clz.getDeclaredMethod("execute"); - String resultName = (String)m.invoke(action); + String resultName = (String) m.invoke(action); - Map params = ReflectionUtil.getParameterMap(action); String resultView = cfg.getResultView(actionName, resultName); - + View view = new View(); view.setParameters(params); view.setJsp(resultView); return view; - - }catch(Exception e) { - + + } catch (Exception e) { + e.printStackTrace(); } - + return null; - + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java index 23dd0a0845..26b12d610c 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/StrutsTest.java @@ -8,43 +8,43 @@ public class StrutsTest { - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + + View view; + + view = Struts.runAction(actionName, params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + + } + + @Test + public void testLoginActionFailed() { + + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); // 密码和预设的不一致 + + try { + View view; - + view = Struts.runAction(actionName, params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - + } catch (Exception e) { + e.printStackTrace(); } - @Test - public void testLoginActionFailed() { - - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - try { - - View view; - - view = Struts.runAction(actionName,params); - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - - }catch(Exception e) { - e.printStackTrace(); - } - - } + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java index 3e35a849c3..258b376ae2 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/litestruts/View.java @@ -2,30 +2,31 @@ import java.util.Map; -public class View -{ - private String jsp; - private Map parameters; - - //对应action获取Jsp - public String getJsp() { - - return jsp; - } - public View setJsp(String jsp) { - - this.jsp = jsp; - return this; - } - - //execute()获取对应参数 - public Map getParameters() { - - return parameters; - } - public View setParameters(Map parameters) { - - this.parameters = parameters; - return this; - } +public class View { + private String jsp; + private Map parameters; + + // 对应action获取Jsp + public String getJsp() { + + return jsp; + } + + public View setJsp(String jsp) { + + this.jsp = jsp; + return this; + } + + // execute()获取对应参数 + public Map getParameters() { + + return parameters; + } + + public View setParameters(Map parameters) { + + this.parameters = parameters; + return this; + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java new file mode 100644 index 0000000000..cd82fb2550 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java @@ -0,0 +1,38 @@ +package com.github.HarryHook.coding2017.queue; + +/** + * 用数组实现循环队列 + * + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + // 用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + // 队头 + private int front = 0; + // 队尾 + private int rear = 0; + + public boolean isEmpty() { + return false; + + } + + public int size() { + return -1; + } + + public void enQueue(E data) { + + } + + public E deQueue() { + return null; + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java new file mode 100644 index 0000000000..7b5fe53f5e --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java @@ -0,0 +1,18 @@ +package com.github.HarryHook.coding2017.queue; + +import java.util.List; + +/** + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 + * + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m) { + return null; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java new file mode 100644 index 0000000000..39d2ef9971 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/JosephusTest.java @@ -0,0 +1,25 @@ +package com.github.HarryHook.coding2017.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java new file mode 100644 index 0000000000..3be0147770 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Queue.java @@ -0,0 +1,55 @@ +package com.github.HarryHook.coding2017.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + private static class Node { + private E item; + private Node next; + } + + public Queue() { + first = null; + last = null; + size = 0; + } + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } else { + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..c72abadcd2 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java @@ -0,0 +1,37 @@ +package com.github.HarryHook.coding2017.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return false; + } + + public int size() { + return -1; + } + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java new file mode 100644 index 0000000000..32bbc0da28 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtil.java @@ -0,0 +1,138 @@ +package com.github.HarryHook.coding2017.stack; + +import com.github.HarryHook.coding2017.basic.MyStack; + +public class StackUtil { + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + + public void reverse(MyStack s) { + + if (s.isEmpty()) { + return; + } + // 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。 + Object tmp1 = s.pop(); + reverse(s); + if (s.isEmpty()) { + s.push(tmp1); + return; + } + Object temp2 = s.pop(); + reverse(s); + s.push(tmp1); + reverse(s); + s.push(temp2); + + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public void remove(MyStack s, Object o) { + if (s.isEmpty()) { + return; + } + MyStack stack = new MyStack(); + while (!(s.isEmpty())) { + if (s.peek() != o) { + stack.push(s.pop()); + } else { + s.pop(); + } + } + while (!(stack.isEmpty())) { + s.push(stack.pop()); + } + + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, + * 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public Object[] getTop(MyStack s, int len) { + if (s.isEmpty() || len <= 0) { + return null; + } + if (len > s.size()) { + len = s.size(); + } + Object[] array = new Object[len]; + + int i = 0; + while (i < len) { + array[i++] = s.pop(); + } + while (i != 0) { + s.push(array[--i]); + } + return array; + } + + /** + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz 使用堆栈检查字符串s中的括号是不是成对出现的。 例如s = + * "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true 如果 s = "([b{x]y})", + * 则该字符串中的括号不是成对出现的, 该方法返回false; + * + * @param s + * @return + */ + public boolean isValidPairs(String s) { + if (s == null || s == "") { + return false; + } + MyStack stack = new MyStack(); + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == '(') { + stack.push(s.charAt(i)); + } else if (s.charAt(i) == ')') { + if (stack.isEmpty()) { + return false; + } else { + char outOfStackChar = (char) stack.pop(); + if (outOfStackChar != '(') { + return false; + } + } + } + + if (s.charAt(i) == '{') { + stack.push(s.charAt(i)); + } else if (s.charAt(i) == '}') { + if (stack.isEmpty()) { + return false; + } else { + char outOfStackChar = (char) stack.pop(); + if (outOfStackChar != '{') { + return false; + } + } + } + + if (s.charAt(i) == '[') { + stack.push(s.charAt(i)); + } else if (s.charAt(i) == ']') { + if (stack.isEmpty()) { + return false; + } else { + char outOfStackChar = (char) stack.pop(); + if (outOfStackChar != '[') { + return false; + } + } + } + + } + return true; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java new file mode 100644 index 0000000000..59f1fa1a40 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackUtilTest.java @@ -0,0 +1,78 @@ +package com.github.HarryHook.coding2017.stack; +import com.github.HarryHook.coding2017.basic.MyStack; +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class StackUtilTest { + private StackUtil sk; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverse() { + sk = new StackUtil(); + MyStack stack = new MyStack(); + stack.push(1); + stack.push(2); + stack.push(3); + sk.reverse(stack); + assertEquals(1, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(3, stack.pop()); + } + @Test + public void testRemove() { + sk = new StackUtil(); + MyStack stack = new MyStack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(5); + sk.remove(stack, 2); + assertEquals(5, stack.pop()); + assertEquals(3, stack.pop()); + assertEquals(1, stack.pop()); + } + @Test + public void testGetTop() { + sk = new StackUtil(); + MyStack stack = new MyStack(); + + Object[] array = sk.getTop(stack, 3); + assertNull(array); + + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(5); + array = sk.getTop(stack, 3); + assertArrayEquals(array, new Object[] {5, 2, 3}); + array = sk.getTop(stack, 6); + assertArrayEquals(array, new Object[] {5, 2, 3, 2, 1}); + array = sk.getTop(stack, -1); + assertNull(array); + } + @Test + public void testIsValidPairs() { + sk = new StackUtil(); + String expr = null; + assertEquals(false, sk.isValidPairs(expr)); + expr = ""; + assertEquals(false, sk.isValidPairs(expr)); + expr = "{xx[x]t)yyza]}"; + assertEquals(false, sk.isValidPairs(expr)); + expr = "asd{[(asds)]sx}"; + assertEquals(true, sk.isValidPairs(expr)); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..b9667fdaac --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExpr.java @@ -0,0 +1,103 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import com.github.HarryHook.coding2017.basic.MyStack; + +public class InfixExpr { + + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + char[] ch = expr.toCharArray(); + MyStack stackOfOperator = new MyStack(); + MyStack stackOfNumber = new MyStack(); + + for (int i = 0; i < ch.length; i++) { + + if (Character.isDigit(ch[i])) { + float tmp = Float.parseFloat("" + ch[i]); + while (i < ch.length - 1 && Character.isDigit(ch[++i])) { + tmp = tmp * 10 + Float.parseFloat("" + ch[i]); + } + + stackOfNumber.push(tmp); + + } + if (ch[i] == '+' || ch[i] == '-' || ch[i] == '*' || ch[i] == '/') { + stackOfOperator.push(ch[i]); + } + + char operator = (char) stackOfOperator.peek(); + if (operator == '*' || operator == '/') { + float tmp = Float.parseFloat("" + ch[++i]); + while (i < ch.length - 1 && Character.isDigit(ch[++i])) { + tmp = tmp * 10 + Float.parseFloat("" + ch[i]); + } + if (i != ch.length - 1) { + i--; + } + stackOfNumber.push(tmp); + + float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); + float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); + if (operator == '*') { + stackOfNumber.push(tmp1 * tmp2); + } else { + stackOfNumber.push(tmp2 / tmp1); + } + + stackOfOperator.pop(); + } + + } + // 将栈中的数字和运算符逆置,从左往右结合 + reverse(stackOfNumber); + reverse(stackOfOperator); + + while (!(stackOfOperator.isEmpty())) { + char operator = (char) stackOfOperator.peek(); + if (operator == '+' || operator == '-') { + float tmp1 = Float.parseFloat("" + stackOfNumber.pop()); + float tmp2 = Float.parseFloat("" + stackOfNumber.pop()); + if (operator == '+') { + stackOfNumber.push(tmp1 + tmp2); + } else { + stackOfNumber.push(tmp1 - tmp2); + } + } + + stackOfOperator.pop(); + } + + return Float.parseFloat("" + stackOfNumber.pop()); + } + + private void reverse(MyStack s) { + + if (s.isEmpty()) { + return; + } + // 如果s里面只有一个元素,就返回。具体实现是先pop出来一个,判断剩下的是不是空栈。 + Object tmp1 = s.pop(); + reverse(s); + if (s.isEmpty()) { + s.push(tmp1); + return; + } + Object temp2 = s.pop(); + reverse(s); + s.push(tmp1); + reverse(s); + s.push(temp2); + + } + + public static void main(String[] args) { + InfixExpr expr = new InfixExpr("2+3*4+5"); + System.out.println(expr.evaluate()); + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..4abd227502 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixExprTest.java @@ -0,0 +1,47 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import org.junit.Assert; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + // InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..10088e28cd --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/InfixToPostfix.java @@ -0,0 +1,53 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array; + +//中序表达式: 3*20+12*5-40/2 转换成后续表达式:3 20 * 12 5 * + 40 2 / - +//思路:当前token依次从左往右读取, 数字依次append, 当前入栈的运算符的优先级小于等于栈顶的运算符,栈顶操作符出栈 +public class InfixToPostfix { + + public List convert(String expr) { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + List listOfTokens = new ArrayList<>(); + + Stack opsStack = new Stack<>(); + + for (Token token : tokens) { + + if (token.isNumber()) { + listOfTokens.add(token); + } else if (token.isOperator()) { // 还需判断当前操作符和栈顶操作符的优先级 + if (opsStack.isEmpty()) { + opsStack.push(token); + } else { + if (!token.hasHigherPriority(opsStack.peek())) { + listOfTokens.add(opsStack.pop()); + } + opsStack.push(token); + } + + } + } + while (!(opsStack.isEmpty())) { // exprStack 为空,但操作符栈还有元素 + listOfTokens.add(opsStack.pop()); + } + return listOfTokens; + } + + public static void main(String[] args) { + InfixToPostfix toPostfix = new InfixToPostfix(); + List t = new ArrayList(); + String expr = "3+20+12*5+40/2"; + t = toPostfix.convert(expr); + System.out.println("expr: " + expr); + System.out.println("PostfixExpr: " + t); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..49bebad1a7 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExpr.java @@ -0,0 +1,54 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack numStack = new Stack<>(); + for (Token token : tokens) { + + if (token.isNumber()) { + numStack.push(new Float(token.getIntValue())); + } else { + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + } + return numStack.pop().floatValue(); + } + + // 注意,此时计算的顺序和前序的次序相反 + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + if (op.equals("-")) { + return f1 - f2; + } + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + " is not supported"); + } + + public static void main(String[] args) { + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + System.out.println("The result of the expression: " + expr.evaluate()); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..7e78fa3997 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PostfixExprTest.java @@ -0,0 +1,37 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(), 0.0f); + } + { + // 9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(), 0.0f); + } + + { + // 10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(), 0.0f); + } + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..d93b6e32fe --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExpr.java @@ -0,0 +1,58 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for (Token token : tokens) { + exprStack.push(token); + } + System.out.println(tokens); + while (!exprStack.isEmpty()) { + Token t = exprStack.pop(); + if (t.isNumber()) { + numStack.push(new Float(t.getIntValue())); + } else if(t.isOperator()){ + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(t.toString(), f1, f2)); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + if (op.equals("-")) { + return f1 - f2; + } + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + " is not supported"); + } + + public static void main(String[] args) { + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + System.out.println("The result of the expression: " + expr.evaluate()); + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..3dbef83ca2 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/PrefixExprTest.java @@ -0,0 +1,43 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(), 0.001f); + } + { + // (3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } + { + // 1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java new file mode 100644 index 0000000000..097d635bd2 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java new file mode 100644 index 0000000000..8d520fd68a --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParser.java @@ -0,0 +1,56 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else { + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..3067467a10 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/expr/TokenParserTest.java @@ -0,0 +1,39 @@ +package com.github.HarryHook.coding2017.stack.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} \ No newline at end of file diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 0a2df7bbee..8380fddb34 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -1,4 +1,7 @@ target/ .idea/ src/main/java/train/ -src/main/resources/ \ No newline at end of file +!src/main/resources/**/*.class +!src/main/resources/**/*.xml +src/main/resources/**/*.png +src/main/java/assignments diff --git a/group02/812350401/pom.xml b/group02/812350401/pom.xml index 9a637781ce..596d874817 100644 --- a/group02/812350401/pom.xml +++ b/group02/812350401/pom.xml @@ -7,6 +7,7 @@ coding2017 812350401 1.0-SNAPSHOT + jar @@ -32,7 +33,32 @@ dom4j 1.6.1 + + org.jetbrains + annotations + RELEASE + + + + commons-io + commons-io + 2.5 + + + + org.apache.commons + commons-lang3 + 3.4 + + + + io.reactivex.rxjava2 + rxjava + 2.0.8 + + + \ No newline at end of file diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java deleted file mode 100644 index ddfe76f774..0000000000 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.github.miniyk2012.coding2017.basic; - -public class Stack { - - // 栈顶 《-》 1,2,3,4 栈底 - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(0, o); - } - - public Object pop(){ - return elementData.remove(0); - } - - public Object peek(){ - return elementData.get(0); - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..b29b385d31 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrame.java @@ -0,0 +1,148 @@ +package com.github.miniyk2012.coding2017.basic.linklist; + +/** + * 用双向链表实现LRU算法 + * @author liuxin + * + */ +public class LRUPageFrame { + + private static class Node { + + Node prev; + Node next; + int pageNum; + + Node() { + } + + Node(int pageNum) { + this.pageNum = pageNum; + } + } + + private int capacity; + private int size; + + private Node first;// 链表头 + private Node last;// 链表尾 + + + public LRUPageFrame(int capacity) { + + this.capacity = capacity; + + } + + /** + * 获取缓存中对象 + * + * @param pageNum: page值 + * @return + */ + public void access(int pageNum) { + Node hitNode = get(pageNum); + if (null == hitNode) { + hitNode = new Node(pageNum); + addTop(hitNode); + if (size > capacity) { + delBottom(); + } + } else { + switchTop(hitNode); + } + } + + /** + * 获取值为pageNum的Node,如果没有返回null + * @param pageNum + * @return + */ + private Node get(int pageNum) { + Node currentNode = first; + while (currentNode != null) { + if (currentNode.pageNum == pageNum) return currentNode; + currentNode = currentNode.next; + } + return null; + } + + /** + * 往顶部放一个Node + * @param node + */ + private void addTop(Node node) { + size++; + if (first == null) { + first = last = node; + } else { + node.next = first; + first.prev = node; + first = node; + } + } + + /** + * 把node和顶部做交换 + * @param node + */ + private void switchTop(Node node) { + if (node == first) return; + Node preNode = node.prev; + Node nextNode = node.next; + preNode.next = nextNode; + if (nextNode != null) { + nextNode.prev = preNode; + } else { + last = preNode; + } + node.next = node.prev = null; + addTop(node); + size--; + } + + /** + * 把底部的踢掉 + */ + private void delBottom() { + size--; + if (last == first) first = null; + Node temp = last; + last = last.prev; + temp.prev = null; + last.next = 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(); + } + + /** + * 测试双向链表逆序输出 + * @return + */ + public String lastToString(){ + StringBuilder buffer = new StringBuilder(); + Node node = last; + while(node != null){ + buffer.append(node.pageNum); + + node = node.prev; + if(node != null){ + buffer.append(","); + } + } + return buffer.toString(); + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..9f93ca8fc6 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,62 @@ +package com.github.miniyk2012.coding2017.basic.linklist; + +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); + Assert.assertEquals("0,7", frame.toString()); + Assert.assertEquals("7,0", frame.lastToString()); + frame.access(1); + Assert.assertEquals("1,0,7", frame.toString()); + Assert.assertEquals("7,0,1", frame.lastToString()); + frame.access(2); + Assert.assertEquals("2,1,0", frame.toString()); + Assert.assertEquals("0,1,2", frame.lastToString()); + frame.access(0); + Assert.assertEquals("0,2,1", frame.toString()); + Assert.assertEquals("1,2,0", frame.lastToString()); + frame.access(0); + Assert.assertEquals("0,2,1", frame.toString()); + Assert.assertEquals("1,2,0", frame.lastToString()); + frame.access(3); + Assert.assertEquals("3,0,2", frame.toString()); + Assert.assertEquals("2,0,3", frame.lastToString()); + frame.access(0); + Assert.assertEquals("0,3,2", frame.toString()); + Assert.assertEquals("2,3,0", frame.lastToString()); + frame.access(4); + Assert.assertEquals("4,0,3", frame.toString()); + Assert.assertEquals("3,0,4", frame.lastToString()); + frame.access(4); + Assert.assertEquals("4,0,3", frame.toString()); + Assert.assertEquals("3,0,4", frame.lastToString()); + frame.access(4); + Assert.assertEquals("4,0,3", frame.toString()); + Assert.assertEquals("3,0,4", frame.lastToString()); + frame.access(0); + Assert.assertEquals("0,4,3", frame.toString()); + Assert.assertEquals("3,4,0", frame.lastToString()); + frame.access(7); + Assert.assertEquals("7,0,4", frame.toString()); + Assert.assertEquals("4,0,7", frame.lastToString()); + frame.access(4); + Assert.assertEquals("4,7,0", frame.toString()); + Assert.assertEquals("0,7,4", frame.lastToString()); + + LRUPageFrame frame2 = new LRUPageFrame(1); + Assert.assertEquals("", frame2.toString()); + frame2.access(7); + Assert.assertEquals("7", frame2.toString()); + frame2.access(0); + Assert.assertEquals("0", frame2.toString()); + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java new file mode 100644 index 0000000000..19cd662268 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/Stack.java @@ -0,0 +1,43 @@ +package com.github.miniyk2012.coding2017.basic.stack; + +import com.github.miniyk2012.coding2017.basic.ArrayList; + +public class Stack { + + // 栈顶 《-》 1,2,3,4 栈底 + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(0, o); + } + + // 如果队列已经没有值了,则抛出ArrayIndexOutOfBoundsException的异常 + public Object pop(){ + try { + return elementData.remove(0); + } catch (Exception e) { + throw new NullStackException(); + } + } + + public Object peek(){ + return elementData.get(0); + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } + + public static void main(String[] args) { + Stack s = new Stack(); + s.pop(); + } + + public static class NullStackException extends RuntimeException { + NullStackException() { + super("Null Stack!"); + } + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java new file mode 100644 index 0000000000..c4e253d92b --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackUtil.java @@ -0,0 +1,158 @@ +package com.github.miniyk2012.coding2017.basic.stack; + +import com.github.miniyk2012.coding2017.basic.Queue; +import java.util.*; + +/** + * Created by thomas_young on 5/4/2017. + */ +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) { + Queue q = new Queue(); + while (!s.isEmpty()) { + q.enQueue(s.pop()); + } + while (!q.isEmpty()) { + s.push(q.deQueue()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + Stack tempS = new Stack(); + boolean found = false; + while (!s.isEmpty()) { + if (!found && Objects.equals(s.peek(), o)) { + s.pop(); + found = true; + } else { + tempS.push(s.pop()); + } + } + while (!tempS.isEmpty()) { + s.push(tempS.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + if (len < 0) { + return null; + } + Stack tempS = new Stack(); + while (tempS.size() matchBrackets = new HashMap() {{ + put("{", "}"); + put("[", "]"); + put("(", ")"); + }}; + + Stack stack = new Stack(); + for (int i=0; i evaluate(Token operator, Token number1, Token number2) { + float ret; + switch (operator.value) { + case PLUS: + ret = number1.getValue() + number2.getValue(); + break; + case SUB: + ret = number1.getValue() - number2.getValue(); + break; + case MUL: + ret = number1.getValue() * number2.getValue(); + break; + case DIV: + ret = number1.getValue() / number2.getValue(); + break; + default: + throw new RuntimeException("运算符不存在"); + } + return new Token(ret, true); + } + + + public float evaluate() { + List tokens= Token.parse(expr); + Stack> numberStack = new Stack<>(); + Stack> operatorStack = new Stack<>(); + for (Token t : tokens) { + if (t.isNumber()) { + numberStack.push(t); + } else { + if (operatorStack.isEmpty()) { + operatorStack.push(t); + } else { + Token preT = operatorStack.peek(); + if ((preT.value).priority >= ((Operator)t.value).priority) { + Token number2 = numberStack.pop(); + Token number1 = numberStack.pop(); + operatorStack.pop(); + numberStack.push(evaluate(preT, number1, number2)); + } + operatorStack.push(t); + + } + } + } + while (!operatorStack.isEmpty()) { + Token number2 = numberStack.pop(); + Token number1 = numberStack.pop(); + Token operator = operatorStack.pop(); + numberStack.push(evaluate(operator, number1, number2)); + } + return numberStack.pop().getValue(); + } + + + private static class Token { + private boolean number; // 是数字/操作符 + private T value; + public boolean isNumber() { + return number; + } + public T getValue() { + return value; + } + + public Token(T value, boolean number) { + this.value = value; + this.number = number; + } + public static List parse(String expr) { + int i = 0; + int size = expr.length(); + String current; + List tokens = new LinkedList<>(); + String value = ""; + while (i < size) { + current = expr.substring(i,i+1); + if (isOperator(current)) { + tokens.add(new Token(Float.parseFloat(value), true)); + value = ""; + tokens.add(new Token(Operator.parseOperator(current), false)); + } else { + value += current; + } + i++; + } + tokens.add(new Token(Float.parseFloat(value), true)); + return tokens; + } + + private static boolean isOperator(String value) { + for (Operator c : Operator.values()) { + if (c.value.equals(value)) { + return true; + } + } + return false; + } + } + + public static void main(String[] args) { + + + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..706aaea86e --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3"); + Assert.assertEquals(5.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..75a579e3cb --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..c4d13704f2 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,73 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.clz; + + +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ClassInfo; +import com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..b71f919b66 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..e818dcb72b --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..3ec050d100 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..09370db1e5 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.constant; + +import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; + +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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..98c5ced1a9 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,53 @@ +package com.github.miniyk2012.coding2017.coderising.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(); + return classInfo.getClassName(); + + } + + 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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..a3cf910c99 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,56 @@ +package com.github.miniyk2012.coding2017.coderising.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()); + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(classInfoIndex); + return clzInfo.getClassName(); + } + + public String getMethodName(){ + // ConstantPool pool = this.getConstantPool(); + // NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(nameAndTypeIndex); + return typeInfo.getName(); + } + + public String getParamAndReturnType(){ + // ConstantPool pool = this.getConstantPool(); + // NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(nameAndTypeIndex); + return typeInfo.getTypeInfo(); + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..79f421bdd1 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,47 @@ +package com.github.miniyk2012.coding2017.coderising.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); + UTF8Info utf8Info1 = (UTF8Info)getConstantInfo(index1); + return utf8Info1.getValue(); + } + + public String getTypeInfo(){ + // ConstantPool pool = this.getConstantPool(); + // UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2); + UTF8Info utf8Info2 = (UTF8Info)getConstantInfo(index2); + return utf8Info2.getValue(); + } + + public String toString(){ + return "(" + getName() + "," + getTypeInfo()+")"; + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..2a16601a40 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..428191ee6a --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..3247ec1656 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,30 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..73eb2fc1ff --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,79 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.loader; + +import com.github.miniyk2012.coding2017.coderising.jvm.util.Util; +import org.apache.commons.lang3.ArrayUtils; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; + +public class ByteCodeIterator { + private byte[] codes; + private int point = 0; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public int nextU1toInt() { + byte[] u1 = new byte[] {codes[point++]}; + return Util.byteToInt(u1); + } + + public int nextU2toInt() { + byte[] u2 = new byte[] {codes[point++], codes[point++]}; + return Util.byteToInt(u2); + } + + /** + * 读取n个字节,并编码成UTF-8输出,point自动增加 + * @param n + * @return + */ + public String readUtf8(int n) + { + byte[] info = Arrays.copyOfRange(codes, point, point+n); + String utf8; + try { + utf8 = new String(info, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("常量池UTF-8编码错误"); + } + point += n; + return utf8; + } + + /** + * 返回当前位置 + * @return + */ + public int position() { + return point; + } + + /** + * n可正可负 + * @param n + */ + public void skip(int n) { + point = point + n; + } + + public void seek(int n) { + if (n >= codes.length || n < 0) throw new IndexOutOfBoundsException(); + point = n; + } + + public static void main(String[] args) throws UnsupportedEncodingException { + byte[] codes = {0x00, 0x34, 0x00}; + ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes); + System.out.println(byteCodeIterator.nextU2toInt()); + System.out.println(byteCodeIterator.nextU1toInt()); + + byte[] codes2 = "Employee".getBytes("UTF-8"); + byte[] codes3 = ArrayUtils.addAll(codes2, codes); + byteCodeIterator = new ByteCodeIterator(codes3); + System.out.println(byteCodeIterator.readUtf8(codes2.length)); + System.out.println(byteCodeIterator.nextU2toInt()); + System.out.println(byteCodeIterator.nextU1toInt()); + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..650afcb6c1 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,89 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.loader; + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import org.apache.commons.io.FileUtils; +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + + String classPath = className.replace(".", File.separator) + ".class"; + for (String parentPath: clzPaths) { + try { + String fullPath = parentPath + File.separator + classPath; + return FileUtils.readFileToByteArray(new File(fullPath)); + } catch (IOException e) { + continue; + } + } + return null; + } + + public void addClassPath(String path) { + clzPaths.add(path); + } + + public String getClassPath(){ + return String.join(";", clzPaths); + } + + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } + + // backup + public byte[] readBinaryCodeV1(String className) { + byte[] ret = null; + String classPath = className.replace(".", File.separator) + ".class"; + for (String parentPath: clzPaths) { + String fullPath = parentPath + File.separator + classPath; + ret = readFileToByteArray(fullPath); + if (null != ret) { + return ret; + } + + } + return ret; + + } + + private byte[] readFileToByteArray(String fullPath) { + InputStream is = null; + ByteArrayOutputStream bas = null; + byte[] ret = null; + try { + is = new BufferedInputStream(new FileInputStream(new File(fullPath))); + bas = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int bytesRead = 0; + while ((bytesRead = is.read(buf)) != -1) { + bas.write(buf, 0, bytesRead); + } + ret = bas.toByteArray(); + } catch (IOException e) { +// e.printStackTrace(); + } finally { + try { + if (is != null) + is.close(); + if (bas != null) + bas.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return ret; + } + + public static void main(String[] args) { + new ClassFileLoader().readBinaryCode(""); + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..7b84a15899 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,112 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.loader; + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.AccessFlag; +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassIndex; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.*; + + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + + ClassFile clzFile = new ClassFile(); + ByteCodeIterator byteCodeIterator = new ByteCodeIterator(codes); + byteCodeIterator.skip(4); // skip magic + int minorVersion = byteCodeIterator.nextU2toInt(); + int majorVersion = byteCodeIterator.nextU2toInt(); + ConstantPool constantPool = parseConstantPool(byteCodeIterator); + AccessFlag accessFlag = parseAccessFlag(byteCodeIterator); + ClassIndex classIndex = parseClassInfex(byteCodeIterator); + + clzFile.setMinorVersion(minorVersion); + clzFile.setMajorVersion(majorVersion); + clzFile.setConstPool(constantPool); + clzFile.setAccessFlag(accessFlag); + clzFile.setClassIndex(classIndex); + return clzFile; + } + + protected AccessFlag parseAccessFlag(ByteCodeIterator iter) { + int access_flags = iter.nextU2toInt(); + AccessFlag accessFlag = new AccessFlag(access_flags); + return accessFlag; + } + + protected ClassIndex parseClassInfex(ByteCodeIterator iter) { + ClassIndex classIndex = new ClassIndex(); + int thisClassIndex = iter.nextU2toInt(); + int superClassIndex = iter.nextU2toInt(); + classIndex.setThisClassIndex(thisClassIndex); + classIndex.setSuperClassIndex(superClassIndex); + return classIndex; + } + + protected ConstantPool parseConstantPool(ByteCodeIterator iter) { + ConstantPool constantPool = new ConstantPool(); + int constant_pool_count = iter.nextU2toInt(); + ConstantInfo constantInfo; + constantPool.addConstantInfo(new NullConstantInfo()); + for (int i=1; 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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..10cf71d576 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.github.miniyk2012.coding2017.coderising.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/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..2f1d3e929b --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/util/Util.java @@ -0,0 +1,26 @@ +package com.github.miniyk2012.coding2017.coderising.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 parameters) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public static View runAction(String actionName, Map parameters) throws Exception { /* @@ -93,10 +95,9 @@ private static Map getFields() return map; } - private static void readXml() throws DocumentException { - String fileName = Thread.currentThread().getContextClassLoader().getResource("").getPath() - + "com/github/miniyk2012/coding2017/coderising/litestruts/struts.xml"; - File aFile = new File(fileName); + private static void readXml() throws DocumentException, URISyntaxException { + URL url = Struts.class.getClassLoader().getResource("struts/struts.xml"); + File aFile = new File(url.toURI()); SAXReader xmlReader = new SAXReader(); doc = xmlReader.read(aFile); } @@ -161,13 +162,16 @@ private static void generateObject(String actionName) } - public static void main(String args[]) throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException + public static void main(String args[]) throws Exception { - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - View view = runAction("login", params); - logger.info(view.toString()); +// Map params = new HashMap(); +// params.put("name","test"); +// params.put("password","1234"); +// View view = runAction("login", params); +// logger.info(view.toString()); + System.out.println(Struts.class.getResource("")); + System.out.println(Struts.class.getResource("/")); + System.out.println(Struts.class.getClassLoader().getResource("")); } } diff --git a/group02/812350401/src/main/resources/jvm/com/github/miniyk2012/coding2017/jvm/test/EmployeeV1.class b/group02/812350401/src/main/resources/jvm/com/github/miniyk2012/coding2017/jvm/test/EmployeeV1.class new file mode 100644 index 0000000000000000000000000000000000000000..c6c3c4a41546ae14b237a06a8f0868a61dc42cf5 GIT binary patch literal 1056 zcmah|?M@Rx6g^W)Kb93rYikjZ1yTEftSIUa3<)tBNGh6Onh<{tWrEx6cAM^&q>rTu zkZ9rq_)x|((;~rQ%x-4yow@hibI!Cse|`G_U=uIWNC>R7!oY2X$ExQ=UgyMZp9XHM zqS$>Cbp3FkRC6PZq(H7MPo?Wimb^b|t5z(K?8ra~_q~rjsJ@y*L0-feIuoK14Yd+#flv*C|NO#Gm#wZD&G&YSj18q z_pbSKFo zqck206pYW;F>F*&ri8AB^*dx3NROXV<zW&u2{pkVSAq|3&P2R7ekXatSzM=>9r9e) z&D1Vn*Xm~s7S1sH#WWPS=8@!@h zoMZKGYDKn`44lmtZNyM;7FE +* @since

Apr 6, 2017
+* @version 1.0 +*/ +public class StackUtilTest { + + private StackUtil sk; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverse() { + sk = new StackUtil(); + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + sk.reverse(stack); + assertEquals(1, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(3, stack.pop()); + } + @Test + public void testRemove() { + sk = new StackUtil(); + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(5); + sk.remove(stack, 2); + assertEquals(5, stack.pop()); + assertEquals(3, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(1, stack.pop()); + } + @Test + public void testGetTop() { + sk = new StackUtil(); + Stack stack = new Stack(); + + Object[] array = sk.getTop(stack, 3); + assertArrayEquals(array, new Object[0]); + + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(5); + array = sk.getTop(stack, 3); + assertArrayEquals(array, new Object[] {5, 2, 3}); + array = sk.getTop(stack, 6); + assertArrayEquals(new Object[] {5, 2, 3, 2, 1}, array); + array = sk.getTop(stack, -1); + assertNull(array); + } + @Test + public void testIsValidPairs() { + sk = new StackUtil(); + String expr = ""; + assertEquals(true, sk.isValidPairs(expr)); + expr = "{xx[])yyza]}"; + assertEquals(false, sk.isValidPairs(expr)); + expr = "asd{[(asds)]sx}"; + assertEquals(true, sk.isValidPairs(expr)); + } + +} diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java index 501326dae0..0b5276fda5 100644 --- a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/download/FileDownloaderTest.java @@ -3,9 +3,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; - import com.github.miniyk2012.coding2017.coderising.download.api.ConnectionManager; -import com.github.miniyk2012.coding2017.coderising.download.api.DownloadListener; import com.github.miniyk2012.coding2017.coderising.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { @@ -24,17 +22,12 @@ public void testDownload() { String url = "http://inews.gtimg.com/newsapp_bt/0/1209438116/1000"; // String url = "https://www.baidu.com/img/bd_logo.png"; - - FileDownloader downloader = new FileDownloader(url, "test.png"); + String filePath = "src/main/resources/downloads/test.png"; + FileDownloader downloader = new FileDownloader(url, filePath); ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - }); + downloader.setListener(() -> downloadFinished = true); downloader.execute(); diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java new file mode 100644 index 0000000000..6aa66225b7 --- /dev/null +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParserTest.java @@ -0,0 +1,53 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.loader; + +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.UTF8Info; +import com.github.miniyk2012.coding2017.coderising.jvm.test.ClassFileloaderTest; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by thomas_young on 9/4/2017. + */ +public class ClassFileParserTest { + private static ClassFileParser parser; + private static byte[] byteCodes; + + @BeforeClass + public static void setUp() { + String path = ClassFileloaderTest.class.getClassLoader().getResource("jvm").getPath(); + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1"; + byteCodes = loader.readBinaryCode(className); + parser = new ClassFileParser(); + } + + @Test + public void parse() throws Exception { + + } + + @Test + public void parseAccessFlag() throws Exception { + + } + + @Test + public void parseClassInfex() throws Exception { + + } + + @Test + public void parseConstantPool() throws Exception { + ByteCodeIterator byteCodeIterator = new ByteCodeIterator(byteCodes); + byteCodeIterator.skip(8); // skip magic,minor_version,major_version + ConstantPool constantPool = parser.parseConstantPool(byteCodeIterator); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(5); + assertEquals("name", utf8Info.getValue()); + } + +} \ No newline at end of file diff --git a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java index 15e569a766..f183d9a778 100644 --- a/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java +++ b/group02/812350401/src/test/java/com/github/miniyk2012/coding2017/coderising/litestruts/StrutsTest.java @@ -13,7 +13,7 @@ public class StrutsTest { @Test - public void testLoginActionSuccess() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public void testLoginActionSuccess() throws Exception { String actionName = "login"; @@ -29,7 +29,7 @@ public void testLoginActionSuccess() throws DocumentException, InstantiationExce } @Test - public void testLoginActionFailed() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public void testLoginActionFailed() throws Exception { String actionName = "login"; Map params = new HashMap(); params.put("name","test"); @@ -42,7 +42,7 @@ public void testLoginActionFailed() throws DocumentException, InstantiationExcep } @Test - public void testLogoutActionSuccess() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public void testLogoutActionSuccess() throws Exception { String actionName = "logout"; @@ -58,7 +58,7 @@ public void testLogoutActionSuccess() throws DocumentException, InstantiationExc } @Test - public void testLogoutActionFailed() throws DocumentException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, IntrospectionException { + public void testLogoutActionFailed() throws Exception { String actionName = "logout"; Map params = new HashMap(); params.put("name","test"); diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..a1369ab554 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,76 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.exception.AddAnotherParserException; +import com.coderising.jvm.loader.ByteCodeIterator; + +public abstract class AttributeInfo { + + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + + int attrNameIndex; + int attrLen ; + + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + /** + * 解析属性 + * @param pool + * @param iter + * @return + */ + public static List parseAttributes(ConstantPool pool,ByteCodeIterator iter){ + + List attributeInfos = new ArrayList(); + try { + + int attrCount = iter.nextU2ToInt(); + for (int i = 0; i < attrCount; i++) { + + AttributeInfo attr = null; + String attrName = pool.getUTF8String(iter.nextU2ToInt()); + iter.back(ByteCodeIterator.numberTwo); + + switch (attrName) { + case AttributeInfo.CONST_VALUE: + attr = ConstantValueAttr.parse(iter); + break; + case AttributeInfo.CODE: + attr = CodeAttr.parse(pool,iter); + break; + case AttributeInfo.EXCEPTIONS: + //TODE + break; + case AttributeInfo.LINE_NUM_TABLE: + attr = LineNumberTable.parse(iter); + break; + case AttributeInfo.LOCAL_VAR_TABLE: + attr = LocalVariableTable.parse(iter); + break; + case AttributeInfo.STACK_MAP_TABLE: + attr = StackMapTable.parse(iter); + break; + default: + throw new AddAnotherParserException(); + } + attributeInfos.add(attr); + + } + } catch (AddAnotherParserException e) { + e.printStackTrace(); + } + return attributeInfos; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..64e6226561 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,103 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + private ByteCodeCommand[] cmds ; + private List attributeInfos = new ArrayList<>(); + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + + public static CodeAttr parse(ConstantPool pool,ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + ByteCodeCommand[] cmds = CommandParser.parse(pool.getClzFile(),code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code,cmds); + + //解析exception_table start TODO + @SuppressWarnings("unused") + int exceptionTabLen = iter.nextU2ToInt(); + //System.out.println("exception_table 的个数为"+exceptionTabLen); + //解析exception_table end TODO + + codeAttr.setAttributeInfos(AttributeInfo.parseAttributes(pool, iter)); + + return codeAttr; + } + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + public int getMaxStack() { + return maxStack; + } + + + public void setMaxStack(int maxStack) { + this.maxStack = maxStack; + } + + + public int getMaxLocals() { + return maxLocals; + } + + + public void setMaxLocals(int maxLocals) { + this.maxLocals = maxLocals; + } + + + public int getCodeLen() { + return codeLen; + } + + + public void setCodeLen(int codeLen) { + this.codeLen = codeLen; + } + + + public String getCode() { + return code; + } + + + public void setCode(String code) { + this.code = code; + } + + public List getAttributeInfos() { + return attributeInfos; + } + + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java new file mode 100644 index 0000000000..697b484657 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/ConstantValueAttr.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class ConstantValueAttr extends AttributeInfo{ + + private int constantValueIndex; + + public int getConstantValueIndex() { + return constantValueIndex; + } + + public void setConstantValueIndex(int constantValueIndex) { + this.constantValueIndex = constantValueIndex; + } + + public ConstantValueAttr(int attrNameIndex, int attrLen,int constantValueIndex) { + super(attrNameIndex, attrLen); + this.constantValueIndex = constantValueIndex; + } + + public static ConstantValueAttr parse(ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int constantValueIndex = iter.nextU2ToInt(); + return new ConstantValueAttr(attrNameIndex,attrLen,constantValueIndex); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..6029bf4253 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,60 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +@SuppressWarnings("unused") +public class LineNumberTable extends AttributeInfo { + + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int nameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LineNumberTable lineNumberTable = new LineNumberTable(nameIndex,attrLen); + + int tableLen = iter.nextU2ToInt(); + + for (int i = 0; i < tableLen; i++) { + + int startPC = iter.nextU2ToInt(); + int lineNum = iter.nextU2ToInt(); + + LineNumberItem item = new LineNumberItem(); + item.setLineNum(startPC); + item.setLineNum(lineNum); + + lineNumberTable.addLineNumberItem(item); + } + + return lineNumberTable; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..c7209a435e --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,40 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..463b110458 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,47 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int nameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LocalVariableTable localVariableTable = new LocalVariableTable(nameIndex,attrLen); + + int tableLen = iter.nextU2ToInt(); + + for (int i = 0; i < tableLen; i++) { + + int startPC = iter.nextU2ToInt(); + int len = iter.nextU2ToInt(); + int nameindex = iter.nextU2ToInt(); + int descrIndex = iter.nextU2ToInt(); + int index = iter.nextU2ToInt(); + + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(startPC); + item.setNameIndex(nameindex); + item.setLength(len); + item.setDescIndex(descrIndex); + item.setIndex(index); + localVariableTable.addLocalVariableItem(item); + } + return localVariableTable; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..033b6bb179 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,36 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + + int nameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + StackMapTable t = null; + t = new StackMapTable(nameIndex,attrLen); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(attrLen); + t.setOriginalCode(code); + + return t; + } + + + private void setOriginalCode(String code) { + this.originalCode = code; + + } + + public String getOriginalCode() { + return originalCode; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..5abd9961ac --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,24 @@ +package com.coderising.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/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..534bc36cba --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,120 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + for(Method m :methods){ + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + + public Method getMainMethod(){ + for(Method m :methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ + return m; + } + } + return null; + } + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..7750d4439d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..03db32ccc9 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..4c8b21ab09 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,125 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..0dd0573ae5 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,155 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + // System.out.println( cmd.toString(clzFile.getConstPool())); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..92fe286363 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..52a7550d12 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..c6efbae530 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..a17c51a81d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..00f9a5a699 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..a43c8bd964 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..461bb4e2a5 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..6b1b8c284c --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..00b29e1fbc --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6cb42d2a83 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,65 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..c837b9d838 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..35a3d873a9 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,41 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..d641ea15c0 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,46 @@ +package com.coderising.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class ConstantPool { + + private List constantInfos = new ArrayList(); + + private ClassFile clzFile; + + public ConstantPool(ClassFile clzFile){ + this.clzFile = clzFile; + } + + 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 int getSize() { + return this.constantInfos.size() -1; + } + + public List getConstantInfos() { + return constantInfos; + } + + public void setConstantInfos(List constantInfos) { + this.constantInfos = constantInfos; + } + + public ClassFile getClzFile() { + return clzFile; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..804e41a393 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,59 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + + visitor.visitFieldRef(this); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..68d84ad685 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,61 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + + visitor.visitMethodRef(this); + } + + + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..c22a7bfbca --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,50 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..80cc827f18 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..56f5daa724 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + + visitor.visitString(this); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..858f1b212d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,34 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java new file mode 100644 index 0000000000..9754f36adf --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/AddAnotherParserException.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.exception; + +public class AddAnotherParserException extends Exception{ + + private static final long serialVersionUID = 5171999484216739737L; + + public AddAnotherParserException(){ + super("you should add another parser to solve the unknown AttributeInfo or Constant!"); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java new file mode 100644 index 0000000000..8819309841 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NoNextByteCodeException.java @@ -0,0 +1,10 @@ +package com.coderising.jvm.exception; + +public class NoNextByteCodeException extends Exception{ + + private static final long serialVersionUID = -904433109427354744L; + + public NoNextByteCodeException(int byteNum){ + super("already haven't "+byteNum+" byte data!"); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java new file mode 100644 index 0000000000..a627baf742 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/exception/NotAClassFileException.java @@ -0,0 +1,11 @@ +package com.coderising.jvm.exception; + +public class NotAClassFileException extends Exception{ + + private static final long serialVersionUID = -3645339333237670145L; + + public NotAClassFileException() { + super("this file not a java class file!"); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..f29420615a --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,65 @@ +package com.coderising.jvm.field; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Field { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private List attributeInfos = new ArrayList<>(); + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public int getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + + public List getAttributeInfos() { + return attributeInfos; + } + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } + + @Override + public String toString() { + + String fieldName = pool.getUTF8String(nameIndex); + String fieldDesc = pool.getUTF8String(descriptorIndex); + + return (fieldName+":"+fieldDesc); + } + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + + Field field = new Field(accessFlag,nameIndex,descriptorIndex,pool); + field.setAttributeInfos(AttributeInfo.parseAttributes(pool,iter)); + + return field; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..e69ae7b0b3 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,113 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.exception.NoNextByteCodeException; +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + + private byte[] codes; + private int cursor; + + public static int numberOne = 1; + public static int numberTwo = 2; + public static int numberFour = 4; + + public ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + + public boolean hasNext(int len) { + return (cursor+len) <= codes.length; + } + + public byte[] next(int len){ + + byte[] data = new byte[len]; + + int j = 0; + for (int i = cursor; j < len; i++) { + data[j] = codes[i]; + j++; + } + cursor += len; + + return data; + } + + public int nextU2ToInt(){ + + if(!hasNext(numberTwo)){ + try { + throw new NoNextByteCodeException(numberTwo); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + return Util.byteToInt(next(numberTwo)); + } + + public int nextU4ToInt(){ + + if(!hasNext(numberFour)){ + try { + throw new NoNextByteCodeException(numberFour); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + return Util.byteToInt(next(numberFour)); + } + + public int nextInt(){ + + if(!hasNext(numberOne)){ + try { + throw new NoNextByteCodeException(numberOne); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + return Util.byteToInt(next(numberOne)); + } + + public String nextStr(int len){ + + if(!hasNext(len)){ + try { + throw new NoNextByteCodeException(len); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + char[] arr = new char[len]; + for (int i = 0; i < len; i++) { + arr[i] = (char)nextInt(); + } + return new String(arr); + } + + public String nextUxToHexString(int len) { + + if(!hasNext(len)){ + try { + throw new NoNextByteCodeException(len); + } catch (NoNextByteCodeException e) { + e.printStackTrace(); + } + } + return Util.byteToHexString(next(len)).toLowerCase(); + + } + + /** + * 回退 + */ + public void back(int backLen){ + + if( backLen<= this.cursor ){ + this.cursor -= backLen; + }else{ + this.cursor = 0; + } + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java index 59d12540fc..4ba2613f1a 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -4,15 +4,19 @@ import java.util.ArrayList; import java.util.List; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.util.Util; + public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - File clzFile = ClassFileLoaderUtil.getClzFile(clzPaths,className); + File clzFile = Util.getClzFile(clzPaths,className); - return ClassFileLoaderUtil.readClz(clzFile); + return Util.readClz(clzFile); } @@ -30,4 +34,10 @@ public String getClassPath(){ return buff.substring(0, buff.length()-1); } + public ClassFile loadClass(String className) throws NotAClassFileException { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } } diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..0d49151217 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,154 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.exception.AddAnotherParserException; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; +import com.coderising.jvm.util.Util; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) throws NotAClassFileException { + + ByteCodeIterator iterator = new ByteCodeIterator(codes); + if(!validator(iterator)){ + throw new NotAClassFileException(); + } + ClassFile clazzFile = new ClassFile(); + + clazzFile.setMinorVersion(iterator.nextU2ToInt()); + + clazzFile.setMajorVersion(iterator.nextU2ToInt()); + + clazzFile.setConstPool(parseConstantPool(iterator,clazzFile)); + + clazzFile.setAccessFlag(parseAccessFlag(iterator)); + + clazzFile.setClassIndex(parseClassInfex(iterator)); + + parseInterfaces(iterator); + + //解析属性 + int fieldCount = iterator.nextU2ToInt(); + for (int i = 0; i < fieldCount; i++) { + clazzFile.addField(Field.parse(clazzFile.getConstantPool(), iterator)); + } + //解析方法 + int methodCount = iterator.nextU2ToInt(); + for (int i = 0; i < methodCount; i++) { + clazzFile.addMethod(Method.parse(clazzFile.getConstantPool(), iterator));; + } + + return clazzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter){ + + return new AccessFlag(iter.nextU2ToInt()); + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter){ + + ClassIndex classIndex = new ClassIndex(); + classIndex.setThisClassIndex(iter.nextU2ToInt()); + classIndex.setSuperClassIndex(iter.nextU2ToInt()); + return classIndex; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter,ClassFile clazzFile){ + + ConstantPool pool = new ConstantPool(clazzFile); + pool.addConstantInfo(new NullConstantInfo()); + + try { + + int poolSize = iter.nextU2ToInt(); + for (int i = 1; i < poolSize; i++) { + int tag = iter.nextInt(); + switch (tag) { + case ConstantInfo.UTF8_INFO: + UTF8Info UTF8Info = new UTF8Info(pool); + int len = iter.nextU2ToInt(); + String value = iter.nextStr(len); + UTF8Info.setLength(len); + UTF8Info.setValue(value); + pool.addConstantInfo(UTF8Info); + break; + case ConstantInfo.FLOAT_INFO: + //TODO + break; + case ConstantInfo.CLASS_INFO: + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(iter.nextU2ToInt()); + pool.addConstantInfo(classInfo); + break; + case ConstantInfo.STRING_INFO: + StringInfo stringInfo = new StringInfo(pool); + stringInfo.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(stringInfo); + break; + case ConstantInfo.FIELD_INFO: + FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); + fieldRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + fieldRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(fieldRefInfo); + break; + case ConstantInfo.METHOD_INFO: + MethodRefInfo methodRefInfo = new MethodRefInfo(pool); + methodRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + methodRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(methodRefInfo); + break; + case ConstantInfo.NAME_AND_TYPE_INFO: + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + nameAndTypeInfo.setIndex1(iter.nextU2ToInt()); + nameAndTypeInfo.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameAndTypeInfo); + break; + default: + throw new AddAnotherParserException(); + } + } + } catch (AddAnotherParserException e) { + e.printStackTrace(); + } + return pool; + } + + private void parseInterfaces(ByteCodeIterator iter){ + + @SuppressWarnings("unused") + int interfaceCount = iter.nextU2ToInt(); + //System.out.println("接口数量为:"+interfaceCount); + // TODO + } + + /** + * 校验是否为class文件 + * @param iterator + * @return + */ + private boolean validator(ByteCodeIterator iterator){ + + if(iterator.hasNext(4)){ + byte[] magicByte = iterator.next(4); + String magicNumber = Util.byteToHexString(magicByte); + if("cafebabe".equals(magicNumber)){ + return true; + } + } + return false; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..245ccdc558 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/method/Method.java @@ -0,0 +1,77 @@ +package com.coderising.jvm.method; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private ConstantPool pool; + private List attributeInfos = new ArrayList<>(); + + + public Method(ConstantPool pool,int accessFlag, int nameIndex, int descriptorIndex) { + this.pool = pool; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public static Method parse(ConstantPool pool, ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + + Method method = new Method(pool,accessFlag,nameIndex,descriptorIndex); + method.setAttributeInfos(AttributeInfo.parseAttributes(pool,iter)); + + return method; + } + + public ByteCodeCommand[] getCmds() { + + for (AttributeInfo attributeInfo : attributeInfos) { + if(attributeInfo instanceof CodeAttr){ + return ((CodeAttr) attributeInfo).getCmds(); + } + } + return null; + } + + public int getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + + public ConstantPool getPool() { + return pool; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + + public List getAttributeInfos() { + return attributeInfos; + } + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..e0be352da4 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag:public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super ClassName:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()+"\n"); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "test.com.coderising.jvm.EmployeeV1"; + + ClassFile clzFile = null; + try { + clzFile = loader.loadClass(className); + } catch (NotAClassFileException e) { + e.printStackTrace(); + } + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..f2327a8029 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,112 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append(printConsName("string")).append("#"+info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append(printConsName("NameAndType")).append("#"+info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append(printConsName("MethodRef")).append("#"+info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append(printConsName("FieldRef")).append("#"+info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append(printConsName("Class")).append("#"+info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append(printConsName("UTF8")).append(info.getValue()); + System.out.println(buffer); + + } + }; + + int size = pool.getSize(); + for(int i=1; i<=size; i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + String space = genaralSpace(size,i); + System.out.print(space+"#"+i+"="); + constantInfo.accept(visitor); + } + } + + private String genaralSpace(int size,int i){ + + int s1 = String.valueOf(size).length();//数字的位数 + int s2 = String.valueOf(i).length();//数字的位数 + StringBuffer str = new StringBuffer(); + for (int j = 0; j < s1-s2; j++) { + str.append(" "); + } + return str.toString(); + } + + /** + * 输出常量名称后面的空格 + * @param consBeforStr + */ + private String printConsName(String consName){ + + String bashStr = "NameAndType"; + int bashLen = bashStr.length(); + int offset = bashLen-consName.length(); + for (int i = 0; i < offset; i++) { + consName+= " "; + } + return consName+" "; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java b/group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java similarity index 69% rename from group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java rename to group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java index 61faafb77d..d0456fead2 100644 --- a/group12/2258659044/zj-2017/src/com/coderising/jvm/loader/ClassFileLoaderUtil.java +++ b/group12/2258659044/zj-2017/src/com/coderising/jvm/util/Util.java @@ -1,4 +1,4 @@ -package com.coderising.jvm.loader; +package com.coderising.jvm.util; import java.io.ByteArrayOutputStream; import java.io.File; @@ -7,8 +7,27 @@ import java.io.InputStream; import java.util.List; -public class ClassFileLoaderUtil { - +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 root; @SuppressWarnings({ "rawtypes", "unchecked" }) public > BinaryTreeNode insert(T o){ @@ -44,12 +44,12 @@ public > BinaryTreeNode insert(T o){ * @param node * @return */ - public List traversalBefore(BinaryTreeNode node){ + public List traversalBefore(BinaryTreeNode node){ //所有数据集合 - List datas = new ArrayList(); + List datas = new ArrayList<>(); return traversal(node,datas); } - private List traversal(BinaryTreeNode node,List datas){ + private List traversal(BinaryTreeNode node,List datas){ if(node !=null){ datas.add(node.getData()); @@ -59,7 +59,7 @@ private List traversal(BinaryTreeNode node,List datas){ return datas; } - public BinaryTreeNode getRoot() { + public BinaryTreeNode getRoot() { return root; } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java index a8e6b66edd..5e8c90fa54 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTreeNode.java @@ -1,37 +1,37 @@ -package com.coding.basic; -public class BinaryTreeNode { - - private Object data; - //父节点 - private BinaryTreeNode parent; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode getParent() { - return parent; - } - public void setParent(BinaryTreeNode parent) { - this.parent = parent; - } -} +package com.coding.basic; +public class BinaryTreeNode { + + private E data; + //父节点 + private BinaryTreeNode parent; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public E getData() { + return data; + } + public void setData(E data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode getParent() { + return parent; + } + public void setParent(BinaryTreeNode parent) { + this.parent = parent; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java index c854120212..d72c308c07 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Iterator.java @@ -1,8 +1,8 @@ -package com.coding.basic; - -public interface Iterator { - - public boolean hasNext(); - public Object next(); - -} +package com.coding.basic; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/List.java b/group12/2258659044/zj-2017/src/com/coding/basic/List.java index a5a3688eb6..7fd5915bae 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/List.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/List.java @@ -1,10 +1,10 @@ -package com.coding.basic; - -public interface List { - - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); +package com.coding.basic; + +public interface List { + + public void add(E o); + public void add(int index, E o); + public E get(int index); + public E remove(int index); + public int size(); } \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java index aa8429ac59..169fc0dcb9 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/Queue.java @@ -2,16 +2,16 @@ import com.coding.basic.linklist.LinkedList; -public class Queue { +public class Queue { - private LinkedList element = new LinkedList(); + private LinkedList element = new LinkedList(); - public void enQueue(Object o){ + public void enQueue(E o){ element.add(o); } - public Object deQueue(){ + public E deQueue(){ return element.removeFirst(); } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java b/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java deleted file mode 100644 index 2b08e856c1..0000000000 --- a/group12/2258659044/zj-2017/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.basic; - -import com.coding.basic.array.ArrayList; - -public class Stack { - - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - - elementData.add(o); - } - - public Object pop(){ - - return elementData.remove(size()-1); - } - - public Object peek(){ - - return elementData.get(size()-1); - } - public boolean isEmpty(){ - - return size()==0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java index 4bbf60adf9..73f3b9649e 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayList.java @@ -5,7 +5,7 @@ import com.coding.basic.Iterator; import com.coding.basic.List; -public class ArrayList implements List { +public class ArrayList implements List { private int size = 0; /*扩容因子*/ @@ -15,12 +15,12 @@ public class ArrayList implements List { /*扩容引用*/ private Object[] newElementData; - public void add(Object o){ + public void add(E o){ grow(); elementData[size] = o; size ++; } - public void add(int index, Object o){ + public void add(int index, E o){ if(index<0||index>size){ throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); @@ -36,19 +36,21 @@ public void add(int index, Object o){ size ++; } - public Object get(int index){ + public E get(int index){ - if(index<0||index>size){ - throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); - } - return elementData[index]; + rangeCheck(index); + return elementData(index); } - public Object remove(int index){ + public E remove(int index){ - Object o = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, size-(index+1)); - size --; + rangeCheck(index); + E o = elementData(index); + int i = this.size - index - 1; + if (i > 0) { + System.arraycopy(this.elementData, index + 1, this.elementData, index, i); + } + this.elementData[(--this.size)] = null; return o; } @@ -74,6 +76,17 @@ private void grow(){ } } + private void rangeCheck(int index) { + + if (index >= this.size) { + throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size); + } + } + + @SuppressWarnings("unchecked") + E elementData(int index) { + return (E) elementData[index]; + } public Iterator iterator(){ diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java index de11fdbca5..0bd2cef66b 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/array/ArrayUtil.java @@ -112,7 +112,7 @@ public int[] merge2(int[] array1, int[] array2){ bitmap[array2[i]]=true; } - ArrayList ls = new ArrayList(); + ArrayList ls = new ArrayList<>(); for (int i = 0; i < bitmap.length; i++) { if(bitmap[i]==true){ ls.add(i); @@ -149,7 +149,7 @@ public int[] fibonacci(int max){ int[] array = {}; if(max <= 1)return array; //生成 斐波那契数列的ArrayList集合 - ArrayList ls = new ArrayList(); + ArrayList ls = new ArrayList<>(); ls.add(1);ls.add(1); int next;int i = 1; while(true){ @@ -171,7 +171,7 @@ public int[] fibonacci(int max){ */ public int[] getPrimes(int max){ - ArrayList primesList = new ArrayList(); + ArrayList primesList = new ArrayList<>(); boolean flag; for (int i = 2; i < max; i++) { flag = false; @@ -197,7 +197,7 @@ public int[] getPrimes(int max){ public int[] getPerfectNumbers(int max){ int temp; - ArrayList perfectList = new ArrayList(); + ArrayList perfectList = new ArrayList(); for (int i = 6; i <= max; i++) { temp = 0; for (int j = 1; j <= (i/2); j++) { @@ -234,7 +234,7 @@ public String join(int[] array, String seperator){ * @param ls * @return */ - public int[] objList2int(ArrayList ls){ + public int[] objList2int(ArrayList ls){ Object[] objArr = ls.toArray(); int[] array = new int[ls.size()]; diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java b/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java index 0132efaa00..5ee8881fa0 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/linklist/LinkedList.java @@ -4,57 +4,57 @@ import com.coding.basic.Iterator; import com.coding.basic.List; -import com.coding.basic.Stack; +import com.coding.basic.stack.Stack; -public class LinkedList implements List { +public class LinkedList implements List { - private Node head; + private Node head; private int size = 0; - public void add(Object o){ + public void add(E o){ - Node addNode = new Node(); + Node addNode = new Node<>(); addNode.data = o; if(size==0){ head = addNode; }else{ //获取最后一个节点 - Node lastNode = getPointNode(size-1); + Node lastNode = getPointNode(size-1); lastNode.next = addNode; } size++; } - public void add(int index , Object o){ + public void add(int index , E o){ - Node addNode = new Node(); + Node addNode = new Node<>(); addNode.data = o; if(index == 0){ //添加头结点 addFirst(o); }else if(index == size){//添加尾节点 addLast(o); }else{//在投节点与尾部添加节点 - Node prePointNode = getPointNode(index-1); - Node pointNode = prePointNode.next; + Node prePointNode = getPointNode(index-1); + Node pointNode = prePointNode.next; prePointNode.next = addNode; addNode.next = pointNode; size ++; } } - public Object get(int index){ + public E get(int index){ - Node node = getPointNode(index); + Node node = getPointNode(index); return node.data; } - public Object remove(int index){ + public E remove(int index){ - Node pointNode = getPointNode(index); - Node nextPointNode = pointNode.next; + Node pointNode = getPointNode(index); + Node nextPointNode = pointNode.next; if(index ==0){ head = nextPointNode; }else{ - Node prePointNode = getPointNode(index-1); + Node prePointNode = getPointNode(index-1); prePointNode.next = nextPointNode; } size --; @@ -65,10 +65,10 @@ public int size(){ return size; } - public void addFirst(Object o){ + public void addFirst(E o){ - Node secondNode = head; - head = new Node(); + Node secondNode = head; + head = new Node<>(); head.data = o; if(size>0){ head.next = secondNode; @@ -76,16 +76,16 @@ public void addFirst(Object o){ size ++; } - public void addLast(Object o){ + public void addLast(E o){ add(o); } - public Object removeFirst(){ + public E removeFirst(){ return remove(0); } - public Object removeLast(){ + public E removeLast(){ return remove(size-1); } @@ -118,21 +118,21 @@ public Object next() { * 获取指定的节点 * @return */ - private Node getPointNode(int index){ + private Node getPointNode(int index){ if(index<0||index>size){ throw new IndexOutOfBoundsException("Index: "+index+",Size:"+size+""); } - Node node = head; + Node node = head; for (int i = 0; i < index; i++) { node = node.next; } return node; } - private static class Node{ - Object data; - Node next; + private static class Node{ + E data; + Node next; } @@ -142,8 +142,8 @@ private static class Node{ */ public void reverse(){ - Stack stack = new Stack(); - Node node; + Stack stack = new Stack(); + Node node; //缓存原链表数据 for (node = head; node!=null;node = node.next) { stack.push(node.data); @@ -198,10 +198,10 @@ public void remove(int i, int length){ * 返回的结果应该是[101,301,401,601] * @param list */ - public int[] getElements(LinkedList list){ + public int[] getElements(LinkedList list){ int[] array = new int[list.size()]; for (int i = 0; i < array.length; i++) { - array[i] = (int) get((int)list.get(i)); + array[i] = (int) get(list.get(i)); } return array; } @@ -212,12 +212,11 @@ public int[] getElements(LinkedList list){ * @param list */ - public void subtract(LinkedList list){ + public void subtract(LinkedList list){ for (int i = 0; i < size; i++) { for (int j = 0; j < list.size(); j++) { if(get(i).equals(list.get(j))){ remove(i); - i--; } } } @@ -259,13 +258,13 @@ public void removeRange(int min, int max){ * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 * @param list */ - public LinkedList intersection( LinkedList list){ + public LinkedList intersection( LinkedList list){ - LinkedList newList = new LinkedList(); + LinkedList newList = new LinkedList<>(); for (int i = 0; i < size; i++) { for (int j = 0; j < list.size(); j++) { if(get(i).equals(list.get(j))){ - newList.add(get(i)); + newList.add((E)get(i)); } } } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..f1ede1f8ab --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,46 @@ +package com.coding.basic.stack; + +import com.coding.basic.array.ArrayList; + +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(E o){ + + elementData.add(o); + } + + public E pop(){ + + return elementData.remove(size()-1); + } + + public E peek(){ + + return elementData.get(size()-1); + } + public boolean isEmpty(){ + + return size()==0; + } + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + + StringBuffer sBuffer = new StringBuffer(); + sBuffer.append("["); + + for (int i = size()-1; i >= 0; i--) { + if(i == 0){ + sBuffer.append(elementData.get(i)+"]"); + }else{ + sBuffer.append(elementData.get(i)+","); + } + } + return sBuffer.toString(); + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..871b2fce69 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,158 @@ +package com.coding.basic.stack; + +import java.util.HashMap; +import java.util.Map; + +public class StackUtil { + + private static Map markMap; + + static { + //初始化括号对 + markMap = new HashMap(); + markMap.put('(', ')'); + markMap.put('[', ']'); + markMap.put('{', '}'); + } + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param + */ + public static void reverse(Stack s) { + + if(s == null||s.isEmpty()){ + return; + } + E last = getBottom(s,s.pop()); + reverse(s); + s.push(last); + } + + /** + * 获取栈底部数据 + * @param + * @param s + * @return + */ + private static E getBottom(Stack s,E val){ + + if(s.isEmpty()){ + return val; + } + E lst = getBottom(s,s.pop()); + s.push(val); + return lst; + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param + * + * @param o + */ + public static void remove(Stack s,E o) { + + if(s == null||s.isEmpty()){ + return; + } + E res = s.pop(); + if(res.equals(o)){ + return; + } + remove(s,o); + s.push(res); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param + * @param len + * @return + */ + + public static Object[] getTop(Stack s,int len) { + + if(s == null||s.isEmpty()||len <= 0){ + return null; + } + + //当len的长度大于栈s的长度时返回栈s全部数据 + int size = s.size()>=len? len:s.size(); + + Object[] objs = new Object[size]; + + putValueToArray(s,objs,0); + + return objs; + } + + /** + * 将获取的元素放到数组中 + * @param + * @param s + * @param objs + * @param count + */ + public static void putValueToArray(Stack s,Object[] objs,int count){ + + E res = s.pop(); + count++; + objs[count-1] = res; + if(count== objs.length){ + s.push(res); + return; + } + putValueToArray(s,objs,count); + s.push(res); + } + + /** + * 字符串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){ + + if(!validation(s)){ + return false; + } + Stack markStack = new Stack<>(); + char[] charArr = s.toCharArray(); + for (int i = 0; i < charArr.length; i++) { + if(markMap.containsKey(charArr[i])){ + markStack.push(charArr[i]); + } + if(markMap.containsValue(charArr[i])){ + if(markMap.get(markStack.pop()).equals(charArr[i])){ + continue; + }else{ + return false; + } + } + } + return markStack.size()==0; + } + + private static boolean validation(String s){ + + if(s!=null&&s.length()>0){ + if(s.contains("(")&&s.contains(")")){ + return true; + } + if(s.contains("[")&&s.contains("]")){ + return true; + } + if(s.contains("{")&&s.contains("}")){ + return true; + } + } + return false; + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..a02d03c861 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,120 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.StackUtil; +import com.coding.basic.stack.expr.util.ExprIterator; +import com.coding.basic.stack.expr.util.FixExprUtil; +import com.coding.basic.stack.expr.util.Operator; + +public class InfixExpr { + + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + //数据栈 + Stack dataStack = new Stack<>(); + //操作栈 + Stack operStack = new Stack<>(); + + parseExpr(dataStack,operStack); + + return summary(dataStack,operStack); + } + + + /** + * 拆分数据与运算符于两个栈中 + * + * @return + */ + private void parseExpr(Stack dataStack,Stack operStack) { + + ExprIterator it = new ExprIterator(expr); + while(it.hasNext()){ + String element = it.next(); + if (Operator.contains(element)) { + putOpersToStack(dataStack,operStack, element); + } else { + dataStack.push(Float.parseFloat(element)); + } + } + validationLastOpers(dataStack,operStack); + } + + /** + * 检查最后一个操作符优先级与之前是否保持统一, + * 若不统一则进行运算,使栈中运算符保持同一个优先级 + * @param stacks + */ + private void validationLastOpers(Stack dataStack,Stack operStack) { + + Object[] opers = StackUtil.getTop(operStack, 2); + Operator thisOper = (Operator) opers[0]; + Operator preOper = (Operator) opers[1]; + if(thisOper.getLevel()!=preOper.getLevel()){ + calculateToStack(dataStack,operStack,false); + } + } + + /** + * 运算符压栈 + * @param stacks + * @param c + */ + private void putOpersToStack(Stack dataStack,Stack operStack, String c) { + + Operator thisOper = Operator.getOperator(c); + if (!operStack.isEmpty()) { + Operator preOper = operStack.peek(); + if (preOper.getLevel() > thisOper.getLevel()) { + calculateToStack(dataStack,operStack,false); + } + } + operStack.push(thisOper); + } + + /** + * 运算距栈顶最近两个元素的值并压回原栈 + * @param stacks + * stacks[0]运算符,stacks[1]数据 + * @param isReverse + * 当isReversed为true时会交换两个元素的位置 + */ + private void calculateToStack(Stack dataStack,Stack operStack,boolean isReverse){ + + float a,b; + if(isReverse){ + a = dataStack.pop(); + b = dataStack.pop();; + }else{ + b = dataStack.pop();; + a = dataStack.pop();; + } + + Operator oper = operStack.pop(); + float res = FixExprUtil.calculate(a,oper,b); + dataStack.push(res); + } + + /** + * 汇总结果 + * @param stacks + * @return + */ + private float summary(Stack dataStack,Stack operStack) { + + StackUtil.reverse(dataStack); + StackUtil.reverse(operStack); + + while (!operStack.isEmpty()) { + calculateToStack(dataStack,operStack,true); + } + return dataStack.pop(); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..cdd7605635 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,46 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.expr.util.ExprIterator; +import com.coding.basic.stack.expr.util.FixExprUtil; +import com.coding.basic.stack.expr.util.Operator; + +public class PostfixExpr { + + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + //数据栈 + Stack dataStack = new Stack<>(); + + parseExpr(dataStack,null); + + return dataStack.peek(); + } + + /** + * 解析表达式 + * @return + */ + private void parseExpr(Stack dataStack,Stack operStack) { + + ExprIterator it = new ExprIterator(expr); + float a,b,res; + while(it.hasNext()){ + String element = it.next(); + if (Operator.contains(element)) { + b = dataStack.pop(); + a = dataStack.pop(); + res = FixExprUtil.calculate(a, Operator.getOperator(element), b); + dataStack.push(res); + } else { + dataStack.push(Float.parseFloat(element)); + } + } + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..4a0b025cfe --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,47 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.expr.util.ExprIterator; +import com.coding.basic.stack.expr.util.FixExprUtil; +import com.coding.basic.stack.expr.util.Operator; + +public class PrefixExpr { + + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + //数据栈 + Stack dataStack = new Stack<>(); + + parseExpr(dataStack,null); + + return dataStack.peek(); + } + + /** + * 解析表达式 + * @return + */ + private void parseExpr(Stack dataStack,Stack operStack) { + + ExprIterator it = new ExprIterator(FixExprUtil.reverse(expr)); + float a,b,res; + while(it.hasNext()){ + String element = it.next(); + if (Operator.contains(element)) { + a = dataStack.pop(); + b = dataStack.pop(); + res = FixExprUtil.calculate(a, Operator.getOperator(element), b); + dataStack.push(res); + } else { + dataStack.push(Float.parseFloat(element)); + } + } + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java new file mode 100644 index 0000000000..59efc0907d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/ExprIterator.java @@ -0,0 +1,31 @@ +package com.coding.basic.stack.expr.util; + +import com.coding.basic.List; +import com.coding.basic.array.ArrayList; + +/** + * 表达式迭代器 + * @author zj + * @since 2017-4-17 + */ +public class ExprIterator{ + + private List data = new ArrayList(); + private int cursor; + + public ExprIterator(String expr){ + this.data = FixExprUtil.FixExprToArray(expr); + } + + public boolean hasNext() { + return cursor != (data.size()); + } + + public String next() { + + int i = cursor; + cursor = (i+1); + return data.get(i); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java new file mode 100644 index 0000000000..4f431f219d --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/FixExprUtil.java @@ -0,0 +1,174 @@ +package com.coding.basic.stack.expr.util; + +import java.util.regex.Pattern; + +import com.coding.basic.List; +import com.coding.basic.array.ArrayList; +import com.coding.basic.stack.Stack; + +public class FixExprUtil { + + private static String LEFTBRACKRT= "("; + private static String RIGHTBRACKET= ")"; + + /** + * 运算 + * @param a 数字 + * @param oper 运算符 + * @param b 数字 + * @return + */ + public static float calculate(float a,Operator oper,float b) { + + String operFlag = oper.getFlag(); + + float res = 0f; + if (Operator.ADD.getFlag().equals(operFlag)) { + res = a + b; + } else if (Operator.SUB.getFlag().equals(operFlag)) { + res = a - b; + } else if (Operator.MULTY.getFlag().equals(operFlag)) { + res = a * b; + } else if (Operator.DIVIDE.getFlag().equals(operFlag)) { + res = a / b; + } + return res; + } + + /** + * 将字符串顺序逆置 + * @param str + * @return + */ + public static String reverse(String expr){ + + return new StringBuffer(expr).reverse().toString(); + } + + /** + * 判断字符串是否为数字 + * 注意:不包括小数 + * @param str + * @return + */ + public static boolean isNumeric(String str){ + Pattern pattern = Pattern.compile("[0-9]*"); + return pattern.matcher(str).matches(); + } + + /** + * 将中缀表达式装换为后缀表达式 + * @param expr + * @return + */ + public static String InfixCovertToPostfix(String expr){ + + ExprIterator it = new ExprIterator(expr); + Stack stack = new Stack<>(); + List postFixList = new ArrayList(); + + while(it.hasNext()){ + + String element = it.next(); + //数字直接输出 + if(FixExprUtil.isNumeric(element)){ + postFixList.add(element); + }else if(RIGHTBRACKET.equals(element)){//去除左右括号 + do { + postFixList.add(stack.pop()); + } while (!LEFTBRACKRT.equals(stack.pop())); + }else{ + int preLevel = 0; + int thisLevel = Operator.getLevelByFlag(element); + //当栈顶运算符优先级大于本次运算优先级时(左括号除外)出栈至栈顶优先级小于本次运算优先级 + while(preLevel>thisLevel&&preLevel!=3&&!stack.isEmpty()){ + String oprFlag = stack.pop(); + preLevel = Operator.getLevelByFlag(oprFlag); + postFixList.add(oprFlag); + } + stack.push(element); + } + + } + //将栈中剩余元素出栈 + while(!stack.isEmpty()){ + postFixList.add(stack.pop()); + } + //格式化输出 + StringBuffer postFix = new StringBuffer(); + for (int i = 0; i < postFixList.size(); i++) { + postFix.append(postFixList.get(i)+" "); + } + return postFix.toString(); + } + + /** + * 中缀表达式转前缀表达式 + * @param expr + * @return + */ + public static String InfixCovertToPrefix(String expr){ + + String post = InfixCovertToPostfix(expr); + return reverse(post); + } + + /** + * 后缀表达式转前缀表达式 + * @param expr + * @return + */ + public static String postfixCovertToPrefix(String expr){ + return reverse(expr); + } + + /** + * 前缀表达式转后缀表达式 + * @param expr + * @return + */ + public static String prefixCovertToPostfix(String expr){ + return reverse(expr); + } + + /** + * 将表达式字符串转换为List + * @param expr + * @return + */ + public static List FixExprToArray(String expr){ + + List ls = new ArrayList<>(); + + String[] strArr = expr.split(" "); + for (String str : strArr) { + parse(str,ls); + } + + return ls; + } + + public static void parse(String str,List ls){ + + char[] chr = str.toCharArray(); + StringBuilder token = new StringBuilder(); + + for (char c : chr) { + String element = String.valueOf(c); + if(Operator.contains(element)){ + if(!"".equals(token.toString())){ + ls.add(token.toString()); + token = new StringBuilder(); + } + ls.add(c+""); + }else{ + token.append(c); + } + } + if(!"".equals(token.toString())){ + ls.add(token.toString()); + } + + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java new file mode 100644 index 0000000000..3e76c3b805 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/expr/util/Operator.java @@ -0,0 +1,70 @@ +package com.coding.basic.stack.expr.util; + +public enum Operator { + + ADD("+",1),SUB("-",1),MULTY("*",2),DIVIDE("/",2) + ,LEFTBRACKRT("(",3),RIGHTBRACKET(")",3); + + private String flag; + private int level; + + private Operator(String flag,int level){ + this.flag = flag; + this.level = level; + } + + public static int getLevelByFlag(String flag){ + + Operator[] opers = Operator.values(); + for (Operator operator : opers) { + if(operator.flag.equals(flag)){ + return operator.level; + } + } + return -1; + } + + public static Operator getOperator(String flag){ + + if(ADD.flag.equals(flag)){ + return ADD; + }else if(SUB.flag.equals(flag)){ + return SUB; + }else if(MULTY.flag.equals(flag)){ + return MULTY; + }else if(DIVIDE.flag.equals(flag)){ + return DIVIDE; + }else if(LEFTBRACKRT.flag.equals(flag)){ + return LEFTBRACKRT; + }else if(RIGHTBRACKET.flag.equals(flag)){ + return RIGHTBRACKET; + } + return null; + } + + public static boolean contains(String flag){ + + if(ADD.flag.equals(flag)){ + return true; + }else if(SUB.flag.equals(flag)){ + return true; + }else if(MULTY.flag.equals(flag)){ + return true; + }else if(DIVIDE.flag.equals(flag)){ + return true; + }else if(LEFTBRACKRT.flag.equals(flag)){ + return true; + }else if(RIGHTBRACKET.flag.equals(flag)){ + return true; + } + return false; + } + public String getFlag() { + return flag; + } + + public int getLevel() { + return level; + } + +} diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java new file mode 100644 index 0000000000..2a18bee6d7 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/ClassFileloaderTest.java @@ -0,0 +1,349 @@ +package test.com.coderising.jvm; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.exception.NotAClassFileException; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class ClassFileloaderTest { + + private static final String FULL_QUALIFIED_CLASS_NAME = "test/com/coderising/jvm/EmployeeV1"; + + static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + //static String path1 = "E:\\githubRepository\\coding2017\\group12\\2258659044\\zj-2017\\bin"; + static String path2 = "C:\temp"; + + + static ClassFile clzFile = null; + static { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "test.com.coderising.jvm.EmployeeV1"; + + try { + clzFile = loader.loadClass(className); + } catch (NotAClassFileException e) { + e.printStackTrace(); + } + clzFile.print(); + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "test.com.coderising.jvm.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "test.com.coderising.jvm.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + private String byteToHexString(byte[] codes ){ + 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()); + } + + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + //String code = m.getCodeAttr().getCode(); + CodeAttr codeAttr = (CodeAttr)m.getAttributeInfos().get(0); + String code = codeAttr.getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java new file mode 100644 index 0000000000..9692355ed6 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coderising/jvm/EmployeeV1.java @@ -0,0 +1,28 @@ +package test.com.coderising.jvm; + +@SuppressWarnings("unused") +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(); + + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java index 1357cf17cf..98b79b3b6b 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java @@ -1,58 +1,59 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.BinaryTree; -import com.coding.basic.BinaryTreeNode; -import com.coding.basic.List; - -public class BinaryTreeTest { - - BinaryTree tree ; - - @Before - public void setup() { - - tree = new BinaryTree(); - Assert.assertEquals(tree.getRoot(), null); - tree.insert(5); - tree.insert(2); - tree.insert(7); - tree.insert(1); - tree.insert(6); - } - @Test - public void insert(){ - - BinaryTreeNode node = tree.insert(4); - Assert.assertEquals(node.getParent().getData(), 2); - Assert.assertEquals(node.getParent().getLeft().getData(), 1); - - BinaryTreeNode node2 = tree.insert(8); - Assert.assertEquals(node2.getParent().getData(), 7); - Assert.assertEquals(node2.getParent().getLeft().getData(), 6); - } - - @Test - public void traversal(){ - - insert(); - //以根节点为起点先序遍历 - List treeList = tree.traversalBefore(tree.getRoot()); - //expected value - int[] exValue = {5,2,1,4,7,6,8}; - for (int i = 0; i < exValue.length; i++) { - Assert.assertEquals(treeList.get(i),exValue[i]); - } - - //以数据2位起点先序遍历 - List treeList2 = tree.traversalBefore(tree.getRoot().getLeft()); - //expected value - int[] exValue2 = {2,1,4}; - for (int i = 0; i < exValue2.length; i++) { - Assert.assertEquals(treeList2.get(i),exValue2[i]); - } - } -} +package test.com.coding.basic; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.BinaryTree; +import com.coding.basic.BinaryTreeNode; +import com.coding.basic.List; + +public class BinaryTreeTest { + + BinaryTree tree ; + + @Before + public void setup() { + + tree = new BinaryTree(); + Assert.assertEquals(tree.getRoot(), null); + tree.insert(5); + tree.insert(2); + tree.insert(7); + tree.insert(1); + tree.insert(6); + } + @SuppressWarnings("unchecked") + @Test + public void insert(){ + + BinaryTreeNode node = tree.insert(4); + Assert.assertEquals((int)node.getParent().getData(), 2); + Assert.assertEquals((int)node.getParent().getLeft().getData(), 1); + + BinaryTreeNode node2 = tree.insert(8); + Assert.assertEquals((int)node2.getParent().getData(), 7); + Assert.assertEquals((int)node2.getParent().getLeft().getData(), 6); + } + + @Test + public void traversal(){ + + insert(); + //以根节点为起点先序遍历 + List treeList = tree.traversalBefore(tree.getRoot()); + //expected value + int[] exValue = {5,2,1,4,7,6,8}; + for (int i = 0; i < exValue.length; i++) { + Assert.assertEquals((int)treeList.get(i),exValue[i]); + } + + //以数据2位起点先序遍历 + List treeList2 = tree.traversalBefore(tree.getRoot().getLeft()); + //expected value + int[] exValue2 = {2,1,4}; + for (int i = 0; i < exValue2.length; i++) { + Assert.assertEquals((int)treeList2.get(i),exValue2[i]); + } + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java index 75af57b371..b12d23cdbd 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/QueueTest.java @@ -1,64 +1,64 @@ -package test.com.coding.basic; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Queue; - -public class QueueTest { - - Queue qe ; - - @Before - public void setup() { - qe = new Queue(); - for (int i = 0; i < 10; i++) { - qe.enQueue(i); - } - } - - @Test - public void enQueue(){ - - Assert.assertEquals(qe.size(), 10); - qe.enQueue("abcd"); - Assert.assertEquals(qe.size(), 11); - } - - @Test//(expected = IndexOutOfBoundsException.class) - public void deQueue(){ - - Assert.assertEquals(qe.size(), 10); - for (int i = 0; i < 10; i++) { - Assert.assertEquals(qe.deQueue(), i); - } - Assert.assertEquals(qe.size(), 0); - //打开下列语句与期望异常测试 - //qe.deQueue(); - } - - public void isEmpty(){ - - Assert.assertEquals(qe.isEmpty(),false); - for (int i = 0; i < 10; i++) { - qe.deQueue(); - } - Assert.assertEquals(qe.isEmpty(),true); - Queue qe1 = new Queue(); - Assert.assertEquals(qe1.isEmpty(), true); - } - - public void size(){ - - Assert.assertEquals(qe.size(),10); - qe.enQueue("lk"); - qe.enQueue('h'); - Assert.assertEquals(qe.size(),12); - for (int i = 0; i < 12; i++) { - qe.deQueue(); - } - Assert.assertEquals(qe.size(),0); - Queue qe1 = new Queue(); - Assert.assertEquals(qe1.size(), 0); - } -} +package test.com.coding.basic; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.Queue; + +public class QueueTest { + + Queue qe ; + + @Before + public void setup() { + qe = new Queue<>(); + for (int i = 0; i < 10; i++) { + qe.enQueue(i); + } + } + + @Test + public void enQueue(){ + + Assert.assertEquals(qe.size(), 10); + qe.enQueue("abcd"); + Assert.assertEquals(qe.size(), 11); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void deQueue(){ + + Assert.assertEquals(qe.size(), 10); + for (int i = 0; i < 10; i++) { + Assert.assertEquals(qe.deQueue(), i); + } + Assert.assertEquals(qe.size(), 0); + //打开下列语句与期望异常测试 + //qe.deQueue(); + } + + public void isEmpty(){ + + Assert.assertEquals(qe.isEmpty(),false); + for (int i = 0; i < 10; i++) { + qe.deQueue(); + } + Assert.assertEquals(qe.isEmpty(),true); + Queue qe1 = new Queue<>(); + Assert.assertEquals(qe1.isEmpty(), true); + } + + public void size(){ + + Assert.assertEquals(qe.size(),10); + qe.enQueue("lk"); + qe.enQueue('h'); + Assert.assertEquals(qe.size(),12); + for (int i = 0; i < 12; i++) { + qe.deQueue(); + } + Assert.assertEquals(qe.size(),0); + Queue qe1 = new Queue<>(); + Assert.assertEquals(qe1.size(), 0); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java index 9c4d91e8b3..ee20d2e038 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayListTest.java @@ -9,10 +9,10 @@ public class ArrayListTest { - ArrayList ls ; + ArrayList ls ; @Before public void setup() { - ls = new ArrayList(); + ls = new ArrayList<>(); } /** diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java index e8303b8aba..c7dce9c1aa 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/array/ArrayUtilTest.java @@ -94,7 +94,7 @@ public void testJoin() { @Test public void testObjList2int() { - ArrayList ls = new ArrayList(); + ArrayList ls = new ArrayList<>(); for (int i = 0; i < 10; i++) { ls.add(i); } diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java index 9a6e86000e..26d95dbc98 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/linklist/LinkedListTest.java @@ -9,10 +9,10 @@ public class LinkedListTest { - LinkedList ls ; + LinkedList ls ; @Before public void setup() { - ls = new LinkedList(); + ls = new LinkedList<>(); } /** @@ -169,7 +169,7 @@ public void testGetElements(){ ls.add(201);ls.add(301); ls.add(401);ls.add(501); ls.add(601);ls.add(701); - LinkedList list = new LinkedList(); + LinkedList list = new LinkedList<>(); list.add(1);list.add(3); list.add(4);list.add(6); int[] exceptArr = {101,301,401,601}; @@ -189,7 +189,7 @@ public void testSubtract(){ ls.add(8); ls.add(10); - LinkedList list = new LinkedList(); + LinkedList list = new LinkedList<>(); list.add(2); list.add(5); @@ -236,19 +236,19 @@ public void testIntersection(){ ls.add(3); ls.add(5); - LinkedList list = new LinkedList(); + LinkedList list = new LinkedList<>(); list.add(-1); list.add(0); list.add(5); list.add(9); - LinkedList newList = ls.intersection(list); + LinkedList newList = ls.intersection(list); int[] exceptArr = {-1,0,5}; exceptResult(newList,exceptArr); } - private void exceptResult(LinkedList ls,int[] exceptArr){ + private void exceptResult(LinkedList ls,int[] exceptArr){ Assert.assertEquals(ls.size(), exceptArr.length); for (int i = 0; i < exceptArr.length; i++) { diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java similarity index 82% rename from group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java rename to group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java index 5d9fcd0f16..d43b6f1914 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/StackTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackTest.java @@ -1,76 +1,76 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coding.basic.Stack; - -public class StackTest { - - Stack st ; - - @Before - public void setup() { - st = new Stack(); - for (int i = 0; i < 10; i++) { - st.push(i); - } - } - - @Test - public void push(){ - - Assert.assertEquals(st.size(), 10); - st.push(10); - st.push('a'); - Assert.assertEquals(st.size(), 12); - } - - @Test//(expected = IndexOutOfBoundsException.class) - public void pop(){ - - Assert.assertEquals(st.size(), 10); - for (int i = 9; i >= 0; i--) { - Assert.assertEquals(st.pop(), i); - } - //打开下列语句抛出期望异常 - //st.pop(); - } - - @Test - public void peek(){ - - Assert.assertEquals(st.size(), 10); - Assert.assertEquals(st.peek(), 9); - Assert.assertEquals(st.size(), 10); - } - - @Test - public void isEmpty(){ - - Assert.assertEquals(st.isEmpty(), false); - for (int i = 0; i < 10; i++) { - st.pop(); - } - Assert.assertEquals(st.isEmpty(), true); - Stack st1 = new Stack(); - Assert.assertEquals(st1.isEmpty(), true); - } - - public void size(){ - - Assert.assertEquals(st.size(),10); - st.push("lk"); - st.push('h'); - Assert.assertEquals(st.size(),12); - for (int i = 0; i < 12; i++) { - st.pop(); - } - Assert.assertEquals(st.size(),0); - st.peek(); - Assert.assertEquals(st.size(),0); - Stack st1 = new Stack(); - Assert.assertEquals(st1.size(), 0); - } -} +package test.com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.Stack; + +public class StackTest { + + Stack st ; + + @Before + public void setup() { + st = new Stack<>(); + for (int i = 0; i < 10; i++) { + st.push(i); + } + } + + @Test + public void push(){ + + Assert.assertEquals(st.size(), 10); + st.push(10); + st.push('a'); + Assert.assertEquals(st.size(), 12); + } + + @Test//(expected = IndexOutOfBoundsException.class) + public void pop(){ + + Assert.assertEquals(st.size(), 10); + for (int i = 9; i >= 0; i--) { + Assert.assertEquals(st.pop(), i); + } + //打开下列语句抛出期望异常 + //st.pop(); + } + + @Test + public void peek(){ + + Assert.assertEquals(st.size(), 10); + Assert.assertEquals(st.peek(), 9); + Assert.assertEquals(st.size(), 10); + } + + @Test + public void isEmpty(){ + + Assert.assertEquals(st.isEmpty(), false); + for (int i = 0; i < 10; i++) { + st.pop(); + } + Assert.assertEquals(st.isEmpty(), true); + Stack st1 = new Stack<>(); + Assert.assertEquals(st1.isEmpty(), true); + } + + public void size(){ + + Assert.assertEquals(st.size(),10); + st.push("lk"); + st.push('h'); + Assert.assertEquals(st.size(),12); + for (int i = 0; i < 12; i++) { + st.pop(); + } + Assert.assertEquals(st.size(),0); + st.peek(); + Assert.assertEquals(st.size(),0); + Stack st1 = new Stack<>(); + Assert.assertEquals(st1.size(), 0); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..d09f893de2 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,95 @@ +package test.com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.StackUtil; + +public class StackUtilTest { + + Stack s ; + + @Before + public void setup() { + //初始化栈元素:5,4,3,2,1 + s = new Stack<>(); + for (int i = 1; i <= 5; i++) { + s.push(i); + } + } + + @Test + public void testReverse() { + + StackUtil.reverse(s); + Assert.assertEquals(s.size(), 5); + Assert.assertEquals("[1,2,3,4,5]", s.toString()); + } + + @Test + public void testRemove() { + + StackUtil.remove(s, 5); + Assert.assertEquals("[4,3,2,1]", s.toString()); + + StackUtil.remove(s, 1); + Assert.assertEquals("[4,3,2]", s.toString()); + + StackUtil.remove(s, 4); + Assert.assertEquals("[3,2]", s.toString()); + } + + @Test + public void testGetTop() { + + Object[] obj = StackUtil.getTop(s, 6); + Assert.assertEquals(5, obj.length); + Assert.assertEquals(s.toString(),arrayToString(obj)); + + Object[] obj1 = StackUtil.getTop(s, 2); + Assert.assertEquals(2, obj1.length); + Assert.assertEquals("[5,4]",arrayToString(obj1)); + + } + + @Test + public void testIsValidPairs() { + + String s0 = "([e{d}f])"; + Assert.assertEquals(true,StackUtil.isValidPairs(s0)); + + String s1 = "(]e{d}f[)"; + Assert.assertEquals(false,StackUtil.isValidPairs(s1)); + + String s2 = "([b{x]y})"; + Assert.assertEquals(false,StackUtil.isValidPairs(s2)); + + String s3 = "()((()()))()"; + Assert.assertEquals(true,StackUtil.isValidPairs(s3)); + + String s4 = "(fs{fs[fs("; + Assert.assertEquals(false,StackUtil.isValidPairs(s4)); + + String s5 = "gshsg54fs"; + Assert.assertEquals(false,StackUtil.isValidPairs(s5)); + + + } + + private static String arrayToString(Object[] objs){ + + StringBuffer sBuffer = new StringBuffer(); + sBuffer.append("["); + + for (int i = 0; i < objs.length; i++) { + if(i == objs.length-1){ + sBuffer.append(objs[i]+"]"); + }else{ + sBuffer.append(objs[i]+","); + } + } + return sBuffer.toString(); + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..d22f51a98b --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package test.com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.expr.InfixExpr; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..97ec425a7b --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,38 @@ +package test.com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.expr.PostfixExpr; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..e866223a4e --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,46 @@ +package test.com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.expr.PrefixExpr; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group12/247565311/structure/week2/ArrayUtilTest.java b/group12/247565311/structure/week2/ArrayUtilTest.java index c1b414d725..3d249b7225 100644 --- a/group12/247565311/structure/week2/ArrayUtilTest.java +++ b/group12/247565311/structure/week2/ArrayUtilTest.java @@ -8,7 +8,6 @@ public class ArrayUtilTest { ArrayUtil u = null; @Before public void setUp() throws Exception { - System.out.println("ʼһµIJ"); u = new ArrayUtil(); } diff --git a/group12/247565311/structure/week6/StackUtil.java b/group12/247565311/structure/week6/StackUtil.java index 9895f02f30..4529372e4c 100644 --- a/group12/247565311/structure/week6/StackUtil.java +++ b/group12/247565311/structure/week6/StackUtil.java @@ -2,20 +2,10 @@ import java.util.Stack; public class StackUtil { - public static void bad_reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack(); - while(!s.isEmpty()){ - tmpStack.push(s.pop()); - } - s = tmpStack; - } - + /** - * 閸嬪洩顔曢弽鍫滆厬閻ㄥ嫬鍘撶槐鐘虫ЦInteger, 娴犲孩鐖ゆい璺哄煂閺嶅牆绨抽弰锟� 5,4,3,2,1 鐠嬪啰鏁ょ拠銉︽煙濞夋洖鎮楅敍锟介崗鍐濞嗏�绨崣妯硅礋: 1,2,3,4,5 - * 濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 */ public static void reverse(Stack s){ if(s == null || s.isEmpty()) return; @@ -27,22 +17,26 @@ public static void reverse(Stack s){ } while(!s1.isEmpty()) s.push(s1.pop()); + for(int i=0;ii) + int index = 1; + while(index+i0) + while(!s1.isEmpty()) s.push(s1.pop()); } } - // 閫氳繃閫掑綊鍙互涓嶄娇鐢ㄥ爢鏍堝畬鎴愯繖涓�姛鑳� + // 原地翻转栈也可以使用递归的方式,就是不好理解 public static void reverse2(Stack s) { if(s == null || s.isEmpty()){ return; } Integer top = s.pop(); - reverse(s); + reverse2(s); addToBottom(s,top); } public static void addToBottom(Stack s, Integer value){ @@ -55,7 +49,7 @@ public static void addToBottom(Stack s, Integer value){ } } /** - * 閸掔娀娅庨弽鍫滆厬閻ㄥ嫭鐓囨稉顏勫帗缁憋拷濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И + * 移出栈中的某个元素,只能使用push,pop,peek,isEmpty这几种操作 * * @param o */ @@ -76,7 +70,7 @@ public static void remove(Stack s,Object o) { } /** - * 娴犲孩鐖ゆい璺哄絿瀵版en娑擃亜鍘撶槐锟�閸樼喐娼甸惃鍕垽娑擃厼鍘撶槐鐘辩箽閹镐椒绗夐崣锟� * 濞夈劍鍓伴敍姘涧閼虫垝濞囬悽鈯縯ack閻ㄥ嫬鐔�張顒佹惙娴f粣绱濋崡纭僽sh,pop,peek,isEmpty閿涳拷閸欘垯浜掓担璺ㄦ暏閸欙箑顦绘稉锟介嚋閺嶅牊娼垫潏鍛И + * 获取栈顶的len个元素,只能使用push,pop,peek,isEmpty这几种操作来完成 * @param len * @return */ @@ -98,10 +92,10 @@ public static Object[] getTop(Stack s,int len) { return result; } /** - * 鐎涙顑佹稉鐬�閸欘垵鍏橀崠鍛儓鏉╂瑤绨虹�妤冾儊閿涳拷 ( ) [ ] { }, a,b,c... x,yz - * 娴h法鏁ら崼鍡樼垽濡拷鐓$�妤冾儊娑撶灚娑擃厾娈戦幏顒�娇閺勵垯绗夐弰顖涘灇鐎电懓鍤悳鎵畱閵嗭拷 - * 娓氬顩 = "([e{d}f])" , 閸掓瑨顕氱�妤冾儊娑撹弓鑵戦惃鍕閸欓攱妲搁幋鎰嚠閸戣櫣骞囬敍锟界拠銉︽煙濞夋洝绻戦崶鐎焤ue - * 婵″倹鐏�s = "([b{x]y})", 閸掓瑨顕氱�妤冾儊娑撹弓鑵戦惃鍕閸欒渹绗夐弰顖涘灇鐎电懓鍤悳鎵畱閿涳拷鐠囥儲鏌熷▔鏇$箲閸ョ�alse; + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz + * 使用堆栈检查字符串s中的括号是不是成对出现的。 + * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true + * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; * @param s * @return */ diff --git a/group12/247565311/structure/week6/StackUtilTest.java b/group12/247565311/structure/week6/StackUtilTest.java index f1a8aec8ac..74c10b3ffd 100644 --- a/group12/247565311/structure/week6/StackUtilTest.java +++ b/group12/247565311/structure/week6/StackUtilTest.java @@ -1,13 +1,12 @@ package structure.week6; -import static org.junit.Assert.fail; - import java.util.Stack; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; + public class StackUtilTest { @Before @@ -24,11 +23,8 @@ public void testAddToBottom() { s.push(1); s.push(2); s.push(3); - StackUtil.addToBottom(s, 0); - Assert.assertEquals("[0, 1, 2, 3]", s.toString()); - } @Test public void testReverse() { @@ -74,5 +70,4 @@ public void testIsValidPairs() { Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); } - } \ No newline at end of file diff --git a/group12/247565311/structure/week7/InfixExpr.java b/group12/247565311/structure/week7/InfixExpr.java index 4fc4d13fbe..1cb09a5d0b 100644 --- a/group12/247565311/structure/week7/InfixExpr.java +++ b/group12/247565311/structure/week7/InfixExpr.java @@ -1,17 +1,20 @@ package structure.week7; -// 姹傝В琛ㄨ揪寮忓瓧绗︿覆锛岄鍏堝皢琛ㄨ揪寮忓垱寤烘垚涓�5琛ㄨ揪寮忔爲锛岄渶瑕佹牴鎹繍绠楃鐨勪紭鍏堢骇鏉ュ垱寤� +import structure.week1.Stack; +// 使用表达式树来完成这个运算 public class InfixExpr { String expr = null; Element getElem = null; public InfixExpr(String expr) { - this.expr = expr; + this.expr = "0+"+expr; // 由于遇到优先级变化会生成单独节点,必须以最低优先级开头 getElem = new Element(expr); } public float evaluate() throws Exception{ - Node node = new Node('\0',getElem.getNextNum()); - Node root = createNode(node); + Node root = createNode(null); return (float) getValue(root); } + public double evaluate_stack(){ + return 0.0; + } class Element{ private int index; private String str; @@ -19,7 +22,35 @@ public Element(String _str){ index = 0; str = _str; } - public double getNextNum(){ + public double peekNextNum(){ + int lastindex = index; + double resl = 0,resr=0; + int fbits = 0; + char ch = str.charAt(index); + boolean hasp = false; + while(ch=='.' || (ch<='9' && '0'<=ch)){ + index += 1; + if(ch == '.') hasp = true; + else{ + if(hasp){ + fbits -= 1; + resr += (double)(ch-'0') * Math.pow(10,fbits); + }else{ + resl *= 10; + resl += (ch-'0'); + } + } + if(hasNext()) ch = str.charAt(index); + else break; + } + index = lastindex; + return resl+resr; + } + public double getNextNum() throws Exception{ + if(!hasNext()) { + int a = index -2; + throw new Exception("表达式格式错误,在位置"+a+"处缺少操作数。"); + } double resl = 0,resr=0; int fbits = 0; char ch = str.charAt(index); @@ -41,6 +72,18 @@ public double getNextNum(){ } return resl+resr; } + public char peekNextOper(){ + int lastindex = index; + char ch = '\0'; + while(hasNext()){ + ch = str.charAt(index); + index += 1; + if(ch=='+'||ch=='-'||ch=='*'||ch=='/') break; + ch = '\0'; + } + index = lastindex; + return ch; + } public char getNextOper(){ if(hasNext()){ char ch = str.charAt(index); @@ -68,23 +111,37 @@ class Node{ val =v; } } - private Node createNode(Node root){ + private Node createNode(Node node) throws Exception{ + if(getElem.peekNextOper() == '\0') return node; + if(node == null){ + node = new Node('\0',getElem.getNextNum()); + } char ch = getElem.getNextOper(); - if(ch == '\0'){ - + Node root = new Node(ch,0); + root.left = node; + char chn = getElem.peekNextOper(); + if(operUpDowm(ch,chn)<0){ // 操作符优先级提升 + root.right = createNode(null); + }else if(operUpDowm(ch,chn)>0){ // 操作符优先级下降 + root.right = new Node('\0',getElem.getNextNum()); + return root; // 这里是遍历完一个连续乘除法,需要返回节点,考虑5-2*3-4,不返回会导致5-2*3+4 }else{ - + root.right = new Node('\0',getElem.getNextNum()); } - Node node = new Node(getElem.getNextOper(),0); - node.left = root; - node.right = null; - // todo - return node; + return createNode(root); + } + private int operUpDowm(char c1,char c2){ + int temp1 = 0,temp2=0; + if(c1=='+'||c1=='-')temp1 = 0; + else if(c1=='*'||c1=='/')temp1 = 1; + if(c2=='+'||c2=='-')temp2 = 0; + else if(c2=='*'||c2=='/')temp2 = 1; + return temp1-temp2; } private double getValue(Node root) throws Exception{ - if(root == null) throw new Exception("表达式非法"); + if(root == null) throw new Exception("解析表达式出现异常"); switch(root.op){ - case '+': + case '+': return getValue(root.left)+getValue(root.right); case '-': return getValue(root.left)-getValue(root.right); @@ -92,8 +149,10 @@ private double getValue(Node root) throws Exception{ return getValue(root.left)*getValue(root.right); case '/': return getValue(root.left)/getValue(root.right); - default: + case '\0': return root.val; + default: + throw new Exception("目前还不支持 "+new StringBuilder().append(root.op).toString()+" 运算符。"); } } } diff --git a/group12/247565311/structure/week7/InfixExprTest.java b/group12/247565311/structure/week7/InfixExprTest.java index 21680594de..730e623126 100644 --- a/group12/247565311/structure/week7/InfixExprTest.java +++ b/group12/247565311/structure/week7/InfixExprTest.java @@ -6,58 +6,66 @@ public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - @After - public void tearDown() throws Exception { - } - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - try { - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } + @Before + public void setUp() throws Exception { + } + @After + public void tearDown() throws Exception { + } + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + try { + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - try { - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + try { + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } - { - InfixExpr expr = new InfixExpr("10-30+50"); - try { - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } catch (Exception e) { - e.printStackTrace(); - } - } - } + { + InfixExpr expr = new InfixExpr("3*20/2"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + try { + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + { + InfixExpr expr = new InfixExpr("4*2*5+5-4*5/5*3/2*4-2+4*2+2/1"); + try { + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } catch (Exception e) { + e.printStackTrace(); + } + } + } } \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/attr/AttrFactory.java b/group12/247565311/week567_miniJVM/attr/AttrFactory.java new file mode 100644 index 0000000000..71992f4302 --- /dev/null +++ b/group12/247565311/week567_miniJVM/attr/AttrFactory.java @@ -0,0 +1,80 @@ +package week567_miniJVM.attr; + +import week567_miniJVM.clz.ClassFile; +import week567_miniJVM.constant.ConstantInfo; +import week567_miniJVM.constant.UTF8Info; +import week567_miniJVM.loader.ByteCodeIterator; +import week567_miniJVM.attr.LineNumberTable; + +public class AttrFactory{ + private static AttrFactory instance = new AttrFactory(); + public static AttrFactory Instance(){ + return instance; + } + public AttributeInfo parse(ClassFile clzFile,ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + ConstantInfo info = clzFile.getConstantPool().getConstantInfo(attrNameIndex); + if(info.getType()==1&&"Code".equals(((UTF8Info) info).getValue())){ + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocal = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + CodeAttr codeattr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocal,codeLen,code); + + int exceptLen = iter.nextU2ToInt(); // 쳣 + while(exceptLen>0){ + exceptLen -= 1; + int startPc = iter.nextU2ToInt(); + int endPc = iter.nextU2ToInt(); + int handlerPc = iter.nextU2ToInt(); + int catchType = iter.nextU2ToInt(); + // TODO + } + int attributeLen = iter.nextU2ToInt(); // »Եĸ + while(attributeLen>0){ + attributeLen -= 1; + AttributeInfo chattr = AttrFactory.Instance().parse(clzFile, iter); + codeattr.addAttr(chattr); + } + return codeattr; + }else if(info.getType()==1&&"LineNumberTable".equals(((UTF8Info) info).getValue())){ + int attrLen = iter.nextU4ToInt(); + int lineNum = iter.nextU2ToInt(); + LineNumberTable linetable = new LineNumberTable(attrNameIndex,lineNum); + while(lineNum>0){ + lineNum -= 1; + int startPc = iter.nextU2ToInt(); + int lineNumber = iter.nextU2ToInt(); + linetable.addLineNumberItem(startPc,lineNumber); + } + return linetable; + }else if(info.getType()==1&&"LocalVariableTable".equals(((UTF8Info) info).getValue())){ + int attrLen = iter.nextU4ToInt(); + int localVarNum = iter.nextU2ToInt(); + LocalVariableTable lvartable = new LocalVariableTable(attrNameIndex,localVarNum); + while(localVarNum>0){ + localVarNum -= 1; + int startPc = iter.nextU2ToInt(); + int length = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int index = iter.nextU2ToInt(); + LocalVariableItem item = new LocalVariableItem(startPc,length,nameIndex,descIndex,index); + lvartable.addLocalVariableItem(item); + } + return lvartable; + }else if(info.getType()==1&&"StackMapTable".equals(((UTF8Info) info).getValue())){ + int attrLen = iter.nextU4ToInt(); + int entryNum = iter.nextU2ToInt(); + StackMapTable stacktable = new StackMapTable(attrNameIndex,entryNum); + stacktable.parse(iter); + //while(entryNum>0){ + // entryNum -= 1; + + //} + return stacktable; + } + return null; + } +} \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/attr/AttributeInfo.java b/group12/247565311/week567_miniJVM/attr/AttributeInfo.java index e97ebe0065..fb310678bf 100644 --- a/group12/247565311/week567_miniJVM/attr/AttributeInfo.java +++ b/group12/247565311/week567_miniJVM/attr/AttributeInfo.java @@ -1,7 +1,6 @@ package week567_miniJVM.attr; - - +import structure.week1.ArrayList; public abstract class AttributeInfo { public static final String CODE = "Code"; @@ -12,13 +11,19 @@ public abstract class AttributeInfo { public static final String STACK_MAP_TABLE = "StackMapTable"; int attrNameIndex; int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; + private String attrName; + ArrayList attrs = new ArrayList(); + public AttributeInfo( int attrNameIndex,int attrLen,String attrname) { + this.attrNameIndex = attrNameIndex; this.attrLen = attrLen; + this.attrName = attrname; + } + public String getAttrName(){ + return attrName; + } + public void addAttr(AttributeInfo attrinfo){ + attrs.add(attrinfo); } - - } diff --git a/group12/247565311/week567_miniJVM/attr/CodeAttr.java b/group12/247565311/week567_miniJVM/attr/CodeAttr.java index b32d6aada9..15e0a027f2 100644 --- a/group12/247565311/week567_miniJVM/attr/CodeAttr.java +++ b/group12/247565311/week567_miniJVM/attr/CodeAttr.java @@ -1,13 +1,10 @@ - - package week567_miniJVM.attr; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.constant.ConstantPool; import week567_miniJVM.loader.ByteCodeIterator; - public class CodeAttr extends AttributeInfo { private int maxStack ; private int maxLocals ; @@ -16,46 +13,40 @@ public class CodeAttr extends AttributeInfo { public String getCode() { return code; } - - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen,AttributeInfo.CODE); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; } - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; + public LineNumberTable getLineNumberTable() { + for(int i=0;i items = new ArrayList(); public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen,AttributeInfo.LOCAL_VAR_TABLE); } - public static LocalVariableTable parse(ByteCodeIterator iter){ return null; } - private void addLocalVariableItem(LocalVariableItem item) { + public void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } + } diff --git a/group12/247565311/week567_miniJVM/attr/StackMapTable.java b/group12/247565311/week567_miniJVM/attr/StackMapTable.java index c6b72f2655..aaf8d2944d 100644 --- a/group12/247565311/week567_miniJVM/attr/StackMapTable.java +++ b/group12/247565311/week567_miniJVM/attr/StackMapTable.java @@ -9,7 +9,7 @@ public class StackMapTable extends AttributeInfo{ private String originalCode; public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen,AttributeInfo.STACK_MAP_TABLE); } public static StackMapTable parse(ByteCodeIterator iter){ diff --git a/group12/247565311/week567_miniJVM/clz/ClassFile.java b/group12/247565311/week567_miniJVM/clz/ClassFile.java index 91226364b8..5db5b1dba8 100644 --- a/group12/247565311/week567_miniJVM/clz/ClassFile.java +++ b/group12/247565311/week567_miniJVM/clz/ClassFile.java @@ -7,65 +7,48 @@ import structure.week1.ArrayList; public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - - + public int minorVersion,majorVersion; + private AccessFlag accessFlag = null; + private ClassIndex clzIndex = null; + private ConstantPool constPool = null; + private ArrayList methods = null; + private ArrayList fields = null; + public ClassIndex getClzIndex() { return clzIndex; } + public void setClzIndex(ClassIndex clz){ + clzIndex = clz; + } public AccessFlag getAccessFlag() { return accessFlag; } - public void setAccessFlag(AccessFlag accessFlag) { - this.accessFlag = accessFlag; - } - - - - public ConstantPool getConstantPool() { - return pool; + public void setAccessFlag(AccessFlag acsFlag){ + accessFlag = acsFlag; + } + public ConstantPool getConstantPool() { + return constPool; } + public void setConstantPool(ConstantPool pool){ + constPool = 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 setVersion(int minor,int major){ + minorVersion = minor; + majorVersion = major; + } public void print(){ - if(this.accessFlag.isPublicClass()){ - System.out.println("Access flag : public "); + 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); @@ -76,9 +59,18 @@ private String getSuperClassName(){ return superClass.getClassName(); } public ArrayList getMethods() { - return null; + return methods; } public ArrayList getFields() { - return null; + return fields; + } + public void setClassIndex(ClassIndex parseClassIndex) { + clzIndex = parseClassIndex; + } + public void setFields(ArrayList parseFields) { + fields = parseFields; + } + public void setMethods(ArrayList parseMethods) { + methods = parseMethods; } } diff --git a/group12/247565311/week567_miniJVM/constant/ConstantPool.java b/group12/247565311/week567_miniJVM/constant/ConstantPool.java index fb35f6c253..23c1c32dce 100644 --- a/group12/247565311/week567_miniJVM/constant/ConstantPool.java +++ b/group12/247565311/week567_miniJVM/constant/ConstantPool.java @@ -4,19 +4,13 @@ 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); } diff --git a/group12/247565311/week567_miniJVM/constant/InfoFactory.java b/group12/247565311/week567_miniJVM/constant/InfoFactory.java new file mode 100644 index 0000000000..8c8bdc12f4 --- /dev/null +++ b/group12/247565311/week567_miniJVM/constant/InfoFactory.java @@ -0,0 +1,54 @@ +package week567_miniJVM.constant; +import week567_miniJVM.loader.ByteCodeIterator; +public class InfoFactory{ + private static InfoFactory infoFact = new InfoFactory(); + public static InfoFactory Invoke(){ + return infoFact; + } + public ConstantInfo getInfoObj(int tag,ByteCodeIterator iter,ConstantPool pool){ + switch(tag){ + case 1:{ + UTF8Info info = new UTF8Info(pool); + info.setLength(iter.nextU2ToInt()); + info.setValue(iter.nextUxToHexString(info.getLength())); + return info;} + case 7:{ + ClassInfo info = new ClassInfo(pool); + info.setUtf8Index(iter.nextU2ToInt()); + return info; } + case 8:{ + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + return info;} + case 9:{ + FieldRefInfo info = new FieldRefInfo(pool); + info.setClassInfoIndex(iter.nextU2ToInt()); + info.setNameAndTypeIndex(iter.nextU2ToInt()); + return info;} + case 10:{ + MethodRefInfo info = new MethodRefInfo(pool); + info.setClassInfoIndex(iter.nextU2ToInt()); + info.setNameAndTypeIndex(iter.nextU2ToInt()); + return info;} + case 12:{ + NameAndTypeInfo info = new NameAndTypeInfo(pool); + info.setIndex1(iter.nextU2ToInt()); + info.setIndex2(iter.nextU2ToInt()); + return info;} + default: + new RuntimeException("tag 为"+tag+" 的常亮项尚不支持!").printStackTrace(); + break; + } + return null; + } +} + + + + + + + + + + diff --git a/group12/247565311/week567_miniJVM/constant/UTF8Info.java b/group12/247565311/week567_miniJVM/constant/UTF8Info.java index ac2341bda9..40dbb7f126 100644 --- a/group12/247565311/week567_miniJVM/constant/UTF8Info.java +++ b/group12/247565311/week567_miniJVM/constant/UTF8Info.java @@ -26,7 +26,4 @@ public String getValue() { public void setValue(String value) { this.value = value; } - - - } diff --git a/group12/247565311/week567_miniJVM/field/Field.java b/group12/247565311/week567_miniJVM/field/Field.java index 47eac5a308..dd7510510a 100644 --- a/group12/247565311/week567_miniJVM/field/Field.java +++ b/group12/247565311/week567_miniJVM/field/Field.java @@ -1,33 +1,24 @@ package week567_miniJVM.field; +import structure.week1.ArrayList; import week567_miniJVM.constant.ConstantPool; -import week567_miniJVM.constant.UTF8Info; import week567_miniJVM.loader.ByteCodeIterator; - - public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - + private int accessFlag,nameIndex,descIndex; private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - + public Field( int accessFlag, int nameIndex, int descIndex,ConstantPool pool) { this.accessFlag = accessFlag; this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; + this.descIndex = descIndex; this.pool = pool; } - - - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - return null; + public void parse(ConstantPool pool,ByteCodeIterator iter){ + int propNum = iter.nextU2ToInt(); + while(propNum>0){ + propNum -= 1; + int prop = iter.nextU2ToInt(); + // TODO + } + return ; } - } \ No newline at end of file diff --git a/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java b/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java index d38345b3fe..a3cf1f4578 100644 --- a/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java +++ b/group12/247565311/week567_miniJVM/loader/ByteCodeIterator.java @@ -1,20 +1,38 @@ package week567_miniJVM.loader; public class ByteCodeIterator { - + private byte[] bytes = null; + int index = 0; + public ByteCodeIterator(byte[] _byte){ + bytes = _byte; + } + public void skip(int i){ + index += i; + } + public int nextU1ToInt(){ + byte a = bytes[index]; + System.out.print(a); + index += 1; + return (int)(a&0xff); + } public int nextU2ToInt() { - // TODO Զɵķ - return 0; + return nextU1ToInt()*256+nextU1ToInt(); } public int nextU4ToInt() { - // TODO Զɵķ - return 0; + return nextU1ToInt()*256*256*256+nextU1ToInt()*256*256+nextU1ToInt()*256+nextU1ToInt(); } public String nextUxToHexString(int len) { - // TODO Զɵķ - return null; + String res = ""; + while(len>0){ + len -= 1; + int a = nextU1ToInt(); + res += (char)(a&0xff); + } + return res; } - + public boolean hasNext(){ + return index clzPaths = new ArrayList(); - public byte[] readBinaryCode(String className) throws Exception { + public ClassFile loadClass(String className){ + + byte[] bytes = readBinaryCode(className); + ClassFile clzFile = new ClassFileParser().parse(bytes); + + return clzFile; + } + public byte[] readBinaryCode(String className) { for(String s:clzPaths){ String filename = s+className+".class"; File file = new File(filename); @@ -20,32 +26,26 @@ public byte[] readBinaryCode(String className) throws Exception { } return null; } - public ClassFile loadClass(String className){ - return null; - } - private byte[] loadClassFile(String clzFileName) throws Exception { + private byte[] loadClassFile(String clzFileName) { File file = new File(clzFileName); long filelength = file.length(); byte[]res = null; - if(filelength>Integer.MAX_VALUE)throw new IOException("ļ"); + if(filelength>Integer.MAX_VALUE) new IOException("ļ").printStackTrace(); try { FileInputStream fileinput = new FileInputStream(file); res = new byte[(int) filelength]; int offset=0,length=0; while(offset-1)) offset += length; - fileinput.close(); - } catch (FileNotFoundException e) { + if(fileinput!=null)fileinput.close(); + } catch (Exception e) { e.printStackTrace(); } return res; } - public void addClassPath(String path) { clzPaths.add(path); } - - public String getClassPath(){ String res = ""; int size = clzPaths.size(); diff --git a/group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java b/group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java similarity index 93% rename from group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java rename to group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java index ed81eaa399..c235413b3b 100644 --- a/group12/247565311/week567_miniJVM/test/ClassFileLoaderTest.java +++ b/group12/247565311/week567_miniJVM/loader/ClassFileLoaderTest.java @@ -1,7 +1,7 @@ -package week567_miniJVM.test; +package week567_miniJVM.loader; + import structure.week1.ArrayList; -import structure.week1.List; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.clz.ClassIndex; import week567_miniJVM.constant.ClassInfo; @@ -19,23 +19,15 @@ import org.junit.Test; public class ClassFileLoaderTest { - private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "F:\\code_language\\demo\\Homework\\bin\\week567_miniJVM\\test"; + private static final String FULL_QUALIFIED_CLASS_NAME = "EmployeeV1.class"; + static String path1 = "F:\\code_language\\demo\\Homework\\bin\\week567_miniJVM\\test\\"; static String path2 = "C:\temp"; - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - - clzFile = loader.loadClass(className); - clzFile.print(); - } - - @Before - public void setUp() throws Exception { + public void setUp() throws Exception { + int = 1; + += 1; + System.out.print(); } @After public void tearDown() throws Exception { @@ -59,7 +51,8 @@ public void testClassFileLength() { } catch (Exception e) { e.printStackTrace(); } - // 这里断言.class文件的字节数 + // .classļֽ + System.out.print(byteCodes.length); Assert.assertEquals(267, byteCodes.length); } @Test @@ -91,8 +84,17 @@ private String byteToHexString(byte[] codes ){ return buffer.toString(); } /** - * miniJVM第二次作业测试用例 + * miniJVMڶҵ */ + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "week567_miniJVM.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } @Test public void testVersion(){ Assert.assertEquals(0, clzFile.getMinorVersion()); @@ -140,7 +142,7 @@ public void testConstantPool(){ Assert.assertEquals(9, nameAndType.getIndex1()); Assert.assertEquals(14, nameAndType.getIndex2()); } - // 随机抽查一个 + // һ { MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(45); Assert.assertEquals(1, methodRef.getClassInfoIndex()); @@ -160,7 +162,7 @@ public void testClassIndex(){ Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } /** - * miniJVM第三次作业测试用例 + * miniJVMҵ */ @Test public void testReadFields(){ @@ -223,4 +225,4 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } -} \ No newline at end of file +} diff --git a/group12/247565311/week567_miniJVM/loader/ClassFileParser.java b/group12/247565311/week567_miniJVM/loader/ClassFileParser.java index 5a23889b50..c3858dbaf6 100644 --- a/group12/247565311/week567_miniJVM/loader/ClassFileParser.java +++ b/group12/247565311/week567_miniJVM/loader/ClassFileParser.java @@ -1,44 +1,91 @@ package week567_miniJVM.loader; -import java.io.UnsupportedEncodingException; - +import structure.week1.ArrayList; import week567_miniJVM.clz.AccessFlag; import week567_miniJVM.clz.ClassFile; import week567_miniJVM.clz.ClassIndex; -import week567_miniJVM.constant.ClassInfo; +import week567_miniJVM.constant.ConstantInfo; import week567_miniJVM.constant.ConstantPool; -import week567_miniJVM.constant.FieldRefInfo; -import week567_miniJVM.constant.MethodRefInfo; -import week567_miniJVM.constant.NameAndTypeInfo; +import week567_miniJVM.constant.InfoFactory; import week567_miniJVM.constant.NullConstantInfo; -import week567_miniJVM.constant.StringInfo; -import week567_miniJVM.constant.UTF8Info; - -public class ClassFileParser { +import week567_miniJVM.field.Field; +import week567_miniJVM.method.Method; - public ClassFile parse(byte[] codes) { - - - - return null; +public class ClassFileParser { + public ClassFile parse(byte[] bytes) { + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(bytes); + if(!"cafebabe".equals(iter.nextUxToHexString(4))) return null; + + clzFile.setVersion(iter.nextU2ToInt(),iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstantPool(pool); + + clzFile.setAccessFlag(parseAccessFlag(iter)); + clzFile.setClassIndex(parseClassIndex(iter)); + + int collectionNum = iter.nextU2ToInt(); + iter.skip(collectionNum*2); + + clzFile.setFields(parseFields(iter,pool)); + clzFile.setMethods(parseMethods(clzFile,iter)); + return clzFile; } - - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - - return null; + + private ConstantPool parseConstantPool(ByteCodeIterator iter){ + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + int lenpool = iter.nextU2ToInt(); + while(lenpool>1){ + lenpool -= 1; + int tag = iter.nextU1ToInt(); + ConstantInfo info = InfoFactory.Invoke().getInfoObj(tag,iter,pool); + pool.addConstantInfo(info); + } + return pool; } - - private ClassIndex parseClassInfex(ByteCodeIterator iter) { - - return null; - + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag caflag = new AccessFlag(iter.nextU2ToInt()); + return caflag; } - - private ConstantPool parseConstantPool(ByteCodeIterator iter) { - - return null; + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + ClassIndex clzIndex = new ClassIndex(); + clzIndex.setThisClassIndex(iter.nextU2ToInt()); + clzIndex.setSuperClassIndex(iter.nextU2ToInt()); + return clzIndex; } - + private ArrayList parseFields(ByteCodeIterator iter,ConstantPool pool){ + ArrayList fields = new ArrayList(); + int fieldNum = iter.nextU2ToInt(); + while(fieldNum>0){ + fieldNum -= 1; + int accflag = iter.nextU2ToInt(); // 例如是public + int nameIndex = iter.nextU2ToInt();// 指向常量池的入口 + int descIndex = iter.nextU2ToInt(); // 指向常量池的入口 + Field field = new Field(accflag,nameIndex,descIndex,pool); + field.parse(pool,iter); + fields.add(field); + } + return fields; + } + + private ArrayList parseMethods(ClassFile clzFile,ByteCodeIterator iter){ + ArrayList methods = new ArrayList(); + int methodNum = iter.nextU2ToInt(); + while(methodNum>0){ + methodNum -= 1; + int accflag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + Method method = new Method(clzFile,accflag,nameIndex,descIndex); + method.parse(clzFile,iter); + methods.add(method); + } + return methods; + } } diff --git a/group12/247565311/week567_miniJVM/method/Method.java b/group12/247565311/week567_miniJVM/method/Method.java index aadd29e9a6..ceabffec1b 100644 --- a/group12/247565311/week567_miniJVM/method/Method.java +++ b/group12/247565311/week567_miniJVM/method/Method.java @@ -1,58 +1,51 @@ package week567_miniJVM.method; - import week567_miniJVM.clz.ClassFile; -import week567_miniJVM.attr.AttributeInfo; -import week567_miniJVM.attr.CodeAttr; -import week567_miniJVM.constant.ConstantPool; +import week567_miniJVM.constant.ConstantInfo; import week567_miniJVM.constant.UTF8Info; import week567_miniJVM.loader.ByteCodeIterator; - - +import week567_miniJVM.attr.AttrFactory; +import week567_miniJVM.attr.AttributeInfo; +import week567_miniJVM.attr.CodeAttr; public class Method { - - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - + private int accessFlag,nameIndex,descIndex; private CodeAttr codeAttr; - private ClassFile clzFile; - public ClassFile getClzFile() { return clzFile; } - + public int getAccessFlag(){ + return accessFlag; + } public int getNameIndex() { return nameIndex; } public int getDescriptorIndex() { - return descriptorIndex; + return descIndex; } - public CodeAttr getCodeAttr() { return codeAttr; } - public void setCodeAttr(CodeAttr code) { this.codeAttr = code; } - - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descIndex) { this.clzFile = clzFile; this.accessFlag = accessFlag; this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; + this.descIndex = descIndex; } - - - - - public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ - return null; - + public void parse(ClassFile clzFile, ByteCodeIterator iter){ + int attributeNum = iter.nextU2ToInt(); + while(attributeNum>0){ + attributeNum -= 1; + AttributeInfo attrinfo = AttrFactory.Instance().parse(clzFile, iter); + if(attrinfo == null) continue; + + + } } } diff --git a/group12/247565311/week567_miniJVM/test/EmployeeV1.java b/group12/247565311/week567_miniJVM/test/EmployeeV1.java index b9855461ae..bfa4460096 100644 --- a/group12/247565311/week567_miniJVM/test/EmployeeV1.java +++ b/group12/247565311/week567_miniJVM/test/EmployeeV1.java @@ -1,5 +1,18 @@ package week567_miniJVM.test; public class EmployeeV1 { - + private int age; + private String name; + public void setAge(int _age){ + age = _age; + } + public int getAge(){ + return age; + } + public void setName(String _name){ + name = _name; + } + public String getName(){ + return name; + } } diff --git a/group12/247565311/week567_miniJVM/util/Util.java b/group12/247565311/week567_miniJVM/util/Util.java index c10eaee6f2..9c7baeb915 100644 --- a/group12/247565311/week567_miniJVM/util/Util.java +++ b/group12/247565311/week567_miniJVM/util/Util.java @@ -5,9 +5,6 @@ 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 */ - public static void reverse(Stack stack) { + public static void reverse(Stack stack) { if (stack.isEmpty()) { return; } - int i = getAndRemoveLastElement(stack); + E i = getAndRemoveLastElement(stack); reverse(stack); stack.push(i); } - public static int getAndRemoveLastElement(Stack stack) { - int result = stack.pop(); + + public static E getAndRemoveLastElement(Stack stack) { + E result = stack.pop(); if (stack.isEmpty()) { return result; } else { - int last = getAndRemoveLastElement(stack); + E last = getAndRemoveLastElement(stack); stack.push(result); return last; } diff --git a/group12/382266293/coding/basic/stack/expr/InfixExpr.java b/group12/382266293/coding/basic/stack/expr/InfixExpr.java index eade1dc743..c143116ec4 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExpr.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExpr.java @@ -1,18 +1,78 @@ -package stack.expr; - -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - return 0.0f; - } - - - - -} +package stack.expr; + +import java.util.List; +import java.util.Stack; + + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + if(opStack.isEmpty()){ + + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + + + return numStack.pop().floatValue(); + } + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + + +} diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprS.java b/group12/382266293/coding/basic/stack/expr/InfixExprS.java new file mode 100644 index 0000000000..7600cccb93 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/InfixExprS.java @@ -0,0 +1,102 @@ +package stack.expr; + +import java.util.Stack; +import stack.StackUtil; + +public class InfixExprS{ + String expr = null; + + public InfixExprS(String expr) { + this.expr = expr; + } + + public float evaluate() { + + TParser tp = new TParser(); + tp.parse(expr); + Stack ints = new Stack(); + Stack signs = new Stack(); + + int i1 = tp.nextInt(); + String sign1 = tp.nextSign(); + + ints.push(i1); + signs.push(sign1); + + while (tp.hasNextInt()) { + + int i2 = tp.nextInt(); + String sign2 = tp.nextSign(); + + if (tp.hasNextInt()) { + + if (highPrioritySign(sign1)) { + + i1 = ints.pop(); + sign1 = signs.pop(); + i2 = calculate(i1, i2, sign1); + + } + + ints.push(i2); + signs.push(sign2); + sign1 = sign2; + + } + + } + + signs.pop(); + StackUtil.reverse(ints); + StackUtil.reverse(signs); + + while (!ints.isEmpty()) { + + int firstInt = ints.pop(); + + if (ints.isEmpty()) { + return (float) firstInt; + } + + int secInt = ints.pop(); + String sign = signs.pop(); + int result = calculate(firstInt, secInt, sign); + ints.push(result); + + } + + System.out.println("we shall not reach here"); + return (float) ints.peek(); + } + + private int calculate(int firstInt, int secInt, String lowsign) { + + int result; + if (lowsign.equals("+")) { + result = firstInt + secInt; + } else if (lowsign.equals("-")) { + result = firstInt - secInt; + } else if (lowsign.equals("*")) { + result = firstInt * secInt; + } else if (lowsign.equals("/")) { + result = firstInt / secInt; + } else { + throw new RuntimeException(lowsign + " has not been supported yet!"); + } + + return result; + + } + + private boolean highPrioritySign(String sign) { + + if (sign.equals("*") || sign.equals("/")) { + + return true; + + } + + return false; + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java index bb047629bd..836848ac91 100644 --- a/group12/382266293/coding/basic/stack/expr/InfixExprTest.java +++ b/group12/382266293/coding/basic/stack/expr/InfixExprTest.java @@ -5,7 +5,6 @@ import org.junit.Before; import org.junit.Test; - public class InfixExprTest { @Before @@ -18,31 +17,62 @@ public void tearDown() throws Exception { @Test public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + + { + InfixExpr expr = new InfixExpr("1*2*2-1"); + Assert.assertEquals(3.0, expr.evaluate(), 0.001f); + } + { InfixExpr expr = new InfixExpr("2+3*4+5"); Assert.assertEquals(19.0, expr.evaluate(), 0.001f); } + { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + InfixExpr expr = new InfixExpr("2+3*4+5*1+1"); + Assert.assertEquals(20.0, expr.evaluate(), 0.001f); } + { + InfixExpr expr = new InfixExpr("2+3*4/2+1"); + Assert.assertEquals(9, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("2-3*4/2-1"); + Assert.assertEquals(-5.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("6-1*5+2+0"); + Assert.assertEquals(3.0, expr.evaluate(), 0.001f); + } + { InfixExpr expr = new InfixExpr("3*20/2"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } + { + InfixExpr expr = new InfixExpr("3*20/2+1"); + Assert.assertEquals(31, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2+1-1"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { InfixExpr expr = new InfixExpr("20/2*3"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - + { InfixExpr expr = new InfixExpr("10-30+50"); Assert.assertEquals(30, expr.evaluate(), 0.001f); } - + } } diff --git a/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java b/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..a293ddfeee --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,51 @@ +package stack.expr; + +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + List pTokens = new Stack<>(); + Stack opStack = new Stack<>(); + + for (Token token : tokens) { + if (token.isNumber()) { + pTokens.add(token); + } else { + if (token.isLeftSquare()) { + opStack.push(token); + } else if (token.isRightSquare()) { + while (!opStack.peek().isLeftSquare()) { + pTokens.add(opStack.pop()); + } + opStack.pop(); + } else { + if (opStack.isEmpty() || token.hasHigherPriority(opStack.peek())) { + opStack.add(token); + } else { + while (!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())) { + pTokens.add(opStack.pop()); + } + opStack.add(token); + } + } + } + } + + while(!opStack.isEmpty()) { + pTokens.add(opStack.pop()); + } + + System.out.println(pTokens); + return pTokens; + } + + public static void main(String[] args) { + convert("10-2*3+50"); + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/PostfixExpr.java b/group12/382266293/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..e4eaa4bfe6 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,51 @@ +package stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } else { + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + } + + return numStack.pop().floatValue(); + } + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + + +} diff --git a/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java b/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..1a6137e537 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/PrefixExpr.java b/group12/382266293/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..1628810d68 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,56 @@ +package stack.expr; + +import java.util.List; +import java.util.Stack; + +import stack.StackUtil; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + System.out.println(tokens); + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for(Token token : tokens){ + exprStack.push(token); + } + System.out.println(exprStack); + while(!exprStack.isEmpty()){ + Token t = exprStack.pop(); + if(t.isNumber()){ + numStack.push(new Float(t.getIntValue())); + }else{ + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(t.toString(),f1,f2)); + + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + +} diff --git a/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java b/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..85b68a1020 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/TParser.java b/group12/382266293/coding/basic/stack/expr/TParser.java new file mode 100644 index 0000000000..06c543efd3 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/TParser.java @@ -0,0 +1,85 @@ +package stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingDeque; + +public class TParser { + + Queue intQ; + Queue signQ; + static final List signs = new ArrayList(); + { + signs.add("+"); + signs.add("-"); + signs.add("*"); + signs.add("/"); + } + + public TParser() { + intQ = new LinkedBlockingDeque(); + signQ = new LinkedBlockingDeque(); + } + + public void parse(String expr) { + + String[] tokens = expr.split(""); + String number = ""; + + for (int i = 0; i < tokens.length; i++) { + + String c = tokens[i]; + + if (isSign(c)) { + + signQ.add(c); + + int num = Integer.parseInt(number); + intQ.add(num); + number = ""; + + } else { + + number += tokens[i]; + + } + + } + + int num = Integer.parseInt(number); + intQ.add(num); + + int intSize = intQ.size(); + if (intSize < 2 || intSize - signQ.size() > 1) { + throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ); + } + + intQ.add(0); + + } + + private boolean isSign(String c) { + if (signs.contains(c)) { + return true; + } + return false; + } + + public int nextInt() { + return intQ.poll(); + } + + public String nextSign() { + return signQ.poll(); + } + + public boolean hasNextInt() { + return !intQ.isEmpty(); + } + + public boolean hasNextSign() { + return !signQ.isEmpty(); + } + +} diff --git a/group12/382266293/coding/basic/stack/expr/Token.java b/group12/382266293/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..670663d358 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/Token.java @@ -0,0 +1,77 @@ +package stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/", "(", ")"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + priorities.put("(", 0); + priorities.put(")", 3); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public boolean isLeftSquare() { + if (!isOperator()) { + return false; + } + + return priorities.get(this.value) == 0; + } + + public boolean isRightSquare() { + if (!isOperator()) { + return false; + } + + return priorities.get(this.value) == 3; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + public boolean isSquare() { + + return isLeftSquare() || isRightSquare(); + } + + + + + +} \ No newline at end of file diff --git a/group12/382266293/coding/basic/stack/expr/TokenParser.java b/group12/382266293/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..5f4be41e00 --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group12/382266293/coding/basic/stack/expr/TokenParserTest.java b/group12/382266293/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..427f887edd --- /dev/null +++ b/group12/382266293/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,66 @@ +package stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + + @Test + public void test1() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("9+(3-1)*3+10/2"); + System.out.println(tokens); +// //9+(3-1)*3+10/2 +// PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); +// Assert.assertEquals(20, expr.evaluate(),0.0f); [9, 3, 1, -, 3, *, +, 10, 2, /, +] + +// Assert.assertEquals(300, tokens.get(0).getIntValue()); +// Assert.assertEquals("*", tokens.get(1).toString()); +// Assert.assertEquals(20, tokens.get(2).getIntValue()); +// Assert.assertEquals("+", tokens.get(3).toString()); +// Assert.assertEquals(12, tokens.get(4).getIntValue()); +// Assert.assertEquals("*", tokens.get(5).toString()); +// Assert.assertEquals(5, tokens.get(6).getIntValue()); +// Assert.assertEquals("-", tokens.get(7).toString()); +// Assert.assertEquals(20, tokens.get(8).getIntValue()); +// Assert.assertEquals("/", tokens.get(9).toString()); +// Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + + + +} diff --git a/group12/382266293/src/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java index ea847fd386..0abca4577f 100644 --- a/group12/382266293/src/array/ArrayUtil.java +++ b/group12/382266293/src/array/ArrayUtil.java @@ -8,106 +8,38 @@ public class ArrayUtil { - /** - * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = - * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * - * @param origin - * @return - */ - public void reverseArray(int[] origin) { - - int temp; - int index = origin.length - 1; - int numbersToReverse = origin.length / 2; - for (int i = 0; i < numbersToReverse; i++) { - temp = origin[i]; - origin[i] = origin[index - i]; - origin[index - i] = temp; + public static void initialArray(int[] arr, int j) { + for (int i = 0; i < arr.length; i++) { + arr[i] = j; } } - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} - * - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray) { + public static boolean isPerfectNum(int num) { - BitSet check = new BitSet(oldArray.length); - boolean isZero; - for (int i = 0; i < oldArray.length; i++) { - isZero = (oldArray[i] == 0) ? true : false; - check.set(i, isZero); + int sum = 0; + for (int i = 1; i <= num / 2; i++) { + if (num % i == 0) + sum += i; } - int newSize = oldArray.length - check.cardinality(); - int[] newArr = new int[newSize]; - - int nextIndex = check.nextClearBit(0); - for (int i = 0; i < newSize; i++) { - newArr[i] = oldArray[nextIndex]; - nextIndex = check.nextClearBit(nextIndex + 1); - } + return (num == sum) ? true : false; - return newArr; } - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = - * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * - * @param array1 - * @param array2 - * @return - */ + public static boolean isPrime(int num) { - public int[] merge(int[] array1, int[] array2) { + if (num <= 1) + return false; - int len1 = array1.length; - int len2 = array2.length; - int len3 = array1[len1 - 1] < array2[len2 - 1] ? array2[len2 - 1] + 1 : array1[len1 - 1] + 1; - int[] newArr = new int[len3]; - initialArray(newArr, -1); - for (int i = 0; i < len1; i++) { - newArr[array1[i]] = 0; - } - for (int i = 0; i < len2; i++) { - newArr[array2[i]] = 0; - } - int mergedLength = 0; - for (int i = 0; i < len3; i++) { - if (newArr[i] != -1) - newArr[mergedLength++] = i; - } - return Arrays.copyOf(newArr, mergedLength); - } + if (num == 2) + return true; - public static void initialArray(int[] arr, int j) { - for (int i = 0; i < arr.length; i++) { - arr[i] = j; + for (int i = 2; i <= Math.sqrt(num) + 1; i++) { + if (num % i == 0) + return false; } - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * - * @param oldArray - * @param size - * @return - */ - public int[] grow(int[] oldArray, int size) { - int[] newArr = new int[oldArray.length + size]; - for (int i = 0; i < oldArray.length; i++) { - newArr[i] = oldArray[i]; - } - return newArr; + return true; } /** @@ -131,6 +63,30 @@ public int[] fibonacci(int max) { return Arrays.copyOf(result, ++count); } + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + + int count = 0; + ArrayList myList = new ArrayList(); + for (int i = 1; i < max; i++) { + if (isPerfectNum(i)) { + count++; + myList.add(i); + } + } + int[] result = new int[count]; + Iterator iterator = myList.iterator(); + for (int i = 0; i < count; i++) { + result[i] = iterator.next(); + } + return result; + } + /** * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] * @@ -154,73 +110,117 @@ public int[] getPrimes(int max) { return result; } - public static boolean isPrime(int num) { - - if (num <= 1) - return false; - - if (num == 2) - return true; + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { - for (int i = 2; i <= Math.sqrt(num) + 1; i++) { - if (num % i == 0) - return false; + int[] newArr = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + newArr[i] = oldArray[i]; } + return newArr; + } - return true; + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + sb.append(array[i]); + if (i < array.length - 1) + sb.append(seperator); + } + return sb.toString(); } /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 * - * @param max + * @param array1 + * @param array2 * @return */ - public int[] getPerfectNumbers(int max) { - int count = 0; - ArrayList myList = new ArrayList(); - for (int i = 1; i < max; i++) { - if (isPerfectNum(i)) { - count++; - myList.add(i); - } + public int[] merge(int[] array1, int[] array2) { + + int len1 = array1.length; + int len2 = array2.length; + int len3 = array1[len1 - 1] < array2[len2 - 1] ? array2[len2 - 1] + 1 : array1[len1 - 1] + 1; + int[] newArr = new int[len3]; + initialArray(newArr, -1); + for (int i = 0; i < len1; i++) { + newArr[array1[i]] = 0; } - int[] result = new int[count]; - Iterator iterator = myList.iterator(); - for (int i = 0; i < count; i++) { - result[i] = iterator.next(); + for (int i = 0; i < len2; i++) { + newArr[array2[i]] = 0; } - return result; + int mergedLength = 0; + for (int i = 0; i < len3; i++) { + if (newArr[i] != -1) + newArr[mergedLength++] = i; + } + return Arrays.copyOf(newArr, mergedLength); } - public static boolean isPerfectNum(int num) { + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ - int sum = 0; - for (int i = 1; i <= num / 2; i++) { - if (num % i == 0) - sum += i; + public int[] removeZero(int[] oldArray) { + + BitSet check = new BitSet(oldArray.length); + boolean isZero; + for (int i = 0; i < oldArray.length; i++) { + isZero = (oldArray[i] == 0) ? true : false; + check.set(i, isZero); } - return (num == sum) ? true : false; + int newSize = oldArray.length - check.cardinality(); + int[] newArr = new int[newSize]; + + int nextIndex = check.nextClearBit(0); + for (int i = 0; i < newSize; i++) { + newArr[i] = oldArray[nextIndex]; + nextIndex = check.nextClearBit(nextIndex + 1); + } + return newArr; } /** - * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] * - * @param array - * @param s + * @param origin * @return */ - public String join(int[] array, String seperator) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < array.length; i++) { - sb.append(array[i]); - if (i < array.length - 1) - sb.append(seperator); + public void reverseArray(int[] origin) { + + int temp; + int index = origin.length - 1; + int numbersToReverse = origin.length / 2; + for (int i = 0; i < numbersToReverse; i++) { + temp = origin[i]; + origin[i] = origin[index - i]; + origin[index - i] = temp; } - return sb.toString(); } } \ No newline at end of file diff --git a/group12/382266293/src/array/ArrayUtilTest.java b/group12/382266293/src/array/ArrayUtilTest.java index 031ef6c09b..d86ecde1fc 100644 --- a/group12/382266293/src/array/ArrayUtilTest.java +++ b/group12/382266293/src/array/ArrayUtilTest.java @@ -1,10 +1,14 @@ package array; -import static org.junit.Assert.*; -import static util.TestUtil.*; +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.assertArrayEquals; +import static util.TestUtil.getRandomIntArray; +import static util.TestUtil.getRandomNumber; + import java.util.Arrays; import java.util.Iterator; import java.util.TreeSet; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -25,43 +29,61 @@ public void tearDown() throws Exception { } @Test - public void testReverseArray() { + public void testFibonacci() { + int[] expected = new int[] { 1, 1, 2, 3, 5, 8, 13 }; + int[] acutal = new int[expected.length]; + actual = au.fibonacci(15); + assertArrayEquals(expected, actual); + } - int size = getRandomNumber(); - int[] expected = getRandomIntArray(size); - actual = Arrays.copyOf(expected, size); + @Test + public void testGetPerfectNumbers() { - au.reverseArray(actual); + int[] expected = new int[] { 6, 28, 496, 8128 }; + int[] acutal = new int[expected.length]; + actual = au.getPerfectNumbers(10000); + assertArrayEquals(expected, actual); + } - for (int i = 0; i < size; i++) { - assertEquals(expected[i], actual[size - 1 - i]); - } + @Test + public void testGetPrimes() { + int[] expected = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }; + int[] acutal = new int[expected.length]; + actual = au.getPrimes(23); + assertArrayEquals(expected, actual); } @Test - public void testRemoveZero() { + public void testGrow() { + int[] expected = getRandomIntArray(getRandomNumber()); + int growSize = getRandomNumber(); + int[] actual = au.grow(expected, growSize); - int size = getRandomNumber(10000); - int[] expected = getRandomIntArray(size); + assertEquals(expected.length + growSize, actual.length); - int zeros = getRandomNumber(size - 1); - TreeSet t = new TreeSet(); - while (t.size() != zeros) { - t.add(getRandomNumber(size)); + for (int i = 0; i < actual.length; i++) { + if (i < expected.length) { + assertEquals(expected[i], actual[i]); + } else { + assertEquals(0, actual[i]); + } } - for (Integer i : t) { - expected[i] = 0; - } + } - int expectedSize = size - zeros; - actual = au.removeZero(expected); - assertEquals(expectedSize, actual.length); + @Test + public void testJoin() { - for (int i = 0, j = 0; i < size; i++) { - if (expected[i] != 0) - assertEquals(expected[i], actual[j++]); + int[] expected = getRandomIntArray(getRandomNumber()); + String seperator = "-"; + String joinedString = au.join(expected, seperator); + + String[] actual = joinedString.split(seperator); + + assertEquals(expected.length, actual.length); + for (int i = 0; i < expected.length; i++) { + assertEquals(expected[i], Integer.parseInt(actual[i])); } } @@ -92,61 +114,43 @@ public void testMerge() { } @Test - public void testGrow() { - int[] expected = getRandomIntArray(getRandomNumber()); - int growSize = getRandomNumber(); - int[] actual = au.grow(expected, growSize); + public void testRemoveZero() { - assertEquals(expected.length + growSize, actual.length); + int size = getRandomNumber(10000); + int[] expected = getRandomIntArray(size); - for (int i = 0; i < actual.length; i++) { - if (i < expected.length) { - assertEquals(expected[i], actual[i]); - } else { - assertEquals(0, actual[i]); - } + int zeros = getRandomNumber(size - 1); + TreeSet t = new TreeSet(); + while (t.size() != zeros) { + t.add(getRandomNumber(size)); } - } - - @Test - public void testFibonacci() { - int[] expected = new int[] { 1, 1, 2, 3, 5, 8, 13 }; - int[] acutal = new int[expected.length]; - actual = au.fibonacci(15); - assertArrayEquals(expected, actual); - } - - @Test - public void testGetPrimes() { + for (Integer i : t) { + expected[i] = 0; + } - int[] expected = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 }; - int[] acutal = new int[expected.length]; - actual = au.getPrimes(23); - assertArrayEquals(expected, actual); - } + int expectedSize = size - zeros; + actual = au.removeZero(expected); + assertEquals(expectedSize, actual.length); - @Test - public void testGetPerfectNumbers() { + for (int i = 0, j = 0; i < size; i++) { + if (expected[i] != 0) + assertEquals(expected[i], actual[j++]); + } - int[] expected = new int[] { 6, 28, 496, 8128 }; - int[] acutal = new int[expected.length]; - actual = au.getPerfectNumbers(10000); - assertArrayEquals(expected, actual); } @Test - public void testJoin() { + public void testReverseArray() { - int[] expected = getRandomIntArray(getRandomNumber()); - String seperator = "-"; - String joinedString = au.join(expected, seperator); + int size = getRandomNumber(); + int[] expected = getRandomIntArray(size); + actual = Arrays.copyOf(expected, size); - String[] actual = joinedString.split(seperator); + au.reverseArray(actual); - assertEquals(expected.length, actual.length); - for (int i = 0; i < expected.length; i++) { - assertEquals(expected[i], Integer.parseInt(actual[i])); + for (int i = 0; i < size; i++) { + assertEquals(expected[i], actual[size - 1 - i]); } } diff --git a/group12/382266293/src/com/coderising/download/DownloadThread.java b/group12/382266293/src/com/coderising/download/DownloadThread.java index 38f92f6677..11df6109e3 100644 --- a/group12/382266293/src/com/coderising/download/DownloadThread.java +++ b/group12/382266293/src/com/coderising/download/DownloadThread.java @@ -2,7 +2,6 @@ import java.io.File; import java.io.IOException; - import java.io.RandomAccessFile; import com.coderising.download.api.Connection; @@ -22,6 +21,15 @@ public DownloadThread(Connection conn, int startPos, int endPos) { this.endPos = endPos; } + public void close() { + this.conn.close(); + + } + + public void notifyFinished() { + fileDownloader.setThreadFinished(); + } + @Override public void run() { System.out.println(this.getName() + " is running"); @@ -49,21 +57,12 @@ public void run() { } } - public void setFileDownloader(FileDownloader fileDownloader) { - this.fileDownloader = fileDownloader; - } - - public void notifyFinished() { - fileDownloader.setThreadFinished(); - } - public void setDest(String dest) { this.dest = dest; } - public void close() { - this.conn.close(); - + public void setFileDownloader(FileDownloader fileDownloader) { + this.fileDownloader = fileDownloader; } } diff --git a/group12/382266293/src/com/coderising/download/DownloadUtil.java b/group12/382266293/src/com/coderising/download/DownloadUtil.java index c169214476..8e54afc2f9 100644 --- a/group12/382266293/src/com/coderising/download/DownloadUtil.java +++ b/group12/382266293/src/com/coderising/download/DownloadUtil.java @@ -9,8 +9,15 @@ public class DownloadUtil { private static final int MIN_CONNECTIONS = 3; private static final int MAX_CONNECTIONS = 10; - public static long getCurrentTime() { - return System.currentTimeMillis(); + public static int calculateConnects(int length) { + int conns = length / 1024 / 1024 / 10; + if (conns < MIN_CONNECTIONS) { + return MIN_CONNECTIONS; + } else if (conns > MAX_CONNECTIONS) { + return MAX_CONNECTIONS; + } else { + return conns; + } } public static void createTempFile(String tempName, int len) { @@ -44,15 +51,14 @@ public static void createTempFile(String tempName, int len) { } } - public static int calculateConnects(int length) { - int conns = length / 1024 / 1024 / 10; - if (conns < MIN_CONNECTIONS) { - return MIN_CONNECTIONS; - } else if (conns > MAX_CONNECTIONS) { - return MAX_CONNECTIONS; - } else { - return conns; - } + public static long getCurrentTime() { + return System.currentTimeMillis(); + } + + public static void printDownloadReport(int length, long start, long end) { + int time = (int) ((end - start) / 1000); + float speed = (float) length / 1024 / 1024 / time; + System.out.println("共耗时:" + time + "s,下载速度: " + (float) (Math.round(speed * 100)) / 100 + "Mb/s"); } public static boolean rename(String from, String to) { @@ -64,10 +70,4 @@ public static boolean rename(String from, String to) { return false; } - public static void printDownloadReport(int length, long start, long end) { - int time = (int) ((end - start) / 1000); - float speed = (float) length / 1024 / 1024 / time; - System.out.println("共耗时:" + time + "s,下载速度: " + (float) (Math.round(speed * 100)) / 100 + "Mb/s"); - } - } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/download/FileDownloader.java b/group12/382266293/src/com/coderising/download/FileDownloader.java index 671ff7243c..311ebede84 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloader.java +++ b/group12/382266293/src/com/coderising/download/FileDownloader.java @@ -9,20 +9,45 @@ public class FileDownloader { private final static String EXT = "lyj"; private static DownloadThread[] threadPool; + private static String fileName; + private static String tempName; + private int finishedCount; public String downloadLocation; - String url; ConnectionManager cm; DownloadListener listener; - private static String fileName; - private static String tempName; public FileDownloader(String _url) { this.url = _url; this.finishedCount = 0; } + private boolean checkFinish(int links) { + + while (finishedCount != links) { + try { + Thread.sleep(5000); + System.out.println("Unfinshed threads number: " + (links - finishedCount)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + return true; + } + + private void checkLength(int length, Connection conn) { + if (length <= 0) { + try { + throw new ConnectionException("file does not exist"); + } catch (ConnectionException e) { + e.printStackTrace(); + } finally { + conn.close(); + } + } + } + public void execute() { // 在这里实现你的代码, 注意: 需要用多线程实现下载 // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 @@ -75,44 +100,6 @@ public void execute() { } } - private void checkLength(int length, Connection conn) { - if (length <= 0) { - try { - throw new ConnectionException("file does not exist"); - } catch (ConnectionException e) { - e.printStackTrace(); - } finally { - conn.close(); - } - } - } - - private void setTempName(String name) { - String temp = name.substring(0, name.lastIndexOf(".") + 1) + EXT; - FileDownloader.tempName = downloadLocation + temp; - } - - private void setFileName(String name) { - FileDownloader.fileName = downloadLocation + name; - } - - private void setLocation(String downloadLocation) { - this.downloadLocation = downloadLocation; - } - - private boolean checkFinish(int links) { - - while (finishedCount != links) { - try { - Thread.sleep(5000); - System.out.println("Unfinshed threads number: " + (links - finishedCount)); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - return true; - } - private void freeDownloadThread() { if (threadPool != null) { for (int i = 0; i < threadPool.length; i++) { @@ -134,6 +121,12 @@ public DownloadListener getListener() { return this.listener; } + private void setAndStartThread(DownloadThread downloadThread, String dest) { + downloadThread.setDest(dest); + downloadThread.setFileDownloader(this); + downloadThread.start(); + } + private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, int length) throws ConnectionException { int connectionNumbers = threadPool.length; @@ -156,22 +149,29 @@ private void setAndStartThreadPool(Connection conn, DownloadThread[] threadPool, } } - private void setAndStartThread(DownloadThread downloadThread, String dest) { - downloadThread.setDest(dest); - downloadThread.setFileDownloader(this); - downloadThread.start(); - } - public void setConnectionManager(ConnectionManager ucm) { this.cm = ucm; } - public void setThreadFinished() { - finishedCount++; + private void setFileName(String name) { + FileDownloader.fileName = downloadLocation + name; } public void setListener(DownloadListener listener) { this.listener = listener; } + private void setLocation(String downloadLocation) { + this.downloadLocation = downloadLocation; + } + + private void setTempName(String name) { + String temp = name.substring(0, name.lastIndexOf(".") + 1) + EXT; + FileDownloader.tempName = downloadLocation + temp; + } + + public void setThreadFinished() { + finishedCount++; + } + } diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index 88a5dba40e..b9c458d2a6 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -9,20 +9,20 @@ import com.coderising.download.impl.ConnectionManagerImpl; public class FileDownloaderTest { - boolean downloadFinished = false; + public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; + + public static String picture = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; + + public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; + boolean downloadFinished = false; @Before public void setUp() throws Exception { } - @After public void tearDown() throws Exception { } - public static String qq = "http://sw.bos.baidu.com/sw-search-sp/software/89179b0b248b1/QQ_8.9.20026.0_setup.exe"; - public static String picture = "http://image.beekka.com/blog/201304/bg2013042401.jpg"; - public static String foxmail = "http://sw.bos.baidu.com/sw-search-sp/software/6c7bb8b6674d0/fm728chb379_7.2.8.379_setup.exe"; - @Test public void testDownload() { diff --git a/group12/382266293/src/com/coderising/download/api/Connection.java b/group12/382266293/src/com/coderising/download/api/Connection.java index 11a0eab3d8..53293962a0 100644 --- a/group12/382266293/src/com/coderising/download/api/Connection.java +++ b/group12/382266293/src/com/coderising/download/api/Connection.java @@ -4,15 +4,10 @@ public interface Connection { /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * - * @param startPos - * 开始位置, 从0开始 - * @param endPos - * 结束位置 - * @return + * 关闭连接 */ - public byte[] read(int startPos, int endPos) throws IOException; + + public void close(); /** * 得到数据内容的长度 @@ -21,15 +16,20 @@ public interface Connection { */ public int getContentLength(); - /** - * 关闭连接 - */ + public String getFileName(); - public void close(); + public boolean isFinished(); - public String getFileName(); + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * + * @param startPos + * 开始位置, 从0开始 + * @param endPos + * 结束位置 + * @return + */ + public byte[] read(int startPos, int endPos) throws IOException; public void setFinished(); - - public boolean isFinished(); } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java index a4fa5c15ad..7c772bc665 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionImpl.java @@ -12,8 +12,8 @@ public class ConnectionImpl implements Connection { - private ConnectionManager cm; private static int buffer_size = 1024; + private ConnectionManager cm; private HttpURLConnection httpConn; private URL url; private boolean finished = false; @@ -28,6 +28,31 @@ public ConnectionImpl(ConnectionManager cm, String _url) { } } + @Override + public void close() { + httpConn.disconnect(); + } + + @Override + public int getContentLength() { + int len = httpConn.getContentLength(); + + return len; + + } + + @Override + public String getFileName() { + String fileName = httpConn.getURL().getFile(); + fileName = fileName.substring(fileName.lastIndexOf('/') + 1); + return fileName; + } + + @Override + public boolean isFinished() { + return finished; + } + @Override public byte[] read(int startPos, int endPos) throws IOException { InputStream in = null; @@ -60,34 +85,9 @@ public byte[] read(int startPos, int endPos) throws IOException { return null; } - @Override - public int getContentLength() { - int len = httpConn.getContentLength(); - - return len; - - } - - @Override - public void close() { - httpConn.disconnect(); - } - - @Override - public String getFileName() { - String fileName = httpConn.getURL().getFile(); - fileName = fileName.substring(fileName.lastIndexOf('/') + 1); - return fileName; - } - @Override public void setFinished() { finished = true; } - @Override - public boolean isFinished() { - return finished; - } - } diff --git a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java index 122073e37b..c4634733d5 100644 --- a/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ b/group12/382266293/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -16,6 +16,15 @@ public ConnectionManagerImpl() { this.connections = 0; } + private void checkConnectionSize() { + if (connections > MAX_CONNECTION_SIZE) + try { + throw new NoFreeSourceException("No free connections available."); + } catch (NoFreeSourceException e) { + e.printStackTrace(); + } + } + @Override public Connection open(String url) throws ConnectionException { this.url = url; @@ -33,13 +42,4 @@ public Connection open(String url) throws ConnectionException { return null; } - private void checkConnectionSize() { - if (connections > MAX_CONNECTION_SIZE) - try { - throw new NoFreeSourceException("No free connections available."); - } catch (NoFreeSourceException e) { - e.printStackTrace(); - } - } - } diff --git a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java index 834a68d702..34521a5cd7 100644 --- a/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java +++ b/group12/382266293/src/com/coderising/download/impl/DownloadUtil.java @@ -6,10 +6,6 @@ public class DownloadUtil { - public static long getCurrentTime() { - return System.currentTimeMillis(); - } - public static void createTempFile(String tempName, int len) { File file = new File(tempName); if (file.exists()) { @@ -41,4 +37,8 @@ public static void createTempFile(String tempName, int len) { } } + public static long getCurrentTime() { + return System.currentTimeMillis(); + } + } diff --git a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java index 68a628ec61..99c0183e02 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group12/382266293/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,52 +1,18 @@ package com.coderising.jvm.attr; -import java.io.UnsupportedEncodingException; +import java.util.Arrays; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - //this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); - System.out.println("attrIndex " + attrNameIndex); - int attrLen = iter.nextU4ToInt(); int maxStack = iter.nextU2ToInt(); @@ -57,11 +23,13 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ System.out.println("codeLen " + codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, "Code"); - String code = iter.nextUxToHexString(codeLen); - System.out.println("Code is " + code); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); + + System.out.println("Code is " + code); + System.out.println(Arrays.toString(cmds)); int exceptionTableLen = iter.nextU2ToInt(); @@ -104,6 +72,35 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ return codeAttr; } + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public String getCode() { + return code; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } private void setStackMapTable(StackMapTable t) { @@ -111,8 +108,22 @@ private void setStackMapTable(StackMapTable t) { } - - + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); - private static class LineNumberItem{ int startPC; int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } public int getLineNum() { return lineNum; } + public int getStartPC() { + return startPC; + } public void setLineNum(int lineNum) { this.lineNum = lineNum; } + public void setStartPC(int startPC) { + this.startPC = startPC; + } } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + + int attrLen = iter.nextU4ToInt(); + + int line_number_table_length = iter.nextU2ToInt(); + + LineNumberTable lnt = new LineNumberTable(attrNameIndex, attrLen); + + + for (int i = 0; i < line_number_table_length; i++) { + + LineNumberItem lni = new LineNumberItem(); + + int start_pc = iter.nextU2ToInt(); + lni.setStartPC(start_pc); + + int line_number = iter.nextU2ToInt(); + lni.setLineNum(line_number); + + lnt.addLineNumberItem(lni); + } + + + + return lnt; } + List items = new ArrayList(); public LineNumberTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); } diff --git a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java index 3eb2654e36..80f3af5cd5 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java +++ b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -6,34 +6,34 @@ public class LocalVariableItem { private int nameIndex; private int descIndex; private int index; - public int getStartPC() { - return startPC; + public int getDescIndex() { + return descIndex; } - public void setStartPC(int startPC) { - this.startPC = startPC; + public int getIndex() { + return index; } public int getLength() { return length; } - public void setLength(int length) { - this.length = length; - } public int getNameIndex() { return nameIndex; } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; + public int getStartPC() { + return startPC; } public void setDescIndex(int descIndex) { this.descIndex = descIndex; } - public int getIndex() { - return index; - } public void setIndex(int index) { this.index = index; } + public void setLength(int length) { + this.length = length; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } } diff --git a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java index fa69dc9bdb..8a63e31269 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java +++ b/group12/382266293/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -5,24 +5,67 @@ import java.util.List; import com.coderising.jvm.constant.ConstantPool; - import com.coderising.jvm.loader.ByteCodeIterator; public class LocalVariableTable extends AttributeInfo{ - List items = new ArrayList(); + public static LocalVariableTable parse(ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + + int attrLen = iter.nextU4ToInt(); + + int local_variable_table_length = iter.nextU2ToInt(); + + LocalVariableTable lvt = new LocalVariableTable(attrNameIndex, attrLen); + + + for (int i = 0; i < local_variable_table_length; i++) { + + LocalVariableItem lvi = new LocalVariableItem(); + + int start_pc = iter.nextU2ToInt(); + lvi.setStartPC(start_pc); + + int length = iter.nextU2ToInt(); + lvi.setLength(length); + + int name_index = iter.nextU2ToInt(); + lvi.setNameIndex(name_index); + + int desc_index = iter.nextU2ToInt(); + lvi.setDescIndex(desc_index); + + int index = iter.nextU2ToInt(); + lvi.setIndex(index); + + lvt.addLocalVariableItem(lvi); + } + + return lvt; + } + List items = new ArrayList(); + public LocalVariableTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; - } + private void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } + } diff --git a/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java b/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java index 44c5d90d46..0dd885a940 100644 --- a/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java +++ b/group12/382266293/src/com/coderising/jvm/attr/StackMapTable.java @@ -5,12 +5,6 @@ public class StackMapTable extends AttributeInfo{ - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - public static StackMapTable parse(ByteCodeIterator iter){ int index = iter.nextU2ToInt(); int len = iter.nextU4ToInt(); @@ -23,6 +17,12 @@ public static StackMapTable parse(ByteCodeIterator iter){ return t; } + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + private void setOriginalCode(String code) { this.originalCode = code; diff --git a/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java b/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java index 17dd61f8b6..20e86330df 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java +++ b/group12/382266293/src/com/coderising/jvm/clz/AccessFlag.java @@ -3,6 +3,11 @@ import com.coderising.jvm.loader.ByteCodeIterator; public class AccessFlag { + public static AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); + return accessFlag; + } + private int flagValue; public AccessFlag(int value) { @@ -13,20 +18,15 @@ public int getFlagValue() { return flagValue; } - public void setFlagValue(int flag) { - this.flagValue = flag; + public boolean isFinalClass() { + return (this.flagValue & 0x0010) != 0; } public boolean isPublicClass() { return (this.flagValue & 0x0001) != 0; } - public boolean isFinalClass() { - return (this.flagValue & 0x0010) != 0; - } - - public static AccessFlag parseAccessFlag(ByteCodeIterator iter) { - AccessFlag accessFlag = new AccessFlag(iter.nextU2ToInt()); - return accessFlag; + public void setFlagValue(int flag) { + this.flagValue = flag; } } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java index 6e37d03643..111cb247d3 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java +++ b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java @@ -5,6 +5,7 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; @@ -19,45 +20,57 @@ public class ClassFile { private List fields = new ArrayList(); private List methods = new ArrayList(); - public ClassIndex getClzIndex() { - return clzIndex; + public void addField(Field field) { + + this.fields.add(field); + + } + + public void addMethod(Method method) { + + this.methods.add(method); + } public AccessFlag getAccessFlag() { return accessFlag; } - public void setAccessFlag(AccessFlag accessFlag) { - this.accessFlag = accessFlag; + public String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public ClassIndex getClzIndex() { + return clzIndex; } public ConstantPool getConstantPool() { return pool; } - public int getMinorVersion() { - return minorVersion; - } + public List getFields() { - public void setMinorVersion(int minorVersion) { - this.minorVersion = minorVersion; + return fields; } public int getMajorVersion() { return majorVersion; } - public void setMajorVersion(int majorVersion) { - this.majorVersion = majorVersion; - } + public List getMethods() { - public void setConstPool(ConstantPool pool) { - this.pool = pool; + return methods; + } + public int getMinorVersion() { + return minorVersion; } - public void setClassIndex(ClassIndex clzIndex) { - this.clzIndex = clzIndex; + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); } public void print() { @@ -71,20 +84,17 @@ public void print() { } - private String getClassName() { - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); + public void setAccessFlag(AccessFlag accessFlag) { + this.accessFlag = accessFlag; } - private String getSuperClassName() { - ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); + public void setClassIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; } + + public void setConstPool(ConstantPool pool) { + this.pool = pool; - public List getFields() { - - return fields; } public void setFields(List fields) { @@ -92,16 +102,9 @@ public void setFields(List fields) { this.fields = fields; } - - public void addField(Field field) { - - this.fields.add(field); - - } - public List getMethods() { - - return methods; + public void setMajorVersion(int majorVersion) { + this.majorVersion = majorVersion; } public void setMethods(List methods) { @@ -110,9 +113,40 @@ public void setMethods(List methods) { } - public void addMethod(Method method) { + public void setMinorVersion(int minorVersion) { + this.minorVersion = minorVersion; + } + + + public Method getMethod(String methodName, String paramAndReturnType){ + - this.methods.add(method); + for (Method m : methods) { + + int nameIndex = m.getNameIndex(); + int descriptorIndex= m.getDescriptorIndex(); + String name = ((UTF8Info)pool.getConstantInfo(nameIndex)).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(descriptorIndex)).getValue(); + if (name.equals(methodName) && desc.equals(paramAndReturnType)) { + return m; + } + } + + return null; + } + public Method getMainMethod(){ + + for (Method m : methods) { + + int nameIndex = m.getNameIndex(); + int descriptorIndex= m.getDescriptorIndex(); + String name = ((UTF8Info)pool.getConstantInfo(nameIndex)).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(descriptorIndex)).getValue(); + if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { + return m; + } + } + return null; } } diff --git a/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java b/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java index 0212bc9fb3..213fb9163f 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java +++ b/group12/382266293/src/com/coderising/jvm/clz/ClassIndex.java @@ -4,19 +4,19 @@ 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 int getThisClassIndex() { + return thisClassIndex; + } + public void setSuperClassIndex(int superClassIndex) { this.superClassIndex = superClassIndex; } + + public void setThisClassIndex(int thisClassIndex) { + this.thisClassIndex = thisClassIndex; + } } \ No newline at end of file diff --git a/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java b/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..9a4be8a37a --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,179 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + List cmds = new ArrayList(); + codes = codes.toUpperCase(); + CommandIterator iter = new CommandIterator(codes); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + + NewObjectCmd cmd = new NewObjectCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + + GetFieldCmd cmd = new GetFieldCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + + PutFieldCmd cmd = new PutFieldCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile,opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + + LdcCmd cmd = new LdcCmd(clzFile,opCode); + + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + + BiPushCmd cmd = new BiPushCmd(clzFile,opCode); + + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + calculateOffset(cmds); + + + } + + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + + + return result; + } + + private static void calculateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java b/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java index 4b593e7347..b6ddbad601 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ClassInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class ClassInfo extends ConstantInfo { private int type = ConstantInfo.CLASS_INFO; private int utf8Index; @@ -8,6 +10,17 @@ public ClassInfo(ConstantPool pool) { super(pool); } + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } + + @Override + public int getType() { + return type; + } + public int getUtf8Index() { return utf8Index; } @@ -16,13 +29,9 @@ public void setUtf8Index(int utf8Index) { this.utf8Index = utf8Index; } - public int getType() { - return type; + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); } - public String getClassName() { - int index = getUtf8Index(); - UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); - return utf8Info.getValue(); - } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java b/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java index 96845046b3..a2d0153f93 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ConstantInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public abstract class ConstantInfo { public static final int UTF8_INFO = 1; public static final int FLOAT_INFO = 4; @@ -19,14 +21,16 @@ public ConstantInfo(ConstantPool pool) { pool.addConstantInfo(this); } - public abstract int getType(); + public ConstantInfo getConstantInfo(int index) { + return this.constantPool.getConstantInfo(index); + } public ConstantPool getConstantPool() { return constantPool; } - public ConstantInfo getConstantInfo(int index) { - return this.constantPool.getConstantInfo(index); - } + public abstract int getType(); + + public abstract void accept(PrintVisitor visitor); } diff --git a/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java b/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java index 95c44dde8f..40f95c7d77 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group12/382266293/src/com/coderising/jvm/constant/ConstantPool.java @@ -21,12 +21,17 @@ public ConstantInfo getConstantInfo(int index) { //System.out.println(this.constantInfos.get(index)); return this.constantInfos.get(index); } + + public List getConstantInfos() { - public String getUTF8String(int index) { - return ((UTF8Info) this.constantInfos.get(index)).getValue(); + return constantInfos; } - public Object getSize() { + public int getSize() { return this.constantInfos.size() - 1; } + + public String getUTF8String(int index) { + return ((UTF8Info) this.constantInfos.get(index)).getValue(); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java index e9f34e550c..7e353c3009 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class FieldRefInfo extends ConstantInfo { private int type = ConstantInfo.FIELD_INFO; private int classInfoIndex; @@ -9,33 +11,10 @@ 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()); @@ -55,4 +34,34 @@ public String getFieldType() { NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + @Override + public int getType() { + return type; + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + @Override + public String toString() { + + NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); + + return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]"; + } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java index d58de16f72..05882cd5f2 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class MethodRefInfo extends ConstantInfo { private int type = ConstantInfo.METHOD_INFO; @@ -11,31 +13,10 @@ 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()); @@ -48,10 +29,38 @@ public String getMethodName() { return typeInfo.getName(); } + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + public String getParamAndReturnType() { ConstantPool pool = this.getConstantPool(); NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public int getType() { + return type; + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + @Override + public String toString() { + + return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType(); + } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + } + } diff --git a/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java index a792e2dc13..78dbe514b3 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class NameAndTypeInfo extends ConstantInfo { public int type = ConstantInfo.NAME_AND_TYPE_INFO; @@ -14,35 +16,42 @@ 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(); } + @Override + public int getType() { + return type; + } + public String getTypeInfo() { ConstantPool pool = this.getConstantPool(); UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2); return utf8Info2.getValue(); } + public void setIndex1(int index1) { + this.index1 = index1; + } + + public void setIndex2(int index2) { + this.index2 = index2; + } + + @Override public String toString() { return "(" + getName() + "," + getTypeInfo() + ")"; } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java b/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java index 7d1abf7699..a787901905 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class NullConstantInfo extends ConstantInfo { public NullConstantInfo() { @@ -11,4 +13,13 @@ public int getType() { return -1; } + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + + } + + + + } diff --git a/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java b/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java index 0ea1f6bdac..f713523450 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/StringInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class StringInfo extends ConstantInfo { private int type = ConstantInfo.STRING_INFO; private int index; @@ -8,20 +10,28 @@ public StringInfo(ConstantPool pool) { super(pool); } - public int getType() { - return type; - } - public int getIndex() { return index; } + @Override + public int getType() { + return type; + } + public void setIndex(int index) { this.index = index; } + @Override public String toString() { return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java b/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java index a7e88969a4..f0e548debf 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group12/382266293/src/com/coderising/jvm/constant/UTF8Info.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.print.PrintVisitor; + public class UTF8Info extends ConstantInfo { private int type = ConstantInfo.UTF8_INFO; private int length; @@ -13,12 +15,21 @@ public int getLength() { return length; } + @Override + public int getType() { + return type; + } + + public String getValue() { + return value; + } + public void setLength(int length) { this.length = length; } - public int getType() { - return type; + public void setValue(String value) { + this.value = value; } @Override @@ -26,12 +37,11 @@ public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + ")]"; } - public String getValue() { - return value; + @Override + public void accept(PrintVisitor visitor) { + visitor.visit(this); + } - public void setValue(String value) { - this.value = value; - } } diff --git a/group12/382266293/src/com/coderising/jvm/field/Field.java b/group12/382266293/src/com/coderising/jvm/field/Field.java index 2b0c549685..1349de930d 100644 --- a/group12/382266293/src/com/coderising/jvm/field/Field.java +++ b/group12/382266293/src/com/coderising/jvm/field/Field.java @@ -1,17 +1,34 @@ package com.coderising.jvm.field; -import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; public class Field { + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int access_flags = iter.nextU2ToInt(); + int name_index = iter.nextU2ToInt(); + int descriptor_index = iter.nextU2ToInt(); + int attrbutes_count = iter.nextU2ToInt(); + + if (attrbutes_count != 0) { + throw new RuntimeException("field attrbutes_count is " + attrbutes_count); + } + + Field field = new Field(access_flags,name_index,descriptor_index,pool); + + return field; + } private int accessFlag; private int nameIndex; - private int descriptorIndex; + private int descriptorIndex; + private ConstantPool pool; + + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { @@ -21,28 +38,9 @@ public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool po this.pool = pool; } - - - @Override public String toString() { return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex) ; } - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int access_flags = iter.nextU2ToInt(); - int name_index = iter.nextU2ToInt(); - int descriptor_index = iter.nextU2ToInt(); - int attrbutes_count = iter.nextU2ToInt(); - - if (attrbutes_count != 0) { - throw new RuntimeException("field attrbutes_count is " + attrbutes_count); - } - - Field field = new Field(access_flags,name_index,descriptor_index,pool); - - return field; - } - } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java index 4b554a434a..5fa9ba7661 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -11,59 +11,59 @@ public ByteCodeIterator(byte[] codes) { this.codes = codes; } - public String nextU4ToHexString() { - byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; - return Util.byteToHexString(u4); + public void back(int i) { + currPos = currPos - 2; + } + + public String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); } + public byte[] nextNbytesToHexString(int length) { + byte[] bytes = new byte[length]; + int len = currPos + length; + for(int j = 0; currPos < len; j++) { + bytes[j] = codes[currPos++]; + } + + return bytes; + } + public int nextU1ToInt() { byte[] u1 = new byte[] { codes[currPos++] }; return Util.byteToInt(u1); } - + + public int nextU2ToInt() { byte[] u2 = new byte[] { codes[currPos++], codes[currPos++] }; return Util.byteToInt(u2); } - public int nextU4ToInt() { + public String nextU4ToHexString() { byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; - return Util.byteToInt(u4); + return Util.byteToHexString(u4); } - - public byte[] nextNbytesToHexString(int length) { - byte[] bytes = new byte[length]; - int len = currPos + length; - for(int j = 0; currPos < len; j++) { - bytes[j] = codes[currPos++]; - } - - return bytes; + public int nextU4ToInt() { + byte[] u4 = new byte[] { codes[currPos++], codes[currPos++], codes[currPos++], codes[currPos++] }; + return Util.byteToInt(u4); } - + public String nextUxToHexString(int length) { byte[] codes = nextNbytesToHexString(length); return byteToHexString(codes); } - - public String byteToHexString(byte[] codes) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); - } - - public void back(int i) { - currPos = currPos - 2; - } } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java index 71a8b6fefa..135cf41dee 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -14,10 +14,40 @@ public class ClassFileLoader { private List clzPaths = new ArrayList(); - public byte[] readBinaryCode(String className) { + public void addClassPath(String path) { + clzPaths.add(path); + } - String clzFileName = "//" + className.replaceAll("\\.", "//") + ".class"; - return loadClassFile(clzFileName); + private File getClassFile(String clzFileName) { + + for (String path : clzPaths) { + File file = new File(path + "//" + clzFileName); + if (file.exists()) { + return file; + } + } + return null; + + } + + public String getClassPath() { + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < clzPaths.size(); i++) { + + sb.append(clzPaths.get(i)); + if (i < clzPaths.size() - 1) { + sb.append(";"); + } + + } + + return sb.toString(); + } + + public String getClassPath_V1() { + + return null; } public ClassFile loadClass(String className) throws UnsupportedEncodingException { @@ -65,40 +95,10 @@ private byte[] loadClassFile(String clzFileName) { } - private File getClassFile(String clzFileName) { - - for (String path : clzPaths) { - File file = new File(path + "//" + clzFileName); - if (file.exists()) { - return file; - } - } - return null; - - } - - public void addClassPath(String path) { - clzPaths.add(path); - } - - public String getClassPath_V1() { - - return null; - } - - public String getClassPath() { - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < clzPaths.size(); i++) { - - sb.append(clzPaths.get(i)); - if (i < clzPaths.size() - 1) { - sb.append(";"); - } - - } + public byte[] readBinaryCode(String className) { - return sb.toString(); + String clzFileName = "//" + className.replaceAll("\\.", "//") + ".class"; + return loadClassFile(clzFileName); } } diff --git a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java index e1c997d3d0..b9a2383303 100644 --- a/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/382266293/src/com/coderising/jvm/loader/ClassFileParser.java @@ -1,10 +1,6 @@ package com.coderising.jvm.loader; import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.List; - -import org.junit.Assert; import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; @@ -19,7 +15,6 @@ import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; -import com.coderising.jvm.util.Util; public class ClassFileParser { @@ -42,7 +37,6 @@ public ClassFile parse(byte[] codes) { System.out.println("majorVersion is " + majorVersion); clzFile.setMajorVersion(majorVersion); - ConstantPool pool = parseConstantPool(iter); clzFile.setConstPool(pool); @@ -62,39 +56,6 @@ public ClassFile parse(byte[] codes) { return clzFile; } - private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { - - int methodNum = iter.nextU2ToInt(); - - ConstantPool pool = clzFile.getConstantPool(); - for (int i = 0; i < methodNum; i++) { - Method method = Method.parse(clzFile,iter); - clzFile.addMethod(method); - } - - } - - private void parseFields(ClassFile clzFile, ByteCodeIterator iter) { - - int fieldNum = iter.nextU2ToInt(); - - ConstantPool pool = clzFile.getConstantPool(); - for (int i = 0; i < fieldNum; i++) { - Field field = Field.parse(pool,iter); - clzFile.addField(field); - } - - } - - private void parseInterfaces(ByteCodeIterator iter) { - int interfaceNum = iter.nextU2ToInt(); - - if (0 != interfaceNum) { - throw new RuntimeException("interface parser not finsihed yet, pls check!"); - } - - } - private AccessFlag parseAccessFlag(ByteCodeIterator iter) { return AccessFlag.parseAccessFlag(iter); @@ -136,7 +97,7 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { // utf8-info UTF8Info utf8Info = new UTF8Info(pool); int length = iter.nextU2ToInt(); - System.out.println("length is " + length); + //System.out.println("length is " + length); utf8Info.setLength(length); byte[] bytes = iter.nextNbytesToHexString(length); String value = ""; @@ -145,7 +106,7 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } catch (UnsupportedEncodingException e) { e.printStackTrace(); } - System.out.println("value is " + value); + //System.out.println("value is " + value); utf8Info.setValue(value); } else if (tag == 8) { @@ -188,4 +149,35 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { return pool; } + private void parseFields(ClassFile clzFile, ByteCodeIterator iter) { + + int fieldNum = iter.nextU2ToInt(); + + ConstantPool pool = clzFile.getConstantPool(); + for (int i = 0; i < fieldNum; i++) { + Field field = Field.parse(pool,iter); + clzFile.addField(field); + } + + } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceNum = iter.nextU2ToInt(); + + if (0 != interfaceNum) { + throw new RuntimeException("interface parser not finsihed yet, pls check!"); + } + + } + + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + + int methodNum = iter.nextU2ToInt(); + for (int i = 0; i < methodNum; i++) { + Method method = Method.parse(clzFile,iter); + clzFile.addMethod(method); + } + + } + } diff --git a/group12/382266293/src/com/coderising/jvm/method/Method.java b/group12/382266293/src/com/coderising/jvm/method/Method.java index 3c3e026a40..2bb53cdf06 100644 --- a/group12/382266293/src/com/coderising/jvm/method/Method.java +++ b/group12/382266293/src/com/coderising/jvm/method/Method.java @@ -1,45 +1,27 @@ package com.coderising.jvm.method; -import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ByteCodeIterator; -import com.sun.org.apache.bcel.internal.classfile.Code; public class Method { - + + private int accessFlag; private int nameIndex; + private int descriptorIndex; private CodeAttr codeAttr; - private ClassFile clzFile; - - - public ClassFile getClzFile() { - return clzFile; - } - - public int getNameIndex() { - return nameIndex; - } - public int getDescriptorIndex() { - return descriptorIndex; - } - public CodeAttr getCodeAttr() { - return codeAttr; - } - - public void setCodeAttr(CodeAttr code) { - this.codeAttr = code; - } + private ClassFile clzFile; public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { this.clzFile = clzFile; @@ -47,15 +29,13 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; } - - + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ int access_flags = iter.nextU2ToInt(); int name_index = iter.nextU2ToInt(); int descriptor_index = iter.nextU2ToInt(); int attrbutes_count = iter.nextU2ToInt(); - System.out.println("count1 = " + attrbutes_count); Method method = new Method(clzFile, access_flags,name_index,descriptor_index); @@ -65,10 +45,12 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ iter.back(2); if (AttributeInfo.CODE.equalsIgnoreCase("Code")) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); method.setCodeAttr(codeAttr); + } else { - throw new RuntimeException(att_name + "has not been implemented"); + throw new RuntimeException(att_name + " has not been implemented"); } } @@ -78,4 +60,51 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } + + + + + + + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + + public ClassFile getClzFile() { + return clzFile; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public int getNameIndex() { + return nameIndex; + } + + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } } diff --git a/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java b/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..1f958aac6a --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.print; + +import java.io.UnsupportedEncodingException; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMajorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\steve\\workspace\\coding2017n\\group12\\382266293\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = null; + try { + clzFile = loader.loadClass(className); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..012aeb7001 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.print; + +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter implements PrintVisitor { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + + public void print(){ + + System.out.println("Constant Pool:"); + int size = pool.getSize(); + + for (int i = 1; i <= size; i++) { + ConstantInfo info = pool.getConstantInfo(i); + System.out.print("#" + i + " = "); + info.accept(this); + } + + } + + @Override + public void visit(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + } + + @Override + public void visit(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visit(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visit(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visit(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visit(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + + + @Override + public void visit(NullConstantInfo nullConstantInfo) { + + } + +} diff --git a/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java b/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java new file mode 100644 index 0000000000..31aa70b955 --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/print/PrintVisitor.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public interface PrintVisitor { + + void visit(ClassInfo pool); + void visit(FieldRefInfo info); + void visit(MethodRefInfo info); + void visit(NameAndTypeInfo info); + void visit(StringInfo info); + void visit(UTF8Info info); + void visit(NullConstantInfo nullConstantInfo); + +} diff --git a/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java index d4f255a763..883ad99c05 100644 --- a/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group12/382266293/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,7 +1,6 @@ package com.coderising.jvm.test; import java.io.UnsupportedEncodingException; -import java.util.Arrays; import java.util.List; import org.junit.After; @@ -11,7 +10,15 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.constant.*; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; import com.coderising.jvm.method.Method; @@ -20,9 +27,8 @@ public class ClassFileloaderTest { static String path1 = "C:\\Users\\steve\\workspace\\coding2017n\\group12\\382266293\\bin"; static String path2 = "C:\temp"; - String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static ClassFile clzFile = null; + static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); @@ -36,6 +42,30 @@ public class ClassFileloaderTest { } clzFile.print(); } + String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + private String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } @Before public void setUp() throws Exception { @@ -45,19 +75,6 @@ public void setUp() throws Exception { public void tearDown() throws Exception { } - @Test - public void testClassPath() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1 + ";" + path2, clzPath); - - } - @Test public void testClassFileLength() { @@ -74,37 +91,26 @@ public void testClassFileLength() { } @Test - public void testMagicNumber() { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; - - String acctualValue = this.byteToHexString(codes); + public void testClassIndex() { - Assert.assertEquals("cafebabe", acctualValue); - } + ClassIndex clzIndex = clzFile.getClzIndex(); + ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex()); + ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex()); - private String byteToHexString(byte[] codes) { - StringBuffer buffer = new StringBuffer(); - for (int i = 0; i < codes.length; i++) { - byte b = codes[i]; - int value = b & 0xFF; - String strHex = Integer.toHexString(value); - if (strHex.length() < 2) { - strHex = "0" + strHex; - } - buffer.append(strHex); - } - return buffer.toString(); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); + Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } @Test - public void testVersion() { + public void testClassPath() { - Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); } @@ -177,31 +183,19 @@ public void testConstantPool() { } @Test - public void testClassIndex() { + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; - ClassIndex clzIndex = clzFile.getClzIndex(); - ClassInfo thisClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex()); - ClassInfo superClassInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex()); + String acctualValue = this.byteToHexString(codes); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); - Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); + Assert.assertEquals("cafebabe", acctualValue); } - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } @Test public void testMethods(){ @@ -247,15 +241,102 @@ public void testMethods(){ "bb000159122b101db7002d4c2bb6002fb1"); } } + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + } + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + } diff --git a/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java b/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java index d36b122f60..9a36573dd3 100644 --- a/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java +++ b/group12/382266293/src/com/coderising/jvm/test/EmployeeV1.java @@ -1,30 +1,28 @@ package com.coderising.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(); - - } + 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/382266293/src/com/coderising/jvm/util/Util.java b/group12/382266293/src/com/coderising/jvm/util/Util.java index 1f9e087bb9..c2042deaac 100644 --- a/group12/382266293/src/com/coderising/jvm/util/Util.java +++ b/group12/382266293/src/com/coderising/jvm/util/Util.java @@ -1,11 +1,6 @@ package com.coderising.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 < codes.length; i++) { @@ -19,4 +14,9 @@ public static String byteToHexString(byte[] codes) { } return buffer.toString(); } + + public static int byteToInt(byte[] codes) { + String s1 = byteToHexString(codes); + return Integer.valueOf(s1, 16).intValue(); + } } diff --git a/group12/382266293/src/com/coderising/litestruts/LoginAction.java b/group12/382266293/src/com/coderising/litestruts/LoginAction.java index 95fd144d4d..7d1cf06a48 100644 --- a/group12/382266293/src/com/coderising/litestruts/LoginAction.java +++ b/group12/382266293/src/com/coderising/litestruts/LoginAction.java @@ -11,14 +11,6 @@ public class LoginAction { private String password; private String message; - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - public String execute() { if ("test".equals(name) && "1234".equals(password)) { this.message = "login successful"; @@ -28,6 +20,18 @@ public String execute() { return "fail"; } + public String getMessage() { + return this.message; + } + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + public void setName(String name) { this.name = name; } @@ -35,8 +39,4 @@ public void setName(String name) { public void setPassword(String password) { this.password = password; } - - public String getMessage() { - return this.message; - } } \ No newline at end of file diff --git a/group12/382266293/src/litestruts/ActionXMLreader.java b/group12/382266293/src/litestruts/ActionXMLreader.java index 92e700edc4..53d815c174 100644 --- a/group12/382266293/src/litestruts/ActionXMLreader.java +++ b/group12/382266293/src/litestruts/ActionXMLreader.java @@ -1,6 +1,7 @@ package litestruts; import java.util.List; + import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; diff --git a/group12/382266293/src/litestruts/Configuration.java b/group12/382266293/src/litestruts/Configuration.java index 731a4218b0..44b85c9b45 100644 --- a/group12/382266293/src/litestruts/Configuration.java +++ b/group12/382266293/src/litestruts/Configuration.java @@ -1,25 +1,47 @@ package litestruts; +import static util.Print.println; + import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; + import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; -import static util.Print.*; public class Configuration { - Map actions = new HashMap<>(); + private static class ActionCfg { - private static Configuration cfg = new Configuration(); + String name; + String clz; + Map viewResult = new HashMap<>(); - private Configuration() { + public ActionCfg(String name, String clz) { + this.name = name; + this.clz = clz; + } + + public void addViewResult(String result, String jsp) { + viewResult.put(result, jsp); + + } + + public String getClassName() { + return clz; + } + + public Map getViewResult() { + return viewResult; + } } + private static Configuration cfg = new Configuration(); + public static Configuration getNewInstance() { if (cfg == null) { @@ -28,6 +50,36 @@ public static Configuration getNewInstance() { return cfg; } + public static void main(String[] args) { + Configuration cfg = new Configuration(); + cfg.parse("struts.xml"); + String clz = cfg.getClassName("login"); + println(clz); + + } + + Map actions = new HashMap<>(); + + private Configuration() { + + } + + public String getClassName(String action) { + ActionCfg cfg = this.actions.get(action); + if (cfg == null) { + return null; + } + return cfg.getClassName(); + } + + public String getResultView(String action, String resultName) { + ActionCfg cfg = this.actions.get(action); + if (cfg == null) { + return null; + } + return cfg.getViewResult().get(resultName); + } + public void parse(String fileName) { String src = this.getClass().getPackage().getName(); @@ -73,54 +125,4 @@ public void parseXML(InputStream is) { } } - public String getClassName(String action) { - ActionCfg cfg = this.actions.get(action); - if (cfg == null) { - return null; - } - return cfg.getClassName(); - } - - public String getResultView(String action, String resultName) { - ActionCfg cfg = this.actions.get(action); - if (cfg == null) { - return null; - } - return cfg.getViewResult().get(resultName); - } - - public static void main(String[] args) { - Configuration cfg = new Configuration(); - cfg.parse("struts.xml"); - String clz = cfg.getClassName("login"); - println(clz); - - } - - private static class ActionCfg { - - String name; - String clz; - Map viewResult = new HashMap<>(); - - public Map getViewResult() { - return viewResult; - } - - public ActionCfg(String name, String clz) { - this.name = name; - this.clz = clz; - } - - public void addViewResult(String result, String jsp) { - viewResult.put(result, jsp); - - } - - public String getClassName() { - return clz; - } - - } - } diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index b84e2e6264..2371cdbcd8 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -1,6 +1,5 @@ package litestruts; -import util.ActionXMLreader; import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -9,33 +8,26 @@ import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; + import org.dom4j.Node; +import util.ActionXMLreader; + public class Struts { private static Object actionObj = null; private static String address = "src/litestruts/struts.xml"; private static ActionXMLreader reader = new ActionXMLreader(); - @SuppressWarnings("unchecked") - public static View runAction(String actionName, Map parameters) { - - Node root = reader.getRootNode(address); - String clazz = reader.parseClass(root, actionName); - actionObj = getObj(clazz); - BeanInfo bi = getBeanInfo(actionObj); - PropertyDescriptor[] pd = bi.getPropertyDescriptors(); - - setParameters(actionObj, pd, parameters); - String executeResult = getResult(actionObj, bi, "execute"); - String jsp = reader.parseResult(root, actionName, executeResult); - Map readParamters = getReadParameters(actionObj, pd); - - View view = new View(); - view.setJsp(jsp); - view.setParameters(readParamters); + private static BeanInfo getBeanInfo(Object obj) { - return view; + BeanInfo bi = null; + try { + bi = Introspector.getBeanInfo(obj.getClass(), Object.class); + } catch (IntrospectionException e) { + e.printStackTrace(); + } + return bi; } private static Object getObj(String clazz) { @@ -53,28 +45,22 @@ private static Object getObj(String clazz) { return null; } - private static BeanInfo getBeanInfo(Object obj) { - - BeanInfo bi = null; - try { - bi = Introspector.getBeanInfo(obj.getClass(), Object.class); - } catch (IntrospectionException e) { - e.printStackTrace(); - } - return bi; - } + @SuppressWarnings("rawtypes") + public static Map getReadParameters(Object obj, PropertyDescriptor[] pd) { - private static void setParameters(Object obj, PropertyDescriptor[] pd, Map parameters) { + Map viewParams = new HashMap(); for (int i = 0; i < pd.length; i++) { - String name = pd[i].getName(); - if (parameters.containsKey(name)) - try { - pd[i].getWriteMethod().invoke(obj, parameters.get(name)); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } + String readMethod = pd[i].getReadMethod().getName().substring(3); + String value = null; + try { + value = (String) pd[i].getReadMethod().invoke(obj); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + viewParams.put(readMethod.toLowerCase(), value); } + return viewParams; } private static String getResult(Object obj, BeanInfo bi, String execute) { @@ -91,22 +77,38 @@ private static String getResult(Object obj, BeanInfo bi, String execute) { return null; } - @SuppressWarnings("rawtypes") - public static Map getReadParameters(Object obj, PropertyDescriptor[] pd) { + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters) { - Map viewParams = new HashMap(); + Node root = reader.getRootNode(address); + String clazz = reader.parseClass(root, actionName); + actionObj = getObj(clazz); + BeanInfo bi = getBeanInfo(actionObj); + PropertyDescriptor[] pd = bi.getPropertyDescriptors(); + + setParameters(actionObj, pd, parameters); + String executeResult = getResult(actionObj, bi, "execute"); + String jsp = reader.parseResult(root, actionName, executeResult); + Map readParamters = getReadParameters(actionObj, pd); + + View view = new View(); + view.setJsp(jsp); + view.setParameters(readParamters); + + return view; + } + + private static void setParameters(Object obj, PropertyDescriptor[] pd, Map parameters) { for (int i = 0; i < pd.length; i++) { - String readMethod = pd[i].getReadMethod().getName().substring(3); - String value = null; - try { - value = (String) pd[i].getReadMethod().invoke(obj); - } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); - } - viewParams.put(readMethod.toLowerCase(), value); + String name = pd[i].getName(); + if (parameters.containsKey(name)) + try { + pd[i].getWriteMethod().invoke(obj, parameters.get(name)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } } - return viewParams; } } \ No newline at end of file diff --git a/group12/382266293/src/litestruts/StrutsTest.java b/group12/382266293/src/litestruts/StrutsTest.java index b450d7a935..8d70a91cb3 100644 --- a/group12/382266293/src/litestruts/StrutsTest.java +++ b/group12/382266293/src/litestruts/StrutsTest.java @@ -9,30 +9,30 @@ public class StrutsTest { @Test - public void testLoginActionSuccess() { - + public void testLoginActionFailed() { String actionName = "login"; - Map params = new HashMap(); params.put("name", "test"); - params.put("password", "1234"); + params.put("password", "123456"); // 密码和预设的不一致 View view = Struts.runAction(actionName, params); - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); } @Test - public void testLoginActionFailed() { + public void testLoginActionSuccess() { + String actionName = "login"; + Map params = new HashMap(); params.put("name", "test"); - params.put("password", "123456"); // 密码和预设的不一致 + params.put("password", "1234"); View view = Struts.runAction(actionName, params); - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); } } diff --git a/group12/382266293/src/litestruts/View.java b/group12/382266293/src/litestruts/View.java index 0c917dcb35..41152f3214 100644 --- a/group12/382266293/src/litestruts/View.java +++ b/group12/382266293/src/litestruts/View.java @@ -10,15 +10,15 @@ public String getJsp() { return jsp; } + public Map getParameters() { + return parameters; + } + public View setJsp(String jsp) { this.jsp = jsp; return this; } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { this.parameters = parameters; return this; diff --git a/group12/382266293/src/test.java b/group12/382266293/src/test.java index b3a32d2556..3910b896af 100644 --- a/group12/382266293/src/test.java +++ b/group12/382266293/src/test.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.net.URL; import java.util.LinkedList; + import sun.net.www.protocol.http.HttpURLConnection; public class test { @@ -16,30 +17,6 @@ public class test { public static String tempName = ""; public static String fileName = ""; - LinkedList a; - - private static void createTempFile1(String from) { - long length = 0; - URL url = null; - HttpURLConnection conn = null; - try { - url = new URL(from); - conn = (HttpURLConnection) url.openConnection(); - String file = conn.getURL().getFile(); - fileName = file.substring(file.lastIndexOf('/') + 1); - tempName = fileName.substring(0, fileName.lastIndexOf('.') + 1) + "lyj"; - length = conn.getContentLength(); - conn.disconnect(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - conn.disconnect(); - } - tempName = downloadLocation + tempName; - fileName = downloadLocation + fileName; - bufferFile(tempName, length); - } - public static void bufferFile(String name, long len) { FileOutputStream temp = null; @@ -66,6 +43,28 @@ public static void bufferFile(String name, long len) { } } + private static void createTempFile1(String from) { + long length = 0; + URL url = null; + HttpURLConnection conn = null; + try { + url = new URL(from); + conn = (HttpURLConnection) url.openConnection(); + String file = conn.getURL().getFile(); + fileName = file.substring(file.lastIndexOf('/') + 1); + tempName = fileName.substring(0, fileName.lastIndexOf('.') + 1) + "lyj"; + length = conn.getContentLength(); + conn.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + conn.disconnect(); + } + tempName = downloadLocation + tempName; + fileName = downloadLocation + fileName; + bufferFile(tempName, length); + } + public static void download(String src) { createTempFile1(src); @@ -95,6 +94,12 @@ public static void download(String src) { } + public static void main(String[] args) throws IOException { + + download(url2); + + } + public static boolean rename(String temp) { File file = new File(temp); File f1 = new File(fileName); @@ -107,10 +112,6 @@ public static boolean rename(String temp) { return false; } - public static void main(String[] args) throws IOException { - - download(url2); - - } + LinkedList a; } diff --git a/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java b/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java b/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..ee7d423c3b --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + + return null; + } + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + + + + +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java b/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..d88752e323 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + + +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..e4d3df0e77 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java b/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group12/446031103/src/com/coderising/jvm/field/Field.java b/group12/446031103/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..0d1c64587c --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,33 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + return null; + } + +} diff --git a/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java index 9c9fac2839..6fb5570dff 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -1,5 +1,57 @@ package com.coderising.jvm.loader; -public class ByteCodeIterator { +import java.util.Arrays; +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } } diff --git a/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java b/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java index 33185d8175..070a0ba10b 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -9,7 +9,7 @@ import java.util.List; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang.StringUtils; import com.coderising.jvm.clz.ClassFile; diff --git a/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java b/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java index 8e29f14a0c..a30cb22ad1 100644 --- a/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group12/446031103/src/com/coderising/jvm/loader/ClassFileParser.java @@ -13,32 +13,139 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFileParser { public ClassFile parse(byte[] codes) { - + ClassFile clzFile = new ClassFile(); + + ByteCodeIterator iter = new ByteCodeIterator(codes); + + String magicNumber = iter.nextU4ToHexString(); + + if (!"cafebabe".equals(magicNumber)) { + return null; + } + + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); - return null; + ClassIndex clzIndex = parseClassInfex(iter); + clzFile.setClassIndex(clzIndex); + + parseInterfaces(iter); + + + return clzFile; } private AccessFlag parseAccessFlag(ByteCodeIterator iter) { - return null; + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + // System.out.println("Is public class: " + flag.isPublicClass()); + // System.out.println("Is final class : " + flag.isFinalClass()); + + return flag; } private ClassIndex parseClassInfex(ByteCodeIterator iter) { - return null; + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + + ClassIndex clzIndex = new ClassIndex(); + + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + + return clzIndex; } private ConstantPool parseConstantPool(ByteCodeIterator iter) { - return null; + int constPoolCount = iter.nextU2ToInt(); + + System.out.println("Constant Pool Count :" + constPoolCount); + + ConstantPool pool = new ConstantPool(); + + pool.addConstantInfo(new NullConstantInfo()); + + for (int i = 1; i <= constPoolCount - 1; i++) { + + int tag = iter.nextU1toInt(); + + if (tag == 7) { + // Class Info + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setUtf8Index(utf8Index); + + pool.addConstantInfo(clzInfo); + } else if (tag == 1) { + // UTF-8 String + int len = iter.nextU2ToInt(); + byte[] data = iter.getBytes(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + }else if (tag == 8) { + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == 9) { + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == 10) { + // MethodRef + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == 12) { + // Name and Type Info + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setIndex1(iter.nextU2ToInt()); + nameType.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet."); + } + } + + System.out.println("Finished reading Constant pool "); + + return pool; + } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 } + } diff --git a/group12/446031103/src/com/coderising/jvm/method/Method.java b/group12/446031103/src/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..b57ef592d2 --- /dev/null +++ b/group12/446031103/src/com/coderising/jvm/method/Method.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.method; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + return null; + + } +} diff --git a/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java index 26407abbef..a0cbf7a626 100644 --- a/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group12/446031103/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -23,15 +23,16 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; - static String path2 = "C:\temp"; + //模拟windows中的path,path用;连接,要在这串path中寻找jvm + //static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "E:\\mygit\\coding2017\\group12\\446031103\\bin"; + static String path2 = "E:\temp"; static ClassFile clzFile = null; static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - + String className = "com.coderising.jvm.test.EmployeeV1"; clzFile = loader.loadClass(className); clzFile.print(); } diff --git a/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java b/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java index cdb42d1fdd..00be77f3d0 100644 --- a/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java +++ b/group12/446031103/src/com/datastructure/linklist/LRUPageFrame.java @@ -165,150 +165,6 @@ public String toString(){ return buffer.toString(); } - /*private static class Node { - - Node prev; - Node next; - int pageNum; - - Node(Node prev,Node next,int pageNum) { - this.prev = prev; - this.next = next; - this.pageNum = pageNum; - } - Node(){ - - } - } - - private int capacity; - private int addCnt ; - private int size; - private Node first;// 链表头 - private Node last;// 链表尾 - - - public LRUPageFrame(int capacity) { - - this.capacity = capacity; - first = new Node(); - } - - *//** - * 获取缓存中对象 - * - * @param key - * @return - *//* - public void access(int pageNum) { - if(null==this.last){ - this.last = new Node(this.first,null,pageNum); - this.first.next = this.last; - addCnt++; - size++; - return; - } - if(contain(pageNum)){ - if(Objects.equals(this.first.next.pageNum, pageNum)){ - return; - } - boolean temp = Objects.equals(getLastNode(size).pageNum, pageNum); - Node currentNode = getNode(pageNum); - Node nextNode = currentNode.next; - Node preNode = currentNode.prev; - - currentNode.prev = this.first; - currentNode.next = this.first.next; - this.first.next = currentNode; - - if(temp){ - preNode.next = null; - if(null==preNode.prev) - preNode.prev = currentNode; - }else{ - preNode.prev = currentNode; - preNode.next = nextNode; - nextNode.next = null; - nextNode.prev = preNode; - } - this.last = getLastNode(size); - return; - } - Node addNode = new Node(this.first,this.first.next,pageNum); - Node oldFirstnode=this.first.next ; - oldFirstnode.prev = addNode; - this.first.next = addNode; - if(isOut()){ - - addCnt++; - if(this.size !=this.capacity ) - size++; - if(addCnt>size) - this.last.prev.next = null; - this.last = getLastNode(size); - }else{ - this.last.prev.next = null; - } - - - } - private boolean isOut(){ - return this.addCnt<=this.capacity; - } - - private Node getLastNode(int sizes) { - Node node=this.first; - for (int i = 0; i < sizes; i++) { - node = node.next; - } - return node; - } - - private boolean contain(Object o){ - Node node = this.first; - - while(null!=node.next){ - - node = node.next; - - if(Objects.equals(node.pageNum,o)){ - return true; - } - - } - return false; - } - - private Node getNode(Object o){ - Node node = this.first; - - while(null!=node.next){ - - node = node.next; - - if(Objects.equals(node.pageNum,o)){ - return node; - } - - } - return null; - } - - - - - public String toString(){ - StringBuilder buffer = new StringBuilder(); - Node node = first; - while(node.next != null){ - node = node.next; - buffer.append(node.pageNum); - if(node.next != null){ - buffer.append(","); - } - } - return buffer.toString(); - }*/ } \ No newline at end of file diff --git a/group12/446031103/src/com/datastructure/stack/StackUtil.java b/group12/446031103/src/com/datastructure/stack/StackUtil.java index 7cab99ede3..2d4040d25d 100644 --- a/group12/446031103/src/com/datastructure/stack/StackUtil.java +++ b/group12/446031103/src/com/datastructure/stack/StackUtil.java @@ -7,13 +7,40 @@ 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) { + //错误,面向对象错误 + /*public static void reverse(Stack s) { Stack temp = new Stack(); while(!s.isEmpty()){ temp.push(s.pop()); } s = temp; + }*/ + public static void reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + + Stack tmp = new Stack(); + while(!s.isEmpty()){ + tmp.push(s.pop()); + } + while(!tmp.isEmpty()){ + Object top = tmp.pop(); + addToBottom(s,top); + } + + + } + public static void addToBottom(Stack s, Object value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Object top = s.pop(); + addToBottom(s,value); + s.push(top); + } } + /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 @@ -21,6 +48,9 @@ public static void reverse(Stack s) { * @param o */ public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()){ + return; + } Stack temp = new Stack(); while(!s.isEmpty()){ Object result=s.pop(); @@ -75,7 +105,7 @@ public static boolean isValidPairs(String s){ } } }else{ - char result=c[clength/2+1]; + char result=c[clength/2]; if(contain(result)){ return false; }; @@ -83,7 +113,7 @@ public static boolean isValidPairs(String s){ if(i s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java b/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..503f050d29 --- /dev/null +++ b/group12/446031103/src/com/datastructure/stack/expr/InfixExpr.java @@ -0,0 +1,67 @@ +package com.datastructure.stack.expr; + +import java.util.Objects; +import java.util.Stack; +import java.lang.String; +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + Stack sign = new Stack(); + Stack number = new Stack(); + int strCnt = 0; + int numberLen = 0; + String[] String = expr.split("[^\\d]"); + if(expr!=null){ + for (int i = 0,strLen = expr.length(); i < strLen; i++) { + char c=expr.charAt(i); + if(Objects.equals(c, '+')||Objects.equals(c, '-')){ + sign.push(c); + }else if(Objects.equals(c, '*')||Objects.equals(c, '/')){ + float number1=number.pop(); + float number2=Float.parseFloat(String[strCnt]); + float result=calculate(number1,number2,c); + numberLen = String[strCnt].length(); + number.push(result); + i += numberLen; + strCnt++; + }else{ + number.push(Float.parseFloat(String[strCnt])); + numberLen = String[strCnt].length(); + strCnt++; + i += (numberLen-1); + } + } + for (int i = 0,signS = sign.size(); i < signS; i++) { + float number1 = number.pop(); + float number2 =number.pop(); + char c = sign.pop(); + float result=calculate(number2,number1,c); + number.push(result); + } + } + return number.pop(); + } + + private float calculate(float number1,float number2,char c){ + float result = 0; + if(Objects.equals(c, '+')){ + result = number1 + number2; + }else if(Objects.equals(c, '-')){ + result = number1 - number2; + }else if(Objects.equals(c, '*')){ + result = number1 * number2; + }else if(Objects.equals(c, '/')){ + result = number1 / number2; + } + return result; + } + + + + +} diff --git a/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java b/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..1b64b3fcc7 --- /dev/null +++ b/group12/446031103/src/com/datastructure/stack/expr/InfixExprTest.java @@ -0,0 +1,51 @@ +package com.datastructure.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + float a =expr.evaluate(); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group15/1507_977996067/src/task7/expr/InfixExpr.java b/group15/1507_977996067/src/task7/expr/InfixExpr.java new file mode 100644 index 0000000000..1a18634382 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/InfixExpr.java @@ -0,0 +1,79 @@ +package task7.expr; + +import org.junit.Assert; +import task5.stack.Stack; + +import java.util.Arrays; + +public class InfixExpr { + + private String expr; + + private Stack numberStack = new Stack<>(); + + private Stack resultStack = new Stack<>(); + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + Assert.assertNotNull(expr); + + String[] operators = expr.split("[\\d]+"); + + int length = operators.length; + + Arrays.stream(expr.split("[+\\-*/]+")) + .map(Float::parseFloat) + .forEach(numberStack::push); + + numberStack = reverse(numberStack); + + resultStack.push(numberStack.pop()); + + for (int i = 1; i < length; i++) { + String currentOperator = operators[i]; +// 先做乘除,结果放resultStack里面 + switch (currentOperator) { + case "*": + resultStack.push(resultStack.pop() * numberStack.pop()); + break; + case "/": + resultStack.push(resultStack.pop() / numberStack.pop()); + break; + case "+": + resultStack.push(numberStack.pop()); + break; + case "-": + resultStack.push(numberStack.pop()); + break; + } + } + + resultStack = reverse(resultStack); + +// 做加减 + for (int i = 1; i < length; i++) { + String currentOperator = operators[i]; + if ("+".equals(currentOperator)) { + Float num1 = resultStack.pop(); + Float num2 = resultStack.pop(); + resultStack.push(num1 + num2); + } else if ("-".equals(currentOperator)) { + Float num1 = resultStack.pop(); + Float num2 = resultStack.pop(); + resultStack.push(num1 - num2); + } + } + return resultStack.peek(); + } + + private Stack reverse(Stack stackToReverse) { + Stack temp = new Stack<>(); + while (!stackToReverse.isEmpty()) + temp.push(stackToReverse.pop()); + return temp; + } +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/InfixExprTest.java b/group15/1507_977996067/src/task7/expr/InfixExprTest.java new file mode 100644 index 0000000000..f9eb14cbdf --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/InfixExprTest.java @@ -0,0 +1,56 @@ +package task7.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + + @Test + public void testExprSplit() { + String expr = "3*20+12*5-40/2"; + Arrays.stream(expr.split("[+\\-*/]+")).forEach(System.out::println); + Arrays.stream(expr.split("[\\d]+")).forEach(System.out::println); + } + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/PostfixExpr.java b/group15/1507_977996067/src/task7/expr/PostfixExpr.java new file mode 100644 index 0000000000..369e52c203 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/PostfixExpr.java @@ -0,0 +1,45 @@ +package task7.expr; + +import task5.stack.Stack; + +import java.util.List; + +public class PostfixExpr { + private String expr = null; + + private Stack numberStack = new Stack<>(); + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List parse = new TokenParser().parse(expr); + for (int i = 0; i < parse.size(); i++) { + Token token = parse.get(i); +// 后缀表达式:从左向右遍历 遇到操作数入栈,遇到操作符弹出操作数栈的两个数计算再入栈 + if (token.isNumber()) + numberStack.push((float) token.getIntValue()); + else + numberStack.push(cal(token.toString(), numberStack.pop(), numberStack.pop())); + } + /*while (!operatorStack.isEmpty()) { + numberStack.push(cal(operatorStack.pop(), numberStack.pop(), numberStack.pop())); + }*/ + return numberStack.peek(); + } + + private static float cal(String operator, float var1, float var2) { + switch (operator) { + case "+": + return var2 + var1; + case "-": + return var2 - var1; + case "*": + return var2 * var1; + case "/": + return var2 / var1; + } + return -1; + } +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/PostfixExprTest.java b/group15/1507_977996067/src/task7/expr/PostfixExprTest.java new file mode 100644 index 0000000000..172d397011 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/PostfixExprTest.java @@ -0,0 +1,37 @@ +package task7.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(), 0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(), 0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(), 0.0f); + } + } + +} diff --git a/group15/1507_977996067/src/task7/expr/PrefixExpr.java b/group15/1507_977996067/src/task7/expr/PrefixExpr.java new file mode 100644 index 0000000000..fe5cb137f0 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/PrefixExpr.java @@ -0,0 +1,47 @@ +package task7.expr; + +import task5.stack.Stack; + +import java.util.List; + +public class PrefixExpr { + + private String expr; + + private Stack numberStack = new Stack<>(); + + public PrefixExpr(String expr) { + this.expr = expr; + + } + + public float evaluate() { + List parse = new TokenParser().parse(expr); + for (int i = parse.size() - 1; i >= 0; i--) { + Token token = parse.get(i); +// 前缀表达式:从右向左遍历 遇到操作数入栈,遇到操作符弹出操作数栈的两个数计算再入栈 + if (token.isNumber()) + numberStack.push((float) token.getIntValue()); + else + numberStack.push(cal(token.toString(), numberStack.pop(), numberStack.pop())); + } + /*while (!operatorStack.isEmpty()) { + numberStack.push(cal(operatorStack.pop(), numberStack.pop(), numberStack.pop())); + }*/ + return numberStack.peek(); + } + + private static float cal(String operator, float var1, float var2) { + switch (operator) { + case "+": + return var1 + var2; + case "-": + return var1 - var2; + case "*": + return var1 * var2; + case "/": + return var1 / var2; + } + return -1; + } +} diff --git a/group15/1507_977996067/src/task7/expr/PrefixExprTest.java b/group15/1507_977996067/src/task7/expr/PrefixExprTest.java new file mode 100644 index 0000000000..9ac8f9936f --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/PrefixExprTest.java @@ -0,0 +1,44 @@ +package task7.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(), 0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(), 0.001f); + } + + + } + +} diff --git a/group15/1507_977996067/src/task7/expr/Token.java b/group15/1507_977996067/src/task7/expr/Token.java new file mode 100644 index 0000000000..5ca7b1aef8 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/Token.java @@ -0,0 +1,53 @@ +package task7.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value); + } + + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/expr/TokenParser.java b/group15/1507_977996067/src/task7/expr/TokenParser.java new file mode 100644 index 0000000000..45d75ffc12 --- /dev/null +++ b/group15/1507_977996067/src/task7/expr/TokenParser.java @@ -0,0 +1,57 @@ +package task7.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else { +// System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java b/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..aba714c39b --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package task7.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java b/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..e3784bec44 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/CodeAttr.java @@ -0,0 +1,120 @@ +package task7.jvm.attr; + + +import task7.jvm.clz.ClassFile; +import task7.jvm.cmd.ByteCodeCommand; +import task7.jvm.cmd.CommandParser; +import task7.jvm.constant.ConstantPool; +import task7.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attrNameIndex = iter.next2Bytes(); + int attrLen = iter.next4Bytes(); + int maxStack = iter.next2Bytes(); + int maxLocals = iter.next2Bytes(); + int codeLen = iter.next4Bytes(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + + int exceptionTableLen = iter.next2Bytes(); + //TODO 处理exception + if (exceptionTableLen > 0) { + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.next2Bytes(); + + for (int x = 1; x <= subAttrCount; x++) { + int subAttrIndex = iter.next2Bytes(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + for (int i = 0; i < cmds.length; i++) { + buffer.append(cmds[i].toString(pool)).append("\n"); + } + buffer.append("\n"); + buffer.append(this.lineNumTable.toString()); + buffer.append(this.localVarTable.toString(pool)); + return buffer.toString(); + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java b/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..ebaec852b9 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/LineNumberTable.java @@ -0,0 +1,72 @@ +package task7.jvm.attr; + +import task7.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + + LineNumberTable table = new LineNumberTable(index, len); + + int itemLen = iter.next2Bytes(); + + for (int i = 1; i <= itemLen; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.next2Bytes()); + item.setLineNum(iter.next2Bytes()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for (LineNumberItem item : items) { + buffer.append("startPC:" + item.getStartPC()).append(","); + buffer.append("lineNum:" + item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..fbb27e8812 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package task7.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..7bcf199b3c --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/LocalVariableTable.java @@ -0,0 +1,57 @@ +package task7.jvm.attr; + + +import task7.jvm.constant.ConstantPool; +import task7.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.next2Bytes(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.next2Bytes()); + item.setLength(iter.next2Bytes()); + item.setNameIndex(iter.next2Bytes()); + item.setDescIndex(iter.next2Bytes()); + item.setIndex(iter.next2Bytes()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java b/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..f57144783d --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package task7.jvm.attr; + + +import task7.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo { + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java b/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..e333b4621d --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package task7.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/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java b/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..1587998e29 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/clz/ClassFile.java @@ -0,0 +1,134 @@ +package task7.jvm.clz; + +import task7.jvm.constant.ClassInfo; +import task7.jvm.constant.ConstantPool; +import task7.jvm.field.Field; +import task7.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + + private List fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + + public void setClzIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } + + public ConstantPool getPool() { + return pool; + } + + public void setPool(ConstantPool pool) { + this.pool = pool; + } + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + + public List getMethods() { + return methods; + } + + public void setMethods(List methods) { + this.methods = methods; + } + + 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()); + + + } + + public String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType) { + + for (Method method : methods) { + int nameIndex = method.getNameIndex(); + int descriptorIndex = method.getDescriptorIndex(); + String name = getConstantPool().getUTF8String(nameIndex); + String descriptor = getConstantPool().getUTF8String(descriptorIndex); + if (methodName.equalsIgnoreCase(name) && paramAndReturnType.equalsIgnoreCase(descriptor)) { + return method; + } + } + return null; + } + + public Method getMainMethod() { + + return getMethod("main", "([Ljava/lang/String;)"); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java b/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..b4342d6557 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package task7.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/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..b80f830944 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java b/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..e4c9e2ac2d --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package task7.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + +// public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java b/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..f6a12e1701 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/CommandParser.java @@ -0,0 +1,124 @@ +package task7.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import task7.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + codes = codes.toUpperCase(); + System.out.println("=========> codes: " + codes); + CommandIterator iterator = new CommandIterator(codes); + List commands = new ArrayList<>(); + while (iterator.hasNext()) { + String opCode = iterator.next2CharAsString(); + switch (opCode) { + case new_object: + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, codes); + newObjectCmd.setOprand1(iterator.next2CharAsInt()); + newObjectCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(newObjectCmd); + break; + case ldc: + LdcCmd ldcCmd = new LdcCmd(clzFile, codes); + ldcCmd.setOperand(iterator.next2CharAsInt()); + commands.add(ldcCmd); + break; + case bipush: + BiPushCmd biPushCmd = new BiPushCmd(clzFile, codes); + biPushCmd.setOperand(iterator.next2CharAsInt()); + commands.add(biPushCmd); + break; + case invokespecial: + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, codes); + invokeSpecialCmd.setOprand1(iterator.next2CharAsInt()); + invokeSpecialCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(invokeSpecialCmd); + break; + case invokevirtual: + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, codes); + invokeVirtualCmd.setOprand1(iterator.next2CharAsInt()); + invokeVirtualCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(invokeVirtualCmd); + break; + default: + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, codes); + commands.add(noOperandCmd); + } + } + calcuateOffset(commands); + return commands.toArray(new ByteCodeCommand[commands.size()]); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16); + } + + } +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..531770d8b9 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..7f43150ca2 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ClassInfo; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.FieldRefInfo; +import task7.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ffe71dfb15 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..de80616b39 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..143b070968 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..09ffc20c19 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..16810f3874 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..713610e243 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..df2b895c03 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java b/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..9cf2fded56 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package task7.jvm.cmd; + +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ClassInfo; +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.FieldRefInfo; +import task7.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java b/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..8c2af5157a --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/ClassInfo.java @@ -0,0 +1,31 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitClassInfo(this); + } + + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java b/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..24922e29d3 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/ConstantInfo.java @@ -0,0 +1,35 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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 abstract void accept(ConstantInfoVisitor visitor); + + public ConstantPool getConstantPool() { + return constantPool; + } + + public ConstantInfo getConstantInfo(int index) { + return this.constantPool.getConstantInfo(index); + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java b/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..485f0dd7c2 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/ConstantPool.java @@ -0,0 +1,37 @@ +package task7.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +public class ConstantPool { + + private List constantInfos; + + public ConstantPool() { + this.constantInfos = new ArrayList<>(); + } + + public ConstantPool(int size) { + this.constantInfos = new ArrayList<>(size); + + addConstantInfo(new NullConstantInfo()); + } + + 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/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java b/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..01474d2dd6 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/FieldRefInfo.java @@ -0,0 +1,65 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitFieldRefInfo(this); + } + + 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/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java b/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..104b798e59 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/MethodRefInfo.java @@ -0,0 +1,65 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitMethodRefInfo(this); + } + + 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/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java b/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..18089a2008 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,56 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitNameAndTypeInfo(this); + } + + + 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/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java b/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..216b03a449 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/NullConstantInfo.java @@ -0,0 +1,21 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + // non impl + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java b/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..0b601e3adb --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/StringInfo.java @@ -0,0 +1,35 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitStringInfo(this); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + + public String toString() { + return this.getConstantPool().getUTF8String(index); + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java b/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..53686ca0a8 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/constant/UTF8Info.java @@ -0,0 +1,45 @@ +package task7.jvm.constant; + +import task7.jvm.print.ConstantInfoVisitor; + +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 void accept(ConstantInfoVisitor visitor) { + visitor.visitUtf8Info(this); + } + + @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/group15/1507_977996067/src/task7/jvm/field/Field.java b/group15/1507_977996067/src/task7/jvm/field/Field.java new file mode 100644 index 0000000000..989f3316c4 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/field/Field.java @@ -0,0 +1,48 @@ +package task7.jvm.field; + + +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.UTF8Info; +import task7.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name + ":" + desc; + } + + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + + int accessFlag = iter.next2Bytes(); + int nameIndex = iter.next2Bytes(); + int descIndex = iter.next2Bytes(); + int attribCount = iter.next2Bytes(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex, pool); + + if (attribCount > 0) { + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java b/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..81c268cdc9 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,56 @@ +package task7.jvm.loader; + +import task7.jvm.util.Util; + +import java.util.Arrays; + +public class ByteCodeIterator { + + private int position; + + private byte[] bytes; + + public ByteCodeIterator(byte[] bytes) { + this.bytes = bytes; + } + + public String getMagicNumber() { + position = 0; + byte[] bytes = Arrays.copyOf(this.bytes, 4); + position += 4; + return Util.byteToHexString(bytes); + } + + public int next2Bytes() { + return nextBytes(2); + } + + public int next4Bytes() { + return nextBytes(4); + } + + public int nextFlag() { + return nextBytes(1); + } + + public void back(int length) { + position -= length; + } + + public byte[] getBytes(int length) { + byte[] bytes = Arrays.copyOfRange(this.bytes, position, position + length); + position += length; + return bytes; + } + + public String nextUxToHexString(int length) { + return new String(getBytes(length)); + } + + private int nextBytes(int size) { + byte[] bytes = Arrays.copyOfRange(this.bytes, position, position + size); + position += size; + return Util.byteToInt(bytes); + } + +} diff --git a/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java b/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..350d8b92f4 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/loader/ClassFileLoader.java @@ -0,0 +1,122 @@ +package task7.jvm.loader; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import task7.jvm.clz.ClassFile; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +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 < this.clzPaths.size(); i++) { + buffer.append(this.clzPaths.get(i)); + if (i < this.clzPaths.size() - 1) { + buffer.append(";"); + } + } + return buffer.toString(); + } + + private byte[] loadClassFile_V1(String clzFileName) { + + BufferedInputStream bis = null; + + try { + + File f = new File(clzFileName); + + + bis = new BufferedInputStream(new FileInputStream(f)); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + + byte[] buffer = new byte[1024]; + int length = -1; + + while ((length = bis.read(buffer)) != -1) { + bos.write(buffer, 0, length); + } + + byte[] codes = bos.toByteArray(); + + return codes; + + } catch (IOException e) { + e.printStackTrace(); + + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + + } + + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java b/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..eeea785114 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/loader/ClassFileParser.java @@ -0,0 +1,112 @@ +package task7.jvm.loader; + +import task7.jvm.clz.AccessFlag; +import task7.jvm.clz.ClassFile; +import task7.jvm.clz.ClassIndex; +import task7.jvm.constant.*; +import task7.jvm.field.Field; +import task7.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFileParser { + + private ConstantPool constantPool; + + public ClassFile parse(byte[] codes) { + ClassFile classFile = new ClassFile(); + ByteCodeIterator iterator = new ByteCodeIterator(codes); + System.out.println(iterator.getMagicNumber()); + + classFile.setMinorVersion(iterator.next2Bytes()); + classFile.setMajorVersion(iterator.next2Bytes()); + + parseConstantPool(iterator); + classFile.setConstPool(constantPool); + classFile.setAccessFlag(parseAccessFlag(iterator)); + classFile.setClassIndex(parseClassIndex(iterator));//task5 over + + iterator.next2Bytes(); // interface + + classFile.setFields(parseFileds(iterator)); + classFile.setMethods(parseMethods(classFile, iterator));//task6 over + return classFile; + } + + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + return new AccessFlag(iter.next2Bytes()); + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + ClassIndex clazIndex = new ClassIndex(); + clazIndex.setThisClassIndex(iter.next2Bytes()); + clazIndex.setSuperClassIndex(iter.next2Bytes()); + return clazIndex; + } + + private void parseConstantPool(ByteCodeIterator iter) { + int poolCount = iter.next2Bytes(); + ConstantPool pool = new ConstantPool(poolCount); + for (int i = 0; i < poolCount; i++) { + int tag = iter.nextFlag(); + if (tag == ConstantInfo.UTF8_INFO) { //utf-8 + int length = iter.next2Bytes(); + byte[] bytes = iter.getBytes(length); + UTF8Info utf8Info = new UTF8Info(pool); + utf8Info.setValue(new String(bytes)); + utf8Info.setLength(length); + pool.addConstantInfo(utf8Info); + } else if (tag == ConstantInfo.STRING_INFO) { + StringInfo stringInfo = new StringInfo(pool); + stringInfo.setIndex(iter.next2Bytes()); + pool.addConstantInfo(stringInfo); + } else if (tag == ConstantInfo.CLASS_INFO) { + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(iter.next2Bytes()); + pool.addConstantInfo(classInfo); + } else if (tag == ConstantInfo.FIELD_INFO) { + FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); + fieldRefInfo.setClassInfoIndex(iter.next2Bytes()); + fieldRefInfo.setNameAndTypeIndex(iter.next2Bytes()); + pool.addConstantInfo(fieldRefInfo); + } else if (tag == ConstantInfo.METHOD_INFO) { + MethodRefInfo methodRefInfo = new MethodRefInfo(pool); + methodRefInfo.setClassInfoIndex(iter.next2Bytes()); + methodRefInfo.setNameAndTypeIndex(iter.next2Bytes()); + pool.addConstantInfo(methodRefInfo); + } else if (tag == ConstantInfo.NAME_AND_TYPE_INFO) { + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + nameAndTypeInfo.setIndex1(iter.next2Bytes()); + nameAndTypeInfo.setIndex2(iter.next2Bytes()); + pool.addConstantInfo(nameAndTypeInfo); + } + } + this.constantPool = pool; + } + + private List parseFileds(ByteCodeIterator iter) { + int fieldCount = iter.next2Bytes(); + + List fieldList = new ArrayList<>(fieldCount); + + for (int i = 0; i < fieldCount; i++) { + Field f = Field.parse(constantPool, iter); + fieldList.add(f); + } + return fieldList; + } + + private List parseMethods(ClassFile classFile, ByteCodeIterator iter) { + int methodCount = iter.next2Bytes(); + + List methodList = new ArrayList<>(methodCount); + + for (int i = 0; i < methodCount; i++) { + Method m = Method.parse(classFile, iter); + methodList.add(m); + } + return methodList; + } +} diff --git a/group15/1507_977996067/src/task7/jvm/method/Method.java b/group15/1507_977996067/src/task7/jvm/method/Method.java new file mode 100644 index 0000000000..13643df703 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/method/Method.java @@ -0,0 +1,91 @@ +package task7.jvm.method; + +import task7.jvm.attr.AttributeInfo; +import task7.jvm.attr.CodeAttr; +import task7.jvm.clz.ClassFile; +import task7.jvm.constant.ConstantPool; +import task7.jvm.constant.UTF8Info; +import task7.jvm.loader.ByteCodeIterator; + +public class Method { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlag = iter.next2Bytes(); + int nameIndex = iter.next2Bytes(); + int descIndex = iter.next2Bytes(); + int attribCount = iter.next2Bytes(); + + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + for (int j = 1; j <= attribCount; j++) { + + int attrNameIndex = iter.next2Bytes(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if (AttributeInfo.CODE.equalsIgnoreCase(attrName)) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else { + throw new RuntimeException("only CODE attribute is implemented , please implement the " + attrName); + } + + } + + return m; + + } +} diff --git a/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java b/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..3f4607a044 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/print/ClassFilePrinter.java @@ -0,0 +1,44 @@ +package task7.jvm.print; + +import task7.jvm.clz.ClassFile; +import task7.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + + public ClassFilePrinter(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public void print() { + + if (clzFile.getAccessFlag().isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name:" + clzFile.getClassName()); + + System.out.println("Super Class Name:" + clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + } + + public static void main(String[] args) { + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java new file mode 100644 index 0000000000..40851fc1bf --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitor.java @@ -0,0 +1,18 @@ +package task7.jvm.print; + +import task7.jvm.constant.*; + +public interface ConstantInfoVisitor { + + void visitClassInfo(ClassInfo classInfo); + + void visitFieldRefInfo(FieldRefInfo fieldRefInfo); + + void visitMethodRefInfo(MethodRefInfo methodRefInfo); + + void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo); + + void visitStringInfo(StringInfo stringInfo); + + void visitUtf8Info(UTF8Info utf8Info); +} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java new file mode 100644 index 0000000000..776d23bc79 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/print/ConstantInfoVisitorImpl.java @@ -0,0 +1,51 @@ +package task7.jvm.print; + +import task7.jvm.constant.*; + +public class ConstantInfoVisitorImpl implements ConstantInfoVisitor { + @Override + public void visitClassInfo(ClassInfo classInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("Class\t#").append(classInfo.getUtf8Index()).append("\t").append(classInfo.getClassName()); + System.out.println(sb); + } + + @Override + public void visitFieldRefInfo(FieldRefInfo fieldRefInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("FieldRef\t#").append(fieldRefInfo.getClassInfoIndex()).append("\t").append(fieldRefInfo.getFieldName()); + System.out.println(sb); + + } + + @Override + public void visitMethodRefInfo(MethodRefInfo methodRefInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("MethodRef\t#").append(methodRefInfo.getMethodName()); + System.out.println(sb); + } + + @Override + public void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("NameAndType\t#").append(nameAndTypeInfo.getName()).append("\t") + .append(nameAndTypeInfo.getIndex1()).append("\t") + .append(nameAndTypeInfo.getIndex2()).append("\t") + .append(nameAndTypeInfo.getTypeInfo()); + System.out.println(sb); + } + + @Override + public void visitStringInfo(StringInfo stringInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("String\t#").append(stringInfo.getIndex()); + System.out.println(sb); + } + + @Override + public void visitUtf8Info(UTF8Info utf8Info) { + StringBuilder sb = new StringBuilder(); + sb.append("UTF8\t#").append(utf8Info.getValue()); + System.out.println(sb); + } +} diff --git a/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java b/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..d6e87cad83 --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,26 @@ +package task7.jvm.print; + +import task7.jvm.constant.ConstantInfo; +import task7.jvm.constant.ConstantPool; + +public class ConstantPoolPrinter { + + private ConstantPool pool; + + ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + + System.out.println("Constant Pool:"); + + ConstantInfoVisitor visitor = new ConstantInfoVisitorImpl(); + int size = (int) pool.getSize(); + for (int i = 0; i < size; i++) { + System.out.print("#" + i + "= "); + ConstantInfo constantInfo = pool.getConstantInfo(i); + constantInfo.accept(visitor); + } + } +} diff --git a/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java b/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..53bea9b04e --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,191 @@ +package task7.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import task7.jvm.clz.ClassFile; +import task7.jvm.clz.ClassIndex; +import task7.jvm.constant.*; +import task7.jvm.loader.ClassFileLoader; + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "EmployeeV1"; + + static String path1 = "E:\\Idea\\coding2017\\group15\\1507_977996067\\out\\task5\\jvm\\test"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "EmployeeV1"; + + clzFile = loader.loadClass(className); +// clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1038, byteCodes.length); + + } + + + @Test + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; + + String actualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", actualValue); + } + + + private String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } + + /** + * ---------------------------------------------------------------------- + */ + + + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool() { + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java b/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..866b94811a --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/test/EmployeeV1.java @@ -0,0 +1,29 @@ +package task7.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/group15/1507_977996067/src/task7/jvm/util/Util.java b/group15/1507_977996067/src/task7/jvm/util/Util.java new file mode 100644 index 0000000000..60158ac03a --- /dev/null +++ b/group15/1507_977996067/src/task7/jvm/util/Util.java @@ -0,0 +1,23 @@ +package task7.jvm.util; + +public class Util { + public static int byteToInt(byte[] codes){ + String s1 = byteToHexString(codes); + return Integer.valueOf(s1, 16); + } + + + public static String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;iSimple Java application that includes a class with main() method \ No newline at end of file +Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group17/102228177/work2_26/.classpath b/group17/102228177/work2_26/.classpath index 80437ca942..dfa83d7793 100644 --- a/group17/102228177/work2_26/.classpath +++ b/group17/102228177/work2_26/.classpath @@ -1,8 +1,8 @@ - - - - - - - - + + + + + + + + diff --git a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java index 60949d043e..a0dc5262db 100644 --- a/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java +++ b/group17/102228177/work2_26/src/com/coderising/array/ArrayUtil.java @@ -34,7 +34,7 @@ public static void main(String[] args) { // System.out.println(Arrays.toString(util.merge(a1, a2))); System.out.println(Arrays.toString(util.fibonacci(15))); - System.out.println(Arrays.toString(util.getPrimes(23))); +// System.out.println(Arrays.toString(util.getPrimes(23))); } /** @@ -115,14 +115,15 @@ public int[] grow(int [] oldArray, int size){ */ public int[] fibonacci(int max){ List list = new ArrayList(); - int f1 = 1, f2 = 1, f = 0; - list.add(f1); - list.add(f2); - while(f < max){ - f = f1+f2; - f1 = f2; - f2 = f; - list.add(f); + if (max <= 1) { + return new int[]{}; + } + int lo = 0; + int hi = 1; + while(hi clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + String name = ""; + for (int i = 0; i < className.length(); i++) { + if(className.charAt(i)=='.'){ + name += File.separatorChar; + }else{ + name += className.charAt(i); + } + } + File file = new File(getClassPath()+ File.separatorChar +name+".class"); + InputStream in = null; + ByteArrayOutputStream out = null; + try { + in = new FileInputStream(file); + out = new ByteArrayOutputStream(); + byte[] buff = new byte[1024*2]; + int len = 0; + while((len=in.read(buff))!=-1){ + out.write(buff, 0, len); + } + return out.toByteArray(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + finally { + if(in!=null){ + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(out!=null){ + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + return null; + + + } + + + public void addClassPath(String path) { + clzPaths.add(path); + } + + + + public String getClassPath(){ + StringBuilder sb = new StringBuilder(); + for (String string : clzPaths) { + sb.append(string).append(";"); + } + sb = sb.deleteCharAt(sb.length()-1); + return sb.toString(); + } +} \ No newline at end of file diff --git a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java b/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java similarity index 79% rename from group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java rename to group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java index b274338091..1e51c27361 100644 --- a/group12/2258659044/zj-2017/src/test/com/coderising/jvm/loader/ClassFileloaderTest.java +++ b/group17/102228177/work3_26/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,87 +1,93 @@ -package test.com.coderising.jvm.loader; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.loader.ClassFileLoader; - -public class ClassFileloaderTest { - - static String path1 = "F:\\githubRes\\coding2017\\group12\\2258659044\\zj-2017\\bin"; - static String path2 = "C:\temp"; - - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "test.com.coderising.jvm.loader.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1070, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "test.com.coderising.jvm.loader.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i= 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(); + } +} \ No newline at end of file diff --git a/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..c323d03b3f --- /dev/null +++ b/group17/102228177/work3_26/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,31 @@ +package com.coding.basic.linklist; + +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()); + } + +} \ No newline at end of file diff --git a/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java index 22a72affaf..ee2a7fd554 100644 --- a/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java +++ b/group17/102228177/work3_5/src/com/coderising/data/LinkedList.java @@ -292,22 +292,19 @@ public void removeRange(int min, int max){ throw new RuntimeException("LinkedList is empty!"); }else{ Node q = head; - //头判断 - if((int)q.data>min && (int)q.datamin && (int)p.data 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/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java b/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..8334e80b63 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,49 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } +} diff --git a/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..81264ceed7 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,137 @@ +package com.coderising.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 com.coderising.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(){ + + 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()); - } - - - -} +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ClassFileLoader; + + + + + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + +// static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path1 = "D:\\software\\taotao\\work4_09\\bin"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + 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/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java b/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java b/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group17/102228177/work4_09/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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= maxLen){ + grow(); + } + elements[size] = o; + size++; + } + + /** + * 数组扩容 + */ + private void grow(){ + maxLen = maxLen + (maxLen >> 1); + Object[] newArr = new Object[maxLen]; + System.arraycopy(elements, 0, newArr, 0, size); + elements = newArr; + } + + /** + * 在指定索引处添加元素 + * @param i 指定索引 + * @param o 添加元素 + */ + public void add(int i,Object o){ + //判断插入位置大于数组实际长度 + if(i > size){ + size = i; + if(size >= maxLen){//数组大小大于数组最大容量则需要扩容 + grow(); + } + } + //插入位置不大于数组实际长度时,将插入位置的元素向后移。 + for (int j = size; j > i ; j++) { + elements[j] = elements[j-1]; + } + elements[i] = o; + size++; + } + + /** + * 获取传入索引的元素 + * @param index 索引 + * @return 返回传入索引的元素 + */ + public Object get(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + } + for (int i = 0; i < size; i++) { + return elements[index]; + } + return null; + } + + /** + * 删除指定索引元素并返回 + * @param index + * @return 该索引处元素 + */ + public Object remove(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + }else{ + for (int j = index; j < size-1; j++) { + elements[j]=elements[j+1]; + } + size--; + return elements[index]; + } + } + + /** + * 获取大小 + * @return + */ + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + int cursor; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + if(i >= size){ + throw new NoSuchElementException(); + } + if (i >= elements.length){ + throw new ConcurrentModificationException(); + } + cursor = i+1; + return elements[i]; + } + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(6, 6); + list.remove(3); + for (int i = 0; i < list.size(); i++) { + System.out.println(i+":"+list.get(i)); + } + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } +} diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java new file mode 100644 index 0000000000..f51a971a1c --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic.stack; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/List.java b/group17/102228177/work4_09/src/com/coding/basic/stack/List.java new file mode 100644 index 0000000000..2d2c693e0d --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/List.java @@ -0,0 +1,10 @@ +package com.coding.basic.stack; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..42b6362e2f --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData; + private int elementCount; + + public Stack() { + this.elementData = new ArrayList(); + this.elementCount = 0; + } + public void push(Object o){ + elementData.add(o); + elementCount++; + } + + public Object pop(){ + Object object = elementData.remove(elementCount-1); + elementCount--; + return object; + } + + public Object peek(){ + if(isEmpty()){ + throw new EmptyStackException(); + } + return elementData.get(elementCount-1); + } + public boolean isEmpty(){ + return elementCount==0; + } + public int size(){ + return elementCount; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < elementData.size(); i++) { + sb.append(elementData.get(i)).append(","); + } + sb = sb.deleteCharAt(sb.length()-1); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..5b8019e2b7 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,112 @@ +package com.coding.basic.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) { + if(s.isEmpty()){ + return ; + } + int temp1 = (int) s.pop(); + reverse(s); + if(s.isEmpty()){ + s.push(temp1); + return ; + } + int temp2 = (int) s.pop(); + reverse(s); + s.push(temp1); + reverse(s); + s.push(temp2); + } + + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s.isEmpty()){ + return ; + } + Stack stack = new Stack(); + while(!s.isEmpty()){ + Object pop = s.pop(); + if(!pop.equals(o)){ + stack.push(pop); + } + } + while(!stack.isEmpty()){ + s.push(stack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + int i = 0; + Stack stack = new Stack(); + Object[] objects = new Object[len]; + while(i < len){ + Object o = s.pop(); + stack.push(o); + objects[i] = o; + i++; + } + while(!stack.isEmpty()){ + s.push(stack.pop()); + } + return objects; + } + /** + * 字符串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){ + Stack stack = new Stack(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '(': + case '[': + case '{': + stack.push(c); + break; + case ')': + if((char)stack.pop()!='('){ + return false; + } + break; + case ']': + if((char)stack.pop()!='['){ + return false; + } + break; + case '}': + if((char)stack.pop()!='{'){ + return false; + } + break; + } + } + if(stack.isEmpty()){ + return true; + } + return false; + } + + +} \ No newline at end of file diff --git a/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..722dd25846 --- /dev/null +++ b/group17/102228177/work4_09/src/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,44 @@ +package com.coding.basic.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class StackUtilTest { + Stack stack ; + { + stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + } + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverse() { + StackUtil.reverse(stack); + Assert.assertEquals("[5,4,3,2,1]", stack.toString()); + } + @Test + public void testRemove() { + StackUtil.remove(stack, 3); + Assert.assertEquals("[1,2,4,5]", stack.toString()); + } + @Test + public void testGetTop(){ + Assert.assertEquals(new Object[]{5,4}, StackUtil.getTop(stack, 2)); + Assert.assertEquals("[1,2,3,4,5]", stack.toString()); + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..a334a13d81 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,116 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); + + int exceptionTableLen = iter.nextU2ToInt(); + //TODO 处理exception + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.nextU2ToInt(); + + for(int x=1; x<=subAttrCount; x++){ + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } + else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } + else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } + else{ + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + /*for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..88f677b2c8 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,58 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java b/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..4755266987 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..af1e6bc65f --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,33 @@ +package com.coderising.jvm.constant; + +/** + + * @Description 类常量信息 + + * @author REEFE + + * @time 2017年4月9日 + + */ +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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..855b581f95 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,38 @@ +package com.coderising.jvm.constant; + +/** + + * @Description 常见常量项 + + * @author REEFE + + * @time 2017年4月9日 + + */ +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/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..d4f91262b8 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + + +/** + + * @Description:常量池 + + * @author:REEFE + + * @time:2017年4月9日 + + */ +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/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java b/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java b/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..7bc2656653 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..2eb83f3983 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,53 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..81264ceed7 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,137 @@ +package com.coderising.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 com.coderising.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(){ + + 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/group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java b/group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java b/group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group17/102228177/work4_16/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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= maxLen){ + grow(); + } + elements[size] = o; + size++; + } + + /** + * 数组扩容 + */ + private void grow(){ + maxLen = maxLen + (maxLen >> 1); + Object[] newArr = new Object[maxLen]; + System.arraycopy(elements, 0, newArr, 0, size); + elements = newArr; + } + + /** + * 在指定索引处添加元素 + * @param i 指定索引 + * @param o 添加元素 + */ + public void add(int i,Object o){ + //判断插入位置大于数组实际长度 + if(i > size){ + size = i; + if(size >= maxLen){//数组大小大于数组最大容量则需要扩容 + grow(); + } + } + //插入位置不大于数组实际长度时,将插入位置的元素向后移。 + for (int j = size; j > i ; j++) { + elements[j] = elements[j-1]; + } + elements[i] = o; + size++; + } + + /** + * 获取传入索引的元素 + * @param index 索引 + * @return 返回传入索引的元素 + */ + public Object get(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + } + for (int i = 0; i < size; i++) { + return elements[index]; + } + return null; + } + + /** + * 删除指定索引元素并返回 + * @param index + * @return 该索引处元素 + */ + public Object remove(int index){ + //索引不在实际范围内 + if(index < 0||index >= size){ + throw new ArrayIndexOutOfBoundsException(); + }else{ + for (int j = index; j < size-1; j++) { + elements[j]=elements[j+1]; + } + size--; + return elements[index]; + } + } + + /** + * 获取大小 + * @return + */ + public int size(){ + return size; + } + + public Iterator iterator(){ + return new ArrayListIterator(); + } + + private class ArrayListIterator implements Iterator{ + int cursor; + + @Override + public boolean hasNext() { + return cursor != size; + } + + @Override + public Object next() { + int i = cursor; + if(i >= size){ + throw new NoSuchElementException(); + } + if (i >= elements.length){ + throw new ConcurrentModificationException(); + } + cursor = i+1; + return elements[i]; + } + } + + public static void main(String[] args) { + ArrayList list = new ArrayList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(6, 6); + list.remove(3); + for (int i = 0; i < list.size(); i++) { + System.out.println(i+":"+list.get(i)); + } + + Iterator it = list.iterator(); + while (it.hasNext()) { + System.out.println(it.next()); + } + } +} diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java new file mode 100644 index 0000000000..a092602897 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExpr.java @@ -0,0 +1,74 @@ +package com.coding.basic.stack; +import java.util.List; +import java.util.Stack; +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + if(opStack.isEmpty()){ + + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + + + return numStack.pop().floatValue(); + } + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java new file mode 100644 index 0000000000..7774cf98b0 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/InfixExprTest.java @@ -0,0 +1,47 @@ +package com.coding.basic.stack; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java new file mode 100644 index 0000000000..f51a971a1c --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic.stack; + +public interface Iterator { + + public boolean hasNext(); + public Object next(); + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/List.java b/group17/102228177/work4_16/src/com/coding/basic/stack/List.java new file mode 100644 index 0000000000..2d2c693e0d --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/List.java @@ -0,0 +1,10 @@ +package com.coding.basic.stack; + +public interface List { + + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..42b6362e2f --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack; + +import java.util.EmptyStackException; + +public class Stack { + private ArrayList elementData; + private int elementCount; + + public Stack() { + this.elementData = new ArrayList(); + this.elementCount = 0; + } + public void push(Object o){ + elementData.add(o); + elementCount++; + } + + public Object pop(){ + Object object = elementData.remove(elementCount-1); + elementCount--; + return object; + } + + public Object peek(){ + if(isEmpty()){ + throw new EmptyStackException(); + } + return elementData.get(elementCount-1); + } + public boolean isEmpty(){ + return elementCount==0; + } + public int size(){ + return elementCount; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < elementData.size(); i++) { + sb.append(elementData.get(i)).append(","); + } + sb = sb.deleteCharAt(sb.length()-1); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java b/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..33fd75f6f1 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,66 @@ +package com.coding.basic.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) { + if(!s.isEmpty()){ + Object last = getBottom(s,s.pop()); + reverse(s); + s.push(last); + } + } + + private static Object getBottom(Stack s,Object t){ + if(s.isEmpty()){ + return t; + } + Object last = getBottom(s, s.pop()); + s.push(t); + return last; + } + /** + * 删除栈中的某个元素 注意:只能使用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; + } + + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + reverse(stack); + System.out.println(stack); + } + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java b/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java new file mode 100644 index 0000000000..364fe104f5 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/Token.java @@ -0,0 +1,49 @@ +package com.coding.basic.stack; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java b/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java new file mode 100644 index 0000000000..c45a23aed1 --- /dev/null +++ b/group17/102228177/work4_16/src/com/coding/basic/stack/TokenParser.java @@ -0,0 +1,56 @@ +package com.coding.basic.stack; +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} \ No newline at end of file diff --git a/group17/1158154002/.classpath b/group17/1158154002/.classpath index 2d7497573f..44f39c3ace 100644 --- a/group17/1158154002/.classpath +++ b/group17/1158154002/.classpath @@ -3,5 +3,7 @@ + + diff --git a/group17/1158154002/src/test04/loader/ClassFileLoader.java b/group17/1158154002/src/test04/loader/ClassFileLoader.java new file mode 100644 index 0000000000..0f144fbb43 --- /dev/null +++ b/group17/1158154002/src/test04/loader/ClassFileLoader.java @@ -0,0 +1,61 @@ +package test04.loader; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + + +public class ClassFileLoader { + private List clzPaths = new ArrayList(); + + + public byte[] readBinaryCode(String className) { + className=className.replace(".", File.separator)+".class"; + for (String path : clzPaths) { + String clzFileName=path+File.separator+className; + byte[] codes=loadClassFile(clzFileName); + if (codes!=null) { + return codes; + } + } + return null; + + + } + + private byte[] loadClassFile(String clzFileName) { + File file=new File(clzFileName); + try { + return IOUtils.toByteArray(new FileInputStream(file)); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + + } + + + + public void addClassPath(String path) { + if (this.clzPaths.contains(path)) { + return; + } + this.clzPaths.add(path); + } + + public String getClassPath_V1(){ + + return null; + } + + public String getClassPath(){ + return StringUtils.join(this.clzPaths,";"); + } +} diff --git a/group17/1158154002/src/test04/loader/ClassFileloaderTest.java b/group17/1158154002/src/test04/loader/ClassFileloaderTest.java new file mode 100644 index 0000000000..8897e72c91 --- /dev/null +++ b/group17/1158154002/src/test04/loader/ClassFileloaderTest.java @@ -0,0 +1,84 @@ +package test04.loader; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ClassFileloaderTest { + + static String path1 = "D:/mygit/coding2017/group17/1158154002/bin/"; + static String path2 = "file:/"; + + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + System.out.println(clzPath); + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "test04.loader.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1036, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "test04.loader.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i { + private ArrayList elementData = new ArrayList(); + + public void push(T o){ + elementData.add(o); + } + + public T pop(){ + return elementData.remove(size()-1); + } + + public T peek(){ + if (size()>0) { + return elementData.get(size()-1); + } else { + return null; + } + + } + + public boolean isEmpty(){ + return elementData.size()==0; + } + + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + StringBuffer sb=new StringBuffer(); + while (peek()!=null) { + sb.append(pop()).append(","); + } + + return sb.substring(0, sb.length()-1); + } + +} diff --git a/group17/1158154002/src/test05/stack/StackTest.java b/group17/1158154002/src/test05/stack/StackTest.java new file mode 100644 index 0000000000..a5d6b39344 --- /dev/null +++ b/group17/1158154002/src/test05/stack/StackTest.java @@ -0,0 +1,52 @@ +package test05.stack; + +import java.util.Arrays; + +import org.junit.Test; + +public class StackTest { + @Test + public void testReverse(){ + Stack stack=new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + + StackUtil.reverse(stack); + System.out.println(stack.toString()); + } + + @Test + public void testRemove(){ + Stack stack=new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + + StackUtil.remove(stack,3); + System.out.println(stack.toString()); + } + //isValidPairs + @Test + public void testGetTop(){ + Stack stack=new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + + System.out.println(Arrays.toString(StackUtil.getTop(stack,6))); + System.out.println(stack.toString()); + } + + @Test + public void testIsValidPairs(){ + System.out.println(StackUtil.isValidPairs("([e{d}f])")); + System.out.println(StackUtil.isValidPairs("([b{x]y})")); + } +} diff --git a/group17/1158154002/src/test05/stack/StackUtil.java b/group17/1158154002/src/test05/stack/StackUtil.java new file mode 100644 index 0000000000..2904bec41c --- /dev/null +++ b/group17/1158154002/src/test05/stack/StackUtil.java @@ -0,0 +1,151 @@ +package test05.stack; + + + +public class StackUtil { + /** + * 假设栈中的元素是T, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param + */ + public static void reverse(Stack s) { + Stack temp=new Stack(); + while (s.peek()!=null) { + temp.push(s.pop()); + } + Stack temp2=new Stack(); + while (temp.peek()!=null) { + temp2.push(temp.pop()); + } + while (temp2.peek()!=null) { + s.push(temp2.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + Stack temp=new Stack(); + while (s.peek()!=null) { + Object obj=s.pop(); + if (!obj.equals(o)) { + temp.push(obj); + } + } + while (temp.peek()!=null) { + s.push(temp.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + * @throws Exception + */ + public static Object[] getTop(Stack s,int len) { + if (len<=s.size()) { + Stack temp=new Stack(); + Object[] result=new Object[len]; + for (int i = 0; i < s.size(); i++) { + Object o=s.pop(); + temp.push(o); + if (i= 0; i--) { +// char c = s.charAt(i); +// if (c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { +// s2.push(c); +// } +// } +// +// for (int i = 0; i < s1.size() / 2; i++) { +// char a = (char) s1.pop(); +// char b = (char) s2.pop(); +// if (a == '(' && b != ')') { +// return false; +// } else if (a == ')' && b != '(') { +// return false; +// } else if (a == '[' && b != ']') { +// return false; +// } else if (a == ']' && b != '[') { +// return false; +// } else if (a == '{' && b != '}') { +// return false; +// } else if (a == '}' && b != '{') { +// return false; +// } +// } +// +// return true; +// } + +public static boolean isValidPairs(String s){ + + Stack stack = new Stack(); + for(int i=0;i symbol = new Stack<>(); + Stack num = new Stack<>(); + + for (int i = 0; i < str.length; i++) { + num.push(Float.valueOf(str[i])); + } + + for (int i = 0; i < expr.length(); i++) { + char c = expr.charAt(i); + if (c == '+' || c == '-' || c == '*' || c == '/') { + symbol.push(c); + } + } + // 逆置 + StackUtil.reverse(symbol); + StackUtil.reverse(num); + + // 取数,符号计算 + float result = 0; + while (num.size() > 1) { + float a = num.pop(); + float b = num.pop(); + + char s1 = symbol.pop(); + char s2 = ' '; + if (symbol.size() > 0) { + s2 = symbol.pop(); + if (s1 == '*') { + result = a * b; + symbol.push(s2); + } else if (s1 == '/') { + result = a / b; + symbol.push(s2); + } else if (s2 != ' ') { + if (s2 == '*' || s2 == '/') { + if (s2 == '*') { + result = b * num.pop(); + } else if (s2 == '/') { + result = b / num.pop(); + } + if (s1 == '+') { + result = a + result; + } else if (s1 == '-') { + result = a - result; + } + } else { + if (s1 == '+') { + result = a + b; + symbol.push(s2); + } else if (s1 == '-') { + result = a - b; + symbol.push(s2); + } + } + } + num.push(result); + System.out.println(result); + } else { + if (s1 == '+') { + result = a + b; + } else if (s1 == '-') { + result = a - b; + } else if (s1 == '*') { + result = a * b; + } else if (s1 == '/') { + result = a / b; + } + System.out.println(result); + } + } + + return result; + } +} diff --git a/group17/1158154002/src/test06/expr/InfixExprTest.java b/group17/1158154002/src/test06/expr/InfixExprTest.java new file mode 100644 index 0000000000..5c03c1a06d --- /dev/null +++ b/group17/1158154002/src/test06/expr/InfixExprTest.java @@ -0,0 +1,45 @@ +package test06.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } +// + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } +} diff --git a/group17/1158154002/src/test07/expr/InfixToPostfix.java b/group17/1158154002/src/test07/expr/InfixToPostfix.java new file mode 100644 index 0000000000..e88f211eb8 --- /dev/null +++ b/group17/1158154002/src/test07/expr/InfixToPostfix.java @@ -0,0 +1,56 @@ +package test07.expr; + +import java.util.ArrayList; +import java.util.List; + +import test05.stack.Stack; + +public class InfixToPostfix { + // 2+3*4-8/2 2 3 4 * + 8 2 / - + // 2+3*4-8/2+3 + // 2+3*4*5*5-8/2 2 3 4 * 5 * 5 * + 8 2 / - + // 2+3*4*5*5-8/2/2 2 3 4 * 5 * 5 * + 8 2 / - + public static List convert(String expr) { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + List result = new ArrayList(); + + Stack opStack = new Stack<>(); + for (Token token : tokens) { + + if (token.isOperator()) { + + if (opStack.isEmpty()) { + opStack.push(token); + } else { + + if (token.hasHigherPriority()&&!opStack.peek().hasHigherPriority()) { + opStack.push(token); + } else if (!token.hasHigherPriority()&&opStack.peek().hasHigherPriority()) { + if (opStack.size() > 1) { + while (opStack.size() > 0) { + result.add(opStack.pop()); + } + } + opStack.push(token); + } + else { + result.add(token); + } + } + } + if (token.isNumber()) { + result.add(token); + } + } + while (opStack.size() > 0) { + result.add(opStack.pop()); + } + for (Token token : result) { + System.out.print(token.value + " "); + } + System.out.println(); + return result; + } +} diff --git a/group17/1158154002/src/test07/expr/InfixToPostfixTest.java b/group17/1158154002/src/test07/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..eb11aae32d --- /dev/null +++ b/group17/1158154002/src/test07/expr/InfixToPostfixTest.java @@ -0,0 +1,12 @@ +package test07.expr; + +public class InfixToPostfixTest { + + public static void main(String[] args) { + //2+3*4-8/2 + //2+3*4*5*5-8/2 + InfixToPostfix.convert("2+3*4*5*5-8/2/2"); + InfixToPostfix.convert("2+3"); + } + +} diff --git a/group17/1158154002/src/test07/expr/PostfixExpr.java b/group17/1158154002/src/test07/expr/PostfixExpr.java new file mode 100644 index 0000000000..5e4e35433c --- /dev/null +++ b/group17/1158154002/src/test07/expr/PostfixExpr.java @@ -0,0 +1,48 @@ +package test07.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + Float f2=numStack.pop(); + Float f1=numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group17/1158154002/src/test07/expr/PostfixExprTest.java b/group17/1158154002/src/test07/expr/PostfixExprTest.java new file mode 100644 index 0000000000..11e17fc804 --- /dev/null +++ b/group17/1158154002/src/test07/expr/PostfixExprTest.java @@ -0,0 +1,36 @@ +package test07.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } +} diff --git a/group17/1158154002/src/test07/expr/PrefixExpr.java b/group17/1158154002/src/test07/expr/PrefixExpr.java new file mode 100644 index 0000000000..c02253ab1c --- /dev/null +++ b/group17/1158154002/src/test07/expr/PrefixExpr.java @@ -0,0 +1,49 @@ +package test07.expr; + +import java.util.List; +import java.util.Stack; + +import test05.stack.StackUtil; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack numStack = new Stack<>(); + + for (int i = tokens.size()-1; i >=0; i--) { + Token token=tokens.get(i); + if (token.isOperator()){ + Float f2=numStack.pop(); + Float f1=numStack.pop(); + numStack.push(calculate(token.toString(), f2, f1)); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group17/1158154002/src/test07/expr/PrefixExprTest.java b/group17/1158154002/src/test07/expr/PrefixExprTest.java new file mode 100644 index 0000000000..04ed04ad0a --- /dev/null +++ b/group17/1158154002/src/test07/expr/PrefixExprTest.java @@ -0,0 +1,43 @@ +package test07.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } +} diff --git a/group17/1158154002/src/test07/expr/Token.java b/group17/1158154002/src/test07/expr/Token.java new file mode 100644 index 0000000000..7cd540bb3d --- /dev/null +++ b/group17/1158154002/src/test07/expr/Token.java @@ -0,0 +1,54 @@ +package test07.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + public boolean hasHigherPriority(){ + if(!this.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) -1 > 0; + } +} diff --git a/group17/1158154002/src/test07/expr/TokenParser.java b/group17/1158154002/src/test07/expr/TokenParser.java new file mode 100644 index 0000000000..7e3a4db91b --- /dev/null +++ b/group17/1158154002/src/test07/expr/TokenParser.java @@ -0,0 +1,55 @@ +package test07.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group17/1158154002/src/test07/expr/TokenParserTest.java b/group17/1158154002/src/test07/expr/TokenParserTest.java new file mode 100644 index 0000000000..926a03e70e --- /dev/null +++ b/group17/1158154002/src/test07/expr/TokenParserTest.java @@ -0,0 +1,37 @@ +package test07.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } +} diff --git a/group17/1204187480/code/homework/basic/pom.xml b/group17/1204187480/code/homework/basic/pom.xml deleted file mode 100644 index 17b2dea49e..0000000000 --- a/group17/1204187480/code/homework/basic/pom.xml +++ /dev/null @@ -1,12 +0,0 @@ - - 4.0.0 - basic - - com.coding - parent - 1.0-SNAPSHOT - ../parent/pom.xml - - - \ No newline at end of file diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..a76de06aa1 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.loader; + +import org.apache.commons.lang3.StringUtils; + +import java.util.HashSet; +import java.util.Set; + +/** + * Created by luoziyihao on 4/27/17. + */ +public class ClassFileLoader { + + private Set clzPaths; + + public void addClassPath(String path) { + if (clzPaths == null) { + clzPaths = new HashSet<>(5); + } + if (StringUtils.isBlank(path)) { + return; + } + clzPaths.add(path); + + } + + + private static final String SPLIT = ";"; + + public String getClassPath() { + StringBuilder classPath = new StringBuilder(); + + for (String e : clzPaths) { + classPath.append(e) + .append(SPLIT); + } + if (classPath.length() > 1) { + classPath.deleteCharAt(classPath.length() - 1); + } + return classPath.toString(); + } + + public byte[] readBinaryCode(String className) { + return new byte[0]; + } +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..b2dceda3e5 --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,355 @@ +package com.coderising.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +//import com.coderising.jvm.clz.ClassFile; +//import com.coderising.jvm.clz.ClassIndex; +//import com.coderising.jvm.cmd.BiPushCmd; +//import com.coderising.jvm.cmd.ByteCodeCommand; +//import com.coderising.jvm.cmd.OneOperandCmd; +//import com.coderising.jvm.cmd.TwoOperandCmd; +//import com.coderising.jvm.constant.ClassInfo; +//import com.coderising.jvm.constant.ConstantPool; +//import com.coderising.jvm.constant.MethodRefInfo; +//import com.coderising.jvm.constant.NameAndTypeInfo; +//import com.coderising.jvm.constant.UTF8Info; +//import com.coderising.jvm.field.Field; +import com.coderising.jvm.loader.ClassFileLoader; +//import com.coderising.jvm.method.Method; + + + + + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; + +// static ClassFile clzFile = null; +// static { +// ClassFileLoader loader = new ClassFileLoader(); +// loader.addClassPath(path1); +// String className = "com.coderising.jvm.test.EmployeeV1"; +// +// clzFile = loader.loadClass(className); +// +// } +// + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + 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()); +// } +// +// /** +// * 下面是第三次JVM课应实现的测试用例 +// */ +// @Test +// public void testReadFields(){ +// +// List fields = clzFile.getFields(); +// Assert.assertEquals(2, fields.size()); +// { +// Field f = fields.get(0); +// Assert.assertEquals("name:Ljava/lang/String;", f.toString()); +// } +// { +// Field f = fields.get(1); +// Assert.assertEquals("age:I", f.toString()); +// } +// } +// @Test +// public void testMethods(){ +// +// List methods = clzFile.getMethods(); +// ConstantPool pool = clzFile.getConstantPool(); +// +// { +// Method m = methods.get(0); +// assertMethodEquals(pool,m, +// "", +// "(Ljava/lang/String;I)V", +// "2ab7000c2a2bb5000f2a1cb50011b1"); +// +// } +// { +// Method m = methods.get(1); +// assertMethodEquals(pool,m, +// "setName", +// "(Ljava/lang/String;)V", +// "2a2bb5000fb1"); +// +// } +// { +// Method m = methods.get(2); +// assertMethodEquals(pool,m, +// "setAge", +// "(I)V", +// "2a1bb50011b1"); +// } +// { +// Method m = methods.get(3); +// assertMethodEquals(pool,m, +// "sayHello", +// "()V", +// "b2001c1222b60024b1"); +// +// } +// { +// Method m = methods.get(4); +// assertMethodEquals(pool,m, +// "main", +// "([Ljava/lang/String;)V", +// "bb000159122b101db7002d4c2bb6002fb1"); +// } +// } +// +// private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ +// String methodName = pool.getUTF8String(m.getNameIndex()); +// String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); +// String code = m.getCodeAttr().getCode(); +// Assert.assertEquals(expectedName, methodName); +// Assert.assertEquals(expectedDesc, methodDesc); +// Assert.assertEquals(expectedCode, code); +// } +// +// @Test +// public void testByteCodeCommand(){ +// { +// Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); +// ByteCodeCommand [] cmds = initMethod.getCmds(); +// +// assertOpCodeEquals("0: aload_0", cmds[0]); +// assertOpCodeEquals("1: invokespecial #12", cmds[1]); +// assertOpCodeEquals("4: aload_0", cmds[2]); +// assertOpCodeEquals("5: aload_1", cmds[3]); +// assertOpCodeEquals("6: putfield #15", cmds[4]); +// assertOpCodeEquals("9: aload_0", cmds[5]); +// assertOpCodeEquals("10: iload_2", cmds[6]); +// assertOpCodeEquals("11: putfield #17", cmds[7]); +// assertOpCodeEquals("14: return", cmds[8]); +// } +// +// { +// Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); +// ByteCodeCommand [] cmds = setNameMethod.getCmds(); +// +// assertOpCodeEquals("0: aload_0", cmds[0]); +// assertOpCodeEquals("1: aload_1", cmds[1]); +// assertOpCodeEquals("2: putfield #15", cmds[2]); +// assertOpCodeEquals("5: return", cmds[3]); +// +// } +// +// { +// Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); +// ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); +// +// assertOpCodeEquals("0: getstatic #28", cmds[0]); +// assertOpCodeEquals("3: ldc #34", cmds[1]); +// assertOpCodeEquals("5: invokevirtual #36", cmds[2]); +// assertOpCodeEquals("8: return", cmds[3]); +// +// } +// +// { +// Method mainMethod = this.clzFile.getMainMethod(); +// +// ByteCodeCommand [] cmds = mainMethod.getCmds(); +// +// assertOpCodeEquals("0: new #1", cmds[0]); +// assertOpCodeEquals("3: dup", cmds[1]); +// assertOpCodeEquals("4: ldc #43", cmds[2]); +// assertOpCodeEquals("6: bipush 29", cmds[3]); +// assertOpCodeEquals("8: invokespecial #45", cmds[4]); +// assertOpCodeEquals("11: astore_1", cmds[5]); +// assertOpCodeEquals("12: aload_1", cmds[6]); +// assertOpCodeEquals("13: invokevirtual #47", cmds[7]); +// assertOpCodeEquals("16: return", cmds[8]); +// } +// +// } +// +// private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ +// +// String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); +// +// if(cmd instanceof OneOperandCmd){ +// if(cmd instanceof BiPushCmd){ +// acctual += " " + ((OneOperandCmd)cmd).getOperand(); +// } else{ +// acctual += " #" + ((OneOperandCmd)cmd).getOperand(); +// } +// } +// if(cmd instanceof TwoOperandCmd){ +// acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); +// } +// Assert.assertEquals(expected, acctual); +// } + +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/EmployeeV1.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java similarity index 95% rename from group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java rename to group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java index 85ae4dc47c..dcdbe226ed 100644 --- a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/action/LoginAction.java +++ b/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/litestruts/LoginAction.java @@ -1,4 +1,4 @@ -package com.coderising.litestruts.action; +package com.coderising.litestruts; /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 diff --git a/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml index c7ee86e436..876156eb4d 100644 --- a/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml +++ b/group17/1204187480/code/homework/coderising/src/main/resources/struts.xml @@ -1,6 +1,6 @@ - + /jsp/homepage.jsp /jsp/showLogin.jsp diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java similarity index 94% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java index 266eff3d56..d7ac820192 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/BinaryTreeNode.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -1,32 +1,32 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group27/383117348/src/com/coding/basic/Iterator.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java similarity index 93% rename from group27/383117348/src/com/coding/basic/Iterator.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java index dbe8b9afb2..06ef6311b2 100644 --- a/group27/383117348/src/com/coding/basic/Iterator.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Iterator.java @@ -1,7 +1,7 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java similarity index 95% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java index 0a09990083..ef939ae2cc 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/List.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/List.java @@ -1,10 +1,10 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); - public Iterator iterator(); -} +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); + public Iterator iterator(); +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java similarity index 87% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java index 10560f969e..e333496198 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Queue.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Queue.java @@ -1,24 +1,24 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class Queue { - - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - return elementData.remove(0); - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return elementData.size(); - } -} +package com.coding.basic; + +import com.coding.basic.linklist.LinkedList; + +public class Queue { + + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + return elementData.remove(0); + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java similarity index 93% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java index 998ddf9768..7336dccfe9 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Stack.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/Stack.java @@ -1,30 +1,32 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (isEmpty()) { - throw new IllegalStateException("the stack is empty"); - } - return elementData.remove(elementData.size() - 1); - } - - public Object peek(){ - if (isEmpty()) { - throw new IllegalStateException("the stack is empty"); - } - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty(){ - return size() == 0; - } - public int size(){ - return elementData.size(); - } -} +package com.coding.basic; + +import com.coding.basic.array.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (isEmpty()) { + throw new IllegalStateException("the stack is empty"); + } + return elementData.remove(elementData.size() - 1); + } + + public Object peek(){ + if (isEmpty()) { + throw new IllegalStateException("the stack is empty"); + } + return elementData.get(elementData.size() - 1); + } + + public boolean isEmpty(){ + return size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java similarity index 95% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java index d09d63c2fa..cbe1f87a05 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/ArrayList.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayList.java @@ -1,108 +1,111 @@ -package com.coding.basic; - -import java.util.Arrays; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - private Iterator iterator = new ArrayListIterator(); - - private int length() { - return elementData.length; - } - - private static final int ENLARGE_LENGTH = 100; - - private Object[] enlarge(Object[] origin) { - return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH); - } - - private void enLargeElementData() { - if (size == length()) { - elementData = enlarge(elementData); - } - } - - public void add(Object o) { - enLargeElementData(); - elementData[size] = o; - size++; - } - - public void add(int index, Object o) { - checkForAdd(index); - enLargeElementData(); - // 备份 index 处及后面的数据 - Object[] elementsBehindIndex = backBehindElements(elementData, index); - // 给index处 设值 - elementData[index] = o; - // 追加 备份的数据 - appendElement(elementData, index, elementsBehindIndex); - size++; - } - - private void appendElement(Object[] origin, int pos, Object[] append) { - System.arraycopy(append, 0, origin, pos, append.length); - } - - private Object[] backBehindElements(Object[] elementData, int index) { - int backSize = size - index; - Object[] back = new Object[backSize]; - System.arraycopy(elementData, index, back, 0, backSize); - return back; - } - - public Object get(int index) { - checkIndex(index); - return elementData[index]; - } - - private void checkIndex(int index) { - if (index < 0 || index >= size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - private void checkForAdd(int index) { - if (index < 0 || index > size) { - throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); - } - } - - public Object remove(int index) { - checkIndex(index); - Object[] back = backBehindElements(elementData, index + 1); - System.arraycopy(back, 0, elementData, index, back.length); - Object ret = elementData[index]; - elementData[index] = null; - size--; - return ret; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return iterator; - } - - private class ArrayListIterator implements Iterator { - - int next = 0; - - @Override - public boolean hasNext() { - return next < size; - } - - @Override - public Object next() { - return elementData[next++]; - } - } - -} +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +import java.util.Arrays; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + private Iterator iterator = new ArrayListIterator(); + + private int length() { + return elementData.length; + } + + private static final int ENLARGE_LENGTH = 100; + + private Object[] enlarge(Object[] origin) { + return Arrays.copyOf(origin, origin.length + ENLARGE_LENGTH); + } + + private void enLargeElementData() { + if (size == length()) { + elementData = enlarge(elementData); + } + } + + public void add(Object o) { + enLargeElementData(); + elementData[size] = o; + size++; + } + + public void add(int index, Object o) { + checkForAdd(index); + enLargeElementData(); + // 备份 index 处及后面的数据 + Object[] elementsBehindIndex = backBehindElements(elementData, index); + // 给index处 设值 + elementData[index] = o; + // 追加 备份的数据 + appendElement(elementData, index, elementsBehindIndex); + size++; + } + + private void appendElement(Object[] origin, int pos, Object[] append) { + System.arraycopy(append, 0, origin, pos, append.length); + } + + private Object[] backBehindElements(Object[] elementData, int index) { + int backSize = size - index; + Object[] back = new Object[backSize]; + System.arraycopy(elementData, index, back, 0, backSize); + return back; + } + + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + private void checkIndex(int index) { + if (index < 0 || index >= size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + private void checkForAdd(int index) { + if (index < 0 || index > size) { + throw new ArrayIndexOutOfBoundsException(String.format("index=%s, size=%s", index, size)); + } + } + + public Object remove(int index) { + checkIndex(index); + Object[] back = backBehindElements(elementData, index + 1); + System.arraycopy(back, 0, elementData, index, back.length); + Object ret = elementData[index]; + elementData[index] = null; + size--; + return ret; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return iterator; + } + + private class ArrayListIterator implements Iterator { + + int next = 0; + + @Override + public boolean hasNext() { + return next < size; + } + + @Override + public Object next() { + return elementData[next++]; + } + } + +} diff --git a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java similarity index 99% rename from group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java index 9aa6404d2a..42ec6efe57 100644 --- a/group17/1204187480/code/homework/coderising/src/main/java/com/coderising/array/ArrayUtil.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/array/ArrayUtil.java @@ -1,4 +1,4 @@ -package com.coderising.array; +package com.coding.basic.array; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..994a241a3d --- /dev/null +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,57 @@ +package com.coding.basic.linklist; + + +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) { + + + } + + + 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/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java similarity index 98% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java rename to group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java index c0cce5af0a..d9c4ee3c7b 100644 --- a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/LinkedList.java +++ b/group17/1204187480/code/homework/coding/src/main/java/com/coding/basic/linklist/LinkedList.java @@ -1,4 +1,7 @@ -package com.coding.basic; +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; public class LinkedList implements List { diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java similarity index 95% rename from group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java rename to group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java index 6c96193d82..eb41a7e262 100644 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/ArraysTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/ArraysTest.java @@ -1,22 +1,22 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArraysTest { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - - @Test - public void testCopyOf(){ - Object[] a = new Object[]{1, 2, 3, 4}; - Object[] b = Arrays.copyOf(a, 10); - logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b)); - } -} +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArraysTest { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + @Test + public void testCopyOf(){ + Object[] a = new Object[]{1, 2, 3, 4}; + Object[] b = Arrays.copyOf(a, 10); + logger.info("a={}, b={}", Arrays.toString(a), Arrays.toString(b)); + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java similarity index 95% rename from group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java rename to group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java index 6a23cb125e..efc4022378 100644 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/api/SystemTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/api/SystemTest.java @@ -1,24 +1,24 @@ -package com.coding.api; - -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Arrays; - -/** - * Created by luoziyihao on 2/25/17. - */ -public class SystemTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - @Test - public void testArrayCopy() { - int[] a = new int[]{1, 2, 3, 4, 5, 6, 7}; - int[] b = new int[]{11, 22, 33, 44, 55, 66, 77}; - System.arraycopy(a, 2, b, 4, 3); - logger.info("b={}", Arrays.toString(b)); - - } -} +package com.coding.api; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +/** + * Created by luoziyihao on 2/25/17. + */ +public class SystemTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Test + public void testArrayCopy() { + int[] a = new int[]{1, 2, 3, 4, 5, 6, 7}; + int[] b = new int[]{11, 22, 33, 44, 55, 66, 77}; + System.arraycopy(a, 2, b, 4, 3); + logger.info("b={}", Arrays.toString(b)); + + } +} diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java similarity index 93% rename from group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java rename to group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java index 656ff54c06..fba6895d09 100644 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/ArrayListTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/ArrayListTest.java @@ -1,35 +1,36 @@ -package com.coding.basic; - -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -/** - * Created by luoziyihao on 2/25/17. - */ -public class ArrayListTest { - - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - - private List list = new ArrayList(); - - @Before - public void before() { - - } - - @Test - public void add() throws Exception { - list.add(1); - } - - @Test - public void get() throws Exception { - add(); - logger.info("{}", list.get(0)); - } - +package com.coding.basic; + +import com.coding.basic.array.ArrayList; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * Created by luoziyihao on 2/25/17. + */ +public class ArrayListTest { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + + private List list = new ArrayList(); + + @Before + public void before() { + + } + + @Test + public void add() throws Exception { + list.add(1); + } + + @Test + public void get() throws Exception { + add(); + logger.info("{}", list.get(0)); + } + } \ No newline at end of file diff --git a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java similarity index 96% rename from group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java rename to group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java index 0424c2945e..549553e696 100644 --- a/group17/1204187480/code/homework/basic/src/test/java/com/coding/basic/LinkedListTest.java +++ b/group17/1204187480/code/homework/coding/src/test/java/com/coding/basic/LinkedListTest.java @@ -1,5 +1,6 @@ package com.coding.basic; +import com.coding.basic.linklist.LinkedList; import org.junit.Assert; import org.junit.Test; @@ -61,18 +62,21 @@ public void removeFirstHalf() throws Exception { linkedList.removeFirstHalf(); Assert.assertEquals("[]", linkedList.toString()); } + @Test public void removeFirstHalf1() throws Exception { LinkedList linkedList = createAndFillLinkedList(1); linkedList.removeFirstHalf(); Assert.assertEquals("[1]", linkedList.toString()); } + @Test public void removeFirstHalf2() throws Exception { LinkedList linkedList = createAndFillLinkedList(2); linkedList.removeFirstHalf(); Assert.assertEquals("[2]", linkedList.toString()); } + @Test public void removeFirstHalf3() throws Exception { LinkedList linkedList = createAndFillLinkedList(3); @@ -102,37 +106,43 @@ public void remove1() throws Exception { list.remove(0, 0); Assert.assertEquals("[1,2,3,4]", list.toString()); } - @Test + + @Test public void remove2() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(0, 1); Assert.assertEquals("[2,3,4]", list.toString()); } - @Test + + @Test public void remove3() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 0); Assert.assertEquals("[1,2,3,4]", list.toString()); } - @Test + + @Test public void remove4() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 1); Assert.assertEquals("[1,3,4]", list.toString()); } -@Test + + @Test public void remove5() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 3); Assert.assertEquals("[1]", list.toString()); } -@Test + + @Test public void remove6() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 4); Assert.assertEquals("[1]", list.toString()); } -@Test + + @Test public void remove7() throws Exception { LinkedList list = createAndFillLinkedList(4); list.remove(1, 5); @@ -141,7 +151,7 @@ public void remove7() throws Exception { @Test public void getElements() throws Exception { - LinkedList listA= createAndFillLinkedList(0,8); + LinkedList listA = createAndFillLinkedList(0, 8); LinkedList listB = createAndFillLinkedList(4, 4); Assert.assertEquals("[4,5,6,7]", Arrays.toString(listA.getElements(listB))); diff --git a/group17/1204187480/code/homework/parent/pom.xml b/group17/1204187480/code/homework/parent/pom.xml index ace9bf9cc5..4b82387454 100644 --- a/group17/1204187480/code/homework/parent/pom.xml +++ b/group17/1204187480/code/homework/parent/pom.xml @@ -8,18 +8,66 @@ 1.0-SNAPSHOT https://github.com/luoziyihao/coding2017 + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot + + true + + + + + - UTF-8 UTF-8 UTF-8 - 1.8 + 1.8 + UTF-8 1.8 1.8 3.0 + 1.1.7 1.1.7 1.2 1.2.17 4.12 + 3.4 + 4.1 + 2.5 + 1.9.2 + 19.0 + 1.1.6 + 1.16.10 + 1.2.22 + 0.2.0 + 2.9.4 + @@ -41,6 +89,59 @@ ${log4j.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + commons-io + commons-io + ${commons-io.version} + + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + + + joda-time + joda-time + ${joda-time.version} + + + io.reactivex + rxjava + ${rxjava.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + com.shekhargulati + strman + ${strman.version} + + + junit @@ -49,33 +150,6 @@ - - - alimaven - aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - true - - - - - - alimaven - aliyun maven - http://maven.aliyun.com/nexus/content/groups/public/ - - true - - - true - - - - ${project.artifactId} @@ -92,13 +166,13 @@ - - - - org.apache.maven.plugins - maven-surefire-report-plugin - 2.19.1 - - - + + + + + + + + + \ No newline at end of file diff --git a/group17/1204187480/code/homework/pom.xml b/group17/1204187480/code/homework/pom.xml index c8b94c2bc2..73e8c4160f 100644 --- a/group17/1204187480/code/homework/pom.xml +++ b/group17/1204187480/code/homework/pom.xml @@ -8,7 +8,7 @@ pom parent - basic + coding coderising diff --git a/group17/1204187480/note/todo/homework.md b/group17/1204187480/note/todo/homework.md new file mode 100644 index 0000000000..5f111a9ea6 --- /dev/null +++ b/group17/1204187480/note/todo/homework.md @@ -0,0 +1,8 @@ +# 0326 操作系统中的lru算法 + +ClassFileLoader + +LRUPageFrame + +深入理解java虚拟机 第6章 + diff --git a/group17/1264835468/src/assignment/BinaryTree.java b/group17/1264835468/src/assignment/BinaryTree.java index 1d76a7ce2c..882a87f6ed 100644 --- a/group17/1264835468/src/assignment/BinaryTree.java +++ b/group17/1264835468/src/assignment/BinaryTree.java @@ -53,10 +53,10 @@ public String toString() { * */ private class BFSNodeQueue { - private MyQueue> nodeQueue; + private Queue> nodeQueue; public BFSNodeQueue() { - nodeQueue = new MyQueue<>(); + nodeQueue = new Queue<>(); } public boolean isEmpty() { @@ -79,9 +79,9 @@ public BinaryTreeNode deQueue() { } // 把所有出队节点放进另一个队列中 - public MyQueue> getResult() { + public Queue> getResult() { prepare(); - MyQueue> result = new MyQueue<>(); + Queue> result = new Queue<>(); while (!isEmpty()) { result.enQueue(deQueue()); } @@ -121,7 +121,7 @@ private class BFSIterator implements Iterator> { Iterator> iterator; public BFSIterator() { - MyQueue> BFSQueue = new BFSNodeQueue().getResult(); + Queue> BFSQueue = new BFSNodeQueue().getResult(); list = new MyArrayList<>(); while (!BFSQueue.isEmpty()) { list.add(BFSQueue.deQueue()); diff --git a/group17/1264835468/src/assignment/MyStack.java b/group17/1264835468/src/assignment/MyStack.java deleted file mode 100644 index 0c3d30337b..0000000000 --- a/group17/1264835468/src/assignment/MyStack.java +++ /dev/null @@ -1,39 +0,0 @@ -package assignment; - -public class MyStack { - private MyArrayList elementData = new MyArrayList<>(); - - public void push(T o) { - elementData.add(o); - } - - public T pop() { - if (!isEmpty()) { - T data = elementData.remove(elementData.size() - 1); - return data; - } - throw new StackIsEmptyException(); - } - - public T peek() { - return elementData.get(elementData.size() - 1); - } - - public boolean isEmpty() { - return elementData.size() == 0; - } - - public int size() { - return elementData.size(); - } -} - -class StackIsEmptyException extends RuntimeException { - public StackIsEmptyException() { - super(); - } - - public StackIsEmptyException(String string) { - super(string); - } -} diff --git a/group17/1264835468/src/assignment/MyQueue.java b/group17/1264835468/src/assignment/Queue.java similarity index 95% rename from group17/1264835468/src/assignment/MyQueue.java rename to group17/1264835468/src/assignment/Queue.java index c5e3e8ce88..eb3b474e75 100644 --- a/group17/1264835468/src/assignment/MyQueue.java +++ b/group17/1264835468/src/assignment/Queue.java @@ -1,6 +1,6 @@ package assignment; -public class MyQueue { +public class Queue { private MyLinkedList elementData = new MyLinkedList<>(); public void enQueue(T o) { diff --git a/group17/1264835468/src/assignment/Stack.java b/group17/1264835468/src/assignment/Stack.java new file mode 100644 index 0000000000..9100544ee3 --- /dev/null +++ b/group17/1264835468/src/assignment/Stack.java @@ -0,0 +1,53 @@ +package assignment; + +public class Stack { + private MyArrayList elementData = new MyArrayList<>(); + + public void push(T o) { + elementData.add(o); + } + + public T pop() { + if (!isEmpty()) { + T data = elementData.remove(elementData.size() - 1); + return data; + } + throw new EmptyStackException(); + } + + public T peek() { + if(!isEmpty()) + return elementData.get(elementData.size() - 1); + throw new EmptyStackException(); + } + + public boolean isEmpty() { + return elementData.size() == 0; + } + + public int size() { + return elementData.size(); + } + + @Override + public String toString() { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = elementData.size()-1; i >=0; i--) { + stringBuilder.append(elementData.get(i)); + if (i != 0) { + stringBuilder.append(", "); + } + } + return stringBuilder.toString(); + } +} + +class EmptyStackException extends RuntimeException { + public EmptyStackException() { + super(); + } + + public EmptyStackException(String string) { + super(string); + } +} diff --git a/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java b/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..f95bc2e902 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java b/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..2cb501297d --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/clz/ClassFile.java @@ -0,0 +1,77 @@ +package assignment0326.jvm.clz; + + +import assignment0326.jvm.constant.ClassInfo; +import assignment0326.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/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java b/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..a3e5c3d350 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..4a7397478e --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..f6acdc0580 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java b/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..96f40534da --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..d0beb7f1f2 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..3678f46c39 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..7659657b94 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..d8f8bda26e --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package assignment0326.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java b/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..eb6b9b4d7e --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java b/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..80f3389bd9 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package assignment0326.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/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..09d87c13b6 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,42 @@ +package assignment0326.jvm.loader; + +public class ByteCodeIterator { + int curPos; + byte[] bytes; + + public ByteCodeIterator(byte[] bytes) { + curPos = 0; + this.bytes = bytes; + } + + public boolean hasNext() { + return !(curPos >= bytes.length); + } + + public byte nextByte() { + return bytes[curPos++]; + } + + public int nextByteToInt() { + return Byte.toUnsignedInt(nextByte()); + } + + public int next2BytesToInt() { + int hi = Byte.toUnsignedInt(nextByte()); + int lo = Byte.toUnsignedInt(nextByte()); + int i = hi << 8 | lo; + return i; + } + + public byte[] nextNBytes(int n) { + byte[] bytes = new byte[n]; + for (int i = 0; i < n; i++) { + bytes[i] = nextByte(); + } + return bytes; + } + + public void skip(int n) { + curPos += n; + } +} diff --git a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java index a5add91113..3b05a1f761 100644 --- a/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java +++ b/group17/1264835468/src/assignment0326/jvm/loader/ClassFileLoader.java @@ -1,9 +1,13 @@ package assignment0326.jvm.loader; +import assignment0326.jvm.clz.ClassFile; + import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @@ -13,47 +17,67 @@ public class ClassFileLoader { - private List clzPaths = new ArrayList(); + private List clzPaths = new ArrayList<>(); - public byte[] readBinaryCode(String className) { - String path = className.replace(".", File.separator); - File classFile=null; - for (String p: clzPaths) { - classFile=new File(p+File.separator+path+".class"); - if(classFile.exists()) - break; - } - if(classFile==null) - throw new RuntimeException("no such class file"); + public byte[] readBinaryCode(String className) { + String path = className.replace(".", File.separator); + File classFile = null; + for (String p : clzPaths) { + classFile = new File(p + File.separator + path + ".class"); + if (classFile.exists()) + break; + } + if (classFile == null) + throw new RuntimeException("no such class file"); - byte[] bytes=new byte[(int)classFile.length()]; - try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(classFile))){ - bufferedInputStream.read(bytes, 0, bytes.length); + byte[] bytes = new byte[(int) classFile.length()]; + try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(classFile))) { + bufferedInputStream.read(bytes, 0, bytes.length); - } catch (IOException e) { - e.printStackTrace(); - } - return bytes; + } catch (IOException e) { + e.printStackTrace(); } + return bytes; + } - public void addClassPath(String path) { - clzPaths.add(path); + public void addClassPath(String path) { + if (this.clzPaths.contains(path)) { + return; } + clzPaths.add(path); + } - - public String getClassPath(){ - StringBuilder stringBuilder=new StringBuilder(); - 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()); + } + + } \ No newline at end of file diff --git a/group17/1264835468/src/assignment0326/jvm/util/Util.java b/group17/1264835468/src/assignment0326/jvm/util/Util.java new file mode 100644 index 0000000000..5855550bf8 --- /dev/null +++ b/group17/1264835468/src/assignment0326/jvm/util/Util.java @@ -0,0 +1,24 @@ +package assignment0326.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 strings=new ArrayList<>(); - for (int i = 0; i <10; i++) { - strings.add(String.valueOf(new Random().nextInt(3000))); - } - System.out.println(strings); - System.out.println(strings.stream().map(s-> s.charAt(0)).sorted().distinct().limit(5).collect(Collectors.toList())); - } - - public int findMinDifference(List timePoints) { - List list=new ArrayList<>(); - - for (String s:timePoints) { - list.add(parse(s)); - } - Collections.sort(list); - int min=Integer.MAX_VALUE; - for (int i = 0; i < list.size()-1; i++) { - min=Math.min(min,Math.min(Math.abs(list.get(i+1)-list.get(i)),24*60-Math.abs(list.get(i+1)-list.get(i)))); - } - return min; - } - - private Integer parse(String s) { - return Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(3, 5)); - } -} diff --git a/group17/1264835468/src/assignment0405/StackUtil.java b/group17/1264835468/src/assignment0405/StackUtil.java new file mode 100644 index 0000000000..dcaf1992dd --- /dev/null +++ b/group17/1264835468/src/assignment0405/StackUtil.java @@ -0,0 +1,107 @@ +package assignment0405; + +import assignment.Stack; + +import java.util.Objects; + +/** + * Created by Administrator on 2017/4/6. + */ +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 stack1 = new Stack(); + Stack stack2 = new Stack(); + popAllToAnotherStack(s, stack1); + popAllToAnotherStack(stack1, stack2); + popAllToAnotherStack(stack2, s); + } + + private static void popAllToAnotherStack(Stack s, Stack another) { + while (!s.isEmpty()) { + another.push(s.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + Stack stack2 = new Stack(); + while (!s.isEmpty()) { + Object top = s.pop(); + //Objects.equals(null, null) == true + if (!Objects.equals(top, o)) { + stack2.push(top); + } + } + popAllToAnotherStack(stack2, s); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + if (len > s.size()) + throw new RuntimeException("Stack size:" + s.size() + " < " + len); + Object[] objects = new Object[len]; + for (int i = 0; i < len; i++) { + objects[i] = s.pop(); + } + for (int i = len - 1; i >= 0; i--) { + s.push(objects[i]); + } + return objects; + } + + /** + * 字符串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) { + Stack stack = new Stack<>(); + + for (char c : s.toCharArray()) { + if (isLeft(c)) { + stack.push(c); + continue; + } + if (isRight(c)) { + if (stack.isEmpty() || !match(stack.pop(), c)) { + return false; + } + } + } + return stack.isEmpty(); + } + + private static boolean isLeft(char c) { + return c == '[' || c == '(' || c == '{'; + } + + private static boolean isRight(char c) { + return c == ']' || c == ')' || c == '}'; + } + + private static boolean match(char left, char right) { + return (left == '(' && right == ')') || (left == '[' && right == ']') || (left == '{' && right == '}'); + } + + +} diff --git a/group17/1264835468/src/assignment0405/StackUtilTest.java b/group17/1264835468/src/assignment0405/StackUtilTest.java new file mode 100644 index 0000000000..d36a17c29d --- /dev/null +++ b/group17/1264835468/src/assignment0405/StackUtilTest.java @@ -0,0 +1,67 @@ +package assignment0405; + +import assignment.Stack; +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by Administrator on 2017/4/9. + */ +public class StackUtilTest { + @Test + public void reverse() throws Exception { + Stack stack = new Stack(); + pushAll(stack, 1, 2, 3, 4); + Assert.assertEquals("4, 3, 2, 1", stack.toString()); + StackUtil.reverse(stack); + Assert.assertEquals("1, 2, 3, 4", stack.toString()); + StackUtil.reverse(stack); + Assert.assertEquals("4, 3, 2, 1", stack.toString()); + + } + + + @Test + public void remove() throws Exception { + Stack stack = new Stack(); + pushAll(stack, 0, 1, 2, 3); + StackUtil.remove(stack, 1); + Assert.assertEquals("3, 2, 0", stack.toString()); + pushAll(stack, 4, 5, 6, 5); + Assert.assertEquals("5, 6, 5, 4, 3, 2, 0", stack.toString()); + StackUtil.remove(stack, 5); + Assert.assertEquals("6, 4, 3, 2, 0", stack.toString()); + pushAll(stack, null, 7, null); + Assert.assertEquals("null, 7, null, 6, 4, 3, 2, 0", stack.toString()); + StackUtil.remove(stack, null); + Assert.assertEquals("7, 6, 4, 3, 2, 0", stack.toString()); + + + } + + @Test(expected = RuntimeException.class) + public void getTop() throws Exception { + Stack stack = new Stack(); + pushAll(stack, 1, 2, 3, 4, 5); + Assert.assertArrayEquals(new Object[]{5, 4, 3}, StackUtil.getTop(stack, 3)); + Assert.assertArrayEquals(new Object[]{5}, StackUtil.getTop(stack, 1)); + Assert.assertArrayEquals(new Object[]{5, 4, 3, 2, 1}, StackUtil.getTop(stack, 5)); + //异常 + StackUtil.getTop(stack, 6); + } + + @Test + public void isValidPairs() throws Exception { + Assert.assertTrue(StackUtil.isValidPairs("()[]{}([])")); + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + Assert.assertFalse(StackUtil.isValidPairs("((a)[]{b(c)}")); + } + + private void pushAll(Stack s, Object... objects) { + for (Object object : objects) { + s.push(object); + } + } + +} \ No newline at end of file diff --git a/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java b/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..8ba6ebd501 --- /dev/null +++ b/group17/1264835468/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/download/net_multisoc.htm b/group17/1282579502/src/com/coderising/download/net_multisoc.htm index 5ddcba89af..852129b19a 100644 --- a/group17/1282579502/src/com/coderising/download/net_multisoc.htm +++ b/group17/1282579502/src/com/coderising/download/net_multisoc.htm @@ -488,3 +488,18 @@

Result

+ \ No newline at end of file diff --git a/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java b/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..1e4c513330 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,48 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + public static AttributeInfo parse(ClassFile file, ByteCodeIterator iter) throws InvalidAttributeInfoException{ + AttributeInfo attrInfo = null; + int attributeType = iter.getNextNBytesInteger(2); + String attributeTag = file.getConstantPool().getUTF8String(attributeType); + System.out.println("attribute type: " + attributeType + " utf8 val: " + file.getConstantPool().getUTF8String(attributeType)); + + if(attributeTag.equals(CODE)){ + System.out.println("about to parse CODE attribute"); + //ClassFile clzFile, ByteCodeIterator iter, int attributeNameIndex + attrInfo = CodeAttr.parse(file, iter, attributeType); + } + else if(attributeTag.equals(LINE_NUM_TABLE)){ + System.out.println("about to parse LINE_NUM_TABLE attribute"); + attrInfo = LineNumberTable.parse(iter); + } + else if(attributeTag.equals(LOCAL_VAR_TABLE)){ + System.out.println("about to parse LOCAL_VAR_TABLE attribute"); + attrInfo = LocalVariableTable.parse(iter, file, attributeType); + } + else{ + System.out.println("about to throw attribute"); + throw new InvalidAttributeInfoException("Unimplemented attribute exception."); + } + + return attrInfo; + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java b/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..12d151d575 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,94 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; +import com.coderising.jvm.method.InvalidMethodInfoException; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter, int attributeNameIndex) throws InvalidAttributeInfoException{ + System.out.println("parsing CodeAttr..."); + + int attributeLength = iter.getNextNBytesInteger(4); + int maxStack = iter.getNextNBytesInteger(2); + int maxLocalVar = iter.getNextNBytesInteger(2); + int codeLength = iter.getNextNBytesInteger(4); + + + System.out.println("attribute length: " + attributeLength); + System.out.println("max stack: " + maxStack); + System.out.println("max local variable: " + maxLocalVar); + System.out.println("code length: " + codeLength); + + String realCode = iter.getNextNHexString(codeLength); + System.out.println("real cdoe: " + realCode); + + int exceptionCount = iter.getNextNBytesInteger(2); + System.out.println("exception count: " + exceptionCount); + if(exceptionCount>0){ + throw new InvalidAttributeInfoException("Exception parser un-implemented."); + } + //int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code + CodeAttr code = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocalVar, codeLength, realCode); + + int subAttributeCount = iter.getNextNBytesInteger(2); + System.out.println("sub attribute count : " + subAttributeCount); + for(int i = 0; i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int attributeLength = iter.getNextNBytesInteger(4); + int lineNumberTableLength = iter.getNextNBytesInteger(2); + System.out.println("attribute length: " + attributeLength); + System.out.println("line number table length: " + lineNumberTableLength); + LineNumberTable table = new LineNumberTable(attributeLength, lineNumberTableLength); + for(int i = 0; i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + +public static LocalVariableTable parse(ByteCodeIterator iter, ClassFile clz, int nameIndex){ + LocalVariableTable attrInfo = null; + int attributeLength = iter.getNextNBytesInteger(4); + int localVarTableLength = iter.getNextNBytesInteger(2); + System.out.println("attribute length: " + attributeLength); + System.out.println("local variable table length: " + localVarTableLength); + attrInfo = new LocalVariableTable(nameIndex, attributeLength); + for(int i = 0;i fields; + private List methods; + + 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(); + } + + public void setFields(List fields){ + this.fields = fields; + } + + public void setMethods(List methods){ + this.methods = methods; + } + + public List getFields(){ + return fields; + } + + public List getMethods(){ + return methods; + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java b/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100755 index 0000000000..e424f284b3 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100755 index 0000000000..aea9048ea4 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100755 index 0000000000..4ddac90612 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.constant; + +public abstract class ConstantInfo { + public static final int UTF8_INFO = 1; + public static final int INTEGER_INFO = 3; + 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/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java new file mode 100644 index 0000000000..ce35409add --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantInfoFactory.java @@ -0,0 +1,93 @@ +package com.coderising.jvm.constant; + +import java.io.UnsupportedEncodingException; + +import com.coderising.jvm.loader.ByteCodeIterator; +import com.coderising.jvm.util.Util; + +public class ConstantInfoFactory { + public ByteCodeIterator iter = null; + public ConstantPool pool = null; + public ConstantInfoFactory(ByteCodeIterator iter, ConstantPool pool){ + this.iter = iter; + this.pool = pool; + } + + public void fillNextConstantInfo() throws InvalidConstantInfoTypeException, UnsupportedEncodingException{ + int constantIdentifier = iter.getNextByte(); + ConstantInfo var = null; + //System.out.println("constant identifyer: " + constantIdentifier); + var = classify(constantIdentifier); + pool.addConstantInfo(var); + } + + public ConstantInfo classify(int constantInfoTypeId) throws InvalidConstantInfoTypeException, UnsupportedEncodingException{ + ConstantInfo ret = null; + switch(constantInfoTypeId){ + case ConstantInfo.CLASS_INFO: + ClassInfo classInfo = new ClassInfo(pool); + byte[] utf8Index = iter.getNextNBytes(2); + //System.out.println("constant classInfo: utf index: " + Util.byteToInt(utf8Index)); + classInfo.setUtf8Index(Util.byteToInt(utf8Index)); + ret = classInfo; + + break; + case ConstantInfo.FIELD_INFO: + FieldRefInfo fieldInfo = new FieldRefInfo(pool); + int classInfoIndex = Util.byteToInt(iter.getNextNBytes(2)); + fieldInfo.setClassInfoIndex(classInfoIndex); + int nameAndTypeIndex = Util.byteToInt(iter.getNextNBytes(2)); + fieldInfo.setNameAndTypeIndex(nameAndTypeIndex); + ret = fieldInfo; + break; + case ConstantInfo.INTEGER_INFO: + IntegerInfo integerInfo = new IntegerInfo(pool); + int val = Util.byteToInt(iter.getNextNBytes(4)); + integerInfo.setInteger(val); + ret = integerInfo; + break; + case ConstantInfo.FLOAT_INFO: + FloatRefInfo floatInfo = new FloatRefInfo(pool); + ret = floatInfo; + throw new InvalidConstantInfoTypeException("Flat info has not been properly implemented yet"); + //break; + case ConstantInfo.METHOD_INFO: + MethodRefInfo methodInfo = new MethodRefInfo(pool); + int methodClassInfoIndex = Util.byteToInt(iter.getNextNBytes(2)); + methodInfo.setClassInfoIndex(methodClassInfoIndex); + int methodNameAndTypeIndex = Util.byteToInt(iter.getNextNBytes(2)); + methodInfo.setNameAndTypeIndex(methodNameAndTypeIndex); + ret = methodInfo; + break; + case ConstantInfo.NAME_AND_TYPE_INFO: + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + int nameIndex = Util.byteToInt(iter.getNextNBytes(2)); + nameAndTypeInfo.setIndex1(nameIndex); + int descriptorIndex = Util.byteToInt(iter.getNextNBytes(2)); + nameAndTypeInfo.setIndex2(descriptorIndex); + ret = nameAndTypeInfo; + break; + case ConstantInfo.STRING_INFO: + StringInfo stringInfo = new StringInfo(pool); + int index = Util.byteToInt(iter.getNextNBytes(2)); + stringInfo.setIndex(index); + ret = stringInfo; + break; + case ConstantInfo.UTF8_INFO: + UTF8Info utfInfo = new UTF8Info(pool); + int length = Util.byteToInt(iter.getNextNBytes(2)); + utfInfo.setLength(length); + + String utf8Val = new String(iter.getNextNBytes(length), "UTF-8"); + System.out.println("UTF 8 content " + utf8Val); + + utfInfo.setValue(utf8Val); + ret = utfInfo; + break; + + default: + throw new InvalidConstantInfoTypeException(); + } + return ret; + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100755 index 0000000000..59ad734f25 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,37 @@ +package com.coderising.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){ + System.out.println("added: " + info.getClass().getName() + " current size; " + constantInfos.size()); + 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 int getSize() { + return this.constantInfos.size() -1; + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + for(int i = 0; i attributeList = new ArrayList<>(); + for(int i = 0; i0){ + throw new InvalidAttributeInfoException("Attribute infomation is NOT valid."); + } + Field newField = new Field(accessFlag, nameIndex, descriptorIndex,pool); + return newField; + } + + public String toString(){ + return pool.getUTF8String(nameIndex) + ":" +pool.getUTF8String( descriptorIndex); + } + +} diff --git a/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java b/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java new file mode 100644 index 0000000000..7d1f90c030 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/interfaze/Interfaze.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.interfaze; + +public class Interfaze { + +} diff --git a/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java b/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java new file mode 100644 index 0000000000..b5eed64afc --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/interfaze/InvalidInterfaceException.java @@ -0,0 +1,7 @@ +package com.coderising.jvm.interfaze; + +public class InvalidInterfaceException extends Exception{ + public InvalidInterfaceException(String message){ + super(message); + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100755 index 0000000000..b34c2c6736 --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,84 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + + byte[] source = null; + int currentPos = 0; + + public ByteCodeIterator(byte[] source){ + this.source = source; + } + + public byte getNextByte(){ + if(currentPos > source.length -1){ + throw new IndexOutOfBoundsException(); + } + return getByteAt(currentPos++); + } + + public byte[] getNextNBytes(int n){ + byte[] retArray = new byte[n]; + for(int i = 0; isource.length-1){ + throw new IndexOutOfBoundsException(); + } + return source[n]; + } + + + public String getNextHexString(){ + byte b1 = getNextByte(); + int i1 = b1 & 0xFF; + String strVal = Integer.toHexString(i1); + if(strVal.length() < 2){ + strVal = "0".concat(strVal); + } + return strVal; + } + + public String getNextNHexString(int n){ + StringBuilder sb = new StringBuilder(); + while(n-->0){ + sb.append(getNextHexString()); + } + + return sb.toString(); + } + + public String peekNextNHex(int n){ + String val = getNextNHexString(n); + backOffNBytes(n); + return val; + } + + public void backOffNBytes(int n){ + if(n < currentPos){ + currentPos -=n; + } + else{ + System.err.println("Don't have enough bytes."); + } + } + + public int getNextNBytesInteger(int n){ + byte[] barray = getNextNBytes(n); + return Util.byteToInt(barray); + } + + + public static void printByteInNumber(byte b){ + int tmp = b; + System.out.println(Integer.toBinaryString(tmp)); + int tmp1 = tmp & 0xFF; + System.out.println(Integer.toBinaryString(tmp1)); + System.out.println(Integer.toHexString(tmp1)); + } +} diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java index 6d669e294f..ec9ea83caf 100644 --- a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -9,18 +9,24 @@ import java.util.Collection; import java.util.List; +import com.coderising.jvm.clz.ClassFile; + public class ClassFileLoader { private List clzPaths = new ArrayList(); + public ClassFileLoader(){ + + } + public byte[] readBinaryCode(String className) { String classPath = convertToFilePath(className); File targetFile = null; for(int i = 0; i< clzPaths.size(); i++){ String fullPath = clzPaths.get(i)+File.separator+classPath; - System.out.println("path: " + fullPath); + //System.out.println("path: " + fullPath); File temp = new File(fullPath); if(temp.exists()) { targetFile = temp; @@ -29,10 +35,10 @@ public byte[] readBinaryCode(String className) { } if(targetFile != null){ - System.out.println("targetFile: " + targetFile.getAbsolutePath()); + //System.out.println("targetFile: " + targetFile.getAbsolutePath()); } long fileLength = targetFile.length(); - System.out.println("File length: " + fileLength); + //System.out.println("File length: " + fileLength); byte[] byteArray = new byte[(int)fileLength]; FileInputStream is = null; try { @@ -61,6 +67,14 @@ public byte[] readBinaryCode(String className) { } + public ClassFile loadClass(String className){ + byte[] ba = readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(ba); + } + + + private String convertToFilePath(String className){ return className.replaceAll("\\.", File.separator) + ".class"; } diff --git a/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java new file mode 100755 index 0000000000..c168129abc --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,165 @@ +package com.coderising.jvm.loader; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import com.coderising.jvm.attr.InvalidAttributeInfoException; +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantInfoFactory; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.InvalidConstantInfoTypeException; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.interfaze.Interfaze; +import com.coderising.jvm.interfaze.InvalidInterfaceException; +import com.coderising.jvm.method.InvalidMethodInfoException; +import com.coderising.jvm.method.Method; + +public class ClassFileParser { + ClassFile clz = null; + public ClassFile parse(byte[] codes) { + clz = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + String magicHex = iter.getNextNHexString(4); + System.out.println("Magic Number: "+magicHex); + try{ + String minorHex = iter.getNextHexString() + iter.getNextHexString(); + int minorVersionInt = Integer.parseInt(minorHex, 16); + String majorHex = iter.getNextHexString() + iter.getNextHexString(); + int majorVersionInt = Integer.parseInt(majorHex, 16); + clz.setMajorVersion(majorVersionInt);clz.setMinorVersion(minorVersionInt); + System.out.println("Major version: " + majorVersionInt + " minor version: " + minorVersionInt); + clz.setConstPool(parseConstantPool(iter)); + fillClassInfo(clz, clz.getConstantPool()); + System.out.println(iter.peekNextNHex(8)); + parseAccessFlag(iter); + parseClassInfex(iter);parseClassInfex(iter); + parseInterface(iter); + parseFields(iter); + parseMethods(iter); + } + catch(Exception e){ + e.printStackTrace(); + } + return clz; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + ConstantPool cp = clz.getConstantPool(); + int visitFlagIndex = iter.getNextNBytesInteger(2); + System.out.println("visit flag index: " + visitFlagIndex + " variable value: " + cp.getUTF8String(visitFlagIndex)); + return null; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + int classInfIndex = iter.getNextNBytesInteger(2); + System.out.println("class info: " + classInfIndex); + return null; + + } + + private List parseInterface(ByteCodeIterator iter) throws InvalidInterfaceException{ + int interfaceCount = iter.getNextNBytesInteger(2); + if(interfaceCount>0){ + throw new InvalidInterfaceException("Unimplemented interface parser: " + interfaceCount); + } + return null; + } + + private void parseFields(ByteCodeIterator iter){ + int fieldsCount = iter.getNextNBytesInteger(2); + System.out.println("Fields count: " + fieldsCount); + List fields = new LinkedList<>(); + for(int i = 0; i methods = new ArrayList<>(); + for(int i = 0; i 1){ + try { + constantInfoFactory.fillNextConstantInfo(); + } catch ( Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + break; + } + + } + +// 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()); + } + + + + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + +} diff --git a/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java b/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java new file mode 100644 index 0000000000..a0e42c0f0e --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/test/ClassFileloaderTest2.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + + + + + +public class ClassFileloaderTest2 { + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + static String path1 = "/Users/erlisuo/Documents/workspace/codeRising2017working/1282579502/bin"; + static String path3 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static ClassFileLoader loader = null; + static { + loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + //clzFile.print(); + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + +} diff --git a/group17/1282579502/src/com/coderising/jvm/util/Util.java b/group17/1282579502/src/com/coderising/jvm/util/Util.java new file mode 100755 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group17/1282579502/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 priorityMap = null; + List exprTokens = null; + public InfixExpr(String expr) { + priorityMap = new HashMap(); + init(); + this.expr = expr; + exprTokens = parse(); + } + + public void init(){ + priorityMap.put('+', 0); + priorityMap.put('-', 0); + priorityMap.put('*', 1); + priorityMap.put('/', 1); + } + + public float evaluate() { + Stack operatorStack = new Stack<>(); + Stack operandStack = new Stack<>(); + + Float operandOne, operandTwo; + + int index = 0; + + while(index < exprTokens.size()){ + String cc = exprTokens.get(index); + try{ + if(isFloat(cc)){ + System.out.println("push operand: " + cc); + operandStack.push(Float.parseFloat(cc)); + System.out.println("peek: " + operandStack.peek()); + + } + else if(priorityMap.get(cc.charAt(0)) != null){ + char c = cc.charAt(0); + if(operatorStack.isEmpty()){ + System.out.println("push operator: " + cc); + operatorStack.push(c); + } + else{ + int preOperatorPriority = getPriority(operatorStack.peek()); + int curOperatorPriority = getPriority(c); + if(curOperatorPriority <= preOperatorPriority){ + //do precalculation first + operandTwo = operandStack.pop(); + operandOne = operandStack.pop(); + char operator = operatorStack.pop(); + float result = doCalculation(operandOne, operandTwo, operator); + + operandStack.push(result); + operatorStack.push(c); + } + else{ + System.out.println("push operator: " + cc); + operatorStack.push(c); + } + } + } + else{ + throw new Exception("Unsupported character: " + cc); + } + } + catch(Exception e){ + e.printStackTrace(); + } + index ++; + } + System.out.println("dumpping operator stack:"); + dumpStack(operatorStack); + System.out.println("dumpping operand stack:"); + dumpStack(operandStack); + try{ + while(!operatorStack.isEmpty()){ + operandTwo = operandStack.pop(); + operandOne = operandStack.pop(); + char operator = operatorStack.pop(); + float result = doCalculation(operandOne, operandTwo, operator); + + operandStack.push(result); + } + }catch(Exception e){ + e.printStackTrace(); + } + + if(operandStack.size() > 1){ + System.err.println("More than one result reminded in operands stack."); + } + return operandStack.pop(); + } + + private float doCalculation(float operandOne, float operandTwo, char operator) throws Exception{ + System.out.println("operand 1: " + operandOne + " operand 2: " + operandTwo + " operator: " + operator); + float result = 0f; + if(operator == '+'){ + result = operandOne + operandTwo; + } + else if(operator == '-'){ + result = operandOne - operandTwo; + } + else if(operator == '*'){ + result = operandOne * operandTwo; + } + else if(operator == '/'){ + result = operandOne / operandTwo; + } + else{ + throw new Exception("Unsupported operator"); + } + System.out.println("result: " + result); + return result; + } + + private int getPriority(Character c){ + return priorityMap.get(c); + } + + private boolean isFloat(String v){ + try{ + Float.parseFloat(v); + return true; + } + catch(Exception e){ + return false; + } + } + + private List parse(){ + List vals = new ArrayList<>(); + int p1 = 0; + int p2 = 1; + while(p2= size) + private void checkBounds(int index, boolean isAdd) { + if (isAdd && (index < 0 || index > size)) { + throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); + } else if (!isAdd && (index < 0 || index >= size)) throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]"); } diff --git a/group17/785396327/3.26/jvm_1/ClassFileLoader.java b/group17/785396327/3.26/jvm_1/ClassFileLoader.java index 95f68a5a7f..66f209f161 100644 --- a/group17/785396327/3.26/jvm_1/ClassFileLoader.java +++ b/group17/785396327/3.26/jvm_1/ClassFileLoader.java @@ -1,5 +1,8 @@ package jvm_1; +import clz.ClassFile; +import parse.ClassFilePaser; + import java.io.*; import java.util.ArrayList; import java.util.List; @@ -47,4 +50,10 @@ public String getClassPath() { } return sb.substring(0, sb.length() - 1); } + + public ClassFile loadClass(String className) { + byte[] bytes = readBinaryCode(className); + ClassFilePaser classFilePaser = new ClassFilePaser(); + return classFilePaser.parse(bytes); + } } diff --git a/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java b/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java index 067cd93c2b..5a298da661 100644 --- a/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java +++ b/group17/785396327/3.26/jvm_1/ClassFileloaderTest.java @@ -9,7 +9,7 @@ * Created by william on 2017/4/5. */ public class ClassFileloaderTest { - static String path1 = "D:\\workspace\\IDEA\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; + static String path1 = "G:\\Git\\homework\\coding2017\\group17\\785396327\\3.12\\out\\production\\785396327"; static String path2 = "C:\temp"; diff --git a/group17/785396327/4.16/cmd/BiPushCmd.java b/group17/785396327/4.16/cmd/BiPushCmd.java new file mode 100644 index 0000000000..79da192e67 --- /dev/null +++ b/group17/785396327/4.16/cmd/BiPushCmd.java @@ -0,0 +1,29 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; +import engine.ExecutionResult; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by william on 2017/4/17. + */ +public class BiPushCmd extends OneOperandCmd { + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } + +} diff --git a/group17/785396327/4.16/cmd/ByteCodeCommand.java b/group17/785396327/4.16/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..66abdd0865 --- /dev/null +++ b/group17/785396327/4.16/cmd/ByteCodeCommand.java @@ -0,0 +1,131 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantInfo; +import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by william on 2017/4/17. + */ +public abstract class ByteCodeCommand { + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame, FrameResult result); +} diff --git a/group17/785396327/4.16/cmd/CommandParser.java b/group17/785396327/4.16/cmd/CommandParser.java new file mode 100644 index 0000000000..02d06cd275 --- /dev/null +++ b/group17/785396327/4.16/cmd/CommandParser.java @@ -0,0 +1,214 @@ +package cmd; + +import clz.ClassFile; +import constant.ClassInfo; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by william on 2017/4/17. + */ +public class CommandParser { + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + CommandIterator commandIterator = new CommandIterator(codes); + List commandList = new ArrayList(); + while (commandIterator.hasNext()) { + String command = commandIterator.next2CharAsString().toUpperCase(); + if (command.equals(aconst_null)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(new_object)) { + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, command); + newObjectCmd.setOprand1(commandIterator.next2CharAsInt()); + newObjectCmd.setOprand2(commandIterator.next2CharAsInt()); + newObjectCmd.setOffset(newObjectCmd.getLength()); + commandList.add(newObjectCmd); + } else if (command.equals(lstore)) { + + } else if (command.equals(invokespecial)) { + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, command); + invokeSpecialCmd.setOprand1(commandIterator.next2CharAsInt()); + invokeSpecialCmd.setOprand2(commandIterator.next2CharAsInt()); + invokeSpecialCmd.setOffset(invokeSpecialCmd.getLength()); + commandList.add(invokeSpecialCmd); + } else if (command.equals(invokevirtual)) { + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, command); + invokeVirtualCmd.setOprand1(commandIterator.next2CharAsInt()); + invokeVirtualCmd.setOprand2(commandIterator.next2CharAsInt()); + invokeVirtualCmd.setOffset(invokeVirtualCmd.getLength()); + commandList.add(invokeVirtualCmd); + } else if (command.equals(getfield)) { + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, command); + getFieldCmd.setOprand1(commandIterator.next2CharAsInt()); + getFieldCmd.setOprand2(commandIterator.next2CharAsInt()); + getFieldCmd.setOffset(getFieldCmd.getLength()); + commandList.add(getFieldCmd); + } else if (command.equals(putfield)) { + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, command); + putFieldCmd.setOprand1(commandIterator.next2CharAsInt()); + putFieldCmd.setOprand2(commandIterator.next2CharAsInt()); + putFieldCmd.setOffset(putFieldCmd.getLength()); + commandList.add(putFieldCmd); + } else if (command.equals(getstatic)) { + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, command); + getStaticFieldCmd.setOprand1(commandIterator.next2CharAsInt()); + getStaticFieldCmd.setOprand2(commandIterator.next2CharAsInt()); + getStaticFieldCmd.setOffset(getStaticFieldCmd.getLength()); + commandList.add(getStaticFieldCmd); + } else if (command.equals(ldc)) { + LdcCmd ldcCmd = new LdcCmd(clzFile, command); + ldcCmd.setOperand(commandIterator.next2CharAsInt()); + ldcCmd.setOffset(ldcCmd.getLength()); + commandList.add(ldcCmd); + } else if (command.equals(dup)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(bipush)) { + BiPushCmd biPushCmd = new BiPushCmd(clzFile, command); + biPushCmd.setOperand(commandIterator.next2CharAsInt()); + biPushCmd.setOffset(biPushCmd.getLength()); + commandList.add(biPushCmd); + } else if (command.equals(aload_0)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(aload_1)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(aload_2)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(iload)) { + + } else if (command.equals(iload_2)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(iload_1)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(iload_3)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(fload_3)) { + + } else if (command.equals(voidreturn)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(ireturn)) { + + } else if (command.equals(freturn)) { + + } else if (command.equals(astore_1)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, command); + noOperandCmd.setOffset(noOperandCmd.getLength()); + commandList.add(noOperandCmd); + } else if (command.equals(if_icmp_ge)) { + + } else if (command.equals(if_icmple)) { + + } else if (command.equals(goto_no_condition)) { + + } else if (command.equals(iconst_0)) { + + } else if (command.equals(iconst_1)) { + + } else if (command.equals(istore_1)) { + + } else if (command.equals(istore_2)) { + + } else if (command.equals(iadd)) { + + } else if (command.equals(iinc)) { + + } else { + throw new RuntimeException("wrong command : " + command); + } + } + calcuateOffset(commandList); + return commandList.toArray(new ByteCodeCommand[commandList.size()]); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + /** + * 从字符串中截取前两个字符 + * + * @return + */ + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group17/785396327/4.16/cmd/GetFieldCmd.java b/group17/785396327/4.16/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..59425edc38 --- /dev/null +++ b/group17/785396327/4.16/cmd/GetFieldCmd.java @@ -0,0 +1,27 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by william on 2017/4/17. + */ +public class GetFieldCmd extends TwoOperandCmd { + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } + +} diff --git a/group17/785396327/4.16/cmd/GetStaticFieldCmd.java b/group17/785396327/4.16/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..c21e230306 --- /dev/null +++ b/group17/785396327/4.16/cmd/GetStaticFieldCmd.java @@ -0,0 +1,27 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by IBM on 2017/4/17. + */ +public class GetStaticFieldCmd extends TwoOperandCmd { + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } +} diff --git a/group17/785396327/4.16/cmd/InvokeSpecialCmd.java b/group17/785396327/4.16/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..3dd0c7b70e --- /dev/null +++ b/group17/785396327/4.16/cmd/InvokeSpecialCmd.java @@ -0,0 +1,27 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by IBM on 2017/4/17. + */ +public class InvokeSpecialCmd extends TwoOperandCmd { + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } +} diff --git a/group17/785396327/4.16/cmd/InvokeVirtualCmd.java b/group17/785396327/4.16/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..254534a78f --- /dev/null +++ b/group17/785396327/4.16/cmd/InvokeVirtualCmd.java @@ -0,0 +1,26 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by IBM on 2017/4/17. + */ +public class InvokeVirtualCmd extends TwoOperandCmd { + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } +} diff --git a/group17/785396327/4.16/cmd/LdcCmd.java b/group17/785396327/4.16/cmd/LdcCmd.java new file mode 100644 index 0000000000..ce1f34df3c --- /dev/null +++ b/group17/785396327/4.16/cmd/LdcCmd.java @@ -0,0 +1,37 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantInfo; +import constant.ConstantPool; +import constant.StringInfo; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by IBM on 2017/4/17. + */ +public class LdcCmd extends OneOperandCmd { + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + value = strInfo.toString(); + } + + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; + + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } +} diff --git a/group17/785396327/4.16/cmd/NewObjectCmd.java b/group17/785396327/4.16/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..d284274f0b --- /dev/null +++ b/group17/785396327/4.16/cmd/NewObjectCmd.java @@ -0,0 +1,27 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by gongxun on 2017/4/17. + */ +public class NewObjectCmd extends TwoOperandCmd { + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } + +} diff --git a/group17/785396327/4.16/cmd/NoOperandCmd.java b/group17/785396327/4.16/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..828ae2094e --- /dev/null +++ b/group17/785396327/4.16/cmd/NoOperandCmd.java @@ -0,0 +1,30 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by IBM on 2017/4/17. + */ +public class NoOperandCmd extends ByteCodeCommand { + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } + + + public int getLength(){ + return 1; + } +} diff --git a/group17/785396327/4.16/cmd/OneOperandCmd.java b/group17/785396327/4.16/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..4f3dbc9feb --- /dev/null +++ b/group17/785396327/4.16/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package cmd; + +import clz.ClassFile; + +/** + * Created by IBM on 2017/4/17. + */ +public abstract class OneOperandCmd extends ByteCodeCommand { + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } +} diff --git a/group17/785396327/4.16/cmd/PutFieldCmd.java b/group17/785396327/4.16/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..f0994739a0 --- /dev/null +++ b/group17/785396327/4.16/cmd/PutFieldCmd.java @@ -0,0 +1,26 @@ +package cmd; + +import clz.ClassFile; +import constant.ConstantPool; +import engine.FrameResult; +import engine.StackFrame; + +/** + * Created by IBM on 2017/4/17. + */ +public class PutFieldCmd extends TwoOperandCmd { + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, FrameResult result) { + + } +} diff --git a/group17/785396327/4.16/cmd/TwoOperandCmd.java b/group17/785396327/4.16/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..a12df75e52 --- /dev/null +++ b/group17/785396327/4.16/cmd/TwoOperandCmd.java @@ -0,0 +1,65 @@ +package cmd; + +import clz.ClassFile; +import constant.*; + +/** + * Created by IBM on 2017/4/17. + */ +public abstract class TwoOperandCmd extends ByteCodeCommand { + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group17/785396327/4.16/print/ClassFilePrinter.java b/group17/785396327/4.16/print/ClassFilePrinter.java new file mode 100644 index 0000000000..7d8c878553 --- /dev/null +++ b/group17/785396327/4.16/print/ClassFilePrinter.java @@ -0,0 +1,44 @@ +package print; + +import clz.ClassFile; +import jvm_1.ClassFileLoader; + +/** + * Created by gongxun on 2017/4/21. + */ +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + } + + public static void main(String[] args){ + String path = "G:\\Git\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "jvm_1.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group17/785396327/4.16/print/ConstantPoolPrinter.java b/group17/785396327/4.16/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..6c4d4fee4a --- /dev/null +++ b/group17/785396327/4.16/print/ConstantPoolPrinter.java @@ -0,0 +1,114 @@ +package print; + +import constant.*; + +/** + * Created by gongxun on 2017/4/21. + */ +public class ConstantPoolPrinter { + ConstantPool pool; + + ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + @Override + public void visitClassInfo(ClassInfo info) { + // #7 = Class #44 // jvm_1/EmployeeV1 + StringBuilder sb = new StringBuilder(); + sb.append("Class") + .append("\t\t\t") + .append("#" + info.getUtf8Index()) + .append("\t\t\t\t") + .append("//\t") + .append(info.getClassName()); + System.out.println(sb.toString()); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + // #2 = Fieldref #7.#37 // jvm_1/EmployeeV1.name:Ljava/lang/String; + StringBuilder sb = new StringBuilder(); + sb.append("Fieldref") + .append("\t\t") + .append("#" + info.getClassInfoIndex()) + .append(".") + .append("#" + info.getNameAndTypeIndex()) + .append("\t\t\t") + .append("//\t") + .append(info.getClassName()) + .append(".") + .append(info.getFieldName()) + .append(info.getFieldType()); + System.out.println(sb.toString()); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + // #1 = Methodref #11.#36 // java/lang/Object."":()V + StringBuilder sb = new StringBuilder(); + sb.append("Methodref") + .append("\t\t") + .append("#" + info.getClassInfoIndex()) + .append(".") + .append("#" + info.getNameAndTypeIndex()) + .append("\t\t\t") + .append("//\t") + .append(info.getClassName()) + .append(".") + .append(info.getMethodName()); + System.out.println(sb.toString()); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + // #36 = NameAndType #16:#28 // "":()V + StringBuilder sb = new StringBuilder(); + sb.append("NameAndType") + .append("\t\t") + .append("#" + info.getIndex1()) + .append(":") + .append("#" + info.getIndex2()) + .append("\t\t\t") + .append("//\t") + .append(info.getTypeInfo()) + .append(":") + .append(info.getName()); + System.out.println(sb.toString()); + } + + @Override + public void visitString(StringInfo info) { + // #5 = String #41 // Hello , this is class Employee + StringBuilder sb = new StringBuilder(); + sb.append("String") + .append("\t\t\t") + .append("#" + info.getIndex()) + .append("\t\t\t\t") + .append("//\t") + .append(((UTF8Info) info.getConstantInfo(info.getIndex())).getValue()); + System.out.println(sb.toString()); + } + + @Override + public void visistUTF8(UTF8Info info) { + // #32 = Utf8 [Ljava/lang/String; + StringBuilder sb = new StringBuilder(); + sb.append("Utf8") + .append("\t\t\t") + .append(info.getValue()); + System.out.println(sb.toString()); + } + }; + + for (int i = 1; i < (Integer) pool.getSize(); i++) { + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#" + i + "\t=\t"); + constantInfo.accept(visitor); + } + } +} diff --git a/group17/785396327/4.23/engine/ExecutionResult.java b/group17/785396327/4.23/engine/ExecutionResult.java new file mode 100644 index 0000000000..4dcb84fb62 --- /dev/null +++ b/group17/785396327/4.23/engine/ExecutionResult.java @@ -0,0 +1,55 @@ +package engine; + +import method.Method; + +/** + * Created by gongxun on 2017/4/24. + */ +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + +} diff --git a/group17/785396327/4.23/engine/ExecutorEngine.java b/group17/785396327/4.23/engine/ExecutorEngine.java new file mode 100644 index 0000000000..729d7c12be --- /dev/null +++ b/group17/785396327/4.23/engine/ExecutorEngine.java @@ -0,0 +1,29 @@ +package engine; + +import method.Method; +import stack.Stack; + +/** + * Created by gongxun on 2017/4/24. + */ +public class ExecutorEngine { + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } +} diff --git a/group17/785396327/4.23/engine/FrameResult.java b/group17/785396327/4.23/engine/FrameResult.java new file mode 100644 index 0000000000..7630e0a37a --- /dev/null +++ b/group17/785396327/4.23/engine/FrameResult.java @@ -0,0 +1,7 @@ +package engine; + +/** + * Created by gongxun on 2017/4/24. + */ +public class FrameResult { +} diff --git a/group17/785396327/4.23/engine/Heap.java b/group17/785396327/4.23/engine/Heap.java new file mode 100644 index 0000000000..dc7c2ccf6f --- /dev/null +++ b/group17/785396327/4.23/engine/Heap.java @@ -0,0 +1,41 @@ +package engine; + +/** + * Created by gongxun on 2017/4/24. + */ +public class Heap { + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group17/785396327/4.23/engine/JavaObject.java b/group17/785396327/4.23/engine/JavaObject.java new file mode 100644 index 0000000000..efd8adf5df --- /dev/null +++ b/group17/785396327/4.23/engine/JavaObject.java @@ -0,0 +1,73 @@ +package engine; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by gongxun on 2017/4/24. + */ +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } +} diff --git a/group17/785396327/4.23/engine/MethodArea.java b/group17/785396327/4.23/engine/MethodArea.java new file mode 100644 index 0000000000..3ede83b192 --- /dev/null +++ b/group17/785396327/4.23/engine/MethodArea.java @@ -0,0 +1,70 @@ +package engine; + +import clz.ClassFile; +import constant.MethodRefInfo; +import jvm_1.ClassFileLoader; +import method.Method; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by gongxun on 2017/4/24. + */ +public class MethodArea { + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group17/785396327/4.23/engine/MiniJVM.java b/group17/785396327/4.23/engine/MiniJVM.java new file mode 100644 index 0000000000..19094eee23 --- /dev/null +++ b/group17/785396327/4.23/engine/MiniJVM.java @@ -0,0 +1,29 @@ +package engine; + +import jvm_1.ClassFileLoader; + +import java.io.FileNotFoundException; +import java.io.IOException; + +/** + * Created by gongxun on 2017/4/24. + */ +public class MiniJVM { + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException { + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } +} diff --git a/group17/785396327/4.23/queue/CircleQueue.java b/group17/785396327/4.23/queue/CircleQueue.java new file mode 100644 index 0000000000..a7ab62bf55 --- /dev/null +++ b/group17/785396327/4.23/queue/CircleQueue.java @@ -0,0 +1,59 @@ +package queue; + +import java.util.Arrays; + +/** + * Created by gongxun on 2017/4/24. + * 用数组实现循环队列 + */ +public class CircleQueue { + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return front == rear && elementData[front] == null; + + } + + public int size() { + if (isEmpty()) + return 0; + return front - rear > 0 ? DEFAULT_SIZE - front + rear : front - rear < 0 ? rear - front : DEFAULT_SIZE; + } + + + public void enQueue(E data) { + if (size() != DEFAULT_SIZE) { + elementData[rear] = data; + if (rear == DEFAULT_SIZE - 1) + rear = 0; + else + rear++; + } + } + + public E deQueue() { + E removeEle = null; + if (!isEmpty()) { + removeEle = (E) elementData[front]; + elementData[front] = null; + if (front == DEFAULT_SIZE - 1) + front = 0; + else + front++; + } + return removeEle; + } + + @Override + public String toString() { + return Arrays.toString(elementData); + } +} diff --git a/group17/785396327/4.23/queue/CircleQueueTest.java b/group17/785396327/4.23/queue/CircleQueueTest.java new file mode 100644 index 0000000000..1a3f97d9bf --- /dev/null +++ b/group17/785396327/4.23/queue/CircleQueueTest.java @@ -0,0 +1,62 @@ +package queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/25. + */ +public class CircleQueueTest { + @Before + public void startUp() { + + } + + @After + public void tearDown() { + + } + + @Test + public void testEnQueue() { + CircleQueue circleQueue = new CircleQueue(); + { + for (int i = 0; i < 9; i++) { + circleQueue.enQueue(i); + } + } + + { + + Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, null]", circleQueue.toString()); + Assert.assertEquals(9, circleQueue.size()); + + circleQueue.enQueue(9); + Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); + Assert.assertEquals(10, circleQueue.size()); + + circleQueue.enQueue(10); + Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); + Assert.assertEquals(10, circleQueue.size()); + } + + { + int removeEle = circleQueue.deQueue(); + Assert.assertEquals(0, removeEle); + circleQueue.deQueue(); + circleQueue.deQueue(); + circleQueue.deQueue(); + Assert.assertEquals("[null, null, null, null, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); + } + { + circleQueue.enQueue(-1); + Assert.assertEquals("[-1, null, null, null, 4, 5, 6, 7, 8, 9]", circleQueue.toString()); + Assert.assertEquals(7, circleQueue.size()); + } + + } + + +} diff --git a/group17/785396327/4.23/queue/Josephus.java b/group17/785396327/4.23/queue/Josephus.java new file mode 100644 index 0000000000..7285c64dfe --- /dev/null +++ b/group17/785396327/4.23/queue/Josephus.java @@ -0,0 +1,39 @@ +package queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by gongxun on 2017/4/24. + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + */ +public class Josephus { + public static List execute(int n, int m) { + if (m <= 0) + return null; + List origin = new ArrayList(); + List sequence = new ArrayList(); + for (int i = 0; i < n; i++) { + origin.add(i); + } + int count = 1;//计数器 + int index = count - 1;//当前元素的索引 + while (origin.size() > 1) { + if (count == m) { + sequence.add(origin.remove(index)); + count = 1;//删除一个元素,则重新计数 + } else { + count++; + if (index == origin.size() - 1) + //遍历到最后一个元素,重回头索引 + index = 0; + else + index++; + } + } + sequence.add(origin.get(0)); + return sequence; + } +} diff --git a/group17/785396327/4.23/queue/JosephusTest.java b/group17/785396327/4.23/queue/JosephusTest.java new file mode 100644 index 0000000000..87fe65211d --- /dev/null +++ b/group17/785396327/4.23/queue/JosephusTest.java @@ -0,0 +1,26 @@ +package queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/24. + */ +public class JosephusTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + Assert.assertEquals("[1, 0, 2]", Josephus.execute(3, 2).toString()); + } +} diff --git a/group17/785396327/4.23/queue/QueueWithTwoStacks.java b/group17/785396327/4.23/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..995bab9904 --- /dev/null +++ b/group17/785396327/4.23/queue/QueueWithTwoStacks.java @@ -0,0 +1,54 @@ +package queue; + +import stack.Stack; + +/** + * Created by gongxun on 2017/4/24. + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + public boolean isEmpty() { + return stack1.size() == 0; + } + + + public int size() { + return stack1.size(); + } + + + public void enQueue(E item) { + Stack temp = new Stack(); + stack1.push(item); + while (!stack2.isEmpty()) + temp.push(stack2.pop()); + temp.push(item); + while (!temp.isEmpty()) + stack2.push(temp.pop()); + } + + public E deQueue() { + Stack temp = new Stack(); + E ele = stack2.pop(); + while (!stack1.isEmpty()) + temp.push(stack1.pop()); + temp.pop(); + while (!temp.isEmpty()) + stack1.push(temp.pop()); + return ele; + } + + @Override + public String toString() { + return stack1.toString() + "\n" + stack2.toString(); + } +} diff --git a/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java b/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..e0c90c4b66 --- /dev/null +++ b/group17/785396327/4.23/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,37 @@ +package queue; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/26. + */ +public class QueueWithTwoStacksTest { + + private QueueWithTwoStacks queue; + + @Before + public void startUp() { + queue = new QueueWithTwoStacks(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + } + + @After + public void tearDown() { + + } + + @Test + public void enQueueTest() { + System.out.println(queue); + } + + @Test + public void deQueueTest() { + queue.deQueue(); + System.out.println(queue); + } +} diff --git a/group17/785396327/4.5/clz/AccessFlag.java b/group17/785396327/4.5/clz/AccessFlag.java new file mode 100644 index 0000000000..bbdf7c8818 --- /dev/null +++ b/group17/785396327/4.5/clz/AccessFlag.java @@ -0,0 +1,28 @@ +package clz; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } + +} diff --git a/group17/785396327/4.5/clz/ClassFile.java b/group17/785396327/4.5/clz/ClassFile.java new file mode 100644 index 0000000000..f53199e6bb --- /dev/null +++ b/group17/785396327/4.5/clz/ClassFile.java @@ -0,0 +1,120 @@ +package clz; + +import constant.ClassInfo; +import constant.ConstantInfo; +import constant.ConstantPool; +import field.Field; +import method.Method; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by IBM on 2017/4/10. + */ +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + System.out.println("Constant pool:"); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType) { + if (methods != null) { + for (Method method : methods) { + String name = getConstantPool().getUTF8String(method.getNameIndex()); + String desc = getConstantPool().getUTF8String(method.getDescriptorIndex()); + if(name.equals(methodName)&&desc.equals(paramAndReturnType)) + return method; + } + } + return null; + } + public Method getMainMethod(){ + if (methods != null) { + for (Method method : methods) { + String name = getConstantPool().getUTF8String(method.getNameIndex()); + String desc = getConstantPool().getUTF8String(method.getDescriptorIndex()); + if(name.equals("main")&&desc.equals("([Ljava/lang/String;)V")) + return method; + } + } + return null; + } +} diff --git a/group17/785396327/4.5/clz/ClassIndex.java b/group17/785396327/4.5/clz/ClassIndex.java new file mode 100644 index 0000000000..d0eb281a09 --- /dev/null +++ b/group17/785396327/4.5/clz/ClassIndex.java @@ -0,0 +1,25 @@ +package clz; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } +} diff --git a/group17/785396327/4.5/constant/ClassInfo.java b/group17/785396327/4.5/constant/ClassInfo.java new file mode 100644 index 0000000000..02aa4b2699 --- /dev/null +++ b/group17/785396327/4.5/constant/ClassInfo.java @@ -0,0 +1,32 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } + + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group17/785396327/4.5/constant/ConstantInfo.java b/group17/785396327/4.5/constant/ConstantInfo.java new file mode 100644 index 0000000000..156d96827d --- /dev/null +++ b/group17/785396327/4.5/constant/ConstantInfo.java @@ -0,0 +1,50 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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); + } + + public abstract void accept(Visitor visitor); + + public interface Visitor { + void visitClassInfo(ClassInfo info); + + void visitFieldRef(FieldRefInfo info); + + void visitMethodRef(MethodRefInfo info); + + void visitNameAndType(NameAndTypeInfo info); + + void visitString(StringInfo info); + + void visistUTF8(UTF8Info info); + + } +} diff --git a/group17/785396327/4.5/constant/ConstantPool.java b/group17/785396327/4.5/constant/ConstantPool.java new file mode 100644 index 0000000000..396ccee230 --- /dev/null +++ b/group17/785396327/4.5/constant/ConstantPool.java @@ -0,0 +1,32 @@ +package constant; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by IBM on 2017/4/10. + */ +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/group17/785396327/4.5/constant/FieldRefInfo.java b/group17/785396327/4.5/constant/FieldRefInfo.java new file mode 100644 index 0000000000..2f3d2ee351 --- /dev/null +++ b/group17/785396327/4.5/constant/FieldRefInfo.java @@ -0,0 +1,62 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } + + 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/group17/785396327/4.5/constant/MethodRefInfo.java b/group17/785396327/4.5/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7a95d2a6bb --- /dev/null +++ b/group17/785396327/4.5/constant/MethodRefInfo.java @@ -0,0 +1,58 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + 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.getNameAndTypeIndex(); + } + + 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(); + } + +} diff --git a/group17/785396327/4.5/constant/NameAndTypeInfo.java b/group17/785396327/4.5/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..c7e720c0e3 --- /dev/null +++ b/group17/785396327/4.5/constant/NameAndTypeInfo.java @@ -0,0 +1,57 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } + + + 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/group17/785396327/4.5/constant/NullConstantInfo.java b/group17/785396327/4.5/constant/NullConstantInfo.java new file mode 100644 index 0000000000..c49d937c76 --- /dev/null +++ b/group17/785396327/4.5/constant/NullConstantInfo.java @@ -0,0 +1,20 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +public class NullConstantInfo extends ConstantInfo { + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + + @Override + public void accept(Visitor visitor) { + System.out.println("null Constant info"); + } + +} diff --git a/group17/785396327/4.5/constant/StringInfo.java b/group17/785396327/4.5/constant/StringInfo.java new file mode 100644 index 0000000000..6953e7cdf8 --- /dev/null +++ b/group17/785396327/4.5/constant/StringInfo.java @@ -0,0 +1,34 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } + + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } + + + public String toString(){ + return this.getConstantPool().getUTF8String(index); + } + +} diff --git a/group17/785396327/4.5/constant/UTF8Info.java b/group17/785396327/4.5/constant/UTF8Info.java new file mode 100644 index 0000000000..814615f4f2 --- /dev/null +++ b/group17/785396327/4.5/constant/UTF8Info.java @@ -0,0 +1,39 @@ +package constant; + +/** + * Created by IBM on 2017/4/10. + */ +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 void accept(Visitor visitor) { + visitor.visistUTF8(this); + } + + @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/group17/785396327/4.5/iterator/ByteCodeIterator.java b/group17/785396327/4.5/iterator/ByteCodeIterator.java new file mode 100644 index 0000000000..adfc288cc2 --- /dev/null +++ b/group17/785396327/4.5/iterator/ByteCodeIterator.java @@ -0,0 +1,64 @@ +package iterator; + +import util.Util; + +import java.util.Arrays; + +/** + * Created by IBM on 2017/4/11. + */ +public class ByteCodeIterator { + + byte[] codes; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public String nextU4ToHexString() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 4; i++) { + byte code = codes[i]; + int value = code & 0xff; + sb.append(Integer.toHexString(value)); + } + codes = Arrays.copyOfRange(codes, 4, codes.length); + return sb.toString(); + } + + public int nextU2ToInt() { + byte[] buff = new byte[]{codes[0], codes[1]}; + codes = Arrays.copyOfRange(codes, 2, codes.length); + return Util.byteToInt(buff); + } + + public int nextU1ToInt() { + byte[] buff = new byte[]{codes[0]}; + codes = Arrays.copyOfRange(codes, 1, codes.length); + return Util.byteToInt(buff); + } + + public byte[] nextLengthBytes(int length) { + byte[] result = new byte[length]; + for (int i = 0; i < length; i++) { + result[i] = codes[i]; + } + codes = Arrays.copyOfRange(codes, length, codes.length); + return result; + } + + public String nextLengthString(int length) { + byte[] result = new byte[length]; + for (int i = 0; i < length; i++) { + result[i] = codes[i]; + } + codes = Arrays.copyOfRange(codes, length, codes.length); + return Util.byteToHexString(result); + } + + public int nextU4ToInt() { + byte[] buff = new byte[]{codes[0], codes[1], codes[2], codes[3]}; + codes = Arrays.copyOfRange(codes, 4, codes.length); + return Util.byteToInt(buff); + } +} diff --git a/group17/785396327/4.5/parse/ClassFilePaser.java b/group17/785396327/4.5/parse/ClassFilePaser.java new file mode 100644 index 0000000000..eb6514f449 --- /dev/null +++ b/group17/785396327/4.5/parse/ClassFilePaser.java @@ -0,0 +1,121 @@ +package parse; + +import clz.AccessFlag; +import clz.ClassFile; +import clz.ClassIndex; +import com.sun.corba.se.impl.orbutil.closure.Constant; +import constant.*; +import field.Field; +import iterator.ByteCodeIterator; +import method.Method; +import util.Util; + +import java.util.List; + +/** + * Created by william on 2017/4/11. + */ +public class ClassFilePaser { + private ClassFile classFile; + + public ClassFile parse(byte[] codes) { + classFile = new ClassFile(); + + ByteCodeIterator iterator = new ByteCodeIterator(codes); + String magic = iterator.nextU4ToHexString(); + if (!"cafebabe".equals(magic)) + return null; + + classFile.setMinorVersion(iterator.nextU2ToInt()); + classFile.setMajorVersion(iterator.nextU2ToInt()); + + ConstantPool constantPool = parseConstantPool(iterator); + classFile.setConstPool(constantPool); + + AccessFlag accessFlag = parseAccessFlag(iterator); + classFile.setAccessFlag(accessFlag); + + ClassIndex classIndex = parseClassIndex(iterator); + classFile.setClassIndex(classIndex); + + iterator.nextU2ToInt();//没有接口直接读取两个字节 + + int fieldCount = iterator.nextU2ToInt(); + for (int i = 0; i < fieldCount; i++) { + Field field = parseField(iterator, constantPool); + classFile.addField(field); + } + + int methodCount = iterator.nextU2ToInt(); + for (int i = 0; i < methodCount; i++) { + Method method = parseMethod(iterator, classFile); + classFile.addMethod(method); + } + return classFile; + } + + private Method parseMethod(ByteCodeIterator iterator, ClassFile classFile) { + return Method.parse(classFile,iterator); + } + + private Field parseField(ByteCodeIterator iterator, ConstantPool constantPool) { + return Field.parse(constantPool, iterator); + } + + private ClassIndex parseClassIndex(ByteCodeIterator iterator) { + ClassIndex classIndex = new ClassIndex(); + classIndex.setThisClassIndex(iterator.nextU2ToInt()); + classIndex.setSuperClassIndex(iterator.nextU2ToInt()); + return classIndex; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iterator) { + AccessFlag accessFlag = new AccessFlag(iterator.nextU2ToInt()); + return accessFlag; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iterator) { + int poolSize = iterator.nextU2ToInt(); + System.out.println("constant pool size = " + (poolSize - 1)); + + ConstantPool constantPool = new ConstantPool(); + + constantPool.addConstantInfo(new NullConstantInfo()); + for (int i = 1; i < poolSize; i++) { + int tag = iterator.nextU1ToInt(); + if (tag == ConstantInfo.CLASS_INFO) { + ClassInfo classInfo = new ClassInfo(constantPool); + classInfo.setUtf8Index(iterator.nextU2ToInt()); + constantPool.addConstantInfo(classInfo); + } else if (tag == ConstantInfo.METHOD_INFO) { + MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool); + methodRefInfo.setClassInfoIndex(iterator.nextU2ToInt()); + methodRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt()); + constantPool.addConstantInfo(methodRefInfo); + } else if (tag == ConstantInfo.FIELD_INFO) { + FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool); + fieldRefInfo.setClassInfoIndex(iterator.nextU2ToInt()); + fieldRefInfo.setNameAndTypeIndex(iterator.nextU2ToInt()); + constantPool.addConstantInfo(fieldRefInfo); + } else if (tag == ConstantInfo.STRING_INFO) { + StringInfo stringInfo = new StringInfo(constantPool); + stringInfo.setIndex(iterator.nextU2ToInt()); + constantPool.addConstantInfo(stringInfo); + } else if (tag == ConstantInfo.NAME_AND_TYPE_INFO) { + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool); + nameAndTypeInfo.setIndex1(iterator.nextU2ToInt()); + nameAndTypeInfo.setIndex2(iterator.nextU2ToInt()); + constantPool.addConstantInfo(nameAndTypeInfo); + } else if (tag == ConstantInfo.UTF8_INFO) { + UTF8Info utf8Info = new UTF8Info(constantPool); + int length = iterator.nextU2ToInt(); + utf8Info.setLength(length); + utf8Info.setValue(new String(iterator.nextLengthBytes(length))); + constantPool.addConstantInfo(utf8Info); + } else { + System.out.println("other class info "); + } + } + return constantPool; + } +} diff --git a/group17/785396327/4.5/stack/MyStack.java b/group17/785396327/4.5/stack/MyStack.java new file mode 100644 index 0000000000..80ee0fdd62 --- /dev/null +++ b/group17/785396327/4.5/stack/MyStack.java @@ -0,0 +1,35 @@ +package stack; + +import java.util.ArrayList; + +/** + * Created by gongxun on 2017/4/12. + */ +public class MyStack { + private ArrayList elementData = new ArrayList(); + + public void push(T o) { + elementData.add(0, o); + } + + public T pop() { + return elementData.remove(0); + } + + public T peek() { + return elementData.get(0); + } + + public boolean isEmpty() { + return elementData.isEmpty(); + } + + public int size() { + return elementData.size(); + } + + @Override + public String toString() { + return elementData.toString(); + } +} diff --git a/group17/785396327/4.5/stack/StackUtil.java b/group17/785396327/4.5/stack/StackUtil.java new file mode 100644 index 0000000000..afaa5fce1b --- /dev/null +++ b/group17/785396327/4.5/stack/StackUtil.java @@ -0,0 +1,115 @@ +package stack; + +/** + * Created by gongxun on 2017/4/12. + */ +public class StackUtil { + public static void bad_reverse(MyStack s) { + + } + + + public static void reverse_247565311(MyStack s) { + + } + + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(MyStack s) { + MyStack tempStack = new MyStack(); + while (!s.isEmpty()) + addToBottom(tempStack, s.pop()); + while (!tempStack.isEmpty()) + s.push(tempStack.pop()); + } + + public static void addToBottom(MyStack s, Integer value) { + MyStack reserveStack = new MyStack(); + while (!s.isEmpty()) + reserveStack.push(s.pop()); + s.push(value); + while (!reserveStack.isEmpty()) + s.push(reserveStack.pop()); + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(MyStack s, Object o) { + if (null == o) + return; + MyStack tempStack = new MyStack(); + while (!s.isEmpty()) { + if (!s.peek().equals(o)) { + tempStack.push(s.pop()); + } else { + s.pop(); + break; + } + } + while (!tempStack.isEmpty()) + s.push(tempStack.pop()); + } + + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(MyStack s, int len) { + if (len > s.size()) + return null; + Object[] datas = new Object[len]; + for (int i = 0; i < len; i++) { + datas[i] = s.pop(); + } + return datas; + } + + /** + * 字符串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) { + if (s == null || s.trim().isEmpty()) + return false; + String[] arr = s.split(""); + MyStack stack = new MyStack(); + for (int i = 0; i < arr.length; i++) { + if ("(".equals(arr[i]) || "[".equals(arr[i]) || "{".equals(arr[i])) + stack.push(arr[i]); + if (")".equals(arr[i])) { + if (stack.peek().equals("(")) + stack.pop(); + else + return false; + } + if ("]".equals(arr[i])) { + if (stack.peek().equals("[")) + stack.pop(); + else + return false; + } + if ("}".equals(arr[i])) { + if (stack.peek().equals("{")) + stack.pop(); + else + return false; + } + } + return stack.size() == 0;//最后判断stack中没有元素了,可能有单个括号 + } +} diff --git a/group17/785396327/4.5/stack/StackUtilTest.java b/group17/785396327/4.5/stack/StackUtilTest.java new file mode 100644 index 0000000000..bf411a953a --- /dev/null +++ b/group17/785396327/4.5/stack/StackUtilTest.java @@ -0,0 +1,101 @@ +package stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/12. + */ +public class StackUtilTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + /** + * [头元素,...,尾元素] + */ + @Test + public void testStack() { + MyStack stack = new MyStack(); + stack.push(1); + stack.push(2); + System.out.println(stack); + } + + @Test + public void testAddToBottom() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[3, 2, 1, 0]", s.toString()); + + } + + @Test + public void testReverse() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + } + + @Test + public void testReverse_247565311() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + + Assert.assertEquals("[1, 2, 3]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[3, 1]", s.toString()); + } + + @Test + public void testGetTop() { + MyStack s = new MyStack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group17/785396327/4.5/test/ClassFileloaderTest.java b/group17/785396327/4.5/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..2276ee4eaf --- /dev/null +++ b/group17/785396327/4.5/test/ClassFileloaderTest.java @@ -0,0 +1,348 @@ +package test; + +import clz.ClassFile; +import clz.ClassIndex; +import cmd.BiPushCmd; +import cmd.ByteCodeCommand; +import cmd.OneOperandCmd; +import cmd.TwoOperandCmd; +import constant.*; +import field.Field; +import jvm_1.ClassFileLoader; +import method.Method; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +/** + * Created by IBM on 2017/4/10. + */ +public class ClassFileloaderTest { + private static final String FULL_QUALIFIED_CLASS_NAME = "jvm_1/EmployeeV1"; + + static String path1 = "G:\\Git\\homework\\coding2017\\group17\\785396327\\out\\production\\785396327"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "jvm_1.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "jvm_1.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1020, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(17); + Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(18); + Assert.assertEquals("Code", utf8Info.getValue()); + } + + { + MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(1); + Assert.assertEquals(11, methodRef.getClassInfoIndex()); + Assert.assertEquals(36, 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab700012a2bb500022a1cb50003b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb50002b1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50003b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b200041205b60006b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb0007591208101db700094c2bb6000ab1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #1", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #2", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #3", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #2", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #4", cmds[0]); + assertOpCodeEquals("3: ldc #5", cmds[1]); + assertOpCodeEquals("5: invokevirtual #6", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #7", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #8", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #9", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #10", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + +} diff --git a/group17/785396327/4.5/util/Util.java b/group17/785396327/4.5/util/Util.java new file mode 100644 index 0000000000..e35332238c --- /dev/null +++ b/group17/785396327/4.5/util/Util.java @@ -0,0 +1,28 @@ +package util; + +/** + * Created by william on 2017/4/10. + */ +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 items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter,int attributeNameIndex) { + int attributeLength = iter.nextU4ToInt(); + int lineNumberTableLength = iter.nextU2ToInt(); + LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex,attributeLength); + for (int i = 0; i < lineNumberTableLength; i++) { + int start_pc = iter.nextU2ToInt(); + int lineNumber = iter.nextU2ToInt(); + LineNumberItem lineNumberItem = new LineNumberItem(); + lineNumberItem.setLineNum(lineNumber); + lineNumberItem.setStartPC(start_pc); + lineNumberTable.addLineNumberItem(lineNumberItem); + } + return lineNumberTable; + } + + +} diff --git a/group17/785396327/4.9/attr/LocalVariableItem.java b/group17/785396327/4.9/attr/LocalVariableItem.java new file mode 100644 index 0000000000..d0213e92f5 --- /dev/null +++ b/group17/785396327/4.9/attr/LocalVariableItem.java @@ -0,0 +1,42 @@ +package attr; + +/** + * Created by IBM on 2017/4/12. + */ +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group17/785396327/4.9/attr/LocalVariableTable.java b/group17/785396327/4.9/attr/LocalVariableTable.java new file mode 100644 index 0000000000..9cb74c9697 --- /dev/null +++ b/group17/785396327/4.9/attr/LocalVariableTable.java @@ -0,0 +1,43 @@ +package attr; + +import iterator.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by william on 2017/4/12. + */ +public class LocalVariableTable extends AttributeInfo { + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter, int attributeNameIndex) { + int attributeLength = iter.nextU4ToInt(); + int localVariableTableLength = iter.nextU2ToInt(); + LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex, attributeLength); + for (int i = 0; i < localVariableTableLength; i++) { + int startPc = iter.nextU2ToInt(); + int length = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int index = iter.nextU2ToInt(); + LocalVariableItem localVariableItem = new LocalVariableItem(); + localVariableItem.setStartPC(startPc); + localVariableItem.setLength(length); + localVariableItem.setNameIndex(nameIndex); + localVariableItem.setDescIndex(descIndex); + localVariableItem.setIndex(index); + localVariableTable.addLocalVariableItem(localVariableItem); + } + return localVariableTable; + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + +} diff --git a/group17/785396327/4.9/attr/StackMapTable.java b/group17/785396327/4.9/attr/StackMapTable.java new file mode 100644 index 0000000000..fce272fd9f --- /dev/null +++ b/group17/785396327/4.9/attr/StackMapTable.java @@ -0,0 +1,31 @@ +package attr; + +import iterator.ByteCodeIterator; + +/** + * Created by william on 2017/4/12. + */ +public class StackMapTable extends AttributeInfo { + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter,int index){ +// int len = iter.nextU4ToInt(); +// StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 +// String code = iter.nextUxToHexString(len); +// t.setOriginalCode(code); + +// return t; + return null; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group17/785396327/4.9/expr/ExprParser.java b/group17/785396327/4.9/expr/ExprParser.java new file mode 100644 index 0000000000..09a909fbad --- /dev/null +++ b/group17/785396327/4.9/expr/ExprParser.java @@ -0,0 +1,37 @@ +package expr; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by IBM on 2017/4/15. + */ +public class ExprParser { + + public static List parse(InfixExpr infixExpr) { + if (infixExpr == null || infixExpr.expr == null || infixExpr.expr.trim().isEmpty()) + return null; + String[] split = infixExpr.expr.split(""); + List results = new ArrayList(); + StringBuilder numberBuffer = new StringBuilder(); + for (int i = 0; i < split.length; i++) { + String ele = split[i]; + if (ele.equals(OperEnum.ADD.getOperator()) || ele.equals(OperEnum.SUBTRACT.getOperator()) || ele.equals(OperEnum.MINUS.getOperator()) || ele.equals(OperEnum.MULTIPLY.getOperator())) { + results.add(numberBuffer.toString()); + numberBuffer.delete(0, numberBuffer.length()); + results.add(ele); + } else + numberBuffer.append(ele); + } + results.add(numberBuffer.toString()); + return results; + } + + public static boolean belongsHighPriority(String operEle) { + return belongsOperator(operEle) && (operEle.trim().equals(OperEnum.MINUS.getOperator()) || operEle.trim().equals(OperEnum.MULTIPLY.getOperator())); + } + + public static boolean belongsOperator(String operEle) { + return (operEle != null) && (operEle.trim().equals(OperEnum.ADD.getOperator()) || operEle.trim().equals(OperEnum.SUBTRACT.getOperator()) || operEle.trim().equals(OperEnum.MULTIPLY.getOperator()) || operEle.trim().equals(OperEnum.MINUS.getOperator())); + } +} diff --git a/group17/785396327/4.9/expr/InfixExpr.java b/group17/785396327/4.9/expr/InfixExpr.java new file mode 100644 index 0000000000..9845d45809 --- /dev/null +++ b/group17/785396327/4.9/expr/InfixExpr.java @@ -0,0 +1,75 @@ +package expr; + +import stack.MyStack; + +import java.util.List; + +/** + * Created by william on 2017/4/13. + */ +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List operList = ExprParser.parse(this); + MyStack numberStack = new MyStack(); + MyStack operatorStack = new MyStack(); + if (operList != null) { + for (String operEle : operList) { + if (ExprParser.belongsOperator(operEle)) + operatorStack.push(operEle); + else { + numberStack.push(operEle); + if (!operatorStack.isEmpty() && ExprParser.belongsHighPriority(operatorStack.peek())) { + String highPriorityValue = calcHighOper(numberStack, operatorStack); + numberStack.push(highPriorityValue); + } + } + } + } + if (numberStack.size() != operatorStack.size() + 1) + throw new RuntimeException(" wrong operation number "); + return Float.parseFloat(calcSameOper(numberStack, operatorStack)); + } + + private String calcHighOper(MyStack numberStack, MyStack operatorStack) { + Float rightNumber = Float.parseFloat((String) numberStack.pop()); + Float leftNumber = Float.parseFloat((String) numberStack.pop()); + String oper = operatorStack.pop(); + return calc(rightNumber, leftNumber, oper); + } + + private String calcSameOper(MyStack numberStack, MyStack operatorStack) { + MyStack allStack = new MyStack(); + while (!operatorStack.isEmpty()) { + allStack.push(numberStack.pop()); + allStack.push(operatorStack.pop()); + } + allStack.push(numberStack.pop()); + while (allStack.size() != 1) { + Float leftNumber = Float.parseFloat((String) allStack.pop()); + String oper = (String) allStack.pop(); + Float rightNumber = Float.parseFloat((String) allStack.pop()); + allStack.push(calc(rightNumber, leftNumber, oper)); + } + return (String) allStack.pop(); + } + + private String calc(Float rightNumber, Float leftNumber, String oper) { + if (oper.equals(OperEnum.ADD.getOperator())) + return leftNumber + rightNumber + ""; + else if (oper.equals(OperEnum.SUBTRACT.getOperator())) + return leftNumber - rightNumber + ""; + else if (oper.equals(OperEnum.MULTIPLY.getOperator())) + return leftNumber * rightNumber + ""; + else if (oper.equals(OperEnum.MINUS.getOperator())) + return leftNumber / rightNumber + ""; + else + throw new RuntimeException("not support " + leftNumber + " " + oper + " " + rightNumber + " operation"); + } + +} diff --git a/group17/785396327/4.9/expr/InfixExprTest.java b/group17/785396327/4.9/expr/InfixExprTest.java new file mode 100644 index 0000000000..1249bbf04b --- /dev/null +++ b/group17/785396327/4.9/expr/InfixExprTest.java @@ -0,0 +1,57 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +/** + * Created by IBM on 2017/4/13. + */ +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + + @Test + public void testExprParser() { + InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + List parse = ExprParser.parse(expr); + System.out.println(parse); + } +} diff --git a/group17/785396327/4.9/expr/InfixToPostfix.java b/group17/785396327/4.9/expr/InfixToPostfix.java new file mode 100644 index 0000000000..58fb60ef2b --- /dev/null +++ b/group17/785396327/4.9/expr/InfixToPostfix.java @@ -0,0 +1,43 @@ +package expr; + +import stack.MyStack; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by gongxun on 2017/4/22. + * 遇到数组直接放入集合等待输出 + * 遇到运算符入栈,如果栈顶元素的优先级较待入栈运算符的优先级高,将栈顶元素取出放入集合等待输出,否则直接入栈 + */ +public class InfixToPostfix { + public static List convert(String expr) { + List result = new ArrayList(); + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + MyStack stack = new MyStack(); + if (tokens != null) { + for (Token token : tokens) { + if (token.isNumber()) + result.add(token); + else { + while (!stack.isEmpty()) { + Token prevOper = stack.peek(); + if (token.hasHigherPriority(prevOper)) { + stack.push(token); + break; + } else { + result.add(stack.pop()); + } + } + //和+或者-同优先级或者更高优先级的都已经弹栈,只剩空栈 + if (stack.isEmpty()) stack.push(token); + } + } + } + //将剩余的所有符号出栈 + while (!stack.isEmpty()) + result.add(stack.pop()); + return result; + } +} diff --git a/group17/785396327/4.9/expr/InfixToPostfixTest.java b/group17/785396327/4.9/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..f1dcd3f466 --- /dev/null +++ b/group17/785396327/4.9/expr/InfixToPostfixTest.java @@ -0,0 +1,41 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by IBM on 2017/4/23. + */ +public class InfixToPostfixTest { + + + @Before + public void setUp() { + + } + + @After + public void tearDown() { + + } + + @Test + public void testConvert() { + { + Assert.assertEquals("[2, 3, 4, *, +, 5, +]", InfixToPostfix.convert("2+3*4+5").toString()); + } + { + Assert.assertEquals("[3, 20, *, 12, 5, *, +, 40, 2, /, -]", InfixToPostfix.convert("3*20+12*5-40/2").toString()); + } + + { + Assert.assertEquals("[3, 20, *, 2, /]", InfixToPostfix.convert("3*20/2").toString()); + } + + { + Assert.assertEquals("[20, 2, /, 3, *]", InfixToPostfix.convert("20/2*3").toString()); + } + } +} diff --git a/group17/785396327/4.9/expr/OperEnum.java b/group17/785396327/4.9/expr/OperEnum.java new file mode 100644 index 0000000000..adb41b75ff --- /dev/null +++ b/group17/785396327/4.9/expr/OperEnum.java @@ -0,0 +1,21 @@ +package expr; + +/** + * Created by IBM on 2017/4/15. + */ +public enum OperEnum { + ADD("+"), SUBTRACT("-"), MULTIPLY("*"), MINUS("/"); + private String operator; + + OperEnum(String operator) { + this.operator = operator; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } +} diff --git a/group17/785396327/4.9/expr/PostfixExpr.java b/group17/785396327/4.9/expr/PostfixExpr.java new file mode 100644 index 0000000000..c22b7788aa --- /dev/null +++ b/group17/785396327/4.9/expr/PostfixExpr.java @@ -0,0 +1,48 @@ +package expr; + +import stack.MyStack; + +import java.util.List; + +/** + * Created by gongxun on 2017/4/22. + */ +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + if (expr == null) + throw new RuntimeException("wrong expr !"); + MyStack stack = new MyStack(); + List tokens = tokenParser.parse(expr); + if (tokens != null) { + for (Token token : tokens) { + if (token.isNumber()) + stack.push(((Integer) token.getIntValue()).floatValue()); + else { + Float value = calcValue(token, stack); + stack.push(value); + } + } + } + return stack.pop(); + } + + private Float calcValue(Token token, MyStack stack) { + String operator = token.toString(); + Float rightNum = stack.pop(); + Float leftNum = stack.pop(); + if (operator.equals("+")) + return leftNum + rightNum; + else if (operator.equals("-")) + return leftNum - rightNum; + else if (operator.equals("*")) + return leftNum * rightNum; + return leftNum / rightNum; + } +} diff --git a/group17/785396327/4.9/expr/PostfixExprTest.java b/group17/785396327/4.9/expr/PostfixExprTest.java new file mode 100644 index 0000000000..378e8f2407 --- /dev/null +++ b/group17/785396327/4.9/expr/PostfixExprTest.java @@ -0,0 +1,38 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/22. + */ +public class PostfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(), 0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } +} diff --git a/group17/785396327/4.9/expr/PrefixExpr.java b/group17/785396327/4.9/expr/PrefixExpr.java new file mode 100644 index 0000000000..b29ffa0c64 --- /dev/null +++ b/group17/785396327/4.9/expr/PrefixExpr.java @@ -0,0 +1,48 @@ +package expr; + +import stack.MyStack; + +import java.util.List; + +/** + * Created by gongxun on 2017/4/22. + * 从后向前遍历入栈 + */ +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + if (expr == null) + throw new RuntimeException("wrong expr !"); + MyStack stack = new MyStack(); + List tokens = tokenParser.parse(expr); + for (int i = tokens.size() - 1; i >= 0; i--) { + Token token = tokens.get(i); + if (token.isNumber()) + stack.push(((Integer) token.getIntValue()).floatValue()); + else { + Float value = calcValue(stack, token.toString()); + stack.push(value); + } + } + return stack.pop(); + } + + + private Float calcValue(MyStack stack, String operator) { + Float leftNum = stack.pop(); + Float rightNum = stack.pop(); + if (operator.equals("+")) + return leftNum + rightNum; + else if (operator.equals("-")) + return leftNum - rightNum; + else if (operator.equals("*")) + return leftNum * rightNum; + return leftNum / rightNum; + } +} diff --git a/group17/785396327/4.9/expr/PrefixExprTest.java b/group17/785396327/4.9/expr/PrefixExprTest.java new file mode 100644 index 0000000000..326bfd9f2c --- /dev/null +++ b/group17/785396327/4.9/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by gongxun on 2017/4/22. + */ +public class PrefixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(), 0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(), 0.001f); + } + + + } +} diff --git a/group17/785396327/4.9/expr/Token.java b/group17/785396327/4.9/expr/Token.java new file mode 100644 index 0000000000..093be5c416 --- /dev/null +++ b/group17/785396327/4.9/expr/Token.java @@ -0,0 +1,52 @@ +package expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by gongxun on 2017/4/22. + */ +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + +} diff --git a/group17/785396327/4.9/expr/TokenParser.java b/group17/785396327/4.9/expr/TokenParser.java new file mode 100644 index 0000000000..6c54890a42 --- /dev/null +++ b/group17/785396327/4.9/expr/TokenParser.java @@ -0,0 +1,58 @@ +package expr; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by gongxun on 2017/4/22. + */ +public class TokenParser { + public List parse(String expr) { + List tokens = new ArrayList(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ +// System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group17/785396327/4.9/expr/TokenParserTest.java b/group17/785396327/4.9/expr/TokenParserTest.java new file mode 100644 index 0000000000..793ba1fe0b --- /dev/null +++ b/group17/785396327/4.9/expr/TokenParserTest.java @@ -0,0 +1,47 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +/** + * Created by gongxun on 2017/4/22. + */ +public class TokenParserTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + + @Test + public void testPostfixExprParser() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse("6 5 2 3 + 8 * + 3 + *"); + System.out.println(tokens); + } +} diff --git a/group17/785396327/4.9/field/Field.java b/group17/785396327/4.9/field/Field.java new file mode 100644 index 0000000000..dda04d2d4b --- /dev/null +++ b/group17/785396327/4.9/field/Field.java @@ -0,0 +1,41 @@ +package field; + +import constant.ConstantPool; +import iterator.ByteCodeIterator; + +/** + * Created by IBM on 2017/4/12. + */ +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + int accessFlags = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptor_index = iter.nextU2ToInt(); + int attributesCount = iter.nextU2ToInt(); + if (attributesCount > 0) { + throw new RuntimeException("Field字段表,暂时不支持存在属性"); + } + return new Field(accessFlags, nameIndex, descriptor_index, pool); + } + + @Override + public String toString() { + return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex); + } +} diff --git a/group17/785396327/4.9/method/Method.java b/group17/785396327/4.9/method/Method.java new file mode 100644 index 0000000000..1b5daa244b --- /dev/null +++ b/group17/785396327/4.9/method/Method.java @@ -0,0 +1,67 @@ +package method; + +import attr.CodeAttr; +import clz.ClassFile; +import cmd.ByteCodeCommand; +import iterator.ByteCodeIterator; +import util.Util; + +/** + * Created by IBM on 2017/4/12. + */ +public class Method { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlags = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + int attributesCount = iter.nextU2ToInt();//有几个属性 + Method method = new Method(clzFile, accessFlags, nameIndex, descriptorIndex); + for (int i = 0; i < attributesCount; i++) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + method.setCodeAttr(codeAttr); + } + return method; + + } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } +} diff --git a/group17/82427129/.gitignore b/group17/82427129/.gitignore index 090f729088..35cadcc5f6 100644 --- a/group17/82427129/.gitignore +++ b/group17/82427129/.gitignore @@ -14,4 +14,6 @@ .project -Test.java \ No newline at end of file +Test.java + +Algorithms/ \ No newline at end of file diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..8fb9e91d57 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,40 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex;// u2 attribute_name_index + int attrLen;// u4 attribute_length + + public abstract String getType(); + public AttributeInfo(int attrNameIndex, int attrLen) { + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + public static AttributeInfo parse(ConstantPool pool, ByteCodeIterator itr) { + int attrNameIndex = itr.nextU2toInt(); + String attrName = ((UTF8Info) pool.getConstantInfo(attrNameIndex)) + .getValue(); + itr.back(2); + switch (attrName) { + case CODE: + return CodeAttr.parse(pool, itr); + case LINE_NUM_TABLE: + return LineNumberTable.parse(pool, itr); + case LOCAL_VAR_TABLE: + return LocalVariableTable.parse(pool, itr); + default: + throw new RuntimeException( + "attributeInfo exclude CodeAttr hasn't implemented"); + } + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..1f9cfdc169 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,129 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + + private static String TYPE = CODE; + private int maxStack;//u2 max_stack + private int maxLocals;//u2 max_locals + private int codeLenth;//u4 code_length + private String code;//u1 code[code_length] + private int exceptionTableLength;//u2 exception_table_length; + /* + * { u2 start_pc; + u2 end_pc; + u2 handler_pc; + u2 catch_type; + } exception_table[exception_table_length]; + private ExceptionTable exceptionTable;//unimplemented*/ + private int attrCount;//u2 attributes_count + private List AttrList = new ArrayList();//attribute_info attributes[attributes_count]; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, + int maxLocals, int codeLenth, String code, + int exceptionTableLength, int attrCount) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLenth = codeLenth; + this.code = code; + this.exceptionTableLength = exceptionTableLength; + this.attrCount = attrCount; + } + + /** + * 给CodeAttr 增加属性 + * @param a + */ + public void addAttr(AttributeInfo a){ + this.AttrList.add(a); + } + + @Override + public String getType() { + return TYPE; + } + + public static CodeAttr parse(ConstantPool pool, ByteCodeIterator itr) { + int attrNameIndex = itr.nextU2toInt(); + int attrLen = itr.nextU4toInt(); + int maxStack = itr.nextU2toInt(); + int maxLocals = itr.nextU2toInt(); + int codeLenth = itr.nextU4toInt(); + String code = itr.nextUxtoHexString(codeLenth); + int exceptionTableLength = itr.nextU2toInt(); + int attrCount = itr.nextU2toInt(); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, + codeLenth, code, exceptionTableLength, attrCount); + for (int i = 0; i < attrCount; i++) { + codeAttr.addAttr(AttributeInfo.parse(pool, itr)); + } + return codeAttr; + } + /* + * getter setter + */ + public int getMaxStack() { + return maxStack; + } + + public void setMaxStack(int maxStack) { + this.maxStack = maxStack; + } + + public int getMaxLocals() { + return maxLocals; + } + + public void setMaxLocals(int maxLocals) { + this.maxLocals = maxLocals; + } + + public int getCodeLenth() { + return codeLenth; + } + + public void setCodeLenth(int codeLenth) { + this.codeLenth = codeLenth; + } + + public void setCode(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public int getAttrCount() { + return attrCount; + } + + public void setAttrCount(int attrCount) { + this.attrCount = attrCount; + } + + public List getAttrList() { + return AttrList; + } + + public void setAttrList(List attrList) { + AttrList = attrList; + } + + public int getExceptionTableLength() { + return exceptionTableLength; + } + + public void setExceptionTableLength(int exceptionTableLength) { + this.exceptionTableLength = exceptionTableLength; + } + + + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..4cce2e0368 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,77 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + + private static String TYPE = LINE_NUM_TABLE; + private int lineNumberTableLength; + private List lineNumberTable = new ArrayList(); + + public LineNumberTable(int attrNameIndex, int attrLen, + int lineNumberTableLength) { + super(attrNameIndex, attrLen); + this.lineNumberTableLength = lineNumberTableLength; + } + + public void addLineNumberItem(LineNumberItem e) { + this.lineNumberTable.add(e); + } + + @Override + public String getType() { + return TYPE; + } + public static LineNumberTable parse(ConstantPool pool, ByteCodeIterator itr) { + int attrNameIndex = itr.nextU2toInt(); + int attrLen = itr.nextU4toInt(); + int lineNumberTableLength = itr.nextU2toInt(); + LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex, + attrLen, lineNumberTableLength); + for (int i = 0; i < lineNumberTableLength; i++) { + lineNumberTable.addLineNumberItem(LineNumberItem.parse(pool, itr)); + } + return lineNumberTable; + } + + /** + * + * @author Meng + * + */ + private static class LineNumberItem { + @SuppressWarnings("unused") + private int startPc; + @SuppressWarnings("unused") + private int lineNum; + + public LineNumberItem(int startPc, int lineNum) { + super(); + this.startPc = startPc; + this.lineNum = lineNum; + } + + public static LineNumberItem parse(ConstantPool pool, + ByteCodeIterator itr) { + int startPc = itr.nextU2toInt(); + int lineNum = itr.nextU2toInt(); + return new LineNumberTable.LineNumberItem(startPc, lineNum); + } + } + + /* + * getter setter + */ + public int getLineNumberTableLength() { + return lineNumberTableLength; + } + + public void setLineNumberTableLength(int lineNumberTableLength) { + this.lineNumberTableLength = lineNumberTableLength; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..b5d5147a3f --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,93 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo { + + private static String TYPE = LOCAL_VAR_TABLE; + private int localVarTableLength;// u2 local_variable_table_length + private List itemList = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen, + int localVarTableLength) { + super(attrNameIndex, attrLen); + this.localVarTableLength = localVarTableLength; + } + + public void addItemList(LocalVariableItem item) { + this.itemList.add(item); + } + + @Override + public String getType() { + return TYPE; + } + public static LocalVariableTable parse(ConstantPool pool, + ByteCodeIterator itr) { + int attrNameIndex = itr.nextU2toInt(); + int attrLen = itr.nextU4toInt(); + int localVarTableLength = itr.nextU2toInt(); + LocalVariableTable table = new LocalVariableTable(attrNameIndex, + attrLen, localVarTableLength); + for (int i = 0; i < localVarTableLength; i++) { + table.addItemList(LocalVariableItem.parse(pool, itr)); + } + return table; + } + + /** + * inner class + * + * @author Meng + * + */ + public static class LocalVariableItem { + @SuppressWarnings("unused") + private int startPc; + @SuppressWarnings("unused") + private int length; + @SuppressWarnings("unused") + private int nameIndex; + @SuppressWarnings("unused") + private int descriptorIndex; + @SuppressWarnings("unused") + private int index; + + public LocalVariableItem(int startPc, int length, int nameIndex, + int descriptorIndex, int index) { + super(); + this.startPc = startPc; + this.length = length; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.index = index; + } + + public static LocalVariableItem parse(ConstantPool pool, + ByteCodeIterator itr) { + int startPc = itr.nextU2toInt(); + int length = itr.nextU2toInt(); + int nameIndex = itr.nextU2toInt(); + int descriptorIndex = itr.nextU2toInt(); + int index = itr.nextU2toInt(); + LocalVariableItem item = new LocalVariableItem(startPc, length, nameIndex, descriptorIndex, index); + return item; + } + } + + /* + * getter setter + */ + public int getLocalVarTableLength() { + return localVarTableLength; + } + + public void setLocalVarTableLength(int localVarTableLength) { + this.localVarTableLength = localVarTableLength; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..01b80b0471 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.attr; + +public class StackMapTable extends AttributeInfo{ + + private static String TYPE = STACK_MAP_TABLE; + @Override + public String getType() { + return TYPE; + } + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..ee70c4305c --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,24 @@ +package com.coderising.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; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..7460b4953b --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,109 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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()); + } + + public String getClassName() { + int index = this.clzIndex.getThisClassIndex(); + ClassInfo c = (ClassInfo) pool.getConstantInfo(index); + return c.getClassName(); + } + + public String getSuperClassName() { + int index = this.clzIndex.getSuperClassIndex(); + ClassInfo c = (ClassInfo) pool.getConstantInfo(index); + return c.getClassName(); + } + + public void addFields(Field f) { + this.fields.add(f); + } + + public void addMethods(Method m) { + this.methods.add(m); + } + + /* + * getter setter + */ + 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 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 ConstantPool getConstantPool() { + return pool; + } + + public void setPool(ConstantPool pool) { + this.pool = pool; + } + + public List getFields() { + return fields; + } + + public void setFields(List fl) { + this.fields = fl; + } + + public List getMethods() { + return methods; + } + + public void setMethods(List ml) { + this.methods = ml; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..7750d4439d --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..8758755887 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.constant; + +public class ClassInfo extends ConstantInfo { + private int type = CLASS_INFO;// u1 tag + private int utf8Index;// u2 name_index + + public ClassInfo(ConstantPool c) { + super(c); + } + + @Override + public int getType() { + return type; + } + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " ClassInfo" + + ",u2 name_index:" + getUtf8Index()); + } + + public String getClassName() { + int name_index = getUtf8Index(); + UTF8Info utf8 = (UTF8Info) this.constantPool + .getConstantInfo(name_index); + return utf8.getValue(); + } + + /* + * getter setter + */ + public int getUtf8Index() { + return utf8Index; + } + + public void setUtf8Index(int name_index) { + this.utf8Index = name_index; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..a485aa25f9 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,37 @@ +package com.coderising.jvm.constant; + +public abstract class ConstantInfo { + public static final int UTF8_INFO = 1; + public static final int INTEGER_INFO = 3; + public static final int FLOAT_INFO = 4; + public static final int LONG_INFO = 5; + public static final int DOUBLE_INFO = 6; + 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 cp){ + this.constantPool = cp; + } + + public abstract int getType(); + + public abstract void print(); + + /* + * getter setter + */ + public ConstantPool getConstantPool(){ + return this.constantPool; + } + + public ConstantInfo getConstantInfo(int index){ + return this.constantPool.getConstantInfo(index); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..c1239d9220 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,38 @@ +package com.coderising.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +public class ConstantPool { + private List cl = new ArrayList(); + + public void addConstantInfo(ConstantInfo e){ + cl.add(e); + } + + public ConstantInfo getConstantInfo(int index) { + return cl.get(index); + } + + public int getSize() { + return cl.size() - 1;// 减去常量池的长度一项 + } + + public String getUTF8String(int nameIndex) { + return ((UTF8Info)getConstantInfo(nameIndex)).getValue(); + } + + public String print(){ + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < cl.size(); i++) { + ConstantInfo c = cl.get(i); + if(i<10){ + System.out.print("0"+i+". "); + }else{ + System.out.print(i+". "); + } + c.print(); + } + return sb.toString(); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java new file mode 100644 index 0000000000..25a0628678 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/DoubleInfo.java @@ -0,0 +1,14 @@ +package com.coderising.jvm.constant; + +public class DoubleInfo extends ConstantInfo { + private int type = DOUBLE_INFO; + + @Override + public int getType() { + return type; + } + @Override + public void print() { + + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..3170fa25d1 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,66 @@ +package com.coderising.jvm.constant; + +public class FieldRefInfo extends ConstantInfo { + private int type = FIELD_INFO;// u1 tag + private int class_index;// u2 class_index + private int name_and_type_index;// u2 name_and_type_index + + public FieldRefInfo(ConstantPool pool) { + super(pool); + } + + @Override + public int getType() { + return type; + } + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " FieldInfo" + + ",u2 class_index:" + getClass_index() + + ",u2 name_and_type_index:" + getName_and_type_index()); + } + + @Override + public String toString() { + return getClassName() + ":" + getFieldName() + " : " + getFieldType(); + } + + public String getClassName() { + ClassInfo classInfo = (ClassInfo) this.constantPool + .getConstantInfo(class_index); + return classInfo.getClassName(); + } + + public String getFieldName() { + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.constantPool + .getConstantInfo(name_and_type_index); + return nameAndTypeInfo.getName(); + } + + public String getFieldType() { + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.constantPool + .getConstantInfo(name_and_type_index); + return nameAndTypeInfo.getTypeInfo(); + } + + /* + * getter setter + */ + public int getClass_index() { + return class_index; + } + + public void setClass_index(int class_index) { + this.class_index = class_index; + } + + public int getName_and_type_index() { + return name_and_type_index; + } + + public void setName_and_type_index(int name_and_type_index) { + this.name_and_type_index = name_and_type_index; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java new file mode 100644 index 0000000000..c20ebee388 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/FloatInfo.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.constant; + +public class FloatInfo extends ConstantInfo { + private int type = FLOAT_INFO; + + @Override + public int getType() { + return type; + } + @Override + public void print() { + // TODO Auto-generated method stub + + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java new file mode 100644 index 0000000000..35da3f20ef --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/IntegerInfo.java @@ -0,0 +1,25 @@ +package com.coderising.jvm.constant; + +public class IntegerInfo extends ConstantInfo { + private int type = INTEGER_INFO; + private int Num; + + @Override + public int getType() { + return type; + } + @Override + public void print() { + // TODO Auto-generated method stub + + } + + public int getNum() { + return Num; + } + + public void setNum(int num) { + Num = num; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java new file mode 100644 index 0000000000..61a19f320c --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/LongInfo.java @@ -0,0 +1,15 @@ +package com.coderising.jvm.constant; + +public class LongInfo extends ConstantInfo { + private int type = LONG_INFO; + + @Override + public int getType() { + return type; + } + @Override + public void print() { + // TODO Auto-generated method stub + + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..ad59210e84 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.constant; + +public class MethodRefInfo extends ConstantInfo { + private int type = METHOD_INFO;// u1 tag + private int classInfoIndex;// u2 class_index + private int nameAndTypeIndex;// u2 name_and_type_index + + public MethodRefInfo(ConstantPool pool) { + super(pool); + } + + public String getClassName() { + ClassInfo c = (ClassInfo) this.constantPool + .getConstantInfo(classInfoIndex); + return c.getClassName(); + } + + public String getMethodName() { + NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool + .getConstantInfo(nameAndTypeIndex); + return nt.getName(); + } + + public String getParamsAndReturnType() { + NameAndTypeInfo nt = (NameAndTypeInfo) this.constantPool + .getConstantInfo(nameAndTypeIndex); + return nt.getTypeInfo(); + } + + @Override + public int getType() { + return type; + } + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " MethodInfo" + + ",u2 class_index:" + getClassInfoIndex() + + ",u2 name_and_type_index" + getNameAndTypeIndex()); + } + + @Override + public String toString() { + return getClassName() + ":" + getMethodName() + ":" + + getParamsAndReturnType(); + } + + /* + * getter setter + */ + public int getClassInfoIndex() { + return classInfoIndex; + } + + public void setClassInfoIndex(int class_index) { + this.classInfoIndex = class_index; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + public void setNameAndTypeIndex(int name_and_type_index) { + this.nameAndTypeIndex = name_and_type_index; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..08e9b6a0f2 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,58 @@ +package com.coderising.jvm.constant; + +public class NameAndTypeInfo extends ConstantInfo { + private int type = NAME_AND_TYPE_INFO;// u1 tag + private int name_index;// u2 name_index + private int descriptor_index;// u2 descriptor_index + + public NameAndTypeInfo(ConstantPool pool) { + super(pool); + } + + @Override + public int getType() { + return type; + } + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " NameAndTypeInfo" + + ",u2 name_index:" + getName_index() + ",u2 descriptor_index:" + + getDescriptor_index()); + } + + @Override + public String toString() { + return "(" + getName() + "," + getTypeInfo() + ")"; + } + + public String getName() { + UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(name_index); + return u.getValue(); + } + + public String getTypeInfo() { + UTF8Info u = (UTF8Info) this.constantPool + .getConstantInfo(descriptor_index); + return u.getValue(); + } + + /* + * getter setter + */ + public int getName_index() { + return name_index; + } + + public void setName_index(int name_index) { + this.name_index = name_index; + } + + public int getDescriptor_index() { + return descriptor_index; + } + + public void setDescriptor_index(int descriptor_index) { + this.descriptor_index = descriptor_index; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..2c67e88d37 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,14 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo{ + + @Override + public int getType() { + return -1; + } + @Override + public void print() { + System.out.println("NullConstantInfo"); + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..4fac07f7cc --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,43 @@ +package com.coderising.jvm.constant; + +public class StringInfo extends ConstantInfo { + private int type = STRING_INFO;// u1 tag + private int string_index;// u2 string_index + + public StringInfo(ConstantPool cp) { + super(cp); + } + + @Override + public int getType() { + return type; + } + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " StringInfo" + + ",u2 string_index:" + getString_index()); + } + + public String getString() { + UTF8Info u = (UTF8Info) this.constantPool.getConstantInfo(string_index); + return u.getValue(); + } + + @Override + public String toString() { + return getString(); + } + + /* + * getter setter + */ + public int getString_index() { + return string_index; + } + + public void setString_index(int string_index) { + this.string_index = string_index; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..ef5eef58a2 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,47 @@ +package com.coderising.jvm.constant; + +public class UTF8Info extends ConstantInfo { + private int type = UTF8_INFO;// u1 tag + private int length;// u2 length + private String value;// n 个 u1 + + public UTF8Info(ConstantPool pool) { + super(pool); + } + + @Override + public int getType() { + return type; + } + + @Override + public void print() { + System.out.println("u1 tag:" + getType() + " UTF8Info" + ",u2 length:" + + getLength() + ",u1 bytes[" + getLength() + "] " + getValue()); + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ",length=" + length + ",value=" + + value + "]"; + } + + /* + * getter setter + */ + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..fee1d06d95 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/field/Field.java @@ -0,0 +1,115 @@ +package com.coderising.jvm.field; + +import java.util.List; + +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag;// u2 access_flags + private int nameIndex;// u2 name_index + private int descriptorIndex;// u2 descriptor_index + private int attrCount;//u2 attributes_count + private List attributeInfos;//attribute_info attributes[attributes_count]; + + private ConstantPool cp; + + public Field(){} + + public Field(int accessFlag, int nameIndex, int descriptorIndex, + int attrCount, ConstantPool cp) { + super(); + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.attrCount = attrCount; + this.cp = cp; + } + + /** + * 读取字段
+ * field_info {
+ * u2 access_flags,
+ * u2 name_index,
+ * u2 descriptor_index,
+ * u2 attributes_count,
+ * attribute_info attributes[attributes_count]
+ * } + * + * @param itr + * @return Field + */ + public static Field parse(ConstantPool pool, ByteCodeIterator itr) { + int accessFlag = itr.nextU2toInt(); + int nameIndex = itr.nextU2toInt(); + int descriptorIndex = itr.nextU2toInt(); + int attrCount = itr.nextU2toInt(); + Field field = new Field(accessFlag, nameIndex, descriptorIndex, attrCount, pool); + for (int i = 0; i < attrCount; i++) { + field.addAttributeInfo(AttributeInfo.parse(pool, itr)); + } + return field; + } + + public void addAttributeInfo(AttributeInfo a) { + this.attributeInfos.add(a); + } + @Override + public String toString() { + UTF8Info utf8Info1 = (UTF8Info)this.cp.getConstantInfo(this.nameIndex); + UTF8Info utf8Info2 = (UTF8Info)this.cp.getConstantInfo(this.descriptorIndex); + return utf8Info1.getValue()+":"+utf8Info2.getValue(); + } + + /* + * getter setter + */ + public int getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public void setDescriptorIndex(int descriptorIndex) { + this.descriptorIndex = descriptorIndex; + } + + public int getAttrCount() { + return attrCount; + } + + public void setAttrCount(int attrCount) { + this.attrCount = attrCount; + } + + public List getAttributeInfos() { + return attributeInfos; + } + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } + public ConstantPool getCp() { + return cp; + } + public void setCp(ConstantPool cp) { + this.cp = cp; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..5cdf37fdaf --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,48 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + private byte[] codes; + private int pos = 0; + + public void back(int length) { + if (pos - length < 0) { + throw new RuntimeException("back length is too long:" + length + + ",pos:" + pos); + } + pos -= length; + } + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public int nextU1toInt() { + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2toInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4toInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], + codes[pos++], codes[pos++] }); + } + + public String nextUxtoHexString(int len) { + byte[] bytes = new byte[len]; + for (int i = 0; i < len; i++) { + bytes[i] = codes[pos++]; + } + return Util.byteToHexString(bytes); + } + public String nextUxtoAscii(int len){ + byte[] bytes = new byte[len]; + for (int i = 0; i < len; i++) { + bytes[i] = codes[pos++]; + } + return Util.byteToAscii(bytes); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java index fafac43407..0c02adef66 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -8,10 +8,29 @@ import java.util.ArrayList; import java.util.List; +import com.coderising.jvm.clz.ClassFile; + public class ClassFileLoader { private static final int BUFFERSIZE = 1024; private List clzPaths = new ArrayList(); + /** + * 装载class文件 + * 读取二进制字节流,并解析成ClassFile对象 + * @param className + * @return ClassFile + */ + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + } + + /** + * 从.class文件读取二进制字节流 + * @param className + * @return + */ public byte[] readBinaryCode(String className) { if (clzPaths.size()<=0){ return null; @@ -36,7 +55,7 @@ public byte[] readBinaryCode(String className) { /** * 文件读取二进制字节流 * @param f - * @return + * @return byte[] * @throws FileNotFoundException */ private byte[] readFile(File f) throws FileNotFoundException { @@ -63,10 +82,18 @@ private byte[] readFile(File f) throws FileNotFoundException { return baos.toByteArray(); } + /** + * 增加类加载路径,加载时按增加时的先后顺序加载 + * @param path + */ public void addClassPath(String path) { clzPaths.add(path); } + /** + * 获取类加载路径 + * @return + */ public String getClassPath() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < clzPaths.size(); i++) { @@ -96,9 +123,4 @@ private String convertName(String className) { return sb.toString(); } - public static void main(String[] args) { - String d = "com.taiji.array.Load"; - ClassFileLoader cc = new ClassFileLoader(); - System.out.print(cc.convertName(d)); - } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..b9887d3b30 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,195 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFileParser { + /** + * 读取ClassFile对象 + * + * @param codes + * @return + */ + public ClassFile parse(byte[] codes) { + ClassFile cf = new ClassFile(); + ByteCodeIterator itr = new ByteCodeIterator(codes); + String magicNumber = itr.nextUxtoHexString(4);// 1读取魔数 + if (!magicNumber.equals("cafebabe")) { + throw new RuntimeException("magicNum not ok"); + } + cf.setMinorVersion(itr.nextU2toInt());// 3读取次版本号 + cf.setMajorVersion(itr.nextU2toInt());// 2读取主版本号 + + ConstantPool pool = parseConstantPool(itr);// 4、5读取常量池 + pool.print();// 打印常量池 + cf.setPool(pool); + + cf.setAccessFlag(new AccessFlag(itr.nextU2toInt()));// 6读取访问标志 + + ClassIndex classIndex = parseClassIndex(itr);// 读取类引用7this和8super + cf.setClzIndex(classIndex); + + int interfaceCount = itr.nextU2toInt();//读取接口信息 + if (interfaceCount != 0) { + throw new RuntimeException( + "the interface isn't 0,parser has not been implemented yet."); + } + + int FieldCount = itr.nextU2toInt();//读取字段信息 + for (int i = 0; i < FieldCount; i++) { + Field f = Field.parse(pool, itr); + cf.addFields(f); + } + + int MethodCount = itr.nextU2toInt(); + for (int i = 0; i < MethodCount; i++) {//读取方法信息 + Method m = Method.parse(pool, itr); + cf.addMethods(m); + } + + return cf; + } + + /** + * 读取this super对象引用
+ * classIndex_Info {
+ * u2 this_class,
+ * u2 super_class
+ * } + * + * @param itr + * @return + */ + public ClassIndex parseClassIndex(ByteCodeIterator itr) { + ClassIndex classIndex = new ClassIndex(); + classIndex.setThisClassIndex(itr.nextU2toInt()); + classIndex.setSuperClassIndex(itr.nextU2toInt()); + return classIndex; + } + + /** + * 读取常量池 + * + * @param itr + * @return + */ + public ConstantPool parseConstantPool(ByteCodeIterator itr) { + int count = itr.nextU2toInt(); + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo());// 占住常量池的第一个,常量池是的index从1开始 + + for (int i = 1; i < count; i++) { + int tag = itr.nextU1toInt(); + switch (tag) { + case ConstantInfo.CLASS_INFO: + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(itr.nextU2toInt()); + pool.addConstantInfo(classInfo); + + /* + * System.out.println(i + ". u1 tag:" + + * classInfo.getType()+" ClassInfo" + ",u2 name_index:" + + * classInfo.getUtf8Index()); + */ + break; + + case ConstantInfo.UTF8_INFO: + UTF8Info utf8Info = new UTF8Info(pool); + int length = itr.nextU2toInt(); + String value = itr.nextUxtoAscii(length); + utf8Info.setLength(length); + utf8Info.setValue(value); + pool.addConstantInfo(utf8Info); + + /* + * System.out.println(i + ". u1 tag:" + utf8Info.getType() + + * " UTF8Info" + ",u2 length:" + utf8Info.getLength() + + * ",u1 bytes[" + utf8Info.getLength() + "] " + + * utf8Info.getValue()); + */ + break; + + case ConstantInfo.STRING_INFO: + StringInfo si = new StringInfo(pool); + si.setString_index(itr.nextU2toInt()); + pool.addConstantInfo(si); + + /* + * System.out.println(i + ". u1 tag:" + + * si.getType()+" StringInfo" + ",u2 string_index:" + + * si.getString_index()); + */ + break; + + case ConstantInfo.NAME_AND_TYPE_INFO: + NameAndTypeInfo nt = new NameAndTypeInfo(pool); + nt.setName_index(itr.nextU2toInt()); + nt.setDescriptor_index(itr.nextU2toInt()); + pool.addConstantInfo(nt); + + /* + * System.out.println(i + ". u1 tag:" + nt.getType()+ + * " NameAndTypeInfo" + ",u2 name_index:" + nt.getName_index() + + * ",u2 descriptor_index:" + nt.getDescriptor_index()); + */ + break; + + case ConstantInfo.METHOD_INFO: + MethodRefInfo m = new MethodRefInfo(pool); + m.setClassInfoIndex(itr.nextU2toInt()); + m.setNameAndTypeIndex(itr.nextU2toInt()); + pool.addConstantInfo(m); + + /* + * System.out.println(i + ". u1 tag:" + m.getType()+ + * " MethodInfo" + ",u2 class_index:" + m.getClassInfoIndex() + + * ",u2 name_and_type_index" + m.getNameAndTypeIndex()); + */ + break; + + case ConstantInfo.FIELD_INFO: + FieldRefInfo f = new FieldRefInfo(pool); + f.setClass_index(itr.nextU2toInt()); + f.setName_and_type_index(itr.nextU2toInt()); + pool.addConstantInfo(f); + + /* + * System.out.println(i + ". u1 tag:" + f.getType()+ + * " FieldInfo" + ",u2 class_index:" + f.getClass_index() + + * ",u2 name_and_type_index:" + f.getName_and_type_index()); + */ + break; + + /* + * case ConstantInfo.FLOAT_INFO: + * + * break; + * + * case ConstantInfo.INTEGER_INFO: break; + * + * case ConstantInfo.DOUBLE_INFO: break; + * + * case ConstantInfo.LONG_INFO: break; + */ + + default: + throw new RuntimeException("the constant pool tag " + tag + + " has not been implemented yet."); + } + } + return pool; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..867e6eed5e --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/method/Method.java @@ -0,0 +1,126 @@ +package com.coderising.jvm.method; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Method { + private int accessFlag;// u2 access_flags + private int nameIndex;// u2 name_index + private int descriptorIndex;// u2 descriptor_index + private int attrCount;// u2 attributes_count + /* + * attributes[attributes_count]; + */ + private List attributeInfos = new ArrayList(); + + public Method() {} + + public Method(int accessFlag, int nameIndex, int descriptorIndex, + int attrCount) { + super(); + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.attrCount = attrCount; + } + + private ClassFile clzFile; + + /** + * 读取方法 method_info {
+ * u2 access_flags,
+ * u2 name_index,
+ * u2 descriptor_index,
+ * u2 attributes_count,
+ * attribute_info attributes[attributes_count]
+ * } + * + * @param itr + * @return Method + */ + public static Method parse(ConstantPool cp, ByteCodeIterator itr) { + int accessFlag = itr.nextU2toInt(); + int nameIndex = itr.nextU2toInt(); + int descriptorIndex = itr.nextU2toInt(); + int attrCount = itr.nextU2toInt(); + Method method = new Method(accessFlag, nameIndex, descriptorIndex, + attrCount); + for (int i = 0; i < attrCount; i++) { + method.addAttributeInfo(AttributeInfo.parse(cp, itr)); + } + return method; + } + + /** + * 专门用来获取code属性的方法 + * + * @return + */ + public CodeAttr getCodeAttr() { + for (int i = 0; i < attributeInfos.size(); i++) { + AttributeInfo attributeInfo = attributeInfos.get(i); + if(AttributeInfo.CODE.equals(attributeInfo.getType())){ + return (CodeAttr)attributeInfo; + } + } + return null; + } + + public void addAttributeInfo(AttributeInfo a) { + this.attributeInfos.add(a); + } + + /* + * getter setter + */ + public int getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(int accessFlag) { + this.accessFlag = accessFlag; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public void setDescriptorIndex(int descriptorIndex) { + this.descriptorIndex = descriptorIndex; + } + + public List getAttributeInfos() { + return attributeInfos; + } + + public void setAttributeInfos(List attributeInfos) { + this.attributeInfos = attributeInfos; + } + + public ClassFile getClzFile() { + return clzFile; + } + + public int getAttrCount() { + return attrCount; + } + + public void setAttrCount(int attrCount) { + this.attrCount = attrCount; + } + +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..c69ba73610 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } + public static String byteToAscii(byte[] codes){ + return new String(codes); + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java similarity index 58% rename from group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java rename to group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java index 6bde3e3105..5cde9073f3 100644 --- a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/Stack.java +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/Stack.java @@ -1,7 +1,9 @@ -package com.coding.basic; +package com.coding.basic.stack; import java.util.EmptyStackException; +import com.coding.basic.ArrayList; + public class Stack { private ArrayList elementData = new ArrayList(); @@ -29,4 +31,16 @@ public boolean isEmpty(){ public int size(){ return elementData.size(); } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("["); + for (int i = 0; i < size(); i++) { + sb.append(elementData.get(i)).append(", "); + } + sb.deleteCharAt(sb.length()-1); + sb.deleteCharAt(sb.length()-1); + sb.append("]"); + return sb.toString(); + } } diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..1a29d59e48 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,147 @@ +package com.coding.basic.stack; + +public class StackUtil { + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse_useTwoStack(Stack s) { + if (s.size() < 2) { + return; + } + Stack stack1 = new Stack<>(); + Stack stack2 = new Stack<>(); + int length = s.size(); + for (int i = 0; i < length; i++) { + stack1.push(s.pop()); + } + for (int i = 0; i < length; i++) { + stack2.push(stack1.pop()); + } + for (int i = 0; i < length; i++) { + s.push(stack2.pop()); + } + } + + public static void reverse(Stack s) { + if (s.size() < 2) { + return; + } + Stack tmp = new Stack<>(); + int length = s.size(); + for (int i = 0; i < length; i++) { + tmp.push(s.pop()); + } + for (int i = 0; i < length; i++) { + addToBottom(s, tmp.pop()); + } + } + + /** + * 添加元素到栈底部 + * + * @param s + * @param value + */ + public static void addToBottom(Stack s, Integer value) { + /* + * Stack stack = new Stack<>(); for (int i = 0; i < s.size(); + * i++) { stack.push(s.pop()); } s.push(value); for (int i = 0; i < + * s.size(); i++) { s.push(stack.pop()); } + */ + if (s.isEmpty()) { + s.push(value); + } else { + Integer top = s.pop(); + addToBottom(s, value); + s.push(top); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static boolean remove(Stack s, Object o) { + if (s.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + boolean flag = false; + Stack tmp = new Stack<>(); + while (!s.isEmpty()) { + tmp.push(s.pop()); + if (tmp.peek().equals(o)) { + flag = true; + + tmp.pop(); + for (int i = 0; i < tmp.size(); i++) { + s.push(tmp.pop()); + } + break; + } + } + return flag; + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, + * 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + Object[] result = new Object[len]; + Stack tmp = new Stack<>(); + for (int i = 0; i < len; i++) { + result[i] = s.peek(); + tmp.push(s.pop()); + } + for (int i = 0; i < len; i++) { + s.push(tmp.pop()); + } + return result; + } + + /** + * 字符串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) { + Stack stack = new Stack<>(); + char[] strCharArr = s.toCharArray(); + for (int i = 0; i < strCharArr.length; i++) { + char cc = strCharArr[i]; + int c = cc&0xffff; + if (isBracket(c)) { + if (c == 40 || c == 91 || c == 123) { + stack.push(c); + }else{ + int left = stack.pop(); + if(left+1!=c&&left+2!=c){ + return false; + } + } + } + } + return true; + } + + /** + * judge is Bracket or not + * @param c + * @return + */ + private static boolean isBracket(int c) { + if (c == 40 || c == 41 || c == 91 || c == 93 || c == 123 || c == 125) { + return true; + } else { + return false; + } + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..b498fc2758 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,114 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coding.basic.stack.StackUtil; + +public class InfixExpr { + String expr = null; + private List tokenList = new ArrayList<>(); + private final static String regex = "-|\\+|\\*|/|\\(|\\)"; + + public InfixExpr(String expr) { + this.expr = expr; + init(); + } + + private void init() { + if (StackUtil.isValidPairs(expr)) { + initTokens(); + } else { + throw new RuntimeException( + "Syntax error, ( ) is not completed in your Expression"); + } + } + + /** + * 表达式分解并入栈 + */ + private void initTokens() { + String[] nums = expr.split(regex); + ArrayList arrayList = new ArrayList(); + for (int i = 0; i < nums.length; i++) { + if (!nums[i].equals("")) { + arrayList.add(nums[i]); + } + } + char[] exChars = expr.toCharArray(); + int numInx = 0; + for (int i = 0; i < exChars.length;) { + char ex = exChars[i]; + int item = ex & 0xffff; + if (item >= 48 && item <= 57) { + int numSize = arrayList.get(numInx++).length(); + String num = new String(exChars, i, numSize); + Token token = new Token(num, Token.NUMBER); + tokenList.add(token); + i += numSize; + } else { + Token token = new Token(String.valueOf(ex), Token.OPERA); + tokenList.add(token); + i += 1; + } + } + } + + /** + * 从左向右扫描所有token,当遇到同优先级或低优先级的操作符时,把之前的操作符依次出栈并计算结果 + * 扫描完所有token后,依次出栈所有操作数并计算结果 + * + * @return + */ + public float evaluate() { + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + for (int i = 0; i < tokenList.size(); i++) { + Token token = tokenList.get(i); + switch (token.getType()) { + case Token.NUMBER: + numStack.push(token.getNumValue()); + break; + case Token.OPERA: + if (opStack.isEmpty()) { + opStack.push(token); + } else { + while (!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())) { + Token preOper = opStack.pop(); + Float latter = numStack.pop(); + Float former = numStack.pop(); + Float result = caculate(preOper, latter, former); + numStack.push(result); + } + opStack.push(token); + } + break; + default: + throw new RuntimeException(" error not Number not Operate "); + } + } + while (!opStack.isEmpty()) { + Token pre = opStack.pop(); + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + Float result = caculate(pre, f1, f2); + numStack.push(result); + } + return numStack.pop(); + } + private Float caculate(Token t, Float latter,Float former){ + switch (t.getValue()) { + case "+": + return latter + former; + case "-": + return former - latter; + case "*": + return latter * former; + case "/": + return former / latter; + default: + throw new RuntimeException("operation"+t.getValue()+" isn't implemented"); + } + } +} diff --git a/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..bc6945c757 --- /dev/null +++ b/group17/82427129/JavaUtil/src/main/java/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,85 @@ +package com.coding.basic.stack.expr; + +import java.util.HashMap; + +/** + * 表达式中的数字或者操作符的抽象实体类 + * + * @author Walker + * + */ +public class Token { + private final static HashMap priority = new HashMap<>(4); + static { + priority.put("+", 1); + priority.put("-", 1); + priority.put("*", 2); + priority.put("/", 2); + } + private String value; + + public static final int NUMBER = 1; + public static final int OPERA = 2; + private int type; + + public Token(String v, int t) { + this.value = v; + this.type = t; + } + + public boolean isNum() { + return type == NUMBER; + } + + public boolean isOpera() { + return type == OPERA; + } + + @Override + public String toString() { + return value; + } + + public float getNumValue() { + return Float.parseFloat(value); + } + + public boolean hasLowerPriority(Token t) { + if (!this.isOpera() || !t.isOpera()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priority.get(this.value) - priority.get(t.value) < 0; + } + public boolean hasHigherPriority(Token t) { + if (!this.isOpera() || !t.isOpera()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priority.get(this.value) - priority.get(t.value) > 0; + } + public boolean hasEqualPriority(Token t) { + if (!this.isOpera() || !t.isOpera()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priority.get(this.value) - priority.get(t.value) == 0; + } + + /* + * getter setter + */ + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + +} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java index e2ed056cc3..bcc79dc6d8 100644 --- a/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java +++ b/group17/82427129/JavaUtil/src/test/java/com/coderising/jvm/loader/ClassFileLoaderTest.java @@ -1,13 +1,36 @@ package com.coderising.jvm.loader; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + public class ClassFileLoaderTest { - static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + static String path1 = "C:\\workPrograms\\GitRepo\\coding2017\\group17\\82427129\\JavaUtil\\target\\classes"; static String path2 = "D:\\workProgram\\GitRepo\\coding2017\\group17\\82427129\\JavaUtil\\target\\classes"; + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } @Before public void setUp() throws Exception { } @@ -20,6 +43,7 @@ public void tearDown() throws Exception { public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); loader.addClassPath(path2); String className = "com.coderising.jvm.test.EmployeeV1"; @@ -45,6 +69,7 @@ public void testGetClassPath() { @Test public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); loader.addClassPath(path2); String className = "com.coderising.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); @@ -55,7 +80,93 @@ public void testMagicNumber(){ Assert.assertEquals("cafebabe", acctualValue); } + + @Test + public void testVersion(){ + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(51, clzFile.getMajorVersion()); + } + @Test + public void testConstantPool(){ + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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.getName_index()); + Assert.assertEquals(14, nameAndType.getDescriptor_index()); + } + //抽查几个吧 + { + 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()); + } + private String byteToHexString(byte[] codes) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < codes.length; i++) { @@ -69,5 +180,77 @@ private String byteToHexString(byte[] codes) { } return buffer.toString(); } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..e47a5d44d4 --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,65 @@ +package com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Test; + +public class StackUtilTest { + + @Test + public void testReverse() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testAddToBottom() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..4152869ad2 --- /dev/null +++ b/group17/82427129/JavaUtil/src/test/java/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,35 @@ +package com.coding.basic.stack.expr; + +import org.junit.Assert; +import org.junit.Test; + +public class InfixExprTest { + + @Test + public void testEvaluate() { + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + } + +} diff --git a/group17/article/20170326-20170402.md b/group17/article/20170326-20170402.md index 5df4ce08e6..0729404704 100644 --- a/group17/article/20170326-20170402.md +++ b/group17/article/20170326-20170402.md @@ -22,7 +22,7 @@ 240094626 -82427129 +82427129 http://blog.csdn.net/Walk_er/article/details/66971517 296910598 diff --git a/group17/article/20170402-20170409.md b/group17/article/20170402-20170409.md index 3d45ad0516..2445f4a4c2 100644 --- a/group17/article/20170402-20170409.md +++ b/group17/article/20170402-20170409.md @@ -12,7 +12,7 @@ 1204187480 -102228177 +102228177 http://note.youdao.com/noteshare?id=4be7978218219daddfb0bb85182be12e 876385982 @@ -22,15 +22,15 @@ 240094626 -82427129 +82427129 http://blog.csdn.net/Walk_er/article/details/68486226 296910598 -1264835468 +1264835468 http://www.jianshu.com/p/686572a97fb3 516886559 -1282579502 +1282579502 614982500 diff --git a/group17/article/20170409-20170416.md b/group17/article/20170409-20170416.md new file mode 100644 index 0000000000..11360e66cb --- /dev/null +++ b/group17/article/20170409-20170416.md @@ -0,0 +1,56 @@ +# 自由写作 + +## 须知 +--- + +交作业时请在QQ 号后面填上各自的文章链接, 比如: + +51075907 http://m.blog.csdn.net/article/details?id=57083764 + +## 文章 +--- + +1204187480 + +102228177 http://note.youdao.com/noteshare?id=7a1c457bc3de9a140f4e077f6352fc11 + +876385982 + +785396327 + +1059107701 + +240094626 + +82427129 + +296910598 + +1264835468 + +516886559 + +1282579502 https://www.evernote.com/l/AZ3ajLOAlTVHw7foK2KLb-bWZ7kw6FjljDA + +614982500 + +865797761 + +1540186032 + +176653813 + +116665530 + +51075907 + +1158154002 + +345450234 + +919764878 + +1368331120 + +517970312 + diff --git a/group17/article/20170416-20170423.md b/group17/article/20170416-20170423.md new file mode 100644 index 0000000000..3d45ad0516 --- /dev/null +++ b/group17/article/20170416-20170423.md @@ -0,0 +1,56 @@ +# 自由写作 + +## 须知 +--- + +交作业时请在QQ 号后面填上各自的文章链接, 比如: + +51075907 http://m.blog.csdn.net/article/details?id=57083764 + +## 文章 +--- + +1204187480 + +102228177 + +876385982 + +785396327 + +1059107701 + +240094626 + +82427129 + +296910598 + +1264835468 + +516886559 + +1282579502 + +614982500 + +865797761 + +1540186032 + +176653813 + +116665530 + +51075907 + +1158154002 + +345450234 + +919764878 + +1368331120 + +517970312 + diff --git a/group17/article/template.md b/group17/article/template.md index 0b06ef733e..3d45ad0516 100644 --- a/group17/article/template.md +++ b/group17/article/template.md @@ -12,7 +12,7 @@ 1204187480 -102228177 http://note.youdao.com/noteshare?id=1f8f4a9d861e24948cdf0219a0d39f4e +102228177 876385982 diff --git a/group17/count/homework.md b/group17/count/homework.md index 640cf4698f..23e71c2fbe 100644 --- a/group17/count/homework.md +++ b/group17/count/homework.md @@ -18,6 +18,9 @@ * [20170305-20170312](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170305-20170312.md) * [20170326-20170402](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170326-20170402.md) + * [20170402-20170409](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170402-20170409.md) -20170326-20170402.md 20170402-20170409.md + * [20170409-20170416](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170409-20170416.md) + + * [20170416-20170423](https://github.com/luoziyihao/coding2017/blob/master/group17/article/20170416-20170423.md) diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java index bec5202645..b285a214b8 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr.java @@ -1,137 +1,76 @@ package org.xukai.coderising.stack; -import com.google.common.collect.Maps; -import com.sun.org.apache.bcel.internal.generic.IFNE; +import java.util.List; +import java.util.Stack; -import java.util.HashMap; public class InfixExpr { - - public static enum TypeToken { - - add('+',0),substruct('-',1),devide('/',3),plus('*',2); - - TypeToken(char token, Integer priority) { - this.token = token; - this.priority = priority; - } - - private char token; - - private Integer priority; - } - String expr = null; public InfixExpr(String expr) { this.expr = expr; } -//3*20+12*5-40/2 - public Double evaluate() { - HashMap map = new HashMap<>(); - map.put("+",0); - map.put("-",1); - map.put("/",3); - map.put("*",2); - - - Stack tokenStack = new Stack(); - Stack numStack = new Stack(); - char[] chars = expr.toCharArray(); - boolean isNem = true; - for (int i = 0; i < expr.length(); i++) { -// if (expr.charAt(i) == TypeToken.add.token || expr.charAt(i) == TypeToken.substruct.token) { -// isNem = true; -// if (!tokenStack.isEmpty() && (char)tokenStack.pop() == '*') { -// Float num2 = Float.valueOf(numStack.pop().toString()); -// Float num1 = Float.valueOf(numStack.pop().toString()); -// numStack.push(num1*num2); -// } else if (!tokenStack.isEmpty() && ((char)tokenStack.pop()) == '/') { -// Float num2 = Float.valueOf(numStack.pop().toString()); -// Float num1 = Float.valueOf(numStack.pop().toString()); -// numStack.push(num1/num2); -// } -// tokenStack.push(expr.charAt(i)); -// } else if (expr.charAt(i) == TypeToken.devide.token){ -// isNem = true; -// tokenStack.push(expr.charAt(i)); -// } else if (expr.charAt(i) == TypeToken.plus.token){ -// isNem = true; -// tokenStack.push(expr.charAt(i)); -// } else if (String.valueOf(expr.charAt(i)).matches("\\d{1}")){ -// if (isNem) { -// numStack.push((expr.charAt(i))); -// } else { -// numStack.push(numStack.pop().toString() + (expr.charAt(i))); -// } -// isNem = false; -// -// } else { -// throw new RuntimeException(); -// } - String token = (expr.charAt(i)) + ""; - Integer priprity = map.get(token); - if (priprity != null) { - //表示是运算符 - if (!tokenStack.isEmpty() && priprity < map.get(tokenStack.peek())) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - String pop = tokenStack.pop()+""; - if (pop.equals("-")) { - numStack.push(num1 - num2); - } else if (pop.equals("*")){ - numStack.push(num1 * num2); - } else if (pop.equals("/")){ - numStack.push(num1 / num2); - } else { - throw new RuntimeException(); + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + if(opStack.isEmpty()){ + + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + } - - } - tokenStack.push(token); - isNem = true; - } else if(token.matches("\\d{1}")) { - //表示是数字 - if (isNem) { - numStack.push(token); - } else { - numStack.push(numStack.pop().toString() + token); + opStack.push(token); } - isNem = false; - } else { - throw new RuntimeException(); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); } } - while (!tokenStack.isEmpty()) { - System.out.println(tokenStack.size()); - if (tokenStack.peek().equals("+")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1+num2+""); - } else if (tokenStack.peek().equals("-")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1-num2+""); - } else if (tokenStack.peek().equals("/")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1/num2+""); - } else if (tokenStack.peek().equals("*")) { - Float num2 = Float.valueOf(numStack.pop().toString()); - Float num1 = Float.valueOf(numStack.pop().toString()); - numStack.push(num1*num2+""); - } else { - throw new RuntimeException(); - } - tokenStack.pop(); + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); } -// System.out.println(Double.valueOf(numStack.pop().toString())); - return Double.valueOf(numStack.pop().toString()); + + + return numStack.pop().floatValue(); } - - public static void main(String[] args) { - + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java new file mode 100644 index 0000000000..00302fa05c --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixExpr2.java @@ -0,0 +1,104 @@ +package org.xukai.coderising.stack; + +import java.util.HashMap; + +public class InfixExpr2 { + + public static enum TypeToken { + + add('+',0),substruct('-',1),devide('/',3),plus('*',2); + + TypeToken(char token, Integer priority) { + this.token = token; + this.priority = priority; + } + + private char token; + + private Integer priority; + } + + String expr = null; + + public InfixExpr2(String expr) { + this.expr = expr; + } +//3*20+12*5-40/2 + public Double evaluate() { + HashMap map = new HashMap<>(); + map.put("+",0); + map.put("-",1); + map.put("/",3); + map.put("*",2); + + + Stack tokenStack = new Stack(); + Stack numStack = new Stack(); + char[] chars = expr.toCharArray(); + boolean isNem = true; + for (int i = 0; i < expr.length(); i++) { + String token = (expr.charAt(i)) + ""; + Integer priprity = map.get(token); + if (priprity != null) { + //表示是运算符 + if (!tokenStack.isEmpty() && priprity < map.get(tokenStack.peek())) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + String pop = tokenStack.pop()+""; + if (pop.equals("-")) { + numStack.push(num1 - num2); + } else if (pop.equals("*")){ + numStack.push(num1 * num2); + } else if (pop.equals("/")){ + numStack.push(num1 / num2); + } else { + throw new RuntimeException(); + } + + } + tokenStack.push(token); + isNem = true; + } else if(token.matches("\\d{1}")) { + //表示是数字 + if (isNem) { + numStack.push(token); + } else { + numStack.push(numStack.pop().toString() + token); + } + isNem = false; + } else { + throw new RuntimeException(); + } + } + while (!tokenStack.isEmpty()) { + System.out.println(tokenStack.size()); + if (tokenStack.peek().equals("+")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1+num2+""); + } else if (tokenStack.peek().equals("-")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1-num2+""); + } else if (tokenStack.peek().equals("/")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1/num2+""); + } else if (tokenStack.peek().equals("*")) { + Float num2 = Float.valueOf(numStack.pop().toString()); + Float num1 = Float.valueOf(numStack.pop().toString()); + numStack.push(num1*num2+""); + } else { + throw new RuntimeException(); + } + tokenStack.pop(); + } +// System.out.println(Double.valueOf(numStack.pop().toString())); + return Double.valueOf(numStack.pop().toString()); + } + + + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java new file mode 100644 index 0000000000..71a483b29f --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/InfixToPostfix2.java @@ -0,0 +1,87 @@ +package org.xukai.coderising.stack; + +import java.util.List; +import java.util.Stack; + +/** + * 将中缀表达式转换为后缀表达式: + 与转换为前缀表达式相似,遵循以下步骤: + (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; + (2) 从左至右扫描中缀表达式; + (3) 遇到操作数时,将其压入S2; + (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: + (4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈; + (4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况); + (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; + (5) 遇到括号时: + (5-1) 如果是左括号“(”,则直接压入S1; + (5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃; + (6) 重复步骤(2)至(5),直到表达式的最右边; + (7) 将S1中剩余的运算符依次弹出并压入S2; + (8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。 + + 例如,将中缀表达式“1+((2+3)×4)-5”转换为后缀表达式的过程如下: + 扫描到的元素 S2(栈底->栈顶) S1 (栈底->栈顶) 说明 + 1 1 空 数字,直接入栈 + + 1 + S1为空,运算符直接入栈 + ( 1 + ( 左括号,直接入栈 + ( 1 + ( ( 同上 + 2 1 2 + ( ( 数字 + + 1 2 + ( ( + S1栈顶为左括号,运算符直接入栈 + 3 1 2 3 + ( ( + 数字 + ) 1 2 3 + + ( 右括号,弹出运算符直至遇到左括号 + × 1 2 3 + + ( × S1栈顶为左括号,运算符直接入栈 + 4 1 2 3 + 4 + ( × 数字 + ) 1 2 3 + 4 × + 右括号,弹出运算符直至遇到左括号 + - 1 2 3 + 4 × + - -与+优先级相同,因此弹出+,再压入- + 5 1 2 3 + 4 × + 5 - 数字 + 到达最右端 1 2 3 + 4 × + 5 - 空 S1中剩余的运算符 + 因此结果为“1 2 3 + 4 × + 5 -”(注意需要逆序输出)。 + * @author xukai + * @desc + * @date 2017-04-22-14:10 + */ +public class InfixToPostfix2 { + + + private static TokenParser tokenParser = new TokenParser(); + + public static String toPostFixExpr(String expr){ + + List tokens = tokenParser.parse(expr); + + Stack s1 = new Stack(); + Stack s2 = new Stack(); + + for (Token token : tokens) { + if (token.isNumber()) { + s2.push(token); + } else { + while (token.isOperator() && !s1.isEmpty()) { + if (!token.hasHigherPriority(s1.peek())) { + s2.push(s1.pop()); + continue; + } + break; + } + s1.push(token); + } + } + while (!s1.isEmpty()) { + s2.push(s1.pop()); + } + StringBuilder stringBuilder = new StringBuilder(); + while (!s2.isEmpty()) { + Token token = s2.pop(); + s1.push(token); + } + while (!s1.isEmpty()) { + Token token = s1.pop(); + stringBuilder.append(token.toString()).append(" "); + } + + return stringBuilder.substring(0,stringBuilder.length() - 1); + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java new file mode 100644 index 0000000000..98e849c4ff --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExpr.java @@ -0,0 +1,57 @@ +package org.xukai.coderising.stack; + +import java.util.List; +import java.util.Stack; + +/** + * 与前缀表达式类似,只是顺序是从左至右: + 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。 + 例如后缀表达式“3 4 + 5 × 6 -”: + (1) 从左至右扫描,将3和4压入堆栈; + (2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈; + (3) 将5入栈; + (4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈; + (5) 将6入栈; + (6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 + */ +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack numStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } else{ + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java new file mode 100644 index 0000000000..178fc23836 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PostfixExprTest.java @@ -0,0 +1,47 @@ +package org.xukai.coderising.stack; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + + @Test + public void testTo(){ + String poseExpr = InfixToPostfix2.toPostFixExpr("10-2*3+50"); + System.out.println(poseExpr); + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java new file mode 100644 index 0000000000..cab9831ec2 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExpr.java @@ -0,0 +1,60 @@ +package org.xukai.coderising.stack; + +import java.util.List; +import java.util.Stack; + +/** + * 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 + 例如前缀表达式“- × + 3 4 5 6”: + (1) 从右至左扫描,将6、5、4、3压入堆栈; + (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈; + (3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈; + (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 + 可以看出,用计算机计算前缀表达式的值是很容易的。 + * @author xukai + * @desc + * @date 2017-04-22-13:49 + */ +public class PrefixExpr { + + + private String expr; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate(){ + + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + + Stack numStack = new Stack(); + Stack oprStack = new Stack(); + + for (int i = tokens.size() - 1; i > -1; i--) { + if (tokens.get(i).isNumber()) { + numStack.push(new Float(tokens.get(i).getIntValue())); + } else { + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + numStack.push(caculate(tokens.get(i).toString(), num1, num2)); + } + } + + return numStack.pop(); + } + + private Float caculate(String oper, Float num1, Float num2){ + if (oper.equals("+")) { + return num1 + num2; + } else if (oper.equals("-")) { + return num1 - num2; + } else if (oper.equals("/")) { + return num1 / num2; + } else if (oper.equals("*")) { + return num1 * num2; + } + throw new RuntimeException("illeagal operation token"); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java new file mode 100644 index 0000000000..bc0e4b53e4 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/PrefixExprTest.java @@ -0,0 +1,45 @@ +package org.xukai.coderising.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java new file mode 100644 index 0000000000..e10eabb1f4 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/Token.java @@ -0,0 +1,50 @@ +package org.xukai.coderising.stack; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java new file mode 100644 index 0000000000..03e214bf1b --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TokenParser.java @@ -0,0 +1,57 @@ +package org.xukai.coderising.stack; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java index d0c8ef4e32..fb08ebc8e2 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/attr/CodeAttr.java @@ -2,6 +2,8 @@ import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.cmd.ByteCodeCommand; +import org.xukai.jvm.cmd.CommandParser; import org.xukai.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { @@ -16,21 +18,23 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -48,15 +52,14 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxLocals = iter.nextToInt(2); int codeLength = iter.nextToInt(4); String code = iter.nextToString(codeLength); - System.out.println(code); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, cmds); int exceptionTableLength = iter.nextToInt(2); if (exceptionTableLength > 0) { iter.nextToInt(exceptionTableLength); System.out.println("解析exception"); } int subAttributeCount = iter.nextToInt(2); - System.out.println("subAttributeCount" + subAttributeCount); if (subAttributeCount > 0) { for (int i = 0; i < subAttributeCount; i++) { AttributeInfo attributeInfo = AttributeInfo.parseAttribute(iter, clzFile); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java index a2b2dfb515..c8777fea97 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/clz/ClassFile.java @@ -81,13 +81,41 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + for(Method m :methods){ + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + public Method getMainMethod(){ + for(Method m :methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ + return m; + } + } + return null; + } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..bd1eb4bf11 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java @@ -0,0 +1,22 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..edb68e1256 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,129 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantInfo; +import org.xukai.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..e44fb1e05f --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/CommandParser.java @@ -0,0 +1,156 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; + +import java.util.ArrayList; +import java.util.List; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + // System.out.println( cmd.toString(clzFile.getConstPool())); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..faa268b0d2 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..4112f7cc56 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..7dd0b62407 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,22 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..77ba5c7460 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..2d8b1ae2f3 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantInfo; +import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..0ac1b33832 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,20 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd { + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..63683e3865 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,24 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand { + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..6498b64289 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,28 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..0a5987e4c3 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..b423f989ae --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package org.xukai.jvm.cmd; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ClassInfo; +import org.xukai.jvm.constant.ConstantInfo; +import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.FieldRefInfo; +import org.xukai.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand { + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java index bf7171a966..1adde177f3 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ClassInfo.java @@ -15,7 +15,12 @@ public void setUtf8Index(int utf8Index) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } + public String getClassName() { int index = getUtf8Index(); UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java index 24323692e9..ffae0e4e83 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantInfo.java @@ -25,5 +25,24 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + + public abstract void accept(Visitor visitor); + + public static interface Visitor { + + public void visitString(StringInfo info); + + public void visitNameAndType(NameAndTypeInfo info); + + public void visitMethodRef(MethodRefInfo info); + + public void visitFieldRef(FieldRefInfo info); + + public void visitClassInfo(ClassInfo info); + + public void visistUTF8(UTF8Info info); + + + } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java index ff4aa4b906..d9cc6f0f56 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java index f0b846f47c..d9b5281155 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/FieldRefInfo.java @@ -11,7 +11,12 @@ public FieldRefInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java index a0c02fedaf..28b80235d9 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/MethodRefInfo.java @@ -14,7 +14,12 @@ public MethodRefInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java index c88c848d3a..66d235641d 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NameAndTypeInfo.java @@ -25,8 +25,13 @@ public void setIndex2(int index2) { public int getType() { return type; } - - + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } + + public String getName(){ ConstantPool pool = this.getConstantPool(); UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java index 0aa452b866..732e8a42cf 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/NullConstantInfo.java @@ -9,5 +9,10 @@ public NullConstantInfo(){ public int getType() { return -1; } - + + @Override + public void accept(Visitor visitor) { + + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java index 31a3c52910..0fc28b142c 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/StringInfo.java @@ -10,7 +10,12 @@ public StringInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } + public int getIndex() { return index; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java index caf1c19918..ae5200371e 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/constant/UTF8Info.java @@ -16,6 +16,12 @@ public void setLength(int length) { public int getType() { return type; } + + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } + @Override public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java index 6cd71db72c..27585d73b1 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java @@ -4,6 +4,7 @@ import org.xukai.jvm.attr.AttributeInfo; import org.xukai.jvm.attr.CodeAttr; import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.cmd.ByteCodeCommand; import org.xukai.jvm.constant.UTF8Info; import org.xukai.jvm.loader.ByteCodeIterator; @@ -25,6 +26,7 @@ public ClassFile getClzFile() { public int getNameIndex() { return nameIndex; } + public int getDescriptorIndex() { return descriptorIndex; } @@ -55,6 +57,10 @@ public String getMethodName(){ public String getMethodDescription(){ return ((UTF8Info)clzFile.getConstantPool().getConstantInfo(this.descriptorIndex)).getValue(); } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } @@ -77,12 +83,5 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ } - public static void main(String[] args) { - CodeAttr codeAttr = new CodeAttr(1, 1, 1, 1, 1, ""); - System.out.println(codeAttr instanceof AttributeInfo); - AttributeInfo codeAttr2 = new CodeAttr(1, 1, 1, 1, 1, ""); - System.out.println(codeAttr2 instanceof CodeAttr); - } - } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..4c78dc1796 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ClassFilePrinter.java @@ -0,0 +1,48 @@ +package org.xukai.jvm.print; + + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "D:\\java\\IDEA-Workspace\\coding2017\\group19\\527220084\\xukai_coding\\coding-common\\target\\classes"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "org.xukai.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..b1ec2eda79 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,85 @@ +package org.xukai.jvm.print; + + +import org.xukai.jvm.constant.ClassInfo; +import org.xukai.jvm.constant.ConstantInfo; +import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.FieldRefInfo; +import org.xukai.jvm.constant.MethodRefInfo; +import org.xukai.jvm.constant.NameAndTypeInfo; +import org.xukai.jvm.constant.StringInfo; +import org.xukai.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()).append(" ").append(info.getClassName()).append(".").append + (info.getMethodName()).append(info.getParamAndReturnType()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + + for(int i=1; i <= pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java index c4fad12ff6..08e65bedce 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/test/ClassFileloaderTest.java @@ -8,6 +8,10 @@ import org.junit.Test; import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.clz.ClassIndex; +import org.xukai.jvm.cmd.BiPushCmd; +import org.xukai.jvm.cmd.ByteCodeCommand; +import org.xukai.jvm.cmd.OneOperandCmd; +import org.xukai.jvm.cmd.TwoOperandCmd; import org.xukai.jvm.constant.ClassInfo; import org.xukai.jvm.constant.ConstantPool; import org.xukai.jvm.constant.MethodRefInfo; @@ -303,7 +307,82 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } - - + + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java deleted file mode 100644 index e30cc00cc2..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java +++ /dev/null @@ -1,161 +0,0 @@ -package me.lzb.basic; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -/** - * Created by LZB on 2017/4/15. - */ -public class InfixExpr { - - - private String expr; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - List list = processExpr(); - - Stack symbolStack = new Stack<>(); - Stack numberStack = new Stack<>(); - - boolean calLevel2 = false; - for (Node n : list) { - if (n.isNumber) { - numberStack.push(n.number); - if (calLevel2) { - calculate(symbolStack, numberStack, false); - calLevel2 = false; - } - } else { - symbolStack.push(n.symbol); - - if (n.isLevel2()) { - calLevel2 = true; - } - } - } - - - Stack tn = new Stack<>(); - int nsize = numberStack.size(); - for (int i = 0; i < nsize; i++) { - tn.push(numberStack.pop()); - } - - numberStack = tn; - - - Stack ts = new Stack<>(); - int ssize = symbolStack.size(); - for (int i = 0; i < ssize; i++) { - ts.push(symbolStack.pop()); - } - - symbolStack = ts; - - - while (!symbolStack.isEmpty()) { - calculate(symbolStack, numberStack, true); - } - - - return numberStack.pop(); - } - - - - private List processExpr() { - List list = new ArrayList<>(); - char[] array = this.expr.toCharArray(); - String number = ""; - for (int i = 0; i < array.length; i++) { - if (Character.isDigit(array[i])) { - number = number + String.valueOf(array[i]); - } else { - Node num = new Node(Float.valueOf(number), null, true, -1); - number = ""; - int calLevel = "+-".indexOf(array[i]) >= 0 ? 1 : 2; - Node sym = new Node(0, String.valueOf(array[i]), false, calLevel); - list.add(num); - list.add(sym); - } - } - - Node num = new Node(Float.valueOf(number), null, true, -1); - list.add(num); - return list; - } - - - private void calculate(Stack symbolStack, Stack numberStack, boolean isRe) { - if (symbolStack.isEmpty()) { - return; - } - - - String symbole = symbolStack.pop(); - - float right; - float left; - - if(isRe){ - left = numberStack.pop(); - right = numberStack.pop(); - }else { - right = numberStack.pop(); - left = numberStack.pop(); - } - - - - float r = calculate(symbole, left, right); - - numberStack.push(r); - } - - - private float calculate(String symbol, float left, float right) { - if ("+".equals(symbol)) { - return left + right; - } - - if ("-".equals(symbol)) { - return left - right; - } - - if ("*".equals(symbol)) { - return left * right; - } - - if ("/".equals(symbol)) { - return left / right; - } - - return 0; - } - - - private class Node { - float number; - String symbol; - boolean isNumber; - int calLevel;//加减1,乘除2 - - public Node(float number, String symbol, boolean isNumber, int calLevel) { - this.number = number; - this.symbol = symbol; - this.isNumber = isNumber; - this.calLevel = calLevel; - } - - private boolean isLevel2() { - return calLevel == 2; - } - } - -} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java new file mode 100644 index 0000000000..5b52ab0863 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java @@ -0,0 +1,108 @@ +package me.lzb.basic.expr; + +import me.lzb.common.utils.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +/** + * Created by LZB on 2017/4/20. + */ +public class CalUtil { + + + public static void calculate(Stack symbolStack, Stack numberStack, boolean isRe) { + if (symbolStack.isEmpty()) { + return; + } + + + String symbole = symbolStack.pop(); + + float right; + float left; + + if (isRe) { + left = numberStack.pop(); + right = numberStack.pop(); + } else { + right = numberStack.pop(); + left = numberStack.pop(); + } + + float r = calculate(symbole, left, right); + + numberStack.push(r); + } + + + public static float calculate(String symbol, float left, float right) { + if ("+".equals(symbol)) { + return left + right; + } + + if ("-".equals(symbol)) { + return left - right; + } + + if ("*".equals(symbol)) { + return left * right; + } + + if ("/".equals(symbol)) { + return left / right; + } + + return 0; + } + + + public static List processInfixExpr(String expr) { + List list = new ArrayList<>(); + char[] array = expr.toCharArray(); + String number = ""; + for (int i = 0; i < array.length; i++) { + if (Character.isDigit(array[i])) { + number = number + String.valueOf(array[i]); + } else { + if (StringUtils.isNotBlank(number)) { + Node num = new Node(Float.valueOf(number), null, -1); + number = ""; + list.add(num); + } + + int calLevel = 1; + + if ("*/".indexOf(array[i]) >= 0) { + calLevel = 2; + } + + if ("()".indexOf(array[i]) >= 0) { + calLevel = 3; + } + + Node sym = new Node(0, String.valueOf(array[i]), calLevel); + + list.add(sym); + } + } + if (StringUtils.isNotBlank(number)) { + Node num = new Node(Float.valueOf(number), null, -1); + list.add(num); + } + + return list; + } + + + public static boolean isLowLevel(Node stackTop, Node next) { + return stackTop.calLevel < next.calLevel; + } + + public static void main(String[] args) { + Node n = new Node(0, "*", 2); + Node m = new Node(0, "-", 1); + System.out.println(isLowLevel(n, m)); + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java new file mode 100644 index 0000000000..833ee8cfda --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java @@ -0,0 +1,71 @@ +package me.lzb.basic.expr; + +import java.util.List; +import java.util.Stack; + +/** + * 中序表达式 + * Created by LZB on 2017/4/15. + */ +public class InfixExpr { + + + private String expr; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + List list = CalUtil.processInfixExpr(expr); + + Stack symbolStack = new Stack<>(); + Stack numberStack = new Stack<>(); + + boolean calLevel2 = false; + for (Node n : list) { + if (n.isNumber()) { + numberStack.push(n.number); + if (calLevel2) { + CalUtil.calculate(symbolStack, numberStack, false); + calLevel2 = false; + } + } else { + symbolStack.push(n.symbol); + + if (n.isLevel2()) { + calLevel2 = true; + } + } + } + + + Stack tn = new Stack<>(); + int nsize = numberStack.size(); + for (int i = 0; i < nsize; i++) { + tn.push(numberStack.pop()); + } + + numberStack = tn; + + + Stack ts = new Stack<>(); + int ssize = symbolStack.size(); + for (int i = 0; i < ssize; i++) { + ts.push(symbolStack.pop()); + } + + symbolStack = ts; + + + while (!symbolStack.isEmpty()) { + CalUtil.calculate(symbolStack, numberStack, true); + } + + + return numberStack.pop(); + } + + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java new file mode 100644 index 0000000000..d9b1d3e5a6 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java @@ -0,0 +1,79 @@ +package me.lzb.basic.expr; + +import java.util.List; +import java.util.Stack; + +/** + * 中序转后序 + * Created by LZB on 2017/4/20. + */ +public class InfixToPostfix { + + private String infix; + + public InfixToPostfix(String infix) { + this.infix = infix; + } + + + public String change() { + StringBuffer sb = new StringBuffer(); + List list = CalUtil.processInfixExpr(infix); + Stack symbolStack = new Stack<>(); + + for (int i = 0; i < list.size(); i++) { + Node n = list.get(i); + //如果是数字,直接输出 + if (n.isNumber()) { + append(sb, n); + continue; + } + + //操作符部分 + + //操作符栈为空,操作符入栈 + if (symbolStack.isEmpty()) { + symbolStack.push(n); + continue; + } + + if (")".equals(n.symbol)) { + //当前操作符为),输出操作数栈内的操作符,直到遇到第一个( + while (!"(".equals(symbolStack.peek().symbol)) { + append(sb, symbolStack.pop()); + } + //遇到的第一个(, 出栈,完成一个括号 + symbolStack.pop(); + } else { + + //计算用,操作符 + //栈顶元素优先级更低,操作符入栈 + if (CalUtil.isLowLevel(symbolStack.peek(), n) || symbolStack.peek().isLevel3()) { + symbolStack.push(n); + } else { + //栈顶元素优先级高于等于当前操作符,输出操作符,直到遇到(,或者遇到优先级更低的操作符 + while (!symbolStack.isEmpty() && !symbolStack.peek().isLevel3() && !CalUtil.isLowLevel(symbolStack.peek(), n)) { + append(sb, symbolStack.pop()); + } + //当前操作符入栈 + symbolStack.push(n); + } + } + } + + + while (!symbolStack.isEmpty()) { + append(sb, symbolStack.pop()); + } + + return sb.toString().trim(); + } + + + private void append(StringBuffer sb, Node node) { + sb.append(" "); + sb.append(node.isNumber() ? (int) node.number : node.symbol); + } + + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java new file mode 100644 index 0000000000..1c698f1101 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java @@ -0,0 +1,28 @@ +package me.lzb.basic.expr; + +/** + * Created by LZB on 2017/4/20. + */ +public class Node { + float number; + String symbol; + int calLevel;//加减1,乘除2, ()3, 数字-1 + + public Node(float number, String symbol, int calLevel) { + this.number = number; + this.symbol = symbol; + this.calLevel = calLevel; + } + + public boolean isLevel2() { + return calLevel == 2; + } + + public boolean isLevel3() { + return calLevel == 3; + } + + public boolean isNumber(){ + return calLevel == -1; + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java new file mode 100644 index 0000000000..22a0db2ee0 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java @@ -0,0 +1,46 @@ +package me.lzb.basic.expr; + +import me.lzb.common.utils.StringUtils; + +import java.util.Stack; + +/** + * 后缀表达式 + * Created by LZB on 2017/4/20. + */ +public class PostfixExpr { + + private String expr; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + Stack symbolStack = new Stack<>(); + Stack numberStack = new Stack<>(); + + char[] array = this.expr.toCharArray(); + String number = ""; + for (int i = 0; i < array.length; i++) { + if (Character.isDigit(array[i])) { + number = number + String.valueOf(array[i]); + } else { + if (StringUtils.isNotBlank(number)) { + numberStack.push(Float.valueOf(number)); + number = ""; + } + if (Character.isSpaceChar(array[i])) { + + + } else { + symbolStack.push(String.valueOf(array[i])); + CalUtil.calculate(symbolStack, numberStack, false); + } + } + } + return numberStack.pop(); + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java new file mode 100644 index 0000000000..27b7b2f52d --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java @@ -0,0 +1,46 @@ +package me.lzb.basic.expr; + +import me.lzb.common.utils.StringUtils; + +import java.util.Stack; + +/** + * 前缀表达式 + * Created by LZB on 2017/4/20. + */ +public class PrefixExpr { + + private String expr; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + Stack symbolStack = new Stack<>(); + Stack numberStack = new Stack<>(); + + char[] array = this.expr.toCharArray(); + String number = ""; + for (int i = array.length - 1; i >= 0; i--) { + if (Character.isDigit(array[i])) { + number = number + String.valueOf(array[i]); + } else { + if (StringUtils.isNotBlank(number)) { + numberStack.push(Float.valueOf(number)); + number = ""; + } + if (Character.isSpaceChar(array[i])) { + + + } else { + symbolStack.push(String.valueOf(array[i])); + CalUtil.calculate(symbolStack, numberStack, true); + } + } + } + return numberStack.pop(); + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java similarity index 97% rename from group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java rename to group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java index 5ca7621354..913f6ad2ee 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/InfixExprTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixExprTest.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.expr; import org.junit.After; import org.junit.Assert; diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..de92921b42 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/InfixToPostfixTest.java @@ -0,0 +1,42 @@ +package me.lzb.basic.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by LZB on 2017/4/20. + */ +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testChange() { + { + InfixToPostfix toPostfix = new InfixToPostfix("((2+3)*8+5+3)*6"); + Assert.assertEquals("2 3 + 8 * 5 + 3 + 6 *", toPostfix.change()); + } + + { + InfixToPostfix toPostfix = new InfixToPostfix("6*(5+(2+3)*8+3)"); + Assert.assertEquals("6 5 2 3 + 8 * + 3 + *", toPostfix.change()); + } + { + InfixToPostfix toPostfix = new InfixToPostfix("9+(3-1)*3+10/2"); + Assert.assertEquals("9 3 1 - 3 * + 10 2 / +", toPostfix.change()); + } + + { + InfixToPostfix toPostfix = new InfixToPostfix("10-2*3+50"); + Assert.assertEquals("10 2 3 * - 50 +", toPostfix.change()); + } + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java new file mode 100644 index 0000000000..4a1239bcf6 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PostfixExprTest.java @@ -0,0 +1,43 @@ +package me.lzb.basic.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +/** + * 后缀表达式 + */ +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1 - 3 * + 10 2 / +"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java new file mode 100644 index 0000000000..11691cda54 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/expr/PrefixExprTest.java @@ -0,0 +1,47 @@ +package me.lzb.basic.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * 前缀表达式 + */ +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java index 2addebeb39..f2f30f004f 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java @@ -1,5 +1,7 @@ package me.lzb.jvm.attr; +import me.lzb.jvm.cmd.ByteCodeCommand; + /** * Created by LZB on 2017/4/15. */ @@ -12,13 +14,20 @@ public class CodeAttr extends AttributeInfo { private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java index 224714a010..cfb4f067e8 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java @@ -18,12 +18,20 @@ public void setFlagValue(int flag) { this.flagValue = flag; } - public boolean isPublicClass(){ + public boolean isPublicClass() { return (this.flagValue & 0x0001) != 0; } - public boolean isFinalClass(){ + + public boolean isFinalClass() { return (this.flagValue & 0x0010) != 0; } + public String getFlagString(){ + if (isPublicClass()){ + return "public"; + }else { + return "not public"; + } + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java index c5de9be5ce..5fd864b8a8 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java @@ -1,8 +1,11 @@ package me.lzb.jvm.clz; +import me.lzb.jvm.constant.ClassInfo; import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.field.Field; import me.lzb.jvm.method.Method; +import me.lzb.jvm.print.Print; +import me.lzb.jvm.print.PrintVisitor; import java.util.ArrayList; import java.util.List; @@ -10,7 +13,7 @@ /** * Created by LZB on 2017/4/14. */ -public class ClassFile { +public class ClassFile implements Print{ private String magicNumber; @@ -72,7 +75,6 @@ public void setConstantPool(ConstantPool constantPool) { } - public List getFields() { return fields; } @@ -90,9 +92,6 @@ public void setMethods(List methods) { } - - - public ClassIndex getClzIndex() { return clzIndex; } @@ -102,30 +101,62 @@ public void setClzIndex(ClassIndex clzIndex) { } - public void print(){ + public void print() { - if(this.accessFlag.isPublicClass()){ - System.out.println("Access flag : public "); - } -// System.out.println("Class Name:"+ getClassName()); +// if (this.accessFlag.isPublicClass()) { +// System.out.println("Access flag : public "); +// } +// System.out.println("Class Name:" + getClassName()); // -// System.out.println("Super Class Name:"+ getSuperClassName()); +// System.out.println("Super Class Name:" + getSuperClassName()); } + public String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } - + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } public int getConstantPoolCount() { return constantPool.getSize(); } - public void addField(Field f){ + public void addField(Field f) { this.fields.add(f); } - public void addMethod(Method m){ + public void addMethod(Method m) { this.methods.add(m); } + public Method getMethod(String methodName, String paramAndReturnType) { + for (Method m : methods) { + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + + if (name.equals(methodName) && desc.equals(paramAndReturnType)) { + return m; + } + } + + return null; + } + + public Method getMainMethod() { + return getMethod("main", "([Ljava/lang/String;)V"); + } + + @Override + public void print(PrintVisitor visitor) { + visitor.visitBasicMsg(this); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..83eec1cbc7 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java @@ -0,0 +1,21 @@ +package me.lzb.jvm.cmd; + + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..07e35cb0ce --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,124 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantInfo; +import me.lzb.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static { + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + protected ByteCodeCommand(ClassFile clzFile, String opCode) { + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + protected ConstantInfo getConstantInfo(int index) { + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool() { + return this.getClassFile().getConstantPool(); + } + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + public String toString() { + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText() { + String txt = codeMap.get(opCode); + if (txt == null) { + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..a5fe80425b --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,20 @@ +package me.lzb.jvm.cmd; + + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..2d4d8d53a6 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,19 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..6af68455a0 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..5d87c07505 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,19 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..a34a64b5b0 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantInfo; +import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + value = strInfo.toString(); + } + + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; + + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..ba7d9df3a7 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd { + + public NewObjectCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..242f02716a --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,22 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand { + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); + } + + + public int getLength() { + return 1; + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..00805c5dc7 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,29 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + + public int getLength() { + return 2; + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..df00e5bb8e --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantPool; + + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..b87faca257 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,64 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand { + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex() { + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool) { + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo) pool.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool) { + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo) this.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + } + + protected String getOperandAsField(ConstantPool pool) { + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + } + + public int getLength() { + return 3; + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java index 200e59834a..16ea736db1 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/14. */ @@ -16,6 +18,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitClassInfo(this); + } + public int getUtf8Index() { return utf8Index; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java index 3bbabf2180..e1952a7a3e 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java @@ -1,9 +1,12 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.Print; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/14. */ -public abstract class ConstantInfo { +public abstract class ConstantInfo implements Print { public static final String MAGIC_NUMBER = "cafebabe"; @@ -20,11 +23,10 @@ public abstract class ConstantInfo { public static final int Utf8_info = 1; - protected ConstantPool constantPool; - public ConstantInfo(){ + public ConstantInfo() { } @@ -35,10 +37,16 @@ public ConstantInfo(ConstantPool pool) { public ConstantPool getConstantPool() { return constantPool; } - public ConstantInfo getConstantInfo(int index){ + + public ConstantInfo getConstantInfo(int index) { return this.constantPool.getConstantInfo(index); } public abstract int getType(); + + + @Override + public abstract void print(PrintVisitor visitor); + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java index 0ebab33b39..36e77e84d9 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -17,6 +19,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitFieldRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java index 263c185af5..bd921ccf67 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -18,6 +20,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitMethodRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java index bdf158ec37..4cef60cc3f 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -18,6 +20,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitNameAndType(this); + } + public int getIndex1() { return index1; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java index 7f9debba3b..88b90ca6c1 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/14. */ @@ -9,4 +11,9 @@ public class NullConstantInfo extends ConstantInfo{ public int getType() { return -1; } + + @Override + public void print(PrintVisitor visitor) { + + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java index 8ba36d8cfc..5d5fc284af 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -16,6 +18,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visitString(this); + } + public int getIndex() { return index; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java index d3f35c2fd7..9a27b3c716 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java @@ -1,5 +1,7 @@ package me.lzb.jvm.constant; +import me.lzb.jvm.print.PrintVisitor; + /** * Created by LZB on 2017/4/15. */ @@ -20,6 +22,11 @@ public int getType() { return type; } + @Override + public void print(PrintVisitor visitor) { + visitor.visistUTF8(this); + } + public String getValue() { return value; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java index bfd3cbc2c0..e265907158 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java @@ -208,7 +208,7 @@ private void parserMethod(ClassFile classFile) { int attributesCount = nextBytesToInt(2); - Method method = new Method(accessFlags, nameIndex, descriptorIndex); + Method method = new Method(classFile, accessFlags, nameIndex, descriptorIndex); for (int j = 1; j <= attributesCount; j++) { @@ -239,7 +239,11 @@ private void parserCodeAttr(int attributeNameIndex, Method method, ClassFile cla int codeLength = nextBytesToInt(4); String code = nextBytesToString(codeLength); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + + //处理cmd + CommandParser commandParser = new CommandParser(code); + + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, commandParser.parse(classFile)); int exceptionTableLength = nextBytesToInt(2); if (exceptionTableLength > 0) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java new file mode 100644 index 0000000000..829b1670c7 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java @@ -0,0 +1,188 @@ +package me.lzb.jvm.loader; + +import me.lzb.common.utils.StringUtils; +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.cmd.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by LZB on 2017/4/22. + */ +public class CommandParser { + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + + private int index; + + private final char[] data; + + public CommandParser(String codes) { + if (StringUtils.isBlank(codes)) { + throw new RuntimeException("the orignal code is not correct!"); + } + codes = codes.toUpperCase(); + data = codes.toCharArray(); + } + + private char[] nextChars(int nextLength) { + char[] target = new char[nextLength]; + System.arraycopy(data, index, target, 0, nextLength); + index = index + nextLength; + return target; + } + + private int nextCharsToInt(int nextLength) { + return Integer.valueOf(String.valueOf(nextChars(nextLength)), 16).intValue(); + } + + private String nextCharsToString(int nextLength) { + return String.valueOf(nextChars(nextLength)); + } + + private boolean hasNext() { + return index < data.length; + } + + + public ByteCodeCommand[] parse(ClassFile clzFile) { + + List cmds = new ArrayList<>(); + + while (hasNext()) { + String opCode = nextCharsToString(2); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(nextCharsToInt(2)); + cmd.setOprand2(nextCharsToInt(2)); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(nextCharsToInt(2)); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(nextCharsToInt(2)); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + "has not been implement."); + } + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java index 9c3e9ad984..8c35d5aec5 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java @@ -1,6 +1,8 @@ package me.lzb.jvm.method; import me.lzb.jvm.attr.CodeAttr; +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.cmd.ByteCodeCommand; /** * Created by LZB on 2017/4/15. @@ -12,11 +14,11 @@ public class Method { private CodeAttr codeAttr; -// private ClassFile clzFile; + private ClassFile clzFile; - public Method(/*ClassFile clzFile,*/ int accessFlag, int nameIndex, int descriptorIndex) { -// this.clzFile = clzFile; + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; this.accessFlag = accessFlag; this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; @@ -55,11 +57,15 @@ public void setCodeAttr(CodeAttr codeAttr) { this.codeAttr = codeAttr; } -// public ClassFile getClzFile() { -// return clzFile; -// } -// -// public void setClzFile(ClassFile clzFile) { -// this.clzFile = clzFile; -// } + public ClassFile getClzFile() { + return clzFile; + } + + public void setClzFile(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java new file mode 100644 index 0000000000..0b1566669a --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java @@ -0,0 +1,36 @@ +package me.lzb.jvm.print; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ConstantInfo; +import me.lzb.jvm.constant.ConstantPool; + +/** + * Created by LZB on 2017/4/23. + */ +public class ClassPrinter { + + private ClassFile classFile; + + private ConstantPool pool; + + public ClassPrinter(ClassFile classFile) { + this.classFile = classFile; + this.pool = classFile.getConstantPool(); + } + + + public void print() { + PrintVisitor visitor = new PrintFormat(); + + classFile.print(visitor); + + System.out.println("Constant Pool:"); + + for (int i = 1; i <= pool.getSize(); i++) { + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#" + i + " = "); + constantInfo.print(visitor); + } + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java new file mode 100644 index 0000000000..1435d46814 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java @@ -0,0 +1,10 @@ +package me.lzb.jvm.print; + +/** + * Created by LZB on 2017/4/23. + */ +public interface Print { + + public void print(PrintVisitor visitor); + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java new file mode 100644 index 0000000000..663496de8e --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java @@ -0,0 +1,57 @@ +package me.lzb.jvm.print; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.*; + +/** + * Created by LZB on 2017/4/23. + */ +public class PrintFormat implements PrintVisitor { + + + @Override + public void visitBasicMsg(ClassFile info) { + System.out.println("Access flag : " + info.getAccessFlag().getFlagString()); + + System.out.println("Class Name:" + info.getClassName()); + + System.out.println("Super Class Name:" + info.getSuperClassName()); + + System.out.println("minor version:" + info.getMinorVersion()); + + System.out.println("major version:" + info.getMajorVersion()); + + System.out.println(); + } + + + @Override + public void visistUTF8(UTF8Info info) { + System.out.println("UTF8 " + info.getValue()); + } + + @Override + public void visitClassInfo(ClassInfo info) { + System.out.println("Class #" + info.getUtf8Index() + " " + info.getClassName()); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + System.out.println("FieldRef #" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + System.out.println("MethodRef #" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + System.out.println("NameAndType #" + info.getIndex1() + ":#" + info.getIndex2()); + } + + @Override + public void visitString(StringInfo info) { + System.out.println("String #" + info.getIndex()); + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java new file mode 100644 index 0000000000..6d846786bc --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java @@ -0,0 +1,23 @@ +package me.lzb.jvm.print; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.*; + +/** + * Created by LZB on 2017/4/23. + */ +public interface PrintVisitor { + public void visitBasicMsg(ClassFile info); + + public void visitClassInfo(ClassInfo info); + + public void visitFieldRef(FieldRefInfo info); + + public void visitMethodRef(MethodRefInfo info); + + public void visitNameAndType(NameAndTypeInfo info); + + public void visitString(StringInfo info); + + public void visistUTF8(UTF8Info info); +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java index f41b313c97..b4adbcf888 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java @@ -3,10 +3,15 @@ import me.lzb.common.utils.ByteUtils; import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.clz.ClassIndex; +import me.lzb.jvm.cmd.BiPushCmd; +import me.lzb.jvm.cmd.ByteCodeCommand; +import me.lzb.jvm.cmd.OneOperandCmd; +import me.lzb.jvm.cmd.TwoOperandCmd; import me.lzb.jvm.constant.*; import me.lzb.jvm.field.Field; import me.lzb.jvm.loader.ClassFileLoader; import me.lzb.jvm.method.Method; +import me.lzb.jvm.print.ClassPrinter; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -20,13 +25,11 @@ public class ClassFileloaderTest { static String path1 = EmployeeV1.class.getResource("/").getPath(); -// static String path1 = "D:\\code\\learning\\coding2017\\group24\\1148285693\\learning2017\\mini-jvm\\target\\test-classes\\"; static String path2 = "C:\\temp"; static String className = "me.lzb.jvm.EmployeeV1"; private static final String FULL_QUALIFIED_CLASS_NAME = "me/lzb/jvm/EmployeeV1"; -// private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; @Before @@ -43,8 +46,8 @@ public void testPath() { String s = EmployeeV1.class.getResource("/").getPath(); String s2 = EmployeeV1.class.getResource("").getPath(); - System.out.println(s); - System.out.println(s2); +// System.out.println(s); +// System.out.println(s2); } @@ -266,4 +269,88 @@ private void assertMethodEquals(ConstantPool pool, Method m, String expectedName Assert.assertEquals(expectedCode, code); } + /** + * 第四次JVM + */ + + + @Test + public void testByteCodeCommand() { + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #1", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #2", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #3", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #2", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #4", cmds[0]); + assertOpCodeEquals("3: ldc #5", cmds[1]); + assertOpCodeEquals("5: invokevirtual #6", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand[] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #7", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #8", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #9", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #10", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd) { + + String acctual = cmd.getOffset() + ": " + cmd.getReadableCodeText(); + + if (cmd instanceof OneOperandCmd) { + if (cmd instanceof BiPushCmd) { + acctual += " " + ((OneOperandCmd) cmd).getOperand(); + } else { + acctual += " #" + ((OneOperandCmd) cmd).getOperand(); + } + } + if (cmd instanceof TwoOperandCmd) { + acctual += " #" + ((TwoOperandCmd) cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + @Test + public void testPrint() { + ClassPrinter classPrinter = new ClassPrinter(clzFile); + classPrinter.print(); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java index 1e597a2b24..87344ca452 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixExpr.java @@ -33,7 +33,7 @@ private void manageMultiAndDivOper(String[] elements,Stack numStack,Stack operSt preElement = (Float)numStack.pop(); i++; nextElement = Float.valueOf(elements[i]); - numStack.push(doBaseOper(preElement,nextElement,elements[i-1])); + numStack.push(Token.doBaseOper(preElement,nextElement,elements[i-1])); } } } @@ -42,27 +42,12 @@ private void manageMultiAndDivOper(String[] elements,Stack numStack,Stack operSt private float manageAddAndMinusOper(Stack numStack,Stack operStack){ float result = 0f;; while(!operStack.isEmpty()){ - result = doBaseOper(result,(Float)numStack.pop(),(String)operStack.pop()); + result = Token.doBaseOper(result,(Float)numStack.pop(),(String)operStack.pop()); } result += (Float)numStack.pop(); return result; } - private float doBaseOper(float preData,float nextData,String oper){ - switch(oper){ - case "+": - return preData+nextData; - case "-": - return preData-nextData; - case "*": - return preData*nextData; - case "/": - return preData/nextData; - default: - throw new RuntimeException("could not recognise oper:"+oper); - } - } - public String[] getElementArray(String expression){ char[] charArray = expression.toCharArray(); StringBuffer stringBuffer = new StringBuffer(); diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..d444fef039 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,67 @@ +package com.github.ipk2015.coding2017.basic.stack.expr; + + + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + int len = expr.length(); + char c,temp; + Stack stack = new Stack(); + StringBuffer buffer = new StringBuffer(); + for(int i = 0;i tokens = InfixToPostfix.convert("3+(2-5)*6/3"); + + Assert.assertEquals(3, tokens.get(0).getIntValue()); + Assert.assertEquals(2, tokens.get(1).getIntValue()); + Assert.assertEquals(5, tokens.get(2).getIntValue()); + Assert.assertEquals("-", tokens.get(3).toString()); + Assert.assertEquals(6, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(3, tokens.get(6).getIntValue()); + Assert.assertEquals("/", tokens.get(7).toString()); + Assert.assertEquals("+", tokens.get(8).toString()); + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..af427fa948 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,35 @@ +package com.github.ipk2015.coding2017.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List list = parser.parse(expr); + + Stack stack = new Stack(); + int len = list.size(); + float preNum,afterNum; + Token token; + for(int i = 0;i list = parser.parse(expr); + + Stack stack = new Stack(); + int len = list.size(); + float preNum,afterNum; + Token token; + for(int i = 0;i OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + public static float doBaseOper(float preData,float nextData,String oper){ + switch(oper){ + case "+": + return preData+nextData; + case "-": + return preData-nextData; + case "*": + return preData*nextData; + case "/": + return preData/nextData; + default: + throw new RuntimeException("could not recognise oper:"+oper); + } + } + + +} \ No newline at end of file diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..998d1e4c8e --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.github.ipk2015.coding2017.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..2543baec60 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.github.ipk2015.coding2017.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java index 2f141a20a3..c4455c6b2a 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/attr/CodeAttr.java @@ -1,6 +1,9 @@ package com.github.ipk2015.coding2017.minijvm.attr; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; +import com.github.ipk2015.coding2017.minijvm.cmd.CommandParser; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo { @@ -12,21 +15,21 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -44,7 +47,10 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxLocals = iter.nextUNToInt(2); int codeLen = iter.nextUNToInt(4); String code = iter.nextUNToHexString(codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code); + + ByteCodeCommand[] commands = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxLocals,codeLen,code,commands); int exceptionTableLen = iter.nextUNToInt(2); if(exceptionTableLen != 0){ throw new RuntimeException("code属性里的异常table长度为:"+exceptionTableLen); @@ -78,7 +84,17 @@ private static void addSonAttr(ClassFile clzFile,CodeAttr codeAttr,ByteCodeItera } } - + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i list = getMethods(); + for(Method m : list){ + String name = ((UTF8Info)pool.getConstantInfo(m.getNameIndex())).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(m.getDescriptorIndex())).getValue(); + if(name.equalsIgnoreCase(methodName) && desc.equalsIgnoreCase(paramAndReturnType)){ + return m; + } + } + return null; + } + public Method getMainMethod(){ +// main:([Ljava/lang/String;)V + return getMethod("main","([Ljava/lang/String;)V"); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..80d3076ea1 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/BiPushCmd.java @@ -0,0 +1,21 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..f2c72d31f1 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/ByteCodeCommand.java @@ -0,0 +1,132 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + + + +import java.util.HashMap; +import java.util.Map; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + + + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java new file mode 100644 index 0000000000..d9c3c619e2 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/CommandParser.java @@ -0,0 +1,143 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if(null == codes || codes.length() == 0){ + throw new RuntimeException("字节码不存在"); + } + codes = codes.toUpperCase(); + CommandIterator iterator = new CommandIterator(codes); + List commands = new ArrayList(); + while(iterator.hasNext()){ + String operatorCode = iterator.next2CharAsString(); + if(ldc.equals(operatorCode)){ + LdcCmd cmd = new LdcCmd(clzFile,operatorCode); + cmd.setOperand(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(bipush.equals(operatorCode)){ + BiPushCmd cmd = new BiPushCmd(clzFile,operatorCode); + cmd.setOperand(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(new_object.equals(operatorCode)){ + NewObjectCmd cmd = new NewObjectCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(invokespecial.equals(operatorCode)){ + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(invokevirtual.equals(operatorCode)){ + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(putfield.equals(operatorCode)){ + PutFieldCmd cmd = new PutFieldCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(getfield.equals(operatorCode)){ + GetFieldCmd cmd = new GetFieldCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(getstatic.equals(operatorCode)){ + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile,operatorCode); + cmd.setOprand1(iterator.next2CharAsInt()); + cmd.setOprand2(iterator.next2CharAsInt()); + commands.add(cmd); + }else if(dup.equals(operatorCode) || aload_0.equals(operatorCode) || aload_1.equals(operatorCode) || + aload_2.equals(operatorCode) || astore_1.equals(operatorCode) || voidreturn.equals(operatorCode) + || iload.equals(operatorCode) || iload_1.equals(operatorCode) || iload_2.equals(operatorCode) + || iload_3.equals(operatorCode) || fload_3.equals(operatorCode) || iconst_0.equals(operatorCode) + || iconst_1.equals(operatorCode) || istore_1.equals(operatorCode) || istore_2.equals(operatorCode) + || iadd.equals(operatorCode)|| iinc.equals(operatorCode)){ + NoOperandCmd command = new NoOperandCmd(clzFile,operatorCode); + commands.add(command); + }else{ + throw new RuntimeException("this operator code not includes yet:"+operatorCode); + } + } + calcuateOffset(commands); + ByteCodeCommand[] result = new ByteCodeCommand[commands.size()]; + return commands.toArray(result); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..ad694d7eec --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetFieldCmd.java @@ -0,0 +1,21 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..87bfca3c7f --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,19 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..e573129d76 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..989c3f6fae --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,21 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..bc72a9f300 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..973061d110 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..62c51c2b3a --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..ca6052b34c --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/OneOperandCmd.java @@ -0,0 +1,29 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + + + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..e73ff203d5 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..99c6b99455 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.github.ipk2015.coding2017.minijvm.cmd; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; +import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java index e2e0f50f61..d8cba51f62 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ClassInfo.java @@ -23,4 +23,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java index 663c493b57..9275387556 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantInfo.java @@ -25,5 +25,16 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java index ea0e135a23..d28601f4ba 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java index b74fb427ba..521c010f7b 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/FieldRefInfo.java @@ -51,4 +51,9 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java index cc5352db6e..287c907259 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/MethodRefInfo.java @@ -49,6 +49,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java index d1cd005111..990c0f6a01 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NameAndTypeInfo.java @@ -42,4 +42,9 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java index 38eef91f32..06c20e5b4f 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java index 8f23231e72..00b9b9b706 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java index d94a267bbc..c0a7b4e0c5 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/constant/UTF8Info.java @@ -26,6 +26,10 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java index 3298a36d6b..b8a3d7dca2 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/method/Method.java @@ -3,6 +3,9 @@ import com.github.ipk2015.coding2017.minijvm.attr.AttributeInfo; import com.github.ipk2015.coding2017.minijvm.attr.CodeAttr; import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.UTF8Info; import com.github.ipk2015.coding2017.minijvm.loader.ByteCodeIterator; public class Method { @@ -67,4 +70,18 @@ private static void addAttr(ClassFile clzFile,Method method,ByteCodeIterator ite throw new RuntimeException("方法的此属性不存在:"+attrName); } } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + buffer.append(name).append(":").append(desc).append("\n"); + buffer.append(this.codeAttr.toString(pool)); + return buffer.toString(); + } } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..2d7967cb41 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ClassFilePrinter.java @@ -0,0 +1,47 @@ +package com.github.ipk2015.coding2017.minijvm.print; + +import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; +import com.github.ipk2015.coding2017.minijvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMajorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ +// String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = "E:\\javaImprove\\git\\group24\\121111914\\src\\com\\github\\ipk2015\\coding2017\\minijvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); +// String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..17b88d9932 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/print/ConstantPoolPrinter.java @@ -0,0 +1,88 @@ +package com.github.ipk2015.coding2017.minijvm.print; + +import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantInfo; +import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; +import com.github.ipk2015.coding2017.minijvm.constant.FieldRefInfo; +import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; +import com.github.ipk2015.coding2017.minijvm.constant.NameAndTypeInfo; +import com.github.ipk2015.coding2017.minijvm.constant.StringInfo; +import com.github.ipk2015.coding2017.minijvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor(){ + + @Override + public void visitClassInfo(ClassInfo info) { + int utf8Index = info.getUtf8Index(); + String className = info.getClassName(); + sop("Class\t\t"+"#"+utf8Index+"\t\t// "+className); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + int classInfoIndex = info.getClassInfoIndex(); + int nameAndTypeIndex = info.getNameAndTypeIndex(); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + sop("Fieldref\t\t"+"#"+classInfoIndex+".#"+nameAndTypeIndex+"\t\t// " + +className+"."+fieldName+":"+fieldType); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + int classInfoIndex = info.getClassInfoIndex(); + int nameAndTypeIndex = info.getNameAndTypeIndex(); + String className = info.getClassName(); + String methodName = info.getMethodName(); + String paramAndReturnType = info.getParamAndReturnType(); + sop("Methodref\t\t"+"#"+classInfoIndex+".#"+nameAndTypeIndex+"\t\t// " + +className+"."+methodName+":"+paramAndReturnType); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + int index1 = info.getIndex1(); + int index2 = info.getIndex2(); + String name = info.getName(); + String typeInfo = info.getTypeInfo(); + sop("NameAndType\t"+"#"+index1+".#"+index2+"\t\t// "+name+":"+typeInfo); + } + + @Override + public void visitString(StringInfo info) { + int index = info.getIndex(); + String utf8String = info.getConstantPool().getUTF8String(index); + sop("String\t\t"+"#"+index+"\t\t// "+utf8String); + } + + @Override + public void visistUTF8(UTF8Info info) { + sop("Utf8\t\t"+info.getValue()); + } + + }; + + int size = pool.getSize(); + for(int i = 1;i < size+1;i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("\t"+"#"+i+" = "); + constantInfo.accept(visitor); + } + + } + + public static void sop(String s){ + System.out.println(s); + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java index 0a3979119d..213046188c 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/minijvm/test/ClassFileloaderTest.java @@ -12,6 +12,10 @@ import com.github.ipk2015.coding2017.minijvm.clz.ClassFile; import com.github.ipk2015.coding2017.minijvm.clz.ClassIndex; +import com.github.ipk2015.coding2017.minijvm.cmd.BiPushCmd; +import com.github.ipk2015.coding2017.minijvm.cmd.ByteCodeCommand; +import com.github.ipk2015.coding2017.minijvm.cmd.OneOperandCmd; +import com.github.ipk2015.coding2017.minijvm.cmd.TwoOperandCmd; import com.github.ipk2015.coding2017.minijvm.constant.ClassInfo; import com.github.ipk2015.coding2017.minijvm.constant.ConstantPool; import com.github.ipk2015.coding2017.minijvm.constant.MethodRefInfo; @@ -279,5 +283,78 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..d3e9afbf9b --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExpr.java @@ -0,0 +1,19 @@ +package com.johnChnia.coding2017.basic.stack.expr; + + +import com.johnChnia.coding2017.basic.List; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List tokens = InfixToPostfix.convert(this.expr); + return PostfixExpr.evaluate(tokens); + } + + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..e47a8841da --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..e361815f02 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,37 @@ +package com.johnChnia.coding2017.basic.stack.expr; + + +import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.List; +import com.johnChnia.coding2017.basic.stack.Stack; + + +/*** + * Rule: + */ +public class InfixToPostfix { + + public static List convert(String expr) { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + List list = new ArrayList<>(); + Stack stack = new Stack<>(); + for (int i = 0; i < tokens.size(); i++) { + Token token = tokens.get(i); + if (token.isNumber()) { + list.add(token); + } else if (token.isOperator()) { + while (!stack.empty() && !token.hasHigherPriority(stack.peek())) { + list.add(stack.pop()); + } + stack.push(token); + + } + } + while (!stack.empty()) { + list.add(stack.pop()); + } + return list; + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java new file mode 100644 index 0000000000..adc1aac489 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Operator.java @@ -0,0 +1,42 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.stack.Stack; + +/** + * Created by john on 2017/4/20. + */ +public class Operator { + + public void handlerToken(String fix, Stack stack, Token token) { + if (token.isNumber()) { + stack.push(Float.parseFloat(token.toString())); + } else if (token.isOperator()) { + float p = stack.pop(); + float q = stack.pop(); + stack.push(perform(fix, token.toString(), p, q)); + } + } + + + private float perform(String fix, String operator, float p, float q) { + float result = 0.0f; + if (operator.equals("+")) { + result = p + q; + } else if (operator.equals("-")) { + if (fix.equals("postfix")) { + result = q - p; + } else if (fix.equals("prefix")) { + result = p - q; + } + } else if (operator.equals("*")) { + result = p * q; + } else if (operator.equals("/")) { + if (fix.equals("postfix")) { + result = q / p; + } else if (fix.equals("prefix")) { + result = p / q; + } + } + return result; + } +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..4046c13830 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,36 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.List; +import com.johnChnia.coding2017.basic.stack.Stack; + +public class PostfixExpr { + private String expr = null; + static Operator operator = new Operator(); + + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(this.expr); + Stack stack = new Stack<>(); + for (int i = 0; i < tokens.size(); i++) { + operator.handlerToken("postfix", stack, tokens.get(i)); + + } + + return stack.pop(); + } + + public static float evaluate(List tokens) { + Stack stack = new Stack<>(); + for (int i = 0; i < tokens.size(); i++) { + operator.handlerToken("postfix", stack, tokens.get(i)); + } + return stack.pop(); + } + + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..312eed28b3 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.johnChnia.coding2017.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..c16f529845 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,25 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.List; +import com.johnChnia.coding2017.basic.stack.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(this.expr); + Operator operator = new Operator(); + Stack stack = new Stack<>(); + for (int i = tokens.size() - 1; i >= 0; i--) { + operator.handlerToken("prefix", stack, tokens.get(i)); + } + return stack.pop(); + } + + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..30f67b2710 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(), 0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(), 0.001f); + } + + + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java new file mode 100644 index 0000000000..f87a210587 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..b9c8b80444 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java @@ -0,0 +1,58 @@ +package com.johnChnia.coding2017.basic.stack.expr; + + +import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else { + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..cdb3b091db --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,39 @@ +package com.johnChnia.coding2017.basic.stack.expr; + +import com.johnChnia.coding2017.basic.List; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java b/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..a300edafc7 --- /dev/null +++ b/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java @@ -0,0 +1,57 @@ +package jvm.loader; + + +import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.List; + +import java.io.*; + +/** + * @// TODO: 2017/4/20 改成 try... with...resource + * @// TODO: 2017/4/20 close inputstream + * @// TODO: 2017/4/20 修改TreeInfo直接返回File + */ +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + for (int i = 0; i < clzPaths.size(); i++) { + // 找到指定类文件 + Directory.TreeInfo treeInfo = Directory.walk(clzPaths.get(i), className); + if (treeInfo.files.size() > 0) { + try { + FileInputStream fis = new FileInputStream(treeInfo.files.get(0)); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 自动增长 + byte[] buff = new byte[1024]; + int len; + while ((len = fis.read(buff)) != -1) { + bos.write(buff, 0, len); + } + return bos.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + return null; + + } + + + public void addClassPath(String path) { + clzPaths.add(path); + } + + + public String getClassPath() { + StringBuilder sb = new StringBuilder(); + for (int index = 0; index < clzPaths.size(); index++) { + sb.append(clzPaths.get(index)); + sb.append(";"); + } + return sb.toString().substring(0, sb.length() - 1); + } + + +} diff --git a/group24/315863321/src/main/java/jvm/loader/Directory.java b/group24/315863321/src/main/java/jvm/loader/Directory.java new file mode 100644 index 0000000000..98f239434d --- /dev/null +++ b/group24/315863321/src/main/java/jvm/loader/Directory.java @@ -0,0 +1,81 @@ +package jvm.loader; + +import java.io.File; +import java.io.FilenameFilter; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Pattern; + +/** + * Created by john on 2017/4/17. + * + * @// TODO: 2017/4/20 实现 List.addAll(), list implements Iterable + */ +public final class Directory { + + public static File[] local(File dir, final String regex) { + return dir.listFiles(new FilenameFilter() { // 文件过滤接口 + private Pattern pattern = Pattern.compile(regex); + + @Override + public boolean accept(File dir, String name) { + return pattern.matcher(new File(name).getName()).matches(); + } + }); + } + + public static File[] local(String path, final String regex) { + return local(new File(path), regex); + } + + public static class TreeInfo implements Iterable { + public List files = new ArrayList<>(); + public List dirs = new ArrayList<>(); + + @Override + public Iterator iterator() { + return files.iterator(); + } + + public void addAll(TreeInfo other) { + files.addAll(other.files); + dirs.addAll(other.dirs); + } + + @Override + public String toString() { + return "dirs: " + dirs + + "\n\nfiles: " + files; + } + } + + public static TreeInfo walk(String start, String regex) { + return recuresDirs(new File(start), regex); + } + + public static TreeInfo walk(File start, String regex) { + return recuresDirs(start, regex); + } + + public static TreeInfo walk(File start) { + return recuresDirs(start, ".*");// 全部 + } + + public static TreeInfo walk(String start) { + return recuresDirs(new File(start), ".*");// 全部 + } + + public static TreeInfo recuresDirs(File startDir, String regex) { + TreeInfo result = new TreeInfo(); + for (File item : startDir.listFiles()) { + if (item.isDirectory()) { + result.dirs.add(item); + result.addAll(recuresDirs(item, regex)); + } else if (item.getName().matches(regex)) + result.files.add(item); + } + return result; + } + +} \ No newline at end of file diff --git a/group24/315863321/src/main/java/jvm/test/ClassFileloaderTest.java b/group24/315863321/src/main/java/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..70d400cb28 --- /dev/null +++ b/group24/315863321/src/main/java/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,83 @@ +package jvm.test; + +import jvm.loader.ClassFileLoader; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class ClassFileloaderTest { + + + static String path1 = "/Users/john/Documents/mygit/coding2017/group24/315863321/target/classes/jvm"; + static String path2 = "/Users/john/Documents"; + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "EmployeeV1.class"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1026, byteCodes.length); + + } + + + @Test + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "EmployeeV1.class"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + private String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } + +} diff --git a/group24/315863321/src/main/java/jvm/test/EmployeeV1.java b/group24/315863321/src/main/java/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..3fbdcef7bf --- /dev/null +++ b/group24/315863321/src/main/java/jvm/test/EmployeeV1.java @@ -0,0 +1,31 @@ +package 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/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfix.java b/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfix.java new file mode 100644 index 0000000000..54666845de --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfix.java @@ -0,0 +1,59 @@ +package com.donaldy.basic.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + + Stack opStack = new Stack<>(); + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + List newTokens = new ArrayList<>(); + + for (Token token : tokens) { + + if (token.isOperator()) { + + while (true) { + if (opStack.isEmpty()) { + opStack.push(token); + + break; + } + + if (token.hasHigherPriority(opStack.peek())) { + + opStack.push(token); + + break; + } + + newTokens.add(opStack.pop()); + + } + + + } + + if (token.isNumber()) { + newTokens.add(token); + } + + } + + while (!opStack.isEmpty()) { + newTokens.add(opStack.pop()); + } + + + return newTokens; + } + + + +} diff --git a/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfixTest.java b/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..f6dda0ee18 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/InfixToPostfixTest.java @@ -0,0 +1,22 @@ +package com.donaldy.basic.expr; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by DonaldY on 2017/4/18. + */ +public class InfixToPostfixTest { + + @Test + public void test() { + + String expr = "9 + 3-1 *3+10/2"; + //Assert.assertEquals("9 3 1-3*+ 10 2/+", InfixToPostfix.convert(expr)); + + expr = "10-2*3+50"; + Assert.assertEquals("[10, 2, 3, *, -, 50, +]", InfixToPostfix.convert(expr).toString()); + + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/expr/PostfixExpr.java b/group24/448641125/src/com/donaldy/basic/expr/PostfixExpr.java new file mode 100644 index 0000000000..ec175d192c --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/PostfixExpr.java @@ -0,0 +1,67 @@ +package com.donaldy.basic.expr; + + +import java.util.List; +import java.util.Stack; + +/** + * 从左到右遍历, + * 1. 若为数字,则入栈 + * 2. 若为运算符,则calculate + */ +public class PostfixExpr { + + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack numStack = new Stack<>(); + + + for(Token token : tokens){ + + if (token.isOperator()){ + + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + + } + + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + + + +} diff --git a/group24/448641125/src/com/donaldy/basic/expr/PostfixExprTest.java b/group24/448641125/src/com/donaldy/basic/expr/PostfixExprTest.java new file mode 100644 index 0000000000..3195c7b3b2 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.donaldy.basic.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/expr/PrefixExpr.java b/group24/448641125/src/com/donaldy/basic/expr/PrefixExpr.java new file mode 100644 index 0000000000..aaee04d871 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/PrefixExpr.java @@ -0,0 +1,69 @@ +package com.donaldy.basic.expr; + +import java.util.List; +import java.util.Stack; + +/** + * 从右到左遍历 + * 1. 若为数字,则入栈 + * 2. 若为符号,则calculate + */ +public class PrefixExpr { + + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack numStack = new Stack<>(); + Stack opStack = new Stack<>(); + + for(int i = tokens.size() - 1; i >= 0 ; --i){ + Token token = tokens.get(i); + + if (token.isOperator()){ + opStack.push(token.toString()); + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(opStack.pop(), f1,f2)); + } + + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + while (!opStack.isEmpty()) { + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(opStack.pop(), f1,f2)); + } + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + +} diff --git a/group24/448641125/src/com/donaldy/basic/expr/PrefixExprTest.java b/group24/448641125/src/com/donaldy/basic/expr/PrefixExprTest.java new file mode 100644 index 0000000000..435a82d8b1 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.donaldy.basic.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3 * 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/expr/Token.java b/group24/448641125/src/com/donaldy/basic/expr/Token.java new file mode 100644 index 0000000000..db639bcbcf --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/Token.java @@ -0,0 +1,50 @@ +package com.donaldy.basic.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group24/448641125/src/com/donaldy/basic/expr/TokenParser.java b/group24/448641125/src/com/donaldy/basic/expr/TokenParser.java new file mode 100644 index 0000000000..38d5225c4f --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.donaldy.basic.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group24/448641125/src/com/donaldy/basic/expr/TokenParserTest.java b/group24/448641125/src/com/donaldy/basic/expr/TokenParserTest.java new file mode 100644 index 0000000000..03d3146213 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.donaldy.basic.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java b/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..fbe5cdc6c8 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/CircleQueue.java @@ -0,0 +1,74 @@ +package com.donaldy.basic.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + //元素个数 + private int size = 0; + + public boolean isEmpty() { + + return this.size == 0; + + } + + public int size() { + return this.size; + } + + + + public void enQueue(E data) { + + if (this.size == DEFAULT_SIZE) { + throw new IndexOutOfBoundsException("size() : " + this.size()); + } + + this.elementData[this.rear] = data; + + this.rear = (this.rear + 1) % DEFAULT_SIZE; + + this.size ++; + + } + + public E deQueue() { + + if (this.isEmpty()) { + throw new IndexOutOfBoundsException("size() : " + this.size()); + } + + E oldElement = (E) this.elementData[this.front]; + + this.elementData[this.front] = null; + + this.front = (this.front + 1) % DEFAULT_SIZE; + + this.size --; + + return oldElement; + } + + public E getElement(int index) { + + if (index < 0 || index >= DEFAULT_SIZE) { + throw new IndexOutOfBoundsException("index : " + index); + } + + return (E)this.elementData[index]; + } +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java b/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..f6516c7743 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/CircleQueueTest.java @@ -0,0 +1,35 @@ +package com.donaldy.basic.queue; + +import org.junit.Assert; +import org.junit.Test; + + + +/** + * Created by DonaldY on 2017/4/24. + */ +public class CircleQueueTest { + + @Test + public void test() { + CircleQueue cirQueue = new CircleQueue<>(); + + for (int i = 1; i <= 10; ++i) { + cirQueue.enQueue(i); + } + + Assert.assertEquals(10, cirQueue.size()); + + for (int i = 0; i < 10; ++i) { + Assert.assertEquals(i + 1, (int)cirQueue.getElement(i)); + } + + + for (int i = 0; i <= 5; ++i) { + Assert.assertEquals(i + 1, (int)cirQueue.deQueue()); + } + + Assert.assertEquals(4, cirQueue.size()); + + } +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/Josephus.java b/group24/448641125/src/com/donaldy/basic/queue/Josephus.java new file mode 100644 index 0000000000..9d3d588148 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/Josephus.java @@ -0,0 +1,62 @@ +package com.donaldy.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, + * 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + List killList = new ArrayList(); + + //用于存储 + Queue queue1 = new Queue<>(); + //用于操作 + Queue queue2 = new Queue<>(); + + for (int i = 0; i < n; ++i) { + + queue1.enQueue(i); + + } + + int cnt = 1; + + while (true) { + + if (queue1.size() < m) { + break; + } + + if (cnt % m == 0) { + + killList.add(queue1.deQueue()); + + } else { + + queue1.enQueue(queue1.deQueue()); + + } + + cnt ++; + + } + + while (!queue1.isEmpty()) { + killList.add(queue1.deQueue()); + } + + + return killList; + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java b/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..dad206e942 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.donaldy.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/Queue.java b/group24/448641125/src/com/donaldy/basic/queue/Queue.java new file mode 100644 index 0000000000..d504367907 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/Queue.java @@ -0,0 +1,62 @@ +package com.donaldy.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..98496b3e77 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,68 @@ +package com.donaldy.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + + //用于存储 + private Stack stack1; + //用于操作 + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + public boolean isEmpty() { + + return this.stack1.isEmpty(); + + } + + + public int size() { + + return this.stack1.size(); + + } + + + public void enQueue(E item) { + this.stack1.push(item); + } + + public E deQueue() { + + if (this.size() <= 0) { + throw new IndexOutOfBoundsException("size : " + this.size()); + } + + while (!this.stack1.isEmpty()) { + + this.stack2.push(this.stack1.pop()); + + } + + E oldElement = this.stack2.pop(); + + while (!this.stack2.isEmpty()) { + + this.stack1.push(this.stack2.pop()); + + } + + return oldElement; + + } + + + } + diff --git a/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..21dcd53b85 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,23 @@ +package com.donaldy.basic.queue; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by DonaldY on 2017/4/24. + */ +public class QueueWithTwoStacksTest { + + @Test + public void test() { + QueueWithTwoStacks qwStack = new QueueWithTwoStacks(); + + for (int i = 1; i <= 5; ++i) { + qwStack.enQueue(i); + } + + for (int i = 1; i <= 5; ++i) { + Assert.assertEquals(i, (int)qwStack.deQueue()); + } + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java index 6b699e6991..9122f3690a 100644 --- a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java +++ b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java @@ -1,6 +1,8 @@ package com.donaldy.jvm.attr; import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.cmd.ByteCodeCommand; +import com.donaldy.jvm.cmd.CommandParser; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.loader.ByteCodeIterator; @@ -14,21 +16,23 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -36,21 +40,83 @@ public void setLineNumberTable(LineNumberTable t) { } public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; + this.localVarTable = t; } - + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - - return null; + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile,code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code,cmds); + + int exceptionTableLen = iter.nextU2ToInt(); + //TODO 处理exception + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.nextU2ToInt(); + + for(int x=1; x<=subAttrCount; x++){ + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } + else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } + else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } + else{ + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; } + + + public String toString(ConstantPool pool) { + + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); - + public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); + super(attrNameIndex, attrLen); } - + public static LocalVariableTable parse(ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); int attrLen = iter.nextU4ToInt(); @@ -38,8 +38,19 @@ public static LocalVariableTable parse(ByteCodeIterator iter){ return lvTable; } private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); + this.items.add(item); + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); } - - } diff --git a/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java b/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java index c36e1940b1..eafc13a4a9 100644 --- a/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java +++ b/group24/448641125/src/com/donaldy/jvm/clz/ClassFile.java @@ -80,13 +80,42 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + for (Method m : methods) { + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + + if (name.equals(methodName) && desc.equals(paramAndReturnType)) { + return m; + } + } + + return null; + } + public Method getMainMethod(){ + + for (Method m : methods) { + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { + return m; + } + } + return null; + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..4126097c3f --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java @@ -0,0 +1,29 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a611d4273b --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,130 @@ +package com.donaldy.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java b/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..b43e0d3a06 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java @@ -0,0 +1,158 @@ +package com.donaldy.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.donaldy.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0)) { + throw new RuntimeException("the orignal code is not correct!"); + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + "has not been implement."); + } + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..6644fe958d --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,28 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..7b4cc9896f --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,31 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ClassInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.UTF8Info; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..b646011143 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,29 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..8b51e481af --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,27 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..d55d8ef409 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java @@ -0,0 +1,37 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.StringInfo; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..2a30581935 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,26 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..c664210eda --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,32 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..9a1709a9c7 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..9bf85ba44f --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,27 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.StackFrame; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..1d38c8ed3f --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.donaldy.jvm.cmd; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ClassInfo; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java index 71f31261e4..cbf71927be 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ClassInfo.java @@ -21,4 +21,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java index 20cad6fcd5..ff2a27bcd6 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ConstantInfo.java @@ -26,4 +26,15 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java b/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java index 77bdfc8e67..1698c2c657 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/ConstantPool.java @@ -23,7 +23,9 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } + + } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java index 6a6f72f5da..ffd7b835e0 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/FieldRefInfo.java @@ -51,4 +51,8 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java index e65135279f..b370eff575 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/MethodRefInfo.java @@ -49,6 +49,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java index 21ecd2b411..db48418b57 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,10 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java index 3a2cc11017..74e491637f 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java b/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java index f59d34a497..94325bfdbc 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java b/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java index 7432e5b6c4..10c06dcf2a 100644 --- a/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java +++ b/group24/448641125/src/com/donaldy/jvm/constant/UTF8Info.java @@ -26,6 +26,11 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..c90cc8fc65 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.donaldy.jvm.engine; + +import com.donaldy.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..1fb57626b9 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java @@ -0,0 +1,35 @@ +package com.donaldy.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.donaldy.jvm.attr.CodeAttr; +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.cmd.ByteCodeCommand; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/Heap.java b/group24/448641125/src/com/donaldy/jvm/engine/Heap.java new file mode 100644 index 0000000000..250d70504d --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.donaldy.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java b/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..d5c5884af2 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.donaldy.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java b/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..fea5102cd0 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java @@ -0,0 +1,68 @@ +package com.donaldy.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.loader.ClassFileLoader; +import com.donaldy.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java b/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..30f19e0d8c --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.donaldy.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.donaldy.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java b/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java index e1132dd023..17f25799c2 100644 --- a/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java +++ b/group24/448641125/src/com/donaldy/jvm/loader/ClassFileLoader.java @@ -58,6 +58,7 @@ public String getClassPath() { } public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); ClassFileParser parser = new ClassFileParser(); return parser.parse(codes); diff --git a/group24/448641125/src/com/donaldy/jvm/method/Method.java b/group24/448641125/src/com/donaldy/jvm/method/Method.java index a69ff696b8..8720da21b7 100644 --- a/group24/448641125/src/com/donaldy/jvm/method/Method.java +++ b/group24/448641125/src/com/donaldy/jvm/method/Method.java @@ -2,6 +2,7 @@ import com.donaldy.jvm.attr.*; import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.cmd.ByteCodeCommand; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.UTF8Info; import com.donaldy.jvm.loader.ByteCodeIterator; @@ -48,8 +49,42 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + + /*System.out.println("name = " + clzFile.getConstantPool().getUTF8String(nameIndex) + + ", desc = " + clzFile.getConstantPool().getUTF8String(descIndex));*/ + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + //attribCount == 1 + for( int j = 1; j <= attribCount; j++){ + + int attrNameIndex = iter.nextU2ToInt(); + /*System.out.println("attrNameIndex : " + attrNameIndex);*/ + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + /*System.out.println("attrName : " + attrName);*/ + iter.back(2); + + if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){ + /*System.out.println("j : " + j );*/ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else{ + throw new RuntimeException("only CODE attribute is implemented , please implement the "+ attrName); + } + + } + + return m ; + + //////////////////////Backup/////////////////////// + /*int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); int descriptorIndex = iter.nextU2ToInt(); int attributeCount = iter.nextU2ToInt(); @@ -59,6 +94,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ if (!"Code".equals(clzFile.getConstantPool().getUTF8String(attrNameIndex))) throw new RuntimeException("attributeInfo : " + attrNameIndex); + //CodeAttr.parse int attrLen = iter.nextU4ToInt(); int maxStack = iter.nextU2ToInt(); int maxLocals = iter.nextU2ToInt(); @@ -83,7 +119,29 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ Method method = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); method.setCodeAttr(codeAttr); - return method; + return method;*/ } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public ByteCodeCommand[] getCmds() { + + return this.getCodeAttr().getCmds(); + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java b/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..740a9aa9aa --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/print/ClassFilePrinter.java @@ -0,0 +1,52 @@ +package com.donaldy.jvm.print; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ClassInfo; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.constant.NameAndTypeInfo; + +import com.donaldy.jvm.constant.StringInfo; +import com.donaldy.jvm.constant.UTF8Info; +import com.donaldy.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMajorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + + cnstPoolPrinter.print(); + + } + + public static void main(String[] args){ + String path = "D:\\tools\\Code\\Y_Repository\\coding2017\\group24\\448641125\\out\\production\\448641125\\"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.donaldy.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java b/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..910494d803 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,133 @@ +package com.donaldy.jvm.print; + +import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.clz.ClassIndex; +import com.donaldy.jvm.constant.ClassInfo; +import com.donaldy.jvm.constant.ConstantInfo; +import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.MethodRefInfo; +import com.donaldy.jvm.constant.NameAndTypeInfo; +import com.donaldy.jvm.constant.StringInfo; +import com.donaldy.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + + for(int i=1; i<=pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } + } + /*public void print(){ + + System.out.println("Constant Pool:"); + + for (int i = 0; i <= this.pool.getSize(); ++i) { + ConstantInfo cnstInfo = this.pool.getConstantInfo(i); + + if (cnstInfo instanceof ClassInfo) { + ClassInfo info = (ClassInfo)cnstInfo; + + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + } + + if (cnstInfo instanceof UTF8Info) { + + UTF8Info info = (UTF8Info) cnstInfo; + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + } + + + + *//*int type = constInfo.getType(); + System.out.println("type : " + type); + + if (type == ClassInfo.UTF8_INFO) { + + } else if (type == ClassInfo.FLOAT_INFO) { + + } else if (type == ClassInfo.CLASS_INFO) { + + } else if (type == ClassInfo.STRING_INFO) { + + } else if (type == ClassInfo.FIELD_INFO) { + + } else if (type == ClassInfo.METHOD_INFO) { + + } else if (type == ClassInfo.NAME_AND_TYPE_INFO) { + + }*//* + } + + }*/ +} diff --git a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java index 8610fda4c9..7c30dedb17 100644 --- a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java +++ b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java @@ -2,6 +2,10 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.clz.ClassIndex; +import com.donaldy.jvm.cmd.BiPushCmd; +import com.donaldy.jvm.cmd.ByteCodeCommand; +import com.donaldy.jvm.cmd.OneOperandCmd; +import com.donaldy.jvm.cmd.TwoOperandCmd; import com.donaldy.jvm.constant.*; import com.donaldy.jvm.field.Field; import com.donaldy.jvm.method.Method; @@ -276,4 +280,88 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedCode, code); } + + /** + * 第四次 JVM作业 + */ + + @Test + public void testByteCodeCommand(){ + { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(this.path1); + this.clzFile = loader.loadClass("com.donaldy.jvm.test.EmployeeV1"); + + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + } diff --git a/group24/494800949/EmployeeV1-javap.txt b/group24/494800949/EmployeeV1-javap.txt new file mode 100644 index 0000000000..466714a1dd --- /dev/null +++ b/group24/494800949/EmployeeV1-javap.txt @@ -0,0 +1,164 @@ +$ javap -verbose EmployeeV1 +警告: 二进制文件EmployeeV1包含com.coderising.jvm.test.EmployeeV1 +Classfile /H:/sourceCode/coding2017/group24/494800949/EmployeeV1.class + Last modified 2017-4-9; size 1056 bytes + MD5 checksum 8454b8999ccc9a2ae26a405d47558825 + Compiled from "EmployeeV1.java" +public class com.coderising.jvm.test.EmployeeV1 + minor version: 0 + major version: 52 + flags: ACC_PUBLIC, ACC_SUPER +Constant pool: + #1 = Class #2 // com/coderising/jvm/test/EmployeeV1 + #2 = Utf8 com/coderising/jvm/test/EmployeeV1 + #3 = Class #4 // java/lang/Object + #4 = Utf8 java/lang/Object + #5 = Utf8 name + #6 = Utf8 Ljava/lang/String; + #7 = Utf8 age + #8 = Utf8 I + #9 = Utf8 + #10 = Utf8 (Ljava/lang/String;I)V + #11 = Utf8 Code + #12 = Methodref #3.#13 // java/lang/Object."":()V + #13 = NameAndType #9:#14 // "":()V + #14 = Utf8 ()V + #15 = Fieldref #1.#16 // com/coderising/jvm/test/EmployeeV1.name:Ljava/lang/String; + #16 = NameAndType #5:#6 // name:Ljava/lang/String; + #17 = Fieldref #1.#18 // com/coderising/jvm/test/EmployeeV1.age:I + #18 = NameAndType #7:#8 // age:I + #19 = Utf8 LineNumberTable + #20 = Utf8 LocalVariableTable + #21 = Utf8 this + #22 = Utf8 Lcom/coderising/jvm/test/EmployeeV1; + #23 = Utf8 setName + #24 = Utf8 (Ljava/lang/String;)V + #25 = Utf8 setAge + #26 = Utf8 (I)V + #27 = Utf8 sayHello + #28 = Fieldref #29.#31 // java/lang/System.out:Ljava/io/PrintStream; + #29 = Class #30 // java/lang/System + #30 = Utf8 java/lang/System + #31 = NameAndType #32:#33 // out:Ljava/io/PrintStream; + #32 = Utf8 out + #33 = Utf8 Ljava/io/PrintStream; + #34 = String #35 // Hello , this is class Employee + #35 = Utf8 Hello , this is class Employee + #36 = Methodref #37.#39 // java/io/PrintStream.println:(Ljava/lang/String;)V + #37 = Class #38 // java/io/PrintStream + #38 = Utf8 java/io/PrintStream + #39 = NameAndType #40:#24 // println:(Ljava/lang/String;)V + #40 = Utf8 println + #41 = Utf8 main + #42 = Utf8 ([Ljava/lang/String;)V + #43 = String #44 // Andy + #44 = Utf8 Andy + #45 = Methodref #1.#46 // com/coderising/jvm/test/EmployeeV1."":(Ljava/lang/String;I)V + #46 = NameAndType #9:#10 // "":(Ljava/lang/String;I)V + #47 = Methodref #1.#48 // com/coderising/jvm/test/EmployeeV1.sayHello:()V + #48 = NameAndType #27:#14 // sayHello:()V + #49 = Utf8 args + #50 = Utf8 [Ljava/lang/String; + #51 = Utf8 p + #52 = Utf8 SourceFile + #53 = Utf8 EmployeeV1.java +{ + public com.coderising.jvm.test.EmployeeV1(java.lang.String, int); + descriptor: (Ljava/lang/String;I)V + flags: ACC_PUBLIC + Code: + stack=2, locals=3, args_size=3 + 0: aload_0 + 1: invokespecial #12 // Method java/lang/Object."":()V + 4: aload_0 + 5: aload_1 + 6: putfield #15 // Field name:Ljava/lang/String; + 9: aload_0 + 10: iload_2 + 11: putfield #17 // Field age:I + 14: return + LineNumberTable: + line 9: 0 + line 10: 4 + line 11: 9 + line 12: 14 + LocalVariableTable: + Start Length Slot Name Signature + 0 15 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 15 1 name Ljava/lang/String; + 0 15 2 age I + + public void setName(java.lang.String); + descriptor: (Ljava/lang/String;)V + flags: ACC_PUBLIC + Code: + stack=2, locals=2, args_size=2 + 0: aload_0 + 1: aload_1 + 2: putfield #15 // Field name:Ljava/lang/String; + 5: return + LineNumberTable: + line 15: 0 + line 16: 5 + LocalVariableTable: + Start Length Slot Name Signature + 0 6 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 6 1 name Ljava/lang/String; + + public void setAge(int); + descriptor: (I)V + flags: ACC_PUBLIC + Code: + stack=2, locals=2, args_size=2 + 0: aload_0 + 1: iload_1 + 2: putfield #17 // Field age:I + 5: return + LineNumberTable: + line 18: 0 + line 19: 5 + LocalVariableTable: + Start Length Slot Name Signature + 0 6 0 this Lcom/coderising/jvm/test/EmployeeV1; + 0 6 1 age I + + public void sayHello(); + descriptor: ()V + flags: ACC_PUBLIC + Code: + stack=2, locals=1, args_size=1 + 0: getstatic #28 // Field java/lang/System.out:Ljava/io/PrintStream; + 3: ldc #34 // String Hello , this is class Employee + 5: invokevirtual #36 // Method java/io/PrintStream.println:(Ljava/lang/String;)V + 8: return + LineNumberTable: + line 21: 0 + line 22: 8 + LocalVariableTable: + Start Length Slot Name Signature + 0 9 0 this Lcom/coderising/jvm/test/EmployeeV1; + + public static void main(java.lang.String[]); + descriptor: ([Ljava/lang/String;)V + flags: ACC_PUBLIC, ACC_STATIC + Code: + stack=4, locals=2, args_size=1 + 0: new #1 // class com/coderising/jvm/test/EmployeeV1 + 3: dup + 4: ldc #43 // String Andy + 6: bipush 29 + 8: invokespecial #45 // Method "":(Ljava/lang/String;I)V + 11: astore_1 + 12: aload_1 + 13: invokevirtual #47 // Method sayHello:()V + 16: return + LineNumberTable: + line 24: 0 + line 25: 12 + line 27: 16 + LocalVariableTable: + Start Length Slot Name Signature + 0 17 0 args [Ljava/lang/String; + 12 5 1 p Lcom/coderising/jvm/test/EmployeeV1; +} +SourceFile: "EmployeeV1.java" diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..7db7a49c32 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..b1685c4314 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,93 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.attr; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.CommandParser; +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + //回退2个字节 + iter.back(ByteCodeIterator.U2); + int attrNameIndex = iter.readTwoBytesToInt(); + int attrLen = iter.readFourBytesToInt(); + int maxStack = iter.readTwoBytesToInt(); + int maxLocal = iter.readTwoBytesToInt(); + int codeLen = iter.readFourBytesToInt(); + String code = iter.readBytesToHexString(codeLen); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocal, codeLen, code, cmds); + //异常表长度 + int exceptionTableLen = iter.readTwoBytesToInt(); + if (exceptionTableLen > 0) { + throw new RuntimeException("not impl yet"); + } + + //子属性个数 + int attrCount = iter.readTwoBytesToInt(); + for (int i = 0; i < attrCount; i++) { + attrNameIndex = iter.readTwoBytesToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + if ("LineNumberTable".equals(attrName)) { + LineNumberTable lineNumberTable = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(lineNumberTable); + } else if ("LocalVariableTable".equals(attrName)) { + LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(localVariableTable); + } else if ("StackMapTable".equals(attrName)) { + StackMapTable stackMapTable = StackMapTable.parse(iter); + codeAttr.setStackMapTable(stackMapTable); + } else { + throw new RuntimeException("not impl yet"); + } + } + + return codeAttr; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + } + + + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LineNumberTable.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..93e7d9b7a8 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,52 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.attr; + +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + iter.back(ByteCodeIterator.U2); + int attrNameIndex = iter.readTwoBytesToInt(); + int attrLen = iter.readFourBytesToInt(); + LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex, attrLen); + int itemCount = iter.readTwoBytesToInt(); + for (int i = 0; i < itemCount; i++) { + LineNumberItem lineNumberItem = new LineNumberItem(); + lineNumberItem.setStartPC(iter.readTwoBytesToInt()); + lineNumberItem.setLineNum(iter.readTwoBytesToInt()); + lineNumberTable.addLineNumberItem(lineNumberItem); + } + return lineNumberTable; + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..9e9e1d9e21 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..2900349fa5 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,39 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.attr; + + +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + iter.back(ByteCodeIterator.U2); + int attrNameIdex = iter.readTwoBytesToInt(); + int attrLen = iter.readFourBytesToInt(); + LocalVariableTable localVariableTable = new LocalVariableTable(attrNameIdex, attrLen); + int varCount = iter.readTwoBytesToInt(); + for (int i = 0; i < varCount; i++) { + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.readTwoBytesToInt()); + item.setLength(iter.readTwoBytesToInt()); + item.setNameIndex(iter.readTwoBytesToInt()); + item.setDescIndex(iter.readTwoBytesToInt()); + item.setIndex(iter.readTwoBytesToInt()); + localVariableTable.addLocalVariableItem(item); + } + return localVariableTable; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..a6e55353f1 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.attr; + + +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + iter.back(ByteCodeIterator.U2); + int index = iter.readTwoBytesToInt(); + int len = iter.readFourBytesToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.readBytesToString(len); + t.setOriginalCode(code); + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java index 0d2525e416..6c88b9fff5 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -3,28 +3,51 @@ import com.coding.mini_jvm.src.com.coderising.jvm.constant.ClassInfo; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.field.Field; +import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; public class ClassFile { - + + private static final String MAIN_METHOD_NAME = "main"; private int minorVersion; private int majorVersion; - + private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - - + private List fields = new ArrayList(); + private List methods = new ArrayList(); + public ClassIndex getClzIndex() { return clzIndex; } + public AccessFlag getAccessFlag() { return accessFlag; } + public void setAccessFlag(AccessFlag accessFlag) { this.accessFlag = accessFlag; } - - + + public void addField(Field f) { + this.fields.add(f); + } + + public List getFields() { + return this.fields; + } + + public void addMethod(Method m) { + this.methods.add(m); + } + + public List getMethods() { + return methods; + } public ConstantPool getConstantPool() { return pool; @@ -49,28 +72,41 @@ 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(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + for (Method method : methods) { + String name = method.getClzFile().getConstantPool().getUTF8String(method.getNameIndex()); + if (methodName.equals(name)) { + return method; + } + } + + return null; + } + public Method getMainMethod(){ + for (Method method : methods) { + String name = method.getClzFile().getConstantPool().getUTF8String(method.getNameIndex()); + if (MAIN_METHOD_NAME.equals(name)) { + return method; + } + } + return null; + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..eb7dafa79d --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,21 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..b44d66c880 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,127 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static { + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..dd01d38872 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,150 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; + +import java.util.ArrayList; +import java.util.List; +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + CommandIterator cmdIter = new CommandIterator(codes); + List cmds = new ArrayList<>(); + //2ab7000c2a2bb5000f2a1cb50011b1 + while (cmdIter.hasNext()) { + String operCode = cmdIter.next2CharAsString().toUpperCase(); + switch (operCode) { + case bipush: + BiPushCmd cmd = new BiPushCmd(clzFile, operCode); + cmd.setOperand(cmdIter.next2CharAsInt()); + cmds.add(cmd); + break; + case getfield: + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, operCode); + getFieldCmd.setOprand1(cmdIter.next2CharAsInt()); + getFieldCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(getFieldCmd); + break; + case getstatic: + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, operCode); + getStaticFieldCmd.setOprand1(cmdIter.next2CharAsInt()); + getStaticFieldCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(getStaticFieldCmd); + break; + case invokespecial: + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, operCode); + invokeSpecialCmd.setOprand1(cmdIter.next2CharAsInt()); + invokeSpecialCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(invokeSpecialCmd); + break; + case invokevirtual: + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, operCode); + invokeVirtualCmd.setOprand1(cmdIter.next2CharAsInt()); + invokeVirtualCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(invokeVirtualCmd); + break; + case ldc: + LdcCmd ldcCmd = new LdcCmd(clzFile, operCode); + ldcCmd.setOperand(cmdIter.next2CharAsInt()); + cmds.add(ldcCmd); + break; + case new_object: + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, operCode); + newObjectCmd.setOprand1(cmdIter.next2CharAsInt()); + newObjectCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(newObjectCmd); + break; + case putfield: + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, operCode); + putFieldCmd.setOprand1(cmdIter.next2CharAsInt()); + putFieldCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(putFieldCmd); + break; + case astore_1: + case aload_0: + case aload_1: + case iload_1: + case iload_2: + case istore_1: + case voidreturn: + case dup: + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, operCode); + cmds.add(noOperandCmd); + break; + default: + throw new RuntimeException("this oper [ " +operCode+ " ]not impl yet"); + } + } + calcuateOffset(cmds); + return cmds.toArray(new ByteCodeCommand[cmds.size()]); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..5801068cb0 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,21 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e577d1b56c --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..2900bb2c60 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,22 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..ff7f0fdf14 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..abaeae3a9e --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..db90b82a35 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..3cd045f6d3 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,24 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..696764c3e7 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..6f6ecd0eb1 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..78475ac911 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,63 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java index 227bb010a1..489e8c7c7c 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -15,10 +15,15 @@ public void setUtf8Index(int utf8Index) { public int getType() { return type; } - + public String getClassName() { int index = getUtf8Index(); UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java index e7c849ca59..7a9200f669 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -2,7 +2,6 @@ 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; @@ -25,5 +24,15 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index 1808a35c65..bca8e0b32b 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -11,7 +11,7 @@ public FieldRefInfo(ConstantPool pool) { public int getType() { return type; } - + public int getClassInfoIndex() { return classInfoIndex; } @@ -51,4 +51,11 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index dc62d438e6..4664a79cf4 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -14,7 +14,12 @@ public MethodRefInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + public int getClassInfoIndex() { return classInfoIndex; } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index b8b9da7353..f1c59a0d5e 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -25,8 +25,13 @@ public void setIndex2(int index2) { public int getType() { return type; } - - + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } + + public String getName(){ ConstantPool pool = this.getConstantPool(); UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index bf19f681d8..16ec6a1e2f 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } - + + @Override + public void accept(Visitor visitor) { + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java index 05a4afad6a..d18ac12305 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -10,7 +10,12 @@ public StringInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } + public int getIndex() { return index; } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java index 61f20ed8f1..81160db29e 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -16,6 +16,12 @@ public void setLength(int length) { public int getType() { return type; } + + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } + @Override public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..18bcdb2851 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,38 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.field; + + +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + int accessFlag = iter.readTwoBytesToInt(); + int nameIndex = iter.readTwoBytesToInt(); + int descIndex = iter.readTwoBytesToInt(); + int attributesCount = iter.readTwoBytesToInt(); + if (attributesCount > 0) + throw new RuntimeException("attributeCount of field not impl"); + return new Field(accessFlag, nameIndex, descIndex, pool); + } + + + @Override + public String toString() { + return pool.getUTF8String(nameIndex)+":"+pool.getUTF8String(descriptorIndex); + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java index 27d0c63af0..cf2db01a36 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -3,10 +3,10 @@ import com.coding.mini_jvm.src.com.coderising.jvm.util.Util; public class ByteCodeIterator { - private static final int U1 = 1; - private static final int U2 = 2; - private static final int U4 = 4; - private static final int U8 = 8; + public static final int U1 = 1; + public static final int U2 = 2; + public static final int U4 = 4; + public static final int U8 = 8; private byte[] bytes; private int cursor; @@ -27,12 +27,27 @@ public String readBytesToString(int len) { } + public String readBytesToHexString(int len) { + byte[] bs = new byte[len]; + System.arraycopy(bytes, cursor, bs, 0, len); + String ret = Util.byteToHexString(bs); + cursor += len; + return ret; + } + + public int readTwoBytesToInt() { int ret = Util.bytes2Int(bytes, cursor, U2); cursor += U2; return ret; } + public int readFourBytesToInt() { + int ret = Util.bytes2Int(bytes, cursor, U4); + cursor += U4; + return ret; + } + public int readByteToInt() { int ret = Util.bytes2Int(bytes, cursor, U1); cursor += U1; @@ -49,4 +64,12 @@ public int skip(int len) { cursor += len; return cursor; } + + public int back(int len) { + if (cursor + len < 0 || cursor + len > bytes.length - 1) { + throw new IndexOutOfBoundsException(); + } + cursor -= len; + return cursor; + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileParser.java index 542968c809..afe40a2156 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -4,6 +4,8 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassIndex; import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; +import com.coding.mini_jvm.src.com.coderising.jvm.field.Field; +import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; public class ClassFileParser { @@ -18,11 +20,22 @@ public ClassFile parse(byte[] codes) { //主版本号 classFile.setMajorVersion(iterator.readTwoBytesToInt()); //解析常量池 - classFile.setConstPool(parseConstantPool(iterator)); + ConstantPool constantPool = parseConstantPool(iterator); + classFile.setConstPool(constantPool); //访问限制符 classFile.setAccessFlag(parseAccessFlag(iterator)); //当前类/父类 classFile.setClassIndex(parseClassIndex(iterator)); + + //接口数量暂时不实现 + int intefaceCount = iterator.readTwoBytesToInt(); + if (intefaceCount > 0) { + throw new RuntimeException(); + } + //解析字段 + parseFields(classFile,iterator, constantPool); + //解析方法 + parseMethod(classFile, iterator, constantPool); return classFile; } @@ -99,5 +112,19 @@ private ConstantPool parseConstantPool(ByteCodeIterator iterator) { return constantPool; } - + + private void parseFields(ClassFile classFile, ByteCodeIterator iterator, ConstantPool constantPool) { + int fieldCount = iterator.readTwoBytesToInt(); + for (int i = 0; i < fieldCount; i++) + classFile.addField(Field.parse(constantPool, iterator)); + } + + + private void parseMethod(ClassFile clzFile, ByteCodeIterator iter, ConstantPool pool) { + int methodCount = iter.readTwoBytesToInt(); + for (int i = 0; i < methodCount; i++) { + clzFile.addMethod(Method.parse(clzFile, iter)); + } + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java new file mode 100644 index 0000000000..b848e6b515 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java @@ -0,0 +1,69 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.method; + + +import com.coding.mini_jvm.src.com.coderising.jvm.attr.CodeAttr; +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + int accessFlag = iter.readTwoBytesToInt(); + int nameIndex = iter.readTwoBytesToInt(); + int descIndex = iter.readTwoBytesToInt(); + Method method = new Method(clzFile, accessFlag, nameIndex, descIndex); + int attrCount = iter.readTwoBytesToInt(); + if (attrCount > 1) + throw new RuntimeException("other attrbute not impl yet"); + for (int i = 0; i < attrCount; i++) { + int attrNameIndex = iter.readTwoBytesToInt(); + if ("Code".equals(clzFile.getConstantPool().getUTF8String(attrNameIndex))) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + method.setCodeAttr(codeAttr); + } else + throw new RuntimeException(" attribute[ " + attrNameIndex + " ] not impl yet"); + } + return method; + } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..39553dd48c --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,45 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.print; + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "H:\\sourceCode\\coding2017\\group24\\494800949"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..baa0e8ead4 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,34 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.print; + + +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; + +import java.util.Formatter; + +public class ConstantPoolPrinter { + ConstantPool pool; + + ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + + System.out.println("Constant Pool:"); + + for (int i = 1; i <= (int)pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + Formatter formatter = new Formatter(System.out); + formatter.format("%5s", "#"+i); + constantInfo.accept(new SimpleVistor()); + } + } + + public static void main(String[] args) { +// Formatter f = new Formatter(System.out); +// f.format("%-15s %-5s %-10s\n", "Item", "Qty", "Price"); +// f.format("%-15s %-5s %-10s\n", "----", "----", "-----"); + + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java new file mode 100644 index 0000000000..e10e7885ba --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java @@ -0,0 +1,56 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.print; + +import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; + +import java.util.Formatter; + +/** + * Created by Administrator on 2017/4/23 0023. + */ +public class SimpleVistor implements ConstantInfo.Visitor { + private Formatter formatter = new Formatter(System.out); + private String format = " = %-20s %-20s %-100s\n"; + private static final String HASH_KEY = "#"; + private static final String DOUBLE_SLASH = "// "; + private static final String DOT = "."; + private static final String COLON = ":"; + + @Override + public void visitClassInfo(ClassInfo info) { + formatter.format(format, "Class", + HASH_KEY + info.getUtf8Index(), + DOUBLE_SLASH + info.getClassName()); + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)info.getConstantInfo(info.getNameAndTypeIndex()); + formatter.format(format, "Fieldref", + HASH_KEY + info.getClassInfoIndex() + DOT + HASH_KEY + info.getNameAndTypeIndex(), + DOUBLE_SLASH + info.getClassName() + DOT + nameAndTypeInfo.getName() + COLON + nameAndTypeInfo.getTypeInfo()); + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + formatter.format(format, "Methodref", + HASH_KEY + info.getClassInfoIndex() + DOT + HASH_KEY + info.getNameAndTypeIndex(), + DOUBLE_SLASH + info.getClassName() + DOT + info.getMethodName()); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + formatter.format(format, "NameAndType", + HASH_KEY + info.getIndex1() + COLON + HASH_KEY + info.getIndex2(), + DOUBLE_SLASH + info.getName() + COLON + info.getTypeInfo()); + } + + @Override + public void visitString(StringInfo info) { + formatter.format(format, "String", HASH_KEY + info.getIndex(), DOUBLE_SLASH + info.toString()); + } + + @Override + public void visistUTF8(UTF8Info info) { + formatter.format(format, "Utf8", info.getValue(), ""); + } +} diff --git a/group24/494800949/src/main/java/com/coding/weak1/Stack.java b/group24/494800949/src/main/java/com/coding/weak1/Stack.java index ffa00f99e7..0eecd9d684 100644 --- a/group24/494800949/src/main/java/com/coding/weak1/Stack.java +++ b/group24/494800949/src/main/java/com/coding/weak1/Stack.java @@ -18,6 +18,8 @@ public Object pop(){ } public Object peek(){ + if (size() == 0) + return null; return elementData.get(elementData.size()-1); } public boolean isEmpty(){ diff --git a/group24/494800949/src/main/java/com/coding/week6/expr/InfixExpr.java b/group24/494800949/src/main/java/com/coding/week6/expr/InfixExpr.java new file mode 100644 index 0000000000..34c1b15123 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/expr/InfixExpr.java @@ -0,0 +1,127 @@ +package com.coding.week6.expr; + +import com.coding.weak1.Stack; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class InfixExpr { + String expr = null; + private Stack numberStack; + private Stack operatorStack; + private List tokens; + public InfixExpr(String expr) { + this.expr = expr; + this.numberStack = new Stack(); + this.operatorStack = new Stack(); + tokens = new ArrayList<>(); + } + + + public float evaluate() { + fillStack(); + while (!operatorStack.isEmpty()) { + char symbol = (char) operatorStack.pop(); + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(caculate(symbol, operTop2, operTop1)); + } + return (float)numberStack.pop(); + } + + public void parseTokens() { + char[] chars = expr.toCharArray(); + for (int i = 0; i < chars.length; i++) { + char c = chars[i]; + if (Token.isOperator(c)) { + Token token = new Token(c+""); + tokens.add(token); + } else { + String t = ""; + while (Token.isDigit(c)){ + t += c; + i++; + if (i == chars.length) + break; + c = chars[i]; + } + Token token = new Token(t); + tokens.add(token); + i--; + } + } + } + + + public void fillStack() { + parseTokens(); + Iterator iterator = tokens.iterator(); + while (iterator.hasNext()) { + Token token = iterator.next(); + if (token.isNumber()) { + numberStack.push((float)token.parseInt()); + continue; + } + if (token.isOperator()) { + char operator = token.parseOperator(); + if (operatorStack.isEmpty()) { + operatorStack.push(operator); + }else { + char topSymbol = (char)operatorStack.peek(); + if (compare(operator, topSymbol) > 0) { + operatorStack.push(operator); + } else { + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(caculate(topSymbol, operTop2, operTop1)); + operatorStack.pop(); + operatorStack.push(operator); + } + } + } + + } + } + + + private float caculate(char symbol, float oper1, float oper2) { + if ('*' == symbol) + return oper1 * oper2; + else if ('/' == symbol) + return oper1 / oper2; + else if ('+' == symbol) + return oper1 + oper2; + else if ('-' == symbol) + return oper1 - oper2; + else + throw new RuntimeException("this operation has not implement"); + } + + public int compare(char opertor1, char opertor2) { + if (!Token.isOperator(opertor1) ) + throw new IllegalArgumentException(opertor1 + "is not supported opertor"); + if (!Token.isOperator(opertor2)) + throw new IllegalArgumentException(opertor2 + "is not supported opertor"); + if (Token.isAddOrSub(opertor1)) { + if (Token.isAddOrSub(opertor2)) + return 0; + else + return -1; + } + else { + if (Token.isAddOrSub(opertor2)) + return 1; + else + return 0; + } + } + + public String printNumberStack() { + return numberStack.toString(); + } + + public String printOperatorStack() { + return operatorStack.toString(); + } +} diff --git a/group24/494800949/src/main/java/com/coding/week6/expr/Token.java b/group24/494800949/src/main/java/com/coding/week6/expr/Token.java new file mode 100644 index 0000000000..b58aa36968 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/expr/Token.java @@ -0,0 +1,52 @@ +package com.coding.week6.expr; + +/** + * Created by Administrator on 2017/4/16 0016. + */ +public class Token { + + private String symbol; + + public Token(String symbol) { + this.symbol = symbol; + } + + public boolean isNumber() { + return symbol.matches("^\\d+$"); + } + + + public boolean isOperator() { + return symbol.matches("^[\\+|\\*|\\-|\\/]$"); + } + + public int parseInt() { + return Integer.valueOf(symbol); + } + + public char parseOperator() { + return symbol.charAt(0); + } + + + public static boolean isOperator(char c) { + return isAddOrSub(c) || isMulityOrDivide(c); + } + + public static boolean isAddOrSub(char c) { + return c == '+' || c == '-'; + } + + public static boolean isMulityOrDivide(char c) { + return c == '/' || c == '*'; + } + + public static boolean isDigit(char c) { + return c >= '0' && c <= '9'; + } + + @Override + public String toString(){ + return symbol; + } +} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java new file mode 100644 index 0000000000..3962b49fce --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/InfixExpr.java @@ -0,0 +1,57 @@ +package com.coding.week6.exprNew; + +import com.coding.weak1.Stack; + +import java.util.List; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + + public float evaluate() { + + Stack operatorStack = new Stack(); + Stack numberStack = new Stack(); + fillStack(numberStack, operatorStack); + while (!operatorStack.isEmpty()) { + Operator symbol = (Operator) operatorStack.pop(); + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(symbol.apply(operTop2, operTop1)); + } + return (float)numberStack.pop(); + } + + public void fillStack(Stack numberStack, Stack operatorStack) { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + for (Token token : tokens) { + if (token.isNumber()) { + numberStack.push(token.getFloatValue()); + } + else if (token.isOperator()) { + Operator o = token.getOperator(); + if (operatorStack.isEmpty()) { + operatorStack.push(o); + }else { + Operator top = (Operator)operatorStack.peek(); + if (o.hasHigherPriority(top)) { + operatorStack.push(o); + } else { + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(top.apply(operTop2, operTop1)); + operatorStack.pop(); + operatorStack.push(o); + } + } + } + + } + } + +} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java new file mode 100644 index 0000000000..f6b4681e46 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/Operator.java @@ -0,0 +1,75 @@ +package com.coding.week6.exprNew; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public enum Operator { + ADD("+", 1) { + public float apply(float x, float y){ + return x + y; + } + }, + + SUB("-", 1) { + @Override + public float apply(float x, float y) { + return x - y; + } + }, + + MULT("*", 2) { + @Override + public float apply(float x, float y) { + return x * y; + } + }, + + DIVI("/", 2) { + @Override + public float apply(float x, float y) { + return x / y; + } + }; + private String symbol; + private int priority; + + Operator(String symbol, int priority) { + this.symbol = symbol; + this.priority = priority; + } + + public boolean hasHigherPriority(Operator o) { + return this.priority > o.priority; + } + + public String symbol() { + return symbol; + } + + public static List symbols() { + List symbos = new ArrayList<>(); + for (Operator o : Operator.values()) { + symbos.add(o.symbol); + } + return symbos; + } + + public abstract float apply(float x, float y); + + private static final Map map = new HashMap(); + + static { + for (Operator o : Operator.values()) { + map.put(o.symbol, o); + } + } + + public static Map getOperatorMap() { + return map; + } +} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java new file mode 100644 index 0000000000..c925a22705 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/Token.java @@ -0,0 +1,63 @@ +package com.coding.week6.exprNew; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class Token { + + private int type; + private String value; + + static final int NUMBER = 1; + static final int OPERATOR = 2; + static final int LEFT_BRACKET = 3; + static final int RIGHT_BRACKET = 4; + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + + public boolean isNumber(){ + return type == NUMBER; + } + + public boolean isOperator(){ + return type == OPERATOR; + } + + public boolean isLeftBracket() { + return type == LEFT_BRACKET; + } + + public boolean isRightBracket() { + return type == RIGHT_BRACKET; + } + + public float getFloatValue() { + if (isNumber()) + return Integer.valueOf(value); + else + throw new RuntimeException("not a number"); + } + + public String toString() { + return value; + } + + + public Operator getOperator() { + if (isOperator()) { + return Operator.getOperatorMap().get(value); + } else { + throw new RuntimeException("not a operator"); + } + } + + + public String getValue() { + return value; + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java b/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java new file mode 100644 index 0000000000..52757dc0c7 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week6/exprNew/TokenParser.java @@ -0,0 +1,60 @@ +package com.coding.week6.exprNew; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class TokenParser { + + private static List operators = Operator.symbols(); + public List parse(String expr) { + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + char c = expr.charAt(i); + Token token; + if (Character.isDigit(c)) { + int nextOperIndex = getNextOperIndex(i, expr); + String n = expr.substring(i, nextOperIndex); + token = new Token(Token.NUMBER, n); + tokens.add(token); + i = nextOperIndex; + } else if (isOperator(c)) { + token = new Token(Token.OPERATOR, c+""); + tokens.add(token); + i++; + } else if (String.valueOf(c).matches("\\s")){ + i++; + } else if (c == '(') { + token = new Token(Token.LEFT_BRACKET, String.valueOf(c)); + tokens.add(token); + i++; + } else if (c == ')') { + token = new Token(Token.RIGHT_BRACKET, String.valueOf(c)); + tokens.add(token); + i++; + } else { + throw new RuntimeException(c +" is not number or support operator"); + } + } + return tokens; + } + + private int getNextOperIndex(int i, String expr) { + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char c) { + return operators.contains(String.valueOf(c)); + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java b/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java new file mode 100644 index 0000000000..6717f571ee --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week7/InfixToPostfix.java @@ -0,0 +1,69 @@ +package com.coding.week7; + +import com.coding.week6.exprNew.Operator; +import com.coding.week6.exprNew.Token; +import com.coding.week6.exprNew.TokenParser; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + /** + 1 建立符号栈 + 2 顺序扫描中序表达式 + a) 是数字, 直接输出 + b) 是运算符 + i : “(” 直接入栈 + ii : “)” 将符号栈中的元素依次出栈并输出, 直到 “(“, “(“只出栈, 不输出 + iii: 其他符号, 将符号栈中的元素依次出栈并输出, 直到 遇到比当前符号优先级更低的符号或者”(“。 将当前符号入栈。 + 3 扫描完后, 将栈中剩余符号依次输出 + */ + List targetTokens = new ArrayList<>(); + TokenParser tokenParser = new TokenParser(); + List sourceTokes = tokenParser.parse(expr); + Stack operStack = new Stack(); + for (Token token : sourceTokes) { + if (token.isNumber()) { + targetTokens.add(token); + } else { + //左括号 + if (token.isLeftBracket()) { + operStack.push(token); + //右括号 + } else if (token.isRightBracket()) { + while (!operStack.isEmpty()) { + Token t = operStack.peek(); + if (t.isLeftBracket()) { + operStack.pop(); + break; + } else { + targetTokens.add(operStack.pop()); + } + } + //普通运算符 + } else { + Operator oper = token.getOperator(); + if (!operStack.isEmpty()) { + Token t = operStack.peek(); + while (!t.isLeftBracket() && !oper.hasHigherPriority(t.getOperator()) && !operStack.isEmpty()) { + t = operStack.pop(); + targetTokens.add(t); + } + } + operStack.push(token); + } + } + } + //将栈中操作符全部输出 + while (!operStack.isEmpty()) { + targetTokens.add(operStack.pop()); + } + return targetTokens; + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java b/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java new file mode 100644 index 0000000000..8fb78e6a8d --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week7/PostfixExpr.java @@ -0,0 +1,39 @@ +package com.coding.week7; + +import com.coding.week6.exprNew.Operator; +import com.coding.week6.exprNew.Token; +import com.coding.week6.exprNew.TokenParser; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + final Stack numStack; + final Stack operStack; + + public PostfixExpr(String expr) { + this.expr = expr; + this.numStack = new Stack<>(); + this.operStack = new Stack<>(); + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push(token.getFloatValue()); + } else if (token.isOperator()) { + if (numStack.size() >= 2) { + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = token.getOperator().apply(num2, num1); + numStack.push(result); + } + } + } + return numStack.pop(); + } + +} diff --git a/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java b/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java new file mode 100644 index 0000000000..1bb8e4fd8a --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week7/PrefixExpr.java @@ -0,0 +1,43 @@ +package com.coding.week7; + +import com.coding.week6.exprNew.Operator; +import com.coding.week6.exprNew.Token; +import com.coding.week6.exprNew.TokenParser; + +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + final Stack numStack; + final Stack operStack; + + public PrefixExpr(String expr) { + this.expr = expr; + numStack = new Stack<>(); + operStack = new Stack<>(); + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + parser.parse(expr); + List tokens = parser.parse(expr); + Collections.reverse(tokens); + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push(token.getFloatValue()); + } else if (token.isOperator()) { + if (numStack.size() >= 2) { + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = token.getOperator().apply(num1, num2); + numStack.push(result); + } + } + } + return numStack.pop(); + } + + +} diff --git a/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java b/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java index a03f29c0c3..b9561f243b 100644 --- a/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java +++ b/group24/494800949/src/test/java/com/coding/mini_jvm/test/ClassFileloaderTest.java @@ -2,23 +2,27 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassIndex; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.BiPushCmd; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.OneOperandCmd; +import com.coding.mini_jvm.src.com.coderising.jvm.cmd.TwoOperandCmd; import com.coding.mini_jvm.src.com.coderising.jvm.constant.*; +import com.coding.mini_jvm.src.com.coderising.jvm.field.Field; import com.coding.mini_jvm.src.com.coderising.jvm.loader.ClassFileLoader; +import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; import com.coding.mini_jvm.src.com.coderising.jvm.util.Util; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; - - - +import java.util.List; public class ClassFileloaderTest { - static String path1 = "H:\\sourceCode\\coding2017\\group24\\494800949\\build\\classes\\test"; + static String path1 = "H:\\sourceCode\\coding2017\\group24\\494800949"; static String path2 = "C:\temp"; private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; @@ -27,7 +31,7 @@ public class ClassFileloaderTest { static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - String className = "com.coding.mini_jvm.test.EmployeeV1"; + String className = "EmployeeV1"; clzFile = loader.loadClass(className); // clzFile.print(); @@ -170,4 +174,153 @@ public void testClassIndex(){ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + + + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + /***************************第四次jvm测试用例 **************************/ + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } diff --git a/group24/494800949/src/test/java/com/coding/week6/expr/InfixExprTestTest.java b/group24/494800949/src/test/java/com/coding/week6/expr/InfixExprTestTest.java new file mode 100644 index 0000000000..7ef4b9ccfa --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week6/expr/InfixExprTestTest.java @@ -0,0 +1,77 @@ +package com.coding.week6.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Administrator on 2017/4/16 0016. + */ +public class InfixExprTestTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + + + @Test + public void testFillStack() { + InfixExpr expr = new InfixExpr("10-30+50"); + expr.fillStack(); + Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); + Assert.assertEquals(expr.printOperatorStack(), "+"); + expr = new InfixExpr("3*20+12*5-40/2"); + expr.fillStack(); + Assert.assertEquals(expr.printNumberStack(), "2.0,40.0,60.0,60.0"); + Assert.assertEquals(expr.printOperatorStack(), "/,-,+"); + expr = new InfixExpr("3*20/2"); + expr.fillStack(); + Assert.assertEquals(expr.printNumberStack(), "2.0,60.0"); + Assert.assertEquals(expr.printOperatorStack(), "/"); + expr = new InfixExpr("20/2*3"); + expr.fillStack(); + Assert.assertEquals(expr.printNumberStack(), "3.0,10.0"); + Assert.assertEquals(expr.printOperatorStack(), "*"); + expr = new InfixExpr("10-30+50"); + expr.fillStack(); + Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); + Assert.assertEquals(expr.printOperatorStack(), "+"); + } + + + +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java b/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java new file mode 100644 index 0000000000..9939878611 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week6/exprNew/InfixExprTestTest.java @@ -0,0 +1,78 @@ +package com.coding.week6.exprNew; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Administrator on 2017/4/16 0016. + */ +public class InfixExprTestTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3|"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + + +// @Test +// public void testFillStack() { +// InfixExpr expr = new InfixExpr("10-30+50"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); +// Assert.assertEquals(expr.printOperatorStack(), "+"); +// expr = new InfixExpr("3*20+12*5-40/2"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "2.0,40.0,60.0,60.0"); +// Assert.assertEquals(expr.printOperatorStack(), "/,-,+"); +// expr = new InfixExpr("3*20/2"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "2.0,60.0"); +// Assert.assertEquals(expr.printOperatorStack(), "/"); +// expr = new InfixExpr("20/2*3"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "3.0,10.0"); +// Assert.assertEquals(expr.printOperatorStack(), "*"); +// expr = new InfixExpr("10-30+50"); +// expr.fillStack(); +// Assert.assertEquals(expr.printNumberStack(), "50.0,-20.0"); +// Assert.assertEquals(expr.printOperatorStack(), "+"); +// } + + + +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java b/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java new file mode 100644 index 0000000000..1e202ed615 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week6/exprNew/TokenParserTest.java @@ -0,0 +1,18 @@ +package com.coding.week6.exprNew; + +import org.junit.Test; + +import java.util.List; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class TokenParserTest { + + @Test + public void testParse() throws Exception { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse("3* 20+1 2*5-40/2"); + System.out.println(tokens); + } +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java b/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java new file mode 100644 index 0000000000..54a59316d6 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week7/InfixToPostfixTest.java @@ -0,0 +1,34 @@ +package com.coding.week7; + +import com.coding.week6.exprNew.Token; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +/** + * Created by Administrator on 2017/4/23 0023. + */ +public class InfixToPostfixTest { + + @Test + public void testConvert() throws Exception { + { + String expr = "9+(3-1)*3+10/2";//"9 3 1-3*+ 10 2/+" + List tokens = InfixToPostfix.convert(expr); + System.out.println(tokens); + Assert.assertEquals("9", tokens.get(0).toString()); + Assert.assertEquals("3", tokens.get(1).toString()); + Assert.assertEquals("1", tokens.get(2).toString()); + Assert.assertEquals("-", tokens.get(3).toString()); + Assert.assertEquals("3", tokens.get(4).toString()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals("+", tokens.get(6).toString()); + Assert.assertEquals("10", tokens.get(7).toString()); + Assert.assertEquals("2", tokens.get(8).toString()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals("+", tokens.get(10).toString()); + } + + } +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java b/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java new file mode 100644 index 0000000000..bde078a97e --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week7/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.week7; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java b/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java new file mode 100644 index 0000000000..bb2061303e --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week7/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.week7; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java new file mode 100644 index 0000000000..8ae862da33 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayList.java @@ -0,0 +1,115 @@ +package basic.dataStructure; + +/** + * Created by macvi on 2017/4/2. + */ +public class ArrayList implements List { + private int size = 10; + //每次扩容的长度,默认为10 + private int extendSize = 10; + + private Object[] data = new Object[size]; + + public ArrayList(Object o) { + this.add(o); + } + + public ArrayList(){} + + public void add(Object o) { + if (this.size() == this.size) { + this.size += extendSize; + Object[] newData = new Object[this.size]; + System.arraycopy(this.data, 0, newData, 0, this.data.length); + this.data = newData; + } + + for (int i = 0; i < this.data.length; i++) { + if (data[i] == null) { + data[i] = o; + break; + } else continue; + } + } + + public void add(int index, Object o) { + if (index > this.size() || index < 0) { + throw new IndexOutOfBoundsException(); + } + + if(this.size() == this.size){ + this.size += extendSize; + } + + Object[] newData = new Object[this.size]; + + System.arraycopy(this.data, 0, newData, 0, index); + newData[index] = o; + System.arraycopy(this.data, index, newData, index + 1, this.size() - index); + + this.data = newData; + } + + public Object get(int index) { + if(index > this.size() || index < 0){ + throw new IndexOutOfBoundsException(); + } + for(int i = 0; i < this.size(); i ++){ + if(index == i){ + return this.data[i]; + } + } + + return null; + } + + public Object remove(int index) { + if(index > this.size() || index < 0){ + throw new IndexOutOfBoundsException(); + } + + Object[] newData = new Object[this.size]; + Object removed = this.get(index); + + System.arraycopy(this.data, 0, newData, 0, index); + System.arraycopy(this.data, index + 1, newData, index, this.size() - index); + this.data = newData; + return removed; + } + + public int size() { + int size = 0; + for(Object obj : this.data){ + if(obj != null){ + size += 1; + } + } + + return size; + } + + public boolean contains(Object obj){ + for(int i = 0; i < this.size(); i++){ + if(obj == this.get(i)){ + return true; + } + } + + return false; + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + for(Object obj : data){ + if(obj != null){ + sb.append(obj.toString()).append(","); + }else { +// sb.append("null,"); + continue; + } + } + + return sb.toString(); + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayUtil.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayUtil.java new file mode 100644 index 0000000000..22bccaaf5b --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/ArrayUtil.java @@ -0,0 +1,245 @@ +package basic.dataStructure; + +/** + * @author : 温友朝 + * @date : 2017/4/5 + */ +public class ArrayUtil { + /** + * 给定一个整形数组a , 对该数组的值进行置换 + * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int length = origin.length; + int[] reversed = new int[length]; + for (int i = length - 1; i >= 0; i--) { + reversed[length - i - 1] = origin[i]; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray) { + int length = oldArray.length; + int[] arr = new int[length]; + int index = 0; + for (int i = 0; i < length; i++) { + if (oldArray[i] != 0) { + arr[index] = oldArray[i]; + index++; + } + } + //非0的数据个数 + int[] newArr = new int[index]; + System.arraycopy(arr, 0, newArr, 0, index); + return newArr; + } + + public static Object[] remove(Object[] oldArray, Object value){ + int length = oldArray.length; + Object[] arr = new Object[length]; + int index = 0; + for (int i = 0; i < length; i++) { + if (oldArray[i] != value) { + arr[index] = oldArray[i]; + index++; + } + } + Object[] newArr = new Object[index]; + System.arraycopy(arr, 0, newArr, 0, index); + return newArr; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2) { + int length1 = array1.length; + int length2 = array2.length; + int[] arr = new int[length1 + length2]; + + System.arraycopy(array1, 0, arr, 0, length1); + System.arraycopy(array2, 0, arr, length1, length2); + + //去重 + for(int i = 0; i < arr.length; i++){ + for(int j = 0; j < arr.length; j++){ + if(i != j && arr[i] == arr[j]){ + arr[j] = 0; + } + } + } + + + int[] data = removeZero(arr); + int length = data.length; + + //排序 + for (int i = 0; i < length; i++) { + for(int j = 0; j < length; j++){ + if(data[i] < data[j]){ + int tmp = data[i]; + data[i] = data[j]; + data[j] = tmp; + } + } + } + return data; + } + + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int[] arr = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, arr, 0, oldArray.length); + return arr; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) + * @param max + * @return + */ + public int[] fibonacci(int max) { + int[] empty = {}; + int[] arr2 = {1, 1}; + + switch (max){ + case 0 : return empty; + case 1 : return empty; + case 2 : return arr2; + default: { + int[] data = arr2; + int d = data[0] + data[1]; + while (d < max){ + int length = data.length; + d = data[length - 1] + data[length - 2]; + if(d > max){ + return data; + } + int[] temp = new int[data.length + 1]; + System.arraycopy(data, 0, temp, 0, length); + temp[length] = d; + + data = temp; + } + } + } + + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int[] data = new int[max]; + int index = 0; + for(int i = 1; i < max; i++){ + int divided = 0; + for(int j = i; j >= 1; j--){ + if(i % j == 0){ + divided++; + } + if(divided > 2){ + break; + }else if(j == 1 && divided == 2){ + data[index] = i; + index ++; + } + } + } + + int[] result = new int[index]; + System.arraycopy(data, 0, result, 0, index); + return result; + + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int[] perfd = new int[max]; + int perfIndex = 0; + for(int i = 1; i <= max; i++){ + int index = 0; + int[] data = new int[i]; + for(int j = i - 1; j >= 1; j--){ + if(i % j == 0){ + data[index] = j; + index ++; + } + + if(j == 1 && getSum(data) == i){ + perfd[perfIndex] = i; + perfIndex++; + } + } + } + + return removeZero(perfd); + } + + private int getSum(int[] arr){ + int sum = 0; + for(int i : arr){ + sum += i; + } + return sum; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator) { + StringBuffer sb = new StringBuffer(); + for(int i : array){ + sb.append(i).append(seperator); + } + return sb.substring(0, sb.length() - 1).toString(); + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java new file mode 100644 index 0000000000..5050ae3c95 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java @@ -0,0 +1,58 @@ +package basic.dataStructure; + +/** + * Created by macvi on 2017/4/4. + */ +public class BinaryTreeNode { + private int data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + private BinaryTreeNode(){} + + public BinaryTreeNode(int data){ + this.data = data; + this.left = null; + this.right = null; + } + + public void setData(int data){ + BinaryTreeNode node = new BinaryTreeNode(data); + if(compareTo(data)){ + if(this.left == null){ + this.left = node; + }else{ + this.left.setData(data); + } + }else{ + if(this.right == null){ + this.right = node; + }else{ + this.right.setData(data); + } + } + } + + public int getData(){ + return data; + } + + private boolean compareTo(int d) { + System.out.println("data=" + this.data + ", d=" + d); + return this.data > d; + } + + private StringBuffer dataStr = new StringBuffer(); + private int index = 0; +// public String toString(BinaryTreeNode node) { +// while (node.left != null || node.right != null){ +// dataStr.append(index + "层,数据=").append(node.data).append("|"); +// if(node.left != null){ +// dataStr.append(node.left.data) +// } +// index ++; +// } +// +// return dataStr.toString(); +// } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java new file mode 100644 index 0000000000..3ac85ad37b --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/LinkedList.java @@ -0,0 +1,341 @@ +package basic.dataStructure; + +/** + * Created by macvi on 2017/4/3. + */ +public class LinkedList implements List { + private Node head; + + public LinkedList() { + this.head = new Node(); + } + + public void add(Object o) { + if (this.head.data == null) { + this.head = new Node(o, null); + } else { + Node temp = this.head; + while (temp.next != null) { + temp = temp.next; + } + temp.next = new Node(o, null); + } + } + + public void add(int index, Object o) { + if (index > this.size() || index < 0) { + throw new IndexOutOfBoundsException(); + } + + if(index == 0){ + Node newNode = new Node(o, this.head); + this.head = newNode; + return; + } + + if(index == this.size()){ + this.add(o); + return; + } + + Node before = getNode(index - 1); + Node next = getNode(index); + Node newNode = new Node(o, next); + before.next = newNode; + + } + + private Node getNode(int index) { + int i = 0; + Node temp = this.head; + while (temp.data != null) { + if (index == i) { + return temp; + } + + if (temp.next != null) { + temp = temp.next; + } else break; + + i++; + } + + return null; + } + + public Object get(int index) { + if (index > this.size() || index < 0) { + throw new IndexOutOfBoundsException(); + } + + return this.getNode(index).data; + } + + public Object remove(int index) { + if(index > this.size() || index < 0){ + throw new IndexOutOfBoundsException(); + } + + Object removed = get(index); + + Node before = getNode(index - 1); + Node next = getNode(index + 1); + before.next = next; + + return removed; + } + + public int size() { + int size = 0; + Node temp = this.head; + while (temp.data != null) { + size++; + if (temp.next != null) { + temp = temp.next; + } else break; + } + + return size; + } + + public void asList(Object[] array){ + LinkedList list = new LinkedList(); + for(int i = 0; i < array.length; i++){ + list.add(array[i]); + } + + this.head = list.head; + } + + public Object[] toArray(LinkedList list){ + int size = list.size(); + Object[] arr = new Object[size]; + for(int i = 0; i < size; i++){ + arr[i] = list.get(i); + } + + return arr; + } + + public String toString() { + StringBuffer sb = new StringBuffer(); + Node temp = this.head; + while (temp.data != null) { + sb.append(temp.data.toString()).append(","); + if (temp.next != null) { + temp = temp.next; + } else break; + } + + return sb.toString(); + } + + private static class Node { + Object data; + Node next; + + public Node() {} + + public Node(Object obj, Node next) { + this.data = obj; + this.next = next; + } + + } + + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + int size = this.size(); + + if(size == 1){ + return; + } + + Object[] data = new Object[size]; + for(int i = 0; i < size; i++){ + data[i] = this.get(i); + } + + this.head = new Node(); + + for(int i = size - 1; i >= 0; i--){ + this.add(data[i]); + } + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + int size = this.size(); + int index = this.size()/2; + ArrayList al = new ArrayList(); + for(int i = index; i < size; i++){ + al.add(this.get(i)); + } + + this.head = new Node(); + + for(int i = 0; i < al.size(); i++){ + this.add(al.get(i)); + } + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + for(int j = i; j < i + length; j++){ + this.remove(i); + } + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + int size = list.size(); + int[] arr = new int[size]; + for(int i = 0; i < size; i++){ + int index = (Integer) list.get(i); + arr[i] = (Integer) this.get(index); + } + + return arr; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + Object[] arr1 = toArray(this); + Object[] arr2 = toArray(list); + for(int i = 0; i < arr2.length; i++){ + arr1 = ArrayUtil.remove(arr1, arr2[i]); + } + + asList(arr1); + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + int size = this.size(); + ArrayList indexList = new ArrayList(); + ArrayList valueList = new ArrayList(); + for(int i = 0; i < size; i ++){ + int valueI = (Integer)this.get(i); + int index = 0; + for(int j = i + 1; j < size; j++){ + if(valueList.contains(valueI)){ + continue; + } + int valueJ = (Integer) this.get(j); + if(valueJ == valueI){ + index++; + } + + if(index > 0){ + indexList.add(j); + valueList.add(valueJ); + } + } + } + + Object[] arr = new Object[size]; + for(int i = 0; i < size; i++){ + arr[i] = indexList.contains(i) ? false : this.get(i); + } + + ArrayUtil au = new ArrayUtil(); + arr = au.remove(arr, false); + + asList(arr); + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + int size = this.size(); + int[] range = new int[max - min]; + int index = 0; + for(int i = 0; i < size; i++){ + int value = (Integer) this.get(i); + if(value > min && value < max){ + range[index] = value; + index++; + } + } + + Object[] arr = new Object[size]; + for(int i = 0; i < size; i++){ + arr[i] = this.get(i); + } + + for(int i = 0; i < range.length; i++){ + arr = ArrayUtil.remove(arr, range[i]); + } + + asList(arr); + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + //组合成新的链表 + int listSize = list.size(); + for(int i = 0 ; i < listSize; i ++){ + this.add(list.get(i)); + } + + //转化成数组 + int size = this.size(); + int[] arr = new int[size]; + for(int i = 0; i < size; i++){ + arr[i] = (Integer)this.get(i); + } + //排序 + for(int i = 0; i < size - 1; i ++){ + for(int j = 0; j < size - i - 1; j ++){ + if(arr[j] >= arr[j + 1]){ + int temp = arr[j]; + arr[j] = arr[j + 1]; + arr[j + 1] = temp; + } + } + } + + //组装 + LinkedList li = new LinkedList(); + for(int i = 0; i < size; i ++){ + li.add(arr[i]); + } + return li; + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/List.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/List.java new file mode 100644 index 0000000000..dc2a62aab3 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/List.java @@ -0,0 +1,12 @@ +package basic.dataStructure; + +/** + * Created by macvi on 2017/4/2. + */ +public interface List { + void add(Object o); + void add(int index, Object o); + Object get(int index); + Object remove(int index); + int size(); +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java new file mode 100644 index 0000000000..36ca7e9647 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/Queue.java @@ -0,0 +1,72 @@ +package basic.dataStructure; + +/** + * Created by macvi on 2017/4/4. + */ +public class Queue { + private Object[] data; + + private int size = 10; + + private int extendedSize = 10; + + public Queue(){ + this.data = new Object[size]; + } + + public Queue(Object o){ + this.data = new Object[size]; + data[0] = o; + } + + public void enQueue(Object o){ + //被添加的位置 + int index = this.size(); + if(this.size() == this.size){ + this.size += extendedSize; + Object[] newData = new Object[this.size]; + System.arraycopy(this.data, 0, newData, 0, index); + newData[index] = o; + this.data = newData; + }else{ + this.data[index] = o; + } + } + + public Object deQueue(){ + Object[] newData = new Object[this.size]; + Object d = this.data[0]; + System.arraycopy(this.data, 1, newData, 0, this.size - 1); + this.data = newData; + + return d; + } + + public Object peek(){ + return this.data[0]; + } + + public boolean isEmpty(){ + return peek() == null; + } + + public int size(){ + int size = 0; + for(Object obj : this.data){ + size += obj == null ? 0 : 1; + } + + return size; + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + for(Object obj : this.data){ + if(obj != null){ + sb.append(obj.toString()).append(","); + }else break; + } + return sb.toString(); + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java new file mode 100644 index 0000000000..bea16033fa --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/Stack.java @@ -0,0 +1,41 @@ +package basic.dataStructure; + +/** + * Created by macvi on 2017/4/4. + */ +public class Stack { + + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + this.elementData.add(o); + } + + public Object pop(){ + int index = elementData.size() - 1; + Object obj = elementData.remove(index); + + return obj; + } + + public Object peek(){ + int index = elementData.size() - 1; + return elementData.get(index); + } + public boolean isEmpty(){ + return peek() == null; + } + public int size(){ + return elementData.size(); + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + for(int i = this.size() - 1; i >= 0; i--){ + sb.append(elementData.get(i).toString()).append(","); + } + + return sb.toString(); + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/liteStruts/LoginAction.java b/group24/75939388/learning2017/src/main/java/basic/liteStruts/LoginAction.java new file mode 100644 index 0000000000..14b8aba8e2 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/liteStruts/LoginAction.java @@ -0,0 +1,39 @@ +package basic.liteStruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/liteStruts/ReadXML.java b/group24/75939388/learning2017/src/main/java/basic/liteStruts/ReadXML.java new file mode 100644 index 0000000000..458b247e18 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/liteStruts/ReadXML.java @@ -0,0 +1,28 @@ +package basic.liteStruts; + +import org.dom4j.Document; +import org.dom4j.io.SAXReader; + +import java.io.File; + +/** + * @author : 温友朝 + * @date : 2017/4/10 + */ +public class ReadXML { + Document document; + + public ReadXML(String filePath) throws Exception{ + SAXReader reader = new SAXReader(); + document = reader.read(new File(ReadXML.class.getResource("/").getFile()) + filePath); + } + + public String getActionClass(String actionName){ + return document.selectSingleNode("//action[@name='" + actionName + "']").valueOf("@class"); + } + + public String getJspPage(String actionName, String result){ + return document.selectSingleNode("//action[@name='" + actionName + "']") + .selectSingleNode("//result[@name='" + result + "']").getText(); + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/liteStruts/Struts.java b/group24/75939388/learning2017/src/main/java/basic/liteStruts/Struts.java new file mode 100644 index 0000000000..3b28f2bf60 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/liteStruts/Struts.java @@ -0,0 +1,78 @@ +package basic.liteStruts; + +import java.lang.reflect.Method; +import java.util.Map; + + +public class Struts { + /** + * 0. 读取配置文件struts.xml + *

+ * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + * ("name"="test" , "password"="1234") , + * 那就应该调用 setName和setPassword方法 + *

+ * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + *

+ * 3. 通过反射找到对象的所有getter方法(例如 getMessage), + * 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + * 放到View对象的parameters + *

+ * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + * 放到View对象的jsp字段中。 + */ + public static View runAction(String actionName, Map parameters) { + try{ + //0. 读取配置文件struts.xml + ReadXML read = new ReadXML("/resources/struts.xml"); + //1. 找到对应的class + String className = read.getActionClass(actionName); + Class clz = Class.forName(className); + //得到对象 + Object la = clz.newInstance(); + setNameAndPassword(clz, la, parameters); + //2. 调用execute方法 + String result = invokeExecute(clz, la); + //3. 找到对象的所有getter方法 + getResultMap(clz, la, parameters); + //4. 确定使用哪一个jsp + String viewName = read.getJspPage(actionName, result); + View view = new View(); + view.setJsp(viewName); + view.setParameters(parameters); + return view; + }catch(Exception e){ + e.printStackTrace(); + return null; + } + } + + private static void setNameAndPassword(Class clz, Object la, Map parameters) throws Exception { + Method setName = clz.getDeclaredMethod("setName", String.class); + setName.invoke(la, parameters.get("name")); + + Method setPassword = clz.getDeclaredMethod("setPassword", String.class); + setPassword.invoke(la, parameters.get("password")); + } + + private static String invokeExecute(Class clz, Object la)throws Exception{ + Method execute = clz.getDeclaredMethod("execute", null); + Method getMessage = clz.getDeclaredMethod("getMessage", null); + execute.invoke(la, null); + return getMessage.invoke(la, null).toString(); + } + + private static void getResultMap(Class clz, Object la, Map parameters) throws Exception{ + Method[] methods = clz.getMethods(); + for(Method me : methods){ + if(me.getName().startsWith("get")){ + String info = me.invoke(la, null).toString(); + String method= me.getName(); + String key = method.substring(3, method.length()).toLowerCase(); + parameters.put(key, info); + }else continue; + } + + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/liteStruts/View.java b/group24/75939388/learning2017/src/main/java/basic/liteStruts/View.java new file mode 100644 index 0000000000..777380b8f9 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/liteStruts/View.java @@ -0,0 +1,23 @@ +package basic.liteStruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java b/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java new file mode 100644 index 0000000000..565983ab06 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/Demo.java @@ -0,0 +1,7 @@ +package miniJVM; + +/** + * Created by macvi on 2017/4/11. + */ +public class Demo { +} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/DownloadThread.java b/group24/75939388/learning2017/src/main/java/thread/download/DownloadThread.java new file mode 100644 index 0000000000..190cae6423 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/thread/download/DownloadThread.java @@ -0,0 +1,39 @@ +package thread.download; + + +import thread.download.api.Connection; + +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + String localFile = ""; + + CyclicBarrier barrier; + + public DownloadThread(Connection conn, int startPos, int endPos, String localFileName, CyclicBarrier barrier){ + this.localFile = localFileName; + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.barrier = barrier; + } + public void run(){ + try{ + RandomAccessFile file = new RandomAccessFile(localFile, "rw"); + byte[] buffer = this.conn.read(this.startPos, this.endPos); + file.seek(startPos); + file.write(buffer); + file.close(); + this.conn.close(); + barrier.await(); + }catch(Exception e){ + e.printStackTrace(); + } + } +} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/FileDownloader.java b/group24/75939388/learning2017/src/main/java/thread/download/FileDownloader.java new file mode 100644 index 0000000000..f50560b8be --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/thread/download/FileDownloader.java @@ -0,0 +1,106 @@ +package thread.download; + +import thread.download.api.Connection; +import thread.download.api.ConnectionManager; +import thread.download.api.DownloadListener; + +import java.io.File; +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +public class FileDownloader { + + String url; + String fileLocation; + DownloadListener listener; + ConnectionManager cm; + + RandomAccessFile file; + + int length; + + private static final int MAX_THREAD_NUM = 5; + + + public FileDownloader(String _url, String fileLocation) { + this.url = _url; + this.fileLocation = fileLocation; + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + + try { + CyclicBarrier barrier = new CyclicBarrier(MAX_THREAD_NUM, new Runnable() { + public void run() { + listener.notifyFinished(); + } + }); + + conn = cm.open(this.url); + this.length = conn.getContentLength(); + + file = getEmptyFile(); + + int divided = length/MAX_THREAD_NUM; + int[] pos = new int[MAX_THREAD_NUM + 1]; + for(int i = 0; i < MAX_THREAD_NUM; i++){ + pos[i] = i == 0 ? 0 : divided * i; + } + pos[MAX_THREAD_NUM] = length; + + for(int i = 0; i < MAX_THREAD_NUM; i++){ + new DownloadThread(conn, pos[i], pos[i + 1] - 1, this.fileLocation, barrier).start(); + } + + + File file2 = new File(fileLocation); + System.out.println("file.length=" + file2.length()); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + } + + public RandomAccessFile getEmptyFile(){ + try{ + RandomAccessFile file = new RandomAccessFile(this.fileLocation, "rw"); + byte[] empty = new byte[this.length]; + file.write(empty); + file.close(); + return file; + }catch(Exception e){ + e.printStackTrace(); + } + return null; + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/api/Connection.java b/group24/75939388/learning2017/src/main/java/thread/download/api/Connection.java new file mode 100644 index 0000000000..08a85b35dd --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/thread/download/api/Connection.java @@ -0,0 +1,23 @@ +package thread.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos, int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionException.java b/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionException.java new file mode 100644 index 0000000000..e8fac91d1e --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionException.java @@ -0,0 +1,8 @@ +package thread.download.api; + +public class ConnectionException extends Exception { + + public ConnectionException(String msg){ + super(msg); + } +} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionManager.java b/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionManager.java new file mode 100644 index 0000000000..f5f6c2ff70 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/thread/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package thread.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + Connection open(String url) throws ConnectionException; +} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/api/DownloadListener.java b/group24/75939388/learning2017/src/main/java/thread/download/api/DownloadListener.java new file mode 100644 index 0000000000..16393c4dd9 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/thread/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package thread.download.api; + +public interface DownloadListener { + void notifyFinished(); +} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionImpl.java b/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..2e2544ab27 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionImpl.java @@ -0,0 +1,93 @@ +package thread.download.impl; + +import thread.download.api.Connection; +import thread.download.api.ConnectionException; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.ConnectException; +import java.net.HttpURLConnection; +import java.net.URL; + +public class ConnectionImpl implements Connection { + + private int length = 0; + + private URL url; + + private HttpURLConnection conn; + + private InputStream is; + + private ByteArrayOutputStream baos; + + private ConnectionImpl() {} + + public ConnectionImpl(URL url) { + this.url = url; + try { + this.conn = (HttpURLConnection) url.openConnection(); + this.conn.setRequestMethod("GET"); + this.conn.setReadTimeout(5000); + int responseCode = this.conn.getResponseCode(); + System.out.println("连接状态=" + responseCode); + if (responseCode != 200) { + throw new ConnectionException("连接到" + url.toURI() + "失败"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public byte[] read(int startPos, int endPos) throws IOException { + try { + //设置读取段落 + this.conn = (HttpURLConnection) url.openConnection(); + this.conn.setRequestMethod("GET"); + this.conn.setReadTimeout(5000); + this.conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + //获取返回值 + int response = conn.getResponseCode(); + if(response != 200 && response != 206){ + throw new ConnectException("没有连接上" + url.toURI() + ", 状态码为" + response); + } + //开始读取 + int length = endPos - startPos + 1; + this.is = conn.getInputStream(); + byte[] buffer = new byte[1024]; + baos = new ByteArrayOutputStream(length); + while(-1 != is.read(buffer)){ + baos.write(buffer); + } + System.out.println(startPos + "-" + endPos + "文件段读取完成"); + return baos.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + this.close(); + } + } + + public int getContentLength() { + try { + this.length = this.conn.getContentLength(); + System.out.println("获取的文件长度=" + length); + return this.length; + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + + public void close() { + try { + if(is != null){ + is.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionManagerImpl.java b/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..ede8ccac00 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/thread/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,20 @@ +package thread.download.impl; + +import thread.download.api.Connection; +import thread.download.api.ConnectionException; +import thread.download.api.ConnectionManager; + +import java.net.URL; + +public class ConnectionManagerImpl implements ConnectionManager { + + public Connection open(String url) throws ConnectionException { + Connection conn = null; + try{ + conn = new ConnectionImpl(new URL(url)); + }catch(Exception e){ + e.printStackTrace(); + } + return conn; + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java new file mode 100644 index 0000000000..ee8ee6b0d0 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java @@ -0,0 +1,69 @@ +package data_structure; + +import org.junit.Test; +import basic.dataStructure.ArrayList; + +/** + * Created by macvi on 2017/4/2. + */ +public class ArrayListTest { + + @Test + public void TestAdd(){ + ArrayList al = new ArrayList(); + for(int i = 0; i < 32; i++){ + al.add(i + ""); + } + + System.out.println("ArrayList.content-->" + al.toString()); + } + + + @Test + public void testIndexAdd(){ + ArrayList al = new ArrayList(); + for(int i = 0; i < 17; i ++){ + al.add(i + ""); + } + + al.add(3, "xxoo"); + al.add(11, "abcd"); + al.add(0, "efgh"); + al.add(al.size(), "ijkl"); + + System.out.println("al.toString-->" + al.toString()); + System.out.println("size-->" + al.size()); + } + + @Test + public void testGet(){ + ArrayList al = new ArrayList(); + for(int i = 0; i < 18; i ++){ + al.add(i + "zxcd"); + } + + System.out.println("get-->" + al.get(13)); + } + + @Test + public void testRemove(){ + ArrayList al = new ArrayList(); + for(int i = 0; i < 18; i ++){ + al.add(i + ""); + } + System.out.println("size1-->" + al.size()); + System.out.println("al.toString1-->" + al.toString()); + String re = (String)al.remove(12); + System.out.println("remove index=12 :"); + System.out.println("re-->" + re); + System.out.println("size2-->" + al.size()); + System.out.println("al.toString2-->" + al.toString()); + + String re1 = (String)al.remove(1); + System.out.println("remove index=1 :"); + System.out.println("re-->" + re1); + System.out.println("size2-->" + al.size()); + System.out.println("al.toString2-->" + al.toString()); + } + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java b/group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java new file mode 100644 index 0000000000..1dc1a6f263 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java @@ -0,0 +1,67 @@ +package data_structure; + +import org.junit.Test; +import basic.dataStructure.ArrayUtil; + +import java.util.Arrays; + +/** + * @author : 温友朝 + * @date : 2017/4/5 + */ +public class ArrayUtilTest { + ArrayUtil au = new ArrayUtil(); + + @Test + public void testReverse(){ + int[] arr = {1, 2, 3, 4, 5}; + this.au.reverseArray(arr); + } + + @Test + public void testTrim(){ + int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] arr = this.au.removeZero(oldArr); + System.out.println(Arrays.toString(arr)); + } + + @Test + public void testMerge(){ + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + + int[] arr = this.au.merge(a1, a2); + System.out.println(Arrays.toString(arr)); + } + + @Test + public void testGrow(){ + int[] arr = {1, 2, 3, 4, 5}; + int[] arr2 = this.au.grow(arr, 4); + System.out.println(Arrays.toString(arr2)); + } + + @Test + public void testFibonacci(){ + int[] arr = this.au.fibonacci(100); + System.out.println(Arrays.toString(arr)); + } + + @Test + public void testPrimes(){ + int[] arr = this.au.getPrimes(100000); + System.out.println(Arrays.toString(arr)); + } + + @Test + public void testPerfectNumbers(){ + int[] arr = this.au.getPerfectNumbers(10000); + System.out.println(Arrays.toString(arr)); + } + + @Test + public void testJoin(){ + int[] arr = this.au.getPerfectNumbers(10000); + System.out.println(this.au.join(arr, "-")); + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java new file mode 100644 index 0000000000..df976147e3 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java @@ -0,0 +1,29 @@ +package data_structure; + +import org.junit.Test; +import basic.dataStructure.BinaryTreeNode; + +/** + * @author : 温友朝 + * @date : 2017/4/5 + */ +public class BinaryNodeTreeTest { + +// @Test +// public BinaryTreeNode getTree(){ +// BinaryTreeNode btn = new BinaryTreeNode(5); +// btn.setData(3); +// +// return btn; +// } + + @Test + public void testAdd(){ + BinaryTreeNode btn = new BinaryTreeNode(5); + btn.setData(3); + btn.setData(7); + btn.setData(10); + btn.setData(6); + btn.setData(4); + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java new file mode 100644 index 0000000000..c98a305623 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java @@ -0,0 +1,151 @@ +package data_structure; + +import basic.dataStructure.LinkedList; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + +/** + * Created by macvi on 2017/4/3. + */ +public class LinkedListTest { + + LinkedList ll = new LinkedList(); + + @Before + public void init(){ + for(int i = 0; i < 10; i++){ + ll.add(i); + } + } + + @After + public void print(){ + + } + + + @Test + public void testLinkedListAdd(){ + LinkedList ll = new LinkedList(); + ll.add("123"); + ll.add("456"); + ll.add("asdf"); + ll.add("zxcv"); + + + System.out.println("ll.toString-->" + ll); + System.out.println("ll.size--->" + ll.size()); + } + + @Test + public void testLinkedListIndexAdd(){ + System.out.println("12345"); + } + + @Test + public void testGet(){ + LinkedList ll = new LinkedList(); + for(int i = 0; i < 10; i ++){ + ll.add(i + ""); + } + + System.out.println("get-->" + ll.get(9)); + System.out.println("ll.toString-->" + ll.toString() + "\nsize-->" + ll.size()); + } + + @Test + public void testIndexAdd(){ + LinkedList ll = new LinkedList(); + for(int i = 0; i < 5; i ++){ + ll.add(i + ""); + } + + ll.add(5, "xxoo"); + System.out.println("index get-->" + ll.get(0)); + System.out.println("ll.toString2-->" + ll.toString() + "\nsize-->" + ll.size()); + } + + @Test + public void testRemove(){ + LinkedList ll = new LinkedList(); + for(int i = 0; i < 6; i ++){ + ll.add(i + ""); + } + + Object removed = ll.remove(-1); + System.out.println("ll.toString-->" + ll.toString() + "\nsize-->" + ll.size()); + System.out.println("removed-->" + removed.toString()); + } + + @Test + public void testReverse(){ + ll.reverse(); + System.out.println("ll.reverse-->" + ll.toString()); + } + + @Test + public void testRemoveFirstHalf(){ + ll.removeFirstHalf(); + System.out.println("ll.removeFirstHalf-->" + ll.toString()); + } + + @Test + public void testRemoveL(){ + ll.remove(2, 5); + System.out.println("ll.toString-->" + ll.toString()); + } + + @Test + public void testGetElements(){ + LinkedList l2 = new LinkedList(); + l2.add(3); + l2.add(5); + l2.add(9); + l2.add(0); + + int[] arr = ll.getElements(l2); + System.out.println("arr->" + Arrays.toString(arr)); + } + + @Test + public void testRemoveDuplicate(){ + ll.add(1); + ll.add(3); + ll.add(4); + ll.add(10); + ll.add(11); + ll.removeDuplicateValues(); + System.out.println("ll.toString-->" + ll.toString()); + } + + @Test + public void testRemoveRange(){ + ll.removeRange(2, 6); + System.out.println("ll.toString-->" + ll.toString()); + } + + @Test + public void testSubtract(){ + LinkedList list = new LinkedList(); + list.add(1); + list.add(2); + list.add(5); + + ll.subtract(list); + System.out.println("ll.toString-->" + ll); + } + + @Test + public void testIntersection(){ + LinkedList list = new LinkedList(); + list.add(1); + list.add(2); + list.add(5); + + LinkedList list2 = ll.intersection(list); + System.out.println(list2); + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java b/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java new file mode 100644 index 0000000000..3db6d82e49 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java @@ -0,0 +1,50 @@ +package data_structure; + +import org.junit.Assert; +import org.junit.Test; +import basic.dataStructure.Queue; + +/** + * Created by macvi on 2017/4/4. + */ +public class QueueTest { + + private Queue newQueue(){ + Queue q = new Queue(); + for(int i = 0; i < 13; i++){ + q.enQueue(i + ""); + } + + return q; + } + + @Test + public void testEnqueue(){ + Queue q = newQueue(); + q.enQueue(10 + ""); + q.enQueue( "xxoo"); + System.out.println("queue-->" + q.toString()); + } + + @Test + public void testSize(){ + Queue q = newQueue(); + + Assert.assertEquals(13, q.size()); + } + + @Test + public void testDequeue(){ + Queue q = newQueue(); + Object obj = q.deQueue(); + + Assert.assertEquals("0", obj); + } + + @Test + public void testIsEmpty(){ + Queue q = newQueue(); + + Assert.assertEquals(false, q.isEmpty()); + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java b/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java new file mode 100644 index 0000000000..b933b8b63e --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java @@ -0,0 +1,49 @@ +package data_structure; + +import org.junit.Assert; +import org.junit.Test; +import basic.dataStructure.Stack; + +/** + * Created by macvi on 2017/4/4. + */ +public class StackTest { + + private Stack getStack(){ + Stack s = new Stack(); + for(int i = 0; i < 14; i ++){ + s.push(i + ""); + } + + return s; + } + + @Test + public void pushTest(){ + Stack s = getStack(); + + System.out.println("stack-->" + s.toString()); + } + + @Test + public void testSize(){ + Stack s = getStack(); + + Assert.assertEquals(14, s.size()); + } + + @Test + public void testPeek(){ + Stack s = getStack(); + + Assert.assertEquals("13", s.peek()); + } + + @Test + public void testPop(){ + Stack s = getStack(); + + Assert.assertEquals("13", s.pop()); + Assert.assertEquals(13, s.size()); + } +} diff --git a/group24/75939388/learning2017/src/test/java/download/FileDownloaderTest.java b/group24/75939388/learning2017/src/test/java/download/FileDownloaderTest.java new file mode 100644 index 0000000000..0dc8536269 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/download/FileDownloaderTest.java @@ -0,0 +1,54 @@ +package download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import thread.download.FileDownloader; +import thread.download.api.ConnectionManager; +import thread.download.api.DownloadListener; +import thread.download.impl.ConnectionManagerImpl; + + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "https://www.baidu.com/img/bd_logo1.png"; + String fileLocation = "D:\\Tee\\JavaLearnin\\test.png"; + FileDownloader downloader = new FileDownloader(url, fileLocation); + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + public void notifyFinished() { + downloadFinished = true; + } + + }); + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + } + +} diff --git a/group24/75939388/learning2017/src/test/java/liteStruts/StrutsTest.java b/group24/75939388/learning2017/src/test/java/liteStruts/StrutsTest.java new file mode 100644 index 0000000000..4477c5f51b --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/liteStruts/StrutsTest.java @@ -0,0 +1,42 @@ +package liteStruts; + +import org.junit.Assert; +import org.junit.Test; +import basic.liteStruts.Struts; +import basic.liteStruts.View; + +import java.util.HashMap; +import java.util.Map; + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group24/Homework/1-FirstWeek/ArrayList.java b/group24/Homework/1-FirstWeek/ArrayList.java new file mode 100644 index 0000000000..4576c016af --- /dev/null +++ b/group24/Homework/1-FirstWeek/ArrayList.java @@ -0,0 +1,35 @@ +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group24/Homework/1-FirstWeek/BinaryTreeNode.java b/group24/Homework/1-FirstWeek/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group24/Homework/1-FirstWeek/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group24/Homework/1-FirstWeek/Iterator.java b/group24/Homework/1-FirstWeek/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group24/Homework/1-FirstWeek/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group24/Homework/1-FirstWeek/LinkedList.java b/group24/Homework/1-FirstWeek/LinkedList.java new file mode 100644 index 0000000000..f4c7556a2e --- /dev/null +++ b/group24/Homework/1-FirstWeek/LinkedList.java @@ -0,0 +1,125 @@ +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/List.java b/group24/Homework/1-FirstWeek/List.java similarity index 95% rename from group27/513274874/data-structure/src/com/coding/basic/List.java rename to group24/Homework/1-FirstWeek/List.java index 396b1f6416..10d13b5832 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/List.java +++ b/group24/Homework/1-FirstWeek/List.java @@ -1,9 +1,9 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group24/Homework/1-FirstWeek/Queue.java b/group24/Homework/1-FirstWeek/Queue.java new file mode 100644 index 0000000000..c4c4b7325e --- /dev/null +++ b/group24/Homework/1-FirstWeek/Queue.java @@ -0,0 +1,61 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group24/Homework/1-FirstWeek/Stack.java b/group24/Homework/1-FirstWeek/Stack.java new file mode 100644 index 0000000000..fedb243604 --- /dev/null +++ b/group24/Homework/1-FirstWeek/Stack.java @@ -0,0 +1,24 @@ +package com.coding.basic.stack; + +import com.coding.basic.array.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group24/Homework/2-SecondWeek/litestruts/LoginAction.java b/group24/Homework/2-SecondWeek/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group24/Homework/2-SecondWeek/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group24/Homework/2-SecondWeek/litestruts/Struts.java b/group24/Homework/2-SecondWeek/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group24/Homework/2-SecondWeek/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.coderising.litestruts; + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group24/Homework/2-SecondWeek/litestruts/StrutsTest.java b/group24/Homework/2-SecondWeek/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group24/Homework/2-SecondWeek/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group24/Homework/2-SecondWeek/litestruts/View.java b/group24/Homework/2-SecondWeek/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group24/Homework/2-SecondWeek/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group24/Homework/3-ThirdWeek/LinkedList.java b/group24/Homework/3-ThirdWeek/LinkedList.java new file mode 100644 index 0000000000..f4c7556a2e --- /dev/null +++ b/group24/Homework/3-ThirdWeek/LinkedList.java @@ -0,0 +1,125 @@ +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group24/Homework/3-ThirdWeek/download/DownloadThread.java b/group24/Homework/3-ThirdWeek/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} diff --git a/group24/Homework/3-ThirdWeek/download/FileDownloader.java b/group24/Homework/3-ThirdWeek/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/FileDownloader.java @@ -0,0 +1,73 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group24/Homework/3-ThirdWeek/download/FileDownloaderTest.java b/group24/Homework/3-ThirdWeek/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group24/Homework/3-ThirdWeek/download/api/Connection.java b/group24/Homework/3-ThirdWeek/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group24/Homework/3-ThirdWeek/download/api/ConnectionException.java b/group24/Homework/3-ThirdWeek/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group24/Homework/3-ThirdWeek/download/api/ConnectionManager.java b/group24/Homework/3-ThirdWeek/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group24/Homework/3-ThirdWeek/download/api/DownloadListener.java b/group24/Homework/3-ThirdWeek/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group24/Homework/3-ThirdWeek/download/impl/ConnectionImpl.java b/group24/Homework/3-ThirdWeek/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.coderising.download.impl; + +import java.io.IOException; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/group24/Homework/3-ThirdWeek/download/impl/ConnectionManagerImpl.java b/group24/Homework/3-ThirdWeek/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/group24/Homework/3-ThirdWeek/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coderising.download.impl; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} diff --git a/group24/Homework/4-FourWeek/LRUPageFrame.java b/group24/Homework/4-FourWeek/LRUPageFrame.java new file mode 100644 index 0000000000..994a241a3d --- /dev/null +++ b/group24/Homework/4-FourWeek/LRUPageFrame.java @@ -0,0 +1,57 @@ +package com.coding.basic.linklist; + + +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) { + + + } + + + 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/group24/Homework/4-FourWeek/LRUPageFrameTest.java b/group24/Homework/4-FourWeek/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group24/Homework/4-FourWeek/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group24/Homework/4-FourWeek/jvm/loader/ClassFileLoader .java b/group24/Homework/4-FourWeek/jvm/loader/ClassFileLoader .java new file mode 100644 index 0000000000..55b4b70974 --- /dev/null +++ b/group24/Homework/4-FourWeek/jvm/loader/ClassFileLoader .java @@ -0,0 +1,25 @@ +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + + return null; + } + + + public void addClassPath(String path) { + + } + + + + public String getClassPath(){ + + } + + + + + +} \ No newline at end of file diff --git a/group24/Homework/4-FourWeek/jvm/test/ClassFileloaderTest.java b/group24/Homework/4-FourWeek/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..77f1b93eb8 --- /dev/null +++ b/group24/Homework/4-FourWeek/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.loader.ClassFileLoader; + + + + + +public class ClassFileloaderTest { + + + static String path1 = "C:\\workspace\\min-jvm\\bin"; + static String path2 = "C:\temp"; + + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + int i=byteCodes.length; + // ע⣺ֽܺJVM汾йϵ Կõൽж + Assert.assertEquals(2048, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i 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/group24/Homework/5-FifthWeek/StackUtilTest.java b/group24/Homework/5-FifthWeek/StackUtilTest.java new file mode 100644 index 0000000000..76f2cb7668 --- /dev/null +++ b/group24/Homework/5-FifthWeek/StackUtilTest.java @@ -0,0 +1,65 @@ +package com.coding.basic.stack; + +import java.util.Stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group24/Homework/5-FifthWeek/jvm/clz/AccessFlag.java b/group24/Homework/5-FifthWeek/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..2d93c5cebf --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/clz/AccessFlag.java @@ -0,0 +1,23 @@ +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/group24/Homework/5-FifthWeek/jvm/clz/ClassFile .java b/group24/Homework/5-FifthWeek/jvm/clz/ClassFile .java new file mode 100644 index 0000000000..0406ec7b46 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/clz/ClassFile .java @@ -0,0 +1,58 @@ +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(); + } \ No newline at end of file diff --git a/group24/Homework/5-FifthWeek/jvm/clz/ClassIndex.java b/group24/Homework/5-FifthWeek/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..f1505a5050 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/clz/ClassIndex.java @@ -0,0 +1,17 @@ +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/group24/Homework/5-FifthWeek/jvm/constant/ClassInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..c8e65ff493 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/ConstantInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..88353df2d3 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/ConstantPool.java b/group24/Homework/5-FifthWeek/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..7130eb3a9f --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/FieldRefInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ae71396ef --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/MethodRefInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..036e6d9055 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/NameAndTypeInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..5cbbba6033 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/NullConstantInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..41e0fd7e7a --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/StringInfo.java b/group24/Homework/5-FifthWeek/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..6bfcb47273 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group24/Homework/5-FifthWeek/jvm/constant/UTF8Info.java b/group24/Homework/5-FifthWeek/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..7db88a939e --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group24/Homework/5-FifthWeek/jvm/loader/ByteCodeIterator.java b/group24/Homework/5-FifthWeek/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..b3a25fa8c8 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,18 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + private byte[] codes; + private int pos; + + public ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + + + + +} diff --git a/group24/Homework/5-FifthWeek/jvm/loader/ClassFileLoader.java b/group24/Homework/5-FifthWeek/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..3b8ddb6a17 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/loader/ClassFileLoader.java @@ -0,0 +1,62 @@ +package com.coderising.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.coderising.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; + + + + } + + 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) { + + return null; + } + +} \ No newline at end of file diff --git a/group24/Homework/5-FifthWeek/jvm/loader/ClassFileParser.java b/group24/Homework/5-FifthWeek/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..a29d9572cd --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/loader/ClassFileParser.java @@ -0,0 +1,62 @@ +package com.coderising.jvm.loader; + +import java.io.UnsupportedEncodingException; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + + + + + return null; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + return null; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + + return null; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + return null; + } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { + + + } + + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + + + + } + +} diff --git a/group24/Homework/5-FifthWeek/jvm/test/ClassFileloaderTest.java b/group24/Homework/5-FifthWeek/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..657bf296f6 --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,208 @@ +package com.coderising.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + + + + + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; + + static String path1 = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + 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()); + } + +} \ No newline at end of file diff --git a/group24/Homework/5-FifthWeek/jvm/test/EmployeeV1.java b/group24/Homework/5-FifthWeek/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group24/Homework/5-FifthWeek/jvm/util/Util.java b/group24/Homework/5-FifthWeek/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group24/Homework/5-FifthWeek/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group24/Homework/6-SixWeek/jvm/attr/LocalVariableItem.java b/group24/Homework/6-SixWeek/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group24/Homework/6-SixWeek/jvm/attr/LocalVariableTable.java b/group24/Homework/6-SixWeek/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..14db5dca46 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/attr/LocalVariableTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group24/Homework/6-SixWeek/jvm/attr/StackMapTable.java b/group24/Homework/6-SixWeek/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group24/Homework/6-SixWeek/jvm/clz/AccessFlag.java b/group24/Homework/6-SixWeek/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group24/Homework/6-SixWeek/jvm/clz/ClassFile.java b/group24/Homework/6-SixWeek/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..2a8dfb6123 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/clz/ClassFile.java @@ -0,0 +1,102 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group24/Homework/6-SixWeek/jvm/clz/ClassIndex.java b/group24/Homework/6-SixWeek/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group24/Homework/6-SixWeek/jvm/constant/ClassInfo.java b/group24/Homework/6-SixWeek/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..c8e65ff493 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group24/Homework/6-SixWeek/jvm/constant/ConstantInfo.java b/group24/Homework/6-SixWeek/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..88353df2d3 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group24/Homework/6-SixWeek/jvm/constant/ConstantPool.java b/group24/Homework/6-SixWeek/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..7130eb3a9f --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group24/Homework/6-SixWeek/jvm/constant/FieldRefInfo.java b/group24/Homework/6-SixWeek/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ae71396ef --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group24/Homework/6-SixWeek/jvm/constant/MethodRefInfo.java b/group24/Homework/6-SixWeek/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..036e6d9055 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group24/Homework/6-SixWeek/jvm/constant/NameAndTypeInfo.java b/group24/Homework/6-SixWeek/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..5cbbba6033 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group24/Homework/6-SixWeek/jvm/constant/NullConstantInfo.java b/group24/Homework/6-SixWeek/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..41e0fd7e7a --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group24/Homework/6-SixWeek/jvm/constant/StringInfo.java b/group24/Homework/6-SixWeek/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..6bfcb47273 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group24/Homework/6-SixWeek/jvm/constant/UTF8Info.java b/group24/Homework/6-SixWeek/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..7db88a939e --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group24/Homework/6-SixWeek/jvm/field/Field.java b/group24/Homework/6-SixWeek/jvm/field/Field.java new file mode 100644 index 0000000000..c6eb0196f8 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group24/Homework/6-SixWeek/jvm/loader/ByteCodeIterator.java b/group24/Homework/6-SixWeek/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..6fb5570dff --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group24/Homework/6-SixWeek/jvm/loader/ClassFileLoader.java b/group24/Homework/6-SixWeek/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..33185d8175 --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + + +} diff --git a/group24/Homework/6-SixWeek/jvm/test/EmployeeV1.java b/group24/Homework/6-SixWeek/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group24/Homework/6-SixWeek/jvm/util/Util.java b/group24/Homework/6-SixWeek/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group24/Homework/6-SixWeek/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 convert(String expr) { + + return null; + } + + + +} diff --git a/group24/Homework/7-SevenWeek/PostfixExpr.java b/group24/Homework/7-SevenWeek/PostfixExpr.java new file mode 100644 index 0000000000..dcbb18be4b --- /dev/null +++ b/group24/Homework/7-SevenWeek/PostfixExpr.java @@ -0,0 +1,18 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group24/Homework/7-SevenWeek/PostfixExprTest.java b/group24/Homework/7-SevenWeek/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/group24/Homework/7-SevenWeek/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/Homework/7-SevenWeek/README.txt b/group24/Homework/7-SevenWeek/README.txt new file mode 100644 index 0000000000..6adfb7dc34 --- /dev/null +++ b/group24/Homework/7-SevenWeek/README.txt @@ -0,0 +1,4 @@ +1. ָֽתΪjava Ҫʵֵࣺ CommandParser.java +2. ʵƵjavap ҪʵֵࣺClassFilePrinter.java +3. ݽṹ ʵǰ׺ʽPrefixExpr.java ׺ʽ PostfixExpr.java +׺ʽת׺ʽ InfixToPostfix.java \ No newline at end of file diff --git a/group24/Homework/7-SevenWeek/jvm/attr/AttributeInfo.java b/group24/Homework/7-SevenWeek/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/attr/CodeAttr.java b/group24/Homework/7-SevenWeek/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..c4c0c4c6c5 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/attr/CodeAttr.java @@ -0,0 +1,70 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableItem.java b/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableTable.java b/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..14db5dca46 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/attr/LocalVariableTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/attr/StackMapTable.java b/group24/Homework/7-SevenWeek/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/clz/AccessFlag.java b/group24/Homework/7-SevenWeek/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group24/Homework/7-SevenWeek/jvm/clz/ClassFile.java b/group24/Homework/7-SevenWeek/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..2a8dfb6123 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/clz/ClassFile.java @@ -0,0 +1,102 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/clz/ClassIndex.java b/group24/Homework/7-SevenWeek/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group24/Homework/7-SevenWeek/jvm/cmd/BiPushCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/ByteCodeCommand.java b/group24/Homework/7-SevenWeek/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/CommandParser.java b/group24/Homework/7-SevenWeek/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..2bb36340f5 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/GetFieldCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/GetStaticFieldCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/LdcCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/NewObjectCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/NoOperandCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/OneOperandCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/PutFieldCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/cmd/TwoOperandCmd.java b/group24/Homework/7-SevenWeek/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/ClassInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..c8e65ff493 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/ConstantInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..88353df2d3 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/ConstantPool.java b/group24/Homework/7-SevenWeek/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..7130eb3a9f --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/FieldRefInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ae71396ef --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/MethodRefInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..036e6d9055 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/NameAndTypeInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..5cbbba6033 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/NullConstantInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..41e0fd7e7a --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/StringInfo.java b/group24/Homework/7-SevenWeek/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..6bfcb47273 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group24/Homework/7-SevenWeek/jvm/constant/UTF8Info.java b/group24/Homework/7-SevenWeek/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..7db88a939e --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group24/Homework/7-SevenWeek/jvm/field/Field.java b/group24/Homework/7-SevenWeek/jvm/field/Field.java new file mode 100644 index 0000000000..c6eb0196f8 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group24/Homework/7-SevenWeek/jvm/loader/ByteCodeIterator.java b/group24/Homework/7-SevenWeek/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..6fb5570dff --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group24/Homework/7-SevenWeek/jvm/loader/ClassFileLoader.java b/group24/Homework/7-SevenWeek/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..33185d8175 --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group24/Homework/7-SevenWeek/jvm/test/EmployeeV1.java b/group24/Homework/7-SevenWeek/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group24/Homework/7-SevenWeek/jvm/util/Util.java b/group24/Homework/7-SevenWeek/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group24/Homework/7-SevenWeek/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java b/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group24/Homework/8-EighthWeek/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java b/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java new file mode 100644 index 0000000000..14db5dca46 --- /dev/null +++ b/group24/Homework/8-EighthWeek/attr/LocalVariableTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group24/Homework/8-EighthWeek/attr/StackMapTable.java b/group24/Homework/8-EighthWeek/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group24/Homework/8-EighthWeek/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group24/Homework/8-EighthWeek/clz/AccessFlag.java b/group24/Homework/8-EighthWeek/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group24/Homework/8-EighthWeek/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group24/Homework/8-EighthWeek/clz/ClassFile.java b/group24/Homework/8-EighthWeek/clz/ClassFile.java new file mode 100644 index 0000000000..2a8dfb6123 --- /dev/null +++ b/group24/Homework/8-EighthWeek/clz/ClassFile.java @@ -0,0 +1,102 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group24/Homework/8-EighthWeek/clz/ClassIndex.java b/group24/Homework/8-EighthWeek/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group24/Homework/8-EighthWeek/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java b/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java new file mode 100644 index 0000000000..1f60641d2d --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/BiPushCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java b/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..e48d4e38f7 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/ByteCodeCommand.java @@ -0,0 +1,130 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group24/Homework/8-EighthWeek/cmd/CommandParser.java b/group24/Homework/8-EighthWeek/cmd/CommandParser.java new file mode 100644 index 0000000000..2bb36340f5 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..c771d535f7 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/GetFieldCmd.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6876c36bb --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/GetStaticFieldCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java b/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..8d60e72341 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/InvokeSpecialCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java b/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..a1f2d1a1c6 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/InvokeVirtualCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + + + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/LdcCmd.java b/group24/Homework/8-EighthWeek/cmd/LdcCmd.java new file mode 100644 index 0000000000..1669aa3900 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/LdcCmd.java @@ -0,0 +1,37 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java b/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..caa2609928 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/NewObjectCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..c3cda9b52e --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/NoOperandCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java b/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..dc31cf084d --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/PutFieldCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java b/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group24/Homework/8-EighthWeek/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group24/Homework/8-EighthWeek/constant/ClassInfo.java b/group24/Homework/8-EighthWeek/constant/ClassInfo.java new file mode 100644 index 0000000000..c8e65ff493 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group24/Homework/8-EighthWeek/constant/ConstantInfo.java b/group24/Homework/8-EighthWeek/constant/ConstantInfo.java new file mode 100644 index 0000000000..88353df2d3 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group24/Homework/8-EighthWeek/constant/ConstantPool.java b/group24/Homework/8-EighthWeek/constant/ConstantPool.java new file mode 100644 index 0000000000..7130eb3a9f --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java b/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ae71396ef --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java b/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java new file mode 100644 index 0000000000..036e6d9055 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java b/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..5cbbba6033 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java b/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java new file mode 100644 index 0000000000..41e0fd7e7a --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group24/Homework/8-EighthWeek/constant/StringInfo.java b/group24/Homework/8-EighthWeek/constant/StringInfo.java new file mode 100644 index 0000000000..6bfcb47273 --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group24/Homework/8-EighthWeek/constant/UTF8Info.java b/group24/Homework/8-EighthWeek/constant/UTF8Info.java new file mode 100644 index 0000000000..7db88a939e --- /dev/null +++ b/group24/Homework/8-EighthWeek/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group24/Homework/8-EighthWeek/engine/ExecutionResult.java b/group24/Homework/8-EighthWeek/engine/ExecutionResult.java new file mode 100644 index 0000000000..8f6c51e52a --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java b/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java new file mode 100644 index 0000000000..5d6b582879 --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/ExecutorEngine.java @@ -0,0 +1,35 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group24/Homework/8-EighthWeek/engine/Heap.java b/group24/Homework/8-EighthWeek/engine/Heap.java new file mode 100644 index 0000000000..82ad210cef --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/Homework/8-EighthWeek/engine/JavaObject.java b/group24/Homework/8-EighthWeek/engine/JavaObject.java new file mode 100644 index 0000000000..71ba382d9a --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/Homework/8-EighthWeek/engine/MethodArea.java b/group24/Homework/8-EighthWeek/engine/MethodArea.java new file mode 100644 index 0000000000..781e81acf1 --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/MethodArea.java @@ -0,0 +1,68 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group24/Homework/8-EighthWeek/engine/MiniJVM.java b/group24/Homework/8-EighthWeek/engine/MiniJVM.java new file mode 100644 index 0000000000..443524cc5f --- /dev/null +++ b/group24/Homework/8-EighthWeek/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group24/Homework/8-EighthWeek/field/Field.java b/group24/Homework/8-EighthWeek/field/Field.java new file mode 100644 index 0000000000..c6eb0196f8 --- /dev/null +++ b/group24/Homework/8-EighthWeek/field/Field.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java b/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..6fb5570dff --- /dev/null +++ b/group24/Homework/8-EighthWeek/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java b/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java new file mode 100644 index 0000000000..33185d8175 --- /dev/null +++ b/group24/Homework/8-EighthWeek/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group24/Homework/8-EighthWeek/test/EmployeeV1.java b/group24/Homework/8-EighthWeek/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group24/Homework/8-EighthWeek/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group24/Homework/8-EighthWeek/util/Util.java b/group24/Homework/8-EighthWeek/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group24/Homework/8-EighthWeek/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 - + + diff --git a/group27/383117348/src/com/coderising/download/DownloadThread.java b/group27/383117348/data-structure/com/coderising/download/DownloadThread.java similarity index 100% rename from group27/383117348/src/com/coderising/download/DownloadThread.java rename to group27/383117348/data-structure/com/coderising/download/DownloadThread.java diff --git a/group27/383117348/src/com/coderising/download/FileDownloader.java b/group27/383117348/data-structure/com/coderising/download/FileDownloader.java similarity index 100% rename from group27/383117348/src/com/coderising/download/FileDownloader.java rename to group27/383117348/data-structure/com/coderising/download/FileDownloader.java diff --git a/group27/383117348/src/com/coderising/download/FileDownloaderTest.java b/group27/383117348/data-structure/com/coderising/download/FileDownloaderTest.java similarity index 100% rename from group27/383117348/src/com/coderising/download/FileDownloaderTest.java rename to group27/383117348/data-structure/com/coderising/download/FileDownloaderTest.java diff --git a/group27/383117348/src/com/coderising/download/api/Connection.java b/group27/383117348/data-structure/com/coderising/download/api/Connection.java similarity index 100% rename from group27/383117348/src/com/coderising/download/api/Connection.java rename to group27/383117348/data-structure/com/coderising/download/api/Connection.java diff --git a/group27/383117348/src/com/coderising/download/api/ConnectionException.java b/group27/383117348/data-structure/com/coderising/download/api/ConnectionException.java similarity index 100% rename from group27/383117348/src/com/coderising/download/api/ConnectionException.java rename to group27/383117348/data-structure/com/coderising/download/api/ConnectionException.java diff --git a/group27/383117348/src/com/coderising/download/api/ConnectionManager.java b/group27/383117348/data-structure/com/coderising/download/api/ConnectionManager.java similarity index 100% rename from group27/383117348/src/com/coderising/download/api/ConnectionManager.java rename to group27/383117348/data-structure/com/coderising/download/api/ConnectionManager.java diff --git a/group27/383117348/src/com/coderising/download/api/DownloadListener.java b/group27/383117348/data-structure/com/coderising/download/api/DownloadListener.java similarity index 100% rename from group27/383117348/src/com/coderising/download/api/DownloadListener.java rename to group27/383117348/data-structure/com/coderising/download/api/DownloadListener.java diff --git a/group27/383117348/src/com/coderising/download/impl/ConnectionImpl.java b/group27/383117348/data-structure/com/coderising/download/impl/ConnectionImpl.java similarity index 100% rename from group27/383117348/src/com/coderising/download/impl/ConnectionImpl.java rename to group27/383117348/data-structure/com/coderising/download/impl/ConnectionImpl.java diff --git a/group27/383117348/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group27/383117348/data-structure/com/coderising/download/impl/ConnectionManagerImpl.java similarity index 100% rename from group27/383117348/src/com/coderising/download/impl/ConnectionManagerImpl.java rename to group27/383117348/data-structure/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group27/383117348/src/com/coderising/litestruts/LoginAction.java b/group27/383117348/data-structure/com/coderising/litestruts/LoginAction.java similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/LoginAction.java rename to group27/383117348/data-structure/com/coderising/litestruts/LoginAction.java diff --git a/group27/383117348/src/com/coderising/litestruts/Struts.java b/group27/383117348/data-structure/com/coderising/litestruts/Struts.java similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/Struts.java rename to group27/383117348/data-structure/com/coderising/litestruts/Struts.java diff --git a/group27/383117348/src/com/coderising/litestruts/StrutsTest.java b/group27/383117348/data-structure/com/coderising/litestruts/StrutsTest.java similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/StrutsTest.java rename to group27/383117348/data-structure/com/coderising/litestruts/StrutsTest.java diff --git a/group27/383117348/src/com/coderising/litestruts/View.java b/group27/383117348/data-structure/com/coderising/litestruts/View.java similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/View.java rename to group27/383117348/data-structure/com/coderising/litestruts/View.java diff --git a/group27/383117348/src/com/coderising/litestruts/struts.xml b/group27/383117348/data-structure/com/coderising/litestruts/struts.xml similarity index 100% rename from group27/383117348/src/com/coderising/litestruts/struts.xml rename to group27/383117348/data-structure/com/coderising/litestruts/struts.xml diff --git a/group27/383117348/src/com/coding/basic/BinaryTreeNode.java b/group27/383117348/data-structure/com/coding/basic/BinaryTreeNode.java similarity index 100% rename from group27/383117348/src/com/coding/basic/BinaryTreeNode.java rename to group27/383117348/data-structure/com/coding/basic/BinaryTreeNode.java diff --git a/group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java b/group27/383117348/data-structure/com/coding/basic/Iterator.java similarity index 100% rename from group17/1204187480/code/homework/basic/src/main/java/com/coding/basic/Iterator.java rename to group27/383117348/data-structure/com/coding/basic/Iterator.java diff --git a/group27/383117348/src/com/coding/basic/List.java b/group27/383117348/data-structure/com/coding/basic/List.java similarity index 100% rename from group27/383117348/src/com/coding/basic/List.java rename to group27/383117348/data-structure/com/coding/basic/List.java diff --git a/group27/383117348/src/com/coding/basic/array/ArrayList.java b/group27/383117348/data-structure/com/coding/basic/array/ArrayList.java similarity index 100% rename from group27/383117348/src/com/coding/basic/array/ArrayList.java rename to group27/383117348/data-structure/com/coding/basic/array/ArrayList.java diff --git a/group27/383117348/src/com/coding/basic/array/ArrayUtil.java b/group27/383117348/data-structure/com/coding/basic/array/ArrayUtil.java similarity index 100% rename from group27/383117348/src/com/coding/basic/array/ArrayUtil.java rename to group27/383117348/data-structure/com/coding/basic/array/ArrayUtil.java diff --git a/group27/383117348/src/com/coding/basic/linklist/LRUPageFrame.java b/group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrame.java similarity index 100% rename from group27/383117348/src/com/coding/basic/linklist/LRUPageFrame.java rename to group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrame.java diff --git a/group27/383117348/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrameTest.java similarity index 100% rename from group27/383117348/src/com/coding/basic/linklist/LRUPageFrameTest.java rename to group27/383117348/data-structure/com/coding/basic/linklist/LRUPageFrameTest.java diff --git a/group27/383117348/src/com/coding/basic/linklist/LinkedList.java b/group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java similarity index 100% rename from group27/383117348/src/com/coding/basic/linklist/LinkedList.java rename to group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java diff --git a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..ff94d5e21a --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,5 @@ +package com.coding.basic.queue; + +public class CircleQueue { + +} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..9ff4187a53 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java @@ -0,0 +1,42 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m) { + if (n < m || n <= 0 || m <= 0) { + throw new RuntimeException("传入参数有误,执行失败!"); + } + //保存被杀掉的数 + List ints = new ArrayList(); + //报数 + int count = 0; + while(ints.size()!=n){ + + for(int i=0;i list = execute(7, 2); + System.out.println(list); + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java b/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..12a3ec45be --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,26 @@ +package com.coding.basic.queue; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group27/383117348/src/com/coding/basic/Queue.java b/group27/383117348/data-structure/com/coding/basic/queue/Queue.java similarity index 91% rename from group27/383117348/src/com/coding/basic/Queue.java rename to group27/383117348/data-structure/com/coding/basic/queue/Queue.java index 4bd32c067b..11b191bf89 100644 --- a/group27/383117348/src/com/coding/basic/Queue.java +++ b/group27/383117348/data-structure/com/coding/basic/queue/Queue.java @@ -1,4 +1,4 @@ -package com.coding.basic; +package com.coding.basic.queue; import org.junit.Test; diff --git a/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..7a6a11a3e4 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,38 @@ +package com.coding.basic.queue; +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + } diff --git a/group27/383117348/src/com/coding/basic/stack/Stack.java b/group27/383117348/data-structure/com/coding/basic/stack/Stack.java similarity index 100% rename from group27/383117348/src/com/coding/basic/stack/Stack.java rename to group27/383117348/data-structure/com/coding/basic/stack/Stack.java diff --git a/group27/383117348/src/com/coding/basic/stack/StackUtil.java b/group27/383117348/data-structure/com/coding/basic/stack/StackUtil.java similarity index 100% rename from group27/383117348/src/com/coding/basic/stack/StackUtil.java rename to group27/383117348/data-structure/com/coding/basic/stack/StackUtil.java diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..4406d7d304 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,181 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; + +import com.coding.basic.stack.Stack; +import com.coding.basic.stack.StackUtil; + +public class InfixExpr { + private String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + /** + * 对expr进行解析计算 + * @return + */ + public float evaluate() { + float f = 0.0f; + //如果不为空继续解析 + if (expr != null || expr.length() > 0) { + //如果符号不对称,抛出异常 + if (!StackUtil.isValidPairs(expr)) { + try { + throw new Exception("格式不正确,解析表达式失败!"); + } catch (Exception e) { + e.printStackTrace(); + } + }; + //将字符串转化为集合 + ArrayList list=getStringList(expr); + //根据获得的集合转化为后序表达式集合 + ArrayList postOrder = getPostOrder(list); + Stack stack = new Stack(); + for (int i = 0; i < postOrder.size(); i++) { + //如果为数字,则压入栈 + if(Character.isDigit(postOrder.get(i).charAt(0))){ + stack.push(Float.parseFloat(postOrder.get(i))); + }else{ + //否则,取出栈顶两个元素进行计算. + Float back = (Float)stack.pop(); + Float front = (Float)stack.pop(); + Float res = 0.0f; + switch (postOrder.get(i).charAt(0)) { + case '+': + res = front + back; + break; + case '-': + res = front - back; + break; + case '*': + res = front * back; + break; + case '/': + res = front / back; + break; + } + //将结果再压回栈中 + stack.push(res); + } + } + //最终计算结果出栈; + f = (Float)stack.pop(); + + } else { + //为空抛出异常 + try { + throw new Exception("表达式内容为空,解析失败!"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + return f; + } + /** + * 将字符串转换为集合方法 + * @param str + * @return + */ + private ArrayList getStringList(String str) { + ArrayList result = new ArrayList(); + String num = ""; + for (int i = 0; i < str.length(); i++) { + //如果为数字,叠加到num字符串中 + if (Character.isDigit(str.charAt(i))) { + num = num + str.charAt(i); + } else { + //如果num不为空,表示数字字符凑够了,加到集合里 + if (num != "") { + result.add(num); + } + //然后再把非数字字符也加到集合中,清空num字符串 + result.add(str.charAt(i) + ""); + num = ""; + } + } + //最后判断下,num中还有值没,有的话加到集合里 + if (num != "") { + result.add(num); + } + //返回结果 + return result; + } + + /** + * 中序表达式转后序表达式 + * @param list + * @return + */ + private ArrayList getPostOrder(ArrayList list) { + + ArrayList result = new ArrayList(); + Stack stack = new Stack(); + for (int i = 0; i < list.size(); i++) { + //如果为数字,加到集合里 + if (Character.isDigit(list.get(i).charAt(0))) { + result.add(list.get(i)); + } else { + switch (list.get(i).charAt(0)) { + //如果有左括号,先压入操作符栈中 + case '(': + stack.push(list.get(i)); + break; + //ok,等到右括号了 + case ')': + //先看看操作符栈顶是不是左括号头头 + while (!stack.peek().equals("(")) { + //不是左括号头头,就把操作符栈中的操作符弹出来一个,加到集合里,一直弹到见到左括号为止 + result.add((String) stack.pop()); + } + //最后把左括号也弹出来,这样就只有加减乘除没有括号了 + stack.pop(); + break; + default: + //这里全是处理加减乘除的操作 + //如果操作符栈不为空,比较下当前操作符和操作符栈顶的操作符优先级大小 + while (!stack.isEmpty() && compare((String) stack.peek(), list.get(i))) { + //如果栈顶操作符优先级大于当前,则栈中的操作符弹出加到集合里 + result.add((String) stack.pop()); + } + //否则继续压到栈中,或者之前栈中元素已经弹出,再将优先级小的操作符加到操作符栈中. + stack.push(list.get(i)); + break; + } + } + } + while (!stack.isEmpty()) { + //最后看下操作符栈还有操作符没,有了加到集合末尾 + result.add((String) stack.pop()); + } + return result; + } + /** + * 操作符优先级比较算法 + * @param peek + * @param cur + * @return + */ + public static boolean compare(String peek, String cur) { + //乘除优先级大于加减 + //如果操作符栈顶操作符的优先级大于当前操作符的优先级,则返回true + if ("*".equals(peek) && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-".equals(cur))) { + return true; + } else if ("/".equals(peek) && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-".equals(cur))) { + return true; + } else if ("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))) { + return true; + } else if ("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))) { + return true; + } + //如果当前操作符的优先级大于栈顶的操作符优先级,返回false + return false; + } + + public static void main(String[] args) { + InfixExpr expr = new InfixExpr("3*20+13*5-40/2"); + float f = expr.evaluate(); + System.out.println(f); + } +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..e2de427e62 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,46 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..2e7243ecb2 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,59 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; + +import com.coding.basic.stack.Stack; + + +public class InfixToPostfix { + + public static List convert(String expr) { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + List result = getPostOrder(tokens); + + return result; + } + + /** + * 中序表达式转后序表达式 + * + * @param list + * @return + */ + private static List getPostOrder(List tokens) { + + List result = new ArrayList(); + Stack stack = new Stack(); + for (int i = 0; i < tokens.size(); i++) { + // 如果为数字,加到集合里 + if (tokens.get(i).isNumber()) { + result.add(tokens.get(i)); + } else { + Token token = null; + if(!stack.isEmpty()){ + token = (Token)stack.peek(); + } + while(!stack.isEmpty() && token.hasHigherPriority(tokens.get(i))){ + result.add((Token)stack.pop()); + } + stack.push(tokens.get(i)); + } + } + while (!stack.isEmpty()) { + // 最后看下操作符栈还有操作符没,有了加到集合末尾 + result.add((Token) stack.pop()); + } + return result; + } + + + + public static void main(String[] args) { + List list = InfixToPostfix.convert("300*20+12*5-20/4"); + Assert.assertEquals("[300, 20, *, 12, 5, *, +, 20, 4, /, -]", list.toString()); + } +} \ No newline at end of file diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java new file mode 100644 index 0000000000..d824284eda --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/InfixToPrevfix.java @@ -0,0 +1,54 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Assert; + +import com.coding.basic.stack.Stack; + +public class InfixToPrevfix { + + public static List convert(String expr) { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + return PrevOrderExpr(tokens); + } + + public static List PrevOrderExpr(List tokens) { + List result = new ArrayList(); + Stack operator = new Stack(); + Stack num = new Stack(); + for (int i = tokens.size() - 1; i >= 0; i--) { + if (tokens.get(i).isNumber()) { + num.push(tokens.get(i)); + } + if (tokens.get(i).isOperator()) { + Token token = null; + if (!operator.isEmpty()) { + token = (Token) operator.peek(); + } + while (!operator.isEmpty() && token.hasHigherPriority(tokens.get(i))) { + num.push((Token) operator.pop()); + } + operator.push(tokens.get(i)); + } + } + while(!operator.isEmpty()){ + num.push(operator.pop()); + } + while (!num.isEmpty()) { + result.add((Token) num.pop()); + } + + + return result; + } + + + public static void main(String[] args) { + List list = InfixToPrevfix.convert("300*20+12*5-20/4"); + Assert.assertEquals("[+, *, 300, 20, -, *, 12, 5, /, 20, 4]", list.toString()); + } +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..2040814b2c --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,55 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + Stack stack = new Stack(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + for(Token token :tokens){ + if(token.isNumber()){ + stack.push(token.toString()); + } + if(token.isOperator()){ + int num1 = Integer.parseInt(stack.pop()); + int num2 = Integer.parseInt(stack.pop()); + String result = parseToResult(num1,num2,token.toString()); + stack.push(result); + } + } + + + + return Float.parseFloat(stack.pop()); + } + + private String parseToResult(int num1, int num2, String oper) { + // TODO Auto-generated method stub + String result = ""; + if(oper.equals("*")) + result = (num1*num2)+""; + if(oper.equals("/")) + result = (num2/num1)+""; + if(oper.equals("+")) + result = (num1+num2)+""; + if(oper.equals("-")) + result = (num2-num1)+""; + return result; + } + + public static void main(String[] args) { + //9+(3-1)*3+10/2 + PostfixExpr pos = new PostfixExpr("9 3 1-3*+ 10 2/+"); + float f =pos.evaluate(); + System.out.println(f); + } +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..cc7efb5d40 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,36 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..c06a960bfe --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,49 @@ +package com.coding.basic.stack.expr; + +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + Stack stack = new Stack(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Collections.reverse(tokens); + for(Token token :tokens){ + if(token.isNumber()){ + stack.push(token.toString()); + } + if(token.isOperator()){ + int num1 = Integer.parseInt(stack.pop()); + int num2 = Integer.parseInt(stack.pop()); + String result = parseToResult(num1,num2,token.toString()); + stack.push(result); + } + } + + return Float.parseFloat(stack.pop()); + } + + + private String parseToResult(int num1, int num2, String oper) { + // TODO Auto-generated method stub + String result = ""; + if(oper.equals("*")) + result = (num1*num2)+""; + if(oper.equals("/")) + result = (num1/num2)+""; + if(oper.equals("+")) + result = (num1+num2)+""; + if(oper.equals("-")) + result = (num1-num2)+""; + return result; + } + +} \ No newline at end of file diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..9cfaa64570 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,44 @@ +package com.coding.basic.stack.expr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..2d78610e7a --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,49 @@ +package com.coding.basic.stack.expr; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..58ee229f9a --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,56 @@ +package com.coding.basic.stack.expr; +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..3562e42508 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,40 @@ +package com.coding.basic.stack.expr; +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group27/383117348/src/com/coding/basic/stack/test/StackUtilTest.java b/group27/383117348/data-structure/com/coding/basic/stack/test/StackUtilTest.java similarity index 100% rename from group27/383117348/src/com/coding/basic/stack/test/StackUtilTest.java rename to group27/383117348/data-structure/com/coding/basic/stack/test/StackUtilTest.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..85156946eb --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.attr; + +public class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..a47357ec09 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,108 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, + String code ,ByteCodeCommand[] cmds ) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Integer(); + int maxStack = iter.nextU2Int(); + int maxLocals = iter.nextU2Int(); + int length = iter.nextU4Integer(); + String code = iter.nextUxToHexString(length); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, length, code,cmds); + + int exceptionTableLength = iter.nextU2Int(); + if (exceptionTableLength > 0) { + String exceptionTable = iter.nextUxToHexString(exceptionTableLength); + throw new RuntimeException("解析异常表异常:" + exceptionTable); + } + + int attributesCount = iter.nextU2Int(); + for (int i = 0; i < attributesCount; i++) { + int subAttributeNameIndex = iter.nextU2Int(); + iter.back(2); + + String subAttributeName = clzFile.getConstantPool().getUTF8String(subAttributeNameIndex); + + if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { + + LineNumberTable lineNumberTable = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(lineNumberTable); + + } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LOCAL_VAR_TABLE)) { + + LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(localVariableTable); + + } else { + throw new RuntimeException("解析subAttribute异常-subAttributeName:" + subAttributeName); + } + + } + + return codeAttr; + } + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + // buffer.append("Code:").append(code).append("\n"); + for (int i = 0; i < cmds.length; i++) { + buffer.append(cmds[i].toString(pool)).append("\n"); + } + buffer.append("\n"); + buffer.append(this.lineNumTable.toString()); + buffer.append(this.localVarTable.toString(pool)); + return buffer.toString(); + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..8a5b17f7e2 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,70 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Integer(); + LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex, attributeLength); + + int lineNumberTableLength = iter.nextU2Int(); + for (int i = 0; i < lineNumberTableLength; i++) { + LineNumberItem lineNumberItem = new LineNumberItem(); + lineNumberItem.setStartPC(iter.nextU2Int()); + lineNumberItem.setLineNum(iter.nextU2Int()); + lineNumberTable.addLineNumberItem(lineNumberItem); + } + + return lineNumberTable; + } + + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..3eb2654e36 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..40495c9756 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter) { + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Integer(); + + LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex, attributeLength); + + int localVariableTableLength = iter.nextU2Int(); + for (int i = 0; i < localVariableTableLength; i++) { + LocalVariableItem localVariableItem = new LocalVariableItem(); + localVariableItem.setStartPC(iter.nextU2Int()); + localVariableItem.setLength(iter.nextU2Int()); + localVariableItem.setNameIndex(iter.nextU2Int()); + localVariableItem.setDescIndex(iter.nextU2Int()); + localVariableItem.setIndex(iter.nextU2Int()); + localVariableTable.addLocalVariableItem(localVariableItem); + } + + return localVariableTable; + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java b/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..70387e2bb2 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2Int(); + int len = iter.nextU4Integer(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group27/383117348/src/com/coderising/jvm/clz/AccessFlag.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/AccessFlag.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/clz/AccessFlag.java rename to group27/383117348/mini-jvm/com/coderising/jvm/clz/AccessFlag.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..48c856053a --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,124 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f) { + this.fields.add(f); + } + + public List getFields() { + return this.fields; + } + + public void addMethod(Method m) { + this.methods.add(m); + } + + public List getMethods() { + return methods; + } + + 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()); + + } + + public String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType) { + Method method = null; + for(Method m : methods){ + String name = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + if(name.equalsIgnoreCase(methodName) && methodDesc.equalsIgnoreCase(paramAndReturnType)){ + method = m; + } + } + return method; + } + + public Method getMainMethod() { + Method method = null; + for(Method m : methods){ + String name = pool.getUTF8String(m.getNameIndex()); + if(name.equalsIgnoreCase("main")){ + method = m; + } + } + return method; + } + +} diff --git a/group27/383117348/src/com/coderising/jvm/clz/ClassIndex.java b/group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassIndex.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/clz/ClassIndex.java rename to group27/383117348/mini-jvm/com/coderising/jvm/clz/ClassIndex.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..4006ca69e1 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(getReadableCodeText()); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode.toUpperCase()); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..e86d3de1de --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,144 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if (codes == null || codes.length() <= 0) { + throw new RuntimeException("字节码指令解析错误!"); + } + List cmds = new ArrayList(); + CommandIterator iter = new CommandIterator(codes); + while (iter.hasNext()) { + String opcmd = iter.next2CharAsString(); + System.out.println("opcmd:" + opcmd); + if (bipush.equalsIgnoreCase(opcmd)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opcmd); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getfield.equalsIgnoreCase(opcmd)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equalsIgnoreCase(opcmd)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokespecial.equalsIgnoreCase(opcmd)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokevirtual.equalsIgnoreCase(opcmd)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equalsIgnoreCase(opcmd)) { + LdcCmd cmd = new LdcCmd(clzFile, opcmd); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (new_object.equalsIgnoreCase(opcmd)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equalsIgnoreCase(opcmd)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opcmd); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equalsIgnoreCase(opcmd) || aload_0.equalsIgnoreCase(opcmd) || aload_1.equalsIgnoreCase(opcmd) + || aload_2.equalsIgnoreCase(opcmd) || iload_1.equalsIgnoreCase(opcmd) + || iload_2.equalsIgnoreCase(opcmd) || iload_3.equalsIgnoreCase(opcmd) + || fload_3.equalsIgnoreCase(opcmd) || voidreturn.equalsIgnoreCase(opcmd) + || astore_1.equalsIgnoreCase(opcmd)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, opcmd); + cmds.add(cmd); + } else { + throw new RuntimeException("暂不支持的指令类型!"); + } + } + calcuateOffset(cmds); + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group27/383117348/src/com/coderising/jvm/constant/ClassInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/ClassInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ClassInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/ConstantInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/ConstantInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/ConstantPool.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/ConstantPool.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/ConstantPool.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/FieldRefInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/FieldRefInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/FloatInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/FloatInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/FloatInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/IntegerInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/IntegerInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/IntegerInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/MethodRefInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/MethodRefInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/NameAndTypeInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/NullConstantInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/NullConstantInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/StringInfo.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/StringInfo.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/StringInfo.java diff --git a/group27/383117348/src/com/coderising/jvm/constant/UTF8Info.java b/group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/constant/UTF8Info.java rename to group27/383117348/mini-jvm/com/coderising/jvm/constant/UTF8Info.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..1d03d962e4 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/field/Field.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + Field field = new Field(iter.nextU2Int(), iter.nextU2Int(), iter.nextU2Int(),pool); + int attributeCount=iter.nextU2Int(); + System.out.println("attributeCount:"+attributeCount); + for(int j=0;j fields = parseField(by,constant); + List methods = parseMethod(by,file); + + + for(Field field:fields){ + file.addField(field); + } + for(Method method:methods){ + file.addMethod(method); + } + return file; } @@ -105,6 +120,32 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } return pool; } - + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2Int(); + System.out.println("interfaceCount:" + interfaceCount); + } + + private List parseField(ByteCodeIterator by,ConstantPool pool) { + // TODO Auto-generated method stub + List result = new ArrayList(); + int fieldCount = by.nextU2Int(); + for(int i=0;i parseMethod(ByteCodeIterator by,ClassFile file) { + // TODO Auto-generated method stub + List result = new ArrayList(); + int methodCount = by.nextU2Int(); + 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + System.out.println("field_size:"+fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + System.out.println("methods_size:"+methods.size()); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + /*第四次测试代码*/ + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } +} diff --git a/group27/383117348/src/com/coderising/jvm/test/EmployeeV1.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/EmployeeV1.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/test/EmployeeV1.java rename to group27/383117348/mini-jvm/com/coderising/jvm/test/EmployeeV1.java diff --git a/group27/383117348/src/com/coderising/jvm/util/Util.java b/group27/383117348/mini-jvm/com/coderising/jvm/util/Util.java similarity index 100% rename from group27/383117348/src/com/coderising/jvm/util/Util.java rename to group27/383117348/mini-jvm/com/coderising/jvm/util/Util.java diff --git a/group27/513274874/data-structure/src/com/coding/basic/Stack.java b/group27/513274874/data-structure/src/com/coding/basic/Stack.java deleted file mode 100644 index 034e4c7215..0000000000 --- a/group27/513274874/data-structure/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,65 +0,0 @@ - -package com.coding.basic; - -/** - * author zhougd 20170306 - * - */ -public class Stack { - private List elementData = new ArrayList(); - - - public Stack() { - } - - /** - * 入栈 - * @param o - */ - public void push(Object o){ - elementData.add(o); - } - - /** - * 出栈 - * @return - */ - public Object pop(){ - if(this.isEmpty()){ - throw new IndexOutOfBoundsException("stack is empty!"); - } - Object element = elementData.get(size()-1); - elementData.remove(size()-1); - return element; - } - - /** - * 查看栈顶元素 - * @return Object - */ - public Object peek(){ - if(this.isEmpty()){ - throw new IndexOutOfBoundsException("stack is empty!"); - } - Object element = elementData.get(size()-1); - return element; - } - - /** - * 查看栈是否为空 - * @return boolean - */ - public boolean isEmpty(){ - - return elementData == null || elementData.size()<=0; - - } - - /** - * 获取栈大小 - * @return - */ - public int size(){ - return elementData.size(); - } -} \ No newline at end of file diff --git a/group27/513274874/data-structure/src/com/coding/basic/ArrayList.java b/group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java similarity index 96% rename from group27/513274874/data-structure/src/com/coding/basic/ArrayList.java rename to group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java index 9e55e92529..7d6d7a08f2 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/ArrayList.java +++ b/group27/513274874/data-structure/src/com/coding/basic/array/ArrayList.java @@ -1,5 +1,7 @@ -package com.coding.basic; +package com.coding.basic.array; + +import com.coding.basic.Iterator; import java.util.Arrays; @@ -78,7 +80,7 @@ public Object remove(int index) { } public int size() { - return this.size + 1; + return this.size; } public Iterator iterator() { diff --git a/group27/513274874/data-structure/src/com/coding/basic/array/List.java b/group27/513274874/data-structure/src/com/coding/basic/array/List.java new file mode 100644 index 0000000000..2a07c92d6e --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/array/List.java @@ -0,0 +1,9 @@ +package com.coding.basic.array; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java b/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java index e6d400f483..245affee80 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java +++ b/group27/513274874/data-structure/src/com/coding/basic/linklist/LinkedList.java @@ -2,7 +2,7 @@ package com.coding.basic.linklist; import com.coding.basic.Iterator; -import com.coding.basic.List; +import com.coding.basic.array.List; import java.util.NoSuchElementException; diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java b/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java index 4a0980079b..3b8a9eeb5a 100644 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/Stack.java @@ -1,7 +1,8 @@ package com.coding.basic.stack; -import com.coding.basic.List; + +import com.coding.basic.array.List; import com.coding.basic.array.ArrayList; /** @@ -20,6 +21,7 @@ public Stack() { * @param o */ public void push(Object o){ + elementData.add(o); } diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java index e53e38ca4b..fa8a8c0325 100755 --- a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtil.java @@ -1,5 +1,6 @@ package com.coding.basic.stack; +import java.util.Stack; public class StackUtil { /** @@ -7,14 +8,27 @@ public class StackUtil { * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 */ public static void reverse(Stack s) { - Stack temp = new Stack(); - //先清空s - while (!s.isEmpty()) { - temp.push(s.pop()); + if(null == s || s.isEmpty()){ + return; } + Object object = s.pop(); + reverse(s); + addToBottom(s,object); } + public static void addToBottom(Stack s ,Object num){ + if(s.isEmpty()){ + s.push(num); + + }else{ + Object o = s.pop(); + addToBottom(s,num); + s.push(o); + } + } + + /** * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 * @@ -101,7 +115,7 @@ public static boolean isValidPairs(String s) { break; case ']': temp = (byte) stack.peek(); - if (temp != ']') { + if (temp != '[') { return false; } else { stack.pop(); @@ -109,7 +123,7 @@ public static boolean isValidPairs(String s) { break; case '}': temp = (byte) stack.peek(); - if (temp != ']') { + if (temp != '{') { return false; } else { stack.pop(); diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..d183607f63 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,76 @@ +package com.coding.basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Stack; +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddToBottom() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..ddd255e4a0 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,98 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.StackUtil; + +import java.util.Stack; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + char[] chars = expr.toCharArray(); + System.out.println(chars); + + Stack numStack = new Stack(); + Stack operStack = new Stack(); + //当前数,有可能是操作数,有可能是运算符 + String curr = ""; + OperIterator operIterator = new OperIterator(chars); + int num = operIterator.nextNumber(); + numStack.push(num); + while(operIterator.hasNext()){ + int numB = 0; + char oper = operIterator.nextOperator(); + switch (oper){ + case '+': + case '-': + operStack.push(oper); + numStack.push(operIterator.nextNumber()); + continue; + case '*': + numB = operIterator.nextNumber(); + numStack.push(Double.parseDouble(numStack.pop() + "") * numB); + continue; + case '/': + numB = operIterator.nextNumber(); + numStack.push(Double.parseDouble(numStack.pop()+"") / numB); + continue; + } + } + + //清算站内数据 + if(operStack.isEmpty()) return Float.parseFloat(numStack.pop() + ""); + + StackUtil.reverse(operStack); + StackUtil.reverse(numStack); + while(!operStack.isEmpty()){ + char oper = (char)operStack.pop(); + + numStack.push(operate(Float.parseFloat(numStack.pop()+""),Float.parseFloat(numStack.pop() +""),oper)); + } + + return (float) numStack.pop(); + } + + private float operate(float a,float b,char oper){ + switch (oper){ + case '-': + return a-b; + case '+': + return a+b; + case '*': + return a*b; + case '/': + return a/b; + } + return 0.00f; + } + + class OperIterator { + private char[] expr ; + private int pos = 0; + + public OperIterator(char[] expr) { + this.expr = expr; + } + + public char nextOperator(){ + return expr[pos++]; + } + public int nextNumber(){ + StringBuffer num = new StringBuffer(""); + while(pos <= expr.length-1 && expr[pos] != '+' && expr[pos] != '-' && expr[pos] != '*' && expr[pos] != '/'){ + num.append(expr[pos++]); + } + return Integer.parseInt(num.toString()); + } + + public boolean hasNext(){ + return pos < expr.length-1; + } + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..ddb1130398 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + + @Test + public void testConert(){ + new InfixToPostfix().convert("2*3*4+5"); + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..55eb061ce0 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +import java.util.ArrayList; +import java.util.List; + +public class InfixToPostfix { + private Stack operStack = new Stack(); + + public List convert(String expr) { + + List infixList = TokenParser.parse(expr); + List postfixList = new ArrayList<>(); + int i = 0; + while(i < infixList.size()){ + Token token = infixList.get(i); + if(token.isNumber()){ + //operand + postfixList.add(token); + + }else{ + //operator + if(operStack.isEmpty()) { + operStack.push(token); + i++; + continue; + } + + Token topToken = (Token)operStack.pop(); + + if(token.hasHigherPriority(topToken)){ + //the operator has higher priority than the arg operator + postfixList.add(infixList.get(++i)); + postfixList.add(token); + operStack.push(topToken); + + }else{ + postfixList.add(topToken); + operStack.push(token); + } + + } + i++; + } + //empty operStack + while(!operStack.isEmpty()){ + postfixList.add((Token)operStack.pop()); + } + for (Token token :postfixList){ + System.out.print(token.value); + } + System.out.println(); + return postfixList; + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..27b9ee9c31 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,51 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +import java.util.List; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List postfixExpr = TokenParser.parse(expr); + + Stack calc = new Stack(); + for(Token token :postfixExpr){ + if(token.isNumber()){ + //push number into stack until operator + calc.push(token.getIntValue()); + }else { + //operator : pop two numbers to calculate and then push the result into stack + int numberA = (int)calc.pop(); + int numberB = (int)calc.pop(); + + switch (token.value){ + case "+": + calc.push(numberB + numberA ); + break; + case "-": + calc.push(numberB - numberA); + break; + case "*": + calc.push(numberB * numberA); + break; + case "/": + calc.push(numberB / numberA); + break; + + default: + throw new RuntimeException(token.value + " is not a operator !"); + } + } + } + + //the result is the only value in the stack + float result = Float.parseFloat(calc.pop() + ""); + return result; + } +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..956927e2df --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,18 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..7ef3d1959c --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public static List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private static int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private static boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..89fb53394e --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..da789aa68f --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,108 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Int(); + int maxStack = iter.nextU2Int(); + int maxLocals = iter.nextU2Int(); + + int codeLength = iter.nextU4Int(); + String code = iter.nextUxToHexString(codeLength); + + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + + //exception + int exceptionTableLength = iter.nextU2Int(); + if (exceptionTableLength > 0) { + String exceptionTable = iter.nextUxToHexString(exceptionTableLength); + throw new RuntimeException("there's exception to be implemented !!"); + } + + //attribute table of the code + int attributesCount = iter.nextU2Int(); + for (int i = 0; i < attributesCount; i++) { + int subAttributeNameIndex = iter.nextU2Int(); + iter.back(2); + + String subAttributeName = clzFile.getConstantPool().getUTF8String(subAttributeNameIndex); + + if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LINE_NUM_TABLE)) { + + LineNumberTable lineNumberTable = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(lineNumberTable); + + } else if (null != subAttributeName && subAttributeName.equalsIgnoreCase(AttributeInfo.LOCAL_VAR_TABLE)) { + + LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(localVariableTable); + + } else { + throw new RuntimeException("there's other sub attribute to added : name = " + subAttributeName); + } + + } + + return codeAttr; + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Int(); + LineNumberTable lineNumberTable = new LineNumberTable(attributeNameIndex,attributeLength); + + //lineNumberItem block + int lineNumberTableLength = iter.nextU2Int(); + for(int i = 0 ;i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int attributeNameIndex = iter.nextU2Int(); + int attributeLength = iter.nextU4Int(); + + LocalVariableTable localVariableTable = new LocalVariableTable(attributeNameIndex,attributeLength); + + int localVariableTableLength = iter.nextU2Int(); + for(int i = 0 ;i < localVariableTableLength;i++){ + LocalVariableItem localVariableItem = new LocalVariableItem(); + localVariableItem.setStartPC(iter.nextU2Int()); + localVariableItem.setLength(iter.nextU2Int()); + localVariableItem.setNameIndex(iter.nextU2Int()); + localVariableItem.setDescIndex(iter.nextU2Int()); + localVariableItem.setIndex(iter.nextU2Int()); + localVariableTable.addLocalVariableItem(localVariableItem); + } + + + return localVariableTable; + } + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } + + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..3a8b6b8013 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2Int(); + int len = iter.nextU4Int(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java index 650ca8375d..32a2a0a64d 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -2,6 +2,11 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; public class ClassFile { @@ -11,7 +16,8 @@ public class ClassFile { private AccessFlag accessFlag; private ClassIndex clzIndex; private ConstantPool pool; - + private List fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -48,7 +54,18 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } public void print(){ @@ -63,13 +80,23 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..2bb36340f5 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java index aea9048ea4..c8e65ff493 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -21,4 +21,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java index 5d66317801..88353df2d3 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -18,11 +18,6 @@ public ConstantInfo(ConstantPool pool) { this.constantPool = pool; } public abstract int getType(); - - @Override - public String toString(){ - return super.toString(); - } public ConstantPool getConstantPool() { return constantPool; @@ -31,4 +26,15 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java index f92c8028b9..86c0445695 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -1,11 +1,11 @@ package com.coderising.jvm.constant; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; public class ConstantPool { - private List constantInfos = new LinkedList(); + private List constantInfos = new ArrayList(); public ConstantPool(){ diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index 65475e194c..7ae71396ef 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,4 +51,8 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index 65c586916c..c85d1c8ccd 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -27,8 +27,7 @@ public int getNameAndTypeIndex() { public void setNameAndTypeIndex(int nameAndTypeIndex) { this.nameAndTypeIndex = nameAndTypeIndex; } - - @Override + public String toString(){ return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ; @@ -50,6 +49,11 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index b9d9185ef8..e4f6d027e0 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -46,4 +46,10 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index 936736016f..41e0fd7e7a 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java index f1f8eb4ed4..6bfcb47273 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java index 5cac9f04f7..7db88a939e 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -26,6 +26,11 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..acbb77410a --- /dev/null +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,47 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + @Override + public String toString() { + String name = pool.getUTF8String(nameIndex); + String descr = pool.getUTF8String(descriptorIndex); + + return name+":"+descr; + } + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + int accessFlag = iter.nextU2Int(); + int nameIndex = iter.nextU2Int(); + int descriptorIndex = iter.nextU2Int(); + + int attributsCount = iter.nextU2Int(); + + if (attributsCount > 0) { + throw new RuntimeException("field : " + ((UTF8Info) pool.getConstantInfo(nameIndex)).getValue() + "has attributes to be implemented !!"); + } + + Field field = new Field(accessFlag,nameIndex,descriptorIndex,pool); + return field; + } + +} diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java index e4c5c83681..59d072ef0b 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -5,30 +5,50 @@ import java.util.Arrays; public class ByteCodeIterator { - private byte[] code ; + private byte[] code; private int pos = 0; public ByteCodeIterator(byte[] code) { this.code = code; } - public int nextU1Int(){ + public byte[] getBytes(int length) { + if (pos + length >= code.length) { + throw new IndexOutOfBoundsException("not enough bytes!"); + } + byte[] bytes = Arrays.copyOfRange(code, pos, pos + length); + pos += length; + return bytes; + } + + public int nextU1Int() { return Util.byteToInt(new byte[]{code[pos++]}); } - public int nextU2Int(){ - return Util.byteToInt(new byte[]{code[pos++],code[pos++]}); + public int nextU2Int() { + + return Util.byteToInt(new byte[]{code[pos++], code[pos++]}); } - public String nextU4HexString(){ - return Util.byteToHexString(new byte[]{code[pos++],code[pos++],code[pos++],code[pos++]}); + + public int nextU4Int() { + return Util.byteToInt(new byte[]{code[pos++], code[pos++], code[pos++], code[pos++]}); } - public byte[] getBytes(int length){ - if(pos+length >= code.length){ - throw new IndexOutOfBoundsException("not enough bytes!"); + public String nextU4HexString() { + return Util.byteToHexString(new byte[]{code[pos++], code[pos++], code[pos++], code[pos++]}); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = code[pos++]; } - byte[] bytes = Arrays.copyOfRange(code,pos,pos+length); - pos += length; - return bytes; + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; } } diff --git a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java index 0c35bca807..e9bfa54720 100755 --- a/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group27/513274874/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -4,6 +4,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; import com.coderising.jvm.constant.*; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; import java.io.UnsupportedEncodingException; @@ -26,6 +28,10 @@ public ClassFile parse(byte[] codes) { clzFile.setAccessFlag(parseAccessFlag(iterator)); clzFile.setClassIndex(parseClassIndex(iterator)); + parseInterfaces(iterator); + parseFields(clzFile,iterator); + parseMethods(clzFile,iterator); + return clzFile; } @@ -102,8 +108,34 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } } + System.out.println("Finished reading Constant pool "); return pool; } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2Int(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFields(ClassFile clazzFile,ByteCodeIterator iterator){ + int fieldCount = iterator.nextU2Int(); + for (int i = 0 ;i fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool, m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool, m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool, m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool, m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand[] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java index 08918c490c..cebef21fa3 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixExpr.java @@ -25,22 +25,16 @@ public float evaluate() { if (token.isOperator()){ - if(opStack.isEmpty()){ + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); - opStack.push(token); - } else{ - - while(!opStack.isEmpty() - && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(), f1,f2); - numStack.push(result); - - } - opStack.push(token); } + opStack.push(token); } if(token.isNumber()){ numStack.push(new Float(token.getIntValue())); diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java index d52ec73bd3..2288e3bd29 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -1,35 +1,43 @@ package com.coding.basic.stack.expr; +import java.util.ArrayList; import java.util.List; import java.util.Stack; public class InfixToPostfix { public static List convert(String expr) { - return null; - } - - public static void main(String[] args) { - Stack stack = new Stack(); - String expr = "1+((2+3)*4)-5"; - for(int i=0;i inFixTokens = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList<>(); + + Stack opStack = new Stack(); + for(Token token : inFixTokens){ + + if(token.isOperator()){ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + postFixTokens.add(opStack.pop()); + + } + opStack.push(token); + } - else if(c == ')'){ - System.out.print(stack.pop() + " "); - } - else if(c == '('){ - System.out.print(" "); - } else{ - System.out.print(c +" "); + if(token.isNumber()){ + + postFixTokens.add(token); + } } - System.out.println(""); + + while(!opStack.isEmpty()){ + postFixTokens.add(opStack.pop()); + } + + return postFixTokens; } + + } diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..f879f55f14 --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/expr/InfixToPostfixTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..787c0d954d --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/test/MiniJVMTest.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + + } + +} From c26fb8a02e8d17d30fcc383efcdad54b14881724 Mon Sep 17 00:00:00 2001 From: Andy <14703250@qq.com> Date: Thu, 27 Apr 2017 22:14:22 +0800 Subject: [PATCH 340/552] Delete description.html --- group15/1512_656512403/.idea/description.html | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 group15/1512_656512403/.idea/description.html diff --git a/group15/1512_656512403/.idea/description.html b/group15/1512_656512403/.idea/description.html deleted file mode 100644 index 0f928c44a1..0000000000 --- a/group15/1512_656512403/.idea/description.html +++ /dev/null @@ -1,15 +0,0 @@ -Simple Java application that includes a class with main() method \ No newline at end of file From d7eb24e25ea4b5ea09dc41eab549e41ab76828a6 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Thu, 27 Apr 2017 22:15:33 +0800 Subject: [PATCH 341/552] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/queue/CircleQueue.java | 37 +++++++++++----- .../coding/basic/queue/CircleQueueTest.java | 44 +++++++++++++++++++ 2 files changed, 69 insertions(+), 12 deletions(-) create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueueTest.java diff --git a/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java b/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java index b431db364f..8bd2577c53 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java @@ -1,33 +1,46 @@ package com.coding.basic.queue; public class CircleQueue { - - private final static int DEFAULT_SIZE = 10; - + //用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE] ; - + private Object[] elementData ; + int size = 0; //队头 private int front = 0; //队尾 private int rear = 0; + public CircleQueue(int capacity){ + elementData = new Object[capacity]; + } public boolean isEmpty() { - return false; + return front == rear; } - + + public boolean isFull(){ + return size == elementData.length; + } public int size() { - return -1; + return size; } - - public void enQueue(E data) { - + if(isFull()){ + throw new RuntimeException("The queue is full"); + } + elementData[rear++] = data; + size++; } public E deQueue() { - return null; + if(isEmpty()){ + throw new RuntimeException("The queue is empty"); + } + E data = (E)elementData[front]; + elementData[front] = null; + front = (front+1) % elementData.length; + size --; + return data; } } diff --git a/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueueTest.java b/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..7307eb77d4 --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueueTest.java @@ -0,0 +1,44 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class CircleQueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(5); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertTrue(queue.isFull()); + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } + +} From b4213a764d1eb59cc3eb4f962d7b6d94629227f7 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Thu, 27 Apr 2017 22:30:36 +0800 Subject: [PATCH 342/552] remove virus --- .../com/coderising/download/net_multisoc.htm | 505 ------------------ 1 file changed, 505 deletions(-) delete mode 100644 group17/1282579502/src/com/coderising/download/net_multisoc.htm diff --git a/group17/1282579502/src/com/coderising/download/net_multisoc.htm b/group17/1282579502/src/com/coderising/download/net_multisoc.htm deleted file mode 100644 index 852129b19a..0000000000 --- a/group17/1282579502/src/com/coderising/download/net_multisoc.htm +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - - -Java Examples - Multithreaded Server - - - - - - - - - - - - - - - - - - - - - -

-
- -
-
-
- - - -
-
-
-
-
- - -
-
-
-

Java Examples - Multithreaded Server

-
-
-
Advertisements
- - -
-
- - -
-
-

Problem Description

-

How to create a multithreaded server ?

-

Solution

-

Following example demonstrates how to create a multithreaded server by using ssock.accept() method of Socket class and MultiThreadServer(socketname) method of ServerSocket class.

-
-import java.io.IOException;
-import java.io.PrintStream;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-public class MultiThreadServer implements Runnable {
-   Socket csocket;
-   MultiThreadServer(Socket csocket) {
-      this.csocket = csocket;
-   }
-   public static void main(String args[]) throws Exception { 
-      ServerSocket ssock = new ServerSocket(1234);
-      System.out.println("Listening");
-      
-      while (true) {
-         Socket sock = ssock.accept();
-         System.out.println("Connected");
-         new Thread(new MultiThreadServer(sock)).start();
-      }
-   }
-   public void run() {
-      try {
-         PrintStream pstream = new PrintStream(csocket.getOutputStream());
-         for (int i = 100; i >= 0; i--) {
-            pstream.println(i + " bottles of beer on the wall");
-         }
-         pstream.close();
-         csocket.close();
-      } catch (IOException e) {
-         System.out.println(e);
-      }
-   }
-}
-
-

Result

-

The above code sample will produce the following result.

-
-Listening
-Connected
-
-

Following is an another example of how to create a multithreaded server.

-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
- 
-public class NewClass {
-   ServerSocket myServerSocket;
-   boolean ServerOn = true;
-   public NewClass() { 
-      try {
-         myServerSocket = new ServerSocket(8888);
-      } catch(IOException ioe) { 
-         System.out.println("Could not create server socket on port 8888. Quitting.");
-         System.exit(-1);
-      } 
-		
-      Calendar now = Calendar.getInstance();
-      SimpleDateFormat formatter = new SimpleDateFormat(
-         "E yyyy.MM.dd 'at' hh:mm:ss a zzz");
-      System.out.println("It is now : " + formatter.format(now.getTime()));
-      
-      while(ServerOn) { 
-         try { 
-            Socket clientSocket = myServerSocket.accept();
-            ClientServiceThread cliThread = new ClientServiceThread(clientSocket);
-            cliThread.start(); 
-         } catch(IOException ioe) { 
-            System.out.println("Exception found on accept. Ignoring. Stack Trace :"); 
-            ioe.printStackTrace(); 
-         }  
-      } 
-      try { 
-         myServerSocket.close(); 
-         System.out.println("Server Stopped"); 
-      } catch(Exception ioe) { 
-         System.out.println("Error Found stopping server socket"); 
-         System.exit(-1); 
-      } 
-   }
-	
-   public static void main (String[] args) { 
-      new NewClass();        
-   } 
-	
-   class ClientServiceThread extends Thread { 
-      Socket myClientSocket;
-      boolean m_bRunThread = true; 
-      public ClientServiceThread() { 
-         super(); 
-      } 
-		
-      ClientServiceThread(Socket s) { 
-         myClientSocket = s; 
-      } 
-		
-      public void run() { 
-         BufferedReader in = null; 
-         PrintWriter out = null; 
-         System.out.println(
-            "Accepted Client Address - " + myClientSocket.getInetAddress().getHostName());
-         try { 
-            in = new BufferedReader(
-               new InputStreamReader(myClientSocket.getInputStream()));
-            out = new PrintWriter(
-               new OutputStreamWriter(myClientSocket.getOutputStream()));
-            
-            while(m_bRunThread) { 
-               String clientCommand = in.readLine(); 
-               System.out.println("Client Says :" + clientCommand);
-               
-               if(!ServerOn) { 
-                  System.out.print("Server has already stopped"); 
-                  out.println("Server has already stopped"); 
-                  out.flush(); 
-                  m_bRunThread = false;
-               } 
-               if(clientCommand.equalsIgnoreCase("quit")) {
-                  m_bRunThread = false;
-                  System.out.print("Stopping client thread for client : ");
-               } else if(clientCommand.equalsIgnoreCase("end")) {
-                  m_bRunThread = false;
-                  System.out.print("Stopping client thread for client : ");
-                  ServerOn = false;
-               } else {
-                  out.println("Server Says : " + clientCommand);
-                  out.flush(); 
-               } 
-            } 
-         } catch(Exception e) { 
-            e.printStackTrace(); 
-         } 
-         finally { 
-            try { 
-               in.close(); 
-               out.close(); 
-               myClientSocket.close(); 
-               System.out.println("...Stopped"); 
-            } catch(IOException ioe) { 
-               ioe.printStackTrace(); 
-            } 
-         } 
-      } 
-   } 
-}
-
-
- - - -
java_networking.htm
-
- -
-
Advertisements
- - -
-
-
-
-
- -
- - -
-
- - -
-
- - -
-
-
-
-
-
- - -
- - - - - - - - - \ No newline at end of file From 2178dea2f8761c8d774eafd8b9d74439d789cf45 Mon Sep 17 00:00:00 2001 From: Pan Date: Thu, 27 Apr 2017 22:49:36 +0800 Subject: [PATCH 343/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=97=85=E6=AF=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group15/1512_656512403/.idea/description.html | 15 - .../com/coderising/download/net_multisoc.htm | 505 ------------------ 2 files changed, 520 deletions(-) delete mode 100644 group15/1512_656512403/.idea/description.html delete mode 100644 group17/1282579502/src/com/coderising/download/net_multisoc.htm diff --git a/group15/1512_656512403/.idea/description.html b/group15/1512_656512403/.idea/description.html deleted file mode 100644 index 0f928c44a1..0000000000 --- a/group15/1512_656512403/.idea/description.html +++ /dev/null @@ -1,15 +0,0 @@ -Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group17/1282579502/src/com/coderising/download/net_multisoc.htm b/group17/1282579502/src/com/coderising/download/net_multisoc.htm deleted file mode 100644 index 852129b19a..0000000000 --- a/group17/1282579502/src/com/coderising/download/net_multisoc.htm +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - - -Java Examples - Multithreaded Server - - - - - - - - - - - - - - - - - - - - - -
-
- -
-
-
- - - -
-
-
-
-
- - -
-
-
-

Java Examples - Multithreaded Server

-
-
-
Advertisements
- - -
-
- - -
-
-

Problem Description

-

How to create a multithreaded server ?

-

Solution

-

Following example demonstrates how to create a multithreaded server by using ssock.accept() method of Socket class and MultiThreadServer(socketname) method of ServerSocket class.

-
-import java.io.IOException;
-import java.io.PrintStream;
-import java.net.ServerSocket;
-import java.net.Socket;
-
-public class MultiThreadServer implements Runnable {
-   Socket csocket;
-   MultiThreadServer(Socket csocket) {
-      this.csocket = csocket;
-   }
-   public static void main(String args[]) throws Exception { 
-      ServerSocket ssock = new ServerSocket(1234);
-      System.out.println("Listening");
-      
-      while (true) {
-         Socket sock = ssock.accept();
-         System.out.println("Connected");
-         new Thread(new MultiThreadServer(sock)).start();
-      }
-   }
-   public void run() {
-      try {
-         PrintStream pstream = new PrintStream(csocket.getOutputStream());
-         for (int i = 100; i >= 0; i--) {
-            pstream.println(i + " bottles of beer on the wall");
-         }
-         pstream.close();
-         csocket.close();
-      } catch (IOException e) {
-         System.out.println(e);
-      }
-   }
-}
-
-

Result

-

The above code sample will produce the following result.

-
-Listening
-Connected
-
-

Following is an another example of how to create a multithreaded server.

-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
- 
-public class NewClass {
-   ServerSocket myServerSocket;
-   boolean ServerOn = true;
-   public NewClass() { 
-      try {
-         myServerSocket = new ServerSocket(8888);
-      } catch(IOException ioe) { 
-         System.out.println("Could not create server socket on port 8888. Quitting.");
-         System.exit(-1);
-      } 
-		
-      Calendar now = Calendar.getInstance();
-      SimpleDateFormat formatter = new SimpleDateFormat(
-         "E yyyy.MM.dd 'at' hh:mm:ss a zzz");
-      System.out.println("It is now : " + formatter.format(now.getTime()));
-      
-      while(ServerOn) { 
-         try { 
-            Socket clientSocket = myServerSocket.accept();
-            ClientServiceThread cliThread = new ClientServiceThread(clientSocket);
-            cliThread.start(); 
-         } catch(IOException ioe) { 
-            System.out.println("Exception found on accept. Ignoring. Stack Trace :"); 
-            ioe.printStackTrace(); 
-         }  
-      } 
-      try { 
-         myServerSocket.close(); 
-         System.out.println("Server Stopped"); 
-      } catch(Exception ioe) { 
-         System.out.println("Error Found stopping server socket"); 
-         System.exit(-1); 
-      } 
-   }
-	
-   public static void main (String[] args) { 
-      new NewClass();        
-   } 
-	
-   class ClientServiceThread extends Thread { 
-      Socket myClientSocket;
-      boolean m_bRunThread = true; 
-      public ClientServiceThread() { 
-         super(); 
-      } 
-		
-      ClientServiceThread(Socket s) { 
-         myClientSocket = s; 
-      } 
-		
-      public void run() { 
-         BufferedReader in = null; 
-         PrintWriter out = null; 
-         System.out.println(
-            "Accepted Client Address - " + myClientSocket.getInetAddress().getHostName());
-         try { 
-            in = new BufferedReader(
-               new InputStreamReader(myClientSocket.getInputStream()));
-            out = new PrintWriter(
-               new OutputStreamWriter(myClientSocket.getOutputStream()));
-            
-            while(m_bRunThread) { 
-               String clientCommand = in.readLine(); 
-               System.out.println("Client Says :" + clientCommand);
-               
-               if(!ServerOn) { 
-                  System.out.print("Server has already stopped"); 
-                  out.println("Server has already stopped"); 
-                  out.flush(); 
-                  m_bRunThread = false;
-               } 
-               if(clientCommand.equalsIgnoreCase("quit")) {
-                  m_bRunThread = false;
-                  System.out.print("Stopping client thread for client : ");
-               } else if(clientCommand.equalsIgnoreCase("end")) {
-                  m_bRunThread = false;
-                  System.out.print("Stopping client thread for client : ");
-                  ServerOn = false;
-               } else {
-                  out.println("Server Says : " + clientCommand);
-                  out.flush(); 
-               } 
-            } 
-         } catch(Exception e) { 
-            e.printStackTrace(); 
-         } 
-         finally { 
-            try { 
-               in.close(); 
-               out.close(); 
-               myClientSocket.close(); 
-               System.out.println("...Stopped"); 
-            } catch(IOException ioe) { 
-               ioe.printStackTrace(); 
-            } 
-         } 
-      } 
-   } 
-}
-
-
- - - -
java_networking.htm
-
- -
-
Advertisements
- - -
-
-
-
-
- -
- - -
-
- - -
-
- - -
-
-
-
-
-
- - -
- - - - - - - - - \ No newline at end of file From 2f5f2e759b090c3606318f882e9ac3c138f76451 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Thu, 27 Apr 2017 23:12:58 +0800 Subject: [PATCH 344/552] =?UTF-8?q?=E5=AE=9E=E7=8E=B0arraylist=20=E7=9A=84?= =?UTF-8?q?=20contains=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../johnChnia/coding2017/basic/ArrayList.java | 19 +++++++++++++++++++ .../com/johnChnia/coding2017/basic/List.java | 1 + .../coding2017/basic/linklist/LinkedList.java | 5 +++++ 3 files changed, 25 insertions(+) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java index d9a03f49a7..1d48b259f8 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java @@ -174,6 +174,25 @@ private void grow() { 2 * elementData.length); } + public boolean contains(Object o) { + Itr itr = new Itr(); + if (o == null) { + while (itr.hasNext()) { + if (itr.next() == null) { + return true; + } + } + + } else { + while (itr.hasNext()) { + if (itr.next().equals(o)) { + return true; + } + } + } + return false; + } + public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("["); diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/List.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/List.java index 940403ce98..7a399de95f 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/List.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/List.java @@ -18,5 +18,6 @@ public interface List extends Iterable{ Iterator iterator(); + boolean contains(Object o); } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java index 31acd087d2..4359918e74 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LinkedList.java @@ -229,6 +229,11 @@ public Iterator iterator() { return new Itr(); } + @Override + public boolean contains(Object o) { + return false; + } + private class Itr implements Iterator { /** * Index of element to be returned by subsequent call to next. From 0ae26092d90ea06baf4c28abf5ab3594bdcc23bb Mon Sep 17 00:00:00 2001 From: johnChnia Date: Thu, 27 Apr 2017 23:19:44 +0800 Subject: [PATCH 345/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9classload=E6=94=AF?= =?UTF-8?q?=E6=8C=81ioutil=E3=80=81stringutil=EF=BC=8C=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9EloadClassFile=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/jvm/loader/ClassFileLoader.java | 108 ++++++++++++++---- 1 file changed, 83 insertions(+), 25 deletions(-) diff --git a/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java b/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java index a300edafc7..47ac60b253 100644 --- a/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java +++ b/group24/315863321/src/main/java/jvm/loader/ClassFileLoader.java @@ -3,54 +3,112 @@ import com.johnChnia.coding2017.basic.ArrayList; import com.johnChnia.coding2017.basic.List; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import java.io.*; /** - * @// TODO: 2017/4/20 改成 try... with...resource - * @// TODO: 2017/4/20 close inputstream - * @// TODO: 2017/4/20 修改TreeInfo直接返回File + * Created by john on 2017/4/27. */ public class ClassFileLoader { private List clzPaths = new ArrayList(); public byte[] readBinaryCode(String className) { - for (int i = 0; i < clzPaths.size(); i++) { - // 找到指定类文件 - Directory.TreeInfo treeInfo = Directory.walk(clzPaths.get(i), className); - if (treeInfo.files.size() > 0) { - try { - FileInputStream fis = new FileInputStream(treeInfo.files.get(0)); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 自动增长 - byte[] buff = new byte[1024]; - int len; - while ((len = fis.read(buff)) != -1) { - bos.write(buff, 0, len); - } - return bos.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); - } + 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) { - clzPaths.add(path); + if(this.clzPaths.contains(path)){ + return; + } + + this.clzPaths.add(path); } public String getClassPath() { - StringBuilder sb = new StringBuilder(); - for (int index = 0; index < clzPaths.size(); index++) { - sb.append(clzPaths.get(index)); - sb.append(";"); + return StringUtils.join(this.clzPaths,";"); + + } + + // ------------------------------backup------------------------ + public String getClassPath_V1(){ + + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Fri, 28 Apr 2017 08:01:15 +0800 Subject: [PATCH 346/552] jvm5 --- group19/527220084/lite-file-downloader.zip | Bin 0 -> 12749 bytes group19/527220084/lite-struts-tdd.zip | Bin 0 -> 290775 bytes .../xukai/coderising/queue/CircleQueue.java | 81 +++++++++++ .../org/xukai/coderising/queue/Josephus.java | 49 +++++++ .../xukai/coderising/queue/JosephusTest.java | 29 ++++ .../coderising/queue/QueueWithTwoStacks.java | 83 +++++++++++ .../java/org/xukai/jvm/cmd/BiPushCmd.java | 13 +- .../org/xukai/jvm/cmd/ByteCodeCommand.java | 41 +++++- .../java/org/xukai/jvm/cmd/GetFieldCmd.java | 20 ++- .../org/xukai/jvm/cmd/GetStaticFieldCmd.java | 7 + .../org/xukai/jvm/cmd/InvokeSpecialCmd.java | 25 +++- .../org/xukai/jvm/cmd/InvokeVirtualCmd.java | 9 +- .../main/java/org/xukai/jvm/cmd/LdcCmd.java | 22 ++- .../java/org/xukai/jvm/cmd/NewObjectCmd.java | 12 +- .../java/org/xukai/jvm/cmd/NoOperandCmd.java | 124 ++++++++++++++++- .../java/org/xukai/jvm/cmd/PutFieldCmd.java | 18 +++ .../java/org/xukai/jvm/cmd/TwoOperandCmd.java | 1 - .../org/xukai/jvm/engine/ExecutionResult.java | 57 ++++++++ .../org/xukai/jvm/engine/ExecutorEngine.java | 58 ++++++++ .../main/java/org/xukai/jvm/engine/Heap.java | 39 ++++++ .../java/org/xukai/jvm/engine/JavaObject.java | 72 ++++++++++ .../java/org/xukai/jvm/engine/MethodArea.java | 75 ++++++++++ .../java/org/xukai/jvm/engine/MiniJVM.java | 30 ++++ .../java/org/xukai/jvm/engine/StackFrame.java | 130 ++++++++++++++++++ .../java/org/xukai/jvm/method/Method.java | 57 ++++++++ 25 files changed, 1038 insertions(+), 14 deletions(-) create mode 100644 group19/527220084/lite-file-downloader.zip create mode 100644 group19/527220084/lite-struts-tdd.zip create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/CircleQueue.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/Josephus.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/JosephusTest.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/QueueWithTwoStacks.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/ExecutionResult.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/ExecutorEngine.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/Heap.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/JavaObject.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/MethodArea.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/MiniJVM.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/StackFrame.java diff --git a/group19/527220084/lite-file-downloader.zip b/group19/527220084/lite-file-downloader.zip new file mode 100644 index 0000000000000000000000000000000000000000..69153a25c26a6d85f54d17a6448aaa3c63304d90 GIT binary patch literal 12749 zcmb_?WmKJOk~Qw`8l2$n5Zv9}-QC^Y-62?Tw_pK+1P>lug1b9m;7<1q^mqGPGq<$h>UnnUDp?6&5EK9i2nYZ!6$5dASBCfeY-#3bL~U$lX+&*k<6>=Tqi1Mj zPfKH9spsHetLJE%6)O?Z&5IB?MtR@^;n0-7+9gm+h(rKLWV*P|Fv?`N{sVc7VE>Cw zPC118$;`B;mX;#J-O{dU%nZ2z`MyAmkZ8B4kkg>@bUmkGe$|*XA(KnxrndtM-V@Zo zf&8dXv{=VY zKhkjA_HTraLYIa2J+U;sVd5?8M<-LVSU(zROJfCYb`y__(xsX$9dy}b8RL~3X*Mr= zaA!xoZ!2N7Sj1iebP}naI$3sWFi}xOglt%a3+F_arF)d+M+O7SZ-&AuEd<##kK7`! z-p!2yp#E;P>YwG23rOO6qMWB{C|}NE1*v$l%s)r3B5(D;D~trYg4!04>I^Z*qE}B$ zcPAw_toc=>rHfZyX4NOa3=c|Bi|d;G#QW%sRp%uh1l{D!z0cl8zKO@~zr=(6-^Rni z$kEZv+Qfm@#@>X+$iULf*1?Fz+|ZH6z{cK)#@61**dZyFCjyuNq4%D*BRrNSN-8{n zlfQY-U1f#FVTVixc4MKRWVdeN8~%C5H8{6;30+VsU$F?YOSQPN2gf@G^nmL@AJaY) zeXbHwkbZ<}-Y8R)UYX6!@oI1N;tay>8Q>8+zWb=kk+gyAVK>UT29-dIE1LPZkNz&6 z#tLEU!ZXz3fC@UpSSK@+AoB#!Emv||u$42vaGulsy@tc5{*(g%==1MlebaJ6_i*1y z>tJT_8Ji})XJ6IQ)>R4TyaZ|JQa`5SIRwf;uahQE-S$l_efW1la5Pi^;9^irDRT#e2l5|w+4~dD2 zk|?1l;wrg)bX6U)@TjSecToZB{ycaC;N!~!MW?&!OU%NywwlRlzY|ICBUw**ALc`_ zG|AXnSEhAphqKz?T=c2+)BWs+C8APwJ3;ITwHor&0ZDs##%RsCQ2QPRDr59nBCvmu?^0`N z!>@Qb!`^t~g@b0j=pEpG*af}nNY^#8Hl4+GO3p?1!P`k(?HQcA(&IDE@RGm@z9YE1NI2alLH0b`7VWas6;y*|zwZX?s-1 z>C^1eCAD;~kg{LUq63AK^$)V$UGtf#F-}VvQB5dvvtZNyTZQkX?xG$CD=Ws=rYc`? zzK_+xKx^cc4P|McTJzXUZR;YB_*fk*F3$hDPd5*(Hm1MlJtFGh@hxOMAJ$N{-A)co zyEdK9m^1gj##Q;qI9vSW;o)4%ep{y>gg7(Q!*st6jb@XGIB%Hewqe}Xy3!gU!%O;u zM~v#A5^Hk>4y^=5TJ*lG)}W2>0`j37yn7VU8)G7?^FskdvGC~Lp|Oq+HO{QcY8-*0 zQ*gx~d*x3Z+bhEnc6Qf#c}8$c9{WjLx!jHwCqy03miJUkC2FLSFs9LH47{$_$=a2X zyI(2+;{()9$rVCm#DV-8IdL9uB<3h&1hTR|P|!*vS#r>Mdol^(B5daeLd+@1-jcmD zvkN;3TeT84p+_1n)&?vtD-s`OrM||wnS;5a>W#Wbi%Mn30b|&Vn4&S=BtXa+`(>zV zi{|Mnu0k~1WWkjGg*NQnEVuZU2p&<6H*d8J4*|cPsPUx$ov;^LpqA(7+`dfnEVeT6 zYI!=68vk=7c`>s9kBz$Gdo%XN*d_Fq8&e^8(GpK*(pfmweFdV7EZDvOA&{M zZWtrGhCtBApbZjojfzo1-H=3!ADZ~4%Da%kd4m+Cj)x22GL12Ab#)6XRr2iBjCKvT zTcA;_jg_BeNX>Be;GJ{pjzvv$DzW!a2p!P3mx5Z^dhM4y&j57hP$6X{@FuCT>mUZD zASH99Lm{JK*~F$?DqZ@8`trf|ScIJqKl<6-^-3&h*9+s-2_;e*0P%F-MlcTnd1i(B zX5;5e2gmW#j4E4PRg05A#Q;zi*Q{2=BHDv!IcjnQ(~}Jun{-VqKTsr!9&HIGX4}Mo zfbdcI2rl}^CzaOjH)1avn84nve%{j*bt#_CuZ2z0DL*RZKUPromF~^rd~`K&E0oLe zT_39w$+)IzWpp@NJQ!uQIJ!_m4LfEzPJ($Cdpp`8fMcTrga(>1TLvJa`JpB(v`36! zYoOrzgl|Zk-~M2oD2+}6Fbc|LA`wL>I$*kk(s%iS>OW^= znkS-#hy&OK39x}%nlu^gdnQ_N01x11Ht1zH=H-BlAZqGpqbai5ydwR1wyHT|Y*B@$ z*+Jo`&!5%jYgPwv=xMUHyTpD+&Qx#IorB9-BWFVmYfM{g#yTq7>kkl|&;s_;r zH!xRR?CA3lg7ravWU-6_;L_~qKDd4bi_*TOSgvv+3q|Uur&1a$>s+bwHsw~o%-XyM zne6J>8ts9-#)EGMXY6PtC|}I+=~hdtz_NMQJa*iYV6oVd^2AD?76<|Y46l6Mg|!!c ztbjdo>!f3j4KJuaQF+Oktn9dsdqU5$DU7m)XwhZYCM3@=zGZMdNCB{%;la0X+Iq!% zDgHF)Tq3AU^JpTlsmEuP=HGLwG~yUp`)(tmeUCYL#F4A}>OjeJd0Gh5=YD`hK5i9W z9q5E0X2LI^BU3wAp-JwGFp*&0t6#9to~CWFK0 zs|#Zr9Hp0lKl$Xtxl59<;@9fS-2h_hQOJ^!X?MfECxbE&bJr&k3vmT3LBbXtPs_`; z_e;ZPt}m5ZTEP zC|>Cv=!;?+w?rX$v9{<=Ao*V4dKTdD>RRGx+9>oU%fzL<(5z=If^#`Wf{VO&bxzA| z{zob;wsF4qkd{v8*u0w#9>CRAgOZ%BZ!@^Xf=x<$e-(;1W%H=fieBi{az>(QtgemH*9+1*;|1@2mMH$Y;8i(4X!w7t&=B+#4z)q&`blq|gSao~Mr#b*`b}Tw z@Ssu0Qiy}oMGuKWZ8>=$TXMLo23{>Q{&A)Wa=;ra9EfVZI|SHxzjugQ2{=F;4@&-+ zCt*Y*rfpZ~_=;oT4tVQ6zyc|S@CG!k~>uU;xblyZU6X2^ZL6MDG!)%+BITccRYrdhvL*&L~1r zk#_69Qh9et5Hm1ivOjIjefuiX6`uVQCV@g=5~{Bqv18EQs8=ZHBS*=PoG_jpwdhSaJ^`H#zKvMkr$qsqXAkb6V{&pA431 zWo`sFI-!v?xYKii`WBrsg{7>?)rG_;R^sb}u0f88OFqNLrd!0NBg;F~$Uky?tJ1O0 zJAkCXs!4!HP2ZT~4TG6e-^l|wZ8x?Y;>=f7VK6}&>=LRK)mkq@iB73CPBr5Iy#bwy zrLLV2;p52jqCw|b#O2AB!QhFd^QO~#knO%%3p^#V=ZddOa3NJ3Lw*Bm*eP9q>HD@!qg|m z%E`{mj-BQx#3^vxeHcLM&ME`#ceG5`g;B6hzl}sE?=4EhOFez=Y*`}2K=Lr?!HS68 zI?u`VG)HB`u0)YehfE63wve9CG^?gWarlDz zAsVq=x=Adg^n!oV@Bz$*&PbI^Vvg@8b7+@H?5Y)I?AopB;5VJFgn+Xz11m7Smafh& zK45$YCl|>IalUJAM0lL0+;}aZ2%PomPL`}&&T8ir7WS)6;CveOW9onxAHhc`oll#@ zS#O{}M*0Yx=B?9zIjouEQa8nABDAVi{K5FO0~5|Mwe%f2lCi!g#zq0to;kO(4VNZl zjP@81&gJUIG3DEATRWxuji>~bYNj?{-c*VpAG~q*_Pj%6i<-xZ zj3>&i1dJ-%?zECw$FsbN_4GAp#v?V`6@PFvPs1(&=wBbZuk}BmYR0)mTexHH&L&i{H>R7pZ_^XP}MgBGr{V zq9$DyR)#MV;)x68Xj&lf5pKGKzWD%Ct1<>fp8tA&vi-`j>cf(S&B}hClrmz5gcELu zV5BUFQd^n47EeD6-1}Nn+1WYu+|ZvoWTVx$R$g6j%Kh5?s!ON&(RM$u6ddqzLAH!= zqjgo~ZsfsiWNUk>4o~`wb$7uk3vrv1y;s#o#jIV4z0K^B8(nRCcR!-l)A`KReSI*g z)&AaX2(U!=Ym_$(q5a<6i4*$UQ|%g&@xpg$3dy@Z z*|qCGl%5?u=%237Uw!HM^IPeuEU|ghvJjmCT$(J-9Ig+4=3|LFY`w?U}#&}|wOpE%A;M7z}i z{!Nk%yed6PMIwR_)DwTIBtX`>^sqeN16Au%R~(rQDR~*orT9Zt2^gu~a=H;??J|y` zaCkZ75EiQd9(|EPb}+1cSd9O3D09JO^wxOGk}uvT8H_&uvW;wC&5}$=2pgsDuDWPXo@Hrn zeD320bc63OAp>8+ez4M8n`kHo+XAA zx5ykmKziak@5dS|tILp&oT0g8|;fJu{^x8;Zmh#0XDmJJiqRdl5xVn@Vg zd{|Jy{?&z}OV6qr-NG<=JwXvZ$DdnJy~Kl^XL1Lw(qp!#P-aw=8~y zKsTb8ZdDs}QlQLqk#dVV$8R zETzoyY6YoRzlz+Bk`60k`a=?8(Jm(FY<7B4y4BIR52s;0jQuUC@$jVG=tfE9GFizt zsMttBzgL>_(vzM*my%(@1%|YydRWUKZW79*Y!SGF`QqDEDQHlz7tCB7R zx=TbR1(mzRLZ>XPZd8zQ#d$_>W({uVyW=djP^lYGwN#ZF7E?I-pM3{3w-<}rnbqc; zs|~jYp*U@8WTWB5^rwE7PvTpp8>d_B>QAaRY)yyez36B9F*4a8oH0H4jKIJWAJf6U z_*#8u7UssIC6->6*0_8x?G?e5rB`9XQ&NA{>D@S@UdQY0!#5bhTjPg_d~L$JI@Ra; z;6PZ5$5RB<2;&hRX~VmsiVrb@`UOxZ<-_Wd2`nXebzgQSbSSd*>eECB9t#tQt3_qU z89V~OK{=jkPEo*l&%6)hA`oBx9eha}Fq7p918-$;znh2N7d35Q&0ifr{h7fRJoeCe zfWPJfn7ASd89pwRWZGZeiKmmo7B9PDuv0|EZ&AN*BMh~M6mA285W6mRf}ig(Wr*^$ zyM}VlsC3sbt4iTa2kt00U^b7&%VHa|IXi=eua2O%oZ8GrmJQ>hy zT@lO41kx#RT3`T@=0k_>#p#b7243Y$!e}Hq=fiV?UJ?fn;S)0=@D-0jE@CMUlKVFC ziPHVALMZ93$8IPw@GX_-%Q?-GCq$VH!7?Q6x5Uyh_zdFU1-Xsu)gL>j?1Rw|Q-2cK6bfpOpRT$0a(uR!(=tH-sQAj)FUGHwIKlHO zXrx=y`LdZAf}Xp!iJ%~a5f|B6f#4iT@Jh{4x6aVCZ9oqzh$euLr9DjM<{)3dRrPvi zNAsO~ErwGL-u#_S8cX0zTodtj0v`-J{IbNsXX5bBpzFF2Jm;Nt(Y~-aUH3jOHy9YZ zl=(+=k4U{Z}A~LTQgb#8*A(5!I+uNfA>pXu`&`sd>DOW)Hk?W#Yh&{ zG<=Q_{w*RQc2`ze6KO`yQ-nZ}QDn@;!wj_wPG|6rrPB`#qm|irP=_t?b03GG$GDCk z-eu2r8{%d7LX7PMV&fM}rIlcFjZNTSb2RSQ3r3hS8Q2kwzZ=!dviI_GIP~=;AvZx@ z7$luc#2+LM)sh6Lu)4OLf%N$ZvKYRO8p&1`}P+Uay2lr{qv`^isFO%N(Tcn z#&QGCL5l8!-#-yjTnj;1X_yxXCjPXH0d@E>#YoLLHMo9tnAdsCFi6F2oE_c6l$i=M zLz2Ac$CU;uQ0WdFx`NSs&xJceleTY6R0Er5ib?odz$0KVp5wvns>e^K)zgb06_@N& zuoqvKWYEs-o;}HV!`?5|-)5`Cf9|W4p0%FIKWG=FsN|@$q>Pg2=-9NxbB|3uNHsbv zF)J}ZJ2o^RBRMWX^{swubA6M7OlojIQu*63r5Lrigru~R?daH$gcQxd@YuQ3FmSqT zf$YdoZ%I`lC^2e1O7?N~t>aSpdrqwE163vU#Qfa+lX8c%$q%pyap?EkANDn%Ck(Kh|q?|6~S8N0cI9{i`cqE_Pxa|QV3nNYrX0bM_kxqT;YN00wH5U zKMy6U(JI-t5*56((IL7*8p3*a>cgP#=$eFcGMzKrK@+*aiY{S9zN8(&KW$}9!oRpC z+<-S_@chMX-?+w5{FZ%-{TD4} zHr5=g(ETF=^@Ql?In|MK3of^*z==Rxxai)FyVy+^Mh#AKV#)_&>5cjgg39qS7HndSX~m4=h*WPbVg`uq zF&j4Tczp2On-UE3$Z{K(?Vvla0Jn?3HFcIQK;EQ;@tRrY`1^wlfRM^V!pVco#xymt z=5L3z+OXP!qHo(Q_hsZ7`^DaOLae2oU-%gd(>{o!@@vrJ*99se{Gj6N1k6-j1HusA zS+@$(g$>I!1k#yQdL;=M9k;2Ce{k8*xY z-8m#^jy69QzB3#|1*YrU0DORMYu@V;15Jx*pVV#w_TYK0CneBhKtC#9dS&KMqS?~| zPR^te#jbH~&1JJOE=UIyR=qeW2?LD{M}63ZpD=Xybwbn%#S*@8=TBP%phnft_p4cD!WON7lXT=!%Ce_Vzzk*)Qv9}pakW<4y`XcOosH&al*Gm@gH~ZL4$Mo)ynfAKZP|Mn6J^OcPB1o;vuG>z1bKeufnI|L_X)K1ebHkHV zn|^#$;?#C%e64{aS7(UZ_iRamy zW}8o~I#Hr@i&he*NgGo>^!JBcG$UonusV|*iFw$w zr2lnpXF#?vv_uDYze@c>_wL4TA*{3LE-*j}QXbj@a=2@Vn-6h^>}sgual9c3 z2JtWfZeYLJe4Y4!LTRKfR-mtKrfu&h8pJs*t)bnA#XpYL$Ro(;n&)6dzqxsteXQQx zynpNbaeUU9U!6ZMvhyG3&xpd9#S|~bhiAcAZ^sPX&^Vz&V;29W44jWvUPj1}BhC0z z5#!I{CSk;`q2zF=c2)Nid63fyG!VWnp8lTY2lUJVYqiA@>wPKy_!!UQ_G7P@$f5&! zDRzBxY{n#8qViaBX+;`FA!L|E{o0nzKqo2MQ!ehU{G5qe%U;1cB$?)@hQ!!o|d+%o<=Fa zcJRGRx#wp^fA*TiZKkxOzNd_DX{}M)owIm(fk3z=20zj5)0#~=mgw!J-Ls?WDC+1t zq!}!Q4sXNZYCPq-2v}NtjV+SJe31PIt8AoYmY*K3DluTfm$FuPmXmehhTyA)9`h&1 zs=~AQ>>k>=*vPNAlSJ@*aNp%*p?!a(L&IwS3<=u^KF=>wt>6Vw}l zmP-+BfhYHbX=Y}pXA{z!@B@*m&lrn`)gQ5tphY0l9IcTeyH1SULHuwMQxOfsL&+#( zuROnIuQ_5Ar;iUD@8?!RU7{R^**E1{DCHOt|G6tHh`<|{L#*43pvCP< z|G~(T4oxq|AITv|Ha?IIKq7ZnBy46>b<{{v*{``*6aa}T$G#5AkW7^m5WWdmz*Y*11V&V-z*U8x{1zzi(0Kt0viGou zAI0837dA_c?U;8~p|9P?iU zAIC8w1@j3ED$z(}mBpC%eZaU`-U0N29`y{+mtj@`LP{{Z4^Il(UB*9E+pu>ONz-#o z8ZAU_zSmHNKw7nQX&6crn>a{xaK+S>OqC^{u;h)>H;v57JCRd&#m-mMcj(0A|Nhjm z@OWN&f9ddaQ~qRi{BXV8yIaE0(r@G5DuNzzzl3++o`cum!l_6NuvH-kN5W3dK{C=1 zUCPv`N`o0&qqG<@Z^9nh}{ig$<*Pr2O0N4i50Pldm@hUzR6-+xurv{`yt_gH_7cFfZ$e zug9P->xaKh68PW1`~}Vb%VosZP%m@U*R!IRx$19QhWqoc@;2|IDU0UH5C;mnQf%n|~pp zzikBnZ{YsBmiRU7ORMmP75~P3etJjzpTquZ literal 0 HcmV?d00001 diff --git a/group19/527220084/lite-struts-tdd.zip b/group19/527220084/lite-struts-tdd.zip new file mode 100644 index 0000000000000000000000000000000000000000..e27ef4ec8123632f4c535e8b3a9c132dbdf3388f GIT binary patch literal 290775 zcmZ6SQ;;q^w5HqUZriqPcYkf$wr$(CZQI6f+q-QW^UuxHnUhLYa+i9aTFINF)>4oG z1w#dbf`S5)v@nqd`X3GbzqyU2iz%J6i<7I1GXuS`jiIx%gQ1H>Zo;h0uprXtUzi_6 z!`n<-v6Ao+CFu}|nEA5aDKmE|3On;*Kh)1X9DyLQ21xtIus!d`44WS}#z{q<_%tW> zP-q!esp^Ey9NWurm$4H>jXhUwEPy_zbcS$}6qA)Y@FDRxG%$o;vSgXB<3LzO$qz87o^ zqlz|BE-=mhY8S+Y0Z!Vr7tO-%>5Fje#+!@}avLIEuqYkjavd__I3fhYXSNCa2Qm5m zzjz8VkWjUuJ4U2CoB0#f*YgoGkQ|35;g|C^A5lf9Lxv5TvM5W)~460h|k0rm}@ z*Q4N8@EBqRqTo6!D;+DWtxum|rL1hv^~~HAT*JqX`v#ar>H--TnnY3{x;XVt%F%nr zvAL3ZI3Lb@3*k0ejUXFm{mWIH<*vvI6=bI?C-=04$&hqLALKQ)csf-*10|Z4fy{O;D}4{8u(9N@c&0Z_#{NDteOAXQTMO|CFnN{Lkp%`d|A8|9`Quu{2_^GO@R%W2R@MXQ#I^bn@v| z&S0GFqFryZ-TEKB`_tOrcBbFF-ub15&AF`VfjB=Z+N-JPFgB(}B>@5=5CkXy2uSid z4FmMeA2$Jr5U8n$I;bVd$>>Qy83+jGH%J($Wdf>%XO&M5v7#69JF2?DjrT}edslY_LhRW{wu$_cfwJuyv!##zNh)RJ$QYKKY)BM-{8qy z`b8Xi6hKn=71qdH-(p_){k!$fkb`9wE>8vmG(e991a#7W0H&*xLmR833pkIlh0D#A zVI$;oP(!(FVx(z}Uenl;EdR^F*z)+tvJHMeE|4u53^t4{OW1H=bJT*)oVLXb&Nd_z zgtbwtC!Dxf6p&H1wl&i+WfipKhA*O!oL^6Q+6L8eO6AxpZhg;i7|*gp!VbQ6?}XL zV0=|w?SF{Pt3O`;%JC#-`+b!dOi;SwRR0@EUE@m@M2%l#L$O~Y8Yh@`0zSQZ( zwqHZJEaMHCd$*i~jl*9Dn3V5!z~%F^zFgV}ow)^s$(KLvr|_u_SMzYD2wz5!^>#=# zM-Tm(?qJSgu8^)jqWPSNF|wMit(l83GQm@rECke{(pIw+W2;D2i7K|yIv3wXz#oe5 zQ1LauYEnzZbXet}kqnve&CLx7cTm7kJs8a;clu~B{gXBJE|DUb2_u|c9UAMJ>oYSp zUfR&Hp%bOG*-Y`&Ywb1$lh@X#QH^SGIAwP295l+LIjL-`@2HaulcNicys2kp<$v)~ zFPh&nYKyNOO&wkFtw}vIG-bPNt|}dE6*ISI`IoKd{&`hPS4UG<;(I}7>7ts(kAE37 zTvu2hJRShW`}qjGHm%0~W7!ISzKkLe;I`+d6rc{(6+^OWrDjIe4fzVfPnC(unG`ZC z+|r@mNNLlKmolI)g#QoN6ccUxuLVT2;Gu^e0h^l6But|^TNWMFLN^sHX{zd##>`Z= zfy~gePd2gvy|~aA8FrhymT-R*0}h4NYObx4eyC|aFJ5vjmhnfs2}$;qNeFi5~d{)lLZ|e$t}zPjupS0-$6^cyjXb={ubu zq-lJS$&3DgM3MeO^c(G)-aZg1mNLB2T(o#OEa-#s* z%K)`gbj99+XoD6K#-%C0#7(C}cI!NGvC^H1qg1bQ=KwxN`H|ARoa|n4-7`**EX=XR zx$Bse#6|U)oe`rzYAQrVkTT`j5H833CmtiInzRx<76|KfLCX%vPEiKa%;k%lxpU9 z28m>hV#h>{vs8`Mx0V|z;jI;9GxE&8P0f^V0YvP9yzhB+k)d+agCm~ipwAAum_M>4 z^*Y={uO%DIw5o?%VUu6m_oduldeHcshy$aL{tw0Y3BQ~-n2OrW(oZ*g8 zxmQ)_iP!a~5LhmoMkv2d9n#Dl`_V^jvPg4AV+xjM z^}Q^9_Q7$?3XpSd4uGrLy#fN8{cf)Wud;QS<^toj`WCKVYo{21X6a)xKa+H48k zVu~*C>QP(Vz6Aq#Xe2|)C!!VUsXcITm#xJ~6ZgP~p!?Jv38Rn0&E?rErRJEeNYmoY zXZ}hB`2|+Gi5G2CjNBt#0|7@Yl5p324?w`ap3zyQH|lB4P?~~T3(Q?F6ynbKWgwmW zIEZbyDJa<3=;FZFO+zXXXudE_H`%6DvqKeHa+_`Awa|<;SRoem>Y6KC+gdi)7xd*j zcKHmvCgoq#Jp_2hA$p&l(BtK_hgi2uuGLgRj7>2GpH#Bz*RlRo&wh-(i1m3Erc7>v z?&>>b{I_69zeoKVsJ(}Fosn=WnmI;BLBXDY&ojna7X>(*gk;`ku>imy_3N<2;YjUW z4+-7BV)tS88J;n{UA-KBg(4W&{~rG{?`>kW>gisd&FBjw?@*z<%m(_%*HOYFmdQ#2 zut}%I~xoWgy?0+-jiBPI)f<3#E#zH|;3HK#8&_H+VvZO%Xh7Rj;Hs8W@WvFk(@R0y z@sEPGr-6qiuE2=4XV56;kOvm>MBsrx@GAW*Q^%O5g}LKI-OAL9T;0ahOI+Q~)CsO` zf9h$b?r7>6uI_B=8BljM^&C@o#~;S%vf~YN5-w!huF?6>nJU7AmbK;LaueNconuq7 z!7A)nvjcWwTg_a1yuaT}*a_#znTiE2A1YzMX6PS>cE-Q8vA)xg*3t6jxK* zoXj~#fe703;p>BoPO^(L<{uA9kxI%~GYK%=_IXE0^x2Yc=Ku159i`#VVS>G=fHP$7 zFl>W&uj2bEAqfx||{@`ZDsuQ2p(F%50 zk+SD|_8N|F(WNcT&ip$qTb=4fHY_H#X(q$42f`l8XWpn>a39`RMXHS}MwZ%;nL6VZ z(}J*w8^=*-1OlmkRwTn`w;cL1(K_=|7B7o>8=XC(eKvLB6${^IA)ftoyw%W=+FxYM z%R7*+`4AV(8`3Zyf-f1}y?0!ZBuUO;FP`+fxHT*qc|K-gE2r3-bm;QHOIv(60uJed84_Qy1TnWo94?^0ZiJw~J{Kw!~WbR*gD8B5j zka%u-G!Jm3Bh9nCjRI6*-> z>13l6%cIf)3ml>{i|kUlgT!QY5n|GBBX*IJnI~}1l9$rvO%h2W#95;{JlkpF#WdL( zy6AaN;7HbZ;cv!@wKvjte*N7C-7Ff0$xsQw^f12TB8fpzT2r+H@FwPZM$o{+KXTV1 zJ?Q@K#RP5rJFP?-QwZ5A)pS%X zqb5lyPs(|`th`dIO4;dbDf!=-;GnIbj|x@??D1>^Kge}ede643Bk0i_{fEv8_rEjH ztecu8V`RizlwA`%;MDX|uV7_y|CDl>m-t;9@yQulCM546smavN1drf_$C?%qHK^?z zO6LXzFB!z7`9&#v984|($Y~M}gO|Pwu}3rLKr5_A1Mnbg+<{STMho)ZcBj(xeXI2Q zkdEE|0$v=lYl>HGio%ext!4%uGl9SRmv);t&xLoG1(!)7H+plHZE-&9jmRLT(iuw;uV(9)51V zBSDM2#{MpI;9<#+0s|42m^1$nWDf#GT zAnw@Tx>y?&>=pCGHh*5<6#&|=SCVen4VQ|lv(RQUlNxY zg#?}v*#5>AydbeVgzRG@qBlantW!KzJRr))LKyX2lz8HTI3!HO<^WkP3-!r2ETFh6C@ znSY@EL!n2C8Yep~OQTQzK>n!K5765FNx+Ay8pwW(pX;z|Ige(w9{QJbZep$5$!j%} z*1vwcpz2j+)|vL!x)%<+uB*6}ZFtB;j+K00iXG>0ew{P6Ji;&nnLu)F0)xYUuP)y(X<9&L$k(%?}lI@ zW=R+@t;OY)w{um_gR7t(Bvfi)J4*+68~*d)*#;P(@1Y)>mS~%Uk%fIo;ZtBoe3%dj z(~{9fK^URnC1fmUInKSY@TJKGo$piWMV;0v-yYlcR&hHP+XtY}V#j($|6nXDw%ZEF zqsWPqQVci_e>`>Pt+Bpnv(!DTQQ1r6T2m&xWn1iB%%>)lw3)l;!se7I#L!&6nWhQI zknGDtlWuy9iWYS{k-I(_?ON4T0$n zn`MdAr=_7NAZb2vQ5q_^YSvk|QJug6fLB1s;k!w~Xk7kD=oFJK--v2_{0dH&L$?-V zEqqhAxd~@DxNDWD>Qa1(UeP)8$KZv?yjk2YSzB`UyU=H7?j+8CmqvoV{EYW-AvBX* zEhw7fO#*EH>JM{`TZSC_%elwXKWl&Me&t9p6c{KtrAfoQk(V`lpaXp_PVjsDfp3d{ zqOTYr-i7+PI-VD(U!LIIrh9utz<>m_v!!f`X9YEyfVML@l204Qf zSfJcH4!DQl^)lFeNbg~A8{nyi*+V2H=h&Z^3zrF$F($C5F}_%rq^$EA~Ma-9y2m>&X?aFK>~Qdxh4QR3R+~c@gZipRZ>ybu(G0}s-mVsk1=gvt7g!47(nei2BYHz z0?+zmv*Ktn<_mY9{}D#R`X9sh21i%cUp_Zxz?R|L$y?h4{F1L=O#k{Z8UGdI;XbH0}Ld&fuLw#(f7*U z3Bcj3=Dw_tg&VcaqhV}D-xPUHB)uj%(6X(S1v7Z(l*qfMfbNu>zls>SIu^!IoBua<~102;i6&P#6m|?j}_f!JR7ZMCq`OV z8Q11NVqy-Ss`=Lg$`ROo!a`0~WU)hL!c%4@_@`=bm&6Gas~(i;XK0QUy2CbMsmpM9 z+!~Z-eWg z0xq}=HN9wI$JTEv^qNRiI1h(?prG#aX!$O={4W$}UmOD`v~ zsfZRBIrn09#&-hDYfDU{qfSw%9i6eCdr^+3?2?ix!B3~&yI!91Tyu}zd-?BQ0)o(k zl^}PQUtFdAIHlH43a#X-e58CFdfHC zLaD0q0*eCTew0L2Lm2}%^Vcl4dqwM%l`!&!#FlrJu-)&`J?6@-FX3zebljt&vhB;O8QRUt2qLaA5rrqf8L?B(CN9c zJxf;qm69B3oMPr^rWanpP@Upr$>1Y#(IHu@Pb~P{on|%M;(`*pfpoSfR{Z%PN3Ie? z6aHW&gs2AmS;s3Gfh;Vw0ira5N+0=f7w`UXm+AK<5?WwIv3#k;m~fJir<0Cv=!$2{ zxRzZyWynn=(^9m&hIPQ?yjJ85B3QY+jtrsdu+BZ=FOCe<&(D}T#L97#OtFA|4ZYNs zgHki?!e$3=$%Y({=bw_lyMEJrgEu&R%ZHbEaEMj3{)I|&mJ*S!yIo+%+@2U`+Wfe> zz(~Wir1Guard=--_KU21(R%4c-UbSR1Iq8xfpglew5~ws7Y~5W5wfsE)7Jp~j*=1(!@zJKEEpB-fapb3Tc0E87>E8h7x(!MWYtG#37<#~r$`TI_n$+d+C29m2)jnLz3F zV4_WoB)zLBqsr86C*6!&+++3{i-*$RTW;mH6~nC%C?EqN1fYOV|JBUj)LoI!iW;+@ z6X(Cv>z)AtLXyl8VHvzIK#_*X2Ee){g!|CMoCV>tKwuQ+PK+2)%T==K=X&n8+Nv@@ z?3;Rp2i8ar1sxG>73UXjYi(NfTW-J3&1&7*tM2b>-&Zzqq)U#^;rnd%+r77uujaoV z2%Guih?W6mt-!(`{1N5x?D#wFpkaOwhbfX2ggY3g-JE?Ix#Pxc>%WeSyuIThZuY+i zjK4zZeet}WJLyJeD{G(`0)~zLMhV|fKzXmSxqgUL)4%7EJ?Gj*ZH0%e&wxxo>=Tp;uF?y-xmya9fsFZ5>d$V?^h#t=Oq>Gk}1kuFh zrA>JkCEym{MkQj5#fRKbdx|yj^d(D=vR3u-I}Fd1iVD^@(R+zv+VaU z_%z%??bP{%sM$h6+Y{k3@7(T?C7)t(=esvch4(Ziwk)wMbL? zHxbuD__XACZ%@{IygtONbuo)!Wx#iAeqqV5%C;v<#TNo_GD%TXfdCVrVnU}YjLW4N zh@i*{Spx6kbaPL4Cfb(j1qR)&sY=S&PesW zZ%@b!pWdh;t(c={i*j2;N(^o7^BEV5rx<2!q8`yyG}}dTR0X#-+0l7)F|b!;n8Ysw zL2jxXilH9Rj?#1_M`VOzqZSY+i%=f!r|uj4vk0iZK=$@23PlKbEmxR|R*TwTQpdPC zvLp6k&I?#nVu$%arB%SFF_yHCveB6@s41s6YA5dv)iM1hU7d5Maxx&fgkiMM=II(0 z$ZpZXpGsg7A?gPo4oL;&=4#xR66ho>zpyD(Qf~}~fcMjJ;sIAs>Wr~PP(v!lqU72Z zW)5+7k&>%iU=Jj{!Ur=V7F~q%UwgBj&SeFHq#c2#nOVBBO8omV&4I6H(dP&tJWrpi8}t zofZlMf+FNQCb1R--z#SvOy} zuCg$g?1(Oj>KtH+jty|iR=h1Svws&edNVw-AX&h$~KR1ndWr<xhWchZ-=MN>=Dt8cu}M3EY(jMd}<~st~4{udkyaNXvWh`MxCY_!z(KD@QgS;+N!qS;XSCLR;B*MLVQ4HY5eq@E~y94p)7U`v3p!!3y9>X!y+ATSVV%j1z+sB&?xw(6qwJ^EN zF47RXT67<9e&nTBSzF5(Rg;&WVL*6|uoCszH~DMRL|eO@7!1E)swuQQq$G3T+e>j~ zJ3l>_Ea+QTU$!pTHiUD-C`&S$g&s_)|2foNt$@)$Ro*u=67$|ooFbck*-QPZ*na@g zC)u68UR#{CdK%W4K5AZlcLp{f*{!iaFT5sAd@sv){61=nG-Pftr^Hk=%tJh^cQZ;n2hHnJhy2JpP zf!oJ$AJk}5^E(Rl_e2~>CRBv(|A68YGSdD|tONB(ZK5vQgpeaLPw9ZKqA~W|S%={b z@NaWz?t4RmCa{gS_0Gva}35{%yS z4!Hj><;e#qmu+bY;kk)--F@fY)O(T5VyTueiKf>N4KdUu@4nu!$YR6#D!*FVG{|B zFPOr$G*S1dwD9~-Pr%ldKEk=V@+y!5ZE=mb#Z7j4c8)FAxNN}oer;BzY{6WAa|!!x zZa<^bb@sbX(#G|}twF@ft4Cd>^I^s{8eNVbbQP4q+v7B05UY6**(^?*pQJrU&F)<# zjdKjQ%lrVAeeY|SgkXk#KA!Y~RutA`fdq?Bp zV#;z6EoEyyYr8V*Ye85)|84lgv^@W~alLgX%)qIdYjh*4q12Zq}OL*(`ymg4qYATYNEX6e^AY>ke`*{6# zmIeObnOkoWAs5%Ms;eZm`|#;@S9VNOog|R6YQAOu)CxB)P}eRovTP+GR)D#uh-kE^ z-Xh0hjf=okG=#p3K;t5QZ6C3a^0+G`CAOzv;wn(wI7zdEjAkJiAF z43eZ?-N5NvLQQZrGKcxaW^FNCG|pGp86Lq-4W^yBP< zin1CNh6M``agFIamB~KLU&7NP-gEnag0tNyE@ZJ-;>hAR6Q-M0DXg{hFZo{n0GlES zv!8OK0wXkyCh35ta_eFCYG6XO#27E=G*Hn{4J&=n%ayKH4kIeThyv^aWS=` zLM;?LUCtU6WQ$tLHq}l{4p8Y@!4(=M?ogdruhwFtx)NK}I=rklP=6PG&(%+HEnnA; zQ>|I`5u3jYQ6QUIKW{ctg(T*4t!$($qCTqx*`sM{i;Tw%Ru)o$8SEty^g4gEvWkBD zR5y|3Rp=QG80EN(36*;eBW}pu!Fn80Sq0=lc=m;KeRgc}o~~T^6?Kkb!S@Cb|90W! zYK~Ig8Z8s3RtQc}YGG$aPy3qS=(7a3>)TTDUS!FzBT}T=PI2{q5G14|Z@zVCbfm9? zt8S(aw&Vk7*8vRcG5K44nlj-V4+*z&ebDp5`7Un+uIG*-i8WjLcz*0 zt3xs5_3C)ILBG(r9nFm|`?BKJu}J3bO4FOzkCEf|o_PqCQ(1Tv;u}51q~9=SI_fLb z`GNas8yOM?@ql}YO)8=6Q4eB?IrH`S%s>a!Dn#ZY*(c(z^~DO%#eX7`qri&V&{X%L zs;q?+ePa;lce443eEVYhHyB-AgR}g?u3N*8??U-N*J`5D?Ls_ja|IbZJX0o84q~gl5Ju6g{=idCc3^4muvS;C#-I;wsUTM1ZIAUrhkT{e}dT-FWa|$ zf=0Wn_!V9W2)?RsQ`EWza?sxKz`gOnVdHNhK#(v{j60WKuP1gh_<6gHS8+RQqYm>{ zKYqg6bW6_L9nzD^YInEQ#+d*`k!=&`W*J?cS=k|waA?Y2jA?a=%h~_g6{E`)+2(sW z5t`d?qXDuuz$I{>*_4_?d4-6~T+H^>t!45?50c%$0-T=RAW6Dy-c?WqANsoHO_wjU zih$kF+xVdT;0DE{DvM8r&2%sDgMqDs)Z5jBK~kAY?<&*f8gQhQR_?%A!%X!UKdc`v zz*U}bP1xgm1jp&oWzX<6cZwg5UVO6K%y9nGA@uy7Q(^YSE%X13V<~_MKg*%r4C9*u ze^L2 zzgj;J%S4>N$@n8xlO5L?E#y_KX`yo|0EHSUKayi+}YshiFdIxTC-{5=%pG ztUJ*m-jT?3i;3PAlq*-EO5g^t32U8AP}JvEd&vjM@eHv{^_WeM7@x(ce#u@EBFU>9 z85oOkIKW;k@$NBv(SoVJ!%s?la^=7CG=`ONf%|}oFMJx!A_1Z`NTH?404=Y#T>0IPLL()2ktVhWRF(Vnd98y*13t* z(wRA?A~OS>Ynw$}h1LNr^#ZW|&Au(0gx>nDW*VIwKsjP@=xumk!XFKY{^#<|a?1nG z*9$0&`72eQTIs~!jAjxR+3&&|g}l1zm+*yjxfQ?0_d2|$PgZ;qSbU5Mvr@RaZSTXT z$Zl0cUMIxHhnqN+2Y^?8G=uB!sIcMHr}iEmo_Prze(2A+>L2h-p2I* zgqZXHwLNmr(jNznN#YRPmc!b?h@@BGvz<@CVB+IGKC0Z?BOs=5z$2J1L zsX@#90Rf+1j(M*-rzJnP>Np9&LHw734sd?ohAMExWgoAjcWkqILB&@ZZ3LqrRdCIj zCy@|gd!plX?|$+~W;sO4W)~vZ{Me|m@L6Y@w8x?Ed$tvvW?s^8DA-nTBp4~U!Pqcy zQiumaVa9fpTw`2Tahiz7LNiS6%Q?&8yb1bfq_8?e}YxENhnT%$c^( zY!#+VQ%auK=!X_SN3M&f3MD6q8he4I0{Xy4?RI`-CmYbsiQ-n*GJ44rf822IThAD+ z_l_vbb=0&?XG}uNCMP9&(&FvRm~|Hi&CJ`nQ>jp;`;aT*|2E@w&Y0hNBKjxcH)~{4 z9eWu!8-8^5hsDP)Za zCzrN+L%bdnsC$$g+l!0#@`HudEMTiTg;*&@Oo81>*8UY! z$E7Jh#90-ab;mF4XNa{LgD#-qKCFOT3b8!Glx= zno`cVjY>|;9AAVBKfJw9#xB2J8QkiDZi&ofuFK9Jb!o1Kut#e}-P7D&syfEp(b68P zIki5U9ZRjC==U!pX&rIdnilOT&I_*RQ2g_}F>)p57^6_e%@5fPu#b7w)^u&#F@*29 zjX)?1zI?*Omi=#d$-vevn|AgoU?R`JOe6Q##)N_hV#PlX@(`%QSp2ggrdKE-*>`Kn zxB%bT2)FRgsuQ`5x7CX%CGZ3ubgI|rx}PCYKf^krNJ~pWdPw?d+20kC$GPoI>+k4rs{EV88}kw z=i6o^$p&AxT9;XMBOe%ExKIn61K*|kd5;3}3*Pn}2KZ;(6ltb$3NouGIbvVrvf>$C zo-bT1i&w@Q54;Px315p>-(`lz^-y@-N1lS;_lfI^2EF00Yk}I5Bp~K)L2b7d5335X zPPllw5s7K?FX5Y>=j(smZ?~IC+8|kS0);XCk3q2_uIDyBsQ5oRDv7pk~<4+bK{oZjr9; zYY@&?a9~0{;4Fj0#l~x>L)b)8#XqcIFX2BI^VRXgNYd~QX&NR8!`ml9TSSX!%o{_t z_zD>)YNntI?$#c{JKVd^!q!XD40KVggL(!y`Ho!B9XZw_oz?Oebg>CKo5$4myY#R9 zAXQ6R@1)3`@YVf*f4HNWmbR~le@Tcf82(pK@GC18Dh8$s_N&cjt?G8{_@gMl1OM6J zr9B|LJVw?&J3l_eTA)T~c`Y4i1zxpKb)c<v z*2u)K1U_>Kx9q*Rfu0hz4GmXb6-FLJae`RL+DUBEObM!9@St}aed1Ea8hD!k_{QPu zw6WUTnH(FL5gi(6h)pc(qjq;z|0jN1%k`L{D9jlWhUVXZ$Ke%{_DAo~HG9CYmw;D- zdcq@=qSP&OKR5OktYHPFhC?t7Y@$m5VdOMIM_z-4WDt&q0(J#@OAO|tS-F^J$8=jSCh~j1xNR13 zAOmCGAlmsdtriOTG~n^_5gj8~)9^Hod$`F<4>tJhW$Ke6wF1qm#6#&jW!lq)Le9+FGF{vuh)2|TO9j@GD>ri_T)+Kd z{faU3!K`jc%HnM%BhcJmE7y}6dLZ_nx4d5J%4NdO>hl>LYqc$YxAHBg8N!O=0*fVZ zDs-8f85w`LE{zOJ=M=G7w=Obw4D02?MJ`wf!RDkR>DqY^w;5zeJuVtbp7=O3tWWdt zZu3AMSTkmj)lRa7u3yntp%zr}-3GF|W)cZOf6TiegO9buK;2nIU7+?Db%{Ar-Ln{K z|AfF6X9;7Fm)QPdq$7K#jd3Z;Kg*cxByzezCC!UJ2?Z)db-DvXp%U@mc(SDXSRwh? z&!Mk8J2Ni<1--;-@9^~ze_nSe#NWugfe@tULe-zb7_LwaH_qX5-d>P4#n8qmu(1nZ zuHm0nkRaM*NG;L<4&|I@eVD^&borqwRGM+@aY?~*S%fsGokgUdMdChMF78HV+k3vw z;Yjzh6w;G#L7Bd)2DXqfq5A46rrN!A6Fo$l%By6$OR-L5_9fk-WWOkH*za(9%yjfl z7CNrdeoQ_;HOm44^BhIzC@|;BJcA53Nn%(P6j?@rT{#C$K1^_Ln`!w@_`;>sN7fW2 zxbms@=%1qV%U-%dvzV&Khx$)zyi;rf!D}KAZ22j&609(_zeDo8B9?zFE{yfk+;uO*SY$His0FMh+Ibk^wu4Td-Mcn$b541(PcL7Of1V9T zj<9-t`@g6h(wBBDLbyGw)_8@0A2-%Z^F)oWj?zmo`IOwVif8d2 zmzb(gjw!=BqyD(4y9RE&EiITdXm|@5-WW_DO#be*Dtqbo#UP*M(@*%@q5f%WY-d4Z zcKJ#Fj8R=|llUY0PPHVYEyGr|R=sGeN)=$GjRviUs)>xe3sRoMt0#`UWYHzHj^?wf zFV=3fF#V~9YkU*dT1xt_J9D!8k?U{g^ug8d^E(8qU|9O-Sw-|XgmUl>P&18l27W_q z?Q9O?Hr^m#BAKFrAgUfN5Q<+6?@3P)YS}`&0cNEg@hD?+9Em&VB{+YNH;|nC*-Vq8 z6~PnQ9zMss<193z4e6)b<+j{Kt*e&o>|+L~8f%JyC7#Vh;V%q+&e>|WU&w8zW7W8? zJ56QK?_F<+-jkPo$ybK-h>U1?MyQJ~UBO%wvqK(H3F}hmC-oy|>)nh?4Is)|4zmUt zZG~xOf&qr(>tFtmLUMb-ny&f5w%%HxN*r?k=`q=I+R+&B%yDGH0$0FknlU@V__52p znKSIG9zT$J$ch>*cr#a|csI)wEC9x~Yk1ed5~_D66=643&dZeg=wn80qpYAR8^#bJ z41Z*?4;qU}BO#zWJV!@IqW8BUb*e`U_0ehfzhac(36^w%+k>AaZ8vcmj7c1?e;31@ zMb$9i-3yE0VM6UKY;g^C45evm##^DCIG!OLhChj1l2c?`XcP2JJW-Fekx=g?iUYdl zH;F6?oJpy=a6{Yi1G@icY>wo^-(k&X>cd1PsF$BXz1YJfU%{JWhzc=P3z1&n1SKZ4 zoiMqx*c167Qcos4o%EJlB5%NXH2HJccgc2vICfJ3Z)Pa2YPuHTC++l4EYAefn+L@H zOhP{g8ruRacu)SPnZ32Ol{@|DEzT=HpY~YXNjH;qd5eosWD7#1?ArTLXoZ{e;M7nF z3Z-OpYqGh8#bsBsx(En$M&I=$PkRG?gF5UID2=x$aRgD0=C3XZCdw$3Cu{w@k9p2H z^&AxLKYn`+ptLNs?GQo1a26G)sAOr_(g|aiof7k zB8FIB(1@Wz0hGn?nIe|Bd{0Q%#jhZY+W;lTJ&&8FZf$ed6CH-V@)84E5!fjN_Q%V% zpUrDE-o#h;CqtsgdwxR}^+17K&ujV}sn5S%)2=Ktf3BIg{=Ur6pB!B$(?L?@41KDm z$@{k>oNsUCyA~JX#GsToJEpyNnC$XTkKw_o<5lhjXXkJwopTKhyXz72VYM+F^N_0W zQU5`R-Oe~lGM#S$m1XZ_GnK%W5KwZx==o=cqG2)iH-wyV7+_yN{ua{gWkY}FH2BrB ziGaxVU4_j+OV^h}0f!N3g4}F~5Dl1BF)R78$(a z+Z*v0w3vSIa( zYANl$*w~{%8zG%wDyzWffxtrlqp931H(bQ%EsChUn2R&p0iC_#V%2$Z zQa&BpP!DoAzx6?#vY&)ueb%Fgr)Z8<< zTYY!zZT-E7K~#w8LR?SOG{xN*)ANJ`If6mGaRkw^w()bcov3`xpBvM zrH*!>k_CzxWqc!s6{ZxvwUL01v$N|?oAHNk3V)cbNDI!N1J|J#6}gd#SXa{opU5)O zV7woi_P-SLk-u(=P8kXDDMl!KxuEte_&VoePZ8;`d@|dG>5|%?$Q$OgibW)=?PPCT zxhHsNO>V5kgy@p_oMmxLO?eMih)>NK3NfCvfl9PZ75aJHga4|04*_8*%^_s>uo_jL z%exg>$Q)Dg_+K)RY4J$W?i~c`sf{OK+JjI{`SPVpp_M_V{){|#Yhmvz*rg(b5bYg4 zVgr3O{5Rv6W`WfnD@^lrELoAZB zq>&?cLqQPTV{)E3H-tPzb1G&uQpO1o6Dcc}c-08^eIBHp3qV!LP+VFu+=~S~bmnv4 z|0S`J|Dc~>eC&l9Z{mts-Qh24P74eP5q}9FN7gsBel-C{?Ww5Kw4JTn z)f5{izyrex$6qgCiKjysFuj{3_NkaQN48#Z6A!QBJYbNa{2@W7{aKUZRo<(5nE^kdVN&8=pt%FfFMIUEas~CT<05tkK&9we2b0g}jfSuh5vbV@HMQ5P zm*-RXTXLv3iigLjxiB*V6rrb%t?P}3X;lkW!*!avtJ;>p5W#Xy^{<79M!?uM4*2i> zuAHM3^;<7?R3^56OV0|cLFoVU_CWqtD+(#`MDknu%=M<GqY{w#K;Zk{3?2)ViTOR~pgQj7dOuP4K`O zgR0q8%0|zsG<$FbySC;g9ftICAg8>+OJ3sKsobK~j90Fdm{vVwy3J%%bMs`vB%hDa z8W_0Y9&T(w(fx1qEt;y3x?)Sc&mb>sNcX5lnePH+|abg=v0SYO` z8{@%wa@ZM$geS)gE4E=(5fnjSX9NXY9ytoRfovu45nZSB(T{-a5M>+ig&UnGI2^4n ziuV757r^le`=cB|Q+TZ-lvJ|>H%xQZk?$tsmi2qi=LKl#M&}kZpcw7~2`$5|#AAlY zL`v@^<+n_7^Zo^FRI2}&E5Ij~keo0f$xa@XpNuD02g-4IN|%=Q3TZ>g5gzRh&&pd%QP3#N+Th`-*P_#aNqienUE^PdXZ1oi)}p#S%W z@GqaHD(${4g7P!gSiGTzbe^j~fdV9ZgS7kzMbaXh3!;<*&LJu72_lMV1ghyo+NrQc zvmuObqcK#50~B6H8=cowh;x8Hfb|2=aN=NIGu2k(G%>j-;e7Xfd;DqkwamZ23*>-f z2lcHXNffF2pdo#X+LKk(o)qNz&`5~GhMFUN$fJjx1})hW$FAgoY+t$%N&E29#$Xc} zUS^;jSZ5#(XfA=WMz3zEnobkV4XW&{d&^{^bBmGHIf=X8P#at73Feko*lnO)SFX8N zX13-5^tT@$ldC#wm^Qw!--5gQy%)FJiKw6K)r=zYc9O(cR!rz|f{X4cS^m7n5OYs5 z?34WVlC^UZfqsJ`kO zT>fxjIm=VKew7)f-K3+NU)f$)NweNvzPsd9c6MtvooBqkjnuWwHZk*Zg}+~8Sw>xD z=cKEvcigq=7)W?#4~?f~lR{C`dD``ii;OIt0@qY;k!q*bipxE{Cdm#O=;KaJ@d<`m zpGAigLhnI~(*}l8lgW*Cwwe=#XA_NQ8wJ@Un^V$}xbQ2__-@6ePk0zgbIJvY#}LEP zRCney<_yZPWsc5*tM$Hbt{M-QKz)$=S@-{93VJR@JUmjn;9q=x~KHE9BNve=0eGbW!2=>!TnZ z5`r3`LA|N)#!!UywU4Os2A8NxAC#h3!d32TqmnsFh~mjnGN`EPQP!y{+shAGPE|M# z8DouE)*|xCNjKsR&!iuT82HNb%N8O$XM4&bFXFe4_8DT>&4`(+*YzsYYBvAIvSK8n zfal)HXdJj)adaE$AM#ZuIES2u{xBILX?4OtlMO#jjnt%eoP;iJ>KF$8!L2~vv>&f9 z$R;C%W}@6JSu%8*YYmw!A1Vi3pgSh1Q|XyHB=!rbJ@gx92oQAH=Zi6djZvH5CG?>v z7Pt!*f@?NIAP?n{!Hb_?qxu-OxS7#|m}<0+Fm+y=e`tZlD>LWs0L5Q=B9?lB@^S!+ zUz~N|g^fQb?{4>I6uc)Plp(qbKC?7!CTrXS81n~Qr)1|#Vzk`u4>24&OvCGu*c)OO z@2|t3BTB!L9Wv%jvDJH(8}C!0_(+!ct%Pu57$n^jLq~d$M>3 zh%mnKa`A^IeStW-Vdp;Y^-D|k47TbiO*Dcy3l!brf|%%99vOy(*Qux z;Iib8(&!}^xQMqT`ruYD$k-QOo?{WyBX%Do^N5g?MR#yZ_=3KGcfL78oLjO`$%A17 zCjJsnh$R>r%f7&Y$(TEUg9YWJC&E0pViadRUd8MQ*h@rTJ1A#5;@1Q|7zHexzW`-2 zjC+XG@kyA;>Ac&5atr9ctI)IskMEa6K>x@y%uc3dpeQST(i@9RCf-UQ9o=6v_yhkp z8p0lEV&?w`1*d`j547O_DgUsI5riIOKoI@4VAX`n>8Xh&EAD6#+^Vnh)nL7>gay1IO_+uW9AaW#W9MAdy_Uz_g=d*kbNsM#>wND8kZAKlKg=2`?29uKybq_ z!&>KuaqR*z>6m>`hWHwhqlf9}&sx_sy>DtZV z9+lDyQZ0h#gny`>*}y`NMEysG>cLaC{v{Q z-eL5`6{KSadJAk=aB>X|yAz{b>Jr(FhAe3xXsVc!=H)mWP;9~%(+69Cl%7Q>*{uJ> zk);m1Q|rO96Z#rkg+4Phom4=`h2P5Sf-2-@f9sHOE3 zsO4v0oa6}qC+d0nGb4y+i&;p2ok4cjA_o2OBb;|Y37wNPLHHt}j;hz3v!%blyTB4S z>sYej-e+LIbk4V;#@rrDj$ql6HbCG6wVUA1lftSP=4vwcat$o z{%XUPp(iwAww3TI(H1s>u+kh~pfK4Rcm*StSOoYL?C_c_u5r#GXJ=6Im6XK|TV7Fz z)QV`BBQMZn+|q<=;xs~V82sgH*bo02*eG8(u`dYc!z`blisAYSVQrreeWP&b1ra<* zqhh9Lo@8%05g$=sl2psXggxabjYC~sNnDGgvuX-ZN#G!(PdH!s4UEd|`X&&#r{w5f zUVrBh<{QtmHNd$F9Z7W)%@rLPR~}#SOVs*|ptvAEEa*h~VgXaJ;}#EvE0I`LMPdpu zR(FXT_UqyY%c%7uGU!KU*k_dTFAVkzH~AWVx`|)W%s=!GT?-i5S%q~nZXjotsExqh z!2S*>?JtXqXMr>3ajMYSBS;}JNR7F6!tG0UO$%b~Zo~>oha9xpk_Vds2l}?p-#LgU z7!G0QC^g|{_D_}?Cl+GNFZBPRisSpIXbcVn1pgNZi0c0XI{w%7-|*3*z9o-iit;<- z12aXpC1hzS4a_ZCJhgZW(qq|yN>NhP+`JfFg3f*I*FSF>Han|yNqQ+A>mR6?jqy@Q z&(|zzzcBoHjc*Xc$jE1H6hroD5OX#?d;7OOdl^FbwJU$`!?*7)r)i4)*XIE>0IwS} zC`{S#de9QDXL<&O-MpQ1YNmr>_6XIE?hm7GaI|5FW8_)-P_r*-gu1l@YfR@iKra~c zR#~vvnqbIcx^8aOAnxmf0Jc?o{}hWI(+(||A-FzBLkS_Lsx*+<-eju_)h4_Cx?@;qQ|nqbMyr%q)_icB z%h#oNj{(kHLD0E*Fw^9W6D&}XT2}6g3|2XBns!#=D~2z*Ff|N{y2O0;qIJO8p0VE# z)dnZmAf%YscE^w}vDi||o2AISDe0Aa(%VMgR*a;oG0tvD^-Af9$u%}^5zLmWMnEJ} z*FkSCFNOMp^Fl@XNx4;rts18TDziD2Wyxt|hdhvt#xr}@s^29RyD0YxGw~~{gh(wQ z{7+Gtj7}+msjjUB$%(Jyorl59V2Ix0R4qfIrR?BZ6`07 zc7$o>$$Sc<`K8<}*?Hj$#3ME5*f`1e;cNNU3Hni`JRRPQA@J zJDpD4K5+f_Fae}y__mleReC1g^q9!=EiuX|LWG+&n0L2%n#E8`R>^**a|p!i4|RJ* zK^p?|m5tePj$szvKua32hwQ-Y;ua}0CTE#>Db7wJAKiswXObnS7GDZW)&!3st+|;A zTb1NcPuEyx%3}j%l$d8W;Y4FtW)dCZezWDalK5gb_d zswfEz^JLdD&Va(7U<{@CAC{5eAa`3Th269{FsaeTgcLY0D$zFEyNlA|ZN&-&CsWFt z?KyI7s{*!eSB)dy=1~1GahK;f09#ma@8g1)V(PUJr(Z-^SUvE9{sQ{dSHLOj z#N~_+Ktb6+?5d0}z?B_Pqn&s~VdOpqRiZp%6stm4Z#v{qR!8L}2Xl}Wdxk}yylhqc z23?=TS}XbUr9VL#pVUZ~_8bL2aYL8*E^r3a8%f@usP*^`;t&zFQvNFVJW2G3qM@Iq z>%LC@_|S+S7}&ic??S>i#3Feq6gJ0O<^D-ued8~Cwb2s0>&}Jyp56Pv`6Sf4*5nEg zz(mVnpz3$?x_4dpPR$3(TAjfG@7?D`S+*hfhHdB#@aPR=yw|HdZW)Ak2`1M>{}jRI zBjB4`AUDJP;9bT+ZE3_kXf=x9s~aHM6rgNahguA{r-BqY@B8_P4?alADZ|*(jMw(A zp+2Gdbaq0+KE>CcNmi#5QTG#I9LB*oj<=oRY?i&-B#J-@0S(zA(E!QedAd#nbjNFC zC?5JwMglJeA}?P-){6xjfC5%=0U+N(XP9TOjdyTNIz*j%e$QvixU*weg@<)%Xt+5( z<8Of~tWg`rC>~=F9%EGSA;sr#M*PJC(bAtV-cl8hXc4j8{ZIH`3&qO--w&DC!x=EG?>{QR<2p3G0x>E zPnM{wby6Fb2%3uwV%&7eG3?&{YkKfg55*qSyWAtZvPzILGJbL-`!P@ae57dH6d(k9 z#OSuj5$@qbw2BwHikG}Qup`mXL(kC5aLKA8yl~*Qfi^ce^=LqOsH~v=+;wwH z>){cKK)^~m{7GRT3?vYPi#GZbyC@%((1JkOo= zp`mssBW$Rk4)}NLv)=CI>yf&0*KP-XsC`4ARCvR8y6>P*e8+=$sKO88fg$9;=aODltPa-5v{}eeL&3e0rnQHY-(B zdPDjjGgsX{S>d=m-Tw(3-=Ro$Fr25LLJtBe1s-A~TkNiWd`o=()#BJ(J03FVV^*-O zL9cFRECh_SXnUon=SbxUP1_Y;nBarfI0>14wl+P2J-~2~v}6E5RL@l1nCl{5K7LFr z4mksftd%Ya4t&TFb5H|Eq_YfkSnvZSNO;=W{)FZGc_v6B-644isQI6vz_8iZRe@$r zdpN`r3$fv{aI?z=f;w7&iT62VDNq_+!Akg0poOkP{0PXiorfE>SZQm*LNIeE{e=Vt z#!GG&G6SB<&yB#-LC(N>^K0BY5^#ynGtM9tRs=27*E!C~OA+R2s|1gP_6;`@~?l#v5%iL+!{qlmbwNG3+Dv86@>}?3P$<`^owI|qrrqm@Sz~R z9t=o%<7`k&V`w;(_5N7$ytu;g;vB6i`bqhYQ&eNiCooHjk4HDSH;8@oixbokHQzVY zgpCO*iCkSTr7Ts&lBj5%c{pU+ur}?BXatxVgCyd8UFe-uz!#L*sXBSOAIYLJWx#LVL(tJf(8 z7GP4G z6;ddoU81-yh--TZlefk1gabWI+7|JOBU;6SZJ#_(j(8hY@J^y~0JH02%3A#_CX;0#Pt0fNK$$e53hi{FtwbB*rlLXu79>oM)|IW@Y zs?KQAPW38kwwWBMxaQL%M91xy@G8G3Hwk?+%z@2=ke{V6T{J7$#;c7YXlbU=YqbD-<@ zfVb;@2wLhx!BC#hdpy4!dBq99;y#LfiYxRvh?l*31ml{DVx?K=195<5p@#{YtKEvwmPnYv4Ik5H-s(p$3BS^=cxgP zKN$;59saC}wIz-m_Sj#*~5- zYe$aG87zeYYhob`&9#x+vb|yLU%iJJW;sBRgHxQJq5Z8@kUHrD{D^SHI9PJPm@g$Z z^_!4D#tQ_7f}7Ihaf;@VsU+4N@Z{W~WRZbKfXKq4gr-3DO%ZfjZ5*vh82iXJNlEAe z9(*FhPA|3I4@o%Sjc11s74%e2x7paOM{$#i)EVp^-nzd2_7o8#ykd8L=>^8%Vzvdb zrJ0ph_15V=L`VYA3cC4^L}uMJQJlP&YR7z^IPbceaD%K|EHBr^bi!SoR9PzNE23Q# z)Q|5MiX8DI4^{ZGycY(0oyG;Ip2fVyW0k@J!4t2s*TY2~Eu@2Y@yM63Rtzx~OP=w`Nf zwWfFmP4T8?8#>(q8M)f|v!y0sKK0j?`C8AE8Aor+jHAbxZKx&D1NA#(w9sL`8NzcC z3#Xu3G}DPXjN08e#R(qk{GY+1fYU;RGA#8Z9Jj5-q{mv0k2~zbH1l_g95Zs0g$ay2 zSyVyUR+UX)eT+6-*>xDn3zRd?bn!KdiuEbDw5u|BC@Pxc1=~n8n#3nCTcSxBCGVY? ziZ;dZLkHX+nV#qRJFQ^AABn|36~|sEsR$DdXjDxpDlZhtp1#Q74_Rf4`lQ-q=~~!p zM$j`lr&6@IeQ+Oa+we7okA$$&Hk7u{v!!D=8$xI))nPr&<{h#wcRQ9)lDWNsJC!_9 zASaF})ba)yk0ey7Wek#@Xk*m$1&W@SoY<8-< z12>c28fD$_cqgEsqVxw&z`mbz13JVaY^1s!Q2a#+NXJ z-kG7VW2Ef;UAUlT_TmHAv=|yH>(PRwJrq=%@npMt*YZz#?QI74cJ@#ozEYZtPe;=4 z|7!O9`44!^u*23Ja4$8bHZt^Z3_KQ-JYm4nLpyxaZ8o9~XHEgd)eG821^H<3I~aYq z!pT{ZR|H5Jo6$^JsBp~b5NMtjMj8(Dx636JqQJ6!fboA=sFUpFYOjYHASQ*)h0;_U z;++m1(?eRB@vcfk;G95RCWL%RU*x_*=cK$34JS}}7suq-l?})>BFc-0KS#ynKKI$^ z`k8V`EJQurX7J!PWA_`P#H|L$xA+V6$H~E9R>j)2LAn=)oZnl~!rP4{=tVLEC#-HT zpIG5aM=Dn9=|x~xPf<^;1JvUc+8%0z@1M(+BUXnz#_v4W-$pBsKR82QcIwg%oAe;y zWkmhCh#`e{c(nt@j)q$B32w@Jp1@ztYZoWSzq zL-#S&167X_J`~mup*&jc$0~|MS0WueYBA|c!zP|N<;gEZblAg28x(1i$s?MLk~#$0 zBP&j68pLN2TPHdVdFMSMd!o-{5kDXc`h=g{k1j`lT>^eLJ+MJg?xwUfpC7UM_g!%GjZJ`CmIhCi%zoTM!@8a3AJckJ*yFw8DOpXdh?AtZZPC z)6g{2PL^6?&H5xp!V*;=weOBb!AF3`foU*HS~xIS(_ahD5c|aL5WtC2RN54!R&9Yr zM-t$KD&%;DLs&1^^s%#9s+lNqFv{e3x|N7L#PGdjfx9?CbAdkWJb6RtR3=GcA&Qs3 z0Q|;S-T*{_I{HKyBez}Bbfgh|BCL8fFHF0^SJeZh$)H$Y(cJ|BuEdr=HnZQ^v{Z# zRkYHb&)-O1!&(snkSB_M3s#L6Qg=30TpW=FrSw@we=F0mf50%NR z_WVFRT1WM$B2DxYO&)YxQIw8LMi5r|Rtq$;$9*TR-I-R*_;E5V+8Na`t-He8H_wvS zb}e?nLX3+0T~C@M>+5Y#ddE!#@u~q3?t>*&)SN+v4;sYOnF4A47|REUTmn5nxHm-f z5jBTWe`Mp4Rfj}>EcKBVG|uxBI9X3yvgV-yoPgS~(2>`}E%AUgucm)QY@t1=cf6gT z;f{-3Y-ixT-qk zjdSAkYE`EJ!iiWvexihX89Wrbaj}JCTl=C^a|CU9d3^%xd8ARlWJ~VX6sD*CtL@N1 ztG;QwvC^@F#01}LnY!&TLS=|MFI(mVYUHP^erm2@at>;ao0PO})q$$yXDUl8Tg&ErA{e}nvidaaDqPh6=lScr=Gfm=qG7axMlPS?UUoA*m%gq<%lFJzUb_U;v4_JD@oID9o{Pl zAfO;5ARxN`AC=_)Xnd-DxFfHj{){d*p}{zam>3Dn7?dv<*~n<(*yI>ND3^dIuaC0Y zF2)o$@W$~J#fS|TYg#n9$|tkTh=EEv|FxAvcfzvKnx)kByLjY(dEU)ju&|k6wUzgu z_r2SByY1Q275D!=yZZ$yz{eL)7!g9@o%d)PKb9mTC6ktMArnI}>j_8ChW!; zrB)pO`@6!>J9FhO^iDVB8$a=u`5iC;FYG}Zf**R{8FHSZ)~M1{tXhq*Tkw?Oi&xeZ zq9M1Y>fBtcLS-c?wAOAo`$mfvTO#aR6lPb^Idb>9A_`6_Le}D`+fZ3bW%yePBCKp2 zJVb(;#XMbx+C(APDZm9CWmhRZD!RBJ^%W&$u(^EFs8zpwm^3iwO+Z}K)tQD<6E#xKoUK*eL;7u0Yf>hnLNij#T7ZI1>Qdd}S)tRk<-XQwjX7?I zkRE2Tp}4N5p#USl$Sf5oNe`tE^-%~`;-seQHk&fR#+A>!5}l=3!XV<(Ie8)Ky3t#P zVn^APPRCxpH5jSVi3lf7m`VnVG-xVsp3vsTQ%=Q|#lbk<4kDH}*wRz6xT;kFcFhH| zj;5vDTyH|e+FP!p@+lR?x5u8SUyRiJK|2M(c?Rc>bW3_KyKXFOJeIwVZ|8I6P?@H7 zX`NPaUaZIpLv<3$(DtRYGUdbwdmsWk#DP47h!cB&kqk@*zwZGXEaT-!5yEc#&bXUY z-}bkEc2Hy`D+8Oc(yPJAs-qx{c4oe!<+6^9R(a`6yi%*8TnRVarsBv6mVaPNW|uIJ zr-HYL=}wmiYslLppHMgQpzNI>tjdN>_pMP++&l)rR)&hwdcpkjy&OdK#gj_C;qFSezi7mIfoiNc%pDiX>qw-FPT9l)%s;k#HQ!dKsFIkHrO$D{kB3LP-RB#@b zrnT>Fj4_4@<%Ij7Y22u#!J(>@4w(pV5p~6$YS!iXl2nLp>p@jBn$uHr5p#gWm*P;a zHV((+>8iKnioNPJq3J_%;HSSTMe3?YDXSG#@>!1}K7qJXZ&KE4%2n~#prbOKf~2u> z1FtKCQiqR4uiBzNg+d9XKgbHSa86LxoCjxi8F){g4tM^SF+-1DlMkKY)A$uCdACN zYztGQ$>(hmj^v(DNauIeN9e!XVlJ<2n`Y{W(e|1HtH;o-BU_fqAFv0g+rne0!|DzH z{xT=EIovH65J_kutuZ9H;QM~#Uq~Wl$U`{;kw?ZA;39Yq0e za=W^>EmwuKFilIDzrSX=F~rk=Df(BIP;HHQSr>y)7^hB56E zNcf0sUqOQVU0~XqDmqS@vuqi#Tw(H_Vdj$Bf6!fE#5Cq!MXb9;-`N|SR?o>a4#+Gr zKSAQT&hQ*&NwPdy_k3dJe~JWuhLrg^5x-dXXw>O-NWZXj<*E(YCY>c^meO6>oDLwA z*{JjK<2!|3=fvJ=jofl)>TU-K-p&xbnI(8HNjh49ODS%Li=|*?`b;jaXRinS{_ZUj?fo~^@RF7FvUlxF;MD0bvSN1=A-MXoex}sVV*r* zm4B?QPJ!SPW1XCWfNy7O_kUux+IYU10%1aOeb;rTq<$7y zu*F5fGmz9C7Pp%br{hlT_G1pHKd=t2L^kJ!q2+$lQ!lk-z%i%jUKJwPEHwyhKM3A1->(5q3Nwo#n+J*oav5MF`z zq`2sd)+VuU7hSvpps=QVeN#~O=jT5VRv&Fj{sVs?AAB(%d_f<4QI9&`qX7KgpY*Lo z8`WWtY-e?a_jJ{H=g*RF$}5pl*s+jD4Al{5UgIzH1pRY`lp6~7JtfNPfPAE=rfiEa zj!WV1Eqq-5t@QyHRsWFG`j9hGOXyutX&|P-LL%dFRhC^b{h@XxIS|np$?2Ib%3tNU z`BW(7XZ}W{TpDZs_df>G>8?n@+y6ruswjbgu>ViA;eQXMYry%atfc<#vD=@@l7WWw z0~sP=@P$l}5F!v*y)!`x0tf|z1_JOir@IpZCuDLmDHL>TWYMqGt8}#mAA+?SsJlY7 zkSL%xJ3Ftmnr~`TZ(FNu+w8V>ZtS#cT68Zs-+H<;N$kt7;hpyWah>Hk-~Re+d%hIe z=YZ6Ugz&Bh=sP{-Z-1k+|LO|N)U|)$AqQCN*A?R7?Hob0Sv9UI8#7KTf*%8>&C+Bg&Em17?qxN6E+8-xlxbZPPy zlxZ7WN;7*8WSB_zC*+`IY-})_HrJDIQP|tq?CompI|}`lNPPL11q+)k}7UixB(NrSyr2Qg{Vl9vSY93B-H+F zBt@|kfqx~hVo)s(S?cO7+_phJyu4_08r&q%T^VN1iv;M3D*hs|a)B}6=5CgyrI^I@^3|0xBt zMLAv)4Uw=(rI)$NtX`ZoaAv++TSxPqpm@Zq6TK($^&?xED;jSn9- z6XUHB`^5C4`v3UB&uymr-rAQ z=1Nwcs)|I;kmrwU;y*N^hLIBasD@_t`gQ(9T>N2)dPU4gIhJFqXYAsbqdY^L#*Dl& zbTSuj^oH0`i}{;=E4x$t!lMZa)hQtA6+BKf)(2e!-6fWAzwUk7<=&J zK$1oXStWRZ7V6s|;C$`Zq>a90(Lr3gN28DkvyO-PR2e(p2H+7F zTN=|H{mUe#M-`~~v8rZgmjq;`xuIfSW}&ADJJ|3TQ=d)L(_CY&OOrawg1Mmj*`1@C z9mB9J`HB)6pUqK;l^bhz?^3*>a`K92Va@A49rbT1=;YO+re0SgbF8HMLGi-W%%QrL zGpFi_?)2!^9OL-ptQaMgN#|4uvx|A+RfZ~UT~3ahNR=mNUC(xUQX@~sGz%F!*5C}* zj@hWA8~bnBBpdX`ZQvjKrHN1+P)jFMdv_W{xf?t3yXa@=6hzG@3;)}qW%84=gu93< zls6pqP)eCfL@jLWKQ%kecx&G8i(f`AS1Hd-{qLLaOjhjpbnKDOp* zn@JnCE}+DTytsJ%Ck{tqj(Ao;vJFhk;qGuSX-))H^_ae_EJHjnk<(9!*&6E`tH`A5 zdEU-9pOmHdX)3`d_iPDcMp(%X({M(?WMineylMPDmgibk0eW!N8q? zlLTl8dlF6+x)R{+WyB;>RpbztvW6i?nve-Z@+B1D1{RB?s_T$lLS<++Dazn80DLsv z8Z#TuUmbFy=5W%Io37N%G&(!f;WOM|LyjnUadvRe;mSY{Lz!IXOemQ& z;V@0I*7s3s0I>%m5}#OkE5l-S?NT;araH-k(ej4#)SI5adxukcKB(M1?;zkT4I9zg zBP&_w_ffQmSb+gGchhrxUF%l4MSmHUJJ8t~ZJrp$d#5viS6rW-Zl-1&y4|s*-D=3j zU3dE_Wp(aQ*(2!adqdN^If9Dxcp~YQZCXym&s*Hz6k$4QW$8@mF~JV@^O@yZ)f_^< zzM#OFtm35mkDMDXTBtdESo7^S%*WyewSZIOh)a;keY4Ze8Q2-JF!T)PY9iWoSrOvK zyo|h>S+~UrXOX4X$j1fDd`*X3;B#NEowK-O9UPa0L!-o+fRVXN5bu$}V z(-N&%5c#TY2F9*V!ki0M{FxME>88yIgKS7-4$VZdiiqeJ%d3M+_w3m36SicX`(sJ( z4}2tC{CKMrWC<$&T^E`u3A&!ijv$)J2VOOL-qBlPQsf1ZV}W!BjIvzW#HE;#^#C=< z=7G@6cJSQgJ!pXew$CCJ>aP^r3vY-r&5xU;JtMi+XWFtpNPtMiRG!c;kiP}SZ2||l zd3pOj22Ud`tSV0MTe-=m@Qn-?nuPGk3I%~#@;nT_>1`%PznfO3Sv_C_gTUK|WaAHa z{Sptu-?DAgYDiz)UE>S{K%Mjr)}Y8Ghj1>-W~Cc$a1|ieBrAp27fTVOZ6J0_GE?3N zuc9>p;PZN1;Odkxdr^cO-GRd>-y8LMPp=@@B3C3}HaTOPGv@G+QaIxhKd8 zC7i(*gIUhpls=6{e(}w7aGjE6KU*m#!7;_vFm~NoPlK2*Q2RKPcA$pktN?F?JS@S8 zZGo}%uS$0i6uIJ}CXX}5&r;!HqhUF!FoiGX)w^<8S~)$y2A?c{xOz4UouP|^A%?Te zlLgSPlhh?rQbIUgWcT1>RSbfjn-<|8C7-dP*&Sf+aVR>y8y-z{Y>xJHEGgONkl(>R z?%i~`W(3kgpFCfOK%_@X(k*7j5zOh4+x-Qn6LY5s>k<8$M>_lyf$)zFZ$Q2zGA$9{ zTpy)Vu8nmSU|J1&tmM0>0a3hxve6YhJxT#En(SV z4^wC$y;}CW<&C>A&gp9Wmq6nBXT zR5Qn;gnxul^+_-SJ5o=PyUGhVhY->c&EBsoJ#Ob zZ=}H8M36qp$tZ5@@Nz(JTk%p^qfKdTet7d5R`E-5|R% ziCm7h4pDZ*;Cd0*)+ytQ!z|>7r6}tL^6caTEFE4i!;1qAXXu$3lRq?XrD}!SA}3xm zrC7D_sujrP9{Kf$&Md5{!yI7^HRPMGrm8rg9oFh_z5~Cqg)ZNke-+;9%x7~bgJdn- zVIocV%n$Xkg71t0rL%<#{w~Y6SC=$z>C!MW@fJ*fN0EoRFAP!H#S-DEAnGH7A}E7O zhyqzPgSN6kfJQ8|e88#!B|TD0hmdYS%#o5y1ea?>N{4#YAif0_lfYJB)e9{)7bc0+Y&1o%i zQr9ZxYt0`xF`3vFS9axjQE`vq;T7g2{o9mV+d~5!X~EL^01auN0Zm9iQBVO8mbWl! zE9|KehQJlT4PaUA;K`!oW)U?M zB|kcjv}jRR3Y2yP_b!@z48bD5fMIW7sr!VAb0p~x-*tO{bA*cVP)>yh<}NgHteue7 zj$)c!FzkMZ$5Es>W6`3+*11|zi?{Pc?ZU(_?66sMznomaE zZHZNxMAjw9s2!7FUJYtH!KQZ9nnN}nQocy*Vcc~x@CDM_Ai7(z{B{WUsIPm^tSx!x z_=Ro4tS_<|Uu_-&dm~=K5E^UEe=(TsrOHgc8B!df+eg+Y^_Wi1loR*~2{4D0l|&d$ z>WK5OhPhd1gx@eDQOkE;CL%PKoMR~;NzBxMXkuym1#5&%gFGrX; z6WazBTYw=*FDEB<^^+vU?v+d{imfo$WhUXN#*QpYd%usvg?@u_>=;hg6 z5+-&o_-S@NbV;>ECZe>u<=lLN9o}#o58NqXdjq3~v(q%dLc$UCbuFOY+0h-|P0zT$ zZMnX2xxU9--sR8l-T!muyxaHjRi=mVS*ikAJJiX9)!FK%aO5X+aV76K1%<|m`k1^Y zn%238?JZ7tA4lIL>-Q4hd;_FM?i!?gGJ-2v(`Z*S(D{K`j|Fk|c)p$EDG!|@nG{wi zK^HTSG;)HY`8KH3l0O1lc!W5o3?33RN9c;O#9OTJR9AVzCTmoSom#&ctuqXl)lF5C z<%(p2N>PlXn2?!K`OPRxG|E#96OjaBnaImxbj>Q-rUze`nsf-YDk#*=*0#_tYZ*g3 zl?;{3VSW&2TvAM3${BD<3YkUlRy|B$!$&xA#BfF&!s?c`8DV43np>GgPGpueqtsXn)7P7Oimo+U|Y7E9wsXz_$d zIFqR%@n|Si*bJJMq577>3BA!Nvh5<4;>f;rDz#}&wPY1#NJw}|P)3m}#2+-u&HF5< z-a!gGA?Oul225)6&KF!Ce?HOln2>+K4@Jw2>lC@uDi^e76tB!Yr>riaedO|ANw4?i z)4il?szhih8Jb;aD>(zrAgp%y-u!3|%nIjDmi`hYG)dktwcUsh6htro0MFsRcHjr5 zd%3I^I>$e%)I801K={tujL_n9OZ`Dkr6{H3noPl?QD`layBNVD4YM;P_e$k^ri3a^ zA>k|Bju0d@M)fI9GL7jeWo&bZ6 z^GM;IFv}lsIiZ_Yz7><`2)A*=rz`4kojijSdDAAy3TN_Bx8lhJl;B3JGX+&|2+Z-f zZixVlwYi*J>=QfVJ$Cp}SCq5f&6gZ6r*Tf87mj|C812Gaap>JN%R2ALycr)pP>TgAwJsmEa?x%4nB)}W@*t&o3MX_ z{97V5HrMy`H^oG&*)!n~f9JzIeB{Q3zlp!I;To3o0vm?yk8*R2;$})hze`jwbMEq3 zf^}YZnP@8y#=fKB8oncINOADxGxHDkY)=$__#a)QJpIDl$95b-FQPx}-(|1D_L3OK z4L>LR_s<@`U~E9jfXGv;v5U`do_Au19-HCXvsPCZ+k%7KKz-W^-v7t0IpcX}gic@} zpgRyCAoBlec!?Og7z*3lxtTgSTiV-+dKjBJxcukwzlB9git@;U2tTE?ww%%dAOOft z2x!{!*j^)_1S=xWLD+ zzwhryxPInqH3xbi!=5O(x;yoUerrSnG()g#R2xJzF{&k|n@XGF8cyFWvUx(o+y1P? z-yu_=ZJdLjp{uv`RjepD%#v*KRPnr-XDyrLSy6n;8>iP$WmzJ zN~khdKDZ71oOPb)73>?B>fhkoiZg=hAK4eGHA_Gv*6BlnwCik&hd)Z>y1qi%nB4L` zk=*dq(#DA$7W?i^~4R7jJM)BInoydp`+UvCz>Bll^;ulI9!`Gy1f7MgHjQ>4LU z?A=06FkSpX{pcp-i2Ch}zsC`&*%)1riYEiW^7B|A+eW%ay1>ph4_8KkCq%@IQQx2k zx9aoZ)F_uD(kZVVE9M$Jr>>EYs8so57p`f**83PBWg14(GLZE#sSn$s?Xjw*Z>zYi z&^CLx=5_!6$C4}*G{?p@C?FthG9VzL|8~ErnW3wVi*02QRfcUK(XnS7(o3BXlCtr2n`9EyHH!$po#V0W=9AzCEe(IhS4244w zUO(-C8hUs-Jei4xdftMMhiIq>nq|oN*&)ho%<@$=D>vc58oGJF6028k=;-+d3bVIR z0D?yneyiSK9Q9{x;ScVnt}PovYW|B|M9zv15b} z3QJ{Z{DK(_bnW^ACsP@|s>hO*d5b%+j=9Mf&)#O3(N%AXzFe}#zUb)201@$E2or@6 zRhI#28Bc8q?0Y?da!_LaFp_Ryw^2n}r8K*tJs?F%2!ynj_PDv&%7PMVa})+sIDf75 zxjU{GXWFDO%<6mt_Ooe4(5g<5p+{*?GfM`5mde>OgDw`-+xUDhd`mw!<2OaFpN0Hw zV4Y04qCna{54zi7M#0Cy8S%*KNlZQvHY)<)`EbBehE6AKvW$Yhi69&R1J+5V2$f!g zNOBP5%*@SSV*KuyINnd15`W9mI4zBEvWoYi<@pF{X*XLWgFy z1>@d zP6Sff@4}fdZ35RP6KsM|yU^ASZ(xc9wWX>gnk)CT-SY_2IRL(ClcJ`&)3gezEU-NZ zc;iclM`&JYHMv*YYD^8U?P)DdSgL|Cz&0jL+7qi90=+HpGbv%(2Dj53H%->!i${ut zRl5>OnpKBt{bMtUS7%yWUU+K88dEt1`ZftqbbHkiR9NOMz7pDKFnFriBBddfD=e8F z)-lT6LR$j(cjDn1z|{uj%T|OHieoelMx{??!%23_A^K(hqb8^tbQO=AAos->u4a3Bf3+nK1I ze|}AvW!g}rU6w49fAJm!&Ob^B51LeC+xhur?)l|~r8_W;UG#vWTQlehgbF%xN9^iX zsA;RH{*QZ#$4r#hrwcipyXb-4J2jkt^kC1u5z1|FpZEcOKzezL`R7~UpIEn`o4m}W zr1nhO*C?cg$J(^shW633MTyvRBckNRdTGtA3t#3F+WX$$F;w5luH@%(9_8x#6xSZH zg(|&6RV>2)(D396CvTOzmb{+cwST5js?Sz+IPIM)Pil-Klky*iN3OBx+^7pQRlVNm zHM0boT{E;5DRG}SlsOq7N&H+$9*rR*nl#sIS_M6?Xtniu)t~MKb z;0vZvj*wY!Lw{d+LAV{!jGA;Mw1yySNA-y^1XHxWZCRi;@dF*SJut0A)2uP4N=mCo z7A+cBv}j^2mLUO4Ht5VwDHCyy)jQk6yxYUr9pH?10P=sae?K!s@te+#(R^Vq-k3fy z%E%iX-O!av55flNQE|)!gDx` zuDqyPqy_sI#b+RO6m5bwKy0x^GGvQND1d4e1lbQq(V|2s%5KvKNiF*Q&UK$VnZ%M* zGAcX`1Zyb0T=D3gYt#<6KE^(8)W^O`H>^oC3Z5wnSb0A2K@{024T@3B+Kgu*Y$L|P zI#aVL$BmpXSp}5&iljLr1>do_cgb3`3Jb#`V#6sSSTEkC#SD*0JFQSPq-RgDE5}o# znZ!sFsevYvp^{-q|1B<`m1r*b|03g^f`nm~V8O9%+qP}nwr$(yH@0otwr$&<+5bM> z-LnxH{ZP^MSXo`!70LIIeEbk>ThHy6N$EF>SP-Xhu7b2gS z6AlxPk2<9uQ9##Dt(T?wFpFx4|5D*0x(*RuvT;Sz;+$>3%@;0HM=-!tjd~!@jdT4R z1-Tcp1~f#zyeV2v?ki-w4#mpVH4f-O?ij8Wj%jrkSud}OU^S#xo-syp;lIwkJd5s` z`vBQuh-c-Y>J+X89=geec)0;3WSgE=$%FIY_&g>0eg=fwGwzIK@75dV7Ygy^qZ+4o z%$XC;{+YT7EmDf^BUQ5#zipDbDT=q`!S9;38D~_{qfqS85TwLyle(Ezt<*IxeWTdE z!R@yi9rO1XnP<%7cW-wSmj{c&pF_0VM;-BhB5{M-_pk%<&<{!#-nqjMAxO2R<#@Ak`CHQBQE$_8a#4 ztLn+b#k2&{X@X5Ipw+3ZoY&TED3;-GL*VH|H|yQIL)TsCe8ZB+*(zl5x~=-}`T-$d z#JU#&sk9oHhBLRKVerP$QuS{G;yniR?gMayHarNg#@#FL96p24uTbdMbRn|u{k!ma z$MtzaKtVq&+CTk&|Km1LFBW&&1_A(}2KoPg7CIZ7+L;*I{m;f+tg5!NvMPpdm!$LN z^L(j0J;X{-DI`)gP)oA~?L3+=bSc_q)GG^TaapV68Hwm+)f(oQBN#63yy3Fql`fZX zRA_-RzCiy2+wA*c^rP@_%beuWHVXb@PEX&D?%L<;>`Na#4X_6QBD>Umc~GrW^^mcW zi*$o{RFBeia-n$CF4VK3KPaAfJCFIkLiFQz>rwEL)B&mU3Wkv7OaKyX4Vh0%EM?gk~}vt*8uFhSv7~0d z-Dd}}7g6;Xkr>S+!RDq`#yk?^4+t~VhIlw4b5a-RWlv~qGYlk0*AZfAEff}GkH4Fj z4m)_u1LcktPqi$pWhvpCWeGEbW>X!XI8gLHar5e0b#|^ED z*~uKFk#EM6J|@hF`AmK9T!JYp8c>s}nbLu1R{%MGRn$wn^az-Z%0ft&s!ftn6Uy5m zAFBJl9B2_$?w}&5d=-R2+GN!-RsC<@c*2F23Qq)F;AK#wvx|4xv*o1Yixw4=b_Hw?~^?K4`(jxVif%KE5#5eQJ5uwd+P?wwks$@pgy$(3}j zg>!t1-Ko9uuAlR6u8333y||Lc;n5}WrS$vFOHTN`Cr_F}Qqa(u#J~kIWs1~6lF$RE zGR4z}GR50R+CG|wP-p&+#t6j~*QAxp zrszT(5+66#$*FttEWgzJ!ut{+~iIkTqjs^)Z5>89I- zg;1O|mso!kss1Tv-nbLp42Scgjk#lz7Pu?>`E_TI)<&N-YNaQOQ%!(lp796p@)QGH#l6R9uc+?iCWp_^ zatz0q(mzAXaep@9LCO>@?la8m>2xk)VisFn!5_dqv@SgAa)=44weM4Vy_TyJfRqo? zYB=Z&V;s?aP`J71@1qOk+9%wRSjxkvY; z&{h`yR@Ej~)pxSuiJxd<@}ELB64+%ZY!&SMC5J5(PIQ}eHBP8`H8voF?JEptMxAS3DxerzlM_loH;K0vB`wRK`d**>3Qs$qW zZv3qp?{0Cwd|K1Dd6bIY-2^t>19wxtq6Qvhh4>{AQpefTZF(Penkj#oDL>qC%rFT_4 zoXUWl9a=cKyXF*;JX8_f z1cL2i6>fTiT6S~ILny~)X$oogQDHvzaCDQ>8e68^c`!7K$d_WVys=%~Ske;AH(hRa zy2z;J+{(jaVjiPABSl7y60${(GL*W7BGL1B7*?4ET zifNinwsGoRJNc2A4Je^(S(t$qwZyuWH*viu7dQx3*P_t{yU!|zJ ziVK&HH7`v}E#F+SUM~Yu*Kx|@4Nk)$={9!(lod~mNmb~^#K{`cHF+Wz>5_b^yk`IH4yr&;l(@D4bZsFHJ1)F9`p|P9 zQ=BLpb4=-Inj=$d>`!j)4`O45i?Mikm6Jtf%ptjZ$BC!f{ly1faZh-8pvKX`-Lw4* zvTbw-m9QNj=~f)huBr;XA9X#J7f)+bQ+XsQkN7bXer4arPbcxvi+{vL-gA_>d1{$k zsSOc#>l63i9I+c!YJ_t4RIhAluKFM?F(0`bmqqTX$S8c?x6(Fb$lZ>YqdRI$Hyhzpm17ek7RGwa2k zuq1qFk{+T|C#S$Ce3C!XMPJ18p2%mOsKgtn1pc$+n@6!VawOGcVQY|6jr>Q#UYWOK z)>mENMvIDTg@s6uMdkS-Se^nf-c#rE!~AxO3bG~a%uc;M&nb?K!4i*JZst&>h&80` zlZNcms|lpFMQVGz2qf;xJT`Sc`^Wqu2e=@~`I-qFV#aESxpZk0|4+a0svtAFV(yLzpRHf zy$w`OQu)tzC2vifASXgVB!FNd5X_Kr3ll(CLh=_92mp=hRmhpyO&pkz&B=J03n^MO zTKFn!Bd&n)RZ5_sBB7}M)o!k;S+{&yb?w}^xp#H7c5U6Z?$k7%`MhOuyPMqtOyckP zeBkvxz0W>9?#S!=;sT)UE5Z-g%M3l>Db#m^Y}N;X)5E9YVUgV{j0m&BBYUO~hm$`k z3<=kSx!PqP20n14{^gby#QT>$F$B|R4>e_A+`}`UQf}b7?D(MVI*m~gQX-#*XJzWFkras&zDd|MX@~~L15B5#H_dDUy zE#DKt(+o1Pw?5uMiCG!TsdYB$oEMele-f>U``48^8Bc1-cCM^SDP)onpb# zzX@>HuGEhKqaSgBY1SQp!RthwV7+?fBiGH>&jIUdj1Gz6)w&#^Yi!EeeHUWaIUTKF zf$gl<8IH#q!osq{S+sY6upJP|~qjM8as4(YTz>~$kSaTzE z=V%9M2R{`Kte<-FR)~5Mu$VNN$fwj>9~}D z5ledhn3iH!MCDNZc7B6M6H; zMl+nza2j~6$eDWr#fwdHPGUymiX&{r9m5VeX;+*NQsYRbGZCMK`MBbq)mshx|r}F^wt@} z5zm8Kk2NPilEsYltQwYY0^S=rg$$VhwI`IJZC-1%OWm(-GF44RUINu*q(6nEI~XO6 zDR^Iv8C~HBM_^5oa`>Lxz91+zpqizrbV==Q2G}o8r`j!BZ+9cX zkUeFfL}m@9dicF|61+v^jOq_I!=pnoo2^E@2cD4#7pqhbdvrF<>X0B$HC&u<*;>sM z;V~ge9(Dy!1&d5{8CD!T^!#d@mjGOV`Js+A8IK692p~wDoj4@B0v(|z19SBi)4WXf&QKkEs7GX8&m7vtT!O{eFa^cJ}ii6dR zOo&IdJxQ7gnGTqCYV;+yu7m(Jt`0OHG4os?A(y^er|=;kMlHuOB6ffmL6Vf}wb6w% z=D>nkKufxjBT(xM5*Bkx|CfZ@kgKpg-BJdfwF+7=6v>HDA;QCh#3ZqMnVlm@Wue@y z*cnS+Y5=iR3`FEeY5gW)i!eb@xEHQ*Fxlbc(Y20^uzMPGnbv$J0fqWL*G+y&>hH~rdsUD!< zHwJRM^O!$cYlMsEOGY%ob#Vz9Uor&7iM}z~(NaErs@SC+P-09qZU)8nkPbKOKnoWs zVVMw=n2QI-zjo-TUO&7qpzZzF4p(k)i3=yp+oc`de)R#ZJ=}(`o=I+Xa+D|n6h@tWbk4!ZYHLk;I`GIXS zRKH&wLYb*6DRI?deN^nIQ*emR*?$q}EgdZ_3=9qw+>eVhi{CxzZu z*Ku$1w$;_wdehgC7zI|zgVdMh-NggpRjD7bPS`8|H)@W|CSEkrJQ-jqA?85*`yRhg zijsw&ei5!n^|(Z^_Yopv0yBvK-#bMRujt+|xXsCci&24O#wM$Rq-P|m^a|B8r#mkG z$d8H52guM-n_-kqA{LC-eGy{B_<*JW+vh>U1spc4KF)%rcLoC5SyW>_({&l0so@hg zj2QWn9qbTtC~Z;$YtV;0$i$3t)3sPsU5i$DrUU_pzz{U>IvmSh`FnEJwFYHe%hzah zJg7HP?v<{#3|4nvVIZ-iZ+2Y{`d1BKe)iU_WG2|SLc(fH%Q#>p;-i|MpE)5l-o*zg zZ}Gv>M`{R|%MUnj;a(FrZz!0{4_R;i-V;~fAf9uW?%kWG`XHLCcbHmy-GpB>4NiVg z*+v)t;hF$`?&01AO_W+Nf%(yT3l%?d19(p63$ai@ z+)FGh{0MTgzSUUuImeh$`oy*5`?7wL24hhljv{$UVpPa@5kdDk11b4NIApjv zrfuCukfSH(MZGw37R0hFecdWnjFJj zNj;$hSJv}(>MT0RPgYX9#B29^r~>yiG;`3D5mRj)10qgDx#u-%i}vyk?&&Dcd5EdQ0FkEm z405`qbyMqTG91B>t62~R;c!1FtNj}|A5%5p*_#Vu6v`$TYaNdJ{O)RaZ*9mZ zQ(02-D7LvV_m=Qy^>Ym1XH4LtDAEf>$Bzd}lm`VL4c)%50qb4aBck?MfKvxh)q!*% z+yK4ik_;xXFVrt%*iP~g+htd@PZ}y2q8pU-x1YkI2bRYg1JvFANPGX4Jx)k6>{o}P zgfT;yA5>X#KZC@IHw5_Y7q_XpkV<9YnjBAiqVVI?ZZc8)ozt(?9QntH)m^u9;`)cRoixI`n-~>||23 zWKswGZF&ji3%Y_#66zB&YE$^&Qape(YV-$QZ0Qp;X%$21Y(FI&2ZESKYz0$@37)SvJrlfx)~p(C9(_B2t4g& z8A*H1ogoIjN@JlrK#Z{`uFs;%wY&n0&(l8S(=m~UH3rDvGF&7ot39D7 z;{`?cA@ly~dlq-LsIOsoiJqRT^;`a_o@doUR==K{5|L75%cSd4&aM#VIuoC|Q# z1=w@VMM-l|o9B2w&a!!0%S*``C(2l%Ucy@zF zs`Sm6+!Rl@$x0hmp5&(-T0z#775IJ_#RP!2ZPvR&Yq!;bOcH&M zAjn4hB7dGjYt4p?7c_9y+EmX6EU0=wgY2%> zfPCkTD!vn9^}{bcfbWmL8zAz@6IzBZ0OhZ@nUz17Xyz=mr?l%($;O^VPof|(SO<p7WFDFhJO5hhadjIx9xn<==R*-;yj2@ zzdk4r>Wh%t(x;QLaPu6ci-nmvd*Ppjf%J`#KBkU zX2Yg$yo^p()4866)l>Bp)a69ynXG08t8+2nu>>6@jMOE?&0fq=4ng@>#UdEF2$L!m z9jlNkT0Tjn0=hR7nbe(xOBz4)2BqQx?R-gJ@&bdp^AL1k? z?lxIgss=Nk0!X3GwpHJQ*1Bf&q&tP>Cu6?;3LZB=^tk!d9W8$FEf=MOUS0ZXCKS-z z7oyfJZJF;ii+s=a5F@;$$MmgeQObnch4oS07TQ`4t!0*@JKGfSCiK7zg?@rUG^vJB zb`4PHgsVcmHe_Q;KCS9D;B;c9QLqifJ6Th&*Z~_fdDHr8Au!1d_qqRd51ce4oom5H zKQ*D>p`$W!xEK6Z5`$iP6&CPkIj=KZpZQe_k5-Q92Z0aq_K~>4VzO-xqvdS)%H25^ zexK-x*@1h4@d2W%=LodP1-uOgI?X1bt45BU_~Q^w^UMHcu$RTo5E=6HGyDp9qPkjfWT2o@MCE|EA_H02{dCGgAcCXGNy>MMuLGGBi%e$O* zjacxhCB=k4f25`??g=1*=sNtAIR9XC+2ZKwC|DinWRubPCq z;!g+Qrw8P+#NF5lbu7P$9##y#jSD$lray0sred(MII0^*FEMrKFVL(nz(0j;mB3bJ zK*!DB)L6X%<~q$1cxwCkZ1+3oXvROt{~tU1)H!!3P2IaKMG;s}G>{Ox`$_X)pnOhs!N*US~(F2O~J>@+;5%9yc`m+bl;~(np3}GXpVp9cGsf44aoQX1Z zL=w8xG9)NbmLzCJ#ka=ird;QkK71T_2srB$+=I^=3Y3m&ZRc3OYx`tN{8iH?-`ytT zxn!G?Yy8xRYc~c$?jqeAl#YI0hn}0CqH5wJg^C*L%1zo9Hi^QWUWY@d&bc(bO$xMn zDSB@|G^X#Hax%=N$)XT!N>z(O(W+n#7pl)C%Y7BIL4y~ZPWfz@suizGm2|d}MPEVY+7e5^{)Er(CoM(3C#~+g2n|2k2ZL0n)8Cnlm*5@+%K{T&# zE&4%aZrZ_R8ezI|l~vu08o3$g$(_YbA3yzd>C)hDJSew1SK^iF`P@jozkth$0mZ%d zd+_kOFxI|}s{ANUlA*6=0FhU^7F{E>y}+|hkwJvm6?;Y+n(sd^;FI8-{3>>#P%mT| zCHDcB&zzcFBhx{tbOTrQm(}RyA^Zb>(HcGQKXSce`5@&Gd5d4l?4<9Tlszo0h(5rt zF^*5~r^cPhica6-)aNk*)ypD;3torIBbfNZu52&%2M>D9BVUD*U3tWPK!|d0TgCi= z!ze5OlN`0gU1lBBr91NSl(t9zx6_g}#r32jpLQDlo~S80%4PGO>{VDa#OY)W8c&O~ z0);2%2hUjM1j<6Q$npX*X*t*(9Ve)9B=Pa{v%qeBAuocTiTO)NF~f08#yWfgkxMQR zxe8>t<7-C|(nzknF~|Q^{w(MXX5L8v0KRqq_mfA|#`OORe=R+vp*Mtx?jbH8q6@whM=BfQ|#O z)!yhWt6E!HEj3zOR_ayXa~*fHIqb~#5|?jZ_hUJ4w@$MiXW8DZU&o(JMt@XHNpO!=8TGBea%-YdX#uUI|b!@)E16(1S1esX zyKYUOc;kkBg|qHV4)1F$Z@O5&v9o?xfkLm`m!9#Nd*+RA8{iq&!mr>~zvWH*3&Zgc z*JH~*hi3k-_3|6~5R3Yj6MN+!F{{3EGkd)Ck-qzZ2P_QPzG4=C1x@~o)&7c4_BlUe zz{nfu%in34^c5dc=3~4LP~!FWj$sKLWupfNa<_$ILz+6`5Zg6RFge}{>^#b6V2;Pm zHXdlK!8{Df=1a{s#mQ&$)^t6miplab23AlOj|f<_#cKu2D2V0o5O$1Cd1><&WRHPq zi%SevVM~pOA{Lmeo%`r7vBhR6tVI=+Wns$9VVMmeemJbCAiYVSIM0_eA;jC!JV$(+ zwen}G&q}h!M->?Yb;uVNBvxdE%AREZ<*rRUdol6m2+1p#bEb-wDebX%RThj2P6M;& z$?dc(PdhwuvFBZ!Hc1%dEfsrd@oJwr^VA3Tlsaw&(=gG+uyV4hyLh3_aQx1pf`Y^JZ&r?4hp}Ypprg`kUX?b$jbm!2QlqRM( z$(+sD_2Qr=iyR$NL+C`$s(bC@d2N`yRxf^7!C#Z}ZqCiQJT;X+*}yM9u`V~Q4)qQE zEVsqwYE@W1-2>>$&wyF6Em|aGI+t&V$a1sdE{C}6P7u@;R1|a+^g7!9ES9`ft=%wYe`oz5Z~hd(BL5TZ3@(6O!ZexJ zXrJ1PLWaWP?qZkWD645QUJNPKV4uajwzq~B3(6t%@4AFz9%npw5ed3M#tJ@w5Y$H7 zMtBtW>O|aZFFw%HKL3w_kKze9ue^vrTE>}b_*Ur$u4-}$BnVIp6)ZAX$F5VHodyGM z^ZR^7^SNVC=Hi!p5~rlnl}w7Fe;4q%gc2FyEB$H!iLS*!Gr@#bK_hCZ_WNX z-3DrA)j*EK4c_Uva}r|(iy8NVeD%EZfg6a;>_w@9ZQo=(pl!&M|2Vh_TA6WqcLc$f zz*zS1f>u{>HSo8Ce0C5bSRipRbrdbjNWD1N2I6|9wB0Or0R7vUhx-%eOa7s%sgy1- z6K69ZeppWNYTHcbmG?=xI>dlaIhv!n+C+eK{v^)Y;Y>9lxrZH#x3)NcDDkML{@84F z!r}>`8d7B8fHW14?cwR*!!&1HQx6vvpU%QIw|*ri5I9;|WbV|8xi)e7!$frf=7$~_?py6(*w{<+P(9`+*;QX@_VLZjmhooP zG>+`_q~FP5~G&fdbMFeVCR@`b-EbZYzw1Jt}k60bL#(@&S z&U0Fe^0|O(dCzy-!8O~LEQLZhkAE7tr*o`!A~J$1JPIShp0C!XBi1x?Mz*jqA=eVp z**5Z$D~Vn)<*9Ecg99ppT>ynCAUWn+`AaJ%she2j&6Fgx*Zpjj_9N} zl0wo=@$6bX#mRBW8H0@jm@C+fFYx>g7tf(LK`U7>d_`ZAkd9$lpZ(Qs<=A)WB4?A^ zAU4+xGFi)+dvoW?Hmh06^pT@*$kXB)^(6_W-U!st!vbI3NJ=p8<K=AT zK7@&ewy=Rm0?bleSg^Qyw*Cd$?38QJ&KClQkjibT217ct2+YVo+$rLcJ~=`2jP~+R zp*3OmM%esuV0HhWprnvS3eJa_CVI%%)8xZ`xXMO-?G1lQgP0tb*lDSCC3bsX19+-+ zi4Yj1GC11xrYD2AHh}L>VW1MLKsn|wM_%J#B+Z-rU_&Svj*~do z%*t`-@Q_bTQv!ZLy+nh~;5Gv8D~hrRSDI0o0yf!hIc5SNh@J!qQF+8 zoT6#{>DocqeBaorwO< zsxT9R&%;NEJ;H%BzS6po1PrAd7Qk#s0#JjT)E$o;0ikmkW+fJEfkM8wTo*qMS*7^K zn$gsebi(2yOUR^+yG|d2k*DL+nsk$Vh~A|`dy_Bo<^6E;fjk95M!k=v@O1B(-om#V z_~uU{K@DCC&!`aB9TV_-YBZMl*N~YYV;K>s)TyTl%d`|qFk(`SK^cu4?QNvXi%3F# zK;IAzz}H0zCzm%-RL^Vjf=X+cs~=qy;@*}KMi{xV1q3P4z90`MDS3Lxy6{0g!!|@8 zH>XI{nO-F89w&-CB6%q}dbTO1+!;iQeTKx0WJ=s?ns^n;G{2V%Jyo|^|J{Kv@GpeF zP@REsl_S}A6d=YuA^%>$*?##fJ;Qq_4LT`$-d=$AwgFk%%3b5qUuT}pY zgpy$<6ywb!Zt&gVnzD270NdiV4|bpIR%aqb_r(4lp_AR|+W9wH@Euw2_M|dpdH)lo%pt)_O8Tz@GX2R|YU0<{C z1|77k*yQ)kP0ktU<|NQzcj^bRX<}?(BU=Tx=}q7aAj+%pwOMhRN<%e&o`e&fc(92p z30PMe|7?E;+zmA!^KvY?1Z18GTn;|tyK?bGtV?>{sPF*Z{@nSuW-!0_q+5#08G-lY zf3?6b;lF9=e^Z>xT#+F)W8$JWL58#wk{V{J&FHpWI4yOpQV4IUVRJznoo9n6!{RD- z>i!zCNuxYjqdafDpJK|ZtBb)7TD=6N%%RFRmJ%fWdwGdfL9ue4l}sts@BrbYpto7d z0e;!m6N7p0TQCw=-QR8Kn?Uu(S%VE+lSQ&{x>K;w>|v|?Q|LK0Tb{=Z|3+g*A#i*h zWH=CO`I_cGfmveBm# zwV9;r3U6G$j#?KsXGZXk2XPGO?Dc(XNHUciGfQEF0-Bh!iUJ3lVv0I{vS}u@aFui} z;`HuPXiChAjXbsgeZ>4F;1>4iDJQ~1R7rLGAAe=8t+wJzTT7(2_vE%CyPG4*BMI^R z0_ujK=V_&tP97 zHnmpekB?XP(yWwIH)UU@MG+I5w6SN=o>dz2U;lRP_cX6?S2vq4RakigP2=v)GQL^ES+s2&2U{qSMI5?A zBZVz`=v;JA$4U~;brJ=UC?>?J92iVoAl%3UDtGkE93Wt*X}`D`Brhk$djGB@7{_1@Ns=yk9VO$s0qb zs@pf87w8k%=!U)?7wB1Y4OT)O-b@l*fKCT&XkW|&n!*|>VL$Dj?U!k?gyf$zBD631 z880DP9X-@7n!PFtlhz?dI5AxScM`)cWRW4f%AhWga|WcYQ7QQ$BC`B2DP6gzxDqqA zx%2mnhwn9n$0q@E+zheUZ7@u`z5t%ltV#ke64Ss}OUN3DySaz2r`U?%cw^u@hRNU& znieeRf4MV(=ejgE)eCOOwWz8%;TOYk_2bEj+Kb?B zvfdss!#H-h<>j1x!w>G`J1>O*$H;wPD04~Fw~}NpG?Zi51g4CsZN#iR*{8C0A>&zPAF0yI}|9mA;gXGydi~7sLfq)fxMCXf?awX|44X#$UtGG zu)?GPyUP9$16TP_mJdZ9BI_(snE@azt<&P>?ok~w`XjAQd7$9BU*O>+z%#5AySI$Wp@_@jJ!` z2kPh$`Mo*eBizUWoFi6*eIC_;e3Fj~GJcW5zhNmgBf}EyhDZ8~)p!{_{#Cc1@OyP< zUhSABNn3A46goEodlap}g)T{|6L1L}mX>yE$($p2Uu;WwMNwXtd@SgRxQXkmhqszf^r;%(4cP^T!3(BLUAZ|2;)=-@Bc7@ zNp9#<8?rmvE@Mo$avCAfrR-{k315ok<}>1dI?mp~%76J16Kuvmv&vj{w%> z7R^CU>1cFG#n>Bm7B$?FS?mOp;f^7vd2$;}Y4Q*{Up-dFKn5hQ++vU4j`QUm@4x?q z7ow~zM^O8M8&rYwN}UzZJ2?K&+5wbmUlZO(k~HpW5Tz{M3%&JYZUA#^Qqa zH;i78H%d`AkT)8e7s_~@F?~8WTl}G|_8B)YLowYQzkWq zn=I{mKmaN)>;USK-AESC3)>l0a)Q%13z&9KUP@La5=lEk3E&mgW8HE55DsH9hastJ zKER40vCEK&-GFN@2$KgJ?GeY~w8H^yE|_30Tz1`^jy?pB52f|q$h2Ne2yaTje&jv^ zC5oJUS_CuUf~d|f(PZ8weTFHt+I;_kWxnnJun5UEYPpbsAF7Ph6WQ)cw!G82?U#T? zLXUsL%@^)d)%hobBkO#o#Gu(wG4);&BXKq!7^y644k&glID8H)c&;UczC#MxNi(;8 z3~N+J-w@xHrB7c3IvJ5xP(&JWfk~vWU+nr$6 zo@h2F;_0$3(AnXSLz%;i`mh_;(GT6x@6LK3r!eSxr9JLiroj>r?ITVI&TBQJ%Exye zC3J*#*JK+U;Vn4gi;!nmF}j3Gtvy<^0F%DHpjtw!GBgM%pi0Wk*b60;+3P_(U#BsG zm9vz?IF6_sM>Mu-95u8Aez4JZUgcN_TP2vROd?vSDT1}p@zhCXp^U?OKs~mB(a8!F zwr(97Q&dZt9z|tpgZ5tq-RiRU_b3p#rf&GUIx-jg{+s}xKOEG%;`SONi}su_>K|kF zq<#q3FH-ibei-RDs>MOwAlNVS`M!O>*)Mc^LLX?_ecOT4FPzQM-5}gA_CPXd`xaNZ zd1%bG25R-N!&`g(iaI5q?ugWa4CAmLo|co7F6jJF*bx*<&istnetB}LWD}8DL*k)L zjFR3?X7%|5+XZx%iRimMTV_DL6Qqe_lDL+qz=Ifo6UHlEWb6PzHYLkRrrKTmjlJC{jb9MYl?ZLWC&%6XkGomsCra zz9hM(c*K{%OW`^l{6GdwW~H&9cZ(8_xoV=aNC@qUkUfJ%U6e8h)D1U>Sn!r2oG^~D zL5MMp2ksGrcX@zioK(51hpNK)h)&ct8}2OENIO@uBZPU>I^-CxT0NBtVE8&Ru31Bp zY8JKQ@B6wB8zEbstVq-}Ze9p??l9RD?pTmy{Pu&L9Yal>w zC~GYviPct*WYkliaR;3MDCYuD#XupId<4{p8^@_vsNvW4?Ohj=0yWJsFH78}YBI+E zCdS&vdq(MkX(Q%h#A;Jlq-`9^G#Sb?`(mamvh6W<8h{$sG>vcdDv%x?$oxK1(Zw$W zgF4=R6iM?^iB2_1uf!BFGZ~00C5w2XNIhCN=k(kx(5%#213)@RJJpod$ z27Xeh#F|8cEzO7)y^W$Di16t_k!P`*787hKh76sM0fz}ZiWei8Z88`^6rfUCguuHm zG+_d$2)Jo!T>e18xICf2BXfnzcTSc4Cyz1gNr)7w7dN9^ULDX{4{v zeid1zvl7Xm$z;31+x3W}yJ>)(i$EOnQqWdX3?-9U^D@cxv&nN;5TNb)ahh?M+Q(bq zG-rM>XlzFJ8{XeU;#u&-I4)>M9}0|FqH$L=;oc^cFwSu8XQvP$t{~ceaw;aYCNRW5 zhEFtcO|&I@^i0xXou&|!;eI$_lrrMTAGx}bWc14GLdC!=;sMl*&}yG10w=g&7XbMd z0Gg-;8U0v^0BF+>KMF)MHElLU&Ym2ptMycxfQ$%pv`6Ds&|3x3bE7N|QYc)>%mbYy zHa$+@KpI2o)F{s4s1Ll50YwN>V69}ak$;lO-65>f3RT576YOu14{V5H5ANoVXj_ia zxCsZ>%@N%CfOBd66>~7{nA){YC1jG0dN{F?Ug}K$q7kM>B2JXNW!1DbX4T4RIgncw zOb174v$J5nwLtuEf%=}`naB5nm8=*3hC|T%=Z+*$= zNl8kq#4`$~t)&Yrc$+ndNylXVI4jbmPLV;gHH(L?vFb>f#G*t@xe|*SB~}$l?6NtU z&W=LuaBEmgsfc#zdh35@EoH(17pts;2*5>tOM?Jble1rvqU+4f*mZNmi{*5jvA@h5 zeFQM-*hCAAi#qdShf%*-S*&fnV?G*-Vmkxo6xZ-#lm?LHv|J1}wyNN@S4XI(io|rr z3OM?SE>7q~#6Hq@0n&X*^drpn!nro#UYa|m+u_u4_f$p9`BazCcQKleZkA!hl@EoZ zF2G4G^nuBm06IX$zbV6xYpCg66N##D|5Q-nzB-WcI_ILEt6A%mWt!)}xwwF5{c zwyz8EHM4z)FPX5*Ds;y2hL7W%8;Z{8K)|Wf#ZvgR?X2RKq&pGmA=oJYx;HIl^73}`=G%Z-hIdGAjukE z`o(1^XsvfXW}bT2EpXqJ-?gya$ zvpM-Z9+?9T(Eus_n>{Ju;xo(GPIY$%fj7wbOy&Hc5}%5K#J``d3Kpvpa+>5(-?GSK z9+AdS+f?u;KTl9zMoh?5u2~ZSGwoF#u!Up_FO@9xgt&Lz&eKqx8E{c8)R@&u!)~^L zLpgG)OtSwVmFdLz%!|K-0j~8Zq`1Nmts!h=d>yoo(WS6{O-pqkcj{@(WNalr?mS8- zWnEJz+qk+p=qET*{X#84`q6_mGDBA9nXR5VO;Xz#rIS<@d;!_9Db%OpwtW|YjxG8k zp$&>>%L=nP8)CSr$sos#O=e+j5Y>uSYIU{jSo-yiq01UI$C@O}B9U8IPy{%f6>bjKcWrPRuKs;zlEp2n?h9v!Yt?4b3ZmFI>H z6njW6c60E)*arLpo+z_3M)#(%L*^?7%}Q=SQ!{bBnm5*}^;|#dW>dYgH=NyK++fb; zlSA7p(sor3%$sFhfAnV6ed#M!ci9gL-@IP>!dI%=<<1DkA>qJ;FrB;7a zVfiM+=1QuwPl%M-XmcG-V~*5>$;<~CbsT3ClX_>tgsY3HROJdX1Bh1^h#Txt)INZy z$dU8mzN(p41VakJa@M!{i-zm4mJINBz`|ju@C(oR+Gl)~ub=o2A>KZJKg)HT zLX{6lQ%jsd?h7Q%(syX$4@_sv?7q`ROzf_Mz8gxvu>bFh^)#1g?zl_yY5}Q z{i~puOtIb955hSKHnjbz?RZPLTb*b(Jz1ps*5{@99~amM7hJJR+wv7={mz>J&u#w> zPc)V@k9v{WFsJ7M`v6@4^vjTX9egOaOVPVvU7*?Xp*;_uU?dw>Pda7y5sb4j5$+Hj z+FnUs^$6D(r0Z>_0=GdI2Gxic6Uq%z`vR0}R}NaqW}qMxS_5~;|98>IqFvOfroVcj z&w_YS#7R5ld$wM>{4dvGnMkzJyPlqTLEWxHX+D@JZ*Tb4K8^o0;U^THr;O`GPdr(E zLhET978~1S!aO{##T;F)$pRE+tB0re4cVrqr;#puzw!b=s>1r9wLgEb?EIj$a-W~v zqPbQ@dfE*&+){~9lMn$v*S8;aquN&WW{G($Jd0>a5$m-&PK^zata&tDAPZ}i+Ge`;P;y>t(<{(2$EIF z>tM$`c8M>z4HW!<~%N zChC17HI!O|U-u18jA`tE&r6f|#aQTp~7w{WN)TT}D+OHQ-IcEe3c{ks7U{B?>e*y4P*l_GKKDR}A z5iXyHzeUSPeV;#r!6*BSSQ$G+@0A&Vh_8v1=o)2Yinm6 z7%eehmSW6eu4{o}X!el!m1h#Zd1W>1KY7(9^Gx`ejCE}a-y|M?e`;ilQQ{GK@AKvz zkDEC8$gP26BRu-5!GAmU8pPase^}BsU&gG+5o}8X6<3(|5gdBa${7nE1rLi3D&=Gz z>6G>89>C1^OFXZewSnC6;@s~&q-Bj1(I&Zr0cCAfOcm%*4t+~YfU-cbCWrKMCw7FI9*eX*dm==I;JztHVnTF z+&I@vhf&*XcHGM#hgbS_5a`IMl_2j8i{Knf%b$lza7ALZD1naG0)F0^B{Q(R!R*Xa zpr6weoc!G?=*d3#_4LYPAJljH1}qYiV+)wh72Odn2LCog^~vvFF*=!mm*MuZ3tgJ*8C~Ow+10&~v7D`2M9A{_v`LW-Cy`KjhxlLWR3s%cNy{(|OFNU% zPb^sLxRZ~8Kns;PSYCD6HlZ^~3wYJpq=%wL9u|7{C5Kk7j+GCHC|h4a5A_px32%pZ z;cds6aj4URc@K+?wDkPUg~kUY^Mhrd+!y5GXHCCgCRY4-z6>rk%&r-g%hlEin5mEAKa zxuzPmL^&<9o?D|vWwMAi(#hitmfzJ_mPV}-Th30U97;G{U8|XzUsOchF0Bnh+fZh= z9k;bxu_4Zd-x8I{5Ybyt0G0Mz?sO~m8uofEzA1lXVEKdPczRoI#-f!$H3v(wMkQD= znW3Ffvo5`8P4e{JmMcGNK1TN{Aeb*xbWYyRe34TRtjA#-llv^96~N=BWZn0nBqzfC z!%3nl-1{W|H9>X(Vp_1Y>PqqM#O2Q&240yWQS2Aqn4)1c2M%TgMibO{3Att?sLHGB?mEcaTocrd`}AHwuOj)9LjI@73>=k|434# z%kjZ?OW1V?@n+Q3TX^nqTX%pSYm+StnQZ^D;d&%Ja*kP?d0#cQBMQ(mA7f7*+jL2} zxp&$*Jm!g%+wie185448bMLIly-^cqN1W@CegR+jN^tfg+Rj^@$AvkI4ZA26a!CT* z)*Ju+s~;0?Zi_$1xH^Rax2yGvlXT%hg(~B}3b=_;<%jqo$!cv8&$9 zbWpv%s1_`)8*U$41$cTQKX3EP5P#Ii&*!F3d&Br;cD9fsoJ~>TgAxAdxUrD@Atk?K zDaEnq3%5bx$0 ze%te)z_}(PJRv6xMa~9+3as6TC&1g0Krr%-3-fogfyo|fdhPTE%Ok4u0yJ7#7e|sy zI>j9GgR={?1B|dO-gZAUU+w!R|BCD47@C3r0DwaR0O0+DfB#=};Xj8k<*4YWW2>TU z3j+ZYqF@myX%4l#5N8ljwrG+XXT3+h$>^rL@*d+!(2 zlA2ITdsJDyL;qpD=w+6afNHjSXK=dZb=!4%SwG$ST;=ck0@TOK3q=s^gzrgLz1O8b z5rWXyt=&!Q!=~bcFaTs1)~1n~qV4FW^}~NLf^<6?wL!%XVF+%Hl%c-~MHuK7F;=Ci zYA?%Qb&jdL;Zg-{h*qX8TZxi8w!A1+q{eVnY}+mw_0<%VpJ;AZvM+@_-&AVr4#@A# z)@XHU(`Du2b=@<4e1F0jAlzJYOjBQt39KSW)L3PIPA=IzPPQW^5+KPzbMCTK$(H3( z(OLLr!|6ci)1J53BBj44ZFws-E;^yWPF+GGRtTqgx&@<8fwMW8h8%6-HNNe#1 zv4PfEAA#JfrRZ4M>^vHO!w+W!V>XB}rU7b1o}x736EQV`j6N7{KopHq8+=dpK*g6Z zMj6jRBf2uN3~d#as>o>F7IQRgfF_-4lI%i#dQm$cy7nv@M-E~aYHw|&RgIO6taGH) zZZ+y;0nwzy7)iE`P?cuf+F8B~4O*l|y-a&sZI4T6g(oi)flVt-z2tzGnJ|gp*Dj^y4_ql=#IUL3d6e#J^e;HldsRRvm(UVX1QTfcRAa0wxVFeb}OCRG7mQ% zI27Ap64d877^7@Y>D!zW*FoGqh|U4!DHIP+&m9i$CBlYibINf$SoLR(yryMuOzfmP zi>(!L6}{slz|PPA(8C5k5^YU%^(YTxOIZYQ zH;B)e(cgrrV^)H5bo`LXE#wx}fds&gOoM7i=HV)E)FZhlPKr(85YH*^k>uXUy=cHW zw!N#09o z&gX~O8QkrU{XV|KKpw2I@zGHo$8tzl(kwzE)HAr7@5k$Hzg*Nb%E$XpV5Hx~9G6_d zxHpWYGEo52Q0+dJ%*&0sJGz=QyP!^K&j#uFK9!kLiL(}w61$&#^NX<*lwPnEY!9A8 zvX_uo zGy{2F$x1_-^>u{WYtIO#ow@Ll%V<(ac!Jcb(Yj4S%J?0g7+hwh^1=L&Z7BYTO#>ZW}76Yw>skSduAyk8sE_$K$_(Rx$lHTvh%mL`nnz0OEfzl%%z_iJ5`5 zpt144hDYb9ZMq?gV*J4N7;7leL4t||l%T-sTZneBqEOh(>z9BEwYYCz$t~1mZP%~s zS5bt&Lhtz8&6DdshNr))}TJ4lvN}2b$AQwg*=SPcfN_d^SVy5g!sxOSKd2Ye3FQy6cWYyDJV#BdI`g zVq!T%YK!SMgJL=rvKmhxnn0FD6VX7nMkCcq*^?xbwi9V4*vk%5GojT}>@Q>JM(uMA zjWW5xENAb_t=HE~WjKJj#uk`Ow@%htb}(0J?Cae5^)Wf;G0+V0PB0{9Hs=iPb=#uD z!^)+1kJGa2pkuk{jE$>m=jLXs*Hr|STB3r{D^61tzs@i?$F6gktua{q`r}=aeki9l zlYt^Bvw;PvB#E}I9+Y#Ft!TQYDjv@$tE(`hsFU|=&V7RP-9l=*!emlDG~DP+$tC9! zrl){wB711L(FPJ0a0ccaE!L_)p|4_Yy`UlkO=K~)=H4-5fw@^iPV})m%;?&dGj3nv z!Y{DRlgP-mA!5c@f^6tsE&Z@)eI8<1Hh?G8i1x10n^0 ze?)xr5_Zx$%vF!-)>djMk6Fde+|;+(T4{_bp$Pwb9>B7}rekT>k@+_bVe2Cs!p)cb z^wIhjhnI{(mM+7KNRuw9Sf&v* zb!{yN3#?cCqy_XLEf`#%At@ZY!&HIX;vqV%yumqqsFGAv)%g>NM8i|jje>HPfwMJ~ zVxIX`n;N3}FjO!}ds(yKM7INXb&9y+Me8Zl#Bq>$TpQE57U{@|ItS+H#mBPu5vuUr zs6!vYZn@zeAEHA1IjIQ$a%YDh!kY3|{q7BAoZM5mHWoQy{E_%x1w`^TX;wSu4{+bPRLmJet@Z0_O-orp+Z%Z0(Zr+07yOK7?<{jBw zv7UEa*@5_z)uw`JE72KX(X=eDqL`C%J?IK|@x&$UIsIZJTYKakchbSorWsdMjlNS)=9 z&Wp$WNQQ;<^Cte^(!adWA71e`5Oho|1E7Q1r1P8!@ZjOY?#f?7Sc1pw)7M09A!0q( zg*ieGhiQ^w#Hln+sqfbgZKx-ZGnYdXhX6^>D-(IPqa=QyNT;rNdn+McM6U*5<8WnWhlK)7W z`?VAp^W+;7H4-85c{RF-{*gt!mp2y8hEo|{mw4Uu&izz7&UG<}e{SCYzW4tmuaxR7 z@-QsbRc_o?cl0|5Aia76Q!+foz0$_pQpH7CaQ$c$QNJJR678$AdEP8&=yADt&h+dl z)g^z%l<(0k`_?|%xV~Ti1pVAGwHgbp55tYn?jl#O#zo$ZQT?6dO#kG3%a0J~38iz@ z9M(B9TUp@h_3KG8xU8G=^auE#q?}-v9E1i00D$^eI+FZvr2L=Z{{Ld-7^O|yMF9lf ztSW3JDPejRf%Q_BVo79RI|LO-ta#0ks3kTf{I>hVb`DqLIz%MB5ozjxVdjG(gr-(h z1V~k44?1yXv)|Syr*(C^fINdkJnn!n*kDu}c3ACp`cnd`X7Et$p_+J`9!r?EAPa3F zi%GuvUN`r?VF9=d)3+YB`N375gODa@_qX7}HyPI(mTCKvHC|+VP>YB+{X8nY*Kix^ zf~{UK8N9QJFwi=iDRzVN6;E-)6~Yn~m(P;X1d_?*`eLxx{sC^he)_o@J7*0Yw;YZH z*|7=-$7Q`Z)C)VMQc(aiOspvewRP+dL%oHh-jqPIC2j2sNSY51(NZz!a6NOkQ|hg1 zoov$T(yxrw-<#h=&A8GZqBMnqJmSI=E#A76hTyWHjvuH+1CO#TP1bmWl*QFs?;OV9{Y;1!2Uq$p{xq3kq; z3-ck1^@-NZy|FeNx{SFur*8@)`XWA*yH~0=uw;Vf~YYqiC7i@LF*UuP?U3+r%(=E7_a6*EV z3*_D^q$Mh@T_j=1{{t+tGj6`1^_OIuoagR=)|T7O!IK+A{BZQVPD70N7c^BVAeN~$ zmC%aX9f^=_|5Sy*&s^hQeJg)~^(Xi*uwr`@Tt=kDsdX}ot13P*(0*+E@VIQ{%Za4S z5oRUz(lvWE=n5gD3_7g2dMSJQqd8{abD7{@ba6H9;5W&HH~fTBS)<&8X=NJ+;~%nM zsMYzAbw=??B?p*I!hi{b`XU!pdvs#q!-QTiu##5rgA!BDT4MU62tzwA+zp_s+6B`f zxF)#MM`a(FlS>$)Sl*Fr5t+pQFT!dz*z4WWBvKa8$Cu8jO(v`_2*gVZf_O5ZG1AgM zkP>E+Xyd_k7qfcDfJ9r;;iB4cx0^#q6Z;F#=tL_hG)pPa9O)4k%Cw17sDn|yxpzmg zj9GT0HN+mNi{4X=`4;_5nOwpgxAUr&$?J28qv8-Rg|t}>{{u0fJ>MmxZ?JztEVQPx z;1Li2zyKHkfb4&Rn2Ld;nThlN$Rp9QTVz1tyMBbrVe==Na8~ z3mse(0KLZ>QrqT6#}C1VI_@HGfK1-aG;QsI>G0W3gIVnnm{6a%lgW(bfR3ne?-Z{9 z#ms*Xo*oGzFf8}nc)Rh?gU9cAfj-olNU`h)783u2&`$#l{%qHqI4f}gd&%yhA4>aKk(IGhse zQ8~qLJ_HXR8@IJc9M{LzNnR8l?4AW>lb9=u#=Ecbz0HJWu6c~w+5VFfAoV=9Nph5N zpH!gY2X1otG7QRyCAnZwQF9?2Br#4@#q z#X6^Gi=a%%B9Q8vzw!q4@`98h^#asE)*_YLi3<(2q?7L+v2dz#NcJpO=@c#N+#nDh zr&=Fg@?^16AFY)@kFy0vJ<1{2u!>;fG>rd+>{)1qlIAf8eguT zM}9BPD!=cq2ULKSd?kM;h3t@L4R^7<#>=)#yc!j)Yo?ktSaJgUk##ft4Achq)rS&@ z!)<9jWYZ!NCM5k-oi`8qSk>y@e z`^Vum_q^oM(aGDXmYRbEsRTVMcT&s#F61J-XKc$AQtdAa&*o0GZ8)|~)Gm~zZg{X{ zNE%s+>`LiPzM879>U}Uppi{jt2MULjQ#@W~ zSu&xK!?;C9dKpL>j)=9EmoCXV^NPqY-joAG)IY`qT-`{fWMhS;7h|06FjFA4Uvap=SCZ>~CK}-2;3or}6+HFp)h#hGX=>A+Jl9QdsX2lU(Q4AW zlTlSwRcdIh5Y;h<;~ESm!d3K%eCSL^70bst;gDoQB)aQH4(tbk{X@u(qXSD+Mx!SM zj>pcg;qby+`&%CGEM{iKd`y16f$m|4Wa&AcTQ&@&eqG4jY8Atcd2opROh#{tA zEMY!muhVL{d8jK15pTh-tnlQ(>-ZAN+dz4*%LU{>evQg+aiHx$&= z>3jGrbOb-;_c#yTqv-MUmfn!>jiZ%2@>oC7f1*a!6Y4CyaXkbNu_gK}yTiMS?`4m) zuy)0Ii|%!fys&n~zhw`>$KhFhgYA?rG!NfE`l=7Z)6h&)`GMcLlXynV0LA?Q+8QCL z-`LoZ0wB@Kse3aiSHJ(IE$OL>o>Tu4bRW?FR%!p@WtVtq`Aq?okXcfAVTd@e!B2xF zSXfj<2_3}-K&k*44FCgPjv|Kfdl4h-H?8XUU-e>NimJCVG?T>c4yV88J9e`#`Tg+o z0IUsMFrZPB>&>SU!%X0*gC|6=NDEV0A{Or7_xS>1A&k7Z zQ8WfiJ_o=F9jlm;CHEz39mx*LatpqB>PNHn!VOJhtiPyUX=TxS_DF;ba#mr8&ZKe~ zyd;G{D*q67m;Vw*e91#bQwSY9W!Md62n2d9DtE*+ItI5IE?X_12M)c-vBb$m6P(46lFx@6EB*w}y?q?ByTYQGlrpt3MW4j%0asS7& zLGdw@dW3hOSTO3>5`~DSv{`H@n4YqR8k5I~%*I27C`OG1gAYdMwC#cscfCB0rlU?A zqN$f{{(!MD3FZ*)RWuyfr3+QcMa;PXe8v?w7M^Q54d9|P=3GN5Yh;Rogjj6$iFZj+?WN^Ybf5iVgIWjXow@&)UxrI}37 z>^YNfLESpzVee%|l=x_+8dXYH1NF6!F>#5WcQe~ZeA0vgZJu`4syh7f~L)sQ-(Xn!~E%y|J!LU`4VP` z5$q_?q|`%|ui|~<1bmn49SVN4*M8=bW4Jt5TH++RqpTBtj{L#gddA%UV4c7L35>?R!30nm&Sn zeRvyOlxxlpywftoOEi(w_*BFs;{dfis)wvSPA#z=#7?l*IOKq2y3mf89Pur|EzvFH zP8j%j*tmFL+&<(3r6U+;RJQPM;>Yp8Js_Hg7M?>ZEQAgXe^P6DB0cBNw2@m>Yd^|2 zD7A#T1gmlOahD@4L0~qJ-GS0QuQ!5UfpOk2u&u)qCwl)Zp70UjqMg5N`0H;0vHqiY z{$qul>;0dSkYQS57CifYfMVe_pxEDnW+$--*|m#F;Z%v_d=h5O5Gau83kU)Gl#Ga}i~ zA}lGQ)4lj0^peruRd5h3zkgjtF(BPjT$zfE6rl~smWm-t#i>*`js;(TSS(q{7mX#@ z@FoXaijO$jah*#)N<9&0Je~nUqtGN>8bR}6(VRA1knxVjfe?AiAh}-;-2CFq2kYMztRK~q#zLe^55c>1@{R@r>>|KYK z75H7{c#`Td_|?(epL7eVK3vM5iVDvbd`&C|;kyjOx01g?Bi@A)_xF7(w;b>7*#job zR&v6$TzZY4SALV`>Yz_N`Vk^b-kYtS}1h8wRoeY#dxk`A<&Qduj%NM zf)dcc6GCR3!FQD&9oyN;vpL=X@o)C!no%sv5DPAf@4TFg*P5|AhWS<_6O zCEQrg*|psyofx>GR>i)N=F~_i<-+yzi zTen6Tt1x+=e(pT>&VF|D?|QxT_(5=mf zKFG^K%BUAVbsF?01fiI%bSL`$Cozzo`Ym#+mjbc}Wq68^+o(1SGeoT^KD86 zEk#xR^@4zJr5;osc(@cPp!IAA7FODPpSeE&ws>jCU|Q}L@R;n8CA>2)1pyur`-irN z&J6zYGU!nJ-+g+CTkQ$-jR#N(0Q$rdnZWa2Sf^?aFZB>OUn z#m-8H>!@Ikp|&P6nX;Rta0~!mhm0D2b}tmf&x}XNKrT_&W{r;+z(1>&kj*OLKd$p& zt)>Z}(jSM!8?*5bVm|_U2iw8&5s)|WL-A?0wtG1Va1=|XYjp)GLm&m=CyIE5>bZ&YV7 z&llTb(rU|sH#A0-6c9UrreQX!i+%iZf@JpG-f-Ci0ZmEeCYB!Pt7A!Fc8RGCCoU|f%W^gxWd zY2OzKe#Asn@r7}!$^!*gVgGJ#p#KOGd36m@&aGH2xbsTYdjB{*K!@^As%VR?r z_b0eCw$#|eG7(wq!JQHJ_jBD_K{>;CRa1!f?tHFd6tkedG$@gDajPX`)cdWtfNLlx z*<34$nC+}fnvc8`6Po$W=CWB??DV@8%XD5iP6y7~v!koy?noXSo-;9#IQuK2h8y3d z$@#mtB3sYbmI43ed=$7v+hXfxh^5Lzm*9jj3J(l_17YW3+Z;w0q$+ZQhWl>=QRlGka1pzBs?exB=%fvzK4MGdBZ!o-Z?%QK#Z!KZ4*2&LE{J`|a_MDnIDY(XV%|2k0{gWB zBm}@vFs(YqhCORT&zxH(pD58QB#j{|@kNbdNT<5#k101JU(VW*C3DpHS+8C30&N1>q85eR-$}ld;vu z_wYQw#qfCPCl5TLQ~dLUIOy98s~>*ivgBqT7ICQ$qfEAW>A$FJtqlatch4tHq}ajl;{`T zh0S=mQK;}sN_^L~Yq2BwwuBl^Vr>>k-a`)m3*1VIlQqr$nHyk8b`@$g_GHWDCh&4d4k6p$qy*l=Bb zRNur*=)oR~4n-5cieX**3tp+gbjz)w;4$~k?-Rrc>4WKllI*bwq-=Y{F@o5!(T*@! zg58i>Vz$EjkJcRuVGf-@1V_Z!hrTC#;x-3e*{q~9v)?A%J;dT#G2oh7?w>dt^uh^4 z0ZCH!T-u?le9M-sFO&v(E9TVK%3<87ufrT_W(^6Ktkw?)h;ouzjhrXhIz8WSq$Jio zA`y6`S%* zCih8b;0l1m*HFY)Sm=yO-Ag(MHT2L6$!(}=7?(c3s>wFt=4Q`4_!$Y z+Gl@v>*I$w&|mz({!@zdOX*Zh{*@qnfd6hT`fn*B=w{&fUwVZ5*>05&3=B*dOxG36 z))fp-3@qVk38`;*Yv~|x_-M&+wtMgBPoRnz7$K}|UiEOJ$k#&RG>%W+^Z}BU7})Q< z>8I}D#08>!AXyktHokY!^A8Qm_YScSd*qsH|BvDMD+a^N(*yjfx3U>u8v0 z7#SFX{^`N-{^@?8qb48^85nB;K5nc$;0$SOf7xFg62T#UAOHYbFaQ9we>??+ zzxV#%IUp+k_v=`W&0;2rjk&V&WXTrLutk2UkI=A?2%$tOQ6$Q+FezT^3){x{dX06N z$`=dX8vx&5h2AbF!B$MbAALHVvEIbo_4&B^iVt895C+!GuvY^33AP5-O{8$q&`v5k zEwXi-7Tw>d>I8|Q{dRS5mfYXEoM13}^XX`BUN$Wzr11zu`708ELaRkCFIU+Miu+h_TIe%~2{tA%cG0&;%hne0 z)CqfJT0)H?;5i=lh%-x};&Op80CkxZ=w$f@n9B2IUNX-kqPqC&R^y0qUl~yxglgr; zcDa+TvY-Jbg%=W|v`2S3b5;A)&PJ>IVfE+wkf_7L=y5Gxo<&8L^=IuELR5S0-3lBAdXHt}{6n8s)>u>{|$N3sME@wnLa@-&Isp8hmL-pF-<=~|{0(mh} z(BEk^)ANCwcfG>Otc=z`sVDxWdp0a(R}vS2`%o{3do{SE!d8nPzsNRVl|= zV>U=@(zfq9x~ce`Gu;>U&D&n*-gPIi9(D(D7{{0^{0Wi(#iROnnPSSL?#nz-3thdl zlmA-&w+ARk{ce+n0RU*n1^^)aC*&OMj7*%IENsmrZJnGQU5x%eT{9Yx?kdZu-?!6Q ztn`F1G6aMK2v8F;h6t=J2ITqCWPm1+fYlz;Jc$9urr91r#VuK)T^k#kRwI$gnn9?j z6(l0sXN3ns%dKi%=F4g}R_I-8Jte1GuT0DnFeaA0b~jzGy-u_5v%b4&!Y#$9Ndrt%KN`$+?PVY-`)w};XCf?(U&G?I*~6JP32&i9)|4 zX7{}slqV_&f#q<3=M6c~Go6l21UZi>J$(s>5YIG?y z1v(r8R6=|IYjVzT)U$@YhFkv|7u_C9vr&s3#Jgs*8CTP&4(-xb+lZv7;pQEvw%B#V zac0hZrHpiXog<0CM#Kwyvl&FuV@0IPC^JFs0_Zf>w~HXp>iaj*!M-*^jA)D~(91^W zGmw-tPhnHFxs09stId3pRSRto*HCnrByUV|aZ5`D2Jd`wfAorbW0!*#$qsv+g9{Vh ziZZ1kKG8_hdA;BX0q6II_dAWfTEG`$q?9(IMNs5C#RoF61RW1;77^{>;7NAk`md+l zWZUW%91mMU*r@tw@=`sOidT zbQJlqF)0q!;g}P?fUGD{=M$;Av?&MrcX6f+(n|LkXEadl*=dBr@|I#elDAtCGL#Rc z#RyJ{8RXs?TpQT)@6&&T93yLG3*4~iLKa91NR>My+E11c6O?swv<}XH1xK4~q99Q~ zmL*B@nl?X~OHy6aW`C*-#<*fK2U0AFDD5J~lqr)%@FL1L%rm8IA;*v|s3C>O#pRn* z%g(uBNzz(tXUAfD8k2}oK}qV1Zq26`lh_9iPC9YY%Z$TSAo33N+^7F`r6S9>iJ-uw zF2vSsAFB?pVr@;X4(A*@HdUlNkog7U{eH?R=;)!~$2$GRS(cDm(tMpQ4Qj-Kz2csc zx^Nmt+g{aby*T7O*=1<d@PHK zZdep(Z$u0=t6pP7&H1r@J!H51jkXn9W)=wg`Q>6;vrglj8A3(dKZQ!@m*n?s=*)t# z(&Z`D&ET!dA3VE;bpG-;V&MV0V1rvB zgiUO>?IM)xGgATpWw={tnwmczGKq5`bT4lxS_(g4$&r7AEA;WyJeQ7YtBJt~#b+B>Qb@x-W?!Y8(^kls zL4`oIn)_W-zCeQlzp8aAV|_7Yi-{+!_mLkJBNi0EO*B-BDdX}QzpDsAKcdUnKp(2k z(BNC-7GbLo(5V7Yn$E56DSdP+D}FICCeEJGK0~Su)RFTb-FAgm#&)*L4$xBTt_U&53UMY z-z5Enx;wSq2g9XzDh1E&5~g%q@q>ixg?lct0yc%xow`0wWyMVG%G66e*FnO zycxH&8eBIS=*ZmD7PjY81IbQVz+I}OEkJZcTT};)>t9@dp^%Cj+{CQL7n&Ff*fS^( z2*Rx3D+J{Ohp!z2sr*cGFp3?nj2@=arXuBHM7(Vw(G8`OHY|Dq+Jo2%TcB|&+uBM) z28fjbFb9RNGJ?maaCet>NQ6h{!65_A7+}gvK5{#ZE38h!SPNs6(}y@V!o;02VA(M= z?$j#lsll8oqn%ofKOSpamY(`7J|>r#N&^ELAe1@67>_I`BJ4*FzLRtuQa%bTn}D5F zXywZ~jLeLtwk)2ih%(e1Mb$DXW(?MX0P13qK=@067_Qz}{3jmkEbn&`kd&n*?%_ z1e20NG1F$qb;@$eJdC+3S_c7V)EFDH+p!vc=XV953Ff)US&O9rz9Cv4;1ozyP{#&% z$x8^#pweZSqKUY;Ke{mon<84j^#gP;ESy1@I7K>vcDhVjhvoi&b%9|n#fXq%s!{F; zrhgQzKTnkOBgdR|hB!gM6zyCVEwPH0Si0d*5yk945l%fmMow!XREZ%JVTD)<2k{us zGUoYm>JwEjyB6XDlcZ^MLQ(k*&fwBYKSL=b%pptwTO+Uzz1<)uO9tUMJo9D{>`?i> z#W8{D`;I8E&Gc{U>4E~Iy`w{wCCk@*mT`Gfrf{yzXjocB@HPm;*z&Tt=nixA$9lQ! zm?;tEQCBAhXfRbnZq!WE%F!>SB8VMv!BJ8_=AAfd$s*X)R=T&j-oy*-HbAXq{7BKu27Ltij*q`mA~ZquKH;j0G|tyV+@IZBWKl%SdW4pC{?5C z%!y!ViGpknt7(&Z+Si01a5dn1iQ?NLLtd3JyFmkojik6MXonmgSn^O#*CrDLS*ir^ z2Uby>rYXGmC4Z!aRgUB^U7=J012diB9u;qvm+1(1Xvfhjs~_^MN;teYY&bP(F%fzJ z<;4?TjuNX?(UvHD9+i6<_D->F%O`jMQ$Vc0e*`xwoy#UpleP@?=6jzAeG+*k9jF5> zL{S6zhV-1>aZj4=itV{uN9Vx1bKNMby&wUr zg1b=~Cl(iJrK1_-VEUM;kKk3oei4U6Z!QonIe!ud1-nBes%Y zT7=oG_Ej@7X}#5+oGCIdeD9L{dF0U96%I;C=Ui6BnLW2>%}|rX4????uGZ2N)rXiF zW9VZYFR56vHXWd0_jpB~Rl?zmi#Q0$E>tmaa6z6yHy>sF42AjeP{Vga{sA5Kqv=I= zx{KKYK>e0$`Ay$ESr&$UH3$TwI}>m)0g?r-S4e@_x`RP`EdN_ z*c#Wi)t=)$v90~i0y&r&cu*44Ah5lFAe?l>Umw=iqYUeApI6Q6%@6)i?HnqgN8}w< zvM!8ve#J{LN)W#Kbw3T8q;9@S?k7b81}Ujn=7B3hREe-b5+^Z>#4g@C-a4^c z@&RpPljJtOTiP+|h&S<7lJ6`8-fN#2kSMacx(etjlfB09W3*C(D^a(Vc7`H%Avzks z=gLoOyB-vw778I}0cIu_E#J)ATNJ=yMSEoa-eX1qJx58f<-t*KjQ;Dfl<1PWv1GpM zRk3-sB@#f`H?=n9x9KeH^hBhMW|joXSZ(5QdSO)~>!s%^`R1AOKtqF%ul0ARx3b)2 zqvDhH49lC6FwG=si&82oEA!1KSCdIXJeVtC-YsJgWGCe%T!+4OMuoiEOeX+3mm@9u zZ+5SyXbHkF%85!7X;ot_9aMsjBaBuxCH3aW(1{#In8j3^85V|tE}yv#43^T68QfQr zINe}r%f<>!KqlPx`RNB0GYeZbo}Zt@xoK+=jT9RVe_*2y?aN=LP0a6@nVPuju(c#3 zON!L3qD?bu8{e&L4{PwUPgJHA#aJB1-MlN;QblUAq_dNj1^eaoNl7j<1;@CRwMfPZ zwB^?(W%*W8bWt;trXy<7OViHd)-vY!W;J$or!fGFF&Wnv@6Fu3#MU)-?0_p`uNg!CXElLBmoWNGU70nkB^lL%q8d!OI2+}UC^X!bnBwDReRi``7 zYQx<7!EEGR%z%HVxbfjs-Eu8Uwl6wM&{~NKx8g$EoZ$}77wpRw&bTnH&RFBxX&KFk zz3h`%y__U=lJ$#xN^M_66VGnvaXo7Atjj)sj*g|ujwvm1#!wlW?fKe=PfOf!$i(vy z_6r1A{U0{oF-nstNE3dmx@_BBwr$(CZM&+=wr$(CZQHidwLP=5XTO=vZf!l ziB+CleGt3Y&pY3CSU(J=mJbSRZ&HCgko=p`*21@5|5wwhM zovmA)S(@e%sjk%?f!hNJ5d_`)6u1seADp~*jpUX}meFiXi1ULXaq{ z)UQ@r+ZfSo6eq>INzQ&a5ZKA4b#J3_oA4qZ`{V|pyS%>xxpODg3_oz{J7$nqloqXs zg9zx+&$DRd0*AGq1AxQ!X@C{1M6MxeSm9|Qg6ZAuMYOsiyWCMefzRu`t6ByWBI9K5 zoq>pvVaOZziNL#$PugyQR}JtZyf)JnJH$jfX=fcC;K}AGHOVM*1*Y8!3MZc^*j)3u z8@5JSsv)SsBC2GFH7}7?Yzs`y>WDO7O{4DcZm6CN3LMoEQZh|bJrdPUnbb1guLO2~ zl}gfYh(T;03jLrFZA@}+P`NuG+#l4rj4h_7-cM3d*I7*^U)mt$!kF&I(&{)M$G&!@ z95Z7KePb46(Rv*Ry^f{CEvGdCXF?6pMq z?|9oliR+EVS>1V2tI=TUCBHskgxtMw$8ugIv++mquHM~owr$!H&b3e@54y` zp>eN+{JHp_?#y0p1byc#HPRFQdjxM45-a+%aTd z?nn;jCKIO0LV`ky{60_eKZro{H1c?pCZ*O)R`8kU=Sc%N%0NFoHQ(8xUZIBBznaJ= zfqMe8W3PE|F3+(NXuUw1=Ff-5lXytvSr`|%3}(`3ESR`f7|l$Mq4?ColkWu9fsM3vqNotR}NM|QLaq~S9?q-G*T zm+@LLX3wUNM>RG}g)MtYFx$*fZ%xzFV!(n-9xZTl1)KX; znw>ir&zI8DZ>C~p%oH^`FO`W{EVSCI_~}he1J|=~aoEfh1(?!`b8Q^j1hb;j798*c zIB!N(amnVYjbIKrUjhNjUv%W08S@23ty6`loy_W-r1pwJnqpuYxE#_Gd3wY`Bu$U; zVc&(w6p)b$5pWcA;Z6cAyx@c0mgKK~Tad=v8@{S5vd4|49mPz!Y;vQHiOOYU{WU*9 z{7Q$O=O_tzFj5$No_`mWTqCI8r7@ZIhhSJz!juP&wo(|m(6QMbWhEb=SfYo>!$;!P z7wPegao2|~Zv$XQUl3e?D zus8Ck>G-uBxbgKb&ET{0e^Tei;&tzYkOi+yqU;$)bjagKEQp%`YU1r+#V^1U==pft zXS)8U*BbTOlV?tIYc0#33pSEo*RKk?l{prfF5&OTenCqeN|p)GLiv^QOK&pft7%AN zJH@SEt9x2fR&?iXf#Bby@Gm$@-Z|qw&@}9^q4zf4aCG+D zk!Pb)>>;=8qmXEdw0L4MEnIiOkneCY+H2&fI_w4NMXhppD&ZZlDl(!xlFCe5A*U)` zG@Wgpq!rinO=B)^R(gT9<_l)N?{ZWv9HVHl9jB>&-QD`sk)E)(lXn;!B!gZ+oo3A@ zfed>6G07t6_037Q@Tt40_0}vN7R9;CAghd-cN-h}<32|l1CpgKldh;++%6zf_jR=o zZQS6#L6Tjvm)yHQX>(nFblxCe_GO;-OEHE}VGhkeZm~!me#z~hx?@GMhqj83a|Qjd z_Jne^1?}!}`cAU-4kG!^vibFOzWt{0a~NZv+5Wgg9jPrDC@N4jZ=bw%XfEvP42zRa zW!eZA!}+*T>|IU@7)Z%Vi6LRqzHTi`v1DU#&xHRqu8`Ris96ubLk07%jZ z=yff@bI=Kh6BciVC>6HZaF&Yv^t+91h=$4>qAit{h#=Mc9((Oh%6vE*L#HM&7K=@J zFtO`Tv@B_c(JE9XzMbmfH_-J1r5kb=aGzfI$gcYcyaFk!eq-5?PXQFHA+n$$lWT;f za~PmQ7#1#!1_R;sP@+Eh=Qr$Fm`$C?Z`p9tEK~z;ovS{n0!;LwKzAkXph}_uk$ZYy z64x3>G{bC*-&D5YXOw2GxFzbV_KOCy!_c0f*Ekea5_TvY*nJeCVr)OL)XwZ#IwHx) za)%k)R4kHTiM+>ApLXGLcJ;z-eC_(=*OH+~DudOwz&dT!UHDGw1R!+_rf;YAyn9R&MAe@BZrnMLXSqf3`hS>i6VO%{E?ElTXN=4Y8jQ=( z6>g)TLj?U%cOs?8A$@S08%?OA61!F(C&5=LcFU;u3o;k31&Yr^hgE+fRo^-P0Lx z98Gj&?5peuF*@V)!_P@ncoTnjRuwJB@io&CjVNGxs^h%eSEtT$JwYebsOmm;!xdk5 zJu#eOCG-^tZ@qDKoRO(p+@g>y1iVHdh3}~<5V1Vy89fUXvzzei3BS+JxhT`-S;~Cj zy~|EjeafG^C$&$)F9SKF8+Gy9!GGFFW`ca|y^xe63RUL{ExQWY#B^A}x^>y8lAPf$ z)g%wgDDE9lYadvE3^A<@^ax}*xnAlI0e1a%DEP4W2C~1lI>O|m1N{Yw*|;Fe98ZaW zX?=OUvIa=!E~nuCqW_PAZi4BLj(^{OPOty~%70^aWfS-Rlm1k*azZvi@!es4wUvTM z%2byU5l7Ao3s?{g-XTzzEY4peI&f_)q8PVbv#!evK=1Oi|N6!LH!vl>Xd>!C;*PQK zP!0F{itjG*kR$V&R3@cf$n4|AXEx_C>vU_!?c=a_*Bg4z!W(OVRT>;|v>k!fAR|>R zpegHgyOL15&#Ei&SK59ck|0zCKKd{5Pyz$iAefV{HWWb&4PD1B^R6?XqhD=PcrbiW zU#myOW0ReP-rk=WM&-QW=p=ECV z1gK77bk=O8rlh`3lkVh1gGD}A*tK!7Bao6_$*D?1#|UO@hlhB1N!1h-Ncd)(wLCA4 ztIBZ1T(Zv2N-T2)vVI5DTF=0wG>-24P(n4_mNb*@$Fi?A6 zc0Jc4-y>FUO@C$XWqVt+<*+PoANkug9ZzYS*Wp+t2b1Yim8c^s`T=iG9_X| zApz7&Q49X?;aE7xd}7uUHUJKa9U2ob)ntz3D*NoB<%Zd!Yqg2mMDiK+^1ENxk`Q;og6 z$+>FL0c5nARK-s-6`E=7vmFVDE8S%pee|e|X=E8^xrO7NaNj?s)&l4`AS98pGVT#a zT!=0+0`6_o=DmMhm;9cJLuJ38s>A<&7~V4u6%==-uEddK2cR!LIo2l^2m82>ctUu) zqkTdK*2Ar-gNuiDp#531VNRacj%EGDhXO5Aakg$AK%djdAiL(hVI8I31v0x%sfaBC zbrzH)Mn$`7Z{^h1yzfEf*w18g_@Zvshy4k)0}4K423flt_rO{7fph57;y|DpU
tWYZ;23yk<{Te?pZoJ$i?! zb=4&b;icH&>pW5<$gR92+JTgLI_Epj%2qHlYHZUDW#M(F`qszE+c|-={+};uMFBhH z58S3g;p^5Q+_#N~O^tq6NyKI;#C#&$VqCT{f2FHg8(N>C;l?w`fQjA{w3Zza_ll_I zdW#BONW=tDNp-O=w97Ld0#81KE4ieUTnkcPLeE}BLf^{#)zi7l#`9(b!Q`Dh8M~0C z_Qnos&uA2HT56&r{I~2CzOdokqwm@bylY2pH-j)&?UnuI=d;}!9?k;{e6ohG>OhZ> z*ra;i1=%k{)Qoso)SBnApQSuk_A+Oq%`&4Gc2PqU>#k6lLWdJk#L>$Sxw&h~3wk3X zc&z(nDgzAw#1Ql1iPvRRvG7H4r3t3eJ z>gIwBq%=h`i*q3B-CEX#KSr;-nRZ`!XJ5Nk+0GMxeBKlQqkGqY4u{N;S}^&5%`fNo z41B%OYj3wu_+5y(y%|7YXqkyDb`g_i=Ii_5B9CD^UmtX9WIzop9$g7T6t0?mn`Vg&VmK z(!B+TZ$ysyOL=e>WTNADy|`sJzlGE#9FUxy_Y#UaJ3@GR;Q2iw6N7b>@VUe>Kex58 z8%8)p?6Q!Yr5rKE95aGkRPam8$Y?BVHXigX!{BLJVdh7R?Yeo8(*2Nes=uk|v;$KL zlKSq#E??d1npseRs5NyHPjcAMNCyrYShNEZhe6PEjq2zk?20GjaX1ni(7asM;5|7{ z*gTYJnwd%;{-ipx`UR9=%9&0wm2xGOnwzH1%_pU!iv=el;+kSnv|)9M4Dr-<{5Nr6 ze1XUBa}*nwvSRYEb)1F7dU5t0A5rFMUIx>Ot1Kr?g}QI2f#)JpG6>c=vjx#X(Fq(> z2wSO9#drrNF=EVog6r_%1B&0M;iKg8mAL-vEXL%FYBJVngG2hZhM>?H`ve)4joB%k zk%?_{5BooIK?AakuSz>?vl&u@%&|&@>5}r~^9dsFblv+3zeN;UOjWJAeRu|WvbGKW z4Aagw+k0Tt$~g-#nMtUQl~`EpJHk=5Npyl2UZ6y(#448i0P zvT?;#=}cNeap7c_DSIYrcfIV7Fb^&KARevoXM11oUX~? zxo>pxX&ZwR&(2yxrc_)_}IxL4x|CPXMNIbpRI)85({`qu6bPt`^+(AP} z&!!(0^D<&YAyGBlZa*e|)K}r5;~hoKQrMK2#C#|emPHvG*FM>vcN;D&<^)}7BEc`0 zQJ!-(U+j~TZMF%QSVs8Z%5}pusPNlB-Nl2ID~7aZ5Q%UA8kW=Aa>yLJT`I47ScZws z=3P5G&I)+*@LYIp3u8Y5+nI|Be_EjMka#ZM+aZSr_j|2qp96Q+h=0@+27-SS+Fd~m z-&dBgBP`ztobDqyM(;q4Gvr>u`omP@`}aYY{E7obZ#PJ93Hb!N&S>d9Ca&6j7S$aEZg0OG z%a`ov?L9cI-%u`dSIMDESN`Gb8#Lk=Yf+ByKpIXMu@d#W9?O@^Xr{YV-u{>#Gw?GU z)`{(JT$yQions_vl$k&+H`o{J^*W!jQnz2Q<;7e(Gv9ZoUl9&GU#LGSDoT6mqtE6I ze5{rWYQjE|pX&j(2jnb$jm%3z?$2NdD^sCPDvb-f;y3vOHixRS}PsJvc_WP+!e+8+1d%!cCJap z?@!s!`2o-JfVlurCO!FlGH8(NB)`isT_)*HF6hbmVB5Q1FbG;}XP$IX!jIw$P`gc_ zu+Os+klSLbbnmrLJbRNwX86;IS6>Q%Gk`AHx|+`@5{^C!wv zUa1ijYIbOT{6V1NH>m6~cHX>8R#IgAg#-04h{#~OdI<45>oG#{`pG&q2c(CXjLL&` zibEfsx+pKVPz0m2F0~5Y9VL8|8?_e#bYPAJ^#tni7ckzK|9?b;f>lbcP<6+pHRIFU z@C=krwserp-df2GX)=`09e-foLJjAsQLvSzu{V{DdN=;NnFkDtByA>2` z#6l|sPV45*Y@7(cek8>Dj)2ca{2rIhHLb`rS%|M#l*pXfty3xv@5*>AdoG*K1I^h8 zQdw-NhBRF%o>)ndUPH*HOC`~)VQQ`D!dlKLG7(BCk*ADApS0Mr$f>JQlf@c6p`E&Y z1|V+*ny~SA^jbZhFu94rQt;|&&_|IH^Pm>f=yVgUS6S>4m-G$)a$1?g1$Qit*0wlxFU~$prdN4> zFk%}ae!!z7_840Z(k_gPoe;|@cwP+h*4G{La)=R*QDhktf+6Qsy-DZBLy?|S%iQr6CY|ZZSs6C`#4+HWlh(s8t(Qf% zD8rP-mf~oLF-HNNBEe}QU7GIO zHB~{~8ut@;^_{5x9Xaw-;`xL>ex*E_GF>%px?;>^)sW6|?^d*Blz4PTlF5?rTWv?G z%<0%cTL?!BWmGlND08@;C$^9P9ReN=impNgGX>HH4u_71XmqkHQxk_TpFO8q*8Xpc zY`@2H{9;(pO&ESJ>`iO`H*4E2*elg4!yFmvT-=2RFEA1|z?GD~>RkgwGSF+$bT)Mp>=Q?w!(^dgxJ(`J=4FBLnm||2cH`B4Ke9NDri7y&%?f+aY)tALYzu8l z74usH)R=LVe3b)c4JRB*V|#C?P#fJ!YuChSq{$NdMvtZ@jq0Y!W{S61?1=@I3;m{! zZ-=CahhN80ac*n}PL7#u@m4gBnHJQ6kzelIi0*PJfFCht zVLI=E+5B84O*{FI_hX`_j8WS?s~hUuB1cRaE^m z)LB(_0S^jKg_72yff)9EtQ&RFtk%D?bHIqNrk#B!w&im2R(wOu`ASjO;3LhhPtgMO z2U{nW_1^!-a@+w3rE`u505FsS05JaBa$MEK(ZbZi-` zx6+E;scv@rTvh#h>$7XemWiPG`F=G0+2iqOdNTcW!qvEz%Io*$K$Kxi+d7U=yrB9K z8P;2(0QWsD<0n_>H^;aAM91(q*I!QQtdUtVal%jP9iPpI_Sm7-Al)=-Q{AFzdCm6F z&@b_bb=)?Qh_rRHs3fh4nQ6$q$g&J$Q3M8g-z5{K^}b!EByZoANia*aLndW2N|I@v zbkxRin{?JjG;$E56*E(GGFoqly%qD86?ur4AsQ`HNjNh}R7xfDiuD~BN*E=gSiFgX zC;~L4$T6-QDSVX6CM@076o!Fmni{cDX$t2)J=5?+!oxCx!X@*)Af;WVeN(w@8W{6J zu(jMdQ^Z#3m^E_SG<=g9^^vhv!xp()ihAd_h3YjcRgr1&<`RVNF>A9T*p_K?Qfd1% z*0^H!=2GYMxuNDI>!sopCaXs*KKfRi;R?26ZFN;S)Y8f_cEgPJP@AcQ4UQVNWVxnp zdr3t~z5#PnMdNQISXbdyuuV_F5XE9w3z_2vPN5x@WEZMgb(P;G6BQpMR&C=%c=VXI zr%TJ!<)=^#nm(`>7gVcDQdISwFtAQn&B>K1LsMNW+%X;w&kYxz^&ZF{Fjbn$I$AoN z(pSDhLPNeE85io0!66~9*n;{p+)=Tit82)%R=OxLv^LN!!Z7U*(8TC96*HzeM|BzY zVr4C*-3&`Q_}11&k+mg_6l*Q4Yq)4v7}KtQtqyzZ2s^n@Sdvg~%;Bz?leE!pAjGKF zvh?aw21T_7x5n=>W^Pi-wKBLi&7^g(FW~IpLOV_$)iX4OWVF<%;i@WNTb$M;-dVH) zHUpJ518`}SE(^BzV^ZEh$uiij!M}V0mpu@jCA7+TmJpZQc+)5guNKyjVM(wmH3PT% zOU%o>9O$uTqxH$1 z;_5;sdhZY_!10CJiVG9bsj+bBvjraC^-7ig24}+aCjE40`8;AX_mz`D0#-_?)Hx@}7jEBF=Zon%8eC<#K)q%2~6WV@UR`e}~DD z>1=e6`cWd7YYXmOdUrf{5-B^G<-)j5LLRkEut{MNFP^zFzVte<2E&iX$A7rEnJJMc z9w@OaiMzqe!hP<)LF1rEER111IqLDmIG0deUZ=&Dlu4h?C*>`>^z7*5(h8WLyU4mj9AhR5Kc$$^^!Kz zi*@NFnwR&IQBN2;{hkx|yZV!OhaRKMMljR1^dcVl0HNn>zd!@m8sxDeM8q8!V+xLG ztKuw3R2eJ<%roD2B9hI6I~`BLl_{u`kowM^Z-QJJ{CiS}E1P@}<8JCuW52L6{4owM zX36od`zKtOIga+yKb@w>7wCagj09GTrj$0HK-s8c)LEF6vK$NDfu4$9TpS@b)a&`(TGODlq7 z(P)Md8^#3w1j+I?;^sjNfX^Art2I1~T!Js5yx1i)&zB zl}`!TPer!o`*659o(+ylrX;<$%^iD3b)KLVYt7#_51Rv@Yjcy62ye$e6Slhi>TVQX z6IaN~K6N*J(7i1t_x3hC2!X~I;Vp9`AU=$5WBdlUAI&BLtLG@HS~%cq9|9Qk+a^Cn zKU2>%y!mc!_KYRR*vCyy4Ec7{)X&@M>|st=Pi(*QyI+`ZD|-^ZXn8?5#_M6yL2gWSsvZ? zSF#k*m^&QKcT*Kg&7Zg*w=Bj z4H&d|izXR7rkU1r@z2$epF_3iLOr%`$SGy3F1;U(zDajf@_^ViD{%u(t3Hvh#qx zvojrNqh2RXZ{nh9#5@pu9CeiFktpv^S6xMq#~?%*F78dB+roQ`iiUdg47->pY!2M@ zKOqRkVb&{Tc+^kdR##cxr~`4Q|B73g$!R%V%^fg1b_5{mj?H=dVGz1Hho<|ib&_qY z&wR7)CtBZ}i-z*d*W{d`_>~nE3olIRxdTZ5QcAs1)uYjyOugfCNOC*9z6Jj(>3#PMoC`{l)w+`Q*`-;B0oZ z>FJ*Tn>$Ev0wDs-U?A}U{aY~OD0l9t=;`^-o7Uo+R_~Jb2$%cDjD>fv40n*B49}C& zeYGyGVa9FP!C0g?+TPXUwUdm$M}u`DYSN_^9MJqqkGJQE4 z{lYJ1)z*#%OGv%dPw>5E7_M5jaj*V8Io{oH)fsR%?Z{kDZCvsXyO1}gh04r)EItC| zd(2s%hnA=+=*gAj?um75r0b(raciyUG5jkF@kI-&V}$rnlHF#F$@ojw3EB?k*qJtvIZOn)~fUOJ%M*|z`?Z^FY!q`ToLI*C57GJl#c ziN<5c7VkuB$pgonS?&v6i`4aFkI-??FWQMyB0JMzgN8@RleU+(m{|L5K_O_TR}7|( zzkBz5xAjx~hj!?Af=hJuS;FPQC0Pm5pt~Pv@*(9#)QxE)X~oRr)P)w-nMSH}s8?K( zpHl_a9SLHlix>~{Dp^$MV&o;28jWqfq&k7##r83^BBV4PgY1Vn6C`?c6yf_~VY1v8{Hu#r9)p*Kk=70v|~NYCpd&!J+q&N!<9u zcuwB>59QK(tW)L?a>h&@)6r&5R3+JLvgTx;!CBI?ok1^G(;pf3pSCF z#nNfFt>}*ewsuV7Apzn4y7R+3SYMNUcmiAIKXPATvs z)HGx5qV^+Laync2OqYmRrW?88PGM~t{5jC0mS_BCmnp9R<9Ak_v**OSG`mX^yv6gJ zlQT3LZ?bK4tvb_Zm|9NxzDvfO{3ACBDlX-d47X&d`X|R}A{lX?Bmb(KWy=OIsx)63Y|!0EWsS!R?^f^nTp&M8UqcEa4T zIEPP_^o=DuY-59YQL<3`N>Y#yQ^t+`%XId=tgTat3U3|qJM*NY7lq!7X@9=kWZQh|^*o5)23GB`tECsAb$ ztkqnRtUk@1ucp#QN(WImm`W}g6f&~1x7aT3k4&4>t*L}Nn^ojyL#li)xVtKEbS}+?(QJe=^xMNvBKf>PfjOlWvTrheIEgKUl3KtaSohWJkJs z4yUYmH%(qBf<;v6rZMc3)K7_t$%A{OLg!qdw&g;zL2w;_bTPD6m;pPvD%Dk3WzT)u?%$vBVB0h7A_CF2I3FCqa8kwuYp3<8sZ@`XIG`KsL@3q z_wp7qSnM@FKV_&==7%hBU4VHe|7dI1&>pGeY)d&=M&_1Mo0&wKD4cSd@vY8oO7Y%v zHK$4r)0L}NJ-#ZIs86y39ml)}>3D@HRu6VL#m=!`lHV>FbxGkDtgj3*uX<)tR*{*v zKNByj%PCYpEp{J z5zZVz)?_TO30!RibM~t!fo0LJz>hWfj_GY^F;94g_BOd$WIQLnos%*}M%#d;D3)3#>9mu{!JE&(N(w6m=5MAI0l% z=AoHVL|35bhDZ)*66X1w%sNccd1&_fM33HKj4QAEzq8ICvq&RV`!4vZXIj(Uy92m6 zu4U$Z62^4J#9kb3nlijzpl(>=XXKOl6U03rL!6!rJM*%ogXRRK2FB;s-u*^$4!Wyn|j#s1^`fQ8Doh$|@?+ybwDEPxtPd;WSQdzO&gJzE2 zml;gjOC1!eZlaGRpC7qCu5N;3FrMk@F?rnw_B)kN8ORT#Gr0P0F>LN+u;ceRPW}nn zugC7_fNHlnR_EKuM2}oIvc?vepV+z^ylO&;RM%3bMwhu*9mIk^4=TF0l zM!J2v1H}vjJ<;Nq89Gw2UKC;;QDalEe>}ez$-zaz^Ub~_uN|<>mjMxUCJQp=?8r~d# z2zXCyW=g2SqTA;tS4){ZdQH$gM=Mhl}yN$hf;F9G~xlH?`<&*2Mm<*g3)DHeSKe2{_<*{UK z=?M49ZFlkK4eWvCwKghUC@M00{bW2;K|AeogBZJxo=swcgLWr8^K~H(k(QQZlO_~S zQIZDzD~Hd$YZ78y)Pwc2jOBjc@F#IL#c!VelWC&mXBzvS&%4E2_V~p?bC#=j&_rSB zxL~`6xML|_jngb;i^R26J6_7@#a*ls+~QQ z6(5(+fFlL+fTu;nyK4)hpd!yRDxtq5&WE?>Alat zu%9fqw$gt=CphVpvOrMHVStQ}%`HYe$pVaE5!f6cW%m zB|jF@9=Zypr6MR6v;7xM@$IQwhpAgfsefWLc=6vTX7cm7|Bz8EKf~M>nNh4hRANk|pKmT$BAfdvH-E zcgU9$cQJwsI$9&gz=iw5w(j}^EVZ(SFnrROR;kU|>0IVTwLuzj8J1;PYnl=E1HtZ> z6#P^EK?0mhTA6Mc<_VgyI4MqW5Ux)4@U49nH<=0Z9$ToyaVwpf$ zbOEb?4H^rGOJf<0yp{;8&^FP9>eC9TCD#(10$09kcn7RyYZ+phf`V6`ExHSMz%_~s z`jV3{5Bi0z!mQB1Z0J6)MXCULhp_I^bjpFDzf_ZHY@5klv+$7#6fO8$LI4$@M%f;< zZyBm)9%7ZULv}uO-=RC87O<7Ky#sNlQr!-@XKM4o;@_>=C}-13-hrypO3{X^-^;m` z-@;|kDb>jiuy0-2`ek41i4XGD5nu=KR_bpB+$i1I_}`Mh(e@F7zW%~lnG*xx$=?z5 zDS(awJW;tp?&<>mX_n1nfw*h-AYI&%T1uTs<*b&O>Ub*QW`VeCS?B=Xa{ZA2I*K>m zzDX!uAa|91D?lxk`>#D2P(Hw0{>vj;-zL-!kh@xcEWo#Fj|^~Y;hziqCEY&@w6mJ- zowtK;xhz)p5xn6Gc}G?K&eCUx@`bkN2IUKX2M&t=>r0`Z4B)4DXXf8a{zlce+mzc| zd5s_OH@w1+;*HN=4%Hj%&hGgyeBUW&_#rS%|1<^w+I9rYo7_!Mu=QgC+5wL!Sy1v7 z`n>$vk%>ZQ44KqQJX5VdL@h<RK3IagAdXL$k z1uG9OPj}Rnvrp4S3*0`Wg9T8fW>4Cu0mTZ)s@DJAM+z$7FB-i9GFL?aQl}vR&0iTn z--iZUhngoNz{MX5*MyuWwQ2q9Otlq)Us(XY&lQvl;7Yj$Y99l}j;`Mt@CcYuvj^%6 zhN1;-Q~#w6TqhR#3yV=w2#nb{DP#(DL)l|YyZFq~UAwTwD)@yl>LCsYKK+t~+I?&* z&v%dTQ3Z65u#nrhPsp@3zz5Ju4uDPHMDY)aT8L}^wI>Ve281JT&(_BSbpy&?ws#5G zmA{kmx1(s21OKrR*;N3+V+=*vs#OU!;40Vy@&|YMD+Ux(?nc)qlo1>Xgg2id286em zF$$Cv3gbS;UA$-EZ-&AReU}A%O!y0raY6`;+gMi-{4UNz1IT@>s{-&(R0H5K+ED`F zG5;@QXW6$;=wuYCPe{~b%s=#hU&AY^Hz1GMm|y4w9g1H_)MD&Eg9d`dEGGQFHvqjWJ+o zjR`?C^)W@XhCacRhB#2PhNNKXy13*TeGGp!An~yW3IL?WAgX^*RXh~GU`j$9C{jaG z5OrK!aw&k=I9dVlUt%$_@t+`S5<+NVV+u$O0zxT?F;I4WiAw*3D8~bJGP{a0 z3qza(8KZMVm;XqeVUrF}(GO-0E~E|+DMby6MEN@yGe%PP7j`|Wn?`0Fx_}=kWTVE3 zx$xsH8~u7HgBvUCNGjGFhxPAUFhkd*{zx@y}ll(*O3oFlczMN90}}W z|Hm2O<}Wj_V_u#}lhcOg@pIK_A{Z+)YrnL*F@Zef!H)!JE>{UHONDQdY%;@a5fQ_Y zP^-m;T&Yjs>}V&m7hY*CoZudOX&HO8s!qdi-_I_9F^Tv}NC+P?WD^ez?HW*0+k|iK zX%i0?h~rcHKOL3tXhb9a5s5US2kKKLVeR~d)%*?T7+v9kXPYl*3U<>V_Pc!QL*>~k zY1=ln#Yrgh*ULZ?`~zC8T7=fV7xu%U5FvnWiFM_Qe zxOdnwJ5Mpmdm8ucQ;{#bU*6ykoe+)?FQ4-V^jBg8_;X?UgE9@y}A3J z5Zd@6&qj6JaHVAW9!L)q*?o(E*|VwK;9Dnpo?5AAU_l@F5_Cen1q*Nd9=gl2fAoU- zTr1#*`++^T8}#?r82-Qm+R>)?5?9zAt)(BxyV27Z^19=fspzxZ{GM4H-zx9!Dx|kR zDSpAY*hBDrB<5bK{oiEHAFMsLxZdC|+$>-CZ+On)SfIaUG`v7>$OS)`AA0m#y#o(y z>VM(h;dSo(fWM#(e&9b!=lBu>|L9H7e}mWLUe3iDJz^lS`I1LAAxy3w8w&`>w9g4bL2h-S(X+SQrgD|2}?Sd1Fr$lfbc@}F5#yO(FNu}bhS)|2KlA{JwU?0#9006Ti@{g$3;yLMD~TQTR{<~%E=$0-0m0F`1Kw$-mcxRg~QU4g}po*ar;R#iB$D}S_^un|*~^(a^$%Io8{+?ln4-fTaJv;;~#$QIxKQmXuM0% z?mSwjdN8>@L0$SsRn&&Mp&*fWm2N>OeEiSwEHLgvU9j(P_%Dh*RIj+cFBf@!Rh4hZ z+v2zV$i{}gAq;rF3W z0R%{oWa0?n@6bnj^QXIWgS+`Zzh3+b@bAKaV$5mVYzfh_CSz zt^9jZ*T7Wa_-#YL4<`=2Qj!Yy*+)8cBkI+?e2<`3H4f)?-J4|qX<^OHvOsA?EQvr5 z&B%4(Di9hV9H0#t4Iqw`N6a2gchKn7W_yxjbXx%3HjG7Ue~vh(`9G_->kD-}a)ePn3sfm*F4x_v7Jz^&FBO`rn@cg3;G(5;q#vbkm;oT|Xe z0Nz~=>9D18Zc4mweUg>D3b+QmM+Y01|0)fdS9Z)Dj53S9`DMMqyNedxum;8m*pn0M zk?5FAoPbWHD6^elnQ1h}0&X40Z}>#ZarSFn3N0pXbHo|)4y_5AoyMZIjD1pyO~w&l zS`#nDJ&5)0relcq;~yWRkH7PoH5e^9JJ?DVCw0$qZ)%r(KYahE3I_0>RWN}6&w>2k zs$dL^4eXsw9G&R?d)Z8^0NZvm2mlcFPet|ro*-c8? z;}E!P3p$sQpFF>k#ZzlwQbGZ*`qM*?UcQ;kukTxYKcKd#QiUOUL=k*mi&5f|g0|pI z%XHPr((AN-T$c~&`l%K}Swe|n&f1ht$*)IM?F9!pG0F&9>a#bZ2odV@H^tG0m|Ewp z)%t?NKm3!hWTzmIf5d(g=Xw;pc zfYD8P{Fb$6-PaKpC)D5hKR}&`bRfJZ;Yv2@q~;<4C&d z(o>Co5xyKn*dVdGrBl?HadQ!b@>j*Ei_gv&Ki2e>TcSQXL8VAWqq6J9bSWTBBmmzo zHLI^+-IMU}Y>ZJ%zj80cD$m;`M^SLK=4>$5Mxi--)6D6_^-IT`k7?Leq|uUZoBA1j zHeRlTm~^PxE=z;O*xhydKxz+?F?d=ROP!urwUv#}wkY-)Crk%F^q;1=_ZQHhO z+gWK;+O}C~+qNoE{eFM%-O+FTyCc@gidZKz=DM$eIp!GDxvQBB1RVMDsrO`@X9GJl$3YxRwxXJpm)LH48y?wqSDyw0wI4+M zVQ5g(oA{UrD8>S}Ehs<|G-0U`rqX04FvJZs0o@ro1H5x3m{7nvJ81fZZ})*C4PjLf zg9{Y@0iri-PD1^V1>DAjT~SamY_5D&ixy7|6vuNA@<{-O%JH|H85*a*Ao6?dj-qgo zivt_%8lBr4^?6U-xksdiCg;koqabc=#A6&I>@sNJw&u^$+1Rrk4pYuSRdE?xDH@qQ zM)c+LW%q||x-z}7{4DBiX%yO+BTCw7UyC#dII8ClpCE$^@4 z*p@cxx%pUIedx*)-D)d`E+^J+rmEYBC{}SfNE~~;#mV1!)J&*C!L+SPKl6>%O4sw^ z?Mx|KYWh9%G;eQH0GyWj_%@=42|tI*-!fae^sUOCLVr%D76yGKx`zuqGC7t#?h1wS zNT95ybZ2dWzn%>26193-4tDA42s1{h=*FRd${)gc%sO>T(35>4vO0rI-D_ClZHX_! zwpwTQGhWu^S8CpN4C!M!UBuij~t)6KC%E(XM)I2Oe%{K@U1vrQ^3 z>0oasV8!NB;NSEUBr^N#`GurDQlfHt0-7-pr$ytF*p>2`Jm44N6j_&bNGOl^=)RpufZigjR&&6;*+!5+Swm+^@ny zt$Uc}2eflLrK_LheUtHtcz9`EhT>jc5FSF!zr;ErE;a3)?mJ!sd}00& z&+_J)tux`a(=yHf_v#JFkWuzPfPgx{fq*Ff=haIKX)6BzxUZ`7pDBdjWpt_b88P5s z43@wHt*P{wbA>P@V?s8$XUI@i95 z1Q!Zmyn?)z!N(aZoFT6m{A$BOnPH=K9%{*JLmP~o6AcMuo15KSN!P08-eR-6JntoP zKZXo@hv`K7_1TD(n!>rTmChvnoTKvKzRWaSL{(Sv(S4IDTU~^ip{6S=Is(dTie;-! z9|=IWGF9artd1V@98CNz;KV9eZl^^qZ6SX!N4GvuVIyI;eO!iqtRyUIihS0F<&!Q!4_`8}o<>9w&|%H)_?O<|l#WOlypp2N_;Z z_L5#5Jw+GNnOuF^wMQ#P`Bo>Q?3je>>`tRBr5C zWZ`L;h@V04ZHrYqsYJXf$3x(~SMHF_sQocsoMdLIgCb!FiCJ&41AvyGkUx4s)^zAQollF;N&d2cNe0}0NCq8)V;uI2Gjb7dOs4Zw{-iP#1! z?u?_Z!%sM@Dny1o#e3g@d6$Mz`$yN(KrNZa#dkSqsI}KjLKzb0F^nmtDP@hA6X3kb z7rIF*<;wW;(H-qLd{ae`msOC>SPujEde7nItD64D(l{6I6~(;ZkrHug5?49ukS$Vc z#^&mayCt0c?~5tQZ9@mYnp?qsQ~QL7OW`Z9ot}_d3yTd{H^A4AOR8cW)zIb?xHB z`K#@3)`U(=7;h&*Av773Mws*giAAm2X05Wt>4dVyY&#iEr8_QXuqvfDdPV&pV3h&7 zP;_5lnV>jea0D0>dz$t`=^JCU{v0)X1s}C5p0Yjs*>+EZ#^x$oi)y)_`o1F?n%jY~ z)1nO;xSnDj2bZ<7R0Z~Vxs994)_N`3Y7$&RhvxJWM4Mbb2F2-p$DZfL8L+EoIy0MO zwhOKP3Xi{ec(Snaoi}|MFQ1w1t(_p3;S2&xHcxfwZz;QMYzD@20DcoTd;CxIJ!=`B zhnv3Z3!fWRrNjE_*H+iHmwEeg*ZbM|S7ikzRW){HbrumfgZ1)D8n=$}yyFBXen`JY z90WSw8!#VEnF8@8b(?y*dc`IvErMJqAHW6~bitewO+qMghl%2&9Ri0q2j8#llKE$S z?hppW+DWNEa&t)L-N5t(Q3!78Ac7p60#{6t*dvz& z*N4ss67z}QIDg|FV57{#hl1sLg@=dbQzVv!h!{t#J)$B=6yY5}xPuEu$VYUFFc2cT zN36_yzT+r)K0VwHxQ*NJFYT$Y^0^~xn+fX@mJl0yJA!tBR~K>&sx|HHM{W~4L3D~? zp3YANKui*X(o0h9iG@Q?iwv7x4TAhxbt2Qq`eP%z;Rd%45$=R)vZX*A1}I^Igx5$s zwg+IiZjHg<*H8II@b+48yaSW_n=&}1c*4gGD>9BRg;AalDGiUWNDX^*z$Bid{W0PZ z54gd+7B$8n_~4WWplWpnMsx?F%DPA6cTj-rsL3`O`-T%SzgbeqSc;G}BT8HPku|H3 zHK&O3T&wLd!ji|ce7i0D`Qfpwmvm~WC8BcV(Og}e*7mEhKY2@K*0d=iAZKUG2t%VS z)m%f(${oGu4j?i9M#N9eOut~#c6Vf9sS_z$VCaxF#4z`vGpRyvCSi^ok1^F$eMxgZ zTJiWkI^ofZVelcG%H*c{!1q?*d)l5|F>^YqG4gtCbML2nkVCtDj5h1@Nbv{w-;B-j zKPNo_1p=b_2hoK8BV+AN|8Km8sp`0Fsv>>IJ3NR<;g(AgxuKQ{Uh3FrGiI!@*)2jS z=dzB}`WRt}x2ov?B&5wcRP^65_aXab@CV`KAh%uhwrj z9W;KQ?h1T^IRX%iIKz@de;TD0-|fdh5x0+KTrzF-E2D8Z$qX{@_NCsbp)pm5I_2CN zxLAuGfP(LtSh4Ix=p z@Wt(KM_aW#;?TJ~N`E)(w6M|i(Y6wclvK6BFW=~(W#FP~Or}z)Ha3rS7HYw{kbv5> z5F^5;xr($+!G$eJUL`@Eb2Aw*>kL~K2?yGI&4imTFNtUHMn$iaf~zhB*{%ZWdAuDc z|6Gbs(YT%5EfcgN)H38c-u@{1NdminkXsGOKzZ~Am@TKqxlm!-Rf}`~mNyZx*%*0p z!kpMLFVKY6@tyzFL$UH+%aafmu}dkM8HE`7 zl!}ftg4#4+Zgnl5ainG&-@R8BtyI}?wD_)Yq280;MHdPP*)+LSZ2H_G&lg5 zQMSvNys>|1_igHNxS>pUK37-Ttv~rOmSm_7G1`?D^Dm>RF;PnH7layXNApZaiv(MI zijUIHj%N-5pw$2XQ?eyf-^eMrreg3UCvXBKmUwH&;yMo<`3oPohqj$CF)?wxS2N$} zIV|4}$~O0*s4GXT*GGh)nCy_ zcC2Fg0PhZk1`q`GF|VIOnLE!R|5gj^k+`H4ZdOO?r#7ude&Yt-I{q5|a4q75z6YL- z**yrBiR^Qt=GWy!OM57q^;UXBJ4TXENjMoS{fKqef`f005>&jCjajnAa++H`%1oWM@XGN)PbszoJ3P{v9&o3+qR5h_?P@m*1qC#ET> zNoU0-bT|VED)bFBv?{W^48@BQMUD&~satVRf@pTy9*<+YBA(af^rq)D-{rRY@iw6E z3t`V{`tp~P_!w~Rb?I}i?yT8ecRbqcWu~Z@Hp5w_Fj)w!b3yuzRTf9efLM_3)C=Cv z4%-j9F_+!U0#qah=%*QPdz$(!!*%P{YqY_+U65=WyETw6*vpj&^$x3!xCiAu9(xnz z9~%5NdMy`lSlV}=;$D8so0*ghJ1#8bdQQ3&nJAJcuv4Kq&+33YJx5)ih90G+uhklD z74*A{60;=Sxg-_XmE83Hd-|)_Jafa3+AmBl37~T)PTgIYEMprDOrAI6Xh3p z`G_=dm~E}PrIl-MMy)gHOGT2(5_GWF*Rl_*vYU>eYlzo2j$l)|2ku2>N>gA?Rpb<>u8Dns8#^e1$xF}eWz^sfh9dP=ri4p_-WV*9^ z(fwybwV^@8(*H?O^*2ONA~RyU*SGuRARfbhY@G&SaZmtCRqT3^UaO8?eltS6w7=c~a7NrR%UPz8wphxLJP7@jq)2q#Zu)H`O`sDNnFkqh z2b6A54m81>f{>uWm109YbC7N+BSVZd!HDQ4WGU3c87neV9c`%|iXXz+q)IHSr{ zU*EJv8~x)=)n*RhOPcMf7NuA^_z2SE zaz^l;uH|WJ=x1dyL)ujjrI|BV6OSI~Xre=wj30R%++KVd-R zKeGP|0sqNv@GYjdE``d=q#J zx)6L(Xbat49Lyp_682Od$c1QY43udavcCV9kxlxn%w@LOW!b&0S5i<7W3!p;kbC=n z^`o+ujnMIH%0ORndb=HqtNH62PCm6$apq*?FIo{Bc?Rq)DjjSQheL1fthu?_dHMit z4p)o#LYkdWrqO4#TB6rEH*_$gJ5CYvPd zyJzO-LHeBuQk=!N?|3z;3O@Mg2}mpCDCvDz`X>>CH{v%I4nu1azXS3Uj=bg-On9{R zsC+fWXjUAfy7MRP;RsLoACVyRo(el#rj}bQ)4VdxH5iG#+DIK(@1gULn7Sh@GgNkc z-qs?lG5on9kF3{<)m|vYozxm>Zh9+B>l{a^#J9_o9PJfFucG|KreaXvNPV0>kj5tqflh)`d}P|`}2#5v#@2*GxEhqzGnGOcX)g*XDtjs)}kf|i9LBE ztz%UmoOSt2(Q=`T(J0V!l^M(Snu96Ocq{i}gPp(?CVn)*s0K+Y(U>k>Rj5;%KXjl@ z@B=%E{-DmELzl6xWvw!w%0?VL#Q`Q`O2m@Im0_aQ63Rfj8~N~7=~=jg@>GdZp?beE zv-P!99F=Av+yksgh=Ng{%a)CbqkJtOqeDHxk0{WF;~zX+c@r;AX7RSLA85wy!d=G}e~M z=xkfJwmz9-RzIRBGh;{(bHP6!(OT(1c($2KU#9I+yA?N~0Xbbh@GAb&(M5F*@}|Gp z`^}S|HCb8e97NKU&JeZ}WnB5AYzE`TMXEMJdf@QgnW%|h^#&J1f3pb zxy;sCbq9Rwnr}qo`^%8&~8TGweLlJ}EOhvLC=X+rl40IXz(p ztqF5(PYtErqn2)u^qzIGelW;7fu|&V-Ephd<1Uw6o=(WXy23m)iO8`L^?Lc)XcvrO z3$c%PJG5cg=E$kWtBN={UGdRaefgLS0m0E^?=6X^_prDx#K#80Sapu+br+c};i*wc z3OsM|NZj>{U@t7<;^5EII2e099M7wjUl1vNi)Daj)(}t4x`cj`H8X4X%;md@&{JBj zzMI?@wSEh=A5+q2l!YkB=`5?|+k3eUNy|Rd7t{s2ZD#1LjW9Y|*R9@5BUsSz!`6yln!N^1+XIfy-S(SMrN1m<-6&uqKKbRFpEEMwPHu{q=6T$=2{P!@nbC*WN0 z==V`vKoKrydA?U5Ee9S~ZCLomR1{F7&Kf;e@&@sv1{_?^ti&)$qOdtiZop zc4EM;o-$(Hs0pcVEQVXXtEV|Q^hXxG0^OfAx}Ul_gr=bgVMW2d8oSYYqKd+1o4Q&* z#%;w^Y=U{V99x&k&}gXpqZ@}#dV_o^3WGIBIaCXV87R49?z*= zB<7}KNRKUsjj0$z#-GVyc@OF*Py_06QA&WnN1^`JsQ7HH+|{u_u>Di?7bmT^qcZMr z`;S{!vg60PcvwKrtWT0!`|u&p(P5OMyHfih{{V<)I?Q8zKchH|eIG zU5>6RD?HM{nV)hgi<@zfnYKCQ#LKXXnLONCWGMfm%Uo4%JDa15ZLy(F&HxDs6TFig zx9jAhm8VX}jRfY;twK;_O&tK_JWK5hzQ^+X#o1}LCi~@~UQoFAXU!!#x2bvVg|m~} zgcgrlZjVEmg6(j#oQEo5E>0%JR%nyx?NY22PSbNsqf$>*1|36?3K3o2ktaedvd2g@ zw5d+L0Snz~1qKD3$xQt=)$K5A)|PxQ^KP%Mg#JU?3X!SCX=Z`Oo~F&x@k5o8Qv{^; zAc%1Z8Z&KBetcbOv`N>NeVt9ofGzF^jv_g&eF!wD!ou0m(aV$i`k+)3oMKJ5iDx)eOR!JMw2TUcZ1Jt10~f3c}W)6Tuec8B2RS zp;oXe(u+h_T%znb!7na%fee&qGOmXh%x^H|_iO?*yUkCtS(4^aN0iJ9drUGwf z(2+RcCyI2zplGWf6TnTvV4_H#n8@&ay4e+??#YPKSH>)oobUy8-n&Bb9yd~eD zQBt1|ASon2q9s7FeuG<|(|0cTVCV8Wz#W|5z*F)ksCw5qSUk9PMtnecw|QUg_TTE* z?CX2xutvwP9Ebegs{_E(i3N(I32^a_{ z>7RHH?|;J5|IMSklsWl9L8Q?>a9i-t5SXHai4dyHc57a#p?MWl)U%0A5E(t?jS@6O z{%lBs{s?A-W-Cc6si*p^uQHatth{aiKfeCJ?PI0!E_j&S+Hf199ffdMwQx4nJKzSP zlgH`V5!>z?1B&>RW2pPYiEw$Y!RzOCN13hL*GdO&xK}W9`wT;sxMZJhm?A7RiG*;! zWkZWOxGXG9N4giZc+VpfwQT@)Q;4|ycppuW_<4x}b#Os94}IAjIY(w6;05GQmPf*E zX-&?HML}N;X+?LVa3=zV_imO!xs(ayW;tKwvE1*jUAxrPi?f6Fox}+b?}8B0 z?H3|&dQyRt{RUtpQmWRC*aHq34Nt<()+|d4p5fjY1|~mfO4Uksg&3Gp>qVqV)FPkl zi>69wDnLwM>kHlxB?*es&qx-=Y<`Ej`pI!vigl^5YP?+i)d-vQr*ES7KQT7|+K{wN#?nX&J#7^vjf7j$Hj} z$GT?w%KExjvx@ zC8-a zBm*DF+u*&G+Dem^Sm2AXf6rE&KZ&&hkWql_%CoC4^G}lP^KgWdPbvjxS#qm*`qQ$V zR6W!f`H4>2es_%{K}Hl)7kMisKlp;7;Ay>IHm(l9PnP_m-B(o5q0 z%z@#1BgEEzqrX-PM$)W2dHsvs$hy{h>{e3ZvXyBRi;rDOcDkae+eq%CWx@W8`3Q_L zncggR*=%a6F%?(Jyv2gHyZ0y=KR4G;(RJ+WxSvjZfegKsUb;XEee7Wg`dqjgX-T%u z%2E=h+OZc#bkr21$F8}S>}T^92LNDpj2sq`{OPU3oa}6kwd1^zTa3+3etVl+#|Rw` z4;>XFIgQEr;z=p(7!c{epygreeB}ZWtXVHG)bWy|ibmsnGV0zmZ3)@HD4qO5&zC&8 zpR><*)JX>^G3Mp&J?RfUov|$!?im&9)nZK=UAbwuEBv)uUAhDRI3(G23&&T!#ZM<6 zrWu!8k9iALm9^XvDSs}lk4Pfyjg0P{tW{39Fy{(fK)|-rs^6&2nGhz}J)EXZ7G&y` zyrpa3X7doU5j>zg`rAp{Ly-D>P&~=^JrMsme@v`J*ZhEMa5)95p#A|?(UdRH9<&Bf zweYx!gIk~t_kn!n$@K!K0(_4YB!#(XLEKnAzlft=IX*|U*m76>;4!Cd7;4BmLL4%~_%YwXSyLNc5%{3$v;hvJIrj>+T`xh^qHWc*vQdlUAcVZ=@p)kr@W z$5A>MKNy$rgpes@7?;RAFmzoPDI9~LU?CVxWVoSfuevp^0bkF`rVN8&g#^69$cJ5Sex{!db4Rv;G;nezx~4iEhmnqmA*S)rMBm7|sTZsdwAi zYYFosvoVx)1>jCmP996(Ojr9s&Ap0gm3EkpX}Hr*#>?#OP3p;uh7bD^0j7CdKR4#Y z)pj6I29#ExRPE5u7g`0zt>oe44S8WNe=FJ(v)H9{yZ@xW^ugIf;D%W4qeQUh3iK?L z!#{jZc)>6KT8zKv3iV7_j#$h;cwSr)!RZHgF@MlHnuLsdKKe6owK1Ix$zCx-soB39 zM7RIX4~9XkZ!&Cpu+cc)Y%O%1*>^JF1d3MJ@9I zDcOyMC`al-SFhQftYMMaqj?d8d!Eb!Bd)+}I%Uyo-aD)ng5D(WFdgVqf)`E-Ifs%Fk%+r7p|9d$7n z6224F9BLiAP;v2+q;XEaajvwX~`7LV7VAYYdD9pA$^f8@vu3hHkEyjVGQaOY-1X9 zwea?k=nFH;;dT#t;W(!5I0TvS_LyjAku5o~JffRI;~t{yiVD4ObGYS3D0q%(NccS= z==P7vhC=)PmQHvd4NUhUAomy(R|E2f#S%x%l7z=`urV^xzEbc3~jFm@wmFOq9V8 zR(CIqbRu1HT``+AQFY(2-+>CehDAthOux-Pl}1@MOI4*?036I! z!an5v7@M>r3zy_O>Ku2LQO$Dy>iM|dffgMOUbke91LcSY4m)Ik7+dt6cmK(Y4{BnuOwg=QQk+@2S^kK1+L?Yd%rpVX3Z| zN*lIbX`q>{c3GJPfO~0!pIS*czm}mplU|E_P7@*McW|V%IxaMBuOWMSIxd z=T&`0Dc=ejt%9yQ+wi94p!Ci(DX1l0n_9qU)Kx#7+Y)ZCq5UF^RBKjS_3g{UNJr0& z+I}s%?1N~}Ln!}x8GNFc7{6`&vVXJO3DM_4T_e9F#)-uX896A}`z@G{X2+j`m z&Xj!z_I2c@*2okn^ic_k_XIVA-k2uo(XxXy!_6pLT>Ua$xq|-zrSZwKMSnFkg>V?* z{$Mpv7n)ck-f9!wsu9zANKC&zLVp;&C>iVvxR*Xt;Vi)OwHi`=^TNx7=|hg5M|XNN z!}U+n{N(G-4|zlMd_itq_m7B}M(&2Z38D7IJmN@L%q&wVC4A`uEBI-ISJ@a(Xx(J~ zz|9R_PC14_XKwPLdy6ou$grX)kd!x}b56)h+Ha;^}R~);~h3f&6<8=6?xE!TH}J(sMyo!}6EscTaJJ zwSuX6NJC2_&k+QovsQt%0+y4C(#EER3&}Z3wB5d1nGts!rTGqAJ=U*luV7h-XFeQ@ zSRl>L%5~XEc;ub?$ai_U4eiqK)6D zuAQKq)QmO)td2N}jLu-8`C<)77}G(Vf7`09v<5$)`^)&kV*JzS@B z8T2d+Y2Xg0($}3>7b~sBGa~lCzKx*(pGiY^-s_Dy?=#`cy}1D;I0$Wz9NU%sNP3Go zWhbt7vyRrPJHefjl}0)atx)pXzvQ;HOfzK?!0-X%s!}VB%Y>c9X4^+?UDw!cx0Y-n zyitv6HG{McDztzGAXni-19!F%Yc77cYkZNCQa5dVm*8{RDBSp# zleNxuQ_l2R+_fVw=*KNZBav}X1$t&(0ByVGC10G;L8QE*842TYU)4G$)XxsgM1RMLosxSnA)rerr4aNjG5`)| zl#i$jfrAq1G4KJd`F7n(EQ4fqXe!V`bAHi!4B1Bm={s*0;9>s!7o{jaVM0#LcckMB z#W*mpNG{w2ODpokclbEMrV|Hjl7ucYqSVzXn2t->Gv#a8v12}EX1gK(vPUY3yZX}A zD^x_jMSz4Wjtm%q9{Ls6?_1*5IA|e-bkP+S(yz>;QSz_M3@OTiQ$HgM!o@XFEIMsJ zAz^sgqBx!UdYG==0jX&fNOQf3wB93W17MnkJy*6uGt$L*lvo-MJn z94diMDT)6?^ADPH2?Q} z^gV{G;N2lPIhU-~14hKAzbD?5E3CQWnD&i!rxwC1=QI--oK%LGnaBdXmda|z31AI1 zd?mFEyR0G`r${+Hd(T$@tJ_H{Z3Zla2W`jjuB5qp_*Z_CnpKDHr1bCXOf|{Hta)cN z^^!f;T1q~1C3Y-v=4^c=_Xlk&>9urpm4&d=BBN?_w;Eka`VH)&6E|BplfvovH+eKP zB|0dYbv!DI*|1ABI9+)aIVrZ9C-`ZRG)^-W_0U*b)#6-AEM4XfkAejTWXSm?TJa$7 zcAX5UU6;wkB{!!!WBB~*!JV5w@=xrNNC~9lr9a6dis3n=k?I&02HEQ-!PQu&xR0}H z=+!7AcG28xhy+U*lYGE253J+*Oc9t`M!5v$Ex~#;lN{#k%Pj&AL8quLqpiQwDls(hel$s`NHN=< zn>{e=O_xL+J=*w`FYKwR;~Ig@kJOeqhk7i2YZdd2#rq`z6wcpVm}eR&Pw(0M8A@AF40wse?A0z4tl4r08IvyD$6ov%f24ni1wro_ayCM5|HlQ=77NH5R{B`NyzM@> zaq}aKukh4KL|>l?Myhd#9l6Nee5bgbW_cq=)QHSvZYf%Yams*L_mFmT z4hp^F9P-}PsB6k_straaJffN~=euHbUxCr83Y<`w^_K9TT~I}>v0tG77LNXbqImp2 z!ubOGf7F%#XTX?(y{*^3RHHIwzbJ^tm$Kw!toz#^v=m7?JGB#0-%fg&8mf}gjto0G zbdB>ok<;0(o}%Il%|8%5W{_Bt7U>F!Agmorrsq%~pzjY*eJ~w7 z)s|Y)JkpRbjMfn=?ScNCrm~TxVnelYn9;A(e6tOStw*|5ua1w@AU=yThW2;{Sqa=M z_YfMWfIa|9PP$1HUAU+Deq>?Y9==O>P|@+-*QivM4_TA#;;iF*4N{HNQFA=|hv>`$ z;3T?MgY9DMW}@nTr4jr!7DWIZGT!e+mj1B>6`!$$Wu)_cfYo-f5*zZEyDsum7)K~k z>aCpvvuw18)=Y-~|Uy%o;KF^)EY5ba|*Etd6zXQbF}GAP7LM{`7J~ zG$b|txo4~!Iu7^4+L9CeD!}{?3pn0k<{5aGWrnxragidokHl;$*T5ACy!a`#y^S@ZCY5~<7Dv>f$4Byv`BG6 zcwCt==WUV51<4va$dgacmOB$E<`1Oy(rGE;H&F^k@c^ez1x4Z%TD-#>FH8T|O;zu| z?o}ZD>xZ_ocXV_8E4Q2TxpwD{00i`g|98pn|NdH3K~C7s%GUJ%+)>i-Gt^mj`;+%- z%BSP~ooKu64ILC3I!quX3(_vcB$dkvO&)JzY(kMLZ2C^7lt@N0k;n?%NN!fz9Gjk= zoW3AzB|DL=#Ge}N3Mke~PIITDxg3LtZEe;YGo%Trq0w98y5*Znrlq(--1fNbIQ^XM z_(vpj^B!}&E+G9V(O&iFTJUq8KL~Y#=s0gi+U_#&^YiZZ>h7vB`QB^_`A)^!_&!=O zbFSAty3a;-#~qc^%e&9Utg^mpFhSpH;pV39_yD~OI02^vh<73Y{lxv-o;PIu)O~{P zHzt4LAq6w9PF#V!JK20DKeb-liWWV1KWM$RnQ(0{}aRLH(Pe)q!XL)i~WNW$MLoIs>_4=XZ6> zqog_w620CuY_*9t?PBaWUobl#&SZJgS0wCC)Cs(ru5eTm8J)U|t!AgZo`&2#`-IWr zb9Atl2CKk5?G!9_=;iJC_H`C^W>fNyArYpsw=UEqM_a<&*vSo|&IO)gszEQWv-!6( z&CWEnYW$ed@EOvdcO}zLozODotnwz&makXihpgB+Wi6eylE0u~?V5GyqnepDY%GYG z*^NgRryj{%M1wP+QDubvthC%m9EpW1XyWE|E1d17bBmmUMT-${CwZN>Nzi z+93OA`%X*6yM;OSOo$H4mKNRP>D{YxbFn{nmvTW(TBb6-`UN7>({)yRa%b-}t#8?r z&v*{gb~i`y%^Q+KH_cK@ThihAeEEpa9K1DIUXjHAWL1c%s})RDjj|YMA|&$LZT0tfQ;!8=TDkE}6j9K-1nG zvg+$r?azR^v>{WAx()2)3{;*+WYHDl%)61x-Yo7~=g;58jgQMh`D0FsA)h_O=Z6|( zWbzy;F}-BD=3FxQIYP9SBtNxSc(0zTl|_|*kRcv5n=;&-%bXrRs@?VWX5^0sMov6` ziVag9>gUR%b0D7(8y_k$LXbkN5w60+5iX%6Y~gyTb=jbrdar!t`uLhXqxVvnJYU$* ztYzst2Bw8VIjNy!+jA@j5&OuY_W5hv+=G>jN{Jq>)%msJuqRqGUo1(K7Wvd<3?POl z(>TZGa==wd_kN&yVvB({l0;rVWE^-6G*FdaO%MYvJm&U>w3^lZ#@ZG! zW_;dV_2W?6SCOPozD2eC(4<|ZI8gq1>4!=p93IC!9G+En}wySlSc%HVYrT|7jxxZu#t9G>tjb8O4igwjJ8MmHv z#<^$Y2Gp-JP;R>7DL0sTXTXMAr|_Nn9)6tqMRPQ_sb zdSMwS0VlqD!teoA9=l?jJPvqG1pE1tjK*bi)^FE~avN9dA5&1hRBeTegm&|mKWA6R z<2&Wc5usn7T|vi`qip7_ax9^y7)6nJ1W1u^q8*kysPn=nQjNOgc|@%#a3UC#RLk{T zP3D72M$guOM`7hPMokM+JZ8BJyp6UFbBikO##d%Svn;%(!psbk0PhNoSG%)WtbQp& z7CBE7WrcdS{C!wtIhgV-`?`<|OPa(H<>z{zDwUzs_L-y{6h5(|3vrRNvB|HXFI~E0 zwq(>(VsR>!rQC^Lr+Y5gk>IDnQ_m3Sw)z2_6C?t>yzbiY@`lYzW~eI}{d`?z=f6Sg z4lzDDY8WX%hB~vGh)>#JgBNU8uZ(<_Ei^3k-#wR)(aw7t3YUhV?cz=!ewkjs$PqP` zsmeQ)_gqZ5LG&)E_5>+!Kt!W7jd_1j;F{1J{DIKLq{(U(pA=2dTM3r0PNTGSD?NK* z^T@f!JI})~&&XV2LpSvj;$IJMTrIjca(N~1#leJ?@{+&r$esB;T3ee;WJg6QROf!v z?|o5iUH59+Sy*mzxY4^4&t?OQn?FU*XK=Q~l)QUH`zK(`w%65%>Rh?Hw8=mwOCH+6 z-nT$5|Jj31v2o(gfvjw6rPh3Q9Xap(#`|Fq)^j>fP;qCs*V&RwJ@|7;U%juGC;O;+xT~- zD!YXR=d#Hctm{aPf{~MBt_8)dXw2OlB7Z zU*6-UZW8;G&LuYH67ke8B7YOAjNAo6sbHAFu(P+(lCCnfWAf{}b}ID8C=_9M==^B1 z8_2Z-7Ja|+o%fB#K{k<6Vm+Yj+)+ZKEu{pl(OmtCb%}KI<5$pNET@U&L`kom3;?xlvuenZU1t$+~ zQ}c4iFxW@%c)z znG|xH^?RpoY*~cX1$e6ct4Sn#A0Z9rCR-80WrG?7-9Ye{#tu;mdZ@=)>`z*W=+&WD}&={;$|4I??7tSI{%BZcMQ@62(|> z$Ya#aUb6cA#IS0)Kz;i`3>?k03`_&$wQezg%4Q91-{W+eYUAafEuE%_Emq>X;TZ7o zI!08|we`x6jo5uJ4@1G-X13_x`Chg$8W9YGF#Y2(zf)dU6*g5Ri~h{+co{H4_#Yxg zn0`yEeOltar28AZI#4mi6HdK0Lk>NwR$9=0AKUMHg)gWvS{{Eaopk12OH-{HU0~BK z6z2tnNHE3FMji~Jv*-%@1*Z{@FtKQv3v*1ijx3!s!wFZj(_PVEYaqrCcn(A54pX$z zUl^jY#FwPB)u#2i2N^+Jvv#tug^*jAExJQt;=!p{r$4+Ia9D7y>&(})U&RVxXm%ml zIQ1SRjzR2vSqhwixwk3%qcq^Id1!4^+V}rqRC;1M!&w6^K;OL47xb;$0=QaLp_~Zx z_hpPfw4xi%(JvJ9hQw*4#+}S?n)qb$rkXC08fZ@TbB736 zTDr&cCv;Lt-YgvAL}1}{)RcuWB@PveXW-ONn~J?T+d~8_B+L`O-}+&Oyps<2-@B0W zg(#EUP=J3)jRm+IDbS4UosNH(9?_nT8817h(marIt7*2oescR?OYwUD8< zXDhEQ_n(I7R>v;dNljS3oz81D`~dS8;}(NVg}f+yMA|Fi6Dd$3C{v`RyfFC7<}cx$ zFHqAfQJ}hC2${a{X-o0{t296Rl7!Sh8{@``r6U;jj3O|E=Vo zW8l_xNvQ&K!Ia%Z@buukJ62YR+0t3j1&dQREOBRtFsLYMb@X!vv{8oJRr?S7?r3>+ z)PJV}V75i4Z@TqMdss=q zslp@Dk~J0HEAuOxu`tO0;O_;$wC%&6vN!sE+or> zKYdM#-&_b!aw7pR2=Py#dTRG-j$bP#|K`^61NM>bc#H8FzMErFVode?OKYvQT!o!B$eOpUqHAtC;rjMB zy(~RC2V^R_r|u%P`Lc4NsIROS-T-wnV~=Jl)hzui&V*%?**|EC1G2mY6JmUOIz{q& z`DraAqJSj$T`Ex9?Phbud7n z5uux|t-n`JkwQ1l8bj0YEwn{coaQ6FmTVi=?y9$-zPngc9YOKtbZXad z_CW@J?i@B!816c0+Zo3TVtVs3*bZk%fR*;Opy06TgnxoV!6j!RGs0F5Hvap|V^%_b z{I@-g?yEs?ZZe9Yl}BOXQ4`Vah=lD~q>wTDg>>PJdO<1fPQ*FV!d8kz*i@q+3tbY) zkmQAF3@>ibb$MVA%6#LBM{m&T8FO+OIwNv;%RDwIyGs*iH=|Txxf1yeO8;}0lT7EP zKhm5SK4+H)*|6a{$FFW`1IKUv9Ra%9fL!n;1rA3$ZFzv?q03v0hvrVws*b^`5PU%1 z)U~R~TTM{x5mV)!X>d!i6d~#7Pbn9?-wFhtJqRTah{f?AN7JC^IX9qLl*a27>ccOs zLpRC6JFdeCt;0Ae^>@hsdX1L{PM6ovfPg4C{?F2js<767kzUHQeT~%qHWh5OBaw65Pn;^Fd)M$v?xAg;pV5p#( z)%}7KY}Raj9c^`Q?eEttlzkZkmg_-K{^}sBrLUX*#T5xroH^X%Gyoz84rd$}NgQyHx1WGD{YPt?8IP#c_&+8nS3Z{_M;k6#?1 zOuA49&cl&9IJq7qDEC8^b~jh`2D;m7S^{n#KVQe!%j3^JAwsq5j;sRb!uJ7(z1c!k zENBf;9}%{hQ-oLWG)oqNihOu`DiMhl&{|8K&GK@2R+%&q?&~*|$M@>R{yzkvGOFOV zJ372zidSN9f2!4I-5$x7Twkbv-j&p%h|$^{0FI9vaATlD*?)gFg>nRkVR%8miHCxf za;BQJ@L@hhzuEI1tcX?(EwQvQ5FpV5D;=OgBgICL$#D=H>s9+}OVh47sra3VCq--Q zq9sO@=i;GK!id8mLxzFIJx2`&Z;HH#`pZP4!a{PqM6|C$Q#;tmGbC_(aNIvqR5nu_ zBh|~1o4s6#uq@}JsB=GIO=eZXN!eh57f8U(R+t!_=Y)t9!s(^?7-12^e7=|Hx4jh9 zu%oGK{w-m_E~ton2O+^LwmjBS3=M8$K#BytqkvVJcyI>y5%0=A@zp)I`&&8nq1-+; zATCQ8+jdS6-n>eJ{;P%GJ^>BV8kUlvFE!p$BHELMYSZzpiq34mlUop;Bz17@*YXzRN(!Fv$UN0&iUlT>xjJug+G;Yr4s zh%>Vid$3odr-Z}llFqg(8Dm7nn3j{!%;^)Ug6t4w7`fF%1n=tO3G+O<5T#?my|_k7 zn?Ej=t`=&P54A(t=4*Y1R-v!|i2))N*Q$x5H6jnkPf2 z*Lik;p$TbS4R@kah>JXGiYzdloZW14l4qZknF5P?Ya$)M)TLRD-2_Xr9*ZxFdjP&? zvcM3ir3MW<9-Xjiq{O>|eU5p)zmz3J4ia9f2KAj3l!^;M8Adv1@ad3||8NVo$QnJH zeV!kupT(mvzUIDXv;J`Geu-LVH8M!BG2FxKmE<1IWhdQ!WL@sWak^Sv1E=ci$_e*P zjZ9xSC5Ya1-t(exC|~H19693hPUP~tvf=9%Mg_59%~i|^Y$b2}P83V8n57JVb?SAc zLV=c~UbvdPMq#(1A-#7Bq;fK*sgS>+|3I1$?IK58UWWftjVj76k-7648gm7iP?ciu zwJRb$sSwi6Flc$0$4=!o73JrbkxPZ42A@usDwfi=D}UOoS?XpK+*1n1fSBwkCJt;| zIsBES_oQ#3VP%4{CfRQJAn?l+lZ#W*vTzrbdgQU)uZv zxnc0Gnw`2NCO2s5E?KkbWo&>8m&Gv(Ql$}>SWmzfnZRKUVdFLiLbC6 zBrM|*jjGa6KhM&dO$J4c|?NEVBCz(kaon|C?7s!)B~3> zg3h7`eUNrUL!rsq6+YGGln2M0&Igub){E~k4M5_f8YyX%4QJlGALTXM1ofPH2mMzR z>&emu8+ba}W8MpS?|$sh(hJ|(&6(LdcIy8w6rONs>S7opSEwyBM<4qgfbF?V=LaM} zw3D;W#v%}jI0aznJs*uQ-wjKc1mN*8ju3lEhgTe0Por8~p>(TEPhSOj@u}#J=$rw_ zEadk8*#=KL{Q>c5^C(L?(gfJrvrEcqLQ&$WHW$0>frXSaX{=O}ECS8EQwf}n?y=kr z^(px2jZ+#8#C|!AMwOs>%QuI{emRFC7=9WjImb@GvY^DrDkjUl^ZF5w81uk14uTmT z^UB4s)Q*2%1%$cKwMA=mOmW2vrXOM6T&L6~Qx5NvItn!`qn0ua_eRMV`cS?|SSE5X z`=@P}&%C208>afQ?;3RP`RIx~FC`Ti_$J!oSWl$icmc+&19xFZ^n z$s%0iWYq_9rEpnEQdh>4`rC>@GZF#FkL5_sG-GyVo-$6JAS;kY-it}rup)$k&O(cKM@&*?@CbX$a9PM;jsSLnh=@#T9pI=bOQSgWs^?6hgw!DilHfZWA_@Wh{qQ0T8Aa+>(Yw#kI83b<_pXTP>YTh zP%kMi3s!4YONmaOR#`GAYtyv7W!I4ZRK=eI0V#s%}s^PLG{OhY^<==Y)q0139D1y)e> zgW|1%PB!2{PIR*zP))IFLnuHZ&LjEs(hSs78m^4+8zjz&oak>u6)K7s6l1PdW-#Vz{C=gkD_;mESq{@YUc^SS5bD(n4Q(NZQqMiCD+FqPL$Reir zQGmf(UqSE?Bd&ia)8o#uB(!6rT64YxebokPjP1&vG>dW%l z@d0wf9+YMyeTk5W%aaC~5MP6kUq@nC5#Ru})!~-bF-9R$eF>dI^z1hrx8*o1dJiGN z`f}bKoldv~jMqvv&FURf-d)n0p+4VBt1Yp60UkY+xP3(4Hhu?W4p5yL)I%Q(Jl;vL zRbL1^QYLTCyLI97hjkO6-A-T`CMzy*RQ56p-7g?|d3CiCY8SQm!PHVM3-Db#q;sxd zu5MAA{A9E@u+Eh+dv@dq0MpHKBOS2=hm=N{BiQtE-i?map*sZS%yL{dctRrZTmt-_ z9lKS9?XoM4|BclRl{9)awr67W&SYu_?&|4Ps#^f?}r8jKaigDRsL)lSz<$ay0!8+D=U9Es-&= zSQa7blmMX~GBHYBBA*}|a0vhj9-FXQVtnO3 z+7hwX6r6Gpbuov?szRiO4v|k*Fbk;{xBBTg{Mi+MNd`VC0$D!OMOUJl>eOZA6}spXt=T>>ly9d1ev*%eC84qddures*(oRy zWc*5@FgbPz!5tau*BJXIKo~tW+KV6he7hw!J?EMhwP=l2wOS2I_NOe3uE z5*gkKg09)~A_i*x#SP)+Fe=wD;El^w~Y*}%kUd_W0ktZgE!^jjo-)xRzkE27QJ3Q8Hw++xk5gMvd67eK;{8|BAU zyK_Fxqc-qu(=K4mo@;*eJ9Am@QPCkSETb46i5&B5gM6W6YuX+_$LoBp?ieLEG;%zF z7i1t;;)aYtwY{o*VdYL++9SWE1H$R*+|@p1@J*d?1lL?0vEOhc3Yoe2VB~ob2L>aC z#5Q|Npje}=_r2fI4UaBO8};bgFBAZaq;KPe;=y2NBu)9OEE_Em3>|xi5e6=r4xmmj zp+_Q}nfYCPXbMBpTm|(>v`*CZgB)69+X%-gqwD*KE!MX8MRk1%@sr<7(mqJ#(ul%o zt*~dZ3Bq-)xC$AsBAEIRJ!Ric`OjqUWuS|+aiWB6z?amURQ!;}m*80G2*Y8^HBL=# zPz*({DwpP)6yInBiTi&x$~ceYFYVv;KC#oK1Sh1IeYs>m>E|;75@5>?jz}*3^=Q6< zGh_*mU@jFmDg0w;t8Nno#uzSHj~qHwLT^i6QQuSb>`E@alYBBROn07}APez+zzUL{ z_JlU32ZqntUb*wo-EZ`D2CzoNO~!wf9L+^wJT6rx?NN_ne6FmI2_hhHwf`~wYk-0Z zToLK2e)*LOslNWLvgGp*j9_eCc_WTnYWm~qr>@%8cUS8kD|+4SY(@I(z}S{BI6bT` zMm3(t4T8Ul8#J$c!DBSsu^sD}@VZ3=i4o-?P^ZJcIFWSl=NY{72IW-h_mAFX0aHPG z&tSY$`yNAWU#^#nHNPDy!T$Iw|P5R~NA3Yn*p#Ml@1vN9G)}d~E5^p($lD;J}~C^%{nEgoD!0b2*^kHEsQ%s=-8O`lG2XmzqZ4D)8O84uK4G9+`31|OeFv5qCzk3m12`K5M*1906s0zBTD?P_K-f4!;41tj zKXwLSK0p{#*GC9in*aVk{t5k$-nAURX<~j@AfQt0|86e#pOUDXu$H)oxr5t(5k~X0 ze2rAsuz&sSS8^yaRAB6(p)iUT)7zEBmN06{5b11HOVem}+&ZT0ajjCaca64o&;0Bh zRL{$Ej&&<)I+=x=kevTGRy=VRtaNc3y7J^z?(B+w_xq+Kwo1>uO3w42^B#P;&rgvS z?6*M zgZL^Bi7C?$jj`oE4PoDrlO8LzK5(%KQ~{m%ijirGJP&C39)}%X65*ESUh_fc55Y(S zR6PT($K*x6(2TV2eW>(aI^mjT?;)Upqcy>wl-LHS|2EKjk3u0ArUAK90jjluvO@*v zz4A&v>J>H^^|3@SYVbt}^cu0wxWyf1m>V zqrs^~N{clS*n6t^!a40P+YCl9pzr_#{piw&BlSd>epHcua~;cybT( zQ*>PLE;clv_7C@~%bmj)hc{b?pH}hSj<2b!FALUrm@bl6b}SGO75#gx`k0)-6;$bT8-uvCkbi0=RJWJxpRF|p8P}Pray+t2Gv@Ymm%4vJ ze2PM%swjjBcsERp6UMGdYfv9`it5z09tvOClKZ?y-U!E6LV5Ay9udqk?{!TvAyD?3SWNV=>uK_F5ok1z4%L_iWtyOp>Z9@c}7j|at3^Wv|ls`9V zr@~1wz`W*^d=)x&>A+(xP3~AhW(g))6v}IFlIKD#Nj@?P^xT6^(L- z+{4teuJN}yZg`DfWCD6eo1~~nrMxBVJyA#ZMKsfqWbU#aXKZ&{PxCHh((^CO#iDYm zN5Y^oeT?@WLyjdFA?$>AIH*Jvv`xxU`q|HcvLeLMl^CvGf^vPW)=)% z!iXcv8ZF1jc70^AN;{_I(5iiOm9Ba+1}Rk3;uV=TyK-mP1%PW|E!a8Kh>jIGUCf!x zlgYMSO(|h|es(~qG6BQJ_k}858Z9A7T|hBD%_-imyV*v!2Ya%+I!~)#(0N%)nZt6Cn`+cMGv-M-{@#?D;k360ia>96%M}_{9QhJjRLBe#l@u+P@X`ZJA(KG2s~42L*8{#w*ic!qjf)DeN&K#o%@tbdFm{oB7sXotO2m-EA67QJ> zB8vn!>=_OOiX@_ptE+lG@v8W{X**RL%J{W>CcjU$2#xM zY@E*N(>vYHBj1@5*$jZia)!2Yq{eF4cDHGNlxcr_1At&T)kAmezZ;I|#4EsdvOI&W z9&zGCVY-!RLe1e^>ylL;Ydvq$Z+3(WN%~~(N4YM#_b)Bqs%AGR*FI`I%N7GXIlG*G zoediEuqO&4*PLT>cY5q(hk=``D3>C_1eSJO*uo?j>W3gBb?eU-IYtAYve^SeEq2Z9 zESZKkw1)SIOFY+o*kkbm@P8%X-1|WK!YDvMNHqU_a?SrD;Hqve=EnB_g@N~JL;Iz! zwFz3jX88$4g5gJ+4U-VVB4e&LVkZMFB^sd!Rbo&~Wtcg!pjuEM?PBU({Vbkqh}ZOw zm&w**MXJ@U+2}hpxOaT6+SK)`*dDad^!|1oaLQ7k2LJfoXB_AcxGwO&?fz=tonH1K z3do7IysIF#t#DBC9}>gbyQ<>8ST1>NAC&@Q@?Q``-p&>qu86XHIAQRM3_L8BJnLfe zQ?Mq?9C|YNh(IX%T)aJ}#^k3Dv8wQ27wJFeF7n+2pJSH36~`F3EX^?ZjEM#oYUVvl zBFY!rGx*4FZ|FaVw>nOjJ3@c&3}4_^?Wc7Kc3tojdl_2%s8%EDJr|`2xGWWjZztqE zM@3jbj|_BPsA7JrTM0ZZI(#x#{ZOnCAb#fwEEESWVv=kKwpsr@GV_b2af zEPqM(_=e30JZCaZ(DBE_)G@RNf$o^!02)*DRl3YCl4xXU?F$CcL{zpv5tMyNgfVb2aH;9>H8~3d#SzCAk_-@0^St)I8bcf5kRZ(Vc@sHHSR;Vr>}1sRi%KXr)zL)B%sjkT1OfqU()Lbl|Igy2HYo8ta17P z6dIB29O17T$tnm6o?5S)#GMt7=yREC1z*Kfp(x=fYdURuTpr~nFaj()tVg5J8e0AV zdHG|$HQ)UP-#dAD&UUCtp{VAMJ9(ChPXss-pG1H)WesbTxPvKXWfUv*%^l#!mhC1; z;G;P`qQzA_vWXoGWn=>W$<3JE#9UnWfFko>#kjwl_OmIM2n33~84IizL6Y=a^zkFX z5Z8Zjcw7*}mD!RgIp#rMzB5rOZdj3G+VF+M|?&_Nz@Kq@k)~|QO&TCi+gcPtdV4ktqt2V|;W4FZBRo7So z$!Iuj?~@UZ6)B1$riLL5vxJ6c4`-FP)hDdOXT}>FiSgpeQKnL7w2CA_?17V5DUs@+ zAb@An@PjfRIB+3?l!`_U*1{GC)v}|ECeG9^afg)Be`l*NNn;pG+G2kJ9)g9 zxWfpyC)z~64!EjHlJzR*whp%)D(=r+rt>~)-{QZP9J#HYU}?o&QxIAzDSbagZ1Aj)Ap(wbhV*1=(2&LG|YXBcg@> z>wMqD)1^Cn#pWvV*CY54F30kj;5A(XyvLf<*Z>RGX)X?qkkvg@U4)&I+QIzaT6U-5 zNq5W1H0&5ilRP|6@7{YX<>1nuPqNiG)DGo4^wk_ciw-#1RkT|~atEh}RHq3I-c)}I zI9xEOR=90!;jK|pXe))|-U+x?2_V1{yKQ{n(g zxcS^3bL3(jLLyIwi+5Mnt~5^qI?5PaAK4k)X*nPIO266b;Ygw^nW8y?CuT^g!ULp3 zpdSkK3Ghd_u_u9Y1GEcNmAL9DGGmhPFLp+>D}K(^%B<~_bY4usr;%5}s9D-RirA|O z&`IL3u^$q;5^ftRa*8;?(}nfL$z=jhB18qb%;$WPIH`BLNZbO0S*eejS?)CAY?3u8x%JBoYFm zj-=)o6J>IndOxRYe`^ zc`CWs^qb*mxF z$#*URl42EJWp;&GXY>YOWJr193Ve(bOI>bE_T_%F3MDaBX$&P)`tgjK$M-hfQSFQL z&-c%)-T47gOF-Y50rI++(7S`MZoGZMf@K|-44;X2Kg z6Xz?~FdfUhsFX%LxS+T?ko_l3U|^vB>sXEFz%Yo6$`?8IGahH#5J!%bbHO?ZR2{mO zyq&w+CY33k8C34|!!U=Bie2r#s}8&>iQY6aq~RIGv7%X~t*t<15Z@LlKi;VetKpIq zPOfUjo~_S~TXusJ>e<(T?$1lCs`#|4PJA^1Ay>Q3!v_OjXX*M9H^@2sLT?P6t(h1X z{Fc2O{M_qF_XBD2@*B3XME`dB4U3+*&_d6Ho-U3r`!9ooo6U`$`@aV3GLTmNxhq#~ z8B|0dwsn*$@Fr`d+8z?*2($~ z$@22a_AHatp|#u5rf!o#b5Y{b-6?S0BW6BLi};R<#>HgTT+Ub2m*u8F#MXj+zQ(_% zGx}F7>0bIKR0h6;4qc1MmQxXRT4{B=3SpH6#F)3m%+GkxQ6L z`-QTX^xf(ELFT=XFSVB8Dnb` zN&UuT&I>6X#PyT%0+-bJ3fM_=Y9I^F5g$Dh`0|4E{7vMV{LLis7lu&8Micp>W?@|U z_SkUAPOx^ixn%H!USJIkE9awH=J)s+xnD;meT3>#dV?a8@w7-N&7p|ONF#b6aSS`t zggGc^XV+TgBOoq5;eS?L{0r?GS!VU5_X+{K&#t{I0M}`}s0Nv)i4$dlu}1LQb1OvV zotjw|#;uC;=r>1a%I(ABM>ykMgPx5&#Wvc$JC`0TR6_IZJookqrasbR122iDOAbCK zTsG#76sExqSAM3!j5Of8t1^BAUqO2GfG?j*P$^_YNcZxv-orM`tXB%(w`Edlu@{P^ zK8mGbt|fVDu^GAI7`fsq=VFHtDeQG=4ZK!#v@vN}*2*h*8gol{5%z;Z8APSFtlCk$|vT=GN;}IN4+H_qbVXMfXv~P z#b7M0H#^4*-V>m+Kgwe`ZSO~0Fz$~R>MZWX2@;33dhbkONVarMx^JUbYzoYt%CZYPR6Qhg!l0e1>_PVb69QPJbTqG zV4IDanF!j9Rar5y;Ct502416ks9|=ofhE{cMeYzS6(ZGBxnA<4Y>Py@n4C&6`?;bh zx8*mnbh)4mB3Cp0nf$4Q$F;tdF=-g6;msscyZk>`tQ{hF0@Ms3t@(rL_SDZ{Y0CzFY#XOwk{BjHDRHpdQXgi(rpA_!0ITd zqOu8i7wWI@PKMC#Ol5pSVakzwwl}OhfF143)|%fC@o--V6AZdInq#Yx=CG@Xt!;W3ZqXSjgwHRjpQ}nVL63)Dpsx=Kz95+AxLA`p^s8R(d zqbWjw5racP8`us^XChw z)Xx&1h<}?-r_>WW_d!-D<%PPP^MaKKcG7;EL`Y&D1>4ygTq)}f`5}>|_J$McSzp4s zmDl7Svqf6<9LmbpKQgt5wa<&X+IOslm8F#*ia=YJMgHTZWvijnYSi%&WTH@L!opK% z6WtJOUACYV`CAgbkqy@H4~1CYwiZx>{=M3(vechZ{4_O<8W`1b3;y^z#Pp^DxtvN6 zlT$C|TW6lSyn=!?O2z}6z5VBjPy#loa_VDaNGi4q$_v}|@tv(LGQVhyFH^B$nS@ki z*IpodW)WucR(ywwe3e_x(S=g0Yi@;HA83WqsQijJ3^ER$zqpoU4BeoO zJ@1xpY~3=EeA8lVgxCiKj9#=^bgHePZmUv~W817cOojm^wmR86hS?Tsb=W9{hT{h!_@>iVub zVrcxfJxRATt?cyB@;TK-N)ytxrD5r0WrsY{*3JTzqEaBNjZNsf*t(BWHJkn?iU8U} zV2iTc3mJzD`yreur2MkC`g)nQPu35x7;SFMrwkSMqz zjn^pC06;*$zv<(=Km*e*6+S?8e~EW4eE&G!maE=?!Oro058VK{{mCr}@Fq8d_J*C_ z{A)P`be70DOM_W%fB9Et&+2h(iauOysU8RJT&CQ-)_abBWb4!y{?SavBaE}X({$ST zLN2oVl4Ul{uA-b!?e>g*uT>|1u?nWI@f;@NQGnTN%_$hq|JZq8ns~#LRgXUn8@ZYb z0(1P;h8k)D5a6+_NUJ&NwuDxM?cDQknU1%VONI|O>xnp(D{_5j~55`AEzI}{(SziWo&zt_*a%dl-wQr$-uVcse#ZSkqQteBrc-ETTM zuoupH;pknCJ^$ved%(*?6HM%@k{Fq@%C94D8F_b5c8G&meSa_$#cAje4qH#W?zQ5i z+iQZhy_=-T)9y5um;q z9CKp+qDe%evG-Er8EHd$!Lhd*+N54VtG9>@(j@m3@dwSH>o)E9dr6^=vT;et1mhER zF*9i^@f*$c(r`$#<&5(!cf!@?>B`@Dd5$F@Vn>O3PwbqV^NDKd5_mX!fR!R&97DV{ z-lJs3yC?qWse?1Z-b}bu0P+qD{V$S?tE@)FB_#P~MGxM4)fp0U5vmNF+8H19&%xK9 zO6CDiP(l?k30nshTIwGWX46%MnbHO3fY8->7LI*O>{ z;Decu(Tow3@(bBSO7VhOluADNIlO)%p!3)dYXGM=QUdZz^YS>Pc!x9M&(c09&SS%x zFTs;BFIq|IPWOIw{gY4HvfD3`>O`!Z_4o~|g?)IQ%g_<{r^g|k2hVWP#Ka$*s_91i zwUyo!9+dgtkOinv=F_K-e$gyk2VZNeJ`wBH8Xxj-N|Loq|E$!It zvQr|d>Sy;=?zjPI<5Mo7v!59o+RDDk){tQ@$%qu3(j zl;%atRp30}Kj1$13^?aK-@WgDF0iBo>cv!?S_Ij|4GqmPzW_E10mPIc|DiUeie%Zv z69egpOd}sb7#3C-Z;bV4d4*JtO9FC04-}+r7ogPmS2cVdHWoxQ?W_v~IdgIHN`&JS z5z8xTHBS5h2m`u9>Gp(Fju~OOgFcSw?WqE74L=OT)`9dOL6KS+nk8-k~5JCtIW0#P)wN_Kwk+ZEKrwY}={Wwr$(C zZB+$NY}>Y<*tV03jfzomrT6JRZ-2dae`mZs#$0obvDUwJ-MH>?W8Ueb$l`r@N#AaO zi=lBEL}gGwT%vBOG!tfL5FkUvuvne**Zwq+(1$Tu2QN!iD4WSiRjI_<>J}Q-41)?PEKltmiY2kzlTeYYQV-={N;sZ)!Aae#%`4x3VuggKr+&# zF@-g$w|z`L&&R>+JF&Jwrr7gZ^bO*H$0m#Gt+H+HjbiJ~5k1c~X6Fn1W%=ma%f1(` ze=n3V^^e~%hSb7F`Y^$-Gar{VxyW@oz*OfIcM^|N_kik3+&Ei>)b`L+e9R%{+zf#d z%a$LB8E9-3*lw@G+`=h|%%1z%Xmy#tmkWPg6cp9BL%Hd!I7fB2K4*4h6jpt*j6|MS znewqLDVrhCrRCSLEJo8v+FNN^(dQ><7g{LnfNM_Y!>iuKu?swow@!R11ZgCEVkDp*B8fs)F z8be3ZRFcXz0mi}eYz8&!5t_st$iSx0aYTCPnu5$OXMZYxOWrR4n83d z0*San8&Uc9B2F=tL=Q~glto=#o^WLn8}_fbc#Grxl%6hLwqDU0iNfuD+@v}FqAR4) z^|_~EhE)hE@gZFk@V0Rk$~mSdd?!b-UON7Dq#Sts{IlII+3&*xoeNyU0^pBjMo9|_ z*;iMG3}&4EbJsn#qc+(tWZC@59CwiQ&=O8Udfa)5pTS0;MwS)t_gI%LFPoil>K!0F zQcKCdM)r=XI|X~Ez*p%8vKcR9o0TE#{2G&p4HZ6Ak7`h3=lX6Am(cX5oVv)0%7K4C zD3}UTc4Pa0k2X^aK~~mVPH_8M;Zem!NCg=wOmNG-dgHmKI~h0}4y)AI)Hr0SBf%Vt zU(uvIsqoHfEt2H3zwK(_qfw#q?vn;4^v%HBJ#&&0ibG!at8Pu)jCM7^c@?9ERJZOTVHVJ8dW^56Wv`bA~u}FHwY!O+-C?yOeA9==X#TkLL&pW50S~A|F^#UL)oV`3UyK>;mUr$?#7=LFbrj=kCV?r^)yf zCfr(l^TO}Z+a}@pv#@oft zrF1`kXx8s}Ozsq15?Gwl_$9NtJSr7t1!@+8b2ahTk4e4OCnKQEZ@b5Yoh0vXtY({S|E8bI{SsqCCmhgNp-syoBKC?O>qP6n2Pol^VVZdB##QGEn5jLwE8c(JJx zR9M3wE#K83{MN=Fz&Ik?&)}j3H>pr5wmTr{kK#MlLhIx2|73!5 zd>{Y@Isp@)^^y163?cM;MauTUlv(;yzv~@eDF4F1)AorK8pKrUVp0Oty6Ef-qYZI{ z@w+ABf(Z<2wo5ME|N2My!of7(sr_Hv?hFhBgyBDMlz$g4NVvK>xk{Tjn%n>H+cZ@a zlm>+{au|p)#YNP`1#o&`vevDOuw!8HVxWu2aSmqa-A5=&DK<4<_44HT&$fvz{28QC zWRB*aJq@kO9y;@loNhpn8Z*TqcnIxy?|D~o56TzQc5uZ?lzT))W;Qcj@fC- z6i}a;bb3D>0J);nzr1P_44HOUfUXjyyJ!MRyq+}U$tXezCclUU#atou3GoqFQ2ldG zkhcysEnqI<>U9rPq41B&OZd-jsq#b-Tmaj+TxR1Cv_l7;n?M^+@hP&0yY9Y?*GLV? zfkwpGx`;mv+gd5SBL!9HtQBk*jXhco*u2&m#dyf!7UUIWP!QxSO1Y?p-!#7oBE7!Q z)r1Xh?Hw!Q5{rAz_pNbi1NPUAi!dXPx8kOgF@fwT!+ z6Ag4vxo2-NDO(LxA93@vGh@b#f$FG*>j?pgFD~x~e^epzm^es+Fd22Wz3Q7%0*&hqT5)VEh_?xeu)=rm(=H{%^b`MG`V5k8J4f=1Wo7BW8QYVTF>o0_1$+DAoN z)Z8L~ht*hN%IRoDrL1cO{v$f_Oey;9`WFm4VE>un|0fv!9S0@t%7KZXjP?DBXJndc zS#0vBn}>_PprIAPplJ+6s2qFJzdGuUeqg-ltD-6_5GoL&&ElJZV7s-j@;c$m&)vwK zt8YgJftH?tA!Q^X84CA+#Yam*+@W`*v*lbT5_rivA~Cmb;Q;o|U{z80RSK zT)T?e#&NsSrqzP)BQYE`cse1wwDKzQyWEE9dVZKF(;-&D*_JikilkHp=g{oeXS`~% zno)xy8(INs;cl7FU1BMejX}W@s*WTla1+|^Y0yM>TL$btMRSz&Y7iVX4TVI`gOnE{ zXW+(0?B;g+>S;d+SLCF-#10vSI069Tg*^l}5}^I`XqWL^=OF+(4-)hbMeGxX`!2(7ACSQGV(~!W_#he=?KwOHn8j$KDjHW4{ls(gEG{ zZw*Q#vwIKR-F~i2f4R~2yOhuy>6g0D8(8+V<JlBWE=hSi&MtPN=|$7u%V*=E zWmxRhM#5!bd>X~d=4~lMo^8gnyE!YdVNF*JN<@6eF3ev=y36oYwfN0o2Q9*%sN3^b zpg;b&hbDbN`*!{+5&j6(nTKeLJp*uR=H)Nc(0G(d(@mhV)nh4DrOkfzi~t47(;<+g zM2MMwNvH~#Pooj&7&!5i!AQH=^|nph{x%3XEFQAm;jFdz5$B$cJligDA7#jU{?Ns^ zEs^I$7D_V3T5J39+Xuyt<@N?`(i4l>e%ml_Ue?kjQ344Ou`Zgv(;y&K`8^EFx2DLS(}Qr%rD{87yk>W!wFZ_db#U$sjvG@eGJc_ zSeeR_y98__R%g~_nQEpfb?xnQAD{ifVpWlI1#`N)Kkjx0u;@Cmdg2DD_^9KdGJ~aI z#>r>X?9jqAp7V>-y5y3#+}E0>o?*Sy24yYpTX+y#8Gg!^boIHkR)-u~FVlRkC&Pk5 z{6g6h8}YHBA9b_vDeq*1VN8tT z{3X5CRKqt`YtI^(-YOFj%%GF9I`oU$uvMzTX=<(#YbDvTBML${Bnhm2t-xU;$K7|T zCYE51CV8;`7<*dvn|za>JRldN1zK+^cDl9zS&0sa*-qmPzEiR1xka)M4Hp<80y{_T z4S%hkFk}F?6NL&{jHAgsYMwI@e_Inwd>9;jddrS^S{80FsD$y6GLknI)jweTb=cOb z5}Xyp%$x`BPMrgl${MSlm?J||VXQGAp?|OezwD=alBqrrtsf;@8Sl+#CNVIV@wk5q z)>SO4R4@~^7MrrfFYQMB<1(s3eAG{6VB0%8*awHd7~IqN;r@1S)vwLT$}iSe(?w#C z2}9rGDoAF4Df4k(3oWpA&*DRJ!0C<;wx0S$z_65ba}rT3+(%&akj<*K`-*~9+*P5Z zRyXiau=w1zaPzkRM2nJ8&URrXyISCJr!=pppXx__=~c5qz^Y6i;l&`Qtm`(6Fn1UgSPW5xS2Y-_1h;m@g-+1YRK~#`0ldg!a)D z)x*whZ$q7)LM_nZ3`Bc`l|OxmgY_i}{3r-SswBK=F@7+XI)?&uL#@P6C96qbLK|3c z!lDaF2%?kHL++WvCgY_hxFC;>5L3(f!hzC;ImKJcOFuc{gr6y>S%A_r#n5wwZ0xikyOIgnZz9lTu3faA7nKKk z^L8{Y`_L#bNBJ(SdS@-9eGu|2rdQK%5w4~6T`ou>dmdjW4t?GZj_zm|dfY(`YoRLR zFJNB4OMl0=eBoXFfqlQVaz9`?8#P*p?o*-o%C$WuX1-MteZvk&{*#Sj=my3oJn(Cn zl#*Gd)dSv=CCpFyU64N}8JOO}A34O%cf7pUY8z%a#IC4Dx^qoVD@ojShA5^&k`n%V#i3>&_<9M+fn?P2`?e@XOkM&fQ4d3bMXS7_`@f zH}hIYVh!`AfIVrYt_sT%tA!Mg1b#y$vxoy%;b_f|;P^`8_)3`ty@>yYhWPQr*5kA4 zyRV^FtzFUfsjeMn4<@8F$(a@ZBiP2V`(SH9?9-yo`NX5+{GP9S0zYpk)&lN=$o9AU z7&g4(2zC`urDS{McYXC)UonCy$s_r(4V1AR{C({k$~Z!jvA85NaMZYtthNJfmdVD3 zm}61`GYWjdbauR5fgjH2AFlb7@ z10AkXH^w(&SAWsI+7Y~feozlL+u4_|s|Mg+b!Ym_IbH1r1^xlMMT18AO~7xejTrX1 zPUz2j(z{|g+Hg$tyA`%arC_YSTlPG{L}%2ni>Q^0{Odyav^O3*)v$op`FEaZV@` zZIuuIcec6Hg`ZIps#c*C0z=uvSIr|bB(n7t;^5jBZ2k6-M?Hgs5u=a+LcmhFQ{R(1 zb*gvb+j*H>yu1--SF`BwJk2J;tkhsTLiWR#u!|1@{>Tm#C~K#30d;M;)q{5(h}f<(Bv7&6W(&N+yWZ!Q zDktP+Fn<0=-cwCkO*0q|1f+=fpErj8O&0zZ8P)Ro_^Yq1oNhf+vSoJLqc_QaL;0N$ z)?gj_{Tn$bRPuLnI1!cbX>#1$=@>S2tZI!5#uZxw+DZw#)=EBV2r}LDHtp8yRn=DA zbld8`Hr=i>uh{^noo;!`!L|ILqh7b?W+t!u;q>P(0uamS5k(*rey%eE=Y~rrI);9p z3>n?!nTseCr;Al7VZ4WE*^W({Su{F(&(h=!t)r%!8v&Oc(B`l#H~X-I=SOzyR?T5q zNcPiK&iIVXmVLwFgd$FTz8{>Khb@+`iy4+@QM}3>8(c5_<-s+_`c>%6`j8x$jyGQ3 z>~;a6pO47+50f3V{V*$T=8Jxu=R>4RH&G5p*F8&UN0&X#>)i8xr@Lo*=)4*H-kI>c zq42z^8P4m#aH?6eGk-@$=Rq28l48$9aHf-)bZ0l3Ifv7eE`Bdur_P+N-KjykTUp26 zxfu=5ZeIA+Jr1Pq)gMB8g}-uu;P1F^BwTBJw^EAh!F;bd_)WKxA1qv48+TOxPc#0T z3<#eo79x*G%mG4&Cz?bZu}(ePkzRYb2-_o8+cPtaCkKv_mqdW;V@qVO=lf0($KNh) z#9U(Chk<<8?T6r={_{VCy!ONt*Q5R-$z)snlm1^}=s}Tvu6v-+f+zh(e77#pg8Thc zI#_*;W(-XJQQ76VH&z5MHQ@P&e;&5F_xiC3U-Y1RkNS6cZVL#5oW|0xUZMz%S`Ud) zE)8~Oy}3Iv3xPZYS9Jn2*w?vgT}>_;Q>+1|putn8HweDPfkxHsYsAsse4i|#-6u=k z+1;%Hcft*AJSfpiozrc?UgP*T(Ql|_7|IgUil#;8}5u%QQktjF=~e{JGCjG=D5 ztrl=C8*F05Ly2z7y@QG53&}?3x_qU*EcVth24NI#xmte1IFDW%?bfs1oWX1njOV?- zEmP)4L1sSaz?#KO@w)Rfsy5J;AaCFUN zDqm&7K&I7sU`YV13?B+>0m4^W1lN(6^Y9yK3$0|%#64Sb8|NF@9TD$Ov3HpQ6G|@! zrEiL=4DyfZfOkim!HJMetl$3fhm`aH? zr^~cV2qxm4M?YmOQddcnA?-LmQ>B@Eyfc_GR%Ij_&MWG+(VM7Tn^Xff)ddR|$R!e% zc0`T_%8pZB+t2&4Uq zvC@D59XuKps>=S4s6>DpH<_xD=nuf!WC6nJi)K!JG(a9(QXr64q$&uU0 z>$rpr&*dY>go}FROp#NTx*3*eo#F2mgXJgM=-pDE>>~n@PP(wH)e6`FVvC4_!Jso# zb?|QYLed{DfhR^7t%<3g4YGT)Y7RQR(GCHQ033f98ds zHW8_6+*x@qB%NX)s>D0nn9KdhdUjympO4ZoceLY)tXa=rR-pFr1{UwmF9x}Y%R@37 zBl_6pF>jN-+LoNV)XCe!_$Yt#w+iq22iIw1;2whr0ag&ogq`G27CQ;(q>Ok)WgcxxriP?bNROp1z5j_D+ zF^+0^BAc7X@F}o=#jB1Px|oKHk*zc*4`y;V{;*D{64xg+?cy279REIwqZ6R#sFg4% z7IMt2SMJFBiWO>3ZqT2mSQn38bcAvGjR5iEXb9am8Wr~O0euSJUd6goCYx5(760Jkj z3g~6tv{-<=h^sT|-&JA=A9iTyiQh@*`V>aGV@p@|r%45F9B{cg@Zh9cw39<~ZBtY}B&UN8c}* zkUec~$(o3F87|e~^BtJi5>K&E;YDY)z#dj_<1FwIQHMhzx4I|!!ZP?$KNrgZgbfs> z$1@4V+d^o!W(E;j+S3Foglz63Azp`eu>-TS4Yn>%PKX@;Wq7&#Oq4?c5Vpr=P`qx! zMM7P$6jl!lC@>cbhyyDIn0`bRtZ{sh^_q-varna%&EGos&%^~S?qP5FK=01q8hkVp zeiiNez4QWt!jPpeEA{7Z!9VbAtbASvBNb||@_xs;A_@)1v)6>TPax8}CSBYfCH?+w zsifDH^U1d{e`Jy8p%9A~7?VHWbT2d7RCZE^#ao_(;9UjCKd@rwN#*Es1Vn z%5P(V7hV$yOCRqNV~5&XKStDvCxmgFl_BkBiWXQ@s3zYQO_P-Yr(|QAl`%_DIX{e` zGQmo{(2#+rGU9bddGHGwPZ4EhYuTDxW%>x-dlvo9nc(Q{H*p9*`zFps1-B!ek^I5-Ht3=-jr~-DX$r~(zfmJ6?Ox-= z!O>Dy26(cq&E92_v*nN-Xwn7&^bV{-V--q6cCxyk$UXSS}j z_n))S#7{_4kszNGxN%o9#MspL4;P^k-rX1#eyK$j68R?9mNDWOY^1DIJlSLkg6SuP|3mUg`!M6n~w*8;0>H8Y8%py zWM^$z+zRW`(7hZ+;lmC+^XI(W&rX&j#6jbel%7>;w+&w8J9T&;y$k0sncY;WBI z+Om*|{pJCru#vTh%=t@cxW9C;0`Se6rtJ7_UK>AdWh;kh0wX>r+TnD9(WBjX%3+}2 zeZ?YOl)}ay6t*+Zl`s@l1Nwd=*u`q3Vudeg+KG$Vu}T=-epzO=@~TOn9uFnW^;u}7 zJLVGwlH8SG&kwq{m-6ujtQHpQ1_npx~XPB@LvLujM|X zPaE0UNEsBjOu-HROd26#V;EvWrI{JgDdM)WTZyEh#EcSOdGCCEEYG4=USzWhTtF<8ZyW{_soUO)+Y%&s##IQ+*Q5KJ=k0V#r5hcCBk!y*N_Ra@yR6 zsTE`CF=Fmv*{32n=l7ISRzfO(T4LStV?D`uUiVBQ0M;7O4VSL9b~zq||_LWm8I{8%9Hl;=rQMXHtg335X_MaWb+h)ywJ zL+dDHr^S7rJ=dYtA3UcKkf5;(<5WXc<_At#W_&U<6eC7g+=xXv$l=UDeG3jm^6bZP zc4>tbHli&AHK7^+b1V>CnRd;oGJP#2UC;TV`BV|0H=&I@PXE`NLG8dB&fcz=8^=Sx z_`9C9mur?@b%v=M!Q!C&J3`jcoAh1W(4j!@??0g{y&z)Mu3&IefymD7`eS|UeCP1$ z6q^+>ff3&nj3AMR$R3Z;iB^>QS(T4}+R;A$sMtc5l`?!4RDKSQ<;5j@@9)JXfUrb6 z+k)4Du!XR^3Coe)g74Tma!EFl$<|MuG^F0MMBobB!nhM>5u?}wcF-JK(sLaGX{u{@ zL4H?(I$ww1xxa<>C>!#?peIArhLhUnQ<}Gn2IV8}AZMQhFWcRP2L+dY;=lF9H?t&WEKU@idW$0Z)g2Jad1&r~7CsGP8 zLBm;L)XuUwVARf&*&vpz`6o6-GV+F-G2to#q96Aig8x8J+#;n6bTPyJk+=VVS0D0Y z#@`9&eW9cOj=YESg73X2#*HKx>~ZULJ2*BEncshYOB1@!2H%4kVu%?C360=;D9+T} zoOSD(n7BaIZi_;@%4%5$Y6|M|{m*?Bz!(6Qsxcf)UROG-A^0;c<){FR!kTRHQaKDM zx}r)!MPtZ}+`MXVf9)3dL!|Z+oQB1q#|{W&o(t}sVUMKRn_$nLQsatO=z8V4O=rAM>+j!4I#Zl0lTE*;d5Eu>JzgO+%}r;5Tu%0N0-CRM_YnFu9X;({Um z8#jVK{ZCC}rB!WNa~%G0&3jC9o|4@1x_XhKtlToZ4Oe=ZBT~usN0AMH4$(?SH2VQL zp*GQxnHwTix~`B`Mhl6C**HR-8DYd5aJ+@~u(dlV*OE22E%RJGO~E-tyBVUqU8vsf zQNiILrd-^wi$}DCeBsEcyEZLSL7`V+pr>QdjBGj4xUr?QBS>`VKH%g20Le_m6bkFj zvb;yZjLj5Q?9w${rrNh~^ho+bNRWcV7`%&4PX5R$0@qDCgKk3i*#j5EOdzy~$I8CW ziO|CXG@KsK%;h#|h%#2cfDBVV&=2ICr10Rqtp> zCntqAeWE@$!Gz4-H}ZT^@_b72d`N6TXtO(?j4-A_e}CAlJ1?vfJ^BB+$j5Nby&u zxrd>XK-Of^I3A9*-!xvlQc|#zFlIVl`tm`NYdZ2yrpBuB#(Gr>JE5+z3#~A1jnCqi z2@>syk%%E857G6lH;N{7NZmQw1`8=I>p5MOvcRn&i+m7cone4r=jWYhxN5VkTWK?n9Hf1nI;U&Ow_7D&i9^?}NegqOI2`N{zWeW=7tp>p&xCMfBa8F z(36fUvH7a+i6uZZ)kBk6)vXlRQyPz>SAa35sDWi+G4lf@zc4w^wr!yqj3#`=+~U9? z%<|R+S%W1saO+~I0U))ht)a#f=D2@ESZq*%ZO_wLkN@<~?9Xhyg0 zP|X;ccIiy(YCb9=XxGdj(@6&2Lonj5uAZLtc!UbqA$g)?obnnvUP=LS&?cR0y-snt z2C>~;^Tch0L=<_tH^-lTJ#7CL;dX&h6s_>;Fc511t@PF%oS(?K%~LhnW5j_N9PL7v z#oe;b$zd4#l?$%CH=EAPm1_sxD{I)STItr|{{$)7vwxrXOzVyq9E8$&F*e`E5;ETd zPMLEv_$UX}`xfGd06TC#YetxuHv0N{LG_ge)eqbFOgQ&cnI%YQ_8k3Whn)4= z>ra2!Ai%IeB37dSHD$>hVlhXO6G2x{rcM*d)E0s5g02#WpGL235N`>Q$^kizKx{C` zLC}I@(kJ8H_uUWKl)&Di^W9T%!TZpC9Hb*fsE>x}rkedeCywDZLg^muWD?5_Zx!k0 z+`A5l9`cL~(k$k8+hs47fEn6U@grX4S(+!_QZf_K0(Or5`*UZ6_#jS_xf?~N~aE&d_kV+ z95)~U|Dupm{&q2;<1aIh6BX3nuQd)i|BG8(XH*34;%47~8fG$h?v^TLk(j(ZH#)sQ zcEf}-FOI`{2%*yfU9m{~>)X)*Cw-awUnlBU6>~E4IQFS3&E7D5REN?5d<7~Lk~eC8 zzkM+4#soP*DiGAoT}nc^E)NDJrJM>3;+SmAK|!B_Fe{cK64G4?YNA;`4c(KV_|zXt zAWU3oaRl~{%xc887XGYf-nH4dxNa39IIdA{L;NaU)MEKASf<9&TX4x|eRiq7Ew^{9 z`;|uq?H}pR-;~oBP6H|j4oigTiBl_tb;;(#_j}}4dFMr^6j3C9j+bGeLt5fljzE+b zk$EgW)kklBkdiG>n`b034v|@E#M0r18VX1;R1Hv%q*(!NP3IJ-) zi-FFXvi@Q;6J4xOm$D>B)FWwjZZrS2r1Y!rZ(c@QQH#AZhAgI#s_HF{39r{WM2*c+ zW^uj~$jwpDszKB!*Jx0R^s?eoQZG^eRPVR90F(}Am>KgBAd^vvtc=UlQHI_Bo+1T6 zRNl2p_!TO{xkJOh@SEN*nM&XLSa}&l~pU- zwM*C1kz1aFGCOP?o?UVS!M()1q%N>x?-U@iu3qn|ywe>*FPv&(SbcQX9VYq?BEN&I z$A?C8GA+*f$zV%8eHqeBBun8;7TJVO5Jk*hiVv4Ugi{V-9Oa6qPA9^x3Om40f$%FO zgZvgo)R6$_0;iaIv2K#Il6b2Hf%_+_pnLfOu{^V6N2zMKq>Tz)H9gN=4dB(r>#InP z?av2(p}}^g;z3gN@gY8wp&r%)qJB(Tq16^5^~z`=ot_B8#6?3&AkX`ACb)3BMszcl zwuMO6g;x`WK{LuSW91cZs9$@=6?&hb&N|{M#M$xQgue7zwT^QsuloV;(4; z8kbtOpQF^`-0@;-F-GKEU4AiVGt$ZAUd`o}b@`JLJxTtP6_4pGysJuoH_>N-L8I=0 z+&Liimp`n&#&M@GSh{8hV@f~g=Qvv7rVS~s9q@V?t zJI%9jyepHv=I?$T@h8s71V(itz*LIVp6s!Tx4aL5p=w^JR!aFy(mRW5s)l;tdPTy; zkS)zAQG`is%7f+YzI;t8-k+*U+1j^Ph6Uw*f+fFs2Z>7BXUfbEJ@fmZVEbdj z=*i;@TCTAeTq-^FpZtx=QCt4|3O>J81PdO%Bu|6HPrq_2-ZCoQLYLo{*e@JP%^XRE z4@A)r=-wEsvA2*{2r;Oi2Rvf|*)XBf7M`9;1CIyRb)2b@445#_hYo3`BSqWL6d;g)P!@ zMMs19Oh{=J{Lf`Dpfm$uY6T6b!VuQA!m1|16byF|ex2i)xwvaF`e9%>y=yW2fd)j1 zPpKEv%v;U8{>`sD1Sb%%4nBh!9ypauTeXTp!xovMqg*lzaJeAJD4T61r(9AXFV7}& z?>rYNkM|!NDt68*Y~xx)K-cvew;H8GUsQO1pqG;;JAUCI7lCn4%}%x=>%+;ab`UM|Dl*$2RE5MI^JP04!w%eu1t4(&2+ zf2DEyb>U;IHmCH}78kvblzC1ZBDcsNe_HK5Maq8^r(|COZ+P;*dPQpO0p?yOa=Zus$? z6~$;HN>$h&5>wx_$z1jTMWnYT28ma$tA!BMUq)V@{SR1((dRg{JUQd&E%*n=AF#Wv zx;UO#JJ0Km^5>jWp1F?CKM%hIzpHE|ecQLE({+i1Af$8)l`&P_&LaP)VPkQ890dLu5fjCrJAaEQNl>lrF+JlG^Gj%PeavTB%87dHOyCLeL%f$l0dnCauM~V#pFK2u4^?i&;mVb%ud4 zbU@mJte9WG0T5I!3wh(D!mlp{))wNX3?15YNLz}9jKlM|(##8XV&R{ROX5Y4x|UHt zXlVrV0i+!YYfEc^@ilu^)D!k>lj0}DBu4u$ByTy_I1*y@mApYhn-#X)nI}zcT+z}k zs~pWmZovYrjh_tcl4nq|?hIm&33B`z7r=Z1D8;u z?2oHq(D#&sZ(gH&X-Ox+yzYaX&+a3!E5kGpio~DyX|DSpeW*EVc;jgvA-2k#gIPs; zy^{EUbno~+9Ev`N++5+gTU!ff#dNmeYw`~3tUB|0xf}1* zo0hh237-vuMYd0L=w1ABH?6Mrv#XeZ(GhO zHO;0F21=64x)EunI8Pt+?8>@^*P6&-%LziP(mU)T{Zw!sx#;6b@?5uKdNV!SBt52P zj{~;Jrs>=&t;!A@VW|c{}eI zBEah5j>rn#vz4c-Nu4OVpJTM9q(7Bvg?^}%y&ILPDCR3)4A?9>pzwXlPa=8U^kkMrkcLP_tZb1vb+m$*Id_G7p$hzBTW=m>Cu zn1TKzW|lUIt1#0VetTz0K-$Xb1B8A@=oa&bfci*Z0WC1TfSd1Gh45xe?2IiFa$dHD zkfexd;tuoTE^Dwygo@j@0l>L93{Nsq2cED+vB)-IAc-x3svo)s!@PZjonS1OkiQ(+ z{jU65<$>mj@FLpT;0v@RKed}(T_s%Crwt_m3}~s2K9gVxjz_=PP2r;n7OgBA%ieQV zJY1X9r3#@5;+NX{O-B8#jzqU6NwK`4iqg0+zLYn#WInmDHCTiN!J)V%>i_I{_?P>f z_|`!<{jWxO(Ek^85?50An>uO4DL4)?qlE1$e>*M@BfLNyEYsZZ)YJY(TB0dh(KXOW zDn%k0C$evA@CYJ+F}MT4o4t_zy3_sI_3;7bJ>(WD5=vr1UTa$3HgTcmQboT{kyjTp zBi_R#KGJHfc@z4lJMChxg{B%tDYUSTQ~xX_myvByjQ{iZd^(SAC03{MA6+w}z?x)8 zIjhT8j#G5>1C-=)OCj`5euC{UAYUFc5|WB@X5n;mzQw%TqlGme4(zx7y3^_ zuWq=WUsR|>J*1CdKmK6;-OQNN#0ug4Wo9`4U(C#3{DSpw|0P!4KnYz0LtqK3%|J5> zb28mnW4I}-?ppy^@c38=O#%#>uu+=lcZw^=<}QD0`DHJo4@kkc18_<-W%K~{J1N{7 zdoIWl2%_J!xtV^~IesVCAFuD9RNoEdCn88GijlTa?|nmMrskccGIp5XY@M+`O%Os^ zsQ2?i-%a=v3XP=)8$wZGk#Pq%eRsys8Lf=z5KyIdXEsJT+i^`Z6$13u?mIi`X1dx; z>X6yg<8jLN<5)wJ=nSIS<+XVRCD{NIR_$=rTZZ#m5Bddv87iY?2eIkTk%TT2ZUo!W zrnT0Y9F4Ojgl6Eet$R%yd$P~u6G8jwSo&MpQ;ppQ)A_Ks>oGg3i#xlW8>u0Hg`KLa zd%7#^VUohdUTyG8JiH%G#QJEV0%g50@~7PD|Q0yDg(s71@2w-R%2g?`gOo z*fwgPKFz(1M~rzxLU-z6H7)me37}loq55Q#C@VtXFc?D{u^$!e%Px(hHXmm<$ZvYK z<-C26KxthL86Xl6+p^KrQT&Q6UqTT>=N%L2212QEfbm3MPP&8*cS-Zpe`X!?ds*`l z*?v6Z=fu(0bYt!?o7$t)U@KZFp8^ajnuW|_(T5D+NMaLEczuR-qRHj6DuB#Dox0#I zvTRH^X1B5TO4^=FCd|W~S~H(-#i=7Uf_MQH-nB$wAu*S)c>d{V8y0Iu2an&@N>)-r z46$}DQUN|>0a4*n;c>PR5qVwM7`1w6O};7K%mP6Jm9VVo3GzE^3nXh|a_8Pn{SZ=j zJUV@FKC1frX=KZ^-0BIHURlPsSd}Lb&{hv(kybzA!r~H^(D9QAER-LSy4r^K;;@>E zL{G`^N)1Q}N&-s7+$UuFkeMz|bfSHzJmM=<cn@fv8 zVVyVwS;B(f>0aVOP|Ans_T`-*>2X^ms74|qcD^#Z%ENjH2L_q;;2RJU%(}G$h+B`W zvG0)X^Vmh0VZC~1k1GrOt!H2mOFd1LD?0~%Os%SLw@b`hl1*UTFRwzk;Zb{xOtPQQ zf7h~432DW)zbwz(Uz*1J-)hq>GslQVZp9KXFl$?@auN%iuu3CVt0i#^q zqY#FnLPFwTBY`qe+sraxy%v3m7&dkQw;U}fOk8!bF7ka@xC#5W_wRfsOaGUL=QSsg z{0758{OR;tF!)(rdgIFP7Jxe@*=qZ6lUlUANO+eCrsNEx2yGAXGSwOUg-UsGhr(n>cYk$~pNANm4;9$&RO7w)|Y$sRqolvZ*;o&fETspGv{;Tz~^xA=$;Am<1UDkwidHZA=lqFTt*q z(9cA;A>MoUyKOG0PE+c6ZjowU*CWuV6}^TT{1^j2nZ(hguLW|QX#4r(J5dN~KV?*= zyC`NPE}w8aG)5&iI=%oqZO%_Z)r_+bMtL}tNQ%G+_+!zgG7 zlnRp|D(r}n*j$aeT9pDkj%<$*lb67PDv%@$6&6y-k)yXE`RXOfOfsn`YYY&)cl@)|oeF z)3Ag~+k)2OLYN-8rP*6Kcd^%>@zyQ-3pI=8i+i&RMN&oEG;fDTHb0qzPSMxL&Rt?_ zgdlfKf7p9t2nV8$=riui%Q&W+_X$4ZrXu$>?tTvbmh*&svRT&2A-gfjytL8v805z= zN;R$D%Od{skAN5F_~F zh|8=j=RUqpx%kRI?;k#;K)^HZ_t2oK_67=|4fRi!==eJ)!|nWm*Mo@2Tfp-{25bOM z|6cYg`$$H_L|J79LS6|j2iY%KeNF=$OKX_ui4=lHcQe18`S#@sQ)URU&PGZH@u!!9 z65B`xIo9J6_BK;ps8U91Rttu(kn;dSNR5i`lO`H!wWt8euc3KBH-#LFj$ZO$TA{6- z*bfP)(@-J}99z+HHYY83Zm!fXJ*KEqZ^?V8j>GY&orY<34m zDFT)OK#7n3)8E-U%T(qWTXe95(kj-Z;&QP0iIuX7QK6FMm@7G?wU1?D)lMOsywseZ za=~D6T4Osx&Lm(dqC{1{EaIG@9b?8KgRwn@wC;Lenm#~-?!$i|*>{}I%9_!+^{t}_ zo=h<2AP#wjdtZ!j^u;|#3f&*(-Xw|9KJvNM?7P#M*%_@1xR?`9>?HG_n*ar^C*>nY zXGh8%(NPbGiScfAM^QM3-5skOcXakAI=+( zPx|NBb>bysQn4x9cT$ddpK`Yc5i<^c#Mu2`e6K;rHajC28v8UJCIST9GR@y|FhF~+ z0~*?$A1@0{!%vXd=g&~*+*PFu5{pLF8MEdQBF-?*S#t{4Wp=H?JmqxXL2G%=yE?nd zy@(Z6Z|DmCAdKDVS9p~-v0bcihd-1|7Hg8aL`3ju9&xvAED=mS`N^=?+uQtnu;z_g zII8TU%;K_GXgOWbZz->we%hqS@@iwx^DcVpw(aEa@7!&U8#vsV^l4iV48IB;0g6JTKSy;(IN?eGD!I$E(d6DbA>WJ%2p6yE%UyVgQQCp9X>+Ld6|| z#^N^3RGE%a?#)zlfG`gkfnlZvnVK(9&3g@Vm>k1QjyEoy!niNfakL2(#LK~6q%)sn z16?FyzvL)pH*?-(_W^tao=#Za*4rJYnsM$+=JFd0#n^{Zh4^z!b?rW z*bQiz*LArj%t%F?zH~ zGt8!n0^-7Ygn4RWiiO$Om0LMxUkjYpRTuVC=}~WC1n5zUqv8Nrp~{}4 z<^Y;uld-r*aX#8P+yqX@EW{#tNM0w*_8}tX3EZly#L9z3;3@E;*?}wx;j{OrZir#2 zmuoLO=WDa<#&EWOd$S$}Ky2t+oco(UH-zHaL55&_(=vl|-#G7<5kk=%UTv7H3rlC0 zq>8;u93THgt|t-S3e}7FW*ys%VlFF{nV2sK{8ETqgjB+!toyZcN{<@SYs8cG4W?UY z{LUHDfV-hQDu1xXQ$sDD(gEm6mk=^^Ej+aMNcpMZQt10Or)*NCf2v@n1;~hu{vtLq z0U^d~k?I`mY}~OQg6T1aQ37KCg-MQ34>R&Z=3WQk3qv0@9x6rt7l0C4!kVzrE(a>{ z9dc-&gs3a)4OmIrI5%a6tG^r0cLst~J54g>-`fakpvN4Myzu(CWBj!fzFNFaEV=#_j z+XBgxF+>RDQG`Ew66l&)-~Kj3qu&aN<$pKFzn4N~R|f|h%YO!gP~p}mTK3TDyCWT_I5RhHRi1Q}i3`_fcF!Hw=ERSKcJ|Q6!Wm;LG|HR+qP%7# zEwo-~aSlv*Jx~(n=!tz9OG!*xj9UzYOb_y-IbXZzHQ2$9GF3&v zz=AF%T0G=tjwR@~mw?lx?N~YOJVMu2y)Vzn16Aoyq<-@j(bcl0%5c=AT@mWlt$s)G zD2+hZW$@f%VC7U+uVc1&*Gjl^j3L@E7CoWq zTLpOp%-C{90zJ0y?r{qW{krgv!OO9rGid<3yRR-6sB$=KnW%sbh~RS~#)j0G!-R(S zYp`YzvqKCzX42=OkKbI@;OLsq&iVP9%SN*OAs>EoncJckeVgF0ZX)FcY-NqiD(+m1 zC0a`Bk}&7H46P9)-h{0!@_Ytv-jqCrgXBS{T6~TO&X;XQ(V}6T z-1et3YXck!8zC=o{JwZfrA$@IE&}o0Cq>fylJm~E`kd)HXiZX5H&R@Z3fquv4mpuS z7R5RcBYfl;Fs0?Zk5~!cK&8nM9E%A_9E-67J^|hLkW^xsZX)dvnAqTXiAkFLOL5f~ zN;#3Nh{AGG&$xam4m_evqA%w0F{dYc&~kLkj|%RIdRBz%$bF_q3CEHt)kK+*+z#{r zNeO#*!w$=CiGIwgVNn*50}WCfjvMfs*=)CCk_K0oVf~TBg=xdepsEk6E^I3A@GmEa zP55{uGw(d`s&H(A{sl|yY584IMjT}yVE<}`Vf_1}zrcWiIAH#-tnjz6|I-T9td((8 zF@5FgMgTPe0YU*O=!ljeA>h<05tM9U z(y@q@Nt9r^vKZR>IA*$aT0<72>;yiO%Fqlh;G)pfd@os)W|iU8jQ(;orj2}RT|&6o4CYA!&54gHn+h{YY*kTXW`#GVqoizm$~%>Cd#Fa@VjUn; z*)|l)l#I!JRy*c0zeV8HhM1GNnDK6nZYF!nXMWgO+>2yJ$utDXI)1HG>ZCYj)EtAw zTT7SmNaRj};yWgCJTU>#X^7tC&=Ss6S$ZpTb?iu2%sN+3n&M~*ffssrz?~_O}Fn7%oofqEA{!ClN z$~qO7h-@ZRc6*d8{$5bTJst>E4RKPh4s6(;)4O3$sT{DtTaCh*w=U*@Ut&a8s^FX< z)-$XbJ=E2%%sF_}Wl+_F`jCE-MC=;1H*Q)ui=M42=fd7CM95kmrxwY%MuK3X6%}CK zq%H=ELKyU6)1gwKV3=a+)9~&Eda!uM)#A+?m6v%KU zWT`cn*m|lgaJD}f&;hqYw8+rrj&i+NEZz^&7TuPB(V&q$J|(RdEGq;{Q@DTz!!*>7 z#P}WRY#oi6U-U&sXER!u5D^SDi_W{D_lZFZL$E~LZG~8)vbL_hE;{oviQ)4x2gRi& z9Gt9GWNNCu>cPW2KWWkKtePCwC&qyv)Lr2LJ;L0ZwJ)+*SjDJXldZ$?Lb$RE=Xu)1 z;(-PAeVup76_9;YP<_!n&v%kl+xuG+DmdNY!7{vTi<~BfpXln^kDOxaRTt5bh_OI2!#q7V1-e$HoU2&vBLx5dlBL% z54hSVZHQXnnFfr6nrp%pn*C5rS+{MIhCreNWF=}1+>ISj&=6*@VQW;33CVdx-aqQT z*)K1@!_8+!_cG5_qI^>QS`3o1?~0nz&2Pb{Hf_Hi2QRK-FL|LZTp!&1kq77 zH$wxYA2V1+NAU8PWDtl6+!4us#wt?{w2-K~AW&NG<%u9eP%1NrqdM`xOv-UQ(j=3Z zTZGMHrXT9uqp*Ver|^9a)Qrk4v;JjCQG$g3A?n>vN;*G`qLQ}UGiqLttPbHR#@42c zQ&@1ToU5lI)KBI9Z5oH*t7>!X?;RpGZ|*OUQ0`V%@7f&CsII-S4Y&5Wa-J|vANk|G zBEa9oeEA54-Fd6S*VYbv_G-9! z`S=R!@&aiD+bC1v=U$wXdoEKldwhp-$8^4w-Cj8&7Ej3hnBDo9eaju|J=wb5UZL*? zYrw#F-xq`eoY_wW{0hEC&`rT95$wR`QsQa!5CKuTfSQ(_)Cv{uskmIzEkHxW7yk%6}$Kv3Q zi9n0PN2ePFBpdY#HHZWEGKNM=DVa{Uz*J<`q(C}ZMwtzqN0xgXR1*StYFe(6;b4Vx zO2J7&N~6t@K3lFxMU)LQBHX-`8T}?aD^PJ=0zff%H&R@aU-V0DDaow2ZzzAr z)KZ3RTn(8>)GpqrZoHHJ>yP6o7v>tMAO-2eAYMnnImPWRhMc6878{n^-29Kg_1U7> zkv%PynLQ0JClxk`Ld9e^Fr1Q0IALd97oqfo-tt1SKF2Y_SFO`qlJ8>o!G&KW0lmO@ zDzW6Uqi<&rB6S_IGpH3=hPz*3NaA0Jkedh5oF)j=6VgqJ;A1q*b5O}lX}lR^U7z79 zJ1^)Z{Um$i$fPH)7;T&k%*f|;9Cselux!2UbTLTADx7L|v-)_Mp*c;d+7?EcJfY0a zc9Tp}!B8%mEx%W1DJED7?_}D=JE_mDy#|a23QU?gXr3jrKq(nIi z*;t>>R|T%?>PbksquMc8vMAaSz|MK8P5gy~c*nMbWJ?$6a@z-(AnXZI9E;lCZN8BI zlrT2ow9r>!R~4n2BO{}4$*Hh$m_yrc29X7#fKr(}MLa{Qx=KhN-g6>2abj1^(mYF$#St;HZEmU+8Ti z2xGb|5PrmkSkm{zXjMUT+}a_xFh9rdFb=~hCq;sE8%$R`hRze>Liz$v<7OpSwC|2d zbS!}^R)<>|SwT5s25v~AB$0^X=n6V*Zun$6ZuqAMwZ6bb-=wiwN}4wztrkGGaKTj&A%Mqy<&HK53+ib)={7F|FlWW z2=9wD5^;=zqc3n6nikiee^BT5VMR29dt9l$=c>jl=@HhEB#8m0IGYgRRQKohgr0}X zIV=XJaS5T?GI(YTBZ4$s`$9k62{k2QS(9r3yvmS2sCRzlai&_;**0<7sLl=hGtaaK z*J_6(n{#eZyu*13>nD^OQDR?_TRFUvRu-YYT;k_@T7N4-9~&MKzvmp!9YH)~UJP}c z3W6JoEh#p6TjDcD))Uyjch-NWvOeC?@a^yVwUB>Sz`g%>$(xC56dVX)@(X9U=kd#jq-NO& znG76U6r2DE941z304WM6EYN@M%#Zdz{a}}WYt0`HM<^x%4FuGS^dHv5zb+9`5m7L7 za{gyOZS{A3#ddxOoc zr+S%9^^Mxv?MC_{i=!*8suj^1Syk&NO?K-qZSQsZ53!ZphvZP<4+&IRc2(m|dq7eZb&;r-lx z4~*Izeah;tEVZ+Mo?yH)k?EdqlIPBy7i-WcZ5opR80WEq)MxD0Cglx8WoeOC!47-6 z$*1tz29q>O@)i=5pO53mCov<*7m}ps9ZFCEH!reF8dRiUTP-5@Q?m{Q6}ro5a}?Xl zi$mU-G_xVjEN6NMM4rth7!Ep%#3NGDm6~s;JoJS-#?Q|#FUmc-a23TTp}U6&GfhZP zNKT~-eOYTHHzmZ20plJDYTnT94nI!l!ZNavJVAw%RwRx z)nx_|_DblFR08z`NUGbJFv~(n6U$kmRDlG6M|DaMee!=lBU)cdh$r7m^e{AFN&u~Bk>M8q@rtwv7#j6%H6|-z)O|w**@@!4dF7)&^k;R@JI$& zN7wRdi5Rp##(a_K>?n=xKi}@ib@k(#WY<72vqyG`X3Zm024hE8SV5NuSUrO8&Zssb zG`lp|FMx>gc&1*Y=Qj6)>dd>O@uc#ir}{y1-mqaJ94VFqTc0>kA0#hG9u(Oj$N0yas8h8kRQnoLP1vQA*ru91Hs=ZyX372Ew8ts^MX#4m{h z*QYg6*EhevM4_BxbFXyhwCe8Ryn0P_zv7N}yNa+Sa0@0U7E=xJd!^Sa!i!INlr+r7 zfGN2875>287dj%6f-UMnRGq$8nCe}KiB|ht>L*@1>L(xq>XwjL)HkBYgl>XsCVgk^ zo}AQ_{v5P7@EppekoEC5^{>*ZXm9X2)E3>?;C@4xY0RvBH(RL&5la;zwM5W8Md z(F5?R(xetJrD8gG)AOKOq_{Q;&s~0$M}q}l`IN6XySDbF^}3XD4Fv`lVLnE9tZU^6 ziwBiYRtD(sCe}N%GUhC#?#naL<_}qs?A7hnAB)`p^9~9{Pi}l|wN;ItnOhS%EYIJ% z$Qde5FK^3t@$z3@+@I4^SB4`4>6WN#91eEUkuPHce7w51mmTv~`Av=Z72|Hv^Vr;%k&z5&>nIX6BC6ym4PyXLe6)>AnR;M@GY^6A6Xr zV^|w2zkKdzr7>ELQRxyWch>`G{z+F4o@At5dg*h*=lP0bhlD~K;eV^UR>1o+X zvP%`>;qR=PsHFI=bSqu#U(vr!&k-s4H8raSWEDpCqdgbZ7eZ|_xv94<8GKeXtlk7W z-U2n}TD&f@T!g(QwTtHT__P(u)B_P=#{AL>rGg|AfYsv`XwigN6<>o=gNSgoD1?$Bap3OvBN3Pzt$3NG6~A1rgKspOa46}y=)y)lUF zMP2TgCes#p?@~Uk>NaNt%7(na6Y@)FiF|f$f>hd=(mIzCU}CkP`xs>?=iSH;diZck zNo1@GpHQ@+l_+@3sHQp}H}A~s;1}iz&lbDqemn98cQMgDyBp8Lwh^wPW{>xNpqxk) zbZLUXOzB>3tiiZFN&OZ635v~&^J&6i*LW>*RYT;57(8FWlaJhiZ-DI+^6E7je&1qo zr1r=XHjEg}z{a52uHmdEpegOS#t>nJ5=FGI8RMMPmgqd|C^tvMyd^Wd8BS8uaSleCFG#*it^c>-G(nX;ZVlcRfWtQjxM4rm|O{08AXni<1PN$)&~A3z%|RHrkn zZE0+$_?>}>zKM59x;-doyi(0^v;nwfU_ddsr?*05?m%TxGCH^vK0&-q)4p+Tb&ak0 z9v8ryu`yU^HK$NXm;ZGj)agvW{(WMnWlbfNy*A02$6n$XF&Xed0HwHtb{o0PVD+mq~ zDX&c>9ng1%r-^_%NJ%@-vxRHKs=OOU(Oj0W1#*OQbIh!}L1i6d)}YE3ZRZH@+~Mr+ zzg=R`>ju6ij#1RiMr1J5=!kOOL5qq|ca-eNj%6F@#f4?e^YK{A48<6Kpz4*v6%Cf7 z3l2pjlgK}EBN2;BUYIb0uvwDtBaQ*vx8XmImk9k{c#Olh=-}GmysA-Az0)P_DURD9 z+yN|^nKP%YhAEM8*&ommSTsI@Ypk(fj??%4y*BecEc~PYrzNk&3Ev(6zbdiXlr|R` z5Fj8-NFX5E|ER?NZt&|Os3B%)lMW173!+w0Vn zKF}2qHn@Z^D?%gB+-;3G;p6ZYz(a;mw+atw_)J?^%%I5H!EH+xa{PEUAe?=_x=8sp zj0-?8HWtOfrUNoxy&u&$GM&yh2WRIk;ys;W4DOR6d&qijqSB0d!rz|b8w$#=BfsT0pQ>@ApuDifor3mL~hc4PuY}l z3k){(Tt&!-$Le&W&1$8W;$B0GDS_?V;oud_V(Pn$XxhCl^)d8Nlcf3<&4bqa$at-U z82r2tbjx3d=9O}I1Q!|(U)?|Gz4@aKN^=-#N%57W#!%5(51w2`93dloMFMO!uJ9&wtzMS4Rq>iz}TAE6>=WU(83#|YO*Hv;AO;_kbq{Lw@GZLE6a_qdaAGZ06 z+p84nt9aH|uhWg`dH0Vu6t5m6J@MVqEOL@9A5p2_^Lf^@2v^?!*bcy_CUwgU35+L|cN5VIk0QiH-nK{m+4NoY!hpqBX3zyg1L~#n7h6 zJsunx;vX5Y#yQ|i$;2i-CX=H61>o}4S6MmJwD-_iZ%z8Qg>^ahb+I2(P%oz@B3>_CQa3-A}8PiO3v|W8Rk)os{uId-t?&Zez8t zsd%L>)l8s1DCGG>F>2?*2;KnHrrS&&X5)zc`u?4R{&L1nb^%8|Pq|;6${GJIQGR!wx8ClRl&&W+EZ%9E=+*19T&GNJGH+?JLsQdH-(=uCe=#d{KZX*|z#EB&Br+-_=DHk0y(Uc)pHVLw1DmVPCpMvNr zwITzP25v`0NnK0I`zfd%K^P4}i<5P1wqS+HnDjHC*%RL(W{!O(T@yI7 z%vmwok>Sp5d%E)GRls_jgDoSq#f_5N@Z2T0q>T0cY_@SWN-AmQA^`8$(Gb-jIwwW_ zNfF6UF}VN3zq*4?K`JSJ4Y-g(MJRQrObMi!$a#!jDH2l715I+2R8KeppSXvF98Otp z;vVsYDANn(nL*^qj{;*dRJpZJKerGcW$TJ6|9SHW`+;ciy~f+5F<@+s0yq&`$q?Hz z=TvpvAY~d_$kYOM8@WoEk8_(<9IInu=Aljg6aH6w6pfG9XPiq?9bc9e>MTFWC*0_} zdDuFCw}#O9woG}b#|~|>WnPr>vEdHT;m6rxB44?=qFfQd!56=fbZ!||d||oGs68b~ z&TmA$qX{>TmdtN3psQya!oEqaY(IPSuuBcUrxfd3G3C0dSY?4vyy#X77oZ#6HR=1N z*4Fzze`U@TO=%t$AUSy#1JiT9gTao!J-jpXn_hkABvbb5@c5b+F!F6cgucuTf;^E_ zWuqkHOkV7vJ;%HdsGSY2xC?d3UFMEAz?TD33A~#3QUzY&b zEh`=wlJe`?(;qcBm~An^?qEPbXE6W17vygyP%<^MF*SCvw6_zsw{v!Ja{a3e=O0;X zZ*?3|)K7RYw&0}iNlIEK$23Gd`BhrrB19ol@MUBH=ttI?DK#z2;TgI$IsN$jAs;BH zF%Nz}1K+8gI_jZE$TjgNIMZ60Z!=!I+z)eh`+fp{i+D$DyCMw!G9GCt*eeXZ88RIR zDM%aftcbW7Szv-FZIlH=s5dWDMOl?+?~+fk<`(GE$1*fvg>AUs89`u6UGl# zRif6bK;G@;BcO`1=}=@K95@HRNY%dOuh7z467M!dpd6TuX{#?>=I(%CK5A4|#*=Q| z^qA@lM28n1qaLg*w+iVkBdil-veiX0*PCvM9f&-@2Uh_48j(D2!_YNxUsSf&pv9j= zBJ`zko!j*L<9u;%#+xM9-9oz+7n^cPy*!XqZWo|E?U~API%T20*oYe)T0&+@o^8+@7CWwTQ2O>aIL?Jk;Nu7e&9>rJy$Vwk-|MmU$Ph70q*+J zFG_GS40`e2>DsYrg82JD8z=2zT|+!i`KDHmPb3IoWfS5kT(~@->+?z!90>93yowDZ zWM7y*kgQb)%)Q&26yn)bN413!%i_h#kK~9zfCQ1OntWwzIB)q6XQdp&JJc`a1SK5_ zyz|uJnAKT|squ&@=UQ1xSS$mjdG0X#g<mi$JeD_;xCmIuq}5N__VZ)M_X@v?Sq6^hu7C47z=T24T6FfF}T_gF*|Ny7mnxu zeu2N4S3AEhLnvh20w#b;!lEw(CW~;aIs;OZw?tr}g^fp(|E%60i>SdZG`0e) z&;g?qsHaW+Eq$}zo4*Fg|upT;g}f@C&~Xv~fc;NuHv4W|JDRwT0SH_?-t_`|H4#&VC|2q~=8r zgpd~79n5l^QJ$3nYeZwr62!?o9F!#BiGKNBin}^E#394A0bZ_k=d!6VuT!NQ6xSmq zeZ>2Xq6-w)GbMdw(QpB5xd>7cs|XWDnOPwX<%Abk(G$4yWQ9${6K(cuv+#81vi?6( z1r8LpuU5ZhvLnd93%0*0Oxe@f#ne{8$=<=#$>ncF6QVdK2O@}Ax!qVpO!y?!Z_#lj zv34{9W^5Fdjn2}u<*6x#3({_a8TE#i&4T|1#6P;!Ua1&3!|5`mqV7IF-r?8L1E)WT$_k-3SodF z3vM*Zso@6hVedN%sxhAjM3#}0SU2*yKTk?LOuBtIUU6oriauicLdC2+I#)dAYCVyzvexJS5 z%-`cie?JNS$MG`%&+DH$T+a={&J6-z4C3K#4moGM8e|<)s;J8Xg6g@GN@#qDl4KD)z#O z2<=k}A_f5*hy0$|-{Io(Sy(x@hx}Xai$Rb>AQ~6~a|H!}4;z>mg#5CBJ2OZJ6#-Rs z0+A$#p#P&JLc*GEqVhLxMM3{e|NL=d!Xknyf`6C0Dr!sb3ZQ-zTV~iwp6aUW+Iz>J z1Pbb-2~rD@J=M(f!PLULl4b>vuIo24z|sdI@G-m=^fS!1NZG=hOlC4~?q{a?#r}5k z+-fz&fKSQxYUAm1Y`@iB&kwQ(jBtb%5;O%;rfBK1#DMpg2^3YUW_#6s#m5$RaqO<&(=-*^4goUx!DY zy0e^bTCxoH)D3;l-qC#fmhyx3*N4>gm|<(#t0Ff?yd{nD4|sPa97vQ@m#y5L+=z(o zlUH4*6AS@0O5d27(YIr(2UQeh+>C9mfwQ=KTw}-ASG<1v zpo{}8ws`^(cBa1dH=q#B@ia)fx;g>)fLM+32A#xN!&mfH{m-I^Vh>A`Okl!9BpWx> zWo+_h@r3W!#}lYyesMV2JL$NbW)XLGO1sH3S_?I5v07G9YOJ$bteK4z|2o@;m`-4& zf1OPL`e#D(&)K%OwKcVK`6o&J_U17^P1n`f+n#-Y=E#6Y>Y*{97%Fv?a(m3Qg=ku$ zSTJA5-Vjp;LQd@vkok@j@2u5KlWuY>&%s9xa;D!xecqL<+YEp>(6z|_Pa~arG{-iFPjH9sLJ4@uBKR46Tg@o=)px6a? zD}SGf!9kX}ZaZx}sEZ<|pQ|3c;VyFhc>1~oU(JIuPhF+FggbAF#YQ6NJ+i3RrZR)% zJThhWA;Pwc%@602zP*{Py)rDw4}r@;$w8UlU2~A{Dy3mfb>R)g{hHq?r4RKV;h^<1WP z9h3|*1WB}|Tb$dgxel9qZ&q1gnTm><1!*wF3^^BT;u<;B9hpsic8)lvDCClN6wDmM zFPU~Ph&FGx*38m!{k6l}5Mf)z*_ZbDM>VL&$Cnk_->XqJ*#9!uBKF2Ao(}&wib6^H zuR!7lo7)a4JgKc^9)rbLLHO)KAP)5j8JbeuytFU}_awFJzWBa)5q_&f0O%V6y+p1A zE(eJ(s*#(m(l&X16Aw4@>%`+k<>TVzB|i|)fG-+$HdH-{Ono4-R__t^3bq^T850XJ zK3B@>q2V6b$LR$UsP}+F1t*=RX99<{`UwQ1) z%@;yUTT=MH%I!>Fi$k)HG`#e$Km+=<*u&pAt|55NG(o?Ag*7u!c1ORLa7uX&irh*o#}WUC_OKb9RZ6Gh`T;YL)h)}D^N|13+p3^b=+7m)zy&AswLVB9)1ps?bDqc?p8fc($3TjtLbRaBDX#uP*p{N%rAys7?|}% zLh}W_6$ZCa%q>12U&Sk+ZewE|C&(v$nA@bH0mP^GXAiQcS47{}i_u86LEcKl$SbuG z8VUPo9#QH_a~RzSv^;4TW7HdvlDRe#a5m*75rGUSi-aaZOZKlT!V#iAlJ>EAdzvVy zjzpT@mFI#RlWM=N4FyGw#W5+&{S8ei%8_QzIZh~N_n<==P{0{>s|CTe5) z-`o=Yci?)n3WXcGEWM#&IweJcFP+0yb_^Q)9$5gUPOC5lcWaMa+F@@g`J8ZTG6WWP zOW#2dM0BSc>$(83-kKeJQ87Gud3o7AI}Pvr$L6LV(9&QQh|_dP8Eie#xEVfnQ!o?D z+Coj0VQ3zz!)8+^+au_zb56qrbB#FMtn3uL&=~w`3iF<($j=-&tRXi}OD#C5A!p1v z?a-#fd?S*GGlwWK?0Li=!%Wa_X3VRqwyQkY1wE+2rz=7Q+ZlOph(76~3(Bb_H ztnZtZJ*s>w;K+mb+^bB=^k@~%{Zl$eP9fIkW6gIU_uj)|G=OFvJDNxSwfGPYl0FNZ z!aU7N+GIaywy!sU{f_%Bk8Y6t@iMMSWP;d?iDEp0v7%QcB2};~?5h-9@~zl}0$*~J zaU{yDL$sdWmpO7&+B|>QJ&a>TS;O=X70nmZRv5f{@dx5_t)#r^^5gqxq$LchObYE> zw58C9Aq~PG$RiHW-}k-eYb1(N?@}B?=0Mt!jomF7Zd5z@dQ}o$P&IiH=Rzb{i_4i* zYt)prRT3C85?&6QJd!&~2c)8SMF4#1kcRBy!=$Z0s7|BzPU7vxC!$+9)87(Q4o$#A z@~vC&)fx9h{VPAvmZyw6sDtdu+AyJwSo)&pOjy(2=vkl1?Xs{wZ`e%|*}dgC3CN@L zJJ1w8c(aPgH3`D+EkP=9>&w5EJp2JmGmiLs^53w``AvhA|F5vLbFp;sR5CUD1DMfS z9MA#5DL}Gg;?jBlU_yUX6E6#CIR^)16rE-3J%mD?mTuq=SPW7H(l41v{4h-IY*bEo zg8Ac7*eP4u08bF7fAl(qT`1}_9 zhP$&FGcTWcqG<8qY1x}1CHVL;RTj6|_V2Kg;xE4@;d88oKVYTX-u8PLV^t4O3@V~> ze5+f;ipxKYl~iPx^g#3$=H_Su(2J(X_=zObmCL`fl#2bxj5D0Q3krAq`q1eOkhYBH zWg9o~=_jE`$6sN1q|DIHCe11vuSs^!dBaKRv&3A^K6?M~3r9E58xmf`f{tRVB~kt& zW$A9Ag0}Mbjs1ZmE5vVd&Q1S_di&V$emFKL{(T9l-olJ~1I^XCC5+5atG9CA0r(yp zyOi1H&D#QQtVGgJR2^NaR!&|F^d1tN?l%X1;&uW+tnLaU7 z3MUM;U{E%wJ;B3urE7;2j$xCa+nIwB_Pq*s5-KP>o$Wj)>2}liVB}R4D82C5f58B3 zz$j1jbA8iyrN43{A894TPiR&*~(Zcm?0Z@GGbMMw6pD zUdM-cx(lL4VrnZjalZMlSn~qTf&Qz$I2Gm3^Bw=d+Q0RAsZ!T;MpZ@SlQkm}CiN#W z#Du^Mi}PoM0!c6cLotFNHkIKG2YKV>&PbF6#OeZSbsl2QZgFTERrIiH<>nSWx6#}Az(i&)qs$5)tNXn(-9Ar){yEk2IW70zT zNGHGN3rAA}t43^+~SVq|v|n^5c}KD4Eg&9Tqy z-XeBswof-3C4POksLb^?1kJz2JrA(0$F*R{gg*E2h}TN|p#b|5-pg(|FqbWAb$lD* z6ORMdehl&4*Tsx1w9gcBq+yIzVrjQNadejC!+ge+ZhwKkDjKb@-vBN7A)}R(S zcS*$;AjQph>4zomCJbZ?07F2$ze@%Ysle!0hGKz7lm`u7BMsvN&d-VQ5)8)dr^XS< z0CN0}A(BpT1jGc1Xq8Bak4gw}M1<3C9fsJ??vuZq+RIh^HHNOa0_ekv6?qQa*saUC53a8?$2fr;*cwfYk>r*)gOS41q8 zfTAOz%53DKiARQojf%yaq!gwz`;LDycO&X|4#BE+QcF6?{qm&oLMHkz!!WO@b~ z219;^f_E4V&qiQ1F1+}=N#y=PP#zUJ$W(SFjz z=uur|uyyUtmxo*WmCJzS#|$IW@njk@H92pZiUJi)ob%BW)a3d7s!9X}XoCDYJ|R<| zH38FTj%3%tvPvd((=6mUj##rw zvlWZDO#$`94E9zulAeJMqSsA#BzdhtHE>z0{HsVjmNX=P49U?_ftHJ^Slwj^9DHSlkGdeCbN%hTv|DyII~Z5&zX{NYWnFX6EiIV2B`@uN<8K4 zn7#itE=y9JV9LYcac8!0%txWrIjmK(Cuzo+DHrPqzqoaq8b8=;{!Mk<1ofrz(UC!b zTcjg;mHIqJ;vg$(IFTk+Ptq>l8HEfr{zAY87B)In#x}ZLY)x?+M($!4@x3RUEX|=dcvRyt z387C2bL9Q;jyrSY<<3T#C9RLJ)eGNc*@18`%U+b}?));XPx^hlMh>z@2vSA9Rk`0E zk-`us*Q+1EKtO_^f1Ydk2TcEJmHLlBp{zWLAf|8es+(;+9U6FLn7=+%TuT5=;dkVO z^yqZ|P7lM?7}rxbisdY9KU55q=y1r%U;fx zF=$Vl;xSkp2HTFhYpvXrVUDZ5n5aYn(VUe~kew`nqN03}*Z7O4Z4LA|9}JLZ#xPRz z6%aM~5Ric&LKqiigR*V-_scGvmzi$f1xG~qhh{F329=yJ@YwFhT}Aal3SV{;(-~!6 z>eo4QKB|NJMM5NvM-?82P#@M6XW|p}0oRjbvaVOD>}akuADr|*~x@0x(3U<=mQcQ3F!xsZFH zO<0MJGePd<<+S|~^IV(96~w>Zr&R1Xuk>#-DE-aY zy#MQc{#~y3&+q=G@PDMPvlJDjK?D&$9(Z`$E9ZXw3WNGqgU?kJibw)Q21Ogx`*^Q& zy4R81*?weyk9s$aa3n73Tp|)j)&R@Ry!maDk@@xG`UN64#ufz{Rpy8ibBU#9AdbtG zhl0acLgmpL&P)0WSfAF=b-yde1+44PD?QP3OhfDH?*F0e9m6DRw)F2pciFaWySi-K zwr$&4w(aV&ZQJa!ZT7#<%sKDO^9-(e^UC}XxxZxW-`W|mBJOp^c*GuN88|#(M&2@t z5PmCftLrSZj|9dxsWIeQYACMlfhS*+?%79RQBVJXv6_}M_7durS_-L_0us4vG$WiogmQ|t@MOc#w_p^^t+MZA7f4|?r13m2zV1(Xi!+1F~XIjoU-G*RvhoiSX5uxkt?M*0n zlZO7>vtsNFcG{SY`Dr)6elunBg4R7XmD=`-OV>Ry^xWzm5_Ro#3rgoZIuu**;s686 zfjuN=h%s2H(1|v5uFy#c6!6k#s8A`5mSm|?38kI6q?)8DFf;vwOKV|*)u%>LvB|PY z8F4i|J7bzBMa!EiacYuQb_#kkj#@=^fjm{pYTv>{gYsOnIHRN(v(PuUx8^OQ?R9Oe zJS0Rzlhss9C4uDBvRa!?<)JY%g`t3~k>9vjSwqP=;WRWYMTn)VV>1pXeH8uv4LATW zIEol>V{D;O7;|tZVpG!GT%>}QTnzGfF`cYjY%g4X&}QQr`iT5$c~2%oCsk56wt<|v zj!4ZJ55bUq4aP3hL>|vw&QnA@slqE2%fnM03i;nHK{VgyULiPET$QtzX(fUN^E5E0Kmv#x8SyC8$H zP~xS%(zty{urxeL7+c6pF1dl(ubm(FL}Y$C=vA>T{uzp)lBuxVXsMylG)Y<9zn#iK zr{h|jR|OTm&*HLVM#aevD+YrJQuxGcB4ueKLp|?md|b}G$nwbE{=GeAs+~V~Mer`L ze4#=$g&cP%v-ADPBg$+%1HK!l0D%lHy8@&OPwIPu>tK1{QGV;TlzxVS4VYE*bwd!X zWofo}ebhi^Hwf?an6tndFj+(TP&BB(6RkN_X7G_)#YAMytjVz^8H3FT(@eJExqe-R znk5)NbMrG!fIO#M03yUu?V+*7)IiFkZhf((a;D81Mo+`3KE=l)^Zk0{z4_UvrU-R~ zcMhVAYy5^69XdwczNvG&U5aJbXt*c#jEPt@XwKN(X*eD810>>Dxh0ipAcKoxu#ZuDM3a*h6P4R-~%6 z;zShYr1WOfO?rD7qhUg#u3J3&e2qhzH=(*j0Dxe+}|st^_rhrV!4M@Zs9 zj?`1tbK3e)v1N<%cnPzu80$=;(zVNJfl(h0MCSSL)8?0JYQ#~i`Km0E+}M?hm*iB9 zJWUbNfEwj{yU^bKK8K6Ue(+K=AKlLsf#@PjiaDlttQ*Xdd?T${yoVDSYv7IFlZ+ggCuJC&pIF{JCGz^KK_0U{?77rWVi!HhloMLy zX<-c)X9ri+6${o6w{sQMaGy-Hv%KA{GMp1>Y$O&%v1E_b7+0j441I;$p4pGPhe7NV zSL^oLYLndm+>mCp9>W;UZjFMtPO0`fLC;_ADkF0{l zd=VIRPBJ$7UKnsnk&Ky7gi`Ma zj_ygrW@XcAD^&;S%pUbA9_d0z*7{-g27Cub>jPz)9h^D0yBvTK9UQsFfw}V|_qnkB1^4-( zTV-w>A6tN$H%CtB-k!Q;m{DxzJ}o{R>I5BJH7>xHeZ&MGfLhhgA)8kBVN4CMf&su` zkEq}Scx2~a%&Ja~a|DskGnBQGE=Zlim|2z$L`~EpHN<#{kL(g2MU84`sV3Y->mNr~ zAvvGaEr#|GnSVnW@18i+D{IxY7KXy05BA^g8_)e|?2|Q;$Au7&jwxCV?E$i8#R;HC z;t~(nRB5hOA-C{H`xOq1IhP`baC!6F_|X8wk(SmRxBs5PQ;F;T@) zR0%T*r;n=Snpi2}$jMj+`wOU=u3$hcgL^d7^En;i_|Kl&L)PzaXys3w5f2{opyL8U ztvR|156*LXA%x@H;J^Q-bZpH}a0>Y|AIbWkX2~K>Mh5mKO3sddGAXnF`529yz37km zER>bKgTX*$Q7|-Evnh)Ir1i$hOJfjbYAvFuBVp}Qq^GWRj5Xj&4F#qg_sGXyYf%CuS`7ZH&vK#yep}%Etq_cqtlN7NuJ%0h=FziYW z4M7zvuHz{l&Tb5^tz&cQHtG`J;)oNthiY>Kc>V%*rx>ilZ2}K2e!Q6cxSukAx;?!H z^@sc6WnX)=%e$=OZ9nH)*T?WIQZkRjsNCWP1|yp%8fZ{Xu5?SB3ls7+6b31x$%}et z+}qUnMRSs-ZVIDs?k%O19~5kso+sW>>UemujVqbK&d(-!R@2Bz5sL@*@-Eu_kFo{;4?{O`t-Z@@(5Mxk`vjKLDV1aKZi? z=C2H2Bb~K2|1cE$lhAYhFAV>g!w8xGqXOLdzYEZ8#eZ9U;x+1EbbzG{P_&0CMj(Jh z0t;UCU;RcDN2LDEq|bIw`Z5Bi11mQE1!Yx;T>vB^Rs9Co8)a`D4jxs26wOJ`>1cDs z`}64)+TZGgv#hVu=sPWVCdcJ3m}YD14Gyz?o*>!;f^4XvTHdVN(oH$zGjK$;^jY7Y z`Ddz8+R$~Iba9`s{4Gv|EnH@GA0|vJq4e;uS8t+4qaP8J^Ef5Iu_M}J{d!=uxMR@< z_cg1#9#wufCcrzW#MP~6yUbwE0tpaHu^uUqf;%`RR1ang&c0i6PF!{l2W`i4ZR zHd+q~luqadVt!Lb8dT$0PA1O!v7|@vGh2W5HU5rYqZHlx2*HLXbu+G82%Wr|V8A+* zEGF!WxbkmeTm;Qgh8q~xTklnQlV_cM&R?J@;m@5S*yy8@NbLlE1+yr9Myzss<&AD3 zJz^LmW{~I(4pDn>jP?E{93mR@BCk1e0%-Q%SJ!g{q-N=!BTpWy*P(T}F=*oJclp~~ z_A#NqJJOW(uMFNFwcu>e;NXd{g>UqZ-EC3g&@wZhUC}K6^7-3t>H!B5WAdMv*#`N$ z#n@kC=C4u0E@87-atPT=DG19Y+`;LZMj|Z9(OujdwG66V)H}e-;d^H zgaIl7P(drfmLb}HHd|Ht2$pQO5}erlB!?UVT#hH&FD8Grop5PuoVcgh(*@g!d1x*! z^}<0M4)h`!d6anP8~+|Twrk$A++B4k-frPhOm5wtfJ*L$Fu%Smj4769>;etxRW5}$}%TC zzls@2t-uc#8UWkB%w2^niMZw*yumKlA!I?>|K}h@%d)66B<7W@1 zd63#bIV}z7Bs6CC6ZATW3bpv*Ze>3Lz&x|J|2jmfW6H8>ORVw!?A0g=~3KY~LiOdxcBI!`juWT2j zG84!WHp2t?_Rw1$_9g9i!Cw^i4g!7^24-@*nND*)Pj0q6r>X&At5XmJIRbNygO$Ke zVx*BCxZ13!dId|noCfBtbe537EZL~#1aE~t%!mx^j*D+K1UnIWbB`|+)U3PmWAMVz zIFQaH(I;7N+2XE7Rt_1hB>PSw3J`GWRD1bOT(ERqm7Ip0Q7IqAAG?KUeuQ)lJmg)5 z$TC~pDJ`wflL|Dff2+VuBlc&|x-4(6L!K(!szRpn^M?pwrhlOIFcw38B#&tVw4#X| z=wqajSA7g{<)g&Qh_%w*H_pYU5KVp}yo{4bKQ@Y|oy-kz{Vtof8odKI%M7y1Rnd;cPHz=eh> z_Ybt#!w`Sa4lB0V05s1+e4i6WjrmOKwbR2b5*d9X{~fKtu}SoB>)$mx%FwVk*?-V} z`!81T{~KBrWzm0$!zTU=<0!l<9vFh_JpA(F&>{0wlt`ghR8(w;3e+N(L@ZHPWYfQ- z58P*0MIUn84Za)pf!`>Ut*|M6Cq#wbIp!RBo}RqidW7}&@unb*6@?5L>>S3%#%9}I zUnN25DdQIj3)XH}B0t#hq<~DWfjW40XNo&ghw-ji>{v(j)x$_Wcpma*Q6$WFMQPtt zej*|!I{p0e*d$Eq`5wSxqZgcSJSwY(J%b7Vc#v4Qf5HOD0P;r{MscFW?){ zewVD-eiEr)h4b5BYyEj@GnrYR;S+SK?s*0G`3MBdOO5u&0g}xcqgWkA4rJrCjAr{f zm>Xql?sDe5UciE^@%G+`?$fb->g|XIMv-4}V(QtP6uDnLx_VeH1x343io0ruF`jjd z>qdzE<1mmHx1Z=QlaU`dj^nEpN?KCmiZ zOm}8as`FObgwMx_uOy`OX8vA|NK17P6@g~zzBB{OvkT196IH)dB(-F2t=z}Drxozd z-TPh@BQxLsRQ8brS`*KpsOCLTdF=FA|&6?f;xDii_GALpQ8)xZp&OOg@ zTj{g!`|BySzXnf)z~DbB#zX~0`@1;W87HQ)qH{P%ukRy0FhMuzN5vg_D2S&%K_THW z56qGiR4W!GA2e9EJbnb4^bm{^=xu)5l%GA_mmX48i|;p~x>Oc1Mt5~WSv>H!c+(jW zWp*I(Ys0d|Da&lE-e_@$YAw0ZXvTw-OsT;{X}HMo&EBWjvfpPMXSg=RbwIiOJY#XL zEa@OCh4B#4vcu$gMkg<)&uBiSWh|mI*O*>{xa?xHaATaZUT;6{7$h+aXTI8wW?A~BlmabuP&}1A)N73FNAuarch$oddA3p(s3R76753`?tD$o-M zY^%6gG&eKrqDv-JWWdSBdOdSA{fCU%jJf+F>t}2Y47Aw@YF2;0NY90LPyZcF_L*%v zR{S9hIz${kgb&q&#Z?FRD@2*1FicP@Tqt3r=-55^HrTsA02$(%(yZQQBftpa~| zs@4}67no=c+~JIvh#Y}4Zy!fLxI1})X|n*0M~;|;8)eflK$kxw1CLAe;fBv15?Pzu z7MwLPE}qn@;sEzDm~UwY;k+xs9_AIIjvzcrAPxeA6zN;Gz$_|kV9`SeQNB!AEnRc` z>{&b;SCeOBOp)t1*B3J|N@4K@c;`r%pn_aJt!=CXB({XuV9ib$eYsXJ7kGyXmsec)y+O1EnaXMxtL3bea#$1b=k` z9q;iOKS8H|mg3Uy_87kuF4(i_URc4LP9MMVGGa$v{$Wj3^D z8>yaoX zr%?u(&{L+#xP0-@bS4gyG|~agiKtJ-~h2gQPu``Uc8aO^gXo()7g}tdWRWi7hlXh;o&I;&x*DtB&fZFYTecDu2m zt!Zp!UBdp29zq+Z3=*8^leLo$<@C6)#G^1?m$qey>26B`b+u%}N@-2tASI`+Z->aQAk zKN74Ju6@|!lgNg+>ZwU~_%rq{`-*sWk^P{6gFOd3{iRYX4Kk+(tFfovt3^pc2@#VY zjGY@7OL7^zW&k7eyfNfJ=Vy zN6SeU(N8%#j628}#OO?*oZ*_<;pj(4{;D|>fd9Hq8@^Yr5AdcM(>hcYzWM;Z&M5(9Nub^@0_5NniS(o4? z#!-1THys@?5^gJonC;;hhJ^bHHN&%=`dmzk0T3l=5Wk|ywLjL~Z4phx6{=Hb$yxLy z|89^QKSus8p*8beQ~sg36um*h#-*ELDZetYtKp zIczrNfM)VCXBj|swBr%30-X?=DLiAqpqdZC7K#MaVyczHt59fnyI!0{W4Th|ib|^V ztX`b}g`V3-{lG@vqA&={oK~x&N;ECHV6JbeDq;T!xF@cMy6!nYLKhqt zbYW+ATcOQq25aTC_SvrlDyt71-}pl~bA7~S8(b-DuFffK8(J=xJoqju8;9Ao12=i- zCM4A(r^|hpQo~5Ls~E=vPw+QPd@w}EUxJuKOu{DNyF}o7OeDtQ;|znKHmEzT>Y)Z} z?>@JwGx8mhxNw`3&oS?5L4G5ba6B<)97J-%J0_Q;!QC^eWgs9fZNeI$ui(5DNU=IA^b#|u^wX-1WJz*Qz zK|{?Vwee^-OM&qRr)Fbk98m$oGIE2-DC&$%r)5Sp5!)|Ha*C@>O>!`j6QzqPU2&dH zp$_wKKFmg!HrZ*Q96ZUF!VYexY@I7G!XE$hbhRnOP_ktjY0;Va&=J_(ang7jF6!jU zc{97iqCN+m-N*5!+nB5&-s5k^B2@|mS>j7lcKn{LSp{wTLq)6%queQn?1F%7MKhvx+d>;@Rx|P|T6DE6`*`)S=BBNcU8`$Dy_OP~ zxZ-AobK%SHBiFU=0$*%~ZN3@n2OEpEQ#%n#uSQrj_Ud^~c)_ozyDGuPlQt!-7pm_Q!>7{) zNSt=W)rB*PsIlSBzTu~D( zzku9>Sc}yCC>|wsU*_&XTf;r2dUS^TS2E9zQ@2B!D_-}yOjFy+Z1J(u7Ow|1 z$qwIZ1IHSD%1jM+!bqjjt_DEJzP~e!>@)F!lm>Ry0%{e>R4sph%ya9PW3et}kV;G1 zc*d!3rcfc{GgW5J5Zf(z>r#tp>Ktt#+H1fYJ<*nNf~>f%IYSIha~h?cGvSA3mOJI} zs4Kzau!qUt1y9gK&ucE(IMn}Y+p>+4lBxb>F~`MwXE{YYV(YANZPu}ww;{?DP4dIu z7f6qYA;ypQL#vEjwT@?Ys)y@~^<)n8{k^8rmn}?*u2c(>o;u3|NoQ#a8J7)vS z_UzIq#Rb(II$4=6ywoLz_0xj>gs$3-s%VsCWaT>3a;8AR-LnNbeDum}wmHp10gz6v7f)aU8}S0XXz#jfYvF(UFU0K-t6IEe|bY0kcZ3(1%=Ch>!2LB zAPt>a5NQSMwMHPh2Zr7ntp}l>B6SMp4qTrob_%5K(za(+oJwj+sLffnXRyt(E{f~r z(K^%mX?RC8&$&3m>Bx1QfI-cxod~wa6FDR6Nb42zKCo^(K>MWI8ckn1Q(qR^&Eq~G zY{|sVLhy<{&p)4NJ#hJGxqaThaGB*J{vI!%ipF>9>WaYCHOZoO&MC@lxmD?!9=kB@ zO3*xk{m8__p!&qq+fR>R{UqwHk&38=^WwbK;IOvss}@}qe@%$v(VQ|+vP)1;_e00x zq>1jNk8cQ+=o*X^Au@wZv_PUpi@*V(P7JCuI#u29P9N)+xzk*lsf@4xSX!l zQe8VI$a&~+km=c?qt00Q^VY%RP{hh-%=wNkWXey*f}{zM$@)tR1=cEO7T6u_yoYC6 zJakL7OO}0AVd3Lx_MT|2E>us-MP=pUuL0^-mPP7v7?eip<1L@aPswKbg=UP|zT*)u zoGf$DtI~V}Xm6aFC+H`6sT`KN!)B*y5cAa9;d&y`fIUM`She||Ysh{<*e5OSNnie@ zCo-L~cDpif#M>oqWzpM(P@cIJC!k+b^~!R-Bw-&2{hEJge>@=C6vtYC`v~$n zN3)3Jry1rOh!jsGgS3k|%z{cH`iP}Vz*Eb<6)RSWiQw-jGpe2;>h~#?%@+0#yH_~p zEcO2IO_4HaI ztipV}9$8oTF&<{KNu6z>ogk*INNFOc;cs}TtV|gtUzk)VQ0^~RE*e#jqBG9qOg*uX zTpu#vj(?@Ek#KlDsN)&yQ8On@eRoVLRO}=A`}7{Cp9>yW7?(Zo9KK+CzltXu7H>ho zIw@ZuR1~w5iRG4RN5I;!{)vF?evdJ0=~I5a!IIP$1=iGr7z%|xGD!x;7g{n&HHq?4 zy}-Gz@Iqf?TCBPr`aJmu3+3nOvZ~}K`@?d|jZ8F#K6|ZmUC&v0f)F#n8oe1QNTkhN zFt!+r$e0Yk|M6SbdjdhVkk4t>3vc)+n&K0hzs(o~NeXMsr*&ubf}O{pc|>D0e```r zl9)j)Vz=G^cdwG02YC5{rE1Nc|5-Br!$#=NRA@varvg9U|Jv{yRc@^bjG0-Gw`<_6 zhDCmZ`bkjx?6p2iSk2>_q3(G3xzH-#&>86-_}W?5w5lI*?9w5zjO-8pFed^FcLM0K zcg}d6$r$5(6p~zq1i5>H2u$%|N20Z~kinuOVMhvfBs(^w1#5Nb8XoZku!I55c=v{Q zn$d^@L>^1)8umE#?-C0_8vM)5ac_|PRTc!QpHdodKN66|mDu8@I0JY>uaBUnWt61n zr^UJM(uBL04i83NC%mWgSph1e?29ShzB zrmbuzyN@!RY`+X_{j4UR*li!A-HvWsf_LrYN`Jr1jVS*(j~tyjEIpKn%S|+wN;WUA z9keiKEkc*FGkpU?S?H?G#M9T>3Og+UU-)jvwSeznM`MPDX+|~q2{}_%Ch+ArJ(HM> zFQk=nXzvSmn0uI;&RM;w{lTKcKC==4S_#lUcjXG6!Qp>IY@BG^2TH*gD3xx(?HwmR z*~_VV2U@-w;mjI^*Z&m4`0bTggYKn6NVos`=xL`{EPm=I8}`J5|LrTM&heHkt7R@` zNt$m$M}mAITY4k?%CJ4z!rvklZsN)Buj?po)i^wNy?&Nh_Eub|F97I&kh7uf7yh_0;Wgz)64xh7)DqL{tQ4rZ%EZG=)q5R}RUGX~CV)=aGp{$(1JDU&_TQOG>)eje?n>t3qn z8!`*hT)3d{^8x>b`2!em?6W2qn7*f*b)R$pa2dFjN8`nF0B5gng zkr8pl_`yiG-vzRe$(Dd{pDY0hjU=*eTWUwV*-A*)XEY z#C*8f_FQ&52jQ0i$IN5`(Dg;2Xgu}Us}=}|rlb~NhlIN=E*cuaY~N{tI>H3_>%Cor z%ukQ2@F5Jz*k1<2r zsoK;>)AoWDTmzZA1jh#HFuT7Bz}x4e7;>ixz9q#oQv90J};T;y}qniv`|ZY(sz) zYHO>?q)d+MC3R9|)nSzDdfG%rXJPWYf@mqhxG86eKCA_B*G#E0L+GQBa#CSISeZGh zWN^MdC?;YiRQ+nftySE2mU)+G^IeR`ZV+TnU=SN9SST`mN{(1)Yu0jopdhHwGz?S2 z;0Od{12Q6M?cqu&QAY8DrKWsJ*-VcKjto=iC@{(1Lo6SkFGMj=G@jE!1LhwTXQsP@t*tANJ2ima zSBSDw9zX+D&Fj%3M_1P}N0?eE-TX*tZg=pVGWj_yzvt-EKnNM%U!LHnI4PAv z4flg;5@VE(_K*1mjHP-Uxi^bOJxDy9Re=7 z){U76^aovbFr{=ypC2-SH#WC7RS~$lQ2(!j_{2+DWC4`Wozs53;s${kn5O)Q6%-N*t&I5GP4Srz|^d^koM+Q@AzJ8fh%+U^ZFfOw?;F z@wE>dT`y`#KZPo{lCoJVDMI!HHHO|KQkjF{#$j$#0mo2kHcY_{Z9bvm3T&r`=0m97 z>?bU(dM(&^)y7owbzMFiZmhZVp)ZUB(#1CTYaTObVXrzG&{@mP6J4fb&&54`aaCiz zZZFN1>_t`~Eld0^pvA2{RnH353HCf|PD8tJYP4%Cam+WpgTyqMt)b^+cj}Dg_*O6r zsi{o2>ZQDMcghp(DQ4;hX@z75?=qtkzPBGeE48Yaz4|F3zkKH!ym+^b#9^sbux+j= zLf5Ec8E>)-4AbuPItq^&U5&j0=ok{GaFyvKc4l9-LOcTu&LVMy-elBPb^Y8~WC|&` zaU}`V?q1TRl7bzV#<0I~47_Jj;jT|rQ$^%n0}8b%%}-o>rOQvDlNIkDZqpwa>lcgg zLR`a*P$(lU3U(k8L0{Nw7x2gEA$*qQUZ{!U&%}gvpBY6la0>)5unn_jF$@D4ehiWr zoYA}^8;a}0Acq?wMYW1KKw7a}Qowfj(?*hB3^+O z_)8G}%Ut+h-~FGf6%dFaia>-sb!;jV?^U0k3VN25W`+3j@KL9-kpxm^=`JR{?|lX) zFWyJavHiK&Y)Is54GQ!Pw)(+@&Q>3FeEQ?cuAVR^n>$fqsBu@&(Ra(}7g?{pf)BVI zd%N(|Y*FL{l=xbKg-(?>Z)X>_mZwb0M)JEA9SH*YsX`~)uA!Hn+z}uO*tit8xCgX2 zx$KQ6UAmPu%f^2uXP`;K=$9!UCzY`m3PhJ;4NPlO1#KngV}&!bV^KWwcJUp=@&u76 zqK(6d{l3WBy$NH27%?huTsQ;QyzP@-ddk|yZ2mIN6V0_D;sVpb3Tie}IEX7&A!>UD z+2@okJ(U^C8wBY}hXiIz@wYxODcu9pFrqST7#e~!AOdvZ+|^mL9{p7CKroc|6QL=H zHmM&i;rm+!;0Qk2w|O`qpbN_Xp<3ZTQ~GxnQ|hqZ+A7Jvci0m<#|~I+<{ymKS!ATd z6VrW|(*}HuLxuqumq$)sbjL5eX zaEmIaufnekhv+!_^Xfk%A_zR*^zgXf&SY15S1K<7b@sE$#NWGgC`nFd++nn2d zjgMUXp8lV0uYRaAuXCY0H|zIJ?!fep_gc2Pdq-}pt1+pc?jpVP!Sc$x`4+n>BB;+x z74mJ*Jl3hbDMaUHElXNS<*Qv95Fd<}qv#8K?|WX<``o-*{u2Gs)jdE7nw)?E8 zfS2XIXH~0###pGhLwebHI#!vv|J&Q_v0sbl7Mo=aS>@10$zt+LVJ$do>2z90TMm@#&M@1kL8`QYO(0D(^6~5FbaE*$IjXXxa!tbV!;G&N+FMpnv zB=OGi(N>=|c-E{q6rPVr9%pQDQ|;Wh4VKNgE~Pf5s)dQn;5uEIJ3=@FhjEe=l(qNH zKRK!zJUI zCeBvvm+hAosb;Wd)YZ4rjAk6sC7uXYrL~?$-OWP#!eOH3w289E$00-+>o~p8nC#wt zMQ8Qv3kx$~b73`7CHQ2X&gZm$2oc&Dy#H#N8m{RhAie%2mCAAFBAY!K*6wAG=Zljb z1S4XZ#G5*LaKKYVCxN7K91&jiaoCR<#3Ij}Ax+rr6K>|0PcB%L^<|%F6PLA-yZW{u zeq#f-o)ah1iCEOZ-ViT_WJEcT%AK`0abYMAUH$ez>Y{{eCy7RMuaiRQi848t8v#IN zX|798?zKMZm|TD?T1%<^c|~FcKZZck5Hb)%7X<^KuBJJzRNvkJMXD=;RiE_Z-GF}b zq7!O2AeJ;W1#xNU(mhO|?*Y+=sBj?_k9^qcE(v4!u`9wl5YEwxDtUTpxF;lqTX%Dy zW(8RaYbei;BztD?;p-c>Kvz?m)>I}diG6h_#vYclE!~JNEO?z7YIOz&zMDD50Ab0v zxjS#oY%Tmdt9AstxjS*qygh5p9KsNAz*3lFTZD{3^Rne~9Ib0D0&2tVqV>0HqBL;i zL{C*zn+$c*byl2#n1kG(mh6;UXB_d_r<>xtRgbL}E+8~q)BQ|iV^3uRi~r}{VoLv(a3`8>H>oewuzrA^*&EwVF;oGWVBu1#c9uHLVAeX(;PQ2jcb@}d&B|R{ z9JL`X8Epc(#liDIPg}Md@))+rDCIf{Oo%NRA4L(#V?9V9ox)HA`I%HBHW;@%U-@&)4n$V+wBkF^RxPbB4Si)t6@=g-)XHE zFIKRBvz|heb6>%y7%$ex<}^F04p|ysjwg=LzL=GF4oozxEHY>9ENW``{Oa3K9cNkAZGCLhuPUUgdaf0ya;^k@y^MOp@CBP zE+&V$yXIAF{6*+M z><{HBr5&)o5WXh6f}hkDy7E0V9I%KFS;0sTIl<)ad}WnTzGzG2`P<|zWH=)n)#l$##R*}>1&~AYY#NpFxA9>h-`HXG;w$xPHpOtRQ?=31 zC}8P$43QzmuDOErl3rBm@&ogyYy4MYc6;RgM438k`7N2MSTXLxt1CtkH$^ zfL0ADt@@XeeocK}Bm0W^|K4D}cy)Hl5;FCnWHZQ3v2WB=R(A}R07yW$zvf3AorF1; zMRJXeKMHklP8xF-5m^EV=k7cJ|4snx)pe0X{za9v>3JohdH z#eLrI(Ivxb;`C^agT7Uxh+2Jre)adCICZEM2jSK7w0|1OuE)}Do6kS{vN&qS+s>Z3hUm09j8ei=ko0!kcoeFkLG3O1`VB{NtS@OhJQPqM z8j?hWf8NC3UQ)mBLE8;j@%S6lDbzvNi&g5>co$&m+IhQi@J%$=S0(pR@M!?0=?D0KPzj1_><;`&bN8dU8Ft6#c;bkU2kZq z!InC0Z}7`K$SPF1J)&Ed<_LU=INI;GWTUztv|q9n+fsz=vN(JM`PAycuPna>yhr`N zOxMStYSKfl5=*(FI>x=OX;gC?>me5h*Q5nd_c;4sdCmr-)Jb#&`8%VN2VIl*>M$H) zBJ5%UW&meslCa;E@fl#SEFfxcwDMVLDD%poU4MiZE17cv0HG!gQBx^Hhf3xSEoD_& zNh;>@T(#1WgjLQ4iAbV9>!%He!XuarH5mm}KkOq=f8+hu|JBu3yBCVo+5HPeHH$)E ze1Tdn3CoGljJ7zH;K?Aq9v62UNR^tKMs!oZf8&?spkL9ZrYCO&PO3JhOBdd6;Tr8# z?{Wv;BhE;m5fO!&e(gg`=uQu^P7l#~v{qcVR({3oxM6L=t%we7LR6^uxM~Jk{&oO? z$vFRBg+N|_p9@Q?Y@%=t3fK#J{Ve89TXxGB_DxRTroS6hwa{ix&ppcelY`}P)i`8~ z6J(eJAkW+6#nstW#z;k>I$67$!h>Smz&)AxhBC2C31Ham$O|$Kt6tMNL?eAJ9~--8 zRPT++01W>N&pXSXY8BvhT8pZAJwR@LkiRCkrxf}dcAlqleN+sWB-PRkG|Y5%H)Mfl zMEolT?VcrL9?L;c(kN`NzeQ}kHP*N;y3(3SSV6RwV8AHefqSgAFgp7E)?)7+^S;dE zs7U54NtlPW*l$@yDC$AJJT#Z+lzdz~w+|E!RxTZ@dn^u-;P>73G0LKaN<#p=B&X2G z8$(6XPyM>Pa1s4p6buRlc6os~b{_If66YO0DiYENtx7>HVbNe9uvuWeVM};`h>ZM2Ca# zP}1)#m=56;DnBrI$K`63UMXFv`GlljIpL^!dW-I)HuHFbjK&*UHC|C|)qG<*l8zaw zKfvHA=zn#LOQleJwR(JuT}b!Kfl-MPyZxTUR^Z z8J)5mZ;A(q`7MiKh#9b8PKf%oMzpRR@*B@o2^=+ruQ#Gz0^E|FHa(9AD` zfgtXfmkJ0m`^R9KJ{87R9}UNkNP&BZ#~Uy*MC0L|7}X_ETAsp zYGUjBU)IoKqU+!S`4NQ8P(|W}xwMd*9s~XKVaU)z1BcOe1LN+ealrA-{!wr+EF^{P zR^O3se8j8w4DOH64ZRW~c7wEZ5`8Vz2iY)aEvGP19D(g*6}{`JQ*0xdCd!0dL1*G{ za8%%kj@&PK8mQ9NZkzUYux96niNt>cujtr?Y@u_Xf#9r6rl?W-qJ2Awfacd5*e3FL zliiJ4<-}0C(>J?ar!!+(=G1rcw=-W@D7b4Cfq{VLL4bgS{*PV$Psc(1+m*kq*c2!1 zNP-BU4EJcLt*}uyEH+L=PDZJoQ(eFteh*OA7jHS|S{iRBZfKadiCt8g6@i}>5;0Rd zB?HaJOk+NteCD2HpFCc92lwYX;h@GyJksW@2guj{Iz-J-}vb9p=fgDH0U(htiyD?9oeN_#(3g$e@?h=WO|-Z`#6 zTodS(@LWc_o5Ok-y6HvA#|jyL%eURrc4+%F>j@1&0>!9EZo^u_j;FkA8?NOh@6~q| zroi<*6-A5c5qSsovi_INgdP9`&hJ)$0}Hae%9LJy-qlo*+o{c9HA5&2%Lf{FZq_`3 z(bFJ^DT;`fJzoTp*Ij_4qC-2B6W_IX5iI2D4t~qzyrnjckdG6kP%z$VR zJY*LQdq72Ah@$B0IDQRQbByjye0X3-ZDf;lC&d2TgF_2b-#i`EY0dP~GrDy_+tI(3 zL3^&{n7k3YXk7smy5cw)G6A?1qJ6n#IT%sjO|lN2l7d#R_O~rCpC{b?duB#CCN4QK z;T_*;G2zEv*xY)E_d7Oo-1ZE-<%Wrwy6N}9nS4hv_!4f7Y-1;0{vT)W9OT*a<#|_i z*|u%lwr$(Cx@_C7>avY4d_HB{w(aiTo|)gq%zmHQeKs~C|GDShj7Xdtk*|}P?-LzY z*nCj>^@|PhfQ2vc2Eh6?6m4`6LXfz5PsbO?00O#t;jA6)6WZ^s9}OpOqwMP+U9?fL z;^eqh7q6cNJV!cp-i%8|RuX*Z%E z_!Bq!Ik^h|!Y&3NDww`C^CVVC+V-Vvq>8+popUeFjvGzkQ*gEWrfkGoCv50IjIVqN zUQatK%S)TEFIIPk+~`BL9V0B_MqFDf7uKDo-P1rPO?GnN=}#q9lIgKZNDz=MhZo%H5Wx+KQ>oqR4&-dO)# z*n9MXnS|=gpFmQAN&@U#`LHN#tt`(k6ON*nHd=wwg9$ZuHs5yoV(;OQWaj+xE={Cj zixT9}QI0dX+aLF=1Km*@6+d%iJKm+812xH>mQ>B%m*Y;AI~Js5#2#+R<(V8BnK0=} zZ|k;@XiY9+m!AlV6b-dXDy5=bQj{V)`B9)f?GnmSTivf!zk2;#>x8V!?5y<2Q6A|O zK>J;R+4Iw8ZdmmLl2|!+o>)7<%Z#-mr361c_Py3lhNQIh5gXtTtj(7#`3ju(U*EuD zsdT>P6Jiyh0sZ6Dn@a%Ur+2+@OnVYHzw$k+s>7=3DXtRT z(ef(pQ4K4OM%v@Yha2`JHll<(bH9}ZcQN)(#F#SnCCEB0Vcj^wODqc>N+j5EHZ)C( zZ%C9YL^oq4XE}Z#_1cdL8N6ZrRuHt0ZGvto>Y;CMcKTC1<01hlp?x2e-qhMG+8m3Y*%-X@6XqN$c_*WlVTtJXI+=-q@F<`)xfzTp_;p@_CQd#mr81cyH81p!Rj)x@0 z&6l+7$~gJ+?9^6vMoxwf%tE6d_x|PycwxpulJf&N@w7j73BDi*0~*(1uTgb?Zc}^{J*XF`wy*DpM}v5gSf9Ojp@e zim}3V8&X-W9Ip*^)mvB2qF|+dexx!3l&dxi(Ol_;f;5Xo&M7!)%h6blTJG3Sgi z%S=k)>6|ETIxp9X8CcP??zmO)^TwE+%w=2ZE>F%X9zsKA3W42tx@Z)dGdwFFNA6?e zp-KE;`6Ui~+`Nf#Eh)Ur@SV1)K5^VAN8EUK!Fjp8_qcT~>s;6<>@{hzKsrP`+44N6 zRS8TY#KvRTizp_$A%o;4J6RnS!HTOo?q(Jw)maHN4a|(m5Kkiz+Jmkg$C+b;D@o4> ze!&EdHW3QgS*9_|p%uWlV`Gw+>ZosT^Tp_vd>JSFKr7(>u~3>7tr6qSsAEC@0lD^-IPDka066>T0fnDYatV!-f**zKCz;fh>mD7T!y$(OYqqe2Sje zB`xJRNZuqO#yIaFe1)nl#C1+v6CCo!>3ntKuEIA}-QpxT zh*EBb0$!9c+g}ehNY-|^@HYYS?NZU#P4xD+qfimXJ&xR*UX+^>rhdF|n@}!)XPpQ) z!9kUBlMe8ri`kBJ7(s6z67+?as7bYc@1`zZ)qjT{gUD4V=|W|Y*pWAo)`I&z|6$ZT z)RTWvT5(KO5Pt#uQNV3(ek(T7=0oCSvlEHyf_;I$d9t*aPSMQv6h_|erL*$YY=jbN z)C)fI>2N`T&?}nrh*2RYy9x=1ttG{BLe<`qYI(p# z>6pF^W8HEq!dWBP;eKJOWUGg!AboEMDz5Y=#nUOv$XmnGVZCLRnD&9o?4loGVvpo) zx^G6RvgoY3#=SSnTcer2%wbQ-1& zM}rEg7>>!+F8VoeXn+3$pX% zbqk211P=Eu6H`Q^RA=zJiVX`?E@{&{}GEl zNmw3!{ZMqC9v&!j9uA3tr=a=oD~zzCC1#;iz4CB zvxB+a3b@T!%vcEi+z|p{Z?Yf@ZAL(|fWyPAhVMdSx_hD#v$X1%HTFDGX0CPb6V{hF z3|8*&-$PTqkj?xIsPFA82(Acx5{=mC>O4(u@aqm(U6j4Mk58$G7OTRB%@iS4A3Zgp zj@rDDecp?UaP>bMlU5?V{u--C6Nc0H(_=O{LJLB{VzSCt)l$i(QVgk z=B_0U4Q_?hPhx-qMM$ebmTK1v83b^8QKy%;p`^D~w|?u<(#_!{5s+D6mzpg@KqzCV zgh@(zlFx0C+9Ggz58i2QT6*>OAVzdPmE!bT?aG17zvVtMGn zhiRILaOjMN#I@-HCpbD>_x0h!htQ#M;JKv|&36w`5Re?nw0>{lA8uuIyw6B@bFy#8 z@1Gy(hwamWvD-TA_#CRWT`~h z_LrYd4qfO98V_XX3Q)g)H`8IS1_YP{krtDKQ*zP?{5IFVT*_JTuyp|v>0oGq$&wb2 zK#Xv9v~t!tUg|E--`JgB+20~t+o~P*?bL~Iu#VPHwrQ(ATB>h8LnuVAW|uOeCXxNB zv*kZn1-FeDDsPvrWnCz=n4Bt3i8iON7->Nmv#ip_kBMld_@>pRAj1gX5*Ys-SP6*{ z%;He|qnQ=wT=T%-_YHF$_vX@fq23W9r2C#G>-qMuv!u#QcWZmML>I<(?U6@TE;J?1 z*N_e?tTnM2Y+mf1+&;cY4DE!~Ul??hFhDeO5*{3yV@-zG3LEQ_fNZGa1YX=pe|yR3 z|BkvSYRhf{R02OaU0+%zQj=vLm!-5JXLObUjpIMdXmkbL(M?bDW_%)s%on?mj)y43 zU3TB^awOQvT@p2M(xXsK_>|KQJsC$XMQRM7AWIk;tsX#{}<$5{C4$_a)recp?SeHS7>-sq1~6SCx_TMt+mT=KD#Ex%)Q2eqo3?H`s6_mNuOWCtM$#&ZhS)Iy z&JuXz{%kzRMC2caRXWrm4730?5WFD-PBQ&G+<)cg9~~z0ej`Jo!nslV=24!<8=daD zvy@^E;7xI#Mxp3CA3*d^V+b-d?j0vt0Ad>N{*V;aZ9#?pJPeeq4)Ci33mPgUc!M+C zTaR^@i*H-C8UhF}8z5^mMTF2U zZmRn;*&3~TW>>p1#!=;5-PArDSE=eZL1o=rB-kIo&#?%*1AcLzA|!2l^UdE1sS4^1 zmS>Qz6WSsMQ3<|~r`iV?{n2(18HVOwBUYcZ$E9D$W$GzjK9Yh=(N66H?2k$UmlvbC zt+-3=s+IHmN*&bkSPK@)lI$Ba!HBPSGL>nbEZdUK5!D2UDX!{D+}TCsF3)54m%qL( zCZeAhmkwlUh-J|1og*$Ngt{@SSgig^$Fh(i#Lt}<6s<46U?(%oi}tbbC07b+6l6O& zK^dagPs}cMD>J1uh{RbwCe$T(M!iV{rdccRHH&_enAp$iZB>YN2K$4#p)4;$D8K(z zQ!Cu&X@2U)%9uV%1H_Qte!`=ovN$~&8LTf-RSVGjy07rwQgVm^8q6LCHT&tXkTIah z?rZi+o_ONGNunr1@UfeJ!? z!~R6Yf%jBf5pcm|?N8NrUG&WAJ7dfJZJroW?4Y=I@DbYnb+{Q%a~5R6rz=?#vB;E* zKAybMNJ?MwP+Wbk6A5z*9?ubIeI>=!1eCxa=|EpQzn z;3kvvT8kixAIu?UR!QX?H8BF;*0VaJTfL3D#|o;MTHQoe70#%_N(WD7P^^AqeC zA(Hr7PE6x0)~ZFZia$WsuCe{Qt4{yJd&tD)LS-|+xvXR`6%DQ%Ybe20CHq)HVj~vz zP`SF15YIZXslIq@AG*p?40j!4R%Hy6oiJR1I8-2~8~`7O;@Bx3plPpBd0*3%d>1CT z8RnIIVwt07eZ0+E`4hWxJI+neg^_qBoHB148hsxg^RSlv(4K4t1JJb)rY4d|W95|N z)-tG*x{v?;kXkZ(-gB7dTNZJMPAiAaMh?4!f{0c}691wkTvyJpP6n_mUVmG${w2E; zcW4D)Yc~~9VFzxJ-b_OLm8x2=6qE05-jd2$K*tSCr)3e4gT147)O-l!9?f#uQOxr~ zKFz1hgRz$2PW@}jak(Lx=>zx_!klv2GYze4#kEYtJ%S$iCvhufIlmkRNO12O#Vy*5 zyo0+4%H%0!I|qUgvG1dQ^-N29U&gcUm9YAZ4`X*UTys~iE{?MQhNk2=uEn#WEF&(zN{4UJ)%~K`b00T?`>6KePZ~livf--{{lv%SrKv-g8Tsi7Z}^UU zLtW=|B;yP>&S^;INQnBDsO?jy2kzaR=2O>SCe~$FIeg!J)^Xj1+*r#Uptc18INfQP zG?X)@Dcq4&2N+ASS}a<<5x@hFH$c!F%At;p1cl&5>;4w=yipPUIrc?RwB)#EI|Ss3UG)erauXDaa!}ke&OWrw;X+Y4Y1Ib z|3x`6k) z{)mHvm_u|lc~zv_J}7@$*2PHrV>XW9*Pnj}lDPi>5~$^~JSVzAm{hZ7B|JZe+GAfG ztByG4oiTlCwQ<({ms(gNvLX5Nl;!a5+JE24aYI29hW1i*?ZeDw*+MSK7!{|K%P6od z&>MPUqRiowhT1*n9pph0colfsCg?`ckI=~Kh8M9p=dnaaEMKjr;=e65@XsYr$;3-QKQh=O9ljL@36Xa34c z%1jj@KRQ;=YGiZGPM_3Aehu{=K-OMzSDxD&cx zwLCsgcTG(}p`a#H@Lse9dt>#zSeG&CRB1s;fozmvk{KsW!Qk{nSEP+zv1q;3-uV6As zTY(a1_Zst532jPgyf&mHjyo^xw6y(AS%OLkA z*HD1wP;D*_GXk+gn{MR;Ve;w?Q1}5luKOg{Zp4ntS1PnZAQiB+SCDf zLD2BhojhCaKR&{edLugIthkhybqVfefXdLuGaHUZ9;`9==!6{+T{gJqgzVCuRPO%^ z$58cL6_fEQ?vhc6@+2S=*MQi?Co3MN`*`tn7SSZ8-(4X|h=||S_PnWefkq_75b^6C zmjBk~Pz0|I^z#91!$t!igm(_&eZ;Y-$M!43@fSJN?A~_6KnFn~cW6*hZ^(c)#Guz5 z(;KCt%XQctiTF69`f=ihr_tG0`pd4&BZ9!2$!9K^0n&JG>j$~ta?93p$!vlp@-J-S zdSnTIIh5@Ah3S7)UBv}0zO*0A6IxZj0V(?_z500PoO_rEzB z{a^p3e;rfT@i9hU#`)8?E%P!)Ns=22o&+u`-5iX}I2a}@{S6YV7+j?Oq8Z27rKRVJ zq%6`wphoj@zPj$^?njgqL>PFK_jBVjwWhE3tmdVIot~av>~f%!rKgvtr)9>SRKL&X z&TGKWUB6quU4N&Cqe>}4$hj%awYxL~rOmrIG|jJxXfy8>7`VV|@L@N_+94Mx+}fvv?*Sm3e(xAiPQP~wNT=UB0VL{rL&Iutx#z_SYTrkoqIKDd;Cg?o zg`5)L8)HmoI-iN_!Jd=K!lA?kvxCj#1BkrCIHbOmC&l4Jb1O@>C zeKpvY&tar`x$Uo!kd~a`2TjiWE8?7es&tf+w(ei8%xh4PnPH@0JJ@0p6<|J5OAnBc z8fS~F9HsZp+~_JI)gpOdJCDFN6rp)z>xRqqo4$d~BP5RToPegNGXiTC@dl-fNyf3_ zIg|@599X|E5f=%6;}&e4>uvlZLNBGUQ-s=k$*-@D1sjSWc#Drl_%6LP2xrghhv@w* zA@sNnZ489gkI>)Rcw%1pBwZ?X;=gc92sckE9rCUF^~5Jp6d5|(5^@z6ijytN-cH?c zoaD3Zrsr^GM7K~d%%YWDz=8SWFDvSQI=g*SiD@aONASCGolh~r2vh;G2+8=C*vAMCuRI5mzCqe#o&89+{oByw!tjuESVM*Nr^;27y%<~6;bskgV zh-gbXL2K0z(tOCrS!7L%p zPT4Kf10Jokw6nEy+yy$iG-eX!2;S}C%Ch_KT%Bz)E97#Nt_?6pH#_E#jw)34Is)0h zDlhV-3|`fq6LRV;6-HdUpg1sYE~1`4Yp_cyEj@HlLuA|Z<34&#ngk^AdUy!YC>(?u)a))V4wch=@3vK{veQ%aL<$p>$7uh78u%! z>`Rkx7|H7df<-u_f|q+?>QTEhf~!9z)_NvIhP7yK-yO@*g!3iEhQ-#E1q9kNo;b6t zhJ#(XV-n7dc2CR$QBNiIZKB%Rm!Jt~kdD=q9lJB7_A**bc8=)yuO~9ICw@3iWHv?aKy8?%LT4;t zjzgS_yM>(qR#cPn3F0U_)O7@wS2VG=l**s1oV$wG7q=<*;|9&#N2leJkJ>sFnU=f9 z4r!epa*lC;2+_0(#}8wT)Wh%NTNY{>cq}y1Uc&F*a>Rt&8P%s!*LwA9D|ywC<`hzd zF|6I^;ByNUOrkg9HyXQkx>CV4b#O55gEaG+vi%&Tp{p4omA$s(sLA~FLKH}l<%c<~ ziM*xjqv|qMIq4tX=AYDMRYXs=$brH45yPg9Mj!Ofs1mXleFi_qXVPw09-Zher{k_n zS&=%IaB{rIva=O?6 zdma|Ox-#ns8A&?5)H$1Z`b^cfERtpOcVUf1dIu>DPHXm3l$wD#C^}l7Wzc~kI@EI+ z2^fLOMQ9C@r%(QmWjMUH?=EDaiQ`XYM5KoAAZ-;}Cln3&DnEF_oGDa(Vlh0(94Y9xO^K;kD5`(>*O@mwp_79fIw5%!OZWJE+B{kOd3lDb-MIcDS2ol zwk+dD+V>sG_f~dyXFPV4vTPbN_A*wS78P6T3Gh}^rHA&QJa%l(BUrI~vE1a@W02u7vxbNbK#m>-Xt%42W zf<3Yrg%C1@5O1XY zfp^?|SF*g=X_uHb?nIQC!^-b$QF79ShxRMOH2d6|7&CBTk0qcp<(>2hrw``#_e~8o zuG`-FB=lJg0y43Ctp@h+IycNKRmIZC!JL7WSAsJ zML3#JnAN)%h*tDTQS3@lzM>}Q-K8?h10c!Epj(hN6-e8Yqn@HhD~KQT){-CDrz##q zR*-M4ONT{^he-pX#nYtqlhVWTNEc+bD(pWoy2)jqq_s83>q$|y(4y_40UY87-G3{7 zC6gvk5FN|@PHGvsM(yL1U;V+piMuWNbVKaxh0@0ty>nChbaa%`FX@$&LOm%NV#_ya zLVAy!%q>cuU`at@Rp5>)#7d!35D#DzKfq4*PLSr8BTulRAgL^ONA=21!Oo2bT#6qc zklu49d#6hGrv7bI%Yw`mCxuFKJYZD(06h6EP1;|STyRoWRMFZN)ys;f7pNnx9c$8& zQ8K`bDY3%ZS%*>S>i3NSXMb;EKdxYS42Rg!A*D4_Mr zBzKWbdDep2-%7pb>|TX$k|lDXAt{iF+J=mZmX#;E7i0t21^^JkI+KyPaEK{wDFgtq zsZqJ;fCuygWJ-b&^ME;m)_9aOol@GlDTE`2KAW8ebZgK)n`-1bT7aBQPUbv26IYgH ziMpITTe__rylfkhoIWA5-UIHh^<8OwM^Z*EJZBknhmYLeRd|;e!GrCv&Pe227Ge1` zr;n)5DP+566eP3*6jA)YCUn=orfKBL3o=28C?&K5w!f`RQ6#z-VFU0605YNPEkyl+ zAS^0d7No5B10oc3jH-+q^}ohmod-yk?CQ%`kkm6}wNMAcN#Nx=*2OG$a9ej2&F?+2 zrO=%&(VfZ>hVS@eM*0NEvicJeJQtZQ`M(awuqU;X11pKb6^&mdvJ3 z#$dx)SDg&us->56E}A}6!oKMFI|&LCso2ctaM)p`OSFo4-xC~9E_~h1P1fxO^pD}t zPYsawz1;|q#D&p6)dDw)HF`gP}ZPhw%8VjF2m&8N6%3}h~hcii{!;d-b44T+!opHsqjnU z--^N~9#Wxy^J@eXD$f`Y6M;eFyBwIkb8BR|{@RV2piu}I#u06JxjaDN-E~Hla>A9k zWJ=k+vn?Z&>n79gNMR?N^r_(G&!8WV>G$LCmNy(2k ztMyX>{%6X}|8H(Ood1pr-8`I~om~H!qfVO4GSl=M2na7Y2ngT*shWtXo4c!t*?*I_ z?SF=)^40zooau15q=gXI6&KO&@-``l-id0mkt4^HwI7CKa`ckwp7yL<&zE?U5Uh!2 z8My=dQu+5g`d~aK z^%!6CY>}h(AjH~9N(N5!>Nl9xY{OX_?RBbdm&n#*j|_?J2_s0gRdjy1E_Vo^bpPH* z%yihd?rhjEMnp?=*B_2jtW;ZSiWr4g!@^o=svqJ+=U2H?A7q1=RWaADbYuBEHH`@* zvc!J&B~3a365!Ur8_#tF6hc|d!io{H9z`fD=@B@}MYR2qt`DBEb?v-w*pw}ByBK>Q z)$sJSc`x!5;kHNiHT_%AY4rw>jEPM%iW^`*Iraa*xml3ccMd95@dxIf?sIQpaH zDPv}YaDZ6q1!xMJ5ZNEdT1}CVE@-#LXnbcRD|W4K#WM-ru;Ov7l_t zimJhu@u{tfj)Z|#WXj?EumBi&6vjn9NxN>>F7{t9NR1EGcXl$>H#|of=fV?q+ zfbjgkx$b{BZl8{yvHEiMpMccyEuXC@IkJJ zMn~@rxI3>ykwJ@h!B{@c*+V}k@2n91><>r2DKSwV{4{^TA`%=jvUt-T4w|g`3A6WS zZ0FC!C6ysQ=^buzB0jt<;>7$I&8$9?>==b#4wl;3H3^ar$AgcGCF5mt3RMdX>(Qh# z@vyk0LbzkjQR%q)QMqXj>99JI@A&Pp*r*M=Lg_g!0TVJ?FL$=(gz}K;B0Y}ffoYP*jeF_q<}dXsfK{GV9WqWZl$-KYQj$Q?+&fcY5c;Ov2jI z)Lw0Ixb0SHOeN1n8p2+g$_djp_zQnwMTVDoo3~iWLYGC<GftUtTp3Jag-% zA2OOVDVZ%geeMZG4wwQ3bS<+JH}E_=qz!UF*TON!n#7EG`1lMv_kvu_#_+1?Snj%| zGyix^n^xUYIB4Rt>G>bY)=}W8GGsE&`Ire2YI4v##~3xxGZEU6B4bW4Qt>MVH=blo ztZRh(=|dUX)Yv*0@?po@y6zR65jdlNEhROMYErd+fd;iy7`HOZ6n+Qy+N2s(q`@WJE6$XA<1uah`DPk# zn?^>|IM3y_a@2imEFw?wY*!Uc?-0H$SqgIz>{(as*j#($m27f9tgs7gIRi8Lr9}sE zwOFYb0KO+wq{G?(#<~l0{)_R#SyVVQur#=n7sD_lNIk_KKitffb0dsHibPZmFh(lk zn-0M|MPs6xp%(TyqM)Z!N`;ZI)E1Un)#?C+wN_Iy0Rk4&Vtq^RY zy>+dTPT_u{ZQV3<`A`#e=`4Z=xSGfi0A+NIxo>dHGSqFnc3z=NH<Qy8TOnLcPYXLgn}?;(kv#4PEi0oK144sn=qL;p zJ_O#g{=m?+01a6vf=;G3QpIazDiOcrSgc!{TzM6$BQ=o#d4y#L3+qM}YrFv_&4f@p z1xJfYY9>m8TCF7q)&9l(T>$q;!pN(Bm2rujZFmOs3upCHDP0BLLeqjz?HWEEKNWR% zdnwAnXv{V<`embp}p?~dJLP5EL!737Du1l?T0?M8u%-s~_ z*ajOx1I>1}!RsINRkP<9088?)y_Ks&)dB-VL#`fp{K`XaEu%*K&ei;bi4Cr#ZT|s# z{#7%3HA#yM$rO*i3ekc_`S2>Q=jWd;%*ZwwGfyg4yxivbD8PHO<-;1bC2!T76xr|xY0UGmse*inY_mkGsc6VmL3H$sD3D%%;;bF{c~4R^dG z0WZ!H%~-elhO|jM=Xq;3DX)jzdk(j#6fdw*VU*8XtCHKGY>{HE0%bCZeCM)Qj^iSI zSntg@Kl#C(U*s};Nt58uccL?QoB+krNskYHgFzl^?~;Xku`lULx^q|pro-O>OM28sp^(D}w`@I`oxCV8L9IYCqb{^dc7R8t6koo<>To+Fg7gI@t)uw1t0KQz$ zIMnJz1@{)kjz)O*8hE3Wea>QUzU|`0%;RUpZn?@H3s0l~iAq149>v%BU%UYt?jPUb zjZ(LvEWD#U&z?M7k|RAnAZx-+Th%HBeZ?!K1`qfp6Wyk~u=58CpzU5^e8bda`Ax{< z0p$^jy8u020h!$e8!UnHc}Gsy3?zsvay+#v@1pwpj*gCYFOj-|sX{(4$9&fXUIMLP zjkngjdx!jfv0uE`D3Y%W1I%%rjH~B38&tl8bLTq2UyK5ki-Fk!Oqjnhe(O|Xi4S4X zl+4QwH^Nt)u|a{A@Sw7EhoHP{q|LWdm;8YVOdwp5`UIa zVJA1p9E&N^+wB524D<)vCNSbgf7VFwGq>_-0qGiEp+XRK@sW5@A_ynb;!);=Os%W7F!i@PhKu#ZsV9{)-id!D z=aQwlHBNRrXyUfBM79%)BTx+&u%lOE6#+;CODI>%*V(xrYGNA<)LS>Ys~Q9rbTfjj z9DpeL_f`p@q?!$5s&}ltBo6jX-}rPw{YUmqEd?qq#8j#|apu!h+K+nIg+GzpHf&zH z(T2w@w)fRbQDVT?t7)O+XEghO)E6xmv}DQZ#^GcQmM0xrvFf=G?6-R%omy_57s)93_e_OZ4xs|clG$#$ONT7Pr8J=r`b)Y$TdN#=0>sedfYSEK^f9q5 zGU??StM)~p za6Gd9>;NzCXCn^ein}rQzMtO6m&Xa`I;Ah00~;y_iFq5x;vy6pb%J}7`I@TR z0`rZbLe!rr%`7w~rqbAZL94d?NEVVFEeCYz?bop@X_t&&N&2f?W3e6Q zVl10(h3I8h%zZ2*&(V&RJukb=bt81>wchMuR7lumWhB0~-wXpdIKZgMuLjG$vnlW- z+07$%dV8^w6uq~BqNChMq)x@a%$ms#T+d#QF3ASf?`j-d9e;um{yYVF_)`371v1Lh zs0&i@Ov1FM!S>TDXt!7(@RZTA3`Qg@JDQoZ#wr2T3FX1tKWn-TE%3>NlW-8nJFS># z6xJWD=AOLJ4>o^oy0SnNRjCCpP_L>qRlo+K@Qd{(EK-SKz`!1ztELL#b&qaN++0sb z&%wf>Exj!rVrwSv$PDe~Fgw+!6Z^HL+buhF*&D>j42<8pCviZ?eE8P*t$|KVpmymO z!eZ;uKAWQ<(()DXsaO|tnrGc95vlX59&`%%R{>*7cEtqJ&@8dWr*gBTrd4#d=H?G1Ugmev#gC@B3HBc`i#Vauz3yn5iJphI93Z)J+RZHEG!04?YNZ-gU;Q&pZ zLxYFPZt-N~*iMX$JUtOE25}*!%MRlZJM9R5PKa(!jL*@iZ%zcWf>f9#i6qsYD=jcx zJwopXeuoOjO$jdlfE8iIy8u~0roU|Dr4CwKlpYET(srKq%@K9>;PE4mA|vB`YTbVR z#HY+OxgYP6d}~3er7CoOwY0#jRXKS7K=e5KwE%4j2+LU&C{<#xaJ|qg2&FWO&Q{`L zyBM82q-#yr-Vx#+8_(E}UrW$f93qu1%=t5tFdTF!8Clj2lr{F0HRyJT9Bc#|!1H|y z%;|9wKD6D#Z02`XL~Z$Yme#BVt?4fYoPl#h^EblGO_ANlb@2dBl|qFjtMFXDwjX$#c_B>7UHOH&UPi1A!03 z)n_EYMHx!V+)Ca5D0CKS#@{m2v@|4r* z^|Py1?DN@8;{vJl10n;jS7BE_1^k)@XY(J!!8*sH`^AJ%?Xh-aeSILO8J&^UQ8j=93kaU$jxe{5 z{2)Q`{OM%Ois6h?XH)i6Wt<3nP3yc(K7eT2WrGXQLiw-$Ux5sJCez|y1qPr73Qxc6 zV}%xA5k(Qjb*YqQVDguyZ@1A?E0=M%f>jOuGQ3{hM!Zqf&Ml@Yz^-7Rnv(hxL4F}K zJi&IKQ=JuSHH90FDmoen;>=&wGL=GK;qr;iorB%FXLo z>!@6K-@4GB72Ftt*c0rXmigtd0u*X~*gj~pnLW)ue&=sd<(aKjpJD5=;=Vo^0o*Ia z4b%Lw)ed*(Tuc_tN%614?TMNyYjQ(*^{fxoCWUKB<9aC5Gp=Zas-|3Xc=-uhhm^Xk zo2{FAqO?LujpRBm5w76SAQcG(n9!X3qoNEX52qhCq#F+67;hU{U!p zD}jxGZSI76kamomEo8e6tBtC>x5 zVg{S02fX46HS6HQwQ|Cb#saU3@pjKZ&M5WW;9(Z=oGfqn1NuofK1`V}JV@Zn?r0bC zx5ncw|L<@L&-|6^fgHKeCOMl48&Ayh_$+p-6@A{gr>%?PSCambZdWYBp-hL^LU5z* zSK_YS6~}DtwR@Z!X+^2hQo>0Bgta~EgYN=(0ts#|>7@{>+`5tGs|4-!o@?D3CYQF6 zbu|Q6Dqbyt_-}0`FL?dmK}YWmne31t9DB#_f5ozW`FCWAZqD5OA^2ZoQWeDy&b;41 zK+M2FK)C;JVp9K+s>|KNT+77X?mv(CrKisRTP$_-=VFGVj*2ZrP)R-P0%@~wr--yP z7!1r%v2JL`xu<={%?x`>3pk_Umlyw;1ggT*4UvU^kA0C1OR|Ee)ycG9q0cR!Q_!FH z-)IA{h8vCdfT2ayg7q7r?UhlY(^>-lLJI7d=9MWM5B<{K1O{Ya{$z_FOMO=DBINF5cd9I=d*Y zE0ZlsHQ9t&48HGIR1at-!E4bnnqjlh&K+M$u6F9=$B*G`3eLd28{Fb972m@YH_m8t zF7;Z0rb8-?*{{;D@-V3l2RSC?WG23bu=DEna4fW}0T0O2gMonMsJAY9n@J!R&J;vdS<%Yy!{#s^_=^p_2Nv&`y0%qp`gi@KUXI-?(r72F2T@Kq%7GD_) z-R+`mIWoCgxJqLqo0MVlfY_>g=;I|Gj{yaF5}SRSt(g$4mOcI7kIF~m!sa*pDddx+ zt4T_)S43k3nh%xKU$~_H_{3|cVScC4NXR3IbU-!j;V`Arum{Xz=b*ADC+dLr#05C- zB;V;h6JEig!=;P4S505&U$W8#3;#$JM;oMAIPupX10en%{gL%wvHi45rA1}zk-`?e z4jl{P2_Ox0dMs9inlR}4$eM9yY%qjb5|V+IPO)8P{UPbD!jceR)>Jf#9Q@^*Xb+Q_3F>rl#w~mHuqEN;hwgLM0SrN%R7zpxk_ioPb;tJ*U^-hRa^kW zEV5VNLxYxUbz*XsyhR&XLj=6MgtJcK%HZ5=rt5bRb6$cwm7v8fxV53z7%`GP~SB=J&_ct7ZT8NIj(Z@%ky8@7wm*GN?3P*Fv$M z3xt+T4>YNB3fK-&Xukh_P{?7D(F|FqeixFnKwW9%+_re|oZ6_F_oYt1Sm1l2^S%{k zvGkeafrO|M8WRevf<4*O$~~FGoK)_02;Md}0QsDGD2q7W7zby8-f)lN98z|Ta=9sX zwG7HTw4)4h0{pAY`G`6Ce{gmV%(+0zn$C`G+qP}nwr$(CZEMHc;TPMs?PSNvoKyGS zsk&$8R-KtuUA6we+f{F`)!onUGa~(>3EysvRZ4h{Ez?0W9Q%^}r*Iz24iC6f(ZqJF zRi}`pF#hQMcRdQcUrPNl0rOC@Vm@aK>k*o)um3V|hij)wFbn|%M2!jrB>4Z6A98NC zu2%mfhW_Umo`#R3ss-AQ-}v;-m9tbk5h$Q0wZ35-oE<7iFgP(06_UJ2P8s+Y4ac7h zQ=?{&9v_TI^`+u;bsd5_ghB-ZF&n$01kXN0Z!`K8T@lgTSPaV8}p3(c<+a13| zTD+#inXSj38Lr)1-rifDkC}kqx*&70?Y@u)Kq(>m#3lSohlvOg_x|KBA9ufSm5Lq> zW2HpJQguScl?X_=o#WGAZ2 zthN*@o?K~)lyb9(KO@R*WfE6<U7%DZM`&+fmv&<-1Usu(qYIRtRqkA}yov<0r@NMfpc=qi-K zYHzSRU+6!j`RAOdE!9VQ2RKXLF2 zB;$FHKc{$d)K!R$h_Ize$MncGmZ`HNqc#IWwtLon?ndW81}@ep1h79_rq(hmBk`SQ zcd%=Msxpbe;8xw_*YDF~bLEf6$7ib#oh7RP$HY{b&T=z{yh{ab2xGYCKy6B{B}<8d zqN8b%$P}9c6rI$8fE$sK9lyWr(i11-*_f=*E$PI-cxaHBl&b_?WKgWS+C#6#DeRn9 z-@~U^#SArK6Q-kcEZ6&svE5A)!o_P>=K>L5*lRpB2T5LA!e{rC&=Ra(Y56G>T`DDU zS$**h=I%K23pw$!W5fqB?#bW`Ml@7&7aj32SZx93a0*S|6?ZM+7I(GLr>eecgR6IL zaJ&6rXtOpQk@#@CrVn)F42e^ZM~HKCQlPbf@SEy$icJ0_c+s_a>~#Aanfv;8E%E<(bvPC9x^+Iz=L ziB`~q2FVQRz@N!qn|;O~yZ^BEp>`TST91d$C(CB~@N{3wUDHj?(*dWoojWcLqtLzsd#QwPpHeFZ_xRqvSv03P_m8dT1r?<* z@i5Q-rT`%&NPPGu!M`^FvGZk^fkzypx)?n|nKKUMV#sN1OL>3Gx(>a5%@V&*oAD>4 z@gC};2FWE^8u`M@^+irEKxWpJA6#p-&6(Pco~Xa%xx|Yuhg0r`hDz=va*J*f5>T@_ z@~Zl4X}VjAO3T1Br8aVq+w?N&utjB0{k4)CkHZ$?n17sXv9%w^4%T(`=XegWGDHk@ z`e9zTQKxpjDYBjMKx{x*Vtk@5(9CB1cF0mFh{Pbr_l9j=pn~vAr8s)}_S8AV8+)ST zy%5_TB(80)GFIC_c3idyCA#(3?o0H!;>%u5$+A7y;=0CX;a^`|-<#WEVaJP=Ga_1GX=jg` zl58qyYBI~J6m0P=_(db9@SONsXY1@ORY3+6K-4UiWO6a zT7M2UlqzIRI-fd{2cm&*;SG`IXMim?p1$=%W{f zbNl79RV>q~6*z)XS^!yVXZ;3Vd^kC3iyeo&)WR8CU=><;6MHiV1wgkMxcm9>t5+y#plp-}%Dc5Wu`^oV{ywdtCL7fel2Q za|bP`KvpAzaENzQ5bxNY>Piw`tVknX* zbVPupeih|H79OzLFA}&&Tfl*f&*O5)ofiA9#qmNggBr~_lnIE@oki&KP_~0F$!RB& z-<;$S7ku4EYd2}Eq>mJ|v!C721@$%))%pRk=Wlfeeb{-J?t;+0eG?f@_+b`CXoQW{ zjF)Z%mN}P%7^b#Gt$|5wIZ13e@HfaOLLdKE=Ip^tSnJ()g!_CyB2S ztCj~sjku4i+N~1lS(8TC5;@Ki4W~gQ6o$T39wM!PqtJ#v2#5wm(j(*kVp`@fn&5>W76s$S*SANVcgKLPZ`| zjAkZqZOWTFoxwNM-)h7{Ca*L<|FSyb;U@EU;Xf?2H`u?~A@i>mLDkvH?mu0$YQR5P z;(Q5iHXPCYf`%^9lo#L=KthRfTe{)2^5$1VwBO5d+%S4EdXpIUF=LWLmaL!G5zIR; zny{j*PIk@;vpz4QogTN>qq7XVzi0^w!b4p_A2kz`5}gEsDbqW&)ESYBrXjXW#0EG= z)xc1238*8TbX5>fGn10c5+{b^sD+l{)vL9JZh@#@}9l z=yzS;-tyFE%&cza*Kl;hjoO{(TU>Ro)bS1Gop>?B4rG*7$~LE4PCCoCr%Ju)G3j{Vwl`MvQdZB=Q*3+8?s^2El?t>L*?Zi=8(~~i zl{ZnZdswXCjs62Go=TN?gd^Q%%3wXPWQg2_8e&iS=^iVJN%(ynjDPF{hpD#KQ zaYRiQWRSEGC-gJQwV%J}7Bnbf2($ii%XpUbhiZTHD`TEQ{X>Fq+E@Gz6dB=+2g5O? z*83vdY76;;)v_t&z<@%KfpB(;JRXVrQ=%i5bTvNpE-NTltEoboUye0LLYe55NSEc}#x z4(895C=q*DfKe9j%@B&cDJD*V>j71e0?&PH|1Q~~7B12i*ML96+M|7UpupIj1eU(+ zh|Fus=W8=8!{iehhsp1WyKLCsF%2BKo{M4aTXzQxO|Kg3UmW{)9vt66?Pi`5?7cJ_ z-4uf#_P&7#d3O{>=-=n!=={!yCZCg00e=`bqa|`*r=n)_UI9@IP=u7n z1BDFCJcZ&Vy_7^&{xX7(8Xqgx^1fmX8WNw=pf6V{7V5LL^|=~tfsB>Js8+PPN(9#Q z^h>KUP%}+$Ff|$J8Ys-v>XkLi0Q6}BO4?OlBsCZ@PZ8y`KBh`*IwS(3S>wr6&+?+e z6Bz5V#Zad;jM^6n9H?`2p4Wi9Amna!-A5ne8gO82f@DE9P>k6X);G2lItD(U0ge;2oa<@M|sMHT5Gi?1ynob5+S|$QuF)RqNmjSaf=mkE&V+6hI!v- znWcVd15%C?jrm*fYKXfSR^jb`=Dg}J>L#Bg_>ms<3I!kvnbCM}qVVr|X3)%%e| zbIY`~TCuOoHB{9Zr{NSunbH{x+D`6rT%t)@zVW5!>hg=o0S3RUw0pcRS7GPoHt{%j zO#wdp%UVUsJ(UoEOSHh*YB>_Q&p~ksfM8kL=QJ?8dpH-gS>&14SP+cIS4hUCjzPI@ z1>6@Iw}_jqK{M{v%$}ZGbrHK7OWD0{eD)pvW!=ITXmg`AG)T|Q!eu3bTRz{b1-Wh? zUTnmb=#mKw-JMMyf#<`RnZz8z=YiHQ5AptfcPWzLV$nEgd=kG1uM&J&@RHkLDeO#+5-_PC@y9>m#G?qmJXYe3D7{h3rr zE>z4ib$6sS+`UM!OhX4zRKJ59Rcoo4=IZ=W0;mD>DF+XjIB{};F5k!_-V zX3lw}q@Se8h@!hWV>9HQ{EbL)gF8FYk>#u*@U2_>OE}r)?px7sjHJ295VXCOW}(%_ zP1ZOre_1ddKk%2-h^J4$HbLo(2gF?Y^vIM+O-g`tSrXUXF^lj$f1bhb$0O$&QJGly z{czcY^m+ceQ)EFjiS_iy_?xpnCDi79o^7ey(an~tY`1f2M)F4Xu-Fsgafq#q-te!y zN7_!u>1$b)=}Z4_!T6#*SXy<(2x>4FrFz3CS(^sgfh^7HLVf?rO0@>$UtlzQ8hauk z!Hg?3nt{?_7USv7PVvDmPVg_+-xwPE@2$bd0P>m$OpUon@ZNd%8U*O;IPcoBN+swbyVs8XXtgOo)lc@`sBEZ$;N84jzna%t;ify z-8dUm-Dm=;qakl$c?$%6#A@p*8)}%>Y^}7WR=3`U69h0Q67!k?L&-_4L5XQ7HrAs% zws<3X*>lEDR9)f`SmIJe*b(K;v71YPdP_j+87CMZ90=6um_ z|0CVq-_VCL#}~=oPtUS_2&rrlt?Dx>eQ!%iI}Xnc2ii%SImRPe{TQVsGF1DX3Jw=` z&?@w*mlkg=Z2SbHR?M?BzBPV9O%u?)WF8vTmtv!LOfF5U5l2dFYbNvR>xdx6)an=2 z4GY`#U%6qe;BA_4EsQLu)pZr5`Br} z)kaX3 zoqnk0Cg87a2}GFWaG-``Z0W1inC(XV0bAsl3MtVzItD{7^o{S{tx%n4=Z;ZOogn9l zn@RF6>Akb$)8Y}Q7mRY);qaXb=a+6Lz1}F!g9}C_P@PI=j$u%pt>+EvpR;M1M(mf^ zBh>j4o=(`flAxB+9t@}qtwh5%4kFctAf}jSe1SqTJuMhkc9N%3BMUv4Ti_WSMR4+1 z$!23u@UDE3wd}Cxf?M3oEpSr$Iym88qpbt`)4K`#p>dKMVOMpM2j@idMS37)|jRYl7IhsT(x1Lze?Z#@tQG7*1`)uC@f}Wb96=S?+ z3?sHfRrf>Wd~9wTYtxrWz3L(phP)|#6)Ab`(n_iREJE#~krcdzOYMi_XBc@CS_RB8$#-W=-ScXf6ZM7y;qMh1VGqwooQ_KTC~pYa zEGJ?Y-RHe)>{ZN}t1)CBJkIh{DR<(1|L({+E`Y-p=e)({?3L*#3bs2v?L@t~V#rs} zY0B%&%X)~E_&D)zN5ok1&{u4C1f{KuzZ^nwM^>CE;TDbFA@Rk}oK7t=N6D9ESkdyf89lY^euafRxU)0pFNh3k>QIpga} z*{P^|BC;zd3Td8aj1n$xqm0bD1VzRU#4YB;GK^7{P9pVNk>?lVz}G zXR`dYIhr;XpW;3u%YsdB{!NAZgthg=1wMx{R>;7V+6#bu$2K{`(Zd@ybf7e9pFGY! z#p-|+U{|9wi_aycwMPhtWw>eaFHYQ0c4f~RNsr$$y>hNU_Fe5q>sT;V9a9XITITlG z!C<#?+TfIB4>=+-6w2L5u)HP#d-)<%bbpM#-dci1rIPOQET-LRt`ieq=!xUP?M=?2YXoyYSs!w8`WmbN*vqE0Y z8Ms*wi+a1xT#8qLzBzt#wBq!B0S$Ne{cGnmfz4hmT3-ikVk>jtyC3xi2!Tu92hn?_ z@;5KCcgAq*tQxNIX>Kq&h}-J@gYw7YDf$(C3tQ$2l%?^}X2YBKR`M#xB+3uRVB-j~ z{SaP8T&l+cbq;GgY8rj?JVKR!xC-qvh&NV7qJd zSigBpsj$?JRB%L;55){K5Ses5=07?g3BD{!C?>Jz2>&QCZfnbVS>v*8Z}=?CZ@5x; zJOVyH-JuIZCA4S_nL=RGnM3WRx@r&FNIgtDXa=LBeW+c-;d;Ji;I54Zv(I#4pOgv` zCb<&;Qm7Yf^dst(9=RzE10V1r2Msfc{?xJWUa7tM~6}L>-=hM7u}HHTmf@u*o!i zMCeKQoclU>(DppSJ!2W^M7!m7KKzdF!u?Q@9gW6n;@?G)Zg3feR%`v`;Sp=bnq6yZ zAw&swlZpUxk*p1)p=(C}_Cd(v@z9vLjy-38=?|fgwTuZ8 zNkNx-gY*1n{lyPbK9da!DW_i)^+#C6T+OA`imRyPP}EG`k)Yr7MtRN83_JtbCcIMb zGauloJ%zY}aNo*|SKB+Jo${*DDQEYwhd;44xI~s&Qc2wsN8q+fYZFn%ByPyZvNY-C zv~4JP4L-sCyZGjo=$)4TAwFI3f3wd1zmq7{>{O7IQ2pzPX=uu=^>86jmVe#1 z4GVhU1h*#Ki}DdSBP~SJ+rXbj!nR(G#A^DW5#Z{go0p^OHE^ zw|bUzrYe(UCg9Gey>%BNbtiMYIO+ zwd2dtlB$5N|AHPgh57JhPcwpSH)?Hu=g!+%_fDIjz&fGVX;($CKdEWz#n587u7OUI zd}^Xy;1!Xa=vnMg9v@?ix=W79xbUpCA#3V7@NAxXGLl{4>a1D*0 z_kvY;C7Ct=rXN|yDPh=SHzD+ouD@PK@l22>vYibdk)M;R{#_qk`gcj~XTFncfP1?^ ze6Q>tE|?NY3(M&$xdggtZky5Kq9`})+_IhVB3!AI(Ed*Z^#S}yl*7TN=FE=XMviL& z!@S4rGH{1@Q$dUV1pa&1c>ziM@bP}Ze@~Q_u(PQCej}#k%2nE;$W7{Bc`&_n5xaUw)W^4aZMB5Zf+(0(kRxsomSpKI)@ng2BnodXq6c z;$_Baq(j)7+7k|%{QR zk|4BiaQiyjIaPP~8f75&<(JD62O_N6D+;|gJ56)_Jc3x<-e#46pDbz`H zw&L#{w>ya*f#Q>}K$Gg)I@z3D!Rcz`vWZD=$v;E9tiY&E+ZhzBmDvIg?9gMx)565- z5Zsaymqmbd9VT`H|9zM32`AP~=H3wY zGQ{&5m@xFqb$&M*ndA;eFFDHoVNz9V$j33sv9|u?f?7qx#_f1%Szgbtx`xnuxX=kI zBTD3qB)8B2XV@4p40uAz8MyL&A^7i!;mAd`9EJk~gfI4QPD1`qIOAa+C{NYp<zSb6_DF>fjG$4<`fbMtZeMaNt&B zjFycR?LVD!8!PH|t;;Jnt)Hh`FDKL4grBd^hdCcNe_pnlx0|;=05U&(PjEn)q&JQL zmbJ4Xv5w4~N8Jw4oZLHBdNs!^l&cQi0W^6>L|C|bRmZg88oZ7XDC+!K5gWXY_<~Ek zj-Ud5`)s_mgCX@L+_jVbINqfjK>+~{E=Lvt5cn%cBSaC|#uO`u{nZ8-63pXrnSnZJ z`@?g43j0x*j?Tm!2F`optt2prJ7bF2L77}nsvFfiW-t$`jvOVunQ1g={qxYOsW;W` zXe<4?JvM0l%g}SrJd~M{OFc(|ox(i~wC?#J4z7VP4jv=q9l&&*>>Ind>mL;Adw7bQ z0UkY1jGgOHoO}HIo>i#TLp)x0g1(*E9*EqAlpqEGgq9rw)hiiA?x-y1oe_pV)*$qa z8-Uq2H0SqSmqgZ>2|VW*DZa-Z3j8PaZ!hJ6irfZ#9K4Q%f{)I(Y!vc?#Vy_v!vvI# zJ0OQep_^xC7X*%o4z4NYfIOdBW?u%57e|-KD*q6l*~Xa!#^6&tPWl+mcXEV)$)Men zfm_ZyOZ4~wjMrl^``$}HhG&32Ami=X2im^??E6=WcbJ6#*mRBTo&@cK&DICgi~g~g z!2U_a)~D=1LG%03#44I^$jhS~MQ<2SC)Y{80p~vaXBo(@`kltsS8H&e(*e(`4um?_ zzWiq%hz0d)eef;SYj1F$#vKCuXMYsI0Rh%&0qW;i5Wyq*PZruI#*N=Wf8WES1N`S7 zke~hj0P0r;imO3!{IB-lAEi4Lu%DVeCs0Af%Mc+tU6ea9Vr|d?{y~B#2@7J)=;#a* zO&j4lY+?Hlfl4-aH&&bdvfdM*xDFg)y54?ggSFY)kwUhO8w%V-Y~lU5v>a^_yc8M{ zz4@7XOS96NW){?Vb#)GjVj}~YmMZUKVy34O zp+O6VB=*K<7#d2re+39hcua;Yj*)ZSN3t#)B2FPFPbpilf*duriQXJJyq5fDq>y0) ztz68mLXE{Q(bO-`V}rf7yv^IHb;!!b>RHSW5@f*~X{5X<9h~Kn6;s^TxN4;iC!9^1 zZ>KYrE0pQ0fmFymUmcibQJz z1NCAOon&W1a4j39i=n&48bRzxlD=~^vN<#@lwxv>xIqN^`BST<)uPlJxD`u7ekwBS z!CEB>p|E31HgMz^Sn9WlGF{rQfWcD|RbzJ{x)BTEc-<=)iIySJtlzg$0;*bllvF`& z;yN~5d|hsVfeamuO;pmtwzUf^8T64Udna$fb-&Fe0cEyHTmY@jj&El7VQ z^JuJ$R6u!WE~$&>NI?4YcU^8`J@?c^iG|Ht-6D%5YN~`Jl8k5bN6dY`Ae?BHyKM$Coh&Uhtz)gVzQy6*#o;ZPMjb7 zNXbgq9$e)a)lKipl>?rwj1$>cQ>y1Ocs20I5bSTFA9A+|Y|{XooKPN$S8AXOIFsFq z;s;EAWpMyZ*xT?@vH4AmIB{c%(6#SYn;>~Q+^EI4B@b8dYSZ|%s-RZ~D+$b`mI+Cm zdpr$cqn{B$YgX;0ZYi7nBj)!8Bw}p@wwZ2`6iYaBc9=>j;cdSaP zh%OXps~tBrd~UB{3~%o6{+J?2i&7d)tEEq6TKi(Z)S8tQEe#UMj9l-{%vwy1iaRWT znrifDk{036mo>cDMMQ64We8V2KPc*bPo4i0Ik2}c>aGN34@X2!kM5d#GKw)O^b+Kk zT?vEYHo%L7%F7*_8TMS|cZf1rrV@aho8PX3b^8E|QDawlqLIlj?{OXe(a+g*zKbI3 zIgm7i5_wv_9L^frElj7S)1O}??&2f4C^)Io5fYw8xDr5ITipO9h6Jx>3RM9;JIFz$ z?u))kObZZ06X}C52kh<>s0KW_kqGi283^>b&jUiUtlS3Bn{cZoT33J#e$mm)88?IF znJXzG+O0wxs};2et}Cl?$}^#t=i`FA3kwJ0`N|!^iIc ziyc)HE5Hh7`Xbwy&HP2r#TA-Cp|xf|$<3`4XBx86t0bP{ifYAz;TlPeAbrfDD7n)# z8-X6qm!I=9JF4S-5mc6*?1( zHA6^B0M-s1U)qhQ&54^FSy2O^sa9nQ$#EHyRhvR?R#T#@MrD#fV=Goia-;61IH^9+ z4bPJ3j`ZGXdE;#h^np8oRij0XL!DL7t*}N!w8q-xX%>iX9Lb~Mcg3iQ5=w}wcKBd&(Ey1>ZAFGZ<4at5C@X_M?gLZ$=f`-ffZLnLUFHhS5}vr zHl-VygHU%l8760zKUNt>P^u3NS9gR)B^ZIZYa}*NKe6IeG0H@CdK(o* z%M8m`6IOObW{`GLWvQWMMCn0#Rh_FL{ZVu3><~uNh_0a|GM~zDRpe6o6|Crud<@Zf z0~MV>nw%wr5ZX9o7nX3-;6pvTmPmqeF zJgT$@0}6Yi=9Jf=kH!(nP<x8ACI`OP8N5y-Ed%rW#Q5mY___~wuNOS3w=3VEuL^_<8 z(1xZoWHF?~mVKqr#WL*2l=NE7?=ux=y+o6z6^TiG4lCXV*@}ioZ**`RpC=bT9clo^ z7XCU~;sn?w_Sc)kKhnhh#;*COT26^iqcUJse2(CyT>}M}MvZ(bKGbhYiy%RDW;@61 zc07n->Z<0xQLp9kOLJ9kV_2oO^R5*7!ctSuxWer%1lKusG`vauMfbJ%@9$p4u;?%-g!EKylQvFbW0yXim~BBaWif%yX?rV4h4jtyRi#cHgMo_< zW9vdShPw_9;ab|Y8*%Ye0%v~~Q^Cypa?1x` zdB4Gd=S^LS$$&fIih!bsR$E2IfT1r1$@wdqnx|=fcfG201#34pmzfgNV@$rczU-;w zKCdpscL_6Nvg}KT=MVAqm6qR@TXpY>dR^MV0lPs58;IyzFe*486|wWUs%Z;&K`ewX&?4DI-_+>^!HvIw%k;;4z>E4t1TT}Gg%GH1S;M_6T-vTV zE#{?YmACj(uy_oTCI^q!ElfgV}6WHpq>o+j$7rHuC;+>)0E$WtAI| zsy57^zh%WzYe}DIUV_B3j;N+w6`5y;T}(JWM!sADL7l86fcLJrnRrqRg29;gYCdBq zW_JTbD6lqjZZFc=M~@iE_hKcnuezi#-_XY>UUz!|BX|YM6Xz`Kf~rG;0ToL!*$Fg} z_d9J&IE6u$z&Q{gd~f{V!6pB^opPXE36M2uc%Yk-_&|#)w*?eK9!)0L&(W@Gc+lAa zB(4u$-$g;j5JE5dic$#BFWMeMw8ZFh;<0c%s7&WQojbd|KIcz(Tr$X!mWaE}Gc9fJ z#5F2D*uQFK5Q1E=@oEr+HQf-oK1PA7-k3{jH?|4SKu5go3dE27kd9bK;X!#DdWK=! ztp04%y1z*Fr744KNZ+bNjY*mAfx9IcMW+y>e5Q~mc0BgU#@(s9VRu1bd<)*yzf)w# z?+{?a9hfocWz91=r{i3*GsdcL9#lAclJ0gy58LObrWrx)gBl(GjGrfh%EQS0SL~y` z8ev!b_E%qqk7T*JF=%~3eD|^XB+BkAP<;cc`YTgWxBGp8emh(Q%Ba*C;3hUIqY}nc=_ES zQOrh&Xm^J010rlOBx7`>dNO7TlreP_f6i7mT0s#t4Pw6!OWe_A0l-tBKIvxkwNla?w&%O7gbpvYcHTi*;&pD0o9EJJ;w%G)Hx zT?(|%I~T0Du-kmbTF(Pz_)CG>hU4$pk=@d)0u@ZJJivrb1*-Z^$jf5) z(+kCst7q;a(wECb`5g{+K!W)W(Tu-LZf}5e?)NW#$-}2X6lZVo+{L6Xmv;)l2U6Tm znmIrD%(rar_jM}g*FQ9I@>HUEGI}v$;#@D zpo+AG3Hp25)bJipE&Qjp3sd7tl{prvg!gse4J_zGawGr63l!A;0+mvMYdl3Y_3Xn5K&; zGQ%YF6=#4;GD;F*W|h1$ zAff7;ul)Tb^I}&7Clfclj5sB?l` z39?HzC?@{Nv9#%W?pr>e*eV0}#x7i)TWq&dkwTJ6MF(u6f{k5Ris(esk!UJe-^ZJI#KAY-vqwSc=kzayHRMQ0OJdz z6`ppe@F$NmoV;x%j311$WIQ?I)qE)~`@c9Z8FPCs7-bEP8wr4Je^p+DVFk-NG-w!o zkPN!kInO>&LKwES^g*SjTkqq()kb86e^W=I^j}JPtcFB$^fPv6q5ATyZ+mM8g2bQh9nd5OqFdn^&_^*M&9fa9?(+VSSQ;g%K zm_|!8Q<94_i*X>ZQTyagx@%f#+gGJoPn)qT*?FK%_*V3p5#q4{Ce5CWYAO5e>gq6q|HFQr_|=CzFn)cr>&xosGc!vlN| zI5G}S3>Vy+#NdizOD0j7{;r5Du#T{+4Y9LD&EvY88%59-^(*c(a-=HAFqQL?tKg?l zB`86dCsDzs;}ncVLqwd{YGNR6c8VIox$GU&iconct?JJ>c{Ik>FBPS_;D-g0>C+o$ zdmB+52Skh-9sSsCrMv}XWgvG^)Ig-WG#6v2YkRt=Uk434FI_%yZrAu2PUB-K_!lQu;|qJ7{Up#^$+tP?b)50vvT@{&h{)64+Q#`0}w(x&X3GvB+kPc;5rEArNlb5 zxkWAiL`E+6xCz)^2HF2!?Abm{Wv*uR2;zu=o%btZI$A?8xHF%B6*H5ym5|CBC5j== z7+sb*56Uzc?~%cLp$z`>LKY@H+<;Nv;0)ZOylbeOTQrlj#lpTO6-}g+{sK@#eMtBT-usHz3(;Ii2JlYd;`-t)|yl#x2wav>^P#`Y%Lc(l^Skg}qO{ft|Ug^ZB zEE@<_40;l!tVuRu7*ZJ+SB%^i8RgiS39AsvvQNc?2M^8AO;o+-#{|NU$ik#EHNeY+ z5hKc{9u1yLkA6S^PC&80+lYw~Nv=zte!$%byE*K9g;?VlqZzU}^yXQm8M7Ms?AdNP z0wD%-gJS0?*>X5(%+gEEeP@R>;30~-TXrf@tiw61MwDxpewP4dl_(~Ob=?~M&N$Rg23zMOJatvtkfh>8630$bXZ)@Yh^1HR{(E2ve3+zIdr zAt}&Afx%y535Ix%-4o&~i7v!9$W;U-w?k90vn=tm>Q|;MX)s!9;nt_6=#C;P53ZKz z0d&L|z9l-v9yYby6*%5vf5F}Zd%j(3dpEnBa)Xa$jQI4_GT5I5G29$KhT6}#Z|A-M z+;s2Pk*Ry}#Ct|tW{M5)?w+9o#rurk>-NSbTl20Vbs3UoICh?-9Y^#t>GLMgYd~dU z-*Aq{?LzO%SHrkQHs#GvUPC>H^d%x75k2O~x8OjA`A}PLL*@_sDbW!6xekad5fKK7 z@6Fc8@PlxMH1^2vF}FzYBR+;x?h@A^6r#Tx40z#Yqb>F#Ie{2dw%W zib^I+IsC*q(*Ho6-hNP(uJ;BLkJK{Rp@830ke|&{k^k#15h*pjpD_7C zgK)@a50PLl-(OPboP-jIU{LD-C6nqK8fIwMu$2?uW_Z^KkI(O*U`|#+?h|L@>>Q&2 zKpq1Yj7}p;7rit^&)vmc3CV{tOB@Zdugi;5fij)M2-0(8s7{?vZj2VUK9)Or0DJDr zVg#BmLeud&J)FgQNf>h&?1^q9K4`cMZpLZ|J?s zRaKHNZ$z&Yxjv$g_!-eQ(z|Vl%Fuo&yz$MDV(fxrHt-|Kwff;3%PBpcUeI%gHt_bN zWU@D}?sJUJm}9sZt87DT7_d=NH4>>20OoGPhH z@5C__it*%m;-YM#LcRk;MGGP4ls(QU!vKi=aImsXxOd<(tq}W`*>899!-s zf*;Mpr~;;#HMf5t>hZdaS9cQQhBkHJJkNNPNJ}VShr?xw6Mlnx4|=wu)r>u>il`az zKrGFulk(w@GH0)9RW^}yD~<%M>780Dyo1~0bl3n!_)s$DEEdjHWoZxi2hZNZ}{5IhG4zb^AYS;-eixb|EQT)CO)qxT- zx&%LqoHvf6tfQ0=M*?KQaSD7NmO160@`zI7}=^;PP8t)+0@!Fj&TPC~@VoW=ATHC%hCFx&IV zjhPm97ORXIORHIzsi|<>1SLK2CKut^{HATuMqDb_><1o zqS+SN-v)cW#IVDMdRtdmD3S1MDWaV`HrnF#%Gr#$HSeNH=_|E*b1^1eCKFzUvEJ=+ z8ii4XtH4l|BI#zFAY$8YaP;LIq!t?8&clma(w(+E`RVzDsN%Ce=S~C@l_nUltF3t^ zIK0g5J@)IAnJVQ>S|y`+jnR+52jzmJ=9Z7gY@Qi|nQKv36r_~uA;gKWW?dBBki=c5 zP%RPSr`4Bt#g|XTTTTA_*PQRZE3SO@=Wxxpy4;69q;HHfFYRYCO}LXp5f})q z-%<{v@~=s;lZ8A~>fO@+WJTucGjBENC&s|VD>Yfb?XsQkpu8?ccd^yQ$xdN{jSrVy zkIcd1BS@T}%zk|FSWXmkwYaF|C*P>z4vV499<)Tu^OhVi#zVG*ZN)`rIO-3Bm3HC- z%A$jH3qV_`s^kvapix+$cQlkl`=XI)(b#Fh%+NgcDjmy)Qx4#%fhktJI?TcR%w*$J z$$pjFnVmq3Yf%G#fV)mM_0&`M>3P>BnF==}n->Hlfa<>`TvN|AJ=?!}+xFq|>yo71!{4dVlIk*>K+w+ZW z+qP}nwr$(CZQFM8i*4I>cCxdR>^bM$H*ev#G+iIR-f0#&V1rU8Oh9jZg>cAa@1Iw4lMoqaKYr^or|x%qH0G zan!B}{bJwS>BPaysNf%eh1w!VQ}_IS8LndR-T@6hgcLsVv`uG}21F75@VGh8-wHl7vuAgifJHnO%V7q*SA?(v#%)1WC2L1DCva;|X(`*ABj+PWM_(RKoqj zR#;4_>k$H>9@?lWE~f}x|ERTiDh)4bERr%ubg{Q))DUE$0j8tjkc%pX*M zfEePQ43T~=*49`axvXEOS2$y7A;AaJu?f&Uo~P{Lle*ik)n0Fizo4V^!&1cSv3euD z^>1=0J}Y3uw<+^m!)=$36Zps*P^sjgUz*bGc!nqLG8-XpKC#w#AOESud3t@iG7TsY z&>sjOAhG|;_ftXj-=EKNHCfdaCA1$0Sokm^CGTj&$KW<_co+dBF`5t-4Wl})ONKC8 z=niShZu9B!_{4DBy$?pc!?>X;*6VG;GcN}mf@Kz_p2_a_g1i_11MYXS!GOSTghQ13 zYOA3!9lT%$`9OReXX%_77zi~nCaO7fbWLaZ;Wr$(Y9(jU@=arKPV_jMt}&#iybxQL zi1XE!W|K>BWAiuaVSQ1qdnQr)?di=3sxGu;U1Bq`vo36Z@1-gI^~!j>_veVINJ(ne zuURJS`44XK{;Zkn0;lfel?%c$3XLv$3iwnY4Qe(PldTLabF3J36=x=~FJ{rTu2v}$ zT$PNuO4x4jdjS@Vmec48yp>4-4n5fdP|I|!7Cs1fo_=vak^B~i=R|A7g|iQ5M=e_= z(KC3lZ@AySb9jLs5%Fj~#+0|=WZg~H?hD@gE&>ty`X}d`O+aiwhf49Ew`Zp}TG1o14(mrO z{mmte81MfsGiGq4@-M?yfcnZ--}U9RKGN}!*e42~<~bHMiYsezN!3H{uGQ@l=IC2+ty5NgugrGm8iUEi?Ftr zvI`;i*+7Ph*5f`P>CT2VR+?8 z4P~UQw3T|3(SpM*)0nP~T80f2#T=Cql6RB-OuG$rO*yF0bg&q_WJoq23tGEE^DfaUw5*Vt%J=rH8p?q^zDVDhBE(Y8p z|1Q=uGgS$21`Z)e)6U-%`ra-$#q3R~1tmTz((S)|*?{Fb6J_lQMo!sz`cHKL$W_oWrs9QdR$zw?W1zPgpKb%@(B6WMoZkj@mwEVqLp#T`UT# zg~TpzD9a>olG0K`nu~iKcLUXMA|h@swrWI8b3!%WHGj@i5>iw|6+_y3d70;WFe95& zfmTa6o49+I@7wW@v4c6d^UMYmHx|mF1#CF=h=?oo*bWzIXB5(C*M#>oH8{R#?6*#KSW>0&Y7lBuHmgt?`pC!F>o)Cn*?<6Qu%#lO<@5+2Nzv zg(x$vaLVl{i-tH-^Vw8p!*S)f#vuuj#Pf=zTxOPp_F?MBbo2@3#1n7l5Ol?sV=>wS zyD`-|r*3$~F%nt~UFQ^ZMbjn}3HB|BlP5O^8Eg|6PV=wgT?o^r5J}5TBj$ps(pD{T zllqi)6=9q4R(mFdz;StW&NaHxRkOSZc0PX9@xs=}6?-N~Tl2aTdR7%D3WfGzZ?0J9 zd{fd(9|wzRA|sfWXR^Z`47}2`rha zAdppLM2n}BaGWCifWdZFw=YLortaJ$Wsp)_BBTO#=z8adytyA;MYd5ezGxuOt@aG4-TS;~iyg_P<# zTtcbsuazxHV6C$Tj!KsB;y=|wetT;9|dK4~bC+Gb^RkqHL+&{hDM? zN|eonH2x1pv{5uRCK36>(9?_`z4C;ob?S$z^%DNyn9|wYg6rM=a~VeA&K@ogSOxOI z-qs5W2yrc+wv#H(Qv~{g1`cQr`kE{fGYT-_%M-+|{$i;F5v_O9O?k8nlOnL3>Uj+I zOV1v)Z`Vdufs~)-6atSyx#9Jab!92%_ zFjexBPM%~@#=q5Tzf6~V##7b~whx_qX=bdk^zh)S>G|Zy8`gq0uBz?rp=#U?r(W`g zae$>i^X5MFCa)x{hVNF~xo8g&qWRdAqVgBlksWw4WG?sB>4`0ivc=Ou=flrPYHTYt zF`zjnUSCa43~LT&9u>oA6Ui;}MWf|curD~n(kIkRC4Lkz_|~HRI*+wl%*YJqT4+e# zZodCc9I8(pNCK2B+p zRq~E%mRS|W@0!PogA;|&i3ETIZCc4;9tZUnvzLvJp0rG!Py8gl6?BbbGHBe`!gsB* z?&@tJUi}>N=S)#MvDZmVa-;k}V^GTzcxq9jecqWeYw*URd;C+AoF8+)97FD`+%=K+7o}6{YKzM(@}dCfuchn zKc(SFuiwVIMTd@01T}wq!LAi-C4iIm#~Lred?yuP1VV7p{nE}hN9RntV(>_nugQ0^ z*xLMbwDtYv#XCY0Qxl$`BNXNvvYE?kTIhVS${jzaw%Xs?-O<-hL$?5CaI{_6J6n4_=>iKL*1WUax!(nvdWbZ-kGDFauGH z)E_Lg*XVt^!;vAVe zIMMxJ4>TU}F)ki<`(k;~{163{AN{|AU@6WpDn7Y`zn@r|g+QZFZ;7?>)xUbJTF{J&%qQ9K!4bnn zF&b62_3+2rfnc-tU6Tx6!&Jv_`IM3Be&8WGy@WsVg+28zVvl4Ic*>*BFzY_|?xjQx zN%wP4H@j^pplREVO)h4~8IqX2rxhSUTzL479be`y55*Le4^Gc20PWgmBfX%p`JN*4 zU6@I5rvILV6XPmM+lnL&lZ5}>r+!>aP04xA!&+}F0F04%`}x6E1{q_vr*@`@Zmyzo zFIDp_Z@@e?i=TZMAj(YTX;$K^X5p}*zOLtkiFYcb=8|dMyj1rdilRJ2y+Viw>Gl%+ zZYy4S!qh9TgPbMqnKNzC$XK)vKA9K7P+6E&S53B;<6;SGus3W?f3MVi{mexz1C=>* zPwk)j&~3#(8qI>_s@tGYlmtd|twRu%d1hox=|(mdMM|sF6=7pnHe(Y)BRPS$RiaPJ zmQCBoQ0O76PzpF2L|m;2sQl3kW0N0h@mBDVU>CySC0}y(lx6No1(PNQQFi&&;OS)& zBj?hyfLWhzZ^w-M(tJVD^s-7NR__~46W5)h*r6h|gZ#7((&1@$yHgs~-~&RN$$@?+wMsI-{=i$mV+h9uL?rd_rtnxhj*IPuyZ zVXpMCSo!Mw$#^``ZR~#kA&Zc{<8_IjOa-Fg6|f8N8a0c{@nI#ctjmP75qfKppSw}W z7?oV;H9g)k&Wb7>ttf#luiZVs$(y)eo?};D(%!HS6sim&@SV63owwIpyl$v)lqR4SjD!pDuP=9Ip(r(ns+8S+Xk@J6Cw=>N&-R$Lvf-QsySqE)-g2vvaq~5RdS>m0Z zs;ZcBa8X$r=bjn0{yEM7^JZPak&i|IRU<)Bk>r3k_?MFJ2SAa0DXg0pFnCQq!+6Ot zOWsw6HZknkpp80$cq#ExQQU;50W=~5G+Fdxqa}aG&W5YVui`kr1NT7%Pu7*8^TUZ3 zRBjZ~?t~wY1`ibgJqYrX8FO<45n=>p(6q=Sq+t*MDfL#$A*uqIbBm518q&!a%F2gM1^qwU1HOH$N&xZy-g7QKXXJO*-%)4OXm6JA>VrU^VnnQuWZOtIlYDJY1Lfu@1%eD$urh>&-SWd#B z!@&BVHstRlXxuUk-Gs0$)hB222UtsSmfuPXMU;P4Iw>+dh65@%ptc(Q59*njj-yLf zL0B3|D{&_Ig0XW}xL%8>10?tqPsL*u;u%dX;1dLHe#TQv3bp#JZx_>;wJe;tA0C3c z&bY}jB+fmF!U%8OK1rsqBxjQJ9{7&P6r#*j5GyX5DWr>f6qpIPwFn2_2>}5NJrNa$ zC$oz#Ecy}34vhB2_OfPbQ9ZS|mO@lh-pwpmDgb*PQ-?J*dk#sbb;yWI*GitFtwNYz zLMcD-?^B_Y?sv)dG@R()st$-zn_5Eum<HuWRW-H5-`13ZgVTd+u{pPRl3GY(83@%UKIV}F=si*OqAC0tI zseJ?h-jw1<6+2UsCTtRl0S@!ER07QD9$0C(Y(%jW+YV1QHqGo=^6kabVazTN#Qs4vKNk52vKwUJ2gW!e z`K00pmubw~Fp8iTuj@?jP>R0*gR3uMe53$_HW+z9b-N28dgzTat%Y)yIQ z%1?FF6Gguw)oG5?yd!1u3i(00!xFz)BX2Sa9+Pc`OE;1l-t-UyE3@5+d8J!-Hweaf zL;NK$BHe+gt36DqELG${vPI}liP^m7K17|?qiAm1j2T|MnLK+y@if_&AL8Ef&1Szw z$Kwm_UJyy7eh2z(~ zuCA16I0WG%fi=%YClZVDVoWsk%A-Asn-t@yqWpwmc7%Wx^B~F)0CeI+nHSev1SUuZ zy9KY_1zB-4p%m#`Oz=Jo{z1)l67YCzxfla!L>>TK`y|_v7wSYAAfEBU&KGwe1Q|f9 z&?UW+j~w2Cqikh+dTNChEuwpbuDmprreRS2!YN9FPSChCDMBub`xPz0lFslxTzJH2 zhAMhB`vVh5${Wq!yKw~1Zzn+Ql>E?~F~2Y;Nfh$e%+TVKgaXiaLGLKAe_xp76s7!epbb}OkJ_ghGd}-33Y%QFCwJj0_6Jw> z`iSe-mYGyPlo^p%QO;4``cF9{qC25gpIAU_F}t&F2;sc9ZdVtP)=`wfS#E*7-B7`B z$^BCCr4B6E19q)SK;u5yonz_*ov&qt0{p%^T{>j4hp@!LaeEoe>qz44qB^Y$MhOnP zh!;ddbVQHxY0fP#f~T=GOTOF~;n-dkQ(m`o+y{FZIb>+ry5O}7kqsZv*Gk)k@aUB^ zY;g$5AW2BwSH^?&R|C=#2TnScT3Y$>=6hznF9!2m^1zzZPbNuepz1@fKVM&Qf!Ukm zv4^(O1%d8ZbZLT5D-qyxdi9QQ7X}IMvR-p14l_ie{SqPOt7kawujX?q6L_J@zXsDw z#GL}+IHtHC4)LXe1HGSE=-xp6fluQS?g67)HeZy~fdG`JD-qR$sP~|NEUPyO_h9^z z*#J~7$2%$YU=O4_2utgPRxjUWk?#eImiICl_TWxPy&r>F<6}r88g;i3RLUS8|6T@E z$>2H#w;^Xr=RQJQIrpjifNaR#bqQ~W;8r_k7L4;RyLKu15WK7YZEw^67;#UtQ+s|u zr0$~js%55uR4+S0OS?2^!WD=xlPlM~H2AbBjk%@Yge+9z!b{jWRNYi8ekSq*FI1+v z2sunrM#5u(2@#bLcABJuLcj(eCU(~5j6FRlEMn^`#Pu>nGnZNgMI6HP!ETB*qUtj3 z0MuzCT0BL?N=#ES4w)68H>ty~+Xp*zpDT3k?kSTpd-g2$kAjzxcLafTi82y%7t56p z7CNAR>s)fi1h`&#Mr+{fwDr2+)-j#ycw?{Lt)oy=;=%=uxp`WJUXAO~GFD=}1cWp@ zkL%ScM!FBBd?IMcyv>jOk{xlXo_}K;aoV!b`X#sH*<1S56pX?y^$;xo3B*#SpG58t z1-PV9rt=4LUl!<+_(WTm`g7!Q<*LPq9~4>6XdLT?RFLum%qU|Bpj{R`!oNCb68(e_ zNFE4ZD0?^*Tz-E%AR8T)#=uKK^M{=pGUMrw&nsZwX^OD}(6qqUPIAH})~s zPXpETpV{%Hah5^zeg~O@T-s-Q6;1rHdb~&4@Wh3jZQseERxZqy6 zRE?L=#@&AQN?Yh|+dJP9)s7kxH9j?scK6jYxad0`QI9S7uSHEp?37klUAXF+$IBBT z0OD_-U2E4Zmu=vBIQFm`Fx`aLc0paaN70Dr@d4Mv&0y5~?VA$pUf)^)#J-#~kpZJg zPH{T@f$JOiav5HgWoLC&^?mmAQw2*^m`us!q!%9e^oDQ;A`-z}{SzBSFNk|=FQbuh zQB+MPqvfYGdA<=6z{l@&dA@aHS)2kZubQLmhzlxKx~1VwN=VaKEq7CMN#{=5vKB_G zrGLf>Xd{X;)CQx9^O;b+_HJ4|xN0)f{U~~Xy6KgE=LhO*ea5juDj?nTptid1#Q!T+ z06iapo+(ZrjlAq4Qo)G@hz)r>#!2x8t39ajo{-x%`M!)mZo${dWif1(a?EC@t&$&K;B>DGxVUCqf?G}lH^GS<89Eu%}lCR`2$zs=m z_EJ^H5V)}Lwtns@r$@pF)@f5J3W~}h(b)k>2T8|B8Y8zSM3PF)DnoPHbw=ZK>g+mE zQAPu%U++nXIT_%sDm@v9yScoay^NdXe(&!qlczZz;v_V@_qpf4_<6T`Pp=Fd_)83g zMf;rR#BD*FbpjUL4bzivG-gMs7vaq?I|1VGc2vTM`Q7!%)hvkMbR>i~Iu-zfaPAX@ z+Tu)wipJv{NH;xX>=hIO$x|#u$Z(!~w2L!5E7QfE605w6KX)tB%^sm^+RZ*64C!pi z=ZSE>4n|2366xZc6=KjZlcyAis_(_6aD0!v%d;GP=7k2Uo(!yMQl5&XNzJ7_Obw%; z-jrj`lk=W?9v0dZ5qqUKtK?LHI?c2b+^$Cm2yMmFx)}0-ocB1ygVZ|{rx zgPgZ)0qKa8xdvFcu^o0j%hWVi(9%r`Bn%<#=2_nrfM^g z=mYR;7E~Yoz!{xJY#^RR8W@jF=rLjQoG=H(HW1v8P3+J>AuW&ZH|v!D7r&p zY0>*+hB?4DXua4$h^p3xi!iF8K1!77V~h$f5kE~+k?6(%7erdLBJwyQ9`S-zb5_<4 zizIIY5kT=>wj%KZLwJUx3;w2yIJ(D`{1mHUB(buY9N{?==@B|6M;ThyZRB_e;wI&1 z@Jm{w8(6im>4dtNu~q};+fr4^u@a)mEMVkyo=6tx8+32<@AXvrOL$cAG9$~Tl^d6` z=MrDc^eP$C<}Osrx3T1kY7scPIqgPuafqhGEMX&i4{}U&DZ0d7K4&6-*u!ykL{mmqc6%Kq02wGU0_!VWjzT# zotBr=GY1y6jT5e6>wvC`OkQzMWTM6Y#>phcTkIXV!rfrTZ?t*?&#*=gEADU1qLq&7 zQuIWpl!9j$EQ+K;l}+)eg#tH?8ztK&E}b9bx{PfXvr=9$7%j()h+CiScRNE*KYKfK zk+i!FSaS}5>KLamoQ+J%Z9y>pTR>8|DEC>IPR^{{SkIJ3Eql`mfeO4 zUqP~($CM?}zk)hu0Web7l;wk$yhdbbKv?FWkH7UT10%V8Xn4AkM!x=)F$gvO)tuhi zCZ5u-pQ;}g(nbcAeH0~#75hgaOf@hS>xxbwTE^fD&af2&{tr%j+Lc3a2n)oJ4G2R| zOlV4Db#&2j7Nt7XAuIy}xv^E8zRaSNNT??O&Ulk?ODtta>BMVQ_8{PEAgI(5Ye}1X zgdQF^(A1rry_B|;xjs8rn=Bp!`V+*R9$q<~fyy+RQHPcqy7G6NDs8W#Pet= z_=MP}PGYC}HYlP`5#+&&7$qQ97g1Jv9yACDEgDY{Ii^Ha-I5bR;W9)GS<7!=3?%s_ ztb644VSQb<#GP@r7mMqm{)ET}Y)gSr19ygD)*I0-m5`O7kr8`)lO5|?pBe#H;uYoG z)1U`6kTE~L{sR2V7v4}TtQ&SEEwUG(uHr|K?UM_gI@-j(oROzdI|miTq^go%;oOTe zq)Iuq7NYNx4802CEu_`75MS-+KH2%AF&ZVYUSmB=M_?aILO83uNcHMRa33pR3;~=p z4nw(WZN>V-x$1r3j_OVNV>?czF`Xy)uS9o8-fCWOoXiuv>K}LmN{45E?_%}a7zKiGuPVk9 z2t-+T1CuOyo`}H-HJ*?S9;tqUTl&}_ijPe{xMJVKLU`5uR49K+V-$~8U<68!TR-w* z7G54Ue$WMuYIl9&V>g^pe^#9N=w)<^vJc4kgnX8)-2}AY$F_$zpsP4TCCvWsAnc8uhhN1ZJf2d zDBL@*7&=1oaJVWb?h%Pw*tCmgUVB&CZO!^p?Mvp%HptV8Bp8bDfB;#UtD zeI)dtcvDI9tK8k*V9q4Xh900XkBez)L@hL{Xa->?_Q$z7_5t-- z#a2fh!h;jgsjs8KV^T?B6J_zJR~aA3n7`S#OdvXRXm!bjhA}azCZDqr4zgc9-zRW`jruZY!;QTR5x^4zq%bAvgt&&Ze8^z z=CVNz{Wh8D`K}wff#Ggo_6hGC6X-xtxMwllk1ZluEE@0*S4s@+SnR4&p+#A#>I~Z?D5Y0gerC}ssO^ibHJdFWw+|MpGA@a~)A1pR= zo$T+|vls3RZ#BMsP4+IZ_+p^03ASI%XJr_MMAKIRR0K?TDP1iEzow0dj}`T3-Y6T= zp>nP5gGU-Vj|~hYY4i)$#eQnm zFs)5`%z85%iz9$?6M5a!6fQXlWTjz!1xj|SOZoRAi|Kjf+9mGoD}UW;yQO=F`IQ&I zlktPHlt8OwI*;`XGSVoV7^xa+WS99<&QcW`sB7vPD3=>{W)sXlf$Lb+wz#cl|5{6$ z$8Jf%3b{$)wy{)SQ=iKb-PKz%OOAZQDM3M*skGxlqu?b@O=}df&KfsQxvq|o!Ge0b zix7Rz<>Wk?lbdkfY;+O3(pRPMCPw8!P?=Iv5fs(wbqM3rys_nxiEX#hQS#JUZG38O zol4NHqRwEjc@~yt^*d_9AT!5LpEoXp!@kncM*O@VW})wQ(3Vc>`C8(c-q?&r_El72 zbl%M#2I7`=AD=ZlJJzziOdGIXwsqNd6chN?f4vh=t`j|C>B?i-p#>@mvhiV7@rHjx zD8Z@jh~Gr$3daFyC|{OlADS{6J9ENsSIdWLh{O&0E8e1vD?7r{O6n_omD@{oS746?TBytu`HY&~pv_9Q0d3h7x-|ddNOZOW-O!rWOdP>MD za>wdU!baEn-h&!|9|4y`EGjGlVRA3E;K#qFDJnoO$Hd5#jhQtID|Zgw1br`O9I(*{ zOhnobhikpS3l${q3p8ZW#VZ~`&*l=py8z))BM;rTj!bYvB@4;b-+@d{P)nRVu@2l2 zCWS$*LZ}1hM7ZZoIqV{cCX5;V8iZz_GEh&g6a6oPwhOm!%S4SB;df$;&P4Pt28|-T z!`Z;ExW4rW`a@2o|4f8Ms9rE}-|Q(uA%crHRZj=j zc&uCy2JEJwi)prSvV=$Ws~i8&A@YZy9Q3(E7q zE5_l%8Vh1!@uSs@d|{Z)i{N|+b`gjXfZ`=S!WtWf4}Wqb>;;8}u>&^k2y(_5{0sm* zLOHjJmWIvB_?=5n+Kt*rgv~mLRH*XHsO>#`A^O7Cgn+5}^AtIP)C5Q?{o^C&Q?*YF z{39ail^GV8SmaYUE=W`*KvpF{QYAo9B|uvB^O;-Z14nQmT2&wwY%{_5390C_^Hp$7 zC>8#<8S>{ydO5qG<9FKd7aWc$C~jVpeB#%yUV^S|5Q4>!#h^icx#&VNw{dyo#M9`AqVaY(?Pf$B1 z!is?uWmX7c_JTqtgh|(eXy-ycKR!AHOgZ5wgtKeG-#l7rC9W8euH`yIxE;%R!Py>h z=Ycn#*m=QTj6{0TeT7XFgDVR07DSyi11Ani@WHU>CB!yiWFCsVuH3Td#mv1jhSg(@ zuVDdTAIIWQ5vp_$|Eye^aZk}8S)Q#;RbH;C z)ksLGaafvEMN?0TW29k!coZvdG3fF(}iosb-W827=>yjbPN zbd7L^HDf!6?RKGHpAf7@<(tqR!cv`B^AbD(+-VsNfcnLVokNH|%aJ< z??sLkMEh7n)b{<9t=#-+!4-7fE1vBmdz-Bx`TIwFo2{$Q#!{nS4Elcp(x?X|hi8}W zN(6|^m-fyfx-o~iLdhhIx<5UCpfeT6V z3Mlgof`UIt;3hJS=>~GrJmOgw*ys5+xL)*5;5Z#4lhGXBT=9j3-`fdjenI=$NC{-x z{Mu;T=Vcnd~2QOLK&yN_i%)fHlR-se0Qsvw3ysl{)3SWqqOu*{+g9?h0liyoCltE6c|J83Cm9VIapydpWZOI$^=E(r*5=8SFhdXWJf zF}eLVIcgTh6rBLrAcp zk3okj)h@HZaAs0YVP!4;%Pjxv6wL)RLoR~+#n>?;j68Pa=^@F%&YT9Q@|GLO*UyQ1 zHGJO=gXWL1BLXvD`rf|vzMf)3vt*F2OX5nu0|^%(_hO3myux(`iQ*u2fznA~+1X&qQ9Uo=+0e`}5HEQ=NZv7#4>h)7MH6J0 zW-Rn(Fvu8luP!K~bgS`dlDPI`vbZRy1{7sJ@w(C0v4=-KXBq=Cg^8I_Y_C`@*axKA zrvPUJ0gCm*+G9UIRlT4>Xr4-~NW<9nE?GSqyki|^sa+z9XxuTgW?{8h-BA|j+Nc z+#hjTy$_2%a*DBym}9PdEeu21DjZWcSnWsBa2MXaaL|B|Lg|e35eiqj>l5v!*bq+$ z7_yt9@4RDds#KPXSl?oU`xHu!RBNIq_gIdo>1I8TYUfTldH}uZjML02OADXP6D1a{ znbz&-go)qYrKnnu8?Q8v|NJ&T*vsE+rj|Z@F+j0ktSU$VYf--LmqiiYu{70*L3Nwh z6++9!lhE=;oaTwa$oAdY50M~|-4r5J5$Rof1Hhxm1+`&WB+4`DQ%3I$KD95p}NYm^Zf^b zYa;1o7eT8Pf8Mw2`+^W9xE1(Q`Gve^F!O4_AUxohoeHfHU~EEZuH-n}eQe*Q)(5H? z<#{CWM6gRI5Y#&s*(C1=hZwDRsQiS@M=L-{`-QTPW;ncajN39aIDB!;>lPDeQt`1Q z*Yqqk6Hq2sXt<+oQBi1a@%cX|m6N(X2TkF~WYj#1vIzgF8+=Ap0BS!6DLUUlN*ZAo zH(^tiQKwmmOw8IuN^08s8~aPxfJMRL#w_Zm47jC4cb4&~KZDz^**_nDxv)&^i?IVF z6^MfwiaaUBQ($+7dcu1!pC+Q}n|^6bUhrAqe>2>N$!<;{P#r-Llg>s*SIgQrxG4QzB-@H4e$0 zOHOu9jc$Qxj+g^+BYbf3)BU)XK}H_^c)ceV`~~@UAGMVa48Q6BpJYredAa{n1>*k= zu#kX@F_aM1>Gd_KfH{tCwvnUEkarMM^mXmw8&7#uX6K84hzrz4Gmk%lekqT$hPO$C z{3pNyV+3vMy*u*@9=A(~R%U*d;byHqib8f=i&eW-u<@;-vWQQ>C0PDWr85)F2!E}q8fZXA z;76Z$PjY-xPon-=Y!XHJaALYcor+Bwmdl#b@9R_ezy&6!ViV&SiS9&+Ty%*ydYf=M z7%UL2dTX}T;~SoPWZczLcuLyR?Blq?okzfZAg$+C8BoPrNSYQ+=W=d!xDqIJoVduVf*$+K5B?Jm{u{ZcQ;ZLRKtSV1nGRiGE9$FzMTbD>th7eT_sKG?n!T5JAfqO=1aPU6x2DO(p>?H(7n z?JgI3WwloAu^al0T3)e9e{Nge6bReniB`bu@*@{KE_>cw=?S}?3qUImkl6i|RcXxH zNoloNVq6*;@>g$rMaz<%QBoY3l`}_@gA+7$M7Ux6uTE zN9R%%1;AS#vuGH1<0@DNGmN9hMI{0oUPZ{zZ8)KK1{7S$O#nfxFozKYQWxFRo^W;wg3}a#03Q=)q8lCAdvtQt}WEw(Ad~r4oX^UTkhS~y?Tep(Cm-^ z3=BO}LxEn021~8tMln2o_QHj+xqkPpbAV~aGakk&h$4-V!y@6m4I}6=}vHSlb!@2w0+M-uC31M1 z#=&zC=QetUJbh%mh~O!9Zgr%)*D~cIMDCr5W>QUA9M57?VeE z)=A?YC9Efw8>*I&tluNz5T=$a#S-3rm)`nK1cI)q{C2d-&a0hMD{Y}}_u4=jzoVr> zeOg>kr=vf-I}ICMS@yG*j*1fVEny7#>vVRlPd?|);2aaycPCM}0c{O7h0>Hf8lN`~ zJ-xFeOhdj?e0ArR228si&j-cHGu!C8+jW^{UE|pHr{9=S7k}gwAQrT?x>a$t z6PlejE;pi6Wm|o)vCoy-lkA>cwKTN{cWfU9Y7l6*a~KM4%A;@lXR1oI%mJS>R&g9-|&Cvsc5J)8;$*yRoefDmwCbf$b20( zJl=euJ*~cHWPl*Ty?@ak63!Pn^Vb2+ElekF+J4mM?1jHi%kHAPR!Pr67M^=LGlQVkZ;*)fo^3pctKKblcwv`egXPGLG)FDNy zG#oCEKse&%hi<@Eg18TkBPnBDwf@f4f}wpFX`A(Rm9uHB#M&}EC+`@a__rVFBEc!0 zpnF=v-~=QTw@$-JK*c9yz*jQm9y>Ve#abu5jl<-|6Lx|0jAMadX?3$eVHMH$>esq> zy*<1umBDGE%9A#JA%LH+2r!g-DJfQH>BHERX6}b!JCP!0I>iEtJW!r+_bC3sp=zvS z7(QH%BVBOOnfs6>u4<^=HdE- zV4(2?a`r|vwJjdXR)S7QYKuw!G4poP8mZyi`!UwqMnp*AP=0t6G%Y z6*VeYQg}kbz`}s#{M$n###EXlOXOb75VQ4jzig5VsxrfnD{ddX zeqaSI+Q~FAdkgjo$}c%$9?7sM5-E)O!91kFUV8E!@6%+!Z5nizTA|1lXX&nV1) z#?KBxdq67xKvALH3H*1EI&V4O)0m1=EgqrzX3sdLy&>}i?r}<~QVM;W7*!o7YgtPf zGj+bsr8Qhy_qcUCK;_B=MW!v5jKGFTE_>mok^q@q_EYZq>Eb|x^fX+E!up|MbpHa@)F z!Cvx%w!QCLV!OXx^#tn3W66cG2s|ubIykztyca);cqO?hF&FUpI`n1 zdv#TTQG|;(ZPk_G)6)&bF>G--X#5S=P>L>RL_Wt;g|DO20huO#_8z+&H?vUmJ7oK})vF!`{hW~o6 zK|Q=c54}wf-Qr75w5~(5K3M+CGYMRAqIteU+j6I_)qZ`;33oVY*5`&(S%5wrj4}1O zG3mLHAmq6d&>?_gSD9^lip)JMZZD1a*G95>Lis2vxOZDy=iFKA*(;A(>H%3wDmY?M zBPei1`!6H}AoqVz_Kwk&M(dVvD#lL5R>ihwlme93h6#1~qHax`Jxr{(o0E9X&>vQK)o|Kj^UB~65#UVX)84IfU&v-G zcq!x3Flw3sSW+sq>Tt{1N^(j&|Q~vXOk`ZzNKdk8E8@ zEsGjHt@m)u;VlU#Z#X9;cLitNE&)x|GLx+ul~w%OwxL;LzT~H8PV5jGJ6s9jyyqij z{Agka4jRX)Xs2kQL&T~Ev1lHl8@_j<48;-)Ub?66y5 z#2NN{|M(~>%Dp&pM(xe$kQ`IA4Un-*Oge4?+VFFo7qFwY5QE|AIt2$WYyS`z6RBul zI#L8*YW&_R+@KXMQ|CM5FWZ@oXPe_)(;vCB=*aUx101cQLRu~mMguDFmac-7k!}i^ zl=$87&fCBCRQv)HpRI)lia<={Z=)s*6!JsjTXp1*;zk#Pm*JJnmIZ_+t46zs6hAaX zfE#n7JGkothB8r2wNO``yxG&)vg)v0%FiIjmnI=y2nk?z)|tS!gN?nBXl{I@d5L-) z7p4Xk@(=|A6K|X~{S5@Me+A5AKusy(*9kfHMMvPZV-U1ZL+tpmAnR+e>|RM@b{3lS zze#`9%MQ&`bYd34i3m*M#V-L28yADoCL80|CheIN1I($C=cwch2iS7(AEAJP;s#RG z=VE7Vh7iRgsUuWu_~K&Wzk5$rJ$S_)uu7+130VtrOvM)(!NDH>h_YwI@iFic6dhxy zf6I1Y>5NapoOG|9>+pbhXMG=Rc+;Wls3k>@T@&q1TMN%L1k?IM=D7v6z{5@Pv4_1n z6EJ$z+HTHEOuUe!Ob1qsscOn?F;>r{m<~l)jB=a2>QLmwt4b~B&@=}>pWFi6E^qWH zoqEjXmO1s9{e-VgFW9G9E1k`xH_=t8;EG>TbvET`&e#k*$fP(dOxHg1!1pr3mXl9S z{4HK3Ou!x^RWaO#1@EkCd91}cq497eYU`Ab;FQo-h zJ;tqBl?APT=%SgQ1!tYqxI=en(<;dY!=N!096k2p5a^T-*)$k52<;Myc!J3jZR5Xu zIO#vXxjh0-U_!5v@SrP{k^q(3w_Sc*u;a@74)I4y9p?w+XFkte8G zMAiuvvyoFJ$iaj_fyy=@$_XWqVwlXFlSpU@pDSJel8MqeE7OSKB3nnU%!yj6H3ix3 z4)tsKDt_Cu|@mL3eI_FJJp!B&TWg9 z*ClIz#_QWBgBT)Y?4^t5%SgN<73Js%1pOFGn00?wA6IN!v08Fyt?}y}l4~IZIyUfh>qobC# zHkF0It3EI4Hu|XE@X?JeGCO+$aLzj?^yv$q=bk;c6t!ne$KIB3qa*3)uC%n+ZKz1# zp^VfJCD{+Hc4`CUHG@7T|2Rs>D3lmrd4$b>Miqiwrz%mOM2TuaeA)Sd$~x^z0oEM| z&LE-D*D&)%YJs#|ehaZwu_8t5BQ$F~)M+}>B}=AKEnOTmv-PoP-B}7kQ+2fd9b)=n zqitue-JAK{Dw;-k;3u4T94sxGXdSrDjvY!}RN1eNrFjpIJ{@9SCxgvA9T;Ma6 zDj?*`kX|hm>p8t{v;sEsR4Ucrkv+~MZ5?09<9-iANG@5Plp8M8uXUp$4tS{i64%TBT%zF7~ijs7nN87y3R52p=OrM!(Xa7!#$s zh|T&ljTyYDGEhVjDhe=IMe&XzUVzeBVdTbe>fwnu7LM>saEw!!1S>QtyHdtb3~03V zDph^#eX-`@U^%qH9{#XxT z{hvri_ThIB z)j!6YVoMAlKD1A<67oZSF)N*!!#MLpmJaVk*`?V>PgHoMu(MR|jm}wQ^Qk$OKitZ; zr@M>fu(Mbn0IWq#Z?!fJk|{B8_qZJ*&xv(5z}oi2sgOB^(pzyTB6RY_H^ecQFWHpM2c{Pm&{r##1g=8(5aS5g0+X?-#sb0H9p;O5X6Jha=?+dqYY@#u{Zj zlQC#4uF?EQNdJtUR)a5L=5*;-@cZ=!UxCU9J+k0HBj4*Y&*woHGxRC{^!_hb(G`v> zqM3gI0~><`17rTb%`%HB$o+3;my4Ch<@=eCbww;KJTZXR2zk<)J@N46R^>seRB?oY z4pJ&;ZPLF->OI2*_IqHim0*WmQRJM3rc9GoH*q}OySoMWzwE%e@vS@>!uY4c6DH7! zT-R+Mlk_oC5)5i&OZS0f49l`&aggL~8y(Cze1}T&9gHSf! zb-Yk{VKk+1_xUHCcESDgj^@Lll;Hw)HkE!YzR$1j${zKbBh*xLrPA_Kw8Qll_8)O? zKGx~2WbS&SN{^+dJP{m(9yEJkh_q#Q^d}}bPisPs3B7&Ka2qQ?NRi4f(MfZsxe`Kd z7fq9**|r;1VIE-3f$bA6(7VLfT~mhVR!%_Ib<&qv_Nft-{LZ$NzjgkV0Y-eJJ2kSO zHx@PnK|Wntg@H^TUucGjI0gc9x7VToq$cKP2zOhnE>s7=01KqWtZctLJwvU^_{=yw z$6ThX(b=eLEjLHDNgo|T`e)Q`5;CQS{-Smb4hBZ|e?v{&-pSU;Ma9JkWc{BDS<%Yt zcJqSBeCKH^a3L8EQpya7gY|Kr4MU{Mr7CGi6sn%kj z<A zS*LvpH@<4Wy#~p$qYN2*ZM#?g$I`F9=K_sGJXz;Yw294W7rlN0Hb+EgyEtn#v=xaB zvfs#d@w)yp=1@OR*k*cc6DaEaLYweRDy=4)Ei-sDf2{w3_-8&WszD2;z=473V}gOv z{5SdVA2(oYS~{RFqx{jeP>rV`eSf8OrzbOUl!EZlD9feQDza!kN0rK@$JG9QxgE!t<74IN zs1oOR$zSHXa(z0#eCqP;YJb?4(E!^BjrD%!$Qcu1ZyCF0Wo&`lWa$5jlapdp3Yhk| z$(lJfT{-M;^bl&r3igs}-R!$SxisBsCLCF1VZ zL?Dv=VS%{WS5L>4&`}TRke{X=!^12Rw<`~Y{FuB)fiT0SyFp05dZZX}gK};QRwLcJ zfER-};IPslVAUXI=z@oCB$^Y1l`7)N5GFV~Y6w(w*{s|MlGXWQcib#KoE6^(^okjgt)79*E4It|LnsIaGWYBT0QMtz?p^D@`+-9w!n9a&T@wzSt)RC4FAv2$!6#nkg{_m({UQi)p#8&{#EAY!#D zsNH)#k+4w5{Hg?z1LrDIoV32k@>f1I$4GcBrvO~B2)7V6#{6E!Y{kQ%DH<(nr<7ap zvxJbaeySN68b^h3h|W}`X3?qq%)y;1JOSywhYUrS2h5aHIpGshIEoCdsaX?Yt$W}q z>?$3Eg38LGy|`*Pp}os+kLJ`EvP@2do0NQhqxJ0y!hSj{7bXJ`6H`CI*Jph59S=Y^ zYb`DD;gF-54}H!CN-S~2^;vRH#62Di@Cdm-iRe8h?>?rS%)lZS$oX@KXq{OEsi|B} zL#kX}TP{MvbJz_>oPDLzsUnzmDy5f82yew4GlzB&>5dR?iHCzTE13jwC-G|hrCJE< z1gn_XD`iD#CV(COXvY_7yZ3`G-cnD94;P)6s$Urg*VF@cyb~ys_AEC=Ya!eiaHv^g zNKdGC4R%ER?C*dO{^&az=>vMJ};N@_%( z&8O`*%W`4IHhu*%4;>-IVhEYYtJJqpD6zZ6ZsW1j;BptU?)ug3YRb3WQ$uWT7=s&a zWyB!=)V}*>?U!OLT173a*7hUO4zfLSvCO1u15mmFU&;#sxFx$5`5is5;=^u&$@pgq z&T^N*Go243I^f}^yy?Wq*IKiwodZ+lCtZwa8`&XbT2mF}M49A|_Nw30)>*qOqh9J& zw#UV8m(&$)c;FH7WNDJsKCp8H{b%|hBZ6Wi^E6LJAjRPbvU{-e$>E|f zv@?2u`KEADSlq<^UMq(DpQhtY0xwF=gxlN^S`%Lr6%vB+L+`kCYX%8Kyp&ZtUm^9m zLyQK|2-t6CXJsRnG@YcC%ZBRHlGw~|Z6FfY(olA76xO*|@2Yw221N<-dHubJcD z+A|^klCh0CeH_x)w?0PbwU1G?@!Ge#!!uh$nBq2bo){HKGeei@;Sf*)8BbQw_Nl&`nm;IP_vk{=BHzIIZBNP+Smxv3q& z%!zsGiua8iS9ETzdVZA|&tUYlH8ZypAeju9uAd3ETkkW*D|nGYFtv1_G&k-9@Z;t} zcfFGxrF(^0mp|8bv=_CuvrR4*6KbTQyQf;M6t9Z3Hubtu2kEDx$4<-MK-5rw0Ya^g4p1%g=nGa)z6kk2IaWNms{C{DT3 zNdDc>ZMFRW)ZV?7{%4!T0o)aeySWx`sCWRlu5?LRk(*6KFeeyU1rR5tfvscrpzj1f3OR2Sz9SgS5^t3B7tO4z z3QJggAt=@6Hp+1z&)u_3GDP@Qzq-LuwL`H7*9g7HrSOB`XNa>LnD#@pT0HR=mH0G$`Uh=0hm$SC^~=6vfG)yN9isy*b}&CHl3HFDN;BkY!^ekx1Kv? zU6c7GcaHhA8mENaD$tVIk_+72(}l)PzseCDLNggK>GsNXCVvBIA4+w5X?e`y|A<(v z^Q9X_qC`Iw{$u*qC06|TFY3-L&lS@0ui9sV`Zpf!|8z}wwaTV^9~1Tm{0QXxmroBU z#PG;1V_8gJR77Z(c@G|QE%6q&Q*DUaqhO>R5uAvywA;;X8R zc4c#y6nw`^aG>a1IF;U4$|Z+Gdj9<-_Lyj_B*3$kC}@sBZj?>+4HG8+H*Ygoz|xOB zYaQf;WP9P%=c8-W06xq6qlBFnp3d=ZN1QJK;6>Hy!iqr&y7r@L+$k8w2XPndMF}Di zipf|@aHteOav5hL%07Kw=r-BBig?Xt@5w8X8kv~ zsTw(%o4Szw{UmD-`mf^8$qCc{Fl$4iz3yT9@gYlvpyMgdCG{G6(%*}kaC#HVK=5BXGv__i2LD^u% z4itEo% zG`93+C}U723~}JrqYtHxr#d><0V|IXkSX-T&}AB6%pcQ+Gq~@F?37qWN{bKlHXl-1 z#As*&XC!=?2ghFcUO1^p@m56_V%jc{=wqcqv~(6-B_EzwW0L|qcjESq$b*CTA`SE7 zt7a|Zt5~4)=C`k2Qy`7bALKrL1SnO70Fhx97XlfoGphVDquAZY9}j*;uKeu%M*#zg z5}^tz0otO2wx4`RAKkn@{NHI*RmIZpNh=GK*D#cLE^uGQHS?Q=IWvFLTv!ijFa^rx zVSAyKi8}{um`hd9X_M;hkUM$EYg3Bm?(ypH;%ogZ;XTxXIgmOqy(MFzb*b4EPN^8}6raXOMi zs2>^Sz!?lSLvEE?h>1pqQ#BeT6+Q4V6BP;D;wFF1`vx;P(oUX!&IT*QOky{?!r}Yn zpSgEcnGZ^Z_{+J!u8``##l8O^oT{8Xo*FvezP$p4d?IR@%vuS#qWPSQ#S29-+X@3> znyOU+d_(4nf>FUu6gz9o+~)u|nRv3G@E#rwW*7mF+oo&i%C~_o#+Xfmjb~afk9HaYbLZ5&OTx>u#F5Tm6UldN46V3ftq=@IbuoP$? z(8GSpb_=P%jA4~$4(wSCK?uo$qUD=DS?5W}g{!X6n=`$@O8sL;4aVA=I$wQXU;AWTM7)mSIb7R{X-0vH`Ps@O?zN3kyU%Kt*MbGY4 zuQ9{x0%zHxhrCyHZ)xKaM9 z#~PeH!HP$tqXj72oX49n6?#};GIEyl-FF6anV?13bj2n9hc?9Vb-cgj1U4|n95At` z1u?xFp|!YJ!QDnqcvfz>08n9a_tIH>X5PE&8ysBAHQyAcNO7A=1Sa=Tg$iF zpC@oH^(p`}mS&`^I?2SC9-c8VAa6!O#p;-pew37cGUlyrM!?3apVumA@cAtkZmjZ1 z&*DfqD$0{sd`UMZp0%D#bWyvNr#RGQGw_M_QPXw@|3b zHOXM)ZI69?zdPIG6Wbpow%b^?Ed{o*>4iIllxte0j!^4oL`Eg|D?`{U3B)*z#6^=q z7uE*jJ}oWg!>p<_7kzcvj&HOSx=9!+45L;k6mtEGsA_b5P;^M5byRnHo_8`P{6whK zBZC45enUe2hJw+O+VBn>h<{YzeA8QF1D!3e4WzG4I}5;$=Xc(uuPZ&|zAzN^A|>rC z--Lkc$_9R_2W$`Mz&o5aqCXpuKiiVGW`SF4k$XUCpc|61x0KNK;B=DitKs8y;%9H| zqgVW^AShJi2fF?h1Rl`;P7wSbN}3O&g3xX7n2-D8e}O zcgvC{_gYC&Y2zZy^$_LlKThZmuq|?jE$b1py*N!h`H)c_-<^LzfXN$e`w>96!C}Ym ze2oNwPfHvvt*k7x|{Hfh;ig{@5GoO)O&eLVVCGYj16D}m)a=c&#AH3owY^RnZ}H8NEsjy3 zs!s=l9p-O0W`;zW!0i#39JkW<6W-HuM}iw3Rd0OmVY(b^`_`Xj2pZ9`lmmPSlgOX7 z>mTK2{W@p50H!W`2YP~Bp5?E^Aty#|X!v$eI*CRP?wRXaZJ*6l#N6;?bAfE5{ zWk8n2hT@F5RZ(ax)gkO5$v0&v1_tQ%xkw0#I@fo>yjdAuOp;WR2E*8%F0RB`UX!(c z^v2^xlB@L}%#GD-;+HC!5?pnc*X0h(>QOxd-`;Ocj7%lqC;se6>wE=d%apDYHX~+@ zDHsl*vVC_Yz(Ln|G70lc<%GtXw~jY9W~?;6*h!-S`r{vqJSO~%AO#)P^FPg_ayiuT zP5EzoO1h?`qXOyU3xR-Q;n#6Oa5+83ZrT!;YhDl`D)61>tw7Hj5?1w_*O?l)jH2A} z_$l4nQj>9VQgVW_0!}b^w2P|08i5vVwH_li9=T~_5gS(W{pK9uy1_pq*6b=Fw)ht* zyuYZC|KAYPFtV{W{ST1DV!Pxan302qcbzB%;?RpqsUleAuU5#zKVgY_0>n|(MC&1dy0~PiJhM4#?eswNY6lMA6huYoJ`T7IG ze&_z}T#o6$9wx_y(;FvzcO(soe{Ppe6-Dunziq<)S8g!<`*x96P?i&tmC_db*9D18 zpd%_kP9$FnPEmVa*DpgIoKP@~sz`Z3w}^rU)n^STv$yk|ewg7x;+lXL0#z9H0pgiz zz($o_SqUY9&wR?mEXLi<_v4Qvydgp?tEM=AG&;QHtvY&Fabekrt?A`SYb7Y!X!5s@ zgRs}eQ8#s9JQvPbzilH!m!e0$)>ZCv0I}PQiDXxu-mr6DD&WS+G*_r{oY+U#f-C1l zG!z2m{-vi_vWDFD^75`n>75Q6Z5S}P6h!1Wez-MqHllA5>yE$s6;J3};4vUQCkkBW zH?YF+6w!So?I!V1=m&-ygK^|h^buaAz;Zt(fl*xtna>}m0oJ@cD zl|96zA0hkNM4=O;`CiG}A>ENwvT3~9nbB}dWxPYP%Wh1BLW$(@NbvjK{D{`rU;*tD zTJGF8poOPUsvw+eF`UBuo;A6&UNkdZknnuv8=VoJ0xU=~Z)jA@3r4GO%(Umw*`m9-+bSl(PgMpUQGhmY!bR zWVHtc+6yj2qImGfHeiA#>d_1%hp8^ zhk&_n=jY}Vm>Y;Y0vbPxBpB;}lwgn;KgO6KMijX}QmHd2hbm?-t%xOIowm&f<$m7- zn^7X1`5Ts28y{6FwVNwX8Yf?uBcxtMYtM9j*zj0(IFIv7U^qndZ^oHt zd8I)k4dE+`MQ>Bdr9Qmhi?hpg(%V$sU`{MqPvLM-W{kmeGx!v=r34AYp57g1bh| zscu6I$sZksNTyd_6Ym%BgQ zkHCt`8*Y+Vej7%Im4D80|0EKjv$AwqU=BmOE{N0&iFY@dvB^d0&t^NYn|ZJmYb=hS zSD``JtjpVV8v|H*0OV+DxKsNW7+7p4*t2mW`hosR7*L3y)-q#V5v2&Zo;gL~ z%n*x%ZgAwctSvDm94=Iav-Lq>WV z-ld>os#Z{yR6+74=2-Npo3xu@K`HyB{>So0oKa?BiHk?|Y1Y|f7Cx(9p*BBxd8+2Fs0RxL<({4h6^dazDPGj)LX`ulV=8~)&QO|$V^KStBez_e zS^K?Hca8yb%7j=o3Uz6{L)X{bZ8{+wBVEAoo}-k(PXfmx>w{G@8AGEzHu~W}XdGxV z$~tw6iC_2O2Fia$H>n@m_PHr5B-986{P@bbJW1#lU8=UtADMAJvj))!yAkZf>M);} zqF+Uf%OuFyP&NoRohWW#J(c*q2?WDzeQ>HcIHjUs#Ub3`ISGjhIr*6NxUz z`-NB0J;%r#M zds@DVpDNnzShp?WtMCUdEupsus{SCYa5r*zQ{WW#$9~{|z=gtVm8{F=}^VU$#YqYI_X%D<# zJ2bw7JkN+%d+y$T0@uWUhS>9WNKpodjoJB8nyJFXNk)Tmi(%-W(WVU<*VPJTVInKX zl=-Rn%6&Z4Q^FUV^-swcr6O!8aAyWvG>}nUPbe@%MXP#!Ib^~TU^+)~hrf6KRHhkH z617buN<&=f|5Wl#&Vb1TnjyBj)E)lIwh^(a@ET@tFff6?>Xq@|57dgvVk%i?DU z6J_lGru^a0%v2Q>i_^fTenFZ2mIZW288tXDAsT6w1;GlZbqbliz2D;Ju4>(AFs;aN zWUY7k$e?8_kvS2%)eat>yY=+Xn9ui*8-yN;oYlIUk-mMBoRty7(LN^>1>1vq6A(Nt zrZlE5LM0%W-r&_NlUT z!_-AuJd^Afn*VKFTkbT*eM7wqD@Me#{Hp6F39U*4Avj#o(I?;xE#+aJIIj zVS*{T_!|iOVc5y&Ii1w3Mme&Me3DJn+K<+imrvI1Fy$~S&e4;Dmf6Y z22NI_^H~K-bNiy;eV8tvZFu)hvI&)1Ytk67$Yy6iELB%RDpW?|{`IJFzx2g+V8k^f zInsD*Tvc&)>wH)r5}$;z^nkTID^~k~VQ_1J9@>3x+&GP3F;N?&t0?U%Z00>F;=aI? zQAF1v$6G4iT;5otD06&DE@$Z)ZAKVP*HZJfr+bzx5a$&WbsuknVk#V>2K2?zi(yY3 zw=)OYyum=6#66UR^*EkP5%&dk)nxil_{6TRo8QJ2O5Y#kUVh3Aeg*HaIDsr$fMGQ1 z*CDvZTB=YUQ1K6mn{&wGV+YQg_RzP{XD}qRN|EiC1LRi&WP!ndDV$5ZAvOj3S8clf z^}qE0efIqa_f+H*(3H^mYUyQlN?;E~ZV)hnTE3Bn6|@v+M)azZHTmz@QGs}X6Kt$1 zqzoIa%oKJT*gyR7u=XTiGq9KcQ0@EFf~bo{Ij%O{xA~5@ye_?deR_Yw8R9?ng&7tg zYB1phL{)mX4W&|Fc5H>Y_kQ&B5#ZO@>MsTb`5`MJnbDkXu99R|>_t4RA@Nvq&mc!s37Yb$03eKP{lmbX z+)k&X<0ipfhJCQa`o))sbMk(}0zb4ei7We?gN|&47EQsWO`$hlm8@?u-72Uym z51-DfK7=4RElBqN3MZgvqtZ!KYRQKXz61`gS<1~ec9Zr_4iFlK&DjTRKB~V^w-6yO zaaCmQg0He%s7(u2&j~d!phBQMP&eJBr3`313q*kBw5kCO!XVWWFd4t>UkyMgeBWX6 z*Ks3eW@G8B0>Lh08;5xTR0u_i#*j^(gJ(*i6Es}O;&G({(905{zLW7Ug?X!l-Y>=# zHbYyDKve&-jp%e?+uUNGr4M8NvbXbvnI-Q6rmvF6;w_-3WoNsvRe?Aa>H^3e)R5&!~OZ1yEuRidi_Ur1g*IwQ58@F=eD;q>z%3j z@p0{yIT*(^RUj1loMe6)g}u_e4uy2a#?nztcn3uaPRhj;kAY`@3r~wFuuj6qv&nL~ zSW%a%V~dZ#Ib=mBk@#T)!F#t73vgp)o7-D9&i^sd;@#_BP)LZ>VaJ#!*-g&Jx#BKj zaCc`ImCKZ*P5QLr3a$ajB3KRY+-;c-^d$wDK1UJH$19!O*cxD&Y`6C6oV6|6)SlBs zumxd_gfl|h)`T?J7uXmN3PY(O;ON#X_GbjYdGyqIw8aI7a@!JE187~$&A*#Vh+E-P zo1;b#v#3tVZf+TZ1umiogg*3S%RUDYbE2(WM7Ne=kA2Qg1ohW3$-IN+!kuLaJA{f% zr5D$P&J$cR(q<1Si*(;5BB=Yj88-}HZRF^0tSUPO8Jnh0$DCNcn zoS^u0E|doP)cULk_`k^$Uf<)btj11Y4e+0%eZu#ze8BEMBvFJ@m@SZHWX&n4<_x)N z4?@CIfs*S21Wsim6I zjk*y{HdWnpfBvOhf$eRgcfemYfCL8yM*ZI-(0{tNbrn2Q^iLlXXH)uACuX+tl#;X{ z={2izvallRB#Tx_5~HJN(o1YuJfJb; z>O-&-W;X~J6; zLw}kPErV_*D8G?c@a5A8*Clj{gp95RwE zP^-#5T7hT6*320Sqe(#AIGI3EPWyCl({4o#^`bW(=?LFW%2HGa(;+jRnL?aQH(X7g znmr)yHleag7uzQdpnUQlvo@uY(U(Qm_!hG}He2W@;xvff-T=5HABX0D{^6iP@E|>y zG#V?D%pM}BUyDcXsk*ypy~Zc#(@8?IHcM=bssf;NE98Fh)*E2E)khcY^e+g*Arsx$ zIgpb#<7x}nA=&C%*PjTFV`3}_YJg2ogs%XYBRQtvFyOlmFOY{i;I~PBc)gpj=<=(} zQ9r2Z`^8vrv|R04dK$;~N>GSNRjVYg6)=|?s7h5*+`7y)(P%YaYGas+lvD8{R!5|( zFXHXDr9%xSOlGK(z+B8yUVs)B`vwjMU!;+`N1RSQ4KC(t0D zAU*GO9rtes@R4l=mxe=2LM$lg%MwfKZp?~c$*=l)!xGDO1Kn|_SJwD>W#V;DDD*dc zG5fUkNZbyb4+>$J6R0`fve~+tx^e!1*Lzq%AW9Kay+bY^pTNW8A$JG9ec`o6*1%h- zu(q~6XPk=~7TM*>e=l=82Cez(JSb@Vnqdg~)fakxO}2Rvz=ZV&wcFLB?b^?|yNHKw z#rjVX51|#-QLD-{H@MI=G%n}2N1sXeHKY|U$Js?OjilNK=uO>7aDnEKDZNw3FDHlI z^A$ZyEtdjKoKtA8DC96y%J610lJm!8liBlZZc~OabELCg-Z=@n;zW~KUua};5k`da zQ7zcITrza8b~pgIG86z%K(D`;M)@HfWgwiVx_~!PjT=J#{)E3!A@gBjVmdUV3&3MEw^;jE*sP2C z%wXdMCABt5^*-h!O`5j#?YS{(xmmxFz7zb9l0oR}R z+P)NQsV<`z|JJfdQBsAic1Mmt49bq$S!bAlAQBL1_Lhyu9f(Pk&T^93pTn!mX+4J& zOq9_)H7dz8@R$iGH;*}fwR_GY*01@^V!^&zIEb_UFsSabf*};@&Np^obLwE93RBZ( zKAHwJqgoU39iWeW^Rbp`AvK?I2wtv)@dxCvn5?nDRlrI%UGn7McliDy@ALnCsyXL4EeK}{fuqZ!*c;*h<{>DGWsU1mHddi&q*=VL zlen+L0xzLt5nVVd37!A29GzwjFl5T;W(>#}9tJU+jmS5*bcpN*0Tw^^7mb)Fn zA_meG2pt)fBL`e(q+3iA ze`a&^@=m4ao9b=!H(Mj9Ksziiv_V^>@+j8_v@54i6XpZ_<&1xzGFm>qtX0CvqRPtV z%QJEL6P5EtTeDTd9n=Sz-jY}Cqr707g#o$p-Q&qS1Q$JT8%N^lvn67u3xPEW(J1?_ zx43q3T{1snoT!5vsOMPf-wUo0{+U-2yL7E+e-orXEEpKu|1+=tGgs=V;HhEzeqEgm zsRJ(#;-D|9MnNkpx`#;mhB`kd4xx$)E}Tr*hx#{Hrf;I@+_$h!c^n3l?hhyL16a3a z5nMVQhID@T{}T6}wkt}8mayXRn)2e`I`)}zp6clM_4zVh3l>t3D#lYIdIMf#)rvXj z8YRjc!Kpp#&uQvR7XcX3xxu6;kleA=k{u(d+$BKdLgd8m$vd`PcW}mh;_U~)#%8uq zQ(zAz1i!t5a%vFfrLklcOyFa5Tc%F)`uODO4>7ig>2;?BE2}oTpI2qDW8kL-!o^WGO|0 zbjLO-<}qC;ReG6QTJ_|xg00uoZqL5&sd4B!Zzj>6vvgIN(#vCEa>yEauCVT^m&oMBW8g{S5bv+>}V0V`{{foXVb zXCkBZT@tdI>yKbgFa;&C+7Q(DpG_ivv`^TDUc_8Eo0sxuphTge86Q3%TO{0InQ02y zAku=xR~JQ=1euV`9hQc}zr{EQkyqcHJeW(&gkp_;k~cgIY2q^`y7tC;$1~{*2{co4 zWEQ96K3v^LQ^h6)rrpxN!h8pfb@?u!eLvM$&oZxw&`5-}h0PeZ+x@>h7!j}v~S5p>EI(s#3q zs)yAu#y|cng-Z3A>IaH7qjv9Cf~}9LK}CZlYRUH_0NM00p2H2 z^{OciQ7(EkFEZJ2@12wgv7~| zrn-tVVu0hqi21_d4NE8Qk^i+Kt+-(l-eOg)M@w-}Q#)Sb4)-$RdiGLL^W(=K02;^e z4_*hIkW~mICzQ)n+hMU8EM}UEQazAIwYLF7+`jREerhx@Mf;^{*nIS7Hb3GSw@3d4(!Rb=a@H{;#+l-z=ZZMQ9r>ib4m=TD}KgKTe9+} z+AI+uYMm5idF*uXWD^ZPThMB~w>!P*wDKc;aeD>XUC#mV{eKxHu>S!O*#GZA|0jrC zoQ&+8&Fr0Q8UJOwM@c0mKQtJa)7O8^9RKwXX;B3^Wm9KY8y7NBdyuQGshx|ktEG*} zf38CpYpgq?{ljHtHd)Tu&LdRoYJX{CD-vvl6P9Vd7Y?*+Ytls+;aDxv;mEA(@W;IN z{h@B)Ju8umE-q#665^OO>*z6eWA89TnLX=1?Ckb)oz0f|jEU>T?)d2~`!4&gnD_PV zJQVD4ZClhZqOv>V`3Ezgf!U1@dK(17}bw6iEsTYY{e%9y?S)U`fJcdB{cWh*ZDgB)?ug z-6HBr;#lVDfD1+LdTO2AU>(Js8G~cN=fO43BF)+361*RSKjyf)Y==ND!|f{$d$kqk zVw7JinWC+N<n?@X8sOwq5)afW z*$ZYN$-@41K#)Q~5{4QUzQUN&>;jdpqk=D9PzAX8}{LTtHlxEOtT%c zM?zl{@BhcxJBC-nY}>-=*tTukwr$(ClTKD_+qP|XY};1HNq27VefK%vec!#$bG|>d zRz0hJER0!Wj+(Q^5{TvG@%zYQl8j;cu0~^Em)ru-);)nyqXrwt-4F~gPHTrH|k!Y%KL7q zwvO1HR4_^Kht~3zl`-`-<7DxJ`&@j3m(jICe!Xrv{WZ}(A3H=#2_R$xfnV{`y59sv zKrq0kajXJ(xW`8=-GiUW-t|##eSwhjzN2CwAcjNW6MF96?+CR*2?_c})W5<$9k{SA za>`#a7sNAgH$?StJ4g^&x(N0XMGox<`z?&Pb{gTR@w|8z*z`r~S1!!Q#Me9{Y_@>-iCN$Y zwG1<`oCF@8hlngtr2eUlo_=-DCy_^3gIhX_MBuie1>!#X9TipxMv3^!LD40Ff-K|| zabJ_`fonIjd= zjW$NMh@Y6LGDxs8$we_a#7p4i{{F*Rc@hCWp90AbtRBIlK$eRUCS&^3GXIxXg+(lW zwafciB5kSOpz%$_gbln0xf`dvZgdcQFFJ6%2WMh$72d+hW^`BjIU;MDJP{GHMR(&1 z!5UPT^n)9(JSp)+>+PN;j0ESwWG307e&U&gF(-C)=Nqyazu}Ir0H<7ES>Y^ds;-C! zO0s5)(2(2*6mM@S;d8a;aPXez=yp*T%i1F>(%eHx84|OUh>u3PV;V5baeUJqTqyCL2{x!xYT@fmEoQ-s{nCmb=wp}FKxf0hWI6dtWqr_^?*kRiIzxCZ%K!8lc4^Zakc zzn;^O^+k5be&<#8l1e~&_-r_v3R6M<4nNlQj^ z+2$t$M6AMt1da1YpzNrhjO!tqTzjI-SE-IVtqJng)HWdY*i(=Z<RCv8him^4pzo;@~U0M$7k;&P#m(3&twBTG|;W~^9>YENa`9)+lQoLMPPSF9=S~{p9hYE~Ka@w)S z3QWxu@@E87v3CYHw|>)E3|zyyRT87Z{fAA`o<%U zZ?K)ouKKSfK*J34SvyAx9a@ico3c8&6B$Tj&;5Q~hFSQ#>@150v-TDvsSX{nk?{== z@Gnt`unswqj9$Q8$K1WtN2p#SP#)s1yj?`j$3B2u(U`{7gClj1GfGAg&2rJ^E2UwW zvYaCLmN4iI?d_PHnxfdpY?jdbpY?o`TC?q98E7u4!nXYOhxyJNj!-qQ4J!Lqx}?)( z3%eY1!BOBR4TgK)@R^%)mPtW4oF)aaS1WAC9!pD(cp{4cVjwb_>PCHxcVz07^^?tT zrgxGSFI3fK-N^Zd8ykh_)vn*f&EC)lO=Lc!Ct7g^$TxNvQt<8 zBoUaxxsz1aR(iJ_Y9r-pe7Z#xH1fANMH*4uvdZbE*pM3xi>qzrBye{|jkiFwZ_ou4 z_lzbG;oYLF8NNYh{1?ATzawr~#*qj&kQQF?=$h^pCD|Q9Z?~le=jWgUSHNgM1tSGr z7ON=6ovW%h9Pu~vi7p7eg0S*ZuqYbBJ(;DG8$&&V5MN0wHRVwwKDqjb-1PISgLfgt zUlxeDXaU}{K8svqpRYv>d_zYmeuXh&!ru)jOKpfr1iT{35q(CT+>iICj1$p^+%4~H za)8W!r>4T!8-}{Fkbc2vt~a3C-if6cMYjhoundK7hQQ#W586zOz+P8O>L`68AK=OghE z+b3XF?K(>#m2J?Rzu-iGYhz7A2vb6qLY$fL2vnL?9yDc*#*&P<*hy`uZ)-%-_zOxw zTQ{pOGqWXQC|cU@X99!LgJR62cH3g_V$F<<$5bNi^`UJa87PvBy4Wr|t*NFmDri-| zoO_nF%uU4RKV6Q015yT1qy`%zxjV4f(}2OCh!fk_dj|Wp_n#8dw05bCe=ieH-9eLZ z5g9DiDvK%9WTF{o4_29Gf?3<1^Tf-aS?iupgrrdE$&pLWSskUO1-e?WSVRTHEE!Sm zl*=`G|M)4>RIRB}u9<8_Hc8W$P}N{}f|KD%o1Vy`rCe=uNHi;|-g=@`2yAA`QEaLz z9i094UUHHWjju~>%-i6{M+D55E^A{{qH`QV{iEzkpImK_pH*fpbQ>AiGI=h95BZsx zvi{}Ej9157Z;()4it~FDemBuRbF4I`U=xG}X?H|Xa^PFF^&+bmKxOiK8)w#F)MgT zFr%vsUa>EGBp~N4z&%uGRaf&jiE}sV6?j_FMU)WKv z_cKX)q)n^9jkvp>=mNiZPpLvL5d6M9Tbpjop1jNho@N2>n$+WVl4GF4VNG*gqpqS^ zWT+%zaHjp9q!?(;8|w{um7fE`b1qRL>eJWYkWZkN(oj0cY+gy1*+VLlB5~-yp$AB^ z4=nBH6&2hH{tjW$?*&7zkG2)$lYYZnAb7|N?M2yXrRftqsz+IPPpz9?uuO(}2+gjH zWjD$u?45HXKmwb02qdMJal1#DTigN9k2|OmBJB8W4zCESG^4~fNL+l7@Rh0TUXy9M zU*qVVmg~M{x_p*-qKX6@imo};l3fAYxtUjlhMM~)*FI4cJ-5IYT{n^Q0>&$Ntj`H* zrkKF=jL%uYk0-JXFAj)`7kGA94!V3z!`$AFlM5JC4lWGEi+;W29NVp?Kxc@VDSlr= zZezs@Vh3!8qb(~jsFj;vIhv@C-n_&R!F@(<(Rn=W)4Z3f+-*c;;C6fr7T|IO^z>-I9jz8T1WyQ$#LWd z?t{ReB3)sQFz+PPxaFu|DtR`S+=Xh{uvt0?E-YPS2jE0N|15vHO^4eaQ7u?pV z{RUqCqQ_ySiAR%iq-*xWmQ<&KJcG$sA(6NldwP*&2N(IHY!uEIq9Lqz&pHcZS2>g+ zR_06EFW^?Jw{yZ8Y}*nqo@uwc-w=OgCjPy!u{U5KpdqloU!nXfGpRVZIh&aM_tA&4 znbCire59yuDlaOc>QVH7E-XlQ==4{H+fl}Bi6NE*vT)K(X@&)j&5dH0%5h6w^q0MY z@%~gcHx+*zfe?`1rsxS)8%w)#dp5gnQSg|3A;{wgNgs+0VLTv4=8GqTOh;m(8GsNI zhE(9pJhapw4h|QCLQW+Gt*12>8&*N8g8l8bJ(mLquE6Wmzqic{gDt{YgtMXF;#;ld zuzZN@MU2H#mkO^cb9xF`yzE}J1I)E%)TOcwc@njR5>`nK?cgx_sV3|qVgkL8IDLBUGq3U za~^H4w*JsxsRM-9*(WWLMOol21aV!z6eh_=)D=?nij>_hV)SZvf-~B-Nrnu=7D_1# zO;E8fA)U@^;B{+fxU#smu@j29y-R*Z!L)@bIK2ryk_<8~Yvpe8Zn5O(wkR{vNzgRE zGmU?UpVN*~8OtTO%eFM9Z_CD3xKAw)M-&m~G8O;6$8lUMXfJ3OLK((h`R*ATL#V$; zCXoe863~tYnAaI<78WXQ7zwpwnfkqI&M4dbbGlMwgY#!^6fQo&g{^n`H0ve#*G^bL zUpd#bx!kTJ@4O$u=hF_WU$+kMZYBT0p*C!J<@Aa`PE}^)BASSHG+4Nm}iCWPuP!9Syb0hy7@>OtPpwRn68R!*7 zw<+KZx0=ET)5H|(hFBUa+weOin7$L(KIK72$V=zQ!KvC{{v@OBtTm$}Yb;cx0`hYr zn(m4Z+zR#^ujwL-!Tv{hXa>XG^4=_Y9}yvi4dN_P;^j;(w)ZU3v_6reXoBGbvfrv5 z6UH!&F*cM3d95@#s1SgX6bap&iLe+E?SzqzmV}5_7(KO~xY}4n(<5cFm@FEpbNFMJ zum}O+ZZ3y>JCi(yiuWR&T=3rN1s~re*)~KGQp$K=!5NuKvJdF5k+eQc8Jhh^v?2Uk z`RPAK(m$R`**m(q{@?k3i8eilMe{#7pD)+Fu6Aa#Z*&}RC^^+qKYM4)g0eDqf6)( zo9~QEY|iS}?_ZGpT(lLK{jT8H{1{^x(7mb&{msEq(B`U?>F8r*XjD_sR`LVg!8EWL zm3mIssVe)h9gWvZk584`oOKLqDeB*KcErG2>^t>0Ey}y?eJ#%DW~(pF7Lxdyj8|xf zY`9GM(U@js0nVwmlPFXcRFrHc+NB(m^$fdJ)cDKHdi(V#uo2AJl<|HxkX9%2YXY(~^eP6}e`aXkTKlSzVEi zA)+Oa5m#K<0!QMfB|b1DlhBDuwu*Ry?ASN=py%uPyTeU0ux|}#k74``x9hFnA2zt_ zAVNIdMb z$2)3HBp?p~?RPYu-?zT}rbo?_sz~!(YKh;KRNw&gfEM&X+fj={3C%v?5?TmZZ8m_g zbr-$qP4s3}yhotRF|`le7|TX@!f_?DUJc{}h_1}i&tgw?Chgd=S`Y6poRfF}drcy= z(~a9SEmqnsS>HUux+t$wC1}su?32?7 zEytB-h~=E&NnB$SPf{O2ok!^Ei9cYNoQ9*4NPiKLJkN7QlJ@%x2HO!2^^V~`lQdpY zT&1yN#er~wN}e+=n>9`#HAYZh{;C=lOYtn9U?`yOQ%>>mtHe#wi%F=S-(EH4@xv!M z=adK4(@*paw7pjt))y?%`TT}@|L9ZpBiYgD#f(e9jGai{jX8%V;4UFWhlO;~Y=B8q~ptdDGaT8d}Cy)v7 zn+xumRh+=E#328=-3j5qH=kfkA8B3wA*W|#uxDtOD>=wLUm!*Rm#lOkY?;#upN`*V z*)r8xg8J+NLG5lOzAW*2)Q1PrO%mSC>|qj+A}1$4-0w1p`aYPvg{O>U`aP4*s-vQP zW~bu6^X7wk_Bg^HMHl+ND7wEyx5m21KT8BwRtu&J3!#Ek$s@p4$l=Y6DbTLV#u%2C z1?_vR8Gwp&QhD;VPKUdrdpy4fG2dj8X5(2U-)|#_2Kl$1kFNyn+dM28rVHq?2)|N4 zwr@QGJU&Xj?q)f5fjPr%{B6g;1U4A;WU8Wgd1o6jx;^LPuw^0ckm(za%mlCrn=Ya; zqy$KdJ&W$vX&n~zbx*X8jb@@WJ}pO^F*1OJ(=FIyG_)9;{cT5B5$e1Pd=fCqamLAE zeny(hQaVe|gB2UesXYFU&Yq=l)erDC^mWyoM2i+}&8I+9HvCaiFtFp2gz_CYhQ#Fo zjVm{y#g*6StTL6K9`S0{+Dl|5nu<$B(U%d_8smgT3@1yX(VJU7*i&CW+yE1=0sgE| zLE~Y43Qc|EL>YStc3CsKUO}poQ2lu~UgSv&EevaD zO*$$p8w!EaPxP#q6yc!wtTE%-aWjWddxhpHi>ilT)p?zVK< za$d{tSR)Zyi`dRVaM)sr!A)fggWS!XD^ov;kSAI}yhbRg7wPqSVM2LU;N8{q6*{XN zea+>iG9@Z#@!lZarV4LmcqYXMbyDK)sP{XA>PS>IbZlX|wrF^od{rh>bXJzp?hxon zQ?d(`A(WaDu*w8LTLG)*xa>+SRp!xbn>ORTdlSo1db#fVt!wjoRb*M_(AMN?Z?eM# zi{#fgFjr}Ag1V?5S`DBOoCnCno|$36Aw6ppMA7h2AZNrMCDD%;o!#SB_Xm+7tM!EY zpoPfj_njdeccuM7WA&Au(`&@r0q8@>JA<3ZI|E&+I8`t)XkDb;VMIZGCCXV#523pB zRXEbtyk%$17SmFB{iSR_3HSX-NwW|4L876qz6=VI?}%!loB7@o`{_$N3^N(17!yQq zLks0k&4$L^#^kccLg@Lc)^26h(yMA_wkb(dRj8b~x;s&L=#`%<_TG=WnYox`Z_OKK zw+!HJzJ`r=6i>ov5^V7n9XktuYSTonZp*h6>o2)(y6r>|R@5VivGqEOuS|QCu^VV} z%x(O#g}Qw-!S|I4948@H|JL*4a^NT&7jXLM?%9(##{p!OQAH zqSOHEw5YnJP_&C0ApAw*8wt`3tz{j4DAlivCrS~-sELuow1zufy^N~`pdhv{iVVAu zbcMpP&pdk0lEkt6#9eNW)b@?$-V#LVrEFTb(zGI{QAmgpVRw>oPFI(ZEtQb_7_+tD zCze8+zPA6MDbLUcc(9`PfaF1(k}zT9u|I&lRz}a#9XMqjO`?w1$?5aZ>4s_WG@OxF z5iRh`!}7t4$SjB;n?E;CUu90ywsJGKBw*GQzRXGDeDQ&5o*9VeCr54H&3pDm?<1f# z5Hx@xgzqaPPvuQ&j^d^=@kn$Z9I=$4$X`G}#TDU2R|{sw(v!4DcTNDmhGxIF(6R|Z z@SdUeOJz3_sbyve+n7Q)IAo@KNnX{CH0Lb^{qY)>zNLyiLr+hZLSe5 zS`Z(;&;Xlp+3!7Ucs}&qz9AR$SL!;-`|SR|Df}jI}jq3cJl%W zBF<8#yDDk?&Iwz`2`z;?ggzfre>8-8+K{GW ziCfrkdC6EQH?5vd8`z#y8j;!87!a6*TBNG=sAKC$@Jo_AN-FrpaH88M7x!cn|GlFL zkEg#cwsq0v>g#WgqY}P5qDkL?fIfi#e&Of;BNR;)S=IlVhdh4Vhg-k8NQlg-6Agu8JIeX7$zZd6cMV^2p$O-@8^TDnUe%tz(aCSXHcagq0X8&6PR z66cwIE*02S?)jmo22|Vi3NrF6y%X5Y$J4n65BeC$ zqW!F*HYFf-cRrnD-n6THeuloGPm#d??DJG0HEOs$sfOVTcbd9vxIUb~_A$;IZxf6w zD9*Esq=V!((*(8QFWDI$*LNZKB5zm^!&^~*Y;ylS!mc+EHA`XrKFd@U=im@AC z-#arstM}F~3I9ouqO)d1G;8TTLbQ;kM2j#@*o=6uay|c+Fi<#^y~O+x+0^iV_lx<@ zzwdvmYYm%!cBG*v($W^t&A~j1U$KE&UX5srz)*w9$W?$F`~(XLtDl7g|~-V~xNst&+v+&=nf%P9#?#2F zF*%+G-u8rkYmTh1H5_BUU{7_K?xvPNv zq0k#^J~4H@790FgLhFW~g_ck=M1A&%Da*rePIsh>4a-L&)%vQ9>WZ2si}_AVf_NsE zk_5dG*{{Tsv+5`EhN{4#T{v&WlQM~!N>h;a3zpb!MO3MNY?J6T^W1Y`%Gu}`6pbbH z4Jv}r-NuWYj;`8l@i#Pqe5xbdW-84A zE^2~&rc3J032v>Fy7)z3IrFFW5>vqPFEoclU}xch@>^~$iU+pIZoCHFMZH33_xH;2 z80zd;2t+6YlMYJwAw0dRU)S^0BMivmSu{fKVm_76P;>#g#2^_n$H$(MkeH+T-T0#- zYej=lBrqJ&xV3=!nDF4U06S1u^+7v|6_ z%Z6whlO@eI(fzSPzNbtdCa*zVZZ%(*oXTI76(9OhZ_Rg!83!_A!>bLwyH4&J(|l_# zp<^ZQ*EIwTe3!K#N{osu?gm+_c%hrqw5w2cIjs_Y*e~;6yS9>>!W(RiS&mC>-x``d z?j;cC`VpeEcN(_5?Dp|!0Ehnk+rmIG-8WG+f)P|NbBG_fF+G!zTOxNRw!Cf7Zk;_9 zf4IwF7wr3>xvfZe6@ufk{qJaC`}jj{Iu0wJv=yDRVY{1qeE0=yq5ukyn8L8Cb`;|? zup>Q!_a9#2FW>al{I%wCEl9FaURTzro6mR9nyU$YHNc5mSBmfbLhggM%x&;>2^~g; zKB+XN{EM-@su147NWaRVy$E7!Nd(kme7_^SQILK$Q@@d1j>l<`?4F7AN)q z9nA07JhB&8H zkw-03L%}P9JC2|vPO_wTMsTKK%Z+d^T!r{wQX50f$4WzHN;#>K(c@?0eCMLc!fPZX%9pD9Xawhn>wn4< zpH-kgs%}zM6?EGM9DDs96`<`~e22h$PYUl#UkQ-WfQaC~s34cOE8lyJKW%Qu8PamL zp3*2VAX$Ge_77@|e+52nH)v#+gc5GhZ_SLHQr1RNWlx4gqrSpQoQ?`mb%Z~}*U;q$ z5h@T3-I;)wN)qVLmnhon7UlcN@IN=2A^c@acXPF}{eODQy#6dkT3Ylj`?HAb-^@+^ zxme28%=sU#bpL!bw*8l4ZeZLM4Y;tc6$@A1BN+NUqIGNzAhev4)hzBKZ!~X@ZFr!l(y= zBFYpJlMs{;1O=IarHLsR7!iaf+sIV^-3tD12Vs+1*Der$vY0E7|M*GejqJ=^9F0uO z{$iRQnlx#@D2NL9lG-ax%c_fY*7cb~2!nX0y!ZV`M-cO!!JC(B|LIgVZ>pH%=s80&c$J}Yu8}dV zTee(U1@83Sh>s&z90AjPdL}U7pmi2x)qfQSlEP}nhqT5~DeZcC#55#U>%!Z}Ma-BEF85054S0&{h>5lJX^>XdJ1ImumOIP3@U1vN-^Y(;w3(=tG^U=FsZiGwXOml#G=p3Z|xoKe98+7%2I*x4g($&3u< z;}Qi_dxTE>p;V*kNF9~V!Q%yHD0U4~WS#|PpYrITl>TV^3iirkd+equ+5|(m55-|` zfo+C^YNbH_l4VQ-BTR2LFph>Hh=&tH3{Ja(deHAx2&-ce+u{!r+l5+1GR0D|6v~p8 zsDQsADfZ(ju^#w8SvdVCBnkf+JdB)8|6g~Y6xDzIsWe7v?c|6v3TjRGoP7b<@GD^= z}!OAI=XowvH4G?z#X+<`!x0)V_0>(%&oPsAxVqubvl$S%F!;Sr(I9)Mgl~ z9HINj)ar~f=pHtSfiE+_7f8E?GiZrjt=U`}4yo-+!FovmPfKr?GwyZ8QIZ8j31JZm zdTUDw2$6$yeg_Qe(NSM5)sW+vTg<|X%vLc7t}(hvca)__Tn;}3;-nv*s%@C!ad-la z+1f4EG8(8DRrt{pS)Ss+x$mmTa31mp5zRDEENAjVgtgS^=9nLOAjW6Bd_0{57GYy^ zNw%5J11Y6y4-V^l0>_L(X?h?cIKoR@a0okLLi=I7D|1NzX`=6u#&zeX$G*_-@UOyty`+4s?a?$rb9ey= z&F8y_-XLTTPziTw;C@kgzNd>;Zia$m-B=K$GQB>A<0M{DtstW62lIZ-xJrc8b&9Ub zFMKVVhW2IfK`)Q+uY$h=dm;c7QxT!d>kQ75GymX!_1}DH z{}cYj>>ORa{>mRIsxk_jf{4G_gE-sw=kG3}j8&nb>VQfZz=+hsr6rX(i^U2#Oj;u< zdSb8O3co7Co|TK$t#7Xj()7JA1S+^MIR{9skT7nqu6%c|d|56X0{H#D)dMKFU60&! zMf8V+v7@*XH5cl$MD=y;z+z2M@BBtedG?#I0TTDZ)M1Zrz7Z>;2bp zmsJ=zE1uBC^M`zU?QUYZ%jqjH*90Ov8Xa%`AyIk*Zgzz!a(j*kl_|lIT4)t^U+K0j z7E6}YmYn)_G0hrta5I1Ep-clMG~z8;WH|;%t0R|Ho&s5u8rfK?%Fv!66Z;>9fG}9Y z^l3fiQ*9-xY)(D1^bXeKf|VTV6RY#5I_A3KaQ%O{h2(8k`V?W@HWr36V-7NYcaqnB zriQC(J#2R^W?`-B9h~H%oCE~T3Yvu$fv!`+J8pWqo@#EBNR#VPM!2UdC>p>MN z(tq*&5%+vS9f@hOOZE z0z}0wA|B__K-uEmf)t_A&*JQBW8jWvG`|h2bhBg(QyD_*8unZsu)7UQGJ6Iup5{rw zG)ETees&*aydP% zBNziJy;BSey63DVybg;7*kU+y8;{$x?}kF*VLx!&p|Q$Zr!O#0=Wlk?Z-H}!PBOk4 zuO}=YsE<@AU}*fdob@nqP+hF4aEb;n^^HZSCY{B9k7e zdY`D)((ynFMPPu+$|B?^BQ05r%jHwCi`(#+cqpYptNk1Gedbx^P6#|v66RYsvLEV)Rf}{aWDiP*NWJbOP=fAnpm~Sn zNW(zmM1SJ`l2>de%3v?d;wi(Qm;grPev}}%Uu5mEI7GgwtWy?8&ki`BbO9BD*{u zYgRm4NE;GP6pGs;ns>cn`#{rYDCkabBz=D~5mxtcB!vEhdzwGEXZv4q|KHQUZSpF+ z3X6)Uzi-qxYf@w2#4_^p%XJ`BeZjoqLrk3p!ZNV#&TG47Vr$tva(>hO2J5vZCPE^+ zUly3~wC8c`*F2bfyWe){z0F1JVpLA&wfMW!6+a=?yYN!N$k(v=!FqHST9u zG-KQWJdmW>fw#^Yf_GEA-*(Wv!!|iw6kKs`yRZ3NT;<~1GM;7W?}_QamOQ*B{*q1- z+JxT>CNg*dZs0j<3Gp4#;U^mLK6CE-QBw9mR4#VQyFiqn){{DhUD~O_=XI!t!eW!oW+zEOst@Ieb{q35}jhJgjc5T4nJ_yDMCVHRhVQz3`~?$ zmiTk}6++>s6e>kJktvha5Zo5C@$OHEqvvk1U zz?Fzc+nogi1XPL%1Vr+`f$Lw6ry4%KD$96Zxmj6T>^*dflw^KD#FAOX$?CMVBh;zE zPIf}d_@NcLi845nNr_v~Zk+`v1}=+C9HL9-*{&{X1z;Q672J7A9bq$VKAd74ZWqsQ zwjaLFVOJjViCM*RU2%EWKdo-LPCfi@Pk+GV32;N_LkCQbBKxvHwC(BmzS!~j*|!|x zZk6u&!oR_PT^;7#ZtVA8yZa*S&JOr*8I670`f-o2;e>Ic?ih!sau33DGvbH)Dbm}O z7vMj9PcS|}^!P9vhxQrro!}@hkNT{s2=v7a>PYO&xOY!IRT8Y>vPV*i-pRlbu zfTY5LQ4=R?wYimPYHJHMwpqjeC5)$vM$X+0b{%+NaicxeNPN-#8oGwLJamHwC6P0d zV-9~I`UcYKWFoMUmgLgAu(`z(N1daN=$@(3o&>Sl7ShAr3TYZr0@{NnVaV7e`fL{GR0m_ip>!*oOB z<&MJ#U%XC-Ft3q4IvFTQ6+-JJGgGE-hY^K_Fl2*>C1(rVZq=w0jf%=JRC6OPM*i0 zvq8rIBq-Z!c1{m0ygqdY zV5sE}Frf8S?`3*_OOMpu_hw%xTx^0kW(+^T-&iu?`~K#qeIukZ}p{ep5R+s-<#JJ7RLZGh=g>mFme><}uu z>y1RXvj7WFx+mg4$cw9(FZE=`T-t0Qd>fg=@%XST1|1{<6oS*CLgTm$C3B-C7rDg1 z``N2<#_9ajK*KQP5;-o0^ZDIQG;1YLkif&Wo}Te#P``+et=nH_x_3mXM$JDY4p@+y zFE5Lm7QzlYOo|`i>u7I?%f!mShg?GRJLn%1S}$HF2)k>@kvnc9FLZ#pB5$?Y9*~JZ zvaXY1AqFqnFS)&130_izVTL>iO;6hy@H9EDX(zR^AQW8*YxYd#2y`LpMz{ zG$}-vp69r_wYs<4%*&<7WBLIgZj2KiX}sr9(4W#dm+maeG)OE7YnE}qtfiUgM>~-L zASu2qj2?J0^@soI*v^6^8=ae)bWeM7R|vJ^pY?kD+4y5O_GcAn+*ZuAoK)QWZ7SIS zMnJj0BTIAvICP}vSn;lnSa%cBmGFj)Wj@O^)X(n3nJUoSVT%w=hS)k*D$8jS*i1;# zhD>>fL13I3x>c#ND4CnF$b&?>2Q{|FCc)ZTPEehotyKha`Js5)@&f{q@dnb@YRYm*-Ery@ zu8e(EN3W|3aAH%Aufog_ACOc;c*=}0gpBZs)MECHSbBjW@zX}Vu1M%OzhH8{*K?O` zDD=C-N*gB~C&v2<>YBPckwf
7cl`hMp^<@6p_(cD3D{Tbw9HCOR6dir6$ z>4Fcbp!Lax`U)J66b??~MJ4|00wGjTx(gG;S9(!c#pmu1?uhHOpb(o8ESjM7=wv={ zsttPOW?l2+wZqizXzEQ>`({3lSY6=!?sTmUJ>iX)4O!cPS?e+FDchuJj!Ov&WW z(192E;}**zRKy*@cqW1A-V@XP8FKjqY0BsqXB1rgZCqgn-Vio>h@35ES|ifyy2;w4 z{2n@czZ=O155g)^#=3|-NyCX$W~mftDBQd zFj7t1Tz!)E+hIeGvOOqec1xH!#kLRpmYNW#WCTXNpP}3v6&k|)#MfUv9vcFT1AoE9 zH3S@LS!Ys^0XRr$c2aFQ$*5i>Cq@N|aee74WD`pn)iSN+vyxctyeS=-e|=J6G-b`P7o-p zO;5$o$(w%9Yb4@giu5d$3{@=FN+(Av(4-y(t^iF@wwn0Vwwa7A}62_>!N6&ucQLSka+6R)oeP*O^TEu0}&l95!M zE-pNiu+ml4(_LytQffaJiq%ZkVtH0JmyVw6vEkUoXcNJ1xnhr9|(bn+NS0n3_^&qN8%5UBU-vbO24U zvqg-8*uxc4+a#=n=&yENH7}q#v`hMMYV`n0B^lJLRp{MwjP(A1X#PSZdn9330^>L! zZ`g@;v2s(^Q&T3!H+D4+--{%%F6<&&;T3CrKRSDa9z zM92#)N0pPV#8e^{pudKei0wMLfsP4Co)@hUF6=}8%!_W)Aw-kuJ~FpAx9I)lZvGq_ zK=28~7%GNGmF`5EuMVROmQ_;JNn?l)?uCulu>A;T z_TV}5&Ueyn2R#*Yjafuu$L%waX8^mcia2uAWf-xh=U@O`q_ch6!)xYb#@wFmj@H5@ zw!m)3x!N$Ofad4z!y2{->1`^QNTns$ftj0yh^NCVfQ~dKsi8dN8BcJ8;l z{kou$Br2|ir&rcTZ~n-B;icV4>*URhYpr@gdv+wg)kH>8HBF>j7lr3r%blK2+8qyz zi5#m2d#e~#{$72#9MdEFHwK29ZclZZ2x&pKLdaiJcWk_*KFc-UWcOQ%)ov|MA)xYm z)aEE>;&Ffu(3AV{f>U5kz_*bRXBRMwv`zI6p>nGHQ(rlZs#HC6{O=j3GnR(QXP!Zf zsNaUv&PRP#Sww3NpbXg8Fr^K@#hu5CG>HQ%+^ITWnPGl9U|FfpU_?oKPI#%sBs>+& zcl=iIAc+M6-L>MD;v^|6s5;JFB9pj6TY61_q}jAi)%MVfC9G2oQ8CAK$Z!_|qhdmD zFFXD8p_g}Nl3Jw&s{|H48!{_C|A5wuMC3j%!LM>4pOk8ht43=SDONGZn=&;(Vs0Yk zuj;oUU38@zxCpP03varWYy{Dz2=E|*`^C7_BV!c5hvgNyMhziN6ipAuB^r&57_VbNc1p(_ zkV6x25k5ulL3)T@@D|52gXNICJd#;3umtk^d%Y-05&88W?e}2FKtMSE6VCrHwsSOK zba0ok{2|yg%$ScF<3*(wX_>Hr+jWx4DxlI+9hDB8soDVf1w+jJbKC3JSGK?#l`SnB zq}DYnnawLZv^^Y_VAN`bPYY#Vr2+X0yDsKh=4qjZUic?hZ!<4Fr@pryTr6L|Z@X?m z+7a?B%Lfn9AP;nee0jntSa~DLRDC5xFcqp^Ycc!E4zSR6SL;FIAnvO%^I#4jjJpek zhSXx7S5{!R@Jr??^T$- zGCaHShiBQkgA5?23?j$sh7VT{{-_0q$on?z3n#Ua>|nf8A2^T7T{l`E<)9s_&CsEp718 z?oZ7vW8x4W+}~gE6tFS6xYygWoKbNfjJQuk2cx^@SJ=Sp73Uq~HUL>}vS4NGtM>Nc zCD}jD9zChOc)63viIk*d7O@U&9a?QC`HJ$pZ`R_21#PUe!@G=A?c6PrOiEb{qse6V z&8X#TVVOt0(3eO z8SYpt10uR1O`DR)0_oG~&XtC7v$EjXl^*Y{$U%2Ql=MZ1O<3v9%4wlVJ3_HE?QNhx za-PW=i3!1BEf!pVg*S66g`XS1L295~(U`ii_e|J|+`ny-xd#mUay0ODnCkAkU|#IC%{h=_uONV$57U z?|o$8K{e@=9`fPfe276W$rPIVklQ;X)-6fvl)lZW!}U~JCbG6yCD1%DKj#VQtO-UHF(ZE3pr|@JIhIn+D*}ZS2)?{X}D5 z&t*UL(xD`Kv00Id$?o=#gWDjg8M33ob(i5nV;g)c3MJ1`VWRnhBv@vQZ$nMNi#_$g zf!crHb@72a(HtKkRJewc_wJ%1BtnwLnEY1|3d{bls&KqdP?p$&c;*cly7WdvtVpvz+hNv(9(gJoo_pF= zNFW8(bnJ&h1z(X|G4731Z`To^?>lYB)>MlL>&{7-pBr~yvI6HasC{6;a?vbu#~bG~ z=;#<-kiF$ys=Y1cY>vtkr$;ezg{N_Zno+>NDBJ{8vnCAWUcwp2BAkF zD@1_?O4_o^4Q+}K)T@Gf1p}x}BWHy!p+Jox(+ zL!xVq$VjYIE9~JI7Mn4-%Y78gQSf)-QSrA9vQcsgrH;p@V6HtM?!3}(=N#T(#JrLn zG-Piyafev^zJTysWJNu*P47^Oy2gi|Fb=!9dsjd4UP8`u<2j*W--HcQ5$;$ytO#ro z2Y3W!w!t3=q#~NX_Cs_o&VGrzLA<9Wmy#+6RU$|-`ojFSfq}R$_@lp{!YQB>3K^lh zbK3JE5B)L0kr=DKl~w2t`yEc5qdD4zjxQ!YU6-6*Kat_L`@g*!aq#KtglOM*KiMXa z6)vJ-&~A_wIUCVaIaQ(&Q5ksXb#eEQSUB~@m9h6%nH-YCb516?IbujV8)b6iD|!Zr zcMG4xNe+o+_E98tGg?m`j$#rb@^F#Rho0)=A?2CI9b+Nso9Mwp0L0*^p49P9q3UR) z|D0hje31mxXg#XbsG(C~gm=6Wqa5IzY!oHBdG#D8quHH)FR$=GQLaeHa?+c;Snn=E zKTQVq&N{1avK`c3LQ{iS;#lY%NKr(BT0>YIE44HG4Xzc&cqC!(gNJlYLh=?mlXH>_ zc|oTm!rn`@3;t7s@l{zHtS&5A2L6#mp00Z#U6Ef#flSJn@!D0Nd)_&wy0C-hk4-N# zUJ92D7qqjB-a>wO0Rga1(p)+t@v@n-b-ZJYl$GZ?B12Ht&%ZL~%fj1}{18AuPDnsN zME_kJ@qc&!Qu|WJRmbwXz8<8R5}=TkkU(tPG-;|QX--+elt>}MWFXXlq>RmyGteNT z>&o6F{)WUygS16UpO3_C-_p0$NvFp;d3{0<1_ek zcIVLUeZzg@d-K3|IFw>zi= z3^~JI1bBo)$}va!4+;Q`K<$9xuzd3A4U8`Y@ar!fg$GF-0{L86PRwm02j50S{QhC= zD;OVTxIE>n3vT>mL_Fy&2OqI{e(KOk@gWLyp31E!xIEMnJ*KBJJxntJZJKkB`AM|2 zZ%=ED`_elWqD2Oi6ZlMZnrq++s5r-?0OX{!P}h|b6cFY9>^N&U&d9isXH~fl??1P zVq8T}y(Ioz=Tw9E&sx7#;#c<_lKo+7pL)X)bEjeQ;>EEZ&_It+n+ofXld(W5F&7?) z?xS6j{xg9PoN6)qnq}6WF^fW*y%vQ*IY(%8iN1F3j7@BwrP*AC+L^8})k*mq(^$WJ zYA-C-L!BcpmQ5lfmeYTIfpFL@6rBWvLPGtt*8v%)-E}E3K{vBjR)nPEZc(d_jd3kP zp10MkbMUdqv9?`>>Hb}ENCy>jGGsSc(KfE615x1G`!aVZVlwEed*8Jh90l{sKfa1I z8!Lwov(UuwNm2%_3c#6b(!kaBX8-1QR&#*QBYV2@H`0oaUy}v;$j!u4jy@ATSG$<= zY@%uF1$@CW^D3x({ExIK!t>p=)^nB`IUrW4fuJX3?+JiZ(YzA+aaW?%ydfH^ zU4?=WQ^65PU)4@f1TvF0zv`fH2P;SU8WmM{U`>@bf)tpN{uk4mzYGvQ*>Rqv$KXr3 z&0dWLEy_Gmm9x~Ha6eqED50f7iV+1U?kFc$ri57aOSLyYZde34=wVOVp;dN}99g}C z1K(A-qxI1qalg&!zanf4cxpJvX~OD^xuNpV8-ejq9C>jN9eKF}MdKfiFGnt8YZt@I zmh2Fi+9>@~Yf>y{57SlI%nq*S|466WaUx*m>mGXQp#cNGl_g%hkIY#pU?wqdg4Mt^u>}@<_uI!<|9rd`ZZGRr+lkH~v2p_E) zBkmHN!wA9_EevQBJI$P~K!g{vX%Eh?@P3oU6|O?XgmiI66HK$Vie)WpY=7>0^>4G^ z9z!tkoBWgi;BDCvL-7+}^8zjMOqQi5Xwu5s8MJ22+oGDQ6`2mUBzX@zjRsd~HmK?G7`^5IMrRNuJ z9qbP={H@?S!JuIr@-s91r5}dV7RVbiwq0Sz2O5c)`kV(I+(OcoW+?WEEJXu#glJvo z>!!lk9n^t8@{9-c<}FKu-lO5QJLAhC9{jOiH;OR4*>b~L2Dqx{n&4}DFvAs*4RpeW z&Hl`DcML82TqF9T^RP>1Mjm+?{h#3T6GN%4j0KPMV9Hpezn>Wkd@@DwrTLD1M;@ai zF4-dU8(BSpoAw45q|IMon~n67;kHdRo9gw4EvKqVYxuugbhVDsE`N2G&iCJu9y{c6 zRvVD(nH|%= zkaYuYYK(;khwTKqxTYXA&j@L7@2&bTpNVd^?t0wAy(}Ucag7eAYWcA1_&UZ z;zQoZ`F@xKzea*KW{I0DhP@#f!mhU5QOBy2VB2pYJT}Q7TSD{37_ls_fZJM1R=u~m z-+;`OGu)z@FHtE0rO#@0Ef>SARYmHFF?$#ZiG!zB8f-} zw`eYcPCg9X{KWCfI2#umJZ6r<=>^Mt;T&wP zojvNE`t=A8RL`9<3COm&gXDw5*wce8<5Y+elPsp3M7CK0hU{WGOkKu&QyUSHwK369 z$OR7y?Dh{H=$nB|q&Tz4RZPVFp z!h+87yM~BU^n28Ii)n*SpB=qo<(1#13d9Q=e31!rQRKi+Uk*Us_=yTun&2T?uQ#5` zrxDI8HvOK2OZSdbObNWjEi{dEo6x_kAEafPYjIO*G8L-fCgCv2n1B3$Uy`wy!oi39 z-bKqUU6fG0#5qX|3Y z2%7hr9&v;{eBwYF;~`7tQVuC&Oy1KRbk2~!1=$y+A@#@d&@MeF9C&4SG4G9};AJkf;^Pd;cP7SukS*;`u&!*Rp! zJ*uBp%)v1Y>Wqxzt8U0vgHIn4nS#C~qw;6>Ep;ni_^?F5vsdyyS(n ziZjlI%4q9OGg-!0;@~ORz~TlujoN9ePA+}A>IyS4y{W3LHHD+kMjI<1-E~+E9IeQL z7aIoHr!2ijlP)3O!~qP;5835HMrvwULtS5!S8~>z2L&8;kSe+bFc(o$%OpCYjwt2WhCp!4^ zEIf1ZM9yC4Qy6Z)EjqmThWA4UlZ?)lr6qn0DW&}+(ebPATb@i8@}dKZ%^xW!H=O(3 zU!};|oWb#%yzz7&qBvZC^H@T$@mQ=F4BQjdq`Fsna3THsLq%)Ea;dk8-P|d{ra{+%@tHf$OsRt zb|#n$b{^(Y1mdgw%6LhPO$$z3AdNh;Xw8Cmqrr&`AP!Zex~NRKzaLslzDab@yOFKEbUyjbhcc+EQF< zjs>-t(gvkyvJ6@|hCkGzY$p==vP2|U&n8opvuSWzVR=5Lf9MxaRNN+=rlr9WTWF;P zc5%Fp)rD~|toA40Z_;%RL5RPTvrFRq*ymRf)@?z!St0GjQ?s~BSwp-U@=VO}-W*DO zzU{If_QmB4gh!~@ykdWqN9-|OcN{y_=&m9M!Hja(?bXl^ZeW*iUvgEhF4&L2A@foV zPv9*IwuNuNyQY%yyf4dVgn`Rg%erIHv(TSAMxiw!l-Btedd7e{hPXOM(A^CSE=hKg zDqx%$pb~7tNNmDBGc+BP;vvTH@C`%`fpW5lb^Vp3QIAKxb6 z#RQ|c!g1G z?3NAhfMmiqHJ5SArDeyl#V#=ol+jE$M*VlK5>H>Qt4juw0D{3b8^f6I8aTRJU?_Dz zS(VjcfCEUcHAGG&n2dq|e4QhOR{*stVHNbuuWe;wQFaq!(&EEsULwE;9jS3E-Q3|1 z+Ke|Ozc9>vxhq2N3Y%NNGcOpYVkTbk#9sg*l6mfTw}~aYVb|y0zdEcsSx*G`{^S0l zaQ|_G|D6kzFtu^`Uw~hu4(Fk5issk1$s*a*e9_pV-3koc$~q$tV+_0cRj`~gQr8z2k{peQU<+I7B> z&1ya?<$3n>x^eGw?!EDz<-FnCoiMiNYbNNgu46n?{X+jcbT^TWyiBOn9f^15RCQ; z9cI!jj_(aIOs^2<;RpzB{3^2Z*$%b$V8B7>yp#33aXd`u zuJBn4wf96s+CuWtesrHaWdwf2!|1&jec{Q7zUjIH&HO2V;YXg2-+qn6eNguNl$rLG z!AJesiXG$CAfnDgRL)0z(r>?$X3ujvRCl_p+kTCm=A(_Sc+qChOT01Pe$B-ZAC4i{ z_4pgQOU;2nssv>mDWqBd?E@|@-6^e}v6d!r))3eW&)Y<{lXw(UN4t$BpGPoDa8?s9`Y!iy3KRtWA{t!N$4~D?_x*>vntv8fk(NUrwN2xOd$quclD* zDNi9o$x*pH$LvTeQjg)x%Z)Wk1 z-RT!}g8?wB(H$S}Cc({8Hhr}DW1Cw*u%iL&t=a5sa~cw_NSSs4k1Y4&@? z*||&^tQ@L!i$-$cGCh-ipbgr9W?{RaqHJLK`tO`LU||ePDjf9;zFuEgik=27`O(;6 zvF%aQd4Jt{u!9D~ouu%kUtX5NWg39B1j!dl3$d(t8;D%P;wG`~2jm8;5YU-S8K0&Z zlVy53$wkMf5*GAWaLN#8vI(8wy9_+s*{DR93Ul-{Q6ky@DLQ>S`?yghJk64G&qqrz-TBx+8pBr{fmua{-t5lAP4&rP% zr$j(;r;=Fe=xm{y{`+gvd*1V-K&i5RUc#W7u7f;FL?gzP#^K1rYcLGG#~so4>7cY; zcZ_=XD~cZ4L_XjSBUI8D$m3xwKKt?2qy_I{i1Tbm`Mc==^YmidzN? z*?x})$`BoRos!f;B@^Jb(g~0PVO|!OykD(a07JT+q(~V!@ZNtQfOnJHDZsOgCIOIA zaQU5FZ=wfKgFp7)7S&TNz@-D+RYFZl>z7Nt3tjUJuy=@nVQrVB(9pX6vHDXi5_(%n z#X4VAxlBUO7l1&O!(t?1%~at&mOPVr4eZ$8D4Xlm=gK^*y;uZsPEtU_eIDbY+yAWm zhrCx2p?Co}Qk+YaQ+FDtKF~ywZzU-#Osp=ex^(X65Y3qW{WlyCnstQCa%BbdSp4s3 zIFjV51*ioI<$%gs(mbh>SOIe}b61#QP^TFPFw!wfIw;ILnKqTibyC(?mxerbS!F-^ z+F@1bvNdWB*^(IDLJ%{d@j<%W&`$9i=(QJ&Z9E>boU|=nbuCvgdA{LkEPy&>Y*~J| zV*P>G*5mH$D0G?7;XKR3$3yLm%Mn6*W{9l?=1q!_P6y;PhZM}D5OXI4(Zk`_msh1U zAvUgdS)AK|8k#`2&+%A_fo}!6i&;Iu zqTcM6c05^a0{&JvRt>1sBRBYZ6Ja9BO(nf54kchOl4!?)IidTLnnF$xy z-SKNJZ^JZQ|Cx$dwdGHFql43fPgau=df*fcI{I=eh_Ag3V5H#~ZE8cEwT*`Q`T-iF z>rz>4jMTqK77@q$^dzSFr)kt&xxf`hsyr1;!RTsOsB5>QQ*|S$xdmbdQ_)_sX(y}K z2#mVPOxvzl8Qs!6^;K8lfJVQ5*hI5C+EZECD*VYT+ONY-snaz@=`Y@AuBI88tt_MY zgNi%ZlSPR7iKoMk)u)&7det(XZ%R zI~^GmNVFTltw&LAt~txBl{mW7()p{k0K2@+AxB#C>QpFiQwXmL|H!j)lF}(vD^Dfw z#Ikmv7E%|)YuoeYIpB8nIdZgyaY2t(LPTEJbnFoJP7IXifvSQDq&se()cv0F4cXkt z5w2x$u4E^!UZdOza4uyhF4oQZ-%dcR!sWg|%I<_lzB1NMBC`9#6n$ThP5ueB_Ehn& zQ(tjGBR9xjIrmFB_bi@E@P?f&r-suSZ4k`9V~nSz8TPw(&tp*cNPEVRa{SC@20)I0?!V_ZoN;S9^zvviH;EPIq2iN$HD0xR~a)((v_~O9q zClmDr)^*2R>wyb#hYEjai95hti7me5!c$l1A($JOzJ%Oet#uov706%VemF}t5yvy7 zcA)h+L~x~r$%Ml_L}G?B?{c3CPcAQ4 z`$E+a6Z1D7c?IWM#8id{Ey)j=4LVm9Z9A?yZnEi}y5R{q{E|cdTylMwx(Tzdl77owfj-&0ZSp%YRN;&1 zxbP{v8t4{p?F_Tl*;K^3%e6}~d0nmn46y<>8Hu%&`9j_x9K=lMcUsvFv<)WmV-x6Q z<7x?MVqzRhf~Ny23v*Gn{K9zgBUAzCtTuc`WUL6Q<%^ENR)e%wgl^@cuQ^;O2$dyd1Zs=gQ<@pIX4N?sqRcx}$N*%7 z#tpOSL6#6}O4Z|2E-_hS%8fwUHK}Sp^zIkM^M0ezSFc)Hc4I2mjRi0M7M}a)q1t)% zyRMj(}MX7t0p_o+5RN+=zy$+5%M7X@I*yn3i!6 zf(B0Jo?%>T2HMhyDm!9STDZ{!UrJpXfmo=^6q{wxmN?b9EFp7>^vc`ct>BXQ5NG|F zdsB=|G$EQYdK%Io(upBtMP^70l<%ts1s8H2x4og#b}sDF9AJCHj)Jgn)`go zl5dJh1=EikGtag?`4=XpG&e1#qI%kPesKGjXo)!kClLb&(pnuYBKGCN>()VJ>kM`&R*60D`am5Mb&zs{uLWZNo_)uRiZ%V5FLpiNu z7qbf0;l`+0Rt95ua8wQ}^+;CzNQr_*J1Y8TA|_?aIU?COH5-Wev2ZEfL*nrDM(U(9?#=R=Mmzjg~F2{|!qIY0C{)auxD(^UUrt&8qua zhX*$+El9VSHv<+n%6+RtLvnFGQu??xxUP{mXL=+OGs@6G)>aIO`IOcNwF;4PdQ)nk z8x!sZjf$n9%*r{VD$KqJZB%m0uaIW3>18?5WH;=r7EcasZamu!pJr=wgPzua9ZR9M z*7|->$>eK;ZEf?78V4r&GHw|J7Q@=yfrUz#u&!^=|6cou{{LV%D?<-cyMHMlUncja zA%TH_;{I7w|LvatG;Cy&Gjy{w|4%E9|H^kJ$jc83Adc(`NE_1z{lSmAH#rz+x)a7K8_Dosa71`8+xb4WZ6wIAvj_Uya8Vc+7hD^R zC&ZmB7Dd@CA0G}6yBS+s?c$BKN>ZrCy1|)t{nxMWtF21 z9mFjN-He8AMS#=G%abKd+ThSHoxyMad&qEq<3P6i@L?>gPjMha1azB~U-GORTLnHz zuF2f_EiRYI7<0~{9y&Owp0Q-=_HYI;HB|MwikttM;R!-cmeL9f1e8JW?*Z}uwx_VY zlj*-qnyLZig9D18n$}oOz2*1^%B~}fC5Z|Iky@uDOMr+dw!Fz28U#mv#qc?MXeSLza;QnDV^QGtJ z=kHAqyXWJ~;R}$43?A^~etXCSkds3mM!FZ7J!FbT}0Tf`DeR88W zOQ05yMnwK0k zeW!f%X81lR;n92G6QW^2I=JIgvHM$6!b9=$Ta(70vS0s>9f}^!2rdtGa<9)rc~BcUP@%HouAZq;H`aRJ!bDph z1BD$aimM1oR-NeG&6K3zc;NHKFi0P7nRufdnRxngyAD@j1I5duxW`-~_SEoePfT=k zwQQIR5RWFAs!%8Qt= zO~v5zeV6Ft*~cJu0cG^KtS+c;?tJ@39WEpSwHM3Z`}>2+((@1jnMmvNzcbUa83Zi0 zxQawWSHWI9xLDWq0&u^BV-Y@#etEyC*!|jKKvy#68WT*8fD9d~+(CmQ4N-=S%|l)& z4&?n1`=-D^PgBsWR0?TpM5%~&9D84D20pP%o8%Fl}*z3%_K-o_u zRQ34HUu~;8rcqY8rvje!*O+=pOJlZqL9LFg+BQyHxU#eXoHxhxPDH|@|2d46dpJkH za7GI9Sw=&eJBXdDsOXrPK(nlg{+YxD$^5 z;_ns%W6hkIfmDG?x2VHqfcYqs`>gk2lrA11T+x98dXH3hzLZO6-NX9D-M15m_GwLa^cAHB zVz4F{M{|`a%El}xMarPIcxEbPy_$zY6FY!N^K`_Tk60zU!yFNIda+XY^iI9m62~+B z6N9i$dl%s66f*>zu6;QVyVz;#(WdkOmANz0ck&1cji;7MxU`HzI>@bnRg$+b$!Vc- zvfOdjc@U{9+KWjtWon?80)J&0^%R%=R6uA}WG0r(MR7oWa5M^D4CO9i0}nmD+e<24 zn*x4nEihMyz46%&D|n46S>8dlSbN)RV@bLR>bja@2CMrruNd$*Xzibm@udtwNv_2n~A1L~Wx8$>~WVUs>qjdBwRx%GyHh zi8Joh+r4S8qLf5BN2!jpZ=u=cg4&r4yoyB4Lxm+XYE6Qw6gg9BL^)GqvO=g(Dzma& zs}MWW$}&vGm1Qy1ngs_d{1!jbY{CV5Ce1SLcAZpZyrWO5)GN@fQ{ygzfZNYy|5&#umSxI@~ zq321gvq&c982i!$Hj@i%_nD5H=-05|VlS*GjRB16n4U8j)N3p)`KabfYf1IGS5?89 z@5XN`R2SXy^Y3uEZ_XkygGh&@i+FD2^sd~&w3v#-LkBp4vo9HZ3}tc1WeBi1Uow)h z{DZ11kA!g<%wiSW{g<6esr#Le9vXPlNwDB-VV0rdo76_xR~to{D3K36Y`NLl!&&d` zM>Pj@Dy$$u>sVfcPt-eid&B}Yw3CsCMMSt6U-iYxlrkD8TOCp&&o2r)v( z?xL$`aIG|?_4}2^-Ck2jA?|NeXdy8_@_~BFWQQ7F8qc<2%NzO`ZQE$G-Fq5F6PO?7 z#v~hSlQyXq#aO(1lm0-{AGK_SS8D6naqT%M=fUNURStXf!QR}5RJaXwdt+y`lgq^7 z9QQ2tTjVjc*kw?c1oCL40L^1y-ey>p19e6krO8-EkLd$| zRVHNsda=XtB>ZqD;)Br_M%WfK(Uk~^mq{G8kejv*Ryq5jZR>^pLZVzIB?rtn2J8AO z)jKhUY8k}enIif}TmmlC{9(&b-Z$e6=?ro4J{jU2K;Wu;n0<2a4|Q72UgiF@K2aPK z2-f^oV{A}G3=MuAz2>-I`6@&NU~f#D+5@rQy7nM7Iig@YGN&D&yX@ikT=j-JGZ^YG zu3LET&<%y#NT%O+?dg+&Ju-R` zhm%Bthwq=H?}d~A@v}FCPiA`}xis~bpi#109g}n&(E0V^u(q!jOfzX`nx-*%Y78%5 zLJMbB@g%phMWVY~@g$I1(zo4T4y`8y*%gbI3U+RwRM17Lu`e8ICh!>%`YxeZnjzcT z6_Ypq)-@*dofhjHhTcF9BnfJri__>LHiE%JvVMtMQ^t)f>zLvRmg2dHSVPwSM)ui? z(!jC4haxu0pEg@0YLlInH(qR6PuSR&pqB}Lq?9i{CqeH@)SC`^w1hchUQbACPt?o$ zb=IU4DO3ESAt5aik9BguN2s;S5jDfr&JxKCW_sMNh_(K0it@RcFnr%Uz0QLIO#ko> z4Sh>Bt6FDBrgtLr^ea7|9j}w4$bD@A;9MQexvyh;);PEjN~2qy)veOamQh#TpPA`Z zlkulnEVdeg0t5L?LEw#o6skoffD^SJB&i`Gsy;^wH>;+eRol=qElZtmmdg)V|L78h zORs+`$X}0n^*QyhocZRCs&?&IIb89E+-}H9owZmhMH#J1;SiB~7MCh<&T037T@t&5J0yjjl9OIaX+vvb(CQ3C*ArZ@UUMdHja8U&Sr?tS`?_o(O9GL z&n5FG6jG7BX{>4^H33a2^gV)SVX@nNoisc!!wrWf3A+Ju1v}Qm?D_V>T#@2-`ZQiT8SPp*tmpI&2>p!lUW=aqP z0b$og=FF1Y$)h-<-p+zP9|MY{mzd4d&oWc84T_Hof^_LZqVsW8jnZz!R&4?BpalVBu%f>S^c60aO zR|+1%pPCa2-cwHAM}ntUNWM_{KRfHy(n1HENkb;b+1`ELeVN|meLqi&)<8EyN{+zM z(0s~BgGQ)D8c9Qq|FDaV=)lR>=}=`*3^bZGRd2r)f8+QQal9+14aKXHC~UUVT9V$T z69vVZVtv(KU{E+Lqxc#ZyIaWBX`1FZ4Rbwfn6q@+S^JiYd;2^h63dTY5!|9?Lk+fV z*FnE2M}Ez{Z=PLyXQCcJj&$t88Frqw$HuA6@E>x|MSqYT-!tRv0c>JE#9Z?`Vr`EsO zcwu2Uvh5+wGuXqQBEGZApG~WYM$u?MhWR?>F!ia#JYr5v*wi4LTW(B;YV-O1ILgG| z`{=~0UwBz(JM1E{y(ao3+EHWS6E5YTCYToFCZ~&Eet#zIqE{El@8nVhD;&sgCjPwa zCEAeLGv-LRS(lZ|Y|?kQB`+qCBoCT}y`IAnbuN}{c0Ky9?$A!P88>b^&qM9=dTr1L zoTKn!4w1f_x69PoLfRA3QD?5G_dInq_pY?2(KE9G6RujO5&sg~O)t|6l>LgC8&W@g zL)u@oJo27(Od17d`h|`(O7$yo08YzN)}18b5&yFyz$>s9kSDg(qs;%?2Mj=?9@l<< zI_3qFj_y#xaOM0Zxx#dpG&|%}!G6juLgO0LYb=80M9(0U;S~WqxJ3L&AUGxa6O?&o zoMSw`%QFfzL^x{6H0}_zW~0%lOVmrqIUMic_cF5UKaT6&jcc!H)=!3NLmUP2MRC0c z?IyVoT6`9oQK0@ie#}E^TXz^meh4DPJP-bh%rl%(T57>XSIL@kPPLHWaYMop zX)wI^o$MZouz#%muxd7;Pb7?DS0ZXb_H8{6zw8|AQZY)DK6buT7|{vRos!U#uqorg z@?}Ddj4kmU4e5D-oPcj2f~Re~S!9s!o+$u9K)%0%B}@-{ilkPkiAvH}ZXUK$bTQhe zWdchiub+pnAj0vTW{yVW!5e?G?B`!KkV&rYEXNQ)KyJwYZ&Ba>c1-_AHDr(an>MaF z-cL7frYV+Pnggk(!~zWr7|PQ;h!K<|F(e5bRN$NzIfEt{UDL&-jnMgW^M+URb3MLd zRjF#S7qV;`vJJd_75{rV|0}|4a{PO6Uq!yVTL!Pj!s(&1$8m1vi??6zD)+~GU+peX zJw%^!!lUqBOi&X*W0;da>Mp|PU4fG?CVm`HunDp%U z_73&-F2b2NOb*y7L-o-bFh}J9h=cz9xNYwCUy0xL7!5c7Dj#!pI>F)x@zA4s%}MbU zq{~mA!Z^AY1=qhfhMsxTiE!-#xnI5du}Zp9HM}{gow#on>Xi` zn~8bB=knCdZusI|w1G*5898?fESDReA5MfOce<)@V*%u@ENs#=Scnd~x+sm36a;2U zn=J#~Rvi}D3VDmf2AQ+h5h<8#0^h5@47J;I5Ti=SlN7lJ9BMIWT3w`mH9`ibmE<~C zz;)2&N7r@qbOcm<-vWuA-`fc?x}r^#X>DK{mfUu|V0=v7XQ^#$h1euY`C zfr_N(c0z43O-tyHkuaOi;>1X8;zb$Oct|~tw5MiMswW2g^dD5?w`u-SQOlbvaxutZ z?Qg@w!H|_hejMQinb8#GCQ_HLlR2=NZhjIywp!Iam4WEtx|#ypjyXS+Q>8LD8N=mz z8hyGPsA9+^%Inr1aG81GET~_VBA>NY_XHMYqAhI|2vizV1y2W4v9+_y$&PGila?~3 zpf=v=CDt}GTLS^_SX)Bc&Xbyrd{+=0?+qD48ZR_I88RPRxSakGp|PAff5AaED^X|d zD*0XU@zh>2Yt_m}KIcMWxiK2VXGsDpW;(}W+tq&-=fNrQuUivhSUFnBj^-~I;-xb_S^pELUaq_6n+*4k% zi2V3NHT&9M&;a$f7~ylcYZ;#5)|ne<@IJ*mF2Anh%hBYhr>xoi>o)Tgc<~}Hk!X0W z#G@d)4b8mD%b04u&FO23Euqwo!!X`#2K)jM$8zHg`U1oCXucs{OpVQgxIuH}t9M=a z3QtuIiYZbFElhosHw9YM|M{RH;I)vyUDaZug6rh@R5UlxLDOsW81=3B7&1IO*+ z=W8MI@lM({IY45+Kpf+QR)`?fuID{oZkv(0=>Vr(N+a7*q)ws(W>1AS&IGJ7!bDmN z7^mDx;vz%<`H{sWZaEHz^VoonZAR1lQBIyJ5qN{C&ZLjDb6RV(8eNop>a1$Opr?cN1>HQ5rOT zlJ@-xOJ+P!MY|5H?{y!JPdI^F9f)Jc(Ntc3=z?z-c`dK>qRp z{=Wh7V2|WVKcD)bs2&9PZh_klfwBN#YwE!tBvnvsJQX-OPxi(HgyVvDYQ?YEls=R< zeu=NL@JdRU<&zr~vaVC)Xo+27$@^7LDs=?Kk?0J~{65ESO)K>R<8 z3u?Z$?i1E)yt^*3Wwb-W*$+6lWbpzIK04UNF0ZQ0*K2(*zF5`zB_jO3pJ zEoPfA298W!Gjm~q8uKcn9&2qciwngiFM-fv7F$bRDO=tRF9Ovn{x|vZe0FAT?yk&{ zmTw08o$eRk-J28dKF@Fccz$pL=5NBo6$%m`h0*Y=TSFg`C@mkAX}*<^O@}T_KKv2Z z*O0YW6V%nilo)x@g1tD%bbi`HW<{D&^O3O=6Cb@%3=<#5D7CHm2=0*&>DYGZ?whzm z@E4YSmTR;j-=K>xBM$*see@yqVFxK#1hG5B-i?Sl(K}ZkVILlfG=en8Qlwp*;Wq5M zD+*)}k^1+zwfEYX8`gslMVBt2zmpu~D+Fjm2qrn{j)J4rA@7+zmA)c_3xP4L>%JCr3 z;q}u+U3+)1$aVCafz97Gyhc$24G88fAFHUrvoSxIl{L5L$RzNW%^Dw7;=-kc2Zd!qb&8SI z)I{VjWW9GLBQa@I!-S@T;J5V9YjZ+WSQEU(#c-MHYQahc9CRt8b`Z@&-fvcZ25f7q zS4qkn!%-qDb;u=5xs%zL$b^lIRl{|<4~|q@OR_kHTUhm9^`yD0XJbsnXnU%!J*-HC zi-<39jnm|<+z3rys>JgCxP@mnMy1YywDHxqPcbx0E}u4$Jt${cLJaBO3ER5t(v6l7 zN=42kDxNMfLT9&F1{HsQEFJoW34W(i+txcxoW)pLGgs^3sp2|J%_Rj?=XRzZ?t9JJ z<3*aJMsBF$nG$}kh9+>!T88J}6kExLtZ9wnF8*;hv6k4P+dErX5#}6K-f#m;A%aSw z;$L{zMfvptov6H4*cQg@NnOJ@FM>in@0i>_A_B!O9*LQHHK%loN!KVI!UBpFPn|J_ z0{y%%2`;~%6jO%A6HGw$iX=zj!Q4vu%IHS~xfZ{wzBmYe)dcM|CtVOJB%GCY zr|#H!gA9E35IpeAoXM|t5975Y2;(j(D1GFM z_ueZWTlOZTBztA=P4?bV*)x{e|r#igXuHwttb$YujYr4ib2Bg6bNt2nEad$YCW=? zJ0|%Snurc?d1qU%Z(`*#1%G5=OhM>-#^{0HjrS(#N^HY($#!mBRtgT4SZ(QckILmn zH)&J>hR*`8>n1cFnZhFl3g%DN77bl;+v=Nq{#}>j%4K&6p|284m-}9~f3e{9YJnzh_VSoeI1X+!rV0a6m3ZJ!kqW58!E+PmO4<=`#iWNoq3 z8}}!2knB5Bc)P?omVemGP z-&z(LMf<&?&dq6@q0&^!99ziY{oIcYJb3FX_c=x#Q?re5iyzG^ZE;9hrhc`>tHZU= zxw<3u!)?O}RMu|S{2&TRwgAbeh%)0gX5l`6QA^CVeFefgJP9G<2I2Izjj4tzyNLM2 zKu+#J3Buul)rHEzQP1l`;9f))p$8GAd%KoIDN@WbQ^x(~mCZ3qHi&^bCHguy0{7(v zD`M}I7v1OaGC&_xxy?MD^FX(0%I>EBVj8KE<1*XUO#jT2M;$_=tHNOmcbhL_@)Eq3 z43jD8yri{`sJqb(_dIFFpQD>`kvAyi%8TwDwx-hYq#02%*QY*jVisq6A1M1AioJ2& zjCtR#xzMQbSWsjnK094&N9TnFdd6qcTfT$t2BVaB5<^lQLF~?$U#?DPI=<&GYT()0 z4*$BvH!w*P;Q?+6WcK5y>L^d^Y%;F7&Z~O^2a9m0QzFP~0CzdSrURFLo?&)m5s zoE_#0e33xP78+EJRc6QK5x?DEf;99cxH0igP(_L3nh2bk0L$YJJnUMpAbs}bpy&Ic zDtzgz@JhMFg6toUa5$R3CGSWt^u3!jyEr7!${A_hrRv;JCpdKr8Lw5ehBb^st8-EA zu;)&fTIEo2{T^D}df((0dPS+>^SW8H^$LM`%A+5XU$PvdSqwV1+rOqAT>Q0%=x6bx zbR>v=00#nQ^<@n?2r{PM~6zoTCV)>-xav-DUu_B1dWwGMeeyRA}^tK?Oi0`H@ zRxlNlB8i0zkCTn{rg|aoPUKs4IGh{z$R8#e&}XTrBH#;e3=TFY9k>a8U0j~n29eDx zl3mlTbYPCev(wYAt>}tkl{4&`Mq3Skfh1;5Z;2exSoEp$ZuvA`(O?RhCqdEu{uU%H z)r^aS^4<*80WWT6PPskCcOjoXis}w@3p{ve|7>`Ddg5Jy0}sY%WxG+M2v00O-&BFy zXY6{Rt@=&flH55rMf^MLE!qrEjJfIW?;Ed9dI`GBronIRmIaA!p;)K}QqFA#%8EZi z^IjMVeJNvjTNKWf25iodRv19(etkteH-(EWLi$@49SY&&(7fj!a*^#|J*`11wu$vY zZZlyL3l=4-clJZY=28unz5QdR)60%Z*u4o(M_=$pZ+wdtf6U=`Aho<|Fh0ItqOn)XzciY}lfNpKo@$%(wC6Vr7iEAWeOxMM*eIxc-yiSct5{8ZcAIEg*LQO7_!%+~aTI8yK7)i&IIQ(#q{BM; zHwHFRuUVKMOl)u8fD>#jL%K2s&$jsVIticPaAtN|N2y+k%`1od%S*oE8b(QVw!2ZSuM6q^hiO2WWq|nyV z=Wx+F^EZRXdp3jKM!A#r#U|fP5RekAFiWKw`!Gu9^PY6lqo-ZX`gwO-itF@lOBAlj z&9+ZZFFhti!_WC1xvE*hQ7M^p8?D_{{a#Out@gWKNt7=<4%e(qUNUa8CCz1eCq-N2ymJ&U=te}QY-fF= z2xmdiO0L@aNgcTXpAqi%jm&iY4tTmA#VF>b-VX5nX5<=)tw`rLwTuTd1#7e9uy;1% zL-8qyW5tdy@kAS=t33XDILITCe!E1(*xAJih+uz(vVR71|D3!P9wvm+b`$I2+-JgY zzrs?M5^?ay5}Wt=x10Q(#pI)r;**sv@dqod5S%G*eA)Oi7lMxY37ci~B8wMLhx)^9hWj3qST$%~GG zzIuTn$RcYn$C1?NzA9powDiLQb%ny$v%GY!?_NLJ%=E@1;TAEzuf3}h)EJ>5YD_~# z@bsGd`vIb%ozLAv<#V7FkNAgSGc247((@_=k(Kmf`19F71soFQ6Y%N&lD0?;Wfs8@ zQ8a741!qY;Yqua7=97H)t|#0QD7F)C_xTQ393%aD-?n`u;*R(-{7LG~RlO~T4k5Az zvIkD@c=IQ!8n;sr?o7J1Jmp?#Y;WQw+IcHVaxuR2irdliMad7}{YA6iRK1wBLjyk$ z;cg@0n$=o<&DI+J+Gr;zz}Y(u%*;)0zK-T~+w1uarx))P4ZWtXBuWlzM_l5zQpNRS zSrV5_P%#5NC@bTvn8jMt(qaZ{uWS1RUNp(-4Sm*fw`WJM=YckUa!34TgUQfUL!E`` ztq!+R6iGxKeU;2CIx#KfZrrK+msJr-UdQglW_|IUOQ(FsOVV!s#sMu(gN6q2tGUBM z5_t(SM^Psqy1;!4zN0Sk77LD|5bm9Uyi(PK(2n@n??)2KInOx7 zLCYxt>>cMS)$6RG8E#%k4K(uD^9FtN1#!>kx*rS+cW_l9el(4ZdaPOBOO^2j@uYWh zfy$`1utA_U1`z1#fAY@1JyF}sNN>#Zhfj2g7pviPFfP5yt)6$_?nqt^N}4LV1qTS(RN&{^3U>&oSpU|S+nwLA-yv2`LUOccWPpjRn2Aj#-fqeI36*{J*135 zOR|xrEsbK#m*+A|=D(~Sxk}3^W=`B7@^T2J$A+&vHi}VWZLu+b0NKH}?9PB%L7OIcR2I|n?s9rSLu{?MKUy_VS`yhBj zcqy)Y8h4VUvav?u@JmYr^>|E>DUzy6YtsPDQvcM zaUBM#S9c$dS6RgnsLtZPu#uK<`lWwVnKxk`Zds=uCd@`}bvH_prb z`%evCj?y84O?&I~9D)$qEU-npV*hjl1=`80x?$VTvDMPuXREh($J0^Jgz67hUN zXD9M}wL&`nfl@{0ylyDkNIWv&<$F89*b@E<;X!EPx9Cu;8-O`MQBbGtTN zt8|2jAXcS@2ZvnQpd4#%r?Nu7L1ivj$D--5*rL2>MK&UGOrqACu-EL7OSwYbw@)*U z2@g;uL$4h48m~R;V!V4z5@Ba0orw6WHFwR60{H9ES%uElT?oqS4Q%n6ABYTk#p(DH ziSXZ=koM#$YYrxBGo=yXtCKIW+A~!tU9H99(;2z9rJYOvNS({V3NCxogysv=S9QAa zJgk}0SXsJ-4d$w}$sT#~Ahmwv$0;|gYVOxIae1@6%2`nS5o-pX zzC1ZW9En=g{h(3P%5S~k!eLKS+ymaI;_fh)>OAHxG}2k(G59Gx?uV!d3#)pIrTOksiKFipy7e&yjSHh{1w$ww_LGjkRDG$LZ++cT8OG8DkfZi3nCQ}N6 z?TCDqH-6hr0X9kjPPn24Dfm3tn;4s+W_QF$FN?+NQ!%r8hpIY;mKa;{vbL~(%A9C( zU7@XSuGqit;Vs75)hyjugIur~b*(&hg;3xkt4_Fx+;~skr;1snchge2qHlbHnjII71ijIYJ3hidqY&803uPMXKZ9S*F!|UK0FHf@`O((rT zX@*A+N20@DfqUsDOUU%lCU5t0ubTSX_b}?*Ds2TSPs(w|hY|ylyaPe6%M@dm{TaHl zZp*p7 zG7;1+lGE!U&BVj7`tapJIOigO!Q-E3Cd z>&QGRF%g?{W)XZyiE7wALXh6+Oz{1ZVRaNdYNkKyw=1`<(U{NMO`6OL@DAcfkT|8$ zIyOskAZC$kyqVbF>&EBw@xvF8jB9hSyybrDs78@*>zy5^uATv}=D-d=05>8?t_ zEo?Jq4&&ghmA8j8-&CvJ;J|E(m<(DgIDC2Ln^S%Vaec{cU-3QX?7+USuc*bme^)kZ zIpNwE)!VcppYY(@l61!0cwL#n-1TN5Vl1JM_4`lvb1oh#v=qJ*jw6|hyqh+%zt@Af z*hhovp5R>hDbIvQoXe=g#EFt>Azr2~U-i+^8h1m^y&=>MvzV6=?ykJ0rj<0Dj3^vL zS%zD_-hClBTryI|!8QByqa1Xu``?panpobiY_5uWs9t(qfo4%fu|7oE!79u0#>m*+ znubl;qu{bf{xM3Cs$;_uD))KKOda^}){6S4#tF0N`cc1oZBgU06DovS55CVR2}Q0i zN9liw+*-@f<}zjmQZI0f@Zu;FdfonPU4Ps0uEofh%f^$&qjioX($_2vG4q4FA6kdz z;L8wSzn=(OYK}4MaB;eL~TdF7LAS!jHGM$})R;)osX;WR^r&_ZN}A6J!zd zEZ}}<>(KX(X3kJW=dltST{C}G`NEOrJKn0*z4Cm& zBE&R#B$cB_%pw&0&_Wd$aO^I%s%CFiSfV5#_A464<5JF7k&09dAm6Vtx+&tG?w3G9 zue=>!FD}zdS)7}ek-+_F{^?W`VP#F-cM1IuEIH%FyYpDYpPQ3jHU;hwTj0$4O@=KH ze^S7viUsbM4L_+0qjZcKj^(1BB2$ zdPn?o(#^d`sxi6+1$K&-ojqop1tPpK-uf>Kr;dI(q^sV;(0{0O%`miZhLzu0!KR~~ z-#N4bA9H13&qTmgJ;_=+?$dA`f>yto5bHMtd8-(6?*OmPs!(0u_~LsV??}H1YtfGG z+EPW`lVBwu0g6~42pOiT<=*(ly8~$?yigx zdW;uq9Vn}j*ItOv?3wp6jMzRZLc48;$@^x@ymH`UL!{sa{Go*G+nU>2m6}E0r zuWS3pw}dR&?yUzX&*saTN;n^ZYe=2jN)#k?giWSNHoPUOC=<$_+K3Y%`tX0gTwF#v zFlbBO>E{YvN>JxQfrprX%{TaGGUB_>M+*4H$I1f@v?D=r6u>G|1P5rlnv zX6mt@M}FQkxa$-63dOM zwHg-k;`nwhD|yrqvQzWujbGqHK5!m-e{6`wrcl8}kMZ~WHzV{?1?ns^o{PIuI})1| zZ(X~IJyZ9|h%Nl+&Tjpbc0ZlNXtR4q1P+&q!6>QQ#R7lM+rdocu9LdsUFO%j4RqK{ zuc(Zb7)w0O99_=SvQ!fmCsNGv%TDen=0cuqt}c8&rsc{MTe(?u{bNIo-hw6l+U$xY z&rOs7{-QXy_J$zp(pw*N4>|KOax|>GdYhV-D?VP*99zO?QuFIH4MV!BBwNF&W}_Lw zS*^pdQI@8a#eWfty|NCa#6(z#<4w*h|B96e)6pkIZeHy&*PB{((-5uE$@dg_T;V2+ z7D@LJedu47%(CrWbsh={Bt<*?_bggk#}(rtoy4JU3W zVJRS`UtO(yMChn336oM=k4NobbBdo`DmYn8+v`#Sc}eNW$l#J^N`7%0{q9>65w;k_ zf>>RIJdE(FVSK%QCpVT6i8L_*+!cz@CV{&6CF6A+!DY)kghR|U??=b6=la`)H;obu z*NLl~CsrExBd;uaYc}Vx-CTZ$mlSisCE`MXu8`8@v2VQXhy_c^OL1PUDqF?ZZ{?{s zV1+T83;D0sx>i?R9jpT9ZfU*dT^nPdNI^D5z26*k^Oih?UZu3A)seNW4Bt^ZM%3-R zntiNSp2Vu^%k#`^e%Qqd0gTq(34cNvW7$@?5)P1R$7RnlTKL;6az%jvZz5<60zMl$Z0 zu8eAw8NU*bX@%>Gb&GW})utgCrqVKwvk`yh@)l{bV`IuM!HncqoMJQEG*^WdcG%sT z`Kx+Cy>O=Wc9clEyeRfK0D}&-b2ib95(@Ci=ec!N%7qet{nH~GHs_IM$ zJM95~SvBn&CE}F88O;cRtx6@b7c{M$__}5 z)rY*x#L>GEhEXp)lTCy1?2}`iTDAVO;xPFa!5M2o2e<{e{D-?C@>jBYWVVhNzYnOq zf3{fzo8FD8iFNh3mazy4Vty1(y>n7O`i^ts3F>Pb_NtTS0>Q8x#grD-QLwaf>5 z%+1wa^Qh%f7M8a-tc>d6Pk&?2sU8tnyj17za%jGmK}Gi^B7(Z%woB(18po%>ymJH5 zKB)2ij}xzF3~CHWCYR^4kTV-=u)THX?Yihd`#qqS^7?I|@7!90alQM!U$1Km*ev=8 z?`<#XNBO2~&w+!CM2iofeYa}8dr2!YJ(W9*`SlMGLcwv$_hUB}o?z5D*RJIXg;?`1 zU3C+Vj2l|>OJAN#+U-C1pmcbU@iH&#BbDEh`q(?=2GW@~dq)=99dWrLnHev;pb2k8i?El^kCS8zm;atFbY~q`9K;aX>~la_B{3 zh*@EPV&DZvt{geHL3Q4mQrD+mrn$v|Y+p>(l9z@P>(i?>Sotz_2lm+#ik?h~AYnz( zYrN2umw5lY-#>kXA(`M{$*++jjhl6Pm@6cmBGjG8H9XaF zN;MQ>By|I#0W*3$XYu4=ym(`3R;$M}YGz;kqN(lq9z2km>C9?`ugLI=wrMw&sd}s) zDwf?xzMQ!@%AwJ>5@1%m`h6oz(tS;RrnjWKNgC;p&m*l=c`*K2B8%^>Zc0@!MY-HQ zA7^cxiLl1M>Kt!xr5h| zz*coG9J#taVf11cO3gbM#vw)|jMM6SVFEIqtXXJokuKxU4eeX{Y*me|`+AbB9xh}H zPwVF->~mORKXH82O^aQ=h`v_r)FGvymTUp8rndjsz_P%qkG;cP_E8&a2SYK$gRono zIq<+!ANOTArnsPADODXMQ}zX9GV+kmm&ijc+u5)MCSPGJtbK0i&lt&(9M;+pzt=wSk zj;k-Hk_^>xWk$rk{ggbt=@y*Pb{p6hP`!H>nXwHQk+^2>5cPtmi4h&|+$*R8yYjp= ztr`st*^Q?QW1k(u7(*(iQOq1IA+0OP4)j{PbQ_HF3Zy$WfIq^aUz+#KkFl57;`ueAAN;u7~|p zh6E3Vmn#s5GW@8B;3Unq+0OH<=_@8V->I66e36+G$%a?7v}ojmo* z*gGNN65SEgt@TnO`etH+!z>DD#wCc_%n zSeqqB6WTZ0$UL{&d;%PH4PMHTk+(bQ780%qFN-TDd`8Zi&O`WmWyy@5(fIpK%8hgl z;`ca#!m^Q%Q50R;SxZpawwJ1N*Snp$jCh*BbvN??($V5Z@1kdj;i6dd5HfsA(j@WV=02>5gKj`I%p3XWpP z&5hM!LH7gP9oRKE9KE<7dxu|4CF)_Ac+t0t^_UC672*jr>R8c|Kb~SznDuMs^Nr$m zUp6|}oURW={F=eezPcC~NzS0W-oh5oEVkT=XkchyU~tROr!n6?TZJo}r}k0u-K_iZ zUBfOM*eOdzENf)?M^!Y-Q&I8Zqk2ixw%k?X@H^-hkk+MiQIJqSA8QL~oSMo}q%nH?STkQ+ z8WTxEjP@-{pSAW--a$N`ADgU-x~e;lL58YG548e@derTwa4kQE-p7eC>-Cpq5g-wS z3x3Q|ysyv79aj?08(S60#F%PXgpizrwFI}2$5fVR(361RRW^5bQzhhqu6p#~Q}mow zofL+u%*Gm9_^J@oG-h<+AjDBwBAHUGd@GZsps;`(`qa8Yp0(Z$o0ca8eqvw}+3EPg z>GxK|a{iXNE~w6T)?PNnX2-P!J&`L zs0QtRAPr$Q3wSht8(dFqqQI}vafkKc)@^0W#|Z}`1Grk_)voHI#|7K5$zAHi`&0_p)AxXreAChbWx&NTx9PF8NV&A4=1}# zObdKVkanVEywX*Q%Fj_ap zD&QcBzO`dnjl1LM9c3HN6BDp(@9PYCeRZu%H{`liQne4=FbnURh}<@;Vvsk%=-PLA z{(O>LUYmp<7}FC?AZ2Eq>7F!&z|PzB0qy6N{-S7;Uv?f?n1HyzzUEikDbbG#efx3v zZ;V~S>SnsH71e2T``W#$GThRt>E?_%(+tG?hsdGZ9?zratZ+m!ED?fOz+~CEPf;aW8p5xVnkbc)Z6s6UcRy2Y0Q}Dt?lG)qyObaiM62Uj> za0EKNnI+(t{66&z_}zTVpcv_t7d4~!nHBYdxe|4#^AN7veVmUS#2>gnv_ux@Ozr!Z z;xyFu=Sc49`vgb!kk2|!JSyc#rkXdnz^4+;a@qZrJNggvDr04y%j8?Eb455AEc@uS zi(mI_OA+XB%Uo&KT3XBy)A`V{!hM>rI=*+Jy{ZLr;N;m{Z^W%=iwT`*WJ&uWDhHmD z*?BLw`rdPifIeqz;raHFJKoH|=HM!gn?2ss`y0c>n+Nw&(rzm6A$KRx7e9)&yL|Y+f7Si`7CS6@2Xym zlAe?x&NPbat4w=coBEv7$x~ld%xRN0;dQ9#{<>FutSO=^Y7dur$2EO98gmr%+_NLjt780go$6bzB7f&dakbL!bs}NRAs*q87!RBu{MiF?ODlfY z79Xyzd`3@`kC@Bt9k+4Nt$Gn|GqWZ08TmC0D{>PKGsn23)1rqA|C8l6Dy0b}mIl4e z#KL-q+|Tm!27S=QNVe~>U8$8Ur^&Wyb<)0^r1m1aG8dJp5lo$GBa8DQ`u5A7@#62T z7|T)~hq^MIB=HpHE+kl3CNEGra*Kn=^N!%!_%l(fYfObaQ02;ub$gl+M>lq9@uxmH zMi5lnmwPd_zO})14cxUFHk!3|KtL&%qA^e|eu-g6!?_;T^B_A{ygQ&~($iTjm~Q!= zv?8@%osSFYnkGg1YAeg`1N3d41rdRqYxXmi7jsQ@8h4W0pV70Thc0RM)IMq{XmM)` zzD2lcz&nmXH!=S$^1(-a>ydEh8EwNHDoyz&_ArV#hgdHYc>Cd*FYDPx4;b9!Tzh&Chi2(O~*G#jqnd6R&m*F&3&(#H^cY2IkwwnX7e?v^qK zi~Ox%v^}_-zQ+A}npInCFd4kGgKUg#1?8vY>dLr?$0UJ!cdpo9ps}j*64L&0o$P>o z>t@xk?CM^`RsBLr@-Xt16C)kV_0d4 zx|aETlzo-&h#yBQ+Fkp~AF?y&K8*N|IaR8OXh7}gwGma=H6Lksuil~APnx_&tN%fo z#k_e-Il|T@@(pjqEG3Bs{EPhQ%(S)6^7WRNulV3eKD+moh<}o5yOCURzAck?JM+fY z;QYmH>y7xO`P?7x;?TF3x;&nZGfvd~giHSHvN~q=yG@Kh>GtL+MJyYU$~^_N0t9ak-UMNHf}ABvz6d28 z7JhCagrKrfJfR)PQg%e~M1`=tsZiZYTCYU*qXlD`Z0fDn%G?^nmdec^u2OZ05`5S&5qTLGv)}fVK~nRl z8f>euK_E+d5a`MY>H{K}ROqOtd{=T*L=eaa84~5d3>BsB=>WrUT$7HPy6Ky62NpIht&19GAyp7l?}jz?eu2f^o7=ew)^4yoE`nethseQ z^K5pX7bl`$Of*c^w z;ib*WMElI~OY# zPgOH>=oqP6q{ilenJ)rnCOd)g8u}gc(@D=ZF_G_-n>wHpBakYoPq40x{?3xIu`#m% z+lZK&p5s%G>|-Ag08WYzC`fYxSTzX+c6I($(KV|L%nU zwI^Q9%*hIDV|537tfsP)y$1{tx7=>(ssojgA2wv~P*{g50y^fotU)1AyMlz_AbZE_ zU8oolcd!!-7AcKL`wieOup<2&>HlKQemYTn0t8r{z5xGwy&O;kHIV##jm|HI%E1YS zlfB9D@pyI?GJtnDxthSft5)2GJ3APmuAc*>KVLLR zvm>IMfB_|+orS0s44v31UK}<7Iys|5jt%Cpf5)hsdB8B#Zp8(21yrC;qk!z^{e-_0 zH0(?)%}lJ#OwVnaBOKn7VIUD1%Rz>IUFzS7nt+FzTbZ2-k*7x>xc`22JOVM2{G9?e z1v>z-*7?*>BvOQDrWOcZLBNlgPpI(-I^dse{6PCee*O%4`)*R2eQNp+-66q(yE_C6?hd=Sy95go!GgOx!3h@J5-hj}cVFJ-{;zJxUw^%-dtYyD z?Wr@h-8DVa-P7Nk(*scUb4E&>wLuTN_IM4#tKJdsLBZ`zB7YsI=yUsBHPR}(0^dhw z5lT@;67Ug5+uk_G*nIuU$$*C)ifK_ac;9??R8=QhwAcBvEmm&{-4_O+z%DL*WWmcI zN?TZK%%F_S*diM57mvuF4>%3}-V6x+oS)QI8n&rBt&cL8hy}PngsK@kSqu{wirbZU z=gAy@Tlh(~M*s^>_3$ySt_JAr#*YiD-rfdYfuH91^p(Pgg*~}6D3a!6K8r8XiMb#hYPytr=@g~hg1^Biu14X>g-$n!B1 z(11}Cx$-k+4A1eg9FTakLNdN?q`?tJ0&>+@=mw72w9qn;X#BXVSW$O&iSL+C$d_mF zGYYdujWI4Yls2cZ3E>2K_N4~qPZ3bNMZ^rhp`z~O!%xFB7=K9VtVW#pqW;ANP>j}t zzl%+^a|@OXg&dN;?3;=`8JIINf?UvMR!DRZ$2`w>|0#YNoM`*waXC+Xn;jLA1?B{` z4*KzI5vJo>Hh26cU|9}{p5BMvrYfTtjpf_!ywsa`mC>!x#~Y4)cF+(3=zKW|Hqhu1 z4cu>B=nwTeN8kRk9h<@hk8DzB4f|1v3e^5y4^xk5#bl2!K|@_OY5b<+b5UqUSPE$j zXE0|=Gr2RbSTth7jmZP6A{)y}b&lfL%EAYWj1`wN|DltbyKn1K6Z7+}r6J%C=ggegerABdL zDY?A{wf-rjPU z^v2b6RVD%YTEnM&@h$gJlSiH|d~0B`j?A(~?_uL1ez`5I`rrlz&zM5()N$mHX!h!B z4MBGMRsp8li06QKXImUh>x)89G&i}OW7-IeDGaE#QWYsf8N1ozb@Vc0CuHhV*B|C* z(g@z{T&x@RoE@Z!bf9D(#$sb=XB%$Bnh(ckVZj3EQ31UKISg&Bn~Ljx8l25wN}B&|CG=w!xT47$MwA!~IqR047% zGXPUG4}{l^;t!R}>1L^g)UjId^ELO|@#aiC z-}vlpmmVet1LJG&3b$^!?>iWPp&l3s?@a805#ZZ^G`Qx5Q$7~W9=|z=# z0Tf(lc%e^0Z;6(X#Hbb@-&5?Ep4JKr9K#%N@@Go&Q(D@eV)Wb(^NCWHz%^8dA8;wQ zM-%!5;*d+qGFm!;F&NXw^AqMvl02ZzEa(I=ceaoiF}5MMkppw}#FoFhupF#wn|jfW z7rcy2$W*Pm50KUHsHq8KlWh(vWrjk79fazpzd{nzwR?Px2_m!r!l|E&nx(RdE@f4P zh$Ngu2nz`gZt=m(PRIn?Bb}}WyoY`*J@O@GWjo-=MA%E8FCHw~w+q53cCtnR)0VoNI66B6Z=N{>0dp2Xr zEBmR|<<~Vo0OIeWVVl9y5@(N5nwl^5smfDdN0MNYg?dpq>A^ib(qeu7u&v1ZF5W2> z(^#bo+f)ki zF@$Q3m5wtAUdte&RRVqfFJ-&lrns;MKC8rla?Rs+^a%eTqEz~Fg0bc`01P8&?m)EV z3=g&{(*{DN>3pdf`v5;V;+dt|Dh1GGC=hrcB6Jp>h-C%cXMWB|T zGOJP8?I)>+FMM6%0=53Fmkr^7W>Qhc6_R`Mi+R0Qj8U9{GSCRR4`1LixwOq*CSwa41Up&X7uyUge7R}_0blD zKi;f7PI!Cdg8<5DNNv3pSx&E}J||E7&TiNvr)-!o14OanMsQY_Y@0tCZcZl0Ta-ka6BDs44tZlKEB2RJHU$bS+xSZrxgA?!0-NM{Mk8AAH%w@FuGPGU&2^l zR7F={H-Sgw$oXOuVji*mz(sCCJcpRFEk=#>I7M+Y(=^#wsQ&{a$W(YzJnVqjMtVlH2vO^k1&8a6vsGoWv-K2 zbXzWMj_+PB`Tk;Osrn12aYo;Rpc#sKen@*G%zHqoRHqm^!-WY~95#9()$GV1^kpDw zW+qz$IvT7zO+;CwLe^xVsj86k0+*{qsyhl5iJ31N1ObGkdgs)>rjnPnKZ!*G~g zk;G{$ld+u_35D>F;`7{JBr}C22%e#Mku5tpf*ut2Z^)3nR2SGmguE=z%gh$QzPVI_ z%QlzA)8H9zydEgSj_LK_FupTBc3I(#8=a2pANP+@7-w}XvQY_EWDkjaOxH#<;)N3J zxL5e33P|vzTQ6M$tR#Gl*4P_L;Gw4*>BXN>7;#;`F)n%oSWht6D!{sDL9T8f zAUn|2jNQ!10rEAsaJ2#2I9jp)YW}~i5>AemHdbz~CLkLpM>bm%cat`)1!ZDROg}>! zaMz#$2^L{-Jerg|RB^d{ah7;1QNNs`#|-lVv9%hwt=%Xw*4wKHwx!x?>w5TP7;>(l zM{7>tF+5g#R`v?@;~u_SPvC{Pbs>S1)m>l1-nWcr zIJ__W46BL!I$ix@TPTwj;^5h|cWk=Scy|($+Ox}3(Pk@by$8;BPq(}StzC`7nLek9 zv>xe}0~-rH9?V7%DPFvLW^nBORlBVd9=estC*LM>_r6YXil6gtbeF`qC2@t+dYAh+ zDl_9tRA2e|CmA-5Yzb%u?J4%AZ0ut_LZiDQhm00#v+uLEBQ$zyZYGG`Q8zc=_?yC9 zfHHb9TzvYJVl712$o=;%N>gVv`^ssmCC;4;pl@LWP-?!cO`K9J-n;Of=J9GxS^SMeIF7~%9iXy``^-cyYDSnEJdq42%H7u_ch(zKI$4o`{M{0^J2=J@->l__~ z%cBAsXEh$jYN!3+ z4*w(J7f+~P>Unfh;VFZ3-W%$vdfF__|4@(UzgLeY#C84Us4_Gb9fLV=+WUGuted)f zrV%(4K%@JXbG_ih7Vpl_;<_q?mVF+}HWNj}am@fY*U_1yZBfRJw1GgmB%lqRF>VRf zx*or%6?4S8f90}jpQW!B?%;{d&(637eCirntK$VDoYaz8$->>2cjxP+uXm*27Jzc85&rfk~g zBIIbSE0E?fQegP*AUqdTf)9T{@8CE^m zr$bwpVDQJ#3jCv?RdlklaTGKAd%C-+kH}MtVYVZjqW6-}ASG7)WJUCTg>{KEpQ$`K z`;qXDUQP0t919;$7auni*WKjp>z+68FRnQ(xx7zt_sL!o(I=U1jbEJkX-2An^n35jRP>6KizzC>Ku&GcvgV_DcEX4#R3@47=l=JQq6CF*SP$0=LU-7Pq*5JD zxk)WmemEJ99(skVU@wr{m1_WCb=0l!!pKMI=aSO(gTALHrs1J<2Tx|>JQ0JyBmUy! zv`WTVQ#+xCA|y|jT^;? zQKR8m2^PUA(?aJ^1i2~cW}3igb2&;n*Me-pn3%vb3wz(S#YMBP^iVNhiEyP_U_QV` ze3S}NC9pG+;w%)@F>CR#*XFV~IOER94rZV}wC+TFc1vUj%ibMb$;Tk($!PsqZknu^ z5fsi+wyJ?2no@Seaf=YY5LIcxm2HeX-r^mlK?K-`d%lxZR2;#1*YH-QWS;Pj_cAD_ zLAW&9&r3yxEwn11eg z_g@%P?63$==JUkze=yYtS_jG0Eh;8C_?dZROp1du=H8ID)SpShX`9k#a&!0BZkH*r zIbI`+;pkFD(=ruXw9Bj8s1j=t3K7TmQGZMc<8mJ16_n%e#Wl=lP;^anLhg!XIYp_^ zwqCl&(V6e46_T^E{@!~EmBYoQ6qmf_QK+8QzT#6cW7WEkf|l=j?Ww8#z8Hr>z2b%M z<@3l5{O(S6lt^fCVs8SdhNT}<1^}V&{6ryx%j5gADOkIH_K+Iz{DrZ)5O_=R6jMX5vpU42pbw=3o#Uko^NkUPXsG=8R4tyWjVSXI*<4Q10_6% zTV!|MQID;KYl5^Gw%$l6YWk7Z0;QU-iyT+w;wuw74jC}keul0Bn>zO}3ruPeMFY1)k!u4tuNk+= zW`?J#PZ1UUqAKZmFRn^_sAxHHakod9Otb zqp?8HF60!`v8wLPdq$-Da?N>;!dgZ}Iv3OEsWrTmGl!yy8ru&e;e{zqukIQQGgp=% zZ>wi`TSp2vhdg+V_v-H?#T5QfA3h6O$Ng3+Pk`JQC%k#E_^ds^Z=#X;-Y4LebZ6JE z`ATb1ar==d7QB}`*QWf#N-#$x0Ad;lh?5mQdY#Y!zyi`!Q=$GZQxW_BFqOY!<)ZeY z@&X4z8{4xZFf($bO^oeYasPs-8xO)ek}vEws4c$i^Rz(!$>x)DWyt!H-d+E z-gMAOFy3&mLCumJ-jKx2K^g0_*(*f_hlRu&evitX$n>(`l_c)R%kdS7$nYci`}#yq zPGiU^%QTnjr74s$ywI*P?s;7j6t{zoo_I~dnx*?lB}0#qHv619>Dba}Y5T}r&NDx3 zaWKAmB5wprW~7?Z+cMUEbP^(Zxkb;L@b!*Sc?-Q5O#Ow>_lxRuFR}Lr{bL#&F52P_ z;!s|MukS_@(R#Cjjw-4o`W_B;Ji4$YuB5e|TW*k!ufiWfO7RuII=T+SR5K6Jjv7mS z7syn!$$Ft0)6W^}>~W|ujc^@ATb>-3tK@2LmXU^HQa$Va^HfcTzAtEEoLlZ|OG$qA z@>tgB6~6{AgUCwFV#If>j9qB!5Ef0#=HX!$IqTdM%>J-q*caAn(?9AUlM4Q4!pj(pcU-92ISo%dA`GcC(Y*bJlfzu z4WF(unIqcp;Gm-d$y8ytfK&bjvKW)6)G3`3p2hp7a|uzHNzA*Dnmlzewhcu@4rxOg zQJ413vU#$!@!m)l1Jx2+6(x_F*5Xquy7To}`Rnl`!~Tauw?`+!nUk{^yT|-k6a|6a z#gz`krYg)P(r->qLyuES^SImOUxk4_Ud;}kd^!OyDe5i{suqu+-=zeU@AT#Wl=(*W zW$Jp%!6EyibStXM%C7xJ=jz*Vf|NuFeVCEJR>R@Kxb9mTyWrY52DhBc5;~PT{S1QP zns`m+e7S{LvSQ89j{n${*!fM)Cd8)vQJ&hAj_;p2@{50DQyPCI(tm{=H!XdYAKIAy zJkK6i2UHB}Tq{(B&_A!6H5k3iAr%Ip(N6&&osC1lZiKTK>?ybCB>-EMH$b4yDFYV*^-r=a4edwS* zqDGkh4yDNL8d4;yZTCHCZ!02He5qYVu8h6S+ZSXtxA2X+Izn@m)$;;&{!r{086!y# z{G%w)7IJm&BEe^#`B3W4OE&l44gJ|i#K=sMrB8ku-jB)S-P(ih?e+5{&cKq1>vCX#i$8x8tpTe>h0^S63Jm?ZaCw`1a`k7KcUuKr} zjcpG$4^HRN!%mtU!*avavkmeLG<#>OZzQkXcx6G!)nvpr-Nuo&#@PilxR;hMVu
  • *4L_SDzQf%?L`d1qZ?_eo)vLKqv9)h-+2nw{K(7$*&yCG`Q4B%AyC{P^RSbu@tG- zkW7M8zvePF$E%-h7=@Bv`zK&SbFEFV+(>e$bs;|>Nl(>%I*OB!DEZdC+k&B}qc`OZS&^fp z?(|s8?Hdz|rec5EIep^KEpdx9HM&9`GsI&J!elM@PCV7(O78AAVd-Rt<(ihDqm3Aw zccB1f`R4(Ih^hr!sTyI)=33HGU}*vZLhO7^p>BuIrz!!K2@YyLsDvVlb9|WFZ+g=x zIlJjv`vnEWS1r8Lbarj%V=o`c(%-_2FTl_}{*|fHCelt0Kvt4qs7(h9pSx?Xk@O?kT5HNtEuv`@TWWb)q>fO8!VY|%$e)U05APa8RJr7BeYXLZ zE$~@&Sc&eHq$%8(K4=MjsK>S6PBdORZXgd*#8uaWN%4&p&vgvXhc{c#x$*+Kbyz^= z22oA)C~s5(x<*plGzQEFL`~NB6%})E)2+f@2X}ujatVNC`xL~j)Iqew)UmG z+sqigQn)7weeE4CtB&)&@Ka^G|7St|&o}PQ4-fZ0hq`*NuTAeyZjbk&HpANq^S8he zOE2Z#{;>TD6~OGr=>8P}n*=G6b-(Do(JXL`_1Egm2E8Y$36jX<{y(!_?te5rv~4Ur z{)!_G@k+?uqNvg{tmo*uKP}lP3`H?vyZlHbVjJ9L)n7+?cobarM{}fo-0)dW3j{~g z207Vor(q*8FU!BGew$iXP)fz_S|LFVkKdYW7t7q(JB}vqQ#Kn?sfvrPh~bIng%^5c z4eOJH81klI^W=pkWtOp$bmFxxk-w;44$XqK4$DhDI`i@$@WXcVhsYPTFWoK}U)Fy1 z47*4m5w$s$kXNn-@!CFs#{3=`d}+5I?;1WD=1!B`^s{F2{-vBe2ftQG*E1ms`km!9 z{};;h{2wXjKZrD&r-Oa$+iLV~3e0dTC0_*BmaH@whxN6MA`H=EdrllwnQ#60`glqU z10b5mE1*%rx6=Ckpr9BJIQtuT0)YeezHe~pDiIgxC9d_!I1>1bN-U(sAVse&%{Op5 zM#Kn;`cj&Km#iv+@Djx#`q(bUHz!F8S2P5p>!hg|dSefBPFR<;Vg+C4 z5drH=2X|43 z%YDk--o}*O*4)W~m5YsojR#^Ku1|UW+TD1Hxc=JR_)SCVuz&FSr+XbwCH+EhpMsaa z5ZvFSrv0xa{fXy375NJleG00H{+0*1a(?x%MgARto=W=_*`A^^zks^mq@epxr2RK+ z_f*a=tmkQJ`wQ#&P0srNM9%*}ex8c@l`B78@r(VI1G!2w{P&{%rv`te5l>eQztV`` zbY${R#63wWp7!Y1AU%ydzm^}riOBMwi};^C`Af_bAO0(h{U(0ve + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + private int count = 0; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return count == 0; + + } + + public int size() { + return count; + } + + + + public void enQueue(E data) { + if (count == DEFAULT_SIZE ) { + throw new RuntimeException(); + } + elementData[front] = data; + front = (front + 1) % DEFAULT_SIZE; + count++; + } + + public E deQueue() { + if (count == 0) { + return null; + } + count--; + E e = (E)elementData[rear]; + rear = (rear + 1) % DEFAULT_SIZE; + return e; + } + + public static void main(String[] args) { + CircleQueue queue = new CircleQueue<>(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + queue.enQueue(5); + queue.enQueue(6); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue());System.out.println(queue.deQueue());System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + queue.enQueue(7); + queue.enQueue(8); + queue.enQueue(9); + queue.enQueue(0); + queue.enQueue(1); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/Josephus.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/Josephus.java new file mode 100644 index 0000000000..a59696088a --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/Josephus.java @@ -0,0 +1,49 @@ +package org.xukai.coderising.queue; + +import com.google.common.base.Preconditions; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + + public static List execute(int n, int m){ + Preconditions.checkArgument(n > 0); + ArrayList deadList = new ArrayList<>(); + ArrayDeque deque1 = new ArrayDeque<>(); + ArrayDeque deque2 = new ArrayDeque<>(); + for (int i = 0; i < n; i++) { + deque1.offer(i); + } + int count = 0; + while(n >= m){ + if (deque1.isEmpty()) { + while (!deque2.isEmpty()){ + deque1.offer(deque2.poll()); + } + } + count++; + if (count == m) { + deadList.add(deque1.poll()); + count = 0; + n--; + continue; + } + deque2.offer(deque1.poll()); + + } + + return deadList; + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/JosephusTest.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/JosephusTest.java new file mode 100644 index 0000000000..9a1a0a4dcb --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/JosephusTest.java @@ -0,0 +1,29 @@ +package org.xukai.coderising.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2]", Josephus.execute(7, 2).toString()); + + + + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/QueueWithTwoStacks.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..f1a89a82a9 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/queue/QueueWithTwoStacks.java @@ -0,0 +1,83 @@ +package org.xukai.coderising.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return stack1.isEmpty(); + } + + + + public int size() { + return stack1.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if (stack1.isEmpty()) { + return null; + } + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + E e = stack2.pop(); + while (!stack2.isEmpty()) { + stack1.push(stack2.pop()); + } + return e; + } + + public static void main(String[] args) { + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + queue.enQueue(5); + queue.enQueue(6); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue());System.out.println(queue.deQueue());System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + queue.enQueue(7); + queue.enQueue(8); + queue.enQueue(9); + queue.enQueue(0); + queue.enQueue(1); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + + + } + + } + diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java index bd1eb4bf11..409291ec84 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/BiPushCmd.java @@ -3,6 +3,10 @@ import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.Heap; +import org.xukai.jvm.engine.JavaObject; +import org.xukai.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -16,7 +20,12 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } - - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject javaObject = Heap.getInstance().newInt(getOperand()); + frame.getOprandStack().push(javaObject); + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java index edb68e1256..4c888e8e36 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/ByteCodeCommand.java @@ -4,6 +4,8 @@ import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.constant.ConstantInfo; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.StackFrame; import java.util.HashMap; import java.util.Map; @@ -14,7 +16,42 @@ public abstract class ByteCodeCommand { String opCode; ClassFile clzFile; private int offset; - + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); static{ @@ -125,5 +162,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame, ExecutionResult result); } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java index faa268b0d2..8e100b59a5 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetFieldCmd.java @@ -3,6 +3,10 @@ import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.FieldRefInfo; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.JavaObject; +import org.xukai.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -13,10 +17,22 @@ public GetFieldCmd(ClassFile clzFile, String opCode) { @Override public String toString(ConstantPool pool) { - return super.getOperandAsField(pool); + return super.getOperandAsField(clzFile.getConstantPool()); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); + + + + } } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java index 4112f7cc56..1af0fa9e80 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/GetStaticFieldCmd.java @@ -3,6 +3,8 @@ import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -17,4 +19,9 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java index 7dd0b62407..86f104130a 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeSpecialCmd.java @@ -2,7 +2,13 @@ import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ConstantInfo; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.MethodRefInfo; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.MethodArea; +import org.xukai.jvm.engine.StackFrame; +import org.xukai.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -17,6 +23,23 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int index = getIndex(); + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(index); + String methodName = methodRefInfo.getMethodName(); + String paramAndReturnType = methodRefInfo.getParamAndReturnType(); + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java index 77ba5c7460..b6c8505295 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/InvokeVirtualCmd.java @@ -3,6 +3,8 @@ import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.StackFrame; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -16,7 +18,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java index 2d8b1ae2f3..db9aba648d 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/LdcCmd.java @@ -5,6 +5,10 @@ import org.xukai.jvm.constant.ConstantInfo; import org.xukai.jvm.constant.ConstantPool; import org.xukai.jvm.constant.StringInfo; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.Heap; +import org.xukai.jvm.engine.JavaObject; +import org.xukai.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -26,5 +30,21 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ConstantInfo constantInfo = getConstantPool().getConstantInfo(this.getOperand()); + if(constantInfo instanceof StringInfo){ + StringInfo strInfo = (StringInfo)constantInfo; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } + + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java index 0ac1b33832..30174639a2 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NewObjectCmd.java @@ -2,7 +2,11 @@ import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.ClassInfo; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.Heap; +import org.xukai.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd { @@ -16,5 +20,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ClassInfo classInfo = (ClassInfo) getConstantInfo(getIndex()); + Heap.getInstance().newObject(classInfo.getClassName()); + } + + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java index 63683e3865..658375f3bf 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/NoOperandCmd.java @@ -3,6 +3,10 @@ import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.Heap; +import org.xukai.jvm.engine.JavaObject; +import org.xukai.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand { @@ -15,8 +19,124 @@ public String toString(ConstantPool pool) { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } - - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + } + + public int getLength(){ return 1; } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java index 0a5987e4c3..fa6bdc7d0e 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/PutFieldCmd.java @@ -3,6 +3,10 @@ import org.xukai.jvm.clz.ClassFile; import org.xukai.jvm.constant.ConstantPool; +import org.xukai.jvm.constant.FieldRefInfo; +import org.xukai.jvm.engine.ExecutionResult; +import org.xukai.jvm.engine.JavaObject; +import org.xukai.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -16,5 +20,19 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + int index = getIndex(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + String fieldName = info.getFieldName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = info.getFieldType(); + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + } + } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java index b423f989ae..c221302acd 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/cmd/TwoOperandCmd.java @@ -50,7 +50,6 @@ protected String getOperandAsClassInfo(ConstantPool pool){ protected String getOperandAsMethod(ConstantPool pool){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); } diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/ExecutionResult.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..0baa5280de --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/ExecutionResult.java @@ -0,0 +1,57 @@ +package org.xukai.jvm.engine; + + +import org.xukai.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/ExecutorEngine.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..6a0bdc50f3 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/ExecutorEngine.java @@ -0,0 +1,58 @@ +package org.xukai.jvm.engine; + +import org.xukai.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + StackFrame MainFrame = StackFrame.create(mainMethod); + stack.push(MainFrame); + while(!stack.empty()){ + StackFrame currentFrame = stack.peek(); + ExecutionResult result = currentFrame.execute(); + if (result.isPauseAndRunNewFrame()) { + StackFrame nextFrame = currentFrame.create(result.getNextMethod()); + nextFrame.setCallerFrame(currentFrame); + setupFunctionCallParams(currentFrame, nextFrame); + stack.push(nextFrame); + } else { + stack.pop(); + } + } + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + List parameterList = nextFrame.getMethod().getParameterList(); + if (parameterList.size() > 0) { + + } + ArrayList localVariabs = new ArrayList<>(); + for (int i = 0; i < parameterList.size() + 1; i++) { + JavaObject javaObject = currentFrame.getOprandStack().pop(); + localVariabs.add(javaObject); + } + ArrayList params = new ArrayList<>(); + for (int i = localVariabs.size(); i > 0; i--) { + params.add(localVariabs.get(i)); + } + nextFrame.setLocalVariableTable(params); + + + + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/Heap.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/Heap.java new file mode 100644 index 0000000000..0e46ee43c9 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package org.xukai.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/JavaObject.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..9a544321c0 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/JavaObject.java @@ -0,0 +1,72 @@ +package org.xukai.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/MethodArea.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..9188070ce4 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/MethodArea.java @@ -0,0 +1,75 @@ +package org.xukai.jvm.engine; + +import org.xukai.jvm.clz.ClassFile; +import org.xukai.jvm.constant.MethodRefInfo; +import org.xukai.jvm.loader.ClassFileLoader; +import org.xukai.jvm.method.Method; + +import java.util.HashMap; +import java.util.Map; + + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + ClassFile clzFile = this.findClassFile(className); + return clzFile.getMethod(methodName,paramAndReturnType); + } + + + public Method getMethod(MethodRefInfo methodRef){ + String methodName = methodRef.getMethodName(); + String paramAndReturnType = methodRef.getParamAndReturnType(); + for (String clzName : map.keySet()) { + Method method = getMethod(clzName, methodName, paramAndReturnType); + if (method != null) { + return method; + } + } + return null; + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/MiniJVM.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..7ea53b7f32 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/engine/MiniJVM.java @@ -0,0 +1,30 @@ +package org.xukai.jvm.engine; + + +import org.xukai.jvm.loader.ClassFileLoader; + +import java.io.FileNotFoundException; +import java.io.IOException; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java index 27585d73b1..0424356553 100644 --- a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/jvm/method/Method.java @@ -8,6 +8,9 @@ import org.xukai.jvm.constant.UTF8Info; import org.xukai.jvm.loader.ByteCodeIterator; +import java.util.ArrayList; +import java.util.List; + public class Method { private int accessFlag; @@ -83,5 +86,59 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ } + public List getParameterList(){ + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getMethodDescription(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } + } From 4c410e3b5ae091b40e776be347a901dce4392d1c Mon Sep 17 00:00:00 2001 From: chzh88 Date: Fri, 28 Apr 2017 09:39:48 +0800 Subject: [PATCH 347/552] delete virus --- group15/1512_656512403/.idea/description.html | 15 - .../com/coderising/download/net_multisoc.htm | 505 ------------------ 2 files changed, 520 deletions(-) delete mode 100644 group15/1512_656512403/.idea/description.html delete mode 100644 group17/1282579502/src/com/coderising/download/net_multisoc.htm diff --git a/group15/1512_656512403/.idea/description.html b/group15/1512_656512403/.idea/description.html deleted file mode 100644 index 0f928c44a1..0000000000 --- a/group15/1512_656512403/.idea/description.html +++ /dev/null @@ -1,15 +0,0 @@ -Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group17/1282579502/src/com/coderising/download/net_multisoc.htm b/group17/1282579502/src/com/coderising/download/net_multisoc.htm deleted file mode 100644 index 852129b19a..0000000000 --- a/group17/1282579502/src/com/coderising/download/net_multisoc.htm +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - - -Java Examples - Multithreaded Server - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    -
    -
    - - - -
    -
    -
    -
    -
    - - -
    -
    -
    -

    Java Examples - Multithreaded Server

    -
    -
    -
    Advertisements
    - - -
    -
    - - -
    -
    -

    Problem Description

    -

    How to create a multithreaded server ?

    -

    Solution

    -

    Following example demonstrates how to create a multithreaded server by using ssock.accept() method of Socket class and MultiThreadServer(socketname) method of ServerSocket class.

    -
    -import java.io.IOException;
    -import java.io.PrintStream;
    -import java.net.ServerSocket;
    -import java.net.Socket;
    -
    -public class MultiThreadServer implements Runnable {
    -   Socket csocket;
    -   MultiThreadServer(Socket csocket) {
    -      this.csocket = csocket;
    -   }
    -   public static void main(String args[]) throws Exception { 
    -      ServerSocket ssock = new ServerSocket(1234);
    -      System.out.println("Listening");
    -      
    -      while (true) {
    -         Socket sock = ssock.accept();
    -         System.out.println("Connected");
    -         new Thread(new MultiThreadServer(sock)).start();
    -      }
    -   }
    -   public void run() {
    -      try {
    -         PrintStream pstream = new PrintStream(csocket.getOutputStream());
    -         for (int i = 100; i >= 0; i--) {
    -            pstream.println(i + " bottles of beer on the wall");
    -         }
    -         pstream.close();
    -         csocket.close();
    -      } catch (IOException e) {
    -         System.out.println(e);
    -      }
    -   }
    -}
    -
    -

    Result

    -

    The above code sample will produce the following result.

    -
    -Listening
    -Connected
    -
    -

    Following is an another example of how to create a multithreaded server.

    -
    -import java.io.BufferedReader;
    -import java.io.IOException;
    -import java.io.InputStreamReader;
    -import java.io.OutputStreamWriter;
    -import java.io.PrintWriter;
    -
    -import java.net.ServerSocket;
    -import java.net.Socket;
    -import java.text.SimpleDateFormat;
    -import java.util.Calendar;
    - 
    -public class NewClass {
    -   ServerSocket myServerSocket;
    -   boolean ServerOn = true;
    -   public NewClass() { 
    -      try {
    -         myServerSocket = new ServerSocket(8888);
    -      } catch(IOException ioe) { 
    -         System.out.println("Could not create server socket on port 8888. Quitting.");
    -         System.exit(-1);
    -      } 
    -		
    -      Calendar now = Calendar.getInstance();
    -      SimpleDateFormat formatter = new SimpleDateFormat(
    -         "E yyyy.MM.dd 'at' hh:mm:ss a zzz");
    -      System.out.println("It is now : " + formatter.format(now.getTime()));
    -      
    -      while(ServerOn) { 
    -         try { 
    -            Socket clientSocket = myServerSocket.accept();
    -            ClientServiceThread cliThread = new ClientServiceThread(clientSocket);
    -            cliThread.start(); 
    -         } catch(IOException ioe) { 
    -            System.out.println("Exception found on accept. Ignoring. Stack Trace :"); 
    -            ioe.printStackTrace(); 
    -         }  
    -      } 
    -      try { 
    -         myServerSocket.close(); 
    -         System.out.println("Server Stopped"); 
    -      } catch(Exception ioe) { 
    -         System.out.println("Error Found stopping server socket"); 
    -         System.exit(-1); 
    -      } 
    -   }
    -	
    -   public static void main (String[] args) { 
    -      new NewClass();        
    -   } 
    -	
    -   class ClientServiceThread extends Thread { 
    -      Socket myClientSocket;
    -      boolean m_bRunThread = true; 
    -      public ClientServiceThread() { 
    -         super(); 
    -      } 
    -		
    -      ClientServiceThread(Socket s) { 
    -         myClientSocket = s; 
    -      } 
    -		
    -      public void run() { 
    -         BufferedReader in = null; 
    -         PrintWriter out = null; 
    -         System.out.println(
    -            "Accepted Client Address - " + myClientSocket.getInetAddress().getHostName());
    -         try { 
    -            in = new BufferedReader(
    -               new InputStreamReader(myClientSocket.getInputStream()));
    -            out = new PrintWriter(
    -               new OutputStreamWriter(myClientSocket.getOutputStream()));
    -            
    -            while(m_bRunThread) { 
    -               String clientCommand = in.readLine(); 
    -               System.out.println("Client Says :" + clientCommand);
    -               
    -               if(!ServerOn) { 
    -                  System.out.print("Server has already stopped"); 
    -                  out.println("Server has already stopped"); 
    -                  out.flush(); 
    -                  m_bRunThread = false;
    -               } 
    -               if(clientCommand.equalsIgnoreCase("quit")) {
    -                  m_bRunThread = false;
    -                  System.out.print("Stopping client thread for client : ");
    -               } else if(clientCommand.equalsIgnoreCase("end")) {
    -                  m_bRunThread = false;
    -                  System.out.print("Stopping client thread for client : ");
    -                  ServerOn = false;
    -               } else {
    -                  out.println("Server Says : " + clientCommand);
    -                  out.flush(); 
    -               } 
    -            } 
    -         } catch(Exception e) { 
    -            e.printStackTrace(); 
    -         } 
    -         finally { 
    -            try { 
    -               in.close(); 
    -               out.close(); 
    -               myClientSocket.close(); 
    -               System.out.println("...Stopped"); 
    -            } catch(IOException ioe) { 
    -               ioe.printStackTrace(); 
    -            } 
    -         } 
    -      } 
    -   } 
    -}
    -
    -
    - - - -
    java_networking.htm
    -
    - -
    -
    Advertisements
    - - -
    -
    -
    -
    -
    - -
    - - -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    -
    - - -
    - - - - - -
  • - - - \ No newline at end of file From f2034f2018a1ba2b6a06d9e76667a49695d267b2 Mon Sep 17 00:00:00 2001 From: lzb Date: Fri, 28 Apr 2017 15:05:27 +0800 Subject: [PATCH 348/552] =?UTF-8?q?jvm=E6=89=A7=E8=A1=8C=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/lzb/basic/queue/CircleQueue.java | 111 ++++++++++++++++ .../java/me/lzb/basic/queue/Josephus.java | 64 +++++++++ .../java/me/lzb/basic/{ => queue}/Queue.java | 4 +- .../lzb/basic/queue/QueueWithTwoStacks.java | 101 ++++++++++++++ .../java/me/lzb/basic/queue/JosephusTest.java | 29 ++++ .../java/me/lzb/basic/queue/QueueTest.java | 106 +++++++++++++++ .../main/java/me/lzb/jvm/clz/ClassFile.java | 12 +- .../main/java/me/lzb/jvm/cmd/BiPushCmd.java | 13 ++ .../java/me/lzb/jvm/cmd/ByteCodeCommand.java | 114 +++++++++++----- .../main/java/me/lzb/jvm/cmd/GetFieldCmd.java | 14 ++ .../me/lzb/jvm/cmd/GetStaticFieldCmd.java | 21 +++ .../java/me/lzb/jvm/cmd/InvokeSpecialCmd.java | 22 ++++ .../java/me/lzb/jvm/cmd/InvokeVirtualCmd.java | 64 +++++++++ .../src/main/java/me/lzb/jvm/cmd/LdcCmd.java | 21 +++ .../java/me/lzb/jvm/cmd/NewObjectCmd.java | 23 ++++ .../java/me/lzb/jvm/cmd/NoOperandCmd.java | 119 +++++++++++++++++ .../main/java/me/lzb/jvm/cmd/PutFieldCmd.java | 23 ++++ .../java/me/lzb/jvm/cmd/TwoOperandCmd.java | 2 +- .../me/lzb/jvm/constant/FieldRefInfo.java | 19 ++- .../me/lzb/jvm/constant/MethodRefInfo.java | 18 +++ .../me/lzb/jvm/constant/NameAndTypeInfo.java | 13 ++ .../me/lzb/jvm/engine/ExecutionResult.java | 56 ++++++++ .../me/lzb/jvm/engine/ExecutorEngine.java | 68 ++++++++++ .../src/main/java/me/lzb/jvm/engine/Heap.java | 43 ++++++ .../java/me/lzb/jvm/engine/JavaObject.java | 82 ++++++++++++ .../java/me/lzb/jvm/engine/MethodArea.java | 89 +++++++++++++ .../main/java/me/lzb/jvm/engine/MiniJVM.java | 29 ++++ .../java/me/lzb/jvm/engine/StackFrame.java | 124 ++++++++++++++++++ .../me/lzb/jvm/loader/ClassFileLoader.java | 13 +- .../main/java/me/lzb/jvm/method/Method.java | 64 +++++++++ .../java/me/lzb/jvm/ClassFileloaderTest.java | 9 +- .../src/test/java/me/lzb/jvm/MiniJVMTest.java | 28 ++++ .../main/java/me/lzb/other/VariableTest.java | 24 ++++ 33 files changed, 1484 insertions(+), 58 deletions(-) create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/CircleQueue.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Josephus.java rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{ => queue}/Queue.java (89%) create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/QueueWithTwoStacks.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/queue/JosephusTest.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/queue/QueueTest.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java create mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/VariableTest.java diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/CircleQueue.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..a39bfc8dc8 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/CircleQueue.java @@ -0,0 +1,111 @@ +package me.lzb.basic.queue; + +/** + * 用数组实现循环队列 + *

    + * Created by LZB on 2017/4/27. + */ +public class CircleQueue { + + + public CircleQueue(){ + DEFAULT_SIZE = 10; + } + + public CircleQueue(int size){ + if(size <= 0){ + size = 10; + } + DEFAULT_SIZE = size; + } + + + private int DEFAULT_SIZE; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + private int size; + + public boolean isEmpty() { + return size() <= 0; + + } + + public int size() { + return size; + } + + + public void enQueue(E data) { + nextRear(); + elementData[rear] = data; + if (isFull()) { + nextFront(); + } else { + size++; + } + } + + public E deQueue() { + if (isEmpty()) { + throw new RuntimeException("empty"); + } + Object result = elementData[front]; + elementData[front] = null; + nextFront(); + size--; + return (E) result; + } + + private void nextRear() { + if (rear == (elementData.length - 1)) { + rear = 0; + } else { + rear = rear + 1; + } + + } + + private void nextFront() { + if (front == (elementData.length - 1)) { + front = 0; + } else { + front = front + 1; + } + } + + + private boolean isFull() { + if (size() == elementData.length) { + return true; + } + return false; + } + + @Override + public String toString() { + if (isEmpty()) { + return "[]"; + } + StringBuffer sb = new StringBuffer(); + sb.append("["); + + + for (int i = 0; i < elementData.length; i++) { + if (i > 0) { + sb.append(","); + } + sb.append(elementData[i].toString()); + } + + + sb.append("]"); + return sb.toString(); + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Josephus.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Josephus.java new file mode 100644 index 0000000000..8fcddcfb2c --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Josephus.java @@ -0,0 +1,64 @@ +package me.lzb.basic.queue; + +import java.util.*; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * Created by LZB on 2017/4/27. + */ +public class Josephus { + + public static List execute(int n, int m) { + List result = new ArrayList<>(); + + java.util.Queue queue = new LinkedList<>(); + for (int i = 0; i < n; i++) { + queue.add(i); + } + + while (!(queue.size() < m)) { + result.add(killOne(queue, m)); + } + + return result; + } + + + private static Integer killOne(java.util.Queue queue, int m) { + if (queue.isEmpty()) { + return null; + } + + if (queue.size() < m) { + return null; + } + + + java.util.Queue tmp = new LinkedList<>(); + int i = 1; + while (!queue.isEmpty()) { + if (i == m) { + Integer re = queue.poll(); + + move(queue, tmp); + return re; + + } else { + tmp.add(queue.poll()); + i++; + } + } + + return null; + } + + private static void move(java.util.Queue queue, java.util.Queue queue2) { + while (!queue2.isEmpty()) { + queue.add(queue2.poll()); + } + } + + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Queue.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java similarity index 89% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Queue.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java index 08303d3fb5..a70c6065c4 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Queue.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java @@ -1,4 +1,6 @@ -package me.lzb.basic; +package me.lzb.basic.queue; + +import me.lzb.basic.LinkedList; /** * 先进先出 diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/QueueWithTwoStacks.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..65c3b45fae --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,101 @@ +package me.lzb.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * Created by LZB on 2017/4/27. + */ +public class QueueWithTwoStacks { + private Stack stack1;//ASC + private Stack stack2;//DESC + + private boolean isASC; + + + public QueueWithTwoStacks() { + stack1 = new Stack<>(); + stack2 = new Stack<>(); + isASC = false; + } + + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + + public int size() { + return stack1.isEmpty() ? stack2.size() : stack1.size(); + } + + + public void enQueue(E item) { + + if (isASC) { + while (!stack2.isEmpty()) { + stack1.push(stack2.pop()); + } + isASC = false; + + + } + + stack1.push(item); + } + + public E deQueue() { + + if (isEmpty()) { + throw new RuntimeException("empty"); + } + + if (!isASC) { + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + isASC = true; + } + + return stack2.pop(); + + } + + @Override + public String toString() { + if (isEmpty()) { + return "[]"; + } + StringBuffer sb = new StringBuffer(); + sb.append("["); + + + Object[] array = new Object[size()]; + + if (isASC) { + int i = size() - 1; + for (E e : stack2) { + array[i] = e; + i--; + } + } else { + int i = 0; + for (E e : stack1) { + array[i] = e; + i++; + } + } + + for (int i = 0; i < array.length; i++) { + if (i > 0) { + sb.append(","); + } + sb.append(array[i].toString()); + } + + + sb.append("]"); + return sb.toString(); + } +} + diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/queue/JosephusTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..cc984089db --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/queue/JosephusTest.java @@ -0,0 +1,29 @@ +package me.lzb.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + //6没死啊 + Assert.assertEquals("[1, 3, 5, 0, 4, 2]", Josephus.execute(7, 2).toString()); + + + Assert.assertEquals("[2, 5, 1, 6, 4]", Josephus.execute(7, 3).toString()); + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/queue/QueueTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/queue/QueueTest.java new file mode 100644 index 0000000000..7c10394b40 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/queue/QueueTest.java @@ -0,0 +1,106 @@ +package me.lzb.basic.queue; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by LZB on 2017/4/27. + */ +public class QueueTest { + + + @Test + public void queueWithTwoStacksTest() { + QueueWithTwoStacks q = new QueueWithTwoStacks(); + Assert.assertTrue(q.isEmpty()); + Assert.assertEquals(0, q.size()); + + Object o; + + + q.enQueue("a"); + Assert.assertEquals("[a]1", q.toString() + q.size()); + + q.enQueue("b"); + Assert.assertEquals("[a,b]2", q.toString() + q.size()); + + q.enQueue("c"); + Assert.assertEquals("[a,b,c]3", q.toString() + q.size()); + + o = q.deQueue(); + Assert.assertEquals("[b,c]2", q.toString() + q.size()); + Assert.assertEquals("a", o.toString()); + + q.enQueue("d"); + Assert.assertEquals("[b,c,d]3", q.toString() + q.size()); + + + o = q.deQueue(); + Assert.assertEquals("[c,d]2", q.toString() + q.size()); + Assert.assertEquals("b", o.toString()); + + o = q.deQueue(); + Assert.assertEquals("[d]1", q.toString() + q.size()); + Assert.assertEquals("c", o.toString()); + + o = q.deQueue(); + Assert.assertEquals("[]0", q.toString() + q.size()); + Assert.assertEquals("d", o.toString()); + } + + public void circleQueueTest() { + CircleQueue q = new CircleQueue<>(5); + Assert.assertTrue(q.isEmpty()); + Assert.assertEquals(0, q.size()); + + q.enQueue("a"); + Assert.assertEquals("[a]1", q.toString() + q.size()); + + q.enQueue("b"); + Assert.assertEquals("[a,b]2", q.toString() + q.size()); + + q.enQueue("c"); + Assert.assertEquals("[a,b,c]3", q.toString() + q.size()); + + q.enQueue("d"); + Assert.assertEquals("[a,b,c,d]4", q.toString() + q.size()); + + q.enQueue("e"); + Assert.assertEquals("[a,b,c,d,e]5", q.toString() + q.size()); + + + q.enQueue("f"); + Assert.assertEquals("[b,c,d,e,f]5", q.toString() + q.size()); + + + Object o; + + o = q.deQueue(); + Assert.assertEquals("[c,d,e,f]4", q.toString() + q.size()); + Assert.assertEquals("b", o.toString()); + + + o = q.deQueue(); + Assert.assertEquals("[d,e,f]3", q.toString() + q.size()); + Assert.assertEquals("c", o.toString()); + + q.enQueue("g"); + Assert.assertEquals("[d,e,f,g]4", q.toString() + q.size()); + + o = q.deQueue(); + Assert.assertEquals("[e,f,g]3", q.toString() + q.size()); + Assert.assertEquals("d", o.toString()); + + o = q.deQueue(); + Assert.assertEquals("[f,g]2", q.toString() + q.size()); + Assert.assertEquals("e", o.toString()); + + o = q.deQueue(); + Assert.assertEquals("[g]1", q.toString() + q.size()); + Assert.assertEquals("f", o.toString()); + + o = q.deQueue(); + Assert.assertEquals("[]0", q.toString() + q.size()); + Assert.assertEquals("g", o.toString()); + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java index 5fd864b8a8..32e0c24bdf 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java @@ -103,12 +103,12 @@ public void setClzIndex(ClassIndex 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()); + if (this.accessFlag.isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name:" + getClassName()); + + System.out.println("Super Class Name:" + getSuperClassName()); } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java index 83eec1cbc7..33ffcf8848 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java @@ -3,6 +3,10 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.Heap; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -17,5 +21,14 @@ public String toString(ConstantPool pool) { return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); } + public String toString() { + return toString(clzFile.getConstantPool()); + } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOprandStack().push(jo); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java index 07e35cb0ce..10bc1042a6 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java @@ -3,6 +3,8 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ConstantInfo; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.StackFrame; import java.util.HashMap; import java.util.Map; @@ -14,58 +16,99 @@ public abstract class ByteCodeCommand { ClassFile clzFile; private int offset; + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static final String iload_0 = "1A"; + public static final String lload_0 = "1E"; + public static final String fload_2 = "24"; + + private static Map codeMap = new HashMap(); static { - codeMap.put("01", "aconst_null"); + codeMap.put(aconst_null, "aconst_null"); - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); + codeMap.put(new_object, "new"); + codeMap.put(lstore, "lstore"); + codeMap.put(invokespecial, "invokespecial"); + codeMap.put(invokevirtual, "invokevirtual"); + codeMap.put(getfield, "getfield"); + codeMap.put(putfield, "putfield"); + codeMap.put(getstatic, "getstatic"); - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); + codeMap.put(aload_0, "aload_0"); + codeMap.put(aload_1, "aload_1"); + codeMap.put(aload_2, "aload_2"); - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); + codeMap.put(bipush, "bipush"); + codeMap.put(iload, "iload"); + codeMap.put(iload_0, "iload_0"); + codeMap.put(iload_1, "iload_1"); + codeMap.put(iload_2, "iload_2"); + codeMap.put(iload_3, "iload_3"); - codeMap.put("25", "fload_3"); + codeMap.put(fload_3, "fload_3"); - codeMap.put("1E", "lload_0"); + codeMap.put(lload_0, "lload_0"); - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); + codeMap.put(fload_2, "fload_2"); + codeMap.put(astore_1, "astore_1"); - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); + codeMap.put(if_icmp_ge, "if_icmp_ge"); + codeMap.put(if_icmple, "if_icmple"); codeMap.put("A7", "goto"); codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); + codeMap.put(ireturn, "ireturn"); + codeMap.put(freturn, "freturn"); - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); + codeMap.put(iconst_0, "iconst_0"); + codeMap.put(iconst_1, "iconst_1"); - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); + codeMap.put(istore_1, "istore_1"); + codeMap.put(istore_2, "istore_2"); - codeMap.put("59", "dup"); + codeMap.put(dup, "dup"); - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); + codeMap.put(iadd, "iadd"); + codeMap.put(iinc, "iinc"); - codeMap.put("12", "ldc"); + codeMap.put(ldc, "ldc"); } @@ -106,7 +149,8 @@ public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(this.opCode); - + buffer.append(":"); + buffer.append(this.codeMap.get(opCode)); return buffer.toString(); } @@ -120,5 +164,5 @@ public String getReadableCodeText() { return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame, ExecutionResult result); } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java index a5fe80425b..acb6a1fa4a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java @@ -3,6 +3,10 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.constant.FieldRefInfo; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -16,5 +20,15 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java index 2d4d8d53a6..f6f8cf89ee 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java @@ -2,6 +2,11 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.constant.FieldRefInfo; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.Heap; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -16,4 +21,20 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + //TODO 处理非System.out的情况 + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java index 6af68455a0..8677e66247 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java @@ -2,6 +2,11 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.constant.MethodRefInfo; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.MethodArea; +import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -17,5 +22,22 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + + // 不实现jang.lang.Object 的init方法 + if (methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")) { + return; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + //设定执行结果和下一个方法 + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java index 5d87c07505..afe71f114d 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java @@ -2,6 +2,12 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.constant.MethodRefInfo; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.MethodArea; +import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -15,5 +21,63 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if (isSystemOutPrintlnMethod(className, methodName)) { + JavaObject jo = (JavaObject) frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------" + value + "----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while (currentClassName != null) { + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if (m != null) { + + break; + + } else { + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if (m == null) { + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } + + private boolean isSystemOutPrintlnMethod(String className, String methodName) { + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java index a34a64b5b0..5692567867 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java @@ -4,6 +4,10 @@ import me.lzb.jvm.constant.ConstantInfo; import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.constant.StringInfo; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.Heap; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -26,4 +30,21 @@ public String toString(ConstantPool pool) { } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } else { + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } + + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java index ba7d9df3a7..cb9b4013d0 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java @@ -1,7 +1,12 @@ package me.lzb.jvm.cmd; import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ClassInfo; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.Heap; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd { @@ -15,5 +20,23 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } + public String toString() { + return toString(clzFile.getConstantPool()); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int index = this.getIndex(); + + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + + String clzName = info.getClassName(); + + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + //压入栈顶 + frame.getOprandStack().push(jo); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java index 242f02716a..63e627f710 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,10 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.Heap; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand { @@ -14,6 +18,121 @@ public String toString(ConstantPool pool) { return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + String opCode = this.getOpCode(); + + if (ByteCodeCommand.aload_0.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.aload_1.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.aload_2.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_1.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.fload_3.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.voidreturn.equals(opCode)) { + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if (ByteCodeCommand.ireturn.equals(opCode)) { + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.freturn.equals(opCode)) { + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } else if (ByteCodeCommand.astore_1.equals(opCode)) { + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if (ByteCodeCommand.dup.equals(opCode)) { + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iconst_0.equals(opCode)) { + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iconst_1.equals(opCode)) { + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.istore_1.equals(opCode)) { + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if (ByteCodeCommand.istore_2.equals(opCode)) { + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if (ByteCodeCommand.iadd.equals(opCode)) { + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue() + jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)) { + + frame.getOprandStack().push(null); + + } else { + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + + } + public int getLength() { return 1; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java index df00e5bb8e..7211902179 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java @@ -1,7 +1,13 @@ package me.lzb.jvm.cmd; import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.ClassInfo; import me.lzb.jvm.constant.ConstantPool; +import me.lzb.jvm.constant.FieldRefInfo; +import me.lzb.jvm.constant.NameAndTypeInfo; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -16,5 +22,22 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo) this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo) this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 这里不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java index b87faca257..b29c491519 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java @@ -39,7 +39,7 @@ protected String getOperandAsClassInfo(ConstantPool pool) { int index = getIndex(); String codeTxt = getReadableCodeText(); ClassInfo info = (ClassInfo) pool.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.getClassName(); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #" + index + " " + info.getClassName(); } protected String getOperandAsMethod(ConstantPool pool) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java index 36e77e84d9..8b3ad3a673 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java @@ -5,7 +5,7 @@ /** * Created by LZB on 2017/4/15. */ -public class FieldRefInfo extends ConstantInfo{ +public class FieldRefInfo extends ConstantInfo { private int type = ConstantInfo.Fieldref_info; private int classInfoIndex; @@ -14,6 +14,7 @@ public class FieldRefInfo extends ConstantInfo{ public FieldRefInfo(ConstantPool pool) { super(pool); } + @Override public int getType() { return type; @@ -39,4 +40,20 @@ public int getNameAndTypeIndex() { public void setNameAndTypeIndex(int nameAndTypeIndex) { this.nameAndTypeIndex = nameAndTypeIndex; } + + 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(); + } + + public String getClassName() { + ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex()); + UTF8Info utf8Info = (UTF8Info) this.getConstantInfo(classInfo.getUtf8Index()); + return utf8Info.getValue(); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java index bd921ccf67..93c2e69755 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java @@ -40,4 +40,22 @@ public int getNameAndTypeIndex() { public void setNameAndTypeIndex(int nameAndTypeIndex) { this.nameAndTypeIndex = nameAndTypeIndex; } + + 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/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java index 4cef60cc3f..811254a08a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java @@ -40,4 +40,17 @@ public int getIndex2() { public void setIndex2(int index2) { this.index2 = index2; } + + + 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(); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..9afe234cfa --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package me.lzb.jvm.engine; + + +import me.lzb.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + public void setNextAction(int action) { + this.nextAction = action; + } + + public boolean isPauseAndRunNewFrame() { + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + + public boolean isExitCurrentFrame() { + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd() { + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump() { + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..ff1840ab38 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java @@ -0,0 +1,68 @@ +package me.lzb.jvm.engine; + + +import me.lzb.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + + +public class ExecutorEngine { + + private Stack stack = new Stack<>(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod) { + StackFrame stackFrame = StackFrame.create(mainMethod); + stack.push(stackFrame); + + while (!stack.isEmpty()) { + StackFrame frame = stack.peek(); + ExecutionResult result = frame.execute(); + + if (result.isPauseAndRunNewFrame()) { + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame, nextFrame); + stack.push(nextFrame); + } else { + stack.pop(); + } + } + + } + + + private void setupFunctionCallParams(StackFrame currentFrame, StackFrame nextFrame) { + Method method = nextFrame.getMethod(); + List paramList = method.getParameterList(); + + //把this传过去 + int paramNum = paramList.size() + 1; + + + List values = new ArrayList<>(); + + //从调用函数的栈帧的操作数栈中,取出paramNum个参数,等下传入被调用函数 + for (int i = 0; i < paramNum; i++) { + values.add(currentFrame.getOprandStack().pop()); + } + + //因为栈是先入后出,为了保证传入顺序一致,对list进行逆转 + + List params = new ArrayList<>(); + for (int i = values.size() - 1; i >= 0; i--) { + params.add(values.get(i)); + } + + nextFrame.setLocalVariableTable(params); + + + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java new file mode 100644 index 0000000000..6d53f86871 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java @@ -0,0 +1,43 @@ +package me.lzb.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + + private Heap() { + } + + public static Heap getInstance() { + return instance; + } + + public JavaObject newObject(String clzName) { + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value) { + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value) { + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + + public JavaObject newInt(int value) { + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..186d8be67d --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java @@ -0,0 +1,82 @@ +package me.lzb.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue) { + fieldValues.put(fieldName, fieldValue); + } + + public JavaObject(int type) { + this.type = type; + } + + public void setClassName(String className) { + this.className = className; + } + + public void setStringValue(String value) { + stringValue = value; + } + + public String getStringValue() { + return this.stringValue; + } + + public void setIntValue(int value) { + this.intValue = value; + } + + public int getIntValue() { + return this.intValue; + } + + public int getType() { + return type; + } + + public JavaObject getFieldValue(String fieldName) { + return this.fieldValues.get(fieldName); + } + + public String toString() { + switch (this.getType()) { + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className + ":" + this.fieldValues; + case FLOAT: + return String.valueOf(this.floatValue); + default: + return null; + } + } + + public String getClassName() { + return this.className; + } + + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..ffc3c641fc --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java @@ -0,0 +1,89 @@ +package me.lzb.jvm.engine; + + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.constant.MethodRefInfo; +import me.lzb.jvm.loader.ClassFileLoader; +import me.lzb.jvm.method.Method; + +import java.util.HashMap; +import java.util.Map; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap<>(); + + private MethodArea() { + } + + public static MethodArea getInstance() { + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader) { + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className) { + + ClassFile clzFile = findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className) { + + if (map.get(className) != null) { + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType) { + + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if (m == null) { + + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; + } + + + public Method getMethod(MethodRefInfo methodRef) { + + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if (m == null) { + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..927c17dcde --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java @@ -0,0 +1,29 @@ +package me.lzb.jvm.engine; + +import me.lzb.jvm.loader.ClassFileLoader; + +import java.io.FileNotFoundException; +import java.io.IOException; + + +public class MiniJVM { + + public void run(String[] classPaths, String className) throws FileNotFoundException, IOException { + + ClassFileLoader loader = new ClassFileLoader(); + for (int i = 0; i < classPaths.length; i++) { + loader.addClassPath(classPaths[i]); + } + + MethodArea methodArea = MethodArea.getInstance(); + + methodArea.setClassFileLoader(loader); + + ExecutorEngine engine = new ExecutorEngine(); + + className = className.replace(".", "/"); + + engine.execute(methodArea.getMainMethod(className)); + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java new file mode 100644 index 0000000000..117ca87aeb --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java @@ -0,0 +1,124 @@ +package me.lzb.jvm.engine; + +import me.lzb.jvm.cmd.ByteCodeCommand; +import me.lzb.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + + +public class StackFrame { + + private List localVariableTable = new ArrayList<>(); + private Stack oprandStack = new Stack<>(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + public static StackFrame create(Method m) { + + StackFrame frame = new StackFrame(m); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + public JavaObject getLocalVariableValue(int index) { + return this.localVariableTable.get(index); + } + + public Stack getOprandStack() { + return this.oprandStack; + } + + public int getNextCommandIndex(int offset) { + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for (int i = 0; i < cmds.length; i++) { + if (cmds[i].getOffset() == offset) { + return i; + } + } + throw new RuntimeException("Can't find next command"); + } + + public ExecutionResult execute() { + + ByteCodeCommand[] commands = m.getCmds(); + + + while (index < commands.length) { + + ExecutionResult result = new ExecutionResult(); + //缺省值是执行下一条命令 + result.setNextAction(ExecutionResult.RUN_NEXT_CMD); + + //输出执行的命令 + System.out.println(commands[index].toString()); + + commands[index].execute(this, result); + + if (result.isRunNextCmd()) { + index++; + } else if (result.isExitCurrentFrame()) { + return result; + } else if (result.isPauseAndRunNewFrame()) { + index++; + return result; + } else if (result.isJump()) { + int offset = result.getNextCmdOffset(); + this.index = getNextCommandIndex(offset); + } else { + index++; + } + + } + + //当前StackFrmae的指令全部执行完毕,可以退出了 + ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + return result; + } + + + public void setLocalVariableTable(List values) { + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo) { + //问题: 为什么要这么做?? + if (this.localVariableTable.size() - 1 < index) { + for (int i = this.localVariableTable.size(); i <= index; i++) { + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod() { + return m; + } + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileLoader.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileLoader.java index 593694066d..d8912cb1bb 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileLoader.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileLoader.java @@ -16,10 +16,6 @@ public class ClassFileLoader { private List clzPaths = new ArrayList<>(); public byte[] readBinaryCode(String className) throws IOException { -// String fileName = className.replaceAll(".*\\.", "") + ".class"; -// String pkg = className.replaceAll("\\.[^\\.]+$", ""); -// String packagePath = pkg.replaceAll("\\.", "\\\\"); - className = className.replace('.', File.separatorChar) + ".class"; for (String s : clzPaths) { byte[] data = FileUtils.readByteCodes(s + className); @@ -46,8 +42,13 @@ public String getClassPath() { } - public ClassFile loadClass(String className) throws IOException { - byte[] codes = this.readBinaryCode(className); + public ClassFile loadClass(String className) { + byte[] codes; + try { + codes = this.readBinaryCode(className); + } catch (IOException e) { + return null; + } ClassFileParser parser = new ClassFileParser(codes); return parser.parse(); } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java index 8c35d5aec5..43acd00549 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java @@ -1,8 +1,13 @@ package me.lzb.jvm.method; +import me.lzb.common.utils.StringUtils; import me.lzb.jvm.attr.CodeAttr; import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.cmd.ByteCodeCommand; +import me.lzb.jvm.constant.UTF8Info; + +import java.util.ArrayList; +import java.util.List; /** * Created by LZB on 2017/4/15. @@ -68,4 +73,63 @@ public void setClzFile(ClassFile clzFile) { public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } + + + private String getParamAndReturnType() { + UTF8Info paramAndReturnTypeInfo = (UTF8Info) getClzFile().getConstantPool().getConstantInfo(getDescriptorIndex()); + return paramAndReturnTypeInfo.getValue(); + } + + public List getParameterList() { + + //(Ljava/lang/String;I)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + + // Ljava/lang/String;I + String param = paramAndType.substring(first + 1, last); + + List paramList = new ArrayList<>(); + + if (StringUtils.isBlank(param)) { + return paramList; + } + + while (StringUtils.isNotBlank(param)) { + + int pos = 0; + // 这是一个对象类型 + if (param.charAt(pos) == 'L') { + + int end = param.indexOf(";"); + + if (end == -1) { + throw new RuntimeException("对象类型参数结尾没有\";\""); + } + paramList.add(param.substring(pos + 1, end)); + + pos = end + 1; + + } else if (param.charAt(pos) == 'I') { + // int + paramList.add("I"); + pos++; + + } else if (param.charAt(pos) == 'F') { + // float + paramList.add("F"); + pos++; + + } else { + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java index b4adbcf888..a9f20b23c1 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java @@ -17,7 +17,6 @@ import org.junit.Before; import org.junit.Test; -import java.io.IOException; import java.util.List; @@ -98,21 +97,15 @@ public void testMagicNumber() throws Exception { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path1); - try { - clzFile = loader.loadClass(className); - } catch (IOException e) { - e.printStackTrace(); - } + clzFile = loader.loadClass(className); clzFile.print(); } @Test public void testVersion() { - Assert.assertEquals(0, clzFile.getMinorVersion()); Assert.assertEquals(52, clzFile.getMajorVersion()); - } @Test diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java new file mode 100644 index 0000000000..0be0dea7c4 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java @@ -0,0 +1,28 @@ +package me.lzb.jvm; + +import me.lzb.jvm.engine.MiniJVM; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + + +public class MiniJVMTest { + + static String PATH = EmployeeV1.class.getResource("/").getPath(); + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "me.lzb.jvm.EmployeeV1"); + + } + +} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/VariableTest.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/VariableTest.java new file mode 100644 index 0000000000..c33995da5f --- /dev/null +++ b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/VariableTest.java @@ -0,0 +1,24 @@ +package me.lzb.other; + +/** + * Created by LZB on 2017/4/25. + */ +public class VariableTest { + //instance变量 + private int x; + + //局部变量 + public void localVar(int val) { + int j = 0; + for (int i = 0; i < val; i++) { + j += 1; + } + } + + //实例变量 + public void instanceVar(int val) { + for (int i = 0; i < val; i++) { + x += 1; + } + } +} From 6dbfb215c05b579b6ecebbd129ee26474f24daa0 Mon Sep 17 00:00:00 2001 From: Harry Date: Fri, 28 Apr 2017 16:21:31 +0800 Subject: [PATCH 349/552] update queue --- .../coding2017/queue/CircleQueue.java | 54 +++++++++++++++++-- .../HarryHook/coding2017/queue/Josephus.java | 26 ++++++++- .../coding2017/queue/QueueWithTwoStacks.java | 39 ++++++++++++-- 3 files changed, 109 insertions(+), 10 deletions(-) diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java index cd82fb2550..8ab6f440f4 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/CircleQueue.java @@ -1,5 +1,7 @@ package com.github.HarryHook.coding2017.queue; +import java.util.NoSuchElementException; + /** * 用数组实现循环队列 * @@ -16,23 +18,65 @@ public class CircleQueue { // 队头 private int front = 0; - // 队尾 + // 队尾,最后一个有效元素的下一个元素 private int rear = 0; - + // 队内元素个数 + private int size = 0; public boolean isEmpty() { + if(rear == front) { //但不一定为0 + return true; + } return false; } - public int size() { - return -1; + public int size() { + return size; } public void enQueue(E data) { + if((rear + 1) % DEFAULT_SIZE != front) { //队列未满 + elementData[rear] = data; + rear = (rear + 1) % DEFAULT_SIZE; + size++; + } } public E deQueue() { - return null; + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E data = (E) elementData[front]; + front = (front + 1) % DEFAULT_SIZE; + size--; + return data; + } + public static void main(String[] args) { + CircleQueue queue = new CircleQueue<>(); + queue.enQueue(1); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(1); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(1); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + System.out.println("queue.deQueue()= " + queue.deQueue()); + System.out.println("queue.deQueue()= " + queue.deQueue()); + System.out.println("queue.deQueue()= " + queue.deQueue()); + System.out.println("queue.deQueue()= " + queue.deQueue()); + System.out.println("queue.size= " + queue.size()); + queue.enQueue(3); + queue.enQueue(3); + queue.enQueue(1); + queue.enQueue(1); + queue.enQueue(2); + System.out.println("queue.rear= " + queue.rear); + System.out.println("queue.front= " + queue.front); } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java index 7b5fe53f5e..b919fbe94c 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/Josephus.java @@ -1,7 +1,10 @@ package com.github.HarryHook.coding2017.queue; +import java.util.ArrayList; import java.util.List; +import com.sun.corba.se.spi.orb.StringPair; + /** * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 @@ -12,7 +15,28 @@ public class Josephus { public static List execute(int n, int m) { - return null; + Queue queue = new Queue<>(); + List list = new ArrayList<>(); + + for (int i = 0; i < n; i++) { + queue.enQueue(i); + } + int i = 0; + while (!(queue.isEmpty())) { + int j = queue.deQueue(); + if (++i % m == 0) { + list.add(j); + } else { + queue.enQueue(j); + } + } + return list; + } + + public static void main(String[] args) { + Josephus circle = new Josephus(); + List list = circle.execute(41, 3); + System.out.println(list); } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java b/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java index c72abadcd2..494ad7452e 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/queue/QueueWithTwoStacks.java @@ -14,24 +14,55 @@ public class QueueWithTwoStacks { private Stack stack2; public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); + stack1 = new Stack(); // 入队 + stack2 = new Stack(); // 出队 } public boolean isEmpty() { + if (stack1.isEmpty() && stack2.isEmpty()) { + return true; + } return false; } public int size() { - return -1; + return stack1.size() + stack2.size(); } public void enQueue(E item) { + stack1.push(item); } public E deQueue() { - return null; + + if (isEmpty()) { + throw new RuntimeException("queue is empty"); + } + + while (!(stack1.isEmpty())) { + stack2.push(stack1.pop()); + } + E popItem = stack2.pop(); + while (!(stack2.isEmpty())) { + stack1.push(stack2.pop()); + } + + return popItem; + } + + public static void main(String[] args) { + QueueWithTwoStacks stackQueue = new QueueWithTwoStacks<>(); + stackQueue.enQueue(5); + stackQueue.enQueue(36); + stackQueue.enQueue(1); + stackQueue.enQueue(2); + stackQueue.deQueue(); + stackQueue.enQueue(3); + while (!(stackQueue.isEmpty())) { + System.out.println(stackQueue.deQueue()); + } + } } From b3bfee0aa305f6fff68fd147e919ff0c0417b23b Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 28 Apr 2017 16:30:42 +0800 Subject: [PATCH 350/552] =?UTF-8?q?JVM=E7=AC=AC=E4=B8=89=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stack/expr/InfixToPostfix.java | 106 ++++++++++++++---- .../basic/dataStructure/stack/expr/Token.java | 14 +++ .../dataStructure/stack/expr/TokenParser.java | 91 +++++++++------ 3 files changed, 150 insertions(+), 61 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java index 5ad70ddb22..48ad20afa3 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java @@ -1,34 +1,92 @@ package basic.dataStructure.stack.expr; +import basic.dataStructure.stack.Stack; + +import java.util.ArrayList; import java.util.List; /** * 中序转后序 */ public class InfixToPostfix { - - public static List convert(String expr) { - //括号问题 - if(!(has(expr, "(") && has(expr, ")") && hasPair(expr, "(", ")"))){ - throw new RuntimeException("brackets are not in pair"); - } - - return null; - } - - private static boolean hasPair(String expr, String sym1, String sym2){ - int leftBracketIndex = expr.indexOf(sym1); - int rightBracketIndex = expr.indexOf(sym2); - String subStr = expr.substring(leftBracketIndex, rightBracketIndex + 1); - - } - - private static boolean has(String expr, String sym){ - return expr.indexOf(sym) > 0; - } - - public static void main(String[] args){ - convert("(2+3)*2"); - } + /** + * + * 参考文献许卓群版《数据结构与算法》 + * + * + * 1)当输入的是操作数时候,直接输出到后序表达式PostfixExp序列中 + * 2)当输入开括号时候,把它压栈 + * 3)当输入的是闭括号时候,先判断栈是否为空,若为空,则发生错误并进行相关处理。 + * 若非空,把栈中元素依次弹出并输出到Postfix中,知道遇到第一个开括号, + * 若没有遇到开括号,也发生错误,进行相关处理 + * 4)当输入是运算符op(+、- 、×、/)时候 + * a)循环,当(栈非空and栈顶不是开括号and栈顶运算符的优先级不低于输入的 + * 运算符的优先级)时,反复操作:将栈顶元素弹出并添加到Postfix中 + * b)把输入的运算符op压栈 + * 5)当中序表达式InfixExp的符号序列全部读入后,若栈内扔有元素,把他们依次弹 + * 出并放到后序表达式PostfixExp序列尾部。若弹出的元素遇到空括号,则说明不 + * 匹配,发生错误,并进行相关处理 + */ + public static List convert(String expr) { + List original = TokenParser.parse(expr); + System.out.println(original); + //结果集合 + List postfixTokenList = new ArrayList(); + //缓存,存放优先级低的运算符和括号 + Stack tokens = new Stack(); + for (Token t : original) { + if (t.isNumber()) { + postfixTokenList.add(t); + } + + if (t.isLBracket()) tokens.push(t); + + if (t.isRBracket()) { + if (tokens.isEmpty()) { + throw new RuntimeException("brackets are not in pair"); + } else { + Token tmp = (Token) tokens.peek(); + while (!tmp.isLBracket()) { + if (tokens.size() == 1 && !tmp.isLBracket()) { + throw new RuntimeException("brackets are not in pair"); + } + postfixTokenList.add((Token) tokens.pop()); + tmp = (Token)tokens.peek(); + } + } + } + + if(t.isOperator()){ + Token tmp = (Token)tokens.peek(); + while(tmp != null && !tmp.isLBracket() && tmp.isOperator() && tmp.hasHigherPriority(t)){ + postfixTokenList.add((Token) tokens.pop()); + tmp = (Token)tokens.peek(); + } + + tokens.push(t); + } + System.out.println("t--------->" + t.toString()); + System.out.println("tokens---->" + tokens.toString()); + System.out.println("postfix--->" + postfixTokenList + "\n"); + + } + + while(tokens.size() > 0){ + Token t = (Token)tokens.pop(); + if(!t.isBracket()){ + postfixTokenList.add(t); + } + } + + return postfixTokenList; + } + + + public static void main(String[] args) { +// convert("9+(3-1)*3+10/2"); + List list = convert("1+(2+3*4-5)/2+10-1"); +// System.out.println(list.toString()); +// convert("2+3*4-5"); + } } diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Token.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Token.java index d1fcecf24e..0c105d76a4 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Token.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Token.java @@ -16,6 +16,8 @@ public class Token { } static final int OPERATOR = 1; static final int NUMBER = 2; + static final int LBRACKET = -1; + static final int RBRACKET = -2; String value; int type; public Token(int type, String value) { @@ -31,6 +33,18 @@ public boolean isOperator() { return type == OPERATOR; } + public boolean isLBracket(){ + return type == LBRACKET; + } + + public boolean isRBracket(){ + return type == RBRACKET; + } + + public boolean isBracket(){ + return type == LBRACKET || type == RBRACKET; + } + public int getIntValue() { return Integer.valueOf(value).intValue(); } diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java index f66d1b5d5a..0f3169c27e 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/TokenParser.java @@ -4,54 +4,71 @@ import java.util.List; public class TokenParser { - - - public static List parse(String expr) { - List tokens = new ArrayList(); - int i = 0; - while (i < expr.length()) { + public static List parse(String expr) { + List tokens = new ArrayList(); - char c = expr.charAt(i); + int i = 0; - if (isOperator(c)) { + while (i < expr.length()) { - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; + char c = expr.charAt(i); - } else if (Character.isDigit(c)) { + if (isOperator(c)) { - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } + } else if (Character.isDigit(c)) { - } - return tokens; - } + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; - private static int indexOfNextOperator(int i, String expr) { + } else if (isLeftBracket(String.valueOf(c))) { + Token t = new Token(Token.LBRACKET, String.valueOf(c)); + tokens.add(t); + i++; + } else if (isRightBracket(String.valueOf(c))) { + Token t = new Token(Token.RBRACKET, String.valueOf(c)); + tokens.add(t); + i++; + } else { + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; + } + return tokens; + } - } + private static int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private static boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } + + private static boolean isLeftBracket(String s) { + return s.equals("("); + } + + private static boolean isRightBracket(String s) { + return s.equals(")"); + } - private static boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } } From 38373a8808c5307761d55fc0fecff46775011f41 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 28 Apr 2017 17:12:54 +0800 Subject: [PATCH 351/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stack/expr/InfixToPostfix.java | 85 +++++++------------ .../test/java/data_structure/ExprTest.java | 11 ++- 2 files changed, 40 insertions(+), 56 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java index 48ad20afa3..b5b9552013 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java @@ -9,70 +9,51 @@ * 中序转后序 */ public class InfixToPostfix { - /** - * - * 参考文献许卓群版《数据结构与算法》 - * - * - * 1)当输入的是操作数时候,直接输出到后序表达式PostfixExp序列中 - * 2)当输入开括号时候,把它压栈 - * 3)当输入的是闭括号时候,先判断栈是否为空,若为空,则发生错误并进行相关处理。 - * 若非空,把栈中元素依次弹出并输出到Postfix中,知道遇到第一个开括号, - * 若没有遇到开括号,也发生错误,进行相关处理 - * 4)当输入是运算符op(+、- 、×、/)时候 - * a)循环,当(栈非空and栈顶不是开括号and栈顶运算符的优先级不低于输入的 - * 运算符的优先级)时,反复操作:将栈顶元素弹出并添加到Postfix中 - * b)把输入的运算符op压栈 - * 5)当中序表达式InfixExp的符号序列全部读入后,若栈内扔有元素,把他们依次弹 - * 出并放到后序表达式PostfixExp序列尾部。若弹出的元素遇到空括号,则说明不 - * 匹配,发生错误,并进行相关处理 - */ + public static List convert(String expr) { - List original = TokenParser.parse(expr); - System.out.println(original); - //结果集合 List postfixTokenList = new ArrayList(); - //缓存,存放优先级低的运算符和括号 - Stack tokens = new Stack(); - for (Token t : original) { - if (t.isNumber()) { - postfixTokenList.add(t); - } - if (t.isLBracket()) tokens.push(t); + List original = TokenParser.parse(expr); + Stack buffer = new Stack(); + for(Token t : original){ + //数字直接放入结果 + if(t.isNumber()) postfixTokenList.add(t); + + //左括号,放入缓存 + if(t.isLBracket()) buffer.push(t); - if (t.isRBracket()) { - if (tokens.isEmpty()) { - throw new RuntimeException("brackets are not in pair"); - } else { - Token tmp = (Token) tokens.peek(); - while (!tmp.isLBracket()) { - if (tokens.size() == 1 && !tmp.isLBracket()) { - throw new RuntimeException("brackets are not in pair"); - } - postfixTokenList.add((Token) tokens.pop()); - tmp = (Token)tokens.peek(); + //右括号, 遍历完成后不用放入结果集 + if(t.isRBracket()){ + if(buffer.size() == 0){ + throw new RuntimeException("brackets are not in pair, check your expression"); + }else{ + //遍历直至左括号 + Token tmp = (Token) buffer.peek(); + while (!tmp.isLBracket()){ + if(buffer.size() == 1 && !tmp.isLBracket()) throw new RuntimeException("brackets are not in pair, check your expression"); + //放入结果list + postfixTokenList.add((Token) buffer.pop()); + tmp = (Token)buffer.peek(); } } } + //处理运算符,若缓存栈顶的运算符优先级高于或等于该运算符时,则进行遍历: + //缓存中找出的运算符直接入结果list,遍历完成后当前运算符压进缓存栈中 if(t.isOperator()){ - Token tmp = (Token)tokens.peek(); - while(tmp != null && !tmp.isLBracket() && tmp.isOperator() && tmp.hasHigherPriority(t)){ - postfixTokenList.add((Token) tokens.pop()); - tmp = (Token)tokens.peek(); + Token tmp = (Token) buffer.peek(); + while(tmp != null && tmp.isOperator() && tmp.hasHigherPriority(t)){ + //弹出至结果list + postfixTokenList.add((Token) buffer.pop()); + tmp = (Token) buffer.peek(); } - - tokens.push(t); + buffer.push(t); } - System.out.println("t--------->" + t.toString()); - System.out.println("tokens---->" + tokens.toString()); - System.out.println("postfix--->" + postfixTokenList + "\n"); - } - while(tokens.size() > 0){ - Token t = (Token)tokens.pop(); + //遍历完成后,若缓存还有值,则直接放到结果集,并去掉左括号 + while (buffer.size() > 0){ + Token t = (Token) buffer.pop(); if(!t.isBracket()){ postfixTokenList.add(t); } @@ -85,7 +66,7 @@ public static List convert(String expr) { public static void main(String[] args) { // convert("9+(3-1)*3+10/2"); List list = convert("1+(2+3*4-5)/2+10-1"); -// System.out.println(list.toString()); + System.out.println(list.toString()); // convert("2+3*4-5"); } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java index 1064cb2839..4ae1205bff 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java @@ -1,6 +1,7 @@ package data_structure; import basic.dataStructure.stack.expr.InfixExpr; +import basic.dataStructure.stack.expr.InfixToPostfix; import basic.dataStructure.stack.expr.PostfixExpr; import basic.dataStructure.stack.expr.PrefixExpr; import org.junit.Assert; @@ -92,12 +93,14 @@ public void testPrefixEvaluate() { @Test public void textInfixToPostfixExpr(){ { - //9+(3-1)*3+10/2 = 9 3 1-3*+ 10 2/+ - + //9+(3-1)*3+10/2 = 9 3 1 - 3 * 10 2 / + + + String expr = "9+(3-1)*3+10/2"; + Assert.assertEquals("[9, 3, 1, -, 3, *, 10, 2, /, +, +]", InfixToPostfix.convert(expr).toString()); } { - //10-2*3+50 = 10 2 3 * - 50 + - + //10-2*3+50 = 10 2 3 * 50 + - + String expr = "10-2*3+50"; + Assert.assertEquals("[10, 2, 3, *, 50, +, -]", InfixToPostfix.convert(expr).toString()); } } } From 0537f4153022b52e52322082b285ff045c104e64 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Fri, 28 Apr 2017 19:55:16 +0800 Subject: [PATCH 352/552] update jvm homework --- .../src/com/donaldy/jvm/cmd/BiPushCmd.java | 6 +- .../com/donaldy/jvm/cmd/ByteCodeCommand.java | 38 +++++- .../src/com/donaldy/jvm/cmd/GetFieldCmd.java | 8 ++ .../donaldy/jvm/cmd/GetStaticFieldCmd.java | 15 ++- .../com/donaldy/jvm/cmd/InvokeSpecialCmd.java | 15 +++ .../com/donaldy/jvm/cmd/InvokeVirtualCmd.java | 60 +++++++++- .../src/com/donaldy/jvm/cmd/LdcCmd.java | 15 +++ .../src/com/donaldy/jvm/cmd/NewObjectCmd.java | 13 +++ .../src/com/donaldy/jvm/cmd/NoOperandCmd.java | 108 ++++++++++++++++++ .../src/com/donaldy/jvm/cmd/PutFieldCmd.java | 17 +++ .../donaldy/jvm/engine/ExecutorEngine.java | 56 ++++++++- .../com/donaldy/jvm/engine/MethodArea.java | 40 +++++-- .../src/com/donaldy/jvm/engine/MiniJVM.java | 4 +- .../com/donaldy/jvm/engine/StackFrame.java | 97 ++++++++++------ .../src/com/donaldy/jvm/method/Method.java | 69 +++++++++-- .../src/com/donaldy/jvm/test/MinJVMTest.java | 31 +++++ 16 files changed, 533 insertions(+), 59 deletions(-) create mode 100644 group24/448641125/src/com/donaldy/jvm/test/MinJVMTest.java diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java index 4126097c3f..68af348204 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/BiPushCmd.java @@ -4,6 +4,8 @@ import com.donaldy.jvm.constant.ConstantInfo; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.Heap; +import com.donaldy.jvm.engine.JavaObject; import com.donaldy.jvm.engine.StackFrame; @@ -23,7 +25,9 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOprandStack().push(jo); } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java index a611d4273b..3c3ae0b105 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/ByteCodeCommand.java @@ -17,7 +17,43 @@ public abstract class ByteCodeCommand { private int offset; private static Map codeMap = new HashMap(); - + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + static{ codeMap.put("01", "aconst_null"); diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java index 6644fe958d..9942038c25 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java @@ -2,7 +2,9 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.JavaObject; import com.donaldy.jvm.engine.StackFrame; @@ -21,6 +23,12 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java index 7b4cc9896f..33acd83c2e 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java @@ -6,6 +6,8 @@ import com.donaldy.jvm.constant.FieldRefInfo; import com.donaldy.jvm.constant.UTF8Info; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.Heap; +import com.donaldy.jvm.engine.JavaObject; import com.donaldy.jvm.engine.StackFrame; @@ -25,7 +27,18 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + //TODO 处理非System.out的情况 } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java index b646011143..8390037f87 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java @@ -4,7 +4,9 @@ import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.MethodRefInfo; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.MethodArea; import com.donaldy.jvm.engine.StackFrame; +import com.donaldy.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -23,6 +25,19 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java index 8b51e481af..8e85fd8427 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java @@ -2,8 +2,12 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.MethodRefInfo; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.JavaObject; +import com.donaldy.jvm.engine.MethodArea; import com.donaldy.jvm.engine.StackFrame; +import com.donaldy.jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -20,8 +24,62 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if(isSystemOutPrintlnMethod(className,methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while(currentClassName != null){ + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + + break; + + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } + + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); } - } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java index d55d8ef409..b6860b71c3 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java @@ -5,6 +5,8 @@ import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.StringInfo; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.Heap; +import com.donaldy.jvm.engine.JavaObject; import com.donaldy.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -31,6 +33,19 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java index 2a30581935..0da6ab9d83 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java @@ -1,8 +1,12 @@ package com.donaldy.jvm.cmd; import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.clz.ClassIndex; +import com.donaldy.jvm.constant.ClassInfo; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.Heap; +import com.donaldy.jvm.engine.JavaObject; import com.donaldy.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -20,7 +24,16 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + int index = this.getIndex(); + ClassInfo info = (ClassInfo) this.getConstantInfo(index); + + String clzName = info.getClassName(); + + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java index c664210eda..f4a3f4f0cc 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java @@ -3,6 +3,8 @@ import com.donaldy.jvm.clz.ClassFile; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.Heap; +import com.donaldy.jvm.engine.JavaObject; import com.donaldy.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -25,6 +27,112 @@ public int getLength(){ @Override public void execute(StackFrame frame, ExecutionResult result) { + String opCode = this.getOpCode(); + + if (ByteCodeCommand.aload_0.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.aload_1.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.aload_2.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_1.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.fload_3.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.voidreturn.equals(opCode)) { + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if (ByteCodeCommand.freturn.equals(opCode)) { + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java index 9bf85ba44f..4a9f8aa8d3 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java @@ -1,8 +1,12 @@ package com.donaldy.jvm.cmd; import com.donaldy.jvm.clz.ClassFile; +import com.donaldy.jvm.constant.ClassInfo; import com.donaldy.jvm.constant.ConstantPool; +import com.donaldy.jvm.constant.FieldRefInfo; +import com.donaldy.jvm.constant.NameAndTypeInfo; import com.donaldy.jvm.engine.ExecutionResult; +import com.donaldy.jvm.engine.JavaObject; import com.donaldy.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -21,6 +25,19 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java index 1fb57626b9..efa188d917 100644 --- a/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java +++ b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java @@ -19,17 +19,63 @@ public ExecutorEngine() { } public void execute(Method mainMethod){ - - - + + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); + + while (!stack.empty()) { + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + //函数栈帧来了。。。 + if (result.isPauseAndRunNewFrame()) { + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame, nextFrame); + + stack.push(nextFrame); + } else { + + //认为其执行完了 + stack.pop(); + + } + } + + } private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { - - + Method nextMethod = nextFrame.getMethod(); + + List paramList = nextMethod.getParameterList(); + + //加上1 是因为要把this也传递过去 + int paramNum = paramList.size() + 1; + + List values = new ArrayList<>(); + + //从栈中取出栈顶的x个元素 + while (paramNum > 0) { + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + + //把一个列表倒序排列 + List params = new ArrayList(); + + for (int i = values.size() - 1; i >= 0; i --) { + params.add(values.get(i)); + } + + nextFrame.setLocalVariableTable(params); } } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java b/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java index fea5102cd0..470b3044d2 100644 --- a/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java +++ b/group24/448641125/src/com/donaldy/jvm/engine/MethodArea.java @@ -52,17 +52,37 @@ public ClassFile findClassFile(String className){ return clzFile; } - - + + public Method getMethod(String className, String methodName, String paramAndReturnType){ - - return null; + + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if(m == null){ + + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; } - - - public Method getMethod(MethodRefInfo methodRef){ - - return null; - + + + public Method getMethod(MethodRefInfo methodRef){ + + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + } } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java b/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java index 30f19e0d8c..b444a6668b 100644 --- a/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java +++ b/group24/448641125/src/com/donaldy/jvm/engine/MiniJVM.java @@ -21,8 +21,10 @@ public void run(String[]classPaths , String className) throws FileNotFoundExcept ExecutorEngine engine = new ExecutorEngine(); className = className.replace(".", "/"); - + + //装载main方法 engine.execute(methodArea.getMainMethod(className)); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java b/group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java index 73b510e140..ca82395f14 100644 --- a/group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java +++ b/group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java @@ -8,16 +8,16 @@ import com.donaldy.jvm.method.Method; public class StackFrame { - + private List localVariableTable = new ArrayList(); private Stack oprandStack = new Stack(); - + int index = 0; - + private Method m = null; - + private StackFrame callerFrame = null; - + public StackFrame getCallerFrame() { return callerFrame; } @@ -26,34 +26,34 @@ public void setCallerFrame(StackFrame callerFrame) { this.callerFrame = callerFrame; } - - - + + + public static StackFrame create(Method m){ - - StackFrame frame = new StackFrame( m ); - + + StackFrame frame = new StackFrame( m ); + return frame; } - - private StackFrame(Method m) { + + private StackFrame(Method m) { this.m = m; - + } - - - + + + public JavaObject getLocalVariableValue(int index){ return this.localVariableTable.get(index); } - + public Stack getOprandStack(){ return this.oprandStack; } - + public int getNextCommandIndex(int offset){ - + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); for(int i=0;i values){ - this.localVariableTable = values; + this.localVariableTable = values; } - + public void setLocalVariableValue(int index, JavaObject jo){ //问题: 为什么要这么做?? if(this.localVariableTable.size()-1 < index){ @@ -83,13 +116,13 @@ public void setLocalVariableValue(int index, JavaObject jo){ } } this.localVariableTable.set(index, jo); - - + + } - + public Method getMethod(){ return m; } - + } diff --git a/group24/448641125/src/com/donaldy/jvm/method/Method.java b/group24/448641125/src/com/donaldy/jvm/method/Method.java index 8720da21b7..c7c7df816c 100644 --- a/group24/448641125/src/com/donaldy/jvm/method/Method.java +++ b/group24/448641125/src/com/donaldy/jvm/method/Method.java @@ -7,6 +7,8 @@ import com.donaldy.jvm.constant.UTF8Info; import com.donaldy.jvm.loader.ByteCodeIterator; +import java.util.ArrayList; +import java.util.List; public class Method { @@ -56,22 +58,18 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ int attribCount = iter.nextU2ToInt(); - /*System.out.println("name = " + clzFile.getConstantPool().getUTF8String(nameIndex) - + ", desc = " + clzFile.getConstantPool().getUTF8String(descIndex));*/ - Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); - //attribCount == 1 for( int j = 1; j <= attribCount; j++){ int attrNameIndex = iter.nextU2ToInt(); - /*System.out.println("attrNameIndex : " + attrNameIndex);*/ + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); - /*System.out.println("attrName : " + attrName);*/ + iter.back(2); if(AttributeInfo.CODE.equalsIgnoreCase(attrName)){ - /*System.out.println("j : " + j );*/ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); m.setCodeAttr(codeAttr); } else{ @@ -144,4 +142,61 @@ public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } + + private String getParamAndReturnType() { + UTF8Info nameAndTypeInfo = (UTF8Info) this.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + + public List getParameterList() { + + //e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + + //e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first + 1, last); + + List paramList = new ArrayList<>(); + + if ((null == param) || "".equals(param)) { + return paramList; + } + + while (!param.equals("")) { + int pos = 0; + + //这是一个对象类型 + if (param.charAt(pos) == 'L') { + int end = param.indexOf(";"); + + if (end == -1) { + throw new RuntimeException("can't find the ; fro a object type"); + } + + paramList.add(param.substring(pos+ 1, end)); + + pos = end + 1; + } + else if (param.charAt(pos) == 'I') { + //int + paramList.add("I"); + pos ++; + } + else if (param.charAt(pos) == 'F') { + //float + paramList.add("F"); + pos ++; + } else { + throw new RuntimeException("the param has unsupported type : " + param); + } + + param = param.substring(pos); + } + + return paramList; + } } diff --git a/group24/448641125/src/com/donaldy/jvm/test/MinJVMTest.java b/group24/448641125/src/com/donaldy/jvm/test/MinJVMTest.java new file mode 100644 index 0000000000..6ff89089b3 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/test/MinJVMTest.java @@ -0,0 +1,31 @@ +package com.donaldy.jvm.test; + +import com.donaldy.jvm.engine.MiniJVM; +import org.junit.Test; + +/** + * Created by DonaldY on 2017/4/27. + */ +public class MinJVMTest { + + static final String PATH = "D:\\tools\\Code\\Y_Repository\\coding2017\\group24\\448641125\\out\\production" + + "\\448641125\\"; + + @Test + public void testMain() throws Exception { + /** + * 1.加载类 + * -工具:ClassFileLoader + * -目的地:方法区(MethodArea) + * 2.获取类的main方法 + * -从方法区寻找 + * 3.执行main方法的字节码 + * -字节码指令(Command对象) + * -栈帧(StackFrame) + * -堆(Heap) + */ + String [] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.donaldy.jvm.test.EmployeeV1"); + } +} From 9b797d2c6adbcbd0fc13ebf7834d4d6dc851271b Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Fri, 28 Apr 2017 21:58:56 +0800 Subject: [PATCH 353/552] data_structure_Utils --- .../src/data_Structure_Utils/ArrayUtil.java | 270 ++++++++++++++++++ .../data_Structure_Utils/ArrayUtilTest.java | 100 +++++++ 2 files changed, 370 insertions(+) create mode 100644 group19/1294642551/src/data_Structure_Utils/ArrayUtil.java create mode 100644 group19/1294642551/test/data_Structure_Utils/ArrayUtilTest.java diff --git a/group19/1294642551/src/data_Structure_Utils/ArrayUtil.java b/group19/1294642551/src/data_Structure_Utils/ArrayUtil.java new file mode 100644 index 0000000000..412e261efb --- /dev/null +++ b/group19/1294642551/src/data_Structure_Utils/ArrayUtil.java @@ -0,0 +1,270 @@ +package data_Structure_Utils; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.TreeSet; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + + int len = origin.length; + int[] arr = new int[len]; + + for(int i = 0; i < len; i++) + { + arr[i] = origin[ len -1 - i]; + } + + return arr; + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + + ArrayList al = new ArrayList(); + + int len = oldArray.length; + for(int i = 0; i < len; i++) + { + if(oldArray[i] != 0) + { + al.add(oldArray[i]); + } + } + + int arrLen = al.size(); + int[] arr = new int[arrLen]; + for(int i = 0; i < arrLen; i++) + { + arr[i] = al.get(i); + } + + return arr; + + + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + TreeSet tr = new TreeSet(); + for(int i = 0; i < array1.length; i++) + { + tr.add(array1[i]); + } + for(int j = 0; j < array2.length; j++) + { + tr.add(array2[j]); + } + + int arrLen = tr.size(); + int[] arr = new int[arrLen]; + int index = 0; + + Iterator it = tr.iterator(); + while(it.hasNext()) + { + arr[index] = (Integer) it.next(); + index++; + } + + return arr; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + + int len = oldArray.length; + int arrLen = len + size; + int[] arr = new int[arrLen]; + + for(int i = 0; i < arrLen; i++) + { + if (i < len) + arr[i] = oldArray[i]; + else + arr[i] = 0; + } + + return arr; + + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + + ArrayList al = new ArrayList(); + int first = 1; + int second = 1; + int value = 0; + if(max >= 2) + { + al.add(first); + al.add(second); + } + do + { + value = first + second; + if(value < max) + { + al.add(value); + first = second; + second = value; + } + }while(value < max); + + int arrLen = al.size(); + int[] arr = new int[arrLen]; + for(int i = 0; i < arrLen; i++) + { + arr[i] = al.get(i); + } + + return arr; + + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + + ArrayList al = new ArrayList(); + if(max > 2) + al.add(2); + + int value = 3; + while(value < max) + { + int flag = 1; + for(int i = 2; i < value; i++) + { + if(value % i == 0) + { + flag = 0; + break; + } + } + + if (flag == 1) + al.add(value); + + value++; + } + + int arrLen = al.size(); + int[] arr = new int[arrLen]; + for(int i = 0; i < arrLen; i++) + { + arr[i] = al.get(i); + } + + return arr; + + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + ArrayList al = new ArrayList(); + for(int i = 1; i < max; i++) + { + if (isPerfectNumber(i)) + al.add(i); + } + + int arrLen = al.size(); + int[] arr = new int[arrLen]; + for(int i = 0; i < arrLen; i++) + { + arr[i] = al.get(i); + } + + return arr; + } + + public boolean isPerfectNumber(int number) + { + ArrayList al = new ArrayList(); + + for(int i = 1; i < number; i++) + { + if(number % i == 0) + al.add(i); + } + + int value = 0; + for(int j = 0; j < al.size(); j++) + { + value = value + al.get(j); + } + + return value == number; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + + String str = ""; + int len = array.length; + for(int i = 0; i < len-1; i++) + { + str = str + array[i] + seperator; + } + str = str + array[len-1]; + + return str; + } + + + +} diff --git a/group19/1294642551/test/data_Structure_Utils/ArrayUtilTest.java b/group19/1294642551/test/data_Structure_Utils/ArrayUtilTest.java new file mode 100644 index 0000000000..c4c478e1b2 --- /dev/null +++ b/group19/1294642551/test/data_Structure_Utils/ArrayUtilTest.java @@ -0,0 +1,100 @@ +package data_Structure_Utils; + + +import org.junit.Assert; +import org.junit.Test; + +public class ArrayUtilTest { + + @Test + public void testReverseArray() { + ArrayUtil au = new ArrayUtil(); + int[] origin = {7, 9, 30, 3, 4}; + int[] expecteds ={4, 3, 30, 9, 7}; + int[] actuals = au.reverseArray(origin); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testRemoveZero() { + ArrayUtil au = new ArrayUtil(); + int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] expecteds = {1,3,4,5,6,6,5,4,7,6,7,5}; + int[] actuals = au.removeZero(oldArray); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testMerge() { + + ArrayUtil au = new ArrayUtil(); + int[] a1 = {3, 5, 7,8}; + int[] a2 = {4, 5, 6,7}; + int[] expecteds = {3,4,5,6,7,8}; + int[] actuals = au.merge(a1, a2); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testGrow() { + + ArrayUtil au = new ArrayUtil(); + int[] oldArray = {2,3,6}; + int size = 3; + int[] expecteds = {2,3,6,0,0,0}; + int[] actuals = au.grow(oldArray, size); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testFibonacci() { + + ArrayUtil au = new ArrayUtil(); + int max = 15; + int[] expecteds = {1, 1, 2, 3, 5, 8, 13}; + int[] actuals = au.fibonacci(max); + + Assert.assertArrayEquals(expecteds, actuals); + } + + + + @Test + public void testGetPrimes() { + ArrayUtil au = new ArrayUtil(); + int max = 23; + int[] expecteds = {2,3,5,7,11,13,17,19}; + int[] actuals = au.getPrimes(max); + + Assert.assertArrayEquals(expecteds, actuals); + + } + + @Test + public void testGetPerfectNumbers() { + + ArrayUtil au = new ArrayUtil(); + int max = 30; + int[] expecteds = {6, 28}; + int[] actuals = au.getPerfectNumbers(max); + + Assert.assertArrayEquals(expecteds, actuals); + } + + @Test + public void testJoin() { + + ArrayUtil au = new ArrayUtil(); + int[] array = {3, 8, 9}; + String seperator = "-"; + String expecteds = "3-8-9"; + String actuals = au.join(array, seperator); + + Assert.assertEquals(expecteds, actuals); + } + +} From 91dcf513e9fd8a9d84885070698ff6d6a9f14224 Mon Sep 17 00:00:00 2001 From: Jiandan1357 Date: Fri, 28 Apr 2017 22:17:54 +0800 Subject: [PATCH 354/552] 6weekInfixExpr 6weekInfixExpr --- .../601689050/6weekInfixExpr/InfixExpr.java | 61 +++++++++++++++++++ .../6weekInfixExpr/InfixExprTest.java | 50 +++++++++++++++ group23/601689050/6weekInfixExpr/Stack.java | 50 +++++++++++++++ group23/601689050/6weekInfixExpr/Token.java | 46 ++++++++++++++ .../601689050/6weekInfixExpr/TokenParser.java | 47 ++++++++++++++ 5 files changed, 254 insertions(+) create mode 100644 group23/601689050/6weekInfixExpr/InfixExpr.java create mode 100644 group23/601689050/6weekInfixExpr/InfixExprTest.java create mode 100644 group23/601689050/6weekInfixExpr/Stack.java create mode 100644 group23/601689050/6weekInfixExpr/Token.java create mode 100644 group23/601689050/6weekInfixExpr/TokenParser.java diff --git a/group23/601689050/6weekInfixExpr/InfixExpr.java b/group23/601689050/6weekInfixExpr/InfixExpr.java new file mode 100644 index 0000000000..7b833931b3 --- /dev/null +++ b/group23/601689050/6weekInfixExpr/InfixExpr.java @@ -0,0 +1,61 @@ +import java.util.*; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/28. + */ +public class InfixExpr { + String expr = null; + public InfixExpr(String expr){ + this.expr = expr; + } + public float evaluate(){ + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack numStack = new Stack(); + for(Token token : tokens){ + if(token.isOpretor()){ + if(opStack.isEmpty()){ + opStack.push(token); + }else { + while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(),f1,f2); + numStack.push(result); + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + while (!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + return numStack.pop().floatValue(); + + } + + private Float calculate(String op, float f1, float f2) { + if(op.equals("+")){ + return f1 + f2; + } + if(op.equals("-")){ + return f1 - f2; + } + if(op.equals("*")){ + return f1 * f2; + } + if(op.equals("/")){ + return f1 / f2; + } + return null; + } +} diff --git a/group23/601689050/6weekInfixExpr/InfixExprTest.java b/group23/601689050/6weekInfixExpr/InfixExprTest.java new file mode 100644 index 0000000000..bf2f8e91a9 --- /dev/null +++ b/group23/601689050/6weekInfixExpr/InfixExprTest.java @@ -0,0 +1,50 @@ +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Lxx on 2017/4/28. + */ +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } +} diff --git a/group23/601689050/6weekInfixExpr/Stack.java b/group23/601689050/6weekInfixExpr/Stack.java new file mode 100644 index 0000000000..8a15be4366 --- /dev/null +++ b/group23/601689050/6weekInfixExpr/Stack.java @@ -0,0 +1,50 @@ +import java.util.ArrayList; +import java.util.EmptyStackException; + +/** + * Created by Lxx on 2017/4/28. + */ +public class Stack { + public ArrayList array; + public int count; + public Stack(){ + array = new ArrayList(); + } + public void push (Object o){ + count ++ ; + array.add(o); + } + public Object pop(){ + count -- ; + Object o = array.get(count); + array.remove(o); + return o; + } + public Object peek(){ + if(count == 0){ + throw new EmptyStackException(); + } + return array.get(array.size()-1); + } + public boolean isEmpty(){ + return array.size() == 0; + } + public int size(){ + return count; + } + public String toString(){ + StringBuilder string = new StringBuilder(); + Stack s = new Stack(); + int size = this.size(); + for(int i = 0;i OPERATORS = Arrays.asList("+","-","*","/"); + public static final Map priorities = new HashMap<>(); + static { + priorities.put("+",1); + priorities.put("-",1); + priorities.put("*",2); + priorities.put("/",2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type,String value){ + this.type = type; + this.value = value; + } + public boolean isNumber(){ + return type == NUMBER; + } + public boolean isOpretor(){ + return type == OPERATOR; + } + public int getIntValue(){ + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + public boolean hasHigherPriority(Token t){ + if (!this.isOpretor() && !t.isOpretor()){ + throw new RuntimeException(); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } +} diff --git a/group23/601689050/6weekInfixExpr/TokenParser.java b/group23/601689050/6weekInfixExpr/TokenParser.java new file mode 100644 index 0000000000..3e966cc0a3 --- /dev/null +++ b/group23/601689050/6weekInfixExpr/TokenParser.java @@ -0,0 +1,47 @@ +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Lxx on 2017/4/28. + */ +public class TokenParser { + public List parse(String expr){ + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + + char c = expr.charAt(i); + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR,String.valueOf(c)); + tokens.add(t); + i++; + }else if(Character.isDigit(c)){ + int nextOperatorIndex = indexOfNextOperator(i,expr); + String value = expr.substring(i,nextOperatorIndex); + Token t = new Token(Token.NUMBER,value); + tokens.add(t); + i = nextOperatorIndex; + }else { + System.out.println("输入值不符合要求"); + i++; + } + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + while(Character.isDigit(expr.charAt(i))){ + i++; + if(i == expr.length()){ + break; + } + } + return i; + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} From ef075338873057fd741ca763ed871bab26f18a56 Mon Sep 17 00:00:00 2001 From: unknown <楼钟炳> Date: Sat, 29 Apr 2017 01:20:47 +0800 Subject: [PATCH 355/552] pom.xml --- .../1148285693/learning2017/common/pom.xml | 22 +++++++++++++++ .../1148285693/learning2017/mini-jvm/pom.xml | 27 +++++++++++++++++++ group24/1148285693/learning2017/other/pom.xml | 27 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 group24/1148285693/learning2017/common/pom.xml create mode 100644 group24/1148285693/learning2017/mini-jvm/pom.xml create mode 100644 group24/1148285693/learning2017/other/pom.xml diff --git a/group24/1148285693/learning2017/common/pom.xml b/group24/1148285693/learning2017/common/pom.xml new file mode 100644 index 0000000000..1c062a2db4 --- /dev/null +++ b/group24/1148285693/learning2017/common/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + + + learning2017 + me.lzb + 1.0 + + + + common + common + 1.0 + + + + + diff --git a/group24/1148285693/learning2017/mini-jvm/pom.xml b/group24/1148285693/learning2017/mini-jvm/pom.xml new file mode 100644 index 0000000000..aa0101434b --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + + + learning2017 + me.lzb + 1.0 + + + + mini-jvm + mini_jvm + 1.0 + + + + + me.lzb + common + 1.0 + + + diff --git a/group24/1148285693/learning2017/other/pom.xml b/group24/1148285693/learning2017/other/pom.xml new file mode 100644 index 0000000000..38ed1e42a5 --- /dev/null +++ b/group24/1148285693/learning2017/other/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + + + learning2017 + me.lzb + 1.0 + + + + other + other + 1.0 + + + + + me.lzb + common + 1.0 + + + From 0880c4db10e2334b55c414ec6c06881ded125c3f Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Sat, 29 Apr 2017 14:17:44 +0800 Subject: [PATCH 356/552] Eighth week homework finished --- .../src/com/donaldy/jvm/attr/CodeAttr.java | 2 +- .../com/donaldy/jvm/attr/LineNumberTable.java | 2 - .../src/com/donaldy/jvm/cmd/BiPushCmd.java | 11 +- .../com/donaldy/jvm/cmd/ByteCodeCommand.java | 72 +- .../com/donaldy/jvm/cmd/CommandParser.java | 2 +- .../src/com/donaldy/jvm/cmd/GetFieldCmd.java | 14 +- .../donaldy/jvm/cmd/GetStaticFieldCmd.java | 20 +- .../com/donaldy/jvm/cmd/InvokeSpecialCmd.java | 24 +- .../com/donaldy/jvm/cmd/InvokeVirtualCmd.java | 59 +- .../src/com/donaldy/jvm/cmd/LdcCmd.java | 16 +- .../src/com/donaldy/jvm/cmd/NewObjectCmd.java | 23 +- .../src/com/donaldy/jvm/cmd/NoOperandCmd.java | 150 +-- .../src/com/donaldy/jvm/cmd/PutFieldCmd.java | 20 +- .../com/donaldy/jvm/cmd/TwoOperandCmd.java | 8 +- .../donaldy/jvm/engine/ExecutionResult.java | 5 +- .../donaldy/jvm/engine/ExecutorEngine.java | 28 +- .../com/donaldy/jvm/engine/StackFrame.java | 6 + .../donaldy/jvm/loader/ClassFileParser.java | 3 +- .../src/com/donaldy/jvm/test/MinJVMTest.java | 2 +- .../448641125/src/java/io/PrintStream.java | 1138 +++++++++++++++++ 20 files changed, 1373 insertions(+), 232 deletions(-) create mode 100644 group24/448641125/src/java/io/PrintStream.java diff --git a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java index 9122f3690a..854a0e2e75 100644 --- a/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java +++ b/group24/448641125/src/com/donaldy/jvm/attr/CodeAttr.java @@ -104,7 +104,7 @@ public String toString(ConstantPool pool) { StringBuilder buffer = new StringBuilder(); //buffer.append("Code:").append(code).append("\n"); for(int i=0;i codeMap = new HashMap(); public static final String aconst_null = "01"; public static final String new_object = "BB"; @@ -52,11 +50,11 @@ public abstract class ByteCodeCommand { public static final String istore_2 = "3D"; public static final String iadd = "60"; public static final String iinc = "84"; - + private static Map codeMap = new HashMap(); static{ codeMap.put("01", "aconst_null"); - + codeMap.put("BB", "new"); codeMap.put("37", "lstore"); codeMap.put("B7", "invokespecial"); @@ -64,61 +62,61 @@ public abstract class ByteCodeCommand { codeMap.put("B4", "getfield"); codeMap.put("B5", "putfield"); codeMap.put("B2", "getstatic"); - + codeMap.put("2A", "aload_0"); codeMap.put("2B", "aload_1"); codeMap.put("2C", "aload_2"); - + codeMap.put("10", "bipush"); codeMap.put("15", "iload"); codeMap.put("1A", "iload_0"); codeMap.put("1B", "iload_1"); codeMap.put("1C", "iload_2"); codeMap.put("1D", "iload_3"); - + codeMap.put("25", "fload_3"); - + codeMap.put("1E", "lload_0"); - + codeMap.put("24", "fload_2"); codeMap.put("4C", "astore_1"); - + codeMap.put("A2", "if_icmp_ge"); codeMap.put("A4", "if_icmple"); - + codeMap.put("A7", "goto"); - + codeMap.put("B1", "return"); codeMap.put("AC", "ireturn"); codeMap.put("AE", "freturn"); - + codeMap.put("03", "iconst_0"); codeMap.put("04", "iconst_1"); - + codeMap.put("3C", "istore_1"); codeMap.put("3D", "istore_2"); - + codeMap.put("59", "dup"); - + codeMap.put("60", "iadd"); codeMap.put("84", "iinc"); - + codeMap.put("12", "ldc"); } - - - + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ this.clzFile = clzFile; this.opCode = opCode; } - + protected ClassFile getClassFile() { return clzFile; } - + public int getOffset() { return offset; } @@ -129,31 +127,19 @@ public void setOffset(int offset) { protected ConstantInfo getConstantInfo(int index){ return this.getClassFile().getConstantPool().getConstantInfo(index); } - + protected ConstantPool getConstantPool(){ return this.getClassFile().getConstantPool(); } - - - + + + public String getOpCode() { return opCode; } public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - + public String getReadableCodeText(){ String txt = codeMap.get(opCode); if(txt == null){ @@ -163,4 +149,4 @@ public String getReadableCodeText(){ } public abstract void execute(StackFrame frame,ExecutionResult result); -} +} \ No newline at end of file diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java b/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java index b43e0d3a06..ce793bb637 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/CommandParser.java @@ -71,7 +71,7 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { cmds.add(cmd); } else if (invokevirtual.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java index 9942038c25..cdfba64252 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetFieldCmd.java @@ -15,21 +15,23 @@ public GetFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } @Override - public void execute(StackFrame frame, ExecutionResult result) { - + public void execute(StackFrame frame,ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); String fieldName = fieldRef.getFieldName(); JavaObject jo = frame.getOprandStack().pop(); JavaObject fieldValue = jo.getFieldValue(fieldName); - + frame.getOprandStack().push(fieldValue); - + + + } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java index 33acd83c2e..18ff35be32 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/GetStaticFieldCmd.java @@ -19,26 +19,24 @@ public GetStaticFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - + + @Override + public void execute(StackFrame frame,ExecutionResult result) { FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); String className = info.getClassName(); String fieldName = info.getFieldName(); String fieldType = info.getFieldType(); - - if("java/lang/System".equals(className) - && "out".equals(fieldName) - && "Ljava/io/PrintStream;".equals(fieldType)){ + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ JavaObject jo = Heap.getInstance().newObject(className); frame.getOprandStack().push(jo); } //TODO 处理非System.out的情况 } - } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java index 8390037f87..517906329f 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeSpecialCmd.java @@ -17,28 +17,30 @@ public InvokeSpecialCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsMethod(pool); + return super.getOperandAsMethod(); } - @Override - public void execute(StackFrame frame, ExecutionResult result) { + public void execute(StackFrame frame,ExecutionResult result) { MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); - + // 我们不用实现jang.lang.Object 的init方法 - if(methodRefInfo.getClassName().equals("java/lang/Object") - && methodRefInfo.getMethodName().equals("")){ + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ return ; - + } Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); - - + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); result.setNextMethod(nextMethod); - + + + } + } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java index 8e85fd8427..f0b59093a6 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/InvokeVirtualCmd.java @@ -1,7 +1,6 @@ package com.donaldy.jvm.cmd; import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.constant.MethodRefInfo; import com.donaldy.jvm.engine.ExecutionResult; import com.donaldy.jvm.engine.JavaObject; @@ -10,6 +9,7 @@ import com.donaldy.jvm.method.Method; + public class InvokeVirtualCmd extends TwoOperandCmd { public InvokeVirtualCmd(ClassFile clzFile,String opCode) { @@ -17,69 +17,70 @@ public InvokeVirtualCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsMethod(pool); + return super.getOperandAsMethod(); } + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } @Override - public void execute(StackFrame frame, ExecutionResult result) { + public void execute(StackFrame frame,ExecutionResult result) { + //先得到对该方法的描述 MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); - + String className = methodRefInfo.getClassName(); String methodName = methodRefInfo.getMethodName(); - // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 if(isSystemOutPrintlnMethod(className,methodName)){ JavaObject jo = (JavaObject)frame.getOprandStack().pop(); String value = jo.toString(); System.err.println("-------------------"+value+"----------------"); - + // 这里就是那个out对象, 因为是个假的,直接pop出来 frame.getOprandStack().pop(); - + return; } - + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 JavaObject jo = frame.getOprandStack().peek(); - + MethodArea ma = MethodArea.getInstance(); - + Method m = null; - + String currentClassName = jo.getClassName(); - + while(currentClassName != null){ - + ClassFile currentClassFile = ma.findClassFile(currentClassName); - - m = currentClassFile.getMethod(methodRefInfo.getMethodName(), - methodRefInfo.getParamAndReturnType()); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); if(m != null){ - + break; - + } else{ //查找父类 currentClassName = currentClassFile.getSuperClassName(); } - } - + } + if(m == null){ throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); } - - + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); - + result.setNextMethod(m); } - - private boolean isSystemOutPrintlnMethod(String className, String methodName){ - return "java/io/PrintStream".equals(className) - && "println".equals(methodName); - } + } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java index b6860b71c3..cf2d49ab1f 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/LdcCmd.java @@ -16,9 +16,9 @@ public LdcCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + ConstantInfo info = getConstantInfo(this.getOperand()); String value = "TBD"; if(info instanceof StringInfo){ @@ -29,13 +29,11 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - + public void execute(StackFrame frame,ExecutionResult result){ + ConstantPool pool = this.getConstantPool(); ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - + if(info instanceof StringInfo){ StringInfo strInfo = (StringInfo)info; String value = strInfo.toString(); @@ -46,7 +44,7 @@ public void execute(StackFrame frame, ExecutionResult result) { //TBD 处理其他类型 throw new RuntimeException("Only support StringInfo constant"); } - + + } - } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java index 0da6ab9d83..237c5928dc 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NewObjectCmd.java @@ -1,7 +1,6 @@ package com.donaldy.jvm.cmd; import com.donaldy.jvm.clz.ClassFile; -import com.donaldy.jvm.clz.ClassIndex; import com.donaldy.jvm.constant.ClassInfo; import com.donaldy.jvm.constant.ConstantPool; import com.donaldy.jvm.engine.ExecutionResult; @@ -16,24 +15,26 @@ public NewObjectCmd(ClassFile clzFile, String opCode){ } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsClassInfo(pool); + return super.getOperandAsClassInfo(); } - @Override - public void execute(StackFrame frame, ExecutionResult result) { - + public void execute(StackFrame frame,ExecutionResult result){ + int index = this.getIndex(); - - ClassInfo info = (ClassInfo) this.getConstantInfo(index); - + + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + String clzName = info.getClassName(); - + //在Java堆上创建一个实例 JavaObject jo = Heap.getInstance().newObject(clzName); - + frame.getOprandStack().push(jo); + + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java index f4a3f4f0cc..32ea5853ee 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/NoOperandCmd.java @@ -14,127 +14,133 @@ public NoOperandCmd(ClassFile clzFile, String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } - - - public int getLength(){ - return 1; - } - @Override - public void execute(StackFrame frame, ExecutionResult result) { - + public void execute(StackFrame frame,ExecutionResult result) { + String opCode = this.getOpCode(); - - if (ByteCodeCommand.aload_0.equals(opCode)) { - + + if(ByteCodeCommand.aload_0.equals(opCode)){ + JavaObject jo = frame.getLocalVariableValue(0); - + frame.getOprandStack().push(jo); - - } else if (ByteCodeCommand.aload_1.equals(opCode)) { - + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + JavaObject jo = frame.getLocalVariableValue(1); - + frame.getOprandStack().push(jo); - - } else if (ByteCodeCommand.aload_2.equals(opCode)) { - + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + JavaObject jo = frame.getLocalVariableValue(2); - + frame.getOprandStack().push(jo); - - } else if (ByteCodeCommand.iload_1.equals(opCode)) { - + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + JavaObject jo = frame.getLocalVariableValue(1); - + frame.getOprandStack().push(jo); - - } else if (ByteCodeCommand.iload_2.equals(opCode)) { - + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + JavaObject jo = frame.getLocalVariableValue(2); - + frame.getOprandStack().push(jo); - - } else if (ByteCodeCommand.iload_3.equals(opCode)) { - + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + JavaObject jo = frame.getLocalVariableValue(3); - + frame.getOprandStack().push(jo); - - } else if (ByteCodeCommand.fload_3.equals(opCode)) { - + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + JavaObject jo = frame.getLocalVariableValue(3); - + frame.getOprandStack().push(jo); - - } else if (ByteCodeCommand.voidreturn.equals(opCode)) { - + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); - - } else if (ByteCodeCommand.freturn.equals(opCode)) { - + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ StackFrame callerFrame = frame.getCallerFrame(); JavaObject jo = frame.getOprandStack().pop(); callerFrame.getOprandStack().push(jo); - - } else if(ByteCodeCommand.astore_1.equals(opCode)){ - + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); JavaObject jo = frame.getOprandStack().pop(); - - frame.setLocalVariableValue(1, jo); - + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + } else if(ByteCodeCommand.dup.equals(opCode)){ - + JavaObject jo = frame.getOprandStack().peek(); frame.getOprandStack().push(jo); - + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ - + JavaObject jo = Heap.getInstance().newInt(0); - + frame.getOprandStack().push(jo); - + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ - + JavaObject jo = Heap.getInstance().newInt(1); - + frame.getOprandStack().push(jo); - + } else if(ByteCodeCommand.istore_1.equals(opCode)){ - + JavaObject jo = frame.getOprandStack().pop(); - + frame.setLocalVariableValue(1, jo); - + } else if(ByteCodeCommand.istore_2.equals(opCode)){ - + JavaObject jo = frame.getOprandStack().pop(); - + frame.setLocalVariableValue(2, jo); - + } else if(ByteCodeCommand.iadd.equals(opCode)){ - + JavaObject jo1 = frame.getOprandStack().pop(); JavaObject jo2 = frame.getOprandStack().pop(); - + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); - + frame.getOprandStack().push(sum); - + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ - + frame.getOprandStack().push(null); - - } + + } else{ throw new RuntimeException("you must forget to implement the operation :" + opCode); } - + + + } + + + public int getLength(){ + return 1; } - } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java index 4a9f8aa8d3..cb9e60e27b 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/PutFieldCmd.java @@ -16,29 +16,29 @@ public PutFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } - - @Override - public void execute(StackFrame frame, ExecutionResult result) { - + public void execute(StackFrame frame,ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); - + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); // for example : name String fieldName = nameTypeInfo.getName(); // for example : Ljava/lang/String : 注意:我们不再检查类型 String fieldType = nameTypeInfo.getTypeInfo(); - + JavaObject fieldValue = frame.getOprandStack().pop(); JavaObject objectRef = frame.getOprandStack().pop(); - + objectRef.setFieldValue(fieldName, fieldValue); - + } + + } diff --git a/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java b/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java index 1d38c8ed3f..3c62fd93e0 100644 --- a/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java +++ b/group24/448641125/src/com/donaldy/jvm/cmd/TwoOperandCmd.java @@ -39,14 +39,14 @@ public int getIndex(){ return index; } - protected String getOperandAsClassInfo(ConstantPool pool){ + protected String getOperandAsClassInfo(){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + ClassInfo info = (ClassInfo)getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); } - protected String getOperandAsMethod(ConstantPool pool){ + protected String getOperandAsMethod(){ int index = getIndex(); String codeTxt = getReadableCodeText(); ConstantInfo constInfo = this.getConstantInfo(index); @@ -54,7 +54,7 @@ protected String getOperandAsMethod(ConstantPool pool){ return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); } - protected String getOperandAsField(ConstantPool pool){ + protected String getOperandAsField(){ int index = getIndex(); String codeTxt = getReadableCodeText(); diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java index c90cc8fc65..ea6340e976 100644 --- a/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java +++ b/group24/448641125/src/com/donaldy/jvm/engine/ExecutionResult.java @@ -48,9 +48,6 @@ public int getNextCmdOffset() { public void setNextCmdOffset(int nextCmdOffset) { this.nextCmdOffset = nextCmdOffset; } - - - - + } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java index efa188d917..e18323a4d6 100644 --- a/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java +++ b/group24/448641125/src/com/donaldy/jvm/engine/ExecutorEngine.java @@ -21,6 +21,7 @@ public ExecutorEngine() { public void execute(Method mainMethod){ StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); while (!stack.empty()) { @@ -33,8 +34,11 @@ public void execute(Method mainMethod){ if (result.isPauseAndRunNewFrame()) { Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame, nextFrame); stack.push(nextFrame); @@ -48,34 +52,38 @@ public void execute(Method mainMethod){ } - - - + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { - + Method nextMethod = nextFrame.getMethod(); + List paramList = nextMethod.getParameterList(); //加上1 是因为要把this也传递过去 + int paramNum = paramList.size() + 1; - List values = new ArrayList<>(); - //从栈中取出栈顶的x个元素 - while (paramNum > 0) { + List values = new ArrayList(); + + //数据结构知识: 从栈中取出栈顶的x个元素 + while(paramNum>0){ values.add(currentFrame.getOprandStack().pop()); paramNum --; } - - //把一个列表倒序排列 + //数据结构知识: 把一个列表倒序排列 List params = new ArrayList(); - for (int i = values.size() - 1; i >= 0; i --) { + for(int i=values.size()-1; i>=0 ;i--){ params.add(values.get(i)); } + nextFrame.setLocalVariableTable(params); + } } diff --git a/group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java b/group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java index ca82395f14..56c4f9c3f7 100644 --- a/group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java +++ b/group24/448641125/src/com/donaldy/jvm/engine/StackFrame.java @@ -5,6 +5,7 @@ import java.util.Stack; import com.donaldy.jvm.cmd.ByteCodeCommand; +import com.donaldy.jvm.cmd.InvokeVirtualCmd; import com.donaldy.jvm.method.Method; public class StackFrame { @@ -76,6 +77,8 @@ public ExecutionResult execute(){ System.out.println(cmds[this.index].toString()); + cmds[this.index].execute(this, result); + if (result.isRunNextCmd()) { this.index ++; } @@ -84,6 +87,7 @@ else if (result.isExitCurrentFrame()) { } else if (result.isPauseAndRunNewFrame()) { this.index ++; + return result; } else if (result.isJump()) { @@ -96,7 +100,9 @@ else if (result.isJump()) { //当前StackFrmae的指令全部执行完毕,可以退出了 ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + return result; } diff --git a/group24/448641125/src/com/donaldy/jvm/loader/ClassFileParser.java b/group24/448641125/src/com/donaldy/jvm/loader/ClassFileParser.java index b0229c7435..ea14b12360 100644 --- a/group24/448641125/src/com/donaldy/jvm/loader/ClassFileParser.java +++ b/group24/448641125/src/com/donaldy/jvm/loader/ClassFileParser.java @@ -125,10 +125,11 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { nameType.setIndex2(iter.nextU2ToInt()); pool.addConstantInfo(nameType); } else { - throw new RuntimeException("the constant pool tag" + tag); + throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet."); } } + System.out.println("Finished reading Constant pool "); return pool; } diff --git a/group24/448641125/src/com/donaldy/jvm/test/MinJVMTest.java b/group24/448641125/src/com/donaldy/jvm/test/MinJVMTest.java index 6ff89089b3..7936da4dfc 100644 --- a/group24/448641125/src/com/donaldy/jvm/test/MinJVMTest.java +++ b/group24/448641125/src/com/donaldy/jvm/test/MinJVMTest.java @@ -26,6 +26,6 @@ public void testMain() throws Exception { */ String [] classPaths = {PATH}; MiniJVM jvm = new MiniJVM(); - jvm.run(classPaths, "com.donaldy.jvm.test.EmployeeV1"); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); } } diff --git a/group24/448641125/src/java/io/PrintStream.java b/group24/448641125/src/java/io/PrintStream.java new file mode 100644 index 0000000000..659e3c4ea2 --- /dev/null +++ b/group24/448641125/src/java/io/PrintStream.java @@ -0,0 +1,1138 @@ +package java.io; + +/** + * Created by DonaldY on 2017/4/29. + */ +/* + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +import java.nio.charset.Charset; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.UnsupportedCharsetException; +import java.util.Formatter; +import java.util.Locale; + +import java.util.Formatter; +import java.util.Locale; +import java.nio.charset.Charset; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.UnsupportedCharsetException; + +/** + * A PrintStream adds functionality to another output stream, + * namely the ability to print representations of various data values + * conveniently. Two other features are provided as well. Unlike other output + * streams, a PrintStream never throws an + * IOException; instead, exceptional situations merely set an + * internal flag that can be tested via the checkError method. + * Optionally, a PrintStream can be created so as to flush + * automatically; this means that the flush method is + * automatically invoked after a byte array is written, one of the + * println methods is invoked, or a newline character or byte + * ('\n') is written. + * + *

    All characters printed by a PrintStream are converted into + * bytes using the platform's default character encoding. The {@link + * PrintWriter} class should be used in situations that require writing + * characters rather than bytes. + * + * @author Frank Yellin + * @author Mark Reinhold + * @since JDK1.0 + */ + +public class PrintStream extends FilterOutputStream + implements Appendable, Closeable +{ + + private final boolean autoFlush; + private boolean trouble = false; + private Formatter formatter; + + /** + * Track both the text- and character-output streams, so that their buffers + * can be flushed without flushing the entire stream. + */ + private BufferedWriter textOut; + private OutputStreamWriter charOut; + + /** + * requireNonNull is explicitly declared here so as not to create an extra + * dependency on java.util.Objects.requireNonNull. PrintStream is loaded + * early during system initialization. + */ + private static T requireNonNull(T obj, String message) { + if (obj == null) + throw new NullPointerException(message); + return obj; + } + + /** + * Returns a charset object for the given charset name. + * @throws NullPointerException is csn is null + * @throws UnsupportedEncodingException if the charset is not supported + */ + private static Charset toCharset(String csn) + throws UnsupportedEncodingException + { + requireNonNull(csn, "charsetName"); + try { + return Charset.forName(csn); + } catch (IllegalCharsetNameException |UnsupportedCharsetException unused) { + // UnsupportedEncodingException should be thrown + throw new UnsupportedEncodingException(csn); + } + } + + /* Private constructors */ + private PrintStream(boolean autoFlush, OutputStream out) { + super(out); + this.autoFlush = autoFlush; + this.charOut = new OutputStreamWriter(this); + this.textOut = new BufferedWriter(charOut); + } + + private PrintStream(boolean autoFlush, OutputStream out, Charset charset) { + super(out); + this.autoFlush = autoFlush; + this.charOut = new OutputStreamWriter(this, charset); + this.textOut = new BufferedWriter(charOut); + } + + /* Variant of the private constructor so that the given charset name + * can be verified before evaluating the OutputStream argument. Used + * by constructors creating a FileOutputStream that also take a + * charset name. + */ + private PrintStream(boolean autoFlush, Charset charset, OutputStream out) + throws UnsupportedEncodingException + { + this(autoFlush, out, charset); + } + + /** + * Creates a new print stream. This stream will not flush automatically. + * + * @param out The output stream to which values and objects will be + * printed + * + * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream) + */ + public PrintStream(OutputStream out) { + this(out, false); + } + + /** + * Creates a new print stream. + * + * @param out The output stream to which values and objects will be + * printed + * @param autoFlush A boolean; if true, the output buffer will be flushed + * whenever a byte array is written, one of the + * println methods is invoked, or a newline + * character or byte ('\n') is written + * + * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream, boolean) + */ + public PrintStream(OutputStream out, boolean autoFlush) { + this(autoFlush, requireNonNull(out, "Null output stream")); + } + + /** + * Creates a new print stream. + * + * @param out The output stream to which values and objects will be + * printed + * @param autoFlush A boolean; if true, the output buffer will be flushed + * whenever a byte array is written, one of the + * println methods is invoked, or a newline + * character or byte ('\n') is written + * @param encoding The name of a supported + * + * character encoding + * + * @throws UnsupportedEncodingException + * If the named encoding is not supported + * + * @since 1.4 + */ + public PrintStream(OutputStream out, boolean autoFlush, String encoding) + throws UnsupportedEncodingException + { + this(autoFlush, + requireNonNull(out, "Null output stream"), + toCharset(encoding)); + } + + /** + * Creates a new print stream, without automatic line flushing, with the + * specified file name. This convenience constructor creates + * the necessary intermediate {@link java.io.OutputStreamWriter + * OutputStreamWriter}, which will encode characters using the + * {@linkplain java.nio.charset.Charset#defaultCharset() default charset} + * for this instance of the Java virtual machine. + * + * @param fileName + * The name of the file to use as the destination of this print + * stream. If the file exists, then it will be truncated to + * zero size; otherwise, a new file will be created. The output + * will be written to the file and is buffered. + * + * @throws FileNotFoundException + * If the given file object does not denote an existing, writable + * regular file and a new regular file of that name cannot be + * created, or if some other error occurs while opening or + * creating the file + * + * @throws SecurityException + * If a security manager is present and {@link + * SecurityManager#checkWrite checkWrite(fileName)} denies write + * access to the file + * + * @since 1.5 + */ + public PrintStream(String fileName) throws FileNotFoundException { + this(false, new FileOutputStream(fileName)); + } + + /** + * Creates a new print stream, without automatic line flushing, with the + * specified file name and charset. This convenience constructor creates + * the necessary intermediate {@link java.io.OutputStreamWriter + * OutputStreamWriter}, which will encode characters using the provided + * charset. + * + * @param fileName + * The name of the file to use as the destination of this print + * stream. If the file exists, then it will be truncated to + * zero size; otherwise, a new file will be created. The output + * will be written to the file and is buffered. + * + * @param csn + * The name of a supported {@linkplain java.nio.charset.Charset + * charset} + * + * @throws FileNotFoundException + * If the given file object does not denote an existing, writable + * regular file and a new regular file of that name cannot be + * created, or if some other error occurs while opening or + * creating the file + * + * @throws SecurityException + * If a security manager is present and {@link + * SecurityManager#checkWrite checkWrite(fileName)} denies write + * access to the file + * + * @throws UnsupportedEncodingException + * If the named charset is not supported + * + * @since 1.5 + */ + public PrintStream(String fileName, String csn) + throws FileNotFoundException, UnsupportedEncodingException + { + // ensure charset is checked before the file is opened + this(false, toCharset(csn), new FileOutputStream(fileName)); + } + + /** + * Creates a new print stream, without automatic line flushing, with the + * specified file. This convenience constructor creates the necessary + * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter}, + * which will encode characters using the {@linkplain + * java.nio.charset.Charset#defaultCharset() default charset} for this + * instance of the Java virtual machine. + * + * @param file + * The file to use as the destination of this print stream. If the + * file exists, then it will be truncated to zero size; otherwise, + * a new file will be created. The output will be written to the + * file and is buffered. + * + * @throws FileNotFoundException + * If the given file object does not denote an existing, writable + * regular file and a new regular file of that name cannot be + * created, or if some other error occurs while opening or + * creating the file + * + * @throws SecurityException + * If a security manager is present and {@link + * SecurityManager#checkWrite checkWrite(file.getPath())} + * denies write access to the file + * + * @since 1.5 + */ + public PrintStream(File file) throws FileNotFoundException { + this(false, new FileOutputStream(file)); + } + + /** + * Creates a new print stream, without automatic line flushing, with the + * specified file and charset. This convenience constructor creates + * the necessary intermediate {@link java.io.OutputStreamWriter + * OutputStreamWriter}, which will encode characters using the provided + * charset. + * + * @param file + * The file to use as the destination of this print stream. If the + * file exists, then it will be truncated to zero size; otherwise, + * a new file will be created. The output will be written to the + * file and is buffered. + * + * @param csn + * The name of a supported {@linkplain java.nio.charset.Charset + * charset} + * + * @throws FileNotFoundException + * If the given file object does not denote an existing, writable + * regular file and a new regular file of that name cannot be + * created, or if some other error occurs while opening or + * creating the file + * + * @throws SecurityException + * If a security manager is present and {@link + * SecurityManager#checkWrite checkWrite(file.getPath())} + * denies write access to the file + * + * @throws UnsupportedEncodingException + * If the named charset is not supported + * + * @since 1.5 + */ + public PrintStream(File file, String csn) + throws FileNotFoundException, UnsupportedEncodingException + { + // ensure charset is checked before the file is opened + this(false, toCharset(csn), new FileOutputStream(file)); + } + + /** Check to make sure that the stream has not been closed */ + private void ensureOpen() throws IOException { + if (out == null) + throw new IOException("Stream closed"); + } + + /** + * Flushes the stream. This is done by writing any buffered output bytes to + * the underlying output stream and then flushing that stream. + * + * @see java.io.OutputStream#flush() + */ + public void flush() { + synchronized (this) { + try { + ensureOpen(); + out.flush(); + } + catch (IOException x) { + trouble = true; + } + } + } + + private boolean closing = false; /* To avoid recursive closing */ + + /** + * Closes the stream. This is done by flushing the stream and then closing + * the underlying output stream. + * + * @see java.io.OutputStream#close() + */ + public void close() { + synchronized (this) { + if (! closing) { + closing = true; + try { + textOut.close(); + out.close(); + } + catch (IOException x) { + trouble = true; + } + textOut = null; + charOut = null; + out = null; + } + } + } + + /** + * Flushes the stream and checks its error state. The internal error state + * is set to true when the underlying output stream throws an + * IOException other than InterruptedIOException, + * and when the setError method is invoked. If an operation + * on the underlying output stream throws an + * InterruptedIOException, then the PrintStream + * converts the exception back into an interrupt by doing: + *

    +     *     Thread.currentThread().interrupt();
    +     * 
    + * or the equivalent. + * + * @return true if and only if this stream has encountered an + * IOException other than + * InterruptedIOException, or the + * setError method has been invoked + */ + public boolean checkError() { + if (out != null) + flush(); + if (out instanceof java.io.PrintStream) { + PrintStream ps = (PrintStream) out; + return ps.checkError(); + } + return trouble; + } + + /** + * Sets the error state of the stream to true. + * + *

    This method will cause subsequent invocations of {@link + * #checkError()} to return true until {@link + * #clearError()} is invoked. + * + * @since JDK1.1 + */ + protected void setError() { + trouble = true; + } + + /** + * Clears the internal error state of this stream. + * + *

    This method will cause subsequent invocations of {@link + * #checkError()} to return false until another write + * operation fails and invokes {@link #setError()}. + * + * @since 1.6 + */ + protected void clearError() { + trouble = false; + } + + /* + * Exception-catching, synchronized output operations, + * which also implement the write() methods of OutputStream + */ + + /** + * Writes the specified byte to this stream. If the byte is a newline and + * automatic flushing is enabled then the flush method will be + * invoked. + * + *

    Note that the byte is written as given; to write a character that + * will be translated according to the platform's default character + * encoding, use the print(char) or println(char) + * methods. + * + * @param b The byte to be written + * @see #print(char) + * @see #println(char) + */ + public void write(int b) { + try { + synchronized (this) { + ensureOpen(); + out.write(b); + if ((b == '\n') && autoFlush) + out.flush(); + } + } + catch (InterruptedIOException x) { + Thread.currentThread().interrupt(); + } + catch (IOException x) { + trouble = true; + } + } + + /** + * Writes len bytes from the specified byte array starting at + * offset off to this stream. If automatic flushing is + * enabled then the flush method will be invoked. + * + *

    Note that the bytes will be written as given; to write characters + * that will be translated according to the platform's default character + * encoding, use the print(char) or println(char) + * methods. + * + * @param buf A byte array + * @param off Offset from which to start taking bytes + * @param len Number of bytes to write + */ + public void write(byte buf[], int off, int len) { + try { + synchronized (this) { + ensureOpen(); + out.write(buf, off, len); + if (autoFlush) + out.flush(); + } + } + catch (InterruptedIOException x) { + Thread.currentThread().interrupt(); + } + catch (IOException x) { + trouble = true; + } + } + + /* + * The following private methods on the text- and character-output streams + * always flush the stream buffers, so that writes to the underlying byte + * stream occur as promptly as with the original PrintStream. + */ + + private void write(char buf[]) { + try { + synchronized (this) { + ensureOpen(); + textOut.write(buf); + textOut.flushBuffer(); + charOut.flushBuffer(); + if (autoFlush) { + for (int i = 0; i < buf.length; i++) + if (buf[i] == '\n') + out.flush(); + } + } + } + catch (InterruptedIOException x) { + Thread.currentThread().interrupt(); + } + catch (IOException x) { + trouble = true; + } + } + + private void write(String s) { + try { + synchronized (this) { + ensureOpen(); + textOut.write(s); + textOut.flushBuffer(); + charOut.flushBuffer(); + if (autoFlush && (s.indexOf('\n') >= 0)) + out.flush(); + } + } + catch (InterruptedIOException x) { + Thread.currentThread().interrupt(); + } + catch (IOException x) { + trouble = true; + } + } + + private void newLine() { + try { + synchronized (this) { + ensureOpen(); + textOut.newLine(); + textOut.flushBuffer(); + charOut.flushBuffer(); + if (autoFlush) + out.flush(); + } + } + catch (InterruptedIOException x) { + Thread.currentThread().interrupt(); + } + catch (IOException x) { + trouble = true; + } + } + + /* Methods that do not terminate lines */ + + /** + * Prints a boolean value. The string produced by {@link + * java.lang.String#valueOf(boolean)} is translated into bytes + * according to the platform's default character encoding, and these bytes + * are written in exactly the manner of the + * {@link #write(int)} method. + * + * @param b The boolean to be printed + */ + public void print(boolean b) { + write(b ? "true" : "false"); + } + + /** + * Prints a character. The character is translated into one or more bytes + * according to the platform's default character encoding, and these bytes + * are written in exactly the manner of the + * {@link #write(int)} method. + * + * @param c The char to be printed + */ + public void print(char c) { + write(String.valueOf(c)); + } + + /** + * Prints an integer. The string produced by {@link + * java.lang.String#valueOf(int)} is translated into bytes + * according to the platform's default character encoding, and these bytes + * are written in exactly the manner of the + * {@link #write(int)} method. + * + * @param i The int to be printed + * @see java.lang.Integer#toString(int) + */ + public void print(int i) { + write(String.valueOf(i)); + } + + /** + * Prints a long integer. The string produced by {@link + * java.lang.String#valueOf(long)} is translated into bytes + * according to the platform's default character encoding, and these bytes + * are written in exactly the manner of the + * {@link #write(int)} method. + * + * @param l The long to be printed + * @see java.lang.Long#toString(long) + */ + public void print(long l) { + write(String.valueOf(l)); + } + + /** + * Prints a floating-point number. The string produced by {@link + * java.lang.String#valueOf(float)} is translated into bytes + * according to the platform's default character encoding, and these bytes + * are written in exactly the manner of the + * {@link #write(int)} method. + * + * @param f The float to be printed + * @see java.lang.Float#toString(float) + */ + public void print(float f) { + write(String.valueOf(f)); + } + + /** + * Prints a double-precision floating-point number. The string produced by + * {@link java.lang.String#valueOf(double)} is translated into + * bytes according to the platform's default character encoding, and these + * bytes are written in exactly the manner of the {@link + * #write(int)} method. + * + * @param d The double to be printed + * @see java.lang.Double#toString(double) + */ + public void print(double d) { + write(String.valueOf(d)); + } + + /** + * Prints an array of characters. The characters are converted into bytes + * according to the platform's default character encoding, and these bytes + * are written in exactly the manner of the + * {@link #write(int)} method. + * + * @param s The array of chars to be printed + * + * @throws NullPointerException If s is null + */ + public void print(char s[]) { + write(s); + } + + /** + * Prints a string. If the argument is null then the string + * "null" is printed. Otherwise, the string's characters are + * converted into bytes according to the platform's default character + * encoding, and these bytes are written in exactly the manner of the + * {@link #write(int)} method. + * + * @param s The String to be printed + */ + public void print(String s) { + if (s == null) { + s = "null"; + } + write(s); + } + + /** + * Prints an object. The string produced by the {@link + * java.lang.String#valueOf(Object)} method is translated into bytes + * according to the platform's default character encoding, and these bytes + * are written in exactly the manner of the + * {@link #write(int)} method. + * + * @param obj The Object to be printed + * @see java.lang.Object#toString() + */ + public void print(Object obj) { + write(String.valueOf(obj)); + } + + + /* Methods that do terminate lines */ + + /** + * Terminates the current line by writing the line separator string. The + * line separator string is defined by the system property + * line.separator, and is not necessarily a single newline + * character ('\n'). + */ + public void println() { + newLine(); + } + + /** + * Prints a boolean and then terminate the line. This method behaves as + * though it invokes {@link #print(boolean)} and then + * {@link #println()}. + * + * @param x The boolean to be printed + */ + public void println(boolean x) { + synchronized (this) { + print(x); + newLine(); + } + } + + /** + * Prints a character and then terminate the line. This method behaves as + * though it invokes {@link #print(char)} and then + * {@link #println()}. + * + * @param x The char to be printed. + */ + public void println(char x) { + synchronized (this) { + print(x); + newLine(); + } + } + + /** + * Prints an integer and then terminate the line. This method behaves as + * though it invokes {@link #print(int)} and then + * {@link #println()}. + * + * @param x The int to be printed. + */ + public void println(int x) { + synchronized (this) { + print(x); + newLine(); + } + } + + /** + * Prints a long and then terminate the line. This method behaves as + * though it invokes {@link #print(long)} and then + * {@link #println()}. + * + * @param x a The long to be printed. + */ + public void println(long x) { + synchronized (this) { + print(x); + newLine(); + } + } + + /** + * Prints a float and then terminate the line. This method behaves as + * though it invokes {@link #print(float)} and then + * {@link #println()}. + * + * @param x The float to be printed. + */ + public void println(float x) { + synchronized (this) { + print(x); + newLine(); + } + } + + /** + * Prints a double and then terminate the line. This method behaves as + * though it invokes {@link #print(double)} and then + * {@link #println()}. + * + * @param x The double to be printed. + */ + public void println(double x) { + synchronized (this) { + print(x); + newLine(); + } + } + + /** + * Prints an array of characters and then terminate the line. This method + * behaves as though it invokes {@link #print(char[])} and + * then {@link #println()}. + * + * @param x an array of chars to print. + */ + public void println(char x[]) { + synchronized (this) { + print(x); + newLine(); + } + } + + /** + * Prints a String and then terminate the line. This method behaves as + * though it invokes {@link #print(String)} and then + * {@link #println()}. + * + * @param x The String to be printed. + */ + public void println(String x) { + synchronized (this) { + print(x); + newLine(); + } + } + + /** + * Prints an Object and then terminate the line. This method calls + * at first String.valueOf(x) to get the printed object's string value, + * then behaves as + * though it invokes {@link #print(String)} and then + * {@link #println()}. + * + * @param x The Object to be printed. + */ + public void println(Object x) { + String s = String.valueOf(x); + synchronized (this) { + print(s); + newLine(); + } + } + + + /** + * A convenience method to write a formatted string to this output stream + * using the specified format string and arguments. + * + *

    An invocation of this method of the form out.printf(format, + * args) behaves in exactly the same way as the invocation + * + *

    +     *     out.format(format, args) 
    + * + * @param format + * A format string as described in Format string syntax + * + * @param args + * Arguments referenced by the format specifiers in the format + * string. If there are more arguments than format specifiers, the + * extra arguments are ignored. The number of arguments is + * variable and may be zero. The maximum number of arguments is + * limited by the maximum dimension of a Java array as defined by + * The Java™ Virtual Machine Specification. + * The behaviour on a + * null argument depends on the conversion. + * + * @throws java.util.IllegalFormatException + * If a format string contains an illegal syntax, a format + * specifier that is incompatible with the given arguments, + * insufficient arguments given the format string, or other + * illegal conditions. For specification of all possible + * formatting errors, see the Details section of the + * formatter class specification. + * + * @throws NullPointerException + * If the format is null + * + * @return This output stream + * + * @since 1.5 + */ + public PrintStream printf(String format, Object ... args) { + return format(format, args); + } + + /** + * A convenience method to write a formatted string to this output stream + * using the specified format string and arguments. + * + *

    An invocation of this method of the form out.printf(l, format, + * args) behaves in exactly the same way as the invocation + * + *

    +     *     out.format(l, format, args) 
    + * + * @param l + * The {@linkplain java.util.Locale locale} to apply during + * formatting. If l is null then no localization + * is applied. + * + * @param format + * A format string as described in Format string syntax + * + * @param args + * Arguments referenced by the format specifiers in the format + * string. If there are more arguments than format specifiers, the + * extra arguments are ignored. The number of arguments is + * variable and may be zero. The maximum number of arguments is + * limited by the maximum dimension of a Java array as defined by + * The Java™ Virtual Machine Specification. + * The behaviour on a + * null argument depends on the conversion. + * + * @throws java.util.IllegalFormatException + * If a format string contains an illegal syntax, a format + * specifier that is incompatible with the given arguments, + * insufficient arguments given the format string, or other + * illegal conditions. For specification of all possible + * formatting errors, see the Details section of the + * formatter class specification. + * + * @throws NullPointerException + * If the format is null + * + * @return This output stream + * + * @since 1.5 + */ + public PrintStream printf(Locale l, String format, Object ... args) { + return format(l, format, args); + } + + /** + * Writes a formatted string to this output stream using the specified + * format string and arguments. + * + *

    The locale always used is the one returned by {@link + * java.util.Locale#getDefault() Locale.getDefault()}, regardless of any + * previous invocations of other formatting methods on this object. + * + * @param format + * A format string as described in Format string syntax + * + * @param args + * Arguments referenced by the format specifiers in the format + * string. If there are more arguments than format specifiers, the + * extra arguments are ignored. The number of arguments is + * variable and may be zero. The maximum number of arguments is + * limited by the maximum dimension of a Java array as defined by + * The Java™ Virtual Machine Specification. + * The behaviour on a + * null argument depends on the conversion. + * + * @throws java.util.IllegalFormatException + * If a format string contains an illegal syntax, a format + * specifier that is incompatible with the given arguments, + * insufficient arguments given the format string, or other + * illegal conditions. For specification of all possible + * formatting errors, see the Details section of the + * formatter class specification. + * + * @throws NullPointerException + * If the format is null + * + * @return This output stream + * + * @since 1.5 + */ + public PrintStream format(String format, Object ... args) { + try { + synchronized (this) { + ensureOpen(); + if ((formatter == null) + || (formatter.locale() != Locale.getDefault())) + formatter = new Formatter((Appendable) this); + formatter.format(Locale.getDefault(), format, args); + } + } catch (InterruptedIOException x) { + Thread.currentThread().interrupt(); + } catch (IOException x) { + trouble = true; + } + return this; + } + + /** + * Writes a formatted string to this output stream using the specified + * format string and arguments. + * + * @param l + * The {@linkplain java.util.Locale locale} to apply during + * formatting. If l is null then no localization + * is applied. + * + * @param format + * A format string as described in Format string syntax + * + * @param args + * Arguments referenced by the format specifiers in the format + * string. If there are more arguments than format specifiers, the + * extra arguments are ignored. The number of arguments is + * variable and may be zero. The maximum number of arguments is + * limited by the maximum dimension of a Java array as defined by + * The Java™ Virtual Machine Specification. + * The behaviour on a + * null argument depends on the conversion. + * + * @throws java.util.IllegalFormatException + * If a format string contains an illegal syntax, a format + * specifier that is incompatible with the given arguments, + * insufficient arguments given the format string, or other + * illegal conditions. For specification of all possible + * formatting errors, see the Details section of the + * formatter class specification. + * + * @throws NullPointerException + * If the format is null + * + * @return This output stream + * + * @since 1.5 + */ + public PrintStream format(Locale l, String format, Object ... args) { + try { + synchronized (this) { + ensureOpen(); + if ((formatter == null) + || (formatter.locale() != l)) + formatter = new Formatter(this, l); + formatter.format(l, format, args); + } + } catch (InterruptedIOException x) { + Thread.currentThread().interrupt(); + } catch (IOException x) { + trouble = true; + } + return this; + } + + /** + * Appends the specified character sequence to this output stream. + * + *

    An invocation of this method of the form out.append(csq) + * behaves in exactly the same way as the invocation + * + *

    +     *     out.print(csq.toString()) 
    + * + *

    Depending on the specification of toString for the + * character sequence csq, the entire sequence may not be + * appended. For instance, invoking then toString method of a + * character buffer will return a subsequence whose content depends upon + * the buffer's position and limit. + * + * @param csq + * The character sequence to append. If csq is + * null, then the four characters "null" are + * appended to this output stream. + * + * @return This output stream + * + * @since 1.5 + */ + public PrintStream append(CharSequence csq) { + if (csq == null) + print("null"); + else + print(csq.toString()); + return this; + } + + /** + * Appends a subsequence of the specified character sequence to this output + * stream. + * + *

    An invocation of this method of the form out.append(csq, start, + * end) when csq is not null, behaves in + * exactly the same way as the invocation + * + *

    +     *     out.print(csq.subSequence(start, end).toString()) 
    + * + * @param csq + * The character sequence from which a subsequence will be + * appended. If csq is null, then characters + * will be appended as if csq contained the four + * characters "null". + * + * @param start + * The index of the first character in the subsequence + * + * @param end + * The index of the character following the last character in the + * subsequence + * + * @return This output stream + * + * @throws IndexOutOfBoundsException + * If start or end are negative, start + * is greater than end, or end is greater than + * csq.length() + * + * @since 1.5 + */ + public PrintStream append(CharSequence csq, int start, int end) { + CharSequence cs = (csq == null ? "null" : csq); + write(cs.subSequence(start, end).toString()); + return this; + } + + /** + * Appends the specified character to this output stream. + * + *

    An invocation of this method of the form out.append(c) + * behaves in exactly the same way as the invocation + * + *

    +     *     out.print(c) 
    + * + * @param c + * The 16-bit character to append + * + * @return This output stream + * + * @since 1.5 + */ + public PrintStream append(char c) { + print(c); + return this; + } + +} From 6c81fd2e936bb855adbff1449939b2bab6eccb6a Mon Sep 17 00:00:00 2001 From: zheng <765324639@qq.com> Date: Sat, 29 Apr 2017 17:26:55 +0800 Subject: [PATCH 357/552] =?UTF-8?q?=E5=AE=8C=E6=88=90jvm=E7=AC=AC5?= =?UTF-8?q?=E6=AC=A1=E4=BD=9C=E4=B8=9A=E7=9A=84=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/datastructure/queue/CircleQueue.java | 53 ++++++++++++++++ .../java/datastructure/queue/Josephus.java | 56 +++++++++++++++++ .../java/datastructure/{ => queue}/Queue.java | 2 +- .../queue/QueueWithTwoStacks.java | 60 +++++++++++++++++++ .../datastructure/queue/CircleQueueTest.java | 38 ++++++++++++ .../datastructure/queue/JosephusTest.java | 31 ++++++++++ .../datastructure/{ => queue}/QueueTest.java | 4 +- .../queue/QueueWithTwoStacksTest.java | 27 +++++++++ 8 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 group01/765324639/src/main/java/datastructure/queue/CircleQueue.java create mode 100644 group01/765324639/src/main/java/datastructure/queue/Josephus.java rename group01/765324639/src/main/java/datastructure/{ => queue}/Queue.java (88%) create mode 100644 group01/765324639/src/main/java/datastructure/queue/QueueWithTwoStacks.java create mode 100644 group01/765324639/src/test/java/datastructure/queue/CircleQueueTest.java create mode 100644 group01/765324639/src/test/java/datastructure/queue/JosephusTest.java rename group01/765324639/src/test/java/datastructure/{ => queue}/QueueTest.java (89%) create mode 100644 group01/765324639/src/test/java/datastructure/queue/QueueWithTwoStacksTest.java diff --git a/group01/765324639/src/main/java/datastructure/queue/CircleQueue.java b/group01/765324639/src/main/java/datastructure/queue/CircleQueue.java new file mode 100644 index 0000000000..a0e640bb9a --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/queue/CircleQueue.java @@ -0,0 +1,53 @@ +package datastructure.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + private int size = 0; + + public boolean isEmpty() { + return size == 0; + + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + if (size >= DEFAULT_SIZE) { + throw new RuntimeException("队列已满"); + } + elementData[rear] = data; + rear = (rear + 1) % DEFAULT_SIZE; + size++; + } + + @SuppressWarnings("unchecked") + public E deQueue() { + if (size <= 0) { + throw new RuntimeException("队列已空"); + } + size--; + Object object = elementData[front]; + front = (front + 1) % DEFAULT_SIZE; + return (E) object; + } +} diff --git a/group01/765324639/src/main/java/datastructure/queue/Josephus.java b/group01/765324639/src/main/java/datastructure/queue/Josephus.java new file mode 100644 index 0000000000..b927353cb4 --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/queue/Josephus.java @@ -0,0 +1,56 @@ +package datastructure.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, + * 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 + * + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m) { + List list = new ArrayList<>(); + + Queue queue1 = new Queue(); + for (int i = 0; i < n; i++) { + queue1.enQueue(i); + } + Queue queue2 = new Queue(); + + int index = 1; + while (list.size() < n - 1) { + int queue1Size = queue1.size(); + for (int i = 0; i < queue1Size; i++) { + if (index % m != 0) { + queue2.enQueue(queue1.deQueue()); + } else { + list.add((int) queue1.deQueue()); + index = 0; + } + index++; + } + int queue2Size = queue2.size(); + for (int i = 0; i < queue2Size; i++) { + if (index % m != 0) { + queue1.enQueue(queue2.deQueue()); + } else { + list.add((int) queue2.deQueue()); + index = 0; + } + index++; + } + } + if (!queue1.isEmpty()) { + list.add((int)queue1.deQueue()); + } + if (!queue2.isEmpty()) { + list.add((int)queue2.deQueue()); + } + return list; + } + +} diff --git a/group01/765324639/src/main/java/datastructure/Queue.java b/group01/765324639/src/main/java/datastructure/queue/Queue.java similarity index 88% rename from group01/765324639/src/main/java/datastructure/Queue.java rename to group01/765324639/src/main/java/datastructure/queue/Queue.java index d4cfec525e..07f6586f21 100644 --- a/group01/765324639/src/main/java/datastructure/Queue.java +++ b/group01/765324639/src/main/java/datastructure/queue/Queue.java @@ -1,4 +1,4 @@ -package datastructure; +package datastructure.queue; import datastructure.linkedlist.LinkedList; diff --git a/group01/765324639/src/main/java/datastructure/queue/QueueWithTwoStacks.java b/group01/765324639/src/main/java/datastructure/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..2a2ea9cb91 --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/queue/QueueWithTwoStacks.java @@ -0,0 +1,60 @@ +package datastructure.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + if (stack1.empty() && stack2.empty()) { + return true; + } + return false; + } + + + + public int size() { + return stack1.size() + stack2.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if (isEmpty()) { + return null; + } + + if (!stack2.empty()) { + return stack2.pop(); + } + while (!stack1.empty()) { + stack2.push(stack1.pop()); + } + return stack2.pop(); + } + + + + } + diff --git a/group01/765324639/src/test/java/datastructure/queue/CircleQueueTest.java b/group01/765324639/src/test/java/datastructure/queue/CircleQueueTest.java new file mode 100644 index 0000000000..3ee6ac6bbf --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/queue/CircleQueueTest.java @@ -0,0 +1,38 @@ +package datastructure.queue; + +import org.junit.Assert; +import org.junit.Test; + +public class CircleQueueTest { + + @Test + public void test() { + CircleQueue circleQueue = new CircleQueue<>(); + for (int i = 0; i < 10; i++) { + circleQueue.enQueue("circleQueue" + i); + } + Assert.assertEquals(10, circleQueue.size()); + Assert.assertFalse(circleQueue.isEmpty()); + for (int i = 0; i < 5; i++) { + Assert.assertEquals("circleQueue" + i, circleQueue.deQueue()); + } + Assert.assertEquals(5, circleQueue.size()); + Assert.assertFalse(circleQueue.isEmpty()); + for (int i = 5; i< 10; i++) { + Assert.assertEquals("circleQueue" + i, circleQueue.deQueue()); + } + Assert.assertEquals(0, circleQueue.size()); + Assert.assertTrue(circleQueue.isEmpty()); + + for (int i = 0; i < 6; i++) { + circleQueue.enQueue("item" + i); + } + Assert.assertEquals(6, circleQueue.size()); + Assert.assertFalse(circleQueue.isEmpty()); + for (int i = 0; i < 6; i++) { + Assert.assertEquals("item" + i, circleQueue.deQueue()); + } + Assert.assertEquals(0, circleQueue.size()); + Assert.assertTrue(circleQueue.isEmpty()); + } +} diff --git a/group01/765324639/src/test/java/datastructure/queue/JosephusTest.java b/group01/765324639/src/test/java/datastructure/queue/JosephusTest.java new file mode 100644 index 0000000000..bc079b54f2 --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/queue/JosephusTest.java @@ -0,0 +1,31 @@ +package datastructure.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[0, 1, 2, 3, 4, 5, 6]", Josephus.execute(7, 1).toString()); + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + Assert.assertEquals("[2, 5, 1, 6, 4, 0, 3]", Josephus.execute(7, 3).toString()); + Assert.assertEquals("[3, 0, 5, 4, 6, 2, 1]", Josephus.execute(7, 4).toString()); + Assert.assertEquals("[6, 0, 2, 5, 1, 3, 4]", Josephus.execute(7, 7).toString()); + + } + +} diff --git a/group01/765324639/src/test/java/datastructure/QueueTest.java b/group01/765324639/src/test/java/datastructure/queue/QueueTest.java similarity index 89% rename from group01/765324639/src/test/java/datastructure/QueueTest.java rename to group01/765324639/src/test/java/datastructure/queue/QueueTest.java index b24f75ed53..ee9e169d8d 100644 --- a/group01/765324639/src/test/java/datastructure/QueueTest.java +++ b/group01/765324639/src/test/java/datastructure/queue/QueueTest.java @@ -1,9 +1,11 @@ -package datastructure; +package datastructure.queue; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import datastructure.queue.Queue; + public class QueueTest { private Queue queue = new Queue(); diff --git a/group01/765324639/src/test/java/datastructure/queue/QueueWithTwoStacksTest.java b/group01/765324639/src/test/java/datastructure/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..50024c010c --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,27 @@ +package datastructure.queue; + +import org.junit.Assert; +import org.junit.Test; + +public class QueueWithTwoStacksTest { + + @Test + public void test() { + QueueWithTwoStacks queue = new QueueWithTwoStacks<>(); + Assert.assertNull(queue.deQueue()); + Assert.assertTrue(queue.isEmpty()); + for (int i = 0; i < 100; i++) { + queue.enQueue("item" + i); + } + for (int i = 0; i < 50; i++) { + Assert.assertEquals("item" + i, queue.deQueue()); + } + queue.enQueue("item100"); + queue.enQueue("item101"); + Assert.assertEquals(52, queue.size()); + int i = 50; + while (!queue.isEmpty()) { + Assert.assertEquals("item" + i++, queue.deQueue()); + } + } +} From 390f050048aa5acfa74797273337e5e85bceb0e1 Mon Sep 17 00:00:00 2001 From: onlyLYJ <382266293@qq.com> Date: Sun, 30 Apr 2017 07:51:48 +0800 Subject: [PATCH 358/552] miniJVM... almost copy from answer --- .../coding/basic/queue/CircleQueue.java | 12 +- .../coding/basic/queue/Josephus.java | 2 +- .../src/com/coderising/jvm/clz/ClassFile.java | 26 ++-- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 12 ++ .../coderising/jvm/cmd/ByteCodeCommand.java | 39 +++++- .../com/coderising/jvm/cmd/GetFieldCmd.java | 16 ++- .../coderising/jvm/cmd/GetStaticFieldCmd.java | 20 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 +++- .../coderising/jvm/cmd/InvokeVirtualCmd.java | 66 +++++++++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 23 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 127 +++++++++++++++++- .../com/coderising/jvm/cmd/PutFieldCmd.java | 24 ++++ .../jvm/constant/MethodRefInfo.java | 8 +- .../jvm/engine/ExecutionResult.java | 2 - .../coderising/jvm/engine/ExecutorEngine.java | 42 +++++- .../com/coderising/jvm/engine/MethodArea.java | 11 +- .../com/coderising/jvm/engine/MiniJVM.java | 18 +-- .../com/coderising/jvm/engine/StackFrame.java | 37 ++++- .../src/com/coderising/jvm/method/Method.java | 66 +++++++++ .../com/coderising/jvm/test/MiniJVMTest.java | 28 ++++ 21 files changed, 578 insertions(+), 43 deletions(-) create mode 100644 group12/382266293/src/com/coderising/jvm/test/MiniJVMTest.java diff --git a/group12/382266293/coding/basic/queue/CircleQueue.java b/group12/382266293/coding/basic/queue/CircleQueue.java index d960510914..65d6f77c65 100644 --- a/group12/382266293/coding/basic/queue/CircleQueue.java +++ b/group12/382266293/coding/basic/queue/CircleQueue.java @@ -25,21 +25,21 @@ public boolean isEmpty() { } public int size() { - return getIndex(front - rear); + return getArrIndex(front - rear); } - private int getIndex(int i) { + private int getArrIndex(int i) { return i % DEFAULT_SIZE; } public void enQueue(E data) { checkCapacity(); - elementData[getIndex(front)] = data; + elementData[getArrIndex(front)] = data; front++; } private void checkCapacity() { - if (getIndex(front - rear + 1) == 0) { + if (getArrIndex(front - rear + 1) == 0) { throw new RuntimeException("Queue is full"); } } @@ -48,7 +48,7 @@ public E deQueue() { if (size() == 0) { return null; } - Object o = elementData[getIndex(rear)]; + Object o = elementData[getArrIndex(rear)]; rear++; return (E) o; } @@ -59,7 +59,7 @@ public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < size(); i++) { - sb.append(elementData[getIndex(rear + i)]); + sb.append(elementData[getArrIndex(rear + i)]); if (i != size() - 1) { sb.append(","); } diff --git a/group12/382266293/coding/basic/queue/Josephus.java b/group12/382266293/coding/basic/queue/Josephus.java index e98409d5d8..4eef15ab13 100644 --- a/group12/382266293/coding/basic/queue/Josephus.java +++ b/group12/382266293/coding/basic/queue/Josephus.java @@ -14,7 +14,7 @@ public class Josephus { public static List execute(int n, int m){ - QueueWithTwoStacks cq = new QueueWithTwoStacks(); + QueueWithTwoStacks cq = new QueueWithTwoStacks(); for (int i = 0; i < n; i++) { cq.enQueue(i); } diff --git a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java index 111cb247d3..f5698f0dd1 100644 --- a/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java +++ b/group12/382266293/src/com/coderising/jvm/clz/ClassFile.java @@ -5,6 +5,7 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; @@ -134,19 +135,20 @@ public Method getMethod(String methodName, String paramAndReturnType){ return null; } + public Method getMainMethod(){ - for (Method m : methods) { - - int nameIndex = m.getNameIndex(); - int descriptorIndex= m.getDescriptorIndex(); - String name = ((UTF8Info)pool.getConstantInfo(nameIndex)).getValue(); - String desc = ((UTF8Info)pool.getConstantInfo(descriptorIndex)).getValue(); - if (name.equals("main") && desc.equals("([Ljava/lang/String;)V")) { - return m; - } - } - - return null; + return getMethod("main", "([Ljava/lang/String;)V"); + } + + public Method getMethod(MethodRefInfo methodRef){ + + String methodName = methodRef.getMethodName(); + String paramAndReturnType = methodRef.getParamAndReturnType(); + + return getMethod(methodName, paramAndReturnType); + + } + } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java index cd0fbd4848..b4682ad51d 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -3,6 +3,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -18,6 +22,14 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } + @Override + public void execute(StackFrame frame,ExecutionResult result){ + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOprandStack().push(jo); + + } + } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java index a3abeacc82..eec01a4cd7 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -6,6 +6,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public abstract class ByteCodeCommand { @@ -14,6 +16,41 @@ public abstract class ByteCodeCommand { ClassFile clzFile; private int offset; + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); static{ @@ -124,5 +161,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java index 2e6061edd2..70a44b9bae 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -16,7 +20,17 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); + + } } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java index e6cf9d5960..1a1332b7e4 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -5,6 +5,10 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -19,5 +23,21 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + //TODO 处理非System.out的情况 + } } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java index ac228d0e4d..07af9a6a95 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -3,6 +3,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.MethodArea; +import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -18,6 +22,23 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + + } } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java index c15d827797..362006f04a 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -2,6 +2,12 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.MethodArea; +import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -16,6 +22,66 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if(isSystemOutPrintlnMethod(className,methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while(currentClassName != null){ + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + + break; + + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } + + private boolean isSystemOutPrintlnMethod(String className, String methodName) { + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java index ffb66f811c..6fee3f6ef6 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/LdcCmd.java @@ -4,6 +4,10 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -26,4 +30,23 @@ public String toString(ConstantPool pool) { } + public void execute(StackFrame frame,ExecutionResult result){ + + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } + + + } + } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java index 33813b5d59..3a6f062803 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -1,7 +1,12 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -15,5 +20,19 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } + public void execute(StackFrame frame,ExecutionResult result){ + + int index = this.getIndex(); + + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + + String clzName = info.getClassName(); + + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); + + } } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java index 56c28fefe2..2c41ca7827 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -15,9 +19,130 @@ public String toString(ConstantPool pool) { } - + @Override public int getLength(){ return 1; } + + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + + + } } diff --git a/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java index 85bb369c19..3ef736b39e 100644 --- a/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/group12/382266293/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -1,7 +1,13 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -15,5 +21,23 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + + } } diff --git a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java index 05882cd5f2..267abbf577 100644 --- a/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group12/382266293/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -13,9 +13,6 @@ public MethodRefInfo(ConstantPool pool) { super(pool); } - public int getClassInfoIndex() { - return classInfoIndex; - } public String getClassName() { ConstantPool pool = this.getConstantPool(); @@ -29,6 +26,11 @@ public String getMethodName() { return typeInfo.getName(); } + + public int getClassInfoIndex() { + return classInfoIndex; + } + public int getNameAndTypeIndex() { return nameAndTypeIndex; } diff --git a/group12/382266293/src/com/coderising/jvm/engine/ExecutionResult.java b/group12/382266293/src/com/coderising/jvm/engine/ExecutionResult.java index 8f6c51e52a..73ba9f51b1 100644 --- a/group12/382266293/src/com/coderising/jvm/engine/ExecutionResult.java +++ b/group12/382266293/src/com/coderising/jvm/engine/ExecutionResult.java @@ -21,8 +21,6 @@ public void setNextMethod(Method nextMethod) { this.nextMethod = nextMethod; } - - public void setNextAction(int action){ this.nextAction = action; } diff --git a/group12/382266293/src/com/coderising/jvm/engine/ExecutorEngine.java b/group12/382266293/src/com/coderising/jvm/engine/ExecutorEngine.java index 5d6b582879..7e1f5c1261 100644 --- a/group12/382266293/src/com/coderising/jvm/engine/ExecutorEngine.java +++ b/group12/382266293/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -1,6 +1,7 @@ package com.coderising.jvm.engine; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Stack; @@ -15,20 +16,57 @@ public class ExecutorEngine { private Stack stack = new Stack(); public ExecutorEngine() { - + } public void execute(Method mainMethod){ + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); - + while(!stack.isEmpty()) { + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if (result.isPauseAndRunNewFrame()) { + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame,nextFrame); + + stack.push(nextFrame); + + } else { + + stack.pop(); + } + + } } private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + Method nextMethod = nextFrame.getMethod(); + + List paramList = nextMethod.getParameterList(); + + int paramNum = paramList.size() + 1; + + List params = new ArrayList(); + + while(paramNum > 0) { + params.add(currentFrame.getOprandStack().pop()); + paramNum--; + } + + Collections.reverse(params); + nextFrame.setLocalVariableTable(params); } diff --git a/group12/382266293/src/com/coderising/jvm/engine/MethodArea.java b/group12/382266293/src/com/coderising/jvm/engine/MethodArea.java index 83bb42f65f..42f3a71f28 100644 --- a/group12/382266293/src/com/coderising/jvm/engine/MethodArea.java +++ b/group12/382266293/src/com/coderising/jvm/engine/MethodArea.java @@ -63,13 +63,18 @@ public ClassFile findClassFile(String className){ public Method getMethod(String className, String methodName, String paramAndReturnType){ - return null; + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMethod(methodName, paramAndReturnType); } - public Method getMethod(MethodRefInfo methodRef){ + public Method getMethod(MethodRefInfo methodRef){ + + String className = methodRef.getClassName(); + ClassFile clzFile = this.findClassFile(className); - return null; + return clzFile.getMethod(methodRef); } } diff --git a/group12/382266293/src/com/coderising/jvm/engine/MiniJVM.java b/group12/382266293/src/com/coderising/jvm/engine/MiniJVM.java index 443524cc5f..de8961cac0 100644 --- a/group12/382266293/src/com/coderising/jvm/engine/MiniJVM.java +++ b/group12/382266293/src/com/coderising/jvm/engine/MiniJVM.java @@ -7,21 +7,21 @@ public class MiniJVM { - public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ - + public void run(String[] classPaths, String className) throws FileNotFoundException, IOException { + ClassFileLoader loader = new ClassFileLoader(); - for(int i=0;i getParameterList() { + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } + + + private String getParamAndReturnType() { + + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + + } diff --git a/group12/382266293/src/com/coderising/jvm/test/MiniJVMTest.java b/group12/382266293/src/com/coderising/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..88de6c179e --- /dev/null +++ b/group12/382266293/src/com/coderising/jvm/test/MiniJVMTest.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = "C:\\Users\\steve\\workspace\\coding2017n\\group12\\382266293\\bin"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + + } + +} From 7188081fa793719c40d97e6bbf73bafb199c3b92 Mon Sep 17 00:00:00 2001 From: Haochen Date: Sun, 30 Apr 2017 14:03:20 +0800 Subject: [PATCH 359/552] jvm executing engine & queue questions --- .../algorithm/expression/PostfixExpr.java | 2 +- .../main/java/algorithm/expression/Token.java | 248 +++++++++--------- .../algorithm/expression/TokenParser.java | 2 +- .../java/algorithm/queue/CircleQueue.java | 75 ++++++ .../main/java/algorithm/queue/Josephus.java | 31 +++ .../java/algorithm/queue/JosephusTest.java | 27 ++ .../src/main/java/algorithm/queue/Queue.java | 61 +++++ .../algorithm/queue/QueueWithTwoStacks.java | 52 ++++ .../main/java/datastructure/basic/Queue.java | 56 +--- .../code/src/main/java/jvm/LiteJvm.java | 25 -- .../main/java/jvm/classfile/AccessFlag.java | 13 +- .../main/java/jvm/classfile/ClassFile.java | 24 +- .../main/java/jvm/classfile/ClassParser.java | 7 +- .../constant/item/impl/FieldRefInfo.java | 8 + .../constant/item/impl/FloatInfo.java | 4 + .../constant/item/impl/IntegerInfo.java | 4 + .../constant/item/impl/MethodRefInfo.java | 8 + .../main/java/jvm/classfile/field/Field.java | 19 +- .../java/jvm/classfile/method/Method.java | 26 +- .../main/java/jvm/command/CommandParser.java | 35 --- .../jvm/command/item/ByteCodeCommand.java | 5 +- .../java/jvm/command/item/OneOperandCmd.java | 4 +- .../java/jvm/command/item/impl/ALoad0Cmd.java | 9 + .../java/jvm/command/item/impl/ALoad1Cmd.java | 9 + .../java/jvm/command/item/impl/ALoad2Cmd.java | 9 + .../java/jvm/command/item/impl/ALoad3Cmd.java | 9 + .../jvm/command/item/impl/AStore0Cmd.java | 9 + .../jvm/command/item/impl/AStore1Cmd.java | 9 + .../jvm/command/item/impl/AStore2Cmd.java | 9 + .../jvm/command/item/impl/AStore3Cmd.java | 9 + .../java/jvm/command/item/impl/BiPushCmd.java | 11 + .../java/jvm/command/item/impl/DupCmd.java | 9 + .../jvm/command/item/impl/GetFieldCmd.java | 15 +- .../jvm/command/item/impl/GetStaticCmd.java | 14 + .../java/jvm/command/item/impl/ILoad0Cmd.java | 9 + .../java/jvm/command/item/impl/ILoad1Cmd.java | 9 + .../java/jvm/command/item/impl/ILoad2Cmd.java | 9 + .../java/jvm/command/item/impl/ILoad3Cmd.java | 9 + .../command/item/impl/InvokeSpecialCmd.java | 15 ++ .../command/item/impl/InvokeVirtualCmd.java | 15 ++ .../java/jvm/command/item/impl/LdcCmd.java | 14 + .../java/jvm/command/item/impl/NewCmd.java | 14 +- .../jvm/command/item/impl/PutFieldCmd.java | 14 + .../java/jvm/command/item/impl/ReturnCmd.java | 7 + .../main/java/jvm/engine/ExecutionResult.java | 50 ++++ .../main/java/jvm/engine/ExecutorEngine.java | 55 ++++ .../code/src/main/java/jvm/engine/Heap.java | 63 +++++ .../src/main/java/jvm/engine/JavaObject.java | 77 ++++++ .../src/main/java/jvm/engine/MethodArea.java | 63 +++++ .../src/main/java/jvm/engine/MiniJVM.java | 19 ++ .../src/main/java/jvm/engine/StackFrame.java | 103 ++++++++ .../main/java/jvm/print/ClassFilePrinter.java | 5 +- .../src/main/java/jvm/util/ByteUtils.java | 12 + .../src/main/java/jvm/util/TypeUtils.java | 54 ++++ .../algorithm/expression/PostfixExprTest.java | 6 + .../test/java/datastructure/QueueTest.java | 35 +-- .../895457260/code/src/test/java/jvm/E.java | 34 +++ .../code/src/test/java/jvm/LiteJvmTest.java | 83 ------ 58 files changed, 1270 insertions(+), 361 deletions(-) create mode 100644 group01/895457260/code/src/main/java/algorithm/queue/CircleQueue.java create mode 100644 group01/895457260/code/src/main/java/algorithm/queue/Josephus.java create mode 100644 group01/895457260/code/src/main/java/algorithm/queue/JosephusTest.java create mode 100644 group01/895457260/code/src/main/java/algorithm/queue/Queue.java create mode 100644 group01/895457260/code/src/main/java/algorithm/queue/QueueWithTwoStacks.java delete mode 100644 group01/895457260/code/src/main/java/jvm/LiteJvm.java create mode 100644 group01/895457260/code/src/main/java/jvm/engine/ExecutionResult.java create mode 100644 group01/895457260/code/src/main/java/jvm/engine/ExecutorEngine.java create mode 100644 group01/895457260/code/src/main/java/jvm/engine/Heap.java create mode 100644 group01/895457260/code/src/main/java/jvm/engine/JavaObject.java create mode 100644 group01/895457260/code/src/main/java/jvm/engine/MethodArea.java create mode 100644 group01/895457260/code/src/main/java/jvm/engine/MiniJVM.java create mode 100644 group01/895457260/code/src/main/java/jvm/engine/StackFrame.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/TypeUtils.java create mode 100644 group01/895457260/code/src/test/java/jvm/E.java delete mode 100644 group01/895457260/code/src/test/java/jvm/LiteJvmTest.java diff --git a/group01/895457260/code/src/main/java/algorithm/expression/PostfixExpr.java b/group01/895457260/code/src/main/java/algorithm/expression/PostfixExpr.java index 6614d0ec7d..3928b3ba08 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/PostfixExpr.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/PostfixExpr.java @@ -10,7 +10,7 @@ public class PostfixExpr { private String expr; private String splitRegex; private Stack stack = new Stack(); - + public PostfixExpr(String expr) { this.expr = expr; this.splitRegex = " "; diff --git a/group01/895457260/code/src/main/java/algorithm/expression/Token.java b/group01/895457260/code/src/main/java/algorithm/expression/Token.java index cb95b43f66..6391216505 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/Token.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/Token.java @@ -1,125 +1,133 @@ package algorithm.expression; class Token { - public static final String OP_ADD = "+"; - public static final String OP_SUB = "-"; - public static final String OP_MUL = "*"; - public static final String OP_DIV = "/"; - public static final String OP_L_BRACKET = "("; - public static final String OP_R_BRACKET = ")"; - public static final String OP_SCOPE = "#"; - - public static final int OPERATOR = 1; - public static final int NUMBER = 2; - - public static final Token ADD = new Token(OPERATOR, OP_ADD); - public static final Token SUB = new Token(OPERATOR, OP_SUB); - public static final Token MUL = new Token(OPERATOR, OP_MUL); - public static final Token DIV = new Token(OPERATOR, OP_DIV); - public static final Token L_BRACKET = new Token(OPERATOR, OP_L_BRACKET); - public static final Token R_BRACKET = new Token(OPERATOR, OP_R_BRACKET); - public static final Token SCOPE = new Token(OPERATOR, OP_SCOPE); - - //优先级表 - private static int[][] priorities = { - // + - * / ( ) # - {-1, -1, -1, -1, 1, -1, 1}, // + - {-1, -1, -1, -1, 1, -1, 1}, // - - { 1, 1, -1, -1, 1, -1, 1}, // * - { 1, 1, -1, -1, 1, -1, 1}, // / - { 1, 1, 1, 1, 1, -1, 1}, // ( - {-1, -1, -1, -1, -1, 0, 1}, // ) - {-1, -1, -1, -1, -1, -1, 0} // # - }; - - String value; - int type; - - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public float getFloatValue() { - return Float.valueOf(value); - } - - public String toString(){ - return value; - } - - private static int indexOf(String op) { - switch (op) { - case OP_ADD: - return 0; - case OP_SUB: - return 1; - case OP_MUL: - return 2; - case OP_DIV: - return 3; - case OP_L_BRACKET: - return 4; - case OP_R_BRACKET: - return 5; - case OP_SCOPE: - return 6; - } - return 0; - } - - public static int compare(Token op, Token peek) { - int opIndex = indexOf(op.toString()); - int peekIndex = indexOf(peek.toString()); - return priorities[opIndex][peekIndex]; - } - - public static Token calculate(Token num1, Token op, Token num2) { - float result = 0.0f; - float n1 = num1.getFloatValue(); - float n2 = num2.getFloatValue(); - switch (op.toString()) { - case "+": - result = n1 + n2; + public static final String OP_ADD = "+"; + public static final String OP_SUB = "-"; + public static final String OP_MUL = "*"; + public static final String OP_DIV = "/"; + public static final String OP_POWER= "^"; + public static final String OP_L_BRACKET = "("; + public static final String OP_R_BRACKET = ")"; + public static final String OP_SCOPE = "#"; + + public static final int OPERATOR = 1; + public static final int NUMBER = 2; + + public static final Token ADD = new Token(OPERATOR, OP_ADD); + public static final Token SUB = new Token(OPERATOR, OP_SUB); + public static final Token MUL = new Token(OPERATOR, OP_MUL); + public static final Token DIV = new Token(OPERATOR, OP_DIV); + public static final Token POWER = new Token(OPERATOR, OP_DIV); + public static final Token L_BRACKET = new Token(OPERATOR, OP_L_BRACKET); + public static final Token R_BRACKET = new Token(OPERATOR, OP_R_BRACKET); + public static final Token SCOPE = new Token(OPERATOR, OP_SCOPE); + + //优先级表 + private static int[][] priorities = { + //+ - * / ^ ( ) # + {-1, -1, -1, -1, -1, 1, -1, 1}, // + + {-1, -1, -1, -1, -1, 1, -1, 1}, // - + { 1, 1, -1, -1, -1, 1, -1, 1}, // * + { 1, 1, -1, -1, -1, 1, -1, 1}, // / + { 1, 1, 1, 1, -1, 1, -1, 1}, // ^ + { 1, 1, 1, 1, 1, 1, -1, 1}, // ( + {-1, -1, -1, -1, -1, -1, 0, 1}, // ) + {-1, -1, -1, -1, -1, -1, -1, 0} // # + }; + + String value; + int type; + + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public float getFloatValue() { + return Float.valueOf(value); + } + + public String toString(){ + return value; + } + + private static int indexOf(String op) { + switch (op) { + case OP_ADD: + return 0; + case OP_SUB: + return 1; + case OP_MUL: + return 2; + case OP_DIV: + return 3; + case OP_POWER: + return 4; + case OP_L_BRACKET: + return 5; + case OP_R_BRACKET: + return 6; + case OP_SCOPE: + return 7; + } + return 0; + } + + public static int compare(Token op, Token peek) { + int opIndex = indexOf(op.toString()); + int peekIndex = indexOf(peek.toString()); + return priorities[opIndex][peekIndex]; + } + + public static Token calculate(Token num1, Token op, Token num2) { + float result = 0.0f; + float n1 = num1.getFloatValue(); + float n2 = num2.getFloatValue(); + switch (op.toString()) { + case OP_ADD: + result = n1 + n2; + break; + case OP_SUB: + result = n1 - n2; + break; + case OP_MUL: + result = n1 * n2; + break; + case OP_DIV: + if (n2 == 0) { + throw new RuntimeException("Divide by 0"); + } + result = n1 / n2; + break; + case OP_POWER: + result = (float) Math.pow(n1, n2); break; - case "-": - result = n1 - n2; - break; - case "*": - result = n1 * n2; - break; - case "/": - if (n2 == 0) { - throw new RuntimeException("Divide by 0"); - } - result = n1 / n2; - break; - } - return new Token(NUMBER, result + ""); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Token token = (Token) o; - - return type == token.type && (value != null ? value.equals(token.value) : token.value == null); - } - - @Override - public int hashCode() { - int result = value != null ? value.hashCode() : 0; - result = 31 * result + type; - return result; - } + } + return new Token(NUMBER, result + ""); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Token token = (Token) o; + + return type == token.type && (value != null ? value.equals(token.value) : token.value == null); + } + + @Override + public int hashCode() { + int result = value != null ? value.hashCode() : 0; + result = 31 * result + type; + return result; + } } \ No newline at end of file diff --git a/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java b/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java index ca8619c94b..ec083b10f1 100644 --- a/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java +++ b/group01/895457260/code/src/main/java/algorithm/expression/TokenParser.java @@ -7,7 +7,7 @@ public class TokenParser { public static final List OPERATORS = Arrays.asList(Token.OP_ADD, Token.OP_SUB, Token.OP_MUL, - Token.OP_DIV, Token.OP_L_BRACKET, Token.OP_R_BRACKET); + Token.OP_DIV, Token.OP_POWER, Token.OP_L_BRACKET, Token.OP_R_BRACKET); public static List parse(String expression) { return parse(expression, null); diff --git a/group01/895457260/code/src/main/java/algorithm/queue/CircleQueue.java b/group01/895457260/code/src/main/java/algorithm/queue/CircleQueue.java new file mode 100644 index 0000000000..e44d187bc7 --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/queue/CircleQueue.java @@ -0,0 +1,75 @@ +package algorithm.queue; + +import datastructure.exception.EmptyQueueException; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + private final static int DEFAULT_SIZE = 10; + + //数组实现自增长的循环队列 + private Object[] array = new Object[DEFAULT_SIZE]; + private int head = 0; + private int rear = 0; + + public CircleQueue() {} + + public CircleQueue(int initCapacity) { + this.array = new Object[initCapacity]; + } + + public void enQueue(E o) { + int target = mapIndex(rear); + autoGrow(); + array[target] = o; + rear++; + } + + public E deQueue() { + if (isEmpty()) { + throw new EmptyQueueException(); + } + Object obj = array[mapIndex(head)]; + head++; + @SuppressWarnings("unchecked") E e = (E) obj; + return e; + } + + public boolean isEmpty() { + return head == rear; + } + + public int size() { + return rear - head; + } + + private int capacity() { + return array.length; + } + + private void autoGrow() { + if (size() >= capacity()) { + Object[] newArray = new Object[nextCapacity()]; + System.arraycopy(array, 0, newArray, 0, capacity()); + + int increase = nextCapacity() - capacity(); + int moveCount = size() - mapIndex(rear); + System.arraycopy(newArray, mapIndex(head), newArray, mapIndex(head) + increase, moveCount); + array = newArray; + head += increase; + rear += increase; + } + } + + private int nextCapacity() { + return capacity() * 2; + } + + private int mapIndex(int index) { + return index % capacity(); + } +} diff --git a/group01/895457260/code/src/main/java/algorithm/queue/Josephus.java b/group01/895457260/code/src/main/java/algorithm/queue/Josephus.java new file mode 100644 index 0000000000..979823bcd0 --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/queue/Josephus.java @@ -0,0 +1,31 @@ +package algorithm.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * + * @author liuxin + */ +public class Josephus { + + public static List execute(int n, int m) { + CircleQueue queue = new CircleQueue<>(); + for (int i = 0; i < n; ++i) { + queue.enQueue(i); + } + + List result = new ArrayList<>(); + while (!queue.isEmpty()) { + for (int i = 0; i < m - 1; ++i) { + queue.enQueue(queue.deQueue()); + } + result.add(queue.deQueue()); + } + return result; + } + +} diff --git a/group01/895457260/code/src/main/java/algorithm/queue/JosephusTest.java b/group01/895457260/code/src/main/java/algorithm/queue/JosephusTest.java new file mode 100644 index 0000000000..beec8cbee0 --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package algorithm.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group01/895457260/code/src/main/java/algorithm/queue/Queue.java b/group01/895457260/code/src/main/java/algorithm/queue/Queue.java new file mode 100644 index 0000000000..6f1ed24bc0 --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/queue/Queue.java @@ -0,0 +1,61 @@ +package algorithm.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group01/895457260/code/src/main/java/algorithm/queue/QueueWithTwoStacks.java b/group01/895457260/code/src/main/java/algorithm/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..78a198f903 --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/queue/QueueWithTwoStacks.java @@ -0,0 +1,52 @@ +package algorithm.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * + * @param + * @author liuxin + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack<>(); + stack2 = new Stack<>(); + } + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + public int size() { + return Math.max(stack1.size(), stack2.size()); + } + + public void enQueue(E item) { + int size = stack2.size(); + while (!stack2.isEmpty()) { + stack1.push(stack2.pop()); + } + stack2.push(item); + for (int i = 0; i < size; ++i) { + stack2.push(stack1.pop()); + } + stack1.push(item); + } + + public E deQueue() { + E e = stack2.pop(); + int size = stack2.size(); + for (int i = 0; i < size; ++i) { + stack2.push(stack1.pop()); + } + stack1.pop(); + for (int i = 0; i < size; ++i) { + stack1.push(stack2.pop()); + } + return e; + } +} diff --git a/group01/895457260/code/src/main/java/datastructure/basic/Queue.java b/group01/895457260/code/src/main/java/datastructure/basic/Queue.java index edd0a6a29e..247f2cf141 100644 --- a/group01/895457260/code/src/main/java/datastructure/basic/Queue.java +++ b/group01/895457260/code/src/main/java/datastructure/basic/Queue.java @@ -3,66 +3,24 @@ import datastructure.exception.EmptyQueueException; public class Queue { - //数组实现自增长的循环队列 - private Object[] array; - private int head = 0; - private int rear = 0; - - public Queue() { - this.array = new Object[10]; - } - - public Queue(int initCapacity) { - this.array = new Object[initCapacity]; - } + private LinkedList list = new LinkedList(); public void enQueue(Object o) { - int target = mapIndex(rear); - autoGrow(); - array[target] = o; - rear++; + list.addLast(o); } - + public Object deQueue() { if (isEmpty()) { throw new EmptyQueueException(); } - Object obj = array[mapIndex(head)]; - head++; - return obj; + return list.removeFirst(); } public boolean isEmpty() { - return head == rear; - } - - public int size() { - return rear - head; - } - - private int capacity() { - return array.length; + return list.size() == 0; } - private void autoGrow() { - if (size() >= capacity()) { - Object[] newArray = new Object[nextCapacity()]; - System.arraycopy(array, 0, newArray, 0, capacity()); - - int increase = nextCapacity() - capacity(); - int moveCount = size() - mapIndex(rear); - System.arraycopy(newArray, mapIndex(head), newArray, mapIndex(head) + increase, moveCount); - array = newArray; - head += increase; - rear += increase; - } - } - - private int nextCapacity() { - return capacity() * 2; - } - - private int mapIndex(int index) { - return index >= capacity() ? index % capacity() : index; + public int size() { + return list.size(); } } diff --git a/group01/895457260/code/src/main/java/jvm/LiteJvm.java b/group01/895457260/code/src/main/java/jvm/LiteJvm.java deleted file mode 100644 index d642654d5f..0000000000 --- a/group01/895457260/code/src/main/java/jvm/LiteJvm.java +++ /dev/null @@ -1,25 +0,0 @@ -package jvm; - -import jvm.exception.MagicNumberException; -import jvm.exception.ReadClassException; - -/** - * Created by Haochen on 2017/3/26. - * TODO: - */ -public enum LiteJvm { - INSTANCE; - - private ClassFileLoader classFileLoader = new ClassFileLoader(); - - public void launch(String className) throws MagicNumberException, ReadClassException { - byte[] bytes = getBytes(className); - if (!classFileLoader.checkMagicNumber(bytes)) { - throw new MagicNumberException(); - } - } - - private byte[] getBytes(String className) throws ReadClassException { - return classFileLoader.readBinaryCode(className); - } -} diff --git a/group01/895457260/code/src/main/java/jvm/classfile/AccessFlag.java b/group01/895457260/code/src/main/java/jvm/classfile/AccessFlag.java index 18c327fb0d..6b2e98201a 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/AccessFlag.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/AccessFlag.java @@ -21,10 +21,19 @@ public void setFlagValue(int flag) { this.flagValue = flag; } - public boolean isPublicClass(){ + public boolean isPublic(){ return (this.flagValue & 0x0001) != 0; } - public boolean isFinalClass(){ + public boolean isPrivate(){ + return (this.flagValue & 0x0002) != 0; + } + public boolean isProtected(){ + return (this.flagValue & 0x0004) != 0; + } + public boolean isStatic(){ + return (this.flagValue & 0x0008) != 0; + } + public boolean isFinal(){ return (this.flagValue & 0x0010) != 0; } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java b/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java index 377b198035..24b369885d 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java @@ -4,9 +4,12 @@ import jvm.classfile.constant.item.impl.ClassInfo; import jvm.classfile.field.Field; import jvm.classfile.method.Method; +import jvm.engine.JavaObject; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Created by Haochen on 2017/4/9. @@ -23,6 +26,8 @@ public class ClassFile { List methods = new ArrayList<>(); List attributes = new ArrayList<>(); + Map staticFieldValues = new HashMap<>(); + public AccessFlag getAccessFlag() { return accessFlag; @@ -41,7 +46,7 @@ public List getAttributes() { } public void print() { - if(this.accessFlag.isPublicClass()){ + if(this.accessFlag.isPublic()){ System.out.println("Access flag : public "); } System.out.println("Class Name:"+ getClassName()); @@ -85,4 +90,21 @@ public Method getMethod(String methodName, String paramAndReturnType) { public Method getMainMethod() { return getMethod("main", "([Ljava/lang/String;)V"); } + + public Field getField(String name) { + return fields.stream() + .filter(f -> f.getName().equals(name)) + .findFirst() + .orElse(null); + } + + public JavaObject getStaticFieldValues(Field field) { + return staticFieldValues.get(field); + } + + public void putStaticFieldValues(Field field, JavaObject object) { + if (staticFieldValues.containsKey(field)) { + staticFieldValues.put(field, object); + } + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java b/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java index 398bbaa4f2..6e572bdd60 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java @@ -10,6 +10,7 @@ import jvm.classfile.field.Field; import jvm.classfile.method.Method; import jvm.util.ByteCodeIterator; +import jvm.util.TypeUtils; /** * Created by Haochen on 2017/4/9. @@ -91,7 +92,11 @@ private static void parseInterfaces(ClassFile classFile, ByteCodeIterator iterat private static void parseFields(ClassFile classFile, ByteCodeIterator iterator) { int count = iterator.nextU2ToInt(); for (int i = 0; i < count; ++i) { - classFile.fields.add(Field.parse(iterator, classFile.constantPool)); + Field field = Field.parse(iterator, classFile.constantPool); + classFile.fields.add(field); + if (field.getAccessFlag().isStatic()) { + classFile.staticFieldValues.put(field, TypeUtils.getDefaultValue(field)); + } } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FieldRefInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FieldRefInfo.java index 9bb866713b..5ede5965f0 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FieldRefInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FieldRefInfo.java @@ -49,4 +49,12 @@ public void linkReference(ConstantPool constantPool) { className = ((ClassInfo) constantPool.getConstantInfo(classIndex)).getClassName(); nameAndType = ((NameAndTypeInfo) constantPool.getConstantInfo(nameAndTypeIndex)).getNameAndType(); } + + public String getClassName() { + return className; + } + + public String getNameAndType() { + return nameAndType; + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FloatInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FloatInfo.java index a24ea332be..d4cc1763cc 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FloatInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/FloatInfo.java @@ -34,4 +34,8 @@ public Map printableMap() { public byte[] getBytes() { return bytes; } + + public float getValue() { + return ByteUtils.toFloat(bytes); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java index b929c36a97..1145bd3bb2 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java @@ -34,4 +34,8 @@ public Map printableMap() { public byte[] getBytes() { return bytes; } + + public int getValue() { + return ByteUtils.toInt(getBytes()); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java index 9af83bca59..19b17af721 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java @@ -49,4 +49,12 @@ public void linkReference(ConstantPool constantPool) { className = ((ClassInfo) constantPool.getConstantInfo(classIndex)).getClassName(); nameAndType = ((NameAndTypeInfo) constantPool.getConstantInfo(nameAndTypeIndex)).getNameAndType(); } + + public String getClassName() { + return className; + } + + public String getNameAndType() { + return nameAndType; + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/field/Field.java b/group01/895457260/code/src/main/java/jvm/classfile/field/Field.java index dcf6975543..1505533cb5 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/field/Field.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/field/Field.java @@ -1,5 +1,6 @@ package jvm.classfile.field; +import jvm.classfile.AccessFlag; import jvm.classfile.attribute.item.AttributeInfo; import jvm.classfile.attribute.parser.AttributeParser; import jvm.classfile.ConstantPool; @@ -10,14 +11,14 @@ import java.util.List; public class Field { - private int accessFlag; + private AccessFlag accessFlag; private int nameIndex; private int descriptorIndex; private ConstantPool constantPool; private List attributes = new ArrayList<>(); public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool constantPool) { - this.accessFlag = accessFlag; + this.accessFlag = new AccessFlag(accessFlag); this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; this.constantPool = constantPool; @@ -38,12 +39,10 @@ public static Field parse(ByteCodeIterator iterator, ConstantPool constantPool) @Override public String toString() { - String name = ((UTF8Info) constantPool.getConstantInfo(nameIndex)).getValue(); - String desc = ((UTF8Info) constantPool.getConstantInfo(descriptorIndex)).getValue(); - return name + ":" + desc; + return getName() + ":" + getDescriptor(); } - public int getAccessFlag() { + public AccessFlag getAccessFlag() { return accessFlag; } @@ -62,4 +61,12 @@ public ConstantPool getConstantPool() { public List getAttributes() { return attributes; } + + public String getName() { + return ((UTF8Info) constantPool.getConstantInfo(nameIndex)).getValue(); + } + + public String getDescriptor() { + return ((UTF8Info) constantPool.getConstantInfo(descriptorIndex)).getValue(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java b/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java index 916a4aa32b..4928bcc324 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java @@ -1,5 +1,6 @@ package jvm.classfile.method; +import jvm.classfile.AccessFlag; import jvm.classfile.ClassFile; import jvm.classfile.attribute.item.AttributeInfo; import jvm.classfile.attribute.item.impl.CodeAttr; @@ -9,12 +10,14 @@ import jvm.command.CommandParser; import jvm.command.item.ByteCodeCommand; import jvm.util.ByteCodeIterator; +import jvm.util.TypeUtils; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class Method { - private int accessFlag; + private AccessFlag accessFlag; private int nameIndex; private int descriptorIndex; private ConstantPool constantPool; @@ -22,7 +25,7 @@ public class Method { private ByteCodeCommand[] commands; public Method(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool constantPool) { - this.accessFlag = accessFlag; + this.accessFlag = new AccessFlag(accessFlag); this.nameIndex = nameIndex; this.descriptorIndex = descriptorIndex; this.constantPool = constantPool; @@ -45,7 +48,24 @@ public static Method parse(ByteCodeIterator iterator, ClassFile classFile) { return result; } - public int getAccessFlag() { + public String[] getParamTypes() { + String[] split = Arrays.stream(getParamAndReturnType().split("[)(L;]")) + .filter(s -> !"".equals(s)) + .toArray(String[]::new); + + List result = new ArrayList<>(); + Arrays.stream(split).forEach(s -> + result.add(s.length() == 1 ? + TypeUtils.parse(s) : s)); + + return result.toArray(new String[result.size()]); + } + + public int getParamCount() { + return getParamTypes().length; + } + + public AccessFlag getAccessFlag() { return accessFlag; } diff --git a/group01/895457260/code/src/main/java/jvm/command/CommandParser.java b/group01/895457260/code/src/main/java/jvm/command/CommandParser.java index be794b07ed..e1b3011fc0 100644 --- a/group01/895457260/code/src/main/java/jvm/command/CommandParser.java +++ b/group01/895457260/code/src/main/java/jvm/command/CommandParser.java @@ -9,41 +9,6 @@ import java.util.List; public class CommandParser { - public static final String ACONST_NULL = "01"; - public static final String NEW_OBJECT = "BB"; - public static final String LSTORE = "37"; - public static final String INVOKESPECIAL = "B7"; - public static final String INVOKEVIRTUAL = "B6"; - public static final String GETFIELD = "B4"; - public static final String PUTFIELD = "B5"; - public static final String GETSTATIC = "B2"; - public static final String LDC = "12"; - public static final String DUP = "59"; - public static final String BIPUSH = "10"; - public static final String ALOAD_0 = "2A"; - public static final String ALOAD_1 = "2B"; - public static final String ALOAD_2 = "2C"; - public static final String ILOAD = "15"; - public static final String ILOAD_1 = "1B"; - public static final String ILOAD_2 = "1C"; - public static final String ILOAD_3 = "1D"; - public static final String FLOAD_3 = "25"; - - public static final String VOIDRETURN = "B1"; - public static final String IRETURN = "AC"; - public static final String FRETURN = "AE"; - - public static final String ASTORE_1 = "4C"; - public static final String IF_ICMP_GE = "A2"; - public static final String IF_ICMPLE = "A4"; - public static final String GOTO_NO_CONDITION = "A7"; - public static final String ICONST_0 = "03"; - public static final String ICONST_1 = "04"; - public static final String ISTORE_1 = "3C"; - public static final String ISTORE_2 = "3D"; - public static final String IADD = "60"; - public static final String IINC = "84"; - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { String packageName = CommandParser.class.getPackage().getName() + ".item.impl."; CommandIterator iterator = new CommandIterator(codes); diff --git a/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java b/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java index b5276f526c..c78cac416e 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java @@ -4,6 +4,9 @@ import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; import jvm.command.CommandIterator; +import jvm.engine.ExecutionResult; +import jvm.engine.StackFrame; +import jvm.exception.ReadClassException; import java.util.HashMap; import java.util.Map; @@ -113,5 +116,5 @@ public String getReadableCodeText() { return txt == null ? opCode : txt.toLowerCase(); } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame, ExecutionResult result) throws ReadClassException; } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/OneOperandCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/OneOperandCmd.java index 8ae6926cc6..b7cb7943e0 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/OneOperandCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/OneOperandCmd.java @@ -20,8 +20,8 @@ public int getOperand() { return this.operand; } - public void setOperand(int oprand1) { - this.operand = oprand1; + public void setOperand(int operand) { + this.operand = operand; } public int getLength() { diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad0Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad0Cmd.java index 9673b3f441..e50e3cf836 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad0Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad0Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public ALoad0Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getLocalVariableValue(0); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad1Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad1Cmd.java index 549602b291..5b5e095532 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad1Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad1Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public ALoad1Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getLocalVariableValue(1); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad2Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad2Cmd.java index 12dc0c6088..e3716e566c 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad2Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad2Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public ALoad2Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getLocalVariableValue(2); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad3Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad3Cmd.java index 2c151b2de2..e0118311dc 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad3Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ALoad3Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public ALoad3Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getLocalVariableValue(3); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore0Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore0Cmd.java index 71909a5a22..86c671ae2a 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore0Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore0Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public AStore0Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getOperandStack().pop(); + frame.setLocalVariableValue(0, object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore1Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore1Cmd.java index 379da9077c..54e5331790 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore1Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore1Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public AStore1Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getOperandStack().pop(); + frame.setLocalVariableValue(1, object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore2Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore2Cmd.java index b11cf64bac..b911f8b5ba 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore2Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore2Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public AStore2Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getOperandStack().pop(); + frame.setLocalVariableValue(2, object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore3Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore3Cmd.java index eedd211522..9d8ab29f5e 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore3Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AStore3Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public AStore3Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getOperandStack().pop(); + frame.setLocalVariableValue(3, object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/BiPushCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/BiPushCmd.java index da2b176cb4..1296e4c0b9 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/BiPushCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/BiPushCmd.java @@ -4,6 +4,10 @@ import jvm.classfile.ConstantPool; import jvm.command.CommandIterator; import jvm.command.item.OneOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.Heap; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { public BiPushCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { @@ -14,4 +18,11 @@ public BiPushCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString(ConstantPool pool) { return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int op = getOperand(); + JavaObject object = Heap.getInstance().newInt(op); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java index d9d02922fb..3543bc4f37 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public DupCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getOperandStack().peek(); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/GetFieldCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetFieldCmd.java index e0e4701bc3..1aba8f7604 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/GetFieldCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetFieldCmd.java @@ -2,8 +2,13 @@ import jvm.classfile.ClassFile; import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.FieldRefInfo; import jvm.command.CommandIterator; import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.Heap; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -16,5 +21,13 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject obj = frame.getOperandStack().pop(); + int fieldIndex = (getOperand1() << 8) | getOperand2(); + FieldRefInfo fieldRefInfo = (FieldRefInfo) getConstantInfo(fieldIndex); + String fieldName = fieldRefInfo.getNameAndType().split(":")[0]; + JavaObject value = obj.getFieldValue(fieldName); + frame.getOperandStack().push(value); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java index 16959b04e0..81bf3161f5 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java @@ -2,8 +2,12 @@ import jvm.classfile.ClassFile; import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.FieldRefInfo; +import jvm.classfile.field.Field; import jvm.command.CommandIterator; import jvm.command.item.TwoOperandCmd; +import jvm.engine.*; +import jvm.exception.ReadClassException; public class GetStaticCmd extends TwoOperandCmd { @@ -16,4 +20,14 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) throws ReadClassException { + int index = (getOperand1() << 8) | getOperand2(); + FieldRefInfo fieldRefInfo = (FieldRefInfo) getConstantInfo(index); + ClassFile classFile = MethodArea.getInstance().findClassFile(fieldRefInfo.getClassName()); + String fieldName = fieldRefInfo.getNameAndType().split(":")[0]; + Field field = classFile.getField(fieldName); + JavaObject object = classFile.getStaticFieldValues(field); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad0Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad0Cmd.java index c02449abb8..5b3ff1e7e1 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad0Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad0Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public ILoad0Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getLocalVariableValue(0); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad1Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad1Cmd.java index ee35698dce..ca858b90bb 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad1Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad1Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public ILoad1Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getLocalVariableValue(1); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad2Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad2Cmd.java index 1f0962b1a8..a88a976e59 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad2Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad2Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public ILoad2Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getLocalVariableValue(2); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad3Cmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad3Cmd.java index dd64684d1a..08e4920be8 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad3Cmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ILoad3Cmd.java @@ -3,6 +3,9 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +20,10 @@ public ILoad3Cmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject object = frame.getLocalVariableValue(3); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java index 3bc0281582..ac06fe735f 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java @@ -2,8 +2,14 @@ import jvm.classfile.ClassFile; import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.MethodRefInfo; +import jvm.classfile.method.Method; import jvm.command.CommandIterator; import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.MethodArea; +import jvm.engine.StackFrame; +import jvm.exception.ReadClassException; public class InvokeSpecialCmd extends TwoOperandCmd { public InvokeSpecialCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { @@ -14,4 +20,13 @@ public InvokeSpecialCmd(ClassFile clzFile, String opCode, CommandIterator iterat public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) throws ReadClassException { + int methodIndex = (getOperand1() << 8) | getOperand2(); + MethodRefInfo methodRefInfo = (MethodRefInfo) getConstantInfo(methodIndex); + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + Method method = MethodArea.getInstance().getMethod(methodRefInfo); + result.setNextMethod(method); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeVirtualCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeVirtualCmd.java index c5809c1ea8..7066c224b0 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeVirtualCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeVirtualCmd.java @@ -2,8 +2,14 @@ import jvm.classfile.ClassFile; import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.MethodRefInfo; +import jvm.classfile.method.Method; import jvm.command.CommandIterator; import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.MethodArea; +import jvm.engine.StackFrame; +import jvm.exception.ReadClassException; public class InvokeVirtualCmd extends TwoOperandCmd { public InvokeVirtualCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { @@ -14,4 +20,13 @@ public InvokeVirtualCmd(ClassFile clzFile, String opCode, CommandIterator iterat public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) throws ReadClassException { + int methodIndex = (getOperand1() << 8) | getOperand2(); + MethodRefInfo methodRefInfo = (MethodRefInfo) getConstantInfo(methodIndex); + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + Method method = MethodArea.getInstance().getMethod(methodRefInfo); + result.setNextMethod(method); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/LdcCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/LdcCmd.java index 73e7aa8f8e..faccb414c3 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/LdcCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/LdcCmd.java @@ -3,9 +3,16 @@ import jvm.classfile.ClassFile; import jvm.classfile.ConstantPool; import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.impl.ClassInfo; +import jvm.classfile.constant.item.impl.FloatInfo; +import jvm.classfile.constant.item.impl.IntegerInfo; import jvm.classfile.constant.item.impl.StringInfo; import jvm.command.CommandIterator; import jvm.command.item.OneOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.Heap; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -24,4 +31,11 @@ public String toString(ConstantPool pool) { return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int op = getOperand(); + Constant constant = getConstantInfo(op); + JavaObject object = Heap.getInstance().createObject(constant); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/NewCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/NewCmd.java index 67a598a624..58b5cdc919 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/NewCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/NewCmd.java @@ -2,8 +2,13 @@ import jvm.classfile.ClassFile; import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.Constant; import jvm.command.CommandIterator; import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.Heap; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; public class NewCmd extends TwoOperandCmd { @@ -13,7 +18,14 @@ public NewCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { @Override public String toString(ConstantPool pool) { - return super.getOperandAsClassInfo(pool); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int index = (getOperand1() << 8) | getOperand2(); + Constant constant = getConstantInfo(index); + JavaObject object = Heap.getInstance().createObject(constant); + frame.getOperandStack().push(object); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java index 58628d8dff..aac89263b8 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java @@ -2,8 +2,12 @@ import jvm.classfile.ClassFile; import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.FieldRefInfo; import jvm.command.CommandIterator; import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -15,4 +19,14 @@ public PutFieldCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject obj = frame.getOperandStack().pop(); + JavaObject value = frame.getOperandStack().pop(); + int fieldIndex = (getOperand1() << 8) | getOperand2(); + FieldRefInfo fieldRefInfo = (FieldRefInfo) getConstantInfo(fieldIndex); + String fieldName = fieldRefInfo.getNameAndType().split(":")[0]; + obj.setFieldValue(fieldName, value); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/ReturnCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/ReturnCmd.java index cc46fe4caa..5897ff5f8b 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/ReturnCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/ReturnCmd.java @@ -3,6 +3,8 @@ import jvm.classfile.ClassFile; import jvm.command.CommandIterator; import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.StackFrame; /** * Created by Haochen on 2017/4/20. @@ -17,4 +19,9 @@ public ReturnCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { public String toString() { return this.getOffset() + ": " + this.getReadableCodeText(); } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + } } diff --git a/group01/895457260/code/src/main/java/jvm/engine/ExecutionResult.java b/group01/895457260/code/src/main/java/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..9a9de30255 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/engine/ExecutionResult.java @@ -0,0 +1,50 @@ +package jvm.engine; + +import jvm.classfile.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + private int nextCmdOffset = 0; + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + public void setNextAction(int action) { + this.nextAction = action; + } + + public boolean isPauseAndRunNewFrame() { + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + + public boolean isExitCurrentFrame() { + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd() { + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump() { + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/engine/ExecutorEngine.java b/group01/895457260/code/src/main/java/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..e984426689 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/engine/ExecutorEngine.java @@ -0,0 +1,55 @@ +package jvm.engine; + +import jvm.classfile.method.Method; +import jvm.exception.ReadClassException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class ExecutorEngine { + private Stack stack = new Stack<>(); + + public void execute(Method main) throws ReadClassException { + StackFrame mainFrame = StackFrame.create(main); + stack.push(mainFrame); + + while (!stack.isEmpty()) { + StackFrame top = stack.peek(); + ExecutionResult result = top.execute(); + if (result.isExitCurrentFrame()) { + stack.pop(); + } else if (result.isPauseAndRunNewFrame()) { + Method next = result.getNextMethod(); + StackFrame newFrame = StackFrame.create(next); + setupFunctionCallParams(top, newFrame); + stack.push(newFrame); + } + } + } + + private void setupFunctionCallParams(StackFrame currentFrame, StackFrame nextFrame) { + List local = createLocalVariableTable(currentFrame, nextFrame.getMethod()); + nextFrame.setLocalVariableTable(local); + nextFrame.setCallerFrame(currentFrame); + } + + private List createLocalVariableTable(StackFrame top, Method next) { + int paramCount = next.getParamCount(); + Stack params = new Stack<>(); + for (int i = 0; i < paramCount; ++i) { + JavaObject param = top.getOperandStack().pop(); + params.push(param); + } + if (!next.getAccessFlag().isStatic()) { + JavaObject param = top.getOperandStack().pop(); + params.push(param); + } + + List local = new ArrayList<>(); + while (!params.isEmpty()) { + local.add(params.pop()); + } + return local; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/engine/Heap.java b/group01/895457260/code/src/main/java/jvm/engine/Heap.java new file mode 100644 index 0000000000..bc06cf7a15 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/engine/Heap.java @@ -0,0 +1,63 @@ +package jvm.engine; + +import jvm.classfile.constant.item.Constant; +import jvm.classfile.constant.item.impl.ClassInfo; +import jvm.classfile.constant.item.impl.FloatInfo; +import jvm.classfile.constant.item.impl.IntegerInfo; +import jvm.classfile.constant.item.impl.StringInfo; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + private static Heap instance = new Heap(); + + private Heap() { + } + + public static Heap getInstance() { + return instance; + } + + public JavaObject createObject(Constant constant) { + if (constant instanceof IntegerInfo) { + int value = ((IntegerInfo) constant).getValue(); + return Heap.getInstance().newInt(value); + } else if (constant instanceof FloatInfo) { + float value = ((FloatInfo) constant).getValue(); + return Heap.getInstance().newFloat(value); + } else if (constant instanceof StringInfo) { + String value = ((StringInfo) constant).getValue(); + return Heap.getInstance().newString(value); + } else if (constant instanceof ClassInfo) { + String className = ((ClassInfo) constant).getClassName(); + return Heap.getInstance().newClassReference(className); + } + return null; + } + + public JavaObject newClassReference(String clzName) { + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value) { + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value) { + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + + public JavaObject newInt(int value) { + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/engine/JavaObject.java b/group01/895457260/code/src/main/java/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..8e6066755e --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/engine/JavaObject.java @@ -0,0 +1,77 @@ +package jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + private int type; + private String className; + private Map fieldValues = new HashMap<>(); + private String stringValue; + private int intValue; + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue) { + fieldValues.put(fieldName, fieldValue); + } + + public JavaObject(int type) { + this.type = type; + } + + public void setClassName(String className) { + this.className = className; + } + + public void setStringValue(String value) { + stringValue = value; + } + + public String getStringValue() { + return this.stringValue; + } + + public void setIntValue(int value) { + this.intValue = value; + } + + public int getIntValue() { + return this.intValue; + } + + public int getType() { + return type; + } + + public JavaObject getFieldValue(String fieldName) { + return this.fieldValues.get(fieldName); + } + + public String toString() { + switch (this.getType()) { + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className + ":" + this.fieldValues; + case FLOAT: + return String.valueOf(this.floatValue); + default: + return null; + } + } + + public String getClassName() { + return this.className; + } + + public void setFloatValue(float value) { + this.floatValue = value; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/engine/MethodArea.java b/group01/895457260/code/src/main/java/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..00f40a949e --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/engine/MethodArea.java @@ -0,0 +1,63 @@ +package jvm.engine; + +import jvm.ClassFileLoader; +import jvm.classfile.ClassFile; +import jvm.classfile.constant.item.impl.MethodRefInfo; +import jvm.classfile.method.Method; +import jvm.exception.ReadClassException; + +import java.util.HashMap; +import java.util.Map; + +public class MethodArea { + + private static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + private Map map = new HashMap<>(); + + private MethodArea() { + } + + public static MethodArea getInstance() { + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader) { + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className) throws ReadClassException { + ClassFile clzFile = this.findClassFile(className); + return clzFile.getMainMethod(); + } + + public ClassFile findClassFile(String className) throws ReadClassException { + if (map.get(className) != null) { + return map.get(className); + } + // 看来该class文件还没有load过 + ClassFile clzFile = this.clzLoader.load(className); + map.put(className, clzFile); + return clzFile; + } + + public Method getMethod(String className, String methodName, String paramAndReturnType) + throws ReadClassException { + ClassFile classFile = findClassFile(className); + return classFile.getMethod(methodName, paramAndReturnType); + } + + public Method getMethod(MethodRefInfo methodRef) throws ReadClassException { + String[] split = methodRef.getNameAndType().split(":"); + String className = methodRef.getClassName(); + String methodName = split[0]; + String paramAndReturnType = split[1]; + return getMethod(className, methodName, paramAndReturnType); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/engine/MiniJVM.java b/group01/895457260/code/src/main/java/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..eae3d36935 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/engine/MiniJVM.java @@ -0,0 +1,19 @@ +package jvm.engine; + +import jvm.ClassFileLoader; +import jvm.exception.ReadClassException; + +public class MiniJVM { + public void run(String[] classPaths, String className) throws ReadClassException { + ClassFileLoader loader = new ClassFileLoader(); + for (String classPath : classPaths) { + loader.addClassPath(classPath); + } + + MethodArea methodArea = MethodArea.getInstance(); + methodArea.setClassFileLoader(loader); + ExecutorEngine engine = new ExecutorEngine(); + className = className.replace(".", "/"); + engine.execute(methodArea.getMainMethod(className)); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java b/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java new file mode 100644 index 0000000000..6313623b34 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java @@ -0,0 +1,103 @@ +package jvm.engine; + +import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.MethodRefInfo; +import jvm.classfile.method.Method; +import jvm.command.item.ByteCodeCommand; +import jvm.command.item.TwoOperandCmd; +import jvm.exception.ReadClassException; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class StackFrame { + private List localVariableTable = new ArrayList<>(); + private Stack operandStack = new Stack<>(); + + private int index = 0; + private Method method = null; + private StackFrame callerFrame = null; + + private StackFrame(Method method) { + this.method = method; + } + + public ExecutionResult execute() throws ReadClassException { + ByteCodeCommand[] commands = getMethod().getCommands(); + + while (index < commands.length) { + ByteCodeCommand cmd = commands[index]; + ExecutionResult result = new ExecutionResult(); + cmd.execute(this, result); + index++; + result.setNextCmdOffset(commands[index].getOffset()); + + if (result.isExitCurrentFrame()) { + return result; + } else if (result.isPauseAndRunNewFrame()) { + TwoOperandCmd invokeCmd = (TwoOperandCmd) cmd; + int methodIndex = (invokeCmd.getOperand1() << 8) | invokeCmd.getOperand2(); + ConstantPool constantPool = getMethod().getConstantPool(); + MethodRefInfo next = (MethodRefInfo) constantPool.getConstantInfo(methodIndex); + Method nextMethod = MethodArea.getInstance().getMethod(next); + result.setNextMethod(nextMethod); + return result; + } else if (result.isJump()) { + TwoOperandCmd jumpCmd = (TwoOperandCmd) cmd; + int offset = (jumpCmd.getOperand1() << 8) | jumpCmd.getOperand2(); + index = getNextCommandIndex(offset); + } + } + ExecutionResult frameResult = new ExecutionResult(); + frameResult.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + return frameResult; + } + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + public static StackFrame create(Method m) { + return new StackFrame(m); + } + + public JavaObject getLocalVariableValue(int index) { + return this.localVariableTable.get(index); + } + + public Stack getOperandStack() { + return this.operandStack; + } + + public int getNextCommandIndex(int offset) { + ByteCodeCommand[] commands = method.getCommands(); + for (int i = 0; i < commands.length; i++) { + if (commands[i].getOffset() == offset) { + return i; + } + } + throw new RuntimeException("Can't find next command"); + } + + public void setLocalVariableTable(List values) { + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo) { + if (this.localVariableTable.size() - 1 < index) { + for (int i = this.localVariableTable.size(); i <= index; i++) { + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + } + + public Method getMethod() { + return method; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java b/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java index 1d2ca39d46..a53017333d 100644 --- a/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java +++ b/group01/895457260/code/src/main/java/jvm/print/ClassFilePrinter.java @@ -4,9 +4,6 @@ import jvm.classfile.ClassFile; import jvm.exception.ReadClassException; -import java.util.ArrayList; -import java.util.List; - public class ClassFilePrinter { ClassFile clzFile; @@ -15,7 +12,7 @@ public ClassFilePrinter(ClassFile clzFile) { } public void print() { - if (clzFile.getAccessFlag().isPublicClass()) { + if (clzFile.getAccessFlag().isPublic()) { System.out.println("Access flag : public "); } System.out.println("Class Name: " + clzFile.getClassName()); diff --git a/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java b/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java index 5a82776eef..17d7537209 100644 --- a/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java +++ b/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java @@ -19,7 +19,19 @@ public static String toHexString(byte[] bytes, int off, int len) { return builder.toString(); } + public static int toInt(byte[] bytes) { + return toInt(bytes, 0, bytes.length); + } + public static int toInt(byte[] bytes, int off, int len) { return Integer.parseInt(toHexString(bytes, off, len), 16); } + + public static float toFloat(byte[] bytes) { + return toFloat(bytes, 0, bytes.length); + } + + public static float toFloat(byte[] bytes, int off, int len) { + return Float.intBitsToFloat(toInt(bytes, off, len)); + } } diff --git a/group01/895457260/code/src/main/java/jvm/util/TypeUtils.java b/group01/895457260/code/src/main/java/jvm/util/TypeUtils.java new file mode 100644 index 0000000000..a3d8b618cc --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/TypeUtils.java @@ -0,0 +1,54 @@ +package jvm.util; + +import jvm.classfile.field.Field; +import jvm.engine.Heap; +import jvm.engine.JavaObject; + +/** + * Created by Haochen on 2017/4/30. + * TODO: + */ +public class TypeUtils { + private static final String INT = "I"; + private static final String FLOAT = "F"; + private static final String LONG = "J"; + private static final String DOUBLE = "D"; + private static final String CHAR = "C"; + private static final String BYTE = "B"; + private static final String BOOLEAN = "Z"; + private static final String SHORT = "S"; + + private static final String REFERENCE = "ref"; + + public static String parse(String inClassFile) { + switch (inClassFile) { + case INT: + return "int"; + case FLOAT: + return "float"; + case LONG: + return "long"; + case DOUBLE: + return "double"; + case CHAR: + return "char"; + case BYTE: + return "byte"; + case BOOLEAN: + return "boolean"; + case SHORT: + return "short"; + } + return REFERENCE; + } + + public static JavaObject getDefaultValue(Field field) { + switch (field.getDescriptor()) { + case INT: + return Heap.getInstance().newInt(0); + case FLOAT: + return Heap.getInstance().newFloat(0); + } + return Heap.getInstance().newClassReference(field.getDescriptor()); + } +} diff --git a/group01/895457260/code/src/test/java/algorithm/expression/PostfixExprTest.java b/group01/895457260/code/src/test/java/algorithm/expression/PostfixExprTest.java index d57f19fcda..e1a4cb2268 100644 --- a/group01/895457260/code/src/test/java/algorithm/expression/PostfixExprTest.java +++ b/group01/895457260/code/src/test/java/algorithm/expression/PostfixExprTest.java @@ -32,6 +32,12 @@ public void testEvaluate() { PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); Assert.assertEquals(54, expr.evaluate(),0.0f); } + + { + //10-2^3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 ^ - 50 +"); + Assert.assertEquals(52, expr.evaluate(),0.0f); + } } } diff --git a/group01/895457260/code/src/test/java/datastructure/QueueTest.java b/group01/895457260/code/src/test/java/datastructure/QueueTest.java index f2a9495484..cb0383d441 100644 --- a/group01/895457260/code/src/test/java/datastructure/QueueTest.java +++ b/group01/895457260/code/src/test/java/datastructure/QueueTest.java @@ -1,5 +1,6 @@ package datastructure; +import datastructure.basic.LinkedList; import datastructure.exception.EmptyQueueException; import datastructure.basic.Queue; import org.junit.Assert; @@ -29,7 +30,7 @@ public void after() throws Exception { } private Queue getQueue() { - Queue queue = new Queue(5); + Queue queue = new Queue(); for (int i = 1; i <= 5; ++i) { queue.enQueue(i); } @@ -38,35 +39,19 @@ private Queue getQueue() { private void assertQueue(Queue queue, Object[] actual) { Class clazz = Queue.class; - Object[] array = null; - int head = 0; - int rear = 0; - Method mapIndex = null; + LinkedList list = null; try { - Field arrayField = clazz.getDeclaredField("array"); - Field headField = clazz.getDeclaredField("head"); - Field rearField = clazz.getDeclaredField("rear"); - mapIndex = clazz.getDeclaredMethod("mapIndex", int.class); - arrayField.setAccessible(true); - headField.setAccessible(true); - rearField.setAccessible(true); - mapIndex.setAccessible(true); - array = (Object[]) arrayField.get(queue); - head = (int) headField.get(queue); - rear = (int) rearField.get(queue); - } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) { + Field listField = clazz.getDeclaredField("list"); + listField.setAccessible(true); + list = (LinkedList) listField.get(queue); + } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); + Assert.fail(); } int size = queue.size(); Object[] excepted = new Object[size]; - int pos = 0; - try { - while (head < rear) { - excepted[pos++] = array[(int) mapIndex.invoke(queue, head)]; - head++; - } - } catch (IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); + for (int i = 0; i < size; ++i) { + excepted[i] = list.get(i); } Assert.assertArrayEquals(excepted, actual); } diff --git a/group01/895457260/code/src/test/java/jvm/E.java b/group01/895457260/code/src/test/java/jvm/E.java new file mode 100644 index 0000000000..691defee19 --- /dev/null +++ b/group01/895457260/code/src/test/java/jvm/E.java @@ -0,0 +1,34 @@ +package jvm; + +public class E { + + private String name; + private int age; + + public E(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 int test(int a, int b, int c, int d, int e) { + int f = a + b; + int g = c + d + e; + System.out.println(f + g); + return 666; + } + public static void main(String[] args){ + E p = new E("Andy",29); + p.sayHello(); + int r = p.test(1, 2, 3, 4, 5); + System.out.println(r); + } +} diff --git a/group01/895457260/code/src/test/java/jvm/LiteJvmTest.java b/group01/895457260/code/src/test/java/jvm/LiteJvmTest.java deleted file mode 100644 index a6f36bb3ca..0000000000 --- a/group01/895457260/code/src/test/java/jvm/LiteJvmTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package jvm; - -import jvm.exception.MagicNumberException; -import jvm.exception.ReadClassException; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * LiteJvm Tester. - * - * @author - * @version 1.0 - * @since
    三月 26, 2017
    - */ -public class LiteJvmTest { - - private LiteJvm jvm = LiteJvm.INSTANCE; - private String fileName; - - @Before - public void before() throws Exception { - fileName = "target/classes/algorithm/ArrayUtil.class"; - } - - @After - public void after() throws Exception { - } - - /** - * Method: launch(File fileName) - */ - @Test - public void testLaunch() { -//TODO: Test goes here... - try { - jvm.launch(fileName); - } catch (MagicNumberException | ReadClassException e) { - e.printStackTrace(); - Assert.fail(e.getMessage()); - } - } - - - /** - * Method: checkMagicNumber(byte[] bytes) - */ - @Test - public void testCheckMagicNumber() throws Exception { -//TODO: Test goes here... -// try { -// Method method = LiteJvm.class.getDeclaredMethod("checkMagicNumber", byte[].class); -// method.setAccessible(true); -// method.invoke(jvm, ???); -// } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { -// e.printStackTrace(); -// } - } - - /** - * Method: getBytes(File fileName) - */ - @Test - public void testGetBytes() throws Exception { -//TODO: Test goes here... - try { - Method method = LiteJvm.class.getDeclaredMethod("getBytes", File.class); - method.setAccessible(true); - byte[] bytes = (byte[]) method.invoke(jvm, fileName); - Assert.assertEquals(3851, bytes.length); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - Assert.fail(e.getMessage()); - } - } - -} From 74e91a6ea79ad6ed4ac1abe8be2221bdc9785974 Mon Sep 17 00:00:00 2001 From: jy <977996067@qq.com> Date: Sun, 30 Apr 2017 16:21:48 +0800 Subject: [PATCH 360/552] =?UTF-8?q?4.30=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/task8/jvm/attr/AttributeInfo.java | 19 ++ .../src/task8/jvm/attr/CodeAttr.java | 120 +++++++++++ .../src/task8/jvm/attr/LineNumberTable.java | 72 +++++++ .../src/task8/jvm/attr/LocalVariableItem.java | 39 ++++ .../task8/jvm/attr/LocalVariableTable.java | 57 ++++++ .../src/task8/jvm/attr/StackMapTable.java | 30 +++ .../src/task8/jvm/clz/AccessFlag.java | 25 +++ .../src/task8/jvm/clz/ClassFile.java | 134 ++++++++++++ .../src/task8/jvm/clz/ClassIndex.java | 19 ++ .../src/task8/jvm/cmd/BiPushCmd.java | 29 +++ .../src/task8/jvm/cmd/ByteCodeCommand.java | 126 ++++++++++++ .../src/task8/jvm/cmd/CommandParser.java | 124 ++++++++++++ .../src/task8/jvm/cmd/GetFieldCmd.java | 27 +++ .../src/task8/jvm/cmd/GetStaticFieldCmd.java | 27 +++ .../src/task8/jvm/cmd/InvokeSpecialCmd.java | 39 ++++ .../src/task8/jvm/cmd/InvokeVirtualCmd.java | 22 ++ .../src/task8/jvm/cmd/LdcCmd.java | 44 ++++ .../src/task8/jvm/cmd/NewObjectCmd.java | 32 +++ .../src/task8/jvm/cmd/NoOperandCmd.java | 23 +++ .../src/task8/jvm/cmd/OneOperandCmd.java | 27 +++ .../src/task8/jvm/cmd/PutFieldCmd.java | 19 ++ .../src/task8/jvm/cmd/TwoOperandCmd.java | 63 ++++++ .../src/task8/jvm/constant/ClassInfo.java | 31 +++ .../src/task8/jvm/constant/ConstantInfo.java | 35 ++++ .../src/task8/jvm/constant/ConstantPool.java | 37 ++++ .../src/task8/jvm/constant/FieldRefInfo.java | 65 ++++++ .../src/task8/jvm/constant/MethodRefInfo.java | 65 ++++++ .../task8/jvm/constant/NameAndTypeInfo.java | 56 +++++ .../task8/jvm/constant/NullConstantInfo.java | 21 ++ .../src/task8/jvm/constant/StringInfo.java | 35 ++++ .../src/task8/jvm/constant/UTF8Info.java | 45 +++++ .../src/task8/jvm/engine/ExecutionResult.java | 53 +++++ .../src/task8/jvm/engine/ExecutorEngine.java | 49 +++++ .../src/task8/jvm/engine/Heap.java | 39 ++++ .../src/task8/jvm/engine/JavaObject.java | 81 ++++++++ .../src/task8/jvm/engine/MethodArea.java | 41 ++++ .../src/task8/jvm/engine/MiniJVM.java | 18 ++ .../src/task8/jvm/engine/StackFrame.java | 106 ++++++++++ .../src/task8/jvm/field/Field.java | 48 +++++ .../task8/jvm/loader/ByteCodeIterator.java | 56 +++++ .../src/task8/jvm/loader/ClassFileLoader.java | 122 +++++++++++ .../src/task8/jvm/loader/ClassFileParser.java | 112 ++++++++++ .../src/task8/jvm/method/Method.java | 107 ++++++++++ .../src/task8/jvm/print/ClassFilePrinter.java | 44 ++++ .../task8/jvm/print/ConstantInfoVisitor.java | 18 ++ .../jvm/print/ConstantInfoVisitorImpl.java | 51 +++++ .../task8/jvm/print/ConstantPoolPrinter.java | 26 +++ .../task8/jvm/test/ClassFileloaderTest.java | 191 ++++++++++++++++++ .../src/task8/jvm/test/EmployeeV1.java | 29 +++ .../src/task8/jvm/util/Util.java | 23 +++ .../src/task8/queue/CircleQueue.java | 54 +++++ .../src/task8/queue/Josephus.java | 28 +++ .../src/task8/queue/QueueWithTwoStacks.java | 41 ++++ 53 files changed, 2844 insertions(+) create mode 100644 group15/1507_977996067/src/task8/jvm/attr/AttributeInfo.java create mode 100644 group15/1507_977996067/src/task8/jvm/attr/CodeAttr.java create mode 100644 group15/1507_977996067/src/task8/jvm/attr/LineNumberTable.java create mode 100644 group15/1507_977996067/src/task8/jvm/attr/LocalVariableItem.java create mode 100644 group15/1507_977996067/src/task8/jvm/attr/LocalVariableTable.java create mode 100644 group15/1507_977996067/src/task8/jvm/attr/StackMapTable.java create mode 100644 group15/1507_977996067/src/task8/jvm/clz/AccessFlag.java create mode 100644 group15/1507_977996067/src/task8/jvm/clz/ClassFile.java create mode 100644 group15/1507_977996067/src/task8/jvm/clz/ClassIndex.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/BiPushCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/ByteCodeCommand.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/CommandParser.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/GetFieldCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/LdcCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/NewObjectCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/NoOperandCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/OneOperandCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/PutFieldCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/cmd/TwoOperandCmd.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/ClassInfo.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/ConstantInfo.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/ConstantPool.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/FieldRefInfo.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/MethodRefInfo.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/NameAndTypeInfo.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/NullConstantInfo.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/StringInfo.java create mode 100644 group15/1507_977996067/src/task8/jvm/constant/UTF8Info.java create mode 100644 group15/1507_977996067/src/task8/jvm/engine/ExecutionResult.java create mode 100644 group15/1507_977996067/src/task8/jvm/engine/ExecutorEngine.java create mode 100644 group15/1507_977996067/src/task8/jvm/engine/Heap.java create mode 100644 group15/1507_977996067/src/task8/jvm/engine/JavaObject.java create mode 100644 group15/1507_977996067/src/task8/jvm/engine/MethodArea.java create mode 100644 group15/1507_977996067/src/task8/jvm/engine/MiniJVM.java create mode 100644 group15/1507_977996067/src/task8/jvm/engine/StackFrame.java create mode 100644 group15/1507_977996067/src/task8/jvm/field/Field.java create mode 100644 group15/1507_977996067/src/task8/jvm/loader/ByteCodeIterator.java create mode 100644 group15/1507_977996067/src/task8/jvm/loader/ClassFileLoader.java create mode 100644 group15/1507_977996067/src/task8/jvm/loader/ClassFileParser.java create mode 100644 group15/1507_977996067/src/task8/jvm/method/Method.java create mode 100644 group15/1507_977996067/src/task8/jvm/print/ClassFilePrinter.java create mode 100644 group15/1507_977996067/src/task8/jvm/print/ConstantInfoVisitor.java create mode 100644 group15/1507_977996067/src/task8/jvm/print/ConstantInfoVisitorImpl.java create mode 100644 group15/1507_977996067/src/task8/jvm/print/ConstantPoolPrinter.java create mode 100644 group15/1507_977996067/src/task8/jvm/test/ClassFileloaderTest.java create mode 100644 group15/1507_977996067/src/task8/jvm/test/EmployeeV1.java create mode 100644 group15/1507_977996067/src/task8/jvm/util/Util.java create mode 100644 group15/1507_977996067/src/task8/queue/CircleQueue.java create mode 100644 group15/1507_977996067/src/task8/queue/Josephus.java create mode 100644 group15/1507_977996067/src/task8/queue/QueueWithTwoStacks.java diff --git a/group15/1507_977996067/src/task8/jvm/attr/AttributeInfo.java b/group15/1507_977996067/src/task8/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..ec71b64d22 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package task8.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/attr/CodeAttr.java b/group15/1507_977996067/src/task8/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..bd9658c0bc --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/attr/CodeAttr.java @@ -0,0 +1,120 @@ +package task8.jvm.attr; + + +import task8.jvm.clz.ClassFile; +import task8.jvm.cmd.ByteCodeCommand; +import task8.jvm.cmd.CommandParser; +import task8.jvm.constant.ConstantPool; +import task8.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attrNameIndex = iter.next2Bytes(); + int attrLen = iter.next4Bytes(); + int maxStack = iter.next2Bytes(); + int maxLocals = iter.next2Bytes(); + int codeLen = iter.next4Bytes(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + + int exceptionTableLen = iter.next2Bytes(); + //TODO 处理exception + if (exceptionTableLen > 0) { + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + + + int subAttrCount = iter.next2Bytes(); + + for (int x = 1; x <= subAttrCount; x++) { + int subAttrIndex = iter.next2Bytes(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //line item table + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + + + } + + return codeAttr; + } + + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Code:").append(code).append("\n"); + for (int i = 0; i < cmds.length; i++) { + buffer.append(cmds[i].toString(pool)).append("\n"); + } + buffer.append("\n"); + buffer.append(this.lineNumTable.toString()); + buffer.append(this.localVarTable.toString(pool)); + return buffer.toString(); + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/attr/LineNumberTable.java b/group15/1507_977996067/src/task8/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..b191bb8f29 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/attr/LineNumberTable.java @@ -0,0 +1,72 @@ +package task8.jvm.attr; + +import task8.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + + LineNumberTable table = new LineNumberTable(index, len); + + int itemLen = iter.next2Bytes(); + + for (int i = 1; i <= itemLen; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.next2Bytes()); + item.setLineNum(iter.next2Bytes()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for (LineNumberItem item : items) { + buffer.append("startPC:" + item.getStartPC()).append(","); + buffer.append("lineNum:" + item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/attr/LocalVariableItem.java b/group15/1507_977996067/src/task8/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..484e395f4b --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package task8.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group15/1507_977996067/src/task8/jvm/attr/LocalVariableTable.java b/group15/1507_977996067/src/task8/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..5d4481fff5 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/attr/LocalVariableTable.java @@ -0,0 +1,57 @@ +package task8.jvm.attr; + + +import task8.jvm.constant.ConstantPool; +import task8.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.next2Bytes(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.next2Bytes()); + item.setLength(iter.next2Bytes()); + item.setNameIndex(iter.next2Bytes()); + item.setDescIndex(iter.next2Bytes()); + item.setIndex(iter.next2Bytes()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group15/1507_977996067/src/task8/jvm/attr/StackMapTable.java b/group15/1507_977996067/src/task8/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..2286391bbe --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package task8.jvm.attr; + + +import task8.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo { + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.next2Bytes(); + int len = iter.next4Bytes(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group15/1507_977996067/src/task8/jvm/clz/AccessFlag.java b/group15/1507_977996067/src/task8/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..6b877b438b --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package task8.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/group15/1507_977996067/src/task8/jvm/clz/ClassFile.java b/group15/1507_977996067/src/task8/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..089224ffc7 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/clz/ClassFile.java @@ -0,0 +1,134 @@ +package task8.jvm.clz; + +import task8.jvm.constant.ClassInfo; +import task8.jvm.constant.ConstantPool; +import task8.jvm.field.Field; +import task8.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + + private List fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + + public void setClzIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } + + public ConstantPool getPool() { + return pool; + } + + public void setPool(ConstantPool pool) { + this.pool = pool; + } + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + + public List getMethods() { + return methods; + } + + public void setMethods(List methods) { + this.methods = methods; + } + + 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()); + + + } + + public String getClassName() { + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo) this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public String getSuperClassName() { + ClassInfo superClass = (ClassInfo) this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType) { + + for (Method method : methods) { + int nameIndex = method.getNameIndex(); + int descriptorIndex = method.getDescriptorIndex(); + String name = getConstantPool().getUTF8String(nameIndex); + String descriptor = getConstantPool().getUTF8String(descriptorIndex); + if (methodName.equalsIgnoreCase(name) && paramAndReturnType.equalsIgnoreCase(descriptor)) { + return method; + } + } + return null; + } + + public Method getMainMethod() { + + return getMethod("main", "([Ljava/lang/String;)"); + } +} diff --git a/group15/1507_977996067/src/task8/jvm/clz/ClassIndex.java b/group15/1507_977996067/src/task8/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..b4e6157fbb --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package task8.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/group15/1507_977996067/src/task8/jvm/cmd/BiPushCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..1b3d16fab7 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/BiPushCmd.java @@ -0,0 +1,29 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantPool; +import task8.jvm.engine.ExecutionResult; +import task8.jvm.engine.Heap; +import task8.jvm.engine.StackFrame; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + frame.getOprandStack().push(Heap.getInstance().newInt(getOperand())); + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/ByteCodeCommand.java b/group15/1507_977996067/src/task8/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..d62ed01385 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,126 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantInfo; +import task8.jvm.constant.ConstantPool; +import task8.jvm.engine.ExecutionResult; +import task8.jvm.engine.StackFrame; + +import java.util.HashMap; +import java.util.Map; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static { + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + protected ByteCodeCommand(ClassFile clzFile, String opCode) { + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + protected ConstantInfo getConstantInfo(int index) { + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool() { + return this.getClassFile().getConstantPool(); + } + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + public String toString() { + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText() { + String txt = codeMap.get(opCode); + if (txt == null) { + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame, ExecutionResult result); +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/CommandParser.java b/group15/1507_977996067/src/task8/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..6e36ac1a2f --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/CommandParser.java @@ -0,0 +1,124 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; + +import java.util.ArrayList; +import java.util.List; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + codes = codes.toUpperCase(); + System.out.println("=========> codes: " + codes); + CommandIterator iterator = new CommandIterator(codes); + List commands = new ArrayList<>(); + while (iterator.hasNext()) { + String opCode = iterator.next2CharAsString(); + switch (opCode) { + case new_object: + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, codes); + newObjectCmd.setOprand1(iterator.next2CharAsInt()); + newObjectCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(newObjectCmd); + break; + case ldc: + LdcCmd ldcCmd = new LdcCmd(clzFile, codes); + ldcCmd.setOperand(iterator.next2CharAsInt()); + commands.add(ldcCmd); + break; + case bipush: + BiPushCmd biPushCmd = new BiPushCmd(clzFile, codes); + biPushCmd.setOperand(iterator.next2CharAsInt()); + commands.add(biPushCmd); + break; + case invokespecial: + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, codes); + invokeSpecialCmd.setOprand1(iterator.next2CharAsInt()); + invokeSpecialCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(invokeSpecialCmd); + break; + case invokevirtual: + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, codes); + invokeVirtualCmd.setOprand1(iterator.next2CharAsInt()); + invokeVirtualCmd.setOprand2(iterator.next2CharAsInt()); + commands.add(invokeVirtualCmd); + break; + default: + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, codes); + commands.add(noOperandCmd); + } + } + calcuateOffset(commands); + return commands.toArray(new ByteCodeCommand[commands.size()]); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16); + } + + } +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/GetFieldCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..ab19950a37 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,27 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantPool; +import task8.jvm.engine.ExecutionResult; +import task8.jvm.engine.StackFrame; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/GetStaticFieldCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..6c2df9be63 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,27 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantPool; +import task8.jvm.engine.ExecutionResult; +import task8.jvm.engine.StackFrame; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/InvokeSpecialCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..b7e70e50be --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,39 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantInfo; +import task8.jvm.constant.ConstantPool; +import task8.jvm.constant.MethodRefInfo; +import task8.jvm.engine.ExecutionResult; +import task8.jvm.engine.MethodArea; +import task8.jvm.engine.StackFrame; +import task8.jvm.method.Method; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + MethodRefInfo info = (MethodRefInfo) this.getConstantInfo(getIndex()); + + if ("java/lang/Object".equalsIgnoreCase(info.getClassName()) && "".equalsIgnoreCase(info.getMethodName())) { + return; + } + Method method = MethodArea.getInstance().getMethod(info); + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(method); + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/InvokeVirtualCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..1541ec2524 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/LdcCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..c080efc812 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/LdcCmd.java @@ -0,0 +1,44 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantInfo; +import task8.jvm.constant.ConstantPool; +import task8.jvm.constant.StringInfo; +import task8.jvm.engine.ExecutionResult; +import task8.jvm.engine.Heap; +import task8.jvm.engine.JavaObject; +import task8.jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + value = strInfo.toString(); + } + + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; + + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ConstantInfo info = this.getConstantPool().getConstantInfo(this.getOperand()); + if (info instanceof StringInfo) { + JavaObject object = Heap.getInstance().newString(info.toString()); + frame.getOprandStack().push(object); + } else { + // ... + } + } + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/NewObjectCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..c79e60d451 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,32 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ClassInfo; +import task8.jvm.constant.ConstantPool; +import task8.jvm.engine.ExecutionResult; +import task8.jvm.engine.Heap; +import task8.jvm.engine.JavaObject; +import task8.jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd { + + public NewObjectCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getIndex()); + String className = classInfo.getClassName(); + JavaObject object = Heap.getInstance().newObject(className); + frame.getOprandStack().push(object); + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/NoOperandCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..a7f861f5b8 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand { + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/OneOperandCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..5579b19d8f --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/PutFieldCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..3938d110b7 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group15/1507_977996067/src/task8/jvm/cmd/TwoOperandCmd.java b/group15/1507_977996067/src/task8/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..f05e5dd9e4 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,63 @@ +package task8.jvm.cmd; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand { + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group15/1507_977996067/src/task8/jvm/constant/ClassInfo.java b/group15/1507_977996067/src/task8/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..21e6655f29 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/ClassInfo.java @@ -0,0 +1,31 @@ +package task8.jvm.constant; + +import task8.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitClassInfo(this); + } + + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group15/1507_977996067/src/task8/jvm/constant/ConstantInfo.java b/group15/1507_977996067/src/task8/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..a6fe00f23d --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/ConstantInfo.java @@ -0,0 +1,35 @@ +package task8.jvm.constant; + +import task8.jvm.print.ConstantInfoVisitor; + +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 abstract void accept(ConstantInfoVisitor visitor); + + public ConstantPool getConstantPool() { + return constantPool; + } + + public ConstantInfo getConstantInfo(int index) { + return this.constantPool.getConstantInfo(index); + } + +} diff --git a/group15/1507_977996067/src/task8/jvm/constant/ConstantPool.java b/group15/1507_977996067/src/task8/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..4f467f53e7 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/ConstantPool.java @@ -0,0 +1,37 @@ +package task8.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +public class ConstantPool { + + private List constantInfos; + + public ConstantPool() { + this.constantInfos = new ArrayList<>(); + } + + public ConstantPool(int size) { + this.constantInfos = new ArrayList<>(size); + + addConstantInfo(new NullConstantInfo()); + } + + 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/group15/1507_977996067/src/task8/jvm/constant/FieldRefInfo.java b/group15/1507_977996067/src/task8/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..8f1b247214 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/FieldRefInfo.java @@ -0,0 +1,65 @@ +package task8.jvm.constant; + +import task8.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitFieldRefInfo(this); + } + + 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/group15/1507_977996067/src/task8/jvm/constant/MethodRefInfo.java b/group15/1507_977996067/src/task8/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..6e567ab507 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/MethodRefInfo.java @@ -0,0 +1,65 @@ +package task8.jvm.constant; + +import task8.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitMethodRefInfo(this); + } + + 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/group15/1507_977996067/src/task8/jvm/constant/NameAndTypeInfo.java b/group15/1507_977996067/src/task8/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..1ff765a7f6 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,56 @@ +package task8.jvm.constant; + +import task8.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitNameAndTypeInfo(this); + } + + + 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/group15/1507_977996067/src/task8/jvm/constant/NullConstantInfo.java b/group15/1507_977996067/src/task8/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..b69f30c334 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/NullConstantInfo.java @@ -0,0 +1,21 @@ +package task8.jvm.constant; + +import task8.jvm.print.ConstantInfoVisitor; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + // non impl + } + +} diff --git a/group15/1507_977996067/src/task8/jvm/constant/StringInfo.java b/group15/1507_977996067/src/task8/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..0fb1d53b58 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/StringInfo.java @@ -0,0 +1,35 @@ +package task8.jvm.constant; + +import task8.jvm.print.ConstantInfoVisitor; + +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; + } + + @Override + public void accept(ConstantInfoVisitor visitor) { + visitor.visitStringInfo(this); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + + public String toString() { + return this.getConstantPool().getUTF8String(index); + } + +} diff --git a/group15/1507_977996067/src/task8/jvm/constant/UTF8Info.java b/group15/1507_977996067/src/task8/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..1587a05525 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/constant/UTF8Info.java @@ -0,0 +1,45 @@ +package task8.jvm.constant; + +import task8.jvm.print.ConstantInfoVisitor; + +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 void accept(ConstantInfoVisitor visitor) { + visitor.visitUtf8Info(this); + } + + @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/group15/1507_977996067/src/task8/jvm/engine/ExecutionResult.java b/group15/1507_977996067/src/task8/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..01f910c52c --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/engine/ExecutionResult.java @@ -0,0 +1,53 @@ +package task8.jvm.engine; + +import task8.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + public void setNextAction(int action) { + this.nextAction = action; + } + + public boolean isPauseAndRunNewFrame() { + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + + public boolean isExitCurrentFrame() { + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd() { + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump() { + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } +} diff --git a/group15/1507_977996067/src/task8/jvm/engine/ExecutorEngine.java b/group15/1507_977996067/src/task8/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..ffcda2e803 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/engine/ExecutorEngine.java @@ -0,0 +1,49 @@ +package task8.jvm.engine; + +import task8.jvm.method.Method; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +public class ExecutorEngine { + private Stack stack = new Stack<>(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod) { + + StackFrame frame = StackFrame.create(mainMethod); + stack.push(frame); + + while (!stack.empty()) { + StackFrame sf = stack.peek(); + ExecutionResult result = sf.execute(); + if (result.isPauseAndRunNewFrame()) { + Method nextMethod = result.getNextMethod(); + StackFrame nextMethodStackFrame = StackFrame.create(nextMethod); + nextMethodStackFrame.setCallerFrame(sf); + setupFunctionCallParams(sf, nextMethodStackFrame); + stack.push(nextMethodStackFrame); + } else stack.pop(); + } + + } + + private void setupFunctionCallParams(StackFrame currentFrame, StackFrame nextFrame) { + Method nextMethod = nextFrame.getMethod(); + List paramList = nextMethod.getParameterList(); + List values = new ArrayList<>(); + int paramNumber = paramList.size() + 1; + while (paramNumber > 0) { + values.add(currentFrame.getOprandStack().pop()); + paramNumber--; + } + Collections.reverse(values); + nextFrame.setLocalVariableTable(values); + + } +} diff --git a/group15/1507_977996067/src/task8/jvm/engine/Heap.java b/group15/1507_977996067/src/task8/jvm/engine/Heap.java new file mode 100644 index 0000000000..c3a551e88c --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package task8.jvm.engine; + +public class Heap { + + private Heap() { + + } + + public static Heap INSTANCE = new Heap(); + + public static Heap getInstance() { + return INSTANCE; + } + + public JavaObject newObject(String className) { + JavaObject object = new JavaObject(JavaObject.OBJECT); + object.setClassName(className); + return object; + } + + public JavaObject newString(String value) { + JavaObject object = new JavaObject(JavaObject.STRING); + object.setStringValue(value); + return object; + } + + public JavaObject newInt(int value) { + JavaObject object = new JavaObject(JavaObject.INT); + object.setIntValue(value); + return object; + } + + public JavaObject newFloat(int value) { + JavaObject object = new JavaObject(JavaObject.FLOAT); + object.setFloatValue(value); + return object; + } + +} diff --git a/group15/1507_977996067/src/task8/jvm/engine/JavaObject.java b/group15/1507_977996067/src/task8/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..596f3c058e --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/engine/JavaObject.java @@ -0,0 +1,81 @@ +package task8.jvm.engine; + +import java.util.Map; +import java.util.HashMap; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue) { + fieldValues.put(fieldName, fieldValue); + } + + public JavaObject(int type) { + this.type = type; + } + + public void setClassName(String className) { + this.className = className; + } + + public void setStringValue(String value) { + stringValue = value; + } + + public String getStringValue() { + return this.stringValue; + } + + public void setIntValue(int value) { + this.intValue = value; + } + + public int getIntValue() { + return this.intValue; + } + + public int getType() { + return type; + } + + public JavaObject getFieldValue(String fieldName) { + return this.fieldValues.get(fieldName); + } + + public String toString() { + switch (this.getType()) { + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className + ":" + this.fieldValues; + case FLOAT: + return String.valueOf(this.floatValue); + default: + return null; + } + } + + public String getClassName() { + return this.className; + } + + public void setFloatValue(float value) { + this.floatValue = value; + } +} diff --git a/group15/1507_977996067/src/task8/jvm/engine/MethodArea.java b/group15/1507_977996067/src/task8/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..d6757f12e2 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/engine/MethodArea.java @@ -0,0 +1,41 @@ +package task8.jvm.engine; + +import task8.jvm.clz.ClassFile; +import task8.jvm.constant.MethodRefInfo; +import task8.jvm.loader.ClassFileLoader; +import task8.jvm.method.Method; + +import java.util.HashMap; +import java.util.Map; + +public class MethodArea { + + private MethodArea() { + } + + private static MethodArea INSTANCE = new MethodArea(); + + private ClassFileLoader classFileLoader; + + Map map = new HashMap<>(); + + public static MethodArea getInstance() { + return INSTANCE; + } + + public Method getMainMethod(String className) { + return classFileLoader.loadClass(className).getMainMethod(); + } + + public Method getMethod(MethodRefInfo info) { + return classFileLoader.loadClass(info.getClassName()).getMethod(info.getMethodName(), info.getParamAndReturnType()); + } + + public ClassFileLoader getClassFileLoader() { + return classFileLoader; + } + + public void setClassFileLoader(ClassFileLoader classFileLoader) { + this.classFileLoader = classFileLoader; + } +} diff --git a/group15/1507_977996067/src/task8/jvm/engine/MiniJVM.java b/group15/1507_977996067/src/task8/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..63250e5815 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/engine/MiniJVM.java @@ -0,0 +1,18 @@ +package task8.jvm.engine; + +import task8.jvm.loader.ClassFileLoader; + +import java.util.Arrays; + +public class MiniJVM { + + public void run(String[] classpath, String className) throws Exception { + ClassFileLoader loader = new ClassFileLoader(); + Arrays.stream(classpath).forEach(loader::addClassPath); + MethodArea methodArea = MethodArea.getInstance(); + methodArea.setClassFileLoader(loader); + + ExecutorEngine executorEngine = new ExecutorEngine(); + executorEngine.execute(methodArea.getMainMethod(className.replaceAll("\\.", "/"))); + } +} diff --git a/group15/1507_977996067/src/task8/jvm/engine/StackFrame.java b/group15/1507_977996067/src/task8/jvm/engine/StackFrame.java new file mode 100644 index 0000000000..7763e0b78b --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/engine/StackFrame.java @@ -0,0 +1,106 @@ +package task8.jvm.engine; + +import task8.jvm.cmd.ByteCodeCommand; +import task8.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class StackFrame { + private List localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + public static StackFrame create(Method m) { + + StackFrame frame = new StackFrame(m); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + public JavaObject getLocalVariableValue(int index) { + return this.localVariableTable.get(index); + } + + public Stack getOprandStack() { + return this.oprandStack; + } + + public int getNextCommandIndex(int offset) { + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for (int i = 0; i < cmds.length; i++) { + if (cmds[i].getOffset() == offset) { + return i; + } + } + throw new RuntimeException("Can't find next command"); + } + + public ExecutionResult execute() { + ByteCodeCommand[] cmds = m.getCmds(); + int length = cmds.length; + + while (index < length) { + ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.RUN_NEXT_CMD); + cmds[index].execute(this, result); + + if (result.isRunNextCmd()) { + index++; + } else if (result.isExitCurrentFrame()) { + return result; + } else if (result.isPauseAndRunNewFrame()) { + index++; + return result; + } else if (result.isJump()) { + index = getNextCommandIndex(result.getNextCmdOffset()); + } else index++; + } + return null; + + } + + + public void setLocalVariableTable(List values) { + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo) { + //问题: 为什么要这么做?? + if (this.localVariableTable.size() - 1 < index) { + for (int i = this.localVariableTable.size(); i <= index; i++) { + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod() { + return m; + } +} diff --git a/group15/1507_977996067/src/task8/jvm/field/Field.java b/group15/1507_977996067/src/task8/jvm/field/Field.java new file mode 100644 index 0000000000..34a79aebca --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/field/Field.java @@ -0,0 +1,48 @@ +package task8.jvm.field; + + +import task8.jvm.constant.ConstantPool; +import task8.jvm.constant.UTF8Info; +import task8.jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private ConstantPool pool; + + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name + ":" + desc; + } + + + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { + + int accessFlag = iter.next2Bytes(); + int nameIndex = iter.next2Bytes(); + int descIndex = iter.next2Bytes(); + int attribCount = iter.next2Bytes(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex, pool); + + if (attribCount > 0) { + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task8/jvm/loader/ByteCodeIterator.java b/group15/1507_977996067/src/task8/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..cdd96f4953 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,56 @@ +package task8.jvm.loader; + +import task8.jvm.util.Util; + +import java.util.Arrays; + +public class ByteCodeIterator { + + private int position; + + private byte[] bytes; + + public ByteCodeIterator(byte[] bytes) { + this.bytes = bytes; + } + + public String getMagicNumber() { + position = 0; + byte[] bytes = Arrays.copyOf(this.bytes, 4); + position += 4; + return Util.byteToHexString(bytes); + } + + public int next2Bytes() { + return nextBytes(2); + } + + public int next4Bytes() { + return nextBytes(4); + } + + public int nextFlag() { + return nextBytes(1); + } + + public void back(int length) { + position -= length; + } + + public byte[] getBytes(int length) { + byte[] bytes = Arrays.copyOfRange(this.bytes, position, position + length); + position += length; + return bytes; + } + + public String nextUxToHexString(int length) { + return new String(getBytes(length)); + } + + private int nextBytes(int size) { + byte[] bytes = Arrays.copyOfRange(this.bytes, position, position + size); + position += size; + return Util.byteToInt(bytes); + } + +} diff --git a/group15/1507_977996067/src/task8/jvm/loader/ClassFileLoader.java b/group15/1507_977996067/src/task8/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..fad8a033a7 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/loader/ClassFileLoader.java @@ -0,0 +1,122 @@ +package task8.jvm.loader; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import task8.jvm.clz.ClassFile; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +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 < this.clzPaths.size(); i++) { + buffer.append(this.clzPaths.get(i)); + if (i < this.clzPaths.size() - 1) { + buffer.append(";"); + } + } + return buffer.toString(); + } + + private byte[] loadClassFile_V1(String clzFileName) { + + BufferedInputStream bis = null; + + try { + + File f = new File(clzFileName); + + + bis = new BufferedInputStream(new FileInputStream(f)); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + + byte[] buffer = new byte[1024]; + int length = -1; + + while ((length = bis.read(buffer)) != -1) { + bos.write(buffer, 0, length); + } + + byte[] codes = bos.toByteArray(); + + return codes; + + } catch (IOException e) { + e.printStackTrace(); + + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + + } + + +} \ No newline at end of file diff --git a/group15/1507_977996067/src/task8/jvm/loader/ClassFileParser.java b/group15/1507_977996067/src/task8/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..08e8ca3bfb --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/loader/ClassFileParser.java @@ -0,0 +1,112 @@ +package task8.jvm.loader; + +import task8.jvm.clz.AccessFlag; +import task8.jvm.clz.ClassFile; +import task8.jvm.clz.ClassIndex; +import task8.jvm.constant.*; +import task8.jvm.field.Field; +import task8.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFileParser { + + private ConstantPool constantPool; + + public ClassFile parse(byte[] codes) { + ClassFile classFile = new ClassFile(); + ByteCodeIterator iterator = new ByteCodeIterator(codes); + System.out.println(iterator.getMagicNumber()); + + classFile.setMinorVersion(iterator.next2Bytes()); + classFile.setMajorVersion(iterator.next2Bytes()); + + parseConstantPool(iterator); + classFile.setConstPool(constantPool); + classFile.setAccessFlag(parseAccessFlag(iterator)); + classFile.setClassIndex(parseClassIndex(iterator));//task5 over + + iterator.next2Bytes(); // interface + + classFile.setFields(parseFileds(iterator)); + classFile.setMethods(parseMethods(classFile, iterator));//task6 over + return classFile; + } + + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + return new AccessFlag(iter.next2Bytes()); + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + ClassIndex clazIndex = new ClassIndex(); + clazIndex.setThisClassIndex(iter.next2Bytes()); + clazIndex.setSuperClassIndex(iter.next2Bytes()); + return clazIndex; + } + + private void parseConstantPool(ByteCodeIterator iter) { + int poolCount = iter.next2Bytes(); + ConstantPool pool = new ConstantPool(poolCount); + for (int i = 0; i < poolCount; i++) { + int tag = iter.nextFlag(); + if (tag == ConstantInfo.UTF8_INFO) { //utf-8 + int length = iter.next2Bytes(); + byte[] bytes = iter.getBytes(length); + UTF8Info utf8Info = new UTF8Info(pool); + utf8Info.setValue(new String(bytes)); + utf8Info.setLength(length); + pool.addConstantInfo(utf8Info); + } else if (tag == ConstantInfo.STRING_INFO) { + StringInfo stringInfo = new StringInfo(pool); + stringInfo.setIndex(iter.next2Bytes()); + pool.addConstantInfo(stringInfo); + } else if (tag == ConstantInfo.CLASS_INFO) { + ClassInfo classInfo = new ClassInfo(pool); + classInfo.setUtf8Index(iter.next2Bytes()); + pool.addConstantInfo(classInfo); + } else if (tag == ConstantInfo.FIELD_INFO) { + FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); + fieldRefInfo.setClassInfoIndex(iter.next2Bytes()); + fieldRefInfo.setNameAndTypeIndex(iter.next2Bytes()); + pool.addConstantInfo(fieldRefInfo); + } else if (tag == ConstantInfo.METHOD_INFO) { + MethodRefInfo methodRefInfo = new MethodRefInfo(pool); + methodRefInfo.setClassInfoIndex(iter.next2Bytes()); + methodRefInfo.setNameAndTypeIndex(iter.next2Bytes()); + pool.addConstantInfo(methodRefInfo); + } else if (tag == ConstantInfo.NAME_AND_TYPE_INFO) { + NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); + nameAndTypeInfo.setIndex1(iter.next2Bytes()); + nameAndTypeInfo.setIndex2(iter.next2Bytes()); + pool.addConstantInfo(nameAndTypeInfo); + } + } + this.constantPool = pool; + } + + private List parseFileds(ByteCodeIterator iter) { + int fieldCount = iter.next2Bytes(); + + List fieldList = new ArrayList<>(fieldCount); + + for (int i = 0; i < fieldCount; i++) { + Field f = Field.parse(constantPool, iter); + fieldList.add(f); + } + return fieldList; + } + + private List parseMethods(ClassFile classFile, ByteCodeIterator iter) { + int methodCount = iter.next2Bytes(); + + List methodList = new ArrayList<>(methodCount); + + for (int i = 0; i < methodCount; i++) { + Method m = Method.parse(classFile, iter); + methodList.add(m); + } + return methodList; + } +} diff --git a/group15/1507_977996067/src/task8/jvm/method/Method.java b/group15/1507_977996067/src/task8/jvm/method/Method.java new file mode 100644 index 0000000000..049c6d6d3e --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/method/Method.java @@ -0,0 +1,107 @@ +package task8.jvm.method; + +import task8.jvm.attr.AttributeInfo; +import task8.jvm.attr.CodeAttr; +import task8.jvm.clz.ClassFile; +import task8.jvm.cmd.ByteCodeCommand; +import task8.jvm.constant.ConstantPool; +import task8.jvm.constant.UTF8Info; +import task8.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class Method { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlag = iter.next2Bytes(); + int nameIndex = iter.next2Bytes(); + int descIndex = iter.next2Bytes(); + int attribCount = iter.next2Bytes(); + + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + for (int j = 1; j <= attribCount; j++) { + + int attrNameIndex = iter.next2Bytes(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if (AttributeInfo.CODE.equalsIgnoreCase(attrName)) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else { + throw new RuntimeException("only CODE attribute is implemented , please implement the " + attrName); + } + } + return m; + } + + public List getParameterList() { + String paramType = ((UTF8Info) getClzFile().getConstantPool().getConstantInfo(getDescriptorIndex())).getValue(); + String param = paramType.substring(paramType.indexOf("("), paramType.lastIndexOf(")")); + List paramList = new ArrayList<>(); + while (!"".equalsIgnoreCase(param)) { + String params = param.substring(0, param.indexOf("L")); + paramList.add(params); + } + return paramList; + } + + public ByteCodeCommand[] getCmds() { + return new ByteCodeCommand[0]; + } +} diff --git a/group15/1507_977996067/src/task8/jvm/print/ClassFilePrinter.java b/group15/1507_977996067/src/task8/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..3e564b3be7 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/print/ClassFilePrinter.java @@ -0,0 +1,44 @@ +package task8.jvm.print; + +import task8.jvm.clz.ClassFile; +import task8.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + + public ClassFilePrinter(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public void print() { + + if (clzFile.getAccessFlag().isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name:" + clzFile.getClassName()); + + System.out.println("Super Class Name:" + clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + } + + public static void main(String[] args) { + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group15/1507_977996067/src/task8/jvm/print/ConstantInfoVisitor.java b/group15/1507_977996067/src/task8/jvm/print/ConstantInfoVisitor.java new file mode 100644 index 0000000000..00995c04d3 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/print/ConstantInfoVisitor.java @@ -0,0 +1,18 @@ +package task8.jvm.print; + +import task8.jvm.constant.*; + +public interface ConstantInfoVisitor { + + void visitClassInfo(ClassInfo classInfo); + + void visitFieldRefInfo(FieldRefInfo fieldRefInfo); + + void visitMethodRefInfo(MethodRefInfo methodRefInfo); + + void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo); + + void visitStringInfo(StringInfo stringInfo); + + void visitUtf8Info(UTF8Info utf8Info); +} diff --git a/group15/1507_977996067/src/task8/jvm/print/ConstantInfoVisitorImpl.java b/group15/1507_977996067/src/task8/jvm/print/ConstantInfoVisitorImpl.java new file mode 100644 index 0000000000..57938f9cff --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/print/ConstantInfoVisitorImpl.java @@ -0,0 +1,51 @@ +package task8.jvm.print; + +import task8.jvm.constant.*; + +public class ConstantInfoVisitorImpl implements ConstantInfoVisitor { + @Override + public void visitClassInfo(ClassInfo classInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("Class\t#").append(classInfo.getUtf8Index()).append("\t").append(classInfo.getClassName()); + System.out.println(sb); + } + + @Override + public void visitFieldRefInfo(FieldRefInfo fieldRefInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("FieldRef\t#").append(fieldRefInfo.getClassInfoIndex()).append("\t").append(fieldRefInfo.getFieldName()); + System.out.println(sb); + + } + + @Override + public void visitMethodRefInfo(MethodRefInfo methodRefInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("MethodRef\t#").append(methodRefInfo.getMethodName()); + System.out.println(sb); + } + + @Override + public void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("NameAndType\t#").append(nameAndTypeInfo.getName()).append("\t") + .append(nameAndTypeInfo.getIndex1()).append("\t") + .append(nameAndTypeInfo.getIndex2()).append("\t") + .append(nameAndTypeInfo.getTypeInfo()); + System.out.println(sb); + } + + @Override + public void visitStringInfo(StringInfo stringInfo) { + StringBuilder sb = new StringBuilder(); + sb.append("String\t#").append(stringInfo.getIndex()); + System.out.println(sb); + } + + @Override + public void visitUtf8Info(UTF8Info utf8Info) { + StringBuilder sb = new StringBuilder(); + sb.append("UTF8\t#").append(utf8Info.getValue()); + System.out.println(sb); + } +} diff --git a/group15/1507_977996067/src/task8/jvm/print/ConstantPoolPrinter.java b/group15/1507_977996067/src/task8/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..9d3437d40b --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,26 @@ +package task8.jvm.print; + +import task8.jvm.constant.ConstantInfo; +import task8.jvm.constant.ConstantPool; + +public class ConstantPoolPrinter { + + private ConstantPool pool; + + ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + + System.out.println("Constant Pool:"); + + ConstantInfoVisitor visitor = new ConstantInfoVisitorImpl(); + int size = (int) pool.getSize(); + for (int i = 0; i < size; i++) { + System.out.print("#" + i + "= "); + ConstantInfo constantInfo = pool.getConstantInfo(i); + constantInfo.accept(visitor); + } + } +} diff --git a/group15/1507_977996067/src/task8/jvm/test/ClassFileloaderTest.java b/group15/1507_977996067/src/task8/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..dc7a01b23f --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,191 @@ +package task8.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import task8.jvm.clz.ClassFile; +import task8.jvm.clz.ClassIndex; +import task8.jvm.constant.*; +import task8.jvm.loader.ClassFileLoader; + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "EmployeeV1"; + + static String path1 = "E:\\Idea\\coding2017\\group15\\1507_977996067\\out\\task5\\jvm\\test"; + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "EmployeeV1"; + + clzFile = loader.loadClass(className); +// clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1038, byteCodes.length); + + } + + + @Test + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; + + String actualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", actualValue); + } + + + private String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } + + /** + * ---------------------------------------------------------------------- + */ + + + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool() { + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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/group15/1507_977996067/src/task8/jvm/test/EmployeeV1.java b/group15/1507_977996067/src/task8/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..f3a0755de5 --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/test/EmployeeV1.java @@ -0,0 +1,29 @@ +package task8.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/group15/1507_977996067/src/task8/jvm/util/Util.java b/group15/1507_977996067/src/task8/jvm/util/Util.java new file mode 100644 index 0000000000..6b13997e4b --- /dev/null +++ b/group15/1507_977996067/src/task8/jvm/util/Util.java @@ -0,0 +1,23 @@ +package task8.jvm.util; + +public class Util { + public static int byteToInt(byte[] codes){ + String s1 = byteToHexString(codes); + return Integer.valueOf(s1, 16); + } + + + public static String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData; + + private int size; + //队头 读开始的位置 + private int front = 0; + //队尾 写开始的位置 + private int rear = 0; + + public CircleQueue() { + elementData = new Object[DEFAULT_SIZE]; + size = DEFAULT_SIZE; + } + + public CircleQueue(int size) { + this.size = size; + elementData = new Object[size]; + } + + public boolean isEmpty() { + return front == rear; + } + + public int size() { + if (isEmpty()) { + return 0; + } + return rear > front ? rear - front : size - (front - rear); + } + + + public void enQueue(E data) { + int rearPosition = rear; + elementData[rearPosition++] = data; + rear = rearPosition % size; + } + + public E deQueue() { + if (isEmpty()) { + return null; + } + int frontPosition = front; + E dataToDeQueue = (E) elementData[frontPosition--]; + front = frontPosition < 0 ? frontPosition + size : frontPosition; + return dataToDeQueue; + } +} diff --git a/group15/1507_977996067/src/task8/queue/Josephus.java b/group15/1507_977996067/src/task8/queue/Josephus.java new file mode 100644 index 0000000000..1a01cb0018 --- /dev/null +++ b/group15/1507_977996067/src/task8/queue/Josephus.java @@ -0,0 +1,28 @@ +package task8.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 约瑟夫环 + */ +public class Josephus { + + public static List execute(int n, int m) { + + CircleQueue queue = new CircleQueue<>(n); + for (int i = 0; i < n; i++) { + queue.enQueue(i); + } + + List resultList = new ArrayList<>(n); + int flag = 0; + while (!queue.isEmpty()) { + flag++; + if (flag % m == 0) { + resultList.add(queue.deQueue()); + } + } + return resultList; + } +} diff --git a/group15/1507_977996067/src/task8/queue/QueueWithTwoStacks.java b/group15/1507_977996067/src/task8/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..6a67fef0e8 --- /dev/null +++ b/group15/1507_977996067/src/task8/queue/QueueWithTwoStacks.java @@ -0,0 +1,41 @@ +package task8.queue; + +import java.util.Stack; + +public class QueueWithTwoStacks { + + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack<>(); + stack2 = new Stack<>(); + } + + + public boolean isEmpty() { + return stack1.isEmpty(); + } + + + public int size() { + return stack1.size(); + } + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + E itemToPop = stack2.pop(); + while (!stack2.isEmpty()) { + stack1.push(stack2.pop()); + } + return itemToPop; + } +} From e47de6cbfddb7bc6c9c75768c3f41dd0b157c936 Mon Sep 17 00:00:00 2001 From: HuiZhou-Xmu <1814014897@qq.com> Date: Sun, 30 Apr 2017 17:29:27 +0800 Subject: [PATCH 361/552] =?UTF-8?q?=E7=AC=AC=E4=B8=83=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=EF=BC=88javap(=E5=B8=B8=E9=87=8F=E6=B1=A0)=E3=80=81?= =?UTF-8?q?=E5=AD=97=E8=8A=82=E7=A0=81=E8=AF=BB=E5=8F=96=E3=80=81=E5=89=8D?= =?UTF-8?q?/=E4=B8=AD/=E5=90=8E=E7=BC=80=E8=A1=A8=E8=BE=BE=E5=BC=8F?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhouhui/src/week07/expr/InfixExpr.java | 66 ++++ .../src/week07/expr/InfixToPostfix.java | 34 ++ .../zhouhui/src/week07/expr/PostfixExpr.java | 48 +++ .../zhouhui/src/week07/expr/PrefixExpr.java | 52 +++ .../zhouhui/src/week07/expr/Token.java | 50 +++ .../zhouhui/src/week07/expr/TokenParser.java | 57 +++ .../zhouhui/src/week07/expr/test/AllTest.java | 18 + .../src/week07/expr/test/InfixExprTest.java | 54 +++ .../week07/expr/test/InfixToPostfixTest.java | 32 ++ .../src/week07/expr/test/PostfixExprTest.java | 43 +++ .../src/week07/expr/test/PrefixExprTest.java | 47 +++ .../src/week07/expr/test/TokenParserTest.java | 42 +++ .../src/week07/jvm/attr/AttributeInfo.java | 19 + .../zhouhui/src/week07/jvm/attr/CodeAttr.java | 116 ++++++ .../src/week07/jvm/attr/LineNumberTable.java | 66 ++++ .../week07/jvm/attr/LocalVariableItem.java | 39 ++ .../week07/jvm/attr/LocalVariableTable.java | 55 +++ .../src/week07/jvm/attr/StackMapTable.java | 30 ++ .../src/week07/jvm/clz/AccessFlag.java | 25 ++ .../zhouhui/src/week07/jvm/clz/ClassFile.java | 117 ++++++ .../src/week07/jvm/clz/ClassIndex.java | 19 + .../zhouhui/src/week07/jvm/cmd/BiPushCmd.java | 23 ++ .../src/week07/jvm/cmd/ByteCodeCommand.java | 128 +++++++ .../src/week07/jvm/cmd/CommandParser.java | 147 ++++++++ .../src/week07/jvm/cmd/GetFieldCmd.java | 22 ++ .../src/week07/jvm/cmd/GetStaticFieldCmd.java | 23 ++ .../src/week07/jvm/cmd/InvokeSpecialCmd.java | 23 ++ .../src/week07/jvm/cmd/InvokeVirtualCmd.java | 22 ++ .../zhouhui/src/week07/jvm/cmd/LdcCmd.java | 29 ++ .../src/week07/jvm/cmd/NewObjectCmd.java | 19 + .../src/week07/jvm/cmd/NoOperandCmd.java | 23 ++ .../src/week07/jvm/cmd/OneOperandCmd.java | 27 ++ .../src/week07/jvm/cmd/PutFieldCmd.java | 19 + .../src/week07/jvm/cmd/TwoOperandCmd.java | 67 ++++ .../src/week07/jvm/constant/ClassInfo.java | 28 ++ .../src/week07/jvm/constant/ConstantInfo.java | 40 ++ .../src/week07/jvm/constant/ConstantPool.java | 31 ++ .../src/week07/jvm/constant/FieldRefInfo.java | 58 +++ .../week07/jvm/constant/MethodRefInfo.java | 60 +++ .../week07/jvm/constant/NameAndTypeInfo.java | 51 +++ .../week07/jvm/constant/NullConstantInfo.java | 17 + .../src/week07/jvm/constant/StringInfo.java | 32 ++ .../src/week07/jvm/constant/UTF8Info.java | 37 ++ .../zhouhui/src/week07/jvm/field/Field.java | 50 +++ .../week07/jvm/loader/ByteCodeIterator.java | 57 +++ .../week07/jvm/loader/ClassFileLoader.java | 140 +++++++ .../week07/jvm/loader/ClassFileParser.java | 176 +++++++++ .../zhouhui/src/week07/jvm/method/Method.java | 101 +++++ .../week07/jvm/print/ClassFilePrinter.java | 51 +++ .../week07/jvm/print/ConstantPoolPrinter.java | 104 +++++ .../week07/jvm/test/ClassFileloaderTest.java | 354 ++++++++++++++++++ .../src/week07/jvm/test/EmployeeV1.java | 28 ++ .../zhouhui/src/week07/jvm/util/Util.java | 24 ++ 53 files changed, 3040 insertions(+) create mode 100644 group01/1814014897/zhouhui/src/week07/expr/InfixExpr.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/InfixToPostfix.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/PostfixExpr.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/PrefixExpr.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/Token.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/TokenParser.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/test/AllTest.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/test/InfixExprTest.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/test/InfixToPostfixTest.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/test/PostfixExprTest.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/test/PrefixExprTest.java create mode 100644 group01/1814014897/zhouhui/src/week07/expr/test/TokenParserTest.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/attr/AttributeInfo.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/attr/CodeAttr.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/attr/LineNumberTable.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/attr/LocalVariableItem.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/attr/LocalVariableTable.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/attr/StackMapTable.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/clz/AccessFlag.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/clz/ClassFile.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/clz/ClassIndex.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/BiPushCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/ByteCodeCommand.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/CommandParser.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/GetFieldCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/LdcCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/NewObjectCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/NoOperandCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/OneOperandCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/PutFieldCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/cmd/TwoOperandCmd.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/ClassInfo.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/ConstantInfo.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/ConstantPool.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/FieldRefInfo.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/MethodRefInfo.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/NameAndTypeInfo.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/NullConstantInfo.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/StringInfo.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/constant/UTF8Info.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/field/Field.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/loader/ByteCodeIterator.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/loader/ClassFileLoader.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/loader/ClassFileParser.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/method/Method.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/print/ClassFilePrinter.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/print/ConstantPoolPrinter.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/test/ClassFileloaderTest.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/test/EmployeeV1.java create mode 100644 group01/1814014897/zhouhui/src/week07/jvm/util/Util.java diff --git a/group01/1814014897/zhouhui/src/week07/expr/InfixExpr.java b/group01/1814014897/zhouhui/src/week07/expr/InfixExpr.java new file mode 100644 index 0000000000..80bef68a98 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/InfixExpr.java @@ -0,0 +1,66 @@ +package week07.expr; + +import java.util.List; +import java.util.Stack; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for (Token token : tokens) { + if (token.isOperator()) { + if (opStack.isEmpty()) { + opStack.push(token); + } else { + while (!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())) { + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1, f2); + numStack.push(result); + } + opStack.push(token); + } + } + if (token.isNumber()) { + + numStack.push(new Float(token.getIntValue())); + } + } + + while (!opStack.isEmpty()) { + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + if (op.equals("-")) { + return f1 - f2; + } + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/InfixToPostfix.java b/group01/1814014897/zhouhui/src/week07/expr/InfixToPostfix.java new file mode 100644 index 0000000000..dcaaea756c --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/InfixToPostfix.java @@ -0,0 +1,34 @@ +package week07.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + List inFixTokens = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList<>(); + + Stack opStack = new Stack(); + + for (Token token : inFixTokens) { + if (token.isOperator()) { + while (!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())) { + postFixTokens.add(opStack.pop()); + } + opStack.push(token); + } + if (token.isNumber()) { + postFixTokens.add(token); + } + } + + while (!opStack.isEmpty()) { + postFixTokens.add(opStack.pop()); + } + return postFixTokens; + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/PostfixExpr.java b/group01/1814014897/zhouhui/src/week07/expr/PostfixExpr.java new file mode 100644 index 0000000000..1a20114483 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/PostfixExpr.java @@ -0,0 +1,48 @@ +package week07.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack numStack = new Stack<>(); + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push(new Float(token.getIntValue())); + } else if (token.isOperator()) { + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(token.toString(), f1, f2); + numStack.push(result); + } + } + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + if (op.equals("-")) { + return f1 - f2; + } + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/PrefixExpr.java b/group01/1814014897/zhouhui/src/week07/expr/PrefixExpr.java new file mode 100644 index 0000000000..b2949c9236 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/PrefixExpr.java @@ -0,0 +1,52 @@ +package week07.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for (Token token : tokens) { + exprStack.push(token); + } + + while (!exprStack.isEmpty()) { + if (exprStack.peek().isNumber()) { + numStack.push(new Float(exprStack.pop().getIntValue())); + } else if (exprStack.peek().isOperator()) { + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + Float result = calculate(exprStack.pop().toString(), f1, f2); + numStack.push(result); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + if (op.equals("-")) { + return f1 - f2; + } + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + "is not supported"); + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/Token.java b/group01/1814014897/zhouhui/src/week07/expr/Token.java new file mode 100644 index 0000000000..b0767745dc --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/Token.java @@ -0,0 +1,50 @@ +package week07.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group01/1814014897/zhouhui/src/week07/expr/TokenParser.java b/group01/1814014897/zhouhui/src/week07/expr/TokenParser.java new file mode 100644 index 0000000000..57a1935d9c --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/TokenParser.java @@ -0,0 +1,57 @@ +package week07.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/test/AllTest.java b/group01/1814014897/zhouhui/src/week07/expr/test/AllTest.java new file mode 100644 index 0000000000..9980592a25 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/test/AllTest.java @@ -0,0 +1,18 @@ +package week07.expr.test; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ + InfixExprTest.class, + InfixToPostfixTest.class, + PostfixExprTest.class, + PrefixExprTest.class, + TokenParserTest.class +}) + +public class AllTest { + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/test/InfixExprTest.java b/group01/1814014897/zhouhui/src/week07/expr/test/InfixExprTest.java new file mode 100644 index 0000000000..36b4ab5bfd --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/test/InfixExprTest.java @@ -0,0 +1,54 @@ +package week07.expr.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week07.expr.InfixExpr; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/test/InfixToPostfixTest.java b/group01/1814014897/zhouhui/src/week07/expr/test/InfixToPostfixTest.java new file mode 100644 index 0000000000..960116775a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/test/InfixToPostfixTest.java @@ -0,0 +1,32 @@ +package week07.expr.test; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import week07.expr.InfixToPostfix; +import week07.expr.Token; + +public class InfixToPostfixTest { + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/test/PostfixExprTest.java b/group01/1814014897/zhouhui/src/week07/expr/test/PostfixExprTest.java new file mode 100644 index 0000000000..0ca382ae07 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/test/PostfixExprTest.java @@ -0,0 +1,43 @@ +package week07.expr.test; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week07.expr.PostfixExpr; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/test/PrefixExprTest.java b/group01/1814014897/zhouhui/src/week07/expr/test/PrefixExprTest.java new file mode 100644 index 0000000000..c955223e3a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/test/PrefixExprTest.java @@ -0,0 +1,47 @@ +package week07.expr.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week07.expr.PrefixExpr; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/expr/test/TokenParserTest.java b/group01/1814014897/zhouhui/src/week07/expr/test/TokenParserTest.java new file mode 100644 index 0000000000..0a9fa7ea50 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/expr/test/TokenParserTest.java @@ -0,0 +1,42 @@ +package week07.expr.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week07.expr.Token; +import week07.expr.TokenParser; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/attr/AttributeInfo.java b/group01/1814014897/zhouhui/src/week07/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..dd82595dcf --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package week07.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/attr/CodeAttr.java b/group01/1814014897/zhouhui/src/week07/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..60d542bb4e --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/attr/CodeAttr.java @@ -0,0 +1,116 @@ +package week07.jvm.attr; + +import week07.jvm.attr.AttributeInfo; +import week07.jvm.attr.CodeAttr; +import week07.jvm.attr.LineNumberTable; +import week07.jvm.attr.LocalVariableTable; +import week07.jvm.attr.StackMapTable; +import week07.jvm.clz.ClassFile; +import week07.jvm.cmd.ByteCodeCommand; +import week07.jvm.cmd.CommandParser; +import week07.jvm.constant.ConstantPool; +import week07.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, + ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code,cmds); + + int exceptionTableLen = iter.nextU2ToInt(); + + if (exceptionTableLen > 0) { + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table,just ignore it"); + } + + int subAttrCount = iter.nextU2ToInt(); + + for (int i = 1; i <= subAttrCount; i++) { + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + iter.back(2); + + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + } + + return codeAttr; + } + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + // buffer.append("Code:").append(code).append("\n"); + for (int i = 0; i < cmds.length; i++) { + buffer.append(cmds[i].toString(pool)).append("\n"); + } + buffer.append("\n"); + buffer.append(this.lineNumTable.toString()); + buffer.append(this.localVarTable.toString(pool)); + return buffer.toString(); + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/attr/LineNumberTable.java b/group01/1814014897/zhouhui/src/week07/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..739b36df5b --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/attr/LineNumberTable.java @@ -0,0 +1,66 @@ +package week07.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import week07.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index, len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1;i<=itemLen;i++){ + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/attr/LocalVariableItem.java b/group01/1814014897/zhouhui/src/week07/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..89b58e9e37 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package week07.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/attr/LocalVariableTable.java b/group01/1814014897/zhouhui/src/week07/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..a46a869204 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/attr/LocalVariableTable.java @@ -0,0 +1,55 @@ +package week07.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import week07.jvm.constant.ConstantPool; + +import week07.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo { + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter) { + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index, len); + + int itemLen = iter.nextU2ToInt(); + + for (int i = 1; i <= itemLen; i++) { + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + + return table; + } + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for (LocalVariableItem item : items) { + buffer.append("startPC:" + item.getStartPC()).append(","); + buffer.append("name:" + pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:" + pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:" + item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/attr/StackMapTable.java b/group01/1814014897/zhouhui/src/week07/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..ce1fbc29e1 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package week07.jvm.attr; + + +import week07.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/clz/AccessFlag.java b/group01/1814014897/zhouhui/src/week07/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..1c35da64b1 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package week07.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/group01/1814014897/zhouhui/src/week07/jvm/clz/ClassFile.java b/group01/1814014897/zhouhui/src/week07/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..ef3bce8927 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/clz/ClassFile.java @@ -0,0 +1,117 @@ +package week07.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import week07.jvm.constant.ClassInfo; +import week07.jvm.constant.ConstantPool; +import week07.jvm.field.Field; +import week07.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + for(Method m : methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + public Method getMainMethod(){ + for(Method m : methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ + return m; + } + } + return null; + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/clz/ClassIndex.java b/group01/1814014897/zhouhui/src/week07/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..4424c8b794 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package week07.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/group01/1814014897/zhouhui/src/week07/jvm/cmd/BiPushCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..3ed63a3118 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantInfo; +import week07.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/ByteCodeCommand.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..621c63291a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package week07.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantInfo; +import week07.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/CommandParser.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..68c9187f05 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/CommandParser.java @@ -0,0 +1,147 @@ +package week07.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import week07.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if (codes == null || codes.length() == 0) { + throw new RuntimeException("error codes"); + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + }else{ + throw new RuntimeException("the code instruction " + opCode + " has not been implemented."); + } + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/GetFieldCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..a548e7acd7 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/GetStaticFieldCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..8b58120066 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ClassInfo; +import week07.jvm.constant.ConstantPool; +import week07.jvm.constant.FieldRefInfo; +import week07.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/InvokeSpecialCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..e8a4513467 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantPool; +import week07.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/InvokeVirtualCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..54f4e4eafd --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/LdcCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..3616fb71a8 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantInfo; +import week07.jvm.constant.ConstantPool; +import week07.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/NewObjectCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..862b8a31d5 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/NoOperandCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..ac15f21216 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/OneOperandCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..f90f652625 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/PutFieldCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..140f5f2326 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/cmd/TwoOperandCmd.java b/group01/1814014897/zhouhui/src/week07/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..51261db877 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package week07.jvm.cmd; + +import week07.jvm.clz.ClassFile; +import week07.jvm.constant.ClassInfo; +import week07.jvm.constant.ConstantInfo; +import week07.jvm.constant.ConstantPool; +import week07.jvm.constant.FieldRefInfo; +import week07.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/ClassInfo.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..b7a7a40ef4 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package week07.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/ConstantInfo.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..201bfaeb49 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package week07.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/ConstantPool.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..5d039834b1 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package week07.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/FieldRefInfo.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..74b5537b93 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package week07.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/MethodRefInfo.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..00b9a4cfa8 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package week07.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/NameAndTypeInfo.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..433c000fa2 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package week07.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/NullConstantInfo.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..05e75bda77 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package week07.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/StringInfo.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..cdc171fbad --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package week07.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/constant/UTF8Info.java b/group01/1814014897/zhouhui/src/week07/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..cc8e0e6d66 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package week07.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/field/Field.java b/group01/1814014897/zhouhui/src/week07/jvm/field/Field.java new file mode 100644 index 0000000000..dc1819f557 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/field/Field.java @@ -0,0 +1,50 @@ +package week07.jvm.field; + +import week07.jvm.constant.ConstantPool; +import week07.jvm.constant.UTF8Info; +import week07.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/loader/ByteCodeIterator.java b/group01/1814014897/zhouhui/src/week07/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..4585526a3c --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package week07.jvm.loader; + +import java.util.Arrays; + +import week07.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/loader/ClassFileLoader.java b/group01/1814014897/zhouhui/src/week07/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..98e0194303 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package week07.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 week07.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")){ + s3 = "//" + info.getClassName() + ".\"" + info.getMethodName() + "\":" + + info.getParamAndReturnType(); + }else{ + s3 = "//" + info.getClassName() + "." + info.getMethodName() + ":" + + info.getParamAndReturnType(); + } + f.format("%-20s %-15s %-50s\n", s1, s2, s3); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + Formatter f = new Formatter(System.out); + String s1 = "NameAndType"; + String s2 = "#" + info.getIndex1() + ":#" + info.getIndex2(); + String s3; + if (info.getName().equals("")) { + s3 = "//" + "\"" + info.getName() + "\"" + ":" + info.getTypeInfo(); + } else { + s3 = "//" + info.getName() + ":" + info.getTypeInfo(); + } + f.format("%-20s %-15s %-50s\n", s1, s2, s3); + } + + @Override + public void visitString(StringInfo info) { + Formatter f = new Formatter(System.out); + String s1 = "String"; + String s2 = "#" + info.getIndex(); + String s3 = "//" + info.toString(); + f.format("%-20s %-15s %-50s\n", s1, s2, s3); + + } + + @Override + public void visistUTF8(UTF8Info info) { + Formatter f = new Formatter(System.out); + String s1 = "Utf8"; + String s2 = info.getValue(); + f.format("%-20s %-15s\n", s1, s2); + } + }; + + for (int i = 1; i <= pool.getSize(); i++) { + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.printf("#%-2d = ", i); + constantInfo.accept(visitor); + } + + } +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/test/ClassFileloaderTest.java b/group01/1814014897/zhouhui/src/week07/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..1a15e99610 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,354 @@ +package week07.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week07.jvm.clz.ClassFile; +import week07.jvm.clz.ClassIndex; +import week07.jvm.cmd.BiPushCmd; +import week07.jvm.cmd.ByteCodeCommand; +import week07.jvm.cmd.OneOperandCmd; +import week07.jvm.cmd.TwoOperandCmd; +import week07.jvm.constant.ClassInfo; +import week07.jvm.constant.ConstantPool; +import week07.jvm.constant.MethodRefInfo; +import week07.jvm.constant.NameAndTypeInfo; +import week07.jvm.constant.UTF8Info; +import week07.jvm.field.Field; +import week07.jvm.loader.ClassFileLoader; +import week07.jvm.method.Method; + + + + + +public class ClassFileloaderTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "week07/jvm/test/EmployeeV1"; + + static String path1 = (""+ClassLoader.getSystemResource("")).replaceAll("file:/" , ""); + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "week07.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "week07.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1040, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "week07.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group01/1814014897/zhouhui/src/week07/jvm/test/EmployeeV1.java b/group01/1814014897/zhouhui/src/week07/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..00f90183c9 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package week07.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/group01/1814014897/zhouhui/src/week07/jvm/util/Util.java b/group01/1814014897/zhouhui/src/week07/jvm/util/Util.java new file mode 100644 index 0000000000..d2cb5d2cc5 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week07/jvm/util/Util.java @@ -0,0 +1,24 @@ +package week07.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 Date: Sun, 30 Apr 2017 17:40:11 +0800 Subject: [PATCH 362/552] debug jvm executing engine --- .../src/main/java/jvm/ClassFileLoader.java | 3 + .../java/jvm/classfile/method/Method.java | 160 +++++++++--------- .../java/jvm/command/item/impl/DupCmd.java | 2 +- .../src/main/java/jvm/engine/JavaObject.java | 12 ++ .../src/main/java/jvm/engine/StackFrame.java | 8 - 5 files changed, 97 insertions(+), 88 deletions(-) diff --git a/group01/895457260/code/src/main/java/jvm/ClassFileLoader.java b/group01/895457260/code/src/main/java/jvm/ClassFileLoader.java index ade626ad83..cb080512f1 100644 --- a/group01/895457260/code/src/main/java/jvm/ClassFileLoader.java +++ b/group01/895457260/code/src/main/java/jvm/ClassFileLoader.java @@ -43,6 +43,9 @@ public byte[] readBinaryCode(String className) throws ReadClassException { private File getClassFile(String className) throws ClassDuplicateException { int split = className.lastIndexOf('.'); + if (split == -1) { + split = className.lastIndexOf('/'); + } String fileName = className.substring(split + 1) + ".class"; String subPath = className.substring(0, split).replaceAll("[.]", "/"); List files = new ArrayList<>(); diff --git a/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java b/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java index 4928bcc324..bea02fb082 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java @@ -17,83 +17,85 @@ import java.util.List; public class Method { - private AccessFlag accessFlag; - private int nameIndex; - private int descriptorIndex; - private ConstantPool constantPool; - private List attributes = new ArrayList<>(); - private ByteCodeCommand[] commands; - - public Method(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool constantPool) { - this.accessFlag = new AccessFlag(accessFlag); - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.constantPool = constantPool; - } - - public static Method parse(ByteCodeIterator iterator, ClassFile classFile) { - int access = iterator.nextU2ToInt(); - int name = iterator.nextU2ToInt(); - int descriptor = iterator.nextU2ToInt(); - int attrCount = iterator.nextU2ToInt(); - Method result = new Method(access, name, descriptor, classFile.getConstantPool()); - for (int i = 0; i < attrCount; ++i) { - result.attributes.add(AttributeParser.parse(iterator, classFile.getConstantPool())); - } - CodeAttr codeAttr = (CodeAttr) result.attributes.stream() - .filter(a -> a instanceof CodeAttr).findFirst().orElse(null); - if (codeAttr != null) { - result.commands = CommandParser.parse(classFile, codeAttr.getCode()); - } - return result; - } - - public String[] getParamTypes() { - String[] split = Arrays.stream(getParamAndReturnType().split("[)(L;]")) - .filter(s -> !"".equals(s)) - .toArray(String[]::new); - - List result = new ArrayList<>(); - Arrays.stream(split).forEach(s -> - result.add(s.length() == 1 ? - TypeUtils.parse(s) : s)); - - return result.toArray(new String[result.size()]); - } - - public int getParamCount() { - return getParamTypes().length; - } - - public AccessFlag getAccessFlag() { - return accessFlag; - } - - public ConstantPool getConstantPool() { - return constantPool; - } - - public int getNameIndex() { - return nameIndex; - } - - public List getAttributes() { - return attributes; - } - - public int getDescriptorIndex() { - return descriptorIndex; - } - - public ByteCodeCommand[] getCommands() { - return commands; - } - - public String getName() { - return ((UTF8Info) getConstantPool().getConstantInfo(getNameIndex())).getValue(); - } - - public String getParamAndReturnType() { - return ((UTF8Info) getConstantPool().getConstantInfo(getDescriptorIndex())).getValue(); - } + private AccessFlag accessFlag; + private int nameIndex; + private int descriptorIndex; + private ConstantPool constantPool; + private List attributes = new ArrayList<>(); + private ByteCodeCommand[] commands; + + public Method(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool constantPool) { + this.accessFlag = new AccessFlag(accessFlag); + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.constantPool = constantPool; + } + + public static Method parse(ByteCodeIterator iterator, ClassFile classFile) { + int access = iterator.nextU2ToInt(); + int name = iterator.nextU2ToInt(); + int descriptor = iterator.nextU2ToInt(); + int attrCount = iterator.nextU2ToInt(); + Method result = new Method(access, name, descriptor, classFile.getConstantPool()); + for (int i = 0; i < attrCount; ++i) { + result.attributes.add(AttributeParser.parse(iterator, classFile.getConstantPool())); + } + CodeAttr codeAttr = (CodeAttr) result.attributes.stream() + .filter(a -> a instanceof CodeAttr).findFirst().orElse(null); + if (codeAttr != null) { + result.commands = CommandParser.parse(classFile, codeAttr.getCode()); + } + return result; + } + + public String[] getParamTypes() { + String str = getParamAndReturnType(); + str = str.substring(str.indexOf('(') + 1, str.lastIndexOf(')')); + String[] split = Arrays.stream(str.split("[L;]")) + .filter(s -> !"".equals(s)) + .toArray(String[]::new); + + List result = new ArrayList<>(); + Arrays.stream(split).forEach(s -> + result.add(s.length() == 1 ? + TypeUtils.parse(s) : s)); + + return result.toArray(new String[result.size()]); + } + + public int getParamCount() { + return getParamTypes().length; + } + + public AccessFlag getAccessFlag() { + return accessFlag; + } + + public ConstantPool getConstantPool() { + return constantPool; + } + + public int getNameIndex() { + return nameIndex; + } + + public List getAttributes() { + return attributes; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public ByteCodeCommand[] getCommands() { + return commands; + } + + public String getName() { + return ((UTF8Info) getConstantPool().getConstantInfo(getNameIndex())).getValue(); + } + + public String getParamAndReturnType() { + return ((UTF8Info) getConstantPool().getConstantInfo(getDescriptorIndex())).getValue(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java index 3543bc4f37..4ce44270f0 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java @@ -24,6 +24,6 @@ public String toString() { @Override public void execute(StackFrame frame, ExecutionResult result) { JavaObject object = frame.getOperandStack().peek(); - frame.getOperandStack().push(object); + frame.getOperandStack().push(new JavaObject(object)); } } diff --git a/group01/895457260/code/src/main/java/jvm/engine/JavaObject.java b/group01/895457260/code/src/main/java/jvm/engine/JavaObject.java index 8e6066755e..6d1379ad89 100644 --- a/group01/895457260/code/src/main/java/jvm/engine/JavaObject.java +++ b/group01/895457260/code/src/main/java/jvm/engine/JavaObject.java @@ -74,4 +74,16 @@ public String getClassName() { public void setFloatValue(float value) { this.floatValue = value; } + + public JavaObject(JavaObject object) { + type = object.type; + className = object.className; + stringValue = object.stringValue; + intValue = object.intValue; + floatValue = object.floatValue; + fieldValues = new HashMap<>(); + for (Map.Entry entry : fieldValues.entrySet()) { + fieldValues.put(entry.getKey(), new JavaObject(entry.getValue())); + } + } } diff --git a/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java b/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java index 6313623b34..8807caa37f 100644 --- a/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java +++ b/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java @@ -1,7 +1,5 @@ package jvm.engine; -import jvm.classfile.ConstantPool; -import jvm.classfile.constant.item.impl.MethodRefInfo; import jvm.classfile.method.Method; import jvm.command.item.ByteCodeCommand; import jvm.command.item.TwoOperandCmd; @@ -36,12 +34,6 @@ public ExecutionResult execute() throws ReadClassException { if (result.isExitCurrentFrame()) { return result; } else if (result.isPauseAndRunNewFrame()) { - TwoOperandCmd invokeCmd = (TwoOperandCmd) cmd; - int methodIndex = (invokeCmd.getOperand1() << 8) | invokeCmd.getOperand2(); - ConstantPool constantPool = getMethod().getConstantPool(); - MethodRefInfo next = (MethodRefInfo) constantPool.getConstantInfo(methodIndex); - Method nextMethod = MethodArea.getInstance().getMethod(next); - result.setNextMethod(nextMethod); return result; } else if (result.isJump()) { TwoOperandCmd jumpCmd = (TwoOperandCmd) cmd; From 04ed6b5a9a9c17b3ebc7cbf57ca989ac8e853e20 Mon Sep 17 00:00:00 2001 From: zheng <765324639@qq.com> Date: Sun, 30 Apr 2017 19:07:26 +0800 Subject: [PATCH 363/552] =?UTF-8?q?jvm=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group01/765324639/pom.xml | 53 +++++--- .../src/main/java/minijvm/attr/CodeAttr.java | 2 +- .../src/main/java/minijvm/cmd/BiPushCmd.java | 15 ++- .../java/minijvm/cmd/ByteCodeCommand.java | 52 +++++--- .../main/java/minijvm/cmd/CommandParser.java | 3 +- .../main/java/minijvm/cmd/GetFieldCmd.java | 18 ++- .../java/minijvm/cmd/GetStaticFieldCmd.java | 25 +++- .../java/minijvm/cmd/InvokeSpecialCmd.java | 26 +++- .../java/minijvm/cmd/InvokeVirtualCmd.java | 53 +++++++- .../src/main/java/minijvm/cmd/LdcCmd.java | 23 +++- .../main/java/minijvm/cmd/NewObjectCmd.java | 20 +++- .../main/java/minijvm/cmd/NoOperandCmd.java | 71 ++++++++++- .../main/java/minijvm/cmd/PutFieldCmd.java | 24 +++- .../main/java/minijvm/cmd/TwoOperandCmd.java | 9 +- .../java/minijvm/engine/ExecutionResult.java | 53 ++++++++ .../java/minijvm/engine/ExecutorEngine.java | 61 ++++++++++ .../src/main/java/minijvm/engine/Heap.java | 39 ++++++ .../main/java/minijvm/engine/JavaObject.java | 72 +++++++++++ .../main/java/minijvm/engine/MethodArea.java | 77 ++++++++++++ .../src/main/java/minijvm/engine/MiniJVM.java | 28 +++++ .../main/java/minijvm/engine/StackFrame.java | 113 ++++++++++++++++++ .../src/main/java/minijvm/method/Method.java | 47 ++++++++ .../test/java/minijvm/loader/MiniJVMTest.java | 30 +++++ 23 files changed, 851 insertions(+), 63 deletions(-) create mode 100644 group01/765324639/src/main/java/minijvm/engine/ExecutionResult.java create mode 100644 group01/765324639/src/main/java/minijvm/engine/ExecutorEngine.java create mode 100644 group01/765324639/src/main/java/minijvm/engine/Heap.java create mode 100644 group01/765324639/src/main/java/minijvm/engine/JavaObject.java create mode 100644 group01/765324639/src/main/java/minijvm/engine/MethodArea.java create mode 100644 group01/765324639/src/main/java/minijvm/engine/MiniJVM.java create mode 100644 group01/765324639/src/main/java/minijvm/engine/StackFrame.java create mode 100644 group01/765324639/src/test/java/minijvm/loader/MiniJVMTest.java diff --git a/group01/765324639/pom.xml b/group01/765324639/pom.xml index 24816f0f3f..5b30da402c 100644 --- a/group01/765324639/pom.xml +++ b/group01/765324639/pom.xml @@ -1,18 +1,37 @@ - - 4.0.0 - com.zavier - 765324639Learning - 0.0.1-SNAPSHOT - - - junit - junit - 4.12 - - - dom4j - dom4j - 1.6.1 - - + + 4.0.0 + com.zavier + 765324639Learning + 0.0.1-SNAPSHOT + + + junit + junit + 4.12 + + + dom4j + dom4j + 1.6.1 + + + org.apache.commons + commons-lang3 + 3.5 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + \ No newline at end of file diff --git a/group01/765324639/src/main/java/minijvm/attr/CodeAttr.java b/group01/765324639/src/main/java/minijvm/attr/CodeAttr.java index 43a02cfa48..fcef4cdb7f 100644 --- a/group01/765324639/src/main/java/minijvm/attr/CodeAttr.java +++ b/group01/765324639/src/main/java/minijvm/attr/CodeAttr.java @@ -49,7 +49,7 @@ public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); //buffer.append("Code:").append(code).append("\n"); for(int i=0;i codeMap = new HashMap(); static{ @@ -104,19 +141,6 @@ public String getOpCode() { public abstract int getLength(); - - - - @Override - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - public String getReadableCodeText(){ String txt = codeMap.get(opCode.toUpperCase()); if(txt == null){ @@ -125,5 +149,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/group01/765324639/src/main/java/minijvm/cmd/CommandParser.java b/group01/765324639/src/main/java/minijvm/cmd/CommandParser.java index 189c208e87..6889c31d58 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/CommandParser.java +++ b/group01/765324639/src/main/java/minijvm/cmd/CommandParser.java @@ -114,7 +114,8 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { } calcuateOffset(commandList); ByteCodeCommand[] commands = new ByteCodeCommand[commandList.size()]; - return commandList.toArray(commands); + commandList.toArray(commands); + return commands; } private static void calcuateOffset(List cmds) { diff --git a/group01/765324639/src/main/java/minijvm/cmd/GetFieldCmd.java b/group01/765324639/src/main/java/minijvm/cmd/GetFieldCmd.java index 972ae719be..962857392f 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/GetFieldCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/GetFieldCmd.java @@ -1,7 +1,10 @@ package minijvm.cmd; import minijvm.clz.ClassFile; -import minijvm.constant.ConstantPool; +import minijvm.constant.FieldRefInfo; +import minijvm.engine.ExecutionResult; +import minijvm.engine.JavaObject; +import minijvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -10,11 +13,20 @@ public GetFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRefInfo = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + String fieldName = fieldRefInfo.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + frame.getOprandStack().push(fieldValue); + } + diff --git a/group01/765324639/src/main/java/minijvm/cmd/GetStaticFieldCmd.java b/group01/765324639/src/main/java/minijvm/cmd/GetStaticFieldCmd.java index 648a8940ec..fdfbb73231 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/GetStaticFieldCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/GetStaticFieldCmd.java @@ -1,7 +1,11 @@ package minijvm.cmd; import minijvm.clz.ClassFile; -import minijvm.constant.ConstantPool; +import minijvm.constant.FieldRefInfo; +import minijvm.engine.ExecutionResult; +import minijvm.engine.Heap; +import minijvm.engine.JavaObject; +import minijvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -11,9 +15,24 @@ public GetStaticFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if ("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)) { + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + } + } diff --git a/group01/765324639/src/main/java/minijvm/cmd/InvokeSpecialCmd.java b/group01/765324639/src/main/java/minijvm/cmd/InvokeSpecialCmd.java index 460706b635..e965af081c 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/InvokeSpecialCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/InvokeSpecialCmd.java @@ -1,7 +1,11 @@ package minijvm.cmd; import minijvm.clz.ClassFile; -import minijvm.constant.ConstantPool; +import minijvm.constant.MethodRefInfo; +import minijvm.engine.ExecutionResult; +import minijvm.engine.MethodArea; +import minijvm.engine.StackFrame; +import minijvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -11,11 +15,27 @@ public InvokeSpecialCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsMethod(pool); + return super.getOperandAsMethod(); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + + // java.lang.Object类的init方法(构造函数)不需要实现 + if ("java/lang/Object".equals(methodRefInfo.getClassName()) + && "".equals(methodRefInfo.getMethodName())) { + return; + } + + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + } + } diff --git a/group01/765324639/src/main/java/minijvm/cmd/InvokeVirtualCmd.java b/group01/765324639/src/main/java/minijvm/cmd/InvokeVirtualCmd.java index b2957bbcb6..f0e50b1eb0 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/InvokeVirtualCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/InvokeVirtualCmd.java @@ -1,7 +1,12 @@ package minijvm.cmd; import minijvm.clz.ClassFile; -import minijvm.constant.ConstantPool; +import minijvm.constant.MethodRefInfo; +import minijvm.engine.ExecutionResult; +import minijvm.engine.JavaObject; +import minijvm.engine.MethodArea; +import minijvm.engine.StackFrame; +import minijvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -10,10 +15,52 @@ public InvokeVirtualCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsMethod(pool); + return super.getOperandAsMethod(); } + + private boolean isSystemOutPrintlnMethod(String className, String methodName) { + return "java/io/PrintStream".equals(className) && "println".equals(methodName); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + if (isSystemOutPrintlnMethod(className, methodName)) { + JavaObject jo = frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("--------------------" + value + "-------------------"); + + frame.getOprandStack().pop(); + return; + } + + JavaObject jo = frame.getOprandStack().peek(); + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + String currentClassName = jo.getClassName(); + while (currentClassName != null) { + ClassFile cuClassFile = ma.findClassFile(currentClassName); + m = cuClassFile.getMethod(methodRefInfo.getMethodName(), methodRefInfo.getParamAndReturnType()); + if (m != null) { + break; + } else { + currentClassName = cuClassFile.getSuperClassName(); + } + } + + if (m == null) { + throw new RuntimeException("找不到对应的方法:" + methodRefInfo.toString()); + } + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(m); + } diff --git a/group01/765324639/src/main/java/minijvm/cmd/LdcCmd.java b/group01/765324639/src/main/java/minijvm/cmd/LdcCmd.java index b6ca03f4ac..a864daa2f1 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/LdcCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/LdcCmd.java @@ -4,6 +4,10 @@ import minijvm.constant.ConstantInfo; import minijvm.constant.ConstantPool; import minijvm.constant.StringInfo; +import minijvm.engine.ExecutionResult; +import minijvm.engine.Heap; +import minijvm.engine.JavaObject; +import minijvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -12,9 +16,9 @@ public LdcCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - ConstantInfo info = pool.getConstantInfo(this.getOperand()); + ConstantInfo info = getConstantInfo(this.getOperand()); String value = "TBD"; if(info instanceof StringInfo){ @@ -25,5 +29,20 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = pool.getConstantInfo(this.getOperand()); + + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } else { + throw new RuntimeException("暂时只支持字符串常量ldc"); + } + } } diff --git a/group01/765324639/src/main/java/minijvm/cmd/NewObjectCmd.java b/group01/765324639/src/main/java/minijvm/cmd/NewObjectCmd.java index aaff3aecef..03e6c7a02f 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/NewObjectCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/NewObjectCmd.java @@ -1,7 +1,11 @@ package minijvm.cmd; import minijvm.clz.ClassFile; -import minijvm.constant.ConstantPool; +import minijvm.constant.ClassInfo; +import minijvm.engine.ExecutionResult; +import minijvm.engine.Heap; +import minijvm.engine.JavaObject; +import minijvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -10,10 +14,20 @@ public NewObjectCmd(ClassFile clzFile, String opCode){ } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsClassInfo(pool); + return super.getOperandAsClassInfo(); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int index = this.getIndex(); + ClassInfo info = (ClassInfo) this.getConstantInfo(index); + String className = info.getClassName(); + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + + } + } diff --git a/group01/765324639/src/main/java/minijvm/cmd/NoOperandCmd.java b/group01/765324639/src/main/java/minijvm/cmd/NoOperandCmd.java index e9a3493426..be8d9b0cfd 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/NoOperandCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/NoOperandCmd.java @@ -1,7 +1,10 @@ package minijvm.cmd; import minijvm.clz.ClassFile; -import minijvm.constant.ConstantPool; +import minijvm.engine.ExecutionResult; +import minijvm.engine.Heap; +import minijvm.engine.JavaObject; +import minijvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -10,7 +13,7 @@ public NoOperandCmd(ClassFile clzFile, String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } @@ -21,4 +24,68 @@ public int getLength(){ return 1; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + String opCode = this.getOpCode(); + if (ByteCodeCommand.aload_0.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getLocalVariableValue(0); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.aload_1.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getLocalVariableValue(1); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.aload_2.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getLocalVariableValue(2); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.iload_1.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getLocalVariableValue(1); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.iload_2.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getLocalVariableValue(2); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.iload_3.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getLocalVariableValue(3); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.fload_3.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getLocalVariableValue(3); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.voidreturn.equalsIgnoreCase(opCode)) { + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + } else if (ByteCodeCommand.ireturn.equalsIgnoreCase(opCode)) { + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } else if (ByteCodeCommand.freturn.equalsIgnoreCase(opCode)) { + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } else if (ByteCodeCommand.astore_1.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getOprandStack().pop(); + frame.setLocalVariableValue(1, jo); + } else if (ByteCodeCommand.dup.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.iconst_0.equalsIgnoreCase(opCode)) { + JavaObject jo = Heap.getInstance().newInt(0); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.iconst_1.equalsIgnoreCase(opCode)) { + JavaObject jo = Heap.getInstance().newInt(1); + frame.getOprandStack().push(jo); + } else if (ByteCodeCommand.istore_1.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getOprandStack().pop(); + frame.setLocalVariableValue(1, jo); + } else if (ByteCodeCommand.istore_2.equalsIgnoreCase(opCode)) { + JavaObject jo = frame.getOprandStack().pop(); + frame.setLocalVariableValue(2, jo); + } else if (ByteCodeCommand.iadd.equalsIgnoreCase(opCode)) { + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue() + jo2.getIntValue()); + frame.getOprandStack().push(sum); + } else if (ByteCodeCommand.aconst_null.equalsIgnoreCase(opCode)) { + frame.getOprandStack().push(null); + } else { + throw new RuntimeException("未实现的指令:" + opCode); + } + } + } diff --git a/group01/765324639/src/main/java/minijvm/cmd/PutFieldCmd.java b/group01/765324639/src/main/java/minijvm/cmd/PutFieldCmd.java index ae41b17fde..a28ed0015f 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/PutFieldCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/PutFieldCmd.java @@ -1,7 +1,12 @@ package minijvm.cmd; import minijvm.clz.ClassFile; -import minijvm.constant.ConstantPool; +import minijvm.constant.ClassInfo; +import minijvm.constant.FieldRefInfo; +import minijvm.constant.NameAndTypeInfo; +import minijvm.engine.ExecutionResult; +import minijvm.engine.JavaObject; +import minijvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -10,10 +15,23 @@ public PutFieldCmd(ClassFile clzFile,String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { - return super.getOperandAsField(pool); + return super.getOperandAsField(); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRefInfo = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + ClassInfo classInfo = (ClassInfo) this.getConstantInfo(fieldRefInfo.getClassInfoIndex()); + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) this.getConstantInfo(fieldRefInfo.getNameAndTypeIndex()); + String fieldName = nameAndTypeInfo.getName(); + String fieldTye = nameAndTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + objectRef.setFieldValue(fieldName, fieldValue); + } + } diff --git a/group01/765324639/src/main/java/minijvm/cmd/TwoOperandCmd.java b/group01/765324639/src/main/java/minijvm/cmd/TwoOperandCmd.java index 262bedc338..c6f1cea081 100644 --- a/group01/765324639/src/main/java/minijvm/cmd/TwoOperandCmd.java +++ b/group01/765324639/src/main/java/minijvm/cmd/TwoOperandCmd.java @@ -3,7 +3,6 @@ import minijvm.clz.ClassFile; import minijvm.constant.ClassInfo; import minijvm.constant.ConstantInfo; -import minijvm.constant.ConstantPool; import minijvm.constant.FieldRefInfo; import minijvm.constant.MethodRefInfo; @@ -39,14 +38,14 @@ public int getIndex(){ return index; } - protected String getOperandAsClassInfo(ConstantPool pool){ + protected String getOperandAsClassInfo(){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + ClassInfo info = (ClassInfo)getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); } - protected String getOperandAsMethod(ConstantPool pool){ + protected String getOperandAsMethod(){ int index = getIndex(); String codeTxt = getReadableCodeText(); ConstantInfo constInfo = this.getConstantInfo(index); @@ -54,7 +53,7 @@ protected String getOperandAsMethod(ConstantPool pool){ return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); } - protected String getOperandAsField(ConstantPool pool){ + protected String getOperandAsField(){ int index = getIndex(); String codeTxt = getReadableCodeText(); diff --git a/group01/765324639/src/main/java/minijvm/engine/ExecutionResult.java b/group01/765324639/src/main/java/minijvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..288455261e --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/engine/ExecutionResult.java @@ -0,0 +1,53 @@ +package minijvm.engine; + +import minijvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + public void setNextAction(int action){ + this.nextAction = action; + } + + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + +} diff --git a/group01/765324639/src/main/java/minijvm/engine/ExecutorEngine.java b/group01/765324639/src/main/java/minijvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..4f15f3e775 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/engine/ExecutorEngine.java @@ -0,0 +1,61 @@ +package minijvm.engine; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +import minijvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + StackFrame stackFrame = StackFrame.create(mainMethod); + stack.push(stackFrame); + + while (!stack.empty()) { + StackFrame frame = stack.peek(); + ExecutionResult result = frame.execute(); + + if (result.isPauseAndRunNewFrame()) { + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + // 当前栈帧将参数传递给下一个栈帧中的局部变量表 + setupFunctionCallParams(frame, nextFrame); + + stack.push(nextFrame); + } else { + stack.pop(); + } + } + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + // 主要用来获取下一个栈帧需要的参数个数 + Method nextMethod = nextFrame.getMethod(); + List parameterList = nextMethod.getParameterList(); + int paramNum = parameterList.size() + 1; // 给this参数增加空间 + + List values = new ArrayList<>(); + + // 将当前栈帧中的操作数栈(参数)传递给下一个栈帧 + for (int i = 0; i < paramNum; i++) { + values.add(currentFrame.getOprandStack().pop()); + } + // 因为弹出的参数顺序与栈帧中的相反,故逆置一下以让参数一一对应 + Collections.reverse(values); + + nextFrame.setLocalVariableTable(values); + } + +} diff --git a/group01/765324639/src/main/java/minijvm/engine/Heap.java b/group01/765324639/src/main/java/minijvm/engine/Heap.java new file mode 100644 index 0000000000..47c2c0e534 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/engine/Heap.java @@ -0,0 +1,39 @@ +package minijvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group01/765324639/src/main/java/minijvm/engine/JavaObject.java b/group01/765324639/src/main/java/minijvm/engine/JavaObject.java new file mode 100644 index 0000000000..118cb6bdb5 --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/engine/JavaObject.java @@ -0,0 +1,72 @@ +package minijvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + @Override + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group01/765324639/src/main/java/minijvm/engine/MethodArea.java b/group01/765324639/src/main/java/minijvm/engine/MethodArea.java new file mode 100644 index 0000000000..e426c1ea1d --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/engine/MethodArea.java @@ -0,0 +1,77 @@ +package minijvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import minijvm.clz.ClassFile; +import minijvm.constant.MethodRefInfo; +import minijvm.loader.ClassFileLoader; +import minijvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className) throws ClassNotFoundException{ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className) { + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = null; + try { + clzFile = this.clzLoader.loadClass(className); + } catch (ClassNotFoundException e) { + throw new RuntimeException("没有找到对应类文件"); + } + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef) { + ClassFile clz = this.findClassFile(methodRef.getClassName()); + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + if (m == null) { + throw new RuntimeException("找不到方法:" + methodRef.getMethodName()); + } + return m; + + } +} diff --git a/group01/765324639/src/main/java/minijvm/engine/MiniJVM.java b/group01/765324639/src/main/java/minijvm/engine/MiniJVM.java new file mode 100644 index 0000000000..c204e1c1fa --- /dev/null +++ b/group01/765324639/src/main/java/minijvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package minijvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import minijvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException, ClassNotFoundException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + // 操作数栈 + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + private StackFrame(Method m) { + this.m = m; + + } + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做??---如果局部变量表的size小于index,则必须填充之间的值,否则会出错 + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group01/765324639/src/main/java/minijvm/method/Method.java b/group01/765324639/src/main/java/minijvm/method/Method.java index 248c3e79f1..114f154afd 100644 --- a/group01/765324639/src/main/java/minijvm/method/Method.java +++ b/group01/765324639/src/main/java/minijvm/method/Method.java @@ -1,5 +1,10 @@ package minijvm.method; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + import minijvm.attr.CodeAttr; import minijvm.clz.ClassFile; import minijvm.cmd.ByteCodeCommand; @@ -75,4 +80,46 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } + + private String getParamAndReturnType() { + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile().getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + + public List getParameterList() { + String paramAndType = getParamAndReturnType(); + + // 获取参数和返回类型中的参数部分 + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + String param = paramAndType.substring(first + 1, last); + + List paramList = new ArrayList<>(); + if (StringUtils.isEmpty(param)) { + return paramList; + } + + while (!"".equals(param)) { + int pos = 0; + // 对象类型(以'L'开头,以';'结尾) + if (param.charAt(pos) == 'L') { + int end = param.indexOf(";"); + if (end == -1) { + throw new RuntimeException("对象类型没有以;结尾"); + } + paramList.add(param.substring(pos + 1, end)); + pos = end + 1; + } else if (param.charAt(pos) == 'I') { // int类型 + paramList.add("I"); + pos++; + } else if (param.charAt(pos) == 'F') { // float类型 + paramList.add("F"); + pos++; + } else { + throw new RuntimeException("这个参数类型还没有实现" + param.charAt(pos)); + } + param = param.substring(pos); + } + return paramList; + } } diff --git a/group01/765324639/src/test/java/minijvm/loader/MiniJVMTest.java b/group01/765324639/src/test/java/minijvm/loader/MiniJVMTest.java new file mode 100644 index 0000000000..2811c90a53 --- /dev/null +++ b/group01/765324639/src/test/java/minijvm/loader/MiniJVMTest.java @@ -0,0 +1,30 @@ +package minijvm.loader; + +import java.io.File; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import minijvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = new File(".", "target\\test-classes").getAbsolutePath(); + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "minijvm.loader.EmployeeV1"); + + } + +} From 7e0cab0221991b754acdeffa5c40cd9d977ebe1b Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sun, 30 Apr 2017 19:14:17 +0800 Subject: [PATCH 364/552] =?UTF-8?q?=E8=A1=A5=E4=BD=9C=E4=B8=9A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/attr/CodeAttr.java | 9 +++-- .../coderising/jvm/attr/LineNumberTable.java | 19 +++++++++- .../jvm/attr/LocalVariableTable.java | 38 +++++++++---------- .../coderising/jvm/field/Field.java | 8 ++-- .../jvm/loader/ClassFileParser.java | 9 +---- .../coderising/jvm/method/Method.java | 31 ++++++++------- .../jvm/test/ClassFileloaderTest.java | 2 +- 7 files changed, 67 insertions(+), 49 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java index e6b7da9bb6..6c92bd0cf2 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java @@ -39,7 +39,7 @@ public void setLocalVariableTable(LocalVariableTable t) { this.localVarTable = t; } -public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + public static CodeAttr parse_V2(ClassFile clzFile, ByteCodeIterator iter){ int attrNameIndex = iter.nextU2toInt(); int attrLen = iter.nextU4toInt(); @@ -51,7 +51,7 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ System.out.println(code); - //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); + // ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); @@ -95,7 +95,10 @@ else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ return codeAttr; } - + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java index 5461518d3d..75891b7acc 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java @@ -33,7 +33,7 @@ public LineNumberTable(int attrNameIndex, int attrLen) { } - public static LineNumberTable parse(ByteCodeIterator iter){ + public static LineNumberTable parse_V2(ByteCodeIterator iter){ int index = iter.nextU2toInt(); int len = iter.nextU4toInt(); @@ -50,6 +50,23 @@ public static LineNumberTable parse(ByteCodeIterator iter){ } return table; } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int nameIndex = iter.nextU2toInt(); + int attrLen = iter.nextU4toInt(); + int tableLen = iter.nextU2toInt(); + LineNumberTable table = new LineNumberTable(nameIndex, attrLen); + + for (int i=0; i items = new ArrayList(); + List items = new ArrayList<>(); public LocalVariableTable(int attrNameIndex, int attrLen) { super(attrNameIndex, attrLen); @@ -19,26 +19,24 @@ public LocalVariableTable(int attrNameIndex, int attrLen) { private void addLocalVariableItem(LocalVariableItem item) { this.items.add(item); } - + public static LocalVariableTable parse(ByteCodeIterator iter){ - - int index = iter.nextU2toInt(); - int len = iter.nextU4toInt(); - - LocalVariableTable table = new LocalVariableTable(index,len); - - int itemLen = iter.nextU2toInt(); - - for(int i=1; i<=itemLen; i++){ - LocalVariableItem item = new LocalVariableItem(); - item.setStartPC(iter.nextU2toInt()); - item.setLength(iter.nextU2toInt()); - item.setNameIndex(iter.nextU2toInt()); - item.setDescIndex(iter.nextU2toInt()); - item.setIndex(iter.nextU2toInt()); - table.addLocalVariableItem(item); - } - return table; + int nameIndex = iter.nextU2toInt(); + int attrLen = iter.nextU4toInt(); + LocalVariableTable table = new LocalVariableTable(nameIndex, attrLen); + int tableLen = iter.nextU2toInt(); + + for(int i=0; i 0){ throw new RuntimeException("Field Attribute has not been implemented"); diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java index 2cdfb950af..f3457e1ae5 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java @@ -80,23 +80,18 @@ private void parseInterfaces(ByteCodeIterator iter) { private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { int fieldCount = iter.nextU2toInt(); - - for (int i = 1; i <= fieldCount; i++) { + for (int i =0; i Date: Sun, 30 Apr 2017 21:08:21 +0800 Subject: [PATCH 365/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC=20PrefixExpr.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/expr/ExprUtil.java | 38 +++++++++++++ .../basic/stack/expr/InfixToPostfix.java | 14 +++++ .../basic/stack/expr/PostfixExpr.java | 18 ++++++ .../basic/stack/expr/PostfixExprTest.java | 41 +++++++++++++ .../basic/stack/expr/PrefixExpr.java | 51 +++++++++++++++++ .../basic/stack/expr/PrefixExprTest.java | 45 +++++++++++++++ .../coding2017/basic/stack/expr/Token.java | 54 ++++++++++++++++++ .../basic/stack/expr/TokenParser.java | 57 +++++++++++++++++++ .../basic/stack/expr/TokenParserTest.java | 39 +++++++++++++ 9 files changed, 357 insertions(+) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/ExprUtil.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfix.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExpr.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExprTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PrefixExpr.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PrefixExprTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/Token.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/TokenParser.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/TokenParserTest.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/ExprUtil.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/ExprUtil.java new file mode 100644 index 0000000000..293117b3f6 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/ExprUtil.java @@ -0,0 +1,38 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +/** + * Created by thomas_young on 30/4/2017. + */ +public class ExprUtil { + + /** + * 求值 + * @param operand1 操作数1 + * @param operator 操作符 + * @param operand2 操作数2 + * @return Token表示的值 + */ + public static Token evalute(Token operand1, Token operator, Token operand2) { + float resultValue; + switch (operator.value) { + case "+": { + resultValue = operand1.getFloatValue() + operand2.getFloatValue(); + break; + } + case "-": { + resultValue = operand1.getFloatValue() - operand2.getFloatValue(); + break; + } + case "*": { + resultValue = operand1.getFloatValue() * operand2.getFloatValue(); + break; + } + case "/": { + resultValue = operand1.getFloatValue() / operand2.getFloatValue(); + break; + } + default: throw new RuntimeException("不支持的运算符:" + operator.value); + } + return new Token(Token.NUMBER, String.valueOf(resultValue)); + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfix.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..5ae9bfedab --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,14 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import java.util.List; + +public class InfixToPostfix { + + public static List convert(String expr) { + + return null; + } + + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExpr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..207640d6bd --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,18 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExprTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..24aa8f44f5 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PrefixExpr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..20f0a15e9c --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,51 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +/** + https://en.wikipedia.org/wiki/Polish_notation + Scan the given prefix expression from right to left + for each symbol + { + if operand then + push onto stack + if operator then + { + operand1=pop stack + operand2=pop stack + compute operand1 operator operand2 + push result onto stack + } + } + return top of stack as result + */ +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Collections.reverse(tokens); + Stack operandStack = new Stack<>(); + for (Token token: tokens) { + if (token.isNumber()) { + operandStack.push(token); + } else { + Token operand1 = operandStack.pop(); + Token operand2 = operandStack.pop(); + Token result = ExprUtil.evalute(operand1, token, operand2); + operandStack.push(result); + } + } + + return operandStack.pop().getFloatValue(); + } + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PrefixExprTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..4a0a0955b3 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/Token.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/Token.java new file mode 100644 index 0000000000..afaa4a8a41 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/Token.java @@ -0,0 +1,54 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public float getFloatValue() { + return Float.parseFloat(value); + } + + public int getIntValue() { + return Integer.parseInt(value); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/TokenParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..aa4e0560cf --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/TokenParserTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..92b54d0bb7 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,39 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + float delta = 0.0001f; + Assert.assertEquals(300, tokens.get(0).getFloatValue(), delta); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getFloatValue(), delta); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getFloatValue(), delta); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getFloatValue(), delta); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getFloatValue(), delta); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getFloatValue(), delta); + } + +} From 3cc449528a99c7e4a3d5456b526f13ad36a0d07c Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sun, 30 Apr 2017 21:20:14 +0800 Subject: [PATCH 366/552] =?UTF-8?q?=E5=90=8E=E7=BC=80=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E6=B1=82=E5=80=BCPostfixExpr.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/expr/PostfixExpr.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExpr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExpr.java index 207640d6bd..6475450e4c 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExpr.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/PostfixExpr.java @@ -3,6 +3,26 @@ import java.util.List; import java.util.Stack; + +/** + https://en.wikipedia.org/wiki/Reverse_Polish_notation + + While there are input tokens left + Read the next token from input. + If the token is a value + Push it onto the stack. + Otherwise, the token is an operator (operator here includes both operators and functions). + It is already known that the operator takes n arguments. + If there are fewer than n values on the stack + (Error) The user has not input sufficient values in the expression. + Else, Pop the top n values from the stack. + Evaluate the operator, with the values as arguments. + Push the returned results, if any, back onto the stack. + If there is only one value in the stack + That value is the result of the calculation. + Otherwise, there are more values in the stack + (Error) The user input has too many values. + */ public class PostfixExpr { String expr = null; @@ -11,7 +31,20 @@ public PostfixExpr(String expr) { } public float evaluate() { - return 0.0f; + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack operandStack = new Stack<>(); + for (Token token: tokens) { + if (token.isNumber()) { + operandStack.push(token); + } else { + Token operand1 = operandStack.pop(); + Token operand2 = operandStack.pop(); + Token result = ExprUtil.evalute(operand2, token, operand1); + operandStack.push(result); + } + } + return operandStack.pop().getFloatValue(); } From 431ffd26efae1ce785616310b70999a2f47d37f0 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sun, 30 Apr 2017 22:28:41 +0800 Subject: [PATCH 367/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=AD=E7=BC=80?= =?UTF-8?q?=E8=BD=AC=E5=90=8E=E7=BC=80=E8=A1=A8=E8=BE=BE=E5=BC=8FInfixToPo?= =?UTF-8?q?stfix.java,=E5=B9=B6=E8=A1=A5=E5=85=85=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8BInfixToPostfixTest.java?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/expr/ExprUtil.java | 15 +++++ .../basic/stack/expr/InfixToPostfix.java | 49 ++++++++++++-- .../basic/stack/expr/InfixToPostfixTest.java | 67 +++++++++++++++++++ 3 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfixTest.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/ExprUtil.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/ExprUtil.java index 293117b3f6..e69042a583 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/ExprUtil.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/ExprUtil.java @@ -1,5 +1,7 @@ package com.github.miniyk2012.coding2017.basic.stack.expr; +import java.util.List; + /** * Created by thomas_young on 30/4/2017. */ @@ -35,4 +37,17 @@ public static Token evalute(Token operand1, Token operator, Token operand2) { } return new Token(Token.NUMBER, String.valueOf(resultValue)); } + + public static String tokens2String(List tokens) { + StringBuffer buffer = new StringBuffer(); + int i = 0; + for (Token token: tokens) { + if (i != tokens.size()-1) + buffer.append(token.toString()+" "); + else + buffer.append(token.toString()); + i++; + } + return buffer.toString(); + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfix.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfix.java index 5ae9bfedab..d99971e5b6 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfix.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfix.java @@ -1,14 +1,53 @@ package com.github.miniyk2012.coding2017.basic.stack.expr; +import java.util.EmptyStackException; +import java.util.LinkedList; import java.util.List; +import java.util.Stack; +/** + * Shunting-yard algorithm + * https://en.wikipedia.org/wiki/Shunting-yard_algorithm + 初始化一个运算符栈和一个输出队列 + 不断读取token + 如果token是一个数 + 将其放入输出队列 + 如果token是一个运算符o1 + while栈顶部有运算符o2: + 如果o1的优先级小于等于o2,把o2取出放到输出队列 + 最后push(o1) + 将栈中的操作符逐个出栈放到输出队列 + */ public class InfixToPostfix { public static List convert(String expr) { - - return null; + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack operatorStack = new Stack<>(); + List outputTokens = new LinkedList<>(); + for (Token token: tokens) { + if (token.isNumber()) { + outputTokens.add(token); + } else { + while (true) { + try { + Token o2 = operatorStack.peek(); + if (!token.hasHigherPriority(o2)) { + operatorStack.pop(); + outputTokens.add(o2); + } else { + break; + } + } catch (EmptyStackException e) { + break; + } + } + operatorStack.push(token); + } + } + while (!operatorStack.isEmpty()) { + outputTokens.add(operatorStack.pop()); + } + return outputTokens; } - - - } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfixTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..b363e58e35 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixToPostfixTest.java @@ -0,0 +1,67 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import java.util.List; + +/** +* InfixToPostfix Tester. +* +* @author +* @since
    Apr 30, 2017
    +* @version 1.0 +*/ +public class InfixToPostfixTest { + + @Before + public void before() throws Exception { + } + + @After + public void after() throws Exception { + } + + /** + * + * Method: convert(String expr) + * + */ + @Test + public void testConvert() throws Exception { + { + String infixExpr = "3+4"; + List tokens = InfixToPostfix.convert(infixExpr); + Assert.assertEquals("3 4 +", ExprUtil.tokens2String(tokens)); + } + { + String infixExpr = "1 * 3 + 4 * 6"; + List tokens = InfixToPostfix.convert(infixExpr); + Assert.assertEquals("1 3 * 4 6 * +", ExprUtil.tokens2String(tokens)); + } + { + String infixExpr = "1 * 3 / 4 * 6"; + List tokens = InfixToPostfix.convert(infixExpr); + Assert.assertEquals("1 3 * 4 / 6 *", ExprUtil.tokens2String(tokens)); + } + { + String infixExpr = "1 + 3 * 4"; + List tokens = InfixToPostfix.convert(infixExpr); + Assert.assertEquals("1 3 4 * +", ExprUtil.tokens2String(tokens)); + } + { + String infixExpr = "3+2*3+4*5"; + List tokens = InfixToPostfix.convert(infixExpr); + Assert.assertEquals("3 2 3 * + 4 5 * +", ExprUtil.tokens2String(tokens)); + } + { + String infixExpr = "1-3+5-2/1/2*4"; + List tokens = InfixToPostfix.convert(infixExpr); + Assert.assertEquals("1 3 - 5 + 2 1 / 2 / 4 * -", ExprUtil.tokens2String(tokens)); + } + } + + +} From f13f02b10bcfbed088c0ce65bef62247a25e6fc4 Mon Sep 17 00:00:00 2001 From: Haochen Date: Sun, 30 Apr 2017 23:51:41 +0800 Subject: [PATCH 368/552] println supported in jvm executing engine --- .../src/main/java/algorithm/queue/Queue.java | 26 ++--- .../src/main/java/jvm/ClassFileLoader.java | 25 +++-- .../main/java/jvm/classfile/ClassFile.java | 34 +++--- .../main/java/jvm/classfile/ClassParser.java | 4 +- .../attribute/item/impl/SignatureAttr.java | 16 +++ .../parser/impl/SignatureParser.java | 19 ++++ .../parser/impl/StackMapTableParser.java | 7 +- .../constant/item/impl/IntegerInfo.java | 2 +- .../constant/item/impl/MethodRefInfo.java | 8 +- .../java/jvm/classfile/method/Method.java | 5 + .../main/java/jvm/command/CommandParser.java | 6 +- .../jvm/command/item/ByteCodeCommand.java | 15 ++- .../jvm/command/item/impl/AConstNullCmd.java | 28 +++++ .../java/jvm/command/item/impl/DupCmd.java | 2 +- .../jvm/command/item/impl/GetStaticCmd.java | 2 +- .../java/jvm/command/item/impl/GoToCmd.java | 31 ++++++ .../jvm/command/item/impl/IfNonNullCmd.java | 35 ++++++ .../command/item/impl/InvokeSpecialCmd.java | 7 ++ .../command/item/impl/InvokeStaticCmd.java | 32 ++++++ .../java/jvm/command/item/impl/PopCmd.java | 28 +++++ .../jvm/command/item/impl/PutFieldCmd.java | 2 +- .../jvm/command/item/impl/PutStaticCmd.java | 36 +++++++ .../main/java/jvm/engine/ConsolePrinter.java | 18 ++++ .../src/main/java/jvm/engine/MethodArea.java | 6 +- .../src/main/java/jvm/engine/MiniJVM.java | 32 ++++++ .../src/main/java/jvm/engine/StackFrame.java | 13 ++- .../main/java/jvm/util/ByteCodeIterator.java | 2 +- .../src/main/java/jvm/util/ByteUtils.java | 11 +- .../src/main/java/jvm/util/NumberUtils.java | 22 ++++ .../src/main/java/jvm/util/TypeUtils.java | 2 +- .../src/main/java/jvm/util/code/Code.java | 100 ++++++++++++++++++ .../src/main/java/jvm/util/code/CompCode.java | 27 +++++ .../src/main/java/jvm/util/code/Getter.java | 18 ++++ .../main/java/jvm/util/code/PureDecimal.java | 35 ++++++ .../main/java/jvm/util/code/PureInteger.java | 36 +++++++ .../src/main/java/jvm/util/code/TrueCode.java | 27 +++++ .../main/java/jvm/util/code/ValueCode.java | 48 +++++++++ .../test/java/jvm/ClassFileLoaderTest.java | 65 ++++++------ .../code/src/test/java/jvm/EmployeeV1.java | 31 +++--- .../src/test/java/jvm/engine/MiniJVMTest.java | 25 +++++ 40 files changed, 775 insertions(+), 113 deletions(-) create mode 100644 group01/895457260/code/src/main/java/jvm/classfile/attribute/item/impl/SignatureAttr.java create mode 100644 group01/895457260/code/src/main/java/jvm/classfile/attribute/parser/impl/SignatureParser.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/AConstNullCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/GoToCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/IfNonNullCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeStaticCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/PopCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/command/item/impl/PutStaticCmd.java create mode 100644 group01/895457260/code/src/main/java/jvm/engine/ConsolePrinter.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/NumberUtils.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/code/Code.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/code/CompCode.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/code/Getter.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/code/PureDecimal.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/code/PureInteger.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/code/TrueCode.java create mode 100644 group01/895457260/code/src/main/java/jvm/util/code/ValueCode.java create mode 100644 group01/895457260/code/src/test/java/jvm/engine/MiniJVMTest.java diff --git a/group01/895457260/code/src/main/java/algorithm/queue/Queue.java b/group01/895457260/code/src/main/java/algorithm/queue/Queue.java index 6f1ed24bc0..3fb735a3a7 100644 --- a/group01/895457260/code/src/main/java/algorithm/queue/Queue.java +++ b/group01/895457260/code/src/main/java/algorithm/queue/Queue.java @@ -3,24 +3,21 @@ import java.util.NoSuchElementException; public class Queue { - private Node first; - private Node last; - private int size; + private Node first; + private Node last; + private int size; - private static class Node { private E item; private Node next; } - public Queue() { first = null; - last = null; + last = null; size = 0; } - public boolean isEmpty() { return first == null; } @@ -29,31 +26,28 @@ public int size() { return size; } - - public void enQueue(E data) { Node oldlast = last; - last = new Node(); + last = new Node<>(); last.item = data; last.next = null; if (isEmpty()) { - first = last; - } - else{ - oldlast.next = last; + first = last; + } else { + oldlast.next = last; } size++; } public E deQueue() { if (isEmpty()) { - throw new NoSuchElementException("Queue underflow"); + throw new NoSuchElementException("Queue underflow"); } E item = first.item; first = first.next; size--; if (isEmpty()) { - last = null; + last = null; } return item; } diff --git a/group01/895457260/code/src/main/java/jvm/ClassFileLoader.java b/group01/895457260/code/src/main/java/jvm/ClassFileLoader.java index cb080512f1..943b5b43ef 100644 --- a/group01/895457260/code/src/main/java/jvm/ClassFileLoader.java +++ b/group01/895457260/code/src/main/java/jvm/ClassFileLoader.java @@ -47,14 +47,10 @@ private File getClassFile(String className) throws ClassDuplicateException { split = className.lastIndexOf('/'); } String fileName = className.substring(split + 1) + ".class"; - String subPath = className.substring(0, split).replaceAll("[.]", "/"); + List files = new ArrayList<>(); for (String path : classPaths) { - File dir = new File(path + '/' + subPath); - File[] listFile = dir.listFiles((dir1, name) -> name.equals(fileName)); - if (listFile != null) { - Arrays.stream(listFile).forEach(files::add); - } + files.addAll(getFiles(new File(path), fileName)); } if (files.size() > 1) { throw new ClassDuplicateException(); @@ -62,6 +58,23 @@ private File getClassFile(String className) throws ClassDuplicateException { return files.size() == 1 ? files.get(0) : null; } + private List getFiles(File path, String fileName) { + List files = new ArrayList<>(); + File[] listFile = path.listFiles(); + if (listFile == null) { + return files; + } + + for (File f : listFile) { + if (f.isDirectory()) { + files.addAll(getFiles(f, fileName)); + } else if (f.getName().equals(fileName)) { + files.add(f); + } + } + return files; + } + public void addClassPath(String path) { if (path != null && !"".equals(path)) { classPaths.add(path); diff --git a/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java b/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java index 24b369885d..a3317974b9 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/ClassFile.java @@ -6,10 +6,8 @@ import jvm.classfile.method.Method; import jvm.engine.JavaObject; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; /** * Created by Haochen on 2017/4/9. @@ -26,7 +24,7 @@ public class ClassFile { List methods = new ArrayList<>(); List attributes = new ArrayList<>(); - Map staticFieldValues = new HashMap<>(); + Map staticFieldValues = new HashMap<>(); public AccessFlag getAccessFlag() { @@ -98,13 +96,25 @@ public Field getField(String name) { .orElse(null); } - public JavaObject getStaticFieldValues(Field field) { - return staticFieldValues.get(field); - } - - public void putStaticFieldValues(Field field, JavaObject object) { - if (staticFieldValues.containsKey(field)) { - staticFieldValues.put(field, object); + public JavaObject getStaticFieldValue(String name) { + return staticFieldValues.get(name); + } + + public void putStaticFieldValue(String name, JavaObject object) { + java.lang.reflect.Field field; + try { + Class clazz = Class.forName(this.getClassName().replace('/', '.')); + field = clazz.getDeclaredField(name); + field.setAccessible(true); + if (object == null) { + staticFieldValues.remove(name); + field.set(null, null); + } else { + staticFieldValues.put(name, object); + field.set(null, object); + } + } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Static field " + getClassName() + "." + name + "not found"); } } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java b/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java index 6e572bdd60..e46b25dce6 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/ClassParser.java @@ -28,11 +28,11 @@ public static ClassFile parse(byte[] bytes) { classFile.constantPool = parseConstantPool(iterator); classFile.accessFlag = parseAccessFlag(iterator); classFile.classIndex = parseClassIndex(iterator); + linkConstantReferences(classFile); parseInterfaces(classFile, iterator); parseFields(classFile, iterator); parseMethods(classFile, iterator); parseAttributes(classFile, iterator); - linkConstantReferences(classFile); return classFile; } @@ -95,7 +95,7 @@ private static void parseFields(ClassFile classFile, ByteCodeIterator iterator) Field field = Field.parse(iterator, classFile.constantPool); classFile.fields.add(field); if (field.getAccessFlag().isStatic()) { - classFile.staticFieldValues.put(field, TypeUtils.getDefaultValue(field)); + classFile.putStaticFieldValue(field.getName(), TypeUtils.getDefaultValue(field)); } } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/impl/SignatureAttr.java b/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/impl/SignatureAttr.java new file mode 100644 index 0000000000..aa0a01938e --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/classfile/attribute/item/impl/SignatureAttr.java @@ -0,0 +1,16 @@ +package jvm.classfile.attribute.item.impl; + +import jvm.classfile.attribute.item.AttributeInfo; + +/** + * Created by Haochen on 2017/4/30. + * TODO: + */ +public class SignatureAttr extends AttributeInfo { + private int signatureIndex; + + public SignatureAttr(int attrNameIndex, int attrLen, int signatureIndex) { + super(attrNameIndex, attrLen); + this.signatureIndex = signatureIndex; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/classfile/attribute/parser/impl/SignatureParser.java b/group01/895457260/code/src/main/java/jvm/classfile/attribute/parser/impl/SignatureParser.java new file mode 100644 index 0000000000..74a6c67211 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/classfile/attribute/parser/impl/SignatureParser.java @@ -0,0 +1,19 @@ +package jvm.classfile.attribute.parser.impl; + +import jvm.classfile.ConstantPool; +import jvm.classfile.attribute.item.AttributeInfo; +import jvm.classfile.attribute.item.impl.SignatureAttr; +import jvm.classfile.attribute.parser.AttributeInfoParser; +import jvm.util.ByteCodeIterator; + +/** + * Created by Haochen on 2017/4/30. + * TODO: + */ +public class SignatureParser implements AttributeInfoParser { + @Override + public AttributeInfo parse(int attrNameIndex, int attrLen, ByteCodeIterator iterator, ConstantPool constantPool) { + int signatureIndex = iterator.nextU2ToInt(); + return new SignatureAttr(attrNameIndex, attrLen, signatureIndex); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/classfile/attribute/parser/impl/StackMapTableParser.java b/group01/895457260/code/src/main/java/jvm/classfile/attribute/parser/impl/StackMapTableParser.java index 087edcffcf..5405d7a2ab 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/attribute/parser/impl/StackMapTableParser.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/attribute/parser/impl/StackMapTableParser.java @@ -14,12 +14,9 @@ public class StackMapTableParser implements AttributeInfoParser { @Override public AttributeInfo parse(int attrNameIndex, int attrLen, ByteCodeIterator iterator, ConstantPool constantPool) { - int index = iterator.nextU2ToInt(); - int len = iterator.nextU4ToInt(); //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iterator.nextHexString(len); - - return new StackMapTableAttr(index, len, code); + String code = iterator.nextHexString(attrLen); + return new StackMapTableAttr(attrNameIndex, attrLen, code); } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java index 1145bd3bb2..d74352bdb3 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/IntegerInfo.java @@ -36,6 +36,6 @@ public byte[] getBytes() { } public int getValue() { - return ByteUtils.toInt(getBytes()); + return ByteUtils.toUnsignedInt(getBytes()); } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java index 19b17af721..3332040c33 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/constant/item/impl/MethodRefInfo.java @@ -54,7 +54,11 @@ public String getClassName() { return className; } - public String getNameAndType() { - return nameAndType; + public String getName() { + return nameAndType.substring(0, nameAndType.indexOf(':')); + } + + public String getParamAndReturnType() { + return nameAndType.substring(nameAndType.indexOf(':') + 1); } } diff --git a/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java b/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java index bea02fb082..4336fca184 100644 --- a/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java +++ b/group01/895457260/code/src/main/java/jvm/classfile/method/Method.java @@ -98,4 +98,9 @@ public String getName() { public String getParamAndReturnType() { return ((UTF8Info) getConstantPool().getConstantInfo(getDescriptorIndex())).getValue(); } + + @Override + public String toString() { + return getName() + ':' + getParamAndReturnType(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/command/CommandParser.java b/group01/895457260/code/src/main/java/jvm/command/CommandParser.java index e1b3011fc0..7227d5e6d5 100644 --- a/group01/895457260/code/src/main/java/jvm/command/CommandParser.java +++ b/group01/895457260/code/src/main/java/jvm/command/CommandParser.java @@ -16,9 +16,9 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { try { while (iterator.hasNext()) { String opCode = iterator.next2CharAsString().toUpperCase(); - String cmdClassName = packageName - + ByteCodeCommand.codeMap.get(opCode).replaceAll("_", "") - + "Cmd"; + String cmdName = ByteCodeCommand.codeMap.get(opCode); + String cmdClassName = packageName + cmdName.replaceAll("_", "") + "Cmd"; + Class clazz = Class.forName(cmdClassName); Constructor constructor = clazz.getConstructor( ClassFile.class, String.class, CommandIterator.class); diff --git a/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java b/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java index c78cac416e..95fc736b47 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/ByteCodeCommand.java @@ -24,15 +24,19 @@ public abstract class ByteCodeCommand { codeMap.put("BB", "New"); codeMap.put("37", "LStore"); + codeMap.put("B9", "InvokeInterface"); + codeMap.put("B8", "InvokeStatic"); codeMap.put("B7", "InvokeSpecial"); codeMap.put("B6", "InvokeVirtual"); - codeMap.put("B4", "GetField"); codeMap.put("B5", "PutField"); + codeMap.put("B4", "GetField"); + codeMap.put("B3", "PutStatic"); codeMap.put("B2", "GetStatic"); codeMap.put("2A", "ALoad_0"); codeMap.put("2B", "ALoad_1"); codeMap.put("2C", "ALoad_2"); + codeMap.put("2D", "ALoad_3"); codeMap.put("10", "BiPush"); codeMap.put("15", "ILoad"); @@ -46,7 +50,11 @@ public abstract class ByteCodeCommand { codeMap.put("1E", "LLoad_0"); codeMap.put("24", "FLoad_2"); + + codeMap.put("4B", "AStore_0"); codeMap.put("4C", "AStore_1"); + codeMap.put("4D", "AStore_2"); + codeMap.put("4E", "AStore_3"); codeMap.put("A2", "If_Icmp_Ge"); codeMap.put("A4", "If_Icmple"); @@ -60,15 +68,20 @@ public abstract class ByteCodeCommand { codeMap.put("03", "IConst_0"); codeMap.put("04", "IConst_1"); + codeMap.put("3B", "IStore_0"); codeMap.put("3C", "IStore_1"); codeMap.put("3D", "IStore_2"); + codeMap.put("3E", "IStore_3"); codeMap.put("59", "Dup"); + codeMap.put("57", "Pop"); codeMap.put("60", "IAdd"); codeMap.put("84", "IInc"); codeMap.put("12", "Ldc"); + + codeMap.put("C7", "IfNonNull"); } ByteCodeCommand(ClassFile clzFile, String opCode, CommandIterator iterator) { diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/AConstNullCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/AConstNullCmd.java new file mode 100644 index 0000000000..216ef3cdba --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/AConstNullCmd.java @@ -0,0 +1,28 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class AConstNullCmd extends NoOperandCmd { + public AConstNullCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + frame.getOperandStack().push(null); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java index 4ce44270f0..3543bc4f37 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/DupCmd.java @@ -24,6 +24,6 @@ public String toString() { @Override public void execute(StackFrame frame, ExecutionResult result) { JavaObject object = frame.getOperandStack().peek(); - frame.getOperandStack().push(new JavaObject(object)); + frame.getOperandStack().push(object); } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java index 81bf3161f5..38da187aae 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/GetStaticCmd.java @@ -27,7 +27,7 @@ public void execute(StackFrame frame, ExecutionResult result) throws ReadClassEx ClassFile classFile = MethodArea.getInstance().findClassFile(fieldRefInfo.getClassName()); String fieldName = fieldRefInfo.getNameAndType().split(":")[0]; Field field = classFile.getField(fieldName); - JavaObject object = classFile.getStaticFieldValues(field); + JavaObject object = classFile.getStaticFieldValue(field.getName()); frame.getOperandStack().push(object); } } diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/GoToCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/GoToCmd.java new file mode 100644 index 0000000000..15ae39dfa4 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/GoToCmd.java @@ -0,0 +1,31 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; +import jvm.util.NumberUtils; + +public class GoToCmd extends TwoOperandCmd { + + public GoToCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int nextCmdOffset = (getOperand1() << 8) | getOperand2(); + nextCmdOffset = NumberUtils.toSignedInt(nextCmdOffset, 16); + nextCmdOffset += getOffset(); + result.setNextCmdOffset(nextCmdOffset); + result.setNextAction(ExecutionResult.JUMP); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/IfNonNullCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/IfNonNullCmd.java new file mode 100644 index 0000000000..290477e4fd --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/IfNonNullCmd.java @@ -0,0 +1,35 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.FieldRefInfo; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; +import jvm.util.NumberUtils; + +public class IfNonNullCmd extends TwoOperandCmd { + + public IfNonNullCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + JavaObject obj = frame.getOperandStack().pop(); + if (obj != null) { + int nextCmdOffset = (getOperand1() << 8) | getOperand2(); + nextCmdOffset = NumberUtils.toSignedInt(nextCmdOffset, 16); + nextCmdOffset += getOffset(); + result.setNextCmdOffset(nextCmdOffset); + result.setNextAction(ExecutionResult.JUMP); + } + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java index ac06fe735f..1b068b95a7 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeSpecialCmd.java @@ -25,6 +25,13 @@ public String toString(ConstantPool pool) { public void execute(StackFrame frame, ExecutionResult result) throws ReadClassException { int methodIndex = (getOperand1() << 8) | getOperand2(); MethodRefInfo methodRefInfo = (MethodRefInfo) getConstantInfo(methodIndex); + + // 不调用Object的构造器 + if (methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getName().equals("")) { + frame.getOperandStack().pop(); // 弹出不需要的this + return; + } result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); Method method = MethodArea.getInstance().getMethod(methodRefInfo); result.setNextMethod(method); diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeStaticCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeStaticCmd.java new file mode 100644 index 0000000000..9a5c9f3e88 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/InvokeStaticCmd.java @@ -0,0 +1,32 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.MethodRefInfo; +import jvm.classfile.method.Method; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.MethodArea; +import jvm.engine.StackFrame; +import jvm.exception.ReadClassException; + +public class InvokeStaticCmd extends TwoOperandCmd { + public InvokeStaticCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) throws ReadClassException { + int methodIndex = (getOperand1() << 8) | getOperand2(); + MethodRefInfo methodRefInfo = (MethodRefInfo) getConstantInfo(methodIndex); + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + Method method = MethodArea.getInstance().getMethod(methodRefInfo); + result.setNextMethod(method); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/PopCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/PopCmd.java new file mode 100644 index 0000000000..503f40ae92 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/PopCmd.java @@ -0,0 +1,28 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.command.CommandIterator; +import jvm.command.item.NoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.StackFrame; + +/** + * Created by Haochen on 2017/4/20. + * TODO: + */ +public class PopCmd extends NoOperandCmd { + public PopCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString() { + return this.getOffset() + ": " + this.getReadableCodeText(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + frame.getOperandStack().pop(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java index aac89263b8..480a042736 100644 --- a/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/PutFieldCmd.java @@ -22,8 +22,8 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - JavaObject obj = frame.getOperandStack().pop(); JavaObject value = frame.getOperandStack().pop(); + JavaObject obj = frame.getOperandStack().pop(); int fieldIndex = (getOperand1() << 8) | getOperand2(); FieldRefInfo fieldRefInfo = (FieldRefInfo) getConstantInfo(fieldIndex); String fieldName = fieldRefInfo.getNameAndType().split(":")[0]; diff --git a/group01/895457260/code/src/main/java/jvm/command/item/impl/PutStaticCmd.java b/group01/895457260/code/src/main/java/jvm/command/item/impl/PutStaticCmd.java new file mode 100644 index 0000000000..cb1a16a098 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/command/item/impl/PutStaticCmd.java @@ -0,0 +1,36 @@ +package jvm.command.item.impl; + +import jvm.classfile.ClassFile; +import jvm.classfile.ConstantPool; +import jvm.classfile.constant.item.impl.FieldRefInfo; +import jvm.classfile.field.Field; +import jvm.command.CommandIterator; +import jvm.command.item.TwoOperandCmd; +import jvm.engine.ExecutionResult; +import jvm.engine.JavaObject; +import jvm.engine.MethodArea; +import jvm.engine.StackFrame; +import jvm.exception.ReadClassException; + +public class PutStaticCmd extends TwoOperandCmd { + + public PutStaticCmd(ClassFile clzFile, String opCode, CommandIterator iterator) { + super(clzFile, opCode, iterator); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) throws ReadClassException { + int index = (getOperand1() << 8) | getOperand2(); + FieldRefInfo fieldRefInfo = (FieldRefInfo) getConstantInfo(index); + ClassFile classFile = MethodArea.getInstance().findClassFile(fieldRefInfo.getClassName()); + String fieldName = fieldRefInfo.getNameAndType().split(":")[0]; + Field field = classFile.getField(fieldName); + JavaObject object = frame.getOperandStack().pop(); + classFile.putStaticFieldValue(field.getName(), object); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/engine/ConsolePrinter.java b/group01/895457260/code/src/main/java/jvm/engine/ConsolePrinter.java new file mode 100644 index 0000000000..88e72bdc21 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/engine/ConsolePrinter.java @@ -0,0 +1,18 @@ +package jvm.engine; + +/** + * Created by Haochen on 2017/4/30. + * TODO: + */ +public class ConsolePrinter { + volatile static Object printingBuf = null; + + public static void println(Object o) { + while (true) { + if (printingBuf == null) { + printingBuf = o; + break; + } + } + } +} diff --git a/group01/895457260/code/src/main/java/jvm/engine/MethodArea.java b/group01/895457260/code/src/main/java/jvm/engine/MethodArea.java index 00f40a949e..20f3e3c310 100644 --- a/group01/895457260/code/src/main/java/jvm/engine/MethodArea.java +++ b/group01/895457260/code/src/main/java/jvm/engine/MethodArea.java @@ -54,10 +54,6 @@ public Method getMethod(String className, String methodName, String paramAndRetu } public Method getMethod(MethodRefInfo methodRef) throws ReadClassException { - String[] split = methodRef.getNameAndType().split(":"); - String className = methodRef.getClassName(); - String methodName = split[0]; - String paramAndReturnType = split[1]; - return getMethod(className, methodName, paramAndReturnType); + return getMethod(methodRef.getClassName(), methodRef.getName(), methodRef.getParamAndReturnType()); } } diff --git a/group01/895457260/code/src/main/java/jvm/engine/MiniJVM.java b/group01/895457260/code/src/main/java/jvm/engine/MiniJVM.java index eae3d36935..8eb36f033e 100644 --- a/group01/895457260/code/src/main/java/jvm/engine/MiniJVM.java +++ b/group01/895457260/code/src/main/java/jvm/engine/MiniJVM.java @@ -3,9 +3,23 @@ import jvm.ClassFileLoader; import jvm.exception.ReadClassException; +import java.util.ArrayList; +import java.util.List; + public class MiniJVM { + private boolean enablePrint = true; + + private static final List defaultClassPaths = new ArrayList<>(); + + public MiniJVM() { + defaultClassPaths.add("target/classes"); + } + public void run(String[] classPaths, String className) throws ReadClassException { ClassFileLoader loader = new ClassFileLoader(); + for (String classPath : defaultClassPaths) { + loader.addClassPath(classPath); + } for (String classPath : classPaths) { loader.addClassPath(classPath); } @@ -14,6 +28,24 @@ public void run(String[] classPaths, String className) throws ReadClassException methodArea.setClassFileLoader(loader); ExecutorEngine engine = new ExecutorEngine(); className = className.replace(".", "/"); + + initConsolePrinting(); + engine.execute(methodArea.getMainMethod(className)); + + while (enablePrint && ConsolePrinter.printingBuf == null) { + enablePrint = false; + } + } + + private void initConsolePrinting() { + new Thread(() -> { + while (enablePrint) { + if (ConsolePrinter.printingBuf != null) { + System.out.println(ConsolePrinter.printingBuf); + ConsolePrinter.printingBuf = null; + } + } + }).start(); } } diff --git a/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java b/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java index 8807caa37f..f360f8dc30 100644 --- a/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java +++ b/group01/895457260/code/src/main/java/jvm/engine/StackFrame.java @@ -28,17 +28,17 @@ public ExecutionResult execute() throws ReadClassException { ByteCodeCommand cmd = commands[index]; ExecutionResult result = new ExecutionResult(); cmd.execute(this, result); - index++; - result.setNextCmdOffset(commands[index].getOffset()); if (result.isExitCurrentFrame()) { return result; } else if (result.isPauseAndRunNewFrame()) { + index++; return result; } else if (result.isJump()) { - TwoOperandCmd jumpCmd = (TwoOperandCmd) cmd; - int offset = (jumpCmd.getOperand1() << 8) | jumpCmd.getOperand2(); + int offset = result.getNextCmdOffset(); index = getNextCommandIndex(offset); + } else { + index++; } } ExecutionResult frameResult = new ExecutionResult(); @@ -92,4 +92,9 @@ public void setLocalVariableValue(int index, JavaObject jo) { public Method getMethod() { return method; } + + @Override + public String toString() { + return getMethod().toString(); + } } diff --git a/group01/895457260/code/src/main/java/jvm/util/ByteCodeIterator.java b/group01/895457260/code/src/main/java/jvm/util/ByteCodeIterator.java index a385aee580..535688e408 100644 --- a/group01/895457260/code/src/main/java/jvm/util/ByteCodeIterator.java +++ b/group01/895457260/code/src/main/java/jvm/util/ByteCodeIterator.java @@ -47,7 +47,7 @@ public String nextHexString(int byteCount) { } public int nextInt(int byteCount) { - int result = ByteUtils.toInt(codes, pos, byteCount); + int result = ByteUtils.toUnsignedInt(codes, pos, byteCount); pos += byteCount; return result; } diff --git a/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java b/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java index 17d7537209..829ff20d10 100644 --- a/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java +++ b/group01/895457260/code/src/main/java/jvm/util/ByteUtils.java @@ -1,5 +1,8 @@ package jvm.util; +import jvm.util.code.Code; +import jvm.util.code.CompCode; + /** * Created by Haochen on 2017/4/9. * TODO: @@ -19,11 +22,11 @@ public static String toHexString(byte[] bytes, int off, int len) { return builder.toString(); } - public static int toInt(byte[] bytes) { - return toInt(bytes, 0, bytes.length); + public static int toUnsignedInt(byte[] bytes) { + return toUnsignedInt(bytes, 0, bytes.length); } - public static int toInt(byte[] bytes, int off, int len) { + public static int toUnsignedInt(byte[] bytes, int off, int len) { return Integer.parseInt(toHexString(bytes, off, len), 16); } @@ -32,6 +35,6 @@ public static float toFloat(byte[] bytes) { } public static float toFloat(byte[] bytes, int off, int len) { - return Float.intBitsToFloat(toInt(bytes, off, len)); + return Float.intBitsToFloat(toUnsignedInt(bytes, off, len)); } } diff --git a/group01/895457260/code/src/main/java/jvm/util/NumberUtils.java b/group01/895457260/code/src/main/java/jvm/util/NumberUtils.java new file mode 100644 index 0000000000..9115303775 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/NumberUtils.java @@ -0,0 +1,22 @@ +package jvm.util; + +import jvm.util.code.Code; +import jvm.util.code.CompCode; + +/** + * Created by Haochen on 2017/4/30. + * TODO: + */ +public class NumberUtils { + public static int toSignedInt(int unsigned, int bitCount) { + String bin = Integer.toBinaryString(unsigned); + int leader0Count = bitCount - bin.length(); + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < leader0Count; ++i) { + builder.append('0'); + } + builder.append(bin); + Code trueCode = new CompCode(Code.PURE_INTEGER, builder.toString()).trueCode(); + return Integer.parseInt(trueCode.getCode(), 2); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/util/TypeUtils.java b/group01/895457260/code/src/main/java/jvm/util/TypeUtils.java index a3d8b618cc..7861806581 100644 --- a/group01/895457260/code/src/main/java/jvm/util/TypeUtils.java +++ b/group01/895457260/code/src/main/java/jvm/util/TypeUtils.java @@ -49,6 +49,6 @@ public static JavaObject getDefaultValue(Field field) { case FLOAT: return Heap.getInstance().newFloat(0); } - return Heap.getInstance().newClassReference(field.getDescriptor()); + return null; } } diff --git a/group01/895457260/code/src/main/java/jvm/util/code/Code.java b/group01/895457260/code/src/main/java/jvm/util/code/Code.java new file mode 100644 index 0000000000..75f0838b52 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/code/Code.java @@ -0,0 +1,100 @@ +package jvm.util.code; + +/** + * Created by Haochen on 2017/1/5. + */ +public abstract class Code { + public static final int PURE_DECIMAL = 1; + public static final int PURE_INTEGER = 2; + + protected String code; + protected int type; + protected Getter getter; + + public Code(int type, String code) { + this.type = type; + this.code = code.replaceAll("[+]", ""); + init(); + } + + protected final void init() { + if (type == PURE_DECIMAL) { + getter = new PureDecimal(); + } else { + getter = new PureInteger(); + } + } + + public String getCode() { + return code; + } + + public int getType() { + return type; + } + + public String bitwiseNOTAddOne() { + int[] array = intArray(); + int last1 = code.lastIndexOf('1'); + for (int i = 1; i < last1; ++i) { + array[i] = 1 - array[i]; + } + return intArrayToString(array); + } + + public String compString() { + if (isNegative()) { + return bitwiseNOTAddOne(); + } else { + return code; + } + } + + public static String intArrayToString(int[] array) { + String str = ""; + for (int i : array) { + str += i; + } + return str; + } + + public int[] intArray() { + int[] array = new int[code.length()]; + char[] chars = code.toCharArray(); + for (int i = 0; i < array.length; ++i) { + array[i] = Integer.parseInt("" + chars[i]); + } + return array; + } + + public int length() { + return code.length(); + } + + public boolean isNegative() { + return code.startsWith("1"); + } + + public final double value() { + return getter.value(trueCode()); + } + + public Code valueCode() { + return getter.valueCode(trueCode()); + } + + public Code compCode() { + return trueCode().compCode(); + } + + public void expand(int bit) { + getter.expand(this, bit, 0); + } + + public void expand(int bit, int fill) { + getter.expand(this, bit, fill); + } + + public abstract Code trueCode(); + public abstract Code inverseSign(); +} diff --git a/group01/895457260/code/src/main/java/jvm/util/code/CompCode.java b/group01/895457260/code/src/main/java/jvm/util/code/CompCode.java new file mode 100644 index 0000000000..a7e1fb426a --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/code/CompCode.java @@ -0,0 +1,27 @@ +package jvm.util.code; + +/** + * Created by Haochen on 2017/1/5. + */ +public class CompCode extends Code { + public CompCode(int type, String code) { + super(type, code); + } + + @Override + public Code compCode() { + return this; + } + + @Override + public Code trueCode() { + return new TrueCode(type, compString()); + } + + @Override + public Code inverseSign() { + String str = bitwiseNOTAddOne().substring(1); + Code code = new CompCode(type, isNegative() ? "0" + str : "1" + str); + return code; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/util/code/Getter.java b/group01/895457260/code/src/main/java/jvm/util/code/Getter.java new file mode 100644 index 0000000000..235cbae969 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/code/Getter.java @@ -0,0 +1,18 @@ +package jvm.util.code; + +/** + * Created by Haochen on 2017/1/5. + */ +public abstract class Getter { + public final double value(Code trueCode) { + return value(trueCode.getCode()); + } + + public final Code valueCode(Code trueCode) { + return valueCode(trueCode.getCode()); + } + + public abstract double value(String trueCode); + public abstract Code valueCode(String trueCode); + public abstract void expand(Code code, int bit, int fill); +} diff --git a/group01/895457260/code/src/main/java/jvm/util/code/PureDecimal.java b/group01/895457260/code/src/main/java/jvm/util/code/PureDecimal.java new file mode 100644 index 0000000000..82f2dbd0fe --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/code/PureDecimal.java @@ -0,0 +1,35 @@ +package jvm.util.code; + +/** + * Created by Haochen on 2017/1/5. + */ +public class PureDecimal extends Getter { + @Override + public double value(String trueCode) { + char[] array = trueCode.toCharArray(); + + double result = 0; + double r = 0.5; + for (int i = 1; i < array.length; ++i, r /= 2) { + result += Integer.parseInt("" + array[i]) * r; + } + + if (trueCode.startsWith("1")) { + result *= -1; + } + return result; + } + + @Override + public Code valueCode(String trueCode) { + return new ValueCode(trueCode.startsWith("1") ? + trueCode.replaceFirst("1", "-0.") : trueCode.replaceFirst("0", "0.")); + } + + @Override + public void expand(Code code, int bit, int fill) { + for (int i = code.code.length(); i < bit; ++i) { + code.code += fill; + } + } +} diff --git a/group01/895457260/code/src/main/java/jvm/util/code/PureInteger.java b/group01/895457260/code/src/main/java/jvm/util/code/PureInteger.java new file mode 100644 index 0000000000..2a5d36f603 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/code/PureInteger.java @@ -0,0 +1,36 @@ +package jvm.util.code; + +/** + * Created by Haochen on 2017/1/5. + */ +public class PureInteger extends Getter { + @Override + public double value(String trueCode) { + char[] array = trueCode.toCharArray(); + + int result = 0; + for (int i = array.length - 1, r = 1; i > 0; --i, r *= 2) { + result += Integer.parseInt("" + array[i]) * r; + } + + if (trueCode.startsWith("1")) { + result *= -1; + } + return result; + } + + @Override + public Code valueCode(String trueCode) { + return new ValueCode(trueCode.startsWith("1") ? + trueCode.replaceFirst("1", "-") : trueCode.replaceFirst("0", "")); + } + + @Override + public void expand(Code code, int bit, int fill) { + StringBuilder builder = new StringBuilder(code.code); + for (int i = code.code.length(); i < bit; ++i) { + builder.insert(1, fill); + } + code.code = builder.toString(); + } +} diff --git a/group01/895457260/code/src/main/java/jvm/util/code/TrueCode.java b/group01/895457260/code/src/main/java/jvm/util/code/TrueCode.java new file mode 100644 index 0000000000..10f872e56d --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/code/TrueCode.java @@ -0,0 +1,27 @@ +package jvm.util.code; + +/** + * Created by Haochen on 2017/1/5. + */ +public class TrueCode extends Code { + public TrueCode(int type, String code) { + super(type, code); + } + + @Override + public Code compCode() { + return new CompCode(type, compString()); + } + + @Override + public Code trueCode() { + return this; + } + + @Override + public Code inverseSign() { + String str = code.substring(1); + Code code = new TrueCode(type, isNegative() ? "0" + str : "1" + str); + return code; + } +} diff --git a/group01/895457260/code/src/main/java/jvm/util/code/ValueCode.java b/group01/895457260/code/src/main/java/jvm/util/code/ValueCode.java new file mode 100644 index 0000000000..5f42be3b44 --- /dev/null +++ b/group01/895457260/code/src/main/java/jvm/util/code/ValueCode.java @@ -0,0 +1,48 @@ +package jvm.util.code; + +/** + * Created by Haochen on 2017/1/5. + */ +public class ValueCode extends Code { + public ValueCode(String code) { + super(code.contains(".") ? PURE_DECIMAL : PURE_INTEGER, code); + } + + @Override + public String compString() { + return ""; + } + + @Override + public boolean isNegative() { + return code.startsWith("-"); + } + + @Override + public int[] intArray() { + return new int[0]; + } + + @Override + public Code valueCode() { + return this; + } + + @Override + public void expand(int bit, int fill) { + super.expand(bit); + } + + @Override + public Code trueCode() { + String str = isNegative() ? "1" + code.substring(1) : "0" + code; + return new TrueCode(type, str.replaceAll("0[.]", "")); + } + + @Override + public Code inverseSign() { + String str = code; + Code code = new ValueCode(isNegative() ? str.substring(1) : "-" + str); + return code; + } +} diff --git a/group01/895457260/code/src/test/java/jvm/ClassFileLoaderTest.java b/group01/895457260/code/src/test/java/jvm/ClassFileLoaderTest.java index daaa65a680..7f7b57b69e 100644 --- a/group01/895457260/code/src/test/java/jvm/ClassFileLoaderTest.java +++ b/group01/895457260/code/src/test/java/jvm/ClassFileLoaderTest.java @@ -56,7 +56,7 @@ public void testClassPath() { public void testClassFileLength() throws ReadClassException { byte[] byteCodes = loader.readBinaryCode(LOAD_CLASS_NAME); // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1016, byteCodes.length); + Assert.assertEquals(981, byteCodes.length); } @Test @@ -79,65 +79,65 @@ public void testConstantPool() { ConstantPool pool = clzFile.getConstantPool(); - Assert.assertEquals(53, pool.getSize()); + Assert.assertEquals(48, pool.getSize()); { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(7); - Assert.assertEquals(44, clzInfo.getUtf8Index()); + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(6); + Assert.assertEquals(41, clzInfo.getUtf8Index()); - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(44); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(41); Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); } { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(11); - Assert.assertEquals(48, clzInfo.getUtf8Index()); + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(10); + Assert.assertEquals(45, clzInfo.getUtf8Index()); - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(48); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(45); Assert.assertEquals("java/lang/Object", utf8Info.getValue()); } { - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(12); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(11); Assert.assertEquals("name", utf8Info.getValue()); - utf8Info = (UTF8Info) pool.getConstantInfo(13); + utf8Info = (UTF8Info) pool.getConstantInfo(12); Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); - utf8Info = (UTF8Info) pool.getConstantInfo(14); + utf8Info = (UTF8Info) pool.getConstantInfo(13); Assert.assertEquals("age", utf8Info.getValue()); - utf8Info = (UTF8Info) pool.getConstantInfo(15); + utf8Info = (UTF8Info) pool.getConstantInfo(14); Assert.assertEquals("I", utf8Info.getValue()); - utf8Info = (UTF8Info) pool.getConstantInfo(16); + utf8Info = (UTF8Info) pool.getConstantInfo(15); Assert.assertEquals("", utf8Info.getValue()); - utf8Info = (UTF8Info) pool.getConstantInfo(17); + utf8Info = (UTF8Info) pool.getConstantInfo(16); Assert.assertEquals("(Ljava/lang/String;I)V", utf8Info.getValue()); - utf8Info = (UTF8Info) pool.getConstantInfo(18); + utf8Info = (UTF8Info) pool.getConstantInfo(17); Assert.assertEquals("Code", utf8Info.getValue()); } { MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(1); - Assert.assertEquals(11, methodRef.getClassInfoIndex()); - Assert.assertEquals(36, methodRef.getNameAndTypeIndex()); + Assert.assertEquals(10, methodRef.getClassInfoIndex()); + Assert.assertEquals(35, methodRef.getNameAndTypeIndex()); } { - NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(36); - Assert.assertEquals(16, nameAndType.getIndex1()); - Assert.assertEquals(28, nameAndType.getIndex2()); + NameAndTypeInfo nameAndType = (NameAndTypeInfo) pool.getConstantInfo(35); + Assert.assertEquals(15, nameAndType.getIndex1()); + Assert.assertEquals(27, nameAndType.getIndex2()); } //抽查几个吧 { MethodRefInfo methodRef = (MethodRefInfo)pool.getConstantInfo(9); - Assert.assertEquals(7, methodRef.getClassInfoIndex()); - Assert.assertEquals(46, methodRef.getNameAndTypeIndex()); + Assert.assertEquals(6, methodRef.getClassInfoIndex()); + Assert.assertEquals(44, methodRef.getNameAndTypeIndex()); } { - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(35); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(34); Assert.assertEquals("EmployeeV1.java", utf8Info.getValue()); } } @@ -204,7 +204,7 @@ public void testMethods() { assertMethodEquals(pool,m, "sayHello", "()V", - "b200041205b60006b1"); + "1204b80005b1"); } { @@ -212,7 +212,7 @@ public void testMethods() { assertMethodEquals(pool,m, "main", "([Ljava/lang/String;)V", - "bb0007591208101db700094c2bb6000ab1"); + "bb0006591207101db700084c2bb60009b1"); } } @@ -260,10 +260,9 @@ public void testByteCodeCommand(){ "()V"); ByteCodeCommand [] cmds = sayHelloMethod.getCommands(); - assertOpCodeEquals("0: getstatic #4", cmds[0]); - assertOpCodeEquals("3: ldc #5", cmds[1]); - assertOpCodeEquals("5: invokevirtual #6", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); + assertOpCodeEquals("0: ldc #4", cmds[0]); + assertOpCodeEquals("2: invokestatic #5", cmds[1]); + assertOpCodeEquals("5: return", cmds[2]); } @@ -272,14 +271,14 @@ public void testByteCodeCommand(){ ByteCodeCommand [] cmds = mainMethod.getCommands(); - assertOpCodeEquals("0: new #7", cmds[0]); + assertOpCodeEquals("0: new #6", cmds[0]); assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #8", cmds[2]); + assertOpCodeEquals("4: ldc #7", cmds[2]); assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #9", cmds[4]); + assertOpCodeEquals("8: invokespecial #8", cmds[4]); assertOpCodeEquals("11: astore_1", cmds[5]); assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #10", cmds[7]); + assertOpCodeEquals("13: invokevirtual #9", cmds[7]); assertOpCodeEquals("16: return", cmds[8]); } diff --git a/group01/895457260/code/src/test/java/jvm/EmployeeV1.java b/group01/895457260/code/src/test/java/jvm/EmployeeV1.java index 84cdf0d4e6..f2f7faccc8 100644 --- a/group01/895457260/code/src/test/java/jvm/EmployeeV1.java +++ b/group01/895457260/code/src/test/java/jvm/EmployeeV1.java @@ -1,28 +1,31 @@ package jvm; +import jvm.engine.ConsolePrinter; + public class EmployeeV1 { - - - private String name; + + private String name; private int age; - + public EmployeeV1(String name, int age) { this.name = name; - this.age = age; - } + this.age = age; + } public void setName(String name) { this.name = name; } - public void setAge(int age){ - this.age = age; + + public void setAge(int age) { + this.age = age; } - public void sayHello() { - System.out.println("Hello , this is class Employee "); + + public void sayHello() { + ConsolePrinter.println("Hello , this is class Employee "); } - public static void main(String[] args){ - EmployeeV1 p = new EmployeeV1("Andy",29); - p.sayHello(); - + + public static void main(String[] args) { + EmployeeV1 p = new EmployeeV1("Andy", 29); + p.sayHello(); } } \ No newline at end of file diff --git a/group01/895457260/code/src/test/java/jvm/engine/MiniJVMTest.java b/group01/895457260/code/src/test/java/jvm/engine/MiniJVMTest.java new file mode 100644 index 0000000000..a43af32454 --- /dev/null +++ b/group01/895457260/code/src/test/java/jvm/engine/MiniJVMTest.java @@ -0,0 +1,25 @@ +package jvm.engine; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class MiniJVMTest { + + private static final String PATH = "target/test-classes"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testRun() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "jvm.EmployeeV1"); + } + +} From 2689f89205a771dc0c49266b00d9f8d422d8f591 Mon Sep 17 00:00:00 2001 From: lzbferrari Date: Mon, 1 May 2017 01:07:10 +0800 Subject: [PATCH 369/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9javap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/lzb/common/utils/AppUtils.java | 22 ++++++++++++++ .../main/java/me/lzb/jvm/cmd/BiPushCmd.java | 2 +- .../main/java/me/lzb/jvm/cmd/GetFieldCmd.java | 5 +++- .../me/lzb/jvm/cmd/GetStaticFieldCmd.java | 5 +++- .../java/me/lzb/jvm/cmd/InvokeSpecialCmd.java | 6 +++- .../java/me/lzb/jvm/cmd/InvokeVirtualCmd.java | 5 ++++ .../src/main/java/me/lzb/jvm/cmd/LdcCmd.java | 9 ++++-- .../java/me/lzb/jvm/cmd/NoOperandCmd.java | 4 +++ .../java/me/lzb/jvm/cmd/OneOperandCmd.java | 1 - .../main/java/me/lzb/jvm/cmd/PutFieldCmd.java | 5 +++- .../java/me/lzb/jvm/cmd/TwoOperandCmd.java | 8 ++--- .../me/lzb/jvm/constant/FieldRefInfo.java | 5 ++++ .../me/lzb/jvm/constant/MethodRefInfo.java | 4 +++ .../me/lzb/jvm/constant/NameAndTypeInfo.java | 12 +++++--- .../java/me/lzb/jvm/constant/StringInfo.java | 5 ++++ .../java/me/lzb/jvm/print/ClassPrinter.java | 25 +++++++++++++++- .../java/me/lzb/jvm/print/PrintFormat.java | 29 ++++++++++++++----- .../main/java/me/lzb/other/VariableTest.java | 24 --------------- 18 files changed, 127 insertions(+), 49 deletions(-) create mode 100644 group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/AppUtils.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/VariableTest.java diff --git a/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/AppUtils.java b/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/AppUtils.java new file mode 100644 index 0000000000..906c88e747 --- /dev/null +++ b/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/AppUtils.java @@ -0,0 +1,22 @@ +package me.lzb.common.utils; + +/** + * Created by lzbfe on 2017/4/29. + */ +public class AppUtils { + + /** + * 获取一个数的位数 + * @param i + * @return + */ + public static int getDigit(int i) { + int a = i; + int c = 0; + while (a > 0) { + a = a / 10; + c++; + } + return c; + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java index 33ffcf8848..a39481cc02 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java @@ -18,7 +18,7 @@ public BiPushCmd(ClassFile clzFile, String opCode) { @Override public String toString(ConstantPool pool) { - return this.getOffset() + ": " + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); } public String toString() { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java index acb6a1fa4a..ed7c1fd13c 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java @@ -16,10 +16,13 @@ public GetFieldCmd(ClassFile clzFile, String opCode) { @Override public String toString(ConstantPool pool) { - return super.getOperandAsField(pool); } + public String toString() { + return toString(clzFile.getConstantPool()); + } + @Override public void execute(StackFrame frame, ExecutionResult result) { FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java index f6f8cf89ee..66185039b9 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java @@ -17,10 +17,13 @@ public GetStaticFieldCmd(ClassFile clzFile, String opCode) { @Override public String toString(ConstantPool pool) { - return super.getOperandAsField(pool); } + public String toString() { + return toString(clzFile.getConstantPool()); + } + @Override public void execute(StackFrame frame, ExecutionResult result) { FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java index 8677e66247..09bd9e42d1 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java @@ -18,10 +18,14 @@ public InvokeSpecialCmd(ClassFile clzFile, String opCode) { @Override public String toString(ConstantPool pool) { - return super.getOperandAsMethod(pool); } + public String toString() { + return toString(clzFile.getConstantPool()); + } + + @Override public void execute(StackFrame frame, ExecutionResult result) { MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java index afe71f114d..cd68a52812 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java @@ -21,6 +21,11 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + public String toString() { + return toString(clzFile.getConstantPool()); + } + + @Override public void execute(StackFrame frame, ExecutionResult result) { //先得到对该方法的描述 diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java index 5692567867..a47d92e53c 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java @@ -18,7 +18,7 @@ public LdcCmd(ClassFile clzFile, String opCode) { @Override public String toString(ConstantPool pool) { - ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + ConstantInfo info = pool.getConstantInfo(this.getOperand()); String value = "TBD"; if (info instanceof StringInfo) { @@ -26,10 +26,15 @@ public String toString(ConstantPool pool) { value = strInfo.toString(); } - return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " #" + getOffset() + " // String " + value; + + } + public String toString() { + return toString(clzFile.getConstantPool()); } + @Override public void execute(StackFrame frame, ExecutionResult result) { ConstantPool pool = this.getConstantPool(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java index 63e627f710..09d823fc96 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java @@ -18,6 +18,10 @@ public String toString(ConstantPool pool) { return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); } + public String toString() { + return toString(clzFile.getConstantPool()); + } + @Override public void execute(StackFrame frame, ExecutionResult result) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java index 00805c5dc7..de9391fb56 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java @@ -12,7 +12,6 @@ public OneOperandCmd(ClassFile clzFile, String opCode) { } public int getOperand() { - return this.operand; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java index 7211902179..1300f888a6 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java @@ -18,10 +18,13 @@ public PutFieldCmd(ClassFile clzFile, String opCode) { @Override public String toString(ConstantPool pool) { - return super.getOperandAsField(pool); } + public String toString() { + return toString(clzFile.getConstantPool()); + } + @Override public void execute(StackFrame frame, ExecutionResult result) { FieldRefInfo fieldRef = (FieldRefInfo) this.getConstantInfo(this.getIndex()); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java index b29c491519..6cd4c2fe0b 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java @@ -39,15 +39,15 @@ protected String getOperandAsClassInfo(ConstantPool pool) { int index = getIndex(); String codeTxt = getReadableCodeText(); ClassInfo info = (ClassInfo) pool.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #" + index + " " + info.getClassName(); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #" + index + " " + "// class " + info.getClassName(); } protected String getOperandAsMethod(ConstantPool pool) { int index = getIndex(); String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); +// ConstantInfo constInfo = this.getConstantInfo(index); MethodRefInfo info = (MethodRefInfo) this.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #" + getOffset() +" // Method "+ info.toString(); } protected String getOperandAsField(ConstantPool pool) { @@ -55,7 +55,7 @@ protected String getOperandAsField(ConstantPool pool) { String codeTxt = getReadableCodeText(); FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #"+ getOffset() +" // Field "+ info.toString(); } public int getLength() { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java index 8b3ad3a673..6ceebd96aa 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java @@ -56,4 +56,9 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info) this.getConstantInfo(classInfo.getUtf8Index()); return utf8Info.getValue(); } + + public String toString() { + NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); + return typeInfo.getName() + ":" + typeInfo.getTypeInfo(); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java index 93c2e69755..0755af98ed 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java @@ -58,4 +58,8 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + public String toString(){ + return this.getMethodName() + ":" + this.getParamAndReturnType() ; + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java index 811254a08a..7d14bf3bdc 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java @@ -42,15 +42,19 @@ public void setIndex2(int index2) { } - public String getName(){ + public String getName() { ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); + UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(index1); return utf8Info1.getValue(); } - public String getTypeInfo(){ + public String getTypeInfo() { ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2); + UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2); return utf8Info2.getValue(); } + + public String toString() { + return getName() + ":" + getTypeInfo(); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java index 5d5fc284af..0af04e46bb 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java @@ -30,4 +30,9 @@ public int getIndex() { public void setIndex(int index) { this.index = index; } + + public String toString(){ + return getConstantPool().getUTF8String(index); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java index 0b1566669a..f5b008a41b 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java @@ -1,5 +1,6 @@ package me.lzb.jvm.print; +import me.lzb.common.utils.AppUtils; import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ConstantInfo; import me.lzb.jvm.constant.ConstantPool; @@ -13,9 +14,14 @@ public class ClassPrinter { private ConstantPool pool; + private int poolLong; + public ClassPrinter(ClassFile classFile) { this.classFile = classFile; this.pool = classFile.getConstantPool(); + + this.poolLong = AppUtils.getDigit(this.pool.getSize()); + } @@ -26,11 +32,28 @@ public void print() { System.out.println("Constant Pool:"); + for (int i = 1; i <= pool.getSize(); i++) { ConstantInfo constantInfo = pool.getConstantInfo(i); - System.out.print("#" + i + " = "); + System.out.print(dq(i) + " = "); constantInfo.print(visitor); } } + private String dq(int i) { + int iLong = AppUtils.getDigit(i); + + int c = poolLong - iLong; + + StringBuffer sb = new StringBuffer(); + if (c > 0) { + for (int j = 0; j < c; j++) { + sb.append(" "); + } + } + sb.append("#"); + sb.append(i); + return sb.toString(); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java index 663496de8e..e709cd8538 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java @@ -8,14 +8,15 @@ */ public class PrintFormat implements PrintVisitor { + private int FOURTEENTH = 14; @Override public void visitBasicMsg(ClassFile info) { System.out.println("Access flag : " + info.getAccessFlag().getFlagString()); - System.out.println("Class Name:" + info.getClassName()); + System.out.println("Class name:" + info.getClassName()); - System.out.println("Super Class Name:" + info.getSuperClassName()); + System.out.println("Super Class name:" + info.getSuperClassName()); System.out.println("minor version:" + info.getMinorVersion()); @@ -27,31 +28,43 @@ public void visitBasicMsg(ClassFile info) { @Override public void visistUTF8(UTF8Info info) { - System.out.println("UTF8 " + info.getValue()); + System.out.println("UTF8 " + info.getValue()); } @Override public void visitClassInfo(ClassInfo info) { - System.out.println("Class #" + info.getUtf8Index() + " " + info.getClassName()); + System.out.println("Class #" + getSpace(info.getUtf8Index() + "") + "// " + info.getClassName()); } @Override public void visitFieldRef(FieldRefInfo info) { - System.out.println("FieldRef #" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); + System.out.println("FieldRef #" + getSpace(info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()) + "// " + info.getClassName() + ". " + info.toString()); } @Override public void visitMethodRef(MethodRefInfo info) { - System.out.println("MethodRef #" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()); + System.out.println("MethodRef #" + getSpace(info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()) + "// " + info.getClassName() + ". " + info.toString()); } @Override public void visitNameAndType(NameAndTypeInfo info) { - System.out.println("NameAndType #" + info.getIndex1() + ":#" + info.getIndex2()); + // // + System.out.println("NameAndType #" + getSpace(info.getIndex1() + ":#" + info.getIndex2()) + "// " + info.toString()); } @Override public void visitString(StringInfo info) { - System.out.println("String #" + info.getIndex()); + System.out.println("String #" + getSpace(info.getIndex() + "") + "// " + info.toString()); + } + + + private String getSpace(String str) { + int spaceCount = FOURTEENTH - str.length(); + + StringBuffer spaceBuffer = new StringBuffer(); + for (int i = 0; i < spaceCount; i++) { + spaceBuffer.append(" "); + } + return str + spaceBuffer.toString(); } } diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/VariableTest.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/VariableTest.java deleted file mode 100644 index c33995da5f..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/VariableTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package me.lzb.other; - -/** - * Created by LZB on 2017/4/25. - */ -public class VariableTest { - //instance变量 - private int x; - - //局部变量 - public void localVar(int val) { - int j = 0; - for (int i = 0; i < val; i++) { - j += 1; - } - } - - //实例变量 - public void instanceVar(int val) { - for (int i = 0; i < val; i++) { - x += 1; - } - } -} From 4dd28500455e015482d38943de0e85946e5555f9 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 1 May 2017 09:32:27 +0800 Subject: [PATCH 370/552] =?UTF-8?q?=E5=AE=8C=E6=88=90Method=E5=92=8CField?= =?UTF-8?q?=E7=9A=84parse(jvm=E7=AC=AC3=E6=AC=A1=E4=BD=9C=E4=B8=9A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/attr/CodeAttr.java | 39 ++++++++++++++++--- .../coderising/jvm/method/Method.java | 22 +++++++++-- .../jvm/test/ClassFileloaderTest.java | 4 +- 3 files changed, 55 insertions(+), 10 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java index 6c92bd0cf2..29feb072f7 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java @@ -53,7 +53,7 @@ public static CodeAttr parse_V2(ClassFile clzFile, ByteCodeIterator iter){ // ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); int exceptionTableLen = iter.nextU2toInt(); //TODO 处理exception @@ -74,7 +74,6 @@ public static CodeAttr parse_V2(ClassFile clzFile, ByteCodeIterator iter){ iter.skip(-2); //line item table if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ - LineNumberTable t = LineNumberTable.parse(iter); codeAttr.setLineNumberTable(t); } @@ -89,15 +88,45 @@ else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ else{ throw new RuntimeException("Need code to process " + subAttrName); } - - } return codeAttr; } public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attributeNameIndex = iter.nextU2toInt(); + int attributeLength = iter.nextU4toInt(); + int maxStack = iter.nextU2toInt(); + int maxLocals = iter.nextU2toInt(); + int codeLength = iter.nextU4toInt(); + + String code = iter.nextUxToHexString(codeLength); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + + int exceptionTableLen = iter.nextU2toInt(); + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + } - return null; + int attributesCount = iter.nextU2toInt(); + for (int i=0; i Date: Mon, 1 May 2017 14:08:45 +0800 Subject: [PATCH 371/552] little improve --- .../coding2017/coderising/jvm/attr/LineNumberTable.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java index 75891b7acc..207000e7c1 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/LineNumberTable.java @@ -7,7 +7,7 @@ public class LineNumberTable extends AttributeInfo { - List items = new ArrayList(); + List items = new ArrayList<>(); private static class LineNumberItem{ int startPC; From 7fdcbf5a3a2cb74851214b7f56ffee5ef1cdd5ab Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 1 May 2017 15:35:23 +0800 Subject: [PATCH 372/552] =?UTF-8?q?=E6=95=B4=E7=90=86cmd=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/queue/CircleQueue.java | 5 + .../coding2017/basic/queue/Josephus.java | 20 +++ .../coding2017/basic/queue/JosephusTest.java | 27 ++++ .../coding2017/basic/queue/Queue.java | 61 +++++++++ .../basic/queue/QueueWithTwoStacks.java | 40 ++++++ .../coderising/jvm/attr/CodeAttr.java | 81 +++-------- .../coderising/jvm/clz/ClassFile.java | 14 +- .../coderising/jvm/cmd/BiPushCmd.java | 22 +++ .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ++++++++++++++++++ .../coderising/jvm/cmd/CommandParser.java | 85 ++++++++++++ .../coderising/jvm/cmd/GetFieldCmd.java | 22 +++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 20 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 22 +++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 +++ .../coding2017/coderising/jvm/cmd/LdcCmd.java | 30 ++++ .../coderising/jvm/cmd/NewObjectCmd.java | 19 +++ .../coderising/jvm/cmd/NoOperandCmd.java | 23 ++++ .../coderising/jvm/cmd/OneOperandCmd.java | 28 ++++ .../coderising/jvm/cmd/PutFieldCmd.java | 20 +++ .../coderising/jvm/cmd/TwoOperandCmd.java | 64 +++++++++ .../coderising/jvm/method/Method.java | 6 +- .../jvm/print/ClassFilePrinter.java | 42 ++++++ .../jvm/print/ConstantPoolPrinter.java | 19 +++ .../jvm/test/ClassFileloaderTest.java | 84 ++++++++++++ 24 files changed, 836 insertions(+), 68 deletions(-) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/JosephusTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Queue.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacks.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/CommandParser.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/LdcCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ConstantPoolPrinter.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..104ca0c92f --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java @@ -0,0 +1,5 @@ +package com.github.miniyk2012.coding2017.basic.queue; + +public class CircleQueue { + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java new file mode 100644 index 0000000000..199a08628c --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java @@ -0,0 +1,20 @@ +package com.github.miniyk2012.coding2017.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + return null; + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/JosephusTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..6c7bf78419 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.github.miniyk2012.coding2017.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Queue.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Queue.java new file mode 100644 index 0000000000..7db4923e15 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Queue.java @@ -0,0 +1,61 @@ +package com.github.miniyk2012.coding2017.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacks.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..4f7ba31387 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,40 @@ +package com.github.miniyk2012.coding2017.basic.queue; + +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + } + diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java index 29feb072f7..abc89a94d0 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java @@ -2,6 +2,7 @@ import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.cmd.ByteCodeCommand; import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; @@ -14,21 +15,27 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, + int attrLen, + int maxStack, + int maxLocals, + int codeLen, + String code, + ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -38,60 +45,7 @@ public void setLineNumberTable(LineNumberTable t) { public void setLocalVariableTable(LocalVariableTable t) { this.localVarTable = t; } - - public static CodeAttr parse_V2(ClassFile clzFile, ByteCodeIterator iter){ - - int attrNameIndex = iter.nextU2toInt(); - int attrLen = iter.nextU4toInt(); - int maxStack = iter.nextU2toInt(); - int maxLocals = iter.nextU2toInt(); - int codeLen = iter.nextU4toInt(); - - String code = iter.nextUxToHexString(codeLen); - - System.out.println(code); - - // ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); - - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); - - int exceptionTableLen = iter.nextU2toInt(); - //TODO 处理exception - if(exceptionTableLen>0){ - String exTable = iter.nextUxToHexString(exceptionTableLen); - System.out.println("Encountered exception table , just ignore it :" + exTable); - - } - - - int subAttrCount = iter.nextU2toInt(); - - for(int x=1; x<=subAttrCount; x++){ - int subAttrIndex = iter.nextU2toInt(); - String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); - - //已经向前移动了U2, 现在退回去。 - iter.skip(-2); - //line item table - if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ - LineNumberTable t = LineNumberTable.parse(iter); - codeAttr.setLineNumberTable(t); - } - else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ - LocalVariableTable t = LocalVariableTable.parse(iter); - codeAttr.setLocalVariableTable(t); - } - else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ - StackMapTable t = StackMapTable.parse(iter); - codeAttr.setStackMapTable(t); - } - else{ - throw new RuntimeException("Need code to process " + subAttrName); - } - } - - return codeAttr; - } + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int attributeNameIndex = iter.nextU2toInt(); int attributeLength = iter.nextU4toInt(); @@ -100,7 +54,7 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int codeLength = iter.nextU4toInt(); String code = iter.nextUxToHexString(codeLength); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, null); int exceptionTableLen = iter.nextU2toInt(); if(exceptionTableLen>0){ @@ -132,9 +86,9 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); buffer.append("Code:").append(code).append("\n"); - /*for(int i=0;i codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/CommandParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..aebfd87058 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; + +import java.util.List; + + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/GetFieldCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..f996abe54c --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/GetStaticFieldCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..5627e5efb0 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/InvokeSpecialCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..0ff685b960 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,22 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/InvokeVirtualCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..f9688b128b --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/LdcCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..4e8e535bcc --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantInfo; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/NewObjectCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..6bcac6b662 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/NoOperandCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..d63e47ae17 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/OneOperandCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..00e7b09a67 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,28 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/PutFieldCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..bb2f8f2efd --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/TwoOperandCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..2f7fd67303 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,64 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.cmd; + + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java index f7e09075f5..249591d598 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/method/Method.java @@ -4,8 +4,8 @@ import com.github.miniyk2012.coding2017.coderising.jvm.attr.AttributeInfo; import com.github.miniyk2012.coding2017.coderising.jvm.attr.CodeAttr; import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.cmd.ByteCodeCommand; import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; -import com.github.miniyk2012.coding2017.coderising.jvm.constant.UTF8Info; import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; public class Method { @@ -109,4 +109,8 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ClassFilePrinter.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..c52df283b0 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,42 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.print; + +import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import com.github.miniyk2012.coding2017.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ConstantPoolPrinter.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..4415a7236c --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,19 @@ +package com.github.miniyk2012.coding2017.coderising.jvm.print; + + +import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java index 0675712b1f..81487f8f99 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java @@ -2,6 +2,10 @@ import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassIndex; +import com.github.miniyk2012.coding2017.coderising.jvm.cmd.BiPushCmd; +import com.github.miniyk2012.coding2017.coderising.jvm.cmd.ByteCodeCommand; +import com.github.miniyk2012.coding2017.coderising.jvm.cmd.OneOperandCmd; +import com.github.miniyk2012.coding2017.coderising.jvm.cmd.TwoOperandCmd; import com.github.miniyk2012.coding2017.coderising.jvm.constant.*; import com.github.miniyk2012.coding2017.coderising.jvm.field.Field; import com.github.miniyk2012.coding2017.coderising.jvm.loader.ClassFileLoader; @@ -248,4 +252,84 @@ private void assertMethodEquals(ConstantPool pool, Method m , String expectedNam Assert.assertEquals(expectedCode, code); } + + /** + * 下面是第四次作业Cmd的测试用例 + */ + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + + } From bfed3effd277355ca225608d782eb2ecfc341445 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Mon, 1 May 2017 21:29:09 +0800 Subject: [PATCH 373/552] =?UTF-8?q?Jvm=E7=AC=AC=E5=9B=9B=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=EF=BC=9Acmds=E5=91=BD=E4=BB=A4=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/LinkedList.java | 2 +- .../coderising/array/ArrayUtil.java | 2 +- .../coderising/jvm/attr/CodeAttr.java | 9 ++- .../coderising/jvm/clz/ClassFile.java | 10 ++- .../coderising/jvm/cmd/ByteCodeCommand.java | 8 +-- .../coderising/jvm/cmd/CommandParser.java | 66 ++++++++++++++++++- .../jvm/loader/ByteCodeIterator.java | 6 +- .../jvm/loader/ClassFileParser.java | 2 +- .../coderising/jvm/method/Method.java | 43 ++++-------- .../jvm/print/ConstantPoolPrinter.java | 2 +- .../jvm/test/ClassFileloaderTest.java | 13 +++- 11 files changed, 112 insertions(+), 51 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/LinkedList.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/LinkedList.java index 0ba1d9861c..2fdc34fc25 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/LinkedList.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/LinkedList.java @@ -318,7 +318,7 @@ public LinkedList intersection(LinkedList list){ LinkedList cList = new LinkedList(); - // TODO:为了方便起见,先各自复制并去重,虽然效率不高,以后有时间再优化 + // 为了方便起见,先各自复制并去重,虽然效率不高,以后有时间再优化 LinkedList aList = LinkedList.copy(this); LinkedList bList = LinkedList.copy(list); diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/array/ArrayUtil.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/array/ArrayUtil.java index 41bc6ad344..bedf53dbc9 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/array/ArrayUtil.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/array/ArrayUtil.java @@ -119,7 +119,7 @@ public int[] fibonacci(int max){ * @return */ public int[] getPrimes(int max){ - // TODO 使用筛法,写的不好,有待改善 + // TODO 使用筛法,写的不好,有待改善,见《敏捷开发》一书,我有空就重构 if (max <= 2) return new int[0]; List list = new ArrayList<>(); int i; diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java index abc89a94d0..640250343f 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/attr/CodeAttr.java @@ -3,6 +3,7 @@ import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; import com.github.miniyk2012.coding2017.coderising.jvm.cmd.ByteCodeCommand; +import com.github.miniyk2012.coding2017.coderising.jvm.cmd.CommandParser; import com.github.miniyk2012.coding2017.coderising.jvm.constant.ConstantPool; import com.github.miniyk2012.coding2017.coderising.jvm.loader.ByteCodeIterator; @@ -54,7 +55,8 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int codeLength = iter.nextU4toInt(); String code = iter.nextUxToHexString(codeLength); - CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, null); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, cmds); int exceptionTableLen = iter.nextU2toInt(); if(exceptionTableLen>0){ @@ -98,8 +100,5 @@ private void setStackMapTable(StackMapTable t) { this.stackMapTable = t; } - - - - + } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java index 745f98636e..54aaf6d95e 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/clz/ClassFile.java @@ -84,11 +84,17 @@ public String getSuperClassName(){ } public Method getMethod(String methodName, String paramAndReturnType){ + for (Method method: methods) { + String mName = method.getMethodName(); + String desc = method.getDescriptor(); + if (mName.equals(methodName) && desc.equals(paramAndReturnType)) { + return method; + } + } return null; } public Method getMainMethod(){ - - return null; + return getMethod("main", "([Ljava/lang/String;)V"); } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java index bb6cbb8244..cc83c38702 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java @@ -10,11 +10,11 @@ public abstract class ByteCodeCommand { - String opCode; + String opCode; // 该指令的助记符 ClassFile clzFile; - private int offset; + private int offset; // 该命令在某方法指令中的偏移量 - private static Map codeMap = new HashMap(); + private static Map codeMap = new HashMap(); // 二级制码与助记符的对应关系 static{ codeMap.put("01", "aconst_null"); @@ -102,7 +102,7 @@ public String getOpCode() { return opCode; } - public abstract int getLength(); + public abstract int getLength(); // 以后goto语句要用到 diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/CommandParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/CommandParser.java index aebfd87058..a21a9f66a3 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/CommandParser.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/CommandParser.java @@ -2,6 +2,7 @@ import com.github.miniyk2012.coding2017.coderising.jvm.clz.ClassFile; +import java.util.LinkedList; import java.util.List; @@ -44,8 +45,69 @@ public class CommandParser { public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - return null; + CommandIterator cIter = new CommandIterator(codes); + List cmds = new LinkedList<>(); + // 将字符串解析为ByteCodeCommand[] + while (cIter.hasNext()) { // todo 重构,1.不应该用这么多的if语句 2.大量重复代码 + String opCode = cIter.next2CharAsString().toUpperCase(); + if (opCode.equalsIgnoreCase(getfield)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(cIter.next2CharAsInt()); + cmd.setOprand2(cIter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equalsIgnoreCase(getstatic)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(cIter.next2CharAsInt()); + cmd.setOprand2(cIter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equalsIgnoreCase(invokespecial)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(cIter.next2CharAsInt()); + cmd.setOprand2(cIter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equalsIgnoreCase(invokevirtual)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(cIter.next2CharAsInt()); + cmd.setOprand2(cIter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equalsIgnoreCase(ldc)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(cIter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equalsIgnoreCase(new_object)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + cmd.setOprand1(cIter.next2CharAsInt()); + cmd.setOprand2(cIter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equalsIgnoreCase(putfield)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(cIter.next2CharAsInt()); + cmd.setOprand2(cIter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equalsIgnoreCase(bipush)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(cIter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equalsIgnoreCase(aload_0) + || opCode.equalsIgnoreCase(aload_1) + || opCode.equalsIgnoreCase(aload_2) + || opCode.equalsIgnoreCase(astore_1) + || opCode.equalsIgnoreCase(iload_1) + || opCode.equalsIgnoreCase(iload_2) + || opCode.equalsIgnoreCase(voidreturn) + || opCode.equalsIgnoreCase(dup) + ) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("not implement cmd: " + opCode); + } + + } + calcuateOffset(cmds); + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; } private static void calcuateOffset(List cmds) { diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java index ef2a984ffa..39500bb87c 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java @@ -25,7 +25,7 @@ public int nextU2toInt() { } public int nextU4toInt() { - return assignments.jvm.util.Util.byteToInt(new byte[] { codes[point++], codes[point++], codes[point++], codes[point++] }); + return Util.byteToInt(new byte[] { codes[point++], codes[point++], codes[point++], codes[point++] }); } /** @@ -72,7 +72,7 @@ public void seek(int n) { } public String nextU4ToHexString() { - return assignments.jvm.util.Util.byteToHexString((new byte[] { codes[point++], codes[point++], codes[point++], codes[point++] })); + return Util.byteToHexString((new byte[] { codes[point++], codes[point++], codes[point++], codes[point++] })); } public String nextUxToHexString(int len) { @@ -81,7 +81,7 @@ public String nextUxToHexString(int len) { for (int i = 0; i < len; i++) { tmp[i] = codes[point++]; } - return assignments.jvm.util.Util.byteToHexString(tmp).toLowerCase(); + return Util.byteToHexString(tmp).toLowerCase(); } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java index f3457e1ae5..1e7ad606d9 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ClassFileParser.java @@ -70,7 +70,7 @@ protected ConstantPool parseConstantPool(ByteCodeIterator iter) { private void parseInterfaces(ByteCodeIterator iter) { int interfaceCount = iter.nextU2toInt(); - System.out.println("interfaceCount:" + interfaceCount); + // System.out.println("interfaceCount:" + interfaceCount); for (int i=0; i Date: Mon, 1 May 2017 22:24:22 +0800 Subject: [PATCH 374/552] little improve --- .../coderising/jvm/cmd/ByteCodeCommand.java | 19 +++++++------------ .../coding2017/coderising/jvm/cmd/LdcCmd.java | 2 +- .../coderising/jvm/cmd/PutFieldCmd.java | 2 -- .../coderising/jvm/cmd/TwoOperandCmd.java | 3 +-- .../coderising/jvm/constant/FieldRefInfo.java | 3 --- .../jvm/print/ClassFilePrinter.java | 4 ++-- .../jvm/print/ConstantPoolPrinter.java | 5 ++--- .../jvm/test/ClassFileloaderTest.java | 19 +++++++++++++++---- 8 files changed, 28 insertions(+), 29 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java index cc83c38702..46d0966ea9 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/ByteCodeCommand.java @@ -67,10 +67,7 @@ public abstract class ByteCodeCommand { codeMap.put("12", "ldc"); } - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ this.clzFile = clzFile; @@ -88,25 +85,22 @@ public int getOffset() { public void setOffset(int offset) { this.offset = offset; } + protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); + return getConstantPool().getConstantInfo(index); } protected ConstantPool getConstantPool(){ return this.getClassFile().getConstantPool(); } - - - + public String getOpCode() { return opCode; } public abstract int getLength(); // 以后goto语句要用到 - - - - + + @Override public String toString(){ StringBuffer buffer = new StringBuffer(); @@ -114,12 +108,13 @@ public String toString(){ return buffer.toString(); } + public abstract String toString(ConstantPool pool); public String getReadableCodeText(){ String txt = codeMap.get(opCode); if(txt == null){ - return opCode; + throw new RuntimeException("codeMap don't contain: " + opCode); } return txt; } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/LdcCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/LdcCmd.java index 4e8e535bcc..1aef5af580 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/LdcCmd.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/LdcCmd.java @@ -15,7 +15,7 @@ public LdcCmd(ClassFile clzFile, String opCode) { @Override public String toString(ConstantPool pool) { - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + ConstantInfo info = pool.getConstantInfo(this.getOperand()); String value = "TBD"; if(info instanceof StringInfo){ diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/PutFieldCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/PutFieldCmd.java index bb2f8f2efd..46a878940f 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/PutFieldCmd.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/PutFieldCmd.java @@ -15,6 +15,4 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - - } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/TwoOperandCmd.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/TwoOperandCmd.java index 2f7fd67303..9cb8173567 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/TwoOperandCmd.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/cmd/TwoOperandCmd.java @@ -39,14 +39,13 @@ public int getIndex(){ protected String getOperandAsClassInfo(ConstantPool pool){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + ClassInfo info = (ClassInfo)getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); } protected String getOperandAsMethod(ConstantPool pool){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java index 98c5ced1a9..b69e5aebc6 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/constant/FieldRefInfo.java @@ -34,9 +34,6 @@ public String toString(){ public String getClassName(){ ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex()); - - // UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index()); - // return utf8Info.getValue(); return classInfo.getClassName(); } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ClassFilePrinter.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ClassFilePrinter.java index c52df283b0..b2887df85e 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ClassFilePrinter.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ClassFilePrinter.java @@ -28,10 +28,10 @@ public void print(){ } public static void main(String[] args){ - String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\bin"; + String path = ClassFilePrinter.class.getClassLoader().getResource("jvm").getPath(); ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path); - String className = "com.coderising.jvm.test.EmployeeV1"; + String className = "com.github.miniyk2012.coding2017.jvm.test.EmployeeV1"; ClassFile clzFile = loader.loadClass(className); diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ConstantPoolPrinter.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ConstantPoolPrinter.java index fd07affd2e..f3c164be13 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ConstantPoolPrinter.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/print/ConstantPoolPrinter.java @@ -8,12 +8,11 @@ public class ConstantPoolPrinter { ConstantPoolPrinter(ConstantPool pool){ this.pool = pool; } + public void print(){ // todo: 实现javap System.out.println("Constant Pool:"); - - - + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java index 52ee7f4426..b2b06459f8 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/test/ClassFileloaderTest.java @@ -11,10 +11,7 @@ import com.github.miniyk2012.coding2017.coderising.jvm.loader.ClassFileLoader; import com.github.miniyk2012.coding2017.coderising.jvm.method.Method; import com.github.miniyk2012.coding2017.coderising.jvm.util.Util; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.*; import java.util.List; @@ -335,11 +332,25 @@ private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ * 编写代码时做的一些测试用例 */ @Test + @Ignore public void otherThing() { { // Method的若干方法 Method mainMethod = this.clzFile.getMainMethod(); Assert.assertEquals("main", mainMethod.getMethodName()); Assert.assertEquals("([Ljava/lang/String;)V", mainMethod.getDescriptor()); + System.out.println(mainMethod); + } + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + System.out.println(sayHelloMethod); + } + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + System.out.println(setNameMethod); + } + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + System.out.println(initMethod); } } From c186b36fc05be96ef6e42867a4c6df56ba7e8e88 Mon Sep 17 00:00:00 2001 From: lzb Date: Mon, 1 May 2017 23:40:32 +0800 Subject: [PATCH 375/552] =?UTF-8?q?jvm=E4=BD=9C=E4=B8=9A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1148285693/learning2017/common/pom.xml | 12 +- .../java/me/lzb/common/utils/StringUtils.java | 10 ++ .../1148285693/learning2017/mini-jvm/pom.xml | 10 +- .../main/java/me/lzb/jvm/cmd/BiPushCmd.java | 14 +- .../java/me/lzb/jvm/cmd/ByteCodeCommand.java | 8 +- .../main/java/me/lzb/jvm/cmd/GetFieldCmd.java | 16 +- .../me/lzb/jvm/cmd/GetStaticFieldCmd.java | 20 +-- .../java/me/lzb/jvm/cmd/InvokeSpecialCmd.java | 13 +- .../java/me/lzb/jvm/cmd/InvokeVirtualCmd.java | 17 +- .../src/main/java/me/lzb/jvm/cmd/LdcCmd.java | 20 +-- .../java/me/lzb/jvm/cmd/NewObjectCmd.java | 17 +- .../java/me/lzb/jvm/cmd/NoOperandCmd.java | 14 +- .../main/java/me/lzb/jvm/cmd/PutFieldCmd.java | 17 +- .../java/me/lzb/jvm/cmd/TwoOperandCmd.java | 14 +- .../main/java/me/lzb/jvm/engine/MiniJVM.java | 3 +- .../java/me/lzb/jvm/engine/StackFrame.java | 7 +- .../java/me/lzb/jvm/loader/CommandParser.java | 163 ++++++++---------- .../me/lzb/jvm/print/ExecutionFormat.java | 111 ++++++++++++ .../me/lzb/jvm/print/ExecutionVisitor.java | 29 ++++ .../java/me/lzb/jvm/print/PrintFormat.java | 19 +- .../java/me/lzb/jvm/print/PrintVisitor.java | 14 +- group24/1148285693/learning2017/other/pom.xml | 16 +- 22 files changed, 335 insertions(+), 229 deletions(-) create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java diff --git a/group24/1148285693/learning2017/common/pom.xml b/group24/1148285693/learning2017/common/pom.xml index 1c062a2db4..61d8e45905 100644 --- a/group24/1148285693/learning2017/common/pom.xml +++ b/group24/1148285693/learning2017/common/pom.xml @@ -2,21 +2,15 @@ - 4.0.0 - - learning2017 me.lzb 1.0 - + 4.0.0 common - common 1.0 + common - - - - +
    \ No newline at end of file diff --git a/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/StringUtils.java b/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/StringUtils.java index 66f70d49f7..76e60a49b8 100644 --- a/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/StringUtils.java +++ b/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/StringUtils.java @@ -5,4 +5,14 @@ */ public class StringUtils extends org.apache.commons.lang3.StringUtils { + + public static String appendSpace(int length, String str) { + int spaceCount = length - str.length(); + + StringBuffer spaceBuffer = new StringBuffer(); + for (int i = 0; i < spaceCount; i++) { + spaceBuffer.append(" "); + } + return str + spaceBuffer.toString(); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/pom.xml b/group24/1148285693/learning2017/mini-jvm/pom.xml index aa0101434b..694ec40612 100644 --- a/group24/1148285693/learning2017/mini-jvm/pom.xml +++ b/group24/1148285693/learning2017/mini-jvm/pom.xml @@ -2,21 +2,17 @@ - 4.0.0 - - learning2017 me.lzb 1.0 - + 4.0.0 mini-jvm - mini_jvm + mini-jvm 1.0 - me.lzb @@ -24,4 +20,4 @@ 1.0 - + \ No newline at end of file diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java index a39481cc02..a662e9a6ff 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java @@ -2,11 +2,11 @@ import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.Heap; import me.lzb.jvm.engine.JavaObject; import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; public class BiPushCmd extends OneOperandCmd { @@ -15,14 +15,9 @@ public BiPushCmd(ClassFile clzFile, String opCode) { } - @Override - public String toString(ConstantPool pool) { - - return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); - } public String toString() { - return toString(clzFile.getConstantPool()); + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + this.getOperand(); } @Override @@ -31,4 +26,9 @@ public void execute(StackFrame frame, ExecutionResult result) { JavaObject jo = Heap.getInstance().newInt(value); frame.getOprandStack().push(jo); } + + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitBiPushCmd(this); + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java index 10bc1042a6..b79f7d7f2c 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java @@ -5,6 +5,7 @@ import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; import java.util.HashMap; import java.util.Map; @@ -57,7 +58,7 @@ public abstract class ByteCodeCommand { public static final String fload_2 = "24"; - private static Map codeMap = new HashMap(); + private static Map codeMap = new HashMap<>(); static { codeMap.put(aconst_null, "aconst_null"); @@ -129,7 +130,7 @@ public void setOffset(int offset) { this.offset = offset; } - protected ConstantInfo getConstantInfo(int index) { + public ConstantInfo getConstantInfo(int index) { return this.getClassFile().getConstantPool().getConstantInfo(index); } @@ -154,7 +155,6 @@ public String toString() { return buffer.toString(); } - public abstract String toString(ConstantPool pool); public String getReadableCodeText() { String txt = codeMap.get(opCode); @@ -165,4 +165,6 @@ public String getReadableCodeText() { } public abstract void execute(StackFrame frame, ExecutionResult result); + + public abstract void printExecute(ExecutionVisitor visitor); } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java index ed7c1fd13c..27429d0695 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java @@ -2,11 +2,11 @@ import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.constant.FieldRefInfo; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.JavaObject; import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; public class GetFieldCmd extends TwoOperandCmd { @@ -14,15 +14,12 @@ public GetFieldCmd(ClassFile clzFile, String opCode) { super(clzFile, opCode); } - @Override - public String toString(ConstantPool pool) { - return super.getOperandAsField(pool); - } - public String toString() { - return toString(clzFile.getConstantPool()); + + return super.getOperandAsField(); } + @Override public void execute(StackFrame frame, ExecutionResult result) { FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); @@ -33,5 +30,10 @@ public void execute(StackFrame frame, ExecutionResult result) { frame.getOprandStack().push(fieldValue); } + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitGetFieldCmd(this); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java index 66185039b9..4144b0dae8 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java @@ -1,12 +1,12 @@ package me.lzb.jvm.cmd; import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.constant.FieldRefInfo; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.Heap; import me.lzb.jvm.engine.JavaObject; import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -15,29 +15,29 @@ public GetStaticFieldCmd(ClassFile clzFile, String opCode) { } - @Override - public String toString(ConstantPool pool) { - return super.getOperandAsField(pool); - } - public String toString() { - return toString(clzFile.getConstantPool()); + return super.getOperandAsField(); } @Override public void execute(StackFrame frame, ExecutionResult result) { - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(this.getIndex()); String className = info.getClassName(); String fieldName = info.getFieldName(); String fieldType = info.getFieldType(); - if("java/lang/System".equals(className) + if ("java/lang/System".equals(className) && "out".equals(fieldName) - && "Ljava/io/PrintStream;".equals(fieldType)){ + && "Ljava/io/PrintStream;".equals(fieldType)) { JavaObject jo = Heap.getInstance().newObject(className); frame.getOprandStack().push(jo); } //TODO 处理非System.out的情况 } + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitGetStaticFieldCmd(this); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java index 09bd9e42d1..de1b9d3493 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java @@ -1,12 +1,12 @@ package me.lzb.jvm.cmd; import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.constant.MethodRefInfo; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.MethodArea; import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.method.Method; +import me.lzb.jvm.print.ExecutionVisitor; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -16,13 +16,9 @@ public InvokeSpecialCmd(ClassFile clzFile, String opCode) { } - @Override - public String toString(ConstantPool pool) { - return super.getOperandAsMethod(pool); - } public String toString() { - return toString(clzFile.getConstantPool()); + return super.getOperandAsMethod(); } @@ -43,5 +39,10 @@ public void execute(StackFrame frame, ExecutionResult result) { result.setNextMethod(nextMethod); } + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitInvokeSpecialCmd(this); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java index cd68a52812..caf195c206 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java @@ -1,13 +1,13 @@ package me.lzb.jvm.cmd; import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.constant.MethodRefInfo; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.JavaObject; import me.lzb.jvm.engine.MethodArea; import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.method.Method; +import me.lzb.jvm.print.ExecutionVisitor; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -15,14 +15,8 @@ public InvokeVirtualCmd(ClassFile clzFile, String opCode) { super(clzFile, opCode); } - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - public String toString() { - return toString(clzFile.getConstantPool()); + return super.getOperandAsMethod(); } @@ -38,7 +32,7 @@ public void execute(StackFrame frame, ExecutionResult result) { if (isSystemOutPrintlnMethod(className, methodName)) { JavaObject jo = (JavaObject) frame.getOprandStack().pop(); String value = jo.toString(); - System.err.println("-------------------" + value + "----------------"); + System.out.println("-------------------" + value + "----------------"); // 这里就是那个out对象, 因为是个假的,直接pop出来 frame.getOprandStack().pop(); @@ -81,6 +75,11 @@ public void execute(StackFrame frame, ExecutionResult result) { result.setNextMethod(m); } + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitInvokeVirtualCmd(this); + } + private boolean isSystemOutPrintlnMethod(String className, String methodName) { return "java/io/PrintStream".equals(className) && "println".equals(methodName); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java index a47d92e53c..8a8278fcb7 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java @@ -8,6 +8,7 @@ import me.lzb.jvm.engine.Heap; import me.lzb.jvm.engine.JavaObject; import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; public class LdcCmd extends OneOperandCmd { @@ -15,10 +16,9 @@ public LdcCmd(ClassFile clzFile, String opCode) { super(clzFile, opCode); } - @Override - public String toString(ConstantPool pool) { - ConstantInfo info = pool.getConstantInfo(this.getOperand()); + public String toString() { + ConstantInfo info = getConstantInfo(this.getOperand()); String value = "TBD"; if (info instanceof StringInfo) { @@ -26,19 +26,14 @@ public String toString(ConstantPool pool) { value = strInfo.toString(); } - return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " #" + getOffset() + " // String " + value; - - } - - public String toString() { - return toString(clzFile.getConstantPool()); + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " #" + getOperand() + " // String " + value; } @Override public void execute(StackFrame frame, ExecutionResult result) { ConstantPool pool = this.getConstantPool(); - ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + ConstantInfo info = pool.getConstantInfo(this.getOperand()); if (info instanceof StringInfo) { StringInfo strInfo = (StringInfo) info; @@ -52,4 +47,9 @@ public void execute(StackFrame frame, ExecutionResult result) { } + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitLdcCmd(this); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java index cb9b4013d0..4b6544b2ce 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java @@ -2,11 +2,11 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ClassInfo; -import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.Heap; import me.lzb.jvm.engine.JavaObject; import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; public class NewObjectCmd extends TwoOperandCmd { @@ -14,21 +14,15 @@ public NewObjectCmd(ClassFile clzFile, String opCode) { super(clzFile, opCode); } - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - public String toString() { - return toString(clzFile.getConstantPool()); + return super.getOperandAsClassInfo(); } @Override public void execute(StackFrame frame, ExecutionResult result) { int index = this.getIndex(); - ClassInfo info = (ClassInfo)this.getConstantInfo(index); + ClassInfo info = (ClassInfo) this.getConstantInfo(index); String clzName = info.getClassName(); @@ -38,5 +32,10 @@ public void execute(StackFrame frame, ExecutionResult result) { frame.getOprandStack().push(jo); } + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitNewObjectCmd(this); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java index 09d823fc96..2657181e94 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java @@ -1,11 +1,11 @@ package me.lzb.jvm.cmd; import me.lzb.jvm.clz.ClassFile; -import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.Heap; import me.lzb.jvm.engine.JavaObject; import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; public class NoOperandCmd extends ByteCodeCommand { @@ -13,13 +13,8 @@ public NoOperandCmd(ClassFile clzFile, String opCode) { super(clzFile, opCode); } - @Override - public String toString(ConstantPool pool) { - return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); - } - public String toString() { - return toString(clzFile.getConstantPool()); + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); } @Override @@ -137,6 +132,11 @@ public void execute(StackFrame frame, ExecutionResult result) { } + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitNoOperandCmd(this); + } + public int getLength() { return 1; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java index 1300f888a6..6d6efcc7fe 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java @@ -2,12 +2,12 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.ClassInfo; -import me.lzb.jvm.constant.ConstantPool; import me.lzb.jvm.constant.FieldRefInfo; import me.lzb.jvm.constant.NameAndTypeInfo; import me.lzb.jvm.engine.ExecutionResult; import me.lzb.jvm.engine.JavaObject; import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; public class PutFieldCmd extends TwoOperandCmd { @@ -16,13 +16,8 @@ public PutFieldCmd(ClassFile clzFile, String opCode) { super(clzFile, opCode); } - @Override - public String toString(ConstantPool pool) { - return super.getOperandAsField(pool); - } - public String toString() { - return toString(clzFile.getConstantPool()); + return super.getOperandAsField(); } @Override @@ -33,7 +28,8 @@ public void execute(StackFrame frame, ExecutionResult result) { NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo) this.getConstantInfo(fieldRef.getNameAndTypeIndex()); // for example : name String fieldName = nameTypeInfo.getName(); - // for example : Ljava/lang/String : 这里不再检查类型 + // for example : Ljava/lang/String : + // TODO 这里不再检查类型 String fieldType = nameTypeInfo.getTypeInfo(); JavaObject fieldValue = frame.getOprandStack().pop(); @@ -42,5 +38,10 @@ public void execute(StackFrame frame, ExecutionResult result) { objectRef.setFieldValue(fieldName, fieldValue); } + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitPutFieldCmd(this); + } + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java index 6cd4c2fe0b..b1c1ac7041 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java @@ -35,27 +35,25 @@ public int getIndex() { return index; } - protected String getOperandAsClassInfo(ConstantPool pool) { + protected String getOperandAsClassInfo() { int index = getIndex(); String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo) pool.getConstantInfo(index); + ClassInfo info = (ClassInfo) getConstantInfo(index); return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #" + index + " " + "// class " + info.getClassName(); } - protected String getOperandAsMethod(ConstantPool pool) { + public String getOperandAsMethod() { int index = getIndex(); String codeTxt = getReadableCodeText(); -// ConstantInfo constInfo = this.getConstantInfo(index); MethodRefInfo info = (MethodRefInfo) this.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #" + getOffset() +" // Method "+ info.toString(); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #" + index + " // Method " + info.toString(); } - protected String getOperandAsField(ConstantPool pool) { + public String getOperandAsField() { int index = getIndex(); - String codeTxt = getReadableCodeText(); FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(index); - return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #"+ getOffset() +" // Field "+ info.toString(); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " #" + index + " // Field " + info.toString(); } public int getLength() { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java index 927c17dcde..fac0c1bb34 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java @@ -2,13 +2,12 @@ import me.lzb.jvm.loader.ClassFileLoader; -import java.io.FileNotFoundException; import java.io.IOException; public class MiniJVM { - public void run(String[] classPaths, String className) throws FileNotFoundException, IOException { + public void run(String[] classPaths, String className) throws IOException { ClassFileLoader loader = new ClassFileLoader(); for (int i = 0; i < classPaths.length; i++) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java index 117ca87aeb..ed641cd931 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java @@ -2,6 +2,8 @@ import me.lzb.jvm.cmd.ByteCodeCommand; import me.lzb.jvm.method.Method; +import me.lzb.jvm.print.ExecutionFormat; +import me.lzb.jvm.print.ExecutionVisitor; import java.util.ArrayList; import java.util.List; @@ -73,7 +75,10 @@ public ExecutionResult execute() { result.setNextAction(ExecutionResult.RUN_NEXT_CMD); //输出执行的命令 - System.out.println(commands[index].toString()); + ExecutionVisitor format = ExecutionFormat.getInstance(); + commands[index].printExecute(format); + +// System.out.println(commands[index].toString()); commands[index].execute(this, result); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java index 829b1670c7..285ff441c7 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java @@ -11,40 +11,6 @@ * Created by LZB on 2017/4/22. */ public class CommandParser { - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; private int index; @@ -74,6 +40,15 @@ private String nextCharsToString(int nextLength) { return String.valueOf(nextChars(nextLength)); } + + private String next2CharAsString() { + return nextCharsToString(2); + } + + private int next2CharAsInt() { + return nextCharsToInt(2); + } + private boolean hasNext() { return index < data.length; } @@ -81,67 +56,71 @@ private boolean hasNext() { public ByteCodeCommand[] parse(ClassFile clzFile) { + List cmds = new ArrayList<>(); while (hasNext()) { - String opCode = nextCharsToString(2); + String opCode = next2CharAsString(); - if (new_object.equals(opCode)) { + if (ByteCodeCommand.new_object.equals(opCode)) { NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); + cmd.setOprand1(next2CharAsInt()); + cmd.setOprand2(next2CharAsInt()); cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { + } else if (ByteCodeCommand.invokespecial.equals(opCode)) { InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - + cmd.setOprand1(next2CharAsInt()); + cmd.setOprand2(next2CharAsInt()); + // System.out.println( cmd.toString(clzFile.getConstPool())); cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); + } else if (ByteCodeCommand.invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(next2CharAsInt()); + cmd.setOprand2(next2CharAsInt()); cmds.add(cmd); - } else if (getfield.equals(opCode)) { + } else if (ByteCodeCommand.getfield.equals(opCode)) { GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - + cmd.setOprand1(next2CharAsInt()); + cmd.setOprand2(next2CharAsInt()); cmds.add(cmd); - } else if (getstatic.equals(opCode)) { + } else if (ByteCodeCommand.getstatic.equals(opCode)) { GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); - - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); - + cmd.setOprand1(next2CharAsInt()); + cmd.setOprand2(next2CharAsInt()); cmds.add(cmd); - } else if (putfield.equals(opCode)) { + } else if (ByteCodeCommand.putfield.equals(opCode)) { PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); - cmd.setOprand1(nextCharsToInt(2)); - cmd.setOprand2(nextCharsToInt(2)); + cmd.setOprand1(next2CharAsInt()); + cmd.setOprand2(next2CharAsInt()); cmds.add(cmd); - } else if (ldc.equals(opCode)) { + } else if (ByteCodeCommand.ldc.equals(opCode)) { LdcCmd cmd = new LdcCmd(clzFile, opCode); - cmd.setOperand(nextCharsToInt(2)); + cmd.setOperand(next2CharAsInt()); cmds.add(cmd); - } else if (bipush.equals(opCode)) { + } else if (ByteCodeCommand.bipush.equals(opCode)) { BiPushCmd cmd = new BiPushCmd(clzFile, opCode); - cmd.setOperand(nextCharsToInt(2)); + cmd.setOperand(next2CharAsInt()); cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + } else if (ByteCodeCommand.dup.equals(opCode) + || ByteCodeCommand.aload_0.equals(opCode) + || ByteCodeCommand.aload_1.equals(opCode) + || ByteCodeCommand.aload_2.equals(opCode) + || ByteCodeCommand.iload_1.equals(opCode) + || ByteCodeCommand.iload_2.equals(opCode) + || ByteCodeCommand.iload_3.equals(opCode) + || ByteCodeCommand.fload_3.equals(opCode) + || ByteCodeCommand.voidreturn.equals(opCode) + || ByteCodeCommand.astore_1.equals(opCode)) { NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); cmds.add(cmd); } else { - throw new RuntimeException("Sorry, the java instruction " + opCode + "has not been implement."); + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); } + } calcuateOffset(cmds); @@ -161,28 +140,28 @@ private static void calcuateOffset(List cmds) { } - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } +// private static class CommandIterator { +// String codes = null; +// int pos = 0; +// +// CommandIterator(String codes) { +// this.codes = codes; +// } +// +// public boolean hasNext() { +// return pos < this.codes.length(); +// } +// +// public String next2CharAsString() { +// String result = codes.substring(pos, pos + 2); +// pos += 2; +// return result; +// } +// +// public int next2CharAsInt() { +// String s = this.next2CharAsString(); +// return Integer.valueOf(s, 16).intValue(); +// } +// +// } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java new file mode 100644 index 0000000000..2bcd612840 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java @@ -0,0 +1,111 @@ +package me.lzb.jvm.print; + +import me.lzb.common.utils.StringUtils; +import me.lzb.jvm.cmd.*; +import me.lzb.jvm.constant.*; + +/** + * Created by LZB on 2017/5/1. + */ +public class ExecutionFormat implements ExecutionVisitor { + + private static final int one = 19; + + private static final int two = 19; + + private static ExecutionFormat format = null; + + public static ExecutionFormat getInstance() { + if (format == null) { + format = new ExecutionFormat(); + } + return format; + } + + private ExecutionFormat(){ + + } + + + @Override + public void visitBiPushCmd(BiPushCmd cmd) { + System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + StringUtils.appendSpace(one, cmd.getReadableCodeText()) + cmd.getOperand()); + } + + @Override + public void visitGetFieldCmd(GetFieldCmd cmd) { + exFile(cmd); + } + + @Override + public void visitGetStaticFieldCmd(GetStaticFieldCmd cmd) { + exFile(cmd); + } + + @Override + public void visitInvokeSpecialCmd(InvokeSpecialCmd cmd) { + exMethod(cmd); + } + + @Override + public void visitInvokeVirtualCmd(InvokeVirtualCmd cmd) { + exMethod(cmd); + } + + @Override + public void visitLdcCmd(LdcCmd cmd) { + ConstantInfo info = cmd.getConstantInfo(cmd.getOperand()); + + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + value = strInfo.toString(); + } + + System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + StringUtils.appendSpace(one, cmd.getReadableCodeText()) + "#" + StringUtils.appendSpace(two, cmd.getOperand() + "") + "// String " + value); + } + + @Override + public void visitNewObjectCmd(NewObjectCmd cmd) { + int index = cmd.getIndex(); + String codeTxt = cmd.getReadableCodeText(); + ClassInfo info = (ClassInfo) cmd.getConstantInfo(index); + System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + StringUtils.appendSpace(one, codeTxt) + "#" + StringUtils.appendSpace(two, index + "") + "// class " + info.getClassName()); + } + + @Override + public void visitNoOperandCmd(NoOperandCmd cmd) { + System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + cmd.getReadableCodeText()); + } + + @Override + public void visitPutFieldCmd(PutFieldCmd cmd) { + exFile(cmd); + } + + + private void exFile(TwoOperandCmd cmd) { + int index = cmd.getIndex(); + String codeTxt = cmd.getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo) cmd.getConstantInfo(index); + System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + StringUtils.appendSpace(one, codeTxt) + "#" + StringUtils.appendSpace(two, index + "") + "// Field " + info.toString()); + } + + private void exMethod(TwoOperandCmd cmd) { + int index = cmd.getIndex(); + String codeTxt = cmd.getReadableCodeText(); + MethodRefInfo info = (MethodRefInfo) cmd.getConstantInfo(index); + System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + StringUtils.appendSpace(one, codeTxt) + "#" + StringUtils.appendSpace(two, index + "") + "// Method " + info.toString()); + } + + + private String getOffset(int offset) { + String s = String.valueOf(offset); + if (s.length() == 1) { + s = " " + s; + } + return s; + + + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java new file mode 100644 index 0000000000..427894a6ed --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java @@ -0,0 +1,29 @@ +package me.lzb.jvm.print; + +import me.lzb.jvm.cmd.*; + +/** + * Created by LZB on 2017/5/1. + */ +public interface ExecutionVisitor { + + void visitBiPushCmd(BiPushCmd cmd); + + void visitGetFieldCmd(GetFieldCmd cmd); + + void visitGetStaticFieldCmd(GetStaticFieldCmd cmd); + + void visitInvokeSpecialCmd(InvokeSpecialCmd cmd); + + void visitInvokeVirtualCmd(InvokeVirtualCmd cmd); + + void visitLdcCmd(LdcCmd cmd); + + void visitNewObjectCmd(NewObjectCmd cmd); + + void visitNoOperandCmd(NoOperandCmd cmd); + + void visitPutFieldCmd(PutFieldCmd cmd); + + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java index e709cd8538..bf62883c21 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java @@ -1,5 +1,6 @@ package me.lzb.jvm.print; +import me.lzb.common.utils.StringUtils; import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.*; @@ -33,38 +34,30 @@ public void visistUTF8(UTF8Info info) { @Override public void visitClassInfo(ClassInfo info) { - System.out.println("Class #" + getSpace(info.getUtf8Index() + "") + "// " + info.getClassName()); + System.out.println("Class #" + StringUtils.appendSpace(FOURTEENTH, info.getUtf8Index() + "") + "// " + info.getClassName()); } @Override public void visitFieldRef(FieldRefInfo info) { - System.out.println("FieldRef #" + getSpace(info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()) + "// " + info.getClassName() + ". " + info.toString()); + System.out.println("FieldRef #" + StringUtils.appendSpace(FOURTEENTH, info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()) + "// " + info.getClassName() + ". " + info.toString()); } @Override public void visitMethodRef(MethodRefInfo info) { - System.out.println("MethodRef #" + getSpace(info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()) + "// " + info.getClassName() + ". " + info.toString()); + System.out.println("MethodRef #" + StringUtils.appendSpace(FOURTEENTH, info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex()) + "// " + info.getClassName() + ". " + info.toString()); } @Override public void visitNameAndType(NameAndTypeInfo info) { // // - System.out.println("NameAndType #" + getSpace(info.getIndex1() + ":#" + info.getIndex2()) + "// " + info.toString()); + System.out.println("NameAndType #" + StringUtils.appendSpace(FOURTEENTH, info.getIndex1() + ":#" + info.getIndex2()) + "// " + info.toString()); } @Override public void visitString(StringInfo info) { - System.out.println("String #" + getSpace(info.getIndex() + "") + "// " + info.toString()); + System.out.println("String #" + StringUtils.appendSpace(FOURTEENTH, info.getIndex() + "") + "// " + info.toString()); } - private String getSpace(String str) { - int spaceCount = FOURTEENTH - str.length(); - StringBuffer spaceBuffer = new StringBuffer(); - for (int i = 0; i < spaceCount; i++) { - spaceBuffer.append(" "); - } - return str + spaceBuffer.toString(); - } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java index 6d846786bc..350d424cd1 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java @@ -7,17 +7,17 @@ * Created by LZB on 2017/4/23. */ public interface PrintVisitor { - public void visitBasicMsg(ClassFile info); + void visitBasicMsg(ClassFile info); - public void visitClassInfo(ClassInfo info); + void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); + void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); + void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); + void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); + void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); + void visistUTF8(UTF8Info info); } diff --git a/group24/1148285693/learning2017/other/pom.xml b/group24/1148285693/learning2017/other/pom.xml index 38ed1e42a5..1f0b7eb9c0 100644 --- a/group24/1148285693/learning2017/other/pom.xml +++ b/group24/1148285693/learning2017/other/pom.xml @@ -2,26 +2,14 @@ - 4.0.0 - - learning2017 me.lzb 1.0 - + 4.0.0 other - other - 1.0 - - - me.lzb - common - 1.0 - - - + \ No newline at end of file From 791b555459400eeba30497815065610151abf079 Mon Sep 17 00:00:00 2001 From: GZ-RXP <283091182@qq.com> Date: Tue, 2 May 2017 09:44:55 +0800 Subject: [PATCH 376/552] jvm 3rd week data structure - infixExp --- .../com/coderising/jvm/clz/AccessFlag.java | 25 +++ .../com/coderising/jvm/clz/ClassFile.java | 75 +++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 24 +++ .../coderising/jvm/constant/ConstantInfo.java | 29 +++ .../coderising/jvm/constant/ConstantPool.java | 29 +++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++ .../jvm/constant/MethodRefInfo.java | 55 +++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 +++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++ .../jvm/loader/ByteCodeIterator.java | 87 ++++++++ .../jvm/loader/ClassFileLoader.java | 140 ++++++++++++ .../jvm/loader/ClassFileParser.java | 101 +++++++++ .../jvm/test/ClassFileloaderTest.java | 202 ++++++++++++++++++ .../coderising/jvm/attr/AttributeInfo.java | 19 ++ .../com/coderising/jvm/attr/CodeAttr.java | 86 ++++++++ .../coderising/jvm/attr/LineNumberTable.java | 64 ++++++ .../jvm/attr/LocalVariableItem.java | 39 ++++ .../jvm/attr/LocalVariableTable.java | 54 +++++ .../coderising/jvm/attr/StackMapTable.java | 30 +++ .../com/coderising/jvm/clz/ClassFile.java | 35 ++- .../com/coderising/jvm/field/Field.java | 50 +++++ .../jvm/loader/ByteCodeIterator.java | 4 + .../jvm/loader/ClassFileParser.java | 31 +++ .../com/coderising/jvm/method/Method.java | 93 ++++++++ .../jvm/test/ClassFileloaderTest.java | 77 ++++++- .../src/com/coding/basic/stack/StackUtil.java | 21 +- .../coding/basic/stack/expr/InfixExpr.java | 103 +++++++++ .../basic/stack/expr/InfixExprTest.java | 52 +++++ 31 files changed, 1708 insertions(+), 6 deletions(-) create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/ClassFile.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/StringInfo.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group11/283091182/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group11/283091182/mini-jvm/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group11/283091182/mini-jvm/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group11/283091182/mini-jvm/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group11/283091182/mini-jvm/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group11/283091182/mini-jvm/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group11/283091182/mini-jvm/com/coderising/jvm/field/Field.java create mode 100644 group11/283091182/mini-jvm/com/coderising/jvm/method/Method.java create mode 100644 group11/283091182/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group11/283091182/src/com/coding/basic/stack/expr/InfixExprTest.java diff --git a/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/AccessFlag.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/ClassFile.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..650ca8375d --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/ClassIndex.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ClassInfo.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ConstantInfo.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ConstantPool.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/FieldRefInfo.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/MethodRefInfo.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/NameAndTypeInfo.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/NullConstantInfo.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/StringInfo.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/UTF8Info.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/loader/ByteCodeIterator.java b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..514d85e08f --- /dev/null +++ b/group11/283091182/mini-jvm-week2-bk/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,87 @@ +package com.coderising.jvm.loader; + +public class ByteCodeIterator { + private byte[] bytes; + private int pos = 0; + public ByteCodeIterator(byte[] byteCodes){ + this.bytes = byteCodes; + } + + public boolean hasNext(){ + return this.pos < bytes.length-1; + } + + public byte next(){ + byte b = bytes[pos]; + pos ++; + return b; + } + + public byte[] getBytes(int len){ + if(pos+len>bytes.length){ + throw new RuntimeException("Index out of bounds:"+(pos+len)); + } + byte[] bytes = new byte[len]; + int idx = 0; + while(hasNext() && idx 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/group11/283091182/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java b/group11/283091182/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group11/283091182/mini-jvm/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group11/283091182/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group11/283091182/mini-jvm/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..f25743fb0d --- /dev/null +++ b/group11/283091182/mini-jvm/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,86 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + //private ByteCodeCommand[] cmds ; + //public ByteCodeCommand[] getCmds() { + // return cmds; + //} + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + //this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile,ConstantPool pool, ByteCodeIterator iter){ + int attrNameIdx = iter.nextU2AsInt(); + System.out.println("AttrName="+pool.getUTF8String(attrNameIdx)); + int attrLen = iter.nextU4AsInt(); + int maxStack = iter.nextU2AsInt(); + int maxLocal = iter.nextU2AsInt(); + int codeLen = iter.nextU4AsInt(); + String code = iter.getBytesAsHexString(codeLen); + CodeAttr codeAttr = new CodeAttr(attrNameIdx, attrLen, maxStack, maxLocal, codeLen, code); + + int exceptionTblLen = iter.nextU2AsInt(); + if(exceptionTblLen>0){ + throw new RuntimeException("ExceptionTable not supported!"); + } + int subAttrCount = iter.nextU2AsInt(); + for(int j=0;j items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int nameIdx = iter.nextU2AsInt(); + int attrLen = iter.nextU4AsInt(); + LineNumberTable t = new LineNumberTable(nameIdx, attrLen); + int itemCount = iter.nextU2AsInt(); + for(int i=0;i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int nameIdx = iter.nextU2AsInt(); + int attrLen = iter.nextU4AsInt(); + LocalVariableTable t = new LocalVariableTable(nameIdx, attrLen); + int itemCount = iter.nextU2AsInt(); + for(int i=0;i fields = new ArrayList(); + private List methods = new ArrayList(); public ClassIndex getClzIndex() { return clzIndex; @@ -48,7 +54,18 @@ public void setClassIndex(ClassIndex clzIndex) { this.clzIndex = clzIndex; } - + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } public void print(){ @@ -63,13 +80,23 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } } diff --git a/group11/283091182/mini-jvm/com/coderising/jvm/field/Field.java b/group11/283091182/mini-jvm/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..29ef91fbd3 --- /dev/null +++ b/group11/283091182/mini-jvm/com/coderising/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2AsInt(); + int nameIndex = iter.nextU2AsInt(); + int descIndex = iter.nextU2AsInt(); + int attribCount = iter.nextU2AsInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group11/283091182/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java b/group11/283091182/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java index 514d85e08f..4dcd1d8040 100644 --- a/group11/283091182/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java +++ b/group11/283091182/mini-jvm/com/coderising/jvm/loader/ByteCodeIterator.java @@ -84,4 +84,8 @@ private String byteToHexString(byte[] codes ){ } return buffer.toString(); } + + public void back(int offset){ + this.pos-=offset; + } } diff --git a/group11/283091182/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java b/group11/283091182/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java index 4c2cef5504..be823bf23f 100644 --- a/group11/283091182/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java +++ b/group11/283091182/mini-jvm/com/coderising/jvm/loader/ClassFileParser.java @@ -12,6 +12,8 @@ import com.coderising.jvm.constant.NullConstantInfo; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; public class ClassFileParser { @@ -35,6 +37,9 @@ public ClassFile parse(byte[] codes) { clzFile.setAccessFlag(accFlag); ClassIndex clsIdx = parseClassIndex(iter); clzFile.setClassIndex(clsIdx); + parseInterfaces(iter,pool,clzFile); + parseFields(iter, pool, clzFile); + parseMethods(iter, pool, clzFile); return clzFile; } @@ -97,5 +102,31 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { } return cp; } + + private void parseInterfaces(ByteCodeIterator iter, ConstantPool pool, ClassFile clz){ + int interfaceCount = iter.nextU2AsInt(); + System.out.println("Total number of interface="+interfaceCount); + for(int i=0;iMethodName="+pool.getUTF8String(nameIndex)); + int descIndex = iter.nextU2AsInt(); + Method method = new Method(clzFile,accessFlag,nameIndex,descIndex); + int attrCount = iter.nextU2AsInt(); + System.out.println("AttrCount="+attrCount); + for(int i=0;i fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } -} +} \ No newline at end of file diff --git a/group11/283091182/src/com/coding/basic/stack/StackUtil.java b/group11/283091182/src/com/coding/basic/stack/StackUtil.java index cd5aa08d06..8062edc116 100644 --- a/group11/283091182/src/com/coding/basic/stack/StackUtil.java +++ b/group11/283091182/src/com/coding/basic/stack/StackUtil.java @@ -26,7 +26,26 @@ public static void reverse(Stack s) { counter--; } } - + + public static void reverse2(Stack s) { + if(s==null || s.isEmpty()){ + return; + }; + Stack temp = new Stack(); + int counter = s.size(); + while(counter>1){ + //Get the peek one + Object o = s.pop(); + for(int i=0;i Date: Tue, 2 May 2017 11:27:35 +0800 Subject: [PATCH 377/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../275150374Learning/.idea/compiler.xml | 23 ----- .../275150374Learning/.idea/description.html | 1 - .../275150374Learning/.idea/encodings.xml | 5 - .../275150374Learning/.idea/misc.xml | 12 --- .../275150374Learning/.idea/modules.xml | 8 -- .../275150374/275150374Learning/.idea/vcs.xml | 6 -- .../com/coding/basic/queue/CircleQueue.java | 91 ++++++++++++++----- .../coding/basic/queue/CircleQueueTest.java | 32 +++++++ .../com/coding/basic/queue/Josephus.java | 41 +++++---- .../basic/queue/QueueWithTwoStacks.java | 79 ++++++++-------- .../basic/queue/QueueWithTwoStacksTest.java | 23 +++++ 11 files changed, 191 insertions(+), 130 deletions(-) delete mode 100644 group01/275150374/275150374Learning/.idea/compiler.xml delete mode 100644 group01/275150374/275150374Learning/.idea/description.html delete mode 100644 group01/275150374/275150374Learning/.idea/encodings.xml delete mode 100644 group01/275150374/275150374Learning/.idea/misc.xml delete mode 100644 group01/275150374/275150374Learning/.idea/modules.xml delete mode 100644 group01/275150374/275150374Learning/.idea/vcs.xml create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/CircleQueueTest.java create mode 100644 group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacksTest.java diff --git a/group01/275150374/275150374Learning/.idea/compiler.xml b/group01/275150374/275150374Learning/.idea/compiler.xml deleted file mode 100644 index 217af471a9..0000000000 --- a/group01/275150374/275150374Learning/.idea/compiler.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/group01/275150374/275150374Learning/.idea/description.html b/group01/275150374/275150374Learning/.idea/description.html deleted file mode 100644 index db5f129556..0000000000 --- a/group01/275150374/275150374Learning/.idea/description.html +++ /dev/null @@ -1 +0,0 @@ -Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/group01/275150374/275150374Learning/.idea/encodings.xml b/group01/275150374/275150374Learning/.idea/encodings.xml deleted file mode 100644 index e206d70d85..0000000000 --- a/group01/275150374/275150374Learning/.idea/encodings.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/group01/275150374/275150374Learning/.idea/misc.xml b/group01/275150374/275150374Learning/.idea/misc.xml deleted file mode 100644 index de8f7c75a3..0000000000 --- a/group01/275150374/275150374Learning/.idea/misc.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/group01/275150374/275150374Learning/.idea/modules.xml b/group01/275150374/275150374Learning/.idea/modules.xml deleted file mode 100644 index 5534fceb30..0000000000 --- a/group01/275150374/275150374Learning/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/group01/275150374/275150374Learning/.idea/vcs.xml b/group01/275150374/275150374Learning/.idea/vcs.xml deleted file mode 100644 index c2365ab11f..0000000000 --- a/group01/275150374/275150374Learning/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java index 82596ad296..090564d8b6 100644 --- a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java +++ b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueue.java @@ -2,38 +2,83 @@ /** * 用数组实现循环队列 + * * @author liuxin * * @param */ -public class CircleQueue { - +public class CircleQueue { + private final static int DEFAULT_SIZE = 10; - - //用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE] ; - - //队头 - private int front = 0; - //队尾 + + // 用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + // 队头 + private int front = 0; + // 队尾 private int rear = 0; - + public boolean isEmpty() { - return false; - - } - public int size() { - return -1; - } + return rear == front && elementData[rear] == null; + } + + public int size() { + if (isEmpty()) { + return 0; + } + return rear > front ? rear - front : DEFAULT_SIZE - (front - rear); + } - + public void enQueue(E data) { + if (rear == front && elementData[front] != null) { + throw new IndexOutOfBoundsException("队列已满的异常"); + } + elementData[rear++] = data; + // 如果rear已经到头,那就转头 + rear = rear == DEFAULT_SIZE ? 0 : rear; + } - public void enQueue(E data) { - - } + @SuppressWarnings("unchecked") + public E deQueue() { + if (isEmpty()) { + throw new IndexOutOfBoundsException("空队列异常"); + } + // 保留队列的rear端的元素的值 + E oldValue = (E) elementData[front]; + // 释放队列的rear端的元素 + elementData[front++] = null; + // 如果front已经到头,那就转头 + front = front == DEFAULT_SIZE ? 0 : front; + return oldValue; + } - public E deQueue() { - return null; - } + public String toString() { + if (isEmpty()) { + return "[]"; + } else { + // 如果front < rear,有效元素就是front到rear之间的元素 + if (front < rear) { + StringBuilder sb = new StringBuilder("["); + for (int i = front; i < rear; i++) { + sb.append(elementData[i].toString() + ", "); + } + int len = sb.length(); + return sb.delete(len - 2, len).append("]").toString(); + } + // 如果front >= rear,有效元素为front->capacity之间、0->front之间的 + else { + StringBuilder sb = new StringBuilder("["); + for (int i = front; i < DEFAULT_SIZE; i++) { + sb.append(elementData[i].toString() + ", "); + } + for (int i = 0; i < rear; i++) { + sb.append(elementData[i].toString() + ", "); + } + int len = sb.length(); + return sb.delete(len - 2, len).append("]").toString(); + } + } + } } diff --git a/group27/383117348/data-structure/com/coding/basic/queue/CircleQueueTest.java b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..2103b8d063 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/CircleQueueTest.java @@ -0,0 +1,32 @@ +package com.coding.basic.queue; + +import org.junit.Test; + +public class CircleQueueTest { + + @Test + public void testCircleQueue(){ + CircleQueue queue = new CircleQueue(); + queue.enQueue("aaaaa"); + queue.enQueue("bbbbb"); + queue.enQueue("ccccc"); + queue.enQueue("ddddd"); + queue.enQueue("eeeee"); + queue.enQueue("fffff"); + queue.enQueue("ggggg"); + queue.enQueue("hhhhh"); + queue.enQueue("iiiii"); + queue.enQueue("jjjjj"); + System.out.println("队列全满的时候:"+queue); + System.out.println("删除一个元素后的队列:" + queue.deQueue()); + + queue.enQueue("dddd"); + System.out.println("删除一个再加一个的时候:"+queue); + System.out.println("队列满时的长度:" + queue.size()); + + queue.deQueue(); + + System.out.println("删除一个的时候:"+queue); + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java index 0a483e878b..c646e8ca9d 100644 --- a/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java +++ b/group27/383117348/data-structure/com/coding/basic/queue/Josephus.java @@ -2,35 +2,44 @@ import java.util.ArrayList; import java.util.List; - +import java.util.Stack; /** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * 该方法返回一个List, 包含了被杀死人的次序 + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 + * * @author liuxin * */ public class Josephus { public static List execute(int n, int m) { - if (n < m || n <= 0 || m <= 0) { + if (n < m || n <= 0 || m < 0) { throw new RuntimeException("传入参数有误,执行失败!"); } - //保存被杀掉的数 + Stack copy = new Stack(); + Stack count = new Stack(); + for(int i = 0; i < n;i++){ + count.push(i); + } + while(!count.isEmpty()){ + copy.push(count.pop()); + } List ints = new ArrayList(); - //报数 - int count = 0; - while(ints.size()!=n){ - - for(int i=0;i */ public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - - - - public boolean isEmpty() { - return false; - } - - - - public int size() { - return -1; - } - - - - public void enQueue(E item) { - - } - - public E deQueue() { - return null; - } - - - - } - + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.size() == 0 && stack2.size() == 0; + } + + public int size() { + if (isEmpty()) { + return 0; + } else { + return stack1.size(); + } + } + + public void enQueue(E item) { + if (item == null) { + throw new NullPointerException(); + } + stack1.push(item); + } + + public E deQueue() { + if (stack1.isEmpty()) { + throw new RuntimeException("队列为空"); + } + while (stack1.size() > 0) { + stack2.push(stack1.pop()); + } + E item = stack2.pop(); + while (stack2.size() > 0) { + stack1.push(stack2.pop()); + }; + return item; + } + +} diff --git a/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacksTest.java b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..79c302467a --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,23 @@ +package com.coding.basic.queue; + +import org.junit.Test; + +public class QueueWithTwoStacksTest { + + + + @Test + public void testenQueueAndDequeue(){ + int[] ints = new int[]{2,5,10,32,41}; + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + for(int i=0;i Date: Tue, 2 May 2017 14:15:51 +0800 Subject: [PATCH 378/552] =?UTF-8?q?jvm=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/jvm/cmd/BiPushCmd.java | 8 +- .../coderising/jvm/cmd/ByteCodeCommand.java | 35 ++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 7 ++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 12 ++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 28 +++-- .../coderising/jvm/cmd/InvokeVirtualCmd.java | 69 ++++++++-- .../com/coderising/jvm/cmd/LdcCmd.java | 14 +++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 28 +++-- .../com/coderising/jvm/cmd/NoOperandCmd.java | 118 +++++++++++++++++- .../com/coderising/jvm/cmd/PutFieldCmd.java | 16 +++ .../coderising/jvm/engine/ExecutorEngine.java | 46 ++++++- .../com/coderising/jvm/engine/JavaObject.java | 57 +++++---- .../com/coderising/jvm/engine/MethodArea.java | 81 +++++++----- .../coderising/jvm/engine/OperandStack.java | 26 ++++ .../com/coderising/jvm/engine/StackFrame.java | 115 ++++++++++------- .../com/coderising/jvm/method/Method.java | 70 ++++++++++- .../com/coderising/jvm/test/MiniJVMTest.java | 29 +++++ 17 files changed, 622 insertions(+), 137 deletions(-) create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/engine/OperandStack.java create mode 100644 group27/383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java index 1c4168903e..19b35ea04c 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java @@ -4,6 +4,8 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; @@ -22,8 +24,10 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub - + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOprandStack().push(jo); + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java index 75324bccc8..05fa0e2a35 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -16,6 +16,41 @@ public abstract class ByteCodeCommand { ClassFile clzFile; private int offset; + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); static{ diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java index 7b16cc6243..0bb497e8d9 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java @@ -2,7 +2,9 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; @@ -20,7 +22,12 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + frame.getOprandStack().push(fieldValue); } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java index eaf0ec1562..4224d1b49e 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -6,6 +6,8 @@ import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; @@ -24,7 +26,17 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java index c746056c70..04ea9311a3 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -4,27 +4,37 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.MethodArea; import com.coderising.jvm.engine.StackFrame; - +import com.coderising.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } @Override public String toString(ConstantPool pool) { - + return super.getOperandAsMethod(pool); } - + @Override public void execute(StackFrame frame, ExecutionResult result) { - - + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + + // 我们不用实现jang.lang.Object 的init方法 + if (methodRefInfo.getClassName().equals("java/lang/Object") && methodRefInfo.getMethodName().equals("")) { + return; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + } - } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java index 46807110fe..ad6249c2e5 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -2,26 +2,81 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.MethodArea; import com.coderising.jvm.engine.StackFrame; - +import com.coderising.jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); } @Override public String toString(ConstantPool pool) { - + return super.getOperandAsMethod(pool); } + + private boolean isSystemOutPrintlnMethod(String className, String methodName) { + return "java/io/PrintStream".equals(className) && "println".equals(methodName); + } + @Override public void execute(StackFrame frame, ExecutionResult result) { - + // 先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if (isSystemOutPrintlnMethod(className, methodName)) { + JavaObject jo = (JavaObject) frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------" + value + "----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + // 注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while (currentClassName != null) { + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), methodRefInfo.getParamAndReturnType()); + if (m != null) { + + break; + + } else { + // 查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if (m == null) { + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } - - } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java index ea483169cf..8f68077c17 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java @@ -5,6 +5,8 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -30,7 +32,19 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java index 2d7a2558c5..e60c6e2464 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java @@ -1,25 +1,37 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); +public class NewObjectCmd extends TwoOperandCmd { + + public NewObjectCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); } @Override public String toString(ConstantPool pool) { - + return super.getOperandAsClassInfo(pool); } + @Override public void execute(StackFrame frame, ExecutionResult result) { - - + int index = this.getIndex(); + + ClassInfo info = (ClassInfo) this.getConstantInfo(index); + + String clzName = info.getClassName(); + + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); + } - + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java index e9d27995d7..823a723e24 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java @@ -3,6 +3,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -22,7 +24,121 @@ public int getLength(){ @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO Auto-generated method stub + + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equalsIgnoreCase(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equalsIgnoreCase(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equalsIgnoreCase(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equalsIgnoreCase(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equalsIgnoreCase(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equalsIgnoreCase(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equalsIgnoreCase(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equalsIgnoreCase(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java index 2918d3dcdc..d693315397 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java @@ -1,8 +1,12 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -18,7 +22,19 @@ public String toString(ConstantPool pool) { } @Override public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java index 52e40ce079..f2cdee21b3 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java @@ -19,16 +19,58 @@ public ExecutorEngine() { } public void execute(Method mainMethod){ + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); - - + while(!stack.empty()){ + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if(result.isPauseAndRunNewFrame()){ + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame,nextFrame); + + stack.push(nextFrame); + + } else { + + stack.pop(); + + } + } } private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + Method nextMethod = nextFrame.getMethod(); + List paramList = nextMethod.getParameterList(); + + //加上1 是因为要把this也传递过去 + + int paramNum = paramList.size() + 1; + List values = new ArrayList(); + + //数据结构知识: 从栈中取出栈顶的x个元素 + while(paramNum>0){ + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + //数据结构知识: 把一个列表倒序排列 + List params = new ArrayList(); + + for(int i=values.size()-1; i>=0 ;i--){ + params.add(values.get(i)); + } + + nextFrame.setLocalVariableTable(params); } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/JavaObject.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/JavaObject.java index be6d3470be..2d777ede03 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/engine/JavaObject.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/JavaObject.java @@ -8,64 +8,75 @@ public class JavaObject { public static final int STRING = 2; public static final int INT = 3; public static final int FLOAT = 4; - + int type; private String className; - - private Map fieldValues = new HashMap(); - + + private Map fieldValues = new HashMap(); + private String stringValue; - + private int intValue; - + private float floatValue; - - public void setFieldValue(String fieldName, JavaObject fieldValue){ + + public void setFieldValue(String fieldName, JavaObject fieldValue) { fieldValues.put(fieldName, fieldValue); } - public JavaObject(int type){ + + public JavaObject(int type) { this.type = type; } - public void setClassName(String className){ + + public void setClassName(String className) { this.className = className; } - public void setStringValue(String value){ + + public void setStringValue(String value) { stringValue = value; } - public String getStringValue(){ + + public String getStringValue() { return this.stringValue; } + public void setIntValue(int value) { - this.intValue = value; + this.intValue = value; } - public int getIntValue(){ + + public int getIntValue() { return this.intValue; } - public int getType(){ + + public int getType() { return type; } - public JavaObject getFieldValue(String fieldName){ + + public JavaObject getFieldValue(String fieldName) { return this.fieldValues.get(fieldName); } - public String toString(){ - switch(this.getType()){ - case INT: + + public String toString() { + switch (this.getType()) { + case INT: return String.valueOf(this.intValue); case STRING: return this.stringValue; case OBJECT: - return this.className +":"+ this.fieldValues; - case FLOAT : + return this.className + ":" + this.fieldValues; + case FLOAT: return String.valueOf(this.floatValue); default: return null; } } - public String getClassName(){ + + public String getClassName() { return this.className; } + public void setFloatValue(float value) { - this.floatValue = value; + this.floatValue = value; } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/MethodArea.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/MethodArea.java index 64bf6c4c2a..575e36d85f 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/engine/MethodArea.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/MethodArea.java @@ -9,60 +9,73 @@ import com.coderising.jvm.method.Method; public class MethodArea { - + public static final MethodArea instance = new MethodArea(); - + /** * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 */ - + private ClassFileLoader clzLoader = null; - - Map map = new HashMap(); - - private MethodArea(){ + + Map map = new HashMap(); + + private MethodArea() { } - - public static MethodArea getInstance(){ + + public static MethodArea getInstance() { return instance; } - - public void setClassFileLoader(ClassFileLoader clzLoader){ + + public void setClassFileLoader(ClassFileLoader clzLoader) { this.clzLoader = clzLoader; } - - public Method getMainMethod(String className){ - + + public Method getMainMethod(String className) { + ClassFile clzFile = this.findClassFile(className); - + return clzFile.getMainMethod(); } - - - public ClassFile findClassFile(String className){ - - if(map.get(className) != null){ + + public ClassFile findClassFile(String className) { + + if (map.get(className) != null) { return map.get(className); } // 看来该class 文件还没有load过 ClassFile clzFile = this.clzLoader.loadClass(className); - + map.put(className, clzFile); - + return clzFile; - + } - - - public Method getMethod(String className, String methodName, String paramAndReturnType){ - - return null; + + public Method getMethod(String className, String methodName, String paramAndReturnType) { + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if (m == null) { + + throw new RuntimeException("method can't be found : \n" + "class: " + className + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; } - - - public Method getMethod(MethodRefInfo methodRef){ - - return null; - + + public Method getMethod(MethodRefInfo methodRef) { + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if (m == null) { + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/OperandStack.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/OperandStack.java new file mode 100644 index 0000000000..f933464832 --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/OperandStack.java @@ -0,0 +1,26 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; + +public class OperandStack { + private List operands = new ArrayList(); + + public void push(JavaObject jo){ + operands.add(jo); + } + public JavaObject pop(){ + int index = size()-1; + JavaObject jo = (JavaObject)operands.get(index); + operands.remove(index); + return jo; + + } + public JavaObject top(){ + int index = size()-1; + return (JavaObject)operands.get(index); + } + public int size(){ + return operands.size(); + } +} diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/engine/StackFrame.java b/group27/383117348/mini-jvm/com/coderising/jvm/engine/StackFrame.java index 9c5726505a..690a88cdc4 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/engine/StackFrame.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/engine/StackFrame.java @@ -8,16 +8,16 @@ import com.coderising.jvm.method.Method; public class StackFrame { - + private List localVariableTable = new ArrayList(); private Stack oprandStack = new Stack(); - + int index = 0; - + private Method m = null; - + private StackFrame callerFrame = null; - + public StackFrame getCallerFrame() { return callerFrame; } @@ -26,70 +26,91 @@ public void setCallerFrame(StackFrame callerFrame) { this.callerFrame = callerFrame; } - - - - public static StackFrame create(Method m){ - - StackFrame frame = new StackFrame( m ); - + public static StackFrame create(Method m) { + + StackFrame frame = new StackFrame(m); + return frame; } - - private StackFrame(Method m) { + private StackFrame(Method m) { this.m = m; - + } - - - - public JavaObject getLocalVariableValue(int index){ + + public JavaObject getLocalVariableValue(int index) { return this.localVariableTable.get(index); } - - public Stack getOprandStack(){ + + public Stack getOprandStack() { return this.oprandStack; } - - public int getNextCommandIndex(int offset){ - - ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); - for(int i=0;i values){ - this.localVariableTable = values; + public void setLocalVariableTable(List values) { + this.localVariableTable = values; } - - public void setLocalVariableValue(int index, JavaObject jo){ - //问题: 为什么要这么做?? - if(this.localVariableTable.size()-1 < index){ - for(int i=this.localVariableTable.size(); i<=index; i++){ + + public void setLocalVariableValue(int index, JavaObject jo) { + // 问题: 为什么要这么做?? + if (this.localVariableTable.size() - 1 < index) { + for (int i = this.localVariableTable.size(); i <= index; i++) { this.localVariableTable.add(null); } } this.localVariableTable.set(index, jo); - - + } - - public Method getMethod(){ + + public Method getMethod() { return m; } - -} +} \ No newline at end of file diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java b/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java index 091ecc2209..47a9ce274f 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/method/Method.java @@ -1,5 +1,8 @@ package com.coderising.jvm.method; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.clz.ClassFile; @@ -53,24 +56,83 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { Method method = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); int attirbutesCount = iter.nextU2Int(); - + for (int i = 0; i < attirbutesCount; i++) { int attributeNameIndex = iter.nextU2Int(); iter.back(2); String attributeName = ((UTF8Info) clzFile.getConstantPool().getConstantInfo(attributeNameIndex)) .getValue(); - + if (null != attributeName && attributeName.equalsIgnoreCase(AttributeInfo.CODE)) { CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); method.setCodeAttr(codeAttr); } else { - throw new RuntimeException("解析属性异常-属性名:"+attributeName); + throw new RuntimeException("解析属性异常-属性名:" + attributeName); } } return method; } - public ByteCodeCommand[] getCmds() { + + public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } + + private String getParamAndReturnType() { + UTF8Info nameAndTypeInfo = (UTF8Info) this.getClzFile().getConstantPool() + .getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + + public List getParameterList() { + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first + 1, last); + + List paramList = new ArrayList(); + + if ((null == param) || "".equals(param)) { + return paramList; + } + + while (!param.equals("")) { + + int pos = 0; + // 这是一个对象类型 + if (param.charAt(pos) == 'L') { + + int end = param.indexOf(";"); + + if (end == -1) { + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos + 1, end)); + + pos = end + 1; + + } else if (param.charAt(pos) == 'I') { + // int + paramList.add("I"); + pos++; + + } else if (param.charAt(pos) == 'F') { + // float + paramList.add("F"); + pos++; + + } else { + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } } diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..641ad0a7ed --- /dev/null +++ b/group27/383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = "E:\\MyGit\\coding2017\\group27\\383117348\\bin"; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception { + String[] classPaths = { PATH }; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + + } + +} From e6bd5fd548d5d995e561924d564ba98e8f18e673 Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Tue, 2 May 2017 14:45:36 +0800 Subject: [PATCH 379/552] commit --- group27/383117348/.classpath | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/group27/383117348/.classpath b/group27/383117348/.classpath index 58f336f5a2..71afc607de 100644 --- a/group27/383117348/.classpath +++ b/group27/383117348/.classpath @@ -4,10 +4,10 @@ - - - + + + From c909e92203df909c40e11b2912ed5318ca7d90eb Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Tue, 2 May 2017 14:47:28 +0800 Subject: [PATCH 380/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java | 2 +- .../383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java index b2128a5372..b9dc2608f8 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java @@ -27,7 +27,7 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "E:\\MyGit\\coding2017\\group27\\383117348\\bin"; + static String path1 = "E:\\coding2017\\group27\\383117348\\bin"; static String path2 = "C:\temp"; static ClassFile clzFile = null; diff --git a/group27/383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java b/group27/383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java index 641ad0a7ed..22193dc246 100644 --- a/group27/383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java +++ b/group27/383117348/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java @@ -8,7 +8,7 @@ public class MiniJVMTest { - static final String PATH = "E:\\MyGit\\coding2017\\group27\\383117348\\bin"; + static final String PATH = "E:\\coding2017\\group27\\383117348\\bin"; @Before public void setUp() throws Exception { From ea5243dc5dcd4b51968b1e323e56ab7409443411 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 2 May 2017 17:35:22 +0800 Subject: [PATCH 381/552] =?UTF-8?q?JVM=E7=AC=AC=E5=9B=9B=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=8F=90=E4=BA=A4=EF=BC=8C=E4=BB=A5=E5=8F=8A=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataStructure/queue/CircleQueue.java | 82 ++++++++++++++++ .../basic/dataStructure/queue/Josephus.java | 40 ++++++++ .../java/basic/dataStructure/queue/Queue.java | 4 + .../queue/QueueWithTwoStacks.java | 56 +++++++++++ .../stack/expr/InfixToPostfix.java | 5 +- .../java/miniJVM/engine/ExecutionResult.java | 57 +++++++++++ .../java/miniJVM/engine/ExecutorEngine.java | 30 ++++++ .../src/main/java/miniJVM/engine/Heap.java | 39 ++++++++ .../main/java/miniJVM/engine/JavaObject.java | 71 ++++++++++++++ .../main/java/miniJVM/engine/MethodArea.java | 69 +++++++++++++ .../src/main/java/miniJVM/engine/MiniJVM.java | 29 ++++++ .../main/java/miniJVM/engine/StackFrame.java | 96 +++++++++++++++++++ .../{ => array}/ArrayUtilTest.java | 2 +- .../{ => list}/ArrayListTest.java | 2 +- .../{ => list}/BinaryNodeTreeTest.java | 2 +- .../{ => list}/LRUPageFrameTest.java | 2 +- .../{ => list}/LinkedListTest.java | 2 +- .../data_structure/queue/CircleQueueTest.java | 45 +++++++++ .../data_structure/queue/JosephusTest.java | 28 ++++++ .../data_structure/{ => queue}/QueueTest.java | 4 +- .../queue/TwoStacksQueueTest.java | 37 +++++++ .../data_structure/{ => stack}/ExprTest.java | 2 +- .../data_structure/{ => stack}/StackTest.java | 2 +- .../{ => stack}/TokenParserTest.java | 2 +- 24 files changed, 696 insertions(+), 12 deletions(-) create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/CircleQueue.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Josephus.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/QueueWithTwoStacks.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutionResult.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutorEngine.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/engine/Heap.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/engine/JavaObject.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/engine/MethodArea.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/engine/MiniJVM.java create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/engine/StackFrame.java rename group24/75939388/learning2017/src/test/java/data_structure/{ => array}/ArrayUtilTest.java (98%) rename group24/75939388/learning2017/src/test/java/data_structure/{ => list}/ArrayListTest.java (98%) rename group24/75939388/learning2017/src/test/java/data_structure/{ => list}/BinaryNodeTreeTest.java (94%) rename group24/75939388/learning2017/src/test/java/data_structure/{ => list}/LRUPageFrameTest.java (98%) rename group24/75939388/learning2017/src/test/java/data_structure/{ => list}/LinkedListTest.java (99%) create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/queue/CircleQueueTest.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/queue/JosephusTest.java rename group24/75939388/learning2017/src/test/java/data_structure/{ => queue}/QueueTest.java (93%) create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/queue/TwoStacksQueueTest.java rename group24/75939388/learning2017/src/test/java/data_structure/{ => stack}/ExprTest.java (99%) rename group24/75939388/learning2017/src/test/java/data_structure/{ => stack}/StackTest.java (97%) rename group24/75939388/learning2017/src/test/java/data_structure/{ => stack}/TokenParserTest.java (97%) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/CircleQueue.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/CircleQueue.java new file mode 100644 index 0000000000..d053474cf6 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/CircleQueue.java @@ -0,0 +1,82 @@ +package basic.dataStructure.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + private int capacity; + + //用数组来保存循环队列的元素 + private Object[] elementData; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public CircleQueue(){ + this.capacity = DEFAULT_SIZE; + elementData = new Object[DEFAULT_SIZE]; + } + + public CircleQueue(int capacity){ + this.capacity = capacity; + this.elementData = new Object[this.capacity]; + } + + public boolean isEmpty() { + boolean flag = true; + for(int i = 0; i < this.capacity; i++) { + if(elementData[i] != null){ + flag = false; + } + } + return flag; + } + + public boolean isFull(){ + return this.size() == this.capacity; + } + + public int size() { + int size = 0; + for(Object obj : elementData){ + if(obj == null){ + break; + } + size ++; + } + + return size; + } + + + + public void enQueue(E data) { + if(data == null){ + throw new RuntimeException("cannot put null object"); + } + + if(this.size() < this.capacity){ + elementData[this.rear] = data; + this.rear++; + }else{ + throw new RuntimeException("circle queue full"); + } + } + + public E deQueue() { + E data = (E)elementData[front]; + + Object[] arr = new Object[this.capacity]; + System.arraycopy(elementData, 1, arr, 0, this.size() - 1); + this.elementData = arr; + return data; + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Josephus.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Josephus.java new file mode 100644 index 0000000000..2cf142bd18 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Josephus.java @@ -0,0 +1,40 @@ +package basic.dataStructure.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, + * 被杀死的人之后再从1开始报数,直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * + * @author liuxin + */ +public class Josephus { + + public static List execute(int n, int m) { + Queue queue = new Queue(); + for(int i = 0; i < n; i++){ + queue.enQueue(i); + } + + int index = 0; + List list = new ArrayList(); + while (queue.isNotEmpty()){ + index ++; + + int num = (Integer)queue.deQueue(); + + if(index % m == 0){ + list.add(num); + }else{ + queue.enQueue(num); + } + } + + return list; + } + +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Queue.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Queue.java index 5096f9297c..2654c101b0 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Queue.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/Queue.java @@ -50,6 +50,10 @@ public boolean isEmpty(){ return peek() == null; } + public boolean isNotEmpty(){ + return !isEmpty(); + } + public int size(){ int size = 0; for(Object obj : this.data){ diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/QueueWithTwoStacks.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..28f000cf59 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/QueueWithTwoStacks.java @@ -0,0 +1,56 @@ +package basic.dataStructure.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.isEmpty() && stack1.isEmpty(); + } + + public int size() { + return stack2.size(); + } + + + public void enQueue(E item) { + stack1.push(item); + Stack tmp = stack1; + stack2.clear(); + while (!tmp.isEmpty()){ + stack2.push(tmp.pop()); + } + } + + public E deQueue() { + return stack2.pop(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("["); + Stack tmp = stack2; + while(!tmp.isEmpty()){ + sb.append(tmp.pop()).append(","); + } + sb.substring(0, sb.length() - 1); + sb.append("]"); + + return sb.toString(); + } +} + diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java index b5b9552013..52b4b7f62b 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/InfixToPostfix.java @@ -38,8 +38,9 @@ public static List convert(String expr) { } } - //处理运算符,若缓存栈顶的运算符优先级高于或等于该运算符时,则进行遍历: - //缓存中找出的运算符直接入结果list,遍历完成后当前运算符压进缓存栈中 + //处理运算符: + // 遍历:缓存非空且栈顶是一个运算符且缓存栈顶的运算符的优先级不低于t的优先级,则将栈顶运算符直接入结果list + // 遍历完成后当前运算符压进缓存栈中 if(t.isOperator()){ Token tmp = (Token) buffer.peek(); while(tmp != null && tmp.isOperator() && tmp.hasHigherPriority(t)){ diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutionResult.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutionResult.java new file mode 100644 index 0000000000..d105e630de --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutionResult.java @@ -0,0 +1,57 @@ +package miniJVM.engine; + + +import miniJVM.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutorEngine.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutorEngine.java new file mode 100644 index 0000000000..5e41a3c91e --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutorEngine.java @@ -0,0 +1,30 @@ +package miniJVM.engine; + + +import miniJVM.method.Method; + +import java.util.Stack; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/Heap.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/Heap.java new file mode 100644 index 0000000000..5f981d3bf8 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/Heap.java @@ -0,0 +1,39 @@ +package miniJVM.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/JavaObject.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/JavaObject.java new file mode 100644 index 0000000000..e7c1b1fdea --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/JavaObject.java @@ -0,0 +1,71 @@ +package miniJVM.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/MethodArea.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/MethodArea.java new file mode 100644 index 0000000000..114961a186 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/MethodArea.java @@ -0,0 +1,69 @@ +package miniJVM.engine; + + +import miniJVM.clz.ClassFile; +import miniJVM.constant.MethodRefInfo; +import miniJVM.loader.ClassFileLoader; +import miniJVM.method.Method; + +import java.util.HashMap; +import java.util.Map; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/MiniJVM.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/MiniJVM.java new file mode 100644 index 0000000000..7d58098cc8 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/MiniJVM.java @@ -0,0 +1,29 @@ +package miniJVM.engine; + + +import miniJVM.loader.ClassFileLoader; + +import java.io.FileNotFoundException; +import java.io.IOException; + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException { + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java b/group24/75939388/learning2017/src/test/java/data_structure/array/ArrayUtilTest.java similarity index 98% rename from group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/array/ArrayUtilTest.java index 1dc1a6f263..335f5f99bd 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/ArrayUtilTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/array/ArrayUtilTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.array; import org.junit.Test; import basic.dataStructure.ArrayUtil; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/list/ArrayListTest.java similarity index 98% rename from group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/list/ArrayListTest.java index fc16cbfb97..5ef855408f 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/ArrayListTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/list/ArrayListTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.list; import org.junit.Test; import basic.dataStructure.array.ArrayList; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/list/BinaryNodeTreeTest.java similarity index 94% rename from group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/list/BinaryNodeTreeTest.java index df976147e3..f5648c6596 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/BinaryNodeTreeTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/list/BinaryNodeTreeTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.list; import org.junit.Test; import basic.dataStructure.BinaryTreeNode; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java b/group24/75939388/learning2017/src/test/java/data_structure/list/LRUPageFrameTest.java similarity index 98% rename from group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/list/LRUPageFrameTest.java index b279f68a64..9612c97a16 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/LRUPageFrameTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/list/LRUPageFrameTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.list; import basic.dataStructure.linkedList.LRUPageFrame; import org.junit.Assert; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/list/LinkedListTest.java similarity index 99% rename from group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/list/LinkedListTest.java index b3605b5df8..97ef76c2eb 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/LinkedListTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/list/LinkedListTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.list; import basic.dataStructure.linkedList.LinkedList; import org.junit.After; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/queue/CircleQueueTest.java b/group24/75939388/learning2017/src/test/java/data_structure/queue/CircleQueueTest.java new file mode 100644 index 0000000000..9e7f7292b7 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/queue/CircleQueueTest.java @@ -0,0 +1,45 @@ +package data_structure.queue; + +import basic.dataStructure.queue.CircleQueue; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class CircleQueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(5); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertTrue(queue.isFull()); + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/queue/JosephusTest.java b/group24/75939388/learning2017/src/test/java/data_structure/queue/JosephusTest.java new file mode 100644 index 0000000000..645428764e --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/queue/JosephusTest.java @@ -0,0 +1,28 @@ +package data_structure.queue; + +import basic.dataStructure.queue.Josephus; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java b/group24/75939388/learning2017/src/test/java/data_structure/queue/QueueTest.java similarity index 93% rename from group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/queue/QueueTest.java index 1d501c7c1f..682aa8dfe9 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/QueueTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/queue/QueueTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.queue; import org.junit.Assert; import org.junit.Test; @@ -22,7 +22,7 @@ private Queue newQueue(){ public void testEnqueue(){ Queue q = newQueue(); q.enQueue(10 + ""); - q.enQueue( "xxoo"); + q.enQueue("xxoo"); System.out.println("queue-->" + q.toString()); } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/queue/TwoStacksQueueTest.java b/group24/75939388/learning2017/src/test/java/data_structure/queue/TwoStacksQueueTest.java new file mode 100644 index 0000000000..78c0fe9b41 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/queue/TwoStacksQueueTest.java @@ -0,0 +1,37 @@ +package data_structure.queue; + +import basic.dataStructure.queue.QueueWithTwoStacks; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author : 温友朝 + * @date : 2017/5/2 + */ +public class TwoStacksQueueTest { + + private QueueWithTwoStacks queue; + + @Before + public void init(){ + queue = new QueueWithTwoStacks(); + } + + @After + public void after(){ + + } + + @Test + public void testQueue(){ + queue.enQueue(10 + ""); + queue.enQueue( "xxoo"); + queue.enQueue( "ppxxoo"); + System.out.println("queue-->" + queue.toString()); + + } + + + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java b/group24/75939388/learning2017/src/test/java/data_structure/stack/ExprTest.java similarity index 99% rename from group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/stack/ExprTest.java index 4ae1205bff..fda0748923 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/ExprTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/stack/ExprTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.stack; import basic.dataStructure.stack.expr.InfixExpr; import basic.dataStructure.stack.expr.InfixToPostfix; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java b/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java similarity index 97% rename from group24/75939388/learning2017/src/test/java/data_structure/StackTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java index b2fd5c777b..9c08fb031e 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/StackTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.stack; import basic.dataStructure.stack.Stack; import basic.dataStructure.stack.StackUtil; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/TokenParserTest.java b/group24/75939388/learning2017/src/test/java/data_structure/stack/TokenParserTest.java similarity index 97% rename from group24/75939388/learning2017/src/test/java/data_structure/TokenParserTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/stack/TokenParserTest.java index b8cde0cbed..3aa2c01abb 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/TokenParserTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/stack/TokenParserTest.java @@ -1,4 +1,4 @@ -package data_structure; +package data_structure.stack; import basic.dataStructure.stack.expr.Token; From c4ab820de2a0aff4ca64cb8fc5e27cd55e04f134 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Tue, 2 May 2017 22:14:01 +0800 Subject: [PATCH 382/552] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=A6=E7=91=9F?= =?UTF-8?q?=E5=A4=AB=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/queue/CircleQueueTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..a55219fde2 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java @@ -0,0 +1,44 @@ +package com.github.miniyk2012.coding2017.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class CircleQueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(5); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertTrue(queue.isFull()); + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } + +} From 148869c724baba2a9b57e535ecbac4aa00a06fc9 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Wed, 3 May 2017 00:13:58 +0800 Subject: [PATCH 383/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=94=B12=E4=B8=AA?= =?UTF-8?q?=E6=A0=88=E6=9E=84=E6=88=90=E7=9A=84=E9=98=9F=E5=88=97=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=94=B1=E6=95=B0=E7=BB=84=E6=9E=84=E6=88=90?= =?UTF-8?q?=E7=9A=84=E5=8F=8C=E7=AB=AF=E9=98=9F=E5=88=97=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/queue/CircleQueue.java | 69 ++++++++++++++++++- .../basic/queue/CircleQueueTest.java | 13 +++- .../coding2017/basic/queue/Josephus.java | 14 ++-- .../basic/queue/QueueWithTwoStacks.java | 31 +++++---- .../basic/queue/QueueWithTwoStacksTest.java | 52 ++++++++++++++ .../jvm/loader/ByteCodeIterator.java | 2 +- 6 files changed, 161 insertions(+), 20 deletions(-) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacksTest.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java index 104ca0c92f..3434c87519 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java @@ -1,5 +1,72 @@ package com.github.miniyk2012.coding2017.basic.queue; -public class CircleQueue { +import java.util.ArrayDeque; +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int head = 0; + //队尾 + private int rear = 0; // rear指向的位置不放值,也就是说即使满了,也有一个空位 + + public CircleQueue(int capacity) { + elementData = new Object[capacity+1]; // 实际的数组长度要比容量大1 + } + + public CircleQueue() { + } + + public boolean isEmpty() { + return head == rear; + } + + public int size() { + + return Math.floorMod(rear-head, elementData.length); + } + + /** + * 如果满了还往里面放,则抛IndexOutOfBoundsException异常 + */ + public void enQueue(E data) { + if (isFull()) throw new IndexOutOfBoundsException("循环队列已满"); + elementData[rear] = data; + rear = Math.floorMod(rear+1, elementData.length); + } + + /** + * 如果为空,则抛IndexOutOfBoundsException异常 + * @return + */ + public E deQueue() { + if (isEmpty()) throw new IndexOutOfBoundsException("循环队列为空"); + E result = (E) elementData[head]; + head = Math.floorMod(head+1, elementData.length); + return result; + } + + public boolean isFull() { + return size() == elementData.length-1; + } + + public static void main(String[] args) { + /** + Math.floorMod( 2, 3) = 2 + Math.floorMod(-2, 3) = 1 + Math.floorMod( 2, -3) = -1 + Math.floorMod(-2, -3) = -2 + */ + System.out.println(Math.floorMod(1-2, 5)); + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java index a55219fde2..9d715a81a0 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java @@ -36,9 +36,20 @@ public void test() { Assert.assertEquals("a", queue.deQueue()); Assert.assertEquals("b", queue.deQueue()); Assert.assertEquals("c", queue.deQueue()); + + Assert.assertFalse(queue.isFull()); + Assert.assertEquals(2, queue.size()); + + queue.enQueue("f"); + queue.enQueue("g"); Assert.assertEquals("d", queue.deQueue()); Assert.assertEquals("e", queue.deQueue()); - + Assert.assertEquals("f", queue.deQueue()); + Assert.assertEquals("g", queue.deQueue()); + + Assert.assertEquals(0, queue.size()); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java index 199a08628c..7c62997d2e 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java @@ -1,20 +1,24 @@ package com.github.miniyk2012.coding2017.basic.queue; -import java.util.ArrayList; import java.util.List; /** * 用Queue来实现Josephus问题 * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: - * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 + * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 * @author liuxin * */ public class Josephus { - public static List execute(int n, int m){ - - return null; + public static List execute(int n, int m){ + CircleQueue circleQueue = new CircleQueue<>(n); + for (int i=0; i + */ public class QueueWithTwoStacks { - private Stack stack1; + private Stack stack1; private Stack stack2; @@ -12,29 +18,30 @@ public QueueWithTwoStacks() { stack2 = new Stack(); } - - - public boolean isEmpty() { - return false; + return stack1.isEmpty(); } - + private void move(Stack s1, Stack s2) { + while (!s1.empty()) { + s2.push(s1.pop()); + } + } public int size() { - return -1; + return stack1.size(); } - - public void enQueue(E item) { - + stack1.push(item); } public E deQueue() { - return null; + move(stack1, stack2); + E result = stack2.pop(); + move(stack2, stack1); + return result; } - } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacksTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..30c3268c5a --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,52 @@ +package com.github.miniyk2012.coding2017.basic.queue; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +/** +* QueueWithTwoStacks Tester. +* +* @author +* @since
    May 3, 2017
    +* @version 1.0 +*/ +public class QueueWithTwoStacksTest { + QueueWithTwoStacks queue; + + @Before + public void before() throws Exception { + queue = new QueueWithTwoStacks<>(); + } + + @After + public void after() throws Exception { + } + + @Test + public void testFunction() { + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + Assert.assertEquals(4, queue.size()); + Assert.assertFalse(queue.isEmpty()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals(1, queue.size()); + Assert.assertFalse(queue.isEmpty()); + + queue.enQueue("e"); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + Assert.assertTrue(queue.isEmpty()); + Assert.assertEquals(0, queue.size()); + + } + + + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java index 39500bb87c..1cd3b700aa 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/coderising/jvm/loader/ByteCodeIterator.java @@ -11,7 +11,7 @@ public class ByteCodeIterator { private int point = 0; public ByteCodeIterator(byte[] codes) { - this.codes = codes; + this.codes = codes.clone(); } public int nextU1toInt() { From 11baad280b46a4bd5eadb522e9dab9ca99b80270 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Wed, 3 May 2017 00:57:54 +0800 Subject: [PATCH 384/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BA=A6=E7=91=9F?= =?UTF-8?q?=E5=A4=AB=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/queue/CircleQueue.java | 6 +++--- .../coding2017/basic/queue/CircleQueueTest.java | 9 +++++++++ .../coding2017/basic/queue/Josephus.java | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java index 3434c87519..ff6f0f2699 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueue.java @@ -3,7 +3,7 @@ import java.util.ArrayDeque; /** - * 用数组实现循环队列 + * 用数组实现循环队列,这也是一个队列,和普通队列有相同的外部特性,只是内部使用循环数组实现的罢了 * @author liuxin * * @param @@ -16,9 +16,9 @@ public class CircleQueue { private Object[] elementData = new Object[DEFAULT_SIZE] ; //队头 - private int head = 0; + protected int head = 0; //队尾 - private int rear = 0; // rear指向的位置不放值,也就是说即使满了,也有一个空位 + protected int rear = 0; // rear指向的位置不放值,也就是说即使满了,也有一个空位 public CircleQueue(int capacity) { elementData = new Object[capacity+1]; // 实际的数组长度要比容量大1 diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java index 9d715a81a0..1b4c4d1887 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/CircleQueueTest.java @@ -26,6 +26,8 @@ public void test() { queue.enQueue("a"); queue.enQueue("b"); queue.enQueue("c"); + // System.out.println(queue.head); + // System.out.println(queue.rear); queue.enQueue("d"); queue.enQueue("e"); @@ -42,14 +44,21 @@ public void test() { queue.enQueue("f"); queue.enQueue("g"); + // System.out.println(queue.head); + // System.out.println(queue.rear); Assert.assertEquals("d", queue.deQueue()); Assert.assertEquals("e", queue.deQueue()); + // System.out.println(queue.head); + // System.out.println(queue.rear); Assert.assertEquals("f", queue.deQueue()); Assert.assertEquals("g", queue.deQueue()); Assert.assertEquals(0, queue.size()); Assert.assertTrue(queue.isEmpty()); Assert.assertFalse(queue.isFull()); + + // System.out.println(queue.head); + // System.out.println(queue.rear); } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java index 7c62997d2e..9f70edd16d 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java @@ -1,5 +1,6 @@ package com.github.miniyk2012.coding2017.basic.queue; +import java.util.LinkedList; import java.util.List; /** @@ -14,10 +15,22 @@ public class Josephus { public static List execute(int n, int m){ CircleQueue circleQueue = new CircleQueue<>(n); + List result = new LinkedList<>(); for (int i=0; i Date: Wed, 3 May 2017 12:48:53 +0800 Subject: [PATCH 385/552] the third homework and changes of the second homework download and linkedList --- .../src/data_Structure_Utils/ArrayUtil.java | 227 ++++++------- .../src/download/DownloadThread.java | 43 +++ .../src/download/FileDownloader.java | 120 +++++++ .../src/download/api/Connection.java | 23 ++ .../src/download/api/ConnectionException.java | 10 + .../src/download/api/ConnectionManager.java | 10 + .../src/download/api/DownloadListener.java | 5 + .../src/download/impl/ConnectionImpl.java | 79 +++++ .../download/impl/ConnectionManagerImpl.java | 18 + .../1294642551/src/linkList/LinkedList.java | 320 ++++++++++++++++++ .../src/linkList/LinkedListTest.java | 202 +++++++++++ group19/1294642551/src/linkList/List.java | 9 + .../src/litestruts/Configuration.java | 137 ++++++++ .../litestruts/ConfigurationException.java | 26 ++ .../src/litestruts/LoginAction.java | 39 +++ .../src/litestruts/ReflectionUtil.java | 79 +++++ group19/1294642551/src/litestruts/Struts.java | 98 ++++++ group19/1294642551/src/litestruts/View.java | 23 ++ .../data_Structure_Utils/ArrayUtilTest.java | 29 +- .../test/download/ConnectionTest.java | 36 ++ .../test/download/FileDownloaderTest.java | 59 ++++ .../test/litestruts/ConfigurationTest.java | 39 +++ .../test/litestruts/ReflectionUtilTest.java | 110 ++++++ .../test/litestruts/StrutsTest.java | 39 +++ 24 files changed, 1656 insertions(+), 124 deletions(-) create mode 100644 group19/1294642551/src/download/DownloadThread.java create mode 100644 group19/1294642551/src/download/FileDownloader.java create mode 100644 group19/1294642551/src/download/api/Connection.java create mode 100644 group19/1294642551/src/download/api/ConnectionException.java create mode 100644 group19/1294642551/src/download/api/ConnectionManager.java create mode 100644 group19/1294642551/src/download/api/DownloadListener.java create mode 100644 group19/1294642551/src/download/impl/ConnectionImpl.java create mode 100644 group19/1294642551/src/download/impl/ConnectionManagerImpl.java create mode 100644 group19/1294642551/src/linkList/LinkedList.java create mode 100644 group19/1294642551/src/linkList/LinkedListTest.java create mode 100644 group19/1294642551/src/linkList/List.java create mode 100644 group19/1294642551/src/litestruts/Configuration.java create mode 100644 group19/1294642551/src/litestruts/ConfigurationException.java create mode 100644 group19/1294642551/src/litestruts/LoginAction.java create mode 100644 group19/1294642551/src/litestruts/ReflectionUtil.java create mode 100644 group19/1294642551/src/litestruts/Struts.java create mode 100644 group19/1294642551/src/litestruts/View.java create mode 100644 group19/1294642551/test/download/ConnectionTest.java create mode 100644 group19/1294642551/test/download/FileDownloaderTest.java create mode 100644 group19/1294642551/test/litestruts/ConfigurationTest.java create mode 100644 group19/1294642551/test/litestruts/ReflectionUtilTest.java create mode 100644 group19/1294642551/test/litestruts/StrutsTest.java diff --git a/group19/1294642551/src/data_Structure_Utils/ArrayUtil.java b/group19/1294642551/src/data_Structure_Utils/ArrayUtil.java index 412e261efb..5138f7e402 100644 --- a/group19/1294642551/src/data_Structure_Utils/ArrayUtil.java +++ b/group19/1294642551/src/data_Structure_Utils/ArrayUtil.java @@ -1,6 +1,7 @@ package data_Structure_Utils; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.TreeSet; @@ -13,17 +14,18 @@ public class ArrayUtil { * @param origin * @return */ - public int[] reverseArray(int[] origin){ + public void reverseArray(int[] origin){ + if(origin == null || origin.length == 0){ + return; + } int len = origin.length; - int[] arr = new int[len]; - - for(int i = 0; i < len; i++) - { - arr[i] = origin[ len -1 - i]; + for(int i = 0; i < len/2; i++){ + int temp = origin[i]; + origin[i] = origin[len-1-i]; + origin[len-1-i] = temp; } - return arr; } /** @@ -35,9 +37,11 @@ public int[] reverseArray(int[] origin){ */ public int[] removeZero(int[] oldArray){ + if(oldArray == null){ + return null; + } ArrayList al = new ArrayList(); - int len = oldArray.length; for(int i = 0; i < len; i++) { @@ -68,6 +72,13 @@ public int[] removeZero(int[] oldArray){ */ public int[] merge(int[] array1, int[] array2){ + if(array1 == null){ + return array2; + } + if(array2 == null){ + return array1; + } + TreeSet tr = new TreeSet(); for(int i = 0; i < array1.length; i++) { @@ -82,7 +93,7 @@ public int[] merge(int[] array1, int[] array2){ int[] arr = new int[arrLen]; int index = 0; - Iterator it = tr.iterator(); + Iterator it = tr.iterator(); while(it.hasNext()) { arr[index] = (Integer) it.next(); @@ -101,20 +112,15 @@ public int[] merge(int[] array1, int[] array2){ * @return */ public int[] grow(int [] oldArray, int size){ - - int len = oldArray.length; - int arrLen = len + size; - int[] arr = new int[arrLen]; - - for(int i = 0; i < arrLen; i++) - { - if (i < len) - arr[i] = oldArray[i]; - else - arr[i] = 0; + if(oldArray == null){ + return null; } - - return arr; + if(size<0){ + throw new IndexOutOfBoundsException("size < 0"); + } + int[] newArray = new int[oldArray.length + size]; + System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); + return newArray; } @@ -126,35 +132,26 @@ public int[] grow(int [] oldArray, int size){ * @return */ public int[] fibonacci(int max){ - - ArrayList al = new ArrayList(); - int first = 1; - int second = 1; - int value = 0; - if(max >= 2) - { - al.add(first); - al.add(second); + if(max == 1){ + return new int[0]; + } + if(max == 2){ + return new int[]{1, 1}; } - do - { - value = first + second; - if(value < max) - { - al.add(value); - first = second; - second = value; - } - }while(value < max); - int arrLen = al.size(); - int[] arr = new int[arrLen]; - for(int i = 0; i < arrLen; i++) - { - arr[i] = al.get(i); + int[] arr = new int[max];//分配了多的空间,后面需要做数组拷贝 + arr[0] = 1; + arr[1] = 2; + int count = 2;//已经有两个元素了 + for(int i = 2; i < max; i++){ + arr[i] = arr[i-2] + arr[i-1]; + if(arr[i] >= max){ + break; + } + count++; } - return arr; + return Arrays.copyOf(arr, count); } @@ -166,40 +163,36 @@ public int[] fibonacci(int max){ */ public int[] getPrimes(int max){ - ArrayList al = new ArrayList(); - if(max > 2) - al.add(2); + if(max < 3){ + return new int[0]; + } - int value = 3; - while(value < max) - { - int flag = 1; - for(int i = 2; i < value; i++) - { - if(value % i == 0) - { - flag = 0; - break; - } + int[] arr = new int[max]; + int count = 0; + for(int n = 2; n < max; n++){ + if(isPrime(n)){ + arr[count++] = n; } - - if (flag == 1) - al.add(value); - - value++; } - int arrLen = al.size(); - int[] arr = new int[arrLen]; - for(int i = 0; i < arrLen; i++) - { - arr[i] = al.get(i); - } - return arr; + return Arrays.copyOf(arr, count); } + // 判断某个数是否是素数 + private boolean isPrime(int n){ + int i = 2; + while(i < n){ + if(n % i != 0){ + i++; + }else{ + break; + } + } + return i == n; + } + /** * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 @@ -207,42 +200,45 @@ public int[] getPrimes(int max){ * @return */ public int[] getPerfectNumbers(int max){ - - ArrayList al = new ArrayList(); - for(int i = 1; i < max; i++) - { - if (isPerfectNumber(i)) - al.add(i); + if (max <= 0) { + return null; } - - int arrLen = al.size(); - int[] arr = new int[arrLen]; - for(int i = 0; i < arrLen; i++) - { - arr[i] = al.get(i); + int[] array = new int[max]; + int count = 0; + + for(int n = 2; n < max; n++){ + int sum = 0;//记录所有真因子之和 + for(int i = 1; i < n; i++){ + if(n%i == 0){ + sum += i; + } + } + if(sum == n){ + array[count++] = n; + } } - - return arr; + + return Arrays.copyOf(array, count); } - public boolean isPerfectNumber(int number) - { - ArrayList al = new ArrayList(); - - for(int i = 1; i < number; i++) - { - if(number % i == 0) - al.add(i); - } - - int value = 0; - for(int j = 0; j < al.size(); j++) - { - value = value + al.get(j); - } - - return value == number; - } +// public boolean isPerfectNumber(int number) +// { +// ArrayList al = new ArrayList(); +// +// for(int i = 1; i < number; i++) +// { +// if(number % i == 0) +// al.add(i); +// } +// +// int value = 0; +// for(int j = 0; j < al.size(); j++) +// { +// value = value + al.get(j); +// } +// +// return value == number; +// } /** * 用seperator 把数组 array给连接起来 @@ -254,15 +250,20 @@ public boolean isPerfectNumber(int number) */ public String join(int[] array, String seperator){ - String str = ""; - int len = array.length; - for(int i = 0; i < len-1; i++) - { - str = str + array[i] + seperator; + if(array == null){ + return null; } - str = str + array[len-1]; - - return str; + if(array.length == 0){ + return ""; + } + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < array.length; i++){ + sb.append(array[i]); + if(i < array.length -1){ + sb.append(seperator); + } + } + return sb.toString(); } diff --git a/group19/1294642551/src/download/DownloadThread.java b/group19/1294642551/src/download/DownloadThread.java new file mode 100644 index 0000000000..aebd8932f0 --- /dev/null +++ b/group19/1294642551/src/download/DownloadThread.java @@ -0,0 +1,43 @@ +package download; + +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +import download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + CyclicBarrier barrier; + String localFile; + + public DownloadThread( Connection conn, int startPos, int endPos,String localFile, CyclicBarrier barrier){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.localFile = localFile; + this.barrier = barrier; + } + + + public void run(){ + try { + System.out.println("Begin to read [" + startPos +"-"+endPos+"]"); + // 每个线程都有一个RandomAccessFile,这样多线程下载的时候不会出现冲突 + RandomAccessFile raf = new RandomAccessFile(localFile, "rw"); + byte[] data = conn.read(startPos, endPos); + raf.seek(startPos); + raf.write(data); + raf.close(); + conn.close(); + barrier.await();//等待别的线程完成 + + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/group19/1294642551/src/download/FileDownloader.java b/group19/1294642551/src/download/FileDownloader.java new file mode 100644 index 0000000000..6d7096c644 --- /dev/null +++ b/group19/1294642551/src/download/FileDownloader.java @@ -0,0 +1,120 @@ +package download; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +import download.api.Connection; +import download.api.ConnectionException; +import download.api.ConnectionManager; +import download.api.DownloadListener; + + +public class FileDownloader { + + private String url; + private String localFile; + private static final int DOWNLOAD_THREAD_NUM = 3;//下载线程的个数 + + DownloadListener listener; + ConnectionManager cm;//管理Connection + + public FileDownloader(String _url, String localFile) { + this.url = _url; + this.localFile = localFile; + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + + // 栅栏类:第一个参数表示线程的个数; + // 第二个参数表示等所有的线程执行完成之后,再调用的线程 + CyclicBarrier barrier = new CyclicBarrier(DOWNLOAD_THREAD_NUM, new Runnable(){ + + @Override + public void run() { + listener.notifyFinished(); + }}); + + Connection conn = null; + try { + + conn = cm.open(this.url); + int length = conn.getContentLength(); + createPlaceHolderFile(localFile, length); + int[][] ranges = allocateDownloadRange(DOWNLOAD_THREAD_NUM, length); + for(int i = 0; i < DOWNLOAD_THREAD_NUM; i++){ + int startPos = ranges[i][0]; + int endPos = ranges[i][1]; + DownloadThread thread = new DownloadThread(cm.open(url), startPos, endPos, localFile, barrier); + thread.start(); + } + + } catch (ConnectionException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + } + + // 在下载之前,根据文件的额大小,先在硬盘中占据一个地方,以免空间不够用 + private void createPlaceHolderFile(String fileName, int contentLen) throws IOException{ + // 随机读写文件的类 + RandomAccessFile raf = new RandomAccessFile(fileName, "rw"); + for(int i = 0; i < contentLen; i++){ + raf.write(i); + } + raf.close(); + + } + + private int[][] allocateDownloadRange(int threadNum, int contentLen){ + int[][] ranges = new int[threadNum][2]; + int eachThreadSize = contentLen / threadNum; + int left = contentLen % threadNum; + for(int i = 0; i < threadNum; i++){ + int startPos = i * eachThreadSize; + int endPos = (i+1) * eachThreadSize - 1; + + if(i == (threadNum - 1)){ + endPos += left; + } + + ranges[i][0] = startPos; + ranges[i][1] = endPos; + } + return ranges; + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group19/1294642551/src/download/api/Connection.java b/group19/1294642551/src/download/api/Connection.java new file mode 100644 index 0000000000..1a467a8086 --- /dev/null +++ b/group19/1294642551/src/download/api/Connection.java @@ -0,0 +1,23 @@ +package download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group19/1294642551/src/download/api/ConnectionException.java b/group19/1294642551/src/download/api/ConnectionException.java new file mode 100644 index 0000000000..8af122abf4 --- /dev/null +++ b/group19/1294642551/src/download/api/ConnectionException.java @@ -0,0 +1,10 @@ +package download.api; + + +public class ConnectionException extends Exception { + + public ConnectionException(Exception e) { + super(e); + } + +} diff --git a/group19/1294642551/src/download/api/ConnectionManager.java b/group19/1294642551/src/download/api/ConnectionManager.java new file mode 100644 index 0000000000..1519ebb787 --- /dev/null +++ b/group19/1294642551/src/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group19/1294642551/src/download/api/DownloadListener.java b/group19/1294642551/src/download/api/DownloadListener.java new file mode 100644 index 0000000000..4119e46144 --- /dev/null +++ b/group19/1294642551/src/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group19/1294642551/src/download/impl/ConnectionImpl.java b/group19/1294642551/src/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..c12669d1e2 --- /dev/null +++ b/group19/1294642551/src/download/impl/ConnectionImpl.java @@ -0,0 +1,79 @@ +package download.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; + +import download.api.Connection; +import download.api.ConnectionException; + +/** + * ConnectionImpl这个类不是public,是省略的,只在impl这个包中可见 + * @author 12946 + * + */ +class ConnectionImpl implements Connection{ + + URL url; + static final int BUFFER_SIZE = 1024; + + public ConnectionImpl(String url) throws ConnectionException { + try { + this.url = new URL(url); + } catch (MalformedURLException e) { + throw new ConnectionException(e); + } + + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + httpConn.setRequestProperty("Range", "bytes="+startPos+"-"+endPos); + InputStream input = httpConn.getInputStream(); +// input.skip(startPos); + byte[] buff = new byte[BUFFER_SIZE]; + int totalLen = endPos - startPos + 1; + //内存中的输出流,我们可以往这个内存中的输出流写东西 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + while(baos.size() < totalLen){ + int len = input.read(buff);//input输入流read的数据放到buff中 + if(len < 0){ + break; + } + baos.write(buff, 0, len); + } + + if(baos.size() > totalLen){//最后一次写入baos时,可能会写入多的数据 + byte[] data = baos.toByteArray(); + return Arrays.copyOf(data, totalLen); + } + + return baos.toByteArray(); + + } + + @Override + public int getContentLength() { + try { + URLConnection httpConn = url.openConnection(); + return httpConn.getContentLength(); + } catch (IOException e) { + e.printStackTrace(); + } + return -1; + } + + @Override + public void close() { + + + } + +} diff --git a/group19/1294642551/src/download/impl/ConnectionManagerImpl.java b/group19/1294642551/src/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..774ae688a4 --- /dev/null +++ b/group19/1294642551/src/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,18 @@ +package download.impl; + +import download.api.Connection; +import download.api.ConnectionException; +import download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + /** + * 返回的是Connection接口 + */ + @Override + public Connection open(String url) throws ConnectionException { + + return new ConnectionImpl(url); + } + +} diff --git a/group19/1294642551/src/linkList/LinkedList.java b/group19/1294642551/src/linkList/LinkedList.java new file mode 100644 index 0000000000..ebbe0beb31 --- /dev/null +++ b/group19/1294642551/src/linkList/LinkedList.java @@ -0,0 +1,320 @@ +package linkList; + +/** + * 单向链表:其中头结点(head)中没有数据,第一个数据是head结点的下一个结点存贮 + * @author 12946 + * + */ +public class LinkedList implements List { + + private Node head;//头结点 + private int size;//链表中元素的个数 + + public LinkedList(){ + this.head = new Node(null); + this.size = 0; + } + + + public void add(Object o){ + Node newNode = new Node(o); + Node tempNode = head; + while(tempNode.next != null){ + tempNode = tempNode.next; + } + tempNode.next = newNode; + size++; + } + + public void add(int index , Object o){ + if(index < 0 || index > size-1){ + throw new IndexOutOfBoundsException("索引越界"); + } + Node newNode = new Node(o); + Node tempNode = null; + if(index == 0){ + tempNode = head; + }else{ + tempNode = getNode(index - 1); + } + newNode.next = tempNode.next; + tempNode.next = newNode; + + size++; + } + + public Object get(int index){ + + return getNode(index).data; + } + + public Node getNode(int index){ + if(index < 0 || index > size-1){ + throw new IndexOutOfBoundsException("索引越界"); + } + Node tempNode = head; + for(int i = -1; i < index; i++){ + tempNode = tempNode.next; + } + return tempNode; + } + + public Object remove(int index){ + if(index < 0 || index > size-1){ + throw new IndexOutOfBoundsException("索引越界"); + } + Node tempNode = null; + if(index == 0){ + tempNode = head; + }else{ + tempNode = getNode(index - 1); + } + tempNode.next = tempNode.next.next; + size--; + return tempNode.next.data; + } + + public int size(){ + return size; + } + + public void addFirst(Object o){ + Node newNode = new Node(o); + newNode.next = getNode(0); + head.next = newNode; + size++; + } + public void addLast(Object o){ + getNode(size-1).next = new Node(o); + size++; + } + public Object removeFirst(){ + if(size < 1){ + throw new IndexOutOfBoundsException("链表为null,不能删除元素"); + } + head.next = head.next.next; + size--; + + return head.next.data; + } + public Object removeLast(){ + if(size < 1){ + throw new IndexOutOfBoundsException("链表为null,不能删除元素"); + } + + Object data = null; + if(size == 1){ + data = head.next.data; + head.next = null; + }else{ + Node tempNode = getNode(size-2); + data = tempNode.next.data; + tempNode.next = null; + } + size--; + return data; + } + + /** + * 根据元素的值查找元素在链表中的位置,找不到则返回-1 + * @param o + * @return + */ + public int findIndex(Object o){ + for(int i = 0; i < size; i++){ + if(get(i).equals(o)){ + return i; + } + } + + return -1; + } + + public String toString(){ + StringBuilder sb = new StringBuilder("["); + for(int i = 0; i < size; i++){ + sb.append(get(i)); + if(i != size-1){ + sb.append(","); + } + } + sb.append("]"); + + return sb.toString(); + } + + private static class Node{ + Object data; + Node next = null; + + public Node(Object data){ + this.data = data; + } + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + int[] arr = new int[size]; + for(int i = 0; i < size; i++){ + arr[i] = (Integer) get(size - i - 1); + } + LinkedList newLinkedList = new LinkedList(); + for(int i = 0; i < size; i++){ + newLinkedList.add(arr[i]); + } + + head = newLinkedList.head; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + int index = size/2; + head.next = getNode(index); + size = size - index; + } + + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + if(i < 0 ){ + throw new IndexOutOfBoundsException("索引越界"); + } + + Node startNode = null; + Node endNode = null; + + if(i == 0){ + startNode = head; + }else{ + startNode = getNode(i - 1); + } + + if(i + length >= size){ + endNode = null; + size = i; + }else{ + endNode = getNode(i + length); + size = size - length; + } + startNode.next = endNode; + + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + if((Integer)list.get(list.size-1) > this.size - 1){ + throw new IndexOutOfBoundsException("list指定的元素角标超过当前链表的范围"); + } + int[] arr = new int[list.size]; + for(int i = 0; i < arr.length; i++){ + int index = (Integer) list.get(i); + arr[i] = (Integer) this.get(index); + } + + return arr; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + for(int i = 0; i < list.size; i++){ + Object value = list.get(i); + int index = this.findIndex(value); + if(index != -1){ + this.remove(index); + } + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + LinkedList newLinkedList = new LinkedList(); + for(int i = 0; i < size; i++){ + Object value = this.get(i); + if(newLinkedList.findIndex(value) == -1){ + newLinkedList.add(value); + } + } + this.head = newLinkedList.head; + this.size = newLinkedList.size; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + int start = 0; + int end = size - 1; + for(int i = 0; i < size; i++){ + int value = (Integer) get(i); + if(value <= min){ + start++; + } + } + + for(int j = size-1; j > -1; j--){ + int value = (Integer) get(j); + if(value >= max){ + end--; + } + } + + Node tempNode = null; + if(start == 0){ + tempNode = head; + }else{ + tempNode = getNode(start - 1); + } + tempNode.next = getNode(end).next; + size = size - (end - start + 1); + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + LinkedList newLinkedList = new LinkedList(); + for(int i = 0; i < list.size; i++){ + int value = (Integer) list.get(i); + int index = findIndex(value); + if(index != -1){ + newLinkedList.add(value); + } + } + + return newLinkedList; + } +} diff --git a/group19/1294642551/src/linkList/LinkedListTest.java b/group19/1294642551/src/linkList/LinkedListTest.java new file mode 100644 index 0000000000..53570d25d2 --- /dev/null +++ b/group19/1294642551/src/linkList/LinkedListTest.java @@ -0,0 +1,202 @@ +package linkList; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class LinkedListTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverse() { + LinkedList l = new LinkedList(); + + Assert.assertEquals("[]", l.toString()); + + l.add(1); + l.reverse(); + Assert.assertEquals("[1]", l.toString()); + + l.add(2); + l.add(3); + l.add(4); + + l.reverse(); + Assert.assertEquals("[4,3,2,1]", l.toString()); + } + + @Test + public void testRemoveFirstHalf() { + { + LinkedList linkedList = new LinkedList(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + linkedList.add(4); + linkedList.removeFirstHalf(); + Assert.assertEquals("[3,4]", linkedList.toString()); + } + { + LinkedList linkedList = new LinkedList(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + linkedList.add(4); + linkedList.add(5); + linkedList.removeFirstHalf(); + Assert.assertEquals("[3,4,5]", linkedList.toString()); + } + } + + + + @Test + public void testRemoveIntInt() { + + { + LinkedList linkedList = new LinkedList(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + linkedList.add(4); + linkedList.remove(0, 2); + Assert.assertEquals("[3,4]", linkedList.toString()); + } + { + LinkedList linkedList = new LinkedList(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + linkedList.add(4); + linkedList.remove(3, 2); + Assert.assertEquals("[1,2,3]", linkedList.toString()); + } + { + LinkedList linkedList = new LinkedList(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + linkedList.add(4); + linkedList.remove(2, 2); + Assert.assertEquals("[1,2]", linkedList.toString()); + } + + } + @Test + public void testGetElements() { + LinkedList linkedList = new LinkedList(); + linkedList.add(11); + linkedList.add(101); + linkedList.add(201); + linkedList.add(301); + linkedList.add(401); + linkedList.add(501); + linkedList.add(601); + linkedList.add(701); + LinkedList list = new LinkedList(); + list.add(1); + list.add(3); + list.add(4); + list.add(6); + Assert.assertArrayEquals(new int[]{101,301,401,601}, linkedList.getElements(list)); + } + + @Test + public void testSubtract() { + LinkedList list1 = new LinkedList(); + list1.add(101); + list1.add(201); + list1.add(301); + list1.add(401); + list1.add(501); + list1.add(601); + list1.add(701); + + LinkedList list2 = new LinkedList(); + + list2.add(101); + list2.add(201); + list2.add(301); + list2.add(401); + list2.add(501); + + list1.subtract(list2); + + Assert.assertEquals("[601,701]", list1.toString()); + } + + + @Test + public void testRemoveDuplicateValues() { + LinkedList list = new LinkedList(); + list.add(1); + list.add(1); + list.add(2); + list.add(2); + list.add(3); + list.add(5); + list.add(5); + list.add(6); + list.removeDuplicateValues(); + Assert.assertEquals("[1,2,3,5,6]", list.toString()); + } + + + @Test + public void testRemoveRange() { + + { + LinkedList linkedList = new LinkedList(); + + linkedList.add(11); + linkedList.add(12); + linkedList.add(13); + linkedList.add(14); + linkedList.add(16); + linkedList.add(16); + linkedList.add(19); + + linkedList.removeRange(10, 19); + Assert.assertEquals("[19]", linkedList.toString()); + } + + { + LinkedList linkedList = new LinkedList(); + + linkedList.add(11); + linkedList.add(12); + linkedList.add(13); + linkedList.add(14); + linkedList.add(16); + linkedList.add(16); + linkedList.add(19); + + linkedList.removeRange(10, 14); + Assert.assertEquals("[14,16,16,19]", linkedList.toString()); + } + } + @Test + public void testIntersection() { + LinkedList list1 = new LinkedList(); + list1.add(1); + list1.add(6); + list1.add(7); + + LinkedList list2 = new LinkedList(); + list2.add(2); + list2.add(5); + list2.add(6); + + LinkedList newList = list1.intersection(list2); + Assert.assertEquals("[6]", newList.toString()); + } + +} diff --git a/group19/1294642551/src/linkList/List.java b/group19/1294642551/src/linkList/List.java new file mode 100644 index 0000000000..715da9ab77 --- /dev/null +++ b/group19/1294642551/src/linkList/List.java @@ -0,0 +1,9 @@ +package linkList; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group19/1294642551/src/litestruts/Configuration.java b/group19/1294642551/src/litestruts/Configuration.java new file mode 100644 index 0000000000..5dcde2d1c6 --- /dev/null +++ b/group19/1294642551/src/litestruts/Configuration.java @@ -0,0 +1,137 @@ +package litestruts; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + + +/** + * 配置类 + * 提取xml文件中的元素和属性,封装成Java对象,这样方便使用 + * @author 12946 + * + */ + +public class Configuration { + + //键为actionName,值为ActionConfig对象 + private Map actions = new HashMap(); + + public Configuration(String filename) { + //得到输入流 + String packageName = this.getClass().getPackage().getName(); + packageName = packageName.replace(".", "/"); + InputStream input = this.getClass().getResourceAsStream("/"+packageName+"/"+filename); + parseXML(input); + try { + input.close(); + } catch (IOException e) { + throw new ConfigurationException(e); + } + //解析XML + + } + + /** + * 解析XML,将XML的元素封装到ActionConfig对象中 + * @param input + */ + @SuppressWarnings("unchecked") + private void parseXML(InputStream input) { + + try { + SAXReader reader = new SAXReader(); + Document document = reader.read(input); + Element root = document.getRootElement(); + + List actionList = root.elements("action");//得到所有action元素 + for(Element action : actionList){ + String actionName = action.attributeValue("name"); + String className = action.attributeValue("class"); + // 创建ActionConfig对象 + ActionConfig ac = new ActionConfig(actionName, className); + // 给ActionConfig对象增加ViewResult + List results = action.elements("result"); + for(Element result : results){ + String resultName = result.attributeValue("name"); + String resultText = result.getText(); + ac.addViewResult(resultName, resultText); + } + // 将ActionConfig对象加入到actions中 + this.actions.put(actionName, ac); + } + } catch (DocumentException e) { + throw new ConfigurationException(e); + } + + + } + + /** + * 获取指定action中的class名称 + * @param actionName + * @return + */ + public String getClassName(String actionName) { + ActionConfig ac = this.actions.get(actionName); + if(ac == null){ + return null; + } + return ac.getClassName(); + } + + /** + * 根据resultName获取resultView + * @param string + * @return + */ + public String getResultView(String actionName, String resultName) { + ActionConfig ac = this.actions.get(actionName); + if(ac == null){ + return null; + } + return ac.getViewName(resultName); + } + + /** + * 内部类,封装struts.xml的元素 + * @author 12946 + * + */ + @SuppressWarnings("unused") + private class ActionConfig{ + private String actionName; + private String className; + Map viewResult = new HashMap(); + + public ActionConfig(String actionName, String className) { + super(); + this.actionName = actionName; + this.className = className; + } + + public String getClassName(){ + return className; + } + + public void addViewResult(String name, String viewName){ + viewResult.put(name, viewName); + } + + public String getViewName(String resultName){ + return viewResult.get(resultName); + } + + } + + + + +} diff --git a/group19/1294642551/src/litestruts/ConfigurationException.java b/group19/1294642551/src/litestruts/ConfigurationException.java new file mode 100644 index 0000000000..a74e434a38 --- /dev/null +++ b/group19/1294642551/src/litestruts/ConfigurationException.java @@ -0,0 +1,26 @@ +package litestruts; + +import java.io.IOException; + +import org.dom4j.DocumentException; + + +public class ConfigurationException extends RuntimeException { + + + public ConfigurationException(String msg) { + super(msg); + } + + + public ConfigurationException(IOException e) { + super(e); + } + + + public ConfigurationException(DocumentException e) { + super(e); + } + + +} diff --git a/group19/1294642551/src/litestruts/LoginAction.java b/group19/1294642551/src/litestruts/LoginAction.java new file mode 100644 index 0000000000..bba4c11c9f --- /dev/null +++ b/group19/1294642551/src/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group19/1294642551/src/litestruts/ReflectionUtil.java b/group19/1294642551/src/litestruts/ReflectionUtil.java new file mode 100644 index 0000000000..fc015885d6 --- /dev/null +++ b/group19/1294642551/src/litestruts/ReflectionUtil.java @@ -0,0 +1,79 @@ +package litestruts; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class ReflectionUtil { + + public static List getSetterMethod(Class clazz) { + return getMethods(clazz, "set"); + } + + + public static void setParameters(Object o, + Map parameters) { + List methods = getSetterMethod(o.getClass()); + + for(String name : parameters.keySet()){ + String methodName = "set"+name; + for(Method m : methods){ + if(m.getName().equalsIgnoreCase(methodName)){ + try { + m.invoke(o, parameters.get(name)); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } + } + } + + + public static List getGetterMethod(Class clazz) { + return getMethods(clazz,"get"); + } + + + public static List getMethods(Class clazz, String startWithName) { + List methods = new ArrayList(); + for(Method method : clazz.getDeclaredMethods()){ + if(method.getName().startsWith(startWithName)){ + methods.add(method); + } + } + return methods; + } + + + public static Map getParameters(Object o) { + List methods = getGetterMethod(o.getClass()); + Map parameters = new HashMap(); + for(Method m : methods){ + try { + String name = m.getName().replaceFirst("get", "").toLowerCase(); + Object value = m.invoke(o); + parameters.put(name, value); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + return parameters; + + } + + +} diff --git a/group19/1294642551/src/litestruts/Struts.java b/group19/1294642551/src/litestruts/Struts.java new file mode 100644 index 0000000000..1034ccf2d5 --- /dev/null +++ b/group19/1294642551/src/litestruts/Struts.java @@ -0,0 +1,98 @@ +package litestruts; + +import java.lang.reflect.Method; +import java.util.Map; + + + +public class Struts { + + private static final Configuration cfg = new Configuration("struts.xml"); + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ +// try { +// String className = cfg.getClassName(actionName); +// if(className == null){ +// return null; +// } +// Class clazz = Class.forName(className); +// LoginAction action = (LoginAction) clazz.newInstance(); +// +// ReflectionUtil.setParameters(action, parameters); +// Method excuteMethod = clazz.getMethod("excute"); +// String resultName = (String) excuteMethod.invoke(action); +// String jsp = cfg.getResultView(actionName, resultName); +// +// Map parameterMap = ReflectionUtil.getParameters(action); +// +// View view = new View(); +// view.setParameters(parameterMap); +// view.setJsp(jsp); +// return view; +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// +// return null; +// } +// + + + + + + + + String clzName = cfg.getClassName(actionName); + + if(clzName == null){ + return null; + } + + try { + + Class clz = Class.forName(clzName); + Object action = clz.newInstance(); + + ReflectionUtil.setParameters(action, parameters); + + Method m = clz.getDeclaredMethod("execute"); + String resultName = (String)m.invoke(action); + + Map params = ReflectionUtil.getParameters(action); + String resultView = cfg.getResultView(actionName, resultName); + View view = new View(); + view.setParameters(params); + view.setJsp(resultView); + return view; + + + + } catch (Exception e) { + + e.printStackTrace(); + } + return null; + } +} diff --git a/group19/1294642551/src/litestruts/View.java b/group19/1294642551/src/litestruts/View.java new file mode 100644 index 0000000000..77e7435117 --- /dev/null +++ b/group19/1294642551/src/litestruts/View.java @@ -0,0 +1,23 @@ +package litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group19/1294642551/test/data_Structure_Utils/ArrayUtilTest.java b/group19/1294642551/test/data_Structure_Utils/ArrayUtilTest.java index c4c478e1b2..3a2ff9491a 100644 --- a/group19/1294642551/test/data_Structure_Utils/ArrayUtilTest.java +++ b/group19/1294642551/test/data_Structure_Utils/ArrayUtilTest.java @@ -2,23 +2,30 @@ import org.junit.Assert; +import org.junit.Before; import org.junit.Test; public class ArrayUtilTest { + private ArrayUtil au; + @Before + public void setUp(){ + au = new ArrayUtil(); + } + @Test public void testReverseArray() { - ArrayUtil au = new ArrayUtil(); + int[] origin = {7, 9, 30, 3, 4}; int[] expecteds ={4, 3, 30, 9, 7}; - int[] actuals = au.reverseArray(origin); + au.reverseArray(origin); + int[] actuals = origin; Assert.assertArrayEquals(expecteds, actuals); } @Test public void testRemoveZero() { - ArrayUtil au = new ArrayUtil(); int[] oldArray = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; int[] expecteds = {1,3,4,5,6,6,5,4,7,6,7,5}; int[] actuals = au.removeZero(oldArray); @@ -29,7 +36,6 @@ public void testRemoveZero() { @Test public void testMerge() { - ArrayUtil au = new ArrayUtil(); int[] a1 = {3, 5, 7,8}; int[] a2 = {4, 5, 6,7}; int[] expecteds = {3,4,5,6,7,8}; @@ -41,7 +47,6 @@ public void testMerge() { @Test public void testGrow() { - ArrayUtil au = new ArrayUtil(); int[] oldArray = {2,3,6}; int size = 3; int[] expecteds = {2,3,6,0,0,0}; @@ -53,9 +58,8 @@ public void testGrow() { @Test public void testFibonacci() { - ArrayUtil au = new ArrayUtil(); - int max = 15; - int[] expecteds = {1, 1, 2, 3, 5, 8, 13}; + int max = 1; + int[] expecteds = new int[0]; int[] actuals = au.fibonacci(max); Assert.assertArrayEquals(expecteds, actuals); @@ -65,7 +69,6 @@ public void testFibonacci() { @Test public void testGetPrimes() { - ArrayUtil au = new ArrayUtil(); int max = 23; int[] expecteds = {2,3,5,7,11,13,17,19}; int[] actuals = au.getPrimes(max); @@ -77,18 +80,22 @@ public void testGetPrimes() { @Test public void testGetPerfectNumbers() { - ArrayUtil au = new ArrayUtil(); int max = 30; int[] expecteds = {6, 28}; int[] actuals = au.getPerfectNumbers(max); Assert.assertArrayEquals(expecteds, actuals); + + max = 2; + expecteds = new int[0]; + actuals = au.getPerfectNumbers(max); + + Assert.assertArrayEquals(expecteds, actuals); } @Test public void testJoin() { - ArrayUtil au = new ArrayUtil(); int[] array = {3, 8, 9}; String seperator = "-"; String expecteds = "3-8-9"; diff --git a/group19/1294642551/test/download/ConnectionTest.java b/group19/1294642551/test/download/ConnectionTest.java new file mode 100644 index 0000000000..e71acc8728 --- /dev/null +++ b/group19/1294642551/test/download/ConnectionTest.java @@ -0,0 +1,36 @@ +package download; + +import java.io.IOException; + +import junit.framework.Assert; + +import org.junit.Test; + +import download.api.Connection; +import download.api.ConnectionException; +import download.api.ConnectionManager; +import download.impl.ConnectionManagerImpl; + +public class ConnectionTest { + + @Test + public void testGetContentLength() throws ConnectionException{ + ConnectionManager connMan = new ConnectionManagerImpl(); + Connection conn = connMan.open("http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg"); + Assert.assertEquals(35470, conn.getContentLength()); + } + + @Test + public void testRead() throws ConnectionException, IOException{ + ConnectionManager connMan = new ConnectionManagerImpl(); + Connection conn = connMan.open("http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg"); + byte[] data = conn.read(0, 35470); + Assert.assertEquals(35470, data.length); + + data = conn.read(0, 1023); + Assert.assertEquals(1024, data.length); + + data = conn.read(1024, 2023); + Assert.assertEquals(1000, data.length); + } +} diff --git a/group19/1294642551/test/download/FileDownloaderTest.java b/group19/1294642551/test/download/FileDownloaderTest.java new file mode 100644 index 0000000000..e3a708390a --- /dev/null +++ b/group19/1294642551/test/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import download.api.ConnectionManager; +import download.api.DownloadListener; +import download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://www.hinews.cn/pic/0/13/91/26/13912621_821796.jpg"; + + FileDownloader downloader = new FileDownloader(url, "d:/a.jpg"); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group19/1294642551/test/litestruts/ConfigurationTest.java b/group19/1294642551/test/litestruts/ConfigurationTest.java new file mode 100644 index 0000000000..a5e260633e --- /dev/null +++ b/group19/1294642551/test/litestruts/ConfigurationTest.java @@ -0,0 +1,39 @@ +package litestruts; + +import org.junit.Assert; +import org.junit.Test; + +/** + * 配置类Configuration的测试类 + * @author 12946 + * + */ + +public class ConfigurationTest { + + private Configuration cfg = new Configuration("struts.xml"); + + @Test + public void testGetClassName(){ + String clzName = cfg.getClassName("login"); + Assert.assertEquals("litestruts.LoginAction", clzName); + + clzName = cfg.getClassName("logout"); + Assert.assertEquals("litestruts.LogoutAction", clzName); + } + + @Test + public void testGetResultView(){ + String jpg = cfg.getResultView("login","success"); + Assert.assertEquals("/jsp/homepage.jsp", jpg); + + jpg = cfg.getResultView("login","fail"); + Assert.assertEquals("/jsp/showLogin.jsp", jpg); + + jpg = cfg.getResultView("logout","success"); + Assert.assertEquals("/jsp/welcome.jsp", jpg); + + jpg = cfg.getResultView("logout","error"); + Assert.assertEquals("/jsp/error.jsp", jpg); + } +} diff --git a/group19/1294642551/test/litestruts/ReflectionUtilTest.java b/group19/1294642551/test/litestruts/ReflectionUtilTest.java new file mode 100644 index 0000000000..c04b3cda7d --- /dev/null +++ b/group19/1294642551/test/litestruts/ReflectionUtilTest.java @@ -0,0 +1,110 @@ +package litestruts; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import junit.framework.Assert; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + + +public class ReflectionUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testGetSetterMethod() throws ClassNotFoundException{ + String className = "litestruts.LoginAction"; + Class clazz = Class.forName(className); + List methods = ReflectionUtil.getSetterMethod(clazz); + + Assert.assertEquals(2, methods.size()); + //---------- + List expectedNames = new ArrayList(); + expectedNames.add("setName"); + expectedNames.add("setPassword"); + + Set actualNames = new HashSet(); + for(Method method : methods){ + actualNames.add(method.getName()); + } + Assert.assertTrue(actualNames.containsAll(expectedNames)); + + } + + @Test + public void testSetParameters() throws Exception{ + String className = "litestruts.LoginAction"; + Class clazz = Class.forName(className); + LoginAction action = (LoginAction) clazz.newInstance(); + + Map parameters = new HashMap(); + parameters.put("name", "test"); + parameters.put("password", "1234"); + + ReflectionUtil.setParameters(action, parameters); + + Field f = clazz.getDeclaredField("name"); + f.setAccessible(true); + Assert.assertEquals("test", f.get(action)); + + f = clazz.getDeclaredField("password"); + f.setAccessible(true); + Assert.assertEquals("1234", f.get(action)); + } + + @Test + public void testGetGetterMethod() throws ClassNotFoundException{ + String className = "litestruts.LoginAction"; + Class clazz = Class.forName(className); + List methods = ReflectionUtil.getGetterMethod(clazz); + + Assert.assertEquals(3, methods.size()); + //---------- + List expectedNames = new ArrayList(); + expectedNames.add("getName"); + expectedNames.add("getPassword"); + expectedNames.add("getMessage"); + + Set actualNames = new HashSet(); + for(Method method : methods){ + actualNames.add(method.getName()); + } + Assert.assertTrue(actualNames.containsAll(expectedNames)); + + } + + @Test + public void testGetParameters() throws Exception { + String className = "litestruts.LoginAction"; + Class clazz = Class.forName(className); + LoginAction action = (LoginAction) clazz.newInstance(); + action.setName("test"); + action.setPassword("123456"); + Map parameterMap = ReflectionUtil.getParameters(action); + + Assert.assertEquals(3, parameterMap.size()); + + + Assert.assertEquals(null, parameterMap.get("messaage") ); + Assert.assertEquals("test", parameterMap.get("name") ); + Assert.assertEquals("123456", parameterMap.get("password") ); + + } + + +} diff --git a/group19/1294642551/test/litestruts/StrutsTest.java b/group19/1294642551/test/litestruts/StrutsTest.java new file mode 100644 index 0000000000..986180da44 --- /dev/null +++ b/group19/1294642551/test/litestruts/StrutsTest.java @@ -0,0 +1,39 @@ +package litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} From 44c0ac63bbf8e31f84e024af4cb356184ee35bd3 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Wed, 3 May 2017 16:37:40 +0800 Subject: [PATCH 386/552] =?UTF-8?q?JVM=E7=AC=AC=E5=85=AD=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../queue/QueueWithTwoStacks.java | 28 ++--- .../src/main/java/miniJVM/cmd/BiPushCmd.java | 12 +- .../java/miniJVM/cmd/ByteCodeCommand.java | 42 ++++++- .../main/java/miniJVM/cmd/GetFieldCmd.java | 13 +- .../java/miniJVM/cmd/GetStaticFieldCmd.java | 19 +++ .../java/miniJVM/cmd/InvokeSpecialCmd.java | 19 ++- .../java/miniJVM/cmd/InvokeVirtualCmd.java | 65 +++++++++- .../src/main/java/miniJVM/cmd/LdcCmd.java | 19 ++- .../main/java/miniJVM/cmd/NewObjectCmd.java | 11 +- .../main/java/miniJVM/cmd/NoOperandCmd.java | 116 ++++++++++++++++++ .../main/java/miniJVM/cmd/OneOperandCmd.java | 5 +- .../main/java/miniJVM/cmd/PutFieldCmd.java | 17 +++ .../java/miniJVM/engine/ExecutorEngine.java | 53 ++++++-- .../main/java/miniJVM/engine/JavaObject.java | 20 +-- .../main/java/miniJVM/engine/MethodArea.java | 8 +- .../java/miniJVM/engine/OperandStack.java | 26 ++++ .../main/java/miniJVM/engine/StackFrame.java | 49 +++++--- .../src/main/java/miniJVM/method/Method.java | 53 ++++++-- .../queue/TwoStacksQueueTest.java | 8 +- .../src/test/java/miniJVM/miniJVMTest.java | 16 ++- 20 files changed, 502 insertions(+), 97 deletions(-) create mode 100644 group24/75939388/learning2017/src/main/java/miniJVM/engine/OperandStack.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/QueueWithTwoStacks.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/QueueWithTwoStacks.java index 28f000cf59..d199707025 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/QueueWithTwoStacks.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/queue/QueueWithTwoStacks.java @@ -23,34 +23,30 @@ public boolean isEmpty() { } public int size() { - return stack2.size(); + return stack1.size() + this.stack2.size(); } public void enQueue(E item) { stack1.push(item); - Stack tmp = stack1; - stack2.clear(); - while (!tmp.isEmpty()){ - stack2.push(tmp.pop()); + } + + private void move(){ + while (!stack1.isEmpty()){ + stack2.push(stack1.pop()); } } public E deQueue() { - return stack2.pop(); - } + if(stack1.isEmpty()){ + throw new RuntimeException("queue is null"); + } - @Override - public String toString() { - StringBuilder sb = new StringBuilder("["); - Stack tmp = stack2; - while(!tmp.isEmpty()){ - sb.append(tmp.pop()).append(","); + if(stack2.isEmpty()){ + move(); } - sb.substring(0, sb.length() - 1); - sb.append("]"); - return sb.toString(); + return stack2.pop(); } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/BiPushCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/BiPushCmd.java index c14e56b185..12b79cbeda 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/BiPushCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/BiPushCmd.java @@ -3,6 +3,10 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantPool; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.Heap; +import miniJVM.engine.JavaObject; +import miniJVM.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -16,7 +20,11 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } - - + + public void execute(StackFrame frame, ExecutionResult result){ + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOperandStack().push(jo); + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java index 294add94b5..cab59f8d67 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/ByteCodeCommand.java @@ -3,6 +3,8 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantInfo; import miniJVM.constant.ConstantPool; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.StackFrame; import java.util.HashMap; import java.util.Map; @@ -12,7 +14,43 @@ public abstract class ByteCodeCommand { String opCode; ClassFile clzFile; private int offset; - + + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); static{ @@ -114,5 +152,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame, ExecutionResult result); } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetFieldCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetFieldCmd.java index 67e734e5f1..04febbd9bd 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetFieldCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetFieldCmd.java @@ -3,6 +3,10 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantPool; +import miniJVM.constant.FieldRefInfo; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.JavaObject; +import miniJVM.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -16,7 +20,14 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRefInfo = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + String fieldName = fieldRefInfo.getFieldName(); + JavaObject jo = frame.getOperandStack().pop(); + JavaObject value = jo.getFieldValue(fieldName); + + frame.getOperandStack().push(value); + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetStaticFieldCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetStaticFieldCmd.java index 95ad38e806..d7d2be35d3 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetStaticFieldCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/GetStaticFieldCmd.java @@ -3,6 +3,11 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantPool; +import miniJVM.constant.FieldRefInfo; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.Heap; +import miniJVM.engine.JavaObject; +import miniJVM.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -17,4 +22,18 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRefInfo = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + String className = fieldRefInfo.getClassName(); + String fieldName = fieldRefInfo.getFieldName(); + String fieldType = fieldRefInfo.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOperandStack().push(jo); + }else return; + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeSpecialCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeSpecialCmd.java index d4f401f26d..0d409dd195 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeSpecialCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeSpecialCmd.java @@ -2,6 +2,11 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantPool; +import miniJVM.constant.MethodRefInfo; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.MethodArea; +import miniJVM.engine.StackFrame; +import miniJVM.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -16,6 +21,18 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java index 37ebbf4cc2..7c54ce79a8 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java @@ -2,6 +2,12 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantPool; +import miniJVM.constant.MethodRefInfo; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.JavaObject; +import miniJVM.engine.MethodArea; +import miniJVM.engine.StackFrame; +import miniJVM.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -15,7 +21,62 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + // TODO: 2017/5/3 没有完全理解,copy老师的先 + + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if("java/io/PrintStream".equals(className) + && "println".equals(methodName)){ + JavaObject jo = frame.getOperandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOperandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOperandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while(currentClassName != null){ + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + + break; + + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/LdcCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/LdcCmd.java index c56b294f4d..062d364e11 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/LdcCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/LdcCmd.java @@ -5,6 +5,9 @@ import miniJVM.constant.ConstantInfo; import miniJVM.constant.ConstantPool; import miniJVM.constant.StringInfo; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.Heap; +import miniJVM.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -22,9 +25,19 @@ public String toString(ConstantPool pool) { StringInfo strInfo = (StringInfo)info; value = strInfo.toString(); } - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - } - + + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ConstantInfo constantInfo = this.getConstantPool().getConstantInfo(this.getOperand()); + + if(constantInfo instanceof StringInfo){ + String value = constantInfo.toString(); + frame.getOperandStack().push(Heap.getInstance().newString(value)); + }else{ + throw new RuntimeException("process string info only"); + } + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NewObjectCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NewObjectCmd.java index d2e28c5eea..133b0a70a4 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NewObjectCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NewObjectCmd.java @@ -2,7 +2,11 @@ import miniJVM.clz.ClassFile; +import miniJVM.constant.ClassInfo; import miniJVM.constant.ConstantPool; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.Heap; +import miniJVM.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -16,5 +20,10 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ClassInfo clazz = (ClassInfo) this.getConstantInfo(this.getIndex()); + String clazzName = clazz.getClassName(); + frame.getOperandStack().push(Heap.getInstance().newObject(clazzName)); + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java index e10bbabb66..67583bca57 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/NoOperandCmd.java @@ -3,6 +3,10 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantPool; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.Heap; +import miniJVM.engine.JavaObject; +import miniJVM.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand { @@ -20,4 +24,116 @@ public int getLength() { return 1; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + String opCode = this.getOpCode().toUpperCase(); + + if (ByteCodeCommand.aload_0.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.aload_1.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.aload_2.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.iload_1.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.fload_3.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.voidreturn.equals(opCode)) { + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if (ByteCodeCommand.ireturn.equals(opCode)) { + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOperandStack().pop(); + callerFrame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.freturn.equals(opCode)) { + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOperandStack().pop(); + callerFrame.getOperandStack().push(jo); + } else if (ByteCodeCommand.astore_1.equals(opCode)) { + + JavaObject jo = frame.getOperandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if (ByteCodeCommand.dup.equals(opCode)) { + + JavaObject jo = frame.getOperandStack().peek(); + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.iconst_0.equals(opCode)) { + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.iconst_1.equals(opCode)) { + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOperandStack().push(jo); + + } else if (ByteCodeCommand.istore_1.equals(opCode)) { + + JavaObject jo = frame.getOperandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if (ByteCodeCommand.istore_2.equals(opCode)) { + + JavaObject jo = frame.getOperandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if (ByteCodeCommand.iadd.equals(opCode)) { + + JavaObject jo1 = frame.getOperandStack().pop(); + JavaObject jo2 = frame.getOperandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue() + jo2.getIntValue()); + + frame.getOperandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)) { + + frame.getOperandStack().push(null); + + } else { + throw new RuntimeException("unhandled operation code :" + opCode); + } + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/OneOperandCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/OneOperandCmd.java index 6736c608b9..8fd272603f 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/OneOperandCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/OneOperandCmd.java @@ -15,13 +15,12 @@ public int getOperand() { return this.operand; } - public void setOperand(int oprand1) { - this.operand = oprand1; + public void setOperand(int operand) { + this.operand = operand; } public int getLength(){ return 2; } - } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/PutFieldCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/PutFieldCmd.java index 066f37dd01..26ebffcab8 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/PutFieldCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/PutFieldCmd.java @@ -3,6 +3,11 @@ import miniJVM.clz.ClassFile; import miniJVM.constant.ConstantPool; +import miniJVM.constant.FieldRefInfo; +import miniJVM.constant.NameAndTypeInfo; +import miniJVM.engine.ExecutionResult; +import miniJVM.engine.JavaObject; +import miniJVM.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -16,5 +21,17 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo) fieldRef.getConstantInfo(fieldRef.getNameAndTypeIndex()); + + String fieldName = nameAndTypeInfo.getName(); + JavaObject fieldValue = frame.getOperandStack().pop(); + JavaObject objectRef = frame.getOperandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutorEngine.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutorEngine.java index 5e41a3c91e..ca188113ed 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutorEngine.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutorEngine.java @@ -3,28 +3,59 @@ import miniJVM.method.Method; +import java.util.ArrayList; +import java.util.List; import java.util.Stack; public class ExecutorEngine { private Stack stack = new Stack(); - - public ExecutorEngine() { - - } + + + public ExecutorEngine() {} public void execute(Method mainMethod){ + + StackFrame main = StackFrame.create(mainMethod); + stack.push(main); - + while(!stack.isEmpty()){ + + StackFrame currFrame = stack.peek(); + + ExecutionResult result = currFrame.execute(); + if(result.isPauseAndRunNewFrame()){ + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(currFrame); + setupFunctionCallParams(currFrame, nextFrame); + + stack.push(nextFrame); + }else{ + stack.pop(); + } + } } - - - + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { - - - + Method nextMethod = nextFrame.getMethod(); + List paramList = nextMethod.getParammeterList(); + + int paramNum = paramList.size() + 1; + + List values = new ArrayList(); + while(paramNum > 0){ + values.add(currentFrame.getOperandStack().pop()); + paramNum--; + } + + List params = new ArrayList(); + for(int i = values.size() - 1; i >= 0; i --){ + params.add(values.get(i)); + } + + nextFrame.setLocalVariableTable(params); } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/JavaObject.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/JavaObject.java index e7c1b1fdea..68f2d76779 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/engine/JavaObject.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/JavaObject.java @@ -49,16 +49,16 @@ public JavaObject getFieldValue(String fieldName){ } public String toString(){ switch(this.getType()){ - case INT: - return String.valueOf(this.intValue); - case STRING: - return this.stringValue; - case OBJECT: - return this.className +":"+ this.fieldValues; - case FLOAT : - return String.valueOf(this.floatValue); - default: - return null; + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; } } public String getClassName(){ diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/MethodArea.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/MethodArea.java index 114961a186..3cdb055d7f 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/engine/MethodArea.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/MethodArea.java @@ -40,7 +40,7 @@ public Method getMainMethod(String className){ } - public ClassFile findClassFile(String className){ + public ClassFile findClassFile(String className){ if(map.get(className) != null){ return map.get(className); @@ -56,14 +56,12 @@ public ClassFile findClassFile(String className){ public Method getMethod(String className, String methodName, String paramAndReturnType){ - - return null; + return this.findClassFile(className).getMethod(methodName, paramAndReturnType); } public Method getMethod(MethodRefInfo methodRef){ - - return null; + return this.getMethod(methodRef.getClassName(), methodRef.getMethodName(), methodRef.getParamAndReturnType()); } } diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/OperandStack.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/OperandStack.java new file mode 100644 index 0000000000..596721f703 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/OperandStack.java @@ -0,0 +1,26 @@ +package miniJVM.engine; + +import java.util.ArrayList; +import java.util.List; + +public class OperandStack { + private List operands = new ArrayList(); + + public void push(JavaObject jo){ + operands.add(jo); + } + public JavaObject pop(){ + int index = size()-1; + JavaObject jo = (JavaObject)operands.get(index); + operands.remove(index); + return jo; + + } + public JavaObject top(){ + int index = size()-1; + return (JavaObject)operands.get(index); + } + public int size(){ + return operands.size(); + } +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/StackFrame.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/StackFrame.java index 322c4eebfb..12620c62cb 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/engine/StackFrame.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/StackFrame.java @@ -11,7 +11,7 @@ public class StackFrame { private List localVariableTable = new ArrayList(); - private Stack oprandStack = new Stack(); + private Stack operandStack = new Stack(); int index = 0; @@ -28,29 +28,23 @@ public void setCallerFrame(StackFrame callerFrame) { } - - public static StackFrame create(Method m){ - - StackFrame frame = new StackFrame( m ); - + StackFrame frame = new StackFrame(m); + return frame; } private StackFrame(Method m) { this.m = m; - } - - - + public JavaObject getLocalVariableValue(int index){ return this.localVariableTable.get(index); } - public Stack getOprandStack(){ - return this.oprandStack; + public Stack getOperandStack(){ + return this.operandStack; } public int getNextCommandIndex(int offset){ @@ -65,13 +59,32 @@ public int getNextCommandIndex(int offset){ } public ExecutionResult execute(){ - return null; - + ByteCodeCommand[] cmds = m.getCmds(); + + while(index < cmds.length){ + ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.RUN_NEXT_CMD); + + System.out.println("command -> " + cmds[index].toString()); + cmds[index].execute(this, result); + + if(result.isRunNextCmd()){//执行下一个指令 -> index直接+1 + index++; + }else if(result.isPauseAndRunNewFrame()){//执行新的函数栈帧 -> index+1并返回该栈帧,保存index + index ++; + return result; + }else if(result.isExitCurrentFrame()){//退出当栈帧 -> 直接返回 + return result; + }else if(result.isJump()){//跳到另外的函数栈帧 -> 获取要跳至的index + index = getNextCommandIndex(result.getNextCmdOffset()); + }else index ++; + } + + ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + return result; } - - - public void setLocalVariableTable(List values){ this.localVariableTable = values; } @@ -84,8 +97,6 @@ public void setLocalVariableValue(int index, JavaObject jo){ } } this.localVariableTable.set(index, jo); - - } public Method getMethod(){ diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java b/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java index d2e2ae2a27..ae29300ad9 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/method/Method.java @@ -6,6 +6,9 @@ import miniJVM.constant.ConstantPool; import miniJVM.constant.UTF8Info; +import java.util.ArrayList; +import java.util.List; + public class Method { private int accessFlag; @@ -35,8 +38,6 @@ public CodeAttr getCodeAttr() { public void setCodeAttr(CodeAttr code) { this.codeAttr = code; } - - public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { this.clzFile = clzFile; @@ -45,10 +46,6 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd this.descriptorIndex = descriptorIndex; } - - - - public String toString() { ConstantPool pool = this.clzFile.getConstantPool(); @@ -65,13 +62,49 @@ public String toString() { return buffer.toString(); } -// public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ -// return null; -// } - public ByteCodeCommand[] getCmds() { ByteCodeCommand[] cmds = this.getCodeAttr().getCmds(); return cmds; } + + private String getParammeterAndReturnType(){ + return ((UTF8Info) this.clzFile.getConstantPool().getConstantInfo(this.descriptorIndex)).getValue(); + } + + public List getParammeterList(){ + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String parammeterTypeString = this.getParammeterAndReturnType(); + + int startPos = parammeterTypeString.indexOf("("); + int endPos = parammeterTypeString.indexOf(")"); + + String paramTypes = parammeterTypeString.substring(startPos + 1, endPos); + + List paramTypeList = new ArrayList(); + + while(!paramTypes.equals("")){ + int pos = 0; + + if(paramTypes.charAt(pos) == 'L'){ + int end = paramTypes.indexOf(";"); + if(end == -1){ + throw new RuntimeException("an object start with L not end with ; found"); + } + + paramTypeList.add(paramTypes.substring(pos, end)); + pos = end; + }else if(paramTypes.charAt(pos) == 'I'){ + paramTypeList.add("I"); + }else if(paramTypes.charAt(pos) == 'F'){ + paramTypeList.add("F"); + }else{ + throw new RuntimeException(paramTypes + " is not supported"); + } + pos++; + paramTypes = paramTypes.substring(pos); + } + + return paramTypeList; + } } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/queue/TwoStacksQueueTest.java b/group24/75939388/learning2017/src/test/java/data_structure/queue/TwoStacksQueueTest.java index 78c0fe9b41..666620dbe1 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/queue/TwoStacksQueueTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/queue/TwoStacksQueueTest.java @@ -2,6 +2,7 @@ import basic.dataStructure.queue.QueueWithTwoStacks; import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -28,10 +29,7 @@ public void testQueue(){ queue.enQueue(10 + ""); queue.enQueue( "xxoo"); queue.enQueue( "ppxxoo"); - System.out.println("queue-->" + queue.toString()); - + Assert.assertEquals(3, queue.size()); + Assert.assertEquals("10", queue.deQueue()); } - - - } diff --git a/group24/75939388/learning2017/src/test/java/miniJVM/miniJVMTest.java b/group24/75939388/learning2017/src/test/java/miniJVM/miniJVMTest.java index 9fb146de10..2db9faa051 100644 --- a/group24/75939388/learning2017/src/test/java/miniJVM/miniJVMTest.java +++ b/group24/75939388/learning2017/src/test/java/miniJVM/miniJVMTest.java @@ -1,19 +1,23 @@ package miniJVM; -import thread.download.ClassFileReader; +import miniJVM.engine.MiniJVM; import org.junit.Assert; import org.junit.Test; +import thread.download.ClassFileReader; -/** - * @author : 温友朝 - * @date : 2017/4/18 - */ public class miniJVMTest { + static final String PATH = "resources/classes"; + @Test public void readCafebabe(){ Assert.assertEquals("cafebabe", ClassFileReader.readNextU4Bytes(0)); } - + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "miniJVM.EmployeeV1"); + } } From d43fb1ea2e91ca96cbea65ca7b00b530ea17e04c Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Wed, 3 May 2017 16:56:04 +0800 Subject: [PATCH 387/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/miniJVM/cmd/InvokeVirtualCmd.java | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java index 7c54ce79a8..b48dab941f 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/cmd/InvokeVirtualCmd.java @@ -24,58 +24,41 @@ public String toString(ConstantPool pool) { @Override public void execute(StackFrame frame, ExecutionResult result) { - // TODO: 2017/5/3 没有完全理解,copy老师的先 - - //先得到对该方法的描述 MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); String className = methodRefInfo.getClassName(); String methodName = methodRefInfo.getMethodName(); - // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + //不需要实现println方法 if("java/io/PrintStream".equals(className) && "println".equals(methodName)){ JavaObject jo = frame.getOperandStack().pop(); String value = jo.toString(); System.err.println("-------------------"+value+"----------------"); - // 这里就是那个out对象, 因为是个假的,直接pop出来 + //假的对象,直接弹出无视掉 frame.getOperandStack().pop(); - return; } - //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + //不停的至父类寻找同名方法,即实现多态 JavaObject jo = frame.getOperandStack().peek(); - MethodArea ma = MethodArea.getInstance(); - Method m = null; - String currentClassName = jo.getClassName(); - while(currentClassName != null){ - ClassFile currentClassFile = ma.findClassFile(currentClassName); - - m = currentClassFile.getMethod(methodRefInfo.getMethodName(), - methodRefInfo.getParamAndReturnType()); + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), methodRefInfo.getParamAndReturnType()); if(m != null){ - break; - } else{ - //查找父类 currentClassName = currentClassFile.getSuperClassName(); } } - if(m == null){ - throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + throw new RuntimeException("no method find :" + methodRefInfo.toString()); } - result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); - result.setNextMethod(m); } From 33943f194171b679b8639bde3e812492b7e3bc53 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Wed, 3 May 2017 20:09:34 +0800 Subject: [PATCH 388/552] =?UTF-8?q?jvm=E7=AC=AC6=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/stack/QuickMinStack.java | 19 +++++++ .../basic/stack/StackWithTwoQueues.java | 16 ++++++ .../basic/stack/TwoStackInOneArray.java | 57 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/stack/TwoStackInOneArray.java diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/stack/QuickMinStack.java b/liuxin/data-structure/assignment/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..f391d92b8f --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,19 @@ +package com.coding.basic.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + public void push(int data){ + + } + public int pop(){ + return -1; + } + public int findMin(){ + return -1; + } +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/stack/StackWithTwoQueues.java b/liuxin/data-structure/assignment/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..d0ab4387d2 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,16 @@ +package com.coding.basic.stack; + + +public class StackWithTwoQueues { + + + public void push(int data) { + + } + + public int pop() { + return -1; + } + + +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/stack/TwoStackInOneArray.java b/liuxin/data-structure/assignment/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..e86d056a24 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return null; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + return null; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return null; + } + +} From 315b113160291bce3b868667f515be66821ba1c2 Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 3 May 2017 21:50:39 +0800 Subject: [PATCH 389/552] add jvm_5 and queue --- .../coding2017/jvm/attr/CodeAttr.java | 2 +- .../coding2017/jvm/clz/ClassFile.java | 12 +- .../coding2017/jvm/cmd/BiPushCmd.java | 35 ++- .../coding2017/jvm/cmd/ByteCodeCommand.java | 242 ++++++++++-------- .../coding2017/jvm/cmd/CommandParser.java | 59 +---- .../coding2017/jvm/cmd/GetFieldCmd.java | 20 +- .../coding2017/jvm/cmd/GetStaticFieldCmd.java | 39 ++- .../coding2017/jvm/cmd/InvokeSpecialCmd.java | 38 ++- .../coding2017/jvm/cmd/InvokeVirtualCmd.java | 78 +++++- .../HarryHook/coding2017/jvm/cmd/LdcCmd.java | 55 ++-- .../coding2017/jvm/cmd/NewObjectCmd.java | 41 ++- .../coding2017/jvm/cmd/NoOperandCmd.java | 140 +++++++++- .../coding2017/jvm/cmd/PutFieldCmd.java | 40 ++- .../coding2017/jvm/cmd/TwoOperandCmd.java | 105 ++++---- .../coding2017/jvm/constant/ClassInfo.java | 7 +- .../coding2017/jvm/constant/ConstantInfo.java | 29 ++- .../jvm/engine/ExecutionResult.java | 53 ++++ .../coding2017/jvm/engine/ExecutorEngine.java | 78 ++++++ .../HarryHook/coding2017/jvm/engine/Heap.java | 43 ++++ .../coding2017/jvm/engine/JavaObject.java | 82 ++++++ .../coding2017/jvm/engine/MethodArea.java | 83 ++++++ .../coding2017/jvm/engine/MiniJVM.java | 28 ++ .../coding2017/jvm/engine/OperandStack.java | 29 +++ .../coding2017/jvm/engine/StackFrame.java | 116 +++++++++ .../coding2017/jvm/method/Method.java | 82 +++++- .../coding2017/jvm/test/MiniJVMTest.java | 29 +++ 26 files changed, 1226 insertions(+), 339 deletions(-) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/ExecutionResult.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/ExecutorEngine.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/Heap.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/JavaObject.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/MethodArea.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/MiniJVM.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/OperandStack.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/StackFrame.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/MiniJVMTest.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java index 9ecd803572..00135d59c7 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/attr/CodeAttr.java @@ -99,7 +99,7 @@ private void setStackMapTable(StackMapTable t) { public String toString(ConstantPool pool) { StringBuffer buffer = new StringBuffer(); for(int i=0;i codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - + String opCode; + ClassFile clzFile; + private int offset; - + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; + static { + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + protected ByteCodeCommand(ClassFile clzFile, String opCode) { + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + protected ConstantInfo getConstantInfo(int index) { + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool() { + return this.getClassFile().getConstantPool(); + } + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + public String getReadableCodeText() { + String txt = codeMap.get(opCode); + if (txt == null) { + return opCode; } - - //public abstract void execute(StackFrame frame,FrameResult result); + return txt; + } + + public abstract void execute(StackFrame frame, ExecutionResult result); } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java index b982fa7aa4..7ead19d285 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/CommandParser.java @@ -7,41 +7,6 @@ public class CommandParser { - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { @@ -57,51 +22,53 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { while (iter.hasNext()) { String opCode = iter.next2CharAsString(); - if (new_object.equals(opCode)) { + if (ByteCodeCommand.new_object.equals(opCode)) { NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (invokespecial.equals(opCode)) { + } else if (ByteCodeCommand.invokespecial.equals(opCode)) { InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); // System.out.println( cmd.toString(clzFile.getConstPool())); cmds.add(cmd); - } else if (invokevirtual.equals(opCode)) { + } else if (ByteCodeCommand.invokevirtual.equals(opCode)) { InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (getfield.equals(opCode)) { + } else if (ByteCodeCommand.getfield.equals(opCode)) { GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (getstatic.equals(opCode)) { + } else if (ByteCodeCommand.getstatic.equals(opCode)) { GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (putfield.equals(opCode)) { + } else if (ByteCodeCommand.putfield.equals(opCode)) { PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); cmd.setOprand1(iter.next2CharAsInt()); cmd.setOprand2(iter.next2CharAsInt()); cmds.add(cmd); - } else if (ldc.equals(opCode)) { + } else if (ByteCodeCommand.ldc.equals(opCode)) { LdcCmd cmd = new LdcCmd(clzFile, opCode); cmd.setOperand(iter.next2CharAsInt()); cmds.add(cmd); - } else if (bipush.equals(opCode)) { + } else if (ByteCodeCommand.bipush.equals(opCode)) { BiPushCmd cmd = new BiPushCmd(clzFile, opCode); cmd.setOperand(iter.next2CharAsInt()); cmds.add(cmd); - } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) - || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) - || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + } else if (ByteCodeCommand.dup.equals(opCode) || ByteCodeCommand.aload_0.equals(opCode) + || ByteCodeCommand.aload_1.equals(opCode) || ByteCodeCommand.aload_2.equals(opCode) + || ByteCodeCommand.iload_1.equals(opCode) || ByteCodeCommand.iload_2.equals(opCode) + || ByteCodeCommand.iload_3.equals(opCode) || ByteCodeCommand.fload_3.equals(opCode) + || ByteCodeCommand.voidreturn.equals(opCode) || ByteCodeCommand.astore_1.equals(opCode)) { NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); cmds.add(cmd); diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java index ec34e7b4a7..e9be866ec6 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,10 @@ import com.github.HarryHook.coding2017.jvm.clz.ClassFile; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.engine.ExecutionResult; +import com.github.HarryHook.coding2017.jvm.engine.JavaObject; +import com.github.HarryHook.coding2017.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -10,9 +14,21 @@ public GetFieldCmd(ClassFile clzFile, String opCode) { } @Override - public String toString(ConstantPool pool) { + public String toString() { + + return super.getOperandAsField(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); - return super.getOperandAsField(pool); } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java index 1090e17374..eb943f2422 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/GetStaticFieldCmd.java @@ -1,24 +1,39 @@ package com.github.HarryHook.coding2017.jvm.cmd; - import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; -import com.github.HarryHook.coding2017.jvm.constant.UTF8Info; - +import com.github.HarryHook.coding2017.jvm.engine.ExecutionResult; +import com.github.HarryHook.coding2017.jvm.engine.Heap; +import com.github.HarryHook.coding2017.jvm.engine.JavaObject; +import com.github.HarryHook.coding2017.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); + if ("java/lang/System".equals(className) && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)) { + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); } + // TODO 处理非System.out的情况 + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java index 4afc337f47..3c847d847e 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeSpecialCmd.java @@ -3,21 +3,39 @@ import com.github.HarryHook.coding2017.jvm.clz.ClassFile; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; - +import com.github.HarryHook.coding2017.jvm.engine.ExecutionResult; +import com.github.HarryHook.coding2017.jvm.engine.MethodArea; +import com.github.HarryHook.coding2017.jvm.engine.StackFrame; +import com.github.HarryHook.coding2017.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + + // 我们不用实现jang.lang.Object 的init方法 + if (methodRefInfo.getClassName().equals("java/lang/Object") && methodRefInfo.getMethodName().equals("")) { + return; - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); - + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java index 6b494dceda..b94dba6f95 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/InvokeVirtualCmd.java @@ -1,21 +1,81 @@ package com.github.HarryHook.coding2017.jvm.cmd; import com.github.HarryHook.coding2017.jvm.clz.ClassFile; -import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.engine.ExecutionResult; +import com.github.HarryHook.coding2017.jvm.engine.JavaObject; +import com.github.HarryHook.coding2017.jvm.engine.MethodArea; +import com.github.HarryHook.coding2017.jvm.engine.StackFrame; +import com.github.HarryHook.coding2017.jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } + + private boolean isSystemOutPrintlnMethod(String className, String methodName) { + return "java/io/PrintStream".equals(className) && "println".equals(methodName); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + // 先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if (isSystemOutPrintlnMethod(className, methodName)) { + JavaObject jo = (JavaObject) frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------" + value + "----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + // 注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while (currentClassName != null) { + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), methodRefInfo.getParamAndReturnType()); + if (m != null) { + + break; + + } else { + // 查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } } - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); + if (m == null) { + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); } - - + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java index 073ddd73a9..5a611df6ae 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/LdcCmd.java @@ -4,26 +4,47 @@ import com.github.HarryHook.coding2017.jvm.constant.ConstantInfo; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; import com.github.HarryHook.coding2017.jvm.constant.StringInfo; +import com.github.HarryHook.coding2017.jvm.engine.ExecutionResult; +import com.github.HarryHook.coding2017.jvm.engine.Heap; +import com.github.HarryHook.coding2017.jvm.engine.JavaObject; +import com.github.HarryHook.coding2017.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString() { + + ConstantInfo info = (ConstantInfo) getConstantInfo(this.getOperand()); + + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + value = strInfo.toString(); } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - + + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText() + " " + value; + + } + + public void execute(StackFrame frame, ExecutionResult result) { + + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo) pool.getConstantInfo(this.getOperand()); + + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo) info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } else { + // TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); } - + + } + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java index 9c959e31dd..1345d7181f 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NewObjectCmd.java @@ -1,19 +1,38 @@ package com.github.HarryHook.coding2017.jvm.cmd; import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.engine.ExecutionResult; +import com.github.HarryHook.coding2017.jvm.engine.Heap; +import com.github.HarryHook.coding2017.jvm.engine.JavaObject; +import com.github.HarryHook.coding2017.jvm.engine.StackFrame; -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } +public class NewObjectCmd extends TwoOperandCmd { - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } + public NewObjectCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString() { + + return super.getOperandAsClassInfo(); + } + + public void execute(StackFrame frame, ExecutionResult result) { + + int index = this.getIndex(); + + ClassInfo info = (ClassInfo) this.getConstantInfo(index); + + String clzName = info.getClassName(); + + // 在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); + + } - } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java index 554eac0690..c658260086 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/NoOperandCmd.java @@ -2,22 +2,140 @@ import com.github.HarryHook.coding2017.jvm.clz.ClassFile; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.engine.ExecutionResult; +import com.github.HarryHook.coding2017.jvm.engine.Heap; +import com.github.HarryHook.coding2017.jvm.engine.JavaObject; +import com.github.HarryHook.coding2017.jvm.engine.StackFrame; -public class NoOperandCmd extends ByteCodeCommand{ +public class NoOperandCmd extends ByteCodeCommand { - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString() { + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); + } + + public int getLength() { + return 1; + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + String opCode = this.getOpCode(); + + if (ByteCodeCommand.aload_0.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.aload_1.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.aload_2.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_1.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.fload_3.equals(opCode)) { + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.voidreturn.equals(opCode)) { - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if (ByteCodeCommand.ireturn.equals(opCode)) { + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.freturn.equals(opCode)) { + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); } - - - public int getLength(){ - return 1; + else if (ByteCodeCommand.astore_1.equals(opCode)) { + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if (ByteCodeCommand.dup.equals(opCode)) { + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iconst_0.equals(opCode)) { + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iconst_1.equals(opCode)) { + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.istore_1.equals(opCode)) { + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if (ByteCodeCommand.istore_2.equals(opCode)) { + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if (ByteCodeCommand.iadd.equals(opCode)) { + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue() + jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)) { + + frame.getOprandStack().push(null); + + } else { + throw new RuntimeException("you must forget to implement the operation :" + opCode); } + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java index f3a197114c..91549d7c01 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/PutFieldCmd.java @@ -1,19 +1,43 @@ package com.github.HarryHook.coding2017.jvm.cmd; import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.ClassInfo; import com.github.HarryHook.coding2017.jvm.constant.ConstantPool; +import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; +import com.github.HarryHook.coding2017.jvm.constant.NameAndTypeInfo; +import com.github.HarryHook.coding2017.jvm.engine.ExecutionResult; +import com.github.HarryHook.coding2017.jvm.engine.JavaObject; +import com.github.HarryHook.coding2017.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } + @Override + public String toString() { + return super.getOperandAsField(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo) this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo) this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo) this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java index 13edc86215..d0d38f368f 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/cmd/TwoOperandCmd.java @@ -7,61 +7,62 @@ import com.github.HarryHook.coding2017.jvm.constant.FieldRefInfo; import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } +public abstract class TwoOperandCmd extends ByteCodeCommand { - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } + int oprand1 = -1; + int oprand2 = -1; - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } + public int getOprand1() { + return oprand1; + } - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex() { + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo() { + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo) getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.getClassName(); + } + + protected String getOperandAsMethod() { + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo) this.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + } + + protected String getOperandAsField() { + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo) this.getConstantInfo(index); + return this.getOffset() + ":" + this.getOpCode() + " " + codeTxt + " " + info.toString(); + } + + public int getLength() { + return 3; + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java index e4822e2bbb..3ea5bcbc53 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ClassInfo.java @@ -25,8 +25,9 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java index 6c502016a3..cf046f6b2e 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/constant/ConstantInfo.java @@ -27,17 +27,22 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index) { return this.constantPool.getConstantInfo(index); } - + public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } - + + public static interface Visitor { + public void visitClassInfo(ClassInfo info); + + public void visitFieldRef(FieldRefInfo info); + + public void visitMethodRef(MethodRefInfo info); + + public void visitNameAndType(NameAndTypeInfo info); + + public void visitString(StringInfo info); + + public void visistUTF8(UTF8Info info); + + } + } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/ExecutionResult.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..2e6a07838c --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/ExecutionResult.java @@ -0,0 +1,53 @@ +package com.github.HarryHook.coding2017.jvm.engine; + +import com.github.HarryHook.coding2017.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + public void setNextAction(int action) { + this.nextAction = action; + } + + public boolean isPauseAndRunNewFrame() { + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + + public boolean isExitCurrentFrame() { + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd() { + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump() { + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/ExecutorEngine.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..85eeeaba50 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/ExecutorEngine.java @@ -0,0 +1,78 @@ +package com.github.HarryHook.coding2017.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.github.HarryHook.coding2017.jvm.attr.CodeAttr; +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod) { + + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); + + while (!stack.empty()) { + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if (result.isPauseAndRunNewFrame()) { + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame, nextFrame); + + stack.push(nextFrame); + + } else { + + stack.pop(); + + } + } + + } + + private void setupFunctionCallParams(StackFrame currentFrame, StackFrame nextFrame) { + + Method nextMethod = nextFrame.getMethod(); + + List paramList = nextMethod.getParameterList(); + + // 加上1 是因为要把this也传递过去 + + int paramNum = paramList.size() + 1; + + List values = new ArrayList(); + + // 数据结构知识: 从栈中取出栈顶的x个元素 + while (paramNum > 0) { + values.add(currentFrame.getOprandStack().pop()); + paramNum--; + } + // 数据结构知识: 把一个列表倒序排列 + List params = new ArrayList(); + + for (int i = values.size() - 1; i >= 0; i--) { + params.add(values.get(i)); + } + + nextFrame.setLocalVariableTable(params); + + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/Heap.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/Heap.java new file mode 100644 index 0000000000..f249407d7f --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/Heap.java @@ -0,0 +1,43 @@ +package com.github.HarryHook.coding2017.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + + private Heap() { + } + + public static Heap getInstance() { + return instance; + } + + public JavaObject newObject(String clzName) { + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value) { + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value) { + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + + public JavaObject newInt(int value) { + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/JavaObject.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..edce5aad4f --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/JavaObject.java @@ -0,0 +1,82 @@ +package com.github.HarryHook.coding2017.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue) { + fieldValues.put(fieldName, fieldValue); + } + + public JavaObject(int type) { + this.type = type; + } + + public void setClassName(String className) { + this.className = className; + } + + public void setStringValue(String value) { + stringValue = value; + } + + public String getStringValue() { + return this.stringValue; + } + + public void setIntValue(int value) { + this.intValue = value; + } + + public int getIntValue() { + return this.intValue; + } + + public int getType() { + return type; + } + + public JavaObject getFieldValue(String fieldName) { + return this.fieldValues.get(fieldName); + } + + public String toString() { + switch (this.getType()) { + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className + ":" + this.fieldValues; + case FLOAT: + return String.valueOf(this.floatValue); + default: + return null; + } + } + + public String getClassName() { + return this.className; + } + + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/MethodArea.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..0e102b8765 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/MethodArea.java @@ -0,0 +1,83 @@ +package com.github.HarryHook.coding2017.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.github.HarryHook.coding2017.jvm.clz.ClassFile; +import com.github.HarryHook.coding2017.jvm.constant.MethodRefInfo; +import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; +import com.github.HarryHook.coding2017.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea() { + } + + public static MethodArea getInstance() { + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader) { + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className) { + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + public ClassFile findClassFile(String className) { + + if (map.get(className) != null) { + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + public Method getMethod(String className, String methodName, String paramAndReturnType) { + + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if (m == null) { + + throw new RuntimeException("method can't be found : \n" + "class: " + className + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; + } + + public Method getMethod(MethodRefInfo methodRef) { + + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if (m == null) { + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/MiniJVM.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..95cc99974e --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.github.HarryHook.coding2017.jvm.engine; + +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.github.HarryHook.coding2017.jvm.loader.ClassFileLoader; + +public class MiniJVM { + + public void run(String[] classPaths, String className) throws FileNotFoundException, IOException { + + ClassFileLoader loader = new ClassFileLoader(); + for (int i = 0; i < classPaths.length; i++) { + loader.addClassPath(classPaths[i]); + } + + MethodArea methodArea = MethodArea.getInstance(); + + methodArea.setClassFileLoader(loader); + + ExecutorEngine engine = new ExecutorEngine(); + + className = className.replace(".", "/"); + + engine.execute(methodArea.getMainMethod(className)); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/OperandStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/OperandStack.java new file mode 100644 index 0000000000..cd468c79f6 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/OperandStack.java @@ -0,0 +1,29 @@ +package com.github.HarryHook.coding2017.jvm.engine; + +import java.util.ArrayList; +import java.util.List; + +public class OperandStack { + private List operands = new ArrayList(); + + public void push(JavaObject jo) { + operands.add(jo); + } + + public JavaObject pop() { + int index = size() - 1; + JavaObject jo = (JavaObject) operands.get(index); + operands.remove(index); + return jo; + + } + + public JavaObject top() { + int index = size() - 1; + return (JavaObject) operands.get(index); + } + + public int size() { + return operands.size(); + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/StackFrame.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/StackFrame.java new file mode 100644 index 0000000000..8ceee230dd --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/engine/StackFrame.java @@ -0,0 +1,116 @@ +package com.github.HarryHook.coding2017.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; +import com.github.HarryHook.coding2017.jvm.method.Method; + +public class StackFrame { + + private List localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + public static StackFrame create(Method m) { + + StackFrame frame = new StackFrame(m); + + return frame; + } + + private StackFrame(Method m) { + this.m = m; + + } + + public JavaObject getLocalVariableValue(int index) { + return this.localVariableTable.get(index); + } + + public Stack getOprandStack() { + return this.oprandStack; + } + + public int getNextCommandIndex(int offset) { + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for (int i = 0; i < cmds.length; i++) { + if (cmds[i].getOffset() == offset) { + return i; + } + } + throw new RuntimeException("Can't find next command"); + } + + public ExecutionResult execute() { + + ByteCodeCommand[] cmds = m.getCmds(); + + while (index < cmds.length) { + + ExecutionResult result = new ExecutionResult(); + // 缺省值是执行下一条命令 + result.setNextAction(ExecutionResult.RUN_NEXT_CMD); + + System.out.println(cmds[index].toString()); + + cmds[index].execute(this, result); + + if (result.isRunNextCmd()) { + index++; + } else if (result.isExitCurrentFrame()) { + return result; + } else if (result.isPauseAndRunNewFrame()) { + index++; + return result; + } else if (result.isJump()) { + int offset = result.getNextCmdOffset(); + this.index = getNextCommandIndex(offset); + } else { + index++; + } + + } + + // 当前StackFrmae的指令全部执行完毕,可以退出了 + ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + return result; + + } + + public void setLocalVariableTable(List values) { + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo) { + // 问题: 为什么要这么做?? + if (this.localVariableTable.size() - 1 < index) { + for (int i = this.localVariableTable.size(); i <= index; i++) { + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + } + + public Method getMethod() { + return m; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java index 08b8ff029b..344177f549 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/method/Method.java @@ -4,6 +4,9 @@ import com.github.HarryHook.coding2017.jvm.clz.ClassFile; import com.github.HarryHook.coding2017.jvm.cmd.ByteCodeCommand; +import java.util.ArrayList; +import java.util.List; + import javax.management.RuntimeErrorException; import com.github.HarryHook.coding2017.jvm.attr.AttributeInfo; @@ -54,26 +57,28 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { int nameIndex = iter.nextU2ToInt(); int descriptorIndex = iter.nextU2ToInt(); int attributeCount = iter.nextU2ToInt(); - + Method m = new Method(clzFile, accessFlag, nameIndex, descriptorIndex); - - for(int i=1; i<=attributeCount; i++) { + + for (int i = 1; i <= attributeCount; i++) { int attrNameIndex = iter.nextU2ToInt(); String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); iter.back(2); - - if(AttributeInfo.CODE.equalsIgnoreCase(attrName)) { + + if (AttributeInfo.CODE.equalsIgnoreCase(attrName)) { CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); m.setCodeAttr(codeAttr); } else { throw new RuntimeException("only Attribute is complemented!"); } - + } return m; } - public String toString(ConstantPool pool) { + + public String toString() { + ConstantPool pool = this.clzFile.getConstantPool(); StringBuffer buffer = new StringBuffer(); String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); @@ -81,7 +86,66 @@ public String toString(ConstantPool pool) { buffer.append(this.codeAttr.toString(pool)); return buffer.toString(); } - public ByteCodeCommand[] getCmds() { + + public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); -} + } + + private String getParamAndReturnType() { + UTF8Info nameAndTypeInfo = (UTF8Info) this.getClzFile().getConstantPool() + .getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + + public List getParameterList() { + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first + 1, last); + + List paramList = new ArrayList(); + + if ((null == param) || "".equals(param)) { + return paramList; + } + + while (!param.equals("")) { + + int pos = 0; + // 这是一个对象类型 + if (param.charAt(pos) == 'L') { + + int end = param.indexOf(";"); + + if (end == -1) { + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos + 1, end)); + + pos = end + 1; + + } else if (param.charAt(pos) == 'I') { + // int + paramList.add("I"); + pos++; + + } else if (param.charAt(pos) == 'F') { + // float + paramList.add("F"); + pos++; + + } else { + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } } \ No newline at end of file diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/MiniJVMTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..d30ddd7c26 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/jvm/test/MiniJVMTest.java @@ -0,0 +1,29 @@ +package com.github.HarryHook.coding2017.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.HarryHook.coding2017.jvm.engine.MiniJVM;; + +public class MiniJVMTest { + + static final String PATH = "F:\\Coding2017\\group02\\727171008\\bin"; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception { + String[] classPaths = { PATH }; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.github.HarryHook.coding2017.jvm.test.EmployeeV1"); + + } + +} \ No newline at end of file From 11319cbd905db9f8be7680b719e3f53f9ba54ec1 Mon Sep 17 00:00:00 2001 From: Harry Date: Wed, 3 May 2017 22:03:01 +0800 Subject: [PATCH 390/552] update stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加stack作业 : QuickMinstack , StackWithTwoQueues, TwoStackInOneArray --- .../coding2017/stack/QuickMinStack.java | 22 +++++++ .../coding2017/stack/StackWithTwoQueues.java | 13 ++++ .../coding2017/stack/TwoStackInOneArray.java | 66 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueues.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java new file mode 100644 index 0000000000..2faae41b04 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java @@ -0,0 +1,22 @@ +package com.github.HarryHook.coding2017.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * + * @author liuxin + * + */ +public class QuickMinStack { + public void push(int data) { + + } + + public int pop() { + return -1; + } + + public int findMin() { + return -1; + } +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueues.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..ca649296f7 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueues.java @@ -0,0 +1,13 @@ +package com.github.HarryHook.coding2017.stack; + +public class StackWithTwoQueues { + + public void push(int data) { + + } + + public int pop() { + return -1; + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..ed0f68ceb4 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java @@ -0,0 +1,66 @@ +package com.github.HarryHook.coding2017.stack; + +/** + * 用一个数组实现两个栈 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return null; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + return null; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + return null; + } + +} From 899a27e1248691ab3f2530eaaa53c386bc29a958 Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Thu, 4 May 2017 10:31:46 +0800 Subject: [PATCH 391/552] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/stack/QuickMinStack.java | 19 +++++++ .../basic/stack/StackWithTwoQueues.java | 16 ++++++ .../basic/stack/TwoStackInOneArray.java | 57 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/QuickMinStack.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/TwoStackInOneArray.java diff --git a/group27/383117348/data-structure/com/coding/basic/stack/QuickMinStack.java b/group27/383117348/data-structure/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..4f257ab9fb --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,19 @@ +package com.coding.basic.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + public void push(int data){ + + } + public int pop(){ + return -1; + } + public int findMin(){ + return -1; + } +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/StackWithTwoQueues.java b/group27/383117348/data-structure/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..6f1d5bd04d --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,16 @@ +package com.coding.basic.stack; + + +public class StackWithTwoQueues { + + + public void push(int data) { + + } + + public int pop() { + return -1; + } + + +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/TwoStackInOneArray.java b/group27/383117348/data-structure/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..53a902ba17 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return null; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + return null; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return null; + } + +} From 487b4567d99a9b3130eaad1654d45183489aa621 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Thu, 4 May 2017 10:49:34 +0800 Subject: [PATCH 392/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/miniJVM/engine/ExecutionResult.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutionResult.java b/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutionResult.java index d105e630de..8ec03090f0 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutionResult.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/engine/ExecutionResult.java @@ -49,9 +49,4 @@ public int getNextCmdOffset() { public void setNextCmdOffset(int nextCmdOffset) { this.nextCmdOffset = nextCmdOffset; } - - - - - } From 58ff413a7c778e048a40b4b4c74e65042d0a2736 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Thu, 4 May 2017 16:07:23 +0800 Subject: [PATCH 393/552] update datastruct --- .../donaldy/basic/stack/QuickMinStack.java | 59 +++++++++ .../basic/stack/QuickMinStackTest.java | 31 +++++ .../basic/stack/StackWithTwoQueues.java | 16 +++ .../basic/stack/TwoStackInOneArray.java | 114 ++++++++++++++++++ .../basic/stack/TwoStackInOneArrayTest.java | 46 +++++++ 5 files changed, 266 insertions(+) create mode 100644 group24/448641125/src/com/donaldy/basic/stack/QuickMinStack.java create mode 100644 group24/448641125/src/com/donaldy/basic/stack/QuickMinStackTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueues.java create mode 100644 group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArray.java create mode 100644 group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArrayTest.java diff --git a/group24/448641125/src/com/donaldy/basic/stack/QuickMinStack.java b/group24/448641125/src/com/donaldy/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..8699c6ffec --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/stack/QuickMinStack.java @@ -0,0 +1,59 @@ +package com.donaldy.basic.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ + + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Stack; + +/** + * 不改变栈的本身性质, + * 在其基础上添加findMin, + * findMin是找到最小的值,而不是返回的同时把元素弹出栈。 + */ +public class QuickMinStack { + + ArrayList arrayList = new ArrayList(); + Stack stack = new Stack<>(); + + public void push(int data){ + + this.stack.push(data); + + this.arrayList.add(data); + + sort(); + + } + + private void sort() { + Collections.sort(this.arrayList); + } + + public int pop(){ + + int oldData = this.stack.pop(); + + this.arrayList.remove(new Integer(oldData)); + + return oldData; + } + + public int findMin(){ + + if (this.arrayList.isEmpty()) { + throw new IndexOutOfBoundsException("stack is empty."); + } + + return this.arrayList.get(0); + } + + + +} diff --git a/group24/448641125/src/com/donaldy/basic/stack/QuickMinStackTest.java b/group24/448641125/src/com/donaldy/basic/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..5da8e23bb9 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/stack/QuickMinStackTest.java @@ -0,0 +1,31 @@ +package com.donaldy.basic.stack; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by DonaldY on 2017/5/4. + */ +public class QuickMinStackTest { + + @Test + public void test() { + + QuickMinStack qmStack = new QuickMinStack(); + + int [] intArr = {13, 2, 6, 23, 12, 1, 1, 5}; + + for (int i = 0; i < intArr.length; ++i) { + qmStack.push(intArr[i]); + } + + Assert.assertEquals(5, qmStack.pop()); + Assert.assertEquals(1, qmStack.pop()); + + Assert.assertEquals(1, qmStack.findMin()); + Assert.assertEquals(1, qmStack.pop()); + + Assert.assertEquals(2, qmStack.findMin()); + + } +} diff --git a/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueues.java b/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..bcad4fe57c --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,16 @@ +package com.donaldy.basic.stack; + + +public class StackWithTwoQueues { + + + public void push(int data) { + + } + + public int pop() { + return -1; + } + + +} diff --git a/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArray.java b/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..26f90865aa --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,114 @@ +package com.donaldy.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底, + * 压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + + Object[] data = new Object[10]; + + /** + * 0, 10用来存储指针, + * 用于判断 栈是否为空 + */ + int pointer1 = 0; + int pointer2= 9; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + + ensureCapacity(); + System.out.println("push1 : " + o); + this.data[++ this.pointer1] = o; + + } + + private void ensureCapacity() { + + if (this.pointer1 + 1 == this.pointer2 || this.pointer1 == this.pointer2 + 1) { + + int newCapacity = this.data.length * 2 + 1; + + Object[] newDataArray = new Object[newCapacity]; + + System.arraycopy(this.data, 1, newDataArray, 1, this.pointer1); + for (Object o : newDataArray) { + System.out.print(o + " "); + } + System.out.println(); + /** + * 第二个栈为空时,复制可能出错 + * 为什么错? + * this.pointer2 + 1可能越界 + */ + System.arraycopy(this.data, this.pointer2, newDataArray, + newCapacity - this.pointer2 - 1, this.data.length - 1 - this.pointer2); + + for (Object o : newDataArray) { + System.out.print(o + " "); + } + System.out.println(); + + this.data = newDataArray; + } + + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1() { + + if (this.pointer1 <= 0 ) { + throw new IndexOutOfBoundsException("size : " + this.pointer1); + } + + return this.data[this.pointer1 --]; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + + if (this.pointer1 <= 0 ) { + throw new IndexOutOfBoundsException("size : " + this.pointer1); + } + + return this.data[this.pointer1]; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + + ensureCapacity(); + + this.data[this.pointer2 ++] = o; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + return null; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return null; + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArrayTest.java b/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..1dbd41c09a --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,46 @@ +package com.donaldy.basic.stack; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by DonaldY on 2017/5/4. + */ +public class TwoStackInOneArrayTest { + + @Test + public void test() { + + //第二个栈为空 + TwoStackInOneArray stack = new TwoStackInOneArray(); + + for (int i = 1; i <= 10; ++i) { + stack.push1(i); + Assert.assertEquals(i, stack.peek1()); + } + + + /*//两个栈 + stack = new TwoStackInOneArray(); + + for (int i = 1; i <= 4; ++i) { + stack.push1(i); + stack.push2(i); + } + + stack.push1(5); + + Assert.assertEquals(5, stack.peek1()); + Assert.assertEquals(4, stack.peek2()); + + for (int i = 5; i >= 1; --i) { + Assert.assertEquals(i, stack.pop1()); + } + + for (int i = 4; i >= 1; --i) { + Assert.assertEquals(i, stack.pop2()); + }*/ + + } + +} From 12febab54f1bc1e6c25986aa32e143a1e12fafbe Mon Sep 17 00:00:00 2001 From: lzb Date: Thu, 4 May 2017 17:14:12 +0800 Subject: [PATCH 394/552] =?UTF-8?q?jvm6=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group24/1148285693/learning2017/.editorconfig | 2 + .../me/lzb/basic/stack/QuickMinStack.java | 60 +++++++ .../java/me/lzb/basic/{ => stack}/Stack.java | 4 +- .../me/lzb/basic/{ => stack}/StackUtil.java | 2 +- .../lzb/basic/stack/StackWithTwoQueues.java | 98 +++++++++++ .../lzb/basic/stack/TwoStackInOneArray.java | 155 ++++++++++++++++++ .../java/me/lzb/litestruts/LoginAction.java | 3 +- .../java/me/lzb/basic/stack/StackTest.java | 87 ++++++++++ .../lzb/basic/{ => stack}/StackUtilTest.java | 2 +- .../other/src/main/java/ThreadTest.java | 25 +++ .../java/me/lzb/other/algorithm/Paxos.java | 7 + 11 files changed, 440 insertions(+), 5 deletions(-) create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/QuickMinStack.java rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{ => stack}/Stack.java (94%) rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{ => stack}/StackUtil.java (99%) create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackWithTwoQueues.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/TwoStackInOneArray.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/stack/StackTest.java rename group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/{ => stack}/StackUtilTest.java (98%) create mode 100644 group24/1148285693/learning2017/other/src/main/java/ThreadTest.java create mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/Paxos.java diff --git a/group24/1148285693/learning2017/.editorconfig b/group24/1148285693/learning2017/.editorconfig index 29c9408cf8..34072e9c8c 100644 --- a/group24/1148285693/learning2017/.editorconfig +++ b/group24/1148285693/learning2017/.editorconfig @@ -7,6 +7,8 @@ end_of_line = lf charset = utf-8 trim_trailing_whitespace = true indent_size = 4 +end_of_line = crlf +insert_final_newline = false [*.html] indent_size = 4 diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/QuickMinStack.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..d6250bae89 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/QuickMinStack.java @@ -0,0 +1,60 @@ +package me.lzb.basic.stack; + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + */ +public class QuickMinStack { + private int mini; + private java.util.Stack stack = new Stack(); + + + public void push(int data) { + if (stack.size() <= 0) { + mini = data; + } else if (mini > data) { + mini = data; + } + stack.push(data); + } + + public int pop() { + if (stack.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + + + int a = stack.pop(); + if (a <= mini) { + newMin(); + } + + return a; + } + + public int findMin() { + if (stack.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + return mini; + } + + + private void newMin() { + if (stack.isEmpty()) { + return; + } + + int a = stack.peek(); + for (int i : stack) { + if (i < a) { + a = i; + } + } + + this.mini = a; + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Stack.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java similarity index 94% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Stack.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java index 60785110eb..ff5f8156a0 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Stack.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java @@ -1,4 +1,6 @@ -package me.lzb.basic; +package me.lzb.basic.stack; + +import me.lzb.basic.ArrayList; /** * 先进后出 diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/StackUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackUtil.java similarity index 99% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/StackUtil.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackUtil.java index 547eb6105f..f728f54630 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/StackUtil.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackUtil.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.stack; import java.util.Stack; diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackWithTwoQueues.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..38d09d8e2d --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,98 @@ +package me.lzb.basic.stack; + + +import java.util.LinkedList; + +public class StackWithTwoQueues { + + private java.util.Queue queue1; + private java.util.Queue queue2; + private boolean isOne; + + + public StackWithTwoQueues() { + queue1 = new LinkedList(); + queue2 = new LinkedList(); + isOne = true; + } + + + public boolean isEmpty() { + return queue1.isEmpty() && queue2.isEmpty(); + } + + + public int size() { + return queue1.isEmpty() ? queue2.size() : queue1.size(); + } + + + public void push(int data) { + + if (isOne) { + queue1.add(data); + } else { + queue2.add(data); + } + } + + public int pop() { + if (isEmpty()) { + throw new RuntimeException(" Stack is empty now"); + } + + int r; + if (isOne) { + + while (queue1.size() > 1) { + queue2.add(queue1.poll()); + } + r = queue1.poll(); + isOne = false; + } else { + + while (queue2.size() > 1) { + queue1.add(queue2.poll()); + } + r = queue2.poll(); + isOne = true; + } + + return r; + } + + + @Override + public String toString() { + if (isEmpty()) { + return "[]"; + } + StringBuffer sb = new StringBuffer(); + sb.append("["); + + + int a = 1; + if (isOne) { + for (int i : queue1) { + sb.append(i); + if (a < queue1.size()) { + sb.append(","); + } + a++; + } + + + } else { + for (int i : queue2) { + sb.append(i); + if (a < queue2.size()) { + sb.append(","); + } + a++; + } + } + + sb.append("]"); + return sb.toString(); + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/TwoStackInOneArray.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..4e76b55a7b --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,155 @@ +package me.lzb.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + */ +public class TwoStackInOneArray { + private final int growsize = 10; + + private Object[] data = new Object[growsize]; + + private int point1 = 0; + + private int point2 = data.length - 1; + + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + grow(); + data[point1] = o; + point1 = point1 + 1; + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + if (isEmpty1()) { + throw new RuntimeException("stack1 is empty"); + } + + Object o = data[point1 - 1]; + point1 = point1 - 1; + + return o; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + if (isEmpty1()) { + throw new RuntimeException("stack1 is empty"); + } + return data[point1 - 1]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + grow(); + data[point2] = o; + point2 = point2 - 1; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + if (isEmpty2()) { + throw new RuntimeException("stack2 is empty"); + } + Object o = data[point2 + 1]; + point2 = point2 + 1; + return o; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + if (isEmpty2()) { + throw new RuntimeException("stack2 is empty"); + } + return data[point2 + 1]; + } + + + public boolean isEmpty1() { + return size1() <= 0; + } + + public boolean isEmpty2() { + return size2() <= 0; + } + + public int size1() { + return point1; + } + + public int size2() { + return data.length - 1 - point2; + } + + + private void grow() { + + if (point2 - point1 > 0) { + return; + } + + Object[] d = new Object[data.length + growsize]; + + System.arraycopy(data, 0, d, 0, size1()); + + System.arraycopy(data, point2 + 1, d, d.length - size2(), size2()); + point2 = d.length - 1 - size2(); + data = d; + } + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("["); + if (!isEmpty1()) { + for (int i = 0; i < point1; i++) { + if (i > 0) { + sb.append(","); + } + sb.append(data[i].toString()); + } + } + sb.append("]"); + + sb.append("|"); + + sb.append("["); + if (!isEmpty2()) { + for (int i = data.length - 1; i > point2; i--) { + if (i < data.length - 1) { + sb.append(","); + } + + sb.append(data[i].toString()); + } + } + sb.append("]"); + return sb.toString(); + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/LoginAction.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/LoginAction.java index 5ea923c5b4..4f89670db2 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/LoginAction.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/LoginAction.java @@ -1,8 +1,7 @@ package me.lzb.litestruts; /** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码 * */ public class LoginAction{ diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/stack/StackTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/stack/StackTest.java new file mode 100644 index 0000000000..da0b954a4a --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/stack/StackTest.java @@ -0,0 +1,87 @@ +package me.lzb.basic.stack; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by LZB on 2017/5/4. + */ +public class StackTest { + + @Test + public void QuickMinStackTest() { + + QuickMinStack stack = new QuickMinStack(); + stack.push(1); + stack.push(3); + stack.push(0); + stack.push(2); + + Assert.assertEquals(0, stack.findMin()); + Assert.assertEquals(2, stack.pop()); + Assert.assertEquals(0, stack.findMin()); + Assert.assertEquals(0, stack.pop()); + Assert.assertEquals(1, stack.findMin()); + } + + @Test + public void StackWithTwoQueuesTest() { + StackWithTwoQueues stack = new StackWithTwoQueues(); + + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + Assert.assertEquals("[1,2,3,4]", stack.toString()); + Assert.assertEquals("4", String.valueOf(stack.pop())); + Assert.assertEquals("[1,2,3]", stack.toString()); + Assert.assertEquals("3", String.valueOf(stack.pop())); + Assert.assertEquals("[1,2]", stack.toString()); + } + + @Test + public void TwoStackInOneArrayTest() { + TwoStackInOneArray stack = new TwoStackInOneArray(); + + + stack.push1(1); + stack.push1(2); + stack.push1(3); + stack.push1(4); + stack.push1(5); + stack.push1(6); + Assert.assertEquals(6, stack.size1()); + + stack.push2(1); + stack.push2(2); + stack.push2(3); + stack.push2(4); + stack.push2(5); + stack.push2(6); + + + Assert.assertEquals("[1,2,3,4,5,6]|[1,2,3,4,5,6]", stack.toString()); + + Assert.assertEquals(6, stack.size1()); + + Assert.assertEquals(6, stack.peek1()); + + Assert.assertEquals(6, stack.peek2()); + + + Assert.assertEquals(6, stack.pop1()); + + Assert.assertEquals(6, stack.pop2()); + + Assert.assertEquals("[1,2,3,4,5]|[1,2,3,4,5]", stack.toString()); + + Assert.assertEquals(5, stack.pop1()); + Assert.assertEquals(4, stack.pop1()); + + Assert.assertEquals(5, stack.pop2()); + + Assert.assertEquals("[1,2,3]|[1,2,3,4]", stack.toString()); + + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/StackUtilTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/stack/StackUtilTest.java similarity index 98% rename from group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/StackUtilTest.java rename to group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/stack/StackUtilTest.java index 48589f57d3..e07acade1b 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/StackUtilTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/stack/StackUtilTest.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.stack; import org.junit.After; import org.junit.Assert; diff --git a/group24/1148285693/learning2017/other/src/main/java/ThreadTest.java b/group24/1148285693/learning2017/other/src/main/java/ThreadTest.java new file mode 100644 index 0000000000..fb460c5bf9 --- /dev/null +++ b/group24/1148285693/learning2017/other/src/main/java/ThreadTest.java @@ -0,0 +1,25 @@ +/** + * Created by LZB on 2017/5/3. + */ +public class ThreadTest extends Thread { + boolean stop = false; + int value = 0; + public void run() { + while (!stop) { + value++; + } + } + public static void main(String[] args) + throws Exception { + + ThreadTest t = new ThreadTest(); + t.start(); + Thread.sleep(2000); + t.stop = true; + System.out.println("value =" + t.value); + Thread.sleep(2000); + System.out.println("value =" + t.value); + + } + +} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/Paxos.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/Paxos.java new file mode 100644 index 0000000000..20ca1177dd --- /dev/null +++ b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/Paxos.java @@ -0,0 +1,7 @@ +package me.lzb.other.algorithm; + +/** + * Created by LZB on 2017/5/4. + */ +public class Paxos { +} From 1c9a48a9c52d3923b995b0a6d833e93a1f52113a Mon Sep 17 00:00:00 2001 From: Harry Date: Thu, 4 May 2017 17:39:29 +0800 Subject: [PATCH 395/552] update stack MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现QuickMinStack, StackWithTwoQueue, TwoStackInOneArray --- .../coding2017/stack/QuickMinStack.java | 50 +++++++++- .../coding2017/stack/StackWithTwoQueues.java | 49 +++++++++- .../coding2017/stack/TwoStackInOneArray.java | 94 ++++++++++++++++++- 3 files changed, 184 insertions(+), 9 deletions(-) diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java index 2faae41b04..af6bb37e2b 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java @@ -1,5 +1,11 @@ package com.github.HarryHook.coding2017.stack; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.sun.xml.internal.ws.encoding.SwACodec; + /** * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 @@ -8,15 +14,55 @@ * */ public class QuickMinStack { + Stack s1 = new Stack<>(); + Stack s2 = new Stack<>(); + public void push(int data) { + s1.push(data); + + if (s2.isEmpty()) { + s2.push(data); + } else if (data > s2.peek()) { + s2.push(s2.peek()); + } else { + s2.push(data); + } + } public int pop() { - return -1; + if (s1.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + s2.pop(); + return s1.pop(); } public int findMin() { - return -1; + if (s2.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + return s2.peek(); + } + + public static void main(String[] args) { + QuickMinStack stack = new QuickMinStack(); + stack.push(5); + stack.push(3); + stack.push(2); + stack.push(4); + stack.push(1); + System.out.println("findMin: " + stack.findMin()); + System.out.println("pop: " + stack.pop()); + System.out.println("findMin: " + stack.findMin()); + System.out.println("pop: " + stack.pop()); + System.out.println("findMin: " + stack.findMin()); + System.out.println("pop: " + stack.pop()); + System.out.println("findMin: " + stack.findMin()); + System.out.println("pop: " + stack.pop()); + System.out.println("findMin: " + stack.findMin()); + System.out.println("pop: " + stack.pop()); + System.out.println("findMin: " + stack.findMin()); } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueues.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueues.java index ca649296f7..14e109e53e 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueues.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueues.java @@ -1,13 +1,58 @@ package com.github.HarryHook.coding2017.stack; +import com.github.HarryHook.coding2017.queue.Queue; + public class StackWithTwoQueues { + private Queue queue1; + private Queue queue2; - public void push(int data) { + public StackWithTwoQueues() { + queue1 = new Queue<>(); // 入栈 + queue2 = new Queue<>(); // 出栈 + } + + public boolean isEmpty() { + if (queue1.isEmpty() && queue2.isEmpty()) { + return true; + } + return false; + } + public int size() { + return queue1.size() + queue2.size(); + } + + public void push(int data) { + queue1.enQueue(data); } public int pop() { - return -1; + if (isEmpty()) { + throw new RuntimeException("stack is empty"); + } + while(!(queue1.isEmpty())) { + queue2.enQueue(queue1.deQueue()); + } + int tmp = 0; + while(!(queue2.isEmpty())) { + tmp = queue2.deQueue(); + if(queue2.isEmpty()) { + break; + } + queue1.enQueue(tmp); + } + return tmp; + } + public static void main(String[] args) { + StackWithTwoQueues stack = new StackWithTwoQueues(); + stack.push(1); + stack.push(2); + stack.push(3); + System.out.println(stack.pop()); + stack.push(43); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); } } diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java index ed0f68ceb4..d8af1f8483 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java @@ -1,5 +1,7 @@ package com.github.HarryHook.coding2017.stack; +import java.util.Arrays; + /** * 用一个数组实现两个栈 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 * @@ -7,7 +9,9 @@ * */ public class TwoStackInOneArray { - Object[] data = new Object[10]; + Object[] data = new Object[6]; + int i = 0; + int j = data.length - 1; /** * 向第一个栈中压入元素 @@ -15,6 +19,10 @@ public class TwoStackInOneArray { * @param o */ public void push1(Object o) { + if (i > j) { + expansion(); + } + data[i++] = o; } @@ -24,7 +32,12 @@ public void push1(Object o) { * @return */ public Object pop1() { - return null; + if (data[0] == null) { + throw new RuntimeException("stack1 is empty"); + } + Object tmp = data[i - 1]; + data[--i] = null; + return tmp; } /** @@ -34,13 +47,17 @@ public Object pop1() { */ public Object peek1() { - return null; + return data[i - 1]; } /* * 向第二个栈压入元素 */ public void push2(Object o) { + if (i > j) { + expansion(); + } + data[j--] = o; } @@ -50,7 +67,13 @@ public void push2(Object o) { * @return */ public Object pop2() { - return null; + if (data[data.length - 1] == null) { + throw new RuntimeException("stack2 is empty"); + } + Object tmp = data[j + 1]; + data[++j] = null; + return tmp; + } /** @@ -60,7 +83,68 @@ public Object pop2() { */ public Object peek2() { - return null; + return data[j + 1]; + } + + // 给数组扩容 + public void expansion() { + int oldCapacity = data.length; + int newCapacity = oldCapacity * 2; // 此时扩容是因为数组有可能全是stack2的元素 + data = Arrays.copyOf(data, newCapacity); + int newIndex = newCapacity - 1; + for (int k = oldCapacity - 1; k > j; k--) { + data[newIndex--] = data[k]; + data[k] = null; + } + j += newCapacity - oldCapacity; + } + + public static void main(String[] args) { + TwoStackInOneArray stack = new TwoStackInOneArray(); + + stack.push1(3); + stack.push1(5); + stack.push1(6); + stack.push1(11); + System.out.println("peek1: " + stack.peek1()); + System.out.println("pop1: " + stack.pop1()); + System.out.println("pop1: " + stack.pop1()); + stack.push1(61); + System.out.println("pop1: " + stack.pop1()); + System.out.println("pop1: " + stack.pop1()); + System.out.println("peek1: " + stack.peek1()); + System.out.println("pop1: " + stack.pop1()); + + stack.push2(123); + stack.push2(1); + stack.push2(4); + + stack.push1(3); + stack.push1(5); + stack.push1(6); + + stack.push2(123); + stack.push2(1); + stack.push2(4); + stack.push2(12); + stack.push2(2); + stack.push2(8); + System.out.println("pop1: " + stack.pop1()); + System.out.println("peek1: " + stack.peek1()); + System.out.println("pop1: " + stack.pop1()); + System.out.println("pop1: " + stack.pop1()); + + System.out.println("pop2: " + stack.pop2()); + System.out.println("pop2: " + stack.pop2()); + System.out.println("pop2: " + stack.pop2()); + System.out.println("pop2: " + stack.pop2()); + System.out.println("pop2: " + stack.pop2()); + System.out.println("pop2: " + stack.pop2()); + + System.out.println("pop2: " + stack.pop2()); + System.out.println("pop2: " + stack.pop2()); + System.out.println("pop2: " + stack.pop2()); + } } From 3f0d7a926ef209bd21cd7d61f395f26b53c41efe Mon Sep 17 00:00:00 2001 From: Harry Date: Thu, 4 May 2017 17:45:57 +0800 Subject: [PATCH 396/552] update stack --- .../github/HarryHook/coding2017/stack/QuickMinStack.java | 6 +----- .../HarryHook/coding2017/stack/TwoStackInOneArray.java | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java index af6bb37e2b..70f1d03903 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStack.java @@ -1,16 +1,12 @@ package com.github.HarryHook.coding2017.stack; -import java.util.ArrayList; -import java.util.List; import java.util.Stack; -import com.sun.xml.internal.ws.encoding.SwACodec; - /** * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 * - * @author liuxin + * @author HarryHook * */ public class QuickMinStack { diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java index d8af1f8483..0829b5b34c 100644 --- a/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArray.java @@ -5,7 +5,7 @@ /** * 用一个数组实现两个栈 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 * - * @author liuxin + * @author HarryHook * */ public class TwoStackInOneArray { From b444bfab2d135c40d990611f7801ac468b5ebfdb Mon Sep 17 00:00:00 2001 From: onlyLYJ <382266293@qq.com> Date: Thu, 4 May 2017 20:19:02 +0800 Subject: [PATCH 397/552] new work done --- .../382266293/coding/basic/queue/Stack.java | 106 +++++++++++++ .../coding/basic/stack/QuickMinStack.java | 74 +++++++++ .../coding/basic/stack/QuickMinStackTest.java | 68 +++++++++ .../basic/stack/StackWithTwoQueues.java | 42 ++++++ .../basic/stack/StackWithTwoQueuesTest.java | 51 +++++++ .../basic/stack/TwoStackInOneArray.java | 116 ++++++++++++++ .../basic/stack/TwoStackInOneArrayTest.java | 142 ++++++++++++++++++ group12/382266293/src/ThreadTest.java | 23 +++ .../download/FileDownloaderTest.java | 2 +- 9 files changed, 623 insertions(+), 1 deletion(-) create mode 100644 group12/382266293/coding/basic/queue/Stack.java create mode 100644 group12/382266293/coding/basic/stack/QuickMinStack.java create mode 100644 group12/382266293/coding/basic/stack/QuickMinStackTest.java create mode 100644 group12/382266293/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group12/382266293/coding/basic/stack/StackWithTwoQueuesTest.java create mode 100644 group12/382266293/coding/basic/stack/TwoStackInOneArray.java create mode 100644 group12/382266293/coding/basic/stack/TwoStackInOneArrayTest.java create mode 100644 group12/382266293/src/ThreadTest.java diff --git a/group12/382266293/coding/basic/queue/Stack.java b/group12/382266293/coding/basic/queue/Stack.java new file mode 100644 index 0000000000..4a6884ef37 --- /dev/null +++ b/group12/382266293/coding/basic/queue/Stack.java @@ -0,0 +1,106 @@ +package queue; + +import java.util.EmptyStackException; +import java.util.NoSuchElementException; + +import collection.AbstractList; +import collection.Iterator; +import collection.concrete.ArrayList; + +public class Stack extends AbstractList { + + private ArrayList myList; + + public Stack() { + this.myList = new ArrayList(); + } + + public void push(E e) { + myList.addLast(e); + } + + public E pop() { + checkEmpty(); + return myList.removeLast(); + } + + private void checkEmpty() { + if (0 == size()) + throw new EmptyStackException(); + } + + public E peek() { + checkEmpty(); + return myList.getLast(); + } + + @Override + public int size() { + return myList.size(); + } + + @Override + public void add(E e) { + push(e); + } + + @Override + public E get(int index) { + checkEmpty(); + return myList.get(size() - index - 1); + } + + @Override + protected Iterator iterator() { + return new StackIterator(myList); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((myList == null) ? 0 : myList.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Stack other = (Stack) obj; + if (myList == null) { + if (other.myList != null) + return false; + } else if (!myList.equals(other.myList)) + return false; + return true; + } + + private class StackIterator implements Iterator { + + private ArrayList myArrayList; + private int pos; + + public StackIterator(ArrayList myList) { + myArrayList = myList; + pos = 0; + } + + @Override + public boolean hasNext() { + return pos < size(); + } + + @Override + public E next() { + if (hasNext()) + return (E) get(pos); + throw new NoSuchElementException(); + } + } + +} diff --git a/group12/382266293/coding/basic/stack/QuickMinStack.java b/group12/382266293/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..f474104ba8 --- /dev/null +++ b/group12/382266293/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,74 @@ +package stack; + +import java.util.NoSuchElementException; +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + Stack s1 = new Stack<>(); + private Stack min = new Stack<>(); + + + public void push(int data){ + s1.push(data); + if (size() == 0) { + + min.push(data); + } else { + Stack temp = new Stack(); + while(!min.isEmpty() && data >min.peek()) { + temp.push(min.pop()); + } + min.push(data); + while(!temp.isEmpty()) { + min.push(temp.pop()); + } + } + } + + @Override + public String toString() { + return "QuickMinStack [s1=" + s1 + ", min=" + min + "]"; + } + + public int pop(){ + + checkEmpty(); + int result = s1.pop(); + Stack temp = new Stack(); + + while(!min.isEmpty() && min.peek() != result) { + temp.push(min.pop()); + } + + min.pop(); + + while(!temp.isEmpty()) { + min.push(temp.pop()); + } + + return result; + } + + private void checkEmpty() { + if (size() <= 0) { + throw new NoSuchElementException("stack is empty"); + } + + } + + public int size() { + return s1.size(); + } + + public int findMin(){ + return min.peek(); + } + +} diff --git a/group12/382266293/coding/basic/stack/QuickMinStackTest.java b/group12/382266293/coding/basic/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..23fa14c947 --- /dev/null +++ b/group12/382266293/coding/basic/stack/QuickMinStackTest.java @@ -0,0 +1,68 @@ +package stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class QuickMinStackTest { + + QuickMinStack qs; + + @Before + public void setUp() throws Exception { + qs = new QuickMinStack(); + } + + @After + public void tearDown() throws Exception { + qs = null; + } + + @Test + public void testPush() { + qs.push(1); + qs.push(2); + } + + @Test + public void testPop() { + qs.push(1); + qs.push(2); + assertEquals(2,qs.pop()); + assertEquals(1,qs.pop()); + } + + @Test + public void testSize() { + assertEquals(0,qs.size()); + qs.push(1); + qs.push(2); + assertEquals(2,qs.size()); + } + + @Test + public void testFindMin() { + for (int i = 0; i < 8; i++) { + qs.push(i); + } + + qs.push(-19); + qs.push(100); + + assertEquals(-19,qs.findMin()); + qs.pop(); + qs.pop(); + assertEquals(0,qs.findMin()); + qs.push(-1); + qs.push(-1); + assertEquals(-1,qs.findMin()); + qs.pop(); + assertEquals(-1,qs.findMin()); + qs.pop(); + assertEquals(0,qs.findMin()); + + } + +} diff --git a/group12/382266293/coding/basic/stack/StackWithTwoQueues.java b/group12/382266293/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..05ee36d22a --- /dev/null +++ b/group12/382266293/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,42 @@ +package stack; + +import queue.Queue; + +public class StackWithTwoQueues { + + private Queue q1 = new Queue() ; + private Queue q2 = new Queue() ; + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return q1.size() + q2.size(); + } + + public void push(int data) { + q1.enQueue(data); + } + + public int pop() { + if (size() <= 0) { + throw new RuntimeException("stack is empty"); + } + + if (q1.size() >= 1) { + while (q1.size() > 1) { + q2.enQueue(q1.deQueue()); + } + return q1.deQueue(); + } else { + while (q2.size() > 1) { + q1.enQueue(q2.deQueue()); + } + return q2.deQueue(); + } + + } + + +} diff --git a/group12/382266293/coding/basic/stack/StackWithTwoQueuesTest.java b/group12/382266293/coding/basic/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..49258a7a47 --- /dev/null +++ b/group12/382266293/coding/basic/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,51 @@ +package stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class StackWithTwoQueuesTest { + + StackWithTwoQueues sq; + @Before + public void setUp() throws Exception { + sq = new StackWithTwoQueues<>(); + } + + @After + public void tearDown() throws Exception { + sq = null; + } + + @Test + public void testIsEmpty() { + assertEquals(true,sq.isEmpty()); + } + + @Test + public void testPush() { + sq.push(1); + assertEquals(1,sq.size()); + sq.push(2); + assertEquals(2,sq.size()); + sq.pop(); + assertEquals(1,sq.size()); + sq.pop(); + assertEquals(0,sq.size()); + } + + @Test + public void testPop() { + sq.push(1); + sq.push(2); + sq.push(-3); + assertEquals(-3,sq.pop()); + sq.push(4); + assertEquals(4,sq.pop()); + assertEquals(2,sq.pop()); + assertEquals(1,sq.pop()); + } + +} diff --git a/group12/382266293/coding/basic/stack/TwoStackInOneArray.java b/group12/382266293/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..87ceff35c7 --- /dev/null +++ b/group12/382266293/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,116 @@ +package stack; + +import java.util.Arrays; +import java.util.NoSuchElementException; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + private int size1 = 0; + private int size2 = 0; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + checkCapacity(); + data[size1++] = o; + } + + @Override + public String toString() { + return "TwoStackInOneArray [data=" + Arrays.toString(data) + "]"; + } + + public int size1() { + return size1; + } + + public int size2() { + return size2; + } + + private void checkCapacity() { + if (size() + 1 >= data.length) { + grow(); + } + } + private int size() { + return size1 + size2; + } + + private void grow() { + int newCapacity = size() * 2; + Object[] target = new Object[newCapacity]; + System.arraycopy(data, 0, target, 0, size1); + System.arraycopy(data, data.length - size2, target, target.length - size2, size2); + data = target; + } + + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + + checkEmpty(size1); + Object o = data[size1-1]; + data[size1-1] = null; + size1--; + return o; + + } + + private void checkEmpty(int size) { + if (size <= 0) { + throw new NoSuchElementException("stack is empty"); + } + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + + checkEmpty(size1); + return data[size1-1]; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + checkCapacity(); + data[data.length - size2 - 1] = o; + size2++; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + checkEmpty(size2); + Object o = data[data.length - size2]; + data[data.length - size2] = null; + size2--; + return o; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + checkEmpty(size2); + return data[data.length - size2]; + } + +} diff --git a/group12/382266293/coding/basic/stack/TwoStackInOneArrayTest.java b/group12/382266293/coding/basic/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..6ce6125b46 --- /dev/null +++ b/group12/382266293/coding/basic/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,142 @@ +package stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class TwoStackInOneArrayTest { + + TwoStackInOneArray ts; + @Before + public void setUp() throws Exception { + ts = new TwoStackInOneArray(); + } + + @After + public void tearDown() throws Exception { + ts = null; + } + + @Test + public void testPush1() { + ts.push1(1); + ts.push1(2); + } + + @Test + public void testSize1() { + assertEquals(0,ts.size1()); + ts.push1(1); + ts.push1(2); + assertEquals(2,ts.size1()); + } + + @Test + public void testSize2() { + assertEquals(0,ts.size2()); + ts.push2(1); + ts.push2(2); + assertEquals(2,ts.size2()); + } + + @Test + public void testSize12() { + assertEquals(0,ts.size1()); + ts.push1(1); + ts.push1(2); + assertEquals(2,ts.size1()); + assertEquals(0,ts.size2()); + ts.push2(1); + ts.push2(2); + assertEquals(2,ts.size2()); + } + + @Test + public void testPush2() { + ts.push2(1); + ts.push2(2); + assertEquals(2,ts.pop2()); + assertEquals(1,ts.pop2()); + } + + @Test + public void testPush12() { + ts.push1(1); + ts.push1(2); + assertEquals(2,ts.pop1()); + assertEquals(1,ts.pop1()); + ts.push2(1); + ts.push2(2); + assertEquals(2,ts.pop2()); + assertEquals(1,ts.pop2()); + } + + + @Test + public void testPop1() { + + ts.push1(1); + ts.push1(2); + assertEquals(2,ts.pop1()); + assertEquals(1,ts.pop1()); + + } + + + + @Test + public void testPop2() { + + ts.push2(1); + ts.push2(2); + assertEquals(2,ts.pop2()); + assertEquals(1,ts.pop2()); + + } + + @Test + public void testPeek2() { + + ts.push1(1); + ts.push1(2); + assertEquals(2,ts.pop1()); + assertEquals(1,ts.pop1()); + + ts.push2(1); + ts.push2(2); + assertEquals(2,ts.pop2()); + assertEquals(1,ts.pop2()); + } + + @Test + public void testPeek1() { + + ts.push1(1); + assertEquals(1,ts.peek1()); + ts.push1(2); + assertEquals(2,ts.peek1()); + + } + + @Test + public void testGrow() { + + for(int i = 1; i < 101; i++) { + ts.push1(i); + ts.push2(i); + assertEquals(i,ts.size1()); + assertEquals(i,ts.size2()); + } + + for (int i = 100; i >0; i--) { + assertEquals(i, ts.pop1()); + assertEquals(i, ts.pop2()); + } + + } + + + +} diff --git a/group12/382266293/src/ThreadTest.java b/group12/382266293/src/ThreadTest.java new file mode 100644 index 0000000000..de8c8825e0 --- /dev/null +++ b/group12/382266293/src/ThreadTest.java @@ -0,0 +1,23 @@ +public class ThreadTest extends Thread { + boolean stop = false; + Integer value = 0; + public void run() { + while (!stop) { + + value++; + } + } + + public static void main(String[] args) + throws Exception { + + ThreadTest t = new ThreadTest(); + t.start(); + Thread.sleep(2000); + t.stop = true; + System.out.println("value =" + t.value); + Thread.sleep(2000); + System.out.println("value =" + t.value); + + } +} diff --git a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java index c117b9d878..fb681c4c0e 100644 --- a/group12/382266293/src/com/coderising/download/FileDownloaderTest.java +++ b/group12/382266293/src/com/coderising/download/FileDownloaderTest.java @@ -30,7 +30,7 @@ public void testDownload() { String url = "http://localhost:8080/test.jpg"; - FileDownloader downloader = new FileDownloader(qq); + FileDownloader downloader = new FileDownloader(Git); ConnectionManager cm = new ConnectionManagerImpl(); downloader.setConnectionManager(cm); From bd0e0fe9370d98cb6fd850a2607e504b23970d7c Mon Sep 17 00:00:00 2001 From: zj <2258659044@qq.com> Date: Thu, 4 May 2017 23:00:02 +0800 Subject: [PATCH 398/552] =?UTF-8?q?JVM=E7=AC=AC6=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/BinaryTree.java | 39 ++++-- .../com/coding/basic/stack/QuickMinStack.java | 40 ++++++ .../basic/stack/StackWithTwoQueues.java | 38 +++++ .../basic/stack/TwoStackInOneArray.java | 127 +++++++++++++++++ .../test/com/coding/basic/BinaryTreeTest.java | 9 +- .../coding/basic/stack/QuickMinStackTest.java | 60 ++++++++ .../basic/stack/StackWithTwoQueuesTest.java | 72 ++++++++++ .../basic/stack/TwoStackInOneArrayTest.java | 130 ++++++++++++++++++ 8 files changed, 498 insertions(+), 17 deletions(-) create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group12/2258659044/zj-2017/src/com/coding/basic/stack/TwoStackInOneArray.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/QuickMinStackTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackWithTwoQueuesTest.java create mode 100644 group12/2258659044/zj-2017/src/test/com/coding/basic/stack/TwoStackInOneArrayTest.java diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java index 3fe9965b5e..53c4e92013 100644 --- a/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java +++ b/group12/2258659044/zj-2017/src/com/coding/basic/BinaryTree.java @@ -2,24 +2,23 @@ import com.coding.basic.array.ArrayList; -public class BinaryTree { +public class BinaryTree> { //根节点 - private BinaryTreeNode root; - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public > BinaryTreeNode insert(T o){ + private BinaryTreeNode root; + + public BinaryTreeNode insert(T o){ - BinaryTreeNode treeNode = new BinaryTreeNode(); + BinaryTreeNode treeNode = new BinaryTreeNode(); treeNode.setData(o); if(root == null){ root = treeNode; }else{ - BinaryTreeNode currentNode = root; - BinaryTreeNode parent; + BinaryTreeNode currentNode = root; + BinaryTreeNode parent; while(true){ parent = currentNode; - if(((Comparable)currentNode.getData()).compareTo(o)>0){//向左放 + if((currentNode.getData()).compareTo(o)>0){//向左放 currentNode = currentNode.getLeft(); if(currentNode == null){ parent.setLeft(treeNode); @@ -44,12 +43,12 @@ public > BinaryTreeNode insert(T o){ * @param node * @return */ - public List traversalBefore(BinaryTreeNode node){ + public List traversalBefore(BinaryTreeNode node){ //所有数据集合 - List datas = new ArrayList<>(); + List datas = new ArrayList<>(); return traversal(node,datas); } - private List traversal(BinaryTreeNode node,List datas){ + private List traversal(BinaryTreeNode node,List datas){ if(node !=null){ datas.add(node.getData()); @@ -59,8 +58,22 @@ private List traversal(BinaryTreeNode node,List datas return datas; } - public BinaryTreeNode getRoot() { + public BinaryTreeNode getRoot() { return root; } + + /** + * 获取比obj大的最小值 + * @param obj + * @return + */ + public T getLeastBigger (T obj){ + BinaryTreeNode left = root; + while(left.getLeft()!=null){ + left = left.getLeft(); + } + return left.getData(); + } + } diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/QuickMinStack.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..56dee25531 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,40 @@ +package com.coding.basic.stack; + + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author zj + * @param + * + */ +public class QuickMinStack> { + + + private Stack dataStack = new Stack(); + + private Stack minStack = new Stack(); + + public void push(T item){ + + if(minStack.isEmpty()||item.compareTo(minStack.peek())<0){ + minStack.push(item); + }else{ + minStack.push(minStack.peek()); + } + + dataStack.push(item); + } + + public T pop(){ + + minStack.pop(); + return dataStack.pop(); + } + + public T findMin(){ + + return minStack.peek(); + } + +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackWithTwoQueues.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..8a76830563 --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,38 @@ +package com.coding.basic.stack; + +import com.coding.basic.queue.Queue; + +/** + * + * @author zj + * + * @param + */ +public class StackWithTwoQueues { + + + private final Queue q1 = new Queue(); + + private final Queue q2 = new Queue(); + + public void push(E data) { + + q1.enQueue(data); + } + + public E pop() { + + while(q1.size()>1){ + q2.enQueue(q1.deQueue()); + } + return q1.deQueue(); + } + + public int size(){ + return q1.size()+q2.size(); + } + + public boolean isEmpty(){ + return q1.size()+q2.size()==0; + } +} diff --git a/group12/2258659044/zj-2017/src/com/coding/basic/stack/TwoStackInOneArray.java b/group12/2258659044/zj-2017/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..9c00bfbbbb --- /dev/null +++ b/group12/2258659044/zj-2017/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,127 @@ +package com.coding.basic.stack; + +import java.util.EmptyStackException; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @@author zj + * + */ +public class TwoStackInOneArray { + + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2=data.length-1; + + /*扩容因子*/ + private static final int FACTOR = 10; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + + if(index1-1==index2){ + grow(); + } + data[index1++] = o; + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + + rangeCheck(index1); + + return data[--index1]; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + + rangeCheck(index1); + + int popIndex = index1-1; + + return data[popIndex]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + + if(index2+1==index1){ + grow(); + } + data[index2--] = o; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + + rangeCheck(index2); + + return data[++index2]; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + + rangeCheck(index2); + + int popIndex = index2+1; + + return data[popIndex]; + } + + /** + * 扩容 + */ + private void grow(){ + + //原来数组长度 + int origLen = data.length; + + //扩容后现在的长度 + int curLen = origLen+FACTOR; + + //栈2中数据个数 + + int num = origLen - index2-1; + + //新建临时数组 + Object[] temp = new Object[curLen]; + + //将栈1的内容拷贝到新数组中 + System.arraycopy(data, 0, temp, 0, index1); + + //将栈2的内容拷贝到新数组中 + System.arraycopy(data, index1, temp,curLen-num , num); + + //更新index2与数组 + this.index2 = curLen-num-1; + this.data = temp; + } + + private void rangeCheck(int index){ + + if(index==0||index == data.length-1){ + throw new EmptyStackException(); + } + } + +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java index 98b79b3b6b..edc13f5ba6 100644 --- a/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/BinaryTreeTest.java @@ -10,20 +10,21 @@ public class BinaryTreeTest { - BinaryTree tree ; + BinaryTree tree ; @Before public void setup() { - tree = new BinaryTree(); + tree = new BinaryTree<>(); Assert.assertEquals(tree.getRoot(), null); tree.insert(5); tree.insert(2); tree.insert(7); tree.insert(1); tree.insert(6); + } - @SuppressWarnings("unchecked") + @Test public void insert(){ @@ -36,7 +37,7 @@ public void insert(){ Assert.assertEquals((int)node2.getParent().getLeft().getData(), 6); } - @Test + //@Test public void traversal(){ insert(); diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/QuickMinStackTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..8e48a74f20 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/QuickMinStackTest.java @@ -0,0 +1,60 @@ +package test.com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.QuickMinStack; + +public class QuickMinStackTest { + + QuickMinStack stack ; + @Before + public void setUp() throws Exception { + + stack = new QuickMinStack<>(); + } + + @Test + public void testPush() { + + for (int i = 0; i < 15; i++) { + stack.push(i); + } + Assert.assertEquals(14, (int)stack.pop()); + } + + @Test + public void testPop() { + + for (int i = 0; i < 10; i++) { + stack.push(i); + } + for (int i = 9; i >= 0; i--) { + Assert.assertEquals(i, (int)stack.pop()); + } + } + + @Test + public void testFindMin() { + + for (int i = 5; i < 15; i++) { + stack.push(i); + } + Assert.assertEquals(5, (int)stack.findMin()); + + stack.push(5); + stack.push(3); + stack.push(4); + + stack.pop(); + Assert.assertEquals(3, (int)stack.findMin()); + + stack.pop(); + Assert.assertEquals(5, (int)stack.findMin()); + + stack.pop(); + Assert.assertEquals(5, (int)stack.findMin()); + } + +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackWithTwoQueuesTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..8ff6dc83de --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,72 @@ +package test.com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.StackWithTwoQueues; + +public class StackWithTwoQueuesTest { + + StackWithTwoQueues stack; + + @Before + public void setUp() throws Exception { + + stack = new StackWithTwoQueues<>(); + } + + @Test + public void testPush() { + + stack.push(123); + Assert.assertEquals(1, stack.size()); + + stack.push("zj"); + stack.push('Y'); + Assert.assertEquals(3, stack.size()); + + } + + @Test + public void testPop() { + + stack.push(123); + stack.push("zj"); + Assert.assertEquals("zj", stack.pop()); + Assert.assertEquals(1, stack.size()); + + stack.push('H'); + stack.push('Y'); + Assert.assertEquals('Y', stack.pop()); + Assert.assertEquals(2, stack.size()); + + } + + @Test + public void testSize() { + + Assert.assertEquals(0, stack.size()); + + stack.push("zj"); + stack.push('H'); + stack.push('y'); + Assert.assertEquals(3, stack.size()); + + stack.pop(); + Assert.assertEquals(2, stack.size()); + } + + @Test + public void testIsEmpty() { + + Assert.assertEquals(true, stack.isEmpty()); + + stack.push("zj"); + stack.push('H'); + stack.push('y'); + + Assert.assertEquals(false, stack.isEmpty()); + } + +} diff --git a/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/TwoStackInOneArrayTest.java b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..377dcf8286 --- /dev/null +++ b/group12/2258659044/zj-2017/src/test/com/coding/basic/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,130 @@ +package test.com.coding.basic.stack; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coding.basic.stack.TwoStackInOneArray; + +public class TwoStackInOneArrayTest { + + + TwoStackInOneArray stack; + + @Before + public void setUp() throws Exception { + + stack = new TwoStackInOneArray(); + } + + //@Test(expected = EmptyStackException.class) + public void testPush1() { + + stack.push1("zj"); + Assert.assertEquals("zj", stack.peek1()); + + stack.push1("hy"); + Assert.assertEquals("hy", stack.peek1()); + + stack.pop1(); + stack.pop1(); + + stack.peek1(); + } + + //@Test(expected = EmptyStackException.class) + public void testPop1() { + + stack.push1("zj"); + Assert.assertEquals("zj", stack.pop1()); + stack.pop1(); + + } + + //@Test + public void testPeek1() { + + stack.push1("zj"); + Assert.assertEquals("zj", stack.peek1()); + + stack.push1("hh"); + stack.push1("hy"); + Assert.assertEquals("hy", stack.peek1()); + + } + + //@Test(expected = EmptyStackException.class) + public void testPush2() { + + stack.push2("zj"); + Assert.assertEquals("zj", stack.peek2()); + + stack.push2("hy"); + Assert.assertEquals("hy", stack.peek2()); + + stack.pop2(); + stack.pop2(); + + stack.peek2(); + } + + //@Test(expected = EmptyStackException.class) + public void testPop2() { + + stack.push2("zj"); + Assert.assertEquals("zj", stack.pop2()); + stack.pop2(); + } + + //@Test + public void testPeek2() { + + stack.push2("zj"); + Assert.assertEquals("zj", stack.peek2()); + + stack.push2("hh"); + stack.push2("hy"); + Assert.assertEquals("hy", stack.peek2()); + } + + @Test + public void testGrow() throws Exception{ + + for (int i = 0; i < 5; i++) { + stack.push1(i); + } + + for (int i = 0; i < 5; i++) { + stack.push2(i); + } + Assert.assertEquals(4, stack.peek1()); + Assert.assertEquals(4, stack.peek2()); + + //重置栈 + setUp(); + for (int i = 0; i < 11; i++) { + stack.push1(i); + } + Assert.assertEquals(10, stack.peek1()); + + setUp(); + for (int i = 0; i < 11; i++) { + stack.push2(i); + } + Assert.assertEquals(10, stack.peek2()); + + setUp(); + for (int i = 0; i < 5; i++) { + stack.push1(i); + } + for (int i = 0; i < 10; i++) { + stack.push2(i); + } + Assert.assertEquals(4, stack.peek1()); + Assert.assertEquals(9, stack.peek2()); + stack.pop1(); + stack.pop2(); + Assert.assertEquals(3, stack.peek1()); + Assert.assertEquals(8, stack.peek2()); + } +} From 70760b94b390dafe57b7b4d1ed81cb458543f8d8 Mon Sep 17 00:00:00 2001 From: ZhaoHongxin Date: Thu, 4 May 2017 23:07:02 +0800 Subject: [PATCH 399/552] JVM --- .../src/com/coderising/jvm/clz/ClassFile.java | 11 +- .../src/com/coderising/jvm/cmd/BiPushCmd.java | 12 +- .../coderising/jvm/cmd/ByteCodeCommand.java | 43 +++++- .../com/coderising/jvm/cmd/GetFieldCmd.java | 17 ++- .../coderising/jvm/cmd/GetStaticFieldCmd.java | 22 +++- .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 ++++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 66 ++++++++++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 23 ++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 22 ++++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 124 ++++++++++++++++++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 24 ++++ .../jvm/engine/ExecutionResult.java | 56 ++++++++ .../coderising/jvm/engine/ExecutorEngine.java | 73 +++++++++++ .../src/com/coderising/jvm/engine/Heap.java | 39 ++++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++++ .../com/coderising/jvm/engine/MethodArea.java | 87 ++++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 28 ++++ .../com/coderising/jvm/engine/StackFrame.java | 117 +++++++++++++++++ .../src/com/coderising/jvm/method/Method.java | 63 ++++++++- .../com/coderising/jvm/test/MiniJVMTest.java | 28 ++++ 20 files changed, 932 insertions(+), 17 deletions(-) create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/Heap.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/JavaObject.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/MethodArea.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/MiniJVM.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/StackFrame.java create mode 100644 group05/1094051862/mini-jvm/src/com/coderising/jvm/test/MiniJVMTest.java diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java index 2381d6f5f6..17fb2d2ec0 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -111,15 +111,6 @@ public Method getMethod(String methodName, String paramAndReturnType){ return null; } public Method getMainMethod(){ - for(Method m :methods){ - int nameIndex = m.getNameIndex(); - int descIndex = m.getDescriptorIndex(); - String name = this.getConstantPool().getUTF8String(nameIndex); - String desc = this.getConstantPool().getUTF8String(descIndex); - if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ - return m; - } - } - return null; + return getMethod("main", "([Ljava/lang/String;)V"); } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java index 8c15e1bd44..2b7a52240a 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -3,6 +3,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -17,7 +21,13 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOprandStack().push(jo); + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java index 85f6f637d4..820b3d6002 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -6,6 +6,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public abstract class ByteCodeCommand { @@ -14,6 +16,44 @@ public abstract class ByteCodeCommand { ClassFile clzFile; private int offset; + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + + private static Map codeMap = new HashMap(); static{ @@ -123,6 +163,7 @@ public String getReadableCodeText(){ } return txt; } + - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java index 4d989d6cbb..80a11e67c3 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -16,7 +20,16 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); + + } + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java index 9fb13677eb..232b053643 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -1,10 +1,12 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -20,4 +22,20 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + //TODO 处理非System.out的情况 + } + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java index 5ac3454be7..a7c6cca5e7 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -3,6 +3,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.MethodArea; +import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -18,6 +22,25 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + + } + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java index 303a64b4c7..24cb38789a 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -2,6 +2,12 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.MethodArea; +import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -16,7 +22,67 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if(isSystemOutPrintlnMethod(className,methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while(currentClassName != null){ + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + + break; + + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } + + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java index 00f9a5a699..8870f8fa65 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -4,6 +4,10 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -25,5 +29,24 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } + + } + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java index a43c8bd964..b40c77754f 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -1,7 +1,12 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -15,5 +20,22 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + int index = this.getIndex(); + + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + + String clzName = info.getClassName(); + + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); + + + } + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java index 92e5c4f3f1..4f3ab0fb5e 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -20,4 +24,124 @@ public int getLength(){ return 1; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + + + + } + } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java index 00b29e1fbc..aab9c27c2f 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -1,7 +1,13 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -15,5 +21,23 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/ExecutionResult.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..87ae484b01 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/ExecutorEngine.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..982ccff5fa --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,73 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); + + while(!stack.isEmpty()) { + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if(result.isPauseAndRunNewFrame()) { + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame, nextFrame); + + stack.push(nextFrame); + } else { + stack.pop(); + } + } + } + + + /** + * 将操作数栈中的操作数load到下一个方法栈的局部变量表中 + * @param currentFrame + * @param nextFrame + */ + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + Method nextMethod = nextFrame.getMethod(); + List paramList = nextMethod.getParameterList(); + //要把this也传递进去 + int paramNum = paramList.size() + 1; + + ArrayList values = new ArrayList(); + + while(paramNum>0) { + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + //倒序排列vlaues + ArrayList params = new ArrayList(); + + for(int i = values.size()-1; i>=0; i--) { + params.add(values.get(i)); + } + + nextFrame.setLocalVariableTable(params); + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/Heap.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..7df6548625 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/JavaObject.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..be6d3470be --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/MethodArea.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..fab7f88878 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,87 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if(m == null){ + + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + } +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/MiniJVM.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..9b7e92ebdc --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/method/Method.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/method/Method.java index 482f445ae3..0c7b13bd3e 100644 --- a/group05/1094051862/mini-jvm/src/com/coderising/jvm/method/Method.java +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/method/Method.java @@ -3,6 +3,9 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.cmd.ByteCodeCommand; +import java.util.ArrayList; +import java.util.List; + import javax.management.RuntimeErrorException; import com.coderising.jvm.attr.AttributeInfo; @@ -82,6 +85,64 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } - + + private String getParamAndReturnType(){ + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + public List getParameterList(){ + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } } diff --git a/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/MiniJVMTest.java b/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..842420f827 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coderising/jvm/test/MiniJVMTest.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = "E:\\practise\\group05\\1094051862\\mini-jvm\\bin"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + + } + +} From 63a5b69169516434bfd5a0d5b6e2bb028c0964aa Mon Sep 17 00:00:00 2001 From: thomas_young Date: Fri, 5 May 2017 07:59:41 +0800 Subject: [PATCH 400/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E5=B0=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/queue/Josephus.java | 2 +- .../basic/queue/QueueWithTwoStacks.java | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java index 9f70edd16d..955e074d70 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/Josephus.java @@ -23,7 +23,7 @@ public static List execute(int n, int m){ while (!circleQueue.isEmpty()) { Integer x = circleQueue.deQueue(); if (num == m) { - num = 1; // 杀死一个人,下一个人从1开始报数 + num = 1; // 如果数到m,则杀死该人,下一个人从1开始报数 result.add(x); } else { num++; diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacks.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacks.java index c936547f62..2ce1a5e7c6 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacks.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/queue/QueueWithTwoStacks.java @@ -9,8 +9,8 @@ * @param */ public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; + private Stack stack1; // stack1用来入队 + private Stack stack2; // stack2用来出对 public QueueWithTwoStacks() { @@ -19,7 +19,7 @@ public QueueWithTwoStacks() { } public boolean isEmpty() { - return stack1.isEmpty(); + return size() == 0; } private void move(Stack s1, Stack s2) { @@ -29,19 +29,27 @@ private void move(Stack s1, Stack s2) { } public int size() { - return stack1.size(); + return stack1.size() + stack2.size(); } public void enQueue(E item) { stack1.push(item); } - public E deQueue() { + public E deQueueV2() { move(stack1, stack2); E result = stack2.pop(); move(stack2, stack1); return result; } + // 只有当stack2为空时,才需要把stack1中的元素全部放到stack2中 + public E deQueue() { + if (stack2.isEmpty()) { + move(stack1, stack2); + } + return stack2.pop(); + } + } From 7275fc4cc873e367f610765765af5607e9a2a5c8 Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 09:36:29 +0800 Subject: [PATCH 401/552] =?UTF-8?q?=E7=AC=AC=E4=B8=83=E5=91=A8,=20JVM?= =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group11/1178243325/week07/.readme.md.swp | Bin 12288 -> 12288 bytes group11/1178243325/week07/readme.md | 4 +- .../com/sprint/datastructure/StackUtil.java | 127 ++++++++++++++++++ .../sprint/datastructure/StackUtilTest.java | 65 +++++++++ 4 files changed, 194 insertions(+), 2 deletions(-) create mode 100644 group11/1178243325/week07/src/main/java/com/sprint/datastructure/StackUtil.java create mode 100644 group11/1178243325/week07/src/test/java/com/sprint/datastructure/StackUtilTest.java diff --git a/group11/1178243325/week07/.readme.md.swp b/group11/1178243325/week07/.readme.md.swp index 3d7e4464a84ed43e0b59dc8f2f80c33ee769a7a0..0404364aff8e4caed53c577968eab16225ba1412 100644 GIT binary patch delta 122 zcmZojXh@JsG6?hZRWR2xVE_UF28Qr!+>s|@Ep3P}^Icwju8S9_Uo%O7zkwIBm;aSJT=d)U# WP1*LMZ~OZ_vltlivnR{xKLP;gI4(8- delta 101 zcmZojXh@JsG6?hZRWR2xVE_UF28OG5-b6HJ%P|OtZIpT?&$gG3fq|2MGM9p$kQ_e) zgDenp0Wl{KtMhMG6xhWlrL4@L%)p?mtnjR3;`3Q8&!%j9(YO8mo>>eGljZau0RY_O B9033T diff --git a/group11/1178243325/week07/readme.md b/group11/1178243325/week07/readme.md index cc9d7c6f3c..4907ae371a 100644 --- a/group11/1178243325/week07/readme.md +++ b/group11/1178243325/week07/readme.md @@ -6,7 +6,7 @@ - 实现StackUtil - [文章](http://www.jianshu.com/p/502c1e5caa97) ## 完成情况: - +ok ## 我的收获: - +其实最难是坚持 diff --git a/group11/1178243325/week07/src/main/java/com/sprint/datastructure/StackUtil.java b/group11/1178243325/week07/src/main/java/com/sprint/datastructure/StackUtil.java new file mode 100644 index 0000000000..cf6afb5b3c --- /dev/null +++ b/group11/1178243325/week07/src/main/java/com/sprint/datastructure/StackUtil.java @@ -0,0 +1,127 @@ +package com.sprint.datastructure; + +import java.util.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 stack = new Stack<>(); + while (!s.isEmpty()) { + stack.push(s.pop()); + } + + Stack stack1 = new Stack<>(); + while (!stack.isEmpty()) { + stack1.push(stack.pop()); + } + + while (!stack1.isEmpty()) { + s.push(stack1.pop()); + } + **/ + + if (s == null || s.isEmpty()) + return; + Stack tmp = new Stack<>(); + while (!s.isEmpty()) { + tmp.push(s.pop()); + } + while (!tmp.isEmpty()) { + Integer top = tmp.pop(); + addToBottom(s, top); + } + } + + private static void addToBottom(Stack s, Integer value) { + if (s.isEmpty()) { + s.push(value); + } else { + Integer top = s.pop(); + addToBottom(s, value); + s.push(top); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if (s == null || s.isEmpty()) + return; + + Stack tmp = new Stack(); + while (!s.isEmpty()) { + Object value = s.pop(); + if (!value.equals(o)) { + tmp.push(value); + } + } + + while (!tmp.isEmpty()) { + s.push(tmp.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + if (s == null || s.isEmpty() || len <= 0) { + return null; + } + Object[] objs = new Object[len]; + Stack tmp = new Stack(); + int count = 0; + while (!s.isEmpty() && count < len) { + Object top = s.pop(); + tmp.push(top); + objs[count++] = top; + } + + while (!tmp.isEmpty()) { + s.push(tmp.pop()); + } + return objs; + } + /** + * 字符串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){ + Stack stack = new Stack<>(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c == '(' || c == '[' || c == '{') { + stack.push(c); + } else if (c == ')') { + char topChar = stack.pop(); + if (topChar != '(') { + return false; + } + } else if (c == ']') { + char topChar = stack.pop(); + if (topChar != '[') { + return false; + } + } else if (c == '}') { + char topChar = stack.pop(); + if (topChar != '{') { + return false; + } + } + } + return stack.size() == 0; + } +} diff --git a/group11/1178243325/week07/src/test/java/com/sprint/datastructure/StackUtilTest.java b/group11/1178243325/week07/src/test/java/com/sprint/datastructure/StackUtilTest.java new file mode 100644 index 0000000000..86f9db1607 --- /dev/null +++ b/group11/1178243325/week07/src/test/java/com/sprint/datastructure/StackUtilTest.java @@ -0,0 +1,65 @@ +package com.sprint.datastructure; + +import java.util.Stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} From 5a8f829c5f12e8aac55676c12e42fd40d755da48 Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Fri, 5 May 2017 11:36:27 +0800 Subject: [PATCH 402/552] class loader , the fourth homework --- .../src/jvm/loader/ClassFileLoader.java | 140 ++++++++++++++++++ .../test/jvm/ClassFileloaderTest.java | 106 +++++++++++++ 2 files changed, 246 insertions(+) create mode 100644 group19/1294642551/src/jvm/loader/ClassFileLoader.java create mode 100644 group19/1294642551/test/jvm/ClassFileloaderTest.java diff --git a/group19/1294642551/src/jvm/loader/ClassFileLoader.java b/group19/1294642551/src/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..8e133e40cd --- /dev/null +++ b/group19/1294642551/src/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package jvm.loader; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + + +import 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 : clzPaths){ + String clzFileName = path + File.separatorChar + className; + byte[] codes = loadClassFile(clzFileName); + if(codes != null){ + return codes; + } + } + + return null; + + } + + private byte[] loadClassFile(String clzFileName) { + + try { + InputStream input = new FileInputStream(new File(clzFileName)); + return IOUtils.toByteArray(input); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } 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); + return null; + + } + + + + // ------------------------------backup------------------------ + public String getClassPath_V1(){ + + StringBuffer buffer = new StringBuffer(); + for(int i=0;i Date: Fri, 5 May 2017 12:59:44 +0800 Subject: [PATCH 403/552] add stackTestCase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加测试用例 --- .../coding2017/stack/QuickMinStackTest.java | 53 +++++++++++++ .../stack/StackWithTwoQueuesTest.java | 47 +++++++++++ .../stack/TwoStackInOneArrayTest.java | 79 +++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStackTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueuesTest.java create mode 100644 group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArrayTest.java diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStackTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..1c2f88e96f --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/QuickMinStackTest.java @@ -0,0 +1,53 @@ +package com.github.HarryHook.coding2017.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class QuickMinStackTest { + QuickMinStack stack; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void test() { + stack = new QuickMinStack(); + // 栈为空,抛出异常 + expectedEx.expect(Exception.class); + stack.pop(); + + stack.push(5); + stack.push(3); + stack.push(2); + stack.push(4); + stack.push(1); + assertEquals(1, stack.findMin()); + assertEquals(1, stack.pop()); + assertEquals(2, stack.findMin()); + assertEquals(4, stack.pop()); + assertEquals(2, stack.findMin()); + assertEquals(2, stack.pop()); + assertEquals(3, stack.findMin()); + assertEquals(3, stack.pop()); + assertEquals(5, stack.findMin()); + assertEquals(5, stack.pop()); + + expectedEx.expect(Exception.class); + stack.pop(); + + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueuesTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..87038ab3df --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,47 @@ +package com.github.HarryHook.coding2017.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import sun.java2d.StateTrackable; + +public class StackWithTwoQueuesTest { + StackWithTwoQueues stack; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void test() { + stack = new StackWithTwoQueues(); + // 栈为空,抛出异常 + expectedEx.expect(Exception.class); + stack.pop(); + + stack.push(1); + stack.push(2); + stack.push(3); + assertEquals(3, stack.pop()); + stack.push(43); + assertEquals(43, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(1, stack.pop()); + + expectedEx.expect(Exception.class); + stack.pop(); + } + +} diff --git a/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArrayTest.java b/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..d37c39d156 --- /dev/null +++ b/group02/727171008/src/com/github/HarryHook/coding2017/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,79 @@ +package com.github.HarryHook.coding2017.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class TwoStackInOneArrayTest { + TwoStackInOneArray stack; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void test() { + stack = new TwoStackInOneArray(); + stack.push1(3); + stack.push1(5); + stack.push1(6); + stack.push1(11); + assertEquals(11, stack.peek1()); + assertEquals(11, stack.pop1()); + assertEquals(6, stack.pop1()); + stack.push1(61); + assertEquals(61, stack.pop1()); + assertEquals(5, stack.pop1()); + assertEquals(3, stack.peek1()); + assertEquals(3, stack.pop1()); + // 栈1为空,抛出异常 + expectedEx.expect(Exception.class); + stack.pop1(); + + stack.push2(123); + stack.push2(1); + stack.push2(4); + + stack.push1(3); + stack.push1(5); + stack.push1(6); + + stack.push2(123); + stack.push2(1); + stack.push2(4); + stack.push2(12); + stack.push2(2); + stack.push2(8); + + assertEquals(6, stack.pop1()); + assertEquals(5, stack.peek1()); + assertEquals(5, stack.pop1()); + assertEquals(3, stack.pop1()); + + assertEquals(8, stack.pop2()); + assertEquals(2, stack.pop2()); + assertEquals(12, stack.pop2()); + assertEquals(4, stack.pop2()); + assertEquals(1, stack.pop2()); + assertEquals(123, stack.pop2()); + assertEquals(4, stack.pop2()); + assertEquals(1, stack.pop2()); + assertEquals(123, stack.pop2()); + // 栈2为空,抛出异常 + expectedEx.expect(Exception.class); + stack.pop2(); + + } + +} From 3d8e834e6a20dfeb905c3b6c8785e832501c8c78 Mon Sep 17 00:00:00 2001 From: orajavac Date: Fri, 5 May 2017 13:40:41 +0800 Subject: [PATCH 404/552] =?UTF-8?q?20170505=5F1340=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/QuickMinStack.java | 51 ++++++++ .../coding2017/basic/stack/Stack.java | 10 ++ .../basic/stack/StackWithTwoQueues.java | 45 +++++++ .../basic/stack/TwoStackInOneArray.java | 119 ++++++++++++++++++ 4 files changed, 225 insertions(+) create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/QuickMinStack.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackWithTwoQueues.java create mode 100644 group02/562768642/src/com/github/orajavac/coding2017/basic/stack/TwoStackInOneArray.java diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/QuickMinStack.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..8beb22287d --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/QuickMinStack.java @@ -0,0 +1,51 @@ +package com.github.orajavac.coding2017.basic.stack; + + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + private Stack s1 = new Stack(); + + private Stack s2 = new Stack(); + + private int min = 0; + + public void push(int data){ + if(s1.length() == 0){ + s1.push(data); + s2.push(data); + min = data; + }else{ + if (data <= min){ + s2.push(data); + min = data; + } + s1.push(data); + } + } + + public int pop(){ + Integer result = Integer.parseInt(s1.pop().toString()); + if (result == min){ + min = Integer.parseInt(s2.pop().toString()); + } + return result; + } + + public int findMin(){ + Integer min_ = Integer.parseInt(s2.pop().toString()); + s2.push(min_); + return min_; + } + + //测试使用,观察栈里元素 + public void toStrings(){ + System.out.println("s1 = "+s1.positiveToString()); + System.out.println("s2 = "+s2.positiveToString()); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java index 499b4a33e4..82b0ab9c74 100644 --- a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/Stack.java @@ -14,11 +14,17 @@ public Stack(){ l = new LRUPageFrame(); } + //栈使用 public void push(Object o){ //l.addFirst(o); l.add(o); } + //StackWithTwoQueues 使用 + public void push1(Object o){ + l.addFirst(o); + } + public Object pop(){ return l.remove(); } @@ -31,6 +37,10 @@ public String toString(){ return l.lastToString(); } + public String positiveToString(){ + return l.toString(); + } + public Object[] getElements(int len){ return l.getElements(len); } diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackWithTwoQueues.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..75a59c937d --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,45 @@ +package com.github.orajavac.coding2017.basic.stack; + + +/** + * (1)入栈:Q1:1,2,3,4入队列(相当于入栈); + (2)出栈:Q1:1,2,3出队列,Q2:1,2,3入队列;(此时Q1只剩4,正是我们要出栈的元素) + (3) + 1>入栈:Q1:5入队列(每次入栈都用Q1入队列实现,而不入队列Q2,这样会提高效率,后面会说到) + 2>出栈:判断:如果Q1队列不为空就用(1)(2)步的方法出栈最后一个元素。否则,出栈Q2队列的最后一个元素。 + * @author ora + * + */ +public class StackWithTwoQueues { + + private Stack q1 = new Stack(); + + private Stack q2 = new Stack(); + + public void push(int data) { + q1.push(data); + } + + public int pop() { + int len = q1.length(); + while(len != 1){ + q2.push(q1.popLow()); + len--; + } + int result = Integer.parseInt(q1.popLow().toString()); + + //再push回去 + len = q2.length(); + while(len != 0){ + q1.push(q2.popLow()); + len--; + } + return result; + } + + //测试使用,观察栈里元素 + public String toString(){ + System.out.println(q1.positiveToString()); + return q1.positiveToString(); + } +} diff --git a/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/TwoStackInOneArray.java b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..44629b2144 --- /dev/null +++ b/group02/562768642/src/com/github/orajavac/coding2017/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,119 @@ +package com.github.orajavac.coding2017.basic.stack; + + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + //栈顶指针1 + private int front = 0; + //栈顶指针2 + private int rear = data.length-1; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + if (data[front] == null){ + data[front] = o; + front++; + }else{ + grow(data,10); + data[front] = o; + front++; + } + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + Object o = null; + if (front !=0 ){ + front--; + o = data[front]; + data[front] = null; + }else{ + throw new RuntimeException("栈底已经没有元素了"); + } + return o; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return data[front-1]; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + if (data[rear] == null){ + data[rear] = o; + rear--; + }else{ + grow(data,10); + data[rear] = o; + rear--; + } + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + Object o = null; + if (rear !=data.length-1 ){ + rear++; + o = data[rear]; + data[rear] = null; + }else{ + throw new RuntimeException("栈底已经没有元素了"); + } + return o; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return data[rear+1]; + } + + public void grow(Object[] elementData,int size){ + Object[] target = new Object[size+elementData.length]; + int n = target.length; + int m = 0; + for (int i=0;i Date: Fri, 5 May 2017 14:09:00 +0800 Subject: [PATCH 405/552] =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E5=91=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group24/.gitignore | 2 +- .../dataStructure/stack/QuickMinStack.java | 32 +++++ .../stack/StackWithTwoQueues.java | 50 +++++++ .../stack/TwoStackInOneArray.java | 130 ++++++++++++++++++ .../java/data_structure/stack/StackTest.java | 54 +++++++- 5 files changed, 265 insertions(+), 3 deletions(-) create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/QuickMinStack.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackWithTwoQueues.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java diff --git a/group24/.gitignore b/group24/.gitignore index 2a5296f902..313344c8f2 100644 --- a/group24/.gitignore +++ b/group24/.gitignore @@ -1,4 +1,4 @@ -*.class +#*.class # Mobile Tools for Java (J2ME) .mtj.tmp/ diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/QuickMinStack.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/QuickMinStack.java new file mode 100644 index 0000000000..9827a6afa5 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/QuickMinStack.java @@ -0,0 +1,32 @@ +package basic.dataStructure.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + Stack s = null; + + private int min = -1; + + public QuickMinStack(){ + s = new Stack(); + } + + public void push(int data){ + if(s.isEmpty()){ + this.min = data; + }else this.min = data < min ? data : min; + + s.push(data); + } + public int pop(){ + return (Integer)s.pop(); + } + public int findMin(){ + return this.min; + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackWithTwoQueues.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..6d7b46b930 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/StackWithTwoQueues.java @@ -0,0 +1,50 @@ +package basic.dataStructure.stack; + +import basic.dataStructure.queue.Queue; + +/** + * 用两个队列实现一个栈 + */ +public class StackWithTwoQueues { + + Queue queue1 = null; + Queue queue2 = null; + + private int data = -1; + + public StackWithTwoQueues(){ + queue1 = new Queue(); + queue2 = new Queue(); + } + public void push(int data) { + queue1.enQueue(data); + } + + public int pop() { + move(); + return this.data; + } + + + /** + * queue1是数据保存队列, queue2是缓存队列 + * 每次取之前将queue1的n-1个数据移动至queue2 + * 取出queue的最后一个数据即可 + */ + private void move(){ + if(queue2.isNotEmpty()){ + throw new RuntimeException("queue2 is not empty, operation aborted"); + } + + int size = queue1.size(); + for(int i = 0; i < size - 1; i++){ + queue2.enQueue(queue1.deQueue()); + } + + data = (Integer)queue1.deQueue(); + + for(int i = 0; i < size - 1; i++){ + queue1.enQueue(queue2.deQueue()); + } + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..a07ad44f5a --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java @@ -0,0 +1,130 @@ +package basic.dataStructure.stack; + +import java.util.Arrays; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底, + * 压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = 9; + + private int size1 = 0; + private int size2 = 0; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + data[index1] = o; + this.index1 ++; + this.size1 += 1; + + if(size1 + size2 >= data.length) extend(); + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + int index = index1 - 1; + Object obj = data[index]; + //直接置空 + data[index] = null; + this.index1 = index; + this.size1 --; + return obj; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + int index = index1 - 1; + Object obj = data[index]; + + return obj; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + data[index2] = o; + index2 --; + this.size2 += 1; + + if(size1 + size2 >= data.length) extend(); + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + int index = index2 + 1; + Object obj = data[index]; + + data[index] = null; + this.index2 = index; + this.size2--; + return obj; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + int index = index2 + 1; + Object obj = data[index]; + return obj; + } + + public int size1(){ + return this.size1; + } + + public int size2(){ + return this.size2; + } + + /** + * 扩容 + */ + private void extend(){ + int size = data.length; + int extendSize = 10; + Object[] extended = new Object[size + extendSize]; + + //stack1 + //因为指针在数据添加后已经加上了,所以要减回去 + for(int i = 0; i < index1; i++){ + extended[i] = data[i]; + } + + //stack2 + //因为指针在添加后已经减掉了1,所以要加回去 + for(int i = index2 + 1; i <= size - 1; i++){ + int index = i + extendSize; + extended[index] = data[i]; + } + this.data = extended; + this.index2 += extendSize; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Arrays.toString(this.data)); + + return sb.toString(); + } +} \ No newline at end of file diff --git a/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java b/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java index 9c08fb031e..cbb1fbbe5e 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java @@ -1,7 +1,6 @@ package data_structure.stack; -import basic.dataStructure.stack.Stack; -import basic.dataStructure.stack.StackUtil; +import basic.dataStructure.stack.*; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -39,4 +38,55 @@ public void test2(){ } + /** + * QuickMinStack + * + * StackWithTwoQueues + * + * TwoStackInOneArray + */ + @Test + public void test3(){ + //QuickMinStack + { + QuickMinStack qms = new QuickMinStack(); + qms.push(0); + qms.push(-2); + qms.push(10); + Assert.assertEquals(-2, qms.findMin()); + } + //StackWithTwoQueues + { + StackWithTwoQueues stack = new StackWithTwoQueues(); + stack.push(0); + stack.push(2); + stack.push(5); + stack.push(10); + Assert.assertEquals(10, stack.pop()); + } + //TwoStackInOneArray + { + TwoStackInOneArray stack = new TwoStackInOneArray(); + for(int i = 0; i < 7; i++){ + stack.push1(i); + } + + for(int i = 0; i < 8; i++){ + stack.push2(i); + } + System.out.println("size1 ->" + stack.size1()); + System.out.println("size2 ->" + stack.size2()); + System.out.println("stack -> " + stack.toString()); + + Assert.assertEquals(stack.peek1(), 6); + Assert.assertEquals(stack.peek2(), 7); + + Assert.assertEquals(stack.pop1(), 6); + Assert.assertEquals(stack.size1(), 6); + + Assert.assertEquals(stack.pop2(), 7); + Assert.assertEquals(stack.size2(), 7); + } + } + } From 6ea81186e7de85dcdeea7bd7e3666b67e21ecfc1 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 5 May 2017 14:09:20 +0800 Subject: [PATCH 406/552] =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group24/75939388/.gitignore | 2 +- .../com/coderising/jvm/test/EmployeeV1.class | Bin 0 -> 1056 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 group24/75939388/learning2017/resources/classes/com/coderising/jvm/test/EmployeeV1.class diff --git a/group24/75939388/.gitignore b/group24/75939388/.gitignore index 596bd7346d..4923f59d8c 100644 --- a/group24/75939388/.gitignore +++ b/group24/75939388/.gitignore @@ -1,4 +1,4 @@ -*.class +#*.class target/ *.iml .idea/ \ No newline at end of file diff --git a/group24/75939388/learning2017/resources/classes/com/coderising/jvm/test/EmployeeV1.class b/group24/75939388/learning2017/resources/classes/com/coderising/jvm/test/EmployeeV1.class new file mode 100644 index 0000000000000000000000000000000000000000..c6c3c4a41546ae14b237a06a8f0868a61dc42cf5 GIT binary patch literal 1056 zcmah|?M@Rx6g^W)Kb93rYikjZ1yTEftSIUa3<)tBNGh6Onh<{tWrEx6cAM^&q>rTu zkZ9rq_)x|((;~rQ%x-4yow@hibI!Cse|`G_U=uIWNC>R7!oY2X$ExQ=UgyMZp9XHM zqS$>Cbp3FkRC6PZq(H7MPo?Wimb^b|t5z(K?8ra~_q~rjsJ@y*L0-feIuoK14Yd+#flv*C|NO#Gm#wZD&G&YSj18q z_pbSKFo zqck206pYW;F>F*&ri8AB^*dx3NROXV<zW&u2{pkVSAq|3&P2R7ekXatSzM=>9r9e) z&D1Vn*Xm~s7S1sH#WWPS=8@!@h zoMZKGYDKn`44lmtZNyM;7FE Date: Fri, 5 May 2017 14:10:46 +0800 Subject: [PATCH 407/552] =?UTF-8?q?=E6=94=B9=E5=9B=9Egitignore=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group24/.gitignore | 2 +- group24/75939388/.gitignore | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/group24/.gitignore b/group24/.gitignore index 313344c8f2..2a5296f902 100644 --- a/group24/.gitignore +++ b/group24/.gitignore @@ -1,4 +1,4 @@ -#*.class +*.class # Mobile Tools for Java (J2ME) .mtj.tmp/ diff --git a/group24/75939388/.gitignore b/group24/75939388/.gitignore index 4923f59d8c..596bd7346d 100644 --- a/group24/75939388/.gitignore +++ b/group24/75939388/.gitignore @@ -1,4 +1,4 @@ -#*.class +*.class target/ *.iml .idea/ \ No newline at end of file From 3cc3bb6d709b83c1f606ae7949d872c900709e35 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 5 May 2017 14:25:17 +0800 Subject: [PATCH 408/552] =?UTF-8?q?=E9=87=8D=E5=86=99toString?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stack/TwoStackInOneArray.java | 266 ++++++++++-------- .../java/data_structure/stack/StackTest.java | 2 +- 2 files changed, 147 insertions(+), 121 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java index a07ad44f5a..964da94e7e 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java @@ -1,130 +1,156 @@ package basic.dataStructure.stack; -import java.util.Arrays; - /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底, * 压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 - * @author liuxin * + * @author liuxin */ public class TwoStackInOneArray { - Object[] data = new Object[10]; - - private int index1 = 0; - private int index2 = 9; - - private int size1 = 0; - private int size2 = 0; - - /** - * 向第一个栈中压入元素 - * @param o - */ - public void push1(Object o){ - data[index1] = o; - this.index1 ++; - this.size1 += 1; - - if(size1 + size2 >= data.length) extend(); - } - /** - * 从第一个栈中弹出元素 - * @return - */ - public Object pop1(){ - int index = index1 - 1; - Object obj = data[index]; - //直接置空 - data[index] = null; - this.index1 = index; - this.size1 --; - return obj; - } - - /** - * 获取第一个栈的栈顶元素 - * @return - */ - - public Object peek1(){ - int index = index1 - 1; - Object obj = data[index]; - - return obj; - } - /* - * 向第二个栈压入元素 - */ - public void push2(Object o){ - data[index2] = o; - index2 --; - this.size2 += 1; - - if(size1 + size2 >= data.length) extend(); - } - /** - * 从第二个栈弹出元素 - * @return - */ - public Object pop2(){ - int index = index2 + 1; - Object obj = data[index]; - - data[index] = null; - this.index2 = index; - this.size2--; - return obj; - } - /** - * 获取第二个栈的栈顶元素 - * @return - */ - - public Object peek2(){ - int index = index2 + 1; - Object obj = data[index]; - return obj; - } - - public int size1(){ - return this.size1; - } - - public int size2(){ - return this.size2; - } - - /** - * 扩容 - */ - private void extend(){ - int size = data.length; - int extendSize = 10; - Object[] extended = new Object[size + extendSize]; - - //stack1 - //因为指针在数据添加后已经加上了,所以要减回去 - for(int i = 0; i < index1; i++){ - extended[i] = data[i]; - } - - //stack2 - //因为指针在添加后已经减掉了1,所以要加回去 - for(int i = index2 + 1; i <= size - 1; i++){ - int index = i + extendSize; - extended[index] = data[i]; - } - this.data = extended; - this.index2 += extendSize; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(Arrays.toString(this.data)); - - return sb.toString(); - } + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = 9; + + private int size1 = 0; + private int size2 = 0; + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + data[index1] = o; + this.index1++; + this.size1 += 1; + + if (size1 + size2 >= data.length) extend(); + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + int index = index1 - 1; + Object obj = data[index]; + //直接置空 + data[index] = null; + this.index1 = index; + this.size1--; + return obj; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + int index = index1 - 1; + Object obj = data[index]; + + return obj; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + data[index2] = o; + index2--; + this.size2 += 1; + + if (size1 + size2 >= data.length) extend(); + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + int index = index2 + 1; + Object obj = data[index]; + + data[index] = null; + this.index2 = index; + this.size2--; + return obj; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + int index = index2 + 1; + Object obj = data[index]; + return obj; + } + + public int size1() { + return this.size1; + } + + public int size2() { + return this.size2; + } + + /** + * 扩容 + */ + private void extend() { + int size = data.length; + int extendSize = 10; + Object[] extended = new Object[size + extendSize]; + + //stack1 + //因为指针在数据添加后已经加上了,所以要减回去 + for (int i = 0; i < index1; i++) { + extended[i] = data[i]; + } + + //stack2 + //因为指针在添加后已经减掉了1,所以要加回去 + for (int i = index2 + 1; i <= size - 1; i++) { + int index = i + extendSize; + extended[index] = data[i]; + } + this.data = extended; + this.index2 += extendSize; + } + + @Override + public String toString() { + + StringBuilder sb = new StringBuilder(); + sb.append("stack1 -> ["); + for (int i = index1 - 1; i >= 0; i--) { + sb.append(data[i]); + if (i == 0) { + sb.append("]"); + } else { + sb.append(","); + } + } + + sb.append("\nstack2 -> ["); + int length = data.length; + for (int i = index2 + 1; i < length; i++) { + sb.append(data[i]); + if (i == length - 1){ + sb.append("]"); + } else { + sb.append(","); + } + } + return sb.toString(); + } } \ No newline at end of file diff --git a/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java b/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java index cbb1fbbe5e..8656e4df25 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java @@ -76,7 +76,7 @@ public void test3(){ } System.out.println("size1 ->" + stack.size1()); System.out.println("size2 ->" + stack.size2()); - System.out.println("stack -> " + stack.toString()); + System.out.println(stack.toString()); Assert.assertEquals(stack.peek1(), 6); Assert.assertEquals(stack.peek2(), 7); From baea2f682f6af22bfaab20a5dd3d7916eee0e84a Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 5 May 2017 14:33:53 +0800 Subject: [PATCH 409/552] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/basic/dataStructure/stack/TwoStackInOneArray.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java index 964da94e7e..3123b17760 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/TwoStackInOneArray.java @@ -113,7 +113,7 @@ private void extend() { //stack1 //因为指针在数据添加后已经加上了,所以要减回去 - for (int i = 0; i < index1; i++) { + for (int i = 0; i <= index1 - 1; i++) { extended[i] = data[i]; } From e5ab1a891be1a6b6bb1fff7d8fed5d62d9b6608d Mon Sep 17 00:00:00 2001 From: kai Date: Fri, 5 May 2017 15:07:12 +0800 Subject: [PATCH 410/552] =?UTF-8?q?JVM=E7=AC=AC5=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=8F=8A=E7=AC=AC6=E6=AC=A1=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coderising/jvm/attr/CodeAttr.java | 47 +++-- .../com/coderising/jvm/clz/ClassFile.java | 25 ++- .../com/coderising/jvm/cmd/BiPushCmd.java | 30 ++++ .../coderising/jvm/cmd/ByteCodeCommand.java | 152 ++++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 164 ++++++++++++++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 35 ++++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 39 +++++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 44 +++++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 86 +++++++++ .../com/coderising/jvm/cmd/LdcCmd.java | 50 ++++++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 38 ++++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 146 ++++++++++++++++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 +++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 44 +++++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 66 +++++++ .../coderising/jvm/constant/ClassInfo.java | 6 +- .../coderising/jvm/constant/ConstantInfo.java | 13 +- .../coderising/jvm/constant/ConstantPool.java | 6 +- .../coderising/jvm/constant/FieldRefInfo.java | 6 +- .../jvm/constant/MethodRefInfo.java | 10 +- .../jvm/constant/NameAndTypeInfo.java | 8 +- .../jvm/constant/NullConstantInfo.java | 6 +- .../coderising/jvm/constant/StringInfo.java | 8 +- .../com/coderising/jvm/constant/UTF8Info.java | 7 +- .../jvm/engine/ExecutionResult.java | 55 ++++++ .../coderising/jvm/engine/ExecutorEngine.java | 80 +++++++++ .../com/coderising/jvm/engine/Heap.java | 39 +++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++ .../com/coderising/jvm/engine/MethodArea.java | 90 ++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 48 +++++ .../com/coderising/jvm/engine/StackFrame.java | 127 ++++++++++++++ .../jvm/loader/ClassFileLoader.java | 5 +- .../com/coderising/jvm/method/Method.java | 82 ++++++++- .../jvm/print/ClassFilePrinter.java | 46 +++++ .../jvm/print/ConstantPoolPrinter.java | 25 +++ .../jvm/test/ClassFileloaderTest.java | 85 ++++++++- .../com/coderising/jvm/test/MiniJVMTest.java | 29 ++++ .../src/com/coding/basic/Queue.java | 31 ---- .../com/coding/basic/queue/CircleQueue.java | 49 ++++++ .../src/com/coding/basic/queue/Josephus.java | 38 ++++ .../com/coding/basic/queue/JosephusTest.java | 27 +++ .../src/com/coding/basic/queue/Queue.java | 71 ++++++++ .../basic/queue/QueueWithTwoStacks.java | 54 ++++++ .../com/coding/basic/stack/QuickMinStack.java | 57 ++++++ .../basic/stack/StackWithTwoQueues.java | 66 +++++++ .../basic/stack/TwoStackInOneArray.java | 134 ++++++++++++++ .../basic/stack/expression/InfixExpr.java | 80 +++++++++ .../basic/stack/expression/InfixExprTest.java | 52 ++++++ .../stack/expression/InfixToPostfix.java | 49 ++++++ .../basic/stack/expression/PostfixExpr.java | 87 ++++++++++ .../stack/expression/PostfixExprTest.java | 42 +++++ .../basic/stack/expression/PrefixExpr.java | 87 ++++++++++ .../stack/expression/PrefixExprTest.java | 45 +++++ .../coding/basic/stack/expression/Token.java | 56 ++++++ .../basic/stack/expression/TokenParser.java | 57 ++++++ .../stack/expression/TokenParserTest.java | 40 +++++ 56 files changed, 2891 insertions(+), 76 deletions(-) create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/engine/Heap.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/engine/JavaObject.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/engine/MethodArea.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/engine/MiniJVM.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/engine/StackFrame.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group06/1378560653/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java delete mode 100644 group06/1378560653/src/com/coding/basic/Queue.java create mode 100644 group06/1378560653/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group06/1378560653/src/com/coding/basic/queue/Josephus.java create mode 100644 group06/1378560653/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group06/1378560653/src/com/coding/basic/queue/Queue.java create mode 100644 group06/1378560653/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/TwoStackInOneArray.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/InfixExpr.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/InfixExprTest.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/InfixToPostfix.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/PostfixExpr.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/PostfixExprTest.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/PrefixExpr.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/PrefixExprTest.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/Token.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/TokenParser.java create mode 100644 group06/1378560653/src/com/coding/basic/stack/expression/TokenParserTest.java diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java index f9292d0dcb..4580b092ea 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/attr/CodeAttr.java @@ -1,6 +1,8 @@ package com.coderising.jvm.attr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -14,21 +16,21 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code /*ByteCodeCommand[] cmds*/) { + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; - //this.cmds = cmds; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -39,12 +41,6 @@ public void setLocalVariableTable(LocalVariableTable t) { this.localVarTable = t; } - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int attrNameIndex = iter.nextU2ToInt(); @@ -53,13 +49,12 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int maxLocals = iter.nextU2ToInt(); int codeLen = iter.nextU4ToInt(); - String code = iter.nextUxToHexString(codeLen); + String code = iter.nextUxToHexString(codeLen); - System.out.println(code); - //ByteCodeCommand[] cmds = ByteCodeCommand.parse(clzFile,code); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile,code); - CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code); + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen, maxStack,maxLocals,codeLen,code,cmds); int exceptionTableLen = iter.nextU2ToInt(); //TODO 处理exception @@ -69,6 +64,7 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ } + int subAttrCount = iter.nextU2ToInt(); for(int x=1; x<=subAttrCount; x++){ @@ -104,18 +100,17 @@ else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); - buffer.append("Code:").append(code).append("\n"); - /*for(int i=0;i fields = new ArrayList(); private List methods = new ArrayList(); @@ -80,13 +80,32 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + public Method getMethod(String methodName, String paramAndReturnType){ + + for(Method m :methods){ + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + public Method getMainMethod(){ + return getMethod("main","([Ljava/lang/String;)V"); + } } diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..e7c3dcaec8 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOprandStack().push(jo); + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..6b8f2e6348 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,152 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/CommandParser.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..0cf09d34fa --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,164 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if((codes == null) || (codes.length() == 0) || (codes.length() % 2 )!=0 ) { + throw new RuntimeException("the original code is not correct."); + } //为什么必须是偶数呢? + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); //iter是codes的一个迭代器 + List cmds = new ArrayList(); + + while(iter.hasNext()){ + String opCode = iter.next2CharAsString(); + + if(opCode.equals(new_object)){ + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (opCode.equals(invokespecial)){ + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (opCode.equals(invokevirtual)){ + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (opCode.equals(getfield)){ + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (opCode.equals(getstatic)){ + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (opCode.equals(putfield)){ + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (opCode.equals(ldc)){ + LdcCmd cmd = new LdcCmd(clzFile, opCode); + + cmd.setOperand(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (opCode.equals(bipush)){ + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + + cmd.setOperand(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("sorry, the java instruction "+opCode+"has not been implemented."); + } + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); //list.toArray(array); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..317f44e5bb --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,35 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); + } + + +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..8c6b929ea5 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + //TODO 处理非System.out的情况 + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..bd2a47040f --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,44 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.MethodArea; +import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + + } + + +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..d38cc283c8 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,86 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.MethodArea; +import com.coderising.jvm.engine.StackFrame; +import com.coderising.jvm.method.Method; + + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } + + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if(isSystemOutPrintlnMethod(className,methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while(currentClassName != null){ + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + + break; + + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } + + +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..5c3978777d --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + ConstantInfo info = getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + public void execute(StackFrame frame,ExecutionResult result){ + + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } + + + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..5b4de098e0 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,38 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsClassInfo(); + } + public void execute(StackFrame frame,ExecutionResult result){ + + int index = this.getIndex(); + + ClassInfo info = (ClassInfo) this.getConstantInfo(index); + + String clzName = info.getClassName(); + + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + //压入操作数栈顶 + frame.getOprandStack().push(jo); + + } + +} + + diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..e2691a0276 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,146 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString() { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + + + } + + + public int getLength(){ + return 1; + } + +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..d7ae70e32f --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..43a628302b --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,44 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + + } + + + +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..0f5329a77b --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,66 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ClassInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ClassInfo.java index aea9048ea4..ff85582159 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ClassInfo.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ClassInfo.java @@ -21,4 +21,8 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } -} + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java index 466b072244..4066e59fc4 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantInfo.java @@ -26,4 +26,15 @@ public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } -} + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantPool.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantPool.java index 86c0445695..b9cc66616b 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantPool.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/ConstantPool.java @@ -23,7 +23,9 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } -} + + +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java index 65475e194c..5765ee14aa 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,4 +51,8 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } -} + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java index 7f05870020..971f7a5e21 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/MethodRefInfo.java @@ -1,5 +1,8 @@ package com.coderising.jvm.constant; +import java.util.ArrayList; +import java.util.List; + public class MethodRefInfo extends ConstantInfo { private int type = ConstantInfo.METHOD_INFO; @@ -49,7 +52,12 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } -} +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java index 402f9dec86..25dbc21e7c 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,10 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } -} + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java index 936736016f..7782d6e61b 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } -} +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/StringInfo.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/StringInfo.java index f1f8eb4ed4..f28a5502c5 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/StringInfo.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } -} +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/UTF8Info.java b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/UTF8Info.java index 5cac9f04f7..0bae70ca3c 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/constant/UTF8Info.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/constant/UTF8Info.java @@ -26,7 +26,12 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } -} +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/engine/ExecutionResult.java b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..4a6da2b702 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,55 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..a565b461ad --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,80 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); + + while(!stack.empty()){ + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if(result.isPauseAndRunNewFrame()){ + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame,nextFrame); + + stack.push(nextFrame); + + } else { + + stack.pop(); + + } + } + + } + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + Method nextMethod = nextFrame.getMethod(); + + + List paramList = nextMethod.getParameterList(); + + /* + * 把当前函数栈帧中的变量传递下一个函数栈帧局部变量表,相当于设置下一个函数栈帧的局部变量表,这个局部变量表的顺序相当于将栈右倒。 + * 加上1 是因为要把this也传递过去 + * init(name,age)->init(object(this),name,age) + */ + int paramNum = paramList.size() + 1; + + + List values = new ArrayList(); + + //数据结构知识: 从栈中取出栈顶的x个元素 + while(paramNum>0){ + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + //数据结构知识: 把一个列表倒序排列 + List params = new ArrayList(); + + for(int i=values.size()-1; i>=0 ;i--){ + params.add(values.get(i)); + } + + + nextFrame.setLocalVariableTable(params); + + } + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/engine/Heap.java b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..82ad210cef --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/engine/JavaObject.java b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..71ba382d9a --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/engine/MethodArea.java b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..42c90f5cfe --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,90 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + * 方法区: + * 1.存储类的数据,如字符串常量,数字常量,字段引用,方法引用,类引用及名称和类型 + * 2.存储方法字节码 + * + * 加载类到方法区: + * 将classloader加载到MethodArea + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); //HashMap + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + //非常简化的实现,类装载器可以是多个,这里简化实现 + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + ClassFile clz = this.findClassFile(className); + Method m = clz.getMethod(methodName, paramAndReturnType); + + if(m == null){ + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + return m; + } + + + public Method getMethod(MethodRefInfo methodRef){ + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + + } +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/engine/MiniJVM.java b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..e4571306cd --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,48 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + /* + * 一.模拟Java命令的输入: + * 1.加载:classpath + * 2.找到:classname,系统需要找到这个类的main方法,执行其字节码 + * + * 二.执行过程: + * 1.加载类,将类加载到方法区 + * -工具:ClassFileLoader + * -目的地:方法区(MethodArea) + * --1.存储类的数据,如字符串常量,数字常量,字段引用,方法引用,类引用及名称和类型 + * --2.存储方法字节码 + * 2.获取类的main方法 + * -从方法区找 + * 3.执行main方法的字节码 + * -字节码命令(Command命令) + * -栈帧(StackFrame):Command对象要访问栈帧中的操作数栈,局部变量表 + * -堆(Heap):存放对象 + * + */ + ClassFileLoader loader = new ClassFileLoader(); + for(int i = 0; i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java index 91b1068989..c75ee71a19 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/loader/ClassFileLoader.java @@ -15,11 +15,14 @@ public class ClassFileLoader { - /* + /* * 1.加载文件路径 * 2.加载.class文件 + * - clzFileName = classPath + "/" + className(.class文件) * 3.将.class文件转换为字节数组 + * - clzFileName->byte[] codes * 4.解析.class字节数组 + * - paser(codes) */ private List clzPaths = new ArrayList(); diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/method/Method.java b/group06/1378560653/mini-jvm/com/coderising/jvm/method/Method.java index f08312b396..1b9ff1260d 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/method/Method.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/method/Method.java @@ -1,6 +1,11 @@ package com.coderising.jvm.method; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; + +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.constant.ConstantPool; @@ -19,6 +24,7 @@ public class Method { private ClassFile clzFile; + public ClassFile getClzFile() { return clzFile; } @@ -37,6 +43,8 @@ public CodeAttr getCodeAttr() { public void setCodeAttr(CodeAttr code) { this.codeAttr = code; } + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { this.clzFile = clzFile; @@ -45,14 +53,18 @@ public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorInd this.descriptorIndex = descriptorIndex; } + + + + public String toString() { ConstantPool pool = this.clzFile.getConstantPool(); StringBuilder buffer = new StringBuilder(); - String name = pool.getUTF8String(nameIndex); + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - String desc = pool.getUTF8String(descriptorIndex); + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); buffer.append(name).append(":").append(desc).append("\n"); @@ -67,6 +79,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ int descIndex = iter.nextU2ToInt(); int attribCount = iter.nextU2ToInt(); + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); for( int j=1; j<= attribCount; j++){ @@ -87,4 +100,67 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return m ; } -} + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + + private String getParamAndReturnType(){ + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + public List getParameterList(){ + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } +} \ No newline at end of file diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java b/group06/1378560653/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..ec15d5a2e7 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,46 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "H:\\github\\coding2017\\group06\\1378560653\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} + diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java b/group06/1378560653/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..028161adc7 --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,25 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + + + + } +} diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java b/group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java index a43d684af8..01052e6d21 100644 --- a/group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/test/ClassFileloaderTest.java @@ -9,6 +9,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -201,7 +205,7 @@ public void testClassIndex(){ } /** - * 下面是第三次JVM课应实现的测试用例 + * 第三次JVM课应实现的测试用例 */ @Test public void testReadFields(){ @@ -271,7 +275,84 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } - + + /** + * 第四次JVM课应实现的测试用例 + */ + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + } diff --git a/group06/1378560653/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java b/group06/1378560653/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..69f5f7b80d --- /dev/null +++ b/group06/1378560653/mini-jvm/com/coderising/jvm/test/MiniJVMTest.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = "H:\\github\\coding2017\\group06\\1378560653\\bin"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + + } + +} diff --git a/group06/1378560653/src/com/coding/basic/Queue.java b/group06/1378560653/src/com/coding/basic/Queue.java deleted file mode 100644 index 7a82835913..0000000000 --- a/group06/1378560653/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coding.basic; - -import com.coding.basic.linklist.LinkedList; - -public class Queue { - private LinkedList linkedlist = new LinkedList(); - - public void enQueue(Object o){ - linkedlist.add(o); - } - - public Object deQueue(){ - if(!isEmpty()){ - return linkedlist.get(0); - }else{ - return null; - } - } - - public boolean isEmpty(){ - if(size() > 0){ - return false; - }else{ - return true; - } - } - - public int size(){ - return linkedlist.size(); - } -} diff --git a/group06/1378560653/src/com/coding/basic/queue/CircleQueue.java b/group06/1378560653/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..f653816872 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,49 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +/** + * 用数组实现循环队列 + * @author kai + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return front == rear; + + } + + public int size() { + return (rear - front + DEFAULT_SIZE) % DEFAULT_SIZE; + } + + public void enQueue(E data) { + if((rear+1) % DEFAULT_SIZE == front){ + throw new IndexOutOfBoundsException("Queue overflow"); + } + rear = (rear+1) % DEFAULT_SIZE; + elementData[rear] = data; + } + + public E deQueue() { + if(isEmpty()){ + throw new NoSuchElementException("Queue underflow"); + } + + Object item = elementData[front]; + front = (front + 1) % DEFAULT_SIZE; + return (E) item; + } +} diff --git a/group06/1378560653/src/com/coding/basic/queue/Josephus.java b/group06/1378560653/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..bbb5e7aecd --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,38 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题:约瑟夫环 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * 实现方法: + * 1.将所有的人(0~N-1)入队 + * 2.0~M-1出队,再入队,将M剔出 + * 3.重复2,直到剩下最后一个人 + * @author kai + * + */ +public class Josephus { + + public static List execute(int n, int m){ + List result = new ArrayList<>(); + Queue queue = new Queue(); + + for(int i = 0; i < n; i++){ + queue.enQueue(i); + } + + while(queue.size() > 1){ + for(int i = 0; i { + private Node first; + private Node last; + private int size; + + private static class Node { + private E item; + private Node next; + } + + public Queue(){ + first = null; + last = null; + size = 0; + } + + public boolean isEmpty(){ + return first == null; + } + + public int size() { + return size; + } + + public void enQueue(E data){ + Node oldlast = last; + last = new Node<>(); + last.item = data; + last.next = null; + if(isEmpty()){ + first = last; + } else { + oldlast.next = last; + } + size++; + } + + public E deQueue(){ + if(isEmpty()){ + throw new NoSuchElementException("Queue underflow"); + } + + E item = first.item; + first = first.next; + size--; + if(isEmpty()){ + last = null; + } + // 注意:删除队列头元素时,仅需修改头结点指针,但是当队列中最后一个元素被删除后,队列尾指针丢失,需要对尾指针重新赋值 + return item; + } + + public static void main(String[] args){ + Queue queue = new Queue<>(); + queue.enQueue(1); + queue.enQueue(2); + queue.enQueue(3); + queue.enQueue(4); + while(!queue.isEmpty()){ + System.out.println(queue.deQueue()); + } + } +} diff --git a/group06/1378560653/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group06/1378560653/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..d134fc6c80 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,54 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author kai + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.isEmpty(); + } + + public int size() { + return stack1.size(); + } + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if(isEmpty()){ + throw new NoSuchElementException("Queue underflow"); + } + + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + + E item = stack2.pop(); + + while(!stack2.isEmpty()){ + stack1.push(stack2.pop()); + } + + return item; + } + + + + } + diff --git a/group06/1378560653/src/com/coding/basic/stack/QuickMinStack.java b/group06/1378560653/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..1fb5476be5 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack; + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author kai + * + */ +public class QuickMinStack { + class Node { + private int min; + private int data; + + public Node(int data){ + this.min = 0; + this.data = data; + } + } + + Stack stack = new Stack<>(); + + public void push(int data){ + Node node = new Node(data); + if(stack.isEmpty()){ + node.min = data; + } else { + if(data < stack.peek().min){ + node.min = data; + } else { + node.min = stack.peek().min; + } + } + stack.push(node); + } + public int pop(){ + return stack.pop().data; + } + public int findMin(){ + return stack.peek().min; + } + + public static void main(String[] args){ + QuickMinStack stack = new QuickMinStack(); + stack.push(5); + stack.push(7); + System.out.println(stack.findMin()); + stack.push(4); + System.out.println(stack.findMin()); + stack.pop(); + System.out.println(stack.findMin()); + stack.push(3); + System.out.println(stack.findMin()); + + } +} diff --git a/group06/1378560653/src/com/coding/basic/stack/StackWithTwoQueues.java b/group06/1378560653/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..205381c2e1 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,66 @@ +package com.coding.basic.stack; + +import com.coding.basic.queue.Queue; + +/** + * 用两个队列来实现一个栈 + * @author kai + * + * @param + */ + +public class StackWithTwoQueues { + private Queue queue1; + private Queue queue2; + + public StackWithTwoQueues() { + queue1 = new Queue<>(); + queue2 = new Queue<>(); + + } + + public boolean isEmpty(){ + return queue1.size() == 0; + } + + public int size(){ + return queue1.size(); + } + + public void push(E data) { + queue1.enQueue(data); + } + + public E pop() { + if(isEmpty()){ + throw new RuntimeException("Stack is empty"); + } + + E item = null; + while(!queue1.isEmpty()){ + item = queue1.deQueue(); + if(!queue1.isEmpty()){ + queue2.enQueue(item); //最后一个入队的释放,不再放入第二个队列 + } + } + + while(!queue2.isEmpty()){ + queue1.enQueue(queue2.deQueue()); + } + return item; + } + + public static void main(String[] args){ + StackWithTwoQueues stack = new StackWithTwoQueues<>(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + while(!stack.isEmpty()){ + System.out.println(stack.pop()); + } + + } + + +} diff --git a/group06/1378560653/src/com/coding/basic/stack/TwoStackInOneArray.java b/group06/1378560653/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..b7c25c9a2f --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,134 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈,与循环队列类似,但相遇条件不同 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author kai + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + private int p1 = 0; + private int p2 = data.length-1; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + if(p1 == p2){ + data = grow(data, 10 , p2); + p2 += 10; + } + data[p1++] = o; + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + if(p1 <= 0){ + throw new RuntimeException("Stack1 is empty!"); + } + p1--; + Object result1 = data[p1]; + data[p1] = null; + return result1; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + if(p1 <= 0){ + throw new RuntimeException("Stack1 is empty!"); + } + p1--; + Object result1 = data[p1]; + p1++; + return result1; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + if(p1 == p2){ + data = grow(data, 10 , p2); + p2+=10; + } + data[p2--] = o; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + if(p2 >= data.length-1){ + throw new RuntimeException("Stack1 is empty!"); + } + p2++; + Object result2 = data[p2]; + data[p2] = null; + return result2; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + if(p2 >= data.length-1){ + throw new RuntimeException("Stack1 is empty!"); + } + p2++; + Object result2 = data[p2]; + p2--; + return result2; + } + /* + * 扩容: + * 1.从p1与p2之间扩容,而不是直接在数组结束处扩容 + * 2.扩容之后,p2相应扩大size + * + */ + public static Object[] grow(Object[] src, int size, int p2){ + Object[] target = new Object[src.length + size]; + System.arraycopy(src, 0, target, 0, p2); + System.arraycopy(src, p2,target, p2+size, src.length-p2); + return target; + } + + public static void main(String[] args){ + TwoStackInOneArray stack = new TwoStackInOneArray(); + stack.push1(1); + stack.push1(2); + stack.push1(3); + stack.push1(4); + stack.push1(5); + stack.push1(6); + stack.push1(7); + stack.push1(8); + stack.push1(9); + stack.push2(9); + stack.push2(8); + stack.push2(7); + stack.push2(6); + stack.push2(5); + stack.push2(4); + stack.push2(3); + stack.push2(2); + stack.push2(1); + System.out.println(stack.peek1()); + System.out.println(stack.pop1()); + System.out.println(stack.pop1()); + System.out.println(stack.pop1()); + System.out.println("============"); + System.out.println(stack.peek2()); + System.out.println(stack.pop2()); + System.out.println(stack.pop2()); + System.out.println(stack.pop2()); + } +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/InfixExpr.java b/group06/1378560653/src/com/coding/basic/stack/expression/InfixExpr.java new file mode 100644 index 0000000000..66aa2453fb --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/InfixExpr.java @@ -0,0 +1,80 @@ +package com.coding.basic.stack.expression; + +import java.util.List; +import java.util.Stack; + +/* + * 中序表达式求值 + * 1.开辟2个栈:操作数栈和运算符栈 + * 2.当token为操作数时,直接压入操作数栈 + * 3.当token为运算符时,若运算符栈为空,则直接压入,否则进行运算符优先级比较,优先级高,则直接压入栈,反之计算 + */ + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for (Token token : tokens) { + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + } else { + Token pre = opStack.peek(); + if(token.hasHigherPriority(pre)){ + opStack.push(token); + } else { + float f2 = numStack.pop(); + float f1 = numStack.pop(); + numStack.push(calculate(opStack.pop().value,f1,f2)); + opStack.push(token); + } + } + } + + if(token.isNumber()){ + numStack.push((float) token.getIntValue()); + } + } + + while(!opStack.isEmpty()){ + Token operator = opStack.pop(); + float f2 = numStack.pop(); + float f1 = numStack.pop(); + numStack.push(calculate(operator.value,f1,f2)); + } + + return numStack.pop(); + } + + private float calculate(String value, float f1, float f2) { + if(value.equals("+")){ + return f1 + f2; + } + + if(value.equals("-")){ + return f1 - f2; + } + + if(value.equals("*")){ + return f1 * f2; + } + + if(value.equals("/")){ + return f1 / f2; + } + + return -1; + } + + +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/InfixExprTest.java b/group06/1378560653/src/com/coding/basic/stack/expression/InfixExprTest.java new file mode 100644 index 0000000000..31f2be8856 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.expression; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/InfixToPostfix.java b/group06/1378560653/src/com/coding/basic/stack/expression/InfixToPostfix.java new file mode 100644 index 0000000000..d667f24a1d --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/InfixToPostfix.java @@ -0,0 +1,49 @@ +package com.coding.basic.stack.expression; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for (Token token : tokens) { + if(token.isNumber()){ + numStack.push(token); + } + + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + } else { + Token pre = opStack.peek(); + if(token.hasHigherPriority(pre)){ + opStack.push(token); + } else { + while(!opStack.isEmpty()){ + numStack.push(opStack.pop()); + } + opStack.push(token); + } + } + } + } + + List temp = new ArrayList<>(); + while(!numStack.isEmpty()){ + temp.add(numStack.pop()); + } + + List result = new ArrayList<>(); + for(int i = temp.size()-1; i >= 0; i--){ + result.add(temp.get(i)); + } + return result; + } +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/PostfixExpr.java b/group06/1378560653/src/com/coding/basic/stack/expression/PostfixExpr.java new file mode 100644 index 0000000000..61215eb027 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/PostfixExpr.java @@ -0,0 +1,87 @@ +package com.coding.basic.stack.expression; + +import java.util.List; +import java.util.Stack; + +/* + * 后序表达式, 本身就是表达式计算的顺序 + * 后序表达式求值: + * 1.开辟2个栈:操作数栈和运算符栈 + * 2.当token为操作数时,检查操作数栈,若操作数栈为空,则压入栈中;否则,判断运算符栈是否为空,若不为空则压入栈中,否则计算 + * 3.当token为运算符时,检查运算符栈,若运算符栈为空,则压入栈中;否则,计算。 + */ +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for (Token token : tokens) { + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + } else { + float f2 = numStack.pop(); + float f1 = numStack.pop(); + numStack.push(calculate(opStack.pop().value,f1,f2)); + opStack.push(token); + } + } + + if(token.isNumber()){ + if(numStack.isEmpty()){ + numStack.push((float) token.getIntValue()); + } else { + if (opStack.isEmpty()){ + numStack.push((float) token.getIntValue()); + } else { + float f2 = numStack.pop(); + float f1 = numStack.pop(); + numStack.push(calculate(opStack.pop().value,f1,f2)); + numStack.push((float) token.getIntValue()); + } + } + } + } + while(!opStack.isEmpty()){ + float f2 = numStack.pop(); + float f1 = numStack.pop(); + numStack.push(calculate(opStack.pop().value,f1,f2)); + } + + return numStack.pop(); + } + + private float calculate(String value, float f1, float f2) { + if(value.equals("+")){ + return f1 + f2; + } + + if(value.equals("-")){ + return f1 - f2; + } + + if(value.equals("*")){ + return f1 * f2; + } + + if(value.equals("/")){ + return f1 / f2; + } + + return -1; + } + + public static void main(String[] args){ + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + System.out.println(expr.evaluate()); + } +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/PostfixExprTest.java b/group06/1378560653/src/com/coding/basic/stack/expression/PostfixExprTest.java new file mode 100644 index 0000000000..6f93405801 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/PostfixExprTest.java @@ -0,0 +1,42 @@ +package com.coding.basic.stack.expression; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + //6*(5+(2+3)*8+3) + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/PrefixExpr.java b/group06/1378560653/src/com/coding/basic/stack/expression/PrefixExpr.java new file mode 100644 index 0000000000..832aa4feb3 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/PrefixExpr.java @@ -0,0 +1,87 @@ +package com.coding.basic.stack.expression; + +import java.util.List; +import java.util.Stack; + +/* + * 前序表达式求值 + * 与后序表达式求值相反,相当于将后序表达式逆置,然后按照后续表达式的规则求值 + * + */ +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(int i = tokens.size()-1; i>=0; i--){ + Token token = tokens.get(i); + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + } else { + float f1 = numStack.pop(); + float f2 = numStack.pop(); + numStack.push(calculate(opStack.pop().value,f1,f2)); + opStack.push(token); + } + } + + if(token.isNumber()){ + if(numStack.isEmpty()){ + numStack.push((float) token.getIntValue()); + } else { + if (opStack.isEmpty()){ + numStack.push((float) token.getIntValue()); + } else { + float f1 = numStack.pop(); + float f2 = numStack.pop(); + numStack.push(calculate(opStack.pop().value,f1,f2)); + numStack.push((float) token.getIntValue()); + } + } + } + } + + while(!opStack.isEmpty()){ + float f1 = numStack.pop(); + float f2 = numStack.pop(); + numStack.push(calculate(opStack.pop().value,f1,f2)); + } + + return numStack.pop(); + } + + private float calculate(String value, float f1, float f2) { + if(value.equals("+")){ + return f1 + f2; + } + + if(value.equals("-")){ + return f1 - f2; + } + + if(value.equals("*")){ + return f1 * f2; + } + + if(value.equals("/")){ + return f1 / f2; + } + + return -1; + } + + public static void main(String[] args){ + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + System.out.println(expr.evaluate()); + } +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/PrefixExprTest.java b/group06/1378560653/src/com/coding/basic/stack/expression/PrefixExprTest.java new file mode 100644 index 0000000000..1fd728ea44 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expression; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/Token.java b/group06/1378560653/src/com/coding/basic/stack/expression/Token.java new file mode 100644 index 0000000000..0205e627ed --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/Token.java @@ -0,0 +1,56 @@ +package com.coding.basic.stack.expression; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.management.RuntimeErrorException; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + + static{ + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber(){ + return type == NUMBER; + } + + public boolean isOperator(){ + return type == OPERATOR; + } + + public int getIntValue(){ + return Integer.valueOf(value).intValue(); + } + + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t) { + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + +} \ No newline at end of file diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/TokenParser.java b/group06/1378560653/src/com/coding/basic/stack/expression/TokenParser.java new file mode 100644 index 0000000000..f39ce4d0a0 --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expression; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group06/1378560653/src/com/coding/basic/stack/expression/TokenParserTest.java b/group06/1378560653/src/com/coding/basic/stack/expression/TokenParserTest.java new file mode 100644 index 0000000000..671349412c --- /dev/null +++ b/group06/1378560653/src/com/coding/basic/stack/expression/TokenParserTest.java @@ -0,0 +1,40 @@ +package com.coding.basic.stack.expression; +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From f9efe45286043638dca4e873a418205038970639 Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 15:12:21 +0800 Subject: [PATCH 411/552] =?UTF-8?q?=E7=AC=AC=E5=85=AB=E5=91=A8=20JVM?= =?UTF-8?q?=E7=AC=AC4=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group11/1178243325/week08/build.gradle | 12 ++ group11/1178243325/week08/readme.md | 13 +++ .../com/sprint/datastructure/InfixExpr.java | 61 ++++++++++ .../java/com/sprint/datastructure/Token.java | 53 +++++++++ .../com/sprint/datastructure/TokenParser.java | 45 ++++++++ .../java/com/sprint/jvm/clz/AccessFlag.java | 25 ++++ .../java/com/sprint/jvm/clz/ClassFile.java | 71 ++++++++++++ .../java/com/sprint/jvm/clz/ClassIndex.java | 22 ++++ .../com/sprint/jvm/constant/ClassInfo.java | 28 +++++ .../com/sprint/jvm/constant/ConstantInfo.java | 29 +++++ .../com/sprint/jvm/constant/ConstantPool.java | 28 +++++ .../com/sprint/jvm/constant/FieldRefInfo.java | 52 +++++++++ .../sprint/jvm/constant/MethodRefInfo.java | 55 +++++++++ .../sprint/jvm/constant/NameAndTypeInfo.java | 52 +++++++++ .../sprint/jvm/constant/NullConstantInfo.java | 12 ++ .../com/sprint/jvm/constant/StringInfo.java | 26 +++++ .../com/sprint/jvm/constant/UTF8Info.java | 35 ++++++ .../sprint/jvm/loader/ByteCodeIterator.java | 50 ++++++++ .../sprint/jvm/loader/ClassFileLoader.java | 52 +++++++++ .../sprint/jvm/loader/ClassFileParser.java | 107 ++++++++++++++++++ .../main/java/com/sprint/jvm/util/Util.java | 22 ++++ .../week08/src/test/java/InfixExprTest.java | 52 +++++++++ .../week08/src/test/java/TokenParserTest.java | 41 +++++++ 23 files changed, 943 insertions(+) create mode 100644 group11/1178243325/week08/build.gradle create mode 100644 group11/1178243325/week08/readme.md create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/datastructure/InfixExpr.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/datastructure/Token.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/datastructure/TokenParser.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/AccessFlag.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/ClassFile.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/ClassIndex.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ClassInfo.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ConstantInfo.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ConstantPool.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/StringInfo.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/UTF8Info.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ClassFileParser.java create mode 100644 group11/1178243325/week08/src/main/java/com/sprint/jvm/util/Util.java create mode 100644 group11/1178243325/week08/src/test/java/InfixExprTest.java create mode 100644 group11/1178243325/week08/src/test/java/TokenParserTest.java diff --git a/group11/1178243325/week08/build.gradle b/group11/1178243325/week08/build.gradle new file mode 100644 index 0000000000..f46c5add86 --- /dev/null +++ b/group11/1178243325/week08/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + compile("commons-io:commons-io:2.4") + //compile("commons-lang:commons-lang:2.6") + compile("org.apache.commons:commons-lang3:3.4") + testCompile("junit:junit:4.12") +} diff --git a/group11/1178243325/week08/readme.md b/group11/1178243325/week08/readme.md new file mode 100644 index 0000000000..0a19cc9b31 --- /dev/null +++ b/group11/1178243325/week08/readme.md @@ -0,0 +1,13 @@ +## 讲课内容: + +## 第八周作业(04-10 至 04-16) +- 实现对一个.class文件的字段和方法的读取,需要实现的类是ClassFileParser.java及其相关的类,实现后需要通过测试:ClassFileloaderTest.java +- 数据结构,实现InfixExpr.java,需要通过InfixExprTest.java +- 写一篇文章 + +## 完成情况: +- jvm未完 +- 其余已完 + +## 我的收获: +其实最难是坚持 diff --git a/group11/1178243325/week08/src/main/java/com/sprint/datastructure/InfixExpr.java b/group11/1178243325/week08/src/main/java/com/sprint/datastructure/InfixExpr.java new file mode 100644 index 0000000000..dc302720da --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/datastructure/InfixExpr.java @@ -0,0 +1,61 @@ +package com.sprint.datastructure; + +import java.util.List; +import java.util.Stack; +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for (Token token : tokens) { + if (token.isOperator()) { + while (!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())) { + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1, f2); + numStack.push(result); + } + opStack.push(token); + } + + if (token.isNumber()) { + numStack.push(new Float(token.getIntValue())); + } + } + + while (!opStack.isEmpty()) { + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + if (op.equals("-")) { + return f1 - f2; + } + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException (op + " is not supported "); + } +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/datastructure/Token.java b/group11/1178243325/week08/src/main/java/com/sprint/datastructure/Token.java new file mode 100644 index 0000000000..c776b1c97a --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/datastructure/Token.java @@ -0,0 +1,53 @@ +package com.sprint.datastructure; + +import java.util.Arrays; +import java.util.List; +import java.util.HashMap; +import java.util.Map; +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + static final int OPERATOR = 1; + static final int NUMBER = 2; + + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + @Override + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("number can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/datastructure/TokenParser.java b/group11/1178243325/week08/src/main/java/com/sprint/datastructure/TokenParser.java new file mode 100644 index 0000000000..2985d0e32f --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/datastructure/TokenParser.java @@ -0,0 +1,45 @@ +package com.sprint.datastructure; + +import java.util.ArrayList; +import java.util.List; +public class TokenParser { + + public List parse(String expr) { + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + char c = expr.charAt(i); + if (isOperator(c)) { + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + } else if (Character.isDigit(c)) { + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + } else { + System.out.println("char :[" + c + "] is not number or operator, ignore" ); + i++; + } + } + return tokens; + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } + + private int indexOfNextOperator(int i, String expr) { + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/AccessFlag.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..e74740aa3e --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.sprint.jvm.clz; + +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; + } +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/ClassFile.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..4e5aad16f9 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/ClassFile.java @@ -0,0 +1,71 @@ +package com.sprint.jvm.clz; + +import com.sprint.jvm.constant.ConstantPool; +import com.sprint.jvm.constant.ClassInfo; +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool 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 AccessFlag getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(AccessFlag accessFlag) { + this.accessFlag = accessFlag; + } + + public ClassIndex getClassIndex() { + return clzIndex; + } + + public void setClassIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } + + public ConstantPool getConstantPool() { + return pool; + } + + public void setConstantPool(ConstantPool pool) { + this.pool = pool; + } + + 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/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/ClassIndex.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..46e7443d90 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/clz/ClassIndex.java @@ -0,0 +1,22 @@ +package com.sprint.jvm.clz; + +public class ClassIndex { + private int thisClassIndex; + private int superClassIndex; + + public int getThisClassIndex() { + return thisClassIndex; + } + + public void setThisClassIndex(int index) { + this.thisClassIndex = index; + } + + public int getSuperClassIndex() { + return superClassIndex; + } + + public void setSuperClassIndex(int index) { + this.superClassIndex = index; + } +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ClassInfo.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..b8da3c656d --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.sprint.jvm.constant; + +public class ClassInfo extends ConstantInfo { + private int type = ConstantInfo.CLASS_INFO; + private int utf8Index; + + public ClassInfo(ConstantPool pool) { + super(pool); + } + + public void setUtf8Index(int index) { + this.utf8Index = index; + } + + public int getUtf8Index() { + return utf8Index; + } + + public int getType() { + return type; + } + + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ConstantInfo.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..a8db82689e --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.sprint.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/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ConstantPool.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..3a35c22ce0 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/ConstantPool.java @@ -0,0 +1,28 @@ +package com.sprint.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/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..c0eb449085 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java @@ -0,0 +1,52 @@ +package com.sprint.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/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..85bb5c4934 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.sprint.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/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..492fd6e0db --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,52 @@ +package com.sprint.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 getType() { + return type; + } + + 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 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/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..f257cea240 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java @@ -0,0 +1,12 @@ +package com.sprint.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/StringInfo.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..73c58a5e71 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.sprint.jvm.constant; + +public class StringInfo extends ConstantInfo { + private int type = ConstantInfo.STRING_INFO; + private int index; + + public StringInfo(ConstantPool constantPool) { + super(constantPool); + } + + 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/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/UTF8Info.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5516999c0e --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/constant/UTF8Info.java @@ -0,0 +1,35 @@ +package com.sprint.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; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + "]"; + } +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..fc5d1b2ac2 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,50 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.util.Util; +import java.util.Arrays; +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1ToInt() { + return Util.byteToInt(new byte[] {codes[pos++]}); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] {codes[pos++], codes[pos++]}); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] {codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[] {codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + } + + public void back(int n) { + this.pos -= n; + } + + +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..f190f54915 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java @@ -0,0 +1,52 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.clz.ClassFile; +import java.io.IOException; +import java.io.File; +import java.io.FileInputStream; +import java.util.List; +import java.util.ArrayList; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +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); + } +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ClassFileParser.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..4b77190a04 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/loader/ClassFileParser.java @@ -0,0 +1,107 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.clz.ClassFile; +import com.sprint.jvm.clz.AccessFlag; +import com.sprint.jvm.clz.ClassIndex; +import com.sprint.jvm.constant.ClassInfo; +import com.sprint.jvm.constant.ConstantPool; +import com.sprint.jvm.constant.FieldRefInfo; +import com.sprint.jvm.constant.NameAndTypeInfo; +import com.sprint.jvm.constant.NullConstantInfo; +import com.sprint.jvm.constant.MethodRefInfo; +import com.sprint.jvm.constant.StringInfo; +import com.sprint.jvm.constant.UTF8Info; +import java.io.UnsupportedEncodingException; +public class ClassFileParser { + public ClassFile parse(byte[] codes) { + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + String magicNumber = iter.nextU4ToHexString(); + if (!"cafebabe".equals(magicNumber)) { + return null; + } + clzFile.setMinorVersion(iter.nextU2ToInt()); + System.out.println("minor:" + clzFile.getMinorVersion()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + System.out.println("marjor:" + clzFile.getMajorVersion()); + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstantPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex clzIndex = parseClassIndex(iter); + clzFile.setClassIndex(clzIndex); + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + return flag; + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + + ClassIndex clzIndex = new ClassIndex(); + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + return clzIndex; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + int constPoolCount = iter.nextU2ToInt(); + System.out.println("Constant Pool Count :" + constPoolCount); + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + for (int i = 1; i <= constPoolCount - 1; i++) { + int tag = iter.nextU1ToInt(); + if (tag == 7) { + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setUtf8Index(utf8Index); + pool.addConstantInfo(clzInfo); + } else if (tag == 1) { + int len = iter.nextU2ToInt(); + byte[] data = iter.getBytes(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + } else if (tag == 8) { + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == 9) { + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == 10) { + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == 12) { + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setIndex1(iter.nextU2ToInt()); + nameType.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag:" + tag + "has no been implemented yet."); + } + } + System.out.println("Finished reading Constant Pool"); + return pool; + } + + +} diff --git a/group11/1178243325/week08/src/main/java/com/sprint/jvm/util/Util.java b/group11/1178243325/week08/src/main/java/com/sprint/jvm/util/Util.java new file mode 100644 index 0000000000..0f5dc89626 --- /dev/null +++ b/group11/1178243325/week08/src/main/java/com/sprint/jvm/util/Util.java @@ -0,0 +1,22 @@ +package com.sprint.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } +} diff --git a/group11/1178243325/week08/src/test/java/InfixExprTest.java b/group11/1178243325/week08/src/test/java/InfixExprTest.java new file mode 100644 index 0000000000..bf8907c9b6 --- /dev/null +++ b/group11/1178243325/week08/src/test/java/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.sprint.datastructure; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group11/1178243325/week08/src/test/java/TokenParserTest.java b/group11/1178243325/week08/src/test/java/TokenParserTest.java new file mode 100644 index 0000000000..67ccfb52f0 --- /dev/null +++ b/group11/1178243325/week08/src/test/java/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.sprint.datastructure; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From 1e0889de3828a968d970b11b66cea0f838498967 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 5 May 2017 15:15:15 +0800 Subject: [PATCH 412/552] =?UTF-8?q?quickMinStack=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E7=90=86=E8=A7=A3=E9=94=99=E8=AF=AF=EF=BC=8C=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataStructure/stack/QuickMinStack.java | 66 ++++++++++++++++--- .../java/data_structure/stack/StackTest.java | 6 ++ 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/QuickMinStack.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/QuickMinStack.java index 9827a6afa5..837863d873 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/QuickMinStack.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/QuickMinStack.java @@ -8,25 +8,75 @@ */ public class QuickMinStack { - Stack s = null; + private int defaultSize = 10; + private int extendSize = 10; + Object[] elements = new Object[defaultSize]; private int min = -1; - public QuickMinStack(){ - s = new Stack(); + private int size = 0; + public QuickMinStack(){} + + public boolean isEmpty(){ + boolean flag = false; + for(int i = 0; i < elements.length; i++){ + if(elements[i] != null){ + return false; + } + + flag = elements == null; + } + return flag; } public void push(int data){ - if(s.isEmpty()){ + if(isEmpty()){ this.min = data; - }else this.min = data < min ? data : min; - - s.push(data); + }else{ + this.min = data < min ? data : min; + } + size ++; + elements[size - 1] = data; + if(size >= elements.length){ + extend(); + } } public int pop(){ - return (Integer)s.pop(); + Integer d = (Integer)elements[size - 1]; + elements[size - 1] = null; + size--; + return d; } + public int findMin(){ return this.min; } + + public int size(){ + return this.size; + } + + private void extend(){ + int curSize = elements.length; + Object[] arr = new Object[curSize + extendSize]; + + System.arraycopy(elements, 0, arr, 0, curSize); + + this.elements = arr; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("["); + for(int i = size - 1; i >= 0; i--){ + sb.append(elements[i]); + if(i > 0){ + sb.append(","); + }else{ + sb.append("]"); + } + } + + return sb.toString(); + } } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java b/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java index 8656e4df25..78503eff4b 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/stack/StackTest.java @@ -53,7 +53,13 @@ public void test3(){ qms.push(0); qms.push(-2); qms.push(10); + for(int i = 0; i < 14; i++){ + qms.push(i); + } Assert.assertEquals(-2, qms.findMin()); + Assert.assertEquals(17, qms.size()); + Assert.assertEquals(13, qms.pop()); + System.out.println(qms.toString()); } //StackWithTwoQueues { From 59bbf1598def30c11d0a7d69fd0b55813f300a5b Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 15:31:17 +0800 Subject: [PATCH 413/552] =?UTF-8?q?=E7=AC=AC=E5=85=AB=E5=91=A8,=20JVM?= =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sprint/datastructure/InfixExprTest.java | 52 +++++++++++++++++++ .../sprint/datastructure/TokenParserTest.java | 41 +++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 group11/1178243325/week08/src/test/java/com/sprint/datastructure/InfixExprTest.java create mode 100644 group11/1178243325/week08/src/test/java/com/sprint/datastructure/TokenParserTest.java diff --git a/group11/1178243325/week08/src/test/java/com/sprint/datastructure/InfixExprTest.java b/group11/1178243325/week08/src/test/java/com/sprint/datastructure/InfixExprTest.java new file mode 100644 index 0000000000..bf8907c9b6 --- /dev/null +++ b/group11/1178243325/week08/src/test/java/com/sprint/datastructure/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.sprint.datastructure; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group11/1178243325/week08/src/test/java/com/sprint/datastructure/TokenParserTest.java b/group11/1178243325/week08/src/test/java/com/sprint/datastructure/TokenParserTest.java new file mode 100644 index 0000000000..67ccfb52f0 --- /dev/null +++ b/group11/1178243325/week08/src/test/java/com/sprint/datastructure/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.sprint.datastructure; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From d6ba447988a0c557e08e4b5f9db3d207b48368d5 Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Fri, 5 May 2017 16:39:29 +0800 Subject: [PATCH 414/552] LRUPageFrame, the fourth homework --- group19/1294642551/src/LRU/LRUPageFrame.java | 142 ++++++++++++++++++ .../1294642551/test/LRU/LRUPageFrameTest.java | 34 +++++ 2 files changed, 176 insertions(+) create mode 100644 group19/1294642551/src/LRU/LRUPageFrame.java create mode 100644 group19/1294642551/test/LRU/LRUPageFrameTest.java diff --git a/group19/1294642551/src/LRU/LRUPageFrame.java b/group19/1294642551/src/LRU/LRUPageFrame.java new file mode 100644 index 0000000000..f2419e0278 --- /dev/null +++ b/group19/1294642551/src/LRU/LRUPageFrame.java @@ -0,0 +1,142 @@ +package LRU; + +/** + * 使用双向链表实现LRU算法 + * @author 12946 + * + */ + +public class LRUPageFrame { + + private static class Node { + + Node prev = null; + Node next = null; + int pageNum; + + Node(Object data) { + if(data != null){ + this.pageNum = (Integer)data; + } + } + } + + private int capacity;//链表总元素个数 + private int currentSize;//链表当前元素个数 + private Node first;// 链表头 + private Node last;// 链表尾 + + + public LRUPageFrame(int capacity) { + + first = new Node(null);//栈底,元素最先放入的地方 + last = new Node(null);//栈顶 + + this.currentSize = 0; + this.capacity = capacity; + + } + + /** + * 获取缓存中对象 + * + * @param key + * @return + */ + public void access(int pageNum) { + Node newNode = new Node(pageNum); + + if(currentSize == capacity){ + Node tempNode = null; + if(getIndex(pageNum) == -1){//不包含 + tempNode = first.next; + }else{//包含 + tempNode = getNode(pageNum); + } + (tempNode.prev).next = tempNode.next; + (tempNode.next).prev = tempNode.prev; + + + newNode.next = last; + newNode.prev = last.prev; + last.prev = newNode; + newNode.prev.next = newNode; + } + + if(currentSize < capacity){ + Node point = first; + for(int i = 0; i < currentSize; i++){ + point = point.next; + } + point.next = newNode; + newNode.prev = point; + + newNode.next = last; + last.prev = newNode; + + currentSize += 1; + } + + + } + + public Node getNode(int data){ + + Node point = first.next; + for(int i = 0; i < capacity; i++){ + if(point.pageNum == data){ + return point; + } + point = point.next; + } + + return null; + + } + + + public int getIndex(int data){ + Node point = first.next; + for(int i = 0; i < capacity; i++){ + if(point.pageNum == data){ + return i; + } + point = point.next; + } + + return -1; + } + +// 原toString +// 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(); +// } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + Node point = last.prev; + while(point != first){ + sb.append(point.pageNum); + if(point.prev != first){ + sb.append(","); + } + point = point.prev; + } + + return sb.toString(); + + } + + + +} diff --git a/group19/1294642551/test/LRU/LRUPageFrameTest.java b/group19/1294642551/test/LRU/LRUPageFrameTest.java new file mode 100644 index 0000000000..dd51b5504f --- /dev/null +++ b/group19/1294642551/test/LRU/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package LRU; + +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()); + + } + +} From d2cf1884e99a61645e2ebc6e4e766d3561b6ac7f Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 16:40:18 +0800 Subject: [PATCH 415/552] =?UTF-8?q?=E7=AC=AC9=E5=91=A8,=20=E7=AC=AC5?= =?UTF-8?q?=E6=AC=A1JVM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group11/1178243325/week09/build.gradle | 12 ++ group11/1178243325/week09/readme.md | 15 +++ .../sprint/datastructure/InfixToPostfix.java | 32 ++++++ .../com/sprint/datastructure/PostfixExpr.java | 44 +++++++ .../com/sprint/datastructure/PrefixExpr.java | 54 +++++++++ .../java/com/sprint/datastructure/Token.java | 53 +++++++++ .../com/sprint/datastructure/TokenParser.java | 45 ++++++++ .../java/com/sprint/jvm/clz/AccessFlag.java | 25 ++++ .../java/com/sprint/jvm/clz/ClassFile.java | 71 ++++++++++++ .../java/com/sprint/jvm/clz/ClassIndex.java | 22 ++++ .../com/sprint/jvm/constant/ClassInfo.java | 28 +++++ .../com/sprint/jvm/constant/ConstantInfo.java | 29 +++++ .../com/sprint/jvm/constant/ConstantPool.java | 28 +++++ .../com/sprint/jvm/constant/FieldRefInfo.java | 52 +++++++++ .../sprint/jvm/constant/MethodRefInfo.java | 55 +++++++++ .../sprint/jvm/constant/NameAndTypeInfo.java | 52 +++++++++ .../sprint/jvm/constant/NullConstantInfo.java | 12 ++ .../com/sprint/jvm/constant/StringInfo.java | 26 +++++ .../com/sprint/jvm/constant/UTF8Info.java | 35 ++++++ .../sprint/jvm/loader/ByteCodeIterator.java | 50 ++++++++ .../sprint/jvm/loader/ClassFileLoader.java | 52 +++++++++ .../sprint/jvm/loader/ClassFileParser.java | 107 ++++++++++++++++++ .../main/java/com/sprint/jvm/util/Util.java | 22 ++++ .../datastructure/InfixToPostfixTest.java | 41 +++++++ .../sprint/datastructure/PostfixExprTest.java | 39 +++++++ .../sprint/datastructure/PrefixExprTest.java | 46 ++++++++ .../sprint/datastructure/TokenParserTest.java | 41 +++++++ 27 files changed, 1088 insertions(+) create mode 100644 group11/1178243325/week09/build.gradle create mode 100644 group11/1178243325/week09/readme.md create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/datastructure/InfixToPostfix.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/datastructure/PostfixExpr.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/datastructure/PrefixExpr.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/datastructure/Token.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/datastructure/TokenParser.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/AccessFlag.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/ClassFile.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/ClassIndex.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ClassInfo.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ConstantInfo.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ConstantPool.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/StringInfo.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/UTF8Info.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ClassFileParser.java create mode 100644 group11/1178243325/week09/src/main/java/com/sprint/jvm/util/Util.java create mode 100644 group11/1178243325/week09/src/test/java/com/sprint/datastructure/InfixToPostfixTest.java create mode 100644 group11/1178243325/week09/src/test/java/com/sprint/datastructure/PostfixExprTest.java create mode 100644 group11/1178243325/week09/src/test/java/com/sprint/datastructure/PrefixExprTest.java create mode 100644 group11/1178243325/week09/src/test/java/com/sprint/datastructure/TokenParserTest.java diff --git a/group11/1178243325/week09/build.gradle b/group11/1178243325/week09/build.gradle new file mode 100644 index 0000000000..f46c5add86 --- /dev/null +++ b/group11/1178243325/week09/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + compile("commons-io:commons-io:2.4") + //compile("commons-lang:commons-lang:2.6") + compile("org.apache.commons:commons-lang3:3.4") + testCompile("junit:junit:4.12") +} diff --git a/group11/1178243325/week09/readme.md b/group11/1178243325/week09/readme.md new file mode 100644 index 0000000000..87a00d3b10 --- /dev/null +++ b/group11/1178243325/week09/readme.md @@ -0,0 +1,15 @@ +## 讲课内容: + +## 第九周作业(JVM第4次作业)(04-17 至 04-23) +- 把字节码指令转变为java对象, 需要实现的类: CommandParser.java +- 实现类似的javap命令, 需要实现的类:ClassFilePrinter.java +- 数据结构,实现前缀表达计算PrefixExpr.java,后缀表达计算PostfixExpr.java,中缀表达式转后缀表达式InfixToPostfix.java +- 写一篇文章 + +## 完成情况: +- 数据结构已完 +- 文章已完 +- JVM未完 + +## 我的收获: +其实最难是坚持 diff --git a/group11/1178243325/week09/src/main/java/com/sprint/datastructure/InfixToPostfix.java b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/InfixToPostfix.java new file mode 100644 index 0000000000..a30f29633c --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/InfixToPostfix.java @@ -0,0 +1,32 @@ +package com.sprint.datastructure; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; +public class InfixToPostfix { + + public static List convert(String expr) { + List inFixTokens = new TokenParser().parse(expr); + List postFixTokens = new ArrayList<>(); + Stack opStack = new Stack<>(); + + for (Token token : inFixTokens) { + if (token.isOperator()) { + while (!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())) { + postFixTokens.add(opStack.pop()); + } + opStack.push(token); + } + + if (token.isNumber()) { + postFixTokens.add(token); + } + } + + while (!opStack.isEmpty()) { + postFixTokens.add(opStack.pop()); + } + return postFixTokens; + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/datastructure/PostfixExpr.java b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/PostfixExpr.java new file mode 100644 index 0000000000..b1d5d2892a --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/PostfixExpr.java @@ -0,0 +1,44 @@ +package com.sprint.datastructure; + +import java.util.List; +import java.util.Stack; +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack numStack = new Stack<>(); + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push(new Float(token.getIntValue())); + } else { + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1+f2; + } + if (op.equals("-")) { + return f1-f2; + } + if (op.equals("*")) { + return f1*f2; + } + if (op.equals("/")) { + return f1/f2; + } + throw new RuntimeException(op + " is not supported "); + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/datastructure/PrefixExpr.java b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/PrefixExpr.java new file mode 100644 index 0000000000..36d4bac543 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/PrefixExpr.java @@ -0,0 +1,54 @@ +package com.sprint.datastructure; + +import java.util.List; +import java.util.Stack; +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for (Token token : tokens) { + exprStack.push(token); + } + + while (!exprStack.isEmpty()) { + Token t = exprStack.pop(); + if (t.isNumber()) { + numStack.push(new Float(t.getIntValue())); + } else { + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(t.toString(), f1, f2)); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + + if (op.equals("-")) { + return f1 - f2; + } + + if (op.equals("*")) { + return f1 * f2; + } + + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + " is not supported "); + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/datastructure/Token.java b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/Token.java new file mode 100644 index 0000000000..c776b1c97a --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/Token.java @@ -0,0 +1,53 @@ +package com.sprint.datastructure; + +import java.util.Arrays; +import java.util.List; +import java.util.HashMap; +import java.util.Map; +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + static final int OPERATOR = 1; + static final int NUMBER = 2; + + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + @Override + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("number can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/datastructure/TokenParser.java b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/TokenParser.java new file mode 100644 index 0000000000..2985d0e32f --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/datastructure/TokenParser.java @@ -0,0 +1,45 @@ +package com.sprint.datastructure; + +import java.util.ArrayList; +import java.util.List; +public class TokenParser { + + public List parse(String expr) { + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + char c = expr.charAt(i); + if (isOperator(c)) { + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + } else if (Character.isDigit(c)) { + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + } else { + System.out.println("char :[" + c + "] is not number or operator, ignore" ); + i++; + } + } + return tokens; + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } + + private int indexOfNextOperator(int i, String expr) { + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/AccessFlag.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..e74740aa3e --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.sprint.jvm.clz; + +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; + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/ClassFile.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..4e5aad16f9 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/ClassFile.java @@ -0,0 +1,71 @@ +package com.sprint.jvm.clz; + +import com.sprint.jvm.constant.ConstantPool; +import com.sprint.jvm.constant.ClassInfo; +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool 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 AccessFlag getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(AccessFlag accessFlag) { + this.accessFlag = accessFlag; + } + + public ClassIndex getClassIndex() { + return clzIndex; + } + + public void setClassIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } + + public ConstantPool getConstantPool() { + return pool; + } + + public void setConstantPool(ConstantPool pool) { + this.pool = pool; + } + + 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/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/ClassIndex.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..46e7443d90 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/clz/ClassIndex.java @@ -0,0 +1,22 @@ +package com.sprint.jvm.clz; + +public class ClassIndex { + private int thisClassIndex; + private int superClassIndex; + + public int getThisClassIndex() { + return thisClassIndex; + } + + public void setThisClassIndex(int index) { + this.thisClassIndex = index; + } + + public int getSuperClassIndex() { + return superClassIndex; + } + + public void setSuperClassIndex(int index) { + this.superClassIndex = index; + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ClassInfo.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..b8da3c656d --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.sprint.jvm.constant; + +public class ClassInfo extends ConstantInfo { + private int type = ConstantInfo.CLASS_INFO; + private int utf8Index; + + public ClassInfo(ConstantPool pool) { + super(pool); + } + + public void setUtf8Index(int index) { + this.utf8Index = index; + } + + public int getUtf8Index() { + return utf8Index; + } + + public int getType() { + return type; + } + + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ConstantInfo.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..a8db82689e --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.sprint.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/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ConstantPool.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..3a35c22ce0 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/ConstantPool.java @@ -0,0 +1,28 @@ +package com.sprint.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/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..c0eb449085 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java @@ -0,0 +1,52 @@ +package com.sprint.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/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..85bb5c4934 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.sprint.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/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..492fd6e0db --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,52 @@ +package com.sprint.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 getType() { + return type; + } + + 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 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/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..f257cea240 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java @@ -0,0 +1,12 @@ +package com.sprint.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/StringInfo.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..73c58a5e71 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.sprint.jvm.constant; + +public class StringInfo extends ConstantInfo { + private int type = ConstantInfo.STRING_INFO; + private int index; + + public StringInfo(ConstantPool constantPool) { + super(constantPool); + } + + 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/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/UTF8Info.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5516999c0e --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/constant/UTF8Info.java @@ -0,0 +1,35 @@ +package com.sprint.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; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + "]"; + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..fc5d1b2ac2 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,50 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.util.Util; +import java.util.Arrays; +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1ToInt() { + return Util.byteToInt(new byte[] {codes[pos++]}); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] {codes[pos++], codes[pos++]}); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] {codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[] {codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + } + + public void back(int n) { + this.pos -= n; + } + + +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..f190f54915 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java @@ -0,0 +1,52 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.clz.ClassFile; +import java.io.IOException; +import java.io.File; +import java.io.FileInputStream; +import java.util.List; +import java.util.ArrayList; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +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); + } +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ClassFileParser.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..4b77190a04 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/loader/ClassFileParser.java @@ -0,0 +1,107 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.clz.ClassFile; +import com.sprint.jvm.clz.AccessFlag; +import com.sprint.jvm.clz.ClassIndex; +import com.sprint.jvm.constant.ClassInfo; +import com.sprint.jvm.constant.ConstantPool; +import com.sprint.jvm.constant.FieldRefInfo; +import com.sprint.jvm.constant.NameAndTypeInfo; +import com.sprint.jvm.constant.NullConstantInfo; +import com.sprint.jvm.constant.MethodRefInfo; +import com.sprint.jvm.constant.StringInfo; +import com.sprint.jvm.constant.UTF8Info; +import java.io.UnsupportedEncodingException; +public class ClassFileParser { + public ClassFile parse(byte[] codes) { + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + String magicNumber = iter.nextU4ToHexString(); + if (!"cafebabe".equals(magicNumber)) { + return null; + } + clzFile.setMinorVersion(iter.nextU2ToInt()); + System.out.println("minor:" + clzFile.getMinorVersion()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + System.out.println("marjor:" + clzFile.getMajorVersion()); + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstantPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex clzIndex = parseClassIndex(iter); + clzFile.setClassIndex(clzIndex); + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + return flag; + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + + ClassIndex clzIndex = new ClassIndex(); + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + return clzIndex; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + int constPoolCount = iter.nextU2ToInt(); + System.out.println("Constant Pool Count :" + constPoolCount); + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + for (int i = 1; i <= constPoolCount - 1; i++) { + int tag = iter.nextU1ToInt(); + if (tag == 7) { + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setUtf8Index(utf8Index); + pool.addConstantInfo(clzInfo); + } else if (tag == 1) { + int len = iter.nextU2ToInt(); + byte[] data = iter.getBytes(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + } else if (tag == 8) { + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == 9) { + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == 10) { + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == 12) { + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setIndex1(iter.nextU2ToInt()); + nameType.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag:" + tag + "has no been implemented yet."); + } + } + System.out.println("Finished reading Constant Pool"); + return pool; + } + + +} diff --git a/group11/1178243325/week09/src/main/java/com/sprint/jvm/util/Util.java b/group11/1178243325/week09/src/main/java/com/sprint/jvm/util/Util.java new file mode 100644 index 0000000000..0f5dc89626 --- /dev/null +++ b/group11/1178243325/week09/src/main/java/com/sprint/jvm/util/Util.java @@ -0,0 +1,22 @@ +package com.sprint.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } +} diff --git a/group11/1178243325/week09/src/test/java/com/sprint/datastructure/InfixToPostfixTest.java b/group11/1178243325/week09/src/test/java/com/sprint/datastructure/InfixToPostfixTest.java new file mode 100644 index 0000000000..b84e754655 --- /dev/null +++ b/group11/1178243325/week09/src/test/java/com/sprint/datastructure/InfixToPostfixTest.java @@ -0,0 +1,41 @@ +package com.sprint.datastructure; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} diff --git a/group11/1178243325/week09/src/test/java/com/sprint/datastructure/PostfixExprTest.java b/group11/1178243325/week09/src/test/java/com/sprint/datastructure/PostfixExprTest.java new file mode 100644 index 0000000000..d2870efffe --- /dev/null +++ b/group11/1178243325/week09/src/test/java/com/sprint/datastructure/PostfixExprTest.java @@ -0,0 +1,39 @@ +package com.sprint.datastructure; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group11/1178243325/week09/src/test/java/com/sprint/datastructure/PrefixExprTest.java b/group11/1178243325/week09/src/test/java/com/sprint/datastructure/PrefixExprTest.java new file mode 100644 index 0000000000..3c21b9dcc1 --- /dev/null +++ b/group11/1178243325/week09/src/test/java/com/sprint/datastructure/PrefixExprTest.java @@ -0,0 +1,46 @@ +package com.sprint.datastructure; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group11/1178243325/week09/src/test/java/com/sprint/datastructure/TokenParserTest.java b/group11/1178243325/week09/src/test/java/com/sprint/datastructure/TokenParserTest.java new file mode 100644 index 0000000000..67ccfb52f0 --- /dev/null +++ b/group11/1178243325/week09/src/test/java/com/sprint/datastructure/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.sprint.datastructure; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From c0d2a4bf099c288ce8126b2ea6102a089100d3f6 Mon Sep 17 00:00:00 2001 From: learnGithubChen <729245768@qq.com> Date: Fri, 5 May 2017 16:45:27 +0800 Subject: [PATCH 416/552] =?UTF-8?q?jvm=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/coding_170430/CircleQueue.java | 53 ++++++ .../src/main/coding_170430/Josephus.java | 34 ++++ .../coding_170430/QueueWithTwoStacks.java | 46 ++++++ .../coding_170430/jvm/attr/AttributeInfo.java | 21 +++ .../main/coding_170430/jvm/attr/CodeAttr.java | 66 ++++++++ .../jvm/attr/LineNumberTable.java | 68 ++++++++ .../jvm/attr/LocalVariableItem.java | 52 ++++++ .../jvm/attr/LocalVariableTable.java | 50 ++++++ .../coding_170430/jvm/attr/StackMapTable.java | 23 +++ .../coding_170430/jvm/clz/AccessFlag.java | 28 ++++ .../main/coding_170430/jvm/clz/ClassFile.java | 96 +++++++++++ .../coding_170430/jvm/clz/ClassIndex.java | 25 +++ .../main/coding_170430/jvm/cmd/BiPushCmd.java | 20 +++ .../jvm/cmd/ByteCodeCommand.java | 151 ++++++++++++++++++ .../coding_170430/jvm/cmd/CommandParser.java | 127 +++++++++++++++ .../coding_170430/jvm/cmd/GetFieldCmd.java | 19 +++ .../jvm/cmd/GetStaticFieldCmd.java | 20 +++ .../jvm/cmd/InvokeSpecialCmd.java | 19 +++ .../jvm/cmd/InvokeVirtualCmd.java | 24 +++ .../main/coding_170430/jvm/cmd/LdcCmd.java | 30 ++++ .../coding_170430/jvm/cmd/NewObjectCmd.java | 19 +++ .../coding_170430/jvm/cmd/NoOperandCmd.java | 22 +++ .../coding_170430/jvm/cmd/OneOperandCmd.java | 27 ++++ .../coding_170430/jvm/cmd/PutFieldCmd.java | 19 +++ .../coding_170430/jvm/cmd/TwoOperandCmd.java | 68 ++++++++ .../coding_170430/jvm/constant/ClassInfo.java | 32 ++++ .../jvm/constant/ConstantInfo.java | 33 ++++ .../jvm/constant/ConstantPool.java | 26 +++ .../jvm/constant/FieldRefInfo.java | 57 +++++++ .../jvm/constant/MethodRefInfo.java | 59 +++++++ .../jvm/constant/NameAndTypeInfo.java | 53 ++++++ .../jvm/constant/NullConstantInfo.java | 16 ++ .../jvm/constant/StringInfo.java | 31 ++++ .../coding_170430/jvm/constant/UTF8Info.java | 40 +++++ .../jvm/engine/ExecutionResult.java | 46 ++++++ .../jvm/engine/ExecutorEngine.java | 20 +++ .../main/coding_170430/jvm/engine/Heap.java | 34 ++++ .../coding_170430/jvm/engine/JavaObject.java | 70 ++++++++ .../coding_170430/jvm/engine/MethodArea.java | 52 ++++++ .../main/coding_170430/jvm/engine/MinJVM.java | 20 +++ .../coding_170430/jvm/engine/StackFrame.java | 66 ++++++++ .../main/coding_170430/jvm/field/Field.java | 44 +++++ .../jvm/loader/ByteCodeIterator.java | 54 +++++++ .../jvm/loader/ClassFileLoader.java | 91 +++++++++++ .../jvm/loader/ClassFileParse.java | 142 ++++++++++++++++ .../main/coding_170430/jvm/method/Method.java | 83 ++++++++++ .../jvm/print/ClassFilePrinter.java | 33 ++++ .../jvm/print/ConstantPoolPrinter.java | 35 ++++ .../src/main/coding_170430/jvm/util/Util.java | 25 +++ 49 files changed, 2289 insertions(+) create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/CircleQueue.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/Josephus.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/QueueWithTwoStacks.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/AttributeInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/CodeAttr.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LineNumberTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LocalVariableItem.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LocalVariableTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/StackMapTable.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/AccessFlag.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/ClassFile.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/ClassIndex.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/BiPushCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/ByteCodeCommand.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/CommandParser.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/GetFieldCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/LdcCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/NewObjectCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/NoOperandCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/OneOperandCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/PutFieldCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/TwoOperandCmd.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ClassInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ConstantInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ConstantPool.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/FieldRefInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/MethodRefInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/NameAndTypeInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/NullConstantInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/StringInfo.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/UTF8Info.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/ExecutionResult.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/ExecutorEngine.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/Heap.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/JavaObject.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/MethodArea.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/MinJVM.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/StackFrame.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/field/Field.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/loader/ByteCodeIterator.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/loader/ClassFileLoader.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/loader/ClassFileParse.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/method/Method.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/print/ClassFilePrinter.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/print/ConstantPoolPrinter.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170430/jvm/util/Util.java diff --git a/group11/729245768/DataStructure/src/main/coding_170430/CircleQueue.java b/group11/729245768/DataStructure/src/main/coding_170430/CircleQueue.java new file mode 100644 index 0000000000..4cdbb5143e --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/CircleQueue.java @@ -0,0 +1,53 @@ +package main.coding_170430; + +import java.util.EmptyStackException; + +/** + * Created by peterchen on 2017/5/4. + */ +public class CircleQueue { + + private int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + public CircleQueue(){ + elementData =new Object[DEFAULT_SIZE]; + } + public CircleQueue(int capacity){ + this.DEFAULT_SIZE = capacity; + elementData = new Object[DEFAULT_SIZE]; + } + public boolean isEmpty() { + return front==rear; + + } + + public int size() { + return (rear-front+DEFAULT_SIZE)%DEFAULT_SIZE; + } + + + + public void enQueue(E data) { + if((rear+1)%DEFAULT_SIZE==front){ + throw new RuntimeException("queue has fulled"); + } + elementData[rear] = data; + rear = (rear+1)%DEFAULT_SIZE; + } + + public E deQueue() { + if(isEmpty()){ + throw new EmptyStackException(); + } + E data = (E)elementData[front]; + front = (front+1)%DEFAULT_SIZE; + return data; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/Josephus.java b/group11/729245768/DataStructure/src/main/coding_170430/Josephus.java new file mode 100644 index 0000000000..13ec4df57d --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/Josephus.java @@ -0,0 +1,34 @@ +package main.coding_170430; +import java.util.ArrayList; +import java.util.List; +/** + * Created by peterchen on 2017/5/4. + */ +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + CircleQueue queue = new CircleQueue<>(n+1); + for(int i=1;i<=n;i++){ + queue.enQueue(i); + } + List list = new ArrayList<>(); + while (!queue.isEmpty()){ + int index = 1; + while (index { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + public boolean isEmpty() { + return stack1.isEmpty(); + } + + + public int size() { + return stack1.size(); + } + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if (isEmpty()) { + return null; + } + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + E data = stack2.pop(); + while (!stack2.isEmpty()) { + stack1.push(stack2.pop()); + } + return data; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/AttributeInfo.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..a95d7f037a --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/AttributeInfo.java @@ -0,0 +1,21 @@ +package main.coding_170430.jvm.attr; + +/** + * Created by peter on 2017/4/21. + */ +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVaribleTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + + int attrNameIndex; + int attrLen; + + public AttributeInfo(int attrNameIndex,int attrLen){ + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/CodeAttr.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..8f13222925 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/CodeAttr.java @@ -0,0 +1,66 @@ +package main.coding_170430.jvm.attr; + +import main.coding_170430.jvm.clz.ClassFile; +import main.coding_170430.jvm.cmd.ByteCodeCommand; +import main.coding_170430.jvm.constant.ConstantPool; +import main.coding_170430.jvm.loader.ByteCodeIterator; + +/** + * Created by peter on 2017/4/21. + */ +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList<>(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LineNumberTable parse(ByteCodeIterator iterator) { + int index = iterator.nextU2ToInt(); + int len = iterator.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index, len); + for (int i = 1; i < len; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iterator.nextU2ToInt()); + item.setLineNum(iterator.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Line Number Table:\n"); + for(LineNumberItem item:items){ + sb.append("startPC:"+item.getStartPC()).append(","); + sb.append("LineNum:"+item.getLineNum()).append("\n"); + } + sb.append("\n"); + return sb.toString(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LocalVariableItem.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..6891c13bc6 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LocalVariableItem.java @@ -0,0 +1,52 @@ +package main.coding_170430.jvm.attr; + +/** + * Created by peter on 2017/4/21. + */ +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLength() { + return length; + } + + public void setLength(int length) { + this.length = length; + } + + public int getNameIndex() { + return nameIndex; + } + + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + + public int getDescIndex() { + return descIndex; + } + + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LocalVariableTable.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..7fe678d70d --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/LocalVariableTable.java @@ -0,0 +1,50 @@ +package main.coding_170430.jvm.attr; + +import main.coding_170430.jvm.constant.ConstantPool; +import main.coding_170430.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class LocalVariableTable extends AttributeInfo { + List items = new ArrayList<>(); + public LocalVariableTable(int attrNameIndex,int attrLen){ + super(attrNameIndex,attrLen); + } + public void addLocalVariableItem(LocalVariableItem item){ + this.items.add(item); + } + public static LocalVariableTable parse(ByteCodeIterator iterator){ + int index = iterator.nextU1ToInt(); + int len = iterator.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iterator.nextU2ToInt(); + for(int i=0;i<=itemLen;i++){ + LocalVariableItem item =new LocalVariableItem(); + item.setStartPC(iterator.nextU2ToInt()); + item.setLength(iterator.nextU2ToInt()); + item.setNameIndex(iterator.nextU2ToInt()); + item.setDescIndex(iterator.nextU2ToInt()); + item.setIndex(iterator.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + public String toString(ConstantPool pool){ + StringBuffer buffer = new StringBuffer(); + buffer.append("Local variable table:\n"); + for(LocalVariableItem item:items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/StackMapTable.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..69fc63ee81 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/attr/StackMapTable.java @@ -0,0 +1,23 @@ +package main.coding_170430.jvm.attr; + +import main.coding_170430.jvm.loader.ByteCodeIterator; + +/** + * Created by peter on 2017/4/21. + */ +public class StackMapTable extends AttributeInfo { + private String originalCode; + + public StackMapTable(int attrNameIndex,int attrLen){ + super(attrNameIndex,attrLen); + } + public static StackMapTable parse(ByteCodeIterator iterator){ + int index = iterator.nextU2ToInt(); + int len = iterator.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + return t; + } + private void setOriginalCode(String code){ + this.originalCode =code; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/AccessFlag.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..a9dbac985a --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/AccessFlag.java @@ -0,0 +1,28 @@ +package main.coding_170430.jvm.clz; + +/** + * Created by peter on 2017/4/21. + */ +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; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/ClassFile.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..3e91d99783 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/ClassFile.java @@ -0,0 +1,96 @@ +package main.coding_170430.jvm.clz; + +import main.coding_170430.jvm.constant.ClassInfo; +import main.coding_170430.jvm.constant.ConstantPool; +import main.coding_170430.jvm.field.Field; +import main.coding_170430.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private ConstantPool pool; + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private List fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + + 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 setConstantPool(ConstantPool pool){ + this.pool = pool; + } + public void setClassIndex(ClassIndex clzIndex){ + this.clzIndex = clzIndex; + } + + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + + public void addMethod(Method m){ + this.methods.add(m); + } + + public List getMethods(){ + return methods; + } + + 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()); + } + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.getClzIndex().getSuperClassIndex()); + return superClass.getClassName(); + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/ClassIndex.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..1612dbc29c --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/clz/ClassIndex.java @@ -0,0 +1,25 @@ +package main.coding_170430.jvm.clz; + +/** + * Created by peter on 2017/4/21. + */ +public class ClassIndex { + private int thisClassIndex; + private int superClassIndex; + + public void setThisClassIndex(int thisClassIndex) { + this.thisClassIndex = thisClassIndex; + } + + public void setSuperClassIndex(int superClassIndex) { + this.superClassIndex = superClassIndex; + } + + public int getThisClassIndex() { + return thisClassIndex; + } + + public int getSuperClassIndex() { + return superClassIndex; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/BiPushCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..14cd3f57c1 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/BiPushCmd.java @@ -0,0 +1,20 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class BiPushCmd extends OneOperandCmd { + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return this.getOffset()+":"+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/ByteCodeCommand.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..c085fdf2ce --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,151 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; +import main.coding_170430.jvm.constant.ConstantInfo; +import main.coding_170430.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by peterchen on 2017/4/26. + */ +public abstract class ByteCodeCommand { + String opCode; + ClassFile clzFile; + private int offset; + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + public abstract String toString(ConstantPool pool); + //public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/CommandParser.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..9e0fbcf994 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/CommandParser.java @@ -0,0 +1,127 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peterchen on 2017/4/26. + */ +public class CommandParser { + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if (codes == null || codes.length() == 0 || (codes.length() % 2) != 0) { + throw new RuntimeException("the original code is not correct"); + } + + codes = codes.toUpperCase(); + + CommandIterator commandIterator = new CommandIterator(codes); + List byteCodeCommands = new ArrayList<>(); + while (commandIterator.hasNext()) { + String opCode = commandIterator.next2CharAsString(); + switch (opCode) { + case ByteCodeCommand.new_object: + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile, opCode); + newObjectCmd.setOprand1(commandIterator.nextCharAsInt()); + newObjectCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(newObjectCmd); + break; + case ByteCodeCommand.invokespecial: + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, opCode); + invokeSpecialCmd.setOprand1(commandIterator.nextCharAsInt()); + invokeSpecialCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(invokeSpecialCmd); + break; + case ByteCodeCommand.invokevirtual: + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, opCode); + invokeVirtualCmd.setOprand1(commandIterator.nextCharAsInt()); + invokeVirtualCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(invokeVirtualCmd); + break; + case ByteCodeCommand.getfield: + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, opCode); + getFieldCmd.setOprand1(commandIterator.nextCharAsInt()); + getFieldCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(getFieldCmd); + break; + case ByteCodeCommand.getstatic: + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, opCode); + getStaticFieldCmd.setOprand1(commandIterator.nextCharAsInt()); + getStaticFieldCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(getStaticFieldCmd); + break; + case ByteCodeCommand.putfield: + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, opCode); + putFieldCmd.setOprand1(commandIterator.nextCharAsInt()); + putFieldCmd.setOprand2(commandIterator.nextCharAsInt()); + byteCodeCommands.add(putFieldCmd); + break; + case ByteCodeCommand.ldc: + LdcCmd ldcCmd = new LdcCmd(clzFile, opCode); + ldcCmd.setOperand(commandIterator.nextCharAsInt()); + byteCodeCommands.add(ldcCmd); + break; + case ByteCodeCommand.bipush: + BiPushCmd biPushCmd = new BiPushCmd(clzFile, opCode); + biPushCmd.setOperand(commandIterator.nextCharAsInt()); + byteCodeCommands.add(biPushCmd); + break; + case ByteCodeCommand.dup: + case ByteCodeCommand.aload_0: + case ByteCodeCommand.aload_1: + case ByteCodeCommand.aload_2: + case ByteCodeCommand.iload_1: + case ByteCodeCommand.iload_2: + case ByteCodeCommand.iload_3: + case ByteCodeCommand.fload_3: + case ByteCodeCommand.voidreturn: + case ByteCodeCommand.astore_1: + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, opCode); + byteCodeCommands.add(noOperandCmd); + break; + default: + throw new RuntimeException("Sorry,the instruction " + opCode + " " + "has not implemented"); + + } + } + calcuateOffset(byteCodeCommands); + ByteCodeCommand[] result = new ByteCodeCommand[byteCodeCommands.size()]; + byteCodeCommands.toArray(result); + return result; + } + + + private static void calcuateOffset(List cmds) { + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String code) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int nextCharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/GetFieldCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..d1403dddee --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,19 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class GetFieldCmd extends TwoOperandCmd { + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/GetStaticFieldCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..936161fedd --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class GetStaticFieldCmd extends TwoOperandCmd { + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/InvokeSpecialCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..1bf5a75153 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,19 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class InvokeSpecialCmd extends TwoOperandCmd { + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/InvokeVirtualCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..90cb20b30a --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,24 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class InvokeVirtualCmd extends TwoOperandCmd { + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } + + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/LdcCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..99796850c3 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/LdcCmd.java @@ -0,0 +1,30 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; +import main.coding_170430.jvm.constant.ConstantInfo; +import main.coding_170430.jvm.constant.StringInfo; + +/** + * Created by peterchen on 2017/4/26. + */ +public class LdcCmd extends OneOperandCmd { + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + ConstantInfo info = getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/NewObjectCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..902253fe7c --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class NewObjectCmd extends TwoOperandCmd { + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsClassInfo(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/NoOperandCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..1ce1e735bc --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,22 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class NoOperandCmd extends ByteCodeCommand { + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString() { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + public int getLength(){ + return 1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/OneOperandCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..7905036bcc --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class OneOperandCmd extends ByteCodeCommand { + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/PutFieldCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..edd22d9504 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; + +/** + * Created by peterchen on 2017/4/26. + */ +public class PutFieldCmd extends TwoOperandCmd { + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/TwoOperandCmd.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..42efb560cb --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,68 @@ +package main.coding_170430.jvm.cmd; + +import main.coding_170430.jvm.clz.ClassFile; +import main.coding_170430.jvm.constant.ClassInfo; +import main.coding_170430.jvm.constant.ConstantInfo; +import main.coding_170430.jvm.constant.FieldRefInfo; +import main.coding_170430.jvm.constant.MethodRefInfo; + +/** + * Created by peterchen on 2017/4/26. + */ +public class TwoOperandCmd extends ByteCodeCommand { + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ClassInfo.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..708c83e991 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ClassInfo.java @@ -0,0 +1,32 @@ +package main.coding_170430.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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; + } + + @Override + public int getType() { + return type; + } + + public String getClassName(){ + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ConstantInfo.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..842a4e4901 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ConstantInfo.java @@ -0,0 +1,33 @@ +package main.coding_170430.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ConstantPool.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..ec965ecc2e --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/ConstantPool.java @@ -0,0 +1,26 @@ +package main.coding_170430.jvm.constant; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by peter on 2017/4/21. + */ +public class ConstantPool { + private List constantInfos = new ArrayList<>(); + + public ConstantPool(){} + + public void addConstantInfo(ConstantInfo constantInfo){ + this.constantInfos.add(constantInfo); + } + public ConstantInfo getConstantInfo(int index){ + return this.constantInfos.get(index); + } + public String getUTF8String(int index){ + return ((UTF8Info)this.constantInfos.get(index)).getValue(); + } + public int getSizes(){ + return this.constantInfos.size()-1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/FieldRefInfo.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..8c970d95da --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/FieldRefInfo.java @@ -0,0 +1,57 @@ +package main.coding_170430.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class FieldRefInfo extends ConstantInfo { + private int type = ConstantInfo.FIELD_INFO; + private int classInfoIndex; + private int nameAndTypeIndex; + + public FieldRefInfo(ConstantPool pool) { + super(pool); + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + public int getClassInfoIndex() { + return classInfoIndex; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + @Override + 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(); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/MethodRefInfo.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..faf2d2d289 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/MethodRefInfo.java @@ -0,0 +1,59 @@ +package main.coding_170430.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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 getClassInfoIndex() { + return classInfoIndex; + } + + public void setClassInfoIndex(int classInfoIndex) { + this.classInfoIndex = classInfoIndex; + } + + public int getNameAndTypeIndex() { + return nameAndTypeIndex; + } + + public void setNameAndTypeIndex(int nameAndTypeIndex) { + this.nameAndTypeIndex = nameAndTypeIndex; + } + + @Override + 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(); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/NameAndTypeInfo.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..11d4530770 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,53 @@ +package main.coding_170430.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class NameAndTypeInfo extends ConstantInfo { + public int type = ConstantInfo.NAME_AND_TYPE_INFO; + + private int indexA; + private int indexB; + + public NameAndTypeInfo(ConstantPool pool){ + super(pool); + } + + public int getIndexA() { + return indexA; + } + + public int getIndexB() { + return indexB; + } + + public void setIndexA(int indexA) { + this.indexA = indexA; + } + + public void setIndexB(int indexB) { + this.indexB = indexB; + } + + public String getName(){ + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(indexA); + return utf8Info.getValue(); + } + + public String getTypeInfo(){ + ConstantPool pool = this.getConstantPool(); + UTF8Info utf8_info =(UTF8Info) pool.getConstantInfo(indexB); + return utf8_info.getValue(); + } + + @Override + public String toString() { + return "("+getName()+","+getTypeInfo()+")"; + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/NullConstantInfo.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..c8d73b5213 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/NullConstantInfo.java @@ -0,0 +1,16 @@ +package main.coding_170430.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/StringInfo.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..e21a1cfcc3 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/StringInfo.java @@ -0,0 +1,31 @@ +package main.coding_170430.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +public class StringInfo extends ConstantInfo { + private int type = ConstantInfo.STRING_INFO; + private int index; + + public StringInfo(ConstantPool pool) { + super(pool); + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + @Override + public String toString() { + return this.getConstantPool().getUTF8String(index); + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/UTF8Info.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..6d83893eda --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/constant/UTF8Info.java @@ -0,0 +1,40 @@ +package main.coding_170430.jvm.constant; + +/** + * Created by peter on 2017/4/21. + */ +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 String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + "]"; + } + + @Override + public int getType() { + return type; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/ExecutionResult.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..199452fc8a --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/ExecutionResult.java @@ -0,0 +1,46 @@ +package main.coding_170430.jvm.engine; + +import main.coding_170430.jvm.method.Method; + +/** + * Created by peterchen on 2017/5/5. + */ +public class ExecutionResult { + private static final int RUN_NEXT_CMD = 1; + private static final int JUMP = 2; + private static final int EXIT_CURRENT_FRAME = 3; + private static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + private int nextCmdOffset = 0; + private Method nextMethod; + + public Method getNextMethod(){ + return nextMethod; + } + public void setNextMethod(Method method){ + this.nextMethod = nextMethod; + } + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction==PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + public boolean isJump(){ + return this.nextAction == JUMP; + } + public int getNextCmdOffset(){ + return nextCmdOffset; + } + public void setNextCmdOffset(int nextCmdOffset){ + this.nextCmdOffset = nextCmdOffset; + } +} + diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/ExecutorEngine.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..b59825da4d --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/ExecutorEngine.java @@ -0,0 +1,20 @@ +package main.coding_170430.jvm.engine; + +import main.coding_170430.jvm.method.Method; + +import java.util.Stack; + +/** + * Created by peterchen on 2017/5/5. + */ +public class ExecutorEngine { + private Stack stack = new Stack<>(); + public ExecutorEngine(){ + + } + public void execute(Method mainMethod){ + } + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame){ + + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/Heap.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/Heap.java new file mode 100644 index 0000000000..bcfb809b36 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/Heap.java @@ -0,0 +1,34 @@ +package main.coding_170430.jvm.engine; + +/** + * Created by peterchen on 2017/5/5. + */ +public class Heap { + private static Heap instance = new Heap(); + private Heap(){ + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setClassName(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/JavaObject.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..4fab5af177 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/JavaObject.java @@ -0,0 +1,70 @@ +package main.coding_170430.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by peterchen on 2017/5/5. + */ +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + private Map fieldValues = new HashMap<>(); + + private String stringValue; + private int intValue; + private float floatValue; + + public void setFieldValues(String fieldName,JavaObject fieldValue){ + fieldValues.put(fieldName,fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch (this.getType()){ + case INT: + return String.valueOf(this.getType()); + case STRING: + return this.stringValue; + case OBJECT: + return this.className+":"+this.fieldValues; + case FLOAT: + return String.valueOf(this.floatValue); + default:return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value){ + this.floatValue = value; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/MethodArea.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..5b76c3cecb --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/MethodArea.java @@ -0,0 +1,52 @@ +package main.coding_170430.jvm.engine; + +import main.coding_170430.jvm.clz.ClassFile; +import main.coding_170430.jvm.constant.MethodRefInfo; +import main.coding_170430.jvm.loader.ClassFileLoader; +import main.coding_170430.jvm.method.Method; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by peterchen on 2017/5/5. + */ +public class MethodArea { + public static final MethodArea instance = new MethodArea(); + + private ClassFileLoader clzLoader = null; + Map map = new HashMap<>(); + + private MethodArea() { + } + + public static MethodArea getInstance() { + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader) { + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className) { + ClassFile clzFile = findClassFile(className); + return clzFile.getMainMethod(); + } + + public ClassFile findClassFile(String className) { + if (map.get(className) != null) { + return map.get(className); + } + ClassFile classFile = clzLoader.loadClass(className); + map.put(className, classFile); + return classFile; + } + + public Method getMethod(String className, String methodName, String paramANDrETURNtYPE) { + return null; + } + + public Method getMethod(MethodRefInfo methodRefInfo) { + return null; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/MinJVM.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/MinJVM.java new file mode 100644 index 0000000000..813264c5c4 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/engine/MinJVM.java @@ -0,0 +1,20 @@ +package main.coding_170430.jvm.engine; + +import main.coding_170430.jvm.loader.ClassFileLoader; + +/** + * Created by peterchen on 2017/5/5. + */ +public class MinJVM { + public void run(String[] classPaths,String className){ + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList<>(); + private Stack operatorStack = new Stack<>(); + + int index = 0; + private Method m = null; + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame(){ + return callerFrame; + } + public void setCallerFrame(StackFrame callerFrame){ + this.callerFrame = callerFrame; + } + public static StackFrame create(Method m){ + StackFrame frame = new StackFrame(m); + return frame; + } + private StackFrame(Method m){ + this.m = m; + } + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + public Stack getOperatorStack(){ + return this.operatorStack; + } + public int getNextCommandIndex(int offset){ + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for (int i=0;i values){ + this.localVariableTable = values; + } + public void setLocalVariableValue(int index,JavaObject jo){ + if(localVariableTable.size()-10){ + throw new RuntimeException("Field attribute has not implemented"); + } + return f; + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170430/jvm/loader/ByteCodeIterator.java b/group11/729245768/DataStructure/src/main/coding_170430/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..53cce63392 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170430/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,54 @@ +package main.coding_170430.jvm.loader; + +import main.coding_170430.jvm.util.Util; + +import java.util.Arrays; + +/** + * Created by peter on 2017/4/21. + */ +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + public ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + public byte[] getBytes(int len){ + if(pos+len>=codes.length){ + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes,pos,pos+len); + pos+=len; + return data; + } + + public int nextU1ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++]}); + } + + public int nextU4ToInt(){ + return Util.byteToInt(new byte[]{codes[pos++],codes[pos++],codes[pos++],codes[pos++]}); + } + + public String nextU4ToHexString(){ + return Util.byteToHexString(new byte[]{codes[pos++],codes[pos++],codes[pos]++,codes[pos++]}); + } + + public String nextUxToHexString(int len){ + byte[] temp = new byte[len]; + + for(int i=0;i clzPaths = new ArrayList<>(); + public byte[] readBinaryCode(String className){ + className = className.replace('.', File.pathSeparatorChar) +".class"; + for (String path:this.clzPaths){ + String clzFileName = path + File.separatorChar + className; + byte[] codes = loadClassFile(clzFileName); + if(codes!=null){ + return codes; + } + } + return null; + } + + public 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(clzPaths.contains(path)){ + return; + } + clzPaths.add(path); + } + + public String getClassPath(){ + return StringUtils.join(this.clzPaths,";"); + } + public ClassFile loadClass(String className){ + byte[] codes = this.readBinaryCode(className); + ClassFileParse parser = new ClassFileParse(); + return parser.parse(codes); + } + public String getClassPath_V1(){ + StringBuffer sb = new StringBuffer(); + for(int i=0;i Date: Fri, 5 May 2017 16:49:41 +0800 Subject: [PATCH 417/552] =?UTF-8?q?jvm=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A-test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/coding_170430/CircleQueueTest.java | 56 +++++++++++++++++++ .../main/coding_170430/JosephusTest.java | 25 +++++++++ .../coding_170430/QueueWithTwoStacksTest.java | 52 +++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 group11/729245768/DataStructure/tests/main/coding_170430/CircleQueueTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170430/JosephusTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170430/QueueWithTwoStacksTest.java diff --git a/group11/729245768/DataStructure/tests/main/coding_170430/CircleQueueTest.java b/group11/729245768/DataStructure/tests/main/coding_170430/CircleQueueTest.java new file mode 100644 index 0000000000..916eeb45db --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170430/CircleQueueTest.java @@ -0,0 +1,56 @@ +package main.coding_170430; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by peterchen on 2017/5/4. + */ +public class CircleQueueTest extends TestCase { + @Test + public void testIsEmpty() throws Exception { + CircleQueue queue = new CircleQueue<>(); + Assert.assertTrue(queue.isEmpty()); + } + + @Test + public void testSize() throws Exception { + CircleQueue queue = new CircleQueue<>(); + Assert.assertEquals(queue.size(),0); + queue.enQueue(12); + queue.enQueue(23); + Assert.assertEquals(queue.size(),2); + } + + @Test + public void testEnQueue() throws Exception { + CircleQueue queue = new CircleQueue<>(); + for(int i=0;i<9;i++){ + queue.enQueue(i); + } + Assert.assertEquals(queue.size(),9); + queue.deQueue(); + queue.enQueue(10); + } + + @Test + public void testDeQueue() throws Exception { + CircleQueue queue = new CircleQueue<>(); + for(int i=0;i<5;i++){ + queue.enQueue(i); + } + Assert.assertEquals(queue.size(),5); + queue.deQueue(); + queue.deQueue(); + queue.deQueue(); + Assert.assertEquals(queue.size(),2); + for(int i=10;i<17;i++){ + queue.enQueue(i); + } + Assert.assertEquals(queue.size(),9); + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170430/JosephusTest.java b/group11/729245768/DataStructure/tests/main/coding_170430/JosephusTest.java new file mode 100644 index 0000000000..afe90e4fff --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170430/JosephusTest.java @@ -0,0 +1,25 @@ +package main.coding_170430; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.*; + +/** + * Created by peterchen on 2017/5/4. + */ +public class JosephusTest extends TestCase { + @Test + public void testExecute() throws Exception { + List list = Josephus.execute(8,3); + int[] arrays = new int[list.size()]; + for(int i=0;i twoStacks = new QueueWithTwoStacks<>(); + Assert.assertTrue(twoStacks.isEmpty()); + } + + @Test + public void testSize() throws Exception { + QueueWithTwoStacks twoStacks = new QueueWithTwoStacks<>(); + twoStacks.enQueue(10); + twoStacks.enQueue(5); + Assert.assertEquals(twoStacks.size(),2); + } + + @Test + public void testEnQueue() throws Exception { + QueueWithTwoStacks twoStacks = new QueueWithTwoStacks<>(); + twoStacks.enQueue(10); + twoStacks.enQueue(5); + twoStacks.enQueue(15); + } + + @Test + public void testDeQueue() throws Exception { + QueueWithTwoStacks twoStacks = new QueueWithTwoStacks<>(); + twoStacks.enQueue(10); + twoStacks.enQueue(5); + twoStacks.enQueue(15); + twoStacks.enQueue(1); + twoStacks.enQueue(51); + twoStacks.enQueue(12); + twoStacks.enQueue(11); + twoStacks.enQueue(50); + twoStacks.enQueue(150); + while (!twoStacks.isEmpty()){ + System.out.print(" "+twoStacks.deQueue()); + } + } + +} \ No newline at end of file From 961b0918ac6e4cc482a4e4f01b38480635b266b4 Mon Sep 17 00:00:00 2001 From: learnGithubChen <729245768@qq.com> Date: Fri, 5 May 2017 16:50:22 +0800 Subject: [PATCH 418/552] =?UTF-8?q?jvm=E7=AC=AC=E5=85=AD=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A-=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/coding_170507/QuickMinStack.java | 35 ++++++++ .../coding_170507/StackWithTwoQueues.java | 65 ++++++++++++++ .../coding_170507/TwoStackInOneArray.java | 85 +++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 group11/729245768/DataStructure/src/main/coding_170507/QuickMinStack.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170507/StackWithTwoQueues.java create mode 100644 group11/729245768/DataStructure/src/main/coding_170507/TwoStackInOneArray.java diff --git a/group11/729245768/DataStructure/src/main/coding_170507/QuickMinStack.java b/group11/729245768/DataStructure/src/main/coding_170507/QuickMinStack.java new file mode 100644 index 0000000000..2deeb01559 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170507/QuickMinStack.java @@ -0,0 +1,35 @@ +package main.coding_170507; + + +import java.util.ArrayList; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + */ +public class QuickMinStack { + private ArrayList stack = new ArrayList<>(); + private ArrayList minStack= new ArrayList<>(); + public void push(int data) { + stack.add(data); + if(minStack.size()==0){ + minStack.add(data); + }else{ + if(minStack.get(minStack.size()-1)>data){ + minStack.add(data); + } + } + } + + public int pop() { + int data = stack.remove(stack.size()-1); + if(data==minStack.get(minStack.size()-1)){ + minStack.remove(minStack.size()-1); + } + return data; + } + + public int findMin() { + return minStack.get(minStack.size()-1); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170507/StackWithTwoQueues.java b/group11/729245768/DataStructure/src/main/coding_170507/StackWithTwoQueues.java new file mode 100644 index 0000000000..c196d950f3 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170507/StackWithTwoQueues.java @@ -0,0 +1,65 @@ +package main.coding_170507; + +import java.util.EmptyStackException; +import java.util.LinkedList; + +/** + * Created by peterchen on 2017/5/5. + */ +public class StackWithTwoQueues { + private Queue queue1; + private Queue queue2; + + public StackWithTwoQueues() { + queue1 = new Queue(); + queue2 = new Queue(); + } + + public void push(int data) { + queue1.enQueue(data); + } + + public int pop() { + if (queue1.isEmpty()) { + throw new EmptyStackException(); + } + int currentLength = queue1.size(); + for (int i = 0; i < currentLength - 1; i++) { + queue2.enQueue(queue1.deQueue()); + } + int data = queue1.deQueue(); + while (!queue2.isEmpty()) { + queue1.enQueue(queue2.deQueue()); + } + return data; + } + + private class Queue { + private LinkedList linkedList = new LinkedList<>(); + + public boolean isEmpty() { + return linkedList.size() == 0; + } + + public int size() { + return linkedList.size(); + } + + public void enQueue(Integer data) { + linkedList.add(data); + } + + public Integer deQueue() { + int data = linkedList.removeFirst(); + return data; + } + } + + public static void main(String[] args) { + StackWithTwoQueues stackWithTwoQueues = new StackWithTwoQueues(); + stackWithTwoQueues.push(10); + stackWithTwoQueues.push(20); + stackWithTwoQueues.push(30); + System.out.println(stackWithTwoQueues.pop()); + } +} diff --git a/group11/729245768/DataStructure/src/main/coding_170507/TwoStackInOneArray.java b/group11/729245768/DataStructure/src/main/coding_170507/TwoStackInOneArray.java new file mode 100644 index 0000000000..4c7bb70348 --- /dev/null +++ b/group11/729245768/DataStructure/src/main/coding_170507/TwoStackInOneArray.java @@ -0,0 +1,85 @@ +package main.coding_170507; + +import java.util.EmptyStackException; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + private int start = 0; + private int end = data.length-1; + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + if(start==end){ + throw new RuntimeException("栈满"); + } + data[start++] = o; + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + if(start==0){ + throw new EmptyStackException(); + } + return data[--start]; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + if(start==0){ + throw new EmptyStackException(); + } + return data[start-1]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + if(start==end){ + throw new RuntimeException("栈满"); + } + data[end--] = o; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + if(end==data.length-1){ + throw new EmptyStackException(); + } + return data[++end]; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + if(end==data.length-1){ + throw new EmptyStackException(); + } + return data[end+1]; + } +} From a9aec17ae6ac3aeab889e4bde4577dc98920b716 Mon Sep 17 00:00:00 2001 From: learnGithubChen <729245768@qq.com> Date: Fri, 5 May 2017 16:50:48 +0800 Subject: [PATCH 419/552] =?UTF-8?q?jvm=E7=AC=AC=E5=85=AD=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A-test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/coding_170507/QuickMinStackTest.java | 45 +++++++++++ .../coding_170507/StackWithTwoQueuesTest.java | 34 ++++++++ .../coding_170507/TwoStackInOneArrayTest.java | 77 +++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 group11/729245768/DataStructure/tests/main/coding_170507/QuickMinStackTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170507/StackWithTwoQueuesTest.java create mode 100644 group11/729245768/DataStructure/tests/main/coding_170507/TwoStackInOneArrayTest.java diff --git a/group11/729245768/DataStructure/tests/main/coding_170507/QuickMinStackTest.java b/group11/729245768/DataStructure/tests/main/coding_170507/QuickMinStackTest.java new file mode 100644 index 0000000000..2b2c4bd5c1 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170507/QuickMinStackTest.java @@ -0,0 +1,45 @@ +package main.coding_170507; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by peterchen on 2017/5/5. + */ +public class QuickMinStackTest extends TestCase { + @Test + public void testPush() throws Exception { + QuickMinStack minStack = new QuickMinStack(); + minStack.push(5); + minStack.push(10); + minStack.push(3); + Assert.assertEquals(minStack.pop(),3); + Assert.assertEquals(minStack.pop(),10); + Assert.assertEquals(minStack.pop(),5); + } + + @Test + public void testPop() throws Exception { + QuickMinStack minStack = new QuickMinStack(); + minStack.push(5); + minStack.push(10); + Assert.assertEquals(minStack.pop(),10); + Assert.assertEquals(minStack.pop(),5); + } + + @Test + public void testFindMin() throws Exception { + QuickMinStack minStack = new QuickMinStack(); + minStack.push(15); + minStack.push(10); + Assert.assertEquals(minStack.findMin(),10); + minStack.pop(); + minStack.push(20); + Assert.assertEquals(minStack.findMin(),15); + + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170507/StackWithTwoQueuesTest.java b/group11/729245768/DataStructure/tests/main/coding_170507/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..ee8ef3bda8 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170507/StackWithTwoQueuesTest.java @@ -0,0 +1,34 @@ +package main.coding_170507; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by peterchen on 2017/5/5. + */ +public class StackWithTwoQueuesTest extends TestCase { + @Test + public void testPush() throws Exception { + StackWithTwoQueues twoQueues = new StackWithTwoQueues(); + twoQueues.push(1); + twoQueues.push(2); + twoQueues.push(3); + Assert.assertEquals(3,twoQueues.pop()); + Assert.assertEquals(2,twoQueues.pop()); + } + + @Test + public void testPop() throws Exception { + StackWithTwoQueues twoQueues = new StackWithTwoQueues(); + twoQueues.push(15); + twoQueues.pop(); + twoQueues.push(20); + twoQueues.push(30); + Assert.assertEquals(30,twoQueues.pop()); + Assert.assertEquals(20,twoQueues.pop()); + } + +} \ No newline at end of file diff --git a/group11/729245768/DataStructure/tests/main/coding_170507/TwoStackInOneArrayTest.java b/group11/729245768/DataStructure/tests/main/coding_170507/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..5764cf5923 --- /dev/null +++ b/group11/729245768/DataStructure/tests/main/coding_170507/TwoStackInOneArrayTest.java @@ -0,0 +1,77 @@ +package main.coding_170507; + +import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by peterchen on 2017/5/5. + */ +public class TwoStackInOneArrayTest extends TestCase { + @Test + public void testPush1() throws Exception { + TwoStackInOneArray inOneArray = new TwoStackInOneArray(); + inOneArray.push1(1); + inOneArray.push1(2); + inOneArray.push1(3); + Assert.assertEquals(3,inOneArray.peek1()); + inOneArray.pop1(); + Assert.assertEquals(2,inOneArray.peek1()); + } + + @Test + public void testPop1() throws Exception { + TwoStackInOneArray inOneArray = new TwoStackInOneArray(); + inOneArray.push1(10); + inOneArray.push1(20); + inOneArray.pop1(); + inOneArray.push1(30); + inOneArray.push1(50); + Assert.assertEquals(50,inOneArray.peek1()); + inOneArray.pop1(); + Assert.assertEquals(30,inOneArray.peek1()); + } + + @Test + public void testPeek1() throws Exception { + TwoStackInOneArray inOneArray = new TwoStackInOneArray(); + inOneArray.push1(100); + Assert.assertEquals(100,inOneArray.peek1()); + } + + @Test + public void testPush2() throws Exception { + TwoStackInOneArray inOneArray = new TwoStackInOneArray(); + inOneArray.push2(10); + inOneArray.push2(20); + inOneArray.push1(15); + inOneArray.push1(25); + Assert.assertEquals(20,inOneArray.peek2()); + Assert.assertEquals(25,inOneArray.peek1()); + } + + @Test + public void testPop2() throws Exception { + TwoStackInOneArray inOneArray = new TwoStackInOneArray(); + inOneArray.push2(10); + inOneArray.push2(20); + inOneArray.pop2(); + inOneArray.pop2(); + inOneArray.push2(25); + inOneArray.push2(24); + Assert.assertEquals(24,inOneArray.peek2()); + inOneArray.pop2(); + Assert.assertEquals(25,inOneArray.peek2()); + } + + @Test + public void testPeek2() throws Exception { + TwoStackInOneArray inOneArray = new TwoStackInOneArray(); + inOneArray.push2(100); + inOneArray.push2(200); + Assert.assertEquals(200,inOneArray.peek2()); + } + +} \ No newline at end of file From fc61b4c455ccbae1181895f59879ca61234a82cb Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Fri, 5 May 2017 17:26:02 +0800 Subject: [PATCH 420/552] =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E7=BB=83=E4=B9=A0=EF=BC=8C=E4=BB=A3=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designPattern/decorator/Beverage.java | 23 ++++++++++++ .../decorator/CondimentDecorator.java | 9 +++++ .../decorator/beverages/DarkRoast.java | 24 +++++++++++++ .../decorator/beverages/Decaf.java | 24 +++++++++++++ .../decorator/beverages/Espresso.java | 24 +++++++++++++ .../decorator/beverages/HouseBlend.java | 23 ++++++++++++ .../decorator/condiments/Mocha.java | 31 ++++++++++++++++ .../decorator/condiments/Soy.java | 31 ++++++++++++++++ .../decorator/condiments/Whip.java | 31 ++++++++++++++++ .../designPattern/StarBuzzCoffeeTest.java | 35 +++++++++++++++++++ 10 files changed, 255 insertions(+) create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/Beverage.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/CondimentDecorator.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/DarkRoast.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Decaf.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Espresso.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/HouseBlend.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Mocha.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Soy.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Whip.java create mode 100644 group24/75939388/learning2017/src/test/java/designPattern/StarBuzzCoffeeTest.java diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/Beverage.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/Beverage.java new file mode 100644 index 0000000000..e68e2e7b82 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/Beverage.java @@ -0,0 +1,23 @@ +package designPattern.decorator; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public abstract class Beverage { + public static final int TALL = 0; + public static final int GRANDE = 1; + public static final int VENTI = 2; + + + public String description = ""; + public static int size = TALL; + + public String getDescription(){ + return description; + } + + public abstract double cost(); + + public abstract int size(); +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/CondimentDecorator.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/CondimentDecorator.java new file mode 100644 index 0000000000..dca6ade059 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/CondimentDecorator.java @@ -0,0 +1,9 @@ +package designPattern.decorator; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public abstract class CondimentDecorator extends Beverage { + public abstract String getDescription(); +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/DarkRoast.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/DarkRoast.java new file mode 100644 index 0000000000..2c39efecf9 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/DarkRoast.java @@ -0,0 +1,24 @@ +package designPattern.decorator.beverages; + +import designPattern.decorator.Beverage; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public class DarkRoast extends Beverage { + + public DarkRoast(){ + description = "Dark Roast"; + } + + @Override + public double cost() { + return 0.99; + } + + @Override + public int size() { + return 0; + } +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Decaf.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Decaf.java new file mode 100644 index 0000000000..bb4f757ad4 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Decaf.java @@ -0,0 +1,24 @@ +package designPattern.decorator.beverages; + +import designPattern.decorator.Beverage; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public class Decaf extends Beverage { + + public Decaf(){ + description = "Decaf"; + } + + @Override + public double cost() { + return 1.99; + } + + @Override + public int size() { + return 0; + } +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Espresso.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Espresso.java new file mode 100644 index 0000000000..dca41cc66c --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Espresso.java @@ -0,0 +1,24 @@ +package designPattern.decorator.beverages; + +import designPattern.decorator.Beverage; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public class Espresso extends Beverage { + + public Espresso(){ + description = "Espresso"; + } + + public double cost() { + return 1.99d; + } + + + @Override + public int size() { + return 0; + } +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/HouseBlend.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/HouseBlend.java new file mode 100644 index 0000000000..8b296aa3cf --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/HouseBlend.java @@ -0,0 +1,23 @@ +package designPattern.decorator.beverages; + +import designPattern.decorator.Beverage; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public class HouseBlend extends Beverage { + + public HouseBlend(){ + description = "House Blend"; + } + + public double cost() { + return 0.89; + } + + @Override + public int size() { + return 0; + } +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Mocha.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Mocha.java new file mode 100644 index 0000000000..799399332f --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Mocha.java @@ -0,0 +1,31 @@ +package designPattern.decorator.condiments; + +import designPattern.decorator.Beverage; +import designPattern.decorator.CondimentDecorator; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public class Mocha extends CondimentDecorator { + Beverage beverage; + + public Mocha(Beverage beverage){ + this.beverage = beverage; + + this.description += this.beverage.description + ", Mocha"; + } + + public String getDescription() { + return this.description; + } + + public double cost() { + return 0.2 + beverage.cost(); + } + + @Override + public int size() { + return 0; + } +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Soy.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Soy.java new file mode 100644 index 0000000000..ec4873c914 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Soy.java @@ -0,0 +1,31 @@ +package designPattern.decorator.condiments; + +import designPattern.decorator.Beverage; +import designPattern.decorator.CondimentDecorator; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public class Soy extends CondimentDecorator { + Beverage beverage; + + public Soy(Beverage beverage){ + this.beverage = beverage; + + this.description += this.beverage.description + ", Soy"; + } + + public String getDescription() { + return this.description; + } + + public double cost() { + return 0.15 + beverage.cost(); + } + + @Override + public int size() { + return 0; + } +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Whip.java b/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Whip.java new file mode 100644 index 0000000000..7b8cce87af --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Whip.java @@ -0,0 +1,31 @@ +package designPattern.decorator.condiments; + +import designPattern.decorator.Beverage; +import designPattern.decorator.CondimentDecorator; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public class Whip extends CondimentDecorator { + Beverage beverage; + + public Whip(Beverage beverage){ + this.beverage = beverage; + + this.description += beverage.description + ", "; + } + + public String getDescription() { + return this.description; + } + + public double cost() { + return 0.1 + beverage.cost(); + } + + @Override + public int size() { + return 0; + } +} diff --git a/group24/75939388/learning2017/src/test/java/designPattern/StarBuzzCoffeeTest.java b/group24/75939388/learning2017/src/test/java/designPattern/StarBuzzCoffeeTest.java new file mode 100644 index 0000000000..8f04ce4ff1 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/designPattern/StarBuzzCoffeeTest.java @@ -0,0 +1,35 @@ +package designPattern; + +import designPattern.decorator.Beverage; +import designPattern.decorator.beverages.DarkRoast; +import designPattern.decorator.beverages.Espresso; +import designPattern.decorator.beverages.HouseBlend; +import designPattern.decorator.condiments.Mocha; +import designPattern.decorator.condiments.Soy; +import designPattern.decorator.condiments.Whip; +import org.junit.Test; + +/** + * @author : 温友朝 + * @date : 2017/5/5 + */ +public class StarBuzzCoffeeTest { + + @Test + public void test1(){ + Beverage espresso = new Espresso(); + System.out.println(espresso.getDescription() + " cost $" + espresso.cost()); + + Beverage darkRoast = new DarkRoast(); + darkRoast = new Mocha(darkRoast); + darkRoast = new Mocha(darkRoast); + darkRoast = new Whip(darkRoast); + System.out.println(darkRoast.getDescription() + " cost $" + darkRoast.cost()); + + Beverage houseBlend = new HouseBlend(); + houseBlend = new Soy(houseBlend); + houseBlend = new Mocha(houseBlend); + houseBlend = new Whip(houseBlend); + System.out.println(houseBlend.getDescription() + " cost $" + houseBlend.cost()); + } +} From b6c6f9c8e53f4c16a6a844a1faa05cc9041cec59 Mon Sep 17 00:00:00 2001 From: zheng <765324639@qq.com> Date: Fri, 5 May 2017 18:31:54 +0800 Subject: [PATCH 421/552] =?UTF-8?q?JVM=E7=AC=AC6=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datastructure/stack/QuickMinStack.java | 145 ++++++++++++++++++ .../stack/StackWithTwoQueues.java | 26 ++++ .../stack/TwoStackInOneArray.java | 83 ++++++++++ .../stack/QuickMinStackTest.java | 42 +++++ .../stack/StackWithTwoQueuesTest.java | 26 ++++ .../stack/TwoStackInOneArrayTest.java | 42 +++++ 6 files changed, 364 insertions(+) create mode 100644 group01/765324639/src/main/java/datastructure/stack/QuickMinStack.java create mode 100644 group01/765324639/src/main/java/datastructure/stack/StackWithTwoQueues.java create mode 100644 group01/765324639/src/main/java/datastructure/stack/TwoStackInOneArray.java create mode 100644 group01/765324639/src/test/java/datastructure/stack/QuickMinStackTest.java create mode 100644 group01/765324639/src/test/java/datastructure/stack/StackWithTwoQueuesTest.java create mode 100644 group01/765324639/src/test/java/datastructure/stack/TwoStackInOneArrayTest.java diff --git a/group01/765324639/src/main/java/datastructure/stack/QuickMinStack.java b/group01/765324639/src/main/java/datastructure/stack/QuickMinStack.java new file mode 100644 index 0000000000..e06a6b4e11 --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/stack/QuickMinStack.java @@ -0,0 +1,145 @@ +package datastructure.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + private int size = 0; + private int index = 0; // 目前的最早入库索引 + private Node head; + + public int findMin(){ + if (head == null) { + throw new RuntimeException("Stack is empty, don't have min!"); + } + return head.data; + } + + public void push(int data){ + if (size == 0) { + head = new Node(size++, data); + } else { + Node temp = head; + while (temp.next != null && data > temp.data) { + temp = temp.next; + } + Node newNode = new Node(size++, data); + + // 未到达最后节点,或者到达最后节点,但是要插入的数据小于最后一个节点,此时插入到temp节点之前 + if (unReachedLastNodeOrSmallThanLastNode(data, temp)) { + insertBefore(newNode, temp); + } else { // 其他情况插入到temp节点之后 + insertAfter(newNode, temp); + } + } + } + + private boolean unReachedLastNodeOrSmallThanLastNode(int data, Node temp) { + return temp.next != null || (temp.next == null && data < temp.data); + } + + /** + * 将src节点插入到dest之前 + * @param src + * @param dest + */ + private void insertBefore(Node src, Node dest) { + if (dest.prev == null) { // dest为首个元素 + head = src; + } else { + src.prev = dest.prev; + dest.prev.next = src; + } + dest.prev = src; + src.next = dest; + } + + /** + * 将src节点插入到dest之后 + * @param src + * @param dest + */ + private void insertAfter(Node src, Node dest) { + if (dest.next == null) { // temp为最后一个元素 + dest.next = src; + src.prev = dest; + } else { + dest = dest.next; + insertBefore(src, dest); + } + } + + public int pop(){ + Node temp = head; + while (temp.next != null) { + if (temp.index == this.index) { + Node dest = remove(temp); + return dest.data; + } + temp = temp.next; + } + if (temp.index == this.index) { + Node dest = remove(temp); + return dest.data; + } + throw new RuntimeException("Stack is Empty!"); + } + + private Node remove(Node node) { + if (node.prev == null && node.next == null) { // 唯一的元素,删除后将初始化size和index + this.size = 0; + this.index = 0; + return node; + } + if (node.prev == null) { // 元素在开头位置 + head = head.next; + node.next.prev = null; + node.next = null; + } else if (node.next == null) { // 元素在结尾位置 + node.prev.next = null; + node.prev = null; + } else { // 元素在中间位置 + node.prev.next = node.next; + node.next.prev = node.prev; + node.prev = null; + node.next = null; + } + this.size--; + this.index++; + return node; + } + + public int size() { + return size; + } + + // 调试输出用 +// @Override +// public String toString() { +// StringBuilder builder = new StringBuilder(size); +// builder.append("["); +// Node temp = head; +// while (temp.next != null) { +// builder.append(temp.data + ", "); +// temp = temp.next; +// } +// builder.append(temp.data + "]"); +// return builder.toString(); +// } + + private static class Node { + Node prev; + int data; + int index; // 插入的顺序 + Node next; + + Node (int index, int data) { + this.index = index; + this.data = data; + } + } +} diff --git a/group01/765324639/src/main/java/datastructure/stack/StackWithTwoQueues.java b/group01/765324639/src/main/java/datastructure/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..3efc65367c --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/stack/StackWithTwoQueues.java @@ -0,0 +1,26 @@ +package datastructure.stack; + +import datastructure.queue.Queue; + +public class StackWithTwoQueues { + + private Queue queue1 = new Queue(); + private Queue queue2 = new Queue(); + + public void push(int data) { + queue1.enQueue(data); + } + + public int pop() { + int size = queue1.size(); + for (int i = 0; i < size - 1; i++) { + queue2.enQueue(queue1.deQueue()); + } + int dest = (int) queue1.deQueue(); + queue1 = queue2; + queue2 = queue1; + return dest; + } + + +} diff --git a/group01/765324639/src/main/java/datastructure/stack/TwoStackInOneArray.java b/group01/765324639/src/main/java/datastructure/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..9149218363 --- /dev/null +++ b/group01/765324639/src/main/java/datastructure/stack/TwoStackInOneArray.java @@ -0,0 +1,83 @@ +package datastructure.stack; + +import java.util.Arrays; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = data.length - 1; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + ensureCapacity(); + data[index1++] = o; + } + + private void ensureCapacity() { + if (isFull()) { + grow(); + } + } + + private boolean isFull() { + return index1 + 1 == index2; + } + + private void grow() { + int stack2Length = data.length - 1 - index2; + data = Arrays.copyOf(data, data.length * 2); + int oldIndex2 = index2; + index2 = data.length - stack2Length - 1; + System.arraycopy(data, oldIndex2 + 1, data, index2 + 1, stack2Length); + } + + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + return data[--index1]; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return data[index1 - 1]; + } + /** + * 向第二个栈压入元素 + */ + public void push2(Object o){ + ensureCapacity(); + data[index2--] = o; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + return data[++index2]; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return data[index2 + 1]; + } + +} diff --git a/group01/765324639/src/test/java/datastructure/stack/QuickMinStackTest.java b/group01/765324639/src/test/java/datastructure/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..852488a3c0 --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/stack/QuickMinStackTest.java @@ -0,0 +1,42 @@ +package datastructure.stack; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class QuickMinStackTest { + + @Test + public void test() { + QuickMinStack stack = new QuickMinStack(); + stack.push(5); + stack.push(-5); + stack.push(50); + stack.push(23); + stack.push(0); + stack.push(100); + + assertEquals(-5, stack.findMin()); + assertEquals(6, stack.size()); + + assertEquals(5, stack.pop()); + assertEquals(-5, stack.findMin()); + + assertEquals(-5, stack.pop()); + assertEquals(0, stack.findMin()); + + assertEquals(50, stack.pop()); + assertEquals(0, stack.findMin()); + + assertEquals(23, stack.pop()); + assertEquals(0, stack.findMin()); + + assertEquals(0, stack.pop()); + assertEquals(100, stack.findMin()); + + assertEquals(100, stack.pop()); + + assertEquals(0, stack.size()); + + } +} diff --git a/group01/765324639/src/test/java/datastructure/stack/StackWithTwoQueuesTest.java b/group01/765324639/src/test/java/datastructure/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..cf2b3482ce --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,26 @@ +package datastructure.stack; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class StackWithTwoQueuesTest { + + @Test + public void test() { + StackWithTwoQueues stack = new StackWithTwoQueues(); + for (int i = 0; i < 500; i++) { + stack.push(i); + } + for (int i = 0; i < 500; i++) { + assertEquals(500 - i - 1, stack.pop()); + } + + stack.push(50); + stack.push(60); + assertEquals(60, stack.pop()); + stack.push(70); + assertEquals(70, stack.pop()); + assertEquals(50, stack.pop()); + } +} diff --git a/group01/765324639/src/test/java/datastructure/stack/TwoStackInOneArrayTest.java b/group01/765324639/src/test/java/datastructure/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..2407f7ce15 --- /dev/null +++ b/group01/765324639/src/test/java/datastructure/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,42 @@ +package datastructure.stack; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class TwoStackInOneArrayTest { + + @Test + public void test() { + TwoStackInOneArray stack = new TwoStackInOneArray(); + for (int i = 0; i < 500; i++) { + stack.push1("stack1:" + i); + } + for (int i = 0; i < 500; i++) { + stack.push2("stack2:" + i); + } + + for (int i = 0; i < 500; i++) { + assertEquals("stack1:" + (500 - i - 1), stack.peek1()); + assertEquals("stack1:" + (500 - i - 1), stack.pop1()); + } + for (int i = 0; i < 500; i++) { + assertEquals("stack2:" + (500 - i - 1), stack.peek2()); + assertEquals("stack2:" + (500 - i - 1), stack.pop2()); + } + + stack.push1(50); + stack.push1(60); + assertEquals(60, stack.pop1()); + stack.push1(70); + assertEquals(70, stack.pop1()); + assertEquals(50, stack.pop1()); + + stack.push2(50); + stack.push2(60); + assertEquals(60, stack.pop2()); + stack.push2(70); + assertEquals(70, stack.pop2()); + assertEquals(50, stack.pop2()); + } +} From b4b5f3958367a2524153cc13dfec92bcbfd624a2 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Fri, 5 May 2017 20:48:09 +0800 Subject: [PATCH 422/552] Ninth week homework done --- .../basic/stack/StackWithTwoQueues.java | 38 +++++++++++++- .../basic/stack/StackWithTwoQueuesTest.java | 25 +++++++++ .../basic/stack/TwoStackInOneArray.java | 52 +++++++++++-------- .../basic/stack/TwoStackInOneArrayTest.java | 20 ++++++- 4 files changed, 110 insertions(+), 25 deletions(-) create mode 100644 group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueuesTest.java diff --git a/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueues.java b/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueues.java index bcad4fe57c..3cf4e6cc9e 100644 --- a/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueues.java +++ b/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueues.java @@ -1,15 +1,51 @@ package com.donaldy.basic.stack; +import com.donaldy.basic.queue.Queue; + public class StackWithTwoQueues { + Queue queue = new Queue<>(); + Queue opQueue = new Queue<>(); + int size = 0; public void push(int data) { + this.queue.enQueue(data); + this.size ++; + } public int pop() { - return -1; + + if (this.size <= 0 ) { + throw new IndexOutOfBoundsException("size : " + this.size); + } + + int cnt = this.size; + + int element; + + while (!this.queue.isEmpty()) { + + if (cnt == 1) { + break; + } + + this.opQueue.enQueue(this.queue.deQueue()); + + cnt --; + } + + int oldData = this.queue.deQueue(); + + while (!this.opQueue.isEmpty()) { + this.queue.enQueue(this.opQueue.deQueue()); + } + + this.size --; + + return oldData; } diff --git a/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueuesTest.java b/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..f14aa88c51 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,25 @@ +package com.donaldy.basic.stack; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by DonaldY on 2017/5/4. + */ +public class StackWithTwoQueuesTest { + + @Test + public void test() { + + StackWithTwoQueues stack = new StackWithTwoQueues(); + + for (int i = 1; i <= 10; ++i) { + stack.push(i); + } + + for (int i = 10; i >= 1; --i) { + Assert.assertEquals(i, stack.pop()); + } + + } +} diff --git a/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArray.java b/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArray.java index 26f90865aa..83e760ba15 100644 --- a/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArray.java +++ b/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArray.java @@ -25,11 +25,15 @@ public class TwoStackInOneArray { public void push1(Object o){ ensureCapacity(); - System.out.println("push1 : " + o); + this.data[++ this.pointer1] = o; } + /** + * 扩容后,pointer1指针不变,pointer2指针要改变 + * 注意复制 + */ private void ensureCapacity() { if (this.pointer1 + 1 == this.pointer2 || this.pointer1 == this.pointer2 + 1) { @@ -39,22 +43,13 @@ private void ensureCapacity() { Object[] newDataArray = new Object[newCapacity]; System.arraycopy(this.data, 1, newDataArray, 1, this.pointer1); - for (Object o : newDataArray) { - System.out.print(o + " "); - } - System.out.println(); - /** - * 第二个栈为空时,复制可能出错 - * 为什么错? - * this.pointer2 + 1可能越界 - */ + + int pointer2Len = this.data.length - 1 - this.pointer2; + System.arraycopy(this.data, this.pointer2, newDataArray, - newCapacity - this.pointer2 - 1, this.data.length - 1 - this.pointer2); + newCapacity - pointer2Len - 1, pointer2Len); - for (Object o : newDataArray) { - System.out.print(o + " "); - } - System.out.println(); + this.pointer2 = newCapacity - pointer2Len - 1; this.data = newDataArray; } @@ -66,7 +61,7 @@ private void ensureCapacity() { */ public Object pop1() { - if (this.pointer1 <= 0 ) { + if (this.pointer1 <= 0 || this.pointer1 >= this.data.length) { throw new IndexOutOfBoundsException("size : " + this.pointer1); } @@ -80,27 +75,36 @@ public Object pop1() { public Object peek1(){ - if (this.pointer1 <= 0 ) { + if (this.pointer1 <= 0 || this.pointer1 >= this.data.length) { throw new IndexOutOfBoundsException("size : " + this.pointer1); } return this.data[this.pointer1]; } - /* + + + + + /** * 向第二个栈压入元素 */ public void push2(Object o){ ensureCapacity(); - - this.data[this.pointer2 ++] = o; + System.out.println("push : " + o); + this.data[-- this.pointer2] = o; } /** * 从第二个栈弹出元素 * @return */ public Object pop2(){ - return null; + + if (this.pointer2 >= this.data.length || this.pointer2 <= 0) { + throw new IndexOutOfBoundsException("size : " + this.pointer2); + } + + return this.data[this.pointer2 ++]; } /** * 获取第二个栈的栈顶元素 @@ -108,7 +112,11 @@ public Object pop2(){ */ public Object peek2(){ - return null; + if (this.pointer2 >= this.data.length || this.pointer2 <= 0) { + throw new IndexOutOfBoundsException("size : " + this.pointer2); + } + + return this.data[this.pointer2]; } } diff --git a/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArrayTest.java b/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArrayTest.java index 1dbd41c09a..b85d606891 100644 --- a/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArrayTest.java +++ b/group24/448641125/src/com/donaldy/basic/stack/TwoStackInOneArrayTest.java @@ -19,8 +19,24 @@ public void test() { Assert.assertEquals(i, stack.peek1()); } + for (int i = 10; i >= 2; --i) { + Assert.assertEquals(i, stack.pop1()); + } - /*//两个栈 + //第一个栈为空 + stack = new TwoStackInOneArray(); + + for (int i = 1; i <= 10; ++i) { + stack.push2(i); + Assert.assertEquals(i, stack.peek2()); + } + + for (int i = 10; i >= 2; --i) { + Assert.assertEquals(i, stack.pop2()); + } + + + //两个栈 stack = new TwoStackInOneArray(); for (int i = 1; i <= 4; ++i) { @@ -39,7 +55,7 @@ public void test() { for (int i = 4; i >= 1; --i) { Assert.assertEquals(i, stack.pop2()); - }*/ + } } From c7cc0304082349b6737550954165da086fbaab3b Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 22:23:50 +0800 Subject: [PATCH 423/552] =?UTF-8?q?=E7=AC=AC10=E5=91=A8,=20jvm=E7=AC=AC5?= =?UTF-8?q?=E6=AC=A1=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group11/1178243325/week10/build.gradle | 12 ++ group11/1178243325/week10/readme.md | 14 +++ .../com/sprint/datastructure/CircleQueue.java | 49 ++++++++ .../com/sprint/datastructure/Josephus.java | 34 ++++++ .../java/com/sprint/datastructure/Queue.java | 54 +++++++++ .../datastructure/QueueWithTwoStacks.java | 58 ++++++++++ .../java/com/sprint/jvm/clz/AccessFlag.java | 25 ++++ .../java/com/sprint/jvm/clz/ClassFile.java | 71 ++++++++++++ .../java/com/sprint/jvm/clz/ClassIndex.java | 22 ++++ .../com/sprint/jvm/constant/ClassInfo.java | 28 +++++ .../com/sprint/jvm/constant/ConstantInfo.java | 29 +++++ .../com/sprint/jvm/constant/ConstantPool.java | 28 +++++ .../com/sprint/jvm/constant/FieldRefInfo.java | 52 +++++++++ .../sprint/jvm/constant/MethodRefInfo.java | 55 +++++++++ .../sprint/jvm/constant/NameAndTypeInfo.java | 52 +++++++++ .../sprint/jvm/constant/NullConstantInfo.java | 12 ++ .../com/sprint/jvm/constant/StringInfo.java | 26 +++++ .../com/sprint/jvm/constant/UTF8Info.java | 35 ++++++ .../sprint/jvm/loader/ByteCodeIterator.java | 50 ++++++++ .../sprint/jvm/loader/ClassFileLoader.java | 52 +++++++++ .../sprint/jvm/loader/ClassFileParser.java | 107 ++++++++++++++++++ .../main/java/com/sprint/jvm/util/Util.java | 22 ++++ .../sprint/datastructure/CircleQueueTest.java | 45 ++++++++ .../sprint/datastructure/JosephusTest.java | 27 +++++ .../datastructure/QueueWithTwoStacksTest.java | 28 +++++ 25 files changed, 987 insertions(+) create mode 100644 group11/1178243325/week10/build.gradle create mode 100644 group11/1178243325/week10/readme.md create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/datastructure/CircleQueue.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/datastructure/Josephus.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/datastructure/Queue.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/datastructure/QueueWithTwoStacks.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/AccessFlag.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/ClassFile.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/ClassIndex.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ClassInfo.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ConstantInfo.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ConstantPool.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/StringInfo.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/UTF8Info.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ClassFileParser.java create mode 100644 group11/1178243325/week10/src/main/java/com/sprint/jvm/util/Util.java create mode 100644 group11/1178243325/week10/src/test/java/com/sprint/datastructure/CircleQueueTest.java create mode 100644 group11/1178243325/week10/src/test/java/com/sprint/datastructure/JosephusTest.java create mode 100644 group11/1178243325/week10/src/test/java/com/sprint/datastructure/QueueWithTwoStacksTest.java diff --git a/group11/1178243325/week10/build.gradle b/group11/1178243325/week10/build.gradle new file mode 100644 index 0000000000..f46c5add86 --- /dev/null +++ b/group11/1178243325/week10/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + compile("commons-io:commons-io:2.4") + //compile("commons-lang:commons-lang:2.6") + compile("org.apache.commons:commons-lang3:3.4") + testCompile("junit:junit:4.12") +} diff --git a/group11/1178243325/week10/readme.md b/group11/1178243325/week10/readme.md new file mode 100644 index 0000000000..4253c3569f --- /dev/null +++ b/group11/1178243325/week10/readme.md @@ -0,0 +1,14 @@ +## 讲课内容: + +## 第10周作业(JVM第5次作业)(04-24 至 04-30) +- 实现一个简单的执行引擎,主要代码engine cmd +- 数据结构,实现循环队列CircleQueue.java,约瑟夫环Josephus.java,用两个栈实现队列QueueWithTwoStacks.java +- 写一篇文章 + +## 完成情况: +- 数据结构已完 +- 文章已完 +- jvm未完 + +## 我的收获: +其实最难是坚持 diff --git a/group11/1178243325/week10/src/main/java/com/sprint/datastructure/CircleQueue.java b/group11/1178243325/week10/src/main/java/com/sprint/datastructure/CircleQueue.java new file mode 100644 index 0000000000..42f8fcd4df --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/datastructure/CircleQueue.java @@ -0,0 +1,49 @@ +package com.sprint.datastructure; + +public class CircleQueue { + + private Object[] elementData; + private int size = 0; + //队头 + private int front = 0; + + //队尾 + private int rear = 0; + + + public CircleQueue(int capacity) { + elementData = new Object[capacity]; + } + + public boolean isEmpty() { + return front == rear; + } + + public boolean isFull() { + return size == elementData.length; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + if (isFull()) { + throw new RuntimeException("The queue is full"); + } + elementData[rear++] = data; + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new RuntimeException("The queue is empty"); + } + E data = (E)elementData[front]; + elementData[front] = null; + front = (front + 1) % elementData.length; + size--; + return data; + } +} + diff --git a/group11/1178243325/week10/src/main/java/com/sprint/datastructure/Josephus.java b/group11/1178243325/week10/src/main/java/com/sprint/datastructure/Josephus.java new file mode 100644 index 0000000000..9656e15c02 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/datastructure/Josephus.java @@ -0,0 +1,34 @@ +package com.sprint.datastructure; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * + */ +public class Josephus { + + public static List execute(int n, int m){ + Queue queue = new Queue<>(); + for (int i = 0; i < n; i++) { + queue.enQueue(i); + } + + List result = new ArrayList<>(); + int i = 0; + + while (!queue.isEmpty()) { + int x = queue.deQueue(); + if (++i %m == 0) { + result.add(x); + } else { + queue.enQueue(x); + } + } + return result; + } + +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/datastructure/Queue.java b/group11/1178243325/week10/src/main/java/com/sprint/datastructure/Queue.java new file mode 100644 index 0000000000..e7c14ac30e --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/datastructure/Queue.java @@ -0,0 +1,54 @@ +package com.sprint.datastructure; + +import java.util.NoSuchElementException; +public class Queue { + private Node first; + private Node last; + private int size; + + private static class Node { + private E item; + private Node next; + } + + public Queue() { + first = null; + last = null; + size = 0; + } + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + Node oldLast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } else { + oldLast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/datastructure/QueueWithTwoStacks.java b/group11/1178243325/week10/src/main/java/com/sprint/datastructure/QueueWithTwoStacks.java new file mode 100644 index 0000000000..3ca10f4b25 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/datastructure/QueueWithTwoStacks.java @@ -0,0 +1,58 @@ +package com.sprint.datastructure; + +import java.util.Stack; +import java.util.NoSuchElementException; +/** + * 用两个栈来实现一个队列 + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + + + public int size() { + return stack1.size() + stack2.size(); + } + + + + public void enQueue(E item) { + if (item == null) + return; + stack1.push(item); + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue is empty"); + } + if (stack2.isEmpty()) { + moveStack1ToStack2(); + } + return stack2.pop(); + } + + private void moveStack1ToStack2() { + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + } + + } + diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/AccessFlag.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..e74740aa3e --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.sprint.jvm.clz; + +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; + } +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/ClassFile.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..4e5aad16f9 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/ClassFile.java @@ -0,0 +1,71 @@ +package com.sprint.jvm.clz; + +import com.sprint.jvm.constant.ConstantPool; +import com.sprint.jvm.constant.ClassInfo; +public class ClassFile { + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool 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 AccessFlag getAccessFlag() { + return accessFlag; + } + + public void setAccessFlag(AccessFlag accessFlag) { + this.accessFlag = accessFlag; + } + + public ClassIndex getClassIndex() { + return clzIndex; + } + + public void setClassIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } + + public ConstantPool getConstantPool() { + return pool; + } + + public void setConstantPool(ConstantPool pool) { + this.pool = pool; + } + + 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/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/ClassIndex.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..46e7443d90 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/clz/ClassIndex.java @@ -0,0 +1,22 @@ +package com.sprint.jvm.clz; + +public class ClassIndex { + private int thisClassIndex; + private int superClassIndex; + + public int getThisClassIndex() { + return thisClassIndex; + } + + public void setThisClassIndex(int index) { + this.thisClassIndex = index; + } + + public int getSuperClassIndex() { + return superClassIndex; + } + + public void setSuperClassIndex(int index) { + this.superClassIndex = index; + } +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ClassInfo.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..b8da3c656d --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.sprint.jvm.constant; + +public class ClassInfo extends ConstantInfo { + private int type = ConstantInfo.CLASS_INFO; + private int utf8Index; + + public ClassInfo(ConstantPool pool) { + super(pool); + } + + public void setUtf8Index(int index) { + this.utf8Index = index; + } + + public int getUtf8Index() { + return utf8Index; + } + + public int getType() { + return type; + } + + public String getClassName() { + int index = getUtf8Index(); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + return utf8Info.getValue(); + } +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ConstantInfo.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..a8db82689e --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.sprint.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/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ConstantPool.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..3a35c22ce0 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/ConstantPool.java @@ -0,0 +1,28 @@ +package com.sprint.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/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..c0eb449085 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/FieldRefInfo.java @@ -0,0 +1,52 @@ +package com.sprint.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/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..85bb5c4934 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.sprint.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/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..492fd6e0db --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,52 @@ +package com.sprint.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 getType() { + return type; + } + + 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 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/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..f257cea240 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/NullConstantInfo.java @@ -0,0 +1,12 @@ +package com.sprint.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + public NullConstantInfo() { + + } + + @Override + public int getType() { + return -1; + } +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/StringInfo.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..73c58a5e71 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.sprint.jvm.constant; + +public class StringInfo extends ConstantInfo { + private int type = ConstantInfo.STRING_INFO; + private int index; + + public StringInfo(ConstantPool constantPool) { + super(constantPool); + } + + 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/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/UTF8Info.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5516999c0e --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/constant/UTF8Info.java @@ -0,0 +1,35 @@ +package com.sprint.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; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public String toString() { + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value + "]"; + } +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..fc5d1b2ac2 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,50 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.util.Util; +import java.util.Arrays; +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1ToInt() { + return Util.byteToInt(new byte[] {codes[pos++]}); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] {codes[pos++], codes[pos++]}); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] {codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[] {codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + } + + public void back(int n) { + this.pos -= n; + } + + +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..f190f54915 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ClassFileLoader.java @@ -0,0 +1,52 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.clz.ClassFile; +import java.io.IOException; +import java.io.File; +import java.io.FileInputStream; +import java.util.List; +import java.util.ArrayList; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +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); + } +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ClassFileParser.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..4b77190a04 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/loader/ClassFileParser.java @@ -0,0 +1,107 @@ +package com.sprint.jvm.loader; + +import com.sprint.jvm.clz.ClassFile; +import com.sprint.jvm.clz.AccessFlag; +import com.sprint.jvm.clz.ClassIndex; +import com.sprint.jvm.constant.ClassInfo; +import com.sprint.jvm.constant.ConstantPool; +import com.sprint.jvm.constant.FieldRefInfo; +import com.sprint.jvm.constant.NameAndTypeInfo; +import com.sprint.jvm.constant.NullConstantInfo; +import com.sprint.jvm.constant.MethodRefInfo; +import com.sprint.jvm.constant.StringInfo; +import com.sprint.jvm.constant.UTF8Info; +import java.io.UnsupportedEncodingException; +public class ClassFileParser { + public ClassFile parse(byte[] codes) { + ClassFile clzFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + String magicNumber = iter.nextU4ToHexString(); + if (!"cafebabe".equals(magicNumber)) { + return null; + } + clzFile.setMinorVersion(iter.nextU2ToInt()); + System.out.println("minor:" + clzFile.getMinorVersion()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + System.out.println("marjor:" + clzFile.getMajorVersion()); + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstantPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex clzIndex = parseClassIndex(iter); + clzFile.setClassIndex(clzIndex); + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + return flag; + } + + private ClassIndex parseClassIndex(ByteCodeIterator iter) { + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + + ClassIndex clzIndex = new ClassIndex(); + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + return clzIndex; + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + int constPoolCount = iter.nextU2ToInt(); + System.out.println("Constant Pool Count :" + constPoolCount); + ConstantPool pool = new ConstantPool(); + pool.addConstantInfo(new NullConstantInfo()); + for (int i = 1; i <= constPoolCount - 1; i++) { + int tag = iter.nextU1ToInt(); + if (tag == 7) { + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setUtf8Index(utf8Index); + pool.addConstantInfo(clzInfo); + } else if (tag == 1) { + int len = iter.nextU2ToInt(); + byte[] data = iter.getBytes(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + } else if (tag == 8) { + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == 9) { + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == 10) { + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == 12) { + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setIndex1(iter.nextU2ToInt()); + nameType.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag:" + tag + "has no been implemented yet."); + } + } + System.out.println("Finished reading Constant Pool"); + return pool; + } + + +} diff --git a/group11/1178243325/week10/src/main/java/com/sprint/jvm/util/Util.java b/group11/1178243325/week10/src/main/java/com/sprint/jvm/util/Util.java new file mode 100644 index 0000000000..0f5dc89626 --- /dev/null +++ b/group11/1178243325/week10/src/main/java/com/sprint/jvm/util/Util.java @@ -0,0 +1,22 @@ +package com.sprint.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 < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } +} diff --git a/group11/1178243325/week10/src/test/java/com/sprint/datastructure/CircleQueueTest.java b/group11/1178243325/week10/src/test/java/com/sprint/datastructure/CircleQueueTest.java new file mode 100644 index 0000000000..d61b0ce8cc --- /dev/null +++ b/group11/1178243325/week10/src/test/java/com/sprint/datastructure/CircleQueueTest.java @@ -0,0 +1,45 @@ +package com.sprint.datastructure; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class CircleQueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(5); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertTrue(queue.isFull()); + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } + +} diff --git a/group11/1178243325/week10/src/test/java/com/sprint/datastructure/JosephusTest.java b/group11/1178243325/week10/src/test/java/com/sprint/datastructure/JosephusTest.java new file mode 100644 index 0000000000..353d9b0d73 --- /dev/null +++ b/group11/1178243325/week10/src/test/java/com/sprint/datastructure/JosephusTest.java @@ -0,0 +1,27 @@ +package com.sprint.datastructure; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group11/1178243325/week10/src/test/java/com/sprint/datastructure/QueueWithTwoStacksTest.java b/group11/1178243325/week10/src/test/java/com/sprint/datastructure/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..a5eb27c758 --- /dev/null +++ b/group11/1178243325/week10/src/test/java/com/sprint/datastructure/QueueWithTwoStacksTest.java @@ -0,0 +1,28 @@ +package com.sprint.datastructure; + +import org.junit.Assert; +import org.junit.Test; +public class QueueWithTwoStacksTest { + + @Test + public void test() { + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + Assert.assertTrue(queue.isEmpty()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } +} From 82b020f30f80e735a6f28cef015b89aaaf608ae2 Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 22:35:59 +0800 Subject: [PATCH 424/552] week6, jvm1 --- group11/1178243325/week06/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group11/1178243325/week06/readme.md b/group11/1178243325/week06/readme.md index d89a5c904e..df09ad3398 100644 --- a/group11/1178243325/week06/readme.md +++ b/group11/1178243325/week06/readme.md @@ -2,7 +2,7 @@ - 17-03-27:JVM第一周 - 17-03-29:JVM之classLoader -## 第六周作业(3-27 至 04-02) +## 第六周作业---JVM(1)(3-27 至 04-02) - 完成对一个.class文件的读取和对.class文件开头四个字节的魔数的判断需要实现ClassLoader.java - 实现LRU算法 - 一篇文章 From 8746f354ef14b9fe2cab5530fc0eb73e5a66183e Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 22:37:49 +0800 Subject: [PATCH 425/552] week7, JVM2 --- group11/1178243325/week07/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group11/1178243325/week07/readme.md b/group11/1178243325/week07/readme.md index 4907ae371a..af37f44357 100644 --- a/group11/1178243325/week07/readme.md +++ b/group11/1178243325/week07/readme.md @@ -1,7 +1,7 @@ ## 讲课内容: - 17-03-29 :JVM之classLoader -## 第七周作业(04-03 至 04-09) +## 第七周作业---JVM(2)(04-03 至 04-09) - 实现对一个.class文件的常量池读取 - 实现StackUtil - [文章](http://www.jianshu.com/p/502c1e5caa97) From 50ec5ae414c09f617042a03db06f8a8e70f29e24 Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 22:38:05 +0800 Subject: [PATCH 426/552] week7, JVM2 --- group11/1178243325/week07/.readme.md.swp | Bin 12288 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 group11/1178243325/week07/.readme.md.swp diff --git a/group11/1178243325/week07/.readme.md.swp b/group11/1178243325/week07/.readme.md.swp deleted file mode 100644 index 0404364aff8e4caed53c577968eab16225ba1412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI%J#W)M90u?!6B4h25d?-Tbco-Q$PM2BL?_fD1PsPDZJH*w5~taqsHBNR)lvyn z$SSAC6BtpTOs&1FFO);C~PpDz)ke=sEfE*>~sj-EXseTOGYLEE#f| zQ8~`owXcV+f4X^wJ=Yj3d!<~_7ae<-{f@i)YoIb=PMM13+KxEoietK}8Om76t$3QI zXqqvkr&B3Cqf{LyuNq3pG3|mQ7wo-PfnEqeU{`^Pe>h3FK!0n8`}M$%x_^rb0uX=z1Rwwb2tWV=5P$## zAOL}XP{5?W>Z?Z?`%V%6|9^k~e>=w57s_YKDrJgdQ*_E%%4y0e%0Y^FR@5jEfB*y_ z009U<00Izz00bZafxkq6*V^J}K8u&9w}Q?1NsB)X;<@`Qk&xoXVmEjYKW_KtKWuLV zjJbKy%$sv@<54_QP%i|T8yF&q}n?%cH|l=i$$Z Yuehe|l*BZ>=G$Itlh4+8vm Date: Fri, 5 May 2017 22:39:16 +0800 Subject: [PATCH 427/552] week8, JVM3 --- group11/1178243325/week08/readme.md | 2 +- .../week08/src/test/java/InfixExprTest.java | 52 ------------------- .../week08/src/test/java/TokenParserTest.java | 41 --------------- 3 files changed, 1 insertion(+), 94 deletions(-) delete mode 100644 group11/1178243325/week08/src/test/java/InfixExprTest.java delete mode 100644 group11/1178243325/week08/src/test/java/TokenParserTest.java diff --git a/group11/1178243325/week08/readme.md b/group11/1178243325/week08/readme.md index 0a19cc9b31..1d096b5807 100644 --- a/group11/1178243325/week08/readme.md +++ b/group11/1178243325/week08/readme.md @@ -1,6 +1,6 @@ ## 讲课内容: -## 第八周作业(04-10 至 04-16) +## 第八周作业---JVM(3)(04-10 至 04-16) - 实现对一个.class文件的字段和方法的读取,需要实现的类是ClassFileParser.java及其相关的类,实现后需要通过测试:ClassFileloaderTest.java - 数据结构,实现InfixExpr.java,需要通过InfixExprTest.java - 写一篇文章 diff --git a/group11/1178243325/week08/src/test/java/InfixExprTest.java b/group11/1178243325/week08/src/test/java/InfixExprTest.java deleted file mode 100644 index bf8907c9b6..0000000000 --- a/group11/1178243325/week08/src/test/java/InfixExprTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.sprint.datastructure; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("10-2*3+50"); - Assert.assertEquals(54, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group11/1178243325/week08/src/test/java/TokenParserTest.java b/group11/1178243325/week08/src/test/java/TokenParserTest.java deleted file mode 100644 index 67ccfb52f0..0000000000 --- a/group11/1178243325/week08/src/test/java/TokenParserTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.sprint.datastructure; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} From 2e169de0851a498b2c9e0210b6cbbaaf4ec22edd Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 22:40:35 +0800 Subject: [PATCH 428/552] week9, JVM4 --- group11/1178243325/week09/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group11/1178243325/week09/readme.md b/group11/1178243325/week09/readme.md index 87a00d3b10..57bf01280a 100644 --- a/group11/1178243325/week09/readme.md +++ b/group11/1178243325/week09/readme.md @@ -1,6 +1,6 @@ ## 讲课内容: -## 第九周作业(JVM第4次作业)(04-17 至 04-23) +## 第九周作业---JVM(4)(04-17 至 04-23) - 把字节码指令转变为java对象, 需要实现的类: CommandParser.java - 实现类似的javap命令, 需要实现的类:ClassFilePrinter.java - 数据结构,实现前缀表达计算PrefixExpr.java,后缀表达计算PostfixExpr.java,中缀表达式转后缀表达式InfixToPostfix.java From fa0ad11cc177fc7b86c86b01ec03031f14e0950c Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Fri, 5 May 2017 22:42:17 +0800 Subject: [PATCH 429/552] week10, JVM5 --- group11/1178243325/week10/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/group11/1178243325/week10/readme.md b/group11/1178243325/week10/readme.md index 4253c3569f..0c1085521b 100644 --- a/group11/1178243325/week10/readme.md +++ b/group11/1178243325/week10/readme.md @@ -1,6 +1,6 @@ ## 讲课内容: -## 第10周作业(JVM第5次作业)(04-24 至 04-30) +## 第10周作业---JVM(5)(04-24 至 04-30) - 实现一个简单的执行引擎,主要代码engine cmd - 数据结构,实现循环队列CircleQueue.java,约瑟夫环Josephus.java,用两个栈实现队列QueueWithTwoStacks.java - 写一篇文章 From a0bc5b0c668922e1af0cd6d378badfc8021c450b Mon Sep 17 00:00:00 2001 From: HuiZhou-Xmu <1814014897@qq.com> Date: Fri, 5 May 2017 23:40:18 +0800 Subject: [PATCH 430/552] =?UTF-8?q?=E7=AC=AC=E5=85=AB=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/week08/jvm/attr/AttributeInfo.java | 19 + .../zhouhui/src/week08/jvm/attr/CodeAttr.java | 116 ++++++ .../src/week08/jvm/attr/LineNumberTable.java | 71 ++++ .../week08/jvm/attr/LocalVariableItem.java | 39 +++ .../week08/jvm/attr/LocalVariableTable.java | 60 ++++ .../src/week08/jvm/attr/StackMapTable.java | 30 ++ .../src/week08/jvm/clz/AccessFlag.java | 25 ++ .../zhouhui/src/week08/jvm/clz/ClassFile.java | 117 +++++++ .../src/week08/jvm/clz/ClassIndex.java | 19 + .../zhouhui/src/week08/jvm/cmd/BiPushCmd.java | 32 ++ .../src/week08/jvm/cmd/ByteCodeCommand.java | 129 +++++++ .../src/week08/jvm/cmd/CommandParser.java | 157 +++++++++ .../src/week08/jvm/cmd/GetFieldCmd.java | 33 ++ .../src/week08/jvm/cmd/GetStaticFieldCmd.java | 30 ++ .../src/week08/jvm/cmd/InvokeSpecialCmd.java | 32 ++ .../src/week08/jvm/cmd/InvokeVirtualCmd.java | 34 ++ .../zhouhui/src/week08/jvm/cmd/LdcCmd.java | 39 +++ .../src/week08/jvm/cmd/NewObjectCmd.java | 30 ++ .../src/week08/jvm/cmd/NoOperandCmd.java | 31 ++ .../src/week08/jvm/cmd/OneOperandCmd.java | 27 ++ .../src/week08/jvm/cmd/PutFieldCmd.java | 26 ++ .../src/week08/jvm/cmd/TwoOperandCmd.java | 67 ++++ .../src/week08/jvm/constant/ClassInfo.java | 28 ++ .../src/week08/jvm/constant/ConstantInfo.java | 40 +++ .../src/week08/jvm/constant/ConstantPool.java | 31 ++ .../src/week08/jvm/constant/FieldRefInfo.java | 58 +++ .../week08/jvm/constant/MethodRefInfo.java | 60 ++++ .../week08/jvm/constant/NameAndTypeInfo.java | 51 +++ .../week08/jvm/constant/NullConstantInfo.java | 17 + .../src/week08/jvm/constant/StringInfo.java | 32 ++ .../src/week08/jvm/constant/UTF8Info.java | 37 ++ .../week08/jvm/engine/ExecutionResult.java | 53 +++ .../src/week08/jvm/engine/ExecutorEngine.java | 82 +++++ .../zhouhui/src/week08/jvm/engine/Heap.java | 39 +++ .../src/week08/jvm/engine/JavaObject.java | 71 ++++ .../src/week08/jvm/engine/MethodArea.java | 87 +++++ .../src/week08/jvm/engine/MiniJVM.java | 28 ++ .../src/week08/jvm/engine/StackFrame.java | 131 +++++++ .../zhouhui/src/week08/jvm/field/Field.java | 50 +++ .../week08/jvm/loader/ByteCodeIterator.java | 57 +++ .../week08/jvm/loader/ClassFileLoader.java | 123 +++++++ .../week08/jvm/loader/ClassFileParser.java | 176 ++++++++++ .../zhouhui/src/week08/jvm/method/Method.java | 155 +++++++++ .../week08/jvm/print/ClassFilePrinter.java | 52 +++ .../week08/jvm/print/ConstantPoolPrinter.java | 103 ++++++ .../week08/jvm/test/ClassFileloaderTest.java | 329 ++++++++++++++++++ .../src/week08/jvm/test/EmployeeV1.java | 28 ++ .../src/week08/jvm/test/MiniJVMTest.java | 28 ++ .../zhouhui/src/week08/jvm/util/Util.java | 24 ++ .../zhouhui/src/week08/queue/CircleQueue.java | 50 +++ .../zhouhui/src/week08/queue/Josephus.java | 32 ++ .../zhouhui/src/week08/queue/Queue.java | 61 ++++ .../src/week08/queue/QueueWithTwoStacks.java | 46 +++ .../week08/queue/test/CircleQueueTest.java | 43 +++ .../src/week08/queue/test/JosephusTest.java | 29 ++ .../src/week08/queue/test/QueueTest.java | 46 +++ .../queue/test/QueueWithTwoStacksTest.java | 46 +++ 57 files changed, 3486 insertions(+) create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/attr/AttributeInfo.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/attr/CodeAttr.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/attr/LineNumberTable.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/attr/LocalVariableItem.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/attr/LocalVariableTable.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/attr/StackMapTable.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/clz/AccessFlag.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/clz/ClassFile.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/clz/ClassIndex.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/BiPushCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/ByteCodeCommand.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/CommandParser.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/GetFieldCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/LdcCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/NewObjectCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/NoOperandCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/OneOperandCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/PutFieldCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/cmd/TwoOperandCmd.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/ClassInfo.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/ConstantInfo.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/ConstantPool.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/FieldRefInfo.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/MethodRefInfo.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/NameAndTypeInfo.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/NullConstantInfo.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/StringInfo.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/constant/UTF8Info.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/engine/ExecutionResult.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/engine/ExecutorEngine.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/engine/Heap.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/engine/JavaObject.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/engine/MethodArea.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/engine/MiniJVM.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/engine/StackFrame.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/field/Field.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/loader/ByteCodeIterator.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/loader/ClassFileLoader.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/loader/ClassFileParser.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/method/Method.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/print/ClassFilePrinter.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/print/ConstantPoolPrinter.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/test/ClassFileloaderTest.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/test/EmployeeV1.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/test/MiniJVMTest.java create mode 100644 group01/1814014897/zhouhui/src/week08/jvm/util/Util.java create mode 100644 group01/1814014897/zhouhui/src/week08/queue/CircleQueue.java create mode 100644 group01/1814014897/zhouhui/src/week08/queue/Josephus.java create mode 100644 group01/1814014897/zhouhui/src/week08/queue/Queue.java create mode 100644 group01/1814014897/zhouhui/src/week08/queue/QueueWithTwoStacks.java create mode 100644 group01/1814014897/zhouhui/src/week08/queue/test/CircleQueueTest.java create mode 100644 group01/1814014897/zhouhui/src/week08/queue/test/JosephusTest.java create mode 100644 group01/1814014897/zhouhui/src/week08/queue/test/QueueTest.java create mode 100644 group01/1814014897/zhouhui/src/week08/queue/test/QueueWithTwoStacksTest.java diff --git a/group01/1814014897/zhouhui/src/week08/jvm/attr/AttributeInfo.java b/group01/1814014897/zhouhui/src/week08/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..d4e2cffaa5 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package week08.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/attr/CodeAttr.java b/group01/1814014897/zhouhui/src/week08/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..497f218027 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/attr/CodeAttr.java @@ -0,0 +1,116 @@ +package week08.jvm.attr; + +import week08.jvm.attr.AttributeInfo; +import week08.jvm.attr.CodeAttr; +import week08.jvm.attr.LineNumberTable; +import week08.jvm.attr.LocalVariableTable; +import week08.jvm.attr.StackMapTable; +import week08.jvm.clz.ClassFile; +import week08.jvm.cmd.ByteCodeCommand; +import week08.jvm.cmd.CommandParser; +import week08.jvm.constant.ConstantPool; +import week08.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, + ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + + System.out.println(code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); + + int exceptionTableLen = iter.nextU2ToInt(); + + if (exceptionTableLen > 0) { + String exTable = iter.nextUxToHexString(exceptionTableLen); + System.out.println("Encountered exception table,just ignore it"); + } + + int subAttrCount = iter.nextU2ToInt(); + + for (int i = 1; i <= subAttrCount; i++) { + int subAttrIndex = iter.nextU2ToInt(); + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); + + iter.back(2); + + if (AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)) { + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } else if (AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)) { + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)) { + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else { + throw new RuntimeException("Need code to process " + subAttrName); + } + } + + return codeAttr; + } + + public String toString(ConstantPool pool) { + StringBuilder buffer = new StringBuilder(); + // buffer.append("Code:").append(code).append("\n"); + for (int i = 0; i < cmds.length; i++) { + buffer.append(cmds[i].toString(pool)).append("\n"); + } + buffer.append("\n"); + buffer.append(this.lineNumTable.toString()); + buffer.append(this.localVarTable.toString(pool)); + return buffer.toString(); + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/attr/LineNumberTable.java b/group01/1814014897/zhouhui/src/week08/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..b9cc3de62c --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/attr/LineNumberTable.java @@ -0,0 +1,71 @@ +package week08.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import week08.jvm.attr.LineNumberTable; +import week08.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter) { + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index, len); + + int itemLen = iter.nextU2ToInt(); + + for (int i = 1; i <= itemLen; i++) { + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString() { + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for (LineNumberItem item : items) { + buffer.append("startPC:" + item.getStartPC()).append(","); + buffer.append("lineNum:" + item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/attr/LocalVariableItem.java b/group01/1814014897/zhouhui/src/week08/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..5c3ea9521a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package week08.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/attr/LocalVariableTable.java b/group01/1814014897/zhouhui/src/week08/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..ad4ca5a92d --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/attr/LocalVariableTable.java @@ -0,0 +1,60 @@ +package week08.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import week08.jvm.attr.LocalVariableItem; +import week08.jvm.attr.LocalVariableTable; +import week08.jvm.constant.ConstantPool; + +import week08.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index, len); + + int itemLen = iter.nextU2ToInt(); + + for (int i = 1; i <= itemLen; i++) { + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/attr/StackMapTable.java b/group01/1814014897/zhouhui/src/week08/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..a95fc1cd0d --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package week08.jvm.attr; + + +import week08.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/clz/AccessFlag.java b/group01/1814014897/zhouhui/src/week08/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..17f0c41745 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package week08.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/group01/1814014897/zhouhui/src/week08/jvm/clz/ClassFile.java b/group01/1814014897/zhouhui/src/week08/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..3dd75f3649 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/clz/ClassFile.java @@ -0,0 +1,117 @@ +package week08.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import week08.jvm.constant.ClassInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.field.Field; +import week08.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + for(Method m : methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + public Method getMainMethod(){ + for(Method m : methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ + return m; + } + } + return null; + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/clz/ClassIndex.java b/group01/1814014897/zhouhui/src/week08/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..1f9c49ad9d --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package week08.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/group01/1814014897/zhouhui/src/week08/jvm/cmd/BiPushCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..94151cfd8d --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/BiPushCmd.java @@ -0,0 +1,32 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantPool; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.Heap; +import week08.jvm.engine.JavaObject; +import week08.jvm.engine.StackFrame; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/ByteCodeCommand.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..ae5abffb22 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,129 @@ +package week08.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.StackFrame; + + +public abstract class ByteCodeCommand { + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/CommandParser.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..a73226f68b --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/CommandParser.java @@ -0,0 +1,157 @@ +package week08.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import week08.jvm.cmd.BiPushCmd; +import week08.jvm.cmd.ByteCodeCommand; +import week08.jvm.cmd.GetFieldCmd; +import week08.jvm.cmd.GetStaticFieldCmd; +import week08.jvm.cmd.InvokeSpecialCmd; +import week08.jvm.cmd.InvokeVirtualCmd; +import week08.jvm.cmd.LdcCmd; +import week08.jvm.cmd.NewObjectCmd; +import week08.jvm.cmd.NoOperandCmd; +import week08.jvm.cmd.PutFieldCmd; +import week08.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if (codes == null || codes.length() == 0) { + throw new RuntimeException("error codes"); + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (dup.equals(opCode) || aload_0.equals(opCode) || aload_1.equals(opCode) || aload_2.equals(opCode) + || iload_1.equals(opCode) || iload_2.equals(opCode) || iload_3.equals(opCode) + || fload_3.equals(opCode) || voidreturn.equals(opCode) || astore_1.equals(opCode)) { + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + }else{ + throw new RuntimeException("the code instruction " + opCode + " has not been implemented."); + } + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/GetFieldCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..d4a7bb172e --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,33 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.FieldRefInfo; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.JavaObject; +import week08.jvm.engine.StackFrame; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + + } + + + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/GetStaticFieldCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..a184a482fa --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,30 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.FieldRefInfo; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.Heap; +import week08.jvm.engine.JavaObject; +import week08.jvm.engine.StackFrame; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/InvokeSpecialCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..531d9bde68 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,32 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.MethodRefInfo; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.MethodArea; +import week08.jvm.engine.StackFrame; +import week08.jvm.method.Method; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/InvokeVirtualCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..1ad7672b77 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,34 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.MethodRefInfo; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.JavaObject; +import week08.jvm.engine.MethodArea; +import week08.jvm.engine.StackFrame; +import week08.jvm.method.Method; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/LdcCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..442f8bb147 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/LdcCmd.java @@ -0,0 +1,39 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.StringInfo; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.Heap; +import week08.jvm.engine.JavaObject; +import week08.jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/NewObjectCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..c9309c713e --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,30 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ClassInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.Heap; +import week08.jvm.engine.JavaObject; +import week08.jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/NoOperandCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..f76d259c59 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,31 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantPool; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.JavaObject; +import week08.jvm.engine.StackFrame; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/OneOperandCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..9151bafd72 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/PutFieldCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..d387fd2ca6 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,26 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ConstantPool; +import week08.jvm.engine.ExecutionResult; +import week08.jvm.engine.StackFrame; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/cmd/TwoOperandCmd.java b/group01/1814014897/zhouhui/src/week08/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..2ba1392651 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package week08.jvm.cmd; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ClassInfo; +import week08.jvm.constant.ConstantInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.FieldRefInfo; +import week08.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/ClassInfo.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..71ff4cfc87 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package week08.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/ConstantInfo.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..f80b8a0890 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package week08.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/ConstantPool.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..7e0cb7bcff --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package week08.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/FieldRefInfo.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..850df3010d --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package week08.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/MethodRefInfo.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..f3c2c0e11f --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package week08.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/NameAndTypeInfo.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..99e66e7d61 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package week08.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/NullConstantInfo.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..1b46ca4f5b --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package week08.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/StringInfo.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..08e2307a18 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package week08.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/constant/UTF8Info.java b/group01/1814014897/zhouhui/src/week08/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..eaefa4bb3d --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package week08.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/engine/ExecutionResult.java b/group01/1814014897/zhouhui/src/week08/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..7334a69eb4 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/engine/ExecutionResult.java @@ -0,0 +1,53 @@ +package week08.jvm.engine; + +import week08.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + public void setNextAction(int action) { + this.nextAction = action; + } + + public boolean isPauseAndRunNewFrame() { + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + + public boolean isExitCurrentFrame() { + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd() { + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump() { + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/engine/ExecutorEngine.java b/group01/1814014897/zhouhui/src/week08/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..4d094d29e7 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/engine/ExecutorEngine.java @@ -0,0 +1,82 @@ +package week08.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import week08.jvm.attr.CodeAttr; +import week08.jvm.clz.ClassFile; +import week08.jvm.cmd.ByteCodeCommand; +import week08.jvm.constant.MethodRefInfo; +import week08.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod) { + + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); + + while (!stack.empty()) { + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if (result.isPauseAndRunNewFrame()) { + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame, nextFrame); + + stack.push(nextFrame); + + } else { + + stack.pop(); + + } + } + + } + + private void setupFunctionCallParams(StackFrame currentFrame, StackFrame nextFrame) { + + Method nextMethod = nextFrame.getMethod(); + + + List paramList = nextMethod.getParameterList(); + + //加上1 是因为要把this也传递过去 + + int paramNum = paramList.size() + 1; + + + List values = new ArrayList(); + + //数据结构知识: 从栈中取出栈顶的x个元素 + while(paramNum>0){ + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + //数据结构知识: 把一个列表倒序排列 + List params = new ArrayList(); + + for(int i=values.size()-1; i>=0 ;i--){ + params.add(values.get(i)); + } + + + nextFrame.setLocalVariableTable(params); + + } + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/engine/Heap.java b/group01/1814014897/zhouhui/src/week08/jvm/engine/Heap.java new file mode 100644 index 0000000000..ef299caa11 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package week08.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/engine/JavaObject.java b/group01/1814014897/zhouhui/src/week08/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..16715063d1 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package week08.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/engine/MethodArea.java b/group01/1814014897/zhouhui/src/week08/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..e11d42d3a6 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/engine/MethodArea.java @@ -0,0 +1,87 @@ +package week08.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.MethodRefInfo; +import week08.jvm.loader.ClassFileLoader; +import week08.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if(m == null){ + + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; + } + + + public Method getMethod(MethodRefInfo methodRef){ + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/engine/MiniJVM.java b/group01/1814014897/zhouhui/src/week08/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..6ac5c79343 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package week08.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import week08.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/field/Field.java b/group01/1814014897/zhouhui/src/week08/jvm/field/Field.java new file mode 100644 index 0000000000..e18b445be2 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/field/Field.java @@ -0,0 +1,50 @@ +package week08.jvm.field; + +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.UTF8Info; +import week08.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/loader/ByteCodeIterator.java b/group01/1814014897/zhouhui/src/week08/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..59eb73aff2 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package week08.jvm.loader; + +import java.util.Arrays; + +import week08.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/loader/ClassFileLoader.java b/group01/1814014897/zhouhui/src/week08/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..ae32538e26 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/loader/ClassFileLoader.java @@ -0,0 +1,123 @@ +package week08.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 week08.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 < this.clzPaths.size(); i++) { + buffer.append(this.clzPaths.get(i)); + if (i < this.clzPaths.size() - 1) { + buffer.append(";"); + } + } + return buffer.toString(); + } + + private byte[] loadClassFile_V1(String clzFileName) { + + BufferedInputStream bis = null; + + try { + + File f = new File(clzFileName); + + bis = new BufferedInputStream(new FileInputStream(f)); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + byte[] buffer = new byte[1024]; + int length = -1; + + while ((length = bis.read(buffer)) != -1) { + bos.write(buffer, 0, length); + } + + byte[] codes = bos.toByteArray(); + + return codes; + + } catch (IOException e) { + e.printStackTrace(); + + } finally { + if (bis != null) { + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + + } + +} \ No newline at end of file diff --git a/group01/1814014897/zhouhui/src/week08/jvm/loader/ClassFileParser.java b/group01/1814014897/zhouhui/src/week08/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..ae16323539 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/loader/ClassFileParser.java @@ -0,0 +1,176 @@ +package week08.jvm.loader; + +import java.io.UnsupportedEncodingException; + +import week08.jvm.loader.ByteCodeIterator; +import week08.jvm.clz.AccessFlag; +import week08.jvm.clz.ClassFile; +import week08.jvm.clz.ClassIndex; +import week08.jvm.constant.ClassInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.FieldRefInfo; +import week08.jvm.constant.MethodRefInfo; +import week08.jvm.constant.NameAndTypeInfo; +import week08.jvm.constant.NullConstantInfo; +import week08.jvm.constant.StringInfo; +import week08.jvm.constant.UTF8Info; +import week08.jvm.field.Field; +import week08.jvm.method.Method; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + + ClassFile clzFile = new ClassFile(); + + ByteCodeIterator iter = new ByteCodeIterator(codes); + + String magicNumber = iter.nextU4ToHexString(); + + if (!"cafebabe".equals(magicNumber)) { + return null; + } + + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + clzFile.setConstPool(pool); + + AccessFlag flag = parseAccessFlag(iter); + clzFile.setAccessFlag(flag); + + ClassIndex clzIndex = parseClassInfex(iter); + clzFile.setClassIndex(clzIndex); + + parseInterfaces(iter); + + parseFields(clzFile, iter); + + parseMethods(clzFile, iter); + + return clzFile; + } + + private AccessFlag parseAccessFlag(ByteCodeIterator iter) { + + AccessFlag flag = new AccessFlag(iter.nextU2ToInt()); + // System.out.println("Is public class: " + flag.isPublicClass()); + // System.out.println("Is final class : " + flag.isFinalClass()); + + return flag; + } + + private ClassIndex parseClassInfex(ByteCodeIterator iter) { + + int thisClassIndex = iter.nextU2ToInt(); + int superClassIndex = iter.nextU2ToInt(); + + ClassIndex clzIndex = new ClassIndex(); + + clzIndex.setThisClassIndex(thisClassIndex); + clzIndex.setSuperClassIndex(superClassIndex); + + return clzIndex; + + } + + private ConstantPool parseConstantPool(ByteCodeIterator iter) { + + int constPoolCount = iter.nextU2ToInt(); + + System.out.println("Constant Pool Count :" + constPoolCount); + + ConstantPool pool = new ConstantPool(); + + pool.addConstantInfo(new NullConstantInfo()); + + for (int i = 1; i <= constPoolCount - 1; i++) { + + int tag = iter.nextU1toInt(); + + if (tag == 7) { + // Class Info + int utf8Index = iter.nextU2ToInt(); + ClassInfo clzInfo = new ClassInfo(pool); + clzInfo.setUtf8Index(utf8Index); + + pool.addConstantInfo(clzInfo); + } else if (tag == 1) { + // UTF-8 String + int len = iter.nextU2ToInt(); + byte[] data = iter.getBytes(len); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + UTF8Info utf8Str = new UTF8Info(pool); + utf8Str.setLength(len); + utf8Str.setValue(value); + pool.addConstantInfo(utf8Str); + } else if (tag == 8) { + // String + StringInfo info = new StringInfo(pool); + info.setIndex(iter.nextU2ToInt()); + pool.addConstantInfo(info); + } else if (tag == 9) { + // FieldRef + FieldRefInfo field = new FieldRefInfo(pool); + field.setClassInfoIndex(iter.nextU2ToInt()); + field.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(field); + } else if (tag == 10) { + // MethodRef + MethodRefInfo method = new MethodRefInfo(pool); + method.setClassInfoIndex(iter.nextU2ToInt()); + method.setNameAndTypeIndex(iter.nextU2ToInt()); + pool.addConstantInfo(method); + } else if (tag == 12) { + // Name and Type Info + NameAndTypeInfo nameType = new NameAndTypeInfo(pool); + nameType.setIndex1(iter.nextU2ToInt()); + nameType.setIndex2(iter.nextU2ToInt()); + pool.addConstantInfo(nameType); + } else { + throw new RuntimeException("the constant pool tag " + tag + " has not been implemented yet."); + } + } + + System.out.println("Finished reading Constant pool "); + + return pool; + } + + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFields(ClassFile clzFile, ByteCodeIterator iter) { + int fieldCount = iter.nextU2ToInt(); + System.out.println("Field count:" + fieldCount); + for (int i = 1; i <= fieldCount; i++) { + Field f = Field.parse(clzFile.getConstantPool(), iter); + clzFile.addField(f); + } + + } + + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + int methodCount = iter.nextU2ToInt(); + System.out.println("Method count:" + methodCount); + for (int i = 1; i <= methodCount; i++) { + Method m = Method.parse(clzFile, iter); + clzFile.addMethod(m); + } + + } + + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/method/Method.java b/group01/1814014897/zhouhui/src/week08/jvm/method/Method.java new file mode 100644 index 0000000000..0db0effd34 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/method/Method.java @@ -0,0 +1,155 @@ +package week08.jvm.method; + +import week08.jvm.clz.ClassFile; +import week08.jvm.cmd.ByteCodeCommand; +import week08.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +import week08.jvm.attr.AttributeInfo; +import week08.jvm.attr.CodeAttr; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.UTF8Info; +import week08.jvm.loader.ByteCodeIterator; + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + public Method(ClassFile clzFile, int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info) pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info) pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter) { + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + Method m = new Method(clzFile, accessFlag, nameIndex, descIndex); + + for (int i = 1; i <= attribCount; i++) { + int attrNameIndex = iter.nextU2ToInt(); + String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + iter.back(2); + + if (AttributeInfo.CODE.equalsIgnoreCase(attrName)) { + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + m.setCodeAttr(codeAttr); + } else { + throw new RuntimeException("only CODE attribute is implemented"); + } + } + return m; + + } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + + public List getParameterList() { + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + } + + private String getParamAndReturnType() { + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/print/ClassFilePrinter.java b/group01/1814014897/zhouhui/src/week08/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..063c01fd41 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/print/ClassFilePrinter.java @@ -0,0 +1,52 @@ +package week08.jvm.print; + +import week08.jvm.clz.ClassFile; +import week08.jvm.constant.ClassInfo; +import week08.jvm.constant.ConstantInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.FieldRefInfo; +import week08.jvm.constant.MethodRefInfo; +import week08.jvm.constant.NameAndTypeInfo; + +import week08.jvm.constant.StringInfo; +import week08.jvm.constant.UTF8Info; +import week08.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + + public ClassFilePrinter(ClassFile clzFile) { + this.clzFile = clzFile; + } + + public void print() { + + if (clzFile.getAccessFlag().isPublicClass()) { + System.out.println("Access flag : public "); + } + System.out.println("Class Name:" + clzFile.getClassName()); + + System.out.println("Super Class Name:" + clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + } + + public static void main(String[] args) { + String path = ("" + ClassLoader.getSystemResource("")).replaceAll("file:/", ""); + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "week08.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/print/ConstantPoolPrinter.java b/group01/1814014897/zhouhui/src/week08/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..6df553a584 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,103 @@ +package week08.jvm.print; + +import java.util.Formatter; + +import week08.jvm.constant.ConstantInfo.Visitor; +import week08.jvm.constant.ClassInfo; +import week08.jvm.constant.ConstantInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.FieldRefInfo; +import week08.jvm.constant.MethodRefInfo; +import week08.jvm.constant.NameAndTypeInfo; +import week08.jvm.constant.StringInfo; +import week08.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + + ConstantPoolPrinter(ConstantPool pool) { + this.pool = pool; + } + + public void print() { + + System.out.println("Constant Pool:"); + + Visitor visitor = new Visitor() { + + @Override + public void visitClassInfo(ClassInfo info) { + Formatter f = new Formatter(System.out); + String s1 = "Class"; + String s2 = "#" + info.getUtf8Index(); + String s3 = "//" + info.getClassName(); + f.format("%-20s %-15s %-50s\n", s1, s2, s3); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + Formatter f = new Formatter(System.out); + String s1 = "FieldRef"; + String s2 = "#" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex(); + String s3 = "//" + info.getClassName() + "." + info.getFieldName() + ":" + info.getFieldType(); + f.format("%-20s %-15s %-50s\n", s1, s2, s3); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + Formatter f = new Formatter(System.out); + String s1 = "MethodRef"; + String s2 = "#" + info.getClassInfoIndex() + ".#" + info.getNameAndTypeIndex(); + String s3; + if (info.getMethodName().equals("")) { + s3 = "//" + info.getClassName() + ".\"" + info.getMethodName() + "\":" + + info.getParamAndReturnType(); + } else { + s3 = "//" + info.getClassName() + "." + info.getMethodName() + ":" + info.getParamAndReturnType(); + } + f.format("%-20s %-15s %-50s\n", s1, s2, s3); + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + Formatter f = new Formatter(System.out); + String s1 = "NameAndType"; + String s2 = "#" + info.getIndex1() + ":#" + info.getIndex2(); + String s3; + if (info.getName().equals("")) { + s3 = "//" + "\"" + info.getName() + "\"" + ":" + info.getTypeInfo(); + } else { + s3 = "//" + info.getName() + ":" + info.getTypeInfo(); + } + f.format("%-20s %-15s %-50s\n", s1, s2, s3); + } + + @Override + public void visitString(StringInfo info) { + Formatter f = new Formatter(System.out); + String s1 = "String"; + String s2 = "#" + info.getIndex(); + String s3 = "//" + info.toString(); + f.format("%-20s %-15s %-50s\n", s1, s2, s3); + + } + + @Override + public void visistUTF8(UTF8Info info) { + Formatter f = new Formatter(System.out); + String s1 = "Utf8"; + String s2 = info.getValue(); + f.format("%-20s %-15s\n", s1, s2); + } + }; + + for (int i = 1; i <= pool.getSize(); i++) { + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.printf("#%-2d = ", i); + constantInfo.accept(visitor); + } + + } +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/test/ClassFileloaderTest.java b/group01/1814014897/zhouhui/src/week08/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..0defc42915 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,329 @@ +package week08.jvm.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week08.jvm.clz.ClassFile; +import week08.jvm.clz.ClassIndex; +import week08.jvm.cmd.BiPushCmd; +import week08.jvm.cmd.ByteCodeCommand; +import week08.jvm.cmd.OneOperandCmd; +import week08.jvm.cmd.TwoOperandCmd; +import week08.jvm.constant.ClassInfo; +import week08.jvm.constant.ConstantPool; +import week08.jvm.constant.MethodRefInfo; +import week08.jvm.constant.NameAndTypeInfo; +import week08.jvm.constant.UTF8Info; +import week08.jvm.field.Field; +import week08.jvm.loader.ClassFileLoader; +import week08.jvm.method.Method; + +public class ClassFileloaderTest { + + private static final String FULL_QUALIFIED_CLASS_NAME = "week08/jvm/test/EmployeeV1"; + + static String path1 = ("" + ClassLoader.getSystemResource("")).replaceAll("file:/", ""); + static String path2 = "C:\temp"; + + static ClassFile clzFile = null; + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "week08.jvm.test.EmployeeV1"; + + clzFile = loader.loadClass(className); + + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "week08.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1040, byteCodes.length); + + } + + @Test + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "week08.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[] { byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3] }; + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + private String byteToHexString(byte[] codes) { + StringBuffer buffer = new StringBuffer(); + for (int i = 0; i < codes.length; i++) { + byte b = codes[i]; + int value = b & 0xFF; + String strHex = Integer.toHexString(value); + if (strHex.length() < 2) { + strHex = "0" + strHex; + } + buffer.append(strHex); + } + return buffer.toString(); + } + + /** + * ---------------------------------------------------------------------- + */ + + @Test + public void testVersion() { + + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); + + } + + @Test + public void testConstantPool() { + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields() { + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + + @Test + public void testMethods() { + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool, m, "", "(Ljava/lang/String;I)V", "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool, m, "setName", "(Ljava/lang/String;)V", "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool, m, "setAge", "(I)V", "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool, m, "sayHello", "()V", "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool, m, "main", "([Ljava/lang/String;)V", "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool, Method m, String expectedName, String expectedDesc, + String expectedCode) { + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand() { + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand[] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd) { + + String acctual = cmd.getOffset() + ": " + cmd.getReadableCodeText(); + + if (cmd instanceof OneOperandCmd) { + if (cmd instanceof BiPushCmd) { + acctual += " " + ((OneOperandCmd) cmd).getOperand(); + } else { + acctual += " #" + ((OneOperandCmd) cmd).getOperand(); + } + } + if (cmd instanceof TwoOperandCmd) { + acctual += " #" + ((TwoOperandCmd) cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/test/EmployeeV1.java b/group01/1814014897/zhouhui/src/week08/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..a761ff5149 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package week08.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/group01/1814014897/zhouhui/src/week08/jvm/test/MiniJVMTest.java b/group01/1814014897/zhouhui/src/week08/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..024b51bf58 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/test/MiniJVMTest.java @@ -0,0 +1,28 @@ +package week08.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import week08.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = ("" + ClassLoader.getSystemResource("")).replaceAll("file:/", ""); + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "week08.jvm.test.EmployeeV1"); + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/jvm/util/Util.java b/group01/1814014897/zhouhui/src/week08/jvm/util/Util.java new file mode 100644 index 0000000000..f4e4afa384 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/jvm/util/Util.java @@ -0,0 +1,24 @@ +package week08.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 + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + // 用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + // 队头 + private int front = 0; + // 队尾 + private int rear = 0; + + public boolean isEmpty() { + return front == rear && elementData[front] == null; + } + + public int size() { + if (isEmpty()) { + return 0; + } + return rear > front ? rear - front : DEFAULT_SIZE - (rear - front); + } + + public void enQueue(E data) { + if (this.size() >= DEFAULT_SIZE) { + throw new RuntimeException("the queue is full."); + } + elementData[rear] = data; + rear = (rear + 1) % DEFAULT_SIZE; + } + + public E deQueue() { + if (isEmpty()) { + throw new RuntimeException("this queue if empty."); + } + Object data = elementData[front]; + elementData[front] = null; + front = (front + 1) % DEFAULT_SIZE; + return (E) data; + } +} diff --git a/group01/1814014897/zhouhui/src/week08/queue/Josephus.java b/group01/1814014897/zhouhui/src/week08/queue/Josephus.java new file mode 100644 index 0000000000..b03c99423b --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/queue/Josephus.java @@ -0,0 +1,32 @@ +package week08.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 + * + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m) { + List killOrder = new ArrayList(); + Queue queue = new Queue(); + for (int i = 0; i < n; i++) { + queue.enQueue(i); + } + + while (!queue.isEmpty()) { + for (int i = 0; i < m - 1; i++) { + queue.enQueue(queue.deQueue()); + } + killOrder.add(queue.deQueue()); + } + + return killOrder; + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/queue/Queue.java b/group01/1814014897/zhouhui/src/week08/queue/Queue.java new file mode 100644 index 0000000000..debeab313e --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/queue/Queue.java @@ -0,0 +1,61 @@ +package week08.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/queue/QueueWithTwoStacks.java b/group01/1814014897/zhouhui/src/week08/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..35a3492b27 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/queue/QueueWithTwoStacks.java @@ -0,0 +1,46 @@ +package week08.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * + * @author Hui Zhou + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.isEmpty(); + } + + public int size() { + return stack1.size(); + } + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + int stack1Size = stack1.size(); + for (int i = 0; i < stack1Size; i++) { + stack2.push(stack1.pop()); + } + E deQueue = stack2.pop(); + int stack2Size = stack2.size(); + for (int i = 0; i < stack2Size; i++) { + stack1.push(stack2.pop()); + } + return deQueue; + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/queue/test/CircleQueueTest.java b/group01/1814014897/zhouhui/src/week08/queue/test/CircleQueueTest.java new file mode 100644 index 0000000000..c8608097a8 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/queue/test/CircleQueueTest.java @@ -0,0 +1,43 @@ +package week08.queue.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week08.queue.CircleQueue; + +public class CircleQueueTest { + + CircleQueue cq = new CircleQueue(); + + @Test + public void testenQueue() { + Assert.assertTrue(cq.isEmpty()); + Assert.assertEquals(0, cq.size()); + for (int i = 0; i < 10; i++) { + cq.enQueue(i); + } + Assert.assertFalse(cq.isEmpty()); + Assert.assertEquals(10, cq.size()); + for (int i = 0; i < 10; i++) { + Assert.assertEquals(i, cq.deQueue().intValue()); + } + Assert.assertTrue(cq.isEmpty()); + Assert.assertEquals(0, cq.size()); + } + + @Test + public void testdeQueue() { + for (int i = 0; i < 10; i++) { + cq.enQueue(i); + } + Assert.assertFalse(cq.isEmpty()); + Assert.assertEquals(10, cq.size()); + for (int i = 0; i < 10; i++) { + Assert.assertEquals(i, cq.deQueue().intValue()); + } + Assert.assertTrue(cq.isEmpty()); + Assert.assertEquals(0, cq.size()); + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/queue/test/JosephusTest.java b/group01/1814014897/zhouhui/src/week08/queue/test/JosephusTest.java new file mode 100644 index 0000000000..8fab3cc72a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/queue/test/JosephusTest.java @@ -0,0 +1,29 @@ +package week08.queue.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week08.queue.Josephus; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/queue/test/QueueTest.java b/group01/1814014897/zhouhui/src/week08/queue/test/QueueTest.java new file mode 100644 index 0000000000..70bfdf727a --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/queue/test/QueueTest.java @@ -0,0 +1,46 @@ +package week08.queue.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week08.queue.Queue; + +public class QueueTest { + + Queue queue = new Queue(); + + @Before + public void setUp() throws Exception { + for (int i = 0; i < 100; i++) { + queue.enQueue(i); + } + } + + @Test + public void testEnQueue() { + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(100, queue.size()); + for (int i = 100; i < 200; i++) { + queue.enQueue(i); + } + Assert.assertEquals(200, queue.size()); + for (int i = 0; i < 200; i++) { + Assert.assertEquals(i, queue.deQueue().intValue()); + } + Assert.assertTrue(queue.isEmpty()); + Assert.assertEquals(0, queue.size()); + } + + @Test + public void testDeQueue() { + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(100, queue.size()); + for (int i = 0; i < 100; i++) { + Assert.assertEquals(i, queue.deQueue().intValue()); + } + Assert.assertTrue(queue.isEmpty()); + Assert.assertEquals(0, queue.size()); + } + +} diff --git a/group01/1814014897/zhouhui/src/week08/queue/test/QueueWithTwoStacksTest.java b/group01/1814014897/zhouhui/src/week08/queue/test/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..d47acfca59 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week08/queue/test/QueueWithTwoStacksTest.java @@ -0,0 +1,46 @@ +package week08.queue.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week08.queue.QueueWithTwoStacks; + +public class QueueWithTwoStacksTest { + + QueueWithTwoStacks qwts = new QueueWithTwoStacks(); + + @Before + public void setUp() throws Exception { + for (int i = 0; i < 100; i++) { + qwts.enQueue(i); + } + } + + @Test + public void testEnQueue() { + Assert.assertFalse(qwts.isEmpty()); + Assert.assertEquals(100, qwts.size()); + for (int i = 100; i < 200; i++) { + qwts.enQueue(i); + } + Assert.assertEquals(200, qwts.size()); + for (int i = 0; i < 200; i++) { + Assert.assertEquals(i, qwts.deQueue().intValue()); + } + Assert.assertTrue(qwts.isEmpty()); + Assert.assertEquals(0, qwts.size()); + } + + @Test + public void testDeQueue() { + Assert.assertFalse(qwts.isEmpty()); + Assert.assertEquals(100, qwts.size()); + for (int i = 0; i < 100; i++) { + Assert.assertEquals(i, qwts.deQueue().intValue()); + } + Assert.assertTrue(qwts.isEmpty()); + Assert.assertEquals(0, qwts.size()); + } + +} From 23c135980d80f6279257ba646a8c87e587d39c30 Mon Sep 17 00:00:00 2001 From: Jiandan1357 Date: Sat, 6 May 2017 07:52:50 +0800 Subject: [PATCH 431/552] 7weekExpr2 7weekExpr2 --- group23/601689050/7weekExpr2/InfixExpr.java | 61 +++++++++++++++++++ .../601689050/7weekExpr2/InfixToPostfix.java | 35 +++++++++++ group23/601689050/7weekExpr2/PostfixExpr.java | 45 ++++++++++++++ .../601689050/7weekExpr2/PostfixExprTest.java | 37 +++++++++++ group23/601689050/7weekExpr2/PrefixExpr.java | 51 ++++++++++++++++ .../601689050/7weekExpr2/PrefixExprTest.java | 42 +++++++++++++ group23/601689050/7weekExpr2/Stack.java | 50 +++++++++++++++ group23/601689050/7weekExpr2/Token.java | 49 +++++++++++++++ group23/601689050/7weekExpr2/TokenParser.java | 47 ++++++++++++++ 9 files changed, 417 insertions(+) create mode 100644 group23/601689050/7weekExpr2/InfixExpr.java create mode 100644 group23/601689050/7weekExpr2/InfixToPostfix.java create mode 100644 group23/601689050/7weekExpr2/PostfixExpr.java create mode 100644 group23/601689050/7weekExpr2/PostfixExprTest.java create mode 100644 group23/601689050/7weekExpr2/PrefixExpr.java create mode 100644 group23/601689050/7weekExpr2/PrefixExprTest.java create mode 100644 group23/601689050/7weekExpr2/Stack.java create mode 100644 group23/601689050/7weekExpr2/Token.java create mode 100644 group23/601689050/7weekExpr2/TokenParser.java diff --git a/group23/601689050/7weekExpr2/InfixExpr.java b/group23/601689050/7weekExpr2/InfixExpr.java new file mode 100644 index 0000000000..77c310465e --- /dev/null +++ b/group23/601689050/7weekExpr2/InfixExpr.java @@ -0,0 +1,61 @@ +import java.util.List; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/29. + */ +public class InfixExpr { + String expr = null; + public InfixExpr(String expr){ + this.expr = expr; + } + public float evaluate(){ + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack numStack = new Stack(); + for(Token token : tokens){ + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + }else { + while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(),f1,f2); + numStack.push(result); + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + while (!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + return numStack.pop().floatValue(); + + } + + private Float calculate(String op, float f1, float f2) { + if(op.equals("+")){ + return f1 + f2; + } + if(op.equals("-")){ + return f1 - f2; + } + if(op.equals("*")){ + return f1 * f2; + } + if(op.equals("/")){ + return f1 / f2; + } + return null; + } +} diff --git a/group23/601689050/7weekExpr2/InfixToPostfix.java b/group23/601689050/7weekExpr2/InfixToPostfix.java new file mode 100644 index 0000000000..7833ebf8f7 --- /dev/null +++ b/group23/601689050/7weekExpr2/InfixToPostfix.java @@ -0,0 +1,35 @@ +import java.util.*; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/29. + */ +public class InfixToPostfix { + + String expr = null; + public InfixToPostfix(String expr){ + this.expr = expr; + } + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack allStack = new Stack<>(); + public Stack change(){ + for(Token token : tokens){ + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + }else{ + while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ + Token preOperator = opStack.pop(); + allStack.push(preOperator.toString()); + } + } + } + if (token.isNumber()){ + allStack.push(token.toString()); + } + } + return allStack; + } +} diff --git a/group23/601689050/7weekExpr2/PostfixExpr.java b/group23/601689050/7weekExpr2/PostfixExpr.java new file mode 100644 index 0000000000..5c128db330 --- /dev/null +++ b/group23/601689050/7weekExpr2/PostfixExpr.java @@ -0,0 +1,45 @@ +import java.util.*; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/29. + */ +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack numStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + if(token.isOperator()){ + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + } + return numStack.pop().floatValue(); + } + private Float calculate(String op, float f1, float f2){ + if(op.equals("+")){ + return f1 + f2; + } + if(op.equals("-")){ + return f1 - f2; + } + if(op.equals("*")){ + return f1 * f2; + } + if (op.equals("/")){ + return f1 / f2; + } + return null; + } +} diff --git a/group23/601689050/7weekExpr2/PostfixExprTest.java b/group23/601689050/7weekExpr2/PostfixExprTest.java new file mode 100644 index 0000000000..bad5b82bec --- /dev/null +++ b/group23/601689050/7weekExpr2/PostfixExprTest.java @@ -0,0 +1,37 @@ +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Lxx on 2017/4/29. + */ +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } +} diff --git a/group23/601689050/7weekExpr2/PrefixExpr.java b/group23/601689050/7weekExpr2/PrefixExpr.java new file mode 100644 index 0000000000..77652af742 --- /dev/null +++ b/group23/601689050/7weekExpr2/PrefixExpr.java @@ -0,0 +1,51 @@ +import java.util.*; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/29. + */ +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack numStack = new Stack<>(); + Stack allStack = new Stack<>(); + for (Token token : tokens) { + allStack.push(token); + } + while (!allStack.isEmpty()) { + if (allStack.peek().isNumber()) { + numStack.push(new Float(allStack.pop().getIntValue())); + } + if (allStack.peek().isOperator()) { + Token token = allStack.pop(); + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, float f1, float f2){ + if(op.equals("+")){ + return f1 + f2; + } + if(op.equals("-")){ + return f1 - f2; + } + if(op.equals("*")){ + return f1 * f2; + } + if (op.equals("/")){ + return f1 / f2; + } + return null; + } +} diff --git a/group23/601689050/7weekExpr2/PrefixExprTest.java b/group23/601689050/7weekExpr2/PrefixExprTest.java new file mode 100644 index 0000000000..8d1074d5d3 --- /dev/null +++ b/group23/601689050/7weekExpr2/PrefixExprTest.java @@ -0,0 +1,42 @@ +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Lxx on 2017/4/29. + */ +public class PrefixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + } +} diff --git a/group23/601689050/7weekExpr2/Stack.java b/group23/601689050/7weekExpr2/Stack.java new file mode 100644 index 0000000000..614ba2860c --- /dev/null +++ b/group23/601689050/7weekExpr2/Stack.java @@ -0,0 +1,50 @@ +import java.util.ArrayList; +import java.util.EmptyStackException; + +/** + * Created by Lxx on 2017/4/29. + */ +public class Stack { + public ArrayList array; + public int count; + public Stack(){ + array = new ArrayList(); + } + public void push (Object o){ + count ++ ; + array.add(o); + } + public Object pop(){ + count -- ; + Object o = array.get(count); + array.remove(o); + return o; + } + public Object peek(){ + if(count == 0){ + throw new EmptyStackException(); + } + return array.get(array.size()-1); + } + public boolean isEmpty(){ + return array.size() == 0; + } + public int size(){ + return count; + } + public String toString(){ + StringBuilder string = new StringBuilder(); + Stack s = new Stack(); + int size = this.size(); + for(int i = 0;i OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + +} diff --git a/group23/601689050/7weekExpr2/TokenParser.java b/group23/601689050/7weekExpr2/TokenParser.java new file mode 100644 index 0000000000..17716e0c08 --- /dev/null +++ b/group23/601689050/7weekExpr2/TokenParser.java @@ -0,0 +1,47 @@ +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Lxx on 2017/4/29. + */ +public class TokenParser { + public List parse(String expr){ + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + + char c = expr.charAt(i); + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR,String.valueOf(c)); + tokens.add(t); + i++; + }else if(Character.isDigit(c)){ + int nextOperatorIndex = indexOfNextOperator(i,expr); + String value = expr.substring(i,nextOperatorIndex); + Token t = new Token(Token.NUMBER,value); + tokens.add(t); + i = nextOperatorIndex; + }else { + //System.out.println("输入值不符合要求"); + i++; + } + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + while(Character.isDigit(expr.charAt(i))){ + i++; + if(i == expr.length()){ + break; + } + } + return i; + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} From 8535b404d992ba7a58b5c0f552a5514e2f6b5984 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sat, 6 May 2017 11:06:50 +0800 Subject: [PATCH 432/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E6=95=B0=E6=A0=88=EF=BC=8C2=E4=B8=AA=E9=98=9F=E5=88=97?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=A0=88=EF=BC=8C=E4=B8=80=E4=B8=AA=E6=95=B0?= =?UTF-8?q?=E7=BB=84=E5=AE=9E=E7=8E=B02=E4=B8=AA=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/QuickMinStack.java | 42 +++++++ .../basic/stack/QuickMinStackTest.java | 69 ++++++++++++ .../basic/stack/StackWithTwoQueues.java | 50 +++++++++ .../basic/stack/StackWithTwoQueuesTest.java | 49 ++++++++ .../basic/stack/TwoStackInOneArray.java | 105 ++++++++++++++++++ .../basic/stack/TwoStackInOneArrayTest.java | 88 +++++++++++++++ 6 files changed, 403 insertions(+) create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackWithTwoQueues.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackWithTwoQueuesTest.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArray.java create mode 100644 group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArrayTest.java diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..255d08ab60 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java @@ -0,0 +1,42 @@ +package com.github.miniyk2012.coding2017.basic.stack; + +import java.util.LinkedList; +import java.util.List; +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * 我用的有序链表实现的最小数栈,感觉不是好方法 + */ +public class QuickMinStack> { + List sortedList = new LinkedList(); // 从小到大排列 + Stack stack = new Stack(); + + public void push(E data){ + stack.push(data); + for (int i=0; i 0) { + i++; + } else { + sortedList.add(i, data); + return; + } + } + sortedList.add(data); + } + public E pop(){ + E result = stack.pop(); + sortedList.remove(result); + return result; + } + + /** + * 如果为空,抛异常;否则给出栈中最小数 + * @return + */ + public E findMin(){ + return sortedList.get(0); + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..f461cbf864 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java @@ -0,0 +1,69 @@ +package com.github.miniyk2012.coding2017.basic.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class QuickMinStackTest { + QuickMinStack stack; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void test() { + stack = new QuickMinStack(); + + + stack.push(5); + stack.push(3); + stack.push(2); + stack.push(4); + stack.push(1); + assertEquals(1, stack.findMin()); + assertEquals(1, stack.pop()); + assertEquals(2, stack.findMin()); + assertEquals(4, stack.pop()); + assertEquals(2, stack.findMin()); + assertEquals(2, stack.pop()); + + + assertEquals(3, stack.findMin()); // [3, 5] + + + stack.push(7); // [7,3,5] + assertEquals(3, stack.findMin()); + stack.push(-1); // [-1,7,3,5] + assertEquals(-1, stack.findMin()); + + assertEquals(-1, stack.pop()); + assertEquals(3, stack.findMin()); + assertEquals(7, stack.pop()); + assertEquals(3, stack.findMin()); // [3,5] + stack.push(3); // [3,3,5] + assertEquals(3, stack.pop()); // [3,5] + assertEquals(3, stack.findMin()); + assertEquals(3, stack.pop()); // [5] + assertEquals(5, stack.findMin()); + assertEquals(5, stack.pop()); // [] + + + //栈为空,抛出异常 + expectedEx.expect(Exception.class); + stack.findMin(); + stack.pop(); + + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackWithTwoQueues.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..015bcbc176 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,50 @@ +package com.github.miniyk2012.coding2017.basic.stack; + + +import java.util.LinkedList; +import java.util.Queue; + +public class StackWithTwoQueues { + private Queue queue1 = new LinkedList<>(); + private Queue queue2 = new LinkedList<>(); + + public boolean isEmpty() { + return queue1.isEmpty() && queue2.isEmpty(); + } + + public void push(E data) { + if (queue1.isEmpty()) { + queue1.add(data); + move(queue2, queue1); + } else { + queue2.add(data); + move(queue1, queue2); + } + } + + public E pop() { + if (!queue1.isEmpty()) { + return queue1.remove(); + } else { + return queue2.remove(); + } + } + + public E peek() { + if (!queue1.isEmpty()) { + return queue1.peek(); + } else { + return queue2.peek(); + } + } + + public int size() { + return queue1.size() + queue2.size(); + } + + private void move(Queue q1, Queue q2) { + while(!q1.isEmpty()) { + q2.add(q1.remove()); + } + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackWithTwoQueuesTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..d07ed2ec72 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,49 @@ +package com.github.miniyk2012.coding2017.basic.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + + +public class StackWithTwoQueuesTest { + StackWithTwoQueues stack; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void test() { + stack = new StackWithTwoQueues(); + assertEquals(true, stack.isEmpty()); + + stack.push(1); + stack.push(2); + stack.push(3); + assertEquals(3, stack.size()); + assertEquals(false, stack.isEmpty()); + assertEquals(3, stack.pop()); + stack.push(43); + assertEquals(43, stack.pop()); + assertEquals(2, stack.pop()); + assertEquals(1, stack.pop()); + + assertEquals(0, stack.size()); + assertEquals(true, stack.isEmpty()); + + expectedEx.expect(Exception.class); + stack.pop(); + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArray.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..6208d81cb2 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,105 @@ +package com.github.miniyk2012.coding2017.basic.stack; + +import train.Visitor_Pattern.ObjectStructure; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底, + * 压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[2]; + // + private int top1 = 0; // 前半段栈下一个要放入的位置 + private int top2 = 1; // 后半段栈下一个要放入的位置 + + /** + * 保证容量,在push前调用 + */ + private void ensureCapacity() { + // 如果2个指针相遇,则需要扩容 + if (top1 >= top2) { + int oldLength = data.length; + int newLength = oldLength * 2; + Object[] copied = new Object[newLength]; + // 拷贝前半段 + System.arraycopy(data, 0, copied, 0, size1()); + // 拷贝后半段 + System.arraycopy(data, top2+1, copied, newLength-size2(), size2()); + top2 = newLength - size2() - 1; + data = copied; + } + } + + /** + * 栈1的元素个数 + * @return + */ + public int size1() { + return top1; + } + + /** + * 栈2的元素个数 + */ + public int size2() { + return data.length - top2 - 1; + } + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(E o){ + ensureCapacity(); + data[top1++] = o; + } + /** + * 从第一个栈中弹出元素,为空抛异常 + * @return + */ + public E pop1(){ + return (E) data[--top1]; + } + + /** + * 获取第一个栈的栈顶元素,为空则返回null + * @return + */ + + public E peek1(){ + if (size1() == 0) { + return null; + } + return (E) data[top1-1]; + } + + /** + * 向第二个栈压入元素 + */ + public void push2(E o){ + ensureCapacity(); + data[top2--] = o; + } + /** + * 从第二个栈弹出元素,为空抛异常 + * @return + */ + public E pop2(){ + return (E) data[++top2]; + } + + /** + * 获取第二个栈的栈顶元素,,为空则返回null + * @return + */ + public E peek2(){ + if (size2() == 0) { + return null; + } + return (E) data[top2+1]; + } + +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArrayTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..a390199d6d --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,88 @@ +package com.github.miniyk2012.coding2017.basic.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import java.util.IntSummaryStatistics; + +public class TwoStackInOneArrayTest { + TwoStackInOneArray stack; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Test + public void test() { + stack = new TwoStackInOneArray(); + stack.push1(3); + stack.push1(5); + stack.push1(6); + stack.push1(11); + assertEquals(11, stack.peek1()); + assertEquals(11, stack.pop1()); + assertEquals(6, stack.pop1()); + stack.push1(61); + assertEquals(3, stack.size1()); + assertEquals(61, stack.pop1()); + assertEquals(5, stack.pop1()); + assertEquals(3, stack.peek1()); + assertEquals(3, stack.pop1()); + assertEquals(0, stack.size1()); + + stack.push2(123); + stack.push2(1); + stack.push2(4); + + stack.push1(3); + stack.push1(5); + stack.push1(6); + assertEquals(3, stack.size1()); + assertEquals(3, stack.size2()); + + stack.push2(123); + stack.push2(1); + stack.push2(4); + stack.push2(12); + stack.push2(2); + stack.push2(8); + assertEquals(9, stack.size2()); + assertEquals(6, stack.pop1()); + assertEquals(5, stack.peek1()); + assertEquals(5, stack.pop1()); + assertEquals(3, stack.pop1()); + + assertEquals(8, stack.pop2()); + assertEquals(2, stack.pop2()); + assertEquals(12, stack.pop2()); + assertEquals(4, stack.pop2()); + assertEquals(1, stack.pop2()); + assertEquals(123, stack.pop2()); + assertEquals(4, stack.pop2()); + assertEquals(1, stack.pop2()); + assertEquals(123, stack.pop2()); + + assertEquals(0, stack.size1()); + assertEquals(0, stack.size2()); + + assertNull(stack.peek1()); + assertNull(stack.peek2()); + // 栈1,2为空,抛出异常 + expectedEx.expect(Exception.class); + stack.pop2(); + stack.pop1(); + } + +} From 40737de164792f0072503bd262842f60b9d95a25 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sat, 6 May 2017 11:28:34 +0800 Subject: [PATCH 433/552] =?UTF-8?q?=E6=9C=80=E5=B0=8F=E6=95=B0=E6=A0=88?= =?UTF-8?q?=E6=9B=B4=E5=A5=BD=E7=9A=84=E6=96=B9=E6=B3=95=EF=BC=8CminStack?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E4=BA=86=E6=9B=BE=E7=BB=8F=E7=9A=84=E6=9C=80?= =?UTF-8?q?=E5=B0=8F=E6=95=B0=E7=9A=84=E5=85=A5=E6=A0=88=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/QuickMinStack.java | 48 +++++++++++++++++-- .../basic/stack/QuickMinStackTest.java | 2 +- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java index 255d08ab60..d1aa6229bf 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java @@ -11,10 +11,11 @@ * 我用的有序链表实现的最小数栈,感觉不是好方法 */ public class QuickMinStack> { - List sortedList = new LinkedList(); // 从小到大排列 + List sortedList = new LinkedList<>(); // 从小到大排列,对应于V1 Stack stack = new Stack(); + Stack minStack = new Stack<>(); // 更好的方法 - public void push(E data){ + public void pushV1(E data){ stack.push(data); for (int i=0; i 0) { @@ -26,7 +27,7 @@ public void push(E data){ } sortedList.add(data); } - public E pop(){ + public E popV1(){ E result = stack.pop(); sortedList.remove(result); return result; @@ -36,7 +37,46 @@ public E pop(){ * 如果为空,抛异常;否则给出栈中最小数 * @return */ - public E findMin(){ + public E findMinV1(){ return sortedList.get(0); } + + /** + * 如果为空,抛异常;否则给出栈中最小数 + * @return + */ + public E findMin(){ + return minStack.peek(); + } + + /** + * 入栈时,若data小于等于minStack的栈顶元素,则data同时入栈stack和minStack + * 否则,只入栈stack + * @param data + */ + public void push(E data) { + if (minStack.isEmpty()) { + minStack.push(data); + stack.push(data); + return; + } + + if (data.compareTo(minStack.peek()) <= 0) { + minStack.push(data); + } + stack.push(data); + } + + /** + * 若stack的栈顶元素与minStack的栈顶元素相同,则minStack也要pop + * 若为空抛异常 + * @return + */ + public E pop(){ + E result = stack.pop(); + if (result.compareTo(minStack.peek()) == 0) { + minStack.pop(); + } + return result; + } } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java index f461cbf864..3a82462631 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java @@ -58,7 +58,7 @@ public void test() { assertEquals(3, stack.pop()); // [5] assertEquals(5, stack.findMin()); assertEquals(5, stack.pop()); // [] - + //栈为空,抛出异常 expectedEx.expect(Exception.class); From 9c94437f20615b7bfaa57cd8f55d714ec6099b7a Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sat, 6 May 2017 11:30:12 +0800 Subject: [PATCH 434/552] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../miniyk2012/coding2017/basic/stack/QuickMinStack.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java index d1aa6229bf..2911f5fa09 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStack.java @@ -8,12 +8,11 @@ * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 * @author liuxin - * 我用的有序链表实现的最小数栈,感觉不是好方法 */ public class QuickMinStack> { List sortedList = new LinkedList<>(); // 从小到大排列,对应于V1 Stack stack = new Stack(); - Stack minStack = new Stack<>(); // 更好的方法 + Stack minStack = new Stack<>(); // 更好的方法,保存了曾经的最小数的入栈顺序 public void pushV1(E data){ stack.push(data); From 9eb7e6d53ea476c8c984a1555bdd37f4bcb8a1a2 Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Sat, 6 May 2017 16:26:59 +0800 Subject: [PATCH 435/552] the fifth homwork JVM, ClassFileParser, constantPool --- .../src/jvm/loader/ClassFileLoader.java | 65 +------- .../src/jvm/loader/ClassFileParser.java | 151 ++++++++++++++++++ .../test/jvm/ClassFileloaderTest.java | 108 +++++++++++-- 3 files changed, 254 insertions(+), 70 deletions(-) create mode 100644 group19/1294642551/src/jvm/loader/ClassFileParser.java diff --git a/group19/1294642551/src/jvm/loader/ClassFileLoader.java b/group19/1294642551/src/jvm/loader/ClassFileLoader.java index 8e133e40cd..7517ddc4fc 100644 --- a/group19/1294642551/src/jvm/loader/ClassFileLoader.java +++ b/group19/1294642551/src/jvm/loader/ClassFileLoader.java @@ -1,7 +1,5 @@ package jvm.loader; -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -70,68 +68,13 @@ public String getClassPath(){ } public ClassFile loadClass(String className) { -// byte[] codes = this.readBinaryCode(className); -// ClassFileParser parser = new ClassFileParser(); -// return parser.parse(codes); - return null; - - } - - - - // ------------------------------backup------------------------ - public String getClassPath_V1(){ + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); - 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()); + } } From 15b45d6a2bf4f692554cc25ae948bd681e5052c6 Mon Sep 17 00:00:00 2001 From: thomas_young Date: Sat, 6 May 2017 16:35:25 +0800 Subject: [PATCH 436/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../miniyk2012/coding2017/basic/stack/QuickMinStackTest.java | 5 +---- .../coding2017/basic/stack/TwoStackInOneArrayTest.java | 3 +-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java index 3a82462631..074f157707 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/QuickMinStackTest.java @@ -26,7 +26,6 @@ public void tearDown() throws Exception { public void test() { stack = new QuickMinStack(); - stack.push(5); stack.push(3); stack.push(2); @@ -58,11 +57,9 @@ public void test() { assertEquals(3, stack.pop()); // [5] assertEquals(5, stack.findMin()); assertEquals(5, stack.pop()); // [] - - + //栈为空,抛出异常 expectedEx.expect(Exception.class); - stack.findMin(); stack.pop(); } diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArrayTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArrayTest.java index a390199d6d..619b904ec7 100644 --- a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArrayTest.java +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/TwoStackInOneArrayTest.java @@ -79,9 +79,8 @@ public void test() { assertNull(stack.peek1()); assertNull(stack.peek2()); - // 栈1,2为空,抛出异常 + // 栈1为空,抛出异常 expectedEx.expect(Exception.class); - stack.pop2(); stack.pop1(); } From 847b7f48a3892a8c29db5c1b75c1692eaeb751c0 Mon Sep 17 00:00:00 2001 From: jy <977996067@qq.com> Date: Sat, 6 May 2017 16:55:22 +0800 Subject: [PATCH 437/552] =?UTF-8?q?5.6=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/task9/stack/QuickMinStack.java | 28 +++++ .../src/task9/stack/StackWithTwoQueue.java | 25 +++++ .../src/task9/stack/TwoStackInOneArray.java | 106 ++++++++++++++++++ 3 files changed, 159 insertions(+) create mode 100644 group15/1507_977996067/src/task9/stack/QuickMinStack.java create mode 100644 group15/1507_977996067/src/task9/stack/StackWithTwoQueue.java create mode 100644 group15/1507_977996067/src/task9/stack/TwoStackInOneArray.java diff --git a/group15/1507_977996067/src/task9/stack/QuickMinStack.java b/group15/1507_977996067/src/task9/stack/QuickMinStack.java new file mode 100644 index 0000000000..22dc3640a4 --- /dev/null +++ b/group15/1507_977996067/src/task9/stack/QuickMinStack.java @@ -0,0 +1,28 @@ +package task9.stack; + +import java.util.*; + +public class QuickMinStack> { + + private List magicList = new ArrayList<>(); + + private Stack dataStack = new Stack<>(); + + public void push(T data) { + dataStack.push(data); + magicList.add(data); + magicList.sort(Comparator.naturalOrder()); + } + + public T pop() { + T result = dataStack.pop(); + magicList.remove(result); + return result; + } + + public T findMin() { + T minResult = magicList.get(0); + dataStack.remove(minResult); // sad + return minResult; + } +} diff --git a/group15/1507_977996067/src/task9/stack/StackWithTwoQueue.java b/group15/1507_977996067/src/task9/stack/StackWithTwoQueue.java new file mode 100644 index 0000000000..51532056a0 --- /dev/null +++ b/group15/1507_977996067/src/task9/stack/StackWithTwoQueue.java @@ -0,0 +1,25 @@ +package task9.stack; + +import java.util.ArrayDeque; +import java.util.Queue; + +public class StackWithTwoQueue { + + private Queue queue1 = new ArrayDeque<>(); + private Queue queue2 = new ArrayDeque<>(); + + public void push(T data) { + queue1.add(data); + } + + public T pop() { + while (!queue1.isEmpty()) { + queue2.add(queue1.poll()); + } + T result = queue2.poll(); + while (!queue2.isEmpty()) { + queue1.add(queue2.poll()); + } + return result; + } +} diff --git a/group15/1507_977996067/src/task9/stack/TwoStackInOneArray.java b/group15/1507_977996067/src/task9/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..578c696bb1 --- /dev/null +++ b/group15/1507_977996067/src/task9/stack/TwoStackInOneArray.java @@ -0,0 +1,106 @@ +package task9.stack; + +import java.util.Objects; + +public class TwoStackInOneArray { + + private static final String INDEX_EXCEPTION_MSG = "数组越界了"; + private static final int DEFAULT_SIZE = 10; + + private Object[] data; + + private int length = DEFAULT_SIZE; + + public TwoStackInOneArray() { + data = new Object[length]; + } + + public TwoStackInOneArray(int size) { + this.length = size; + data = new Object[length]; + } + + private int leftSize = 0; + private int rightSize = 0; + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + checkIndexRange(); + data[leftSize++] = o; + } + + private void checkIndexRange() { + if (leftSize + rightSize > length) { + throw new RuntimeException(INDEX_EXCEPTION_MSG); + } + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + if (leftSize <= 0) { + throw new RuntimeException(INDEX_EXCEPTION_MSG); + } + Object result = data[0]; + Object[] temp = new Object[length]; + System.arraycopy(data, 1, temp, 0, leftSize - 1); + System.arraycopy(data, length - rightSize, temp, length - rightSize, rightSize); + data = temp; + leftSize--; + return result; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return data[0]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + checkIndexRange(); + data[length - rightSize - 1] = o; + rightSize++; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + if (rightSize <= 0) { + throw new RuntimeException(INDEX_EXCEPTION_MSG); + } + Object result = data[length - 1]; + Object[] temp = new Object[length]; + System.arraycopy(data, 0, temp, 0, leftSize); + System.arraycopy(data, length - rightSize, temp, length - rightSize + 1, rightSize - 1); + data = temp; + leftSize--; + return result; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + return data[length - 1]; + } +} From f7c90f1cafbd018975ed1935b2e5f7007d46e432 Mon Sep 17 00:00:00 2001 From: ZhaoHongxin Date: Sat, 6 May 2017 17:01:10 +0800 Subject: [PATCH 438/552] =?UTF-8?q?queue=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/queue/CircleQueue.java | 69 +++++++++++++++++++ .../src/com/coding/basic/queue/Josephus.java | 33 +++++++++ .../com/coding/basic/queue/JosephusTest.java | 27 ++++++++ .../src/com/coding/basic/queue/Queue.java | 61 ++++++++++++++++ .../basic/queue/QueueWithTwoStacks.java | 55 +++++++++++++++ .../com/coding/basic/stack/QuickMinStack.java | 19 +++++ .../basic/stack/StackWithTwoQueues.java | 16 +++++ .../basic/stack/TwoStackInOneArray.java | 57 +++++++++++++++ 8 files changed, 337 insertions(+) create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/queue/Josephus.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/queue/Queue.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group05/1094051862/mini-jvm/src/com/coding/basic/stack/TwoStackInOneArray.java diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/queue/CircleQueue.java b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..40ca7613d9 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,69 @@ +package com.coding.basic.queue; + +/** + * 用数组实现循环队列 + * 没有牺牲一个元素空间,所以判断队空,队满需要取数据验证。 + * @author zhaohongxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + + return elementData[front]==null; + + } + + public int size() { + if (isFull()) { + return DEFAULT_SIZE; + } else if (isEmpty()) { + return 0; + } else if (front < rear) { + return rear - front; + } else { + return rear + DEFAULT_SIZE -front; + } + } + + public void enQueue(E data) { + if (isFull()) { + throw new RuntimeException("queue is full"); + } + elementData[rear] = data; + if (rear == DEFAULT_SIZE ) { + rear = 0; + } else { + rear++; + } + } + + public E deQueue() { + if (isEmpty()) { + throw new RuntimeException("queue is empty"); + } + E a = (E) elementData[front]; + elementData[front] = null; + if (front == DEFAULT_SIZE ) { + front = 0; + } else { + front++; + } + return a; + } + + public boolean isFull() { + return !isEmpty() && front==rear; + } +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/queue/Josephus.java b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..cea71edd88 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,33 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + Queue queue = new Queue(); + Queue q = new Queue(); + for (int i = 0; i < n; i++) { + queue.enQueue(i); + } + List list = new ArrayList(); + int count = 1; + while(queue.size()>0) { + if (count%m==0) { + list.add((Integer) queue.deQueue()); + } else { + queue.enQueue(queue.deQueue()); + } + count ++; + } + return list; + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/queue/JosephusTest.java b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7f0f2a9078 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/queue/Queue.java b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..1430d84f7c --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/Queue.java @@ -0,0 +1,61 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..ad467b9c02 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,55 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + + + public int size() { + return stack1.size()+stack2.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if (isEmpty()) { + throw new RuntimeException("queue is empty"); + } + while(stack2.isEmpty()) { + while(!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + } + return stack2.pop(); + } + + + + } + diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/QuickMinStack.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..4f257ab9fb --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,19 @@ +package com.coding.basic.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + public void push(int data){ + + } + public int pop(){ + return -1; + } + public int findMin(){ + return -1; + } +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackWithTwoQueues.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..6f1d5bd04d --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,16 @@ +package com.coding.basic.stack; + + +public class StackWithTwoQueues { + + + public void push(int data) { + + } + + public int pop() { + return -1; + } + + +} diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/TwoStackInOneArray.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..53a902ba17 --- /dev/null +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return null; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + return null; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return null; + } + +} From c9154fa3ccce09f9f1b02354ee8e07e66034b750 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Sat, 6 May 2017 18:56:12 +0800 Subject: [PATCH 439/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=8F=8A=E4=BD=BF=E7=94=A82=E4=B8=AA?= =?UTF-8?q?=E6=A0=88=E5=AE=9E=E7=8E=B0=E9=98=9F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising2017/array/ArrayUtil.java | 2 +- .../coding2017/basic/BinarySearchTree.java | 2 + .../coding2017/basic/queue/CircleQueue.java | 104 ++++++++++++++++++ .../coding2017/basic/{ => queue}/Queue.java | 4 +- .../basic/queue/QueueWithTwoStacks.java | 71 ++++++++++++ .../johnChnia/coding2017/basic/QueueTest.java | 1 + .../basic/queue/CircleQueueTest.java | 38 +++++++ .../basic/queue/QueueWithTwoStacksTest.java | 37 +++++++ 8 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/CircleQueue.java rename group24/315863321/src/main/java/com/johnChnia/coding2017/basic/{ => queue}/Queue.java (95%) create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/QueueWithTwoStacks.java create mode 100644 group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/CircleQueueTest.java create mode 100644 group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/QueueWithTwoStacksTest.java diff --git a/group24/315863321/src/main/java/com/johnChnia/coderising2017/array/ArrayUtil.java b/group24/315863321/src/main/java/com/johnChnia/coderising2017/array/ArrayUtil.java index 3126dafc53..53a0305753 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coderising2017/array/ArrayUtil.java +++ b/group24/315863321/src/main/java/com/johnChnia/coderising2017/array/ArrayUtil.java @@ -1,6 +1,6 @@ package com.johnChnia.coderising2017.array; -import com.johnChnia.coding2017.basic.Queue; +import com.johnChnia.coding2017.basic.queue.Queue; import com.johnChnia.coding2017.basic.ArrayList; diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/BinarySearchTree.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/BinarySearchTree.java index 48d3e41b12..a574b04794 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/BinarySearchTree.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/BinarySearchTree.java @@ -1,5 +1,7 @@ package com.johnChnia.coding2017.basic; +import com.johnChnia.coding2017.basic.queue.Queue; + /** * Created by john on 2017/3/13. */ diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/CircleQueue.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..4fbe2ee11e --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/CircleQueue.java @@ -0,0 +1,104 @@ +package com.johnChnia.coding2017.basic.queue; + +/** + * Created by john on 2017/5/6. + * + * NOTE:循环队列下一个为(i+1)%N,上一个为(i+N-1)%N + */ +public class CircleQueue { + private int rear = -1; + private int front = -1; + private Object[] array; + private static final int DEFAULTCAPACITY = 10; + + + /** + * 构造一个空的循环队列 + */ + public CircleQueue() { + array = new Object[DEFAULTCAPACITY]; + } + + /** + * 根据传进来的容量构造循环队列 + * + * @param capacity 队列容量 + */ + public CircleQueue(int capacity) { + array = new Object[capacity]; + } + + /** + * 循环队列长度 + * + * @return 队列长度 + */ + public int size() { + return array.length; + } + + /** + * 判断队列是否已经满了 + * + * @return 如果队列满的话返回true,否则返回false + */ + public boolean isFull() { + if ((rear + 1) % size() == front) { + return true; + } + return false; + } + + /** + * 判断队列是否为空 + * + * @return 如果队列为空返回true,否则返回false + */ + public boolean isEmpty() { + if (rear == -1 && front == -1) { + return true; + } + return false; + } + + /** + * 入队操作 + */ + public void enQueue(int item) throws Exception { + if (isFull()) { + throw new Exception("队列已满"); + } else if (isEmpty()) { + rear++; + front = rear; + array[rear] = item; + } else { + rear = (rear + 1) % size(); + array[rear] = item; + } + } + + /** + * 出队操作 + */ + public void deQueue() throws Exception { + if (isEmpty()) { + throw new Exception("队列为空"); + } else if (front == rear) { + front = -1; + rear = -1; + } else { + front = (front + 1) % size(); + } + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("("); + for (int i = 0; i <= size() - 1; i++) { + sb.append(array[i]); + sb.append(", "); + } + sb.append(")"); + return sb.toString(); + } +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/Queue.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Queue.java similarity index 95% rename from group24/315863321/src/main/java/com/johnChnia/coding2017/basic/Queue.java rename to group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Queue.java index 4d8449a8eb..4d82ad0c92 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/Queue.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Queue.java @@ -1,4 +1,6 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.queue; + +import com.johnChnia.coding2017.basic.ArrayList; import java.util.NoSuchElementException; diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/QueueWithTwoStacks.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..3fa8bb82fa --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,71 @@ +package com.johnChnia.coding2017.basic.queue; + + +import com.johnChnia.coding2017.basic.stack.Stack; + +/** + * Created by john on 2017/5/6. + * + * 参考:https://leetcode.com/articles/implement-queue-using-stacks/ + */ + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); // 队列 + stack2 = new Stack(); + } + + + public boolean isEmpty() { + if (stack1.empty()) { + return true; + } + return false; + } + + + public int size() { + if (stack1.empty()) { + return -1; + } + return stack1.size(); + } + + + /** + * 如果stack1为空,则直接加到stack1中,如果不为空,首先遍历stack1中元素全放入stack2中,再把item加入 + * stack1中,最后再遍历stack2中元素重新放回stack1中。 + * + * @param item 入队值 + */ + public void enQueue(E item) { + while (!stack1.empty()) { + stack2.push(stack1.pop()); + } + stack1.push(item); + while (!stack2.empty()) { + stack1.push(stack2.pop()); + } + } + + /** + * 出队列操作 + * + * @return 如果队列为空就返回null,否则根据先进先出原则返回元素。 + */ + public E deQueue() { + if (isEmpty()) { + return null; + } + return stack1.pop(); + } + + public String toString() { + return stack1.toString(); + } +} + diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/QueueTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/QueueTest.java index 191c6f568d..22f17c4327 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/QueueTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/QueueTest.java @@ -1,5 +1,6 @@ package com.johnChnia.coding2017.basic; +import com.johnChnia.coding2017.basic.queue.Queue; import org.junit.Before; import org.junit.Test; diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/CircleQueueTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..98a15c5c06 --- /dev/null +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/CircleQueueTest.java @@ -0,0 +1,38 @@ +package com.johnChnia.coding2017.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by john on 2017/5/6. + */ +public class CircleQueueTest { + + CircleQueue cq1; + + @Before + public void setUp() throws Exception { + cq1 = new CircleQueue(); + } + + @After + public void tearDown() throws Exception { + + + } + + @Test + public void testEnQueueAndDeQueue() throws Exception { + for (int i = 0; i < 10; i++) { + cq1.enQueue(i); + } + cq1.deQueue(); + cq1.deQueue(); + cq1.enQueue(100); + cq1.enQueue(120); + Assert.assertEquals("(100, 120, 2, 3, 4, 5, 6, 7, 8, 9, )", cq1.toString()); + } + +} \ No newline at end of file diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/QueueWithTwoStacksTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..9c9d482513 --- /dev/null +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/QueueWithTwoStacksTest.java @@ -0,0 +1,37 @@ +package com.johnChnia.coding2017.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by john on 2017/5/6. + */ +public class QueueWithTwoStacksTest { + QueueWithTwoStacks qwts; + + @Before + public void setUp() throws Exception { + qwts = new QueueWithTwoStacks<>(); + } + + @After + public void tearDown() throws Exception { + + + } + + @Test + public void testEnQueueAndDeQueue() throws Exception { + for (int i = 0; i < 10; i++) { + qwts.enQueue(i); + } + qwts.deQueue(); + qwts.deQueue(); + qwts.deQueue(); + Assert.assertEquals("3→4→5→6→7→8→9", qwts.toString()); + } + + +} \ No newline at end of file From bd6649cb3a80d99b7f2fb1c3a220297b96348660 Mon Sep 17 00:00:00 2001 From: GordenChow <513274874@qq.com> Date: Sat, 6 May 2017 19:42:57 +0800 Subject: [PATCH 440/552] =?UTF-8?q?Jvm=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jvm第五次作业提交 --- .../com/coding/basic/queue/CircleQueue.java | 80 +++++++++++++++++++ .../src/com/coding/basic/queue/Josephus.java | 44 ++++++++++ .../com/coding/basic/queue/JosephusTest.java | 27 +++++++ .../src/com/coding/basic/queue/Queue.java | 61 ++++++++++++++ .../basic/queue/QueueWithTwoStacks.java | 63 +++++++++++++++ 5 files changed, 275 insertions(+) create mode 100644 group27/513274874/data-structure/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/queue/Josephus.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/queue/Queue.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java diff --git a/group27/513274874/data-structure/src/com/coding/basic/queue/CircleQueue.java b/group27/513274874/data-structure/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..b346bb6044 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,80 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + private final static int INCREAMENT_SIZE = 5; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return front == rear; + + } + + public int size() { + return rear > front ? rear-front : elementData.length - (front-rear); + } + + + + public void enQueue(E data) { + //empty + if(this.isEmpty()){ + elementData[front] = data; + rear++; + return; + } + + //oversize enlarge elementData + if(this.size() == elementData.length){ + Object[] newElementData = new Object[elementData.length + INCREAMENT_SIZE]; + int index = 0; + for(int i = front ; i==rear; i++){ + if(i == this.size()-1){ + i = 0 ; + } + newElementData[index++] = elementData[i]; + } + + elementData = newElementData; + }else{ + if(rear == elementData.length-1){ + rear = 0; + }else{ + rear++; + } + elementData[rear] = data; + } + + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + //rear is the first element + if(rear == 0 ){ + E data = (E)elementData[rear]; + rear = elementData.length -1 ; + return data ; + }else { + return (E)elementData[rear--]; + } + + } +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/queue/Josephus.java b/group27/513274874/data-structure/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..d565c8318f --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,44 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + Queue queue = new Queue<>(); + + List killed = new ArrayList<>(); + + for(int i = 0 ;i< n ;i++){ + queue.enQueue(i); + } + + int index = 0; + + while( !queue.isEmpty()){ + + Integer num = queue.deQueue(); + + index ++; + + if(index % m == 0){ + killed.add(num); + }else { + queue.enQueue(num); + } + } + return killed; + } + + + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/queue/JosephusTest.java b/group27/513274874/data-structure/src/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d90318b51 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/queue/Queue.java b/group27/513274874/data-structure/src/com/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..c4c4b7325e --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/queue/Queue.java @@ -0,0 +1,61 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group27/513274874/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group27/513274874/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..972bde1e7b --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,63 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + //store data + private Stack stack1; + + //temp memory + private Stack stack2; + + private int size; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + size = 0 ; + } + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + + + public int size() { + return size; + } + + + + public void enQueue(E item) { + stack1.push(item); + size++; + } + + public E deQueue() { + if(this.isEmpty() ) return null; + + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + + E data = stack2.pop(); + + //put back the data + while(!stack1.isEmpty()){ + stack1.push(stack2.pop()); + } + + size--; + return data; + } + + + } + From c0e443b5e046b3647c0f11d708a92d9e4e07f472 Mon Sep 17 00:00:00 2001 From: sdnb Date: Sat, 6 May 2017 19:56:34 +0800 Subject: [PATCH 441/552] =?UTF-8?q?=E7=AC=AC=E5=85=AB=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/jvm/EmployeeV1.java | 28 ++++ .../src/com/coderising/jvm/cmd/BiPushCmd.java | 14 +- .../coderising/jvm/cmd/ByteCodeCommand.java | 4 +- .../com/coderising/jvm/cmd/GetFieldCmd.java | 14 +- .../coderising/jvm/cmd/GetStaticFieldCmd.java | 21 +++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 18 ++- .../coderising/jvm/cmd/InvokeVirtualCmd.java | 26 +++- .../src/com/coderising/jvm/cmd/LdcCmd.java | 19 ++- .../com/coderising/jvm/cmd/NewObjectCmd.java | 14 +- .../com/coderising/jvm/cmd/NoOperandCmd.java | 36 ++++- .../com/coderising/jvm/cmd/PutFieldCmd.java | 15 +++ .../jvm/engine/ExecutionResult.java | 57 ++++++++ .../coderising/jvm/engine/ExecutorEngine.java | 56 ++++++++ .../src/com/coderising/jvm/engine/Heap.java | 39 ++++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++++ .../com/coderising/jvm/engine/MethodArea.java | 71 ++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 29 +++++ .../com/coderising/jvm/engine/StackFrame.java | 123 ++++++++++++++++++ .../jvm/loader/ClassFileLoader.java | 50 ++++++- .../src/com/coderising/jvm/method/Method.java | 46 +++++++ .../coderising/jvm/print/SimpleVistor.java | 23 ++-- .../java/com/coding/week8/CircleQueue.java | 70 ++++++++++ .../main/java/com/coding/week8/Josephus.java | 41 ++++++ .../com/coding/week8/QueueWithTwoStacks.java | 58 +++++++++ .../com/coding/mini_jvm/test/MiniJVMTest.java | 32 +++++ .../com/coding/week8/CircleQueueTest.java | 55 ++++++++ .../java/com/coding/week8/JosephusTest.java | 27 ++++ .../coding/week8/QueueWithTwoStacksTest.java | 31 +++++ 28 files changed, 1055 insertions(+), 33 deletions(-) create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/EmployeeV1.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/Heap.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/JavaObject.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/MethodArea.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/MiniJVM.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/StackFrame.java create mode 100644 group24/494800949/src/main/java/com/coding/week8/CircleQueue.java create mode 100644 group24/494800949/src/main/java/com/coding/week8/Josephus.java create mode 100644 group24/494800949/src/main/java/com/coding/week8/QueueWithTwoStacks.java create mode 100644 group24/494800949/src/test/java/com/coding/mini_jvm/test/MiniJVMTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week8/CircleQueueTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week8/JosephusTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week8/QueueWithTwoStacksTest.java diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/EmployeeV1.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/EmployeeV1.java new file mode 100644 index 0000000000..e6bc33f6b0 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coding.mini_jvm.src.com.coderising.jvm; + +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/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java index eb7dafa79d..fd60d0ea7b 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -2,6 +2,10 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.Heap; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; public class BiPushCmd extends OneOperandCmd { @@ -15,7 +19,13 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } - - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOprandStack().push(jo); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java index b44d66c880..d22bd332ba 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -3,6 +3,8 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; import java.util.HashMap; import java.util.Map; @@ -123,5 +125,5 @@ public String getReadableCodeText(){ return txt; } - //public abstract void execute(StackFrame frame,FrameResult result); + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java index 5801068cb0..113f8d7702 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -2,6 +2,10 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.FieldRefInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; public class GetFieldCmd extends TwoOperandCmd { @@ -15,7 +19,13 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } - - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRefInfo = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRefInfo.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + frame.getOprandStack().push(jo.getFieldValue(fieldName)); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java index e577d1b56c..dfcd905c52 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -3,6 +3,11 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.FieldRefInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.Heap; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; public class GetStaticFieldCmd extends TwoOperandCmd { @@ -17,4 +22,20 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRefInfo = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRefInfo.getFieldName(); + String className = fieldRefInfo.getClassName(); + String fieldType = fieldRefInfo.getFieldType(); + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } +// JavaObject jo = Heap.getInstance().newObject(className); +// frame.getOprandStack().push(jo); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java index 2900bb2c60..c402bfbba9 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -3,6 +3,11 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.MethodRefInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.MethodArea; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; +import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; public class InvokeSpecialCmd extends TwoOperandCmd { @@ -17,6 +22,17 @@ public String toString(ConstantPool pool) { return super.getOperandAsMethod(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + if (methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")) { + return; + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java index ff7f0fdf14..fe95c356c7 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -3,6 +3,12 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.MethodRefInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.MethodArea; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; +import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -12,11 +18,25 @@ public InvokeVirtualCmd(ClassFile clzFile,String opCode) { @Override public String toString(ConstantPool pool) { - return super.getOperandAsMethod(pool); } - - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + MethodRefInfo methodRefInfo = (MethodRefInfo) this.getConstantInfo(this.getIndex()); + String methodName = methodRefInfo.getMethodName(); + String className = methodRefInfo.getClassName(); + if ("java/io/PrintStream".equals(className) && "println".equals(methodName)) { + JavaObject jo = frame.getOprandStack().pop(); + System.out.println("***********"+jo.toString()+"***********"); + + frame.getOprandStack().pop(); + return; + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java index abaeae3a9e..63492570ee 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -5,6 +5,9 @@ import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantInfo; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; import com.coding.mini_jvm.src.com.coderising.jvm.constant.StringInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -26,5 +29,19 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ClassFile clzFile = this.getClassFile(); + ConstantInfo info = (ConstantInfo)clzFile.getConstantPool().getConstantInfo(this.getOperand()); + String value = "TBD"; + if (info instanceof StringInfo) { + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + frame.getOprandStack().push(jo); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java index db90b82a35..40c5008a9d 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -1,7 +1,12 @@ package com.coding.mini_jvm.src.com.coderising.jvm.cmd; import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ClassInfo; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.Heap; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -15,5 +20,12 @@ public String toString(ConstantPool pool) { return super.getOperandAsClassInfo(pool); } - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + ClassInfo clzInfo = (ClassInfo) clzFile.getConstantPool().getConstantInfo(getIndex()); + JavaObject jo = Heap.getInstance().newObject(clzInfo.getClassName()); + frame.getOprandStack().push(jo); + } + + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java index 3cd045f6d3..afbbd6248e 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -3,6 +3,9 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -15,8 +18,37 @@ public String toString(ConstantPool pool) { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } - - + @Override + public void execute(StackFrame frame, ExecutionResult result) { + if (CommandParser.astore_1.equals(this.getOpCode())) { + JavaObject jo = frame.getOprandStack().pop(); + frame.setLocalVariableValue(1, jo); + } else if (CommandParser.aload_0.equals(this.getOpCode())) { + JavaObject jo = frame.getLocalVariableValue(0); + frame.getOprandStack().push(jo); + } else if (CommandParser.aload_1.equals(this.getOpCode())) { + JavaObject jo = frame.getLocalVariableValue(1); + frame.getOprandStack().push(jo); + } else if (CommandParser.iload_1.equals(this.getOpCode())) { + JavaObject jo = frame.getLocalVariableValue(1); + frame.getOprandStack().push(jo); + } else if (CommandParser.iload_2.equals(this.getOpCode())) { + JavaObject jo = frame.getLocalVariableValue(2); + frame.getOprandStack().push(jo); + } else if (CommandParser.istore_1.equals(this.getOpCode())) { + JavaObject jo = frame.getOprandStack().pop(); + frame.setLocalVariableValue(1, jo); + } else if (CommandParser.voidreturn.equals(this.getOpCode())) { + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + } else if (CommandParser.dup.equals(this.getOpCode())) { + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + } else { + throw new RuntimeException("this operator ["+this.getOpCode()+"] not support yet"); + } + } + + public int getLength(){ return 1; } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java index 6f6ecd0eb1..894e8ed53b 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -3,6 +3,11 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.FieldRefInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.NameAndTypeInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -16,5 +21,15 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + FieldRefInfo fieldRefInfo = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRefInfo.getNameAndTypeIndex()); + String fieldName = nameAndTypeInfo.getName(); + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + objectRef.setFieldValue(fieldName, fieldValue); + } + } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/ExecutionResult.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..81c353dd32 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,57 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.engine; + + +import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/ExecutorEngine.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..3ada1ae371 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,56 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.engine; + + +import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Stack; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod) { + stack.push(StackFrame.create(mainMethod)); + while (!stack.isEmpty()) { + //1 执行栈帧 + StackFrame frame = stack.peek(); + ExecutionResult executionResult = frame.execute(); + if (executionResult.isPauseAndRunNewFrame()) { + Method method = executionResult.getNextMethod(); + StackFrame nextFrame = StackFrame.create(method); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame, nextFrame); + stack.push(nextFrame); + } else { + stack.pop(); + } + } + + } + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + Method method = nextFrame.getMethod(); + List params = method.getParameterList(); + int paramNum = params.size(); + if (!method.isStatic()) { + paramNum++; + } + List args = new ArrayList<>(); + while (paramNum > 0) { + args.add(currentFrame.getOprandStack().pop()); + paramNum--; + } + Collections.reverse(args); + nextFrame.setLocalVariableTable(args); + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/Heap.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..2da0ef9e6b --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/JavaObject.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..471bd874d1 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/MethodArea.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..5abaa40308 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,71 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.engine; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.MethodRefInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ClassFileLoader; +import com.coding.mini_jvm.src.com.coderising.jvm.method.Method; + +import java.util.HashMap; +import java.util.Map; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea() { + } + + public static MethodArea getInstance() { + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader) { + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className) { + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + ClassFile classFile = findClassFile(className); + Method method = classFile.getMethod(methodName, paramAndReturnType); + if (method == null) { + throw new RuntimeException("method "+methodName+ "can't found"); + } + return method; + } + + + public Method getMethod(MethodRefInfo methodRef){ + return getMethod(methodRef.getClassName(), + methodRef.getMethodName(), methodRef.getParamAndReturnType()); + } +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/MiniJVM.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..164943f694 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,29 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.engine; + +import com.coding.mini_jvm.src.com.coderising.jvm.loader.ClassFileLoader; + +import java.io.FileNotFoundException; +import java.io.IOException; + + +public class MiniJVM { + + public void run(String[] classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + public static StackFrame create(Method m) { + + StackFrame frame = new StackFrame(m); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i 0) { + ExecutionResult result = new ExecutionResult(); + + while (index < commands.length){ + ByteCodeCommand command = commands[index]; + System.out.println("\t " + command.toString(this.getMethod().getClzFile().getConstantPool())); + command.execute(this, result); + if (result.isPauseAndRunNewFrame()) { + index++; + return result; + } + else if (result.isExitCurrentFrame()) { + return result; + } + else if (result.isRunNextCmd()) { + index++; + } + else if (result.isJump()) { + int offset = result.getNextCmdOffset(); + index = this.getNextCommandIndex(offset); + } else { + index++; + } + } + return result; + } + ExecutionResult result = new ExecutionResult(); + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + return result; + } + + + + + public void setLocalVariableTable(List values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java index 452f6bce7d..db2d2ff467 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -2,10 +2,7 @@ import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; import java.util.List; @@ -13,9 +10,11 @@ public class ClassFileLoader { + private ClassLoader classLoader; + private static final String CLASS_FILE_SUFFIX = ".class"; - private List clzPaths = new ArrayList(); - + private static List clzPaths = new ArrayList(); + public byte[] readBinaryCode(String className) { String classPath = getClassPath(); String[] paths = classPath.split(File.pathSeparator); @@ -42,6 +41,7 @@ private byte[] loadClassFile(String clzFileName) { e.printStackTrace(); return null; } + } public void addClassPath(String path) { @@ -49,8 +49,10 @@ public void addClassPath(String path) { return; } clzPaths.add(path); + + } - + public String getClassPath(){ @@ -69,4 +71,38 @@ public ClassFile loadClass(String className) { ClassFileParser classFileParser = new ClassFileParser(); return classFileParser.parse(data); } + +// public static void main(String[] args) { +// +// +// System.out.println(System.getProperty("java.library.path")); +// System.out.println(System.getProperty("java.class.path")); +// System.out.println(System.getProperty("java.home")); +//// System.getProperty("java.class.path"); +//// System.getProperty("java.class.path"); +//// System.getProperty("java.class.path"); +//// System.getProperty("java.class.path"); +// +// } + + private class MyClassLoader extends ClassLoader { + @Override + public Class loadClass(String name) throws ClassNotFoundException { + String filename = name.substring(name.lastIndexOf(".")+1) + ".class"; + try { + InputStream is = getClass().getResourceAsStream(filename); + if (is == null) { + return super.loadClass(name); + } + + byte[] b = new byte[is.available()]; + is.read(b); + return defineClass(name, b, 0, b.length); + } catch (IOException e) { + e.printStackTrace(); + } + + return super.loadClass(name); + } + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java index b848e6b515..d00ec4ac1c 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/method/Method.java @@ -4,8 +4,12 @@ import com.coding.mini_jvm.src.com.coderising.jvm.attr.CodeAttr; import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; import com.coding.mini_jvm.src.com.coderising.jvm.cmd.ByteCodeCommand; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.UTF8Info; import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; +import java.util.ArrayList; +import java.util.List; + public class Method { private int accessFlag; @@ -66,4 +70,46 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ public ByteCodeCommand[] getCmds() { return this.getCodeAttr().getCmds(); } + + public List getParameterList() { + String desc = clzFile.getConstantPool().getUTF8String(descriptorIndex); + int startIndex = desc.indexOf("(") + 1; + int endIndex = desc.lastIndexOf(")") ; + String paramStr = desc.substring(startIndex, endIndex); + List params = new ArrayList<>(); + if ("".equals(paramStr)) { + return params; + } + int pos = 0; + int length = paramStr.length(); + while (pos < length) { + if ('L' == paramStr.charAt(pos) || '['== paramStr.charAt(pos)) { + for (int i = pos; i < length; i++) { + if (paramStr.charAt(i) == ';') { + params.add(paramStr.substring(pos, i)); + pos = ++i; + break; + } + } + } else if ('I' == paramStr.charAt(pos)) { + params.add("int"); + pos++; + } else if ('F' == paramStr.charAt(pos)) { + params.add("float"); + pos++; + } else { + throw new RuntimeException("not impl param type ["+ paramStr.charAt(pos) +"] yet"); + } + } + return params; + } + + public boolean isStatic() { + return (accessFlag & 0x0004) != 0; + } + + public String getName() { + UTF8Info utf8Info = (UTF8Info)clzFile.getConstantPool().getConstantInfo(nameIndex); + return utf8Info.getValue(); + } } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java index e10e7885ba..96920a9c68 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/print/SimpleVistor.java @@ -10,47 +10,44 @@ public class SimpleVistor implements ConstantInfo.Visitor { private Formatter formatter = new Formatter(System.out); private String format = " = %-20s %-20s %-100s\n"; - private static final String HASH_KEY = "#"; - private static final String DOUBLE_SLASH = "// "; - private static final String DOT = "."; - private static final String COLON = ":"; @Override public void visitClassInfo(ClassInfo info) { formatter.format(format, "Class", - HASH_KEY + info.getUtf8Index(), - DOUBLE_SLASH + info.getClassName()); + "#" + info.getUtf8Index(), + "// " + info.getClassName()); } @Override public void visitFieldRef(FieldRefInfo info) { NameAndTypeInfo nameAndTypeInfo = (NameAndTypeInfo)info.getConstantInfo(info.getNameAndTypeIndex()); formatter.format(format, "Fieldref", - HASH_KEY + info.getClassInfoIndex() + DOT + HASH_KEY + info.getNameAndTypeIndex(), - DOUBLE_SLASH + info.getClassName() + DOT + nameAndTypeInfo.getName() + COLON + nameAndTypeInfo.getTypeInfo()); + "#" + info.getClassInfoIndex() + "." + "#" + info.getNameAndTypeIndex(), + "// " + info.getClassName() + "." + nameAndTypeInfo.getName() + ":" + nameAndTypeInfo.getTypeInfo()); } @Override public void visitMethodRef(MethodRefInfo info) { formatter.format(format, "Methodref", - HASH_KEY + info.getClassInfoIndex() + DOT + HASH_KEY + info.getNameAndTypeIndex(), - DOUBLE_SLASH + info.getClassName() + DOT + info.getMethodName()); + "#" + info.getClassInfoIndex() + "." + "#" + info.getNameAndTypeIndex(), + "// " + info.getClassName() + "." + info.getMethodName()); } @Override public void visitNameAndType(NameAndTypeInfo info) { formatter.format(format, "NameAndType", - HASH_KEY + info.getIndex1() + COLON + HASH_KEY + info.getIndex2(), - DOUBLE_SLASH + info.getName() + COLON + info.getTypeInfo()); + "#" + info.getIndex1() + ":" + "#" + info.getIndex2(), + "// " + info.getName() + ":" + info.getTypeInfo()); } @Override public void visitString(StringInfo info) { - formatter.format(format, "String", HASH_KEY + info.getIndex(), DOUBLE_SLASH + info.toString()); + formatter.format(format, "String", "#" + info.getIndex(), "// " + info.toString()); } @Override public void visistUTF8(UTF8Info info) { formatter.format(format, "Utf8", info.getValue(), ""); } + } diff --git a/group24/494800949/src/main/java/com/coding/week8/CircleQueue.java b/group24/494800949/src/main/java/com/coding/week8/CircleQueue.java new file mode 100644 index 0000000000..06f73cad5b --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week8/CircleQueue.java @@ -0,0 +1,70 @@ +package com.coding.week8; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + private int size; + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return size == 0; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + if (data == null) { + throw new IllegalArgumentException("data can't be null"); + } + elementData[rear] = data; + size++; + if ((rear = (rear + 1) % elementData.length) == front) { + doubleCapacity(); + } + } + + private void doubleCapacity() { + int oldCapacity = elementData.length; + int newCapacity = oldCapacity << 1; + Object[] elementDataNew = new Object[newCapacity]; + if (newCapacity < 0) { + throw new RuntimeException("capacitity is too big"); + } + System.arraycopy(elementData, rear, elementDataNew, 0, oldCapacity - rear ); + System.arraycopy(elementData, 0, elementDataNew, front, front ); + elementData = elementDataNew; + front = 0; + rear = oldCapacity; + } + + public E deQueue() { + if (size == 0) + return null; + @SuppressWarnings("unchecked") + E e = (E)elementData[front]; + //let gc work + elementData[front] = null; + //下标越界处理 + front = ++front % elementData.length; + size--; + return e; + } + +} diff --git a/group24/494800949/src/main/java/com/coding/week8/Josephus.java b/group24/494800949/src/main/java/com/coding/week8/Josephus.java new file mode 100644 index 0000000000..8b17a17ebb --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week8/Josephus.java @@ -0,0 +1,41 @@ +package com.coding.week8; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + CircleQueue queue = new CircleQueue(); + for (int i = 0; i < n; i++) { + queue.enQueue(i); + } + List list = new ArrayList<>(); + int j = 1; + /* + 循环将队首的元素弹出, + 若j=m则当前元素放入集合,j=1 + 若j0) { + Integer r = queue.deQueue(); + if (j == m) { + list.add(r); + j = 1; + } else if (j < m) { + queue.enQueue(r); + j++; + } + } + return list; + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/week8/QueueWithTwoStacks.java b/group24/494800949/src/main/java/com/coding/week8/QueueWithTwoStacks.java new file mode 100644 index 0000000000..fa30ad36f6 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week8/QueueWithTwoStacks.java @@ -0,0 +1,58 @@ +package com.coding.week8; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + + + public int size() { + return stack1.size() + stack2.size(); + } + + + + public void enQueue(E item) { + if(item == null){ + throw new RuntimeException("item cant be null"); + } + stack1.push(item); + } + + public E deQueue() { + if (isEmpty()) { + throw new RuntimeException("no data in queue"); + } + + if (stack2.isEmpty()) { + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + } + return stack2.pop(); + } + + + + } + diff --git a/group24/494800949/src/test/java/com/coding/mini_jvm/test/MiniJVMTest.java b/group24/494800949/src/test/java/com/coding/mini_jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..53694f30a4 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/mini_jvm/test/MiniJVMTest.java @@ -0,0 +1,32 @@ +package com.coding.mini_jvm.test; + +import com.coding.mini_jvm.src.com.coderising.jvm.engine.MiniJVM; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class MiniJVMTest { + + // static final String PATH = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; +// static String PATH = "H:\\sourceCode\\coding2017\\group24\\494800949"; + static String PATH = "H:\\sourceCode\\coding2017\\group24\\494800949\\build\\classes\\main"; + static String PATH1 = "D:\\Java\\jdk1.8.0_25\\lib\\rt.jar"; + static String PATH2 = "D:\\Java\\jdk1.8.0_25\\jre\\lib\\rt"; + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception { + String[] classPaths = {PATH, PATH1, PATH2}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coding.mini_jvm.src.com.coderising.jvm.EmployeeV1"); + + } + +} diff --git a/group24/494800949/src/test/java/com/coding/week8/CircleQueueTest.java b/group24/494800949/src/test/java/com/coding/week8/CircleQueueTest.java new file mode 100644 index 0000000000..239599e125 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week8/CircleQueueTest.java @@ -0,0 +1,55 @@ +package com.coding.week8; + + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Administrator on 2017/5/3 0003. + */ +public class CircleQueueTest { + private CircleQueue queue; + + @Before + public void setup(){ + queue = new CircleQueue<>(); + + } + @Test + public void testIsEmpty() throws Exception { + Assert.assertTrue(queue.isEmpty()); + queue.enQueue(10); + Assert.assertTrue(!queue.isEmpty()); + } + + @Test + public void testSize() throws Exception { + queue.enQueue(10); + queue.enQueue(2); + Assert.assertEquals(queue.size(), 2); + queue.deQueue(); + Assert.assertEquals(queue.size(), 1); + } + + @Test + public void testEnQueue() throws Exception { + for (int i = 0; i < 11; i++) { + queue.enQueue(i*i); + } + Assert.assertEquals((int)queue.deQueue(), 0); + Assert.assertEquals((int)queue.deQueue(), 1); + Assert.assertEquals((int)queue.deQueue(), 4); + Assert.assertEquals((int)queue.deQueue(), 9); + Assert.assertEquals((int)queue.deQueue(), 16); + Assert.assertEquals((int)queue.deQueue(), 25); + Assert.assertEquals((int)queue.deQueue(), 36); + Assert.assertEquals((int)queue.deQueue(), 49); + Assert.assertEquals((int)queue.deQueue(), 64); + Assert.assertEquals((int)queue.deQueue(), 81); + Assert.assertEquals((int)queue.deQueue(), 100); + Assert.assertEquals(queue.deQueue(), null); + } + + +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week8/JosephusTest.java b/group24/494800949/src/test/java/com/coding/week8/JosephusTest.java new file mode 100644 index 0000000000..9fa029f027 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week8/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.week8; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group24/494800949/src/test/java/com/coding/week8/QueueWithTwoStacksTest.java b/group24/494800949/src/test/java/com/coding/week8/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..86ae2b57c9 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week8/QueueWithTwoStacksTest.java @@ -0,0 +1,31 @@ +package com.coding.week8; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Administrator on 2017/5/6 0006. + */ +public class QueueWithTwoStacksTest { + + private QueueWithTwoStacks queue; + + @Before + public void setup(){ + queue = new QueueWithTwoStacks<>(); + } + @Test + public void testEnQueue() throws Exception { + queue.enQueue(1); + queue.enQueue(5); + queue.enQueue(8); + + Assert.assertEquals((int) queue.deQueue(), 1); + queue.enQueue(10); + Assert.assertEquals((int) queue.deQueue(), 5); + Assert.assertEquals((int) queue.deQueue(), 8); + Assert.assertEquals((int)queue.deQueue(), 10); + + } +} \ No newline at end of file From cf8724dd4b9f11c787031d0d9bfed31edf0a0229 Mon Sep 17 00:00:00 2001 From: unknown <白东良> Date: Sat, 6 May 2017 20:14:13 +0800 Subject: [PATCH 442/552] =?UTF-8?q?week9=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/QuickMinStack.java | 40 +++++++ .../src/StackWithTwoQueues.java | 53 ++++++++++ .../src/TwoStackInOneArray.java | 100 ++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 group23/563253496/week9_datastructure/src/QuickMinStack.java create mode 100644 group23/563253496/week9_datastructure/src/StackWithTwoQueues.java create mode 100644 group23/563253496/week9_datastructure/src/TwoStackInOneArray.java diff --git a/group23/563253496/week9_datastructure/src/QuickMinStack.java b/group23/563253496/week9_datastructure/src/QuickMinStack.java new file mode 100644 index 0000000000..3b135521a0 --- /dev/null +++ b/group23/563253496/week9_datastructure/src/QuickMinStack.java @@ -0,0 +1,40 @@ +//package com.coding.basic.stack; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * + * @author liuxin + */ +public class QuickMinStack { + LinkedList list = new LinkedList(); + LinkedList temp = new LinkedList<>(); + int min = Integer.MAX_VALUE; + + public void push(int data) { + if (data < min) { + min = data; + } + list.add(data); + } + + public int pop() { + int num = list.remove(list.size() - 1); + if (num == min) { + for (int tmp : list) { + temp.add(tmp); + } + } + Collections.sort(temp); + min = temp.get(0); + return list.remove(list.size() - 1); + } + + public int findMin() { + return min; + } +} \ No newline at end of file diff --git a/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java b/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java new file mode 100644 index 0000000000..238f5cff0f --- /dev/null +++ b/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java @@ -0,0 +1,53 @@ +/** + * Created by bdl19 on 2017/5/6. + */ + +import java.util.*; + + +public class StackWithTwoQueues { + + private Queue queue1 = new LinkedList(); + private Queue queue2 = new LinkedList(); + + public void push(int data) { + if(queue2.isEmpty()){ + queue1.add(data); + }else{ + queue2.add(data); + } + } + + public int pop() { + if (queue1.size() == 0 && queue2.size() == 0) { + throw new IndexOutOfBoundsException(); + } + + + + if(queue2.isEmpty()){ + while(!(queue1.size()==1)){ + queue2.add(queue1.remove()); + } + return queue1.remove(); + + }else{ + while(!(queue2.size()==1)){ + queue1.add(queue2.remove()); + } + return queue2.remove(); + } + + + } + + public static void main(String[] args) { + StackWithTwoQueues s = new StackWithTwoQueues(); + s.push(1); + s.push(2); + s.push(3); + for (int i = 0; i < 3; i++) { + System.out.println(s.pop()); + } + } +} \ No newline at end of file diff --git a/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java b/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java new file mode 100644 index 0000000000..28bc0a30af --- /dev/null +++ b/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java @@ -0,0 +1,100 @@ +/** + * Created by bdl19 on 2017/5/6. + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = data.length - 1; + + private boolean isFull() { + if (index1 == index2) { + return true; + } else return false; + } + + private void extendCapacity() { + Object[] temp = new Object[data.length + data.length / 2]; + for (int i = 0; i <= index1; i++) { + temp[i] = data[i]; + } + int indext = data.length - 1; + for (int i = temp.length - 1; i >= data.length - index2; i--) { + temp[i] = indext; + indext--; + } + index2 = temp.length - (temp.length - index1); + this.data = temp; + } + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + if (this.isFull()) { + extendCapacity(); + } + data[index1] = o; + index1++; + + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + index1--; + Object o = data[index1]; + data[index1] = null; + return o; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return data[index1 - 1]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + if (this.isFull()) { + extendCapacity(); + } + data[index2] = o; + index2--; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + + Object o = data[++index2]; + data[index2] = null; + return o; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + + return data[index2 + 1]; + } + +} \ No newline at end of file From 1d2afc33ceef5ebecca6da085eda6f0c7d8234bf Mon Sep 17 00:00:00 2001 From: Mandarava <569045298@qq.com> Date: Sat, 6 May 2017 21:01:44 +0800 Subject: [PATCH 443/552] pom.xml --- group03/569045298/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/group03/569045298/pom.xml b/group03/569045298/pom.xml index c2a9dd870e..ee8af60326 100644 --- a/group03/569045298/pom.xml +++ b/group03/569045298/pom.xml @@ -10,11 +10,6 @@ http://maven.apache.org - - org.junit.jupiter - junit-jupiter-api - RELEASE - junit junit From 602263069eccb0b7e5c923b5d0a893773a70c400 Mon Sep 17 00:00:00 2001 From: Mandarava <569045298@qq.com> Date: Sat, 6 May 2017 21:02:21 +0800 Subject: [PATCH 444/552] =?UTF-8?q?JVM=E7=AC=AC6=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/litestruts/LoginAction.java | 93 +++-- .../coderising/litestruts/ReflectionUtil.java | 97 ++++++ .../com/coderising/litestruts/Struts.java | 267 ++++++--------- .../main/com/coderising/litestruts/View.java | 56 +-- .../main/com/coderising/litestruts/struts.xml | 26 +- .../basic/datastructure/LinkedList.java | 174 ---------- .../com/coding/basic/datastructure/Queue.java | 2 + .../datastructure/{ => array}/ArrayList.java | 5 +- .../basic/datastructure}/array/ArrayUtil.java | 39 ++- .../datastructure/linklist/LRUPageFrame.java | 106 ++++++ .../datastructure/linklist/LinkedList.java | 321 ++++++++++++++++++ .../datastructure/stack/QuickMinStack.java | 41 +++ .../datastructure/{ => stack}/Stack.java | 4 +- .../basic/datastructure/stack/StackUtil.java | 127 +++++++ .../stack/StackWithTwoQueues.java | 54 +++ .../stack/TwoStackInOneArray.java | 86 +++++ .../stack/expr/InfixExpression.java | 15 + .../test/coderising/array/ArrayUtilTest.java | 9 +- .../coderising/litestruts/StrutsTest.java | 92 ++--- .../datastructure/TestDataStructure.java | 107 +++++- .../linklist/LRUPageFrameTest.java | 32 ++ .../stack/QuickMinStackTest.java | 34 ++ .../datastructure/stack/StackUtilTest.java | 83 +++++ .../stack/StackWithTwoQueuesTest.java | 27 ++ .../stack/TwoStackInOneArrayTest.java | 28 ++ .../stack/expr/InfixExprTest.java | 50 +++ 26 files changed, 1494 insertions(+), 481 deletions(-) create mode 100644 group03/569045298/src/main/com/coderising/litestruts/ReflectionUtil.java delete mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java rename group03/569045298/src/main/com/coding/basic/datastructure/{ => array}/ArrayList.java (94%) rename group03/569045298/src/main/com/{coderising => coding/basic/datastructure}/array/ArrayUtil.java (87%) create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/linklist/LRUPageFrame.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/linklist/LinkedList.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/stack/QuickMinStack.java rename group03/569045298/src/main/com/coding/basic/datastructure/{ => stack}/Stack.java (88%) create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/stack/StackUtil.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/stack/StackWithTwoQueues.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/stack/TwoStackInOneArray.java create mode 100644 group03/569045298/src/main/com/coding/basic/datastructure/stack/expr/InfixExpression.java create mode 100644 group03/569045298/src/test/com/coding/basic/datastructure/linklist/LRUPageFrameTest.java create mode 100644 group03/569045298/src/test/com/coding/basic/datastructure/stack/QuickMinStackTest.java create mode 100644 group03/569045298/src/test/com/coding/basic/datastructure/stack/StackUtilTest.java create mode 100644 group03/569045298/src/test/com/coding/basic/datastructure/stack/StackWithTwoQueuesTest.java create mode 100644 group03/569045298/src/test/com/coding/basic/datastructure/stack/TwoStackInOneArrayTest.java create mode 100644 group03/569045298/src/test/com/coding/basic/datastructure/stack/expr/InfixExprTest.java diff --git a/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java b/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java index 3c3de8ba91..c64f51946b 100644 --- a/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java +++ b/group03/569045298/src/main/com/coderising/litestruts/LoginAction.java @@ -1,47 +1,46 @@ -package com.coderising.litestruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * - */ -public class LoginAction { - - private String name; - - private String password; - - private String message; - - public String execute() { - if ("test".equals(name) && "1234".equals(password)) { - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getMessage() { - return this.message; - } - - public void setMessage(String message) { - this.message = message; - } -} +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + */ +public class LoginAction { + + private String name; + + private String password; + + private String message; + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/ReflectionUtil.java b/group03/569045298/src/main/com/coderising/litestruts/ReflectionUtil.java new file mode 100644 index 0000000000..cd58cc9ca9 --- /dev/null +++ b/group03/569045298/src/main/com/coderising/litestruts/ReflectionUtil.java @@ -0,0 +1,97 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by zt on 2017/3/11. + */ +public final class ReflectionUtil { + + public static Map getMethodsMap(Class clazz) { + Map methodMap = new HashMap<>(); + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + methodMap.put(method.getName(), method); + } + return methodMap; + } + + public static Map getMethodsByStartName(Class clazz, String startWithName) { + Map methodMap = new HashMap<>(); + Method[] methods = clazz.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().startsWith(startWithName)) { + methodMap.put(method.getName(), method); + } + } + return methodMap; + } + + public static Map getGetterMethods(Class clazz) { + return getMethodsByStartName(clazz, "get"); + } + + public static Map getSetterMethods(Class clazz) { + return getMethodsByStartName(clazz, "set"); + } + + public static String getMethodName(String fieldName, String startWithName) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(startWithName); + stringBuilder.append(fieldName.substring(0, 1).toUpperCase()); + stringBuilder.append(fieldName.substring(1)); + return stringBuilder.toString(); + } + + public static String getGettterMethodName(String fieldName) { + return getMethodName(fieldName, "get"); + } + + public static String getSettterMethodName(String fieldName) { + return getMethodName(fieldName, "set"); + } + + public static void setParameters(Map parameters, Object object) { + try { + Map methodMap = getSetterMethods(object.getClass()); + for (Map.Entry entry : parameters.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + Method setterMethod = methodMap.get(getSettterMethodName(key)); + setterMethod.invoke(object, value); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + public static Map getParametersMap(Class clazz, Object newInstance) { + try { + Map map = new HashMap<>(); + Map methodMap = getMethodsMap(clazz); + Field[] fields = clazz.getDeclaredFields(); + if (fields != null && fields.length > 0) { + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + String fieldName = field.getName(); + Method getterMethod = methodMap.get(getGettterMethodName(fieldName)); + Object value = getterMethod.invoke(newInstance); + map.put(fieldName, value); + } + } + return map; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/Struts.java b/group03/569045298/src/main/com/coderising/litestruts/Struts.java index 7ec84c9a2d..dff1df1d72 100644 --- a/group03/569045298/src/main/com/coderising/litestruts/Struts.java +++ b/group03/569045298/src/main/com/coderising/litestruts/Struts.java @@ -1,156 +1,111 @@ -package com.coderising.litestruts; - -import com.coderising.litestruts.StrutsBean.Action; -import com.coderising.litestruts.StrutsBean.Result; - -import org.dom4j.Attribute; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * 模拟struts执行 - * 读取类似struts.xml文件,根据xml的定义创建相关的Action类来执行 - */ -public class Struts { - - private static final String FILE_PATH = "src/main/com/coderising/litestruts/struts.xml"; - - public View runAction(String actionName, Map parameters) { - // 视图 - View view = new View(); - // 读取配置文件struts.xml - Map actions = this.xmlToList(); - if (null == actions || actions.size() == 0) { - return null; - } - try { - // 根据actionName找到相对应的class - Action action = actions.get(actionName); - Class clazz = Class.forName(action.getClassName()); - // 通过反射实例化 - Object newInstance = clazz.newInstance(); - // 获得所有方法 - Map methodMap = new HashMap<>(); - Method[] methods = clazz.getDeclaredMethods(); - for (Method method : methods) { - methodMap.put(method.getName(), method); - } - // 根据parameters中的数据,调用对象的setter方法 - for (Map.Entry entry : parameters.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - Method setterMethod = methodMap.get(settterMethodName(key)); - setterMethod.invoke(newInstance, value); - } - // 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - Method executeMethod = clazz.getMethod("execute"); - Object object = executeMethod.invoke(newInstance); - // 通过反射找到对象的所有getter方法 - Map map = new HashMap<>(); - Field[] fields = clazz.getDeclaredFields(); - if (fields != null && fields.length > 0) { - // 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - for (int i = 0; i < fields.length; i++) { - Field field = fields[i]; - String fieldName = field.getName(); - Method getterMethod = methodMap.get(gettterMethodName(fieldName)); - Object value = getterMethod.invoke(newInstance); - map.put(fieldName, value); - } - } - // 放到View对象的parameters中 - view.setParameters(map); - // 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp,放到View对象的jsp字段中 - List resultList = action.getResult(); - for (Result result : resultList) { - if (result.getName().equals(object)) { - view.setJsp(result.getValue()); - } - } - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (InstantiationException e) { - e.printStackTrace(); - } - return view; - } - - private Map xmlToList() { - Map map = new HashMap<>(); - SAXReader saxReader = new SAXReader(); - Document document; - try { - document = saxReader.read(new File(FILE_PATH)); - Element rootElement = document.getRootElement(); - Iterator iterator = rootElement.elementIterator("action"); - while (iterator.hasNext()) { - Action action = new Action(); - List results = new ArrayList<>(); - action.setResult(results); - Element element = iterator.next(); - List attributes = element.attributes(); - for (Attribute attribute : attributes) { - String attributeName = attribute.getName(); - if (attributeName.equals("name")) { - action.setName(attribute.getStringValue()); - } else if (attributeName.equals("class")) { - action.setClassName(attribute.getStringValue()); - } - } - Iterator iterator1 = element.elementIterator(); - while (iterator1.hasNext()) { - Result result = new Result(); - Element element1 = iterator1.next(); - List attributes1 = element1.attributes(); - for (Attribute attribute : attributes1) { - String attributeName = attribute.getName(); - if (attributeName.equals("name")) { - result.setName(attribute.getStringValue()); - } - } - result.setValue(element1.getStringValue()); - results.add(result); - } - map.put(action.getName(), action); - } - } catch (DocumentException e) { - e.printStackTrace(); - } - return map; - } - - private String gettterMethodName(String fieldName) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("get"); - stringBuilder.append(fieldName.substring(0, 1).toUpperCase()); - stringBuilder.append(fieldName.substring(1)); - return stringBuilder.toString(); - } - - private String settterMethodName(String fieldName) { - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("set"); - stringBuilder.append(fieldName.substring(0, 1).toUpperCase()); - stringBuilder.append(fieldName.substring(1)); - return stringBuilder.toString(); - } - -} +package com.coderising.litestruts; + +import com.coderising.litestruts.StrutsBean.Action; +import com.coderising.litestruts.StrutsBean.Result; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * 模拟struts执行 + * 读取类似struts.xml文件,根据xml的定义创建相关的Action类来执行 + */ +public class Struts { + + private static final String FILE_PATH = "src/main/com/coderising/litestruts/struts.xml"; + + public View runAction(String actionName, Map parameters) { + // 读取配置文件struts.xml + Map configuration = this.parseXML(); + if (null == configuration || configuration.size() == 0) { + return null; + } + try { + Action actions = configuration.get(actionName); + Class clazz = Class.forName(actions.getClassName()); + Object action = clazz.newInstance(); + ReflectionUtil.setParameters(parameters, action); + Method executeMethod = clazz.getMethod("execute"); + Object object = executeMethod.invoke(action); + Map map = ReflectionUtil.getParametersMap(clazz, action); + View view = new View(); + view.setParameters(map); + // 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp,放到View对象的jsp字段中 + List resultList = actions.getResult(); + for (Result result : resultList) { + if (result.getName().equals(object)) { + view.setJsp(result.getValue()); + } + } + return view; + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } + return null; + } + + private Map parseXML() { + Map map = new HashMap<>(); + SAXReader saxReader = new SAXReader(); + Document document; + try { + document = saxReader.read(new File(FILE_PATH)); + Element rootElement = document.getRootElement(); + Iterator iterator = rootElement.elementIterator("action"); + while (iterator.hasNext()) { + Action action = new Action(); + List results = new ArrayList<>(); + action.setResult(results); + Element element = iterator.next(); + List attributes = element.attributes(); + for (Attribute attribute : attributes) { + String attributeName = attribute.getName(); + if (attributeName.equals("name")) { + action.setName(attribute.getStringValue()); + } else if (attributeName.equals("class")) { + action.setClassName(attribute.getStringValue()); + } + } + Iterator iterator1 = element.elementIterator(); + while (iterator1.hasNext()) { + Result result = new Result(); + Element element1 = iterator1.next(); + List attributes1 = element1.attributes(); + for (Attribute attribute : attributes1) { + String attributeName = attribute.getName(); + if (attributeName.equals("name")) { + result.setName(attribute.getStringValue()); + } + } + result.setValue(element1.getStringValue()); + results.add(result); + } + map.put(action.getName(), action); + } + } catch (DocumentException e) { + e.printStackTrace(); + } + return map; + } + +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/View.java b/group03/569045298/src/main/com/coderising/litestruts/View.java index 258285e4f3..45c0b5e741 100644 --- a/group03/569045298/src/main/com/coderising/litestruts/View.java +++ b/group03/569045298/src/main/com/coderising/litestruts/View.java @@ -1,28 +1,28 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - - private String jsp; - - private Map parameters; - - public String getJsp() { - return jsp; - } - - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - - public Map getParameters() { - return parameters; - } - - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + + private String jsp; + + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group03/569045298/src/main/com/coderising/litestruts/struts.xml b/group03/569045298/src/main/com/coderising/litestruts/struts.xml index 561e9693c1..f82a752b96 100644 --- a/group03/569045298/src/main/com/coderising/litestruts/struts.xml +++ b/group03/569045298/src/main/com/coderising/litestruts/struts.xml @@ -1,14 +1,14 @@ - - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - - /jsp/welcome.jsp - /jsp/error.jsp - - + + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java b/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java deleted file mode 100644 index 0f4ac3231b..0000000000 --- a/group03/569045298/src/main/com/coding/basic/datastructure/LinkedList.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.coding.basic.datastructure; - -/** - * Created by zt on 2017/2/19. - */ -public class LinkedList implements List { - - private Node head; - - private Node tail; - - private int size = 0; - - public LinkedList() { - - } - - @Override - public void add(Object object) { - if (null == head) { - head = new Node(object); - head.next = null; - tail = head; - size++; - } else { - // 尾插法 - Node newNode = new Node(object); - tail.next = newNode; - tail = newNode; - tail.next = null; - size++; - } - } - - @Override - public void add(int index, Object object) { - checkRange(index); - if (null == head) { - add(object); - return; - } - if (index == 0) { - addFirst(object); - return; - } - Node pre = node(index - 1); - Node newNode = new Node(object); - newNode.next = pre.next; - pre.next = newNode; - size++; - } - - @Override - public Object get(int index) { - checkRange(index); - checkNodeNotNull(); - Node node = node(index); - return node.data; - } - - @Override - public Object remove(int index) { - checkRange(index); - checkNodeNotNull(); - Object object; - if (index == 0) { - object = removeFirst(); - return object; - } - Node pre = node(index - 1); - object = pre.next.data; - pre.next = pre.next.next; - size--; - return object; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object object) { - if (null == head) { - head = new Node(object); - head.next = null; - size++; - } else { - Node firstNode = new Node(object); - firstNode.next = head; - head = firstNode; - size++; - } - } - - public Object removeFirst() { - checkNodeNotNull(); - Object oldValue = head.data; - head = head.next; - size--; - return oldValue; - } - - public Object removeLast() { - checkNodeNotNull(); - Object oldValue; - if (size == 1) { - oldValue = head.data; - head = null; - return oldValue; - } - Node pre = node(size() - 2); - oldValue = pre.next.data; - pre.next = null; - size--; - return oldValue; - } - - private void checkRange(int index) { - if (index > size - 1 || index < 0) { - throw new IndexOutOfBoundsException(); - } - } - - private void checkNodeNotNull() { - if (null == head) { - throw new NullPointerException(); - } - } - - private Node node(int index) { - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - private static class Node { - Node next; - private Object data; - - public Node() { - - } - - public Node(Object data) { - this.data = data; - } - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - public Node(Object data, Node next, Node prev) { - this.data = data; - this.next = next; - } - } - - /*@Override - public void add(Object object) { - if (null == head) { - head = new Node(object); - head.next = null; - } else { - // 头插法 - Node nextNode = new Node(object); - nextNode.next = head.next; - head.next = nextNode; - } - }*/ - -} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java b/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java index d3d4ebfbab..f78de06510 100644 --- a/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java +++ b/group03/569045298/src/main/com/coding/basic/datastructure/Queue.java @@ -1,6 +1,8 @@ package com.coding.basic.datastructure; +import com.coding.basic.datastructure.array.ArrayList; + /** * Created by zt on 2017/2/19. */ diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java b/group03/569045298/src/main/com/coding/basic/datastructure/array/ArrayList.java similarity index 94% rename from group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java rename to group03/569045298/src/main/com/coding/basic/datastructure/array/ArrayList.java index 8d3de85e34..b66481012b 100644 --- a/group03/569045298/src/main/com/coding/basic/datastructure/ArrayList.java +++ b/group03/569045298/src/main/com/coding/basic/datastructure/array/ArrayList.java @@ -1,6 +1,9 @@ -package com.coding.basic.datastructure; +package com.coding.basic.datastructure.array; +import com.coding.basic.datastructure.Iterator; +import com.coding.basic.datastructure.List; + /** * Created by zt on 2017/2/19. */ diff --git a/group03/569045298/src/main/com/coderising/array/ArrayUtil.java b/group03/569045298/src/main/com/coding/basic/datastructure/array/ArrayUtil.java similarity index 87% rename from group03/569045298/src/main/com/coderising/array/ArrayUtil.java rename to group03/569045298/src/main/com/coding/basic/datastructure/array/ArrayUtil.java index 992e0652fb..fa5057fbe8 100644 --- a/group03/569045298/src/main/com/coderising/array/ArrayUtil.java +++ b/group03/569045298/src/main/com/coding/basic/datastructure/array/ArrayUtil.java @@ -1,6 +1,7 @@ -package com.coderising.array; +package com.coding.basic.datastructure.array; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -14,6 +15,9 @@ public class ArrayUtil { * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] */ public int[] reverseArray(int[] origin) { + if (origin == null) { + return null; + } for (int i = 0; i < origin.length / 2; i++) { int temp = origin[i]; origin[i] = origin[origin.length - i - 1]; @@ -28,17 +32,17 @@ public int[] reverseArray(int[] origin) { * {1,3,4,5,6,6,5,4,7,6,7,5} */ public int[] removeZero(int[] oldArray) { + if (oldArray == null) { + return null; + } int[] newArray = new int[oldArray.length]; int index = 0; for (int i = 0; i < oldArray.length; i++) { if (oldArray[i] != 0) { - newArray[index] = oldArray[i]; - index++; + newArray[index++] = oldArray[i]; } } - int[] result = new int[index]; - System.arraycopy(newArray, 0, result, 0, index); - return result; + return Arrays.copyOf(newArray, index); } /** @@ -46,6 +50,12 @@ public int[] removeZero(int[] oldArray) { * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 */ public int[] merge(int[] array1, int[] array2) { + if (array1 == null && array2 == null) { + return null; + } + if (array1 == null || array2 == null) { + return array1 == null ? array2 : array1; + } Set set = new TreeSet<>(); for (int i = 0; i < array1.length; i++) { set.add(array1[i]); @@ -63,6 +73,12 @@ public int[] merge(int[] array1, int[] array2) { * [2,3,6,0,0,0] */ public int[] grow(int[] oldArray, int size) { + if (oldArray == null) { + return null; + } + if (size < 0) { + throw new IndexOutOfBoundsException(); + } int[] newArray = new int[oldArray.length + size]; System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); return newArray; @@ -75,12 +91,12 @@ public int[] grow(int[] oldArray, int size) { */ public int[] fibonacci(int max) { List list = new ArrayList<>(); - for (int i = 1; i < max; i++) { + for (int i = 0; i < max; i++) { int f = fibonacci2(i); - if (f >= max) { - break; - } else { + if (f < max) { list.add(f); + } else { + break; } } return list2Array(list); @@ -135,6 +151,9 @@ public int[] getPerfectNumbers(int max) { * 则返回值为"3-8-9" */ public String join(int[] array, String seperator) { + if (array == null) { + return null; + } StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < array.length; i++) { if (i != 0) { diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/linklist/LRUPageFrame.java b/group03/569045298/src/main/com/coding/basic/datastructure/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..e43767aaf5 --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/linklist/LRUPageFrame.java @@ -0,0 +1,106 @@ +package com.coding.basic.datastructure.linklist; + +/** + * 用双向链表实现LRU算法 + * + * @author zt + */ +public class LRUPageFrame { + + private int capacity; + private Node first; + private Node last; + private int size = 0; + + public LRUPageFrame(int capacity) { + this.capacity = capacity; + } + + /** + * 获取缓存中对象 + */ + public void access(int pageNum) { + if (first == null) { + first = new Node(); + first.pageNum = pageNum; + last = first; + size++; + } else { + if (size < capacity) { + linkFirst(pageNum); + size++; + } else { + Node p = first; + int count = 0; + while (p != null) { + if (p.pageNum == pageNum) { + if (p == first) { + break; + } else if (p == last) { + last = p.prev; + p.prev.next = null; + linkNodeToFirst(p); + } else { + p.next.prev = p.prev; + p.prev.next = p.next; + linkNodeToFirst(p); + } + break; + } + p = p.next; + count++; + } + // if doesn't contains the same value + if (count >= size) { + linkFirst(pageNum); + removeLast(); + } + } + } + } + + private void linkNodeToFirst(Node p) { + first.prev = p; + p.next = first; + p.prev = null; + first = p; + } + + private void linkFirst(int pageNum) { + Node node = new Node(); + node.pageNum = pageNum; + first.prev = node; + node.next = first; + first = node; + } + + private void removeLast() { + last = last.prev; + last.next = null; + } + + @Override + 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(); + } + + private static class Node { + Node prev; + Node next; + int pageNum; + + Node() { + + } + } + +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/linklist/LinkedList.java b/group03/569045298/src/main/com/coding/basic/datastructure/linklist/LinkedList.java new file mode 100644 index 0000000000..f4d83f6c9c --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/linklist/LinkedList.java @@ -0,0 +1,321 @@ +package com.coding.basic.datastructure.linklist; + +import com.coding.basic.datastructure.Iterator; +import com.coding.basic.datastructure.List; + +/** + * Created by zt on 2017/2/19. + */ +public class LinkedList implements List { + + private Node head; + + private Node tail; + + private int size = 0; + + public LinkedList() { + + } + + @Override + public void add(Object object) { + if (null == head) { + head = new Node(object); + head.next = null; + tail = head; + size++; + } else { + // 尾插法 + Node newNode = new Node(object); + tail.next = newNode; + tail = newNode; + tail.next = null; + size++; + } + } + + /*@Override + public void add(Object object) { + if (null == head) { + head = new Node(object); + head.next = null; + } else { + // 头插法 + Node nextNode = new Node(object); + nextNode.next = head.next; + head.next = nextNode; + } + }*/ + + @Override + public void add(int index, Object object) { + checkRange(index); + if (null == head) { + add(object); + return; + } + if (index == 0) { + addFirst(object); + return; + } + Node pre = node(index - 1); + Node newNode = new Node(object); + newNode.next = pre.next; + pre.next = newNode; + size++; + } + + @Override + public Object get(int index) { + checkRange(index); + checkNodeNotNull(); + Node node = node(index); + return node.data; + } + + @Override + public Object remove(int index) { + checkRange(index); + checkNodeNotNull(); + Object object; + if (index == 0) { + object = removeFirst(); + return object; + } + Node pre = node(index - 1); + object = pre.next.data; + pre.next = pre.next.next; + size--; + return object; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object object) { + if (null == head) { + head = new Node(object); + head.next = null; + size++; + } else { + Node firstNode = new Node(object); + firstNode.next = head; + head = firstNode; + size++; + } + } + + public Object removeFirst() { + checkNodeNotNull(); + Object oldValue = head.data; + head = head.next; + size--; + return oldValue; + } + + public Object removeLast() { + checkNodeNotNull(); + Object oldValue; + if (size == 1) { + oldValue = head.data; + head = null; + return oldValue; + } + Node pre = node(size() - 2); + oldValue = pre.next.data; + pre.next = null; + size--; + return oldValue; + } + + private void checkRange(int index) { + if (index > size - 1 || index < 0) { + throw new IndexOutOfBoundsException(); + } + } + + private void checkNodeNotNull() { + if (null == head) { + throw new NullPointerException(); + } + } + + private Node node(int index) { + checkRange(index); + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node; + } + + public Iterator iterator() { + return new LinkedList.LinkedListIterator(); + } + + public void reverse() { + checkNodeNotNull(); + + Node temp = head.next; + // 指向原head位置,基准节点 + Node pivot = head; + while (pivot.next != null) { + Node p = temp.next; + temp.next = head; + pivot.next = p; + head = temp; + temp = p; + } + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf() { + for (int i = 1; i <= size / 2; i++) { + removeFirst(); + } + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + */ + public void remove(int i, int length) { + if (i == 0) { + for (int j = 0; j < length; j++) { + head = head.next; + size--; + } + } else { + Node pre = node(i - 1); + for (int j = 0; j < length; j++) { + pre.next = pre.next.next; + size--; + } + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + */ + public int[] getElements(LinkedList list) { + if (list == null) { + return null; + } + int[] result = new int[list.size()]; + Iterator iterator = list.iterator(); + int index = (int) iterator.next(); + int currentIndex = 0; + int arrayIndex = 0; + Node p = head; + while (p != null) { + if (index == currentIndex) { + result[arrayIndex++] = (int) p.data; + if (iterator.hasNext()) { + index = (int) iterator.next(); + } else { + return result; + } + } + currentIndex++; + p = p.next; + } + return null; + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() { + Node p = head; + while (p.next != null) { + if (p.data.equals(p.next.data)) { + p.next = p.next.next; + size--; + } else { + p = p.next; + } + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + */ + public void removeRange(int min, int max) { + if (min > max) { + throw new RuntimeException("min is larger than max!"); + } + int start = 0; + int end = 0; + Node node = head; + while (node != null) { + int data = (int) node.data; + if (data <= min) { + start++; + end++; + } else if (data < max) { + end++; + } + node = node.next; + } + this.remove(start, end - start); + } + + private static class Node { + Node next; + private Object data; + + public Node() { + + } + + public Node(Object data) { + this.data = data; + } + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + public Node(Object data, Node next, Node prev) { + this.data = data; + this.next = next; + } + } + + private class LinkedListIterator implements Iterator { + + private Node cursor = head; + + @Override + public boolean hasNext() { + return cursor != null; + } + + @Override + public Object next() { + Object data = cursor.data; + cursor = cursor.next; + return data; + } + + @Override + public Object remove() { + // TODO + return null; + } + } + +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/stack/QuickMinStack.java b/group03/569045298/src/main/com/coding/basic/datastructure/stack/QuickMinStack.java new file mode 100644 index 0000000000..da697ae4b6 --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/stack/QuickMinStack.java @@ -0,0 +1,41 @@ +package com.coding.basic.datastructure.stack; + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回该数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + */ +public class QuickMinStack { + + private Stack stack; + private Stack minStack; + + public QuickMinStack() { + stack = new Stack<>(); + minStack = new Stack<>(); + } + + public void push(E data) { + stack.push(data); + if (minStack.isEmpty()) { + minStack.push(data); + } else { + if (minStack.peek().compareTo(data) >= 0) { + minStack.push(data); + } + } + } + + public E pop() { + E top = stack.pop(); + if (top.compareTo(minStack.peek()) <= 0) { + minStack.pop(); + } + return top; + } + + public E findMin() { + return minStack.peek(); + } +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/Stack.java b/group03/569045298/src/main/com/coding/basic/datastructure/stack/Stack.java similarity index 88% rename from group03/569045298/src/main/com/coding/basic/datastructure/Stack.java rename to group03/569045298/src/main/com/coding/basic/datastructure/stack/Stack.java index c8dbc6b3af..7bd0326872 100644 --- a/group03/569045298/src/main/com/coding/basic/datastructure/Stack.java +++ b/group03/569045298/src/main/com/coding/basic/datastructure/stack/Stack.java @@ -1,4 +1,6 @@ -package com.coding.basic.datastructure; +package com.coding.basic.datastructure.stack; + +import com.coding.basic.datastructure.array.ArrayList; /** * Created by zt on 2017/2/19. diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/stack/StackUtil.java b/group03/569045298/src/main/com/coding/basic/datastructure/stack/StackUtil.java new file mode 100644 index 0000000000..fb8e2aca2c --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/stack/StackUtil.java @@ -0,0 +1,127 @@ +package com.coding.basic.datastructure.stack; + +import java.util.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) { + if (s == null || s.isEmpty()) { + return; + } + Integer top = s.pop(); + reverse(s); + addToBottom(s, top); + } + + public static void addToBottom(Stack s, Integer value) { + if (s.isEmpty()) { + s.push(value); + } else { + Integer top = s.pop(); + addToBottom(s, value); + s.push(top); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty + */ + public static void remove(Stack s, Object object) { + if (s == null || s.isEmpty()) { + return; + } + Stack temp = new Stack(); + while (!s.isEmpty()) { + Object top = s.pop(); + if (null == object && top != null) { + temp.push(top); + } + if (null != object && !object.equals(top)) { + temp.push(top); + } + } + while (!temp.isEmpty()) { + s.push(temp.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty + */ + public static Object[] getTop(Stack s, int len) { + if (len < 0) { + throw new RuntimeException("length should be larger than zero!"); + } + if (len > s.size()) { + throw new RuntimeException("length is bigger than stack size!"); + } + if (s == null || s.isEmpty()) { + return null; + } + Stack temp = new Stack(); + int count = 0; + while (!s.isEmpty() && count++ <= len) { + temp.push(s.pop()); + } + Object[] result = new Object[temp.size()]; + int index = result.length - 1; + while (!temp.isEmpty()) { + Object top = temp.pop(); + result[index--] = top; + s.push(top); + } + return result; + } + + /** + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz + * 使用堆栈检查字符串s中的括号是不是成对出现的。 + * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true + * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; + */ + public static boolean isValidPairs(String s) { + Stack stack = new Stack<>(); + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + switch (ch) { + case '(': + stack.push(ch); + break; + case ')': + if (!stack.isEmpty() && stack.peek() == '(') { + stack.pop(); + } else { + return false; + } + break; + case '[': + stack.push(ch); + break; + case ']': + if (!stack.isEmpty() && stack.peek() == '[') { + stack.pop(); + } else { + return false; + } + break; + case '{': + stack.push(ch); + break; + case '}': + if (!stack.isEmpty() && stack.peek() == '{') { + stack.pop(); + } else { + return false; + } + break; + } + } + return stack.isEmpty(); + } + +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/stack/StackWithTwoQueues.java b/group03/569045298/src/main/com/coding/basic/datastructure/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..d86f161583 --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/stack/StackWithTwoQueues.java @@ -0,0 +1,54 @@ +package com.coding.basic.datastructure.stack; + + +import java.util.ArrayDeque; +import java.util.Queue; + +public class StackWithTwoQueues { + + private Queue firstQueue; + private Queue secondQueue; + + public StackWithTwoQueues() { + firstQueue = new ArrayDeque<>(); + secondQueue = new ArrayDeque<>(); + } + + public void push(E data) { + if (firstQueue.isEmpty() && secondQueue.isEmpty()) { + firstQueue.add(data); + return; + } + if (!firstQueue.isEmpty()) { + firstQueue.add(data); + return; + } + if (!secondQueue.isEmpty()) { + secondQueue.add(data); + return; + } + } + + public E pop() { + E data = null; + if (!firstQueue.isEmpty()) { + data = this.pop(firstQueue, secondQueue); + } else if (!secondQueue.isEmpty()) { + data = this.pop(secondQueue, firstQueue); + } + return data; + } + + private E pop(Queue fromQueue, Queue toQueue) { + E data = null; + while (fromQueue.size() > 0) { + if (fromQueue.size() == 1) { + data = fromQueue.poll(); + } else { + toQueue.add(fromQueue.poll()); + } + } + return data; + } + +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/stack/TwoStackInOneArray.java b/group03/569045298/src/main/com/coding/basic/datastructure/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..27ff79d345 --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/stack/TwoStackInOneArray.java @@ -0,0 +1,86 @@ +package com.coding.basic.datastructure.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + */ +public class TwoStackInOneArray { + + private static final int DEFAULT_CAPACITY = 10; + private Object[] data; + private int firstIndex; + private int lastIndex; + + public TwoStackInOneArray() { + this(DEFAULT_CAPACITY); + } + + public TwoStackInOneArray(int size) { + data = new Object[size]; + firstIndex = -1; + lastIndex = size; + } + + /** + * 向第一个栈中压入元素 + */ + public void push1(Object o) { + this.checkPosition(); + data[++firstIndex] = o; + } + + /** + * 从第一个栈中弹出元素 + */ + public Object pop1() { + return data[firstIndex--]; + } + + /** + * 获取第一个栈的栈顶元素 + */ + + public Object peek1() { + return data[firstIndex]; + } + + /** + * 向第二个栈压入元素 + */ + public void push2(Object o) { + this.checkPosition(); + data[--lastIndex] = o; + } + + /** + * 从第二个栈弹出元素 + */ + public Object pop2() { + return data[lastIndex++]; + } + + /** + * 获取第二个栈的栈顶元素 + */ + + public Object peek2() { + return data[lastIndex]; + } + + private void checkPosition() { + if (firstIndex + 1 == lastIndex) { + this.grow(); + } + } + + private void grow() { + Object[] newArray = new Object[data.length << 1]; + System.arraycopy(data, 0, newArray, 0, firstIndex + 1); + int secondStackSize = data.length - lastIndex; + int newLastIndex = newArray.length - secondStackSize; + System.arraycopy(data, lastIndex, newArray, newLastIndex, secondStackSize); + lastIndex = newLastIndex; + data = newArray; + } + +} diff --git a/group03/569045298/src/main/com/coding/basic/datastructure/stack/expr/InfixExpression.java b/group03/569045298/src/main/com/coding/basic/datastructure/stack/expr/InfixExpression.java new file mode 100644 index 0000000000..0cbabb008d --- /dev/null +++ b/group03/569045298/src/main/com/coding/basic/datastructure/stack/expr/InfixExpression.java @@ -0,0 +1,15 @@ +package com.coding.basic.datastructure.stack.expr; + +public class InfixExpression { + + private String expression; + + public InfixExpression(String expression) { + this.expression = expression; + } + + public float evaluate() { + return 0.0f; + } + +} diff --git a/group03/569045298/src/test/coderising/array/ArrayUtilTest.java b/group03/569045298/src/test/coderising/array/ArrayUtilTest.java index 52638781aa..4ed521a45c 100644 --- a/group03/569045298/src/test/coderising/array/ArrayUtilTest.java +++ b/group03/569045298/src/test/coderising/array/ArrayUtilTest.java @@ -1,6 +1,7 @@ package coderising.array; -import com.coderising.array.ArrayUtil; + +import com.coding.basic.datastructure.array.ArrayUtil; import org.junit.Assert; import org.junit.Before; @@ -38,10 +39,10 @@ public void testRemoveZero() { @Test public void testFibonacci() { int max = 1; - int[] expected = {}; + int[] expected = {0}; Assert.assertArrayEquals(expected, arrayUtil.fibonacci(max)); int max2 = 15; - int[] expected2 = {1, 1, 2, 3, 5, 8, 13}; + int[] expected2 = {0, 1, 1, 2, 3, 5, 8, 13}; Assert.assertArrayEquals(expected2, arrayUtil.fibonacci(max2)); } @@ -62,7 +63,7 @@ public void testMerge() { @Test public void testGetPerfectNumbers() { - int max = 6; + int max = 1000; arrayUtil.getPerfectNumbers(max); } diff --git a/group03/569045298/src/test/coderising/litestruts/StrutsTest.java b/group03/569045298/src/test/coderising/litestruts/StrutsTest.java index 61c25c3648..4b66733e72 100644 --- a/group03/569045298/src/test/coderising/litestruts/StrutsTest.java +++ b/group03/569045298/src/test/coderising/litestruts/StrutsTest.java @@ -1,46 +1,46 @@ -package coderising.litestruts; - -import com.coderising.litestruts.Struts; -import com.coderising.litestruts.View; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.util.HashMap; -import java.util.Map; - - -public class StrutsTest { - - private Struts struts; - - @Before - public void setUp() { - struts = new Struts(); - } - - @Test - public void testLoginActionSuccess() { - String actionName = "login"; - Map params = new HashMap<>(); - params.put("name", "test"); - params.put("password", "1234"); - View view = struts.runAction(actionName, params); - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap<>(); - params.put("name", "test"); - // 密码和预设的不一致 - params.put("password", "123456"); - View view = struts.runAction(actionName, params); - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } - -} +package coderising.litestruts; + +import com.coderising.litestruts.Struts; +import com.coderising.litestruts.View; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + + +public class StrutsTest { + + private Struts struts; + + @Before + public void setUp() { + struts = new Struts(); + } + + @Test + public void testLoginActionSuccess() { + String actionName = "login"; + Map params = new HashMap<>(); + params.put("name", "test"); + params.put("password", "1234"); + View view = struts.runAction(actionName, params); + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap<>(); + params.put("name", "test"); + // 密码和预设的不一致 + params.put("password", "123456"); + View view = struts.runAction(actionName, params); + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java b/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java index 9f90242595..834b5c566f 100644 --- a/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java +++ b/group03/569045298/src/test/com/coding/basic/datastructure/TestDataStructure.java @@ -1,5 +1,9 @@ package com.coding.basic.datastructure; +import com.coding.basic.datastructure.array.ArrayList; +import com.coding.basic.datastructure.linklist.LinkedList; +import com.coding.basic.datastructure.stack.Stack; + import org.junit.Test; /** @@ -8,7 +12,7 @@ public class TestDataStructure { @Test - public void testLinedList() { + public void testLinkedList() { LinkedList list = new LinkedList(); for (int i = 0; i < 5; i++) { list.add(i); @@ -63,4 +67,105 @@ public void testArrayList() { System.out.println(arrayList.get(i)); } } + + @Test + public void testReverseLinkedList() { + LinkedList linkedList = new LinkedList(); + for (int i = 0; i < 10; i++) { + linkedList.add(i); + } + linkedList.reverse(); + printLinkedList(linkedList); + } + + @Test + public void testRemoveLinkedList() { + LinkedList linkedList = new LinkedList(); + for (int i = 0; i < 10; i++) { + linkedList.add(i); + } + linkedList.remove(0, 8); + printLinkedList(linkedList); + } + + @Test + public void testRemoveFirstHalf() { + LinkedList linkedList = new LinkedList(); + for (int i = 0; i < 1; i++) { + linkedList.add(i); + } + linkedList.removeFirstHalf(); + printLinkedList(linkedList); + } + + @Test + public void testRemoveDuplicateValues() { + LinkedList linkedList = new LinkedList(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(2); + linkedList.add(2); + linkedList.add(3); + linkedList.add(3); + linkedList.add(4); + linkedList.add(4); + linkedList.removeDuplicateValues(); + printLinkedList(linkedList); + } + + @Test + public void testLinkedListIterator() { + LinkedList linkedList = new LinkedList(); + for (int i = 0; i < 10; i++) { + linkedList.add(i); + } + Iterator iterator = linkedList.iterator(); + while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + + @Test + public void testGetElements() { + LinkedList linkedList = new LinkedList(); + linkedList.add(11); + linkedList.add(101); + linkedList.add(201); + linkedList.add(301); + linkedList.add(401); + linkedList.add(501); + linkedList.add(601); + linkedList.add(701); + + LinkedList indexList = new LinkedList(); + indexList.add(0); + indexList.add(3); + indexList.add(4); + indexList.add(6); + + int[] result = linkedList.getElements(indexList); + for (int i = 0; i < result.length; i++) { + System.out.println(result[i]); + } + } + + @Test + public void testRemoveRange() { + LinkedList linkedList = new LinkedList(); + linkedList.add(1); + linkedList.add(2); + linkedList.add(3); + linkedList.add(3); + linkedList.add(4); + linkedList.add(6); + linkedList.add(6); + linkedList.removeRange(1, 4); + printLinkedList(linkedList); + } + + private void printLinkedList(LinkedList linkedList) { + for (int i = 0; i < linkedList.size(); i++) { + System.out.print(linkedList.get(i) + ","); + } + } } diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/linklist/LRUPageFrameTest.java b/group03/569045298/src/test/com/coding/basic/datastructure/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..5dbdf98f4e --- /dev/null +++ b/group03/569045298/src/test/com/coding/basic/datastructure/linklist/LRUPageFrameTest.java @@ -0,0 +1,32 @@ +package com.coding.basic.datastructure.linklist; + +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(3); + Assert.assertEquals("3,4,0", frame.toString()); + } + +} diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/stack/QuickMinStackTest.java b/group03/569045298/src/test/com/coding/basic/datastructure/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..dff8f05b6f --- /dev/null +++ b/group03/569045298/src/test/com/coding/basic/datastructure/stack/QuickMinStackTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.datastructure.stack; + +import org.junit.Assert; +import org.junit.Test; + + +/** + * Created by zt + * 2017/5/6 16:16 + */ +public class QuickMinStackTest { + + @Test + public void findMin() throws Exception { + QuickMinStack stack = new QuickMinStack<>(); + stack.push(9); + stack.push(2); + stack.push(3); + stack.push(2); + stack.push(7); + stack.push(0); + stack.push(1); + Assert.assertEquals(new Integer(0), stack.findMin()); + stack.pop(); + Assert.assertEquals(new Integer(0), stack.findMin()); + stack.pop(); + Assert.assertEquals(new Integer(2), stack.findMin()); + stack.pop(); + Assert.assertEquals(new Integer(2), stack.findMin()); + stack.push(-1); + Assert.assertEquals(new Integer(-1), stack.findMin()); + } + +} \ No newline at end of file diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/stack/StackUtilTest.java b/group03/569045298/src/test/com/coding/basic/datastructure/stack/StackUtilTest.java new file mode 100644 index 0000000000..ded9c203c2 --- /dev/null +++ b/group03/569045298/src/test/com/coding/basic/datastructure/stack/StackUtilTest.java @@ -0,0 +1,83 @@ +package com.coding.basic.datastructure.stack; + + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Stack; + +public class StackUtilTest { + + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + s.push(null); + Assert.assertEquals("[1, 2, 3, 4, 5, null]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[null, 5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 3); + Assert.assertEquals("[1, 2]", s.toString()); + s = new Stack(); + s.push(1); + StackUtil.remove(s, 2); + Assert.assertEquals("[1]", s.toString()); + s = new Stack(); + s.push(1); + StackUtil.remove(s, 1); + Assert.assertEquals("[]", s.toString()); + s = new Stack(); + s.push(1); + s.push(null); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, null, 3]", s.toString()); + s = new Stack(); + s.push(1); + s.push(null); + s.push(2); + s.push(3); + StackUtil.remove(s, null); + Assert.assertEquals("[1, 2, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(null); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 4); + Assert.assertEquals("[1, 2, null, 3, 4, 5]", s.toString()); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + Assert.assertEquals(null, values[3]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + Assert.assertFalse(StackUtil.isValidPairs("}])")); + } + +} diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/stack/StackWithTwoQueuesTest.java b/group03/569045298/src/test/com/coding/basic/datastructure/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..c81a4c98cd --- /dev/null +++ b/group03/569045298/src/test/com/coding/basic/datastructure/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.datastructure.stack; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by zt + * 2017/5/6 18:48 + */ +public class StackWithTwoQueuesTest { + + @Test + public void pop() { + StackWithTwoQueues stackWithTwoQueues = new StackWithTwoQueues<>(); + stackWithTwoQueues.push(1); + stackWithTwoQueues.push(2); + stackWithTwoQueues.push(3); + stackWithTwoQueues.push(4); + stackWithTwoQueues.push(5); + Assert.assertEquals(new Integer(5), stackWithTwoQueues.pop()); + Assert.assertEquals(new Integer(4), stackWithTwoQueues.pop()); + stackWithTwoQueues.push(6); + Assert.assertEquals(new Integer(6), stackWithTwoQueues.pop()); + Assert.assertEquals(new Integer(3), stackWithTwoQueues.pop()); + } + +} \ No newline at end of file diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/stack/TwoStackInOneArrayTest.java b/group03/569045298/src/test/com/coding/basic/datastructure/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..efeb0f359d --- /dev/null +++ b/group03/569045298/src/test/com/coding/basic/datastructure/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,28 @@ +package com.coding.basic.datastructure.stack; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by zt + * 2017/5/6 19:35 + */ +public class TwoStackInOneArrayTest { + + @Test + public void pop() throws Exception { + TwoStackInOneArray twoStackInOneArray = new TwoStackInOneArray(15); + for (int i = 0; i < 10; i++) { + twoStackInOneArray.push1(new Integer(i)); + twoStackInOneArray.push2(new Integer(i + 10)); + } + Assert.assertEquals(new Integer(9), twoStackInOneArray.pop1()); + Assert.assertEquals(new Integer(19), twoStackInOneArray.pop2()); + Assert.assertEquals(new Integer(8), twoStackInOneArray.pop1()); + Assert.assertEquals(new Integer(7), twoStackInOneArray.pop1()); + Assert.assertEquals(new Integer(18), twoStackInOneArray.pop2()); + twoStackInOneArray.push1(666); + Assert.assertEquals(new Integer(666), twoStackInOneArray.pop1()); + } + +} \ No newline at end of file diff --git a/group03/569045298/src/test/com/coding/basic/datastructure/stack/expr/InfixExprTest.java b/group03/569045298/src/test/com/coding/basic/datastructure/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..51af111a13 --- /dev/null +++ b/group03/569045298/src/test/com/coding/basic/datastructure/stack/expr/InfixExprTest.java @@ -0,0 +1,50 @@ +package com.coding.basic.datastructure.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() { + + } + + @After + public void tearDown() { + + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpression expr = new InfixExpression("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpression expr = new InfixExpression("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpression expr = new InfixExpression("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpression expr = new InfixExpression("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpression expr = new InfixExpression("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} From 886a92ef3f721429a26f629315a79529bb35531a Mon Sep 17 00:00:00 2001 From: ZhaoHongxin Date: Sat, 6 May 2017 21:10:37 +0800 Subject: [PATCH 445/552] QuickMinStack --- .../com/coding/basic/stack/QuickMinStack.java | 25 ++++++- .../basic/stack/StackWithTwoQueues.java | 21 +++++- .../basic/stack/TwoStackInOneArray.java | 66 +++++++++++++++++-- 3 files changed, 99 insertions(+), 13 deletions(-) diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/QuickMinStack.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/QuickMinStack.java index 4f257ab9fb..e93820f486 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/QuickMinStack.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/QuickMinStack.java @@ -7,13 +7,32 @@ * */ public class QuickMinStack { + + Stack s = new Stack(); + Stack m = new Stack(); public void push(int data){ - + s.push(data); + if(m.isEmpty()) { + m.push(data); + } + else if (data <= (int)m.peek()) { + m.push(data); + } } public int pop(){ - return -1; + if (m.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + int x = (int) m.pop(); + if (x==(int)m.peek()) { + m.pop(); + } + return x; } public int findMin(){ - return -1; + if (m.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + return (int) m.peek(); } } diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackWithTwoQueues.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackWithTwoQueues.java index 6f1d5bd04d..6b4fafaf6a 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackWithTwoQueues.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -1,15 +1,30 @@ package com.coding.basic.stack; +import com.coding.basic.queue.Queue; public class StackWithTwoQueues { - + private Queue q1 = new Queue(); + private Queue q2 = new Queue(); + public void push(int data) { - + q1.enQueue(data); } + public boolean isEmpty() { + return q1.isEmpty() && q2.isEmpty(); + } + public int pop() { - return -1; + if (isEmpty()) { + throw new RuntimeException("stack is empty"); + } + if (q2.isEmpty()) { + while(!q1.isEmpty()) { + q2.enQueue(q1.deQueue()); + } + } + return (int) q2.deQueue(); } diff --git a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/TwoStackInOneArray.java b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/TwoStackInOneArray.java index 53a902ba17..6ea653e7f3 100644 --- a/group05/1094051862/mini-jvm/src/com/coding/basic/stack/TwoStackInOneArray.java +++ b/group05/1094051862/mini-jvm/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -1,5 +1,7 @@ package com.coding.basic.stack; +import java.util.Arrays; + /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 @@ -7,21 +9,39 @@ * */ public class TwoStackInOneArray { - Object[] data = new Object[10]; + + private int capacity = 10; + Object[] data = new Object[capacity]; + + private int DEFAULT_DILATATION = capacity/2; + + private int index1 = -1; + private int index2 = capacity; /** * 向第一个栈中压入元素 * @param o */ public void push1(Object o){ - + if(isFull()) { + dilatation(); + } + data[index1++] = o; } /** * 从第一个栈中弹出元素 * @return */ public Object pop1(){ - return null; + if (stack1IsEmppty()) { + throw new RuntimeException("stack1 is empty"); + } + Object o = data[index1]; + data[index1--] = null; + return o; + } + public boolean stack1IsEmppty() { + return index1==-1; } /** @@ -30,12 +50,19 @@ public Object pop1(){ */ public Object peek1(){ - return null; + if (stack1IsEmppty()) { + throw new RuntimeException("stack1 is empty"); + } + return data[index1]; } - /* + /** * 向第二个栈压入元素 */ public void push2(Object o){ + if(isFull()) { + dilatation(); + } + data[--index2] = o; } /** @@ -43,7 +70,15 @@ public void push2(Object o){ * @return */ public Object pop2(){ - return null; + if (stack2IsEmpty()) { + throw new RuntimeException("stack2 is empty"); + } + Object o = data[index2]; + data[index2++] = null; + return o; + } + public boolean stack2IsEmpty() { + return index2==capacity; } /** * 获取第二个栈的栈顶元素 @@ -51,7 +86,24 @@ public Object pop2(){ */ public Object peek2(){ - return null; + if (stack2IsEmpty()) { + throw new RuntimeException("stack2 is empty"); + } + return data[index2]; } + public boolean isFull() { + return (index1+1) == index2; + } + private void dilatation() { + int newcapacity = DEFAULT_DILATATION + capacity; + int newindex2 = newcapacity; + Object[] temp = Arrays.copyOfRange(data, 0, index1); + temp = Arrays.copyOf(temp, newcapacity); + + for (int i = capacity-1; i >= index2; i-- ) { + temp[--newindex2] = data[i]; + } + index2 = newindex2; + } } From 2f202c55f1f9ee42bc8db644f7c4ca7c841fd79d Mon Sep 17 00:00:00 2001 From: GallenZhang <1298552064@qq.com> Date: Sun, 7 May 2017 03:29:12 +0800 Subject: [PATCH 446/552] =?UTF-8?q?=E7=AC=AC=E4=BA=94=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B9=8B=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第五次作业之数据结构 --- .../src/week05/basic/StackUtil.java | 110 ++++++++++++++++++ .../src/week05/test/StackUtilTest.java | 68 +++++++++++ 2 files changed, 178 insertions(+) create mode 100644 group01/1298552064/src/week05/basic/StackUtil.java create mode 100644 group01/1298552064/src/week05/test/StackUtilTest.java diff --git a/group01/1298552064/src/week05/basic/StackUtil.java b/group01/1298552064/src/week05/basic/StackUtil.java new file mode 100644 index 0000000000..7a7f459d2f --- /dev/null +++ b/group01/1298552064/src/week05/basic/StackUtil.java @@ -0,0 +1,110 @@ +package week05.basic; + +import java.util.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 reverseStack = new Stack<>(); + Stack sequenceStack = new Stack<>(); + while(!s.isEmpty()){ + reverseStack.push(s.pop()); + } + + while(!reverseStack.isEmpty()){ + sequenceStack.push(reverseStack.pop()); + } + + while(!sequenceStack.isEmpty()){ + s.push(sequenceStack.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static void remove(Stack s,Object o) { + Stack tmpStack = new Stack<>(); + while(!s.isEmpty()){ + if(s.peek().equals(o)){ + s.pop(); + }else{ + tmpStack.push(s.pop()); + } + } + + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static Object[] getTop(Stack s,int len) { + if(len < 0 ||len > s.size()){ + throw new IllegalArgumentException("len is invalid argument."); + } + + Object[] objects = new Object[len]; + Stack tmpStack = new Stack<>(); + int index = 0; + while(!s.isEmpty() && index < len){ + Object o = s.pop(); + tmpStack.push(o); + objects[index++] = o; + } + + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + return objects; + } + /** + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz + * 使用堆栈检查字符串s中的括号是不是成对出现的。 + * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true + * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的,该方法返回false; + * + * @param s + * @return + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static boolean isValidPairs(String s){ + String symStr = ""; + Stack symStack = new Stack<>(); + for(int i = 0; i < s.length(); i++){ + if(!Character.isLetter(s.charAt(i))){ + symStack.push(s.charAt(i)); + symStr += s.charAt(i); + } + } + + for(int i=0; i< symStr.length();i++){ + char s1 = symStr.charAt(i); + char s2 = (char) symStack.pop(); + if(s1 == '(' && s2 != ')'){ + return false; + } + if(s1 == '[' && s2 != ']'){ + return false; + } + if(s1 == '{' && s2 != '}'){ + return false; + } + } + + return true; + } +} diff --git a/group01/1298552064/src/week05/test/StackUtilTest.java b/group01/1298552064/src/week05/test/StackUtilTest.java new file mode 100644 index 0000000000..9ad9eb04f8 --- /dev/null +++ b/group01/1298552064/src/week05/test/StackUtilTest.java @@ -0,0 +1,68 @@ +package week05.test; + +import java.util.Stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week05.basic.StackUtil; + +public class StackUtilTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + System.out.println(s.toString()); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} From 2988b0f3ae7325bc9198b58ee1c1f475d304d346 Mon Sep 17 00:00:00 2001 From: GallenZhang <1298552064@qq.com> Date: Sun, 7 May 2017 03:37:49 +0800 Subject: [PATCH 447/552] =?UTF-8?q?=E7=AC=AC=E5=85=AD=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B9=8B=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第六次作业之数据结构 --- .../src/week06/basic/InfixExpr.java | 102 ++++++++++++++++++ .../1298552064/src/week06/basic/Token.java | 53 +++++++++ .../src/week06/basic/TokenParser.java | 44 ++++++++ .../src/week06/test/InfixExprTest.java | 53 +++++++++ .../src/week06/test/TokenParserTest.java | 40 +++++++ 5 files changed, 292 insertions(+) create mode 100644 group01/1298552064/src/week06/basic/InfixExpr.java create mode 100644 group01/1298552064/src/week06/basic/Token.java create mode 100644 group01/1298552064/src/week06/basic/TokenParser.java create mode 100644 group01/1298552064/src/week06/test/InfixExprTest.java create mode 100644 group01/1298552064/src/week06/test/TokenParserTest.java diff --git a/group01/1298552064/src/week06/basic/InfixExpr.java b/group01/1298552064/src/week06/basic/InfixExpr.java new file mode 100644 index 0000000000..8e8718e839 --- /dev/null +++ b/group01/1298552064/src/week06/basic/InfixExpr.java @@ -0,0 +1,102 @@ +package week06.basic; + +import java.util.List; +import java.util.Stack; + +public class InfixExpr { + private String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + /** + * 计算 + * @param operator 运算符 + * @param i1 操作数1 + * @param i2 操作数2 + * @return + */ + private int cal(char operator, int i1, int i2){ + int result = 0; + switch(operator){ + case '+' : result = i1 + i2 ; break; + case '-' : result = i1 - i2 ; break; + case '*' : result = i1 * i2 ; break; + case '/' : + if(i1 == 0){ + throw new ArithmeticException("除数不能为0"); + } + result = i1 / i2 ; break; + } + return result; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + Stack operatorStack = new Stack<>(); + Stack operandStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + operandStack.push(token.getIntValue()); + continue; + } + + if(token.isOperator()){ + if(operatorStack.isEmpty()){ + operatorStack.push(token); + continue; + } + + Token pre = operatorStack.peek(); + boolean hasHigherPriority = token.hasHigherPriority(pre); + if(hasHigherPriority){ + operatorStack.push(token); + }else{ + int n2 = operandStack.pop(); + int n1 = operandStack.pop(); + String operator = operatorStack.pop().value; + operatorStack.push(token); + operandStack.push(cal(operator.charAt(0), n1, n2)); + } + } + } + + while(!operatorStack.isEmpty()){ + if(operatorStack.size() == 1){ + int n2 = operandStack.pop(); + int n1 = operandStack.pop(); + String operator = operatorStack.pop().value; + operandStack.push(cal(operator.charAt(0), n1, n2)); + break; + } + + Token cur = operatorStack.pop(); + Token pre = operatorStack.pop(); + if(cur.hasHigherPriority(pre)){ + int n2 = operandStack.pop(); + int n1 = operandStack.pop(); + operandStack.push(cal(cur.value.charAt(0), n1, n2)); + + operatorStack.push(pre); + }else{ + int n3 = operandStack.pop(); + int n2 = operandStack.pop(); + int n1 = operandStack.pop(); + operandStack.push(cal(pre.value.charAt(0), n1, n2)); + operandStack.push(n3); + + operatorStack.push(cur); + } + + } + return (float)operandStack.pop(); + } + + public static void main(String[] args) { + InfixExpr expr = new InfixExpr("10-2*3+50"); + System.out.println(expr.evaluate()); + } + +} diff --git a/group01/1298552064/src/week06/basic/Token.java b/group01/1298552064/src/week06/basic/Token.java new file mode 100644 index 0000000000..c817040815 --- /dev/null +++ b/group01/1298552064/src/week06/basic/Token.java @@ -0,0 +1,53 @@ +package week06.basic; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public static final List OPERATORS = Arrays.asList("+","-","*","/"); + private static final Map priorities = new HashMap<>(); + static{ + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isOperator(){ + return type == OPERATOR; + } + + public boolean isNumber(){ + return type == NUMBER; + } + + public int getIntValue(){ + return Integer.parseInt(value); + } + + @Override + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + + } + +} diff --git a/group01/1298552064/src/week06/basic/TokenParser.java b/group01/1298552064/src/week06/basic/TokenParser.java new file mode 100644 index 0000000000..6a44e4260f --- /dev/null +++ b/group01/1298552064/src/week06/basic/TokenParser.java @@ -0,0 +1,44 @@ +package week06.basic; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + public List parse(String expr){ + List tokens = new ArrayList<>(); + int i = 0; + while(i < expr.length()){ + char c = expr.charAt(i); + if(isOperator(c)){ + Token token = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(token); + i++; + }else if(Character.isDigit(c)){ + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token token = new Token(Token.NUMBER, value); + tokens.add(token); + i = nextOperatorIndex; + }else{ + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + } + return tokens; + } + + public int indexOfNextOperator(int i,String expr){ + while(Character.isDigit(expr.charAt(i))){ + i++; + if(i == expr.length()){ + break; + } + } + return i; + } + + public boolean isOperator(char c){ + String s = String.valueOf(c); + return Token.OPERATORS.contains(s); + } +} diff --git a/group01/1298552064/src/week06/test/InfixExprTest.java b/group01/1298552064/src/week06/test/InfixExprTest.java new file mode 100644 index 0000000000..9a20193fb4 --- /dev/null +++ b/group01/1298552064/src/week06/test/InfixExprTest.java @@ -0,0 +1,53 @@ +package week06.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week06.basic.InfixExpr; + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + // InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group01/1298552064/src/week06/test/TokenParserTest.java b/group01/1298552064/src/week06/test/TokenParserTest.java new file mode 100644 index 0000000000..7f1632fceb --- /dev/null +++ b/group01/1298552064/src/week06/test/TokenParserTest.java @@ -0,0 +1,40 @@ +package week06.test; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week06.basic.Token; +import week06.basic.TokenParser; + +public class TokenParserTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } +} From 8f2b216714f180129f49bac1635f81af9c4c0ef9 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Sun, 7 May 2017 04:24:20 +0800 Subject: [PATCH 448/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BA=A6=E7=91=9F?= =?UTF-8?q?=E5=A4=AB=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/queue/Josephus.java | 31 +++++++++++++++++++ .../coding2017/basic/queue/JosephusTest.java | 27 ++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Josephus.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Josephus.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Josephus.java new file mode 100644 index 0000000000..942b11cf68 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Josephus.java @@ -0,0 +1,31 @@ +package com.johnChnia.coding2017.basic.queue; + + +import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * 参考 http://interactivepython.org/courselib/static/pythonds/BasicDS/SimulationHotPotato.html + * + * @author john + */ +public class Josephus { + + public static List execute(int n, int m) { + ArrayList arrayList = new ArrayList<>(); + Queue queue = new Queue<>(); + for (int i = 0; i < n; i++) { + queue.add(i); + } + while (queue.size() > 1) { + for (int i = 0; i < m - 1; i++) { + queue.add(queue.remove()); + } + arrayList.add(queue.remove()); + } + return arrayList; + } +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..ec71728b3e --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.johnChnia.coding2017.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, ]", Josephus.execute(7, 2).toString()); + + } + +} From 6e44b5cb1786403c97aeaa74bb19afc9343d0b3f Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Sun, 7 May 2017 11:10:02 +0800 Subject: [PATCH 449/552] the fifth homework...StackUtil --- group19/1294642551/src/stackUtil/Stack.java | 51 ++++++++ .../1294642551/src/stackUtil/StackUtil.java | 121 ++++++++++++++++++ .../test/stackUtil/StackUtilTest.java | 66 ++++++++++ 3 files changed, 238 insertions(+) create mode 100644 group19/1294642551/src/stackUtil/Stack.java create mode 100644 group19/1294642551/src/stackUtil/StackUtil.java create mode 100644 group19/1294642551/test/stackUtil/StackUtilTest.java diff --git a/group19/1294642551/src/stackUtil/Stack.java b/group19/1294642551/src/stackUtil/Stack.java new file mode 100644 index 0000000000..a01d2b6e87 --- /dev/null +++ b/group19/1294642551/src/stackUtil/Stack.java @@ -0,0 +1,51 @@ +package stackUtil; + +import java.util.ArrayList; + + +public class Stack { + private ArrayList elementData; + private int size; + + public Stack(){ + elementData = new ArrayList(); + this.size = 0; + } + + + + public void push(E e){ + elementData.add(e); + size++; + } + + public E pop(){ + E o = elementData.remove(size - 1); + size--; + return o; + } + + public E peek(){ + return elementData.get(size - 1); + } + + public boolean isEmpty(){ + return size == 0; + } + + public int size(){ + return size; + } + + public String toString(){ + StringBuilder sb = new StringBuilder("["); + for(int i = 0; i < size; i++){ + sb.append(elementData.get(i)); + if(i < size - 1){ + sb.append(", "); + } + } + sb.append("]"); + return sb.toString(); + } +} diff --git a/group19/1294642551/src/stackUtil/StackUtil.java b/group19/1294642551/src/stackUtil/StackUtil.java new file mode 100644 index 0000000000..de1ec4231d --- /dev/null +++ b/group19/1294642551/src/stackUtil/StackUtil.java @@ -0,0 +1,121 @@ +package stackUtil; + + + +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) { + /* + * 注意值传递的问题 + */ + if(s == null || s.isEmpty()) { + return; + } + + int size = s.size(); + Stack temp1 = new Stack(); + Stack temp2 = new Stack(); + for(int i = 0; i < size; i++){ + temp1.push(s.pop()); + } + for(int i = 0; i < size; i++){ + temp2.push(temp1.pop()); + } + for(int i = 0; i < size; i++){ + s.push(temp2.pop()); + } + + + + } + + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, int o) { + if(s == null || s.isEmpty()) { + return; + } + + Stack newStack = new Stack(); + int value = s.pop(); + while(value != o){ + newStack.push(value); + value = s.pop(); + } + while(!newStack.isEmpty()){ + s.push(newStack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + Object[] data = new Object[len]; + for(int i = 0; i < len; i++){ + data[i] = s.pop(); + } + for(int i = len-1; i >= 0; i--){ + s.push((Integer)data[i]); + } + return data; + } + /** + * 字符串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){ + Stack stack = new Stack(); + for(int i = 0; i < s.length(); i++){ + String c = s.charAt(i)+""; + if(c.equals("{") || c.equals("[") || c.equals("(")){ + stack.push(c); + } + + if(c.equals("}")){ + if(stack.peek().equals("{")){ + stack.pop(); + }else{ + return false; + } + } + + if(c.equals("]")){ + if(stack.peek().equals("[")){ + stack.pop(); + }else{ + return false; + } + } + + if(c.equals(")")){ + if(stack.peek().equals("(")){ + stack.pop(); + }else{ + return false; + } + } + + } + return stack.size() == 0; + } + + +} diff --git a/group19/1294642551/test/stackUtil/StackUtilTest.java b/group19/1294642551/test/stackUtil/StackUtilTest.java new file mode 100644 index 0000000000..7f304445c7 --- /dev/null +++ b/group19/1294642551/test/stackUtil/StackUtilTest.java @@ -0,0 +1,66 @@ +package stackUtil; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} From 09f9e7fe827ed58a266aafbbcbca7939ab05f290 Mon Sep 17 00:00:00 2001 From: hejj <844028312@qq.com> Date: Sun, 7 May 2017 12:07:50 +0800 Subject: [PATCH 450/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/queue/CircleQueue.java | 40 +++++++++- .../src/com/coding/basic/queue/Josephus.java | 69 ++++++++++++++++- .../com/coding/basic/queue/JosephusTest.java | 1 - .../basic/queue/QueueWithTwoStacks.java | 19 ++++- .../basic/stack/expr/InfixToPostfix.java | 25 +++++- .../coding/basic/stack/expr/PostfixExpr.java | 29 ++++++- .../basic/stack/expr/PostfixExprTest.java | 2 +- .../coding/basic/stack/expr/PrefixExpr.java | 77 ++++++++++++++++++- .../basic/stack/expr/PrefixExprTest.java | 2 +- 9 files changed, 248 insertions(+), 16 deletions(-) diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/CircleQueue.java b/group04/844028312/data-structure/src/com/coding/basic/queue/CircleQueue.java index 1ac659da3d..48bcbd01f5 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/queue/CircleQueue.java +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/CircleQueue.java @@ -1,5 +1,43 @@ package com.coding.basic.queue; public class CircleQueue { - + private int size; + private int real; + private int front; + private Object[] object; + public CircleQueue(int size){ + this.size=size+1; + object=new Object[this.size]; + this.real=0; + this.front=0; + } + public boolean isEmpty(){ + return real==front; + } + public int size(){ + if(isEmpty()) + return 0; + else + return real; + } + public Object deQueue(){ + if(!isEmpty()){ + + Object o=object[front]; + object[front]=null; + front=(front+1)%size; + return o; + } + return null; + } + public void enQueue(Object o){ + if(!queueFull()){ + object[real]=o; + real=(real+1)%size; + } + } + private boolean queueFull(){ + + return (real+1)%size==front; + } } diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/Josephus.java b/group04/844028312/data-structure/src/com/coding/basic/queue/Josephus.java index d629d847f4..46defa87cc 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/queue/Josephus.java +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/Josephus.java @@ -3,17 +3,78 @@ import java.util.ArrayList; import java.util.List; +import com.coding.basic.Queue; + /** * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死,直到最后一个人留下来 * @author liuxin * */ public class Josephus { public static List execute(int n, int m){ - - return null; - } + List list=new ArrayList(); + Queue queue1=new Queue(); + Queue queue2=new Queue(); + for(int i=0;i1){ + int tag = 1; + int i=0; + while(tag1) + reset(queue1,queue2); + else{ + if(!queue1.isEmpty()) + list.add((Integer) queue1.deQueue()); + if(!queue2.isEmpty()) + list.add((Integer) queue2.deQueue()); + } + } + return list; + } + private static void reset(Queue queue1,Queue queue2){ + if(queue1.isEmpty()){ + while(!queue2.isEmpty()){ + queue1.enQueue(queue2.deQueue()); + } + } + else{ + while(!queue1.isEmpty()){ + queue2.enQueue(queue1.deQueue()); + } + while(!queue2.isEmpty()){ + queue1.enQueue(queue2.deQueue()); + } + } + } } diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/JosephusTest.java b/group04/844028312/data-structure/src/com/coding/basic/queue/JosephusTest.java index 7d90318b51..8806a7b615 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/queue/JosephusTest.java +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/JosephusTest.java @@ -19,7 +19,6 @@ public void tearDown() throws Exception { @Test public void testExecute() { - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); } diff --git a/group04/844028312/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group04/844028312/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java index bbd4715ca6..37c181b022 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java +++ b/group04/844028312/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -16,22 +16,35 @@ public QueueWithTwoStacks() { public boolean isEmpty() { - return false; + return stack1.isEmpty(); } public int size() { - return -1; + return stack1.size(); } public void enQueue(E item) { - + stack1.push(item); } public E deQueue() { + E item; + while(!stack1.isEmpty()){ + if(stack1.size()==1){ + item=stack1.pop(); + while(!stack2.isEmpty()){ + stack1.push(stack2.pop()); + } + return item; + } + else{ + stack2.push(stack1.pop()); + } + } return null; } diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java index 96a2194a67..bf1c0052a5 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -1,12 +1,33 @@ package com.coding.basic.stack.expr; +import java.util.ArrayList; import java.util.List; +import java.util.Stack; + + public class InfixToPostfix { public static List convert(String expr) { - - return null; + TokenParser parser=new TokenParser(); + List exprs=parser.parse(expr); + List numStack=new ArrayList(); + Stack ope=new Stack(); + for(Token token:exprs){ + if(token.isOperator()){ + if(!ope.isEmpty()&&!token.hasHigherPriority(ope.peek())){ + numStack.add(ope.pop()); + } + ope.push(token); + } + else if(token.isNumber()){ + numStack.add(token); + } + } + while(!ope.isEmpty()){ + numStack.add(ope.pop()); + } + return numStack; } diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java index dcbb18be4b..c9febad48b 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -11,7 +11,34 @@ public PostfixExpr(String expr) { } public float evaluate() { - return 0.0f; + TokenParser tokenParser=new TokenParser(); + List tokens=tokenParser.parse(expr); + Stack stack=new Stack(); + for(Token token:tokens){ + if(token.isNumber()){ + stack.push(new Float(token.getIntValue())); + } + else{ + float one =(float) stack.pop(); + float two=(float) stack.pop(); + float result = 0; + String ope=token.toString(); + if(ope.equals("-")){ + result=two-one; + } + else if(ope.equals("*")){ + result=two*one; + } + else if(ope.equals("/")){ + result=two/one; + } + else if(ope.equals("+")){ + result=two+one; + } + stack.push(result); + } + } + return (float) stack.pop(); } diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java index c0435a2db5..c4e3ca2dae 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -26,7 +26,7 @@ public void testEvaluate() { Assert.assertEquals(288, expr.evaluate(),0.0f); } { - //9+(3-1)*3+10/2 + //9+(3-1)*3+10/2 9 2 3 * PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); Assert.assertEquals(20, expr.evaluate(),0.0f); } diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java index 956927e2df..f3879f31f6 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -1,7 +1,8 @@ package com.coding.basic.stack.expr; import java.util.List; -import java.util.Stack; + +import com.coding.basic.Stack; public class PrefixExpr { String expr = null; @@ -11,7 +12,79 @@ public PrefixExpr(String expr) { } public float evaluate() { - return 0.0f; + TokenParser tokenParser=new TokenParser(); + List tokens=tokenParser.parse(expr); + Stack stack=new Stack(); + for(Token token:tokens){ + if(token.isNumber()){ + float result = 0; + if(!(stack.peek().equals("-")||stack.peek().equals("*")||stack.peek().equals("/")||stack.peek().equals("+"))){ + float one = new Float( (float)stack.pop()); + float two =token.getIntValue(); + String ope=(String) stack.pop(); + if(ope.equals("-")){ + result=one-two; + } + else if(ope.equals("*")){ + result=two*one; + } + else if(ope.equals("/")){ + result=one/two; + } + else if(ope.equals("+")){ + result=two+one; + } + + while(!("-".equals(stack.peek())||"*".equals(stack.peek())||"/".equals(stack.peek())||"+".equals(stack.peek()))&&!stack.isEmpty()){ + one =new Float( (float)stack.pop()); + + ope=(String) stack.pop(); + if(ope.equals("-")){ + result=one-result; + } + else if(ope.equals("*")){ + result=result*one; + } + else if(ope.equals("/")){ + result=one/result; + } + else if(ope.equals("+")){ + result=result+one; + } + + } + stack.push(result); + } + else + stack.push(new Float((float)token.getIntValue())); + + } + else if(token.isOperator()){ + + stack.push(token.toString()); + } + } + while(stack.size()>1){ + float one = new Float( (float)stack.pop()); + float two = new Float( (float)stack.pop()); + float result = 0; + String ope=(String) stack.pop(); + if(ope.equals("-")){ + result=two-one; + } + else if(ope.equals("*")){ + result=two*one; + } + else if(ope.equals("/")){ + result=two/one; + } + else if(ope.equals("+")){ + result=two+one; + } + stack.push(result); + + } + return (float) stack.pop() ; } diff --git a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java index 5cec210e75..03e6bcaaab 100644 --- a/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java +++ b/group04/844028312/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -25,7 +25,7 @@ public void testEvaluate() { } { // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8");// -++66 Assert.assertEquals(12, expr.evaluate(),0.001f); } { From bdd071c6736811fb4b29ab512b0cc6ec7307137a Mon Sep 17 00:00:00 2001 From: hejj <844028312@qq.com> Date: Sun, 7 May 2017 12:08:25 +0800 Subject: [PATCH 451/552] =?UTF-8?q?jvm=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/jvm/attr/CodeAttr.java | 14 +++- .../src/com/coderising/jvm/clz/ClassFile.java | 17 +++- .../coderising/jvm/constant/ClassInfo.java | 6 ++ .../coderising/jvm/constant/ConstantInfo.java | 11 +++ .../coderising/jvm/constant/ConstantPool.java | 2 +- .../coderising/jvm/constant/FieldRefInfo.java | 5 ++ .../jvm/constant/MethodRefInfo.java | 6 ++ .../jvm/constant/NameAndTypeInfo.java | 6 ++ .../jvm/constant/NullConstantInfo.java | 5 ++ .../coderising/jvm/constant/StringInfo.java | 6 ++ .../com/coderising/jvm/constant/UTF8Info.java | 5 ++ .../jvm/loader/ClassFileParser.java | 8 +- .../src/com/coderising/jvm/method/Method.java | 43 ++++++++++ .../jvm/test/ClassFileloaderTest.java | 82 ++++++++++++++++++- .../com/coderising/jvm/test/EmployeeV1.java | 1 - 15 files changed, 206 insertions(+), 11 deletions(-) diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group04/844028312/min-jvm/src/com/coderising/jvm/attr/CodeAttr.java index 96c7823b71..e8b0da8f82 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -3,6 +3,7 @@ import java.io.UnsupportedEncodingException; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; import com.coderising.jvm.util.Util; @@ -17,10 +18,15 @@ public String getCode() { return code; } - //private ByteCodeCommand[] cmds ; - //public ByteCodeCommand[] getCmds() { - // return cmds; - //} + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + + public void setCmds(ByteCodeCommand[] cmds) { + this.cmds = cmds; + } + private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassFile.java b/group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassFile.java index 4755266987..bdc1058a1f 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassFile.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -80,13 +80,26 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + public Method getMethod(String methodName, String paramAndReturnType){ + for(Method method:methods){ + if(pool.getUTF8String(method.getNameIndex()).equals(methodName)&&pool.getUTF8String(method.getDescriptorIndex()).equals(paramAndReturnType)){ + return method; + } + } + + return null; + } + public Method getMainMethod(){ + + return getMethod("main","([Ljava/lang/String;)V"); + } } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ClassInfo.java index aea9048ea4..1f34615ef5 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -21,4 +21,10 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + + } + } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantInfo.java index 466b072244..d61049b77e 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -25,5 +25,16 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + public void visistNullConstant(NullConstantInfo info); + } + } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantPool.java index 86c0445695..93506b1e20 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java index 65475e194c..6970072491 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -51,4 +51,9 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + + } } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java index 7f05870020..2dabecf630 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -49,6 +49,12 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + + } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java index 402f9dec86..abf55fbd51 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,10 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + visitor.visitNameAndType(this); + } } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java index 936736016f..ced0c8fc8b 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -9,5 +9,10 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + visitor.visistNullConstant(this); + } } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/StringInfo.java index f1f8eb4ed4..408557de2c 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/StringInfo.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -22,5 +22,11 @@ public void setIndex(int index) { public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + visitor.visitString(this); + } } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/UTF8Info.java index 5cac9f04f7..6e67ca727d 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -26,6 +26,11 @@ public String getValue() { public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + // TODO Auto-generated method stub + visitor.visistUTF8(this); + } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group04/844028312/min-jvm/src/com/coderising/jvm/loader/ClassFileParser.java index 2148e0308f..0478ce8ee2 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -6,6 +6,8 @@ import com.coderising.jvm.clz.AccessFlag; import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; @@ -45,6 +47,10 @@ public ClassFile parse(byte[] codes) { parseInterfaces(iter); parseField(clf,iter); parseMethod(clf,iter); + for(Method m:clf.getMethods()){ + ByteCodeCommand [] cmds =CommandParser.parse(clf,m.getCodeAttr().getCode() ); + m.getCodeAttr().setCmds(cmds); + } return clf; } @@ -83,7 +89,7 @@ else if(tag==ConstantInfo.FIELD_INFO){ int classIndex=iter.nextU2toInt(); int nameAndTypeIndex=iter.nextU2toInt(); field.setClassInfoIndex(classIndex); - field.setClassInfoIndex(nameAndTypeIndex); + field.setNameAndTypeIndex(nameAndTypeIndex); constantPool.addConstantInfo(field); } else if(tag==ConstantInfo.FLOAT_INFO){ diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/method/Method.java b/group04/844028312/min-jvm/src/com/coderising/jvm/method/Method.java index 54cc611e6f..204f4685c3 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/method/Method.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/method/Method.java @@ -1,13 +1,18 @@ package com.coderising.jvm.method; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; @@ -70,4 +75,42 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + public List getParams(){ + List params=new ArrayList(); + MethodRefInfo methodInfo=(MethodRefInfo) this.clzFile.getConstantPool().getConstantInfo(descriptorIndex); + + String paramAndReturnType=methodInfo.getParamAndReturnType(); + //(Ljava/lang/String;I)V + int frist=paramAndReturnType.indexOf("("); + int last=paramAndReturnType.lastIndexOf(")"); + String param=paramAndReturnType.substring(frist+1, last); + if(null==param|| param.equals("")){ + return null; + } + int pos=0; + while(!param.equals("")){ + if(param.charAt(pos)=='L'){ + int end=param.indexOf(";"); + if(end==0){ + new Exception("not find this object"); + } + params.add(param.substring(pos+1, end)); + pos=end+1; + } + else if(param.charAt(pos)=='F'){ + params.add("F"); + pos++; + + } + else if(param.charAt(pos)=='I'){ + params.add("I"); + pos++; + } + param.substring(pos); + } + return params; + } } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group04/844028312/min-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index 722cf93a0b..46e3ed36da 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -9,6 +9,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; @@ -27,7 +31,7 @@ public class ClassFileloaderTest { private static final String FULL_QUALIFIED_CLASS_NAME = "com/coderising/jvm/test/EmployeeV1"; - static String path1 = "F:\\workspace\\min-jvm\\bin"; + static String path1 = "F:/workspace/min-jvm/bin"; static String path2 = "C:\temp"; static ClassFile clzFile = null; @@ -37,7 +41,7 @@ public class ClassFileloaderTest { String className = "com.coderising.jvm.test.EmployeeV1"; clzFile = loader.loadClass(className); - clzFile.print(); + } @@ -200,6 +204,7 @@ public void testClassIndex(){ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + /** * 下面是第三次JVM课应实现的测试用例 */ @@ -271,6 +276,79 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } diff --git a/group04/844028312/min-jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group04/844028312/min-jvm/src/com/coderising/jvm/test/EmployeeV1.java index 019c90d4a3..12e3d7efdd 100644 --- a/group04/844028312/min-jvm/src/com/coderising/jvm/test/EmployeeV1.java +++ b/group04/844028312/min-jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -16,7 +16,6 @@ public void setName(String name) { } public void setAge(int age){ this.age = age; - System.out.println("Hello , this is class Employee "); } public void sayHello() { System.out.println("Hello , this is class Employee "); From bc5ca4704e890b3e872323730f6fe98534e1c91a Mon Sep 17 00:00:00 2001 From: xukai Date: Sun, 7 May 2017 14:45:39 +0800 Subject: [PATCH 452/552] =?UTF-8?q?jvm6=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xukai/coderising/stack/QuickMinStack.java | 61 +++++++++ .../coderising/stack/StackWithTwoQueues.java | 63 +++++++++ .../coderising/stack/TwoStackInOneArray.java | 122 ++++++++++++++++++ 3 files changed, 246 insertions(+) create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/QuickMinStack.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/StackWithTwoQueues.java create mode 100644 group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TwoStackInOneArray.java diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/QuickMinStack.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/QuickMinStack.java new file mode 100644 index 0000000000..12e02ba5aa --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/QuickMinStack.java @@ -0,0 +1,61 @@ +package org.xukai.coderising.stack; + +import org.junit.Test; + +import java.util.*; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + + private TreeSet treeSet = new TreeSet(); + + private java.util.Stack stack = new java.util.Stack(); + + public void push(int data){ + stack.push(data); + treeSet.add(data); + } + public int pop(){ + if (!stack.isEmpty()) { + treeSet.remove(stack.peek()); + return stack.pop(); + } + return -1; + } + public int findMin(){ + if (treeSet.size() > 0) { + return treeSet.first(); + } + return -1; + } + + @Test + public void testQuickMinStack(){ + QuickMinStack stack = new QuickMinStack(); + stack.push(6); + stack.push(5); + stack.push(4); + stack.push(3); + stack.push(2); + stack.push(1); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println("min:" + stack.findMin()); + System.out.println(stack.pop()); + System.out.println("min:" + stack.findMin()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println("min:" + stack.findMin()); + System.out.println(stack.pop()); + System.out.println("min:" + stack.findMin()); + System.out.println(stack.pop()); + + + } +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/StackWithTwoQueues.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..e2e22a9766 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/StackWithTwoQueues.java @@ -0,0 +1,63 @@ +package org.xukai.coderising.stack; + + +import org.junit.Test; + +import java.util.concurrent.ArrayBlockingQueue; + +public class StackWithTwoQueues { + + private ArrayBlockingQueue queue1 = new ArrayBlockingQueue(10); + + private ArrayBlockingQueue queue2 = new ArrayBlockingQueue(10); + + + + + public void push(int data) { + + if (queue1.isEmpty()) { + queue1.offer(data); + swap(queue1,queue2); + } else { + queue2.offer(data); + swap(queue2, queue1); + } + } + + private void swap(ArrayBlockingQueue target, ArrayBlockingQueue origin) { + while (!origin.isEmpty()) { + target.offer(origin.poll()); + } + } + + public int pop() { + if (!queue1.isEmpty()) { + return queue1.poll(); + } else if(!queue2.isEmpty()) { + return queue2.poll(); + } + return -1; + } + + @Test + public void testStackWithTwoQueues(){ + StackWithTwoQueues queue = new StackWithTwoQueues(); + queue.push(6); + queue.push(5); + queue.push(4); + queue.push(3); + queue.push(2); + queue.push(1); + System.out.println(queue.pop()); + System.out.println(queue.pop()); + System.out.println(queue.pop()); + System.out.println(queue.pop()); + System.out.println(queue.pop()); + System.out.println(queue.pop()); + System.out.println(queue.pop()); + + } + + +} diff --git a/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TwoStackInOneArray.java b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..d5a91f0672 --- /dev/null +++ b/group19/527220084/xukai_coding/coding-common/src/main/java/org/xukai/coderising/stack/TwoStackInOneArray.java @@ -0,0 +1,122 @@ +package org.xukai.coderising.stack; + +import org.junit.Test; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + + Object[] data = new Object[5]; + + private int s1Pos = -1; + + private int s2Pos = data.length; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + if (s1Pos == s2Pos) { + doubleCapcity(data, s1Pos, s2Pos); + } + s1Pos++; + data[s1Pos] = o; + } + + private void doubleCapcity(Object[] data, int s1Pos, int s2Pos) { + Object[] newData = new Object[2 * data.length]; + System.arraycopy(data, 0, newData, 0, s1Pos + 1); + System.arraycopy(data, s2Pos, newData, data.length + s2Pos, data.length - s2Pos); + this.s2Pos = data.length + s2Pos; + this.data = newData; + } + + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + if (s1Pos > -1) { + Object o = data[s1Pos]; + s1Pos--; + return o; + } + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + public Object peek1(){ + if (s1Pos > -1) { + return data[s1Pos]; + } + return null; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + if (s1Pos == s2Pos - 1) { + doubleCapcity(data, s1Pos, s2Pos); + } + s2Pos--; + data[s2Pos] = o; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + if (s2Pos < data.length) { + Object o = data[s2Pos]; + s2Pos++; + return o; + } + return null; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + if (s2Pos < data.length) { + return data[s2Pos]; + } + return null; + } + + @Test + public void testTwoStackInOneArray(){ + TwoStackInOneArray stack = new TwoStackInOneArray(); + System.out.println(stack.peek1()); + System.out.println(stack.peek2()); + System.out.println(stack.pop1()); + System.out.println(stack.pop2()); + + stack.push1(1); + stack.push1(2); + stack.push2(6); + stack.push2(5); + stack.push2(4); + stack.push2(3); + System.out.println(stack.pop1()); + System.out.println(stack.pop1()); + System.out.println(stack.pop1()); + System.out.println(stack.pop1()); + System.out.println(stack.pop2()); + System.out.println(stack.pop2()); + System.out.println(stack.pop2()); + System.out.println(stack.pop2()); + + } + +} From 8908e8b3c5698e37273ba6dc82fd7b7e262fbb6e Mon Sep 17 00:00:00 2001 From: anxinJ <1028361767@qq.com> Date: Sun, 7 May 2017 15:46:34 +0800 Subject: [PATCH 453/552] =?UTF-8?q?=E6=9C=80=E6=96=B0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 最新数据结构作业 --- .../com/coding/basic/stack/QuickMinStack.java | 45 ++++++++ .../basic/stack/StackWithTwoQueues.java | 34 ++++++ .../basic/stack/TwoStackInOneArray.java | 108 ++++++++++++++++++ 3 files changed, 187 insertions(+) create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..a04191da19 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack; + +import java.util.Arrays; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + int[] datas = new int[10]; + int size; + int minIndex; + + public void push(int data){ + checkAndresize(); + datas[size] = data; + if(datas[minIndex] > data){ + minIndex = size; + } + size++; + } + + public int pop(){ + checkOutBound(); + return datas[size-1]; + } + public int findMin(){ + checkOutBound(); + return datas[minIndex]; + } + + private void checkAndresize() { + if(size == datas.length){ + datas = Arrays.copyOf(datas, datas.length*2); + } + } + private void checkOutBound(){ + if(size <= 0){ + throw new IndexOutOfBoundsException(); + } + } +} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..35ff5f88a6 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,34 @@ +package com.coding.basic.stack; + +import java.util.LinkedList; +import java.util.Queue; + +public class StackWithTwoQueues { + + Queue queue1 = new LinkedList(); + Queue queue2 = new LinkedList(); + + public void push(int data) { + queue1.add(data); + } + + public int pop() { + while(queue1.size() > 1){ + queue2.add(queue1.poll()); + } + queue1.addAll(queue2); + return queue1.poll(); + } + + public static void main(String[] args) { + StackWithTwoQueues s = new StackWithTwoQueues(); + for (int i = 0; i < 5; i++) { + s.push(i); + } + System.out.println(s.pop()); + System.out.println(s.pop()); + System.out.println(s.pop()); + System.out.println(s.pop()); + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..2173d65b5a --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,108 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + int front; + int rear; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + checkInBound(); + data[front++] = o; + } + + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + checkOutBound(front); + Object o = data[--front]; + data[front] = null; + return o; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + checkOutBound(front); + return data[front-1]; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + checkInBound(); + data[data.length-rear-1] = o; + rear++; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + checkOutBound(rear); + int index = data.length-rear; + Object o = data[index]; + data[index] = null; + rear--; + return o; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + checkOutBound(rear); + return data[data.length-rear]; + } + + private Object[] resize(int len) { + int newLen = len * 2; + Object[] newData = new Object[newLen]; + if(front > 0){ + System.arraycopy(data, 0, newData, 0, front); + } + if(rear > 0){ + System.arraycopy(data, len-rear, newData, newLen-rear, rear); + } + return newData; + } + + private void checkOutBound(int index){ + if(index <= 0){ + throw new IndexOutOfBoundsException(); + } + } + + private void checkInBound() { + if((front+rear) >= data.length){ + data = resize(data.length); + } + } + + public static void main(String[] args) { + TwoStackInOneArray t = new TwoStackInOneArray(); + for(int i=0;i<25;i++){ + t.push1(i); + t.push2(i); + } + System.out.println(t.front+t.rear); + for(int i=0;i Date: Sun, 7 May 2017 16:27:16 +0800 Subject: [PATCH 454/552] =?UTF-8?q?=E7=AC=AC9=E5=91=A8=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/coding/week9/QuickMinStack.java | 45 ++++++++ .../com/coding/week9/StackWithTwoQueues.java | 38 +++++++ .../com/coding/week9/TwoStackInOneArray.java | 102 ++++++++++++++++++ .../com/coding/week9/QuickMinStackTest.java | 20 ++++ .../coding/week9/StackWithTwoQueuesTest.java | 29 +++++ .../coding/week9/TwoStackInOneArrayTest.java | 43 ++++++++ 6 files changed, 277 insertions(+) create mode 100644 group24/494800949/src/main/java/com/coding/week9/QuickMinStack.java create mode 100644 group24/494800949/src/main/java/com/coding/week9/StackWithTwoQueues.java create mode 100644 group24/494800949/src/main/java/com/coding/week9/TwoStackInOneArray.java create mode 100644 group24/494800949/src/test/java/com/coding/week9/QuickMinStackTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week9/StackWithTwoQueuesTest.java create mode 100644 group24/494800949/src/test/java/com/coding/week9/TwoStackInOneArrayTest.java diff --git a/group24/494800949/src/main/java/com/coding/week9/QuickMinStack.java b/group24/494800949/src/main/java/com/coding/week9/QuickMinStack.java new file mode 100644 index 0000000000..7aea9e57be --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week9/QuickMinStack.java @@ -0,0 +1,45 @@ +package com.coding.week9; + + +//import java.util.Stack; + + +import java.util.ArrayList; +import java.util.List; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + List elements = new ArrayList<>(); + private int minNumIndex = 0; + + private boolean isSmaller(int data) { + if (elements.isEmpty()) { + return true; + } + if (data < elements.get(minNumIndex)) { + return true; + } + return false; + } + public void push(int data) { + elements.add(data); + if (isSmaller(data)) { + minNumIndex = elements.size() - 1; + } + + } + + public int pop() { + return elements.remove(elements.size() - 1); + } + + public int findMin() { + return elements.get(minNumIndex); + } +} diff --git a/group24/494800949/src/main/java/com/coding/week9/StackWithTwoQueues.java b/group24/494800949/src/main/java/com/coding/week9/StackWithTwoQueues.java new file mode 100644 index 0000000000..f55bad77ca --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week9/StackWithTwoQueues.java @@ -0,0 +1,38 @@ +package com.coding.week9; + + +import com.coding.week8.CircleQueue; + +public class StackWithTwoQueues { + private CircleQueue queue1 = new CircleQueue<>(); + private CircleQueue queue2 = new CircleQueue<>(); + + public void push(int data) { + if (queue1.isEmpty()) { + queue1.enQueue(data); + } else { + queue2.enQueue(data); + } + } + + public int pop() { + if (queue1.isEmpty() && queue2.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + if (queue2.isEmpty()) { + while (queue1.size() > 1) { + queue2.enQueue(queue1.deQueue()); + } + return queue1.deQueue(); + } else { + while (queue2.size() > 1) { + queue1.enQueue(queue2.deQueue()); + } + return queue2.deQueue(); + } + + + } + + +} diff --git a/group24/494800949/src/main/java/com/coding/week9/TwoStackInOneArray.java b/group24/494800949/src/main/java/com/coding/week9/TwoStackInOneArray.java new file mode 100644 index 0000000000..1d7d613452 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week9/TwoStackInOneArray.java @@ -0,0 +1,102 @@ +package com.coding.week9; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + private int pos1 = 0; + private int pos2 = data.length - 1; + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + if (o == null) { + throw new RuntimeException("data can not be null"); + } + data[pos1++] = o; + if (pos1 == pos2) { + doubleCapacity(); + } + } + + private void doubleCapacity(){ + int oldCapacity = data.length; + int newCapacity = oldCapacity << 1; + if (newCapacity < 0) { + throw new RuntimeException("capacity is too large"); + } + Object[] dataNew = new Object[newCapacity]; + System.arraycopy(data, 0, dataNew, 0, pos1); + int moveNum = oldCapacity - pos2; + int newPos2 = newCapacity - moveNum; + System.arraycopy(data, pos2, dataNew, newPos2, moveNum); + pos2 = newPos2; + data = dataNew; + } + + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + if (pos1 == 0) { + throw new RuntimeException("stack1 is empty"); + } + Object e = data[--pos1]; + data[pos1] = null; + return e; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + if (pos1 == 0) { + return null; + } + return data[pos1 - 1]; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + if (o == null) { + throw new RuntimeException("data can not be null"); + } + data[pos2--] = o; + if (pos1 == pos2) { + doubleCapacity(); + } + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + if (pos2 == data.length - 1) { + throw new RuntimeException("stack2 is empty"); + } + Object e = data[++pos2]; + data[pos2] = null; + return e; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + if (pos2 == data.length - 1) { + return null; + } + return data[pos2 + 1]; + } + +} diff --git a/group24/494800949/src/test/java/com/coding/week9/QuickMinStackTest.java b/group24/494800949/src/test/java/com/coding/week9/QuickMinStackTest.java new file mode 100644 index 0000000000..a88ae6208f --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week9/QuickMinStackTest.java @@ -0,0 +1,20 @@ +package com.coding.week9; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by Administrator on 2017/5/7 0007. + */ +public class QuickMinStackTest { + + @Test + public void testFindMin() throws Exception { + QuickMinStack quickMinStack = new QuickMinStack(); + quickMinStack.push(10); + quickMinStack.push(9); + quickMinStack.push(100); + quickMinStack.push(19); + Assert.assertEquals(quickMinStack.findMin(), 9); + } +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week9/StackWithTwoQueuesTest.java b/group24/494800949/src/test/java/com/coding/week9/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..0d7913883e --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week9/StackWithTwoQueuesTest.java @@ -0,0 +1,29 @@ +package com.coding.week9; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by Administrator on 2017/5/7 0007. + */ +public class StackWithTwoQueuesTest { + + + + + @Test + public void testPush() throws Exception { + StackWithTwoQueues stackWithTwoQueues = new StackWithTwoQueues(); + stackWithTwoQueues.push(1); + stackWithTwoQueues.push(2); + stackWithTwoQueues.push(3); + stackWithTwoQueues.push(4); + stackWithTwoQueues.push(5); + Assert.assertEquals(stackWithTwoQueues.pop(), 5); + Assert.assertEquals(stackWithTwoQueues.pop(), 4); + Assert.assertEquals(stackWithTwoQueues.pop(), 3); + Assert.assertEquals(stackWithTwoQueues.pop(), 2); + Assert.assertEquals(stackWithTwoQueues.pop(), 1); + } + +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/week9/TwoStackInOneArrayTest.java b/group24/494800949/src/test/java/com/coding/week9/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..b3481715ec --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week9/TwoStackInOneArrayTest.java @@ -0,0 +1,43 @@ +package com.coding.week9; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Administrator on 2017/5/7 0007. + */ +public class TwoStackInOneArrayTest { + + private TwoStackInOneArray stackInOneArray; + + @Before + public void setup(){ + stackInOneArray = new TwoStackInOneArray(); + } + @Test + public void testPush1() throws Exception { + stackInOneArray.push1(10); + stackInOneArray.push1(20); + stackInOneArray.push1(30); + stackInOneArray.push1(88); + stackInOneArray.push1(30); + stackInOneArray.push1(99); + stackInOneArray.push2(100); + stackInOneArray.push2(90); + stackInOneArray.push2(80); + stackInOneArray.push2(77); + stackInOneArray.push2(66); + Assert.assertEquals(stackInOneArray.peek1(), 99); + Assert.assertEquals(stackInOneArray.pop1(), 99); + Assert.assertEquals(stackInOneArray.pop1(), 30); + + Assert.assertEquals(stackInOneArray.peek2(), 66); + Assert.assertEquals(stackInOneArray.pop2(), 66); + Assert.assertEquals(stackInOneArray.pop2(), 77); + Assert.assertEquals(stackInOneArray.pop2(), 80); + Assert.assertEquals(stackInOneArray.pop2(), 90); + } + + +} \ No newline at end of file From a9f7b1d413c52de141cd0a3c60a077b0dfc58fb4 Mon Sep 17 00:00:00 2001 From: dudy Date: Sun, 7 May 2017 16:39:26 +0800 Subject: [PATCH 455/552] =?UTF-8?q?jvm=E9=83=A8=E5=88=86=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group04/1796244932/learn01/pom.xml | 32 ++ .../base/aop/DynamicProxy/Business.java | 16 + .../base/aop/DynamicProxy/CGlibDemo.java | 28 ++ .../aop/DynamicProxy/DynamicProxyDemo.java | 25 ++ .../base/aop/DynamicProxy/IBusiness.java | 8 + .../base/aop/DynamicProxy/IBusiness2.java | 9 + .../base/aop/DynamicProxy/LogIntercept.java | 25 ++ .../DynamicProxy/LogInvocationHandler.java | 30 ++ .../java/com/dudy/learn01/base/aop/node.md | 7 + .../{ => base}/juc/ThreadLocalTest.java | 2 +- .../download/DownloadThread.java | 5 +- .../download/FileDownloader.java | 14 +- .../download/api/Connection.java | 2 +- .../download/api/ConnectionException.java | 2 +- .../download/api/ConnectionManager.java | 2 +- .../download/api/DownloadListener.java | 3 +- .../download/impl/ConnectionImpl.java | 5 +- .../download/impl/ConnectionManagerImpl.java | 10 +- .../coderising/jvm/attr/AttributeInfo.java | 19 + .../learn01/coderising/jvm/attr/CodeAttr.java | 69 ++++ .../coderising/jvm/attr/LineNumberTable.java | 55 +++ .../jvm/attr/LocalVariableItem.java | 39 ++ .../jvm/attr/LocalVariableTable.java | 40 ++ .../coderising/jvm/attr/StackMapTable.java | 30 ++ .../coderising/jvm/clz/AccessFlag.java | 25 ++ .../learn01/coderising/jvm/clz/ClassFile.java | 102 +++++ .../coderising/jvm/clz/ClassIndex.java | 19 + .../learn01/coderising/jvm/cmd/BiPushCmd.java | 22 ++ .../coderising/jvm/cmd/ByteCodeCommand.java | 130 +++++++ .../coderising/jvm/cmd/CommandParser.java | 86 +++++ .../coderising/jvm/cmd/GetFieldCmd.java | 22 ++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 20 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 21 ++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 ++ .../learn01/coderising/jvm/cmd/LdcCmd.java | 28 ++ .../coderising/jvm/cmd/NewObjectCmd.java | 19 + .../coderising/jvm/cmd/NoOperandCmd.java | 22 ++ .../coderising/jvm/cmd/OneOperandCmd.java | 28 ++ .../coderising/jvm/cmd/PutFieldCmd.java | 20 + .../coderising/jvm/cmd/TwoOperandCmd.java | 64 ++++ .../coderising/jvm/constant/ClassInfo.java | 28 ++ .../coderising/jvm/constant/ConstantInfo.java | 40 ++ .../coderising/jvm/constant/ConstantPool.java | 31 ++ .../coderising/jvm/constant/FieldRefInfo.java | 58 +++ .../jvm/constant/MethodRefInfo.java | 60 +++ .../jvm/constant/NameAndTypeInfo.java | 51 +++ .../jvm/constant/NullConstantInfo.java | 17 + .../coderising/jvm/constant/StringInfo.java | 32 ++ .../coderising/jvm/constant/UTF8Info.java | 37 ++ .../learn01/coderising/jvm/field/Field.java | 50 +++ .../jvm/loader/ByteCodeIterator.java | 57 +++ .../jvm/loader/ClassFileLoader.java | 132 +++++++ .../jvm/loader/ClassFileParser.java | 52 +++ .../learn01/coderising/jvm/method/Method.java | 78 ++++ .../jvm/print/ClassFilePrinter.java | 46 +++ .../jvm/print/ConstantPoolPrinter.java | 19 + .../jvm/test/ClassFileloaderTest.java | 347 ++++++++++++++++++ .../coderising/jvm/test/EmployeeV1.java | 28 ++ .../learn01/coderising/jvm/util/Util.java | 24 ++ .../litestruts/ActionPojoParseXML.java | 0 .../litestruts/LoginAction.java | 0 .../{ => coderising}/litestruts/Struts.java | 0 .../{ => coderising}/litestruts/View.java | 0 .../litestruts/format/Configuration.java | 0 .../format/ConfigurationException.java | 0 .../litestruts/format/ConfigurationTest.java | 0 .../litestruts/format/LoginAction.java | 0 .../litestruts/format/ReflectionUtil.java | 0 .../litestruts/format/ReflectionUtilTest.java | 0 .../litestruts/format/Struts.java | 0 .../litestruts/format/StrutsTest.java | 0 .../litestruts/format/View.java | 0 .../{base => data_structure}/MyIterator.java | 2 +- .../{base => data_structure}/MyList.java | 2 +- .../array}/MyArrayUtil.java | 2 +- .../data_structure/list/LRUPageFrame.java | 146 ++++++++ .../data_structure/list/LRUPageFrameTest.java | 33 ++ .../list}/MyArrayList.java | 5 +- .../list}/MyLinkedList.java | 5 +- .../data_structure/queue/CircleQueue.java | 78 ++++ .../data_structure/queue/Josephus.java | 33 ++ .../data_structure/queue/JosephusTest.java | 26 ++ .../queue}/MyQueue.java | 7 +- .../queue/QueueWithTwoStacks.java | 58 +++ .../data_structure/queue/expr/InfixExpr.java | 102 +++++ .../queue/expr/InfixExprTest.java | 51 +++ .../queue/expr/InfixToPostfix.java | 44 +++ .../queue/expr/InfixToPostfixTest.java | 27 ++ .../queue/expr/PostfixExpr.java | 55 +++ .../queue/expr/PostfixExprTest.java | 39 ++ .../data_structure/queue/expr/PrefixExpr.java | 68 ++++ .../queue/expr/PrefixExprTest.java | 45 +++ .../data_structure/queue/expr/Token.java | 49 +++ .../queue/expr/TokenParser.java | 56 +++ .../queue/expr/TokenParserTest.java | 38 ++ .../stack}/MyStack.java | 5 +- .../data_structure/stack/StackUtil.java | 120 ++++++ .../data_structure/stack/StackUtilTest.java | 64 ++++ .../tree}/MyBinaryTree.java | 2 +- .../dudy/learn01/litestruts/format/struts.xml | 11 - .../base/MyArrayListTest.java | 4 +- .../base/MyArrayUtilTest.java | 3 +- .../base/MyBinaryTreeTest.java | 5 +- .../base/MyLinkedListTest.java | 4 +- .../base/MyQueueTest.java | 5 +- .../base/MyStackTest.java | 5 +- .../learn01/download/FileDownloaderTest.java | 8 +- 107 files changed, 3466 insertions(+), 55 deletions(-) create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/Business.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/CGlibDemo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/DynamicProxyDemo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/IBusiness.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/IBusiness2.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/LogIntercept.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/LogInvocationHandler.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/node.md rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => base}/juc/ThreadLocalTest.java (98%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/download/DownloadThread.java (92%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/download/FileDownloader.java (88%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/download/api/Connection.java (89%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/download/api/ConnectionException.java (52%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/download/api/ConnectionManager.java (84%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/download/api/DownloadListener.java (58%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/download/impl/ConnectionImpl.java (96%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/download/impl/ConnectionManagerImpl.java (61%) create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/AttributeInfo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/CodeAttr.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LineNumberTable.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/StackMapTable.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/AccessFlag.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/ClassFile.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/ClassIndex.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/CommandParser.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/LdcCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ClassInfo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ConstantInfo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ConstantPool.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/StringInfo.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/UTF8Info.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/field/Field.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ClassFileParser.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/method/Method.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/test/EmployeeV1.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/util/Util.java rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/ActionPojoParseXML.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/LoginAction.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/Struts.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/View.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/Configuration.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/ConfigurationException.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/ConfigurationTest.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/LoginAction.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/ReflectionUtil.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/ReflectionUtilTest.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/Struts.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/StrutsTest.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{ => coderising}/litestruts/format/View.java (100%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{base => data_structure}/MyIterator.java (66%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{base => data_structure}/MyList.java (81%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{base => data_structure/array}/MyArrayUtil.java (99%) create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/LRUPageFrame.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/LRUPageFrameTest.java rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{base => data_structure/list}/MyArrayList.java (94%) rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{base => data_structure/list}/MyLinkedList.java (97%) create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/CircleQueue.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/Josephus.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/JosephusTest.java rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{base => data_structure/queue}/MyQueue.java (62%) create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/QueueWithTwoStacks.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixExpr.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixExprTest.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixToPostfix.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixToPostfixTest.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PostfixExpr.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PostfixExprTest.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PrefixExpr.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PrefixExprTest.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/Token.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/TokenParser.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/TokenParserTest.java rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{base => data_structure/stack}/MyStack.java (81%) create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/StackUtil.java create mode 100644 group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/StackUtilTest.java rename group04/1796244932/learn01/src/main/java/com/dudy/learn01/{base => data_structure/tree}/MyBinaryTree.java (96%) delete mode 100755 group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/format/struts.xml rename group04/1796244932/learn01/src/test/java/com/dudy/learn01/{ => data_structure}/base/MyArrayListTest.java (87%) rename group04/1796244932/learn01/src/test/java/com/dudy/learn01/{ => data_structure}/base/MyArrayUtilTest.java (95%) rename group04/1796244932/learn01/src/test/java/com/dudy/learn01/{ => data_structure}/base/MyBinaryTreeTest.java (84%) rename group04/1796244932/learn01/src/test/java/com/dudy/learn01/{ => data_structure}/base/MyLinkedListTest.java (94%) rename group04/1796244932/learn01/src/test/java/com/dudy/learn01/{ => data_structure}/base/MyQueueTest.java (79%) rename group04/1796244932/learn01/src/test/java/com/dudy/learn01/{ => data_structure}/base/MyStackTest.java (90%) diff --git a/group04/1796244932/learn01/pom.xml b/group04/1796244932/learn01/pom.xml index f62b63ec4b..974a96ddcd 100644 --- a/group04/1796244932/learn01/pom.xml +++ b/group04/1796244932/learn01/pom.xml @@ -44,6 +44,38 @@ 4.0.0.Alpha8 + + + + javassist + javassist + 3.12.1.GA + + + + + + cglib + cglib + 2.2.2 + + + + + org.apache.commons + commons-lang3 + 3.5 + + + + + commons-io + commons-io + 2.4 + + + + diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/Business.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/Business.java new file mode 100644 index 0000000000..5c7526ca83 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/Business.java @@ -0,0 +1,16 @@ +package com.dudy.learn01.base.aop.DynamicProxy; + +/** + * Created by dudy on 2017/3/22. + */ +public class Business implements IBusiness,IBusiness2{ + @Override + public void dosomething() { + System.out.println("dosomething....."); + } + + @Override + public void dosomething2() { + System.out.println("dosomething2....."); + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/CGlibDemo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/CGlibDemo.java new file mode 100644 index 0000000000..c49131ce59 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/CGlibDemo.java @@ -0,0 +1,28 @@ +package com.dudy.learn01.base.aop.DynamicProxy; + +import net.sf.cglib.proxy.Enhancer; + +/** + * Created by dudy on 2017/3/22. + */ +public class CGlibDemo { + + public static void main(String[] args) { + byteCodeGe(); + } + + public static void byteCodeGe(){ + //创建一个织入器 + Enhancer enhancer = new Enhancer(); + // 设置父类 + enhancer.setSuperclass(Business.class); + // 设置需要织入的逻辑 + enhancer.setCallback(new LogIntercept()); + //使用织入器创建子类 + IBusiness2 newBusiness = (IBusiness2) enhancer.create(); + newBusiness.dosomething2(); + + } + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/DynamicProxyDemo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/DynamicProxyDemo.java new file mode 100644 index 0000000000..0ffd41eeb9 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/DynamicProxyDemo.java @@ -0,0 +1,25 @@ +package com.dudy.learn01.base.aop.DynamicProxy; +import java.lang.reflect.Proxy; + +/** + * Created by dudy on 2017/3/22. + */ +public class DynamicProxyDemo { + + + public static void main(String[] args) { + + // 需要代理的接口,被代理类实现的多个接口都必须放在这里 + Class[] proxyInterface = new Class[]{IBusiness.class,IBusiness2.class}; + // 构建AOP的Advice,这里需要传入业务类的实例 + LogInvocationHandler handler = new LogInvocationHandler(new Business()); + //生成代理类的字节码加载器 + ClassLoader loader = DynamicProxyDemo.class.getClassLoader(); + //织入器,织入代码并生成代理类 + IBusiness2 proxyBusiness = (IBusiness2) Proxy.newProxyInstance(loader, proxyInterface, handler); + + proxyBusiness.dosomething2(); + } + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/IBusiness.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/IBusiness.java new file mode 100644 index 0000000000..d18ff447c9 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/IBusiness.java @@ -0,0 +1,8 @@ +package com.dudy.learn01.base.aop.DynamicProxy; + +/** + * Created by dudy on 2017/3/22. + */ +public interface IBusiness { + void dosomething(); +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/IBusiness2.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/IBusiness2.java new file mode 100644 index 0000000000..375de2f103 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/IBusiness2.java @@ -0,0 +1,9 @@ +package com.dudy.learn01.base.aop.DynamicProxy; + +/** + * Created by dudy on 2017/3/22. + */ +public interface IBusiness2 { + + public void dosomething2(); +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/LogIntercept.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/LogIntercept.java new file mode 100644 index 0000000000..5e3c59cf01 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/LogIntercept.java @@ -0,0 +1,25 @@ +package com.dudy.learn01.base.aop.DynamicProxy; + +import net.sf.cglib.proxy.Callback; +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; + +import java.lang.reflect.Method; + +/** + * Created by dudy on 2017/3/22. + */ +public class LogIntercept implements MethodInterceptor { + @Override + public Object intercept(Object o, Method method, Object[] objects, MethodProxy proxy) throws Throwable { + //执行原有的逻辑,注意这里是invokeSuper + Object rev = proxy.invokeSuper(o, objects); + //执行织入的日志 + if (method.getName().equals("dosomething2")){ + System.out.println("CGlib dosometing2....."); + } + + + return rev; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/LogInvocationHandler.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/LogInvocationHandler.java new file mode 100644 index 0000000000..3f3a8ece82 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/DynamicProxy/LogInvocationHandler.java @@ -0,0 +1,30 @@ +package com.dudy.learn01.base.aop.DynamicProxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +/** + * Created by dudy on 2017/3/22. + * 打印日志的切面 + */ +public class LogInvocationHandler implements InvocationHandler{ + + private Object targer; //目标对象 + + public LogInvocationHandler(Object targer) { + this.targer = targer; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + + // 执行原有逻辑 + Object rev = method.invoke(targer, args); + // 执行织入的日志,你可以控制哪些哪些方法执行切入逻辑 + if (method.getName().equals("dosomething2")){ + System.out.println("记录日志"); + } + + return rev; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/node.md b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/node.md new file mode 100644 index 0000000000..0a9f1b14b9 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/aop/node.md @@ -0,0 +1,7 @@ +## AOP 实现机制 + +### AOP各种实现 +aop就是面向切面编程, 可以从几个层面来实现AOP +编译期 +字节码加载前 +字节码加载后 diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/juc/ThreadLocalTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/juc/ThreadLocalTest.java similarity index 98% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/juc/ThreadLocalTest.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/juc/ThreadLocalTest.java index e4239ae521..b4d89c8dce 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/juc/ThreadLocalTest.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/juc/ThreadLocalTest.java @@ -1,4 +1,4 @@ -package com.dudy.learn01.juc; +package com.dudy.learn01.base.juc; /** * Created by dudy on 2017/3/9. diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/DownloadThread.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/DownloadThread.java similarity index 92% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/DownloadThread.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/DownloadThread.java index 97ca01e13b..52b14143e0 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/DownloadThread.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/DownloadThread.java @@ -1,6 +1,7 @@ -package com.dudy.learn01.download; +package com.dudy.learn01.coderising.download; -import com.dudy.learn01.download.api.Connection; + +import com.dudy.learn01.coderising.download.api.Connection; import java.io.*; import java.util.concurrent.BrokenBarrierException; diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/FileDownloader.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/FileDownloader.java similarity index 88% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/FileDownloader.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/FileDownloader.java index eee5825b84..92fe70fcff 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/FileDownloader.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/FileDownloader.java @@ -1,8 +1,10 @@ -package com.dudy.learn01.download; +package com.dudy.learn01.coderising.download; -import com.dudy.learn01.download.api.Connection; -import com.dudy.learn01.download.api.ConnectionManager; -import com.dudy.learn01.download.api.DownloadListener; + + +import com.dudy.learn01.coderising.download.api.Connection; +import com.dudy.learn01.coderising.download.api.ConnectionManager; +import com.dudy.learn01.coderising.download.api.DownloadListener; import java.io.IOException; import java.util.concurrent.CountDownLatch; @@ -14,9 +16,9 @@ public class FileDownloader { private String url; - private DownloadListener listener; + private DownloadListener listener; - private ConnectionManager cm; + private ConnectionManager cm; public FileDownloader(String _url) { diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/Connection.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/Connection.java similarity index 89% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/Connection.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/Connection.java index 513c0004e9..e23cdeec20 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/Connection.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/Connection.java @@ -1,4 +1,4 @@ -package com.dudy.learn01.download.api; +package com.dudy.learn01.coderising.download.api; import java.io.IOException; diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/ConnectionException.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/ConnectionException.java similarity index 52% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/ConnectionException.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/ConnectionException.java index 71af9bf06d..4bfee9d3df 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/ConnectionException.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/ConnectionException.java @@ -1,4 +1,4 @@ -package com.dudy.learn01.download.api; +package com.dudy.learn01.coderising.download.api; public class ConnectionException extends Exception { diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/ConnectionManager.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/ConnectionManager.java similarity index 84% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/ConnectionManager.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/ConnectionManager.java index 5f4777f6e0..2ca142435e 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/ConnectionManager.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/ConnectionManager.java @@ -1,4 +1,4 @@ -package com.dudy.learn01.download.api; +package com.dudy.learn01.coderising.download.api; import java.io.IOException; import java.net.MalformedURLException; diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/DownloadListener.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/DownloadListener.java similarity index 58% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/DownloadListener.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/DownloadListener.java index fa3b5bead0..79f47e537a 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/api/DownloadListener.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/api/DownloadListener.java @@ -1,5 +1,4 @@ -package com.dudy.learn01.download.api; - +package com.dudy.learn01.coderising.download.api; public interface DownloadListener { public void notifyFinished(); } \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/impl/ConnectionImpl.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/impl/ConnectionImpl.java similarity index 96% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/impl/ConnectionImpl.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/impl/ConnectionImpl.java index 5eb6b45d41..ffc93c32e0 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/impl/ConnectionImpl.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/impl/ConnectionImpl.java @@ -1,6 +1,7 @@ -package com.dudy.learn01.download.impl; +package com.dudy.learn01.coderising.download.impl; -import com.dudy.learn01.download.api.Connection; + +import com.dudy.learn01.coderising.download.api.Connection; import java.io.*; import java.net.HttpURLConnection; diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/impl/ConnectionManagerImpl.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/impl/ConnectionManagerImpl.java similarity index 61% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/impl/ConnectionManagerImpl.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/impl/ConnectionManagerImpl.java index 809f98d91b..b4f172cab2 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/download/impl/ConnectionManagerImpl.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/download/impl/ConnectionManagerImpl.java @@ -1,8 +1,10 @@ -package com.dudy.learn01.download.impl; +package com.dudy.learn01.coderising.download.impl; -import com.dudy.learn01.download.api.Connection; -import com.dudy.learn01.download.api.ConnectionException; -import com.dudy.learn01.download.api.ConnectionManager; + + +import com.dudy.learn01.coderising.download.api.Connection; +import com.dudy.learn01.coderising.download.api.ConnectionException; +import com.dudy.learn01.coderising.download.api.ConnectionManager; import java.io.IOException; import java.net.HttpURLConnection; diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/AttributeInfo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..c33bdd2c66 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.dudy.learn01.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/CodeAttr.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..2bd2185db5 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,69 @@ +package com.dudy.learn01.coderising.jvm.attr; + + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.cmd.ByteCodeCommand; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; +import com.dudy.learn01.coderising.jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LocalVariableItem.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..ac72775739 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.dudy.learn01.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LocalVariableTable.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..c104c3a648 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,40 @@ +package com.dudy.learn01.coderising.jvm.attr; + +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; +import com.dudy.learn01.coderising.jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/StackMapTable.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..dcb5f3f2c1 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.dudy.learn01.coderising.jvm.attr; + + +import com.dudy.learn01.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/AccessFlag.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..95ed555e0e --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.dudy.learn01.coderising.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/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/ClassFile.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..ae9201c6fd --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,102 @@ +package com.dudy.learn01.coderising.jvm.clz; + +import com.dudy.learn01.coderising.jvm.constant.ClassInfo; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; +import com.dudy.learn01.coderising.jvm.field.Field; +import com.dudy.learn01.coderising.jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/ClassIndex.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..63a74c95a5 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.dudy.learn01.coderising.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/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/BiPushCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..2cb178133f --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,22 @@ +package com.dudy.learn01.coderising.jvm.cmd; + + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/ByteCodeCommand.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..dd0c751d41 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,130 @@ +package com.dudy.learn01.coderising.jvm.cmd; + + + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantInfo; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; + +import java.util.HashMap; +import java.util.Map; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/CommandParser.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..e575214e89 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,86 @@ +package com.dudy.learn01.coderising.jvm.cmd; + + + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; + +import java.util.List; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/GetFieldCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..f8288f81ec --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.dudy.learn01.coderising.jvm.cmd; + + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/GetStaticFieldCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..2a60aaf57c --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,20 @@ +package com.dudy.learn01.coderising.jvm.cmd; + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/InvokeSpecialCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..bae82fa144 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,21 @@ +package com.dudy.learn01.coderising.jvm.cmd; + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/InvokeVirtualCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..3247d36ed9 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.dudy.learn01.coderising.jvm.cmd; + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/LdcCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..4615d143de --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,28 @@ +package com.dudy.learn01.coderising.jvm.cmd; +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantInfo; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; +import com.dudy.learn01.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/NewObjectCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..611c503bce --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.dudy.learn01.coderising.jvm.cmd; + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/NoOperandCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..12dc9aee67 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,22 @@ +package com.dudy.learn01.coderising.jvm.cmd; + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/OneOperandCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..097e83239a --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,28 @@ +package com.dudy.learn01.coderising.jvm.cmd; + + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/PutFieldCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..4a819d1e5a --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,20 @@ +package com.dudy.learn01.coderising.jvm.cmd; + + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/TwoOperandCmd.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..132c9313d2 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,64 @@ +package com.dudy.learn01.coderising.jvm.cmd; + + +import com.dudy.learn01.coderising.jvm.constant.*; +import com.dudy.learn01.coderising.jvm.clz.ClassFile; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ClassInfo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..7e858fddd8 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.dudy.learn01.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ConstantInfo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..eff4475e02 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.dudy.learn01.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ConstantPool.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..26637e950b --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.dudy.learn01.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/FieldRefInfo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7d80c44569 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.dudy.learn01.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/MethodRefInfo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..f19e35e7a0 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.dudy.learn01.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/NameAndTypeInfo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..02715297f1 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.dudy.learn01.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/NullConstantInfo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..86661fd20d --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.dudy.learn01.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/StringInfo.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..61449b0d20 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.dudy.learn01.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/UTF8Info.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..39c51f8859 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.dudy.learn01.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/field/Field.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..1da61a8ab8 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.dudy.learn01.coderising.jvm.field; + +import com.dudy.learn01.coderising.jvm.constant.ConstantPool; +import com.dudy.learn01.coderising.jvm.constant.UTF8Info; +import com.dudy.learn01.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ByteCodeIterator.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..f5808ce0d0 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package com.dudy.learn01.coderising.jvm.loader; + +import com.dudy.learn01.coderising.jvm.util.Util; + +import java.util.Arrays; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ClassFileLoader.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..49d296a9b6 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,132 @@ +package com.dudy.learn01.coderising.jvm.loader; + +import com.dudy.learn01.coderising.jvm.clz.ClassFile; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + + +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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/test/EmployeeV1.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..33731cf429 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.dudy.learn01.coderising.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/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/util/Util.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..44b3e2ee01 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.dudy.learn01.coderising.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= capacity) { + removeLastNode(); + } + + addNewNodeToHeader(node); + } + } + + private void addNewNodeToHeader(Node node) { + // TODO Auto-generated method stub + + if (first == null) { + first = node; + last = node; + currentSize++; + return; + } + + node.next = first; + if(first.next == null){ + last.prev = node; + } else { + first.prev = node; + } + first = node; + currentSize++; + + } + + private void removeLastNode() { + // TODO Auto-generated method stub + last.prev.next = null; + last = last.prev; + currentSize--; + } + + private void moveNodeToHead(Node node) { + + if(first.pageNum == node.pageNum){ + return; + } + + if(last.pageNum == node.pageNum){ + Node pLast = last.prev; + pLast.next = null; + + last.next = first; + last.prev = null; + + first.prev = last; + first = last; + last = pLast; + + return; + } + + node.prev.next = node.next; + node.next.prev = node.prev; + node.prev = null; + node.next = first; + first.prev = node; + first = node; + + } + + private Node find(int pageNum) { + Node n = first; + for (int i = 0; i < currentSize; i++) { + if (n.pageNum == pageNum) { + return n; + } + + n = n.next; + } + + return 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(","); + } + } + + StringBuilder reverse = new StringBuilder(); + Node n = last; + while(n != null){ + reverse.append(n.pageNum); + n = n.prev; + if(n != null){ + reverse.append(","); + } + } + System.out.println("buffer: "+ buffer.toString()); + System.out.println("reverse: " + reverse.toString()); + return buffer.toString(); + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/LRUPageFrameTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/LRUPageFrameTest.java new file mode 100644 index 0000000000..539e0d9af3 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/LRUPageFrameTest.java @@ -0,0 +1,33 @@ +package com.dudy.learn01.data_structure.list; + +import com.dudy.learn01.data_structure.list.LRUPageFrame; +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()); + + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/MyArrayList.java similarity index 94% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/MyArrayList.java index 5a8e82aaaf..ee7a336948 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyArrayList.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/MyArrayList.java @@ -1,4 +1,7 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.list; + +import com.dudy.learn01.data_structure.MyIterator; +import com.dudy.learn01.data_structure.MyList; import java.util.Arrays; diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/MyLinkedList.java similarity index 97% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/MyLinkedList.java index a425f54e81..f5b0b2f9fc 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyLinkedList.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/list/MyLinkedList.java @@ -1,6 +1,9 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.list; +import com.dudy.learn01.data_structure.MyIterator; +import com.dudy.learn01.data_structure.MyList; + import java.util.LinkedList; /** diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/CircleQueue.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/CircleQueue.java new file mode 100644 index 0000000000..af410daea1 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/CircleQueue.java @@ -0,0 +1,78 @@ +package com.dudy.learn01.data_structure.queue; + +import java.util.Random; + +/** + * 用数组实现循环队列 + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + // 用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + // 队头 + private int front = 0; + // 队尾 + private int tear = 0; + + public boolean isEmpty() { + return tear == front && elementData[0] == null; + } + + public int size() { + if(tear == front && elementData[0]!= null){ + return DEFAULT_SIZE; + } else { + return (tear - front + DEFAULT_SIZE) % DEFAULT_SIZE; + } + } + + public boolean full(){ + return tear == front && elementData[0] != null; + } + + + public void enQueue(E data) { + if(full()){ + System.out.println("队列已满"); + } else { + elementData[tear] = data; + tear = (tear + 1) % DEFAULT_SIZE; + } + } + + public E deQueue() { + if(isEmpty()) return null; + E e = (E) elementData[front]; + elementData[front] = null; + front = (front + 1) % DEFAULT_SIZE; + return e; + } + + public static void main(String[] args) { + CircleQueue queue = new CircleQueue<>(); + Random r = new Random(); + queue.enQueue(1); + queue.enQueue(3); + queue.enQueue(4); + queue.enQueue(6); + queue.enQueue(7); + + System.out.println(queue.size()); + for (int i = 0; i < 10; i++) { + queue.enQueue(r.nextInt(100)); + } + + System.out.println("size = " + queue.size()); + + + for(int i=0;i < 11 ; i++){ + System.out.print(queue.deQueue() + ","); + } + + System.out.println("size = " + queue.size()); + + } +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/Josephus.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/Josephus.java new file mode 100644 index 0000000000..9ea3f93ed8 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/Josephus.java @@ -0,0 +1,33 @@ +package com.dudy.learn01.data_structure.queue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Queue; +import java.util.concurrent.ArrayBlockingQueue; + +/** + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 + */ +public class Josephus { + + public static List execute(int n, int m) { + + List list = new ArrayList<>(); + Queue queue = new ArrayBlockingQueue<>(n); + for(int i = 0; i< n; i++){ + queue.add(i); + } + int loop = 1; + while(!queue.isEmpty()){ + Integer value = queue.poll(); + if(loop % m == 0){ + list.add(value);loop = 1; + } else{ + queue.add(value);loop++; + } + } + return list; + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/JosephusTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/JosephusTest.java new file mode 100644 index 0000000000..bbf4c906b1 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/JosephusTest.java @@ -0,0 +1,26 @@ +package com.dudy.learn01.data_structure.queue; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + System.out.println(Josephus.execute(7, 2).toString()); + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/MyQueue.java similarity index 62% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/MyQueue.java index 25b9da93f2..6c816b2802 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyQueue.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/MyQueue.java @@ -1,7 +1,10 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.queue; + +import com.dudy.learn01.data_structure.list.MyLinkedList; + public class MyQueue { - private MyLinkedList elementData = new MyLinkedList(); + private MyLinkedList elementData = new MyLinkedList(); public void enQueue(Object o){ elementData.addLast(o); diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/QueueWithTwoStacks.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..13d02e879d --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/QueueWithTwoStacks.java @@ -0,0 +1,58 @@ +package com.dudy.learn01.data_structure.queue; + +import java.util.Random; +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return stack1.size() + stack2.size(); + } + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + + if (isEmpty()) { + return null; + } + if (stack2.size() == 0) { + for (int i = 0; i < stack1.size(); i++) { + stack2.push(stack1.pop()); + } + } + + return stack2.pop(); + } + + public static void main(String[] args) { + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + Random r = new Random(); + int loop = r.nextInt(15); + System.out.println("loop = " + loop); + for (int i = 0; i < loop; i++) { + queue.enQueue(r.nextInt(100)); + } + System.out.println("size = " + queue.size()); + while (queue.size() > 0) { + System.out.print(queue.deQueue() + ","); + } + } + +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixExpr.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixExpr.java new file mode 100644 index 0000000000..4ad14f5cea --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixExpr.java @@ -0,0 +1,102 @@ +package com.dudy.learn01.data_structure.queue.expr; + +import java.util.List; +import java.util.Stack; + +public class InfixExpr { + String expr = null; + Stack number = new Stack(); + Stack opt = new Stack(); + + public InfixExpr(String expr) { + + this.expr = expr; + } + + public float evaluate() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + + for (Token token: tokens){ + if (token.isOperator()){ + if (opt.isEmpty()){ + opt.push(token); + } else { + while (!opt.isEmpty() && + !token.hasHigherPriority(opt.peek())){ + Token prevOperator = opt.pop(); + calculator(number.pop(),number.pop(),prevOperator.value); + } + opt.push(token); + + } + } + + if (token.isNumber()){ + number.push(token); + } + } + + while (!opt.isEmpty()){ + calculator(number.pop(), number.pop(),opt.pop().value); + } + + + +// for (int i = 0; i < tokens.size(); i++) { +// Token token = tokens.get(i); +// if (token.isNumber()) { +// number.push(token); +// } +// +// if (token.isOperator()) { +// if (opt.isEmpty()) { +// opt.push(token); continue; +// } +// +// if (!opt.isEmpty() && !token.hasHigherPriority(opt.peek())) { +// calculator(tokens.get(++i), number.pop(), token.value); +// +// } else { +// opt.push(token); +// } +// } +// } +// +// while(!opt.empty()){ +// +// calculator(number.pop(), number.pop(), opt.pop().value); +// } + + return Float.parseFloat(number.pop().value); + } + + /** + * + * @param token 第二个操作数 + * @param pop 第一个操作数 + * @param op 运算符 + */ + private void calculator(Token token, Token pop, String op) { + Integer number1 = Integer.parseInt(pop.value); + Integer number2 = Integer.parseInt(token.value); + Integer value = null; + if ("*".equals(op)) { + value = number1 * number2; + } + if ("/".equals(op)) { + value = number1 / number2; + } + if ("-".equals(op)) { + value = number1 - number2; + } + if ("+".equals(op)) { + value = number1 + number2; + } + + number.push(new Token(2,value+"")); + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixExprTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixExprTest.java new file mode 100644 index 0000000000..4a4fa8981c --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixExprTest.java @@ -0,0 +1,51 @@ +package com.dudy.learn01.data_structure.queue.expr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixToPostfix.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixToPostfix.java new file mode 100644 index 0000000000..9c958ac169 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixToPostfix.java @@ -0,0 +1,44 @@ +package com.dudy.learn01.data_structure.queue.expr; + +import java.util.*; + +public class InfixToPostfix { + + public static List convert(String expr) { + + List tokens = new ArrayList<>(); + + Stack optStack = new Stack<>(); + TokenParser parser = new TokenParser(); + List list = parser.parse(expr); + for (int i = 0;i < list.size(); i++){ + Token token = list.get(i); + if(token.isNumber()){ + tokens.add(token);continue; + } + + if (token.isOperator()){ + if (optStack.isEmpty()){ + optStack.push(token);continue; + } + + if (token.hasHigherPriority(optStack.peek())){ + tokens.add(list.get(++i)); + tokens.add(token); + } else { + tokens.add(optStack.pop()); + optStack.push(token); + } + } + } + + while (!optStack.isEmpty()){ + tokens.add(optStack.pop()); + } + + return tokens; + } + + + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixToPostfixTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..fd60670c1f --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/InfixToPostfixTest.java @@ -0,0 +1,27 @@ +package com.dudy.learn01.data_structure.queue.expr; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +/** + * Created by dudy on 2017/5/7. + */ +public class InfixToPostfixTest { + + + @Test + public void testEvaluate() { + List tokens = InfixToPostfix.convert("2+3*4+5"); + System.out.println(tokens); + + Assert.assertEquals("[2, 3, 4, *, +, 5, +]", tokens.toString()); + + //10 2 3 * - 50 + + List list1 = InfixToPostfix.convert("10-2*3+50"); + System.out.println(list1); + + Assert.assertEquals("[10, 2, 3, *, -, 50, +]", list1.toString()); + } +} diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PostfixExpr.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PostfixExpr.java new file mode 100644 index 0000000000..6c679d93ca --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PostfixExpr.java @@ -0,0 +1,55 @@ +package com.dudy.learn01.data_structure.queue.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + Stack optStack = new Stack<>(); + Stack numStack = new Stack<>(); + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push(Float.parseFloat(token.value)); + } else if (token.isOperator()) { + Float num2 = numStack.pop(); + Float num1 = numStack.pop(); + Float value = calculator(num1, num2, token.value); + numStack.push(value); + } + } + + + return numStack.pop(); + } + + private Float calculator(Float num1, Float num2, String op) { + Float res = 0.0f; + + if ("*".equals(op)) { + res = num1 * num2; + } else if ("/".equals(op)) { + res = num1 / num2; + } else if ("-".equals(op)) { + res = num1 - num2; + } else if ("+".equals(op)) { + res = num1 + num2; + } else { + System.out.println("opt is not support..."); + } + + return res; + } + + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PostfixExprTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PostfixExprTest.java new file mode 100644 index 0000000000..4f61074c6e --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PostfixExprTest.java @@ -0,0 +1,39 @@ +package com.dudy.learn01.data_structure.queue.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PrefixExpr.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PrefixExpr.java new file mode 100644 index 0000000000..cf9206df6d --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PrefixExpr.java @@ -0,0 +1,68 @@ +package com.dudy.learn01.data_structure.queue.expr; + +import org.apache.commons.lang3.StringUtils; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + /** + * 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素), + * 并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 + * 例如前缀表达式“- × + 3 4 5 6”: + * (1) 从右至左扫描,将6、5、4、3压入堆栈; + * (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈; + * (3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈; + * (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 + * 可以看出,用计算机计算前缀表达式的值是很容易的。 + * + * @return + */ + public float evaluate() { + float result = 0; + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack optStack = new Stack<>(); + Stack numStack = new Stack<>(); + for (int i = tokens.size() - 1; i >= 0; i--) { + Token token = tokens.get(i); + if (token.isNumber()) { + numStack.push(Float.parseFloat(token.value)); + } else if (token.isOperator()) { + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float sum = calculator(num1, num2, token.value); + numStack.push(sum); + } + } + + + return numStack.pop(); + } + + private Float calculator(Float num1, Float num2, String op) { + Float res = 0.0f; + + if ("*".equals(op)) { + res = num1 * num2; + } else if ("/".equals(op)) { + res = num1 / num2; + } else if ("-".equals(op)) { + res = num1 - num2; + } else if ("+".equals(op)) { + res = num1 + num2; + } else { + System.out.println("opt is not support..."); + } + + return res; + } + + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PrefixExprTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PrefixExprTest.java new file mode 100644 index 0000000000..59dad95f20 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.dudy.learn01.data_structure.queue.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/Token.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/Token.java new file mode 100644 index 0000000000..b3bbbdfc28 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/Token.java @@ -0,0 +1,49 @@ +package com.dudy.learn01.data_structure.queue.expr; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/TokenParser.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/TokenParser.java new file mode 100644 index 0000000000..4af3564656 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/TokenParser.java @@ -0,0 +1,56 @@ +package com.dudy.learn01.data_structure.queue.expr; +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/TokenParserTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/TokenParserTest.java new file mode 100644 index 0000000000..8943545b7a --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/queue/expr/TokenParserTest.java @@ -0,0 +1,38 @@ +package com.dudy.learn01.data_structure.queue.expr; +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/MyStack.java similarity index 81% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/MyStack.java index e59c366e0a..e44ef3d40d 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyStack.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/MyStack.java @@ -1,4 +1,7 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.stack; + +import com.dudy.learn01.data_structure.list.MyArrayList; + public class MyStack { private MyArrayList elementData = new MyArrayList(); diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/StackUtil.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/StackUtil.java new file mode 100644 index 0000000000..8d1b6c8f64 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/StackUtil.java @@ -0,0 +1,120 @@ +package com.dudy.learn01.data_structure.stack; + +import java.util.Collections; +import java.util.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) { + + if(s == null || s.isEmpty()){ + return; + } + + //Collections.reverse(s); + Stack stack = new Stack<>(); + while(!s.isEmpty()){ + stack.push(s.pop()); + } + System.out.println(stack.toString()); + while(!stack.isEmpty()){ + Integer pop = stack.pop(); + addToBottom(s,pop); + } + + + } + + private static void addToBottom(Stack s, Integer pop) { + // TODO Auto-generated method stub + if(s.isEmpty()){ + s.push(pop); + } else { + Integer temp = s.pop(); + addToBottom(s, pop); + s.push(temp); + } + + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Integer o) { + if(s == null || s.isEmpty() ){ + return; + } + + Stack tempStack = new Stack<>(); + while(!s.isEmpty()){ + Integer value = s.pop(); + if(o.equals(value)){ + break; + } + tempStack.push(value); + } + + while(!tempStack.isEmpty()){ + s.push(tempStack.pop()); + } + + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Integer[] getTop(Stack s,int len) { + Integer[] o = new Integer[len]; + for (int i = 0; i < o.length; i++) { + o[i] = s.pop(); + } + + for (int i = o.length-1; i >= 0; i--) { + s.push(o[i]); + } + + return o; + } + /** + * 字符串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){ + char[] c = s.toCharArray(); + + Stack stack = new Stack(); + for (int i = 0; i< c.length; i++){ + char c1 = c[i]; + if (c1 == '(' || c1 == '[' || c1 == '{'){ + stack.push(c1); + } + + if (!stack.isEmpty()){ + if ( (c1 == ')' && stack.peek() == '(') + || (c1 == ']' && stack.peek() == '[') + || (c1 == '}' && stack.peek() == '{' )){ + stack.pop(); + } + } + } + + return stack.isEmpty(); + } + + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/StackUtilTest.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/StackUtilTest.java new file mode 100644 index 0000000000..d819853f98 --- /dev/null +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/stack/StackUtilTest.java @@ -0,0 +1,64 @@ +package com.dudy.learn01.data_structure.stack; +import java.util.Stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} \ No newline at end of file diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/tree/MyBinaryTree.java similarity index 96% rename from group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java rename to group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/tree/MyBinaryTree.java index cfc06bc0d2..88fbd9fc26 100644 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/base/MyBinaryTree.java +++ b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/data_structure/tree/MyBinaryTree.java @@ -1,4 +1,4 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.tree; public class MyBinaryTree { diff --git a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/format/struts.xml b/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/format/struts.xml deleted file mode 100755 index 4c6eeabbd4..0000000000 --- a/group04/1796244932/learn01/src/main/java/com/dudy/learn01/litestruts/format/struts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyArrayListTest.java similarity index 87% rename from group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java rename to group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyArrayListTest.java index 5c6edd8fec..a18c00ecd8 100644 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayListTest.java +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyArrayListTest.java @@ -1,5 +1,7 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.base; +import com.dudy.learn01.data_structure.MyIterator; +import com.dudy.learn01.data_structure.list.MyArrayList; import org.junit.Test; import java.util.ArrayList; diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyArrayUtilTest.java similarity index 95% rename from group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java rename to group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyArrayUtilTest.java index 25fd306dc9..993d0df8e2 100644 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyArrayUtilTest.java +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyArrayUtilTest.java @@ -1,5 +1,6 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.base; +import com.dudy.learn01.data_structure.array.MyArrayUtil; import org.junit.Test; /** diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyBinaryTreeTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyBinaryTreeTest.java similarity index 84% rename from group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyBinaryTreeTest.java rename to group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyBinaryTreeTest.java index 65bee44580..27d533d5a8 100644 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyBinaryTreeTest.java +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyBinaryTreeTest.java @@ -1,9 +1,8 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.base; +import com.dudy.learn01.data_structure.tree.MyBinaryTree; import org.junit.Test; -import static org.junit.Assert.*; - /** * Created by dudy on 2017/2/21. */ diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyLinkedListTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyLinkedListTest.java similarity index 94% rename from group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyLinkedListTest.java rename to group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyLinkedListTest.java index cce7a1c163..ff0b6e0cb0 100644 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyLinkedListTest.java +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyLinkedListTest.java @@ -1,7 +1,9 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.base; import java.util.LinkedList; +import com.dudy.learn01.data_structure.MyIterator; +import com.dudy.learn01.data_structure.list.MyLinkedList; import org.junit.After; import org.junit.Before; import org.junit.Test; diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyQueueTest.java similarity index 79% rename from group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java rename to group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyQueueTest.java index de8d683abe..2f3116eb63 100644 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyQueueTest.java +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyQueueTest.java @@ -1,9 +1,8 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.base; +import com.dudy.learn01.data_structure.queue.MyQueue; import org.junit.Test; -import static org.junit.Assert.*; - /** * Created by dudy on 2017/2/20. */ diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyStackTest.java similarity index 90% rename from group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java rename to group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyStackTest.java index 51175953b0..848180b498 100644 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/base/MyStackTest.java +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/data_structure/base/MyStackTest.java @@ -1,11 +1,10 @@ -package com.dudy.learn01.base; +package com.dudy.learn01.data_structure.base; +import com.dudy.learn01.data_structure.stack.MyStack; import org.junit.Test; import java.util.Stack; -import static org.junit.Assert.*; - /** * Created by dudy on 2017/2/20. */ diff --git a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/download/FileDownloaderTest.java b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/download/FileDownloaderTest.java index fc427e2171..7e9fe3b54b 100644 --- a/group04/1796244932/learn01/src/test/java/com/dudy/learn01/download/FileDownloaderTest.java +++ b/group04/1796244932/learn01/src/test/java/com/dudy/learn01/download/FileDownloaderTest.java @@ -1,8 +1,10 @@ package com.dudy.learn01.download; -import com.dudy.learn01.download.api.ConnectionManager; -import com.dudy.learn01.download.api.DownloadListener; -import com.dudy.learn01.download.impl.ConnectionManagerImpl; + +import com.dudy.learn01.coderising.download.FileDownloader; +import com.dudy.learn01.coderising.download.api.ConnectionManager; +import com.dudy.learn01.coderising.download.api.DownloadListener; +import com.dudy.learn01.coderising.download.impl.ConnectionManagerImpl; import org.junit.Test; From c6ded702576270688a15c9e18f3d2b67deabd511 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Sun, 7 May 2017 17:18:05 +0800 Subject: [PATCH 456/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=94=A82=E4=B8=AA?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0=E6=A0=88=E4=BB=A5=E5=8F=8A?= =?UTF-8?q?=E7=94=A8=E4=B8=80=E4=B8=AA=E6=95=B0=E7=BB=84=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?2=E4=B8=AA=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/stack/StackWithTwoQueues.java | 33 +++++ .../basic/stack/TwoStackInOneArray.java | 121 ++++++++++++++++++ .../basic/stack/StackWithTwoQueuesTest.java | 34 +++++ .../basic/stack/TwoStackInOneArrayTest.java | 48 +++++++ 4 files changed, 236 insertions(+) create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/StackWithTwoQueues.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/TwoStackInOneArray.java create mode 100644 group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/StackWithTwoQueuesTest.java create mode 100644 group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/TwoStackInOneArrayTest.java diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/StackWithTwoQueues.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..156d042158 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,33 @@ +package com.johnChnia.coding2017.basic.stack; + +import com.johnChnia.coding2017.basic.queue.Queue; + +/** + * Created by john on 2017/5/7. + */ +public class StackWithTwoQueues { + + Queue queue1 = new Queue<>(); + Queue queue2 = new Queue<>(); + + public void push(int data) { + while (!queue1.empty()) { + queue2.add(queue1.remove()); + } + queue1.add(data); + while (!queue2.empty()) { + queue1.add(queue2.remove()); + } + } + + public int pop() { + if (!queue1.empty()) { + return queue1.remove(); + } + return -1; + } + + public String toString() { + return queue1.toString(); + } +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/TwoStackInOneArray.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..75e6d15207 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,121 @@ +package com.johnChnia.coding2017.basic.stack; + +/** + * Created by john on 2017/5/7. + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * + * @author john + */ +public class TwoStackInOneArray { + private Object[] data = new Object[4]; + private int pointer1 = -1; + private int pointer2 = data.length; + + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + ensureCapacityInternal(); + data[++pointer1] = o; + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() throws Exception { + if (pointer1 == -1) { + throw new Exception("栈1中没有元素"); + } else { + return data[pointer1--]; + } + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() throws Exception { + if (pointer1 == -1) { + throw new Exception("栈1中没有元素"); + } else { + return data[pointer1]; + } + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + ensureCapacityInternal(); + data[--pointer2] = o; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + if (pointer2 == data.length) { + return null; + } else { + return data[pointer2++]; + } + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + if (pointer2 == data.length) { + return null; + } else { + return data[pointer2]; + } + } + + /** + * 如果栈1的指针和栈2的指针之差为1的话,那么就需要扩容。 + */ + private void ensureCapacityInternal() { + if (pointer2 - pointer1 == 1) { + grow(); + } + } + + private void grow() { + Object[] data2 = new Object[data.length * 2]; + System.arraycopy(data, 0, data2, 0, pointer1 + 1); //复制栈1值到data2 + int desPosForStack2 = data2.length - pointer2; + System.arraycopy(data, pointer2, data2, desPosForStack2, pointer2); // 复制栈2值到data2 + data = data2; + pointer2 = desPosForStack2; // 调整栈2指针位置 + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("("); + for (int i = 0; i <= pointer1; i++) { + sb.append(data[i]); + sb.append(", "); + } + for (int j = pointer2; j < data.length; j++) { + sb.append(data[j]); + sb.append(", "); + } + sb.append(")"); + return sb.toString(); + } + +} diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/StackWithTwoQueuesTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..d051b349d1 --- /dev/null +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,34 @@ +package com.johnChnia.coding2017.basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by john on 2017/5/7. + */ +public class StackWithTwoQueuesTest { + StackWithTwoQueues stq; + @Before + public void setUp() throws Exception { + stq = new StackWithTwoQueues(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testPushAndPop() throws Exception { + for (int i = 0; i < 6; i++) { + stq.push(i); + } + Assert.assertEquals("[5, 4, 3, 2, 1, 0, ]", stq.toString()); + stq.pop(); + Assert.assertEquals("[4, 3, 2, 1, 0, ]", stq.toString()); + } + + +} \ No newline at end of file diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/TwoStackInOneArrayTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..115c610b59 --- /dev/null +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,48 @@ +package com.johnChnia.coding2017.basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by john on 2017/5/7. + */ +public class TwoStackInOneArrayTest { + TwoStackInOneArray twoStackInOneArray; + + @Before + public void setUp() throws Exception { + twoStackInOneArray = new TwoStackInOneArray(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testPushAndPopAndPeek() throws Exception { + twoStackInOneArray.push1(0); + twoStackInOneArray.push1(1); + twoStackInOneArray.push2(2); + twoStackInOneArray.push2(3); + twoStackInOneArray.push1(4); + twoStackInOneArray.push1(5); + twoStackInOneArray.push2(6); + twoStackInOneArray.push2(7); + twoStackInOneArray.push2(8); + Assert.assertEquals("(0, 1, 4, 5, 8, 7, 6, 3, 2, )", + twoStackInOneArray.toString()); + twoStackInOneArray.pop1(); + twoStackInOneArray.pop2(); + Assert.assertEquals("(0, 1, 4, 7, 6, 3, 2, )", + twoStackInOneArray.toString()); + + Assert.assertEquals(4, + twoStackInOneArray.peek1()); + Assert.assertEquals(7, + twoStackInOneArray.peek2()); + } + +} \ No newline at end of file From 552e2905925ba0f5b0ab1bfc10d8cc6f9d4410ea Mon Sep 17 00:00:00 2001 From: johnChnia Date: Sun, 7 May 2017 18:09:42 +0800 Subject: [PATCH 457/552] =?UTF-8?q?=E5=AE=8C=E6=88=90jvm=E7=AC=AC=E4=B9=9D?= =?UTF-8?q?=E5=91=A8=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/QuickMinStack.java | 72 +++++++++++++++++++ .../basic/stack/QuickMinStackTest.java | 53 ++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/QuickMinStack.java create mode 100644 group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/QuickMinStackTest.java diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/QuickMinStack.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..a7031bf81e --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/QuickMinStack.java @@ -0,0 +1,72 @@ +package com.johnChnia.coding2017.basic.stack; + +/** + * Created by john on 2017/5/7. + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * 参考:http://www.programcreek.com/2014/02/leetcode-min-stack-java/ + * + * @author john + */ + + +public class QuickMinStack { + + private static class Elem { + int value; + int min; + Elem next; + + Elem(int value, int min) { + this.value = value; + this.min = min; + } + } + + private Elem top; + + + public QuickMinStack() { + + } + + + public void push(int data) { + if (top == null) { + Elem e = new Elem(data, data); + top = e; + } else { + Elem temp = new Elem(data, Math.min(data, top.min)); + temp.next = top; + top = temp; + } + } + + public int pop() { + if (top == null) { + return -1; + } else { + Elem temp = top.next; + top.next = null; + top = temp; + return top.value; + } + } + + public int findMin() { + if (top == null) { + return -1; + } + return top.min; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + while (top != null) { + sb.append(top.value); + sb.append(","); + top = top.next; + } + return sb.toString(); + } +} diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/QuickMinStackTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..232f988db2 --- /dev/null +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/QuickMinStackTest.java @@ -0,0 +1,53 @@ +package com.johnChnia.coding2017.basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by john on 2017/5/7. + */ +public class QuickMinStackTest { + QuickMinStack quickMinStack1; + QuickMinStack quickMinStack2; + QuickMinStack quickMinStack3; + @Before + public void setUp() throws Exception { + quickMinStack1 = new QuickMinStack(); + quickMinStack2 = new QuickMinStack(); + quickMinStack3 = new QuickMinStack(); + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void testPush() throws Exception { + for (int i = 0; i < 4; i++) { + quickMinStack1.push(i); + } + Assert.assertEquals("3,2,1,0,", quickMinStack1.toString()); + } + + @Test + public void testPop() throws Exception { + for (int i = 0; i < 4; i++) { + quickMinStack2.push(i); + } + quickMinStack2.pop(); + Assert.assertEquals("2,1,0,", quickMinStack2.toString()); + } + + @Test + public void testFindMin() throws Exception { + for (int i = 0; i < 4; i++) { + quickMinStack3.push(i); + } + quickMinStack3.pop(); + Assert.assertEquals(0, quickMinStack3.findMin()); + } + +} \ No newline at end of file From 38cdfd1a962c2c8c90cd6998ff7c30353453adf4 Mon Sep 17 00:00:00 2001 From: '1299310140' <'13437282785@163.com'> Date: Sun, 7 May 2017 18:24:09 +0800 Subject: [PATCH 458/552] InfixExpr&&PrefixExpr&&PostfixExpr&&InfixToPostfix --- .../coding/basic/stack/expr/InfixExpr.java | 91 +++++++------------ .../basic/stack/expr/InfixToPostfix.java | 37 ++++++++ .../coding/basic/stack/expr/MyInfixExpr.java | 75 +++++++++++++++ .../coding/basic/stack/expr/PostfixExpr.java | 32 +++++++ .../coding/basic/stack/expr/PrefixExpr.java | 38 ++++++++ 5 files changed, 214 insertions(+), 59 deletions(-) create mode 100644 group04/1299310140/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group04/1299310140/src/com/coding/basic/stack/expr/MyInfixExpr.java create mode 100644 group04/1299310140/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group04/1299310140/src/com/coding/basic/stack/expr/PrefixExpr.java diff --git a/group04/1299310140/src/com/coding/basic/stack/expr/InfixExpr.java b/group04/1299310140/src/com/coding/basic/stack/expr/InfixExpr.java index e0d6af6a21..08ade05557 100644 --- a/group04/1299310140/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/group04/1299310140/src/com/coding/basic/stack/expr/InfixExpr.java @@ -1,75 +1,48 @@ package com.coding.basic.stack.expr; +import java.util.List; import java.util.Stack; public class InfixExpr { - //操作数为整数,操作符只支持+、-、*、/,/的返回值为float类型 - private String expr = ""; - private char[] sc = null; - private int pos = 0; + String expr = null; public InfixExpr(String expr) { this.expr = expr; - this.sc = expr.toCharArray(); - } - - //下一个操作数 - private int nextOperand(){ - int result = sc[pos] - 48;//char:'0'-->int:0 - pos++; - while(pos < sc.length && sc[pos] >= '0' && sc[pos] <= '9'){ - result = result * 10 + (sc[pos] - 48); - pos++; - } - return result; - } - - //下一个操作符 - private char nextOperator(){ - return sc[pos++]; } - public float evaluate() { - Stack stack = this.multiplyDivide(); - float result = add(stack); - return result; - } - - //将栈内所有操作数相加 - private float add(Stack stack){ - if(stack == null || stack.isEmpty()){ - return 0; - } + public float evaluate() { + TokenParser parser = new TokenParser(); + List expr_LToken = parser.parse(this.expr); - float result = 0; - while(!stack.isEmpty()){ - result = result + (float)stack.pop(); - } - return result; - } - - //操作数入栈,完成乘除运算,'-'随数入栈 - private Stack multiplyDivide(){ - Stack operandStack = new Stack(); - operandStack.push((float)this.nextOperand()); - int tempOperand = 0; - char tempOperator = 0; - while(pos < sc.length){ - tempOperator = this.nextOperator(); - tempOperand = this.nextOperand(); - if(tempOperator == '+'){ - operandStack.push((float)tempOperand); - }else if(tempOperator == '-'){ - operandStack.push((float)(- tempOperand)); - }else if(tempOperator == '*'){ - float top = (float)operandStack.pop(); - operandStack.push(top * tempOperand); - }else if(tempOperator == '/'){ - float top = (float)operandStack.pop(); - operandStack.push(top / tempOperand); + Stack operandStack_SF = new Stack(); + Stack operatorStack_SToken = new Stack(); + for(Token token : expr_LToken){ + if(token.isNumber()){ + operandStack_SF.push(new Float(token.getIntValue())); + }else{ + while(!operatorStack_SToken.isEmpty() && + !token.hasHigherPriority(operatorStack_SToken.peek())){ + //运算符栈不为空 且 当前运算符的优先级 小于等于 栈顶运算符的优先级 + Float f2 = operandStack_SF.pop(); + Float f1 = operandStack_SF.pop(); + String operator = operatorStack_SToken.pop().toString(); + Float result = CalculateUtil.calculate(operator, f1, f2); + operandStack_SF.push(result); + } + operatorStack_SToken.push(token); } } - return operandStack; + //此时运算符栈 栈底到栈顶 运算符的优先级 严格递增 + while(!operatorStack_SToken.isEmpty()){ + Float f2 = operandStack_SF.pop(); + Float f1 = operandStack_SF.pop(); + String operator = operatorStack_SToken.pop().toString(); + Float result = CalculateUtil.calculate(operator, f1, f2); + operandStack_SF.push(result); + } + return operandStack_SF.pop().floatValue(); } + + } diff --git a/group04/1299310140/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group04/1299310140/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..e3c8ddc1d4 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,37 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + TokenParser parser = new TokenParser(); + List infixExpr_LToken = parser.parse(expr); + + List postfixExpr_LToken = new ArrayList(); + Stack operatorStack_SToken = new Stack(); + for(Token token : infixExpr_LToken){ + if(token.isNumber()){ + postfixExpr_LToken.add(token); + }else{ + while(!operatorStack_SToken.isEmpty() && + !token.hasHigherPriority(operatorStack_SToken.peek())){ + //运算符栈不为空 且 当前运算符的优先级 小于等于 栈顶运算符的优先级 + postfixExpr_LToken.add(operatorStack_SToken.pop()); + } + operatorStack_SToken.push(token); + } + } + + //此时运算符栈 栈底到栈顶 运算符的优先级 严格递增 + while(!operatorStack_SToken.isEmpty()){ + postfixExpr_LToken.add(operatorStack_SToken.pop()); + } + return postfixExpr_LToken; + } + + + +} diff --git a/group04/1299310140/src/com/coding/basic/stack/expr/MyInfixExpr.java b/group04/1299310140/src/com/coding/basic/stack/expr/MyInfixExpr.java new file mode 100644 index 0000000000..a0ca0bda4b --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/expr/MyInfixExpr.java @@ -0,0 +1,75 @@ +package com.coding.basic.stack.expr; + +import java.util.Stack; + +public class MyInfixExpr { + //操作数为整数,操作符只支持+、-、*、/,/的返回值为float类型 + private String expr = ""; + private char[] sc = null; + private int pos = 0; + + public MyInfixExpr(String expr) { + this.expr = expr; + this.sc = expr.toCharArray(); + } + + //下一个操作数 + private int nextOperand(){ + int result = sc[pos] - 48;//char:'0'-->int:0 + pos++; + while(pos < sc.length && sc[pos] >= '0' && sc[pos] <= '9'){ + result = result * 10 + (sc[pos] - 48); + pos++; + } + return result; + } + + //下一个操作符 + private char nextOperator(){ + return sc[pos++]; + } + + public float evaluate() { + Stack stack = this.multiplyDivide(); + float result = add(stack); + return result; + } + + //将栈内所有操作数相加 + private float add(Stack stack){ + if(stack == null || stack.isEmpty()){ + return 0; + } + + float result = 0; + while(!stack.isEmpty()){ + result = result + (float)stack.pop(); + } + return result; + } + + //操作数入栈,完成乘除运算,'-'随数入栈 + private Stack multiplyDivide(){ + Stack operandStack = new Stack(); + operandStack.push((float)this.nextOperand()); + int tempOperand = 0; + char tempOperator = 0; + while(pos < sc.length){ + tempOperator = this.nextOperator(); + tempOperand = this.nextOperand(); + if(tempOperator == '+'){ + operandStack.push((float)tempOperand); + }else if(tempOperator == '-'){ + operandStack.push((float)(- tempOperand)); + }else if(tempOperator == '*'){ + float top = (float)operandStack.pop(); + operandStack.push(top * tempOperand); + }else if(tempOperator == '/'){ + float top = (float)operandStack.pop(); + operandStack.push(top / tempOperand); + } + } + + return operandStack; + } +} diff --git a/group04/1299310140/src/com/coding/basic/stack/expr/PostfixExpr.java b/group04/1299310140/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..f034a4bed7 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,32 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List expr_LToken = parser.parse(this.expr); + + Stack operandStack_SF = new Stack(); + for(Token token : expr_LToken){ + if(token.isNumber()){ + operandStack_SF.push(new Float(token.getIntValue())); + }else{ + Float f2 = operandStack_SF.pop(); + Float f1 = operandStack_SF.pop(); + Float result = CalculateUtil.calculate(token.toString(), f1, f2); + operandStack_SF.push(result); + } + } + return operandStack_SF.pop().floatValue(); + } + + +} diff --git a/group04/1299310140/src/com/coding/basic/stack/expr/PrefixExpr.java b/group04/1299310140/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..e3cf5d3feb --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,38 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List expr_LToken = parser.parse(this.expr); + + Stack expr_SToken = new Stack(); + for(Token token : expr_LToken){ + expr_SToken.push(token); + } + + Stack operandStack_SF = new Stack(); + while(!expr_SToken.isEmpty()){ + Token token = expr_SToken.pop(); + if(token.isNumber()){ + operandStack_SF.push(new Float(token.getIntValue())); + }else{ + Float f1 = operandStack_SF.pop(); + Float f2 = operandStack_SF.pop(); + Float result = CalculateUtil.calculate(token.toString(), f1, f2); + operandStack_SF.push(result); + } + } + return operandStack_SF.pop().floatValue(); + } + + +} From 2603de00d105c6be27b6e925c2e54ebc4501d4b9 Mon Sep 17 00:00:00 2001 From: x_zhaohu Date: Sun, 7 May 2017 18:26:27 +0800 Subject: [PATCH 459/552] week11, JVM(6) --- group11/1178243325/week11/build.gradle | 9 ++ group11/1178243325/week11/readme.md | 11 ++ .../java/com/sprint/datastructure/Queue.java | 54 ++++++++ .../sprint/datastructure/QuickMinStack.java | 56 ++++++++ .../datastructure/StackWithTwoQueues.java | 43 +++++++ .../datastructure/TwoStackInOneArray.java | 120 ++++++++++++++++++ .../datastructure/QuickMinStackTest.java | 18 +++ .../datastructure/StackWithTwoQueuesTest.java | 18 +++ .../datastructure/TwoStackInOneArrayTest.java | 34 +++++ 9 files changed, 363 insertions(+) create mode 100644 group11/1178243325/week11/build.gradle create mode 100644 group11/1178243325/week11/readme.md create mode 100644 group11/1178243325/week11/src/main/java/com/sprint/datastructure/Queue.java create mode 100644 group11/1178243325/week11/src/main/java/com/sprint/datastructure/QuickMinStack.java create mode 100644 group11/1178243325/week11/src/main/java/com/sprint/datastructure/StackWithTwoQueues.java create mode 100644 group11/1178243325/week11/src/main/java/com/sprint/datastructure/TwoStackInOneArray.java create mode 100644 group11/1178243325/week11/src/test/java/com/sprint/datastructure/QuickMinStackTest.java create mode 100644 group11/1178243325/week11/src/test/java/com/sprint/datastructure/StackWithTwoQueuesTest.java create mode 100644 group11/1178243325/week11/src/test/java/com/sprint/datastructure/TwoStackInOneArrayTest.java diff --git a/group11/1178243325/week11/build.gradle b/group11/1178243325/week11/build.gradle new file mode 100644 index 0000000000..c4da624f95 --- /dev/null +++ b/group11/1178243325/week11/build.gradle @@ -0,0 +1,9 @@ +apply plugin: 'java' + +repositories { + mavenCentral() +} + +dependencies { + testCompile("junit:junit:4.12") +} diff --git a/group11/1178243325/week11/readme.md b/group11/1178243325/week11/readme.md new file mode 100644 index 0000000000..bfd7dcf47c --- /dev/null +++ b/group11/1178243325/week11/readme.md @@ -0,0 +1,11 @@ +## 讲课内容: + +## 第11周作业(05-01 至 05-07) +- 数据结构,实现QuickMinStack.java, StackWithTwoQueues.java,TwoStackInOneArray.java +- 写一篇文章 + +## 完成情况: +- end + +## 我的收获: +其实最难是坚持 diff --git a/group11/1178243325/week11/src/main/java/com/sprint/datastructure/Queue.java b/group11/1178243325/week11/src/main/java/com/sprint/datastructure/Queue.java new file mode 100644 index 0000000000..e7c14ac30e --- /dev/null +++ b/group11/1178243325/week11/src/main/java/com/sprint/datastructure/Queue.java @@ -0,0 +1,54 @@ +package com.sprint.datastructure; + +import java.util.NoSuchElementException; +public class Queue { + private Node first; + private Node last; + private int size; + + private static class Node { + private E item; + private Node next; + } + + public Queue() { + first = null; + last = null; + size = 0; + } + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + Node oldLast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } else { + oldLast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group11/1178243325/week11/src/main/java/com/sprint/datastructure/QuickMinStack.java b/group11/1178243325/week11/src/main/java/com/sprint/datastructure/QuickMinStack.java new file mode 100644 index 0000000000..03dd5a02fb --- /dev/null +++ b/group11/1178243325/week11/src/main/java/com/sprint/datastructure/QuickMinStack.java @@ -0,0 +1,56 @@ +package com.sprint.datastructure; + +import java.util.Stack; +import java.util.EmptyStackException; +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * + */ +public class QuickMinStack { + + Stack stack = new Stack<>(); + int minValue; + + public void push(int data){ + if (isEmpty()) { + minValue = data; + } + if (minValue > data) { + minValue = data; + } + stack.push(data); + } + + public int pop(){ + if (isEmpty()) { + throw new EmptyStackException(); + } + int top = stack.pop(); + if (top == minValue && !isEmpty()) { + minValue = getMinValue(stack); + } + return top; + } + + public int findMin(){ + return minValue; + } + + private boolean isEmpty() { + return stack.size() == 0; + } + + private int getMinValue(Stack stack) { + Stack stack1 = stack; + int min = stack1.pop(); + while (!isEmpty()) { + int value = stack1.pop(); + if (min > value) { + min = value; + } + } + return min; + } +} + diff --git a/group11/1178243325/week11/src/main/java/com/sprint/datastructure/StackWithTwoQueues.java b/group11/1178243325/week11/src/main/java/com/sprint/datastructure/StackWithTwoQueues.java new file mode 100644 index 0000000000..e95bdee501 --- /dev/null +++ b/group11/1178243325/week11/src/main/java/com/sprint/datastructure/StackWithTwoQueues.java @@ -0,0 +1,43 @@ +package com.sprint.datastructure; + +import java.util.EmptyStackException; +public class StackWithTwoQueues { + + Queue queue1; + Queue queue2; + + public StackWithTwoQueues() { + queue1 = new Queue(); + queue2 = new Queue(); + + } + + public void push(int data) { + queue1.enQueue(data); + } + + public int pop() { + if (queue1.isEmpty()) { + throw new EmptyStackException(); + } + int top = getTop(); + return top; + } + + private int getTop() { + int length = queue1.size() - 1; //小bug:queue.size() + for (int i = 0; i < length; i++) { + queue2.enQueue(queue1.deQueue()); + + } + int top = (int)queue1.deQueue(); + queue2ToQueue1(); + return top; + } + + private void queue2ToQueue1() { + while (!queue2.isEmpty()) { + queue1.enQueue(queue2.deQueue()); + } + } +} diff --git a/group11/1178243325/week11/src/main/java/com/sprint/datastructure/TwoStackInOneArray.java b/group11/1178243325/week11/src/main/java/com/sprint/datastructure/TwoStackInOneArray.java new file mode 100644 index 0000000000..0dcc41d1bf --- /dev/null +++ b/group11/1178243325/week11/src/main/java/com/sprint/datastructure/TwoStackInOneArray.java @@ -0,0 +1,120 @@ +package com.sprint.datastructure; + +import java.util.EmptyStackException; +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * + */ +public class TwoStackInOneArray { + Object[] data; + int capacity; + int front; + int rear; + + public TwoStackInOneArray() { + data = new Object[10]; + front = 0; + rear = 9; + capacity = 10; + } + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + if (front == rear) { + expandCapacity(capacity * 2 + 1); + } + data[front] = o; + front++; + } + + private void expandCapacity(int newCapacity) { + Object[] old = data; + //将old中数据转移到data中 + data = new Object[newCapacity]; + //将前栈数据复制进去 + for (int i = 0; i < front; i++) { + data[i] = old[i]; + } + //将后栈数据复制进去 + int size = this.capacity - rear - 1; + for (int i = 0; i < size; i++) { + data[newCapacity - 1] = old[capacity - 1]; + } + capacity = newCapacity; + rear = newCapacity - size - 1; + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + Object old = null; + if (front <= 0) { + throw new EmptyStackException(); + } + old = data[--front]; + data[front] = null; + return old; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + if (front == 0) + return null; + //返回data[0] + int header = (int)data[0]; + //将前栈元素前移 +/* for (int i = 1; i < front; i++) { + data[i - 1] = data[i]; + } + front--; +*/ + return header; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + if (front == rear) { + expandCapacity(capacity * 2 + 1); + } + data[rear] = o; + rear--; + } + + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + Object old = null; + if (rear >= capacity - 1) { + throw new EmptyStackException(); + } + old = data[++rear]; + data[rear] = null; + return old; + } + + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + if (rear >= capacity - 1) + return null; + int header = (int)data[capacity - 1]; + return header; + } + +} diff --git a/group11/1178243325/week11/src/test/java/com/sprint/datastructure/QuickMinStackTest.java b/group11/1178243325/week11/src/test/java/com/sprint/datastructure/QuickMinStackTest.java new file mode 100644 index 0000000000..7860868c1a --- /dev/null +++ b/group11/1178243325/week11/src/test/java/com/sprint/datastructure/QuickMinStackTest.java @@ -0,0 +1,18 @@ +package com.sprint.datastructure; + +import org.junit.Test; +public class QuickMinStackTest { + + + @Test + public void test() { + QuickMinStack stack = new QuickMinStack(); + stack.push(8); + stack.push(9); + stack.push(7); + stack.push(2); + stack.pop(); + + System.out.println(stack.findMin()); + } +} diff --git a/group11/1178243325/week11/src/test/java/com/sprint/datastructure/StackWithTwoQueuesTest.java b/group11/1178243325/week11/src/test/java/com/sprint/datastructure/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..647034d970 --- /dev/null +++ b/group11/1178243325/week11/src/test/java/com/sprint/datastructure/StackWithTwoQueuesTest.java @@ -0,0 +1,18 @@ +package com.sprint.datastructure; + +import org.junit.Assert; +import org.junit.Test; +public class StackWithTwoQueuesTest { + + @Test + public void test() { + StackWithTwoQueues stack = new StackWithTwoQueues(); + stack.push(1); + stack.push(2); + stack.push(3); + + Assert.assertEquals(3, stack.pop()); + Assert.assertEquals(2, stack.pop()); + Assert.assertEquals(1, stack.pop()); + } +} diff --git a/group11/1178243325/week11/src/test/java/com/sprint/datastructure/TwoStackInOneArrayTest.java b/group11/1178243325/week11/src/test/java/com/sprint/datastructure/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..aff1d82a95 --- /dev/null +++ b/group11/1178243325/week11/src/test/java/com/sprint/datastructure/TwoStackInOneArrayTest.java @@ -0,0 +1,34 @@ +package com.sprint.datastructure; + +import org.junit.Assert; +import org.junit.Test; +public class TwoStackInOneArrayTest { + + TwoStackInOneArray stack = new TwoStackInOneArray(); + @Test + public void testStack() { + //测试前栈push , pop 并扩荣 + for (int i = 0; i < 20; i++) { + System.out.println(i); + stack.push1(i); + } + Assert.assertEquals(0, stack.peek1()); + Assert.assertEquals(21, stack.capacity); + stack.push2(0); + stack.push2(1); + stack.push2(2); + stack.push2(3); + System.out.println("Stack的容量:" + stack.capacity); + + Assert.assertEquals(19, stack.pop1()); + Assert.assertEquals(3, stack.pop2()); + + Assert.assertEquals(0, stack.peek2()); + } + + @Test + public void testRearStack() { + //原来不同的@Test里面会会重新初始化stack. + } + +} From 74f951661fe8723cb78cdb6d8428e6101c211182 Mon Sep 17 00:00:00 2001 From: '1299310140' <'13437282785@163.com'> Date: Sun, 7 May 2017 18:26:35 +0800 Subject: [PATCH 460/552] CircleQueue&&Josephus&&QueueWithTwoStacks --- .../com/coding/basic/queue/CircleQueue.java | 61 +++++++++++++++++++ .../src/com/coding/basic/queue/Josephus.java | 37 +++++++++++ .../basic/queue/QueueWithTwoStacks.java | 47 ++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 group04/1299310140/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group04/1299310140/src/com/coding/basic/queue/Josephus.java create mode 100644 group04/1299310140/src/com/coding/basic/queue/QueueWithTwoStacks.java diff --git a/group04/1299310140/src/com/coding/basic/queue/CircleQueue.java b/group04/1299310140/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..0c61bbfae6 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,61 @@ +package com.coding.basic.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0;//指向下一个空位 + //实际大小 + private int size = 0; + + public CircleQueue(int i) { + this.elementData = new Object[i]; + } + + public boolean isEmpty() { + return size == 0; + } + + public boolean isFull() { + return size == elementData.length; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + if(isFull()){ + throw new RuntimeException("The queue is full!!!"); + } + + elementData[rear] = data; + rear = (rear + 1) % elementData.length; + size++; + } + + public E deQueue() { + if(isEmpty()){ + throw new RuntimeException("The queue is empty!!!"); + } + + E result = (E) elementData[front]; + elementData[front] = null; + front = (front + 1) % elementData.length; + size--; + return result; + } + +} diff --git a/group04/1299310140/src/com/coding/basic/queue/Josephus.java b/group04/1299310140/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..d0c1f2ca79 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,37 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + Queue queue = new Queue(); + for(int i = 0;i < n;i++){ + queue.enQueue(i); + } + + int temp = 0; + List result = new ArrayList(); + while(!queue.isEmpty()){ + temp = (temp + 1) % m; + Object queueFirst = queue.deQueue(); + if(temp == 0){ + result.add((Integer) queueFirst); + }else{ + queue.enQueue(queueFirst); + } + } + + return result; + } + +} diff --git a/group04/1299310140/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group04/1299310140/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..4776c06513 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,47 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + public int size() { + return stack1.size() + stack2.size(); + } + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if(this.isEmpty()){ + return null; + } + + if(stack2.isEmpty()){ + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + } + + return stack2.pop(); + } + + } + From 28cf46b6ba84b3a1142b9f835c6241ad339ffcca Mon Sep 17 00:00:00 2001 From: Pan Date: Sun, 7 May 2017 18:39:23 +0800 Subject: [PATCH 461/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/pan/basic/Stack.java | 25 + .../com/pan/download}/DownloadThread.java | 6 +- .../com/pan/download}/FileDownloader.java | 9 +- .../com/pan/download}/api/Connection.java | 2 +- .../pan/download/api/ConnectionException.java | 5 + .../pan/download}/api/ConnectionManager.java | 2 +- .../pan/download}/api/DownloadListener.java | 2 +- .../pan/download}/impl/ConnectionImpl.java | 6 +- .../download}/impl/ConnectionManagerImpl.java | 8 +- .../java/com/pan/litestruts}/JaxpDomUtil.java | 2 +- .../java/com/pan/litestruts}/LoginAction.java | 2 +- .../main/java/com/pan/litestruts}/Struts.java | 3 +- .../main/java/com/pan/litestruts}/View.java | 2 +- .../main/java/com/pan/queue/CircleQueue.java | 46 ++ .../src/main/java/com/pan/queue/Josephus.java | 39 ++ .../src/main/java/com/pan/queue/Queue.java | 61 +++ .../com/pan/queue/QueueWithTwoStacks.java | 55 ++ .../java/com/pan/stack/QuickMinStack.java | 19 + .../com/pan/stack/StackWithTwoQueues.java | 16 + .../com/pan/stack/TwoStackInOneArray.java | 57 ++ .../com/pan/stack/expr/CalculateUtil.java | 27 + .../java/com/pan/stack/expr/InfixExpr.java | 56 ++ .../com/pan/stack/expr/InfixToPostfix.java | 40 ++ .../java/com/pan/stack/expr/PostfixExpr.java | 32 ++ .../java/com/pan/stack/expr/PrefixExpr.java | 38 ++ .../main/java/com/pan/stack/expr/Token.java | 53 ++ .../java/com/pan/stack/expr/TokenParser.java | 57 ++ .../com/pan/download}/FileDownloaderTest.java | 7 +- .../com/pan/linklist}/LRUPageFrameTest.java | 6 +- .../java/com/pan/litestruts}/StrutsTest.java | 2 +- .../java/com/pan/queue/CircleQueueTest.java | 44 ++ .../test/java/com/pan/queue/JosephusTest.java | 27 + .../java/com/pan/stack}/StackUtilTest.java | 7 +- .../com/pan/stack/expr/InfixExprTest.java | 52 ++ .../pan/stack/expr/InfixToPostfixTest.java | 41 ++ .../com/pan/stack/expr/PostfixExprTest.java | 41 ++ .../com/pan/stack/expr/PrefixExprTest.java | 45 ++ .../com/pan/stack/expr/TokenParserTest.java | 41 ++ group11/252308879/dataStructure/.gitignore | 10 - group11/252308879/dataStructure/pom.xml | 35 -- .../org/pan/coding2017/array/ArrayUtil.java | 282 ---------- .../org/pan/coding2017/basic/ArrayList.java | 212 -------- .../pan/coding2017/basic/BinaryTreeNode.java | 76 --- .../org/pan/coding2017/basic/Iterator.java | 12 - .../org/pan/coding2017/basic/LinkedList.java | 121 ----- .../java/org/pan/coding2017/basic/List.java | 14 - .../java/org/pan/coding2017/basic/Queue.java | 50 -- .../java/org/pan/coding2017/basic/Stack.java | 51 -- .../java/org/pan/coding2017/basic/Stack2.java | 47 -- .../org/pan/coding2017/basic2/LinkedList.java | 429 --------------- .../api/ConnectionException.java | 7 - .../src/main/resources/struts.xml | 11 - .../pan/coding2017/TestJavaUtilArrayList.java | 31 -- .../pan/coding2017/array/ArrayUtilTest.java | 89 ---- .../pan/coding2017/basic/ArrayListTest.java | 74 --- .../coding2017/basic/BinaryTreeNodeTest.java | 38 -- .../pan/coding2017/basic/LinkedListTest.java | 80 --- .../org/pan/coding2017/basic/QueueTest.java | 44 -- .../org/pan/coding2017/basic/StackTest.java | 45 -- .../main/java/com/pan/alg/LRUPageFrame.java | 133 ----- .../src/main/java/com/pan/alg/StackUtil.java | 141 ----- .../main/java/com/pan/jvm/attr/CodeAttr.java | 9 +- .../main/java/com/pan/jvm/clz/ClassFile.java | 23 +- .../main/java/com/pan/jvm/cmd/BiPushCmd.java | 32 ++ .../java/com/pan/jvm/cmd/ByteCodeCommand.java | 152 ++++++ .../java/com/pan/jvm/cmd/CommandParser.java | 129 +++++ .../java/com/pan/jvm/cmd/GetFieldCmd.java | 38 ++ .../com/pan/jvm/cmd/GetStaticFieldCmd.java | 42 ++ .../com/pan/jvm/cmd/InvokeSpecialCmd.java | 47 ++ .../com/pan/jvm/cmd/InvokeVirtualCmd.java | 86 +++ .../src/main/java/com/pan/jvm/cmd/LdcCmd.java | 50 ++ .../java/com/pan/jvm/cmd/NewObjectCmd.java | 39 ++ .../java/com/pan/jvm/cmd/NoOperandCmd.java | 146 ++++++ .../java/com/pan/jvm/cmd/OneOperandCmd.java | 27 + .../java/com/pan/jvm/cmd/PutFieldCmd.java | 44 ++ .../java/com/pan/jvm/cmd/TwoOperandCmd.java | 67 +++ .../java/com/pan/jvm/constant/ClassInfo.java | 12 +- .../com/pan/jvm/constant/ConstantInfo.java | 12 + .../com/pan/jvm/constant/ConstantPool.java | 4 +- .../com/pan/jvm/constant/FieldRefInfo.java | 26 +- .../com/pan/jvm/constant/MethodRefInfo.java | 28 +- .../com/pan/jvm/constant/NameAndTypeInfo.java | 24 +- .../pan/jvm/constant/NullConstantInfo.java | 7 +- .../java/com/pan/jvm/constant/StringInfo.java | 9 +- .../java/com/pan/jvm/constant/UTF8Info.java | 16 +- .../com/pan/jvm/engine/ExecutionResult.java | 56 ++ .../com/pan/jvm/engine/ExecutorEngine.java | 83 +++ .../main/java/com/pan/jvm/engine/Heap.java | 39 ++ .../java/com/pan/jvm/engine/JavaObject.java | 71 +++ .../java/com/pan/jvm/engine/MethodArea.java | 88 ++++ .../main/java/com/pan/jvm/engine/MiniJVM.java | 28 + .../java/com/pan/jvm/engine/OperandStack.java | 26 + .../java/com/pan/jvm/engine/StackFrame.java | 131 +++++ .../main/java/com/pan/jvm/method/Method.java | 72 +++ .../com/pan/jvm/print/ClassFilePrinter.java | 54 ++ .../pan/jvm/print/ConstantPoolPrinter.java | 83 +++ .../pan/jvm/print/ConstantPoolPrinterBad.java | 40 ++ .../src/test/java/com/pan/MapForEachTest.java | 30 -- .../java/com/pan/jvm/ClassFileLoaderTest.java | 496 ++++++++++-------- .../test/java/com/pan/jvm/MiniJVMTest.java | 33 ++ 100 files changed, 3048 insertions(+), 2366 deletions(-) create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/basic/Stack.java rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/multThreadDownload => data-structure/src/main/java/com/pan/download}/DownloadThread.java (90%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/multThreadDownload => data-structure/src/main/java/com/pan/download}/FileDownloader.java (92%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/multThreadDownload => data-structure/src/main/java/com/pan/download}/api/Connection.java (89%) create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/download/api/ConnectionException.java rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/multThreadDownload => data-structure/src/main/java/com/pan/download}/api/ConnectionManager.java (78%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/multThreadDownload => data-structure/src/main/java/com/pan/download}/api/DownloadListener.java (57%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api => data-structure/src/main/java/com/pan/download}/impl/ConnectionImpl.java (93%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api => data-structure/src/main/java/com/pan/download}/impl/ConnectionManagerImpl.java (62%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/utils => data-structure/src/main/java/com/pan/litestruts}/JaxpDomUtil.java (99%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/parsingXML => data-structure/src/main/java/com/pan/litestruts}/LoginAction.java (95%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/parsingXML => data-structure/src/main/java/com/pan/litestruts}/Struts.java (98%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/parsingXML => data-structure/src/main/java/com/pan/litestruts}/View.java (90%) create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/queue/CircleQueue.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/queue/Josephus.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/queue/Queue.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/queue/QueueWithTwoStacks.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/QuickMinStack.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/StackWithTwoQueues.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/TwoStackInOneArray.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/expr/CalculateUtil.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/expr/InfixExpr.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/expr/InfixToPostfix.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/expr/PostfixExpr.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/expr/PrefixExpr.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/expr/Token.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/stack/expr/TokenParser.java rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/multThreadDownload => data-structure/src/test/java/com/pan/download}/FileDownloaderTest.java (77%) rename group11/252308879/{mini-jvm/src/test/java/com/pan/alg => data-structure/src/test/java/com/pan/linklist}/LRUPageFrameTest.java (89%) rename group11/252308879/{dataStructure/src/main/java/org/pan/coding2017/parsingXML => data-structure/src/test/java/com/pan/litestruts}/StrutsTest.java (96%) create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/queue/CircleQueueTest.java create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/queue/JosephusTest.java rename group11/252308879/{mini-jvm/src/test/java/com/pan/alg => data-structure/src/test/java/com/pan/stack}/StackUtilTest.java (98%) create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/stack/expr/InfixExprTest.java create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/stack/expr/InfixToPostfixTest.java create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/stack/expr/PostfixExprTest.java create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/stack/expr/PrefixExprTest.java create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/stack/expr/TokenParserTest.java delete mode 100644 group11/252308879/dataStructure/.gitignore delete mode 100644 group11/252308879/dataStructure/pom.xml delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic2/LinkedList.java delete mode 100644 group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/ConnectionException.java delete mode 100644 group11/252308879/dataStructure/src/main/resources/struts.xml delete mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java delete mode 100644 group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java delete mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/alg/LRUPageFrame.java delete mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/alg/StackUtil.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/BiPushCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/ByteCodeCommand.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/CommandParser.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/GetFieldCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/LdcCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/NewObjectCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/NoOperandCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/OneOperandCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/PutFieldCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/TwoOperandCmd.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/ExecutionResult.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/ExecutorEngine.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/Heap.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/JavaObject.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/MethodArea.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/MiniJVM.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/OperandStack.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/StackFrame.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ClassFilePrinter.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ConstantPoolPrinter.java create mode 100644 group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ConstantPoolPrinterBad.java delete mode 100644 group11/252308879/mini-jvm/src/test/java/com/pan/MapForEachTest.java create mode 100644 group11/252308879/mini-jvm/src/test/java/com/pan/jvm/MiniJVMTest.java diff --git a/group11/252308879/data-structure/src/main/java/com/pan/basic/Stack.java b/group11/252308879/data-structure/src/main/java/com/pan/basic/Stack.java new file mode 100644 index 0000000000..fee417f7f0 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/basic/Stack.java @@ -0,0 +1,25 @@ +package com.pan.basic; + + +import java.util.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/DownloadThread.java b/group11/252308879/data-structure/src/main/java/com/pan/download/DownloadThread.java similarity index 90% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/DownloadThread.java rename to group11/252308879/data-structure/src/main/java/com/pan/download/DownloadThread.java index 0625d24650..8155031ad8 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/DownloadThread.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/download/DownloadThread.java @@ -1,7 +1,9 @@ -package org.pan.coding2017.multThreadDownload; +package com.pan.download; -import org.pan.coding2017.multThreadDownload.api.Connection; + + +import com.pan.download.api.Connection; import java.io.RandomAccessFile; import java.util.concurrent.CyclicBarrier; diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/FileDownloader.java b/group11/252308879/data-structure/src/main/java/com/pan/download/FileDownloader.java similarity index 92% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/FileDownloader.java rename to group11/252308879/data-structure/src/main/java/com/pan/download/FileDownloader.java index 16ac89b371..8da8be9f5d 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/FileDownloader.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/download/FileDownloader.java @@ -1,9 +1,10 @@ -package org.pan.coding2017.multThreadDownload; +package com.pan.download; -import org.pan.coding2017.multThreadDownload.api.Connection; -import org.pan.coding2017.multThreadDownload.api.ConnectionManager; -import org.pan.coding2017.multThreadDownload.api.DownloadListener; + +import com.pan.download.api.Connection; +import com.pan.download.api.ConnectionManager; +import com.pan.download.api.DownloadListener; import java.io.RandomAccessFile; import java.util.concurrent.CyclicBarrier; diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/Connection.java b/group11/252308879/data-structure/src/main/java/com/pan/download/api/Connection.java similarity index 89% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/Connection.java rename to group11/252308879/data-structure/src/main/java/com/pan/download/api/Connection.java index 98046b6c8f..e00172ab18 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/Connection.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/download/api/Connection.java @@ -1,4 +1,4 @@ -package org.pan.coding2017.multThreadDownload.api; +package com.pan.download.api; import java.io.IOException; diff --git a/group11/252308879/data-structure/src/main/java/com/pan/download/api/ConnectionException.java b/group11/252308879/data-structure/src/main/java/com/pan/download/api/ConnectionException.java new file mode 100644 index 0000000000..8d07f2c1f9 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.pan.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/ConnectionManager.java b/group11/252308879/data-structure/src/main/java/com/pan/download/api/ConnectionManager.java similarity index 78% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/ConnectionManager.java rename to group11/252308879/data-structure/src/main/java/com/pan/download/api/ConnectionManager.java index 4ac353f33d..0dcbf8abf8 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/ConnectionManager.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/download/api/ConnectionManager.java @@ -1,4 +1,4 @@ -package org.pan.coding2017.multThreadDownload.api; +package com.pan.download.api; public interface ConnectionManager { /** diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/DownloadListener.java b/group11/252308879/data-structure/src/main/java/com/pan/download/api/DownloadListener.java similarity index 57% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/DownloadListener.java rename to group11/252308879/data-structure/src/main/java/com/pan/download/api/DownloadListener.java index 0de8c742d0..58b6b294d9 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/DownloadListener.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/download/api/DownloadListener.java @@ -1,4 +1,4 @@ -package org.pan.coding2017.multThreadDownload.api; +package com.pan.download.api; public interface DownloadListener { public void notifyFinished(); diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/impl/ConnectionImpl.java b/group11/252308879/data-structure/src/main/java/com/pan/download/impl/ConnectionImpl.java similarity index 93% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/impl/ConnectionImpl.java rename to group11/252308879/data-structure/src/main/java/com/pan/download/impl/ConnectionImpl.java index d8639a5b6b..ecedb90840 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/impl/ConnectionImpl.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/download/impl/ConnectionImpl.java @@ -1,6 +1,8 @@ -package org.pan.coding2017.multThreadDownload.api.impl; +package com.pan.download.impl; -import org.pan.coding2017.multThreadDownload.api.Connection; + + +import com.pan.download.api.Connection; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/impl/ConnectionManagerImpl.java b/group11/252308879/data-structure/src/main/java/com/pan/download/impl/ConnectionManagerImpl.java similarity index 62% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/impl/ConnectionManagerImpl.java rename to group11/252308879/data-structure/src/main/java/com/pan/download/impl/ConnectionManagerImpl.java index 5a555652fc..9e415863e3 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/api/impl/ConnectionManagerImpl.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/download/impl/ConnectionManagerImpl.java @@ -1,8 +1,10 @@ -package org.pan.coding2017.multThreadDownload.api.impl; +package com.pan.download.impl; -import org.pan.coding2017.multThreadDownload.api.Connection; -import org.pan.coding2017.multThreadDownload.api.ConnectionManager; + + +import com.pan.download.api.Connection; +import com.pan.download.api.ConnectionManager; import java.io.IOException; diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java b/group11/252308879/data-structure/src/main/java/com/pan/litestruts/JaxpDomUtil.java similarity index 99% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java rename to group11/252308879/data-structure/src/main/java/com/pan/litestruts/JaxpDomUtil.java index d8fe537e35..e806d4fac6 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/utils/JaxpDomUtil.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/litestruts/JaxpDomUtil.java @@ -1,4 +1,4 @@ -package org.pan.coding2017.utils; +package com.pan.litestruts; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java b/group11/252308879/data-structure/src/main/java/com/pan/litestruts/LoginAction.java similarity index 95% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java rename to group11/252308879/data-structure/src/main/java/com/pan/litestruts/LoginAction.java index f38cbcb084..ca9c0a41a7 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/LoginAction.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/litestruts/LoginAction.java @@ -1,4 +1,4 @@ -package org.pan.coding2017.parsingXML; +package com.pan.litestruts; /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java b/group11/252308879/data-structure/src/main/java/com/pan/litestruts/Struts.java similarity index 98% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java rename to group11/252308879/data-structure/src/main/java/com/pan/litestruts/Struts.java index 90c5443c23..ca17b809ba 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/Struts.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/litestruts/Struts.java @@ -1,6 +1,5 @@ -package org.pan.coding2017.parsingXML; +package com.pan.litestruts; -import org.pan.coding2017.utils.JaxpDomUtil; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java b/group11/252308879/data-structure/src/main/java/com/pan/litestruts/View.java similarity index 90% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java rename to group11/252308879/data-structure/src/main/java/com/pan/litestruts/View.java index 3271ab4ed1..a57f4d50c3 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/View.java +++ b/group11/252308879/data-structure/src/main/java/com/pan/litestruts/View.java @@ -1,4 +1,4 @@ -package org.pan.coding2017.parsingXML; +package com.pan.litestruts; import java.util.Map; diff --git a/group11/252308879/data-structure/src/main/java/com/pan/queue/CircleQueue.java b/group11/252308879/data-structure/src/main/java/com/pan/queue/CircleQueue.java new file mode 100644 index 0000000000..040df85d1f --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/queue/CircleQueue.java @@ -0,0 +1,46 @@ +package com.pan.queue; + +public class CircleQueue { + + //用数组来保存循环队列的元素 + private Object[] elementData ; + int size = 0; + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public CircleQueue(int capacity){ + elementData = new Object[capacity]; + } + public boolean isEmpty() { + return front == rear; + + } + + public boolean isFull(){ + return size == elementData.length; + } + public int size() { + return size; + } + + public void enQueue(E data) { + if(isFull()){ + throw new RuntimeException("The queue is full"); + } + elementData[rear++] = data; + size++; + } + + public E deQueue() { + if(isEmpty()){ + throw new RuntimeException("The queue is empty"); + } + E data = (E)elementData[front]; + elementData[front] = null; + front = (front+1) % elementData.length; + size --; + return data; + } +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/queue/Josephus.java b/group11/252308879/data-structure/src/main/java/com/pan/queue/Josephus.java new file mode 100644 index 0000000000..45e4b53526 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/queue/Josephus.java @@ -0,0 +1,39 @@ +package com.pan.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + Queue queue = new Queue(); + for (int i = 0; i < n; i++){ + queue.enQueue(i); + } + + List result = new ArrayList(); + int i = 0; + + while (!queue.isEmpty()) { + + int x = queue.deQueue(); + + if (++i % m == 0){ + result.add(x); + } else{ + queue.enQueue(x); + } + } + + + return result; + } + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/queue/Queue.java b/group11/252308879/data-structure/src/main/java/com/pan/queue/Queue.java new file mode 100644 index 0000000000..fcd08e7a0c --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/queue/Queue.java @@ -0,0 +1,61 @@ +package com.pan.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/queue/QueueWithTwoStacks.java b/group11/252308879/data-structure/src/main/java/com/pan/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..0ef6f82625 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/queue/QueueWithTwoStacks.java @@ -0,0 +1,55 @@ +package com.pan.queue; + +import java.util.NoSuchElementException; +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + private void moveStack1ToStack2() { + while (!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + + } + + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + + + public int size() { + return stack1.size() + stack2.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue is empty"); + } + if (stack2.isEmpty()) { + moveStack1ToStack2(); + } + + return stack2.pop(); + } + + + + } + diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/QuickMinStack.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/QuickMinStack.java new file mode 100644 index 0000000000..b665a680a4 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/QuickMinStack.java @@ -0,0 +1,19 @@ +package com.pan.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + public void push(int data){ + + } + public int pop(){ + return -1; + } + public int findMin(){ + return -1; + } +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/StackWithTwoQueues.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..72a87b3b68 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/StackWithTwoQueues.java @@ -0,0 +1,16 @@ +package com.pan.stack; + + +public class StackWithTwoQueues { + + + public void push(int data) { + + } + + public int pop() { + return -1; + } + + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/TwoStackInOneArray.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..f00f36b2e6 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/TwoStackInOneArray.java @@ -0,0 +1,57 @@ +package com.pan.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return null; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + return null; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return null; + } + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/CalculateUtil.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/CalculateUtil.java new file mode 100644 index 0000000000..3eb1a9f6e9 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/CalculateUtil.java @@ -0,0 +1,27 @@ +package com.pan.stack.expr; + +import java.util.Stack; + +/** + * Created by Pan on 2017/5/7. + */ +public class CalculateUtil { + + + public static Float calculate(String op, Float f1, Float f2) { + if (op.equals("+")) { + return f1 + f2; + } + if (op.equals("-")) { + return f1 - f2; + } + if (op.equals("*")) { + return f1 * f2; + } + if (op.equals("/")) { + return f1 / f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/InfixExpr.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..e7d8797eb6 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/InfixExpr.java @@ -0,0 +1,56 @@ +package com.pan.stack.expr; + +import java.util.List; +import java.util.Stack; + + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for (Token token : tokens) { + + if (token.isOperator()) { + + while (!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())) { + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = CalculateUtil.calculate(prevOperator.toString(), f1, f2); + numStack.push(result); + + } + opStack.push(token); + } + if (token.isNumber()) { + numStack.push(new Float(token.getIntValue())); + } + } + + while (!opStack.isEmpty()) { + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(CalculateUtil.calculate(token.toString(), f1, f2)); + } + + + return numStack.pop().floatValue(); + } + + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/InfixToPostfix.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..df17c3af43 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/InfixToPostfix.java @@ -0,0 +1,40 @@ +package com.pan.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + List inFixTokens = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList<>(); + + Stack opStack = new Stack(); + for (Token token : inFixTokens) { + + if (token.isOperator()) { + + while (!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())) { + postFixTokens.add(opStack.pop()); + + } + opStack.push(token); + + } + if (token.isNumber()) { + + postFixTokens.add(token); + + } + } + + while (!opStack.isEmpty()) { + postFixTokens.add(opStack.pop()); + } + + return postFixTokens; + } +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/PostfixExpr.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..c649aa604b --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/PostfixExpr.java @@ -0,0 +1,32 @@ +package com.pan.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack numStack = new Stack<>(); + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push(new Float(token.getIntValue())); + } else { + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(CalculateUtil.calculate(token.toString(), f1, f2)); + } + } + return numStack.pop().floatValue(); + } + + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/PrefixExpr.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..902ecfa0cb --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/PrefixExpr.java @@ -0,0 +1,38 @@ +package com.pan.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for (Token token : tokens) { + exprStack.push(token); + } + + while (!exprStack.isEmpty()) { + Token t = exprStack.pop(); + if (t.isNumber()) { + numStack.push(new Float(t.getIntValue())); + } else { + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(CalculateUtil.calculate(t.toString(), f1, f2)); + + } + } + return numStack.pop().floatValue(); + } + + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/Token.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/Token.java new file mode 100644 index 0000000000..f7db7d2a00 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/Token.java @@ -0,0 +1,53 @@ +package com.pan.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + +} \ No newline at end of file diff --git a/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/TokenParser.java b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/TokenParser.java new file mode 100644 index 0000000000..90338a98a8 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.pan.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else { + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/FileDownloaderTest.java b/group11/252308879/data-structure/src/test/java/com/pan/download/FileDownloaderTest.java similarity index 77% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/FileDownloaderTest.java rename to group11/252308879/data-structure/src/test/java/com/pan/download/FileDownloaderTest.java index 7636f974b2..6e8d059c3a 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/multThreadDownload/FileDownloaderTest.java +++ b/group11/252308879/data-structure/src/test/java/com/pan/download/FileDownloaderTest.java @@ -1,11 +1,10 @@ -package org.pan.coding2017.multThreadDownload; +package com.pan.download; +import com.pan.download.api.ConnectionManager; +import com.pan.download.impl.ConnectionManagerImpl; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.pan.coding2017.multThreadDownload.api.ConnectionManager; -import org.pan.coding2017.multThreadDownload.api.DownloadListener; -import org.pan.coding2017.multThreadDownload.api.impl.ConnectionManagerImpl; public class FileDownloaderTest { diff --git a/group11/252308879/mini-jvm/src/test/java/com/pan/alg/LRUPageFrameTest.java b/group11/252308879/data-structure/src/test/java/com/pan/linklist/LRUPageFrameTest.java similarity index 89% rename from group11/252308879/mini-jvm/src/test/java/com/pan/alg/LRUPageFrameTest.java rename to group11/252308879/data-structure/src/test/java/com/pan/linklist/LRUPageFrameTest.java index 8f6803c11f..e2d5325661 100644 --- a/group11/252308879/mini-jvm/src/test/java/com/pan/alg/LRUPageFrameTest.java +++ b/group11/252308879/data-structure/src/test/java/com/pan/linklist/LRUPageFrameTest.java @@ -1,7 +1,7 @@ -package com.pan.alg; - -import org.junit.Assert; +package com.pan.linklist; +import com.pan.linklist.LRUPageFrame; +import org.junit.Assert; import org.junit.Test; diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java b/group11/252308879/data-structure/src/test/java/com/pan/litestruts/StrutsTest.java similarity index 96% rename from group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java rename to group11/252308879/data-structure/src/test/java/com/pan/litestruts/StrutsTest.java index ccdacc514c..cc1a132d50 100644 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/parsingXML/StrutsTest.java +++ b/group11/252308879/data-structure/src/test/java/com/pan/litestruts/StrutsTest.java @@ -1,4 +1,4 @@ -package org.pan.coding2017.parsingXML; +package com.pan.litestruts; import java.util.HashMap; import java.util.Map; diff --git a/group11/252308879/data-structure/src/test/java/com/pan/queue/CircleQueueTest.java b/group11/252308879/data-structure/src/test/java/com/pan/queue/CircleQueueTest.java new file mode 100644 index 0000000000..1afe297c98 --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/queue/CircleQueueTest.java @@ -0,0 +1,44 @@ +package com.pan.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class CircleQueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(5); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertTrue(queue.isFull()); + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } + +} diff --git a/group11/252308879/data-structure/src/test/java/com/pan/queue/JosephusTest.java b/group11/252308879/data-structure/src/test/java/com/pan/queue/JosephusTest.java new file mode 100644 index 0000000000..a0c56cc12a --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.pan.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group11/252308879/mini-jvm/src/test/java/com/pan/alg/StackUtilTest.java b/group11/252308879/data-structure/src/test/java/com/pan/stack/StackUtilTest.java similarity index 98% rename from group11/252308879/mini-jvm/src/test/java/com/pan/alg/StackUtilTest.java rename to group11/252308879/data-structure/src/test/java/com/pan/stack/StackUtilTest.java index 71671c9b47..7969de3356 100644 --- a/group11/252308879/mini-jvm/src/test/java/com/pan/alg/StackUtilTest.java +++ b/group11/252308879/data-structure/src/test/java/com/pan/stack/StackUtilTest.java @@ -1,11 +1,12 @@ -package com.pan.alg; - -import java.util.Stack; +package com.pan.stack; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; + +import java.util.Stack; + public class StackUtilTest { @Before diff --git a/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/InfixExprTest.java b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..ff7f8cc0e6 --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.pan.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/InfixToPostfixTest.java b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..e46641122f --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/InfixToPostfixTest.java @@ -0,0 +1,41 @@ +package com.pan.stack.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} diff --git a/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/PostfixExprTest.java b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..1ed273c5ab --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.pan.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/PrefixExprTest.java b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..0e6c4513ed --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.pan.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/TokenParserTest.java b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..5e95bf95b1 --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.pan.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group11/252308879/dataStructure/.gitignore b/group11/252308879/dataStructure/.gitignore deleted file mode 100644 index c7175f9b40..0000000000 --- a/group11/252308879/dataStructure/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -dataStructure/.classpath -dataStructure/.project -dataStructure/.settings/ - -.project -.settings/ -target/ -# 忽略IntelliJ IDEA配置文件 -*.iml -*.idea/ diff --git a/group11/252308879/dataStructure/pom.xml b/group11/252308879/dataStructure/pom.xml deleted file mode 100644 index 0bf21adba4..0000000000 --- a/group11/252308879/dataStructure/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - 4.0.0 - - org.apn.coding2017 - dataStructure - 1.0.0-SNAPSHOT - jar - - dataStructure - http://maven.apache.org - - - UTF-8 - - - - - junit - junit - 4.12 - test - - - junit - junit - RELEASE - - - dom4j - dom4j - 1.6.1 - - - diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java deleted file mode 100644 index 82d7073a0f..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/array/ArrayUtil.java +++ /dev/null @@ -1,282 +0,0 @@ -package org.pan.coding2017.array; - -import java.util.Arrays; - -/** - * Created by QiPan on 2017/2/27. - */ -public class ArrayUtil { - - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - * 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - * 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * - * @param origin - * @return - */ - public static void reverseArray(int[] origin) { - - // 如果是null, 或者长度小于等于1, 直接返回 - if (origin == null || origin.length <= 1) { - return; - } - for (int i = 0; i < origin.length / 2; i++) { - int tmp = origin[i]; - origin[i] = origin[origin.length - 1 - i]; - origin[origin.length - 1 - i] = tmp; - } - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * - * @param oldArray - * @return - */ - - public static int[] removeZero(int[] oldArray) { - - if (oldArray == null) { - return oldArray; - } - int[] newArray = null; - int count = 0; //统计被移出的数组的个数 - for (int i = 0; i < oldArray.length; i++) { - int num = oldArray[i]; - if (num == 0) { - count++; - System.arraycopy(oldArray, i + 1, oldArray, i, oldArray.length - i - 1); - i--; - } - } - if (count == 0) { - newArray = oldArray; - } else { - newArray = new int[oldArray.length - count]; - System.arraycopy(oldArray, 0, newArray, 0, oldArray.length - count); - } - return newArray; - } - - /** - * 不用JavaAPI来做 - * - * @param oldArray - * @return - */ - public static int[] removeZero_2(int[] oldArray) { - - if (oldArray == null) { - return oldArray; - } - int count = 0; - for (int num : oldArray) { - if (num == 0) { - count++; - } - } - int[] newArray = new int[oldArray.length - count]; - for (int i = 0, j = 0; i < oldArray.length; i++, j++) { - int num = oldArray[i]; - if (num == 0) { - j--; - } else { - newArray[j] = num; - } - } - return newArray; - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * - * @param array1 - * @param array2 - * @return - */ - public static int[] merge(int[] array1, int[] array2) { - //先初始化一个array3,但不是最后返回的数组 - int[] array3 = new int[array1.length + array2.length]; - int i = 0, j = 0; - int array3Size = 0; // 统计实际上合并数组后的大小 - while (i < array1.length && j < array2.length) { - if (array1[i] < array2[j]) {// 如果array1中元素小,则插入到array3中 - array3[array3Size++] = array1[i]; - ++i; - } else if (array1[i] > array2[j]) {//如果array2中元素小,则插入到array3中 - array3[array3Size++] = array2[j]; - ++j; - } else {//否则随便插入一个,但是计数要同时加1 - array3[array3Size++] = array1[i]; - ++i; - ++j; - } - } - - if (i == array1.length) { //如果array1中全部循环完毕了,那么需要去处理array2中剩余的元素 - for (int n = j; n < array2.length; n++) { - array3[array3Size++] = array2[n]; - } - } else if (j == array2.length) {// 如果array2中全部循环完毕,那么需要去处理array1中剩余的元素 - for (int n = i; n < array1.length; n++) { - array3[array3Size++] = array1[n]; - } - } - int[] returnResultArray = new int[array3Size]; - System.arraycopy(array3, 0, returnResultArray, 0, - array3Size); - return returnResultArray; - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * - * @param oldArray - * @param size - * @return - */ - public static int[] grow(int[] oldArray, int size) { - if (oldArray == null) { - oldArray = new int[size]; - } - oldArray = Arrays.copyOf(oldArray, oldArray.length + size); - return oldArray; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * - * @param max - * @return - */ - public static int[] fibonacci(int max) { - if (max <= 1) { - return new int[0]; - } - int[] arrays = new int[max / 2]; - int firstNum = 1; //第一个数字 - int secondNum = 1; // 第二个数字 - int arraySize = 0; - arrays[arraySize++] = 1; // 初始化第一位 - while (secondNum < max) { - arrays[arraySize++] = secondNum; - int tmpNum = secondNum; // 保存第二个数,得会需要付给第一个数 - secondNum = firstNum + secondNum; // 为前两个数之和 - firstNum = tmpNum; // 第一个数,后移 - } - return Arrays.copyOf(arrays, arraySize); - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * - * @param max - * @return - */ - public static int[] getPrimes(int max) { - int[] returnResultArray = new int[max + 1]; - int arraySize = 0; - for (int i = 2; i < max; i++) { - if (isPrime(i)) { - returnResultArray[arraySize++] = i; - } - - } - if (arraySize == returnResultArray.length) { - return returnResultArray; - } - return Arrays.copyOf(returnResultArray, arraySize); - } - - private static boolean isPrime(final int number) { - if (number < 2) { - return false; - } - // 因为不可能将一个数除与所有小于它的数字,只要检查到N的平方根就好了。 - // 但直接开根号还有个精度的问题。这个可能会产生误差。 索性将判断条件写成 i*i<=number - for (int i = 2; i * i <= number; i++) { - if (number % i == 0) {//查看所有小于number平方根的数,能够被整除 - return false; - } - } - // 如果一个都没有,那么就是素数 - return true; - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * - * @param max - * @return - */ - public static int[] getPerfectNumbers(int max) { - int[] array = new int[max]; - int arraySize = 0; - for (int n = 0; n < max; n++) { - int fac,// 被除的因子 - sum,// 用来统计因子之和 - num;// 除数的因子,中间变量 - for (sum = 1, num = n, fac = 2; fac < num; fac++) { - - if (n % fac == 0) {// 如果余数为0,那么说明有因子 - sum += fac; // 统计因子和 - num = n / fac; // num=等于除数的最大因子 - if (num == fac) // 如果最大和最小相等跳出循环 - break; - sum += num; // 再统计因子 - } - } - - if (sum == n) { //因子和与整数相等,那么就是一个完美数 - if (n != 1) { - System.out.println(n + "是一个完全数,其因子为:"); - } - for (fac = 1; fac < n; fac++) { - if (n % fac == 0) {// 列出所有的因子 - System.out.print(fac + " "); - } - } - System.out.println(); - array[arraySize++] = n; // 放到数组中 - } - } - return Arrays.copyOf(array, arraySize); - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * - * @param array - * @param seperator - * @return - */ - public static String join(int[] array, String seperator) { - if (array == null) { - return null; - } - StringBuilder str = new StringBuilder(); - for (int i = 0; i < array.length; i++) { - if (i == array.length - 1) { - str.append(array[i]); - continue; - } - str.append(array[i]).append(seperator); - } - return str.toString(); - } - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java deleted file mode 100644 index 73dd4b7a5f..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/ArrayList.java +++ /dev/null @@ -1,212 +0,0 @@ -package org.pan.coding2017.basic; - -import java.util.Arrays; -import java.util.NoSuchElementException; - -/** - * Created by QiPan on 2017/2/23. - */ -public class ArrayList implements List { - - private int size; - - // 设置默认容量 不可变 - private static final int DEFAULT_CAPACITY = 10; - - private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - private Object[] elementData; - - // 定义一个默认的空的数组,引用不可变 - private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; - - public ArrayList(int initialCapacity) { - if (initialCapacity > 0) { - this.elementData = new Object[initialCapacity]; - } else if (initialCapacity == 0) { - this.elementData = new Object[]{}; - } else { - throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); - } - } - - public ArrayList() { // 如果调用默认构造函数,设置容器为空的默认数组 - this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; - } - - - public boolean add(Object o) { - ensureCapacityInternal(size + 1); - elementData[size++] = o; - return true; - } - - @Override - public boolean add(int index, Object o) { - if (index > size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - ensureCapacityInternal(size + 1); - // 从插入位置开发,所有的数据需要往后移动 - System.arraycopy(elementData, index, elementData, index + 1, - size - index); - elementData[index] = o; - size++; - return true; - } - - public Object set(int index, Object element) { - checkIndexOutOf(index); - Object oldEle = elementData[index]; - elementData[index] = element; - return oldEle; - } - - public Object get(int index) { - checkIndexOutOf(index); - return elementData[index]; - } - - public Object remove(int index) { - checkIndexOutOf(index); - Object oldValue = elementData[index]; - - // 计算需要移动的位数 - int needMoveNum = size - index - 1; - - if (needMoveNum > 0) { - /* - * src:源数组; - * srcPos:源数组要复制的起始位置; - * dest:目的数组; - * destPos:目的数组放置的起始位置; - * length:复制的长度。 - */ - System.arraycopy(elementData, index + 1, elementData, index, needMoveNum); - } - // 避免对象游离,是的gcc能工作回收 - elementData[--size] = null; - return oldValue; - } - - public int size() { - return this.size; - } - - public boolean isEmpty() { - return this.size == 0; - } - - public Iterator iterator() { - return new Itr(); - } - - - private String outOfBoundsMsg(int index) { - return "Index: " + index + ", Size: " + size; - } - - /** - * 检查数组越界 - * - * @param index - */ - private void checkIndexOutOf(int index) { - if (index >= size) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - } - - private void ensureCapacityInternal(int minCapacity) { - // 如果是容器是默认的空的数组 - if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { - // 取得为与默认容量相比的较大值 - minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); - } - // 调用确保有能力放下那么多元素 - ensureExplicitCapacity(minCapacity); - } - - private void ensureExplicitCapacity(int minCapacity) { - // 防止容量溢出。所需的最小容器大于数组长度 - if (minCapacity - elementData.length > 0) { - grow(minCapacity); - } - } - - /** - * 扩充容量 - * - * @param minCapacity - */ - private void grow(int minCapacity) { - int oldCapacity = elementData.length; - // 得到一个新的容量大小,为 oldCapacity 的1.5倍 - int newCapacity = oldCapacity + (oldCapacity >> 1); - // 如果扩容后的大小比,最小容量(DEFAULT_CAPACITY: 10)小 - if (newCapacity - minCapacity < 0) { - newCapacity = minCapacity; - } else if (newCapacity - MAX_ARRAY_SIZE > 0) { // 扩容后比最大的还大,考虑溢出 - // - newCapacity = hugeCapacity(minCapacity); - } - - elementData = Arrays.copyOf(elementData, newCapacity); - } - - /** - * 这个很少用到这个判断,毕竟基本不会使用那么大容量存储 - * - * @param minCapacity - * @return - */ - private static int hugeCapacity(int minCapacity) { - if (minCapacity < 0) { - throw new OutOfMemoryError(); - } - return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; - } - - private class Itr implements Iterator { - - /** - * 当前游标 - */ - int cursor; - int lastRet = -1; // 是否是返回最后一个结果 - - @Override - public boolean hasNext() { - return cursor != size; - } - - @Override - public Object next() { - int i = cursor; - // 游标已经超过数组的大小 - if (i >= size) { - throw new NoSuchElementException(); - } - Object[] elementData = ArrayList.this.elementData; - - // 指向下一个元素 - cursor = i + 1; - Object elementDatum = elementData[i]; - lastRet = i; - return elementDatum; - } - - @Override - public void remove() { - if (lastRet < 0) { - throw new IllegalStateException(); - } - // 实际上这个时候的 lastRet,为 next方法时候的 i = cursor - ArrayList.this.remove(lastRet); - cursor = lastRet; - lastRet = -1; - } - } - - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java deleted file mode 100644 index 80f7f78751..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/BinaryTreeNode.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.pan.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - */ -public class BinaryTreeNode, Value> { - - private Node root; - - private class Node { - private Key key; - private Value value; - private Node left, right; //指向子树的链接 - private int N; // 以该节点为根的子树节点总数 - public Node(Key key, Value value, int N) { - this.key = key; - this.value = value; - this.N = N; - } - } - - public int size() { - return size(root); - } - - private int size(Node x) { - if (x == null) return 0; - else return x.N; - } - - public Value get(Key key){ - return get(root, key); - } - - private Value get(Node x, Key key) { - // 如果根节点也是Null 那么返回null - if (x == null){ - return null; - } - // 拿需要查询的key 与 根节点的 key 比较 - int cmp = key.compareTo(x.key); - if (cmp < 0){ // 如果小于0 那么去左子树上查询,并且递归调用 - return get(x.left, key); - }else if (cmp > 0){// 如果大于0 那么去右子树上查询,并且递归调用 - return get(x.right, key); - }else { - return x.value; - } - } - - public void push(Key key, Value value){ - // 查询key, 找到则更新它的值,否则就创建 - root = put(root, key, value); - } - - private Node put(Node x, Key key, Value value) { - // 如果key 存在于以 x 为根节点的子树中 则更新它的值 - // 否则将以key 和 value 为键值对的新节点插入到该子树中 - - if (x == null){ - return new Node(key, value, 1); - } - int cmp = key.compareTo(x.key); - if (cmp < 0 ){ - x.left = put(x.left, key, value); - }else if (cmp > 0){ - x.right = put(x.right, key, value); - }else { // 存在更新值 - x.value = value; - } - // 重新统计节点总数 - x.N = size(x.left) + size(x.right) + 1; - return x; - } - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java deleted file mode 100644 index 3d1849f1a0..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Iterator.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.pan.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - */ -public interface Iterator { - boolean hasNext(); - - Object next(); - - void remove(); -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java deleted file mode 100644 index 015ac3d59d..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/LinkedList.java +++ /dev/null @@ -1,121 +0,0 @@ -package org.pan.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - */ -public class LinkedList { - - private Node head; - private int size; - public LinkedList() { - head = new Node(null, null); - size = 0; - } - - public void add(Object o){ - add(size, o); - } - - public void add(int index , Object o){ - if (index > size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - Node frontNode = getNode(index-1); - Node newNode = new Node(o, frontNode.next); - frontNode.next = newNode; - size++; - - } - - private Node getNode(int index) { - Node node = head; - int i = 0; - while(node.next != null && i <= index) { - node = node.next; - i++; - } - return node; - } - - public Object get(int index){ - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - - Node node = getNode(index); - return node.data; - } - - public Object remove(int index){ - if (index >= size || index < 0) { - throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); - } - Node frontNode = getNode(index-1); - Node oldNode = getNode(index); - frontNode.next = oldNode.next; - size--; - return oldNode.data; - } - - public int size(){ - return size; - } - - public void addFirst(Object o){ - add(0, o); - } - - public void addLast(Object o){ - add(size, o); - } - - public Object removeFirst(){ - return remove(0); - } - - public Object removeLast(){ - return remove(size-1); - } - - public Iterator iterator(){ - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator { - int index; - final int capacity = size; - LinkedListIterator() { - index = 0; - } - @Override - public boolean hasNext() { - return index < capacity; - } - - @Override - public Object next() { - return get(index++); - } - - @Override - public void remove() { - - } - } - - private String outOfBoundsMsg(int index) { - return "index:" + index + ", size:" + size; - } - - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - } - - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java deleted file mode 100644 index 82e72e1080..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/List.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.pan.coding2017.basic; - - -/** - * Created by QiPan on 2017/2/23. - */ -public interface List { - - void add(Object o); - void add(int index, Object o); - Object get(int index); - Object remove(int index); - int size(); -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java deleted file mode 100644 index af478b4288..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Queue.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.pan.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - * 队列,链表实现版本 - */ -public class Queue { - - private Node first; - private Node last; - private int N; - - private class Node { - E item; - Node next; - } - - public void enQueue(E e) { - // 向表尾添加元素 - Node oldLast = last; - last = new Node(); - last.item = e; - last.next = null; - if (isEmpty()){// 如果是往空的队列里面添加东西。那么首尾链表都是指向第一个元素 - first = last; - }else { - - oldLast.next = last; - } - N++; - } - - public E deQueue() { - E item = first.item; - first = first.next; - if (isEmpty()){ - last = null; - } - N--; - return item; - } - - public boolean isEmpty() { - return first == null; - } - - public int size() { - return N; - } -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java deleted file mode 100644 index 918db8f70d..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.pan.coding2017.basic; - -/** - * Created by QiPan on 2017/2/23. - */ -public class Stack { - - private E[] elements; - // 记录元素当前位置 - private int N; - - public Stack(int cap) { - elements = (E[]) new Object[cap]; - } - - public boolean isEmpty() { - return N == 0; - } - - public int size() { - return N; - } - - public void push(E e) { - // 如果 N 和数组的长度已经相同,就进行扩容 - if (N == elements.length) { - resize(2 * elements.length); - } - elements[N++] = e; - } - - public E pop() { - E element = elements[--N]; - elements[N] = null;// 避免对象游离 - // 如果元素值剩下容量的1/4,那么就把数组容量变成现在的一半 - if (N > 0 && N == elements.length / 4) { - resize(elements.length / 2); - } - return element; - } - - private void resize(int max) { - E[] elementTmps = (E[]) new Object[max]; - for (int i = 0; i < N; i++) { - elementTmps[i] = elements[i]; - } - // 指向扩容的数组 - elements = elementTmps; - } - -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java deleted file mode 100644 index 2a056b8bbf..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic/Stack2.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.pan.coding2017.basic; - -/** - * Created by Pan on 2017/2/25. - * 栈(链表实现): 下压栈。操作栈顶元素 - */ -public class Stack2 { - - private Node first; - private int N; - - private class Node { - E item; - Node next; - } - - public boolean isEmpty(){ - return first == null; - } - - public int size(){ - return N; - } - - /** - * 向栈顶添加元素 - * @param element - */ - public void push (E element){ - Node oldFirst = first; - first = new Node(); - first.item = element; - first.next = oldFirst; - N++; - } - - /** - * 弹出栈顶元素 - * @return - */ - public E pop(){ - E item = first.item; - first = first.next; - N--; - return item; - } -} diff --git a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic2/LinkedList.java b/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic2/LinkedList.java deleted file mode 100644 index 5286f27746..0000000000 --- a/group11/252308879/dataStructure/src/main/java/org/pan/coding2017/basic2/LinkedList.java +++ /dev/null @@ -1,429 +0,0 @@ -package org.pan.coding2017.basic2; - -import org.pan.coding2017.basic.Iterator; -import org.pan.coding2017.basic.List; - -public class LinkedList implements List { - - private Node head; - private Node tail; - private int size=0; - - private void checkIndex(int index){ - if(index<0 || index>=this.size) - { - throw new IndexOutOfBoundsException("Error!Invalid index:"+index); - } - } - - private void checkSize(){ - if(size==0) - { - throw new RuntimeException("Empty LinkedList."); - } - } - - public void add(Object o){ - Node temp = new Node(o,null); - if(this.head==null){ - this.head = temp; - this.tail = head; - }else{ - this.tail.next = temp; - this.tail = temp; - } - this.size++; - } - - /* (non-Javadoc) - * @see com.coding.basic2.List#add(int, java.lang.Object) - */ - public void add(int index , Object o){ - checkIndex(index); - if(index==0) - { - Node newNode = new Node(o,head); - head = newNode; - }else{ - Node temp = head; - for(int i=1;i0){ - Node temp = head; - sb.append(temp.data); - while(temp.hasNext()){ - temp = temp.next; - sb.append(","); - sb.append(temp.data); - } - } - return sb.toString(); - } - - public Object remove(int index){ - checkIndex(index); - Node temp = head; - Node pre = head; - Object result; - if(index == 0) - { - result = head.data; - head = head.next; - }else{ - for(int i=0;i0) - { - pre=pre.next; - } - temp=temp.next; - } - result = temp.data; - pre.next=temp.next; - temp = null; - - - if(index == size-1) - { - tail = pre; - } - } - size--; - - return result; - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - Node temp = new Node(o,head); - head = temp; - size++; - - } - public void addLast(Object o){ - Node temp = new Node(o,null); - tail.next = temp; - tail = temp; - size++; - } - public Object removeFirst(){ - return remove(0); - } - public Object removeLast(){ - return remove(size-1); - } - public Iterator iterator(){ - return new LinkedListIterator(); - } - - private class LinkedListIterator implements Iterator{ - private Node current = head; - - @Override - public boolean hasNext() - { - return current!=null; - } - - @Override - public Object next() { - if(current==null) - { - throw new RuntimeException("Current element has not next."); - } - - Object result = current.data; - current = current.next; - return result; - } - - @Override - public void remove() { - - } - - } - - - private static class Node{ - Object data; - Node next; - public boolean hasNext(){ - return (this.next!=null); - } - - public Node(Object data,Node next){ - this.data=data; - this.next=next; - } - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - checkSize(); - int tempSize = size; - Node temp = new Node(removeFirst(),null); - tail = temp; - while(size>0){ - temp = new Node(removeFirst(),temp); - } - head = temp; - size = tempSize; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - checkSize(); - if(size>1) - { - int temp = size; - for(int i=0;isize-i) - { - throw new RuntimeException("No enough size to remove from index:"+i); - }else{ - for(int j=0;j101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - if(size==0||list.size==0){ - return new int[0]; - }else{ - int[] result = new int[list.size()]; - Node temp = head; - int currentPos = 0; - for(int i=0;ival){ - break; - }else if(tempVal==val){ - remove(j); - break; - }else{ - continue; - } - } - } - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - Node temp = head; - while(temp!=null){ - while(temp.hasNext()&&temp.data.equals(temp.next.data)) - { - temp.next = temp.next.next; - size--; - } - temp = temp.next; - } - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - int headVal = (int)head.data; - int tailVal = (int)tail.data; - //if all the values in linkedList fall into the range, clean up; - if(min<=headVal && max>=tailVal) - { - System.out.println("min<=headVal && max>=tailVal"); - head = null; - tail = null; - size = 0; - }else{ - Node preRange = null; - Node sufRange = null; - Node temp = head; - int counter = 0; - while(temp!=null){ - if((int)temp.data=min) - { - preRange = temp; - System.out.println("Found preRange node, val="+temp.data+",next val="+temp.next.data); - } - if((int)temp.data>max){ - sufRange = temp; - System.out.println("Found sufRange node, val="+temp.data+",next val="+(temp.hasNext()?temp.next.data:null)); - break; - } - if((int)temp.data>=min && (int)temp.data<=max) - { - counter++; - } - System.out.println("Counter="+counter); - temp = temp.next; - } - if(min<=headVal){ - head = sufRange; - } - if(max>=tailVal){ - tail = preRange; - } - if(preRange!=null){ - preRange.next = sufRange; - } - size -= counter; - } - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - if(size==0 || list==null || list.size()==0) - { - return new LinkedList(); - }else{ - int pos1=0; - int pos2=0; - LinkedList result = new LinkedList(); - while(pos1val2) - { - if(pos2 - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java deleted file mode 100644 index 281a5bf07b..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/TestJavaUtilArrayList.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.pan.coding2017; - -import org.junit.Assert; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by QiPan on 2017/2/23. - */ -public class TestJavaUtilArrayList { - - - @Test - public void testAdd() { - List arrayList = new ArrayList(5); - arrayList.add(new Object()); - System.out.println("sssssssssssss"); - } - - @Test - public void testRightShift() { - int x = 5; - - x = x << 1; - x = x >> 1; - System.out.println(x); - } - -} diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java deleted file mode 100644 index 29ab6bf6dc..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/array/ArrayUtilTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.pan.coding2017.array; - -import org.junit.Test; - -import java.util.Arrays; - -/** - * Created by QiPan on 2017/2/27. - */ -public class ArrayUtilTest { - - @Test - public void removeZero() throws Exception { - int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; - System.out.println("removeZero 移除0之前: "+ Arrays.toString(oldArr)); - int[] newArrays = ArrayUtil.removeZero(oldArr); - System.out.println("removeZero 移除0之后: "+ Arrays.toString(newArrays)); - } - - @Test - public void removeZero_2() throws Exception { - int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; - System.out.println("removeZero_2 移除0之前: "+ Arrays.toString(oldArr)); - int[] newArrays = ArrayUtil.removeZero_2(oldArr); - System.out.println("removeZero_2 移除0之后: "+ Arrays.toString(newArrays)); - } - - @Test - public void reverseArray() throws Exception { - int[] array = new int[]{7, 9 , 30, 3}; - int[] array2 = new int[] {7, 9, 30, 3, 4}; - System.out.println("置换前: " + Arrays.toString(array)); - ArrayUtil.reverseArray(array); - System.out.println("置换后: "+ Arrays.toString(array)); - System.out.println("置换前: " + Arrays.toString(array2)); - ArrayUtil.reverseArray(array2); - System.out.println("置换后: "+ Arrays.toString(array2)); - } - - @Test - public void merge() throws Exception { - int[] a1 = {3, 5, 7,8}, a2 = {4, 5, 6,7}; - //则 a3 为[3,4,5,6,7,8] - int[] merge = ArrayUtil.merge(a1, a2); - System.out.println(Arrays.toString(merge)); - } - - @Test - public void grow() throws Exception { - int[] oldArray = {2,3,6} ; - int size = 3; - System.out.println("grow 之前:"+ Arrays.toString(oldArray)); - int[] newArrays = ArrayUtil.grow(oldArray, size); - System.out.println("grow 之后:"+ Arrays.toString(newArrays)); - - } - - @Test - public void fibonacci() throws Exception { - //max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - int[] fibonacci = ArrayUtil.fibonacci(988); - System.out.println(Arrays.toString(fibonacci)); - } - - @Test - public void getPrimes() throws Exception { - //例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - int[] primes = ArrayUtil.getPrimes(23); - System.out.println(Arrays.toString(primes)); - } - - @Test - public void getPerfectNumbers() throws Exception { - int[] primes = ArrayUtil.getPerfectNumbers(10000); - System.out.println(Arrays.toString(primes)); - } - - @Test - public void join() throws Exception { - int [] array= {3,8,9}; - String seperator = "-"; - String result = ArrayUtil.join(array, seperator); - System.out.println(result); - } - - - - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java deleted file mode 100644 index f93876522a..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/ArrayListTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.pan.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Pan on 2017/2/26. - */ -public class ArrayListTest { - - ArrayList arrayList; - - @Before - public void before(){ - arrayList = new ArrayList(); - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - } - - @Test - public void add() throws Exception { - ArrayList arrayList = new ArrayList(); - arrayList.add(3); - System.out.println(arrayList); - } - - @Test - public void set() throws Exception { - arrayList.add(3); - arrayList.set(0, 4); - System.out.println(arrayList); - } - - @Test - public void get() throws Exception { - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - Object o = arrayList.get(1); - System.out.println(o); - } - - @Test - public void remove() throws Exception { - arrayList.add(1); - arrayList.add(2); - arrayList.add(3); - arrayList.remove(1); - System.out.println(arrayList); - } - - @Test - public void size() throws Exception { - System.out.println(arrayList.size()); - } - - @Test - public void isEmpty() throws Exception { - System.out.println(arrayList.isEmpty()); - } - - @Test - public void iterator() throws Exception { - Iterator iterator = arrayList.iterator(); - while (iterator.hasNext()){ - Object next = iterator.next(); - System.out.println(next); - iterator.remove(); - } - System.out.println(arrayList.isEmpty()); - } - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java deleted file mode 100644 index 4c3c01cd73..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/BinaryTreeNodeTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.pan.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Pan on 2017/2/26. - */ -public class BinaryTreeNodeTest { - - BinaryTreeNode binaryTreeNode; - - @Before - public void setUp() throws Exception { - binaryTreeNode = new BinaryTreeNode(); - binaryTreeNode.push(1, "A"); - binaryTreeNode.push(2, "B"); - binaryTreeNode.push(3, "C"); - binaryTreeNode.push(4, "D"); - } - - @Test - public void size() throws Exception { - System.out.println(binaryTreeNode.size()); - } - - @Test - public void get() throws Exception { - System.out.println(binaryTreeNode.get(3)); - } - - @Test - public void push() throws Exception { - binaryTreeNode.push(5, "E"); - System.out.println(binaryTreeNode); - } - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java deleted file mode 100644 index 135e052218..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/LinkedListTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.pan.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Pan on 2017/2/26. - */ -public class LinkedListTest { - - org.pan.coding2017.basic2.LinkedList linkedList; - - @Before - public void setUp() throws Exception { - linkedList = new org.pan.coding2017.basic2.LinkedList(); - linkedList.add(0); - linkedList.add(1); - linkedList.add(2); - linkedList.add(3); - } - - @Test - public void add() throws Exception { - linkedList.add(0); - System.out.println(linkedList); - } - - @Test - public void get() throws Exception { - Object o = linkedList.get(1); - System.out.println(o); - } - - @Test - public void remove() throws Exception { - linkedList.remove(1); - System.out.println(linkedList); - } - - @Test - public void size() throws Exception { - System.out.println(linkedList.size()); - } - - @Test - public void addFirst() throws Exception { - linkedList.addFirst(4); - System.out.println(linkedList); - } - - @Test - public void addLast() throws Exception { - linkedList.addLast(5); - System.out.println(linkedList); - } - - @Test - public void removeFirst() throws Exception { - linkedList.removeFirst(); - System.out.println(linkedList); - } - - @Test - public void removeLast() throws Exception { - linkedList.removeLast(); - System.out.println(linkedList); - } - - @Test - public void iterator() throws Exception { - Iterator iterator = linkedList.iterator(); - while (iterator.hasNext()){ - Object next = iterator.next(); - System.out.println(next); - iterator.remove(); - } - System.out.println(linkedList); - } - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java deleted file mode 100644 index c720e7d95e..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/QueueTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.pan.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Pan on 2017/2/26. - */ -public class QueueTest { - - Queue queue; - - @Before - public void setUp() throws Exception { - queue = new Queue(); - queue.enQueue(1); - queue.enQueue(2); - queue.enQueue(3); - - } - - @Test - public void enQueue() throws Exception { - queue.enQueue(1); - System.out.println(queue); - } - - @Test - public void deQueue() throws Exception { - queue.deQueue(); - System.out.println(queue); - } - - @Test - public void isEmpty() throws Exception { - System.out.println(queue.isEmpty()); - } - - @Test - public void size() throws Exception { - System.out.println(queue.size()); - } - -} \ No newline at end of file diff --git a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java b/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java deleted file mode 100644 index df85b797d4..0000000000 --- a/group11/252308879/dataStructure/src/test/java/org/pan/coding2017/basic/StackTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.pan.coding2017.basic; - -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Pan on 2017/2/26. - */ -public class StackTest { - - Stack stack; - - @Before - public void setUp() throws Exception { - stack = new Stack(3); - stack.push(1); - stack.push(2); - stack.push(3); - } - - @Test - public void isEmpty() throws Exception { - System.out.println(stack.isEmpty()); - } - - @Test - public void size() throws Exception { - System.out.println(stack.size()); - } - - @Test - public void push() throws Exception { - stack.push(1); - stack.push(2); - stack.push(3); - System.out.println(stack); - } - - @Test - public void pop() throws Exception { - stack.pop(); - System.out.println(stack); - } - -} \ No newline at end of file diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/alg/LRUPageFrame.java b/group11/252308879/mini-jvm/src/main/java/com/pan/alg/LRUPageFrame.java deleted file mode 100644 index d9455d3807..0000000000 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/alg/LRUPageFrame.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.pan.alg; - - -/* - * 用双向链表实现LRU算法 - */ -public class LRUPageFrame { - private static class Node{ - Node prev; - Node next; - int pageNum = -1;// 物理页 - - Node(){ - - } - } - - private int capacity; - - private Node first;// 链表头 - private Node last;// 链表尾 - boolean tag = false; - - public LRUPageFrame(int capacity){ - this.capacity = capacity; - - for(int i = 0; i < capacity; i++){ - Node curNode = new Node(); - if(null == first){ - last = first = curNode; - }else{ - last.next = curNode; - curNode.prev = last; - last = last.next; - } - last.next = null; - } - } - public void printList(){ - Node curNode = first; - while(curNode != null){ - curNode = curNode.next; - } - } - /* - * 获取缓存中对象 - * @param key - * @return - */ - public void access(int pageNum){ - printList(); - Node index = findLogicPage(pageNum); - modifyPhysicalPage(index,pageNum); - } - - /* - * @param pageNum 表示要查询的逻辑页面 - * @return 若在物理页中找到要查询的逻辑页面,则返回该物理页节点的引用,否则返回null - */ - public Node findLogicPage(int pageNum){ - - Node index = null; - Node curNode = first; - while(curNode != null){ - if(curNode.pageNum == pageNum){ - index = curNode; - tag = true; - } - curNode = curNode.next; - } - return index; - } - /* - * @prama index 代表了 有逻辑页的物理页的节点的引用 - */ - public void modifyPhysicalPage(Node index,int pageNum){ - push(pageNum,index); - } - /* - * @param pageNum 要 push的逻辑页面, 默认栈顶是 first, bottom 栈底 指定了栈的大小 - */ - public void push(int pageNum,Node bottom){ - Node index = checkWhichListNodeNotUsed(); - if(index != null){ - index.pageNum = pageNum; - return; - } - - Node lastNode; - if(null == bottom){ - lastNode = last; - }else{ - lastNode = bottom; - } - Node curNode = lastNode.prev; - while(curNode != null){ - lastNode.pageNum = curNode.pageNum; - lastNode = curNode; - curNode = curNode.prev; - } - lastNode.pageNum = pageNum; - return; - } - - /* - * @return 返回物理页中 pageNum 没有被使用的节点的引用(返回栈中最下面的),如果全部都被使用,则返回 null - */ - public Node checkWhichListNodeNotUsed(){ - Node node = first; - Node index = null; - while(node != null){ - if(node.pageNum == -1){ - index = node; - } - node = node.next; - } - return index; - } - - public String toString(){ - StringBuffer buffer = new StringBuffer(); - Node node = first; - while(node != null){ - buffer.append(node.pageNum); - - node = node.next; - if(node != null){ - buffer.append(","); - } - } - return buffer.toString(); - } -} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/alg/StackUtil.java b/group11/252308879/mini-jvm/src/main/java/com/pan/alg/StackUtil.java deleted file mode 100644 index 01a7f2da52..0000000000 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/alg/StackUtil.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.pan.alg; - - -import java.util.Stack; - -/** - * Created by QiPan on 2017/4/12. - */ -public class StackUtil { - - public static void bad_reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack<>(); - while(!s.isEmpty()){ - tmpStack.push(s.pop()); - } - - s = tmpStack; - - } - - /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - */ - public static void reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - Integer top = s.pop(); - reverse(s); - addToBottom(s,top); - - - } - public static void addToBottom(Stack s, Integer value){ - if(s.isEmpty()){ - s.push(value); - } else{ - Integer top = s.pop(); - addToBottom(s,value); - s.push(top); - } - - } - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s,Object o) { - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack(); - - while(!s.isEmpty()){ - Object value = s.pop(); - if(!value.equals(o)){ - tmpStack.push(value); - } - } - - while(!tmpStack.isEmpty()){ - s.push(tmpStack.pop()); - } - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param len - * @return - */ - public static Object[] getTop(Stack s,int len) { - - if(s == null || s.isEmpty() || s.size() stack = new Stack<>(); - for(int i=0;i codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/CommandParser.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..a410ab2e85 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/CommandParser.java @@ -0,0 +1,129 @@ +package com.pan.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.pan.jvm.clz.ClassFile; + +public class CommandParser { + + + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + + } + + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + + if (ByteCodeCommand.new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (ByteCodeCommand.invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + // System.out.println( cmd.toString(clzFile.getConstPool())); + cmds.add(cmd); + } else if (ByteCodeCommand.invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + + cmds.add(cmd); + } else if (ByteCodeCommand.getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.dup.equals(opCode) + || ByteCodeCommand.aload_0.equals(opCode) + || ByteCodeCommand.aload_1.equals(opCode) + || ByteCodeCommand.aload_2.equals(opCode) + || ByteCodeCommand.iload_1.equals(opCode) + || ByteCodeCommand.iload_2.equals(opCode) + || ByteCodeCommand.iload_3.equals(opCode) + || ByteCodeCommand.fload_3.equals(opCode) + || ByteCodeCommand.voidreturn.equals(opCode) + || ByteCodeCommand.astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/GetFieldCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..a54a2f5fb8 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,38 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.FieldRefInfo; +import com.pan.jvm.engine.ExecutionResult; +import com.pan.jvm.engine.JavaObject; +import com.pan.jvm.engine.StackFrame; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String fieldName = fieldRef.getFieldName(); + JavaObject jo = frame.getOprandStack().pop(); + JavaObject fieldValue = jo.getFieldValue(fieldName); + + frame.getOprandStack().push(fieldValue); + + + + } + + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/GetStaticFieldCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..0e44f1d8d5 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,42 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ClassInfo; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.FieldRefInfo; +import com.pan.jvm.constant.UTF8Info; +import com.pan.jvm.engine.ExecutionResult; +import com.pan.jvm.engine.Heap; +import com.pan.jvm.engine.JavaObject; +import com.pan.jvm.engine.StackFrame; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + String className = info.getClassName(); + String fieldName = info.getFieldName(); + String fieldType = info.getFieldType(); + + if("java/lang/System".equals(className) + && "out".equals(fieldName) + && "Ljava/io/PrintStream;".equals(fieldType)){ + JavaObject jo = Heap.getInstance().newObject(className); + frame.getOprandStack().push(jo); + } + //TODO 处理非System.out的情况 + } +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/InvokeSpecialCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..7cb42656eb --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,47 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.MethodRefInfo; +import com.pan.jvm.engine.ExecutionResult; +import com.pan.jvm.engine.MethodArea; +import com.pan.jvm.engine.StackFrame; +import com.pan.jvm.method.Method; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + // 我们不用实现jang.lang.Object 的init方法 + if(methodRefInfo.getClassName().equals("java/lang/Object") + && methodRefInfo.getMethodName().equals("")){ + return ; + + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); + + + + } + + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/InvokeVirtualCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..ff43748c0d --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,86 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.MethodRefInfo; +import com.pan.jvm.engine.ExecutionResult; +import com.pan.jvm.engine.JavaObject; +import com.pan.jvm.engine.MethodArea; +import com.pan.jvm.engine.StackFrame; +import com.pan.jvm.method.Method; + + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsMethod(); + } + + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); + } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if(isSystemOutPrintlnMethod(className,methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + + MethodArea ma = MethodArea.getInstance(); + + Method m = null; + + String currentClassName = jo.getClassName(); + + while(currentClassName != null){ + + ClassFile currentClassFile = ma.findClassFile(currentClassName); + + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + + break; + + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + + result.setNextMethod(m); + } + + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/LdcCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..a42b80a9b3 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/LdcCmd.java @@ -0,0 +1,50 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ConstantInfo; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.StringInfo; +import com.pan.jvm.engine.ExecutionResult; +import com.pan.jvm.engine.Heap; +import com.pan.jvm.engine.JavaObject; +import com.pan.jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + ConstantInfo info = getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + public void execute(StackFrame frame,ExecutionResult result){ + + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } + + + } +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/NewObjectCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..a5621d0f0d --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,39 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ClassInfo; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.engine.ExecutionResult; +import com.pan.jvm.engine.Heap; +import com.pan.jvm.engine.JavaObject; +import com.pan.jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsClassInfo(); + } + public void execute(StackFrame frame,ExecutionResult result){ + + int index = this.getIndex(); + + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + + String clzName = info.getClassName(); + + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); + + + + } + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/NoOperandCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..0605c466bd --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,146 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.engine.ExecutionResult; +import com.pan.jvm.engine.Heap; +import com.pan.jvm.engine.JavaObject; +import com.pan.jvm.engine.StackFrame; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString() { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + + + } + + + public int getLength(){ + return 1; + } + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/OneOperandCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..850d3e8d0b --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/PutFieldCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..ddd6007d46 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,44 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ClassInfo; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.FieldRefInfo; +import com.pan.jvm.constant.NameAndTypeInfo; +import com.pan.jvm.engine.ExecutionResult; +import com.pan.jvm.engine.JavaObject; +import com.pan.jvm.engine.StackFrame; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString() { + + return super.getOperandAsField(); + } + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); + + } + + + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/TwoOperandCmd.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..03771eabae --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.pan.jvm.cmd; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ClassInfo; +import com.pan.jvm.constant.ConstantInfo; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.FieldRefInfo; +import com.pan.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ClassInfo.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ClassInfo.java index b842755586..84b00f189d 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ClassInfo.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ClassInfo.java @@ -2,27 +2,27 @@ public class ClassInfo extends ConstantInfo { private int type = ConstantInfo.CLASS_INFO; - private int utf8Index; - + 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); + UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ConstantInfo.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ConstantInfo.java index 464e44a79d..cc5fa84388 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ConstantInfo.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ConstantInfo.java @@ -28,4 +28,16 @@ public ConstantInfo getConstantInfo(int index) { return this.constantPool.getConstantInfo(index); } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } + } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ConstantPool.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ConstantPool.java index c2da2637c5..f612dd6289 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ConstantPool.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/ConstantPool.java @@ -26,7 +26,7 @@ public String getUTF8String(int index) { return ((UTF8Info) this.constantInfos.get(index)).getValue(); } - public Object getSize() { - return this.constantInfos.size() - 1; + public int getSize() { + return this.constantInfos.size() -1; } } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/FieldRefInfo.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/FieldRefInfo.java index 2aaced31d3..80e7a4054d 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/FieldRefInfo.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/FieldRefInfo.java @@ -8,7 +8,6 @@ public class FieldRefInfo extends ConstantInfo { public FieldRefInfo(ConstantPool pool) { super(pool); } - public int getType() { return type; } @@ -16,43 +15,44 @@ public int getType() { 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() { + public String toString(){ - NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); - return getClassName() + " : " + typeInfo.getName() + ":" + typeInfo.getTypeInfo() + "]"; + return getClassName() +" : "+ typeInfo.getName() + ":" + typeInfo.getTypeInfo() +"]"; } - public String getClassName() { + public String getClassName(){ ClassInfo classInfo = (ClassInfo) this.getConstantInfo(this.getClassInfoIndex()); - UTF8Info utf8Info = (UTF8Info) this.getConstantInfo(classInfo.getUtf8Index()); + UTF8Info utf8Info = (UTF8Info)this.getConstantInfo(classInfo.getUtf8Index()); return utf8Info.getValue(); } - public String getFieldName() { - NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); + public String getFieldName(){ + NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getName(); } - public String getFieldType() { - NameAndTypeInfo typeInfo = (NameAndTypeInfo) this.getConstantInfo(this.getNameAndTypeIndex()); + public String getFieldType(){ + NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/MethodRefInfo.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/MethodRefInfo.java index a3e6f969b0..00df28d40d 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/MethodRefInfo.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/MethodRefInfo.java @@ -2,6 +2,7 @@ public class MethodRefInfo extends ConstantInfo { + private int type = ConstantInfo.METHOD_INFO; private int classInfoIndex; @@ -18,41 +19,44 @@ public int getType() { 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() { + public String toString(){ - return getClassName() + " : " + this.getMethodName() + " : " + this.getParamAndReturnType(); + return getClassName() +" : "+ this.getMethodName() + " : " + this.getParamAndReturnType() ; } - - public String getClassName() { + public String getClassName(){ ConstantPool pool = this.getConstantPool(); - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(this.getClassInfoIndex()); + ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex()); return clzInfo.getClassName(); } - public String getMethodName() { + public String getMethodName(){ ConstantPool pool = this.getConstantPool(); - NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getName(); } - public String getParamAndReturnType() { + public String getParamAndReturnType(){ ConstantPool pool = this.getConstantPool(); - NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/NameAndTypeInfo.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/NameAndTypeInfo.java index 30be83ef3a..d530f9f0c5 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/NameAndTypeInfo.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/NameAndTypeInfo.java @@ -1,7 +1,7 @@ package com.pan.jvm.constant; public class NameAndTypeInfo extends ConstantInfo { - public int type = ConstantInfo.NAME_AND_TYPE_INFO; + public int type = ConstantInfo.NAME_AND_TYPE_INFO; private int index1; private int index2; @@ -13,37 +13,39 @@ public NameAndTypeInfo(ConstantPool 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() { + public String getName(){ ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info1 = (UTF8Info) pool.getConstantInfo(index1); + UTF8Info utf8Info1 = (UTF8Info)pool.getConstantInfo(index1); return utf8Info1.getValue(); } - public String getTypeInfo() { + public String getTypeInfo(){ ConstantPool pool = this.getConstantPool(); - UTF8Info utf8Info2 = (UTF8Info) pool.getConstantInfo(index2); + UTF8Info utf8Info2 = (UTF8Info)pool.getConstantInfo(index2); return utf8Info2.getValue(); } - public String toString() { - return "(" + getName() + "," + getTypeInfo() + ")"; + public String toString(){ + return "(" + getName() + "," + getTypeInfo()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/NullConstantInfo.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/NullConstantInfo.java index cc6989bef7..d9d0c40b01 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/NullConstantInfo.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/NullConstantInfo.java @@ -2,13 +2,16 @@ public class NullConstantInfo extends ConstantInfo { - public NullConstantInfo() { + public NullConstantInfo(){ } - @Override public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/StringInfo.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/StringInfo.java index ad3f397949..d807321152 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/StringInfo.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/StringInfo.java @@ -3,7 +3,6 @@ public class StringInfo extends ConstantInfo { private int type = ConstantInfo.STRING_INFO; private int index; - public StringInfo(ConstantPool pool) { super(pool); } @@ -15,14 +14,18 @@ public int getType() { public int getIndex() { return index; } - public void setIndex(int index) { this.index = index; } - public String toString() { + public String toString(){ return this.getConstantPool().getUTF8String(index); } + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/UTF8Info.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/UTF8Info.java index 502adae968..d867b436e6 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/UTF8Info.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/constant/UTF8Info.java @@ -2,37 +2,35 @@ public class UTF8Info extends ConstantInfo { private int type = ConstantInfo.UTF8_INFO; - private int length; + 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 + ")]"; + return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; } - public String getValue() { return value; } - public void setValue(String value) { this.value = value; } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/ExecutionResult.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..f33eaef159 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.pan.jvm.engine; + +import com.pan.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/ExecutorEngine.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..fdf4c48647 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/ExecutorEngine.java @@ -0,0 +1,83 @@ +package com.pan.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.pan.jvm.attr.CodeAttr; +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.cmd.ByteCodeCommand; +import com.pan.jvm.constant.MethodRefInfo; +import com.pan.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); + + while(!stack.empty()){ + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if(result.isPauseAndRunNewFrame()){ + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame,nextFrame); + + stack.push(nextFrame); + + } else { + + stack.pop(); + + } + } + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + Method nextMethod = nextFrame.getMethod(); + + + List paramList = nextMethod.getParameterList(); + + //加上1 是因为要把this也传递过去 + + int paramNum = paramList.size() + 1; + + + List values = new ArrayList(); + + //数据结构知识: 从栈中取出栈顶的x个元素 + while(paramNum>0){ + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + //数据结构知识: 把一个列表倒序排列 + List params = new ArrayList(); + + for(int i=values.size()-1; i>=0 ;i--){ + params.add(values.get(i)); + } + + + nextFrame.setLocalVariableTable(params); + + } + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/Heap.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/Heap.java new file mode 100644 index 0000000000..82ba9d52f5 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.pan.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/JavaObject.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..cbe790796b --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.pan.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/MethodArea.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..774968a48a --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/MethodArea.java @@ -0,0 +1,88 @@ +package com.pan.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.MethodRefInfo; +import com.pan.jvm.loader.ClassFileLoader; +import com.pan.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if(m == null){ + + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + + } +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/MiniJVM.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..84e6403e5d --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.pan.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.pan.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i operands = new ArrayList(); + + public void push(JavaObject jo){ + operands.add(jo); + } + public JavaObject pop(){ + int index = size()-1; + JavaObject jo = (JavaObject)operands.get(index); + operands.remove(index); + return jo; + + } + public JavaObject top(){ + int index = size()-1; + return (JavaObject)operands.get(index); + } + public int size(){ + return operands.size(); + } +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/StackFrame.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/StackFrame.java new file mode 100644 index 0000000000..6603e1e1d1 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/engine/StackFrame.java @@ -0,0 +1,131 @@ +package com.pan.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.pan.jvm.cmd.ByteCodeCommand; +import com.pan.jvm.method.Method; + +public class StackFrame { + + private List localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/method/Method.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/method/Method.java index 0fbb0f0946..0c0510426e 100644 --- a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/method/Method.java +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/method/Method.java @@ -4,8 +4,13 @@ import com.pan.jvm.attr.AttributeInfo; import com.pan.jvm.attr.CodeAttr; import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.cmd.ByteCodeCommand; +import com.pan.jvm.constant.UTF8Info; import com.pan.jvm.loader.ByteCodeIterator; +import java.util.ArrayList; +import java.util.List; + public class Method { private int accessFlag; @@ -68,4 +73,71 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } + + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } + + private String getParamAndReturnType(){ + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile() + .getConstantPool().getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + public List getParameterList(){ + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } + + + } diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ClassFilePrinter.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..1d2d966358 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ClassFilePrinter.java @@ -0,0 +1,54 @@ +package com.pan.jvm.print; + +import com.pan.jvm.clz.ClassFile; +import com.pan.jvm.constant.ClassInfo; +import com.pan.jvm.constant.ConstantInfo; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.FieldRefInfo; +import com.pan.jvm.constant.MethodRefInfo; +import com.pan.jvm.constant.NameAndTypeInfo; + +import com.pan.jvm.constant.StringInfo; +import com.pan.jvm.constant.UTF8Info; +import com.pan.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.pan.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ConstantPoolPrinter.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..29d6416874 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,83 @@ +package com.pan.jvm.print; + +import com.pan.jvm.constant.ClassInfo; +import com.pan.jvm.constant.ConstantInfo; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.FieldRefInfo; +import com.pan.jvm.constant.MethodRefInfo; +import com.pan.jvm.constant.NameAndTypeInfo; +import com.pan.jvm.constant.StringInfo; +import com.pan.jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + + for(int i=1; i<=pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } + } +} diff --git a/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ConstantPoolPrinterBad.java b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ConstantPoolPrinterBad.java new file mode 100644 index 0000000000..8d703f83f7 --- /dev/null +++ b/group11/252308879/mini-jvm/src/main/java/com/pan/jvm/print/ConstantPoolPrinterBad.java @@ -0,0 +1,40 @@ +package com.pan.jvm.print; + +import com.pan.jvm.constant.ClassInfo; +import com.pan.jvm.constant.ConstantInfo; +import com.pan.jvm.constant.ConstantPool; +import com.pan.jvm.constant.UTF8Info; + +public class ConstantPoolPrinterBad { + ConstantPool pool; + ConstantPoolPrinterBad(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + for(int i=1; i<=pool.getSize(); i++){ + ConstantInfo cnstInfo = pool.getConstantInfo(i); + + System.out.print("#"+i+"="); + if(cnstInfo instanceof ClassInfo){ + ClassInfo info = (ClassInfo)cnstInfo; + // Class #2 com/pan/jvm/test/EmployeeV1 + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + } + if(cnstInfo instanceof UTF8Info){ + //UTF8 com/pan/jvm/test/EmployeeV1 + UTF8Info info = (UTF8Info)cnstInfo; + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + } + //其他的if else + } + } +} diff --git a/group11/252308879/mini-jvm/src/test/java/com/pan/MapForEachTest.java b/group11/252308879/mini-jvm/src/test/java/com/pan/MapForEachTest.java deleted file mode 100644 index 9170ba4f49..0000000000 --- a/group11/252308879/mini-jvm/src/test/java/com/pan/MapForEachTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.pan; - -import org.junit.Test; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by QiPan on 2017/4/19. - */ -public class MapForEachTest { - - @Test - public void testForEach(){ - - Map map = new HashMap<>(); - map.put(1, 11); - map.put(2, 22); - map.put(3, 33); - - Map map2 = new HashMap<>(); - map.forEach((key, value) -> map2.put(key, value.toString())); - - System.out.println(map2); - - - - } - -} diff --git a/group11/252308879/mini-jvm/src/test/java/com/pan/jvm/ClassFileLoaderTest.java b/group11/252308879/mini-jvm/src/test/java/com/pan/jvm/ClassFileLoaderTest.java index d341553c70..79cda03ea3 100644 --- a/group11/252308879/mini-jvm/src/test/java/com/pan/jvm/ClassFileLoaderTest.java +++ b/group11/252308879/mini-jvm/src/test/java/com/pan/jvm/ClassFileLoaderTest.java @@ -4,255 +4,331 @@ import com.pan.jvm.clz.ClassFile; import com.pan.jvm.clz.ClassIndex; +import com.pan.jvm.cmd.BiPushCmd; +import com.pan.jvm.cmd.ByteCodeCommand; +import com.pan.jvm.cmd.OneOperandCmd; +import com.pan.jvm.cmd.TwoOperandCmd; import com.pan.jvm.constant.*; import com.pan.jvm.field.Field; import com.pan.jvm.loader.ClassFileLoader; import com.pan.jvm.method.Method; import com.pan.jvm.util.Util; import org.junit.After; -import org.junit.Assert; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; +public class ClassFileLoaderTest { + private static final String FULL_QUALIFIED_CLASS_NAME = "com/pan/jvm/EmployeeV1"; + static String path1 = EmployeeV1.class.getClassLoader().getResource("").getPath() + .replace("test-classes", "classes"); + static String path2 = "C:/temp"; + + static ClassFile clzFile = null; + + static { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.pan.jvm.EmployeeV1"; + + clzFile = loader.loadClass(className); + clzFile.print(); + } + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1 + ";" + path2, clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.pan.jvm.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1032, byteCodes.length); + + } + + + @Test + public void testMagicNumber() { + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.pan.jvm.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0], byteCodes[1], byteCodes[2], byteCodes[3]}; + + + String actualValue = Util.byteToHexString(codes); + + Assert.assertEquals("cafebabe", actualValue); + } -public class ClassFileLoaderTest { - - private static final String FULL_QUALIFIED_CLASS_NAME = "com/pan/jvm/EmployeeV1"; - - static String path1 = EmployeeV1.class.getClassLoader().getResource("").getPath() - .replace("test-classes", "classes"); - static String path2 = "C:/temp"; - - static ClassFile clzFile = null; - static { - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.pan.jvm.EmployeeV1"; - - clzFile = loader.loadClass(className); - clzFile.print(); - } - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "com.pan.jvm.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1032, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.pan.jvm.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String actualValue = Util.byteToHexString(codes); - - Assert.assertEquals("cafebabe", actualValue); - } - - /** * ---------------------------------------------------------------------- */ @Test - public void testVersion(){ - Assert.assertEquals(0, clzFile.getMinorVersion()); - Assert.assertEquals(52, clzFile.getMajorVersion()); + public void testVersion() { + Assert.assertEquals(0, clzFile.getMinorVersion()); + Assert.assertEquals(52, clzFile.getMajorVersion()); } @Test - public void testConstantPool(){ - - - ConstantPool pool = clzFile.getConstantPool(); - - Assert.assertEquals(53, pool.getSize()); - - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); - Assert.assertEquals(2, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); - Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); - } - { - ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); - Assert.assertEquals(4, clzInfo.getUtf8Index()); - - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); - Assert.assertEquals("java/lang/Object", utf8Info.getValue()); - } - { - UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); - Assert.assertEquals("name", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(6); - Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(7); - Assert.assertEquals("age", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(8); - Assert.assertEquals("I", utf8Info.getValue()); - - utf8Info = (UTF8Info) pool.getConstantInfo(9); - Assert.assertEquals("", 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()); - } + public void testConstantPool() { + + + ConstantPool pool = clzFile.getConstantPool(); + + Assert.assertEquals(53, pool.getSize()); + + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(1); + Assert.assertEquals(2, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(2); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, utf8Info.getValue()); + } + { + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(3); + Assert.assertEquals(4, clzInfo.getUtf8Index()); + + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(4); + Assert.assertEquals("java/lang/Object", utf8Info.getValue()); + } + { + UTF8Info utf8Info = (UTF8Info) pool.getConstantInfo(5); + Assert.assertEquals("name", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(6); + Assert.assertEquals("Ljava/lang/String;", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(7); + Assert.assertEquals("age", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(8); + Assert.assertEquals("I", utf8Info.getValue()); + + utf8Info = (UTF8Info) pool.getConstantInfo(9); + Assert.assertEquals("", 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(){ + public void testClassIndex() { - ClassIndex clzIndex = clzFile.getClzIndex(); - ClassInfo thisClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getThisClassIndex()); - ClassInfo superClassInfo = (ClassInfo)clzFile.getConstantPool().getConstantInfo(clzIndex.getSuperClassIndex()); + 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()); + Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); + Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } /** * 下面是第三次JVM课应实现的测试用例 */ @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } + public void testReadFields() { + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + + @Test + public void testMethods() { + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool, m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool, m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool, m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool, m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool, m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool, Method m, String expectedName, String expectedDesc, String expectedCode) { + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); } + @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } + public void testByteCodeCommand() { + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand[] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand[] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand[] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + } - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd) { + + String acctual = cmd.getOffset() + ": " + cmd.getReadableCodeText(); + + if (cmd instanceof OneOperandCmd) { + if (cmd instanceof BiPushCmd) { + acctual += " " + ((OneOperandCmd) cmd).getOperand(); + } else { + acctual += " #" + ((OneOperandCmd) cmd).getOperand(); + } + } + if (cmd instanceof TwoOperandCmd) { + acctual += " #" + ((TwoOperandCmd) cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); } - } diff --git a/group11/252308879/mini-jvm/src/test/java/com/pan/jvm/MiniJVMTest.java b/group11/252308879/mini-jvm/src/test/java/com/pan/jvm/MiniJVMTest.java new file mode 100644 index 0000000000..b403aa0e56 --- /dev/null +++ b/group11/252308879/mini-jvm/src/test/java/com/pan/jvm/MiniJVMTest.java @@ -0,0 +1,33 @@ +package com.pan.jvm; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.pan.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + + private static final String FULL_QUALIFIED_CLASS_NAME = "com/pan/jvm/EmployeeV1"; + + static String PATH = EmployeeV1.class.getClassLoader().getResource("").getPath() + .replace("test-classes", "classes"); + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.pan.jvm.EmployeeV1"); + + } + +} From a72a8a6063d87c509c41cab5267302d8629f14dd Mon Sep 17 00:00:00 2001 From: Haochen Date: Sun, 7 May 2017 19:23:41 +0800 Subject: [PATCH 462/552] finish Josephus question --- .../java/algorithm/stack/QuickMinStack.java | 48 ++ .../algorithm/stack/StackWithTwoQueues.java | 21 + .../algorithm/stack/TwoStackInOneArray.java | 114 ++++ .../java/datastructure/basic/ArrayList.java | 17 +- .../java/datastructure/basic/LinkedList.java | 573 +++++++++--------- .../main/java/datastructure/basic/List.java | 21 +- .../main/java/datastructure/basic/Queue.java | 2 +- .../main/java/datastructure/basic/Stack.java | 2 +- .../java/algorithm/queue/JosephusTest.java | 0 9 files changed, 513 insertions(+), 285 deletions(-) create mode 100644 group01/895457260/code/src/main/java/algorithm/stack/QuickMinStack.java create mode 100644 group01/895457260/code/src/main/java/algorithm/stack/StackWithTwoQueues.java create mode 100644 group01/895457260/code/src/main/java/algorithm/stack/TwoStackInOneArray.java rename group01/895457260/code/src/{main => test}/java/algorithm/queue/JosephusTest.java (100%) diff --git a/group01/895457260/code/src/main/java/algorithm/stack/QuickMinStack.java b/group01/895457260/code/src/main/java/algorithm/stack/QuickMinStack.java new file mode 100644 index 0000000000..2340f36c7f --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/stack/QuickMinStack.java @@ -0,0 +1,48 @@ +package algorithm.stack; + +import datastructure.basic.Iterator; +import datastructure.basic.LinkedList; + +import java.util.EmptyStackException; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * + * @author liuxin + */ +public class QuickMinStack { + private LinkedList elements = new LinkedList(); + private LinkedList sorted = new LinkedList(); + + public void push(int data) { + elements.addFirst(data); + insert(sorted, data); + } + + private void insert(LinkedList sorted, int data) { + Iterator iterator = sorted.iterator(); + + int insertPos = 0; + while (iterator.hasNext()) { + if ((int) iterator.next() >= data) { + break; + } + insertPos++; + } + sorted.add(insertPos, data); + } + + public int pop() { + if (elements.isEmpty()) { + throw new EmptyStackException(); + } + int peek = (int) elements.removeFirst(); + sorted.remove(sorted.indexOf(peek)); + return peek; + } + + public int findMin() { + return (int) sorted.get(0); + } +} diff --git a/group01/895457260/code/src/main/java/algorithm/stack/StackWithTwoQueues.java b/group01/895457260/code/src/main/java/algorithm/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..a069f3c87f --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/stack/StackWithTwoQueues.java @@ -0,0 +1,21 @@ +package algorithm.stack; + + +import datastructure.basic.Queue; + +public class StackWithTwoQueues { + + private Queue queue1 = new Queue(); + private Queue queue2 = new Queue(); + + public void push(int data) { + queue1.enQueue(data); + } + + public int pop() { + for (int i = 0; i < queue1.size() - 1; ++i) { + queue1.enQueue(queue1.deQueue()); + } + return (int) queue1.deQueue(); + } +} diff --git a/group01/895457260/code/src/main/java/algorithm/stack/TwoStackInOneArray.java b/group01/895457260/code/src/main/java/algorithm/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..099d2b424d --- /dev/null +++ b/group01/895457260/code/src/main/java/algorithm/stack/TwoStackInOneArray.java @@ -0,0 +1,114 @@ +package algorithm.stack; + +import java.util.Arrays; +import java.util.EmptyStackException; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * + * @author liuxin + */ +public class TwoStackInOneArray { + private Object[] data = new Object[10]; + + private int top1 = 0; + private int top2 = data.length - 1; + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + ensureCapacity(); + data[top1++] = o; + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + if (top1 <= 0) { + throw new EmptyStackException(); + } + return data[--top1]; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + public Object peek1() { + if (top1 <= 0) { + throw new EmptyStackException(); + } + return data[top1 - 1]; + } + + public int size1() { + return top1 - 1; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + ensureCapacity(); + data[top2--] = o; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + if (top2 >= data.length - 1) { + throw new EmptyStackException(); + } + return data[++top2]; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + public Object peek2() { + if (top2 >= data.length - 1) { + throw new EmptyStackException(); + } + return data[top2 + 1]; + } + + public int size2() { + return data.length - top2 - 1; + } + + private void ensureCapacity() { + if (top1 > top2) { + int nextCapacity = nextCapacity(data.length); + Object[] newArray = new Object[nextCapacity]; + + System.arraycopy(data, 0, newArray, 0, size1()); + + int size2 = size2(); + int srcPos = data.length - size2; + int destPos = nextCapacity - size2; + System.arraycopy(data, srcPos, newArray, destPos, size2); + top2 = destPos - 1; + + Arrays.fill(data, null); + data = newArray; + } + } + + private int nextCapacity(int currentCapacity) { + return currentCapacity * 2; + } + +} diff --git a/group01/895457260/code/src/main/java/datastructure/basic/ArrayList.java b/group01/895457260/code/src/main/java/datastructure/basic/ArrayList.java index 82c6ac6b1c..badc19af2d 100644 --- a/group01/895457260/code/src/main/java/datastructure/basic/ArrayList.java +++ b/group01/895457260/code/src/main/java/datastructure/basic/ArrayList.java @@ -40,10 +40,25 @@ public Object remove(int index) { return removed; } - public int size() { + @Override + public int indexOf(Object o) { + for (int i = 0; i < size(); ++i) { + if (elementData[i] == null ? o == null : elementData[i].equals(o)) { + return i; + } + } + return -1; + } + + public int size() { return size; } + @Override + public boolean isEmpty() { + return size() == 0; + } + public Iterator iterator() { return new Iterator() { int index = -1; diff --git a/group01/895457260/code/src/main/java/datastructure/basic/LinkedList.java b/group01/895457260/code/src/main/java/datastructure/basic/LinkedList.java index 5dfa11fcb4..6510bd9d38 100644 --- a/group01/895457260/code/src/main/java/datastructure/basic/LinkedList.java +++ b/group01/895457260/code/src/main/java/datastructure/basic/LinkedList.java @@ -5,107 +5,124 @@ import java.util.Objects; public class LinkedList implements List { - - private Node head; - private int size; - public LinkedList() { - head = new Node(); + private Node head; + private int size; + + public LinkedList() { + head = new Node(); } @Override - public void add(Object o) { + public void add(Object o) { addLast(o); - } - - @Override - public void add(int index , Object o) { - Node pre = findNode(index - 1); - Node node = new Node(); - node.data = o; - addNode(node, pre); - } - - @Override - public Object get(int index) { - checkIndex(index); - return findNode(index).data; - } - - @Override - public Object remove(int index) { - checkIndex(index); - Node pre = findNode(index - 1); - Node removed = pre.next; - removeNode(removed, pre); - return removed.data; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o) { - Node node = new Node(); - node.data = o; - addNode(node, head); - } - - public void addLast(Object o) { + } + + @Override + public void add(int index, Object o) { + Node pre = findNode(index - 1); + Node node = new Node(); + node.data = o; + addNode(node, pre); + } + + @Override + public Object get(int index) { + checkIndex(index); + return findNode(index).data; + } + + @Override + public Object remove(int index) { + checkIndex(index); + Node pre = findNode(index - 1); + Node removed = pre.next; + removeNode(removed, pre); + return removed.data; + } + + @Override + public int indexOf(Object o) { + int i = 0; + for (Node node = head.next; node != null; node = node.next, ++i) { + if (node.data == null ? o == null : node.data.equals(o)) { + return i; + } + } + return -1; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size() == 0; + } + + public void addFirst(Object o) { + Node node = new Node(); + node.data = o; + addNode(node, head); + } + + public void addLast(Object o) { Node node = new Node(); node.data = o; Node pre = findNode(size() - 1); addNode(node, pre); - } - - public Object removeFirst() { - if (size() == 0) { - throw new EmptyListException(); - } - Node removed = head.next; - removeNode(head.next, head); - return removed.data; - } - - public Object removeLast() { - if (size() == 0) { - throw new EmptyListException(); - } - return remove(size() - 1); - } - - @Override - public Iterator iterator() { - return new Iterator() { - Node node = head; - @Override - public boolean hasNext() { - return node.next != null; - } - - @Override - public Object next() { - node = node.next; - return node.data; - } - }; - } - - private static class Node{ - Object data; - Node next; - } - - private Node findNode(int index) { - if (index == -1) { - return head; + } + + public Object removeFirst() { + if (size() == 0) { + throw new EmptyListException(); + } + Node removed = head.next; + removeNode(head.next, head); + return removed.data; + } + + public Object removeLast() { + if (size() == 0) { + throw new EmptyListException(); + } + return remove(size() - 1); + } + + @Override + public Iterator iterator() { + return new Iterator() { + Node node = head; + + @Override + public boolean hasNext() { + return node.next != null; + } + + @Override + public Object next() { + node = node.next; + return node.data; + } + }; + } + + private static class Node { + Object data; + Node next; + } + + private Node findNode(int index) { + if (index == -1) { + return head; } else { - checkIndex(index); + checkIndex(index); } Node node = head.next; for (int i = 0; i < index; ++i) { - node = node.next; + node = node.next; } return node; } @@ -121,197 +138,201 @@ private String indexOutOfBoundMessage(int index) { } private void addNode(Node node, Node pre) { - node.next = pre.next; - pre.next = node; - size++; + node.next = pre.next; + pre.next = node; + size++; } private void removeNode(Node node, Node pre) { - pre.next = node.next; - node.next = null; - size--; + pre.next = node.next; + node.next = null; + size--; + } + + //清空整条链,返回链中结点数量 + private int clearLink(Node start) { + int count = 0; + while (start != null) { + Node node = start; + start = start.next; + node.data = null; + node.next = null; + count++; + } + return count; + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + Stack stack = new Stack(); + for (Node node = head.next; node != null; node = node.next) { + stack.push(node); + } + head.next = (Node) stack.peek(); + while (stack.size() > 1) { + Node top = (Node) stack.pop(); + top.next = (Node) stack.peek(); + } + ((Node) stack.peek()).next = null; } - //清空整条链,返回链中结点数量 - private int clearLink(Node start) { - int count = 0; - while (start != null) { - Node node = start; - start = start.next; - node.data = null; - node.next = null; - count++; - } - return count; - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - Stack stack = new Stack(); - for (Node node = head.next; node != null; node = node.next) { - stack.push(node); - } - head.next = (Node) stack.peek(); - while (stack.size() > 1) { - Node top = (Node) stack.pop(); - top.next = (Node) stack.peek(); - } - ((Node) stack.peek()).next = null; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - int half = size() / 2; - if (half > 1) { - Node first = head.next; - - Node preHalf = findNode(half - 1); - head.next = preHalf.next; - preHalf.next = null; - size -= clearLink(first); - } - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length) { - if (length <= 0) { - return; - } - Node preI = findNode(i - 1); - Node removeTo = findNode(i + length - 1); - Node removeFrom = preI.next; - preI.next = removeTo.next; - removeTo.next = null; - size -= clearLink(removeFrom); - } - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public Object[] getElements(LinkedList list){ - Object[] result = new Object[list.size()]; - int count = 0; - - Node nodeI = head.next; - Node nodeJ = list.head.next; - for (int i = 0; nodeI != null && nodeJ != null; ++i) { - int compare = i - (int) nodeJ.data; - if (compare == 0) { - result[count] = nodeI.data; - count++; - nodeI = nodeI.next; - nodeJ = nodeJ.next; - } else if (compare < 0) { - nodeI = nodeI.next; - } else { - nodeJ = nodeJ.next; - i--; - } - } - Object[] trueResult = new Object[count]; - System.arraycopy(result, 0, trueResult, 0, count); - return trueResult; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在list中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - Node pre = head; - Node node = list.head.next; - while (pre.next != null && node != null) { - if ((int) pre.next.data < (int) node.data) { - pre = pre.next; - } else if ((int) pre.next.data > (int) node.data) { - node = node.next; - } else { - removeNode(pre.next, pre); - } - } - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - Node node = head; - while (node.next != null) { - if (Objects.equals(node.data, node.next.data)) { - removeNode(node.next, node); - } else { - node = node.next; - } - } - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - Node node = head; - while (node.next != null) { - int value = (int) node.next.data; - if (value <= min) { // 还未进入范围 - node = node.next; - } else if (value >= max) { // 超出范围,停止遍历 - break; - } else { // 在范围内,删除之 - removeNode(node.next, node); - } - } - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection(LinkedList list){ - LinkedList result = new LinkedList(); - Node inThis = head.next; - Node node = list.head.next; - int[] temp = new int[Math.min(size(), list.size())]; - int count = 0; - while (inThis != null && node != null) { - int compare = (int) inThis.data - (int) node.data; - if (compare < 0) { - inThis = inThis.next; - } else if (compare > 0) { - node = node.next; - } else { - temp[count] = (int) node.data; - count++; - inThis = inThis.next; - node = node.next; - } - } - for (int i = count - 1; i >= 0; --i) { - result.addFirst(temp[i]); - } - return result; - } + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf() { + int half = size() / 2; + if (half > 1) { + Node first = head.next; + + Node preHalf = findNode(half - 1); + head.next = preHalf.next; + preHalf.next = null; + size -= clearLink(first); + } + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + if (length <= 0) { + return; + } + Node preI = findNode(i - 1); + Node removeTo = findNode(i + length - 1); + Node removeFrom = preI.next; + preI.next = removeTo.next; + removeTo.next = null; + size -= clearLink(removeFrom); + } + + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + public Object[] getElements(LinkedList list) { + Object[] result = new Object[list.size()]; + int count = 0; + + Node nodeI = head.next; + Node nodeJ = list.head.next; + for (int i = 0; nodeI != null && nodeJ != null; ++i) { + int compare = i - (int) nodeJ.data; + if (compare == 0) { + result[count] = nodeI.data; + count++; + nodeI = nodeI.next; + nodeJ = nodeJ.next; + } else if (compare < 0) { + nodeI = nodeI.next; + } else { + nodeJ = nodeJ.next; + i--; + } + } + Object[] trueResult = new Object[count]; + System.arraycopy(result, 0, trueResult, 0, count); + return trueResult; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + * + * @param list + */ + + public void subtract(LinkedList list) { + Node pre = head; + Node node = list.head.next; + while (pre.next != null && node != null) { + if ((int) pre.next.data < (int) node.data) { + pre = pre.next; + } else if ((int) pre.next.data > (int) node.data) { + node = node.next; + } else { + removeNode(pre.next, pre); + } + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() { + Node node = head; + while (node.next != null) { + if (Objects.equals(node.data, node.next.data)) { + removeNode(node.next, node); + } else { + node = node.next; + } + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * + * @param min + * @param max + */ + public void removeRange(int min, int max) { + Node node = head; + while (node.next != null) { + int value = (int) node.next.data; + if (value <= min) { // 还未进入范围 + node = node.next; + } else if (value >= max) { // 超出范围,停止遍历 + break; + } else { // 在范围内,删除之 + removeNode(node.next, node); + } + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * + * @param list + */ + public LinkedList intersection(LinkedList list) { + LinkedList result = new LinkedList(); + Node inThis = head.next; + Node node = list.head.next; + int[] temp = new int[Math.min(size(), list.size())]; + int count = 0; + while (inThis != null && node != null) { + int compare = (int) inThis.data - (int) node.data; + if (compare < 0) { + inThis = inThis.next; + } else if (compare > 0) { + node = node.next; + } else { + temp[count] = (int) node.data; + count++; + inThis = inThis.next; + node = node.next; + } + } + for (int i = count - 1; i >= 0; --i) { + result.addFirst(temp[i]); + } + return result; + } } diff --git a/group01/895457260/code/src/main/java/datastructure/basic/List.java b/group01/895457260/code/src/main/java/datastructure/basic/List.java index 2f085701c5..a586c93982 100644 --- a/group01/895457260/code/src/main/java/datastructure/basic/List.java +++ b/group01/895457260/code/src/main/java/datastructure/basic/List.java @@ -1,10 +1,19 @@ package datastructure.basic; public interface List { - void add(Object o); - void add(int index, Object o); - Object get(int index); - Object remove(int index); - int size(); - Iterator iterator(); + void add(Object o); + + void add(int index, Object o); + + Object get(int index); + + Object remove(int index); + + int indexOf(Object o); + + int size(); + + boolean isEmpty(); + + Iterator iterator(); } diff --git a/group01/895457260/code/src/main/java/datastructure/basic/Queue.java b/group01/895457260/code/src/main/java/datastructure/basic/Queue.java index 247f2cf141..c46f47461f 100644 --- a/group01/895457260/code/src/main/java/datastructure/basic/Queue.java +++ b/group01/895457260/code/src/main/java/datastructure/basic/Queue.java @@ -17,7 +17,7 @@ public Object deQueue() { } public boolean isEmpty() { - return list.size() == 0; + return list.isEmpty(); } public int size() { diff --git a/group01/895457260/code/src/main/java/datastructure/basic/Stack.java b/group01/895457260/code/src/main/java/datastructure/basic/Stack.java index eeb9c7afba..985d6bbf42 100644 --- a/group01/895457260/code/src/main/java/datastructure/basic/Stack.java +++ b/group01/895457260/code/src/main/java/datastructure/basic/Stack.java @@ -23,7 +23,7 @@ public Object peek() { } public boolean isEmpty() { - return size() == 0; + return elementData.isEmpty(); } public int size() { diff --git a/group01/895457260/code/src/main/java/algorithm/queue/JosephusTest.java b/group01/895457260/code/src/test/java/algorithm/queue/JosephusTest.java similarity index 100% rename from group01/895457260/code/src/main/java/algorithm/queue/JosephusTest.java rename to group01/895457260/code/src/test/java/algorithm/queue/JosephusTest.java From 3b0c6685fcddce2d8124d0255797f200df7eccea Mon Sep 17 00:00:00 2001 From: HuiZhou-Xmu <1814014897@qq.com> Date: Sun, 7 May 2017 19:26:22 +0800 Subject: [PATCH 463/552] =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/week09/stack/QuickMinStack.java | 47 ++++++++ .../src/week09/stack/StackWithTwoQueues.java | 36 +++++++ .../src/week09/stack/TwoStackInOneArray.java | 100 ++++++++++++++++++ .../week09/stack/test/QuickMinStackTest.java | 63 +++++++++++ .../stack/test/StackWithTwoQueuesTest.java | 46 ++++++++ .../stack/test/TwoStackInOneArrayTest.java | 77 ++++++++++++++ 6 files changed, 369 insertions(+) create mode 100644 group01/1814014897/zhouhui/src/week09/stack/QuickMinStack.java create mode 100644 group01/1814014897/zhouhui/src/week09/stack/StackWithTwoQueues.java create mode 100644 group01/1814014897/zhouhui/src/week09/stack/TwoStackInOneArray.java create mode 100644 group01/1814014897/zhouhui/src/week09/stack/test/QuickMinStackTest.java create mode 100644 group01/1814014897/zhouhui/src/week09/stack/test/StackWithTwoQueuesTest.java create mode 100644 group01/1814014897/zhouhui/src/week09/stack/test/TwoStackInOneArrayTest.java diff --git a/group01/1814014897/zhouhui/src/week09/stack/QuickMinStack.java b/group01/1814014897/zhouhui/src/week09/stack/QuickMinStack.java new file mode 100644 index 0000000000..35ae39e4aa --- /dev/null +++ b/group01/1814014897/zhouhui/src/week09/stack/QuickMinStack.java @@ -0,0 +1,47 @@ +package week09.stack; + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * findMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * + * @author Hui Zhou + * + */ +public class QuickMinStack { + Stack stack = new Stack(); + Stack minStack = new Stack(); + int min; + + public void push(int data) { + stack.push(data); + + if (minStack.isEmpty()) { + minStack.push(data); + min = minStack.peek(); + } else { + if (data <= min) { + min = data; + minStack.push(data); + } + } + } + + public int pop() { + if (stack.isEmpty()) { + throw new RuntimeException("the stack is empty."); + } + if (stack.peek() == minStack.peek()) { + minStack.pop(); + } + return stack.pop(); + } + + public int findMin() { + if (stack.isEmpty()) { + throw new RuntimeException("the stack is empty."); + } + return minStack.pop(); + } +} diff --git a/group01/1814014897/zhouhui/src/week09/stack/StackWithTwoQueues.java b/group01/1814014897/zhouhui/src/week09/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..e1a8a2d3de --- /dev/null +++ b/group01/1814014897/zhouhui/src/week09/stack/StackWithTwoQueues.java @@ -0,0 +1,36 @@ +package week09.stack; + +import week08.queue.Queue; + +public class StackWithTwoQueues { + private Queue queue1 = new Queue(); + private Queue queue2 = new Queue(); + + public boolean isEmpty() { + return queue1.isEmpty(); + } + + public int size() { + return queue1.size(); + } + + public void push(T data) { + queue1.enQueue(data); + } + + public T pop() { + if (queue1.isEmpty()) { + throw new RuntimeException("the stack is empty."); + } + int queue1Size = queue1.size(); + for (int i = 0; i < queue1Size - 1; i++) { + queue2.enQueue(queue1.deQueue()); + } + T popValue = queue1.deQueue(); + while (!queue2.isEmpty()) { + queue1.enQueue(queue2.deQueue()); + } + return popValue; + } + +} diff --git a/group01/1814014897/zhouhui/src/week09/stack/TwoStackInOneArray.java b/group01/1814014897/zhouhui/src/week09/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..8c8fefe9c9 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week09/stack/TwoStackInOneArray.java @@ -0,0 +1,100 @@ +package week09.stack; + +import java.util.Arrays; + +/** + * 用一个数组实现两个栈 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * + * @author Hui Zhou + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + int i = 0; + int j = data.length - 1; + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + if (i < j) { + data[i++] = o; + } else { + addCapacity(); + data[i++] = o; + } + } + + private void addCapacity() { + int oldCapacity = data.length; + int newCapacity = oldCapacity + (oldCapacity >> 2); + Object[] tempPre = Arrays.copyOfRange(data, 0, i); + Object[] tempPost = Arrays.copyOfRange(data, j + 1, data.length); + data = Arrays.copyOf(tempPre, newCapacity); + System.arraycopy(tempPost, 0, data, data.length - tempPost.length, tempPost.length); + j = data.length - tempPost.length - 1; + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + if (i <= 0) { + throw new RuntimeException("stack1 is empty."); + } + Object pop1Value = data[--i]; + data[i] = null; + return pop1Value; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return data[i - 1]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + if (j > i) { + data[j--] = o; + } else { + addCapacity(); + data[j--] = o; + } + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + if (j >= data.length - 1) { + throw new RuntimeException("stack2 is empty."); + } + Object pop2Value = data[++j]; + data[j] = null; + return pop2Value; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + return data[j + 1]; + } + +} diff --git a/group01/1814014897/zhouhui/src/week09/stack/test/QuickMinStackTest.java b/group01/1814014897/zhouhui/src/week09/stack/test/QuickMinStackTest.java new file mode 100644 index 0000000000..5d37fb78af --- /dev/null +++ b/group01/1814014897/zhouhui/src/week09/stack/test/QuickMinStackTest.java @@ -0,0 +1,63 @@ +package week09.stack.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week09.stack.QuickMinStack; + +public class QuickMinStackTest { + + QuickMinStack qms = new QuickMinStack(); + + @Before + public void setUp() throws Exception { + qms.push(9); + qms.push(5); + qms.push(6); + qms.push(10); + qms.push(2); + qms.push(3); + qms.push(13); + } + + @Test + public void testPush() { + for (int i = 0; i < 10; i++) { + qms.push(i); + } + for (int i = 9; i >= 0; i--) { + Assert.assertEquals(i, qms.pop()); + } + } + + @Test + public void testPop() { + Assert.assertEquals(13, qms.pop()); + Assert.assertEquals(3, qms.pop()); + Assert.assertEquals(2, qms.pop()); + Assert.assertEquals(10, qms.pop()); + Assert.assertEquals(6, qms.pop()); + Assert.assertEquals(5, qms.pop()); + Assert.assertEquals(9, qms.pop()); + + } + + @Test + public void testFindMin() { + Assert.assertEquals(2, qms.findMin()); + qms.push(2); + qms.push(6); + qms.push(26); + Assert.assertEquals(2, qms.findMin()); + qms.pop(); + qms.pop(); + qms.pop(); + qms.pop(); + qms.pop(); + qms.pop(); + Assert.assertEquals(5, qms.findMin()); + + } + +} diff --git a/group01/1814014897/zhouhui/src/week09/stack/test/StackWithTwoQueuesTest.java b/group01/1814014897/zhouhui/src/week09/stack/test/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..cd9f33519c --- /dev/null +++ b/group01/1814014897/zhouhui/src/week09/stack/test/StackWithTwoQueuesTest.java @@ -0,0 +1,46 @@ +package week09.stack.test; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week09.stack.StackWithTwoQueues; + + +public class StackWithTwoQueuesTest { + + StackWithTwoQueues swtq = new StackWithTwoQueues(); + + @Before + public void setUp() throws Exception { + for(int i=0;i<100;i++){ + swtq.push(i); + } + } + + @Test + public void testPush() { + Assert.assertFalse(swtq.isEmpty()); + Assert.assertEquals(100, swtq.size()); + + for(int i=100;i<200;i++){ + swtq.push(i); + } + + Assert.assertEquals(200, swtq.size()); + for(int i=199;i>=0;i--){ + Assert.assertEquals(i, swtq.pop().intValue()); + } + Assert.assertEquals(0, swtq.size()); + } + + @Test + public void testPop() { + for(int i=99;i>=0;i--){ + Assert.assertEquals(i, swtq.pop().intValue()); + } + Assert.assertTrue(swtq.isEmpty()); + Assert.assertEquals(0, swtq.size()); + } + +} diff --git a/group01/1814014897/zhouhui/src/week09/stack/test/TwoStackInOneArrayTest.java b/group01/1814014897/zhouhui/src/week09/stack/test/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..ebbc4d6420 --- /dev/null +++ b/group01/1814014897/zhouhui/src/week09/stack/test/TwoStackInOneArrayTest.java @@ -0,0 +1,77 @@ +package week09.stack.test; + + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week09.stack.TwoStackInOneArray; + + +public class TwoStackInOneArrayTest { + + TwoStackInOneArray tsioa = new TwoStackInOneArray(); + + @Before + public void setUp() throws Exception { + for(int i=0;i<10;i++){ + tsioa.push1(i); + } + for(int j=20;j<30;j++){ + tsioa.push2(j); + } + } + + @Test + public void testPush1() { + for(int i=10;i<20;i++){ + tsioa.push1(i); + } + for(int i=19;i>=0;i--){ + Assert.assertEquals(i, tsioa.pop1()); + } + } + + @Test + public void testPop1() { + for(int i=9;i>=0;i--){ + Assert.assertEquals(i, tsioa.pop1()); + } + } + + @Test + public void testPeek1() { + Assert.assertEquals(9, tsioa.peek1()); + tsioa.pop1(); + Assert.assertEquals(8, tsioa.peek1()); + tsioa.pop1(); + Assert.assertEquals(7, tsioa.peek1()); + } + + @Test + public void testPush2() { + for(int i=30;i<40;i++){ + tsioa.push2(i); + } + for(int i=39;i>=20;i--){ + Assert.assertEquals(i, tsioa.pop2()); + } + } + + @Test + public void testPop2() { + for(int i=29;i>=20;i--){ + Assert.assertEquals(i, tsioa.pop2()); + } + } + + @Test + public void testPeek2() { + Assert.assertEquals(29, tsioa.peek2()); + tsioa.pop2(); + Assert.assertEquals(28, tsioa.peek2()); + tsioa.pop2(); + Assert.assertEquals(27, tsioa.peek2()); + } + +} From da4ec8465f3bf33427a03c98e23ac53c8ab7bd1a Mon Sep 17 00:00:00 2001 From: James <1310368322@qq.com> Date: Sun, 7 May 2017 19:27:37 +0800 Subject: [PATCH 464/552] =?UTF-8?q?=E7=AC=AC=E5=85=AB=E6=AC=A1=E5=92=8C?= =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E6=AC=A1=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/api/Connection.java | 22 ++++ .../download/api/ConnectionException.java | 7 ++ .../download/api/ConnectionManager.java | 10 ++ .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 73 +++++++++++ .../download/impl/ConnectionManagerImpl.java | 16 +++ .../src/Mini_JVM/com/coderising/jvm.zip | Bin 0 -> 10088 bytes .../com/coderising/jvm/attr/CodeAttr.java | 18 ++- .../com/coderising/jvm/clz/ClassFile.java | 28 +++++ .../com/coderising/jvm/cmd/BiPushCmd.java | 11 ++ .../coderising/jvm/cmd/ByteCodeCommand.java | 4 + .../com/coderising/jvm/cmd/LdcCmd.java | 20 +++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 18 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 11 ++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 17 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 8 ++ .../coderising/jvm/constant/ClassInfo.java | 7 ++ .../coderising/jvm/constant/ConstantInfo.java | 12 ++ .../coderising/jvm/constant/ConstantPool.java | 2 +- .../coderising/jvm/constant/FieldRefInfo.java | 8 ++ .../jvm/constant/MethodRefInfo.java | 8 ++ .../jvm/constant/NameAndTypeInfo.java | 8 ++ .../jvm/constant/NullConstantInfo.java | 6 + .../coderising/jvm/constant/StringInfo.java | 9 ++ .../com/coderising/jvm/constant/UTF8Info.java | 8 ++ .../jvm/engine/ExecutionResult.java | 52 ++++++++ .../coderising/jvm/engine/ExecutorEngine.java | 70 +++++++++++ .../com/coderising/jvm/engine/Heap.java | 42 +++++++ .../com/coderising/jvm/engine/JavaObject.java | 70 +++++++++++ .../com/coderising/jvm/engine/MethodArea.java | 88 ++++++++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 26 ++++ .../coderising/jvm/engine/MiniJVMTest.java | 21 ++++ .../com/coderising/jvm/engine/StackFrame.java | 115 ++++++++++++++++++ .../jvm/loader/ClassFileLoader.java | 3 +- .../com/coderising/jvm/method/Method.java | 54 ++++++++ .../ArrayList.java | 0 .../LinkedList.java | 0 .../ArrayUtil.java | 0 .../LinkedList.java | 0 .../LRUPageFrame.java | 0 .../StackUtil.java | 0 .../InfixExpr.java | 0 .../dataStructure_8_Queue/CircleQueue.java | 40 ++++++ .../dataStructure_8_Queue/Josephus.java | 36 ++++++ .../QueueWithTwoStack.java | 53 ++++++++ .../dataStructure_9_Stack/Queue.java | 61 ++++++++++ .../dataStructure_9_Stack/QuickMinStack.java | 52 ++++++++ .../StackWithTwoQueue.java | 42 +++++++ .../TwoStackInOneArray.java | 89 ++++++++++++++ 49 files changed, 1246 insertions(+), 4 deletions(-) create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/download/api/Connection.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/download/api/ConnectionException.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/download/api/ConnectionManager.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/download/api/DownloadListener.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm.zip create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/Heap.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/JavaObject.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MethodArea.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MiniJVM.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MiniJVMTest.java create mode 100644 group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/StackFrame.java rename group11/1310368322/src/data_structure/{baseDataStructure_1 => dataStructure_1}/ArrayList.java (100%) rename group11/1310368322/src/data_structure/{baseDataStructure_1 => dataStructure_1}/LinkedList.java (100%) rename group11/1310368322/src/data_structure/{baseDataStructure_2 => dataStructure_2}/ArrayUtil.java (100%) rename group11/1310368322/src/data_structure/{baseDataStructure_3 => dataStructure_3}/LinkedList.java (100%) rename group11/1310368322/src/data_structure/{baseDataStructure_4_LRU => dataStructure_4_LRU}/LRUPageFrame.java (100%) rename group11/1310368322/src/data_structure/{baseDataStructure_5_Stack => dataStructure_5_Stack}/StackUtil.java (100%) rename group11/1310368322/src/data_structure/{baseDataStructure_6InfixExpr => dataStructure_6InfixExpr}/InfixExpr.java (100%) create mode 100644 group11/1310368322/src/data_structure/dataStructure_8_Queue/CircleQueue.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_8_Queue/Josephus.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_8_Queue/QueueWithTwoStack.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_9_Stack/Queue.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_9_Stack/QuickMinStack.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_9_Stack/StackWithTwoQueue.java create mode 100644 group11/1310368322/src/data_structure/dataStructure_9_Stack/TwoStackInOneArray.java diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/download/api/Connection.java b/group11/1310368322/src/Mini_JVM/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..930cea370d --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/download/api/Connection.java @@ -0,0 +1,22 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * ʼͽλãȡݣֵֽ + * @param startPos ʼλã 0ʼ + * @param endPos λ + * @return + */ + public byte[] read(int startPos, int endPos) throws IOException; + /** + * õݵij + * @return + */ + public int getContentLength(); + /** + * ر + */ + public void close(); +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/download/api/ConnectionException.java b/group11/1310368322/src/Mini_JVM/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..35c8dc5758 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,7 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception{ + public ConnectionException(Exception e){ + super(e); + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/download/api/ConnectionManager.java b/group11/1310368322/src/Mini_JVM/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..bda19f285f --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * һ URLһ + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/download/api/DownloadListener.java b/group11/1310368322/src/Mini_JVM/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/download/impl/ConnectionImpl.java b/group11/1310368322/src/Mini_JVM/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..efa9e562cd --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,73 @@ +package com.coderising.download.impl; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; + +public class ConnectionImpl implements Connection{ + URL url; + static final int BUFFER_SIZE = 1024; + + ConnectionImpl(String _url) throws ConnectionException{ + try { + url = new URL(_url); + } catch (Exception e) { + throw new ConnectionException(e); + } + } + @Override + public byte[] read(int startPos, int endPos) throws IOException { + //ʼ + System.out.println("ʼ"); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + // öȡλ + httpConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + // URLӻ + InputStream is = httpConn.getInputStream(); + + //is.skip(startPos); + byte[] buff = new byte[BUFFER_SIZE]; + int totalLen = endPos - startPos + 1; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + while(baos.size() < totalLen){ + int len = is.read(buff); + if(len<0){ + break; + } + baos.write(buff,0,len); + } + + if(baos.size() > totalLen){ + byte[] data = baos.toByteArray(); + return Arrays.copyOf(data, totalLen); + } + return baos.toByteArray(); + } + + @Override + public int getContentLength() { + URLConnection con; + try { + con = url.openConnection(); + return con.getContentLength(); + } catch (Exception e) { + e.printStackTrace(); + } + return -1; + } + + @Override + public void close() { + + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/download/impl/ConnectionManagerImpl.java b/group11/1310368322/src/Mini_JVM/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..ff92aa77fe --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,16 @@ +package com.coderising.download.impl; + +import java.net.URL; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager{ + + @Override + public Connection open(String url) throws ConnectionException { + return new ConnectionImpl(url); + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm.zip b/group11/1310368322/src/Mini_JVM/com/coderising/jvm.zip new file mode 100644 index 0000000000000000000000000000000000000000..6177632c3f52f4239f83463b078311ae0c48d8a4 GIT binary patch literal 10088 zcmZ{q1z6Kv7r;kKcaBCtI;C@@8{G(qfTVOvh;)OLbho3C5(Md%Zb?N!qy$8yzv=s; zQ{E4rJqI2x_qUV(d(WAgA`&tN0DuMnnCgZ?0B~Q(u%92g+i|J=S`n-H=L*bhZn?L+_oNa0q29y~C2agnz*vE+Pc;%*WhTa6RIjTd5> z_629%)R@j(0IMfxuD|73L~$KsEnfcKq8;P&DJ#RYZ#$Q-U)7qQwE+w3p5#INsaQjWxEV@v_-=K+HhBXs9jG+IXlhtt_$m5Wlq|x+rwmY^(XlRv8$T&g?D*BAF?s!Iy$euauTvTz%+G{>LI2Bf;+tXv4&FabtI@-5DlMz1L)lIMI zJkkJVP})mk$mH0K8%5OIU>&B}MZbqk`TYy>fd@fMF@D+dIa?g~kk=QSFE{y66i@XYHuQ&$q z?yM*n^vD=_W`WuxQibFwSb2@HeENaR0Y=WFJ}YZcU*YF5(dv(CyrJhY5AtsJmuZJ@ zRwTtC$k;Stwm&4GaufU#W{7@x*@Q4!t!_tckiri(iFAtW_}V@^t;$gFy1L7~Ge-Kw zizgQj^&p2d*Vn=z6y^FQg0Dw#siu?|4pGk3<7t8g+UZ}Z_A}tX_GacDKO-(URvDv{ z7B6@P{R2*olAsZ->y-A)28sq>LA|_O?y=$jOPl$`0}77X8(0b7XT~ydcsWu`3S45v__7llUy{C< zw4NAH%x1K*pgAtENq)oY`=a6*o&YY!I@0g@qh1#FM}@+^$}b0d7grN|S2)WwLBk*+ zcgF{cVOF_-r6a}POaC>Gg~Lzl*l8%+bVw12QGAiy;xT%!jh9PL6qJYZpfaARbWul; zZZ53w>x_rBA{Tw0P8rE|p)nfO1BJ`#;5tNm;#cH7rT2FynLrvaxEGdWKb`# zh8uQz7kw@5y(CXCN0Ax{HU_A@Y9vxt?xA`$`?D3x_%*j6HY`nSk@UMu&FB~i-?0*& z5r^RCVpZE9<)=76AQ@eJsfN668Baqx(Wa6dM#@1gC*$6}Qs;7(Q<>i+C_2|pHr)34 zsLtqW?@GiM04s!MWknL>R#}AC(FXA=Y{lLiM$?rnO(jj8?&!V}r;q_B5`>`p>ClLy zq}562P^xE-^dzWkdaI@d`!;5rcY92d?L(vG1fSibd_TPctssphIHBS z6?ly&3N>10%7#vv@5$XrN6oi{jP>LRp639P@Bc2fcZ$OxL?|vgNihGGAOQf>*Zli$ zOn~kGburr=rC}8%RqZ>&BU6gQs$h-*_Te{*GlQ&1P6rW+1P72Z&qj|%3`l}AZvrtv zLWE)jL4qPtybD2OBymPAMC@REpSZ-cQ7Cu7FMv^sm4lCqM}dy7QkL#^*AV^E#K_S7 zcAfT7V2rdNjc+er3WV@6Yo-rnV4w->&>j>E2YvsmODIcSn@vk`X$+=PA)`d%>k2yR z3&+9`)bEog!Y55Vq9=`Ap|YqiJL<^%YyDh_KPDG2B^MO61@h5KN-EHiha+jC^Uw%S z^4|uvtheY{o^a z;_N6m<#p6y8pPzhGCN(`W+SOYXhgvA3qjJ(Aq$17A{6X>**(A=t^j?{NXF~~0DgOP z%QO@c^Wug!C(NTku#Ek`9#wO2u>F~|K5;`3Bp#yR8LE^=F9+Xr5IvIC#slFY2bY}Q zChQeeNucYG^8Lt=1iRNaf+kI=S99;Z42$s)+>kGS-cly5*40DrlNF6Fq?|`Ux`bvek67}rdBZLXO2bUO5v$$Mb2W@Zu6mZ zYr01!-Xa#Wv|h7E#FU+YEBUmzW~M>mRx;4W0>$I)x1;^sX0=ys1_}ODvG0LTfWb!b zFPW%fY?^8fV!LL(yq8&l5*M|N*J9IeBaBiFy=ak@36z+$ix19ikj9}+tpXuJHrt>t zt^4$6A&Pp0Du;qCZ_TdBBQR55*`p<0IBAnu zLMLDdlC2pvK@#v~**Qb}ZRrsIa7fCXn-Y^SOTR<;4@=8io7_a+Q?b<^of&{zhqV!l>h}>iHWe~nlwp0}5YZaVw zF4QCsj47}W>-haP7C#_SFWt{(ni0%jA8Bx4K}q+i4c`{{2u{!&UR<^HIz<$`>2a2( zyxU7;ip7G66kcwwY%RT(wcfZg(TY){g?5t$1?X!TQK@GxD={%D6SQYTyz&l#Ufr+p zkfAxJOVC-R4kDml5`f6_g_1%VMTWyT3Zjx(m9(5gbyqI_lP&n;5Sw;Ht6FIQU*#k6 zmVFZK=Cmz8WY-9Pk3E?@eg)-Q$zh?`qXjJ(>lWMnZ%Ua+ru4r!;dSHPGdFQ1Dp3n@ z^U~Fn_HP%gi42e!7GdRbO)6g58K?Wc&CHj?$<@FRV`BS!!hTvOCU9zCbbZLbZ$p zxqhDCcE%t17_A{{)z6_?l|xBcTb;P_(IiNqN;GLVkhj2Y2HI(XE_e@cN@Uu5quX3e zQcO3I(pxM5F;d!(8|CX{U=FPu`NzecCvNLiT63joP)GIf8;Mm&rxp^pMhdD9EAM<> zkST{WbPl$EwUq#+LEo%yG)jg^X6OX{ zYyO#SKn#b-OwxfjHAC90%Ni+NhYr7A5bceN94C2>JHiyoH|Ue4-rm$Bi|Fk%?-q!@o8yDEeJ`Omv){J8ufehHDS{D(wIuEUseKrelIEmm{GTibb z5Ll>gXq34oqSgvE~@M*N-8>ND?+%7IQm{D6N!PZo3^}47&-D4Yb;jkq6q%G zoQr$GAA~2Q@^P7%+#2LHiog~Rdv0o{qfD`zx{>SLV+d`1BZ)_1(*0g5m}B|3!w>wz zAth3MH%DL&w}xHw=>B%Niiw>$$lgrL)6x7_4Jg-8R)p06@rKb$?yt}Cv=$Q7kR$cK z7!#KT6vK+Zy>eI)h@iiq*(G2j0$J_ld0G9WQ6q;Ir!&-y)mp@WzsO%l(~ctIGxd;5i>vWCqY;na z4(5Ox#TpVaDz0XK&|^f(Rm32r(7Ct*Tb|ZtyJj^QRDPypxc4S>IH&xIjt{Ax0Aeaq7QnUYK|twTTmLdxBbuDPjJh_ z!s*0c*gfZ0_&nrqX7zH&(&MqXw*raPH`*0YS_OrT_b1PnR+p>kXJdkUdk^aGOiruj z1;3+_?@iYk=f=lT&zeX8G1P{QDT$aR?ZO?EUzUbJTKTEYLts(R4tvpGiv~AaTbaL) zQ}+g|F%WsMP*)m*y+flO1>P8LKvUst`i@u^U8p}XUKC3I`jt2fGmbCq@qt`ncGq=pxZ|&Z;s&o$V*?ThomMRlzB{NPbWO>!aB(KqT47ZLX zZ%w;K_)SVY-*=R!WbFHU_|-Hk2N|)7^m^sRJtBA4DSpRv6YOqa8GW2g4~uD3*ztk# zZ!I)kovrOHe}%JKY&)b2)_NG>_)4`lYt*EhixyBdK3MVckiCw|#@&V>zP2o^@&kA* zJ#0w~jk?KU1<7NNHUK=~W*~<~$9J|Yc^OnZN6&%B>rP_9t^i`ll@qE|1{Xr05n?kg zo^FQmSTA@J2`nI1>Po6)D;jh|j9c!e6V2RyohVSvV5#SbZo~NXH}V{lD7z9`@;!L7 zG0dOqOhYGe(bkKCLA=E@sAeK2Kb0lDb*0WqvZ|3}r``yGs@XT5Q(k4Q(cv z?wGLmX;Jsa{;vES1GB-0Ewa_5%2C(Oj13LMig*IW*GZ^&X4!1FGc&(c)+nt#Zc-)@ z@1!&uQPN(Pz2o$hcF*Z+;56~%P7-%dhX8-t%hI{;f;52JuQN*v`$ zD6{P@9f$TJchbGusU8V@u$a%|dC^ARIgCPdi(7u>%^JXmXn6mPwGuSck5k6GSLhAC zo37}m19H-oQ}lxK!Dn>9i)d1bcGiHx%QMBWipTWqhji7mc4k92g;+eJRgg_qvMztv z_MfhsZsnhMTFifKYwKWQX6_7^rb52q5MDG~Xg16Vr?49j?Vk&!JzdRZ9L&tYuIA1r zt`5#WPsoMw)heB^AYa$|ESe#bBMY(yvIae?B7)}eam$e}OoEZ1gu+_7deG628Bo2v?JD}wIn9!% zOBl*Z)`H;`2qgpw^|p4gld>1#_=GSs~?|BJbvx4EYWbEhE=_k>T`-R zf?@>FG)tRb2W7_lowB0*Tka+TTqJd+6mD(CV$*)|6gTxSvU;j^@|UH1vm&|g`1u)d zY4JcV^7p0o%5$NfOA!K3CenlKiI8t7MYE(D0Vl?Ee7bU*CoZR_?at*pjX5w<_zvF*C&R6I@sST>mST?r}t3x z;V8Q-qCe%*Iof;uvXHGV{}nV~j2Fxt3e_hvJ?N^v2%r=={y;7an5-wsT$7mH zmB$u4cj2nnKv+1WKlBMw4=lT~QGXx7{*8iP%|oT1QSsBa(OSx?lTu_7xagPf5+~Rr zkuprM1L9-x7@ZlsQ|v6~+U<)|RY*xYW7IjByvEw318f3#x;(h$6S_SFm@W_w>769r z?&vb!R(_kh?%A4klo|f~DAu0ui)?~Nhh==P*aDMiITJea)Mjvhct845RFGDcjKMQU zP*Q?dCU~tfSUpc5(X6(STfRw#xFx=70Lh)vWcy-KfjW|i^c`9XGj;5|#`rgp7;XHN zo%OKTrsoVFBKjDxQlt7&6KngQRd~c4pKFU*Y3D?cZp9_~^;CnGo%0Jw9C5{J(1mO5 zrviHu2$|!X<%p3ICh|CSUNseNcvEQcn?9H7bEo5Cy15eX{?x-N{*H7VYk`}cZEgPo z^LIaW-_%g8dR^DomW@wqO(niOna=)&wqrEM*+`v7LB~X z*tvR+CRJ`B#^{BQlp9_3Sh|6=GJBq7^o?2)Zo>cy_vGY3#&lqwL32rJh{fPUVp9mc z)^%b+z-w5pLA9SY$rGfTkCwp8`*DTtEt6RILIXM!bq+vpe zn!Jg9+;sw?r}jqU({;#4{wGf)67J5^pYPu8L(Q-P*3VDx&E9@B5V}}A?E2{mV10_N zB3jLb=GG`}0A_lRiPIVPTm|T@fKhL=2KnkjhN{yCdIF#v`&TEUJQbn?SB+5#OjCEN zC!P;YSZk_>Xz(QXwK@_%VgN~4S|7G8OuDH+vETyMbU6{QneCGjVn?|EIjQ z=ozR|C=flVXS@uBW>4qd#VFCzACQTVDr9BGNKP)nT|I<7*|Xdp^&$iJ9_VYKYd?ob zN3)P3L|ZpL50>Up&+-V1EfLd#jMqL4m`u$~U7S1QFVRA8-pt$;bs2s%oRR8=56o_- zL=3q%iY*#QIl=FwlAXo!DG7Vy=t5QuUl3Dnp3WFJEVWpB2;NGH*g_w`G8xE=%Dsz3 z9B#eJ{6vRKO39L$R_Ut&qtY8hpflyXb)VHrh>1_`GB?(TrcRPKhYf)^`myxNm~J7I z?c}%Tfe#-fOMPx`v)smc_kOL&&LEQ~MA^*TKG$~LC5k@2;eHG+D&{BDVWl_3V>Ypn zB*xW^41N{LlQNgH4_%JgQn%hO&JZ{`V%ug>XJnRDz80#qlMs0+a_M8Tu~QjZxg&10 zwCw%5sdayTtR}dShGypJ?(4TkhN5B>_V)p;h$;R%vdwxBgCYd1Z$f0v=v1V_D=PHV z`M!&bIT}X3dJc3@q5_aD;-u)8WWSThc>{t_ z(DnIux%+_~kOf4FoKC4@O3^X6ErAaTrQhD=Zfc6#0IlBe6AF4QKAQ+k@0jSw3ORuB375g!98h&W26;b;bimrZL8Oh2L#i zsZ|;}`A~^{%q@2ZKL%%(e+ZyNGeybj-0H##on{-2Efz_;bls-Hsx~jV^8IuV z@RBRB`-CHT(vC~t1~MfpJIc-@z)o5j%CTQK5B|Oa=Bt@7ZfbW(q!9V|sG4A-2)4{- zxqWWksQTvz%-=!jJ3B+fz-$+E)=%!?pIo0Pv6nH*;5c4*)1o(h-o{9zxQ(W2GG&Kj zo-gvoY|>8g!R#j^rqkq4cS?N^x*N`Wdstr0zZSYU_Bi^)CXi7`l`3a9ZtZ=t@$uZ> zOSQ5luA*X+>fu&CRQ=2O$AR}91bl9eZu{7?-(7ZXMr*3NDs4t~cB#)?-96p4D|q`p zM+UN0GJ4Y()p;qhkJc(oJ*)G;G&%dC3!<$+iXu{+y{Nisnk z$k7RmYFj;gc@ItuEZOBVglQMTk2|%vtNHm>9hk(q62@o6xM_LzrEJ`)P?kcFgfV1FRj(Q5VWaY+yfE#Ls z;aHdns0H+YEg^;*i@JwIKs+5%nq_T@s0H$COH zuHo42C3%M664oa!zlC`*pD9F5avVdrMSgxt`n#43UBLL|uST<3RKL>$q>SKf!K&hRxy>-b7VvDeSMlO_0$jQ-o)bhI7e05qy|tXL})tTNeaH3oar2#At^|2F|=fW7%2UwHqB zpVMxPpGR*100BS-D4+A#fK-knTuDJZ3HiY1pa!1j3;R&WfAW5fZQyy6sP@%5FwQ$2$*(_*cqQR^*T)s` zybbifc-Mv(@VpO#>t|@N*r?i5VK9d2c_ra_*W2Onykpn}{SW=FH^4jnx6H7xP|Q1h>T9Xzd6Z%EA!M!QPED+y1#-m`+I z0bv)6KWKk+u;5wX3bAc%m=!gOIbUeO$$wb?uZMHR`cX~X3IAdJ`|yL`9D%J=%n_!@ zmHhMZ@lTPz-uJoM{6{Ux{&VyH>;l0P)qJQ=P+`GwMZA*mrn}yZfG0jC{zIK#1s|?8 z0S`P2vyaAu0cB%@b$>h=uOvM1`qd8}=u7tBK)8z_Jg{!6UxXG0WN5vYX%DmQm4pXg zKcBz@6=9?2AHne-rxkcm(h7oT5KJRUY%MN$siuemtGNIG5$s#z$4BIT%+mn>15Z9d A$N&HU literal 0 HcmV?d00001 diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/attr/CodeAttr.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/attr/CodeAttr.java index e07662a68b..b09c94f55a 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/attr/CodeAttr.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/attr/CodeAttr.java @@ -1,6 +1,8 @@ package com.coderising.jvm.attr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; import com.coderising.jvm.loader.ByteCodeIterator; public class CodeAttr extends AttributeInfo{ @@ -10,6 +12,12 @@ public class CodeAttr extends AttributeInfo{ private int codeLen; private String code; + private ByteCodeCommand[] cmds; + + public ByteCodeCommand[] getCmds(){ + return cmds; + } + public String getCode(){ return code; } @@ -21,12 +29,13 @@ public String getCode(){ - public CodeAttr(int attrNameIndex, int attrLen , int maxStack, int maxLocals, int codeLen,String code) { + public CodeAttr(int attrNameIndex, int attrLen , int maxStack, int maxLocals, int codeLen,String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -50,7 +59,12 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int codeLen = iter.nextU4toInt(); // code String code = iter.nextUxToHexString(codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, max_Locals, max_Locals, code); + System.out.println("code: " + code); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + System.out.println("cmds: ==== " + cmds.length); + System.out.println("CodeAttrеcmdijȣ " + cmds.length); + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, max_Locals, max_Locals, code, cmds); int exceptionTableLen = iter.nextU2toInt(); diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/clz/ClassFile.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/clz/ClassFile.java index 4492d2df9e..adf0162155 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/clz/ClassFile.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/clz/ClassFile.java @@ -5,6 +5,7 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; @@ -92,4 +93,31 @@ private String getSuperClassName(){ return superClass.getClassName(); } + public Method getMethod(String methodName, String paramAndReturnType){ + for(Method m : methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + + public Method getMainMethod(){ + + for(Method m : methods){ + int nameIndex = m.getNameIndex(); + int descIndex = m.getDescriptorIndex(); + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descIndex); + if( name.equals("main") && desc.equals("([Ljava/lang/String;)V")){ + return m; + } + } + return null; + } + } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/BiPushCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/BiPushCmd.java index a211b332a4..62359138ea 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/BiPushCmd.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/BiPushCmd.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; // bipush: ֽڵijֵ(-128 - 127) ջ public class BiPushCmd extends OneOperandCmd{ @@ -15,4 +19,11 @@ public String toString(ConstantPool pool) { return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + int value = this.getOperand(); + JavaObject jo = Heap.getInstance().newInt(value); + frame.getOprandStack().push(jo); + } + } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/ByteCodeCommand.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/ByteCodeCommand.java index 66d99de660..f9ccb52a97 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -6,6 +6,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public abstract class ByteCodeCommand { String opCode; @@ -123,4 +125,6 @@ public String getReadableCodeText(){ } return txt; } + + public abstract void execute(StackFrame frame,ExecutionResult result); } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/LdcCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/LdcCmd.java index b6910b16c8..6b110a8f47 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/LdcCmd.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/LdcCmd.java @@ -4,6 +4,10 @@ import com.coderising.jvm.constant.ConstantInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd{ @@ -25,4 +29,20 @@ public String toString(ConstantPool pool) { return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + }else{ + throw new RuntimeException("Only support StringInfo constant"); + } + } + } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NewObjectCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NewObjectCmd.java index 765554d825..e2a31a2d9c 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NewObjectCmd.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NewObjectCmd.java @@ -1,7 +1,12 @@ package com.coderising.jvm.cmd; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -14,4 +19,17 @@ public String toString(ConstantPool pool){ return super.getOperandAsClassInfo(pool); } + public void execute(StackFrame frame, ExecutionResult result){ + + int index = this.getIndex();// + + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + + String clzName = info.getClassName(); + + // Javaϴһʵ + JavaObject jo = Heap.getInstance().newObject(clzName); + frame.getOprandStack().push(jo);// ǰջ֡еIJջѹʵ + + } } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NoOperandCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NoOperandCmd.java index 238cd633fc..202e13419d 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/NoOperandCmd.java @@ -2,6 +2,8 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class NoOperandCmd extends ByteCodeCommand{ @@ -19,4 +21,13 @@ public String toString(ConstantPool pool) { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + String opCode = this.getOpCode(); + + + + } + } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/PutFieldCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/PutFieldCmd.java index 601574ea5b..59e5a09230 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/PutFieldCmd.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/PutFieldCmd.java @@ -2,6 +2,10 @@ import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd{ @@ -14,5 +18,18 @@ public String toString(ConstantPool pool) { return super.getOperandAsField(pool); } + + public void execute(StackFrame frame, ExecutionResult result){ + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // example : name + String fieldName = nameTypeInfo.getName(); + // example : Ljava/lang/String + String fieldType = nameTypeInfo.getTypeInfo(); + + + } } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/TwoOperandCmd.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/TwoOperandCmd.java index 0a2aeff703..44d232d2e5 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/TwoOperandCmd.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -6,6 +6,8 @@ import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.FieldRefInfo; import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; public class TwoOperandCmd extends ByteCodeCommand{ @@ -73,6 +75,12 @@ public String toString(ConstantPool pool) { return null; } + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ClassInfo.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ClassInfo.java index 13fc4101a3..78210d1090 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ClassInfo.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ClassInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.constant.ConstantInfo.Visitor; + public class ClassInfo extends ConstantInfo{ private int type = ConstantInfo.CLASS_INFO;// ʾóΪ ӿڵķ @@ -28,6 +30,11 @@ public String getClassName(){ UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ConstantInfo.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ConstantInfo.java index e20be200d6..87d6bfda12 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ConstantInfo.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ConstantInfo.java @@ -30,5 +30,17 @@ public ConstantInfo getConstantInfo(int index){ // ContantInfo е getConstantInfo ͬ } + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visitUTF8(UTF8Info info); + } + + } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ConstantPool.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ConstantPool.java index 82565b7f59..11546afd64 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ConstantPool.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/ConstantPool.java @@ -24,7 +24,7 @@ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize(){ + public int getSize(){ return constantInfos.size() - 1; } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/FieldRefInfo.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/FieldRefInfo.java index 731c35b118..9e9136511e 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/FieldRefInfo.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/FieldRefInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.constant.ConstantInfo.Visitor; + public class FieldRefInfo extends ConstantInfo{ private int type = ConstantInfo.FIELD_INFO; @@ -50,6 +52,12 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(nameAndTypeIndex); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + + } } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/MethodRefInfo.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/MethodRefInfo.java index 49d89083fd..0931939a35 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/MethodRefInfo.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/MethodRefInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.constant.ConstantInfo.Visitor; + public class MethodRefInfo extends ConstantInfo{ private int type = ConstantInfo.METHOD_INFO; @@ -49,4 +51,10 @@ public String getParamAndReturnType(){ return typeInfo.getTypeInfo(); } + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + + } + } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/NameAndTypeInfo.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/NameAndTypeInfo.java index 8494e5e76a..93e4db9331 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/NameAndTypeInfo.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.constant.ConstantInfo.Visitor; + public class NameAndTypeInfo extends ConstantInfo{ public int type = ConstantInfo.NAME_AND_TYPE_INFO; @@ -48,5 +50,11 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo() + ")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/NullConstantInfo.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/NullConstantInfo.java index f0be39e410..5237dd0ade 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/NullConstantInfo.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/NullConstantInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.constant.ConstantInfo.Visitor; + public class NullConstantInfo extends ConstantInfo{ public NullConstantInfo(){ @@ -9,5 +11,9 @@ public NullConstantInfo(){ public int getType() { return -1; } + @Override + public void accept(Visitor visitor) { + + } } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/StringInfo.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/StringInfo.java index 3ff8e9402b..f84782a7da 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/StringInfo.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/StringInfo.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.constant.ConstantInfo.Visitor; + public class StringInfo extends ConstantInfo{ private int type = ConstantInfo.STRING_INFO; @@ -27,4 +29,11 @@ public String toString(){ return this.getConstantPool().getUTF8String(index); } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/UTF8Info.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/UTF8Info.java index 6374764b5f..edfa5aeabd 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/UTF8Info.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/constant/UTF8Info.java @@ -1,5 +1,7 @@ package com.coderising.jvm.constant; +import com.coderising.jvm.constant.ConstantInfo.Visitor; + public class UTF8Info extends ConstantInfo{ private int type = ConstantInfo.UTF8_INFO; @@ -35,6 +37,12 @@ public void setValue(String value){ public String toString(){ return "UTF8Info [type=" + type + ",length" + length + ",value" + value + ")]"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitUTF8(this); + + } } diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/ExecutionResult.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..7aefa17174 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,52 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + public void setNextAction(int action){ + this.nextAction = action; + } + + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/ExecutorEngine.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..cd48c10186 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,70 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + + + +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + List list = new ArrayList(); + public ExecutorEngine(){ + + } + + public void execute(Method mainMethod){ + + // mainջ֡ + StackFrame mainFrame = StackFrame.create(mainMethod); + stack.push(mainFrame); + + + while(! stack.isEmpty() ){ + + StackFrame frame = stack.peek(); + + ExecutionResult result = frame.execute(); + + if(result.isPauseAndRunNewFrame()){ + + Method nextMethod = result.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod);// µջ֡ + nextFrame.setCallerFrame(frame); + setupFunctionCallParams(frame, nextFrame); + + } else { + stack.pop(); + } + } + + } + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + Method nextMethod = nextFrame.getMethod(); + + List paramList = nextMethod.getParameterList(); + // 1 ΪҪ this Ҳȥ + int paramNum = paramList.size() + 1; + + List values = new ArrayList(); + // ջȡ ջ X Ԫ + while(paramNum > 0){ + values.add(currentFrame.getOprandStack().pop()); + paramNum--; + } + + // һб + List params = new ArrayList(); + for(int i = values.size() -1; i>=0; i--){ + params.add(values.get(i)); + } + + nextFrame.setLocalVariableTable(params); + + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/Heap.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..e1907976be --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * ûʵգ Զ´Ķ ûм¼һݽṹ + */ + + private static Heap instance = new Heap(); + + private Heap(){ } + + public static Heap getInstance(){ + return instance; + } + + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/JavaObject.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..62fd2ce2a9 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,70 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MethodArea.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..8cc2ee2c37 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,88 @@ +package com.coderising.jvm.engine; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { +public static final MethodArea instance = new MethodArea(); + + /** + * ע⣺˼ļ򻯣 ClassLoader ֻһ ʵJVMеClassLoader,һ˫ίеģ + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className) throws IOException{ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className) throws IOException{ + + if(map.get(className) != null){ + return map.get(className); + } + // class ļûload + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType) throws IOException{ + + ClassFile clz = this.findClassFile(className); + + Method m = clz.getMethod(methodName, paramAndReturnType); + + if(m == null){ + + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + + return m; + } + + + public Method getMethod(MethodRefInfo methodRef) throws IOException{ + + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + + return m; + + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MiniJVM.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..43bfb6ec97 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,26 @@ +package com.coderising.jvm.engine; + +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + +public class MiniJVM { + + public void run(String[] classPaths, String className) throws IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for (int i = 0; i < classPaths.length; i++) { + loader.addClassPath(classPaths[i]); + } + + MethodArea methodArea = MethodArea.getInstance(); + + methodArea.setClassFileLoader(loader); + + ExecutorEngine engine = new ExecutorEngine(); + + className = className.replace(".", "/"); + + engine.execute(methodArea.getMainMethod(className)); + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MiniJVMTest.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MiniJVMTest.java new file mode 100644 index 0000000000..1b70348d1a --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/MiniJVMTest.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.engine; + +import static org.junit.Assert.*; + +import java.io.IOException; + +import org.junit.Test; + +public class MiniJVMTest { + + static final String PATH = "D:\\"; + + @Test + public void test() throws IOException { + String []classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "EmployeeV1"); + + } + +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/StackFrame.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/StackFrame.java new file mode 100644 index 0000000000..877fd67d17 --- /dev/null +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/engine/StackFrame.java @@ -0,0 +1,115 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.method.Method; + +public class StackFrame { + private List localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + private StackFrame(Method m) { + this.m = m; + + } + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //⣺ ΪʲôҪô + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } +} diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/loader/ClassFileLoader.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/loader/ClassFileLoader.java index 6e479bbce9..c2328bcfba 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/loader/ClassFileLoader.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/loader/ClassFileLoader.java @@ -22,8 +22,9 @@ public class ClassFileLoader { * @ֽ */ public byte[] readBinaryCode(String className) throws IOException{ + System.out.println("className: " + className); DataInputStream dis = new DataInputStream( - new BufferedInputStream(new FileInputStream(className))); + new BufferedInputStream(new FileInputStream("D://EmployeeV1.class"))); for(int i = 0; dis.available() != 0; i++){ a[i] = dis.readByte(); countForReadBinaryCode++; diff --git a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/method/Method.java b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/method/Method.java index 572880f729..05a86d2c44 100644 --- a/group11/1310368322/src/Mini_JVM/com/coderising/jvm/method/Method.java +++ b/group11/1310368322/src/Mini_JVM/com/coderising/jvm/method/Method.java @@ -1,8 +1,13 @@ package com.coderising.jvm.method; +import java.util.ArrayList; +import java.util.List; + import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; public class Method { @@ -54,6 +59,7 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ System.out.println("attrCount: " + attrCount); // methodе for(int i = 0; i < attrCount; i++){ + System.out.println("ִеڣ " + i + ""); int attrNameIndex = iter.nextU2toInt(); String attrName = clzFile.getConstantPool().getUTF8String(attrNameIndex); System.out.println(attrName); @@ -65,4 +71,52 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ } return method; } + + public ByteCodeCommand[] getCmds() { + return this.codeAttr.getCmds(); + } + + // õǩ[ ҲDzбͷֵ ] + private String getParamAndReturnType(){ + + UTF8Info nameAndTypeInfo = (UTF8Info)this.getClzFile().getConstantPool() + .getConstantInfo(this.getDescriptorIndex()); + return nameAndTypeInfo.getValue(); + } + + public List getParameterList() { + + // e.g (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + + String param = paramAndType.substring(first+1, last);// ȡIJ + + java.util.List paramList = new ArrayList(); + + if( null == param || "".equals(param)){ + return paramList; + } + + while( !param.equals("")){ + + int pos = 0; + // һ + if( param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + if(end == -1){ + throw new RuntimeException("can not find the ;"); + } + paramList.add(param.substring(pos+1, end)); + pos = end + 1; + } + } + + + + return null; + } } diff --git a/group11/1310368322/src/data_structure/baseDataStructure_1/ArrayList.java b/group11/1310368322/src/data_structure/dataStructure_1/ArrayList.java similarity index 100% rename from group11/1310368322/src/data_structure/baseDataStructure_1/ArrayList.java rename to group11/1310368322/src/data_structure/dataStructure_1/ArrayList.java diff --git a/group11/1310368322/src/data_structure/baseDataStructure_1/LinkedList.java b/group11/1310368322/src/data_structure/dataStructure_1/LinkedList.java similarity index 100% rename from group11/1310368322/src/data_structure/baseDataStructure_1/LinkedList.java rename to group11/1310368322/src/data_structure/dataStructure_1/LinkedList.java diff --git a/group11/1310368322/src/data_structure/baseDataStructure_2/ArrayUtil.java b/group11/1310368322/src/data_structure/dataStructure_2/ArrayUtil.java similarity index 100% rename from group11/1310368322/src/data_structure/baseDataStructure_2/ArrayUtil.java rename to group11/1310368322/src/data_structure/dataStructure_2/ArrayUtil.java diff --git a/group11/1310368322/src/data_structure/baseDataStructure_3/LinkedList.java b/group11/1310368322/src/data_structure/dataStructure_3/LinkedList.java similarity index 100% rename from group11/1310368322/src/data_structure/baseDataStructure_3/LinkedList.java rename to group11/1310368322/src/data_structure/dataStructure_3/LinkedList.java diff --git a/group11/1310368322/src/data_structure/baseDataStructure_4_LRU/LRUPageFrame.java b/group11/1310368322/src/data_structure/dataStructure_4_LRU/LRUPageFrame.java similarity index 100% rename from group11/1310368322/src/data_structure/baseDataStructure_4_LRU/LRUPageFrame.java rename to group11/1310368322/src/data_structure/dataStructure_4_LRU/LRUPageFrame.java diff --git a/group11/1310368322/src/data_structure/baseDataStructure_5_Stack/StackUtil.java b/group11/1310368322/src/data_structure/dataStructure_5_Stack/StackUtil.java similarity index 100% rename from group11/1310368322/src/data_structure/baseDataStructure_5_Stack/StackUtil.java rename to group11/1310368322/src/data_structure/dataStructure_5_Stack/StackUtil.java diff --git a/group11/1310368322/src/data_structure/baseDataStructure_6InfixExpr/InfixExpr.java b/group11/1310368322/src/data_structure/dataStructure_6InfixExpr/InfixExpr.java similarity index 100% rename from group11/1310368322/src/data_structure/baseDataStructure_6InfixExpr/InfixExpr.java rename to group11/1310368322/src/data_structure/dataStructure_6InfixExpr/InfixExpr.java diff --git a/group11/1310368322/src/data_structure/dataStructure_8_Queue/CircleQueue.java b/group11/1310368322/src/data_structure/dataStructure_8_Queue/CircleQueue.java new file mode 100644 index 0000000000..b5dd034ca2 --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_8_Queue/CircleQueue.java @@ -0,0 +1,40 @@ +package dataStructure_8_Queue; + +public class CircleQueue { + + private final static int DEFAULT_SIZE = 5; + + // ѭеԪ + private Object [] elementData = new Object[DEFAULT_SIZE]; + + // ͷ + private int front = 0; + // β + private int rear = 0; + + + public Object getElementData(int index){ + return elementData[index]; + } + public boolean isEmpty(){ + return front==rear; + } + + public int size(){ + return rear-front; + } + + public void enQueue(E data){ + if((rear+1)%DEFAULT_SIZE == front){ + return; + }else{ + rear = (++rear)%DEFAULT_SIZE; + elementData[rear] = data; + } + } + + public E deQueue(){ + front = (++front)%DEFAULT_SIZE; + return (E) elementData[front]; + } +} diff --git a/group11/1310368322/src/data_structure/dataStructure_8_Queue/Josephus.java b/group11/1310368322/src/data_structure/dataStructure_8_Queue/Josephus.java new file mode 100644 index 0000000000..6877bbefa8 --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_8_Queue/Josephus.java @@ -0,0 +1,36 @@ +package dataStructure_8_Queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * QueueʵJosephus + * ϵ⵱У Nݾһַͬʽ NΧһȦλüΪ0N-1 Ҵӵһ˱ M˻ᱻɱ ֱһ + * ÷һList ˱ɱ˵Ĵ + * @author liuxin + * + */ + +public class Josephus { + + + public static List execute(int n, int m){ + List list = new ArrayList(); + List listNew = new ArrayList(); + for (int i = 0; i < n; i++) { + list.add(i); + } + + int size = list.size(); + System.out.println(list.size()); + int index = 0; + while(size != 0){ + index += m-1; + index = index%size; + listNew.add(list.remove(index)); + size--; + } + + return listNew; + } +} diff --git a/group11/1310368322/src/data_structure/dataStructure_8_Queue/QueueWithTwoStack.java b/group11/1310368322/src/data_structure/dataStructure_8_Queue/QueueWithTwoStack.java new file mode 100644 index 0000000000..a0c37e9167 --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_8_Queue/QueueWithTwoStack.java @@ -0,0 +1,53 @@ +package dataStructure_8_Queue; + +import java.util.Stack; + +/** + * ջʵһ + * @author liuxin + * @param + * + * @param + */ + +public class QueueWithTwoStack { + + private Stack stack1; + private Stack stack2; + private static int i = 0; + + public QueueWithTwoStack() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return false; + } + + public int size() { + return -1; + } + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if(stack2.isEmpty()){ + moveStack1ToStack2(); + } + if(i!=0){ + return stack2.pop(); + } + return null; + } + + public void moveStack1ToStack2() { + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + i++; + } + } + +} diff --git a/group11/1310368322/src/data_structure/dataStructure_9_Stack/Queue.java b/group11/1310368322/src/data_structure/dataStructure_9_Stack/Queue.java new file mode 100644 index 0000000000..0cc93daa1c --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_9_Stack/Queue.java @@ -0,0 +1,61 @@ +package dataStructure_9_Stack; + +import java.util.NoSuchElementException; + + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} + diff --git a/group11/1310368322/src/data_structure/dataStructure_9_Stack/QuickMinStack.java b/group11/1310368322/src/data_structure/dataStructure_9_Stack/QuickMinStack.java new file mode 100644 index 0000000000..69fbc1735b --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_9_Stack/QuickMinStack.java @@ -0,0 +1,52 @@ +package dataStructure_9_Stack; + +import java.util.Stack; + +/** + * һջ֧ջpushpopԼֲfindMin, ظݽṹеСԪ + * finMinʱ临ӶӦO(1) һξͿԵõСֵ + * @author liuxin + * + */ +public class QuickMinStack { + + Stack stack = new Stack(); + Stack temp = new Stack(); + public void push(int data){ + + + if(stack.isEmpty()){ + stack.push(data); + temp.push(data); + }else{ + + if(data queue1 = new Queue(); + Queue queue2 = new Queue(); + + public void push(int data) { + queue1.enQueue(data); + } + + public int pop() { + if(queue1.isEmpty()){ + throw new RuntimeException("ջΪ"); + } + moveQueue1ToQueue2LeftLastOne(); + int pop = queue1.deQueue(); + moveQueue2ToQueue1(); + return pop; + } + + private void moveQueue2ToQueue1() { + while(!queue2.isEmpty()){ + queue1.enQueue(queue2.deQueue()); + } + + } + + private void moveQueue1ToQueue2LeftLastOne() { + while(queue1.size()!=1){ + queue2.enQueue(queue1.deQueue());; + } + } +} diff --git a/group11/1310368322/src/data_structure/dataStructure_9_Stack/TwoStackInOneArray.java b/group11/1310368322/src/data_structure/dataStructure_9_Stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..3b1c4ec8d2 --- /dev/null +++ b/group11/1310368322/src/data_structure/dataStructure_9_Stack/TwoStackInOneArray.java @@ -0,0 +1,89 @@ +package dataStructure_9_Stack; +import java.util.ArrayList; + +import javax.management.RuntimeErrorException; +/** + * һʵջ + * ʼλÿǵһջջףβڶջջףѹջʱջֱָмƶֱջָݡ + * @author liuxin + * + */ +public class TwoStackInOneArray { + + Object[] data = new Object[10]; + int i = 0;// һջ ջָ + int j = data.length-1;// ڶջջָ + public int getSize(){ + return data.length; + } + /** + * һջѹԪ + * @param o + */ + public void push1(Object o){ + ensureCapacity(); + System.out.println("i= " + i); + data[i++] = o; + } + + /** + * ӵһջеԪ + * @return + */ + public Object pop1(){ + if(i ==0 ){ + throw new RuntimeException("һջΪ"); + } + + return data[i--]; + } + + /** + * ȡһջջԪ + * @return + */ + + public Object peek1(){ + return data[i]; + } + /* + * ڶջѹԪ + */ + public void push2(Object o){ + ensureCapacity(); + System.out.println("j==" + j); + data[j--] = o; + } + /**b + * ӵڶջԪ + * @return + */ + public Object pop2(){ + return data[j++]; + } + /** + * ȡڶջջԪ + * @return + */ + + public Object peek2(){ + return data[j]; + } + + private void ensureCapacity() { + System.out.println("ensureCapacity: " + i + "" + j); + if(i >= j){ + data = grow(); + j = data.length - j; + } + + } + + private Object[] grow() { + Object[] dataNew = new Object[data.length*2]; + System.arraycopy(data, 0, dataNew, 0, i); + System.arraycopy(data, i, dataNew, dataNew.length-j, j); + return dataNew; + + } +} From 604957990f306341a4f4b21538f675aebdae8c4c Mon Sep 17 00:00:00 2001 From: GallenZhang <1298552064@qq.com> Date: Sun, 7 May 2017 19:39:22 +0800 Subject: [PATCH 465/552] =?UTF-8?q?=E7=AC=AC=E4=B8=83=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B9=8B=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第七次作业之数据结构 --- .../src/week07/basic/InfixToPostfix.java | 45 ++++++++++++++++ .../src/week07/basic/PostfixExpr.java | 51 ++++++++++++++++++ .../src/week07/basic/PrefixExpr.java | 51 ++++++++++++++++++ .../1298552064/src/week07/basic/Token.java | 52 +++++++++++++++++++ .../src/week07/basic/TokenParser.java | 44 ++++++++++++++++ .../src/week07/test/InfixToPostfixTest.java | 35 +++++++++++++ .../src/week07/test/PostfixExprTest.java | 37 +++++++++++++ .../src/week07/test/PrefixExprTest.java | 43 +++++++++++++++ 8 files changed, 358 insertions(+) create mode 100644 group01/1298552064/src/week07/basic/InfixToPostfix.java create mode 100644 group01/1298552064/src/week07/basic/PostfixExpr.java create mode 100644 group01/1298552064/src/week07/basic/PrefixExpr.java create mode 100644 group01/1298552064/src/week07/basic/Token.java create mode 100644 group01/1298552064/src/week07/basic/TokenParser.java create mode 100644 group01/1298552064/src/week07/test/InfixToPostfixTest.java create mode 100644 group01/1298552064/src/week07/test/PostfixExprTest.java create mode 100644 group01/1298552064/src/week07/test/PrefixExprTest.java diff --git a/group01/1298552064/src/week07/basic/InfixToPostfix.java b/group01/1298552064/src/week07/basic/InfixToPostfix.java new file mode 100644 index 0000000000..0d0c2c5b34 --- /dev/null +++ b/group01/1298552064/src/week07/basic/InfixToPostfix.java @@ -0,0 +1,45 @@ +package week07.basic; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + public static List convert(String expr) { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + List rsTokens = new ArrayList<>(); + Stack operatorStack = new Stack<>(); + for(int i=0 ; i < tokens.size(); i++){ + Token token = tokens.get(i); + if(token.isNumber()){ + rsTokens.add(token); + continue; + } + + if(token.isOperator()){ + if(operatorStack.isEmpty()){ + operatorStack.push(token); + continue; + } + + Token curStack = operatorStack.peek(); + if(token.hasHigherPriority(curStack)){ + operatorStack.push(token); + }else{ + while(!operatorStack.isEmpty() && (curStack = operatorStack.peek()).hasHigherPriority(token)){ + rsTokens.add(curStack); + operatorStack.pop(); + } + operatorStack.push(token); + } + + } + } + + while(!operatorStack.isEmpty()){ + rsTokens.add(operatorStack.pop()); + } + return rsTokens; + } +} diff --git a/group01/1298552064/src/week07/basic/PostfixExpr.java b/group01/1298552064/src/week07/basic/PostfixExpr.java new file mode 100644 index 0000000000..1a414b5ba2 --- /dev/null +++ b/group01/1298552064/src/week07/basic/PostfixExpr.java @@ -0,0 +1,51 @@ +package week07.basic; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + /** + * 计算 + * @param operator 运算符 + * @param i1 操作数1 + * @param i2 操作数2 + * @return + */ + private int cal(char operator, int i1, int i2){ + int result = 0; + switch(operator){ + case '+' : result = i1 + i2 ; break; + case '-' : result = i1 - i2 ; break; + case '*' : result = i1 * i2 ; break; + case '/' : + if(i1 == 0){ + throw new ArithmeticException("除数不能为0"); + } + result = i1 / i2 ; break; + } + return result; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + Stack numStack = new Stack<>(); + for(int i = 0; i < tokens.size(); i++){ + Token token = tokens.get(i); + if(token.isNumber()){ + numStack.push(token.getIntValue()); + }else if(token.isOperator()){ + int n2 = numStack.pop(); + int n1 = numStack.pop(); + numStack.push(cal(token.value.charAt(0),n1,n2)); + } + } + return (float)numStack.pop() ; + } +} diff --git a/group01/1298552064/src/week07/basic/PrefixExpr.java b/group01/1298552064/src/week07/basic/PrefixExpr.java new file mode 100644 index 0000000000..f52942dfbb --- /dev/null +++ b/group01/1298552064/src/week07/basic/PrefixExpr.java @@ -0,0 +1,51 @@ +package week07.basic; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + private String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + /** + * 计算 + * @param operator 运算符 + * @param i1 操作数1 + * @param i2 操作数2 + * @return + */ + private int cal(char operator, int i1, int i2){ + int result = 0; + switch(operator){ + case '+' : result = i1 + i2 ; break; + case '-' : result = i1 - i2 ; break; + case '*' : result = i1 * i2 ; break; + case '/' : + if(i1 == 0){ + throw new ArithmeticException("除数不能为0"); + } + result = i1 / i2 ; break; + } + return result; + } + + public float evaluate() { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + Stack numStack = new Stack<>(); + for(int i = tokens.size() - 1; i >= 0;i--){ + Token token = tokens.get(i); + if(token.isNumber()){ + numStack.push(token.getIntValue()); + }else if(token.isOperator()){ + int n1 = numStack.pop(); + int n2 = numStack.pop(); + numStack.push(cal(token.value.charAt(0), n1, n2)); + } + } + return (float)numStack.pop() ; + } +} diff --git a/group01/1298552064/src/week07/basic/Token.java b/group01/1298552064/src/week07/basic/Token.java new file mode 100644 index 0000000000..e2a13816ca --- /dev/null +++ b/group01/1298552064/src/week07/basic/Token.java @@ -0,0 +1,52 @@ +package week07.basic; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public int getIntValue() { + return Integer.parseInt(value); + } + + @Override + public String toString() { + return value; + } + + public boolean hasHigherPriority(Token t) { + if (!this.isOperator() && !t.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) >= 0; + + } + +} diff --git a/group01/1298552064/src/week07/basic/TokenParser.java b/group01/1298552064/src/week07/basic/TokenParser.java new file mode 100644 index 0000000000..7f7e5bc83e --- /dev/null +++ b/group01/1298552064/src/week07/basic/TokenParser.java @@ -0,0 +1,44 @@ +package week07.basic; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + public List parse(String expr){ + List tokens = new ArrayList<>(); + int i = 0; + while(i < expr.length()){ + char c = expr.charAt(i); + if(isOperator(c)){ + Token token = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(token); + i++; + }else if(Character.isDigit(c)){ + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token token = new Token(Token.NUMBER, value); + tokens.add(token); + i = nextOperatorIndex; + }else{ + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + } + return tokens; + } + + public int indexOfNextOperator(int i,String expr){ + while(Character.isDigit(expr.charAt(i))){ + i++; + if(i == expr.length()){ + break; + } + } + return i; + } + + public boolean isOperator(char c){ + String s = String.valueOf(c); + return Token.OPERATORS.contains(s); + } +} diff --git a/group01/1298552064/src/week07/test/InfixToPostfixTest.java b/group01/1298552064/src/week07/test/InfixToPostfixTest.java new file mode 100644 index 0000000000..f747e5be3f --- /dev/null +++ b/group01/1298552064/src/week07/test/InfixToPostfixTest.java @@ -0,0 +1,35 @@ +package week07.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week07.basic.InfixToPostfix; + +public class InfixToPostfixTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testconvert() { + + Assert.assertEquals("[2, 3, 4, *, +, 5, +]", InfixToPostfix.convert("2+3*4+5").toString()); + + Assert.assertEquals("[3, 20, *, 12, 5, *, +, 40, 2, /, -]", InfixToPostfix.convert("3*20+12*5-40/2").toString()); + + Assert.assertEquals("[10, 2, 3, *, -, 50, +]", InfixToPostfix.convert("10-2*3+50").toString()); + + Assert.assertEquals("[3, 20, 2, /, *]", InfixToPostfix.convert("3*20/2").toString()); + + Assert.assertEquals("[10, 30, 50, +, -]", InfixToPostfix.convert("10-30+50").toString()); + + Assert.assertEquals("[20, 2, 3, *, /]", InfixToPostfix.convert("20/2*3").toString()); + + } +} diff --git a/group01/1298552064/src/week07/test/PostfixExprTest.java b/group01/1298552064/src/week07/test/PostfixExprTest.java new file mode 100644 index 0000000000..3578cded0e --- /dev/null +++ b/group01/1298552064/src/week07/test/PostfixExprTest.java @@ -0,0 +1,37 @@ +package week07.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week07.basic.PostfixExpr; + +public class PostfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(), 0.0f); + } + { + // 9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(), 0.0f); + } + + { + // 10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(), 0.0f); + } + } +} diff --git a/group01/1298552064/src/week07/test/PrefixExprTest.java b/group01/1298552064/src/week07/test/PrefixExprTest.java new file mode 100644 index 0000000000..7c85c57bc4 --- /dev/null +++ b/group01/1298552064/src/week07/test/PrefixExprTest.java @@ -0,0 +1,43 @@ +package week07.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week07.basic.PrefixExpr; + +public class PrefixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(), 0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(), 0.001f); + } + { + // (3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(), 0.001f); + } + { + // 1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(), 0.001f); + } + + } +} From 35ab96293365375678c40b33994d12cf57b87b03 Mon Sep 17 00:00:00 2001 From: GallenZhang <1298552064@qq.com> Date: Sun, 7 May 2017 19:40:10 +0800 Subject: [PATCH 466/552] =?UTF-8?q?=E7=AC=AC=E5=85=AB=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B9=8B=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第八次作业之数据结构 --- .../src/week08/basic/CircleQueue.java | 53 ++++++++++++++++++ .../1298552064/src/week08/basic/Josephus.java | 40 ++++++++++++++ .../1298552064/src/week08/basic/Queue.java | 54 +++++++++++++++++++ .../src/week08/basic/QueueWithTwoStacks.java | 46 ++++++++++++++++ .../src/week08/test/CircleQueueTest.java | 40 ++++++++++++++ .../src/week08/test/JosephusTest.java | 26 +++++++++ 6 files changed, 259 insertions(+) create mode 100644 group01/1298552064/src/week08/basic/CircleQueue.java create mode 100644 group01/1298552064/src/week08/basic/Josephus.java create mode 100644 group01/1298552064/src/week08/basic/Queue.java create mode 100644 group01/1298552064/src/week08/basic/QueueWithTwoStacks.java create mode 100644 group01/1298552064/src/week08/test/CircleQueueTest.java create mode 100644 group01/1298552064/src/week08/test/JosephusTest.java diff --git a/group01/1298552064/src/week08/basic/CircleQueue.java b/group01/1298552064/src/week08/basic/CircleQueue.java new file mode 100644 index 0000000000..af1eed0575 --- /dev/null +++ b/group01/1298552064/src/week08/basic/CircleQueue.java @@ -0,0 +1,53 @@ +package week08.basic; + +import java.util.Arrays; + +/** + * 用数组实现循环队列 + * @author gallenzhang + * + * @param + */ +public class CircleQueue { + private final static int DEFAULT_SIZE = 10; + + // 用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + //队列的长度 + private int size; + // 队头 + private int front = 0; + // 队尾 + private int rear = 0; + + public boolean isEmpty() { + return front == rear; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + if((rear + 1) % elementData.length == front){ + int len = elementData.length + elementData.length / 2; + elementData = Arrays.copyOf(elementData, len); + } + elementData[rear] = data; + size++; + rear = (rear + 1) % elementData.length; + } + + @SuppressWarnings("unchecked") + public E deQueue() { + if(isEmpty()){ + return null; + } + + E e = (E) elementData[front]; + front = (front + 1) % elementData.length; + size--; + return e; + } +} diff --git a/group01/1298552064/src/week08/basic/Josephus.java b/group01/1298552064/src/week08/basic/Josephus.java new file mode 100644 index 0000000000..846cc7bf59 --- /dev/null +++ b/group01/1298552064/src/week08/basic/Josephus.java @@ -0,0 +1,40 @@ +package week08.basic; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 该方法返回一个List, 包含了被杀死人的次序 + * + * @author gallenzhang + * + */ +public class Josephus { + + public static List execute(int n, int m) { + Queue allQueue = new Queue<>(); + Queue killQueue = new Queue<>(); + for(int i = 0; i < n; i++){ + allQueue.enQueue(i); + } + + int k = 0; + while(!allQueue.isEmpty()){ + Integer num = allQueue.deQueue(); + k++; + if(k == m){ + killQueue.enQueue(num); + k = 0; + }else{ + allQueue.enQueue(num); + } + } + List killList = new ArrayList<>(); + while(!killQueue.isEmpty()){ + killList.add(killQueue.deQueue()); + } + + return killList; + } +} diff --git a/group01/1298552064/src/week08/basic/Queue.java b/group01/1298552064/src/week08/basic/Queue.java new file mode 100644 index 0000000000..00ad554de6 --- /dev/null +++ b/group01/1298552064/src/week08/basic/Queue.java @@ -0,0 +1,54 @@ +package week08.basic; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + private static class Node { + private E item; + private Node next; + } + + public Queue() { + first = null; + last = null; + size = 0; + } + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } else { + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } +} diff --git a/group01/1298552064/src/week08/basic/QueueWithTwoStacks.java b/group01/1298552064/src/week08/basic/QueueWithTwoStacks.java new file mode 100644 index 0000000000..35daf8f4a9 --- /dev/null +++ b/group01/1298552064/src/week08/basic/QueueWithTwoStacks.java @@ -0,0 +1,46 @@ +package week08.basic; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * + * @author gallenzhang + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.size() == 0; + } + + public int size() { + return stack1.size(); + } + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if(stack1.isEmpty()){ + return null; + } + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + E e = stack2.pop(); + while(!stack2.isEmpty()){ + stack1.push(stack2.pop()); + } + return e; + } +} diff --git a/group01/1298552064/src/week08/test/CircleQueueTest.java b/group01/1298552064/src/week08/test/CircleQueueTest.java new file mode 100644 index 0000000000..2ad18c04b6 --- /dev/null +++ b/group01/1298552064/src/week08/test/CircleQueueTest.java @@ -0,0 +1,40 @@ +package week08.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week08.basic.CircleQueue; + +public class CircleQueueTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(); + Assert.assertTrue(queue.isEmpty()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } +} diff --git a/group01/1298552064/src/week08/test/JosephusTest.java b/group01/1298552064/src/week08/test/JosephusTest.java new file mode 100644 index 0000000000..6c392438bc --- /dev/null +++ b/group01/1298552064/src/week08/test/JosephusTest.java @@ -0,0 +1,26 @@ +package week08.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week08.basic.Josephus; + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } +} From 04d6a67555a1b4f2b0f9f530a7c40687ef8cdb89 Mon Sep 17 00:00:00 2001 From: TonyHui Date: Sun, 7 May 2017 20:57:27 +0800 Subject: [PATCH 467/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/aaront/exercise/basic/Josephus.java | 31 ++++++ .../aaront/exercise/basic/QuickMinStack.java | 56 ++++++++++ .../com/aaront/exercise/basic/StackUtil.java | 102 ++++++++++++++++++ .../exercise/basic/StackWithTwoQueues.java | 24 +++++ .../exercise/basic/TwoStackInOneArray.java | 91 ++++++++++++++++ .../aaront/exercise/basic/expr/InfixExpr.java | 73 +++++++++++++ .../exercise/basic/expr/InfixToPostfix.java | 35 ++++++ .../exercise/basic/expr/PostfixExpr.java | 51 +++++++++ .../exercise/basic/expr/PrefixExpr.java | 53 +++++++++ .../com/aaront/exercise/basic/expr/Token.java | 47 ++++++++ .../exercise/basic/expr/TokenParser.java | 55 ++++++++++ .../aaront/exercise/generic/CircleQueue.java | 41 +++++++ .../exercise/generic/QueueWithTwoStacks.java | 42 ++++++++ .../aaront/execrise/basic/JosephusTest.java | 24 +++++ .../execrise/basic/QuickMinStackTest.java | 48 +++++++++ .../aaront/execrise/basic/StackUtilTest.java | 66 ++++++++++++ .../basic/StackWithTwoQueuesTest.java | 27 +++++ .../basic/TwoStackInOneArrayTest.java | 43 ++++++++ .../aaront/execrise/expr/InfixExprTest.java | 53 +++++++++ .../execrise/expr/InfixToPostfixTest.java | 38 +++++++ .../aaront/execrise/expr/PostfixExprTest.java | 42 ++++++++ .../aaront/execrise/expr/PrefixExprTest.java | 46 ++++++++ .../aaront/execrise/expr/TokenParserTest.java | 40 +++++++ .../execrise/generic/CircleQueueTest.java | 43 ++++++++ .../generic/QueueWithTwoStacksTest.java | 28 +++++ 25 files changed, 1199 insertions(+) create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Josephus.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/QuickMinStack.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/StackUtil.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/StackWithTwoQueues.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/TwoStackInOneArray.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/InfixExpr.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/InfixToPostfix.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/PostfixExpr.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/PrefixExpr.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/Token.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/TokenParser.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/CircleQueue.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/QueueWithTwoStacks.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/JosephusTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QuickMinStackTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackUtilTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackWithTwoQueuesTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/TwoStackInOneArrayTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixExprTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixToPostfixTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PostfixExprTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PrefixExprTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/TokenParserTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/CircleQueueTest.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/QueueWithTwoStacksTest.java diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Josephus.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Josephus.java new file mode 100644 index 0000000000..8e25ad86c2 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/Josephus.java @@ -0,0 +1,31 @@ +package com.aaront.exercise.basic; + +import com.aaront.exercise.generic.GenericQueue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * + */ +public class Josephus { + + public static List execute(int n, int m) { + List manKilled = new ArrayList<>(); + GenericQueue queue = new GenericQueue<>(); + for (int i = 0; i < n; i++) { + queue.enQueue(i); + } + + while (queue.size() != 0) { + for (int i = 1; i < m; i++) { + queue.enQueue(queue.deQueue()); + } + manKilled.add(queue.deQueue()); + } + return manKilled; + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/QuickMinStack.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/QuickMinStack.java new file mode 100644 index 0000000000..95140bf777 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/QuickMinStack.java @@ -0,0 +1,56 @@ +package com.aaront.exercise.basic; + +import java.util.Arrays; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回该数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + */ +public class QuickMinStack { + + private static final int DEFAULT_LENGTH = 20; + private Node[] nodes = new Node[DEFAULT_LENGTH]; + + private int size = 0; + + public void push(int data) { + _ensureCapacityEnough(); + if (size == 0) { + Node node = new Node(data, data); + nodes[size++] = node; + } else { + int min = nodes[size - 1].min; + Node node = new Node(data, data > min ? min : data); + nodes[size++] = node; + } + } + + public int pop() { + if (size <= 0) throw new RuntimeException("栈为空"); + return nodes[--size].data; + } + + public int findMin() { + return nodes[size - 1].min; + } + + public int size() { + return this.size; + } + + private void _ensureCapacityEnough() { + if (size >= nodes.length) { + nodes = Arrays.copyOf(nodes, DEFAULT_LENGTH * 2); + } + } +} + +class Node { + int data; + int min; + + public Node(int data, int min) { + this.data = data; + this.min = min; + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/StackUtil.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/StackUtil.java new file mode 100644 index 0000000000..fde0d047a3 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/StackUtil.java @@ -0,0 +1,102 @@ +package com.aaront.exercise.basic; + +import java.util.Arrays; +import java.util.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) { + if (s == null) return; + Integer[] temp = new Integer[s.size()]; + int i = 0; + while (!s.isEmpty()) { + temp[i++] = s.pop(); + } + for(i = 0;i < temp.length;i++) { + s.push(temp[i]); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + if (s == null) return; + Stack temp = new Stack(); + while (!s.isEmpty()) { + Object element = s.pop(); + if (element.equals(o)) break; + temp.push(element); + } + while (!temp.isEmpty()) { + s.push(temp.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + if (s == null) return null; + int index = 0; + Object[] elements = new Object[len]; + while (!s.isEmpty() && index < len) { + elements[index] = s.pop(); + index++; + } + for (int i = index - 1; i >= 0; i--) { + s.push(elements[i]); + } + return Arrays.copyOf(elements, index); + } + + /** + * 字符串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) { + if (s.isEmpty()) return true; + Stack stack = new Stack<>(); + for (int i = 0, len = s.length(); i < len; i++) { + char c = s.charAt(i); + switch (c) { + case '(': + case '[': + case '{': + stack.push(c); + break; + case ')': + if(stack.peek().equals('(')) stack.pop(); + else return false; + break; + case ']': + if(stack.peek().equals('[')) stack.pop(); + else return false; + break; + case '}': + if (stack.peek().equals('{')) stack.pop(); + else return false; + break; + } + } + return stack.isEmpty(); + } +} + + diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/StackWithTwoQueues.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/StackWithTwoQueues.java new file mode 100644 index 0000000000..54c7db6d87 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/StackWithTwoQueues.java @@ -0,0 +1,24 @@ +package com.aaront.exercise.basic; + +import com.aaront.exercise.generic.GenericQueue; + +public class StackWithTwoQueues { + + private GenericQueue queue1 = new GenericQueue<>(); + private GenericQueue queue2 = new GenericQueue<>(); + + public void push(int data) { + queue1.enQueue(data); + } + + public int pop() { + while (queue1.size() != 1) { + queue2.enQueue(queue1.deQueue()); + } + int element = queue1.deQueue(); + while (!queue2.isEmpty()) { + queue1.enQueue(queue2.deQueue()); + } + return element; + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/TwoStackInOneArray.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/TwoStackInOneArray.java new file mode 100644 index 0000000000..1d2e1edb3e --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/TwoStackInOneArray.java @@ -0,0 +1,91 @@ +package com.aaront.exercise.basic; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + */ +public class TwoStackInOneArray { + private Object[] data = new Object[10]; + private int pos1 = -1; + private int pos2 = data.length; + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + _ensureCapacityEnough(); + data[++pos1] = o; + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + if (pos1 < 0) return null; + return data[pos1--]; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + if (pos1 < 0) return null; + return data[pos1]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + _ensureCapacityEnough(); + data[--pos2] = o; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + if (pos2 >= data.length) return null; + return data[pos2++]; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + if (pos2 >= data.length) return null; + return data[pos2]; + } + + private void _ensureCapacityEnough() { + if (pos1 + 1 == pos2) { + _dilatancy(); + } + } + + private void _dilatancy() { + Object[] temp = new Object[data.length * 2]; + for (int i = 0; i <= pos1; i++) { + temp[i] = data[i]; + } + + for (int i = pos2; i < data.length; i++) { + temp[temp.length - (data.length - i)] = data[i]; + } + + pos2 = temp.length - (data.length - pos2); + data = temp; + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/InfixExpr.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/InfixExpr.java new file mode 100644 index 0000000000..01240f90d0 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/InfixExpr.java @@ -0,0 +1,73 @@ +package com.aaront.exercise.basic.expr; + +import java.util.HashMap; +import java.util.Map; +import java.util.Stack; + +public class InfixExpr { + private String expr = null; + private Map map = new HashMap<>(4); + + public InfixExpr(String expr) { + this.expr = expr; + this.map.put('+', 1); + this.map.put('-', 1); + this.map.put('*', 2); + this.map.put('/', 2); + this.map.put('#', 0); + } + + public float evaluate() { + Stack operands = new Stack<>(); + // 要保证操作符栈中的操作符是按照操作符优先级递增的(不能相等) + Stack operators = new Stack<>(); + operators.push('#'); + for (int i = 0, len = expr.length(); i < len; i++) { + char c = expr.charAt(i); + Integer level = map.get(c); + if (c == '+' || c == '-' || c == '*' || c == '/') { + Character operator = operators.peek(); + Integer value = map.get(operator); + while (level <= value) { + Double operand2 = operands.pop(); + Double operand1 = operands.pop(); + Double result = calc(operators.pop(), operand1, operand2); + operands.push(result); + operator = operators.peek(); + value = map.get(operator); + } + + operators.push(c); + } else { + int j = i; + for (; j < len && expr.charAt(j) >= '0' && expr.charAt(j) <= '9'; j++) ; + operands.push(Double.parseDouble(expr.substring(i, j))); + i = j - 1; + } + } + + while (operators.size() != 1) { + Double operand2 = operands.pop(); + Double operand1 = operands.pop(); + Double result = calc(operators.pop(), operand1, operand2); + operands.push(result); + } + + return operands.pop().floatValue(); + } + + private Double calc(Character operator, Double operand1, Double operand2) { + switch (operator) { + case '+': + return operand1 + operand2; + case '-': + return operand1 - operand2; + case '*': + return operand1 * operand2; + case '/': + return operand1 / operand2; + default: + throw new IllegalArgumentException("不支持的运算符"); + } + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/InfixToPostfix.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/InfixToPostfix.java new file mode 100644 index 0000000000..f42212fddc --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/InfixToPostfix.java @@ -0,0 +1,35 @@ +package com.aaront.exercise.basic.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + List reversePolish = new ArrayList<>(); + Stack stack = new Stack<>(); + for (int i = 0; i < tokens.size(); i++) { + Token token = tokens.get(i); + if (token.isNumber()) reversePolish.add(token); + else { + if(stack.isEmpty()) stack.push(token); + else { + Token topToken = stack.peek(); + while (!token.hasHigherPriority(topToken)) { + reversePolish.add(stack.pop()); + if(stack.isEmpty()) break; + topToken = stack.peek(); + } + stack.push(token); + } + } + } + while (!stack.isEmpty()) { + reversePolish.add(stack.pop()); + } + return reversePolish; + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/PostfixExpr.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/PostfixExpr.java new file mode 100644 index 0000000000..7c51086b98 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/PostfixExpr.java @@ -0,0 +1,51 @@ +package com.aaront.exercise.basic.expr; + +import java.util.ArrayList; +import java.util.List; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List elements = toList(expr.split(" ")); + for (int i = 0; i < elements.size(); i++) { + String element = elements.get(i); + if (element.equals("+") || element.equals("-") || element.equals("*") || element.equals("/")) { + Double result = calc(element, Double.valueOf(elements.get(i - 2)), Double.valueOf(elements.get(i - 1))); + elements.add(i - 2, result.toString()); + for (int j = 0; j < 3; j++) { + elements.remove(i - 1); + } + i = -1; + } + } + return Float.valueOf(elements.get(0)); + } + + private List toList(String[] elements) { + List list = new ArrayList<>(elements.length); + for (int i = 0; i < elements.length; i++) { + list.add(elements[i]); + } + return list; + } + + private Double calc(String operator, Double operand1, Double operand2) { + switch (operator) { + case "+": + return operand1 + operand2; + case "-": + return operand1 - operand2; + case "*": + return operand1 * operand2; + case "/": + return operand1 / operand2; + default: + throw new IllegalArgumentException("不支持的运算符"); + } + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/PrefixExpr.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/PrefixExpr.java new file mode 100644 index 0000000000..137fdb9c4f --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/PrefixExpr.java @@ -0,0 +1,53 @@ +package com.aaront.exercise.basic.expr; + +import java.util.ArrayList; +import java.util.List; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List elements = toList(expr.split(" ")); + for (int i = elements.size() - 1; i >= 0; i++) { + String element = elements.get(i); + if (element.equals("+") || element.equals("-") || element.equals("*") || element.equals("/")) { + Double result = calc(element, Double.valueOf(elements.get(i + 1)), Double.valueOf(elements.get(i + 2))); + elements.add(i, result.toString()); + for (int j = 0; j < 3; j++) { + elements.remove(i + 1); + } + i = elements.size() - 2; + } + } + return Float.valueOf(elements.get(0)); + } + + private List toList(String[] elements) { + List list = new ArrayList<>(elements.length); + for (int i = 0; i < elements.length; i++) { + list.add(elements[i]); + } + return list; + } + + private Double calc(String operator, Double operand1, Double operand2) { + switch (operator) { + case "+": + return operand1 + operand2; + case "-": + return operand1 - operand2; + case "*": + return operand1 * operand2; + case "/": + return operand1 / operand2; + default: + throw new IllegalArgumentException("不支持的运算符"); + } + } + + +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/Token.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/Token.java new file mode 100644 index 0000000000..4e7fc095d0 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/Token.java @@ -0,0 +1,47 @@ +package com.aaront.exercise.basic.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/TokenParser.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/TokenParser.java new file mode 100644 index 0000000000..f03ecbe19f --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/expr/TokenParser.java @@ -0,0 +1,55 @@ +package com.aaront.exercise.basic.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else { + System.out.println("char :[" + c + "] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/CircleQueue.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/CircleQueue.java new file mode 100644 index 0000000000..13d3470b62 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/CircleQueue.java @@ -0,0 +1,41 @@ +package com.aaront.exercise.generic; + +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return front == rear; + } + + public boolean isFull() { + if(rear == elementData.length && front == 0) return true; + return front == rear + 1; + } + + public int size() { + if(rear < front) return elementData.length - front + rear; + return rear - front; + } + + public void enQueue(E data) { + if (isFull()) return; + if(rear == elementData.length) rear = 0; + elementData[rear++] = data; + } + + public E deQueue() { + if (isEmpty()) return null; + if(front == elementData.length) front = 0; + Object element = elementData[front++]; + return (E) element; + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/QueueWithTwoStacks.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/QueueWithTwoStacks.java new file mode 100644 index 0000000000..b07bb5dc3e --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/QueueWithTwoStacks.java @@ -0,0 +1,42 @@ +package com.aaront.exercise.generic; + +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.empty(); + } + + + public int size() { + return stack1.size() + stack2.size(); + } + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if (isEmpty()) return null; + if (stack2.isEmpty()) _copy(); + return stack2.pop(); + } + + private void _copy() { + while (!stack1.isEmpty()) { + E element = stack1.pop(); + stack2.push(element); + } + } + +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/JosephusTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/JosephusTest.java new file mode 100644 index 0000000000..92cc66e7d3 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/JosephusTest.java @@ -0,0 +1,24 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.Josephus; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + } + +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QuickMinStackTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QuickMinStackTest.java new file mode 100644 index 0000000000..f0f2dc5621 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/QuickMinStackTest.java @@ -0,0 +1,48 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.QuickMinStack; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class QuickMinStackTest { + + @Test + public void test() { + QuickMinStack stack = new QuickMinStack(); + stack.push(5); + stack.push(-5); + stack.push(50); + stack.push(23); + stack.push(0); + stack.push(100); + + assertEquals(-5, stack.findMin()); + assertEquals(6, stack.size()); + + assertEquals(100, stack.pop()); + assertEquals(-5, stack.findMin()); + + stack.push(-4); + assertEquals(-5, stack.findMin()); + + assertEquals(-4, stack.pop()); + assertEquals(-5, stack.findMin()); + + assertEquals(0, stack.pop()); + assertEquals(-5, stack.findMin()); + + assertEquals(23, stack.pop()); + assertEquals(-5, stack.findMin()); + + assertEquals(50, stack.pop()); + assertEquals(-5, stack.findMin()); + + assertEquals(-5, stack.pop()); + assertEquals(5, stack.findMin()); + + assertEquals(5, stack.pop()); + + assertEquals(0, stack.size()); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackUtilTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackUtilTest.java new file mode 100644 index 0000000000..ab055f2b22 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackUtilTest.java @@ -0,0 +1,66 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.StackUtil; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Stack; +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackWithTwoQueuesTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..5ca48c0fbb --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/StackWithTwoQueuesTest.java @@ -0,0 +1,27 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.StackWithTwoQueues; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class StackWithTwoQueuesTest { + + @Test + public void test() { + StackWithTwoQueues stack = new StackWithTwoQueues(); + for (int i = 0; i < 500; i++) { + stack.push(i); + } + for (int i = 0; i < 500; i++) { + assertEquals(500 - i - 1, stack.pop()); + } + + stack.push(50); + stack.push(60); + assertEquals(60, stack.pop()); + stack.push(70); + assertEquals(70, stack.pop()); + assertEquals(50, stack.pop()); + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/TwoStackInOneArrayTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..7d50c53bd8 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/TwoStackInOneArrayTest.java @@ -0,0 +1,43 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.TwoStackInOneArray; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class TwoStackInOneArrayTest { + + @Test + public void test() { + TwoStackInOneArray stack = new TwoStackInOneArray(); + for (int i = 0; i < 50; i++) { + stack.push1("stack1:" + i); + } + for (int i = 0; i < 50; i++) { + stack.push2("stack2:" + i); + } + + for (int i = 0; i < 50; i++) { + assertEquals("stack1:" + (50 - i - 1), stack.peek1()); + assertEquals("stack1:" + (50 - i - 1), stack.pop1()); + } + for (int i = 0; i < 50; i++) { + assertEquals("stack2:" + (50 - i - 1), stack.peek2()); + assertEquals("stack2:" + (50 - i - 1), stack.pop2()); + } + + stack.push1(50); + stack.push1(60); + assertEquals(60, stack.pop1()); + stack.push1(70); + assertEquals(70, stack.pop1()); + assertEquals(50, stack.pop1()); + + stack.push2(50); + stack.push2(60); + assertEquals(60, stack.pop2()); + stack.push2(70); + assertEquals(70, stack.pop2()); + assertEquals(50, stack.pop2()); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixExprTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixExprTest.java new file mode 100644 index 0000000000..515fe9ea57 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixExprTest.java @@ -0,0 +1,53 @@ +package com.aaront.execrise.expr; + +import com.aaront.exercise.basic.expr.InfixExpr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixToPostfixTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..7f92bf24b7 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixToPostfixTest.java @@ -0,0 +1,38 @@ +package com.aaront.execrise.expr; + +import com.aaront.exercise.basic.expr.InfixToPostfix; +import com.aaront.exercise.basic.expr.PostfixExpr; +import com.aaront.exercise.basic.expr.Token; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; + +public class InfixToPostfixTest { + + @Test + public void testConvert() { + { + String expr = "10-2*3+50"; + + List postFix = InfixToPostfix.convert(expr); + String postFixExpr = tokenListToString(postFix); + float postFixExprResult = calculatePostFixExpr(postFixExpr); + + Assert.assertEquals(54, postFixExprResult, 0.001); + } + } + + private String tokenListToString(List tokenList) { + StringBuilder builder = new StringBuilder(); + for (Token token : tokenList) { + builder.append(token + " "); + } + return builder.toString(); + } + + private float calculatePostFixExpr(String expr) { + PostfixExpr postfixExpr = new PostfixExpr(expr); + return postfixExpr.evaluate(); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PostfixExprTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PostfixExprTest.java new file mode 100644 index 0000000000..7a6511d663 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PostfixExprTest.java @@ -0,0 +1,42 @@ +package com.aaront.execrise.expr; + + + +import com.aaront.exercise.basic.expr.PostfixExpr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1 - 3 * + 10 2 / +"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PrefixExprTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PrefixExprTest.java new file mode 100644 index 0000000000..cfd2c8e4a1 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PrefixExprTest.java @@ -0,0 +1,46 @@ +package com.aaront.execrise.expr; + +import com.aaront.exercise.basic.expr.PrefixExpr; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/TokenParserTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/TokenParserTest.java new file mode 100644 index 0000000000..67c54c53ed --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/TokenParserTest.java @@ -0,0 +1,40 @@ +package com.aaront.execrise.expr; + +import com.aaront.exercise.basic.expr.Token; +import com.aaront.exercise.basic.expr.TokenParser; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/CircleQueueTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/CircleQueueTest.java new file mode 100644 index 0000000000..66ff17ed3b --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/CircleQueueTest.java @@ -0,0 +1,43 @@ +package com.aaront.execrise.generic; + +import com.aaront.exercise.generic.CircleQueue; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author tonyhui + * @since 17/5/6 + */ +public class CircleQueueTest { + + @Test + public void test() { + CircleQueue circleQueue = new CircleQueue<>(); + for (int i = 0; i < 10; i++) { + circleQueue.enQueue("circleQueue" + i); + } + Assert.assertEquals(10, circleQueue.size()); + Assert.assertFalse(circleQueue.isEmpty()); + for (int i = 0; i < 5; i++) { + Assert.assertEquals("circleQueue" + i, circleQueue.deQueue()); + } + Assert.assertEquals(5, circleQueue.size()); + Assert.assertFalse(circleQueue.isEmpty()); + for (int i = 5; i < 10; i++) { + Assert.assertEquals("circleQueue" + i, circleQueue.deQueue()); + } + Assert.assertEquals(0, circleQueue.size()); + Assert.assertTrue(circleQueue.isEmpty()); + + for (int i = 0; i < 6; i++) { + circleQueue.enQueue("item" + i); + } + Assert.assertEquals(6, circleQueue.size()); + Assert.assertFalse(circleQueue.isEmpty()); + for (int i = 0; i < 6; i++) { + Assert.assertEquals("item" + i, circleQueue.deQueue()); + } + Assert.assertEquals(0, circleQueue.size()); + Assert.assertTrue(circleQueue.isEmpty()); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/QueueWithTwoStacksTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/QueueWithTwoStacksTest.java new file mode 100644 index 0000000000..f3154fd56f --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/QueueWithTwoStacksTest.java @@ -0,0 +1,28 @@ +package com.aaront.execrise.generic; + +import com.aaront.exercise.generic.QueueWithTwoStacks; +import org.junit.Assert; +import org.junit.Test; + +public class QueueWithTwoStacksTest { + + @Test + public void test() { + QueueWithTwoStacks queue = new QueueWithTwoStacks<>(); + Assert.assertNull(queue.deQueue()); + Assert.assertTrue(queue.isEmpty()); + for (int i = 0; i < 100; i++) { + queue.enQueue("item" + i); + } + for (int i = 0; i < 50; i++) { + Assert.assertEquals("item" + i, queue.deQueue()); + } + queue.enQueue("item100"); + queue.enQueue("item101"); + Assert.assertEquals(52, queue.size()); + int i = 50; + while (!queue.isEmpty()) { + Assert.assertEquals("item" + i++, queue.deQueue()); + } + } +} \ No newline at end of file From 4149f38fe1b97cc54e976ab327f92137235b566f Mon Sep 17 00:00:00 2001 From: diliuzuzhanghao <949319266@qq.com> Date: Sun, 7 May 2017 21:23:49 +0800 Subject: [PATCH 468/552] jvm jvm --- .../ecust/common/linklist/LRUPageFrame.java | 201 ++++++++++++ .../common/linklist/LRUPageFrameTest.java | 67 ++++ .../jvm2/src/com/ecust/Util/Stack.java | 77 +++++ .../jvm2/src/com/ecust/Util/StackUtil.java | 291 ++++++++++++++++++ .../src/com/ecust/Util/StackUtilTest.java | 117 +++++++ .../jvm3/src/com/ecust/jvm3/InfixExpr.java | 5 + .../jvm3/src/com/ecust/jvm3/InfixExpr2.java | 194 ++++++++++++ .../src/com/ecust/jvm3/InfixExprTest.java | 5 + .../src/com/ecust/jvm4/InfixToPostfix2.java | 95 ++++++ .../jvm4/src/com/ecust/jvm4/PostfixExpr.java | 111 +++++++ .../src/com/ecust/jvm4/PostfixExprTest.java | 87 ++++++ .../jvm4/src/com/ecust/jvm4/PrefixExpr.java | 89 ++++++ .../src/com/ecust/jvm4/PrefixExprTest.java | 5 + .../jvm5/src/com/ecust/jvm5/CircleQueue.java | 149 +++++++++ .../jvm5/src/com/ecust/jvm5/Josephus.java | 77 +++++ .../jvm5/src/com/ecust/jvm5/JosephusTest.java | 5 + .../com/ecust/jvm5/QueueWithTwoStacks.java | 162 ++++++++++ 17 files changed, 1737 insertions(+) create mode 100644 group06/949319266/jvm1/src/com/ecust/common/linklist/LRUPageFrame.java create mode 100644 group06/949319266/jvm1/src/com/ecust/common/linklist/LRUPageFrameTest.java create mode 100644 group06/949319266/jvm2/src/com/ecust/Util/Stack.java create mode 100644 group06/949319266/jvm2/src/com/ecust/Util/StackUtil.java create mode 100644 group06/949319266/jvm2/src/com/ecust/Util/StackUtilTest.java create mode 100644 group06/949319266/jvm3/src/com/ecust/jvm3/InfixExpr.java create mode 100644 group06/949319266/jvm3/src/com/ecust/jvm3/InfixExpr2.java create mode 100644 group06/949319266/jvm3/src/com/ecust/jvm3/InfixExprTest.java create mode 100644 group06/949319266/jvm4/src/com/ecust/jvm4/InfixToPostfix2.java create mode 100644 group06/949319266/jvm4/src/com/ecust/jvm4/PostfixExpr.java create mode 100644 group06/949319266/jvm4/src/com/ecust/jvm4/PostfixExprTest.java create mode 100644 group06/949319266/jvm4/src/com/ecust/jvm4/PrefixExpr.java create mode 100644 group06/949319266/jvm4/src/com/ecust/jvm4/PrefixExprTest.java create mode 100644 group06/949319266/jvm5/src/com/ecust/jvm5/CircleQueue.java create mode 100644 group06/949319266/jvm5/src/com/ecust/jvm5/Josephus.java create mode 100644 group06/949319266/jvm5/src/com/ecust/jvm5/JosephusTest.java create mode 100644 group06/949319266/jvm5/src/com/ecust/jvm5/QueueWithTwoStacks.java diff --git a/group06/949319266/jvm1/src/com/ecust/common/linklist/LRUPageFrame.java b/group06/949319266/jvm1/src/com/ecust/common/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..756de196c5 --- /dev/null +++ b/group06/949319266/jvm1/src/com/ecust/common/linklist/LRUPageFrame.java @@ -0,0 +1,201 @@ +package com.ecust.common.linklist; + +public class LRUPageFrame { + + + + private static class Node { + + + + Node prev; + + Node next; + + int pageNum; + + + + Node() { + + } + + + + Node(int pageNum){ + + this.pageNum = pageNum; + + } + + } + + + + private int capacity; + + private int size; + + + + private Node first;// 链表头 + + private Node last;// 链表尾 + + + + + + public LRUPageFrame(int capacity) { + + + + this.capacity = capacity; + + + + } + + + + /** + + * 获取缓存中对象 + + * + + * @param pageNum + + * @return + + */ + + public void access(int pageNum) { + + //先遍历,看是否已存在缓存中 + + if (first != null) { + + Node node = first; + + while (node != null){ + + if (node.pageNum == pageNum) { + + if (node.prev != null) { + + node.prev.next = node.next; + + if (node.next != null) { + + node.next.prev = node.prev; + + } else { + + last = node.prev; + + } + + node.next = first; + + node.prev = null; + + first.prev = node; + + first = node; + + } + + return; + + } + + node = node.next; + + } + + } + + //遍历不到,插入缓存中,并去除最少用的缓存 + + if (last == null) { + + if (!(capacity > 0)) { + + return; + + } + + //一开始没有缓存的边界条件 + + last = new Node(pageNum); + + first = last; + + size++; + + return; + + } + + Node node = new Node(pageNum); + + node.next = first; + + first.prev = node; + + first = node; + + size++; + + if (size > capacity) { + + //缓存已满,去除最少用缓存 + + Node node2 = last.prev; + + node2.next = null; + + last = node2; + + size--; + + } + + } + + + + + + + + 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/group06/949319266/jvm1/src/com/ecust/common/linklist/LRUPageFrameTest.java b/group06/949319266/jvm1/src/com/ecust/common/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..9680f6c7be --- /dev/null +++ b/group06/949319266/jvm1/src/com/ecust/common/linklist/LRUPageFrameTest.java @@ -0,0 +1,67 @@ +package com.ecust.common.linklist; + +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(7); + + Assert.assertEquals("7", frame.toString()); + + frame.access(0); + + frame.access(0); + + Assert.assertEquals("0,7", frame.toString()); + + 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()); + + } + + + +} \ No newline at end of file diff --git a/group06/949319266/jvm2/src/com/ecust/Util/Stack.java b/group06/949319266/jvm2/src/com/ecust/Util/Stack.java new file mode 100644 index 0000000000..f5a7edb537 --- /dev/null +++ b/group06/949319266/jvm2/src/com/ecust/Util/Stack.java @@ -0,0 +1,77 @@ +package com.ecust.Util; + +import org.xukai.common.ArrayList; + + + +import java.util.EmptyStackException; + + + +public class Stack { + + + + private ArrayList elementData = new ArrayList(); + + + + public void push(Object o){ + + elementData.add(o); + + } + + + + public Object pop(){ + + if (isEmpty()) { + + throw new EmptyStackException(); + + } + + return elementData.remove(elementData.size()-1); + + } + + + + public Object peek(){ + + if (isEmpty()) { + + throw new EmptyStackException(); + + } + + return elementData.get(elementData.size()-1); + + } + + + + public boolean isEmpty(){ + + return elementData.size() == 0; + + } + + + + public int size(){ + + return elementData.size(); + + } + + + + public void display() { + + elementData.display(); + + } + +} diff --git a/group06/949319266/jvm2/src/com/ecust/Util/StackUtil.java b/group06/949319266/jvm2/src/com/ecust/Util/StackUtil.java new file mode 100644 index 0000000000..cc0c247394 --- /dev/null +++ b/group06/949319266/jvm2/src/com/ecust/Util/StackUtil.java @@ -0,0 +1,291 @@ +package com.ecust.Util; + +import com.google.common.base.Preconditions; + +import com.google.common.collect.Maps; + +import org.junit.Assert; + +import org.junit.Test; + + + +import java.util.HashMap; + +import java.util.regex.Pattern; + + + +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 stack1 = new Stack(); + + while (!s.isEmpty()){ + + stack1.push(s.pop()); + + } + + Stack stack2 = new Stack(); + + while (!stack1.isEmpty()){ + + stack2.push(stack1.pop()); + + } + + while (!stack2.isEmpty()){ + + s.push(stack2.pop()); + + } + + } + + @Test + + public void testReverse(){ + + Stack stack = new Stack(); + + stack.push(1); + + stack.push(2); + + stack.push(3); + + stack.push(4); + + stack.push(5); + + stack.display(); + + reverse(stack); + + stack.display(); + + } + + + + /** + + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + + * + + * @param o + + */ + + public static void remove(Stack s,Object o) { + + Stack stack = new Stack(); + + while (!s.isEmpty()){ + + if (!s.peek().equals(o)) { + + stack.push(s.pop()); + + } else { + + s.pop(); + + } + + } + + while (!stack.isEmpty()){ + + s.push(stack.pop()); + + } + + } + + + + @Test + + public void testRemove(){ + + Stack stack = new Stack(); + + stack.push(1); + + stack.push(2); + + stack.push(3); + + stack.push(4); + + stack.push(5); + + stack.display(); + + remove(stack,3); + + stack.display(); + + } + + + + + + /** + + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + + * @param len + + * @return + + */ + + public static Object[] getTop(Stack s,int len) { + + Preconditions.checkArgument(len > 0); + + Stack stack = new Stack(); + + Object[] objects = new Object[Math.min(len,s.size())]; + + for (int i = 0; i < len; i++) { + + if (s.isEmpty()) { + + break; + + } + + objects[i] = s.pop(); + + stack.push(objects[i]); + + } + + while (!stack.isEmpty()){ + + s.push(stack.pop()); + + } + + return objects; + + } + + + + @Test + + public void testGetTop(){ + + Stack stack = new Stack(); + + stack.push(1); + + stack.push(2); + + stack.push(3); + + stack.push(4); + + stack.push(5); + + stack.display(); + + Object[] objects = getTop(stack, 6); + + for (int i = 0; i < objects.length; i++) { + + System.out.println(objects[i]); + + } + + } + + /** + + * 字符串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){ + + HashMap map = Maps.newHashMap(); + + map.put("}","{"); + + map.put(")","("); + + map.put("]","["); + + Stack stack = new Stack(); + + char[] chars = s.toCharArray(); + + for (int i = 0; i < chars.length; i++) { + + if (Pattern.matches("[\\[({]{1}", chars[i]+"")) { + + stack.push(chars[i]); + + } + + if (Pattern.matches("[\\])}]{1}", chars[i]+"") && !map.get(chars[i]+"").equals(""+stack.pop())) { + + return false; + + } + + } + + return true; + + } + + + + @Test + + public void testIsValidPairs(){ + + Assert.assertTrue(isValidPairs("[d(a)](da){21}")); + + Assert.assertTrue(!isValidPairs("[d(a{)}](da){21}")); + + } + + + + + +} diff --git a/group06/949319266/jvm2/src/com/ecust/Util/StackUtilTest.java b/group06/949319266/jvm2/src/com/ecust/Util/StackUtilTest.java new file mode 100644 index 0000000000..63f68e849d --- /dev/null +++ b/group06/949319266/jvm2/src/com/ecust/Util/StackUtilTest.java @@ -0,0 +1,117 @@ +package com.ecust.Util; + +import org.junit.Assert; + +import org.junit.Test; + + + +public class StackUtilTest { + + + + + + @Test + + public void testReverse(){ + + Stack stack = new Stack(); + + stack.push(1); + + stack.push(2); + + stack.push(3); + + stack.push(4); + + stack.push(5); + + stack.display(); + + StackUtil.reverse(stack); + + stack.display(); + + } + + + + + + @Test + + public void testRemove(){ + + Stack stack = new Stack(); + + stack.push(1); + + stack.push(2); + + stack.push(3); + + stack.push(4); + + stack.push(5); + + stack.display(); + + StackUtil.remove(stack,3); + + stack.display(); + + } + + + + + + @Test + + public void testGetTop(){ + + Stack stack = new Stack(); + + stack.push(1); + + stack.push(2); + + stack.push(3); + + stack.push(4); + + stack.push(5); + + stack.display(); + + Object[] objects = StackUtil.getTop(stack, 8); + + for (int i = 0; i < objects.length; i++) { + + System.out.println(objects[i]); + + } + + Assert.assertEquals(5,objects.length); + + } + + + + @Test + + public void testIsValidPairs(){ + + Assert.assertTrue(StackUtil.isValidPairs("[d(a)](da){21}")); + + Assert.assertTrue(!StackUtil.isValidPairs("[d(a{)}](da){21}")); + + } + + + + + +} diff --git a/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExpr.java b/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExpr.java new file mode 100644 index 0000000000..d2cd280dda --- /dev/null +++ b/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExpr.java @@ -0,0 +1,5 @@ +package com.ecust.jvm3; + +public class InfixExpr { + +} diff --git a/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExpr2.java b/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExpr2.java new file mode 100644 index 0000000000..7a7ee922dd --- /dev/null +++ b/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExpr2.java @@ -0,0 +1,194 @@ +package com.ecust.jvm3; + +import java.util.HashMap; +import java.util.Stack; + + + +public class InfixExpr2 { + + + + public static enum TypeToken { + + + + add('+',0),substruct('-',1),devide('/',3),plus('*',2); + + + + TypeToken(char token, Integer priority) { + + this.token = token; + + this.priority = priority; + + } + + + + private char token; + + + + private Integer priority; + + } + + + + String expr = null; + + + + public InfixExpr2(String expr) { + + this.expr = expr; + + } + +//3*20+12*5-40/2 + + public Double evaluate() { + + HashMap map = new HashMap<>(); + + map.put("+",0); + + map.put("-",1); + + map.put("/",3); + + map.put("*",2); + + + + + + Stack tokenStack = new Stack(); + + Stack numStack = new Stack(); + + char[] chars = expr.toCharArray(); + + boolean isNem = true; + + for (int i = 0; i < expr.length(); i++) { + + String token = (expr.charAt(i)) + ""; + + Integer priprity = map.get(token); + + if (priprity != null) { + + //表示是运算符 + + if (!tokenStack.isEmpty() && priprity < map.get(tokenStack.peek())) { + + Float num2 = Float.valueOf(numStack.pop().toString()); + + Float num1 = Float.valueOf(numStack.pop().toString()); + + String pop = tokenStack.pop()+""; + + if (pop.equals("-")) { + + numStack.push(num1 - num2); + + } else if (pop.equals("*")){ + + numStack.push(num1 * num2); + + } else if (pop.equals("/")){ + + numStack.push(num1 / num2); + + } else { + + throw new RuntimeException(); + + } + + + + } + + tokenStack.push(token); + + isNem = true; + + } else if(token.matches("\\d{1}")) { + + //表示是数字 + + if (isNem) { + + numStack.push(token); + + } else { + + numStack.push(numStack.pop().toString() + token); + + } + + isNem = false; + + } else { + + throw new RuntimeException(); + + } + + } + + while (!tokenStack.isEmpty()) { + + System.out.println(tokenStack.size()); + + if (tokenStack.peek().equals("+")) { + + Float num2 = Float.valueOf(numStack.pop().toString()); + + Float num1 = Float.valueOf(numStack.pop().toString()); + + numStack.push(num1+num2+""); + + } else if (tokenStack.peek().equals("-")) { + + Float num2 = Float.valueOf(numStack.pop().toString()); + + Float num1 = Float.valueOf(numStack.pop().toString()); + + numStack.push(num1-num2+""); + + } else if (tokenStack.peek().equals("/")) { + + Float num2 = Float.valueOf(numStack.pop().toString()); + + Float num1 = Float.valueOf(numStack.pop().toString()); + + numStack.push(num1/num2+""); + + } else if (tokenStack.peek().equals("*")) { + + Float num2 = Float.valueOf(numStack.pop().toString()); + + Float num1 = Float.valueOf(numStack.pop().toString()); + + numStack.push(num1*num2+""); + + } else { + + throw new RuntimeException(); + + } + + tokenStack.pop(); + + } + + return Double.valueOf(numStack.pop().toString()); + + } + +} diff --git a/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExprTest.java b/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExprTest.java new file mode 100644 index 0000000000..607f5b8292 --- /dev/null +++ b/group06/949319266/jvm3/src/com/ecust/jvm3/InfixExprTest.java @@ -0,0 +1,5 @@ +package com.ecust.jvm3; + +public class InfixExprTest { + +} diff --git a/group06/949319266/jvm4/src/com/ecust/jvm4/InfixToPostfix2.java b/group06/949319266/jvm4/src/com/ecust/jvm4/InfixToPostfix2.java new file mode 100644 index 0000000000..b115f10a66 --- /dev/null +++ b/group06/949319266/jvm4/src/com/ecust/jvm4/InfixToPostfix2.java @@ -0,0 +1,95 @@ +package com.ecust.jvm4; + +import java.util.List; + +import java.util.Stack; + + + +public class InfixToPostfix2 { + + + + + + private static TokenParser tokenParser = new TokenParser(); + + + + public static String toPostFixExpr(String expr){ + + + + List tokens = tokenParser.parse(expr); + + + + Stack s1 = new Stack(); + + Stack s2 = new Stack(); + + + + for (Token token : tokens) { + + if (token.isNumber()) { + + s2.push(token); + + } else { + + while (token.isOperator() && !s1.isEmpty()) { + + if (!token.hasHigherPriority(s1.peek())) { + + s2.push(s1.pop()); + + continue; + + } + + break; + + } + + s1.push(token); + + } + + } + + while (!s1.isEmpty()) { + + s2.push(s1.pop()); + + } + + StringBuilder stringBuilder = new StringBuilder(); + + while (!s2.isEmpty()) { + + Token token = s2.pop(); + + s1.push(token); + + } + + while (!s1.isEmpty()) { + + Token token = s1.pop(); + + stringBuilder.append(token.toString()).append(" "); + + } + + + + return stringBuilder.substring(0,stringBuilder.length() - 1); + + } + + + + + +} diff --git a/group06/949319266/jvm4/src/com/ecust/jvm4/PostfixExpr.java b/group06/949319266/jvm4/src/com/ecust/jvm4/PostfixExpr.java new file mode 100644 index 0000000000..0e34a72d54 --- /dev/null +++ b/group06/949319266/jvm4/src/com/ecust/jvm4/PostfixExpr.java @@ -0,0 +1,111 @@ +package com.ecust.jvm4; + +import java.util.List; + +import java.util.Stack; + + + +/** + + * 与前缀表达式类似,只是顺序是从左至右: + + 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。 + + 例如后缀表达式“3 4 + 5 × 6 -”: + + (1) 从左至右扫描,将3和4压入堆栈; + + (2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈; + + (3) 将5入栈; + + (4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈; + + (5) 将6入栈; + + (6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 + + */ + +public class PostfixExpr { + +String expr = null; + + + + public PostfixExpr(String expr) { + + this.expr = expr; + + } + + + + public float evaluate() { + + TokenParser parser = new TokenParser(); + + List tokens = parser.parse(this.expr); + + + + + + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if(token.isNumber()){ + + numStack.push(new Float(token.getIntValue())); + + } else{ + + Float f2 = numStack.pop(); + + Float f1 = numStack.pop(); + + numStack.push(calculate(token.toString(),f1,f2)); + + } + + } + + return numStack.pop().floatValue(); + + } + + + + private Float calculate(String op, Float f1, Float f2){ + + if(op.equals("+")){ + + return f1+f2; + + } + + if(op.equals("-")){ + + return f1-f2; + + } + + if(op.equals("*")){ + + return f1*f2; + + } + + if(op.equals("/")){ + + return f1/f2; + + } + + throw new RuntimeException(op + " is not supported"); + + } + +} diff --git a/group06/949319266/jvm4/src/com/ecust/jvm4/PostfixExprTest.java b/group06/949319266/jvm4/src/com/ecust/jvm4/PostfixExprTest.java new file mode 100644 index 0000000000..ae48effdad --- /dev/null +++ b/group06/949319266/jvm4/src/com/ecust/jvm4/PostfixExprTest.java @@ -0,0 +1,87 @@ +package com.ecust.jvm4; + +import org.junit.After; + +import org.junit.Assert; + +import org.junit.Before; + +import org.junit.Test; + + + + + + + +public class PostfixExprTest { + + + + @Before + + public void setUp() throws Exception { + + } + + + + @After + + public void tearDown() throws Exception { + + } + + + + @Test + + public void testEvaluate() { + + { + + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + + Assert.assertEquals(288, expr.evaluate(),0.0f); + + } + + { + + //9+(3-1)*3+10/2 + + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + + Assert.assertEquals(20, expr.evaluate(),0.0f); + + } + + + + { + + //10-2*3+50 + + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + + Assert.assertEquals(54, expr.evaluate(),0.0f); + + } + + } + + + + @Test + + public void testTo(){ + + String poseExpr = InfixToPostfix2.toPostFixExpr("10-2*3+50"); + + System.out.println(poseExpr); + + } + + + +} diff --git a/group06/949319266/jvm4/src/com/ecust/jvm4/PrefixExpr.java b/group06/949319266/jvm4/src/com/ecust/jvm4/PrefixExpr.java new file mode 100644 index 0000000000..3274a236bd --- /dev/null +++ b/group06/949319266/jvm4/src/com/ecust/jvm4/PrefixExpr.java @@ -0,0 +1,89 @@ +package com.ecust.jvm4; + +import java.util.List; + +import java.util.Stack; + + +public class PrefixExpr { + + + private String expr; + + + + public PrefixExpr(String expr) { + + this.expr = expr; + + } + + + + public float evaluate(){ + + + + TokenParser tokenParser = new TokenParser(); + + List tokens = tokenParser.parse(expr); + + + + Stack numStack = new Stack(); + + Stack oprStack = new Stack(); + + + + for (int i = tokens.size() - 1; i > -1; i--) { + + if (tokens.get(i).isNumber()) { + + numStack.push(new Float(tokens.get(i).getIntValue())); + + } else { + + Float num1 = numStack.pop(); + + Float num2 = numStack.pop(); + + numStack.push(caculate(tokens.get(i).toString(), num1, num2)); + + } + + } + + + + return numStack.pop(); + + } + + + + private Float caculate(String oper, Float num1, Float num2){ + + if (oper.equals("+")) { + + return num1 + num2; + + } else if (oper.equals("-")) { + + return num1 - num2; + + } else if (oper.equals("/")) { + + return num1 / num2; + + } else if (oper.equals("*")) { + + return num1 * num2; + + } + + throw new RuntimeException("illeagal operation token"); + + } + +} diff --git a/group06/949319266/jvm4/src/com/ecust/jvm4/PrefixExprTest.java b/group06/949319266/jvm4/src/com/ecust/jvm4/PrefixExprTest.java new file mode 100644 index 0000000000..44c16c1f83 --- /dev/null +++ b/group06/949319266/jvm4/src/com/ecust/jvm4/PrefixExprTest.java @@ -0,0 +1,5 @@ +package com.ecust.jvm4; + +public class PrefixExprTest { + +} diff --git a/group06/949319266/jvm5/src/com/ecust/jvm5/CircleQueue.java b/group06/949319266/jvm5/src/com/ecust/jvm5/CircleQueue.java new file mode 100644 index 0000000000..58e87c295e --- /dev/null +++ b/group06/949319266/jvm5/src/com/ecust/jvm5/CircleQueue.java @@ -0,0 +1,149 @@ +package com.ecust.jvm5; + + + +public class CircleQueue { + + + + private final static int DEFAULT_SIZE = 10; + + + + private int count = 0; + + + + //用数组来保存循环队列的元素 + + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + + + //队头 + + private int front = 0; + + //队尾 + + private int rear = 0; + + + + public boolean isEmpty() { + + return count == 0; + + + + } + + + + public int size() { + + return count; + + } + + + + + + + + public void enQueue(E data) { + + if (count == DEFAULT_SIZE ) { + + throw new RuntimeException(); + + } + + elementData[front] = data; + + front = (front + 1) % DEFAULT_SIZE; + + count++; + + } + + + + public E deQueue() { + + if (count == 0) { + + return null; + + } + + count--; + + E e = (E)elementData[rear]; + + rear = (rear + 1) % DEFAULT_SIZE; + + return e; + + } + + + + public static void main(String[] args) { + + CircleQueue queue = new CircleQueue<>(); + + queue.enQueue(1); + + queue.enQueue(2); + + queue.enQueue(3); + + queue.enQueue(4); + + queue.enQueue(5); + + queue.enQueue(6); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue());System.out.println(queue.deQueue());System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + queue.enQueue(7); + + queue.enQueue(8); + + queue.enQueue(9); + + queue.enQueue(0); + + queue.enQueue(1); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + + + } + + + + + +} \ No newline at end of file diff --git a/group06/949319266/jvm5/src/com/ecust/jvm5/Josephus.java b/group06/949319266/jvm5/src/com/ecust/jvm5/Josephus.java new file mode 100644 index 0000000000..da0e89dc2f --- /dev/null +++ b/group06/949319266/jvm5/src/com/ecust/jvm5/Josephus.java @@ -0,0 +1,77 @@ +package com.ecust.jvm5; + +import java.util.ArrayDeque; + +import java.util.ArrayList; + +import java.util.List; + + + +public class Josephus { + + + + + + public static List execute(int n, int m){ + + Preconditions.checkArgument(n > 0); + + ArrayList deadList = new ArrayList<>(); + + ArrayDeque deque1 = new ArrayDeque<>(); + + ArrayDeque deque2 = new ArrayDeque<>(); + + for (int i = 0; i < n; i++) { + + deque1.offer(i); + + } + + int count = 0; + + while(n >= m){ + + if (deque1.isEmpty()) { + + while (!deque2.isEmpty()){ + + deque1.offer(deque2.poll()); + + } + + } + + count++; + + if (count == m) { + + deadList.add(deque1.poll()); + + count = 0; + + n--; + + continue; + + } + + deque2.offer(deque1.poll()); + + + + } + + + + return deadList; + + } + + + + + +} \ No newline at end of file diff --git a/group06/949319266/jvm5/src/com/ecust/jvm5/JosephusTest.java b/group06/949319266/jvm5/src/com/ecust/jvm5/JosephusTest.java new file mode 100644 index 0000000000..76bb7d3ba4 --- /dev/null +++ b/group06/949319266/jvm5/src/com/ecust/jvm5/JosephusTest.java @@ -0,0 +1,5 @@ +package com.ecust.jvm5; + +public class JosephusTest { + +} diff --git a/group06/949319266/jvm5/src/com/ecust/jvm5/QueueWithTwoStacks.java b/group06/949319266/jvm5/src/com/ecust/jvm5/QueueWithTwoStacks.java new file mode 100644 index 0000000000..052cf6d444 --- /dev/null +++ b/group06/949319266/jvm5/src/com/ecust/jvm5/QueueWithTwoStacks.java @@ -0,0 +1,162 @@ +package com.ecust.jvm5; + +import java.util.Stack; + + + +/** + + * 用两个栈来实现一个队列 + + * @author liuxin + + * + + * @param + + */ + +public class QueueWithTwoStacks { + + private Stack stack1; + + private Stack stack2; + + + + + + public QueueWithTwoStacks() { + + stack1 = new Stack(); + + stack2 = new Stack(); + + } + + + + + + + + + + public boolean isEmpty() { + + return stack1.isEmpty(); + + } + + + + + + + + public int size() { + + return stack1.size(); + + } + + + + + + + + public void enQueue(E item) { + + stack1.push(item); + + } + + + + public E deQueue() { + + if (stack1.isEmpty()) { + + return null; + + } + + while (!stack1.isEmpty()) { + + stack2.push(stack1.pop()); + + } + + E e = stack2.pop(); + + while (!stack2.isEmpty()) { + + stack1.push(stack2.pop()); + + } + + return e; + + } + + + + public static void main(String[] args) { + + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + + queue.enQueue(1); + + queue.enQueue(2); + + queue.enQueue(3); + + queue.enQueue(4); + + queue.enQueue(5); + + queue.enQueue(6); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue());System.out.println(queue.deQueue());System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + queue.enQueue(7); + + queue.enQueue(8); + + queue.enQueue(9); + + queue.enQueue(0); + + queue.enQueue(1); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + System.out.println(queue.deQueue()); + + + + + + } + + + + } + From 3ea2bffa094ad77cc177a9c8a543a27ff0933a64 Mon Sep 17 00:00:00 2001 From: Jiandan1357 Date: Sun, 7 May 2017 21:43:42 +0800 Subject: [PATCH 469/552] 8week&9week 8week&9week --- group23/601689050/8weekQueue/CircleQueue.java | 44 ++++++++++ group23/601689050/8weekQueue/Josephus.java | 50 ++++++++++++ group23/601689050/8weekQueue/Queue.java | 55 +++++++++++++ .../8weekQueue/QueueWithTwoStacks.java | 47 +++++++++++ .../601689050/9weekStack/QuickMinStack.java | 50 ++++++++++++ .../9weekStack/StackWithTwoQueues.java | 52 ++++++++++++ .../9weekStack/TwoStackInOneArray.java | 81 +++++++++++++++++++ 7 files changed, 379 insertions(+) create mode 100644 group23/601689050/8weekQueue/CircleQueue.java create mode 100644 group23/601689050/8weekQueue/Josephus.java create mode 100644 group23/601689050/8weekQueue/Queue.java create mode 100644 group23/601689050/8weekQueue/QueueWithTwoStacks.java create mode 100644 group23/601689050/9weekStack/QuickMinStack.java create mode 100644 group23/601689050/9weekStack/StackWithTwoQueues.java create mode 100644 group23/601689050/9weekStack/TwoStackInOneArray.java diff --git a/group23/601689050/8weekQueue/CircleQueue.java b/group23/601689050/8weekQueue/CircleQueue.java new file mode 100644 index 0000000000..7ca98467ec --- /dev/null +++ b/group23/601689050/8weekQueue/CircleQueue.java @@ -0,0 +1,44 @@ +/** + * Created by lxx on 2017/5/6. + */ +public class CircleQueue{ + + private int size; + private int first; + private int last; + Object[] queue; + + public CircleQueue(int size){ + queue = new Object[size]; + first = 0; + last = 0; + } + + public boolean isEmpty(){ + return first == last; + } + + public void enCircleQueue(Object o){ + if( (last+1) % size == first){ + System.out.println("Circle Queue is full"); + }else { + queue[last] = o; + last = (last+1) % queue.length; + } + } + + public int getSize(){ + return (last - first + queue.length) % queue.length; + } + + public Object deCircleQueue(){ + if(isEmpty()){ + return null; + }else{ + Object item = queue[first]; + first = (first+1)%queue.length; + return item; + } + + } +} diff --git a/group23/601689050/8weekQueue/Josephus.java b/group23/601689050/8weekQueue/Josephus.java new file mode 100644 index 0000000000..6e24811da3 --- /dev/null +++ b/group23/601689050/8weekQueue/Josephus.java @@ -0,0 +1,50 @@ + +/** + * Created by lxx on 2017/5/6. + */ + + + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * @author + * + */ +public class Josephus { + + private static class Node { + int data; + Node next; + + public Node(int i) { + data = i; + } + } + + public static void execute(int n, int m) { + + Node header = new Node(0); + Node pointer = header; + for (int i = 1; i < n; i++) { + pointer.next = new Node(i); + pointer = pointer.next; + } + pointer.next = header; + while (pointer != pointer.next) { + for (int i = 1; i <= m; i++) { + pointer = pointer.next; + } + System.out.println(pointer.next.data); + pointer.next = pointer.next.next; + } + System.out.println(pointer.next.data); + + } + public static void main(String args[]){ + Josephus circle = new Josephus(); + circle.execute(8,4); + } +} diff --git a/group23/601689050/8weekQueue/Queue.java b/group23/601689050/8weekQueue/Queue.java new file mode 100644 index 0000000000..bdfd22b16f --- /dev/null +++ b/group23/601689050/8weekQueue/Queue.java @@ -0,0 +1,55 @@ +import javax.xml.soap.Node; +import java.util.NoSuchElementException; + +/** + * Created by lxx on 2017/5/6. + */ +public class Queue { + + private Node first; + private Node last; + private int size; + + private static class Node{ + private E item; + private Node next; + } + public Queue(){ + first = null; + last = null; + size = 0; + } + public boolean isEmpty(){ + return first == null; + } + public int size(){ + return size; + } + public void enQueue(E data){ + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if(isEmpty()){ + first = last; + }else { + oldlast.next = last; + } + size++; + } + public E deQueue(){ + if(isEmpty()){ + throw new NoSuchElementException("queue is empty"); + }else{ + E item = first.item; + first = first.next; + size--; + if(isEmpty()){ + last = null; + } + return item; + } + } + + +} diff --git a/group23/601689050/8weekQueue/QueueWithTwoStacks.java b/group23/601689050/8weekQueue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..c8976aca56 --- /dev/null +++ b/group23/601689050/8weekQueue/QueueWithTwoStacks.java @@ -0,0 +1,47 @@ +import java.util.Stack; + +/** + * Created by lxx on 2017/5/6. + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + public QueueWithTwoStacks(){ + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty(){ + return stack1.isEmpty() && stack2.isEmpty(); + } + + public int size() + { + return stack1.size() + stack2.size(); + } + + public void enQueue(E item){ + + stack1.push(item); + } + + public E deQueue(){ + if(stack2.isEmpty()){ + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + } + return stack2.pop(); + } + public static void main(String args[]){ + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + queue.enQueue(1); + queue.enQueue(5); + queue.enQueue(4); + queue.enQueue(0); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + } +} diff --git a/group23/601689050/9weekStack/QuickMinStack.java b/group23/601689050/9weekStack/QuickMinStack.java new file mode 100644 index 0000000000..4033461599 --- /dev/null +++ b/group23/601689050/9weekStack/QuickMinStack.java @@ -0,0 +1,50 @@ +/** + * Created by lxx on 2017/5/6. + */ + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack extends Stack { + + Stack sMin; + public QuickMinStack(){ + sMin = new Stack(); + } + public void push(int data){ + if(data <= findMin()){ + sMin.push(data); + } + super.push(data); + } + public Integer pop(){ + int value = super.pop(); + if(value == findMin()){ + sMin.pop(); + } + return value; + } + public int findMin(){ + if(sMin.isEmpty()){ + return Integer.MAX_VALUE; + } + return sMin.peek(); + } + + public static void main(String args[]){ + QuickMinStack stack = new QuickMinStack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(0); + System.out.println(stack.pop().intValue()); + System.out.println(stack.findMin()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } +} diff --git a/group23/601689050/9weekStack/StackWithTwoQueues.java b/group23/601689050/9weekStack/StackWithTwoQueues.java new file mode 100644 index 0000000000..8eb1d996bf --- /dev/null +++ b/group23/601689050/9weekStack/StackWithTwoQueues.java @@ -0,0 +1,52 @@ +import java.util.LinkedList; + + +/** + * Created by lxx on 2017/5/6. + */ +public class StackWithTwoQueues { + + LinkedList queue1=new LinkedList(); + LinkedList queue2=new LinkedList(); + public void push(int data){ + queue1.addLast(data); + } + public int pop() { + if (sSize() > 0) { + if (!queue1.isEmpty()) { + while (queue1.size() > 1) { + queue2.addLast(queue1.removeFirst()); + } + return queue1.removeFirst(); + } else { + while (queue2.size() > 1) { + queue1.addLast(queue2.removeFirst()); + } + return queue2.removeFirst(); + } + } else { + System.out.println("栈空,不能出栈"); + return Integer.MAX_VALUE; + } + } + public int sSize(){ + return queue1.size() + queue2.size(); + } + public static void main(String[] args) + { + StackWithTwoQueues stack=new StackWithTwoQueues(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + stack.push(5); + stack.push(6); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } +} diff --git a/group23/601689050/9weekStack/TwoStackInOneArray.java b/group23/601689050/9weekStack/TwoStackInOneArray.java new file mode 100644 index 0000000000..916e1dab3b --- /dev/null +++ b/group23/601689050/9weekStack/TwoStackInOneArray.java @@ -0,0 +1,81 @@ +import java.util.Stack; + +/** + * Created by lxx on 2017/5/6. + */ +public class TwoStackInOneArray { + + + + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = data.length - 1; + + + private boolean isFull() { + if (index1 == index2) { + return true; + } else + return false; + } + + private void extendCapacity() { + + } + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return null; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + return null; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + return null; + } + +} From f304b0801e86a58f7d9c698055f297766d6ae0e7 Mon Sep 17 00:00:00 2001 From: sulei Date: Sun, 7 May 2017 21:49:28 +0800 Subject: [PATCH 470/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E8=A1=A5=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/download/DownloadThread.java | 20 +++ .../coderising/download/FileDownloader.java | 73 ++++++++ .../download/FileDownloaderTest.java | 59 ++++++ .../coderising/download/api/Connection.java | 23 +++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 ++ .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 +++ .../download/impl/ConnectionManagerImpl.java | 15 ++ .../coderising/litestruts/LoginAction.java | 39 ++++ .../src/com/coderising/litestruts/Struts.java | 34 ++++ .../com/coderising/litestruts/StrutsTest.java | 43 +++++ .../src/com/coderising/litestruts/View.java | 23 +++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/array/ArrayList.java | 35 ++++ .../src/com/coding/basic/array/ArrayUtil.java | 96 ++++++++++ .../coding/basic/linklist/LRUPageFrame.java | 164 +++++++++++++++++ .../basic/linklist/LRUPageFrameTest.java | 34 ++++ .../com/coding/basic/linklist/LinkedList.java | 125 +++++++++++++ .../com/coding/basic/queue/CircleQueue.java | 46 +++++ .../coding/basic/queue/CircleQueueTest.java | 44 +++++ .../src/com/coding/basic/queue/Josephus.java | 39 ++++ .../com/coding/basic/queue/JosephusTest.java | 27 +++ .../src/com/coding/basic/queue/Queue.java | 61 +++++++ .../basic/queue/QueueWithTwoStacks.java | 55 ++++++ .../src/com/coding/basic/stack/Stack.java | 24 +++ .../src/com/coding/basic/stack/StackUtil.java | 168 ++++++++++++++++++ .../com/coding/basic/stack/StackUtilTest.java | 86 +++++++++ .../src/com/coding/basic/stack/Tail.java | 5 + .../coding/basic/stack/expr/InfixExpr.java | 72 ++++++++ .../basic/stack/expr/InfixExprTest.java | 52 ++++++ .../basic/stack/expr/InfixToPostfix.java | 43 +++++ .../basic/stack/expr/InfixToPostfixTest.java | 41 +++++ .../coding/basic/stack/expr/PostfixExpr.java | 46 +++++ .../basic/stack/expr/PostfixExprTest.java | 41 +++++ .../coding/basic/stack/expr/PrefixExpr.java | 52 ++++++ .../basic/stack/expr/PrefixExprTest.java | 45 +++++ .../com/coding/basic/stack/expr/Token.java | 50 ++++++ .../coding/basic/stack/expr/TokenParser.java | 57 ++++++ .../basic/stack/expr/TokenParserTest.java | 41 +++++ 42 files changed, 1973 insertions(+) create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/DownloadThread.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/FileDownloader.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/Connection.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/ConnectionException.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/DownloadListener.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/LoginAction.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/Struts.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/View.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/Iterator.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/List.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/array/ArrayList.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/array/ArrayUtil.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LinkedList.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueueTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Josephus.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Queue.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/Stack.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/StackUtil.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/Tail.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixToPostfixTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/Token.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParserTest.java diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/DownloadThread.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/FileDownloader.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,73 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/FileDownloaderTest.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/Connection.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/ConnectionException.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/ConnectionManager.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/DownloadListener.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/impl/ConnectionImpl.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.coderising.download.impl; + +import java.io.IOException; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coderising.download.impl; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/LoginAction.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/Struts.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..85e2e22de3 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,34 @@ +package com.coderising.litestruts; + +import java.util.Map; + + + +public class Struts { + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/StrutsTest.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/View.java b/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/BinaryTreeNode.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/Iterator.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/List.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/array/ArrayList.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..4576c016af --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/array/ArrayList.java @@ -0,0 +1,35 @@ +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/array/ArrayUtil.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/array/ArrayUtil.java new file mode 100644 index 0000000000..45740e6d57 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coding.basic.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LRUPageFrame.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..24b9d8b155 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,164 @@ +package com.coding.basic.linklist; + + +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/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LinkedList.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LinkedList.java new file mode 100644 index 0000000000..f4c7556a2e --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/linklist/LinkedList.java @@ -0,0 +1,125 @@ +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueue.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..8bd2577c53 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,46 @@ +package com.coding.basic.queue; + +public class CircleQueue { + + //用数组来保存循环队列的元素 + private Object[] elementData ; + int size = 0; + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public CircleQueue(int capacity){ + elementData = new Object[capacity]; + } + public boolean isEmpty() { + return front == rear; + + } + + public boolean isFull(){ + return size == elementData.length; + } + public int size() { + return size; + } + + public void enQueue(E data) { + if(isFull()){ + throw new RuntimeException("The queue is full"); + } + elementData[rear++] = data; + size++; + } + + public E deQueue() { + if(isEmpty()){ + throw new RuntimeException("The queue is empty"); + } + E data = (E)elementData[front]; + elementData[front] = null; + front = (front+1) % elementData.length; + size --; + return data; + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueueTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..7307eb77d4 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueueTest.java @@ -0,0 +1,44 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class CircleQueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(5); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertTrue(queue.isFull()); + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Josephus.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..36ec615d36 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,39 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + Queue queue = new Queue(); + for (int i = 0; i < n; i++){ + queue.enQueue(i); + } + + List result = new ArrayList(); + int i = 0; + + while (!queue.isEmpty()) { + + int x = queue.deQueue(); + + if (++i % m == 0){ + result.add(x); + } else{ + queue.enQueue(x); + } + } + + + return result; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/JosephusTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d90318b51 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Queue.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..c4c4b7325e --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Queue.java @@ -0,0 +1,61 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..bc97df0800 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,55 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + private void moveStack1ToStack2() { + while (!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + + } + + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + + + public int size() { + return stack1.size() + stack2.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue is empty"); + } + if (stack2.isEmpty()) { + moveStack1ToStack2(); + } + + return stack2.pop(); + } + + + + } + diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/Stack.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..fedb243604 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,24 @@ +package com.coding.basic.stack; + +import com.coding.basic.array.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/StackUtil.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..7c86d22fe7 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,168 @@ +package com.coding.basic.stack; +import java.util.Stack; +public class StackUtil { + + public static void bad_reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + + + public static void reverse_247565311(Stack s){ + if(s == null || s.isEmpty()) { + return; + } + + int size = s.size(); + Stack tmpStack = new Stack(); + + for(int i=0;ii){ + tmpStack.push(s.pop()); + } + s.push(top); + while(tmpStack.size()>0){ + s.push(tmpStack.pop()); + } + } + } + + + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + + Stack tmp = new Stack(); + while(!s.isEmpty()){ + tmp.push(s.pop()); + } + while(!tmp.isEmpty()){ + Integer top = tmp.pop(); + addToBottom(s,top); + } + + + } + public static void addToBottom(Stack s, Integer value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Integer top = s.pop(); + addToBottom(s,value); + s.push(top); + } + + } + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + + while(!s.isEmpty()){ + Object value = s.pop(); + if(!value.equals(o)){ + tmpStack.push(value); + } + } + + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + + if(s == null || s.isEmpty() || s.size() stack = new Stack(); + for(int i=0;i s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + @Test + public void testReverse_247565311() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + Assert.assertEquals("[1, 2, 3]", s.toString()); + StackUtil.reverse_247565311(s); + Assert.assertEquals("[3, 2, 1]", s.toString()); + } + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/Tail.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/Tail.java new file mode 100644 index 0000000000..7f30ce55c8 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/Tail.java @@ -0,0 +1,5 @@ +package com.coding.basic.stack; + +public class Tail { + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExpr.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..cebef21fa3 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,72 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + + } + opStack.push(token); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + + + return numStack.pop().floatValue(); + } + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExprTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..20e34e8852 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..9e501eda20 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,43 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + List inFixTokens = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList<>(); + + Stack opStack = new Stack(); + for(Token token : inFixTokens){ + + if(token.isOperator()){ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + postFixTokens.add(opStack.pop()); + + } + opStack.push(token); + + } + if(token.isNumber()){ + + postFixTokens.add(token); + + } + } + + while(!opStack.isEmpty()){ + postFixTokens.add(opStack.pop()); + } + + return postFixTokens; + } + + + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixToPostfixTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..f879f55f14 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixToPostfixTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExpr.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..c54eb69e2a --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,46 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack numStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } else{ + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PrefixExpr.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..f811fd6d9a --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for(Token token : tokens){ + exprStack.push(token); + } + + while(!exprStack.isEmpty()){ + Token t = exprStack.pop(); + if(t.isNumber()){ + numStack.push(new Float(t.getIntValue())); + }else{ + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(t.toString(),f1,f2)); + + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/Token.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParser.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..d3b0f167e1 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParserTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From 7a125ea338557720a25434bf7de18766d7d0a2c9 Mon Sep 17 00:00:00 2001 From: sulei Date: Sun, 7 May 2017 21:56:55 +0800 Subject: [PATCH 471/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/queue/CircleQueue.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueue.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueue.java index 8bd2577c53..310817f374 100644 --- a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueue.java +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/CircleQueue.java @@ -1,5 +1,7 @@ package com.coding.basic.queue; +import javax.management.RuntimeErrorException; + public class CircleQueue { //用数组来保存循环队列的元素 @@ -34,13 +36,22 @@ public void enQueue(E data) { } public E deQueue() { - if(isEmpty()){ + /*if(isEmpty()){ throw new RuntimeException("The queue is empty"); } E data = (E)elementData[front]; elementData[front] = null; front = (front+1) % elementData.length; size --; - return data; + return data ;*/ + if (isEmpty()){ + throw new RuntimeException("is empty"); + } + E data = (E)elementData[front]; + elementData[front] = null; + front = (front + 1) % elementData.length; + size --; + return data; + } } From 5c6a6be46b6673c4a5c2bdd85ca8b7236e7abb60 Mon Sep 17 00:00:00 2001 From: Patrick Date: Sun, 7 May 2017 22:15:37 +0800 Subject: [PATCH 472/552] =?UTF-8?q?17.5.1-5.7=20=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=EF=BC=9Astack=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/stack/QuickMinStack.java | 37 +++++++++ .../basic/stack/StackWithTwoQueues.java | 42 ++++++++++ .../basic/stack/TwoStackInOneArray.java | 83 +++++++++++++++++++ .../basic/test/QuickMinStackTest.java | 56 +++++++++++++ 4 files changed, 218 insertions(+) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/QuickMinStack.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/StackWithTwoQueues.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/TwoStackInOneArray.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/test/QuickMinStackTest.java diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/QuickMinStack.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..9f044cc1f9 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/QuickMinStack.java @@ -0,0 +1,37 @@ +package com.github.ipk2015.coding2017.basic.stack; + +import java.util.HashMap; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + private Stack normalStack = new Stack(); + private Stack minStack = new Stack(); + public void push(int data){ + normalStack.push(data); + if(minStack.isEmpty()){ + minStack.push(data); + }else{ + if(data <= (Integer)minStack.peek()){ + minStack.push(data); + } + } + } + public int pop(){ + int element = (Integer)normalStack.pop(); + if(element == (Integer)minStack.peek()){ + minStack.pop(); + } + return element; + } + public int peek(){ + return (Integer)normalStack.peek(); + } + public int findMin(){ + return (Integer)minStack.peek(); + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/StackWithTwoQueues.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..7d6da60917 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,42 @@ +package com.github.ipk2015.coding2017.basic.stack; + +import com.github.ipk2015.coding2017.basic.queue.Queue; + +public class StackWithTwoQueues { + + private Queue queue1 = new Queue(); + private Queue queue2 = new Queue(); + + public void push(Object data) { + queue1.enQueue(data); + } + + public Object pop() { + if(queue1.size() == 1){ + return queue1.deQueue(); + } + if(queue2.isEmpty()){ + moveElements(queue1,queue2); + } + return queue2.deQueue(); + } + + private void moveElements(Queue oirQueue,Queue aimQueue){ + if(oirQueue.isEmpty()){ + return; + }else{ + Object element = oirQueue.deQueue(); + moveElements(oirQueue,aimQueue); + aimQueue.enQueue(element); + } + } + + public boolean isEmpty(){ + return queue1.isEmpty() && queue2.isEmpty(); + } + + public int size(){ + return queue1.size()+queue2.size(); + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/TwoStackInOneArray.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..e8e8488fe6 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,83 @@ +package com.github.ipk2015.coding2017.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + private int pointer1 = 0; + private int pointer2 = 9; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + if(pointer1 == pointer2){ + enlargeDataArray(); + } + data[pointer1++] = o; + } + + private void enlargeDataArray(){ + Object[] newData = new Object[data.length+100]; + for(int i = 0;i < pointer1;i++){ + newData[i] = data[i]; + } + for(int i = pointer2+1;i < data.length;i++){ + newData[i+100] = data[i]; + } + pointer2 += 100; + data = newData; + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + Object object = data[pointer1-1]; + data[pointer1-1] = null; + pointer1--; + return object; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return data[pointer1-1]; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + if(pointer1 == pointer2){ + enlargeDataArray(); + } + data[pointer2--] = o; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + Object object = data[pointer2+1]; + data[pointer2+1] = null; + pointer2++; + return object; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return data[pointer2+1]; + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/QuickMinStackTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/QuickMinStackTest.java new file mode 100644 index 0000000000..f976861dbb --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/QuickMinStackTest.java @@ -0,0 +1,56 @@ +package com.github.ipk2015.coding2017.basic.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.github.ipk2015.coding2017.basic.stack.QuickMinStack; + +public class QuickMinStackTest { + QuickMinStack stack; + @Before + public void setUp() throws Exception { + stack = new QuickMinStack(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPush() { + stack.push(11); + assertEquals(11, stack.peek()); + stack.push(22); + assertEquals(22, stack.peek()); + } + + @Test + public void testPop() { + stack.push(11); + stack.push(22); + stack.push(33); + assertEquals(33, stack.pop()); + assertEquals(22, stack.pop()); + assertEquals(11, stack.pop()); + } + + @Test + public void testFindMin() { + + stack.push(4); + stack.push(2); + stack.push(3); + stack.push(5); + assertEquals(2, stack.findMin()); + stack.pop(); + assertEquals(2, stack.findMin()); + stack.pop(); + assertEquals(2, stack.findMin()); + stack.pop(); + assertEquals(4, stack.findMin()); + } + +} From a5fbec9e2261412d8cbc42f7598d2177f2f51dd0 Mon Sep 17 00:00:00 2001 From: cmhello88 Date: Sun, 7 May 2017 22:38:38 +0800 Subject: [PATCH 473/552] =?UTF-8?q?3=E6=9C=8830=E5=8F=B7=EF=BC=8CJVM?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=EF=BC=8C=E5=AE=9E=E7=8E=B0=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E7=9A=84LRU=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/basic/linklist/CmLRUPageFrame.java | 69 ++++++++ .../coding/basic/linklist/LRUPageFrame.java | 163 ++++++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 6 + .../basic/linklist/LRUPageFrameTest.java | 34 ++++ 4 files changed, 272 insertions(+) create mode 100644 group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/CmLRUPageFrame.java create mode 100644 group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group03/345943980/mini-jvm-0330/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java diff --git a/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/CmLRUPageFrame.java b/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/CmLRUPageFrame.java new file mode 100644 index 0000000000..890db81fb5 --- /dev/null +++ b/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/CmLRUPageFrame.java @@ -0,0 +1,69 @@ +package com.coding.basic.linklist; + +/** + * + * @author chenming E-mail:cm_20094020@163.com + * @version 创建时间:2017年4月10日 上午12:35:03 + */ +public class CmLRUPageFrame { + + private static class Node { + Node prev; + Node next; + int pageNum; + + Node() { + } + } + + private int capacity; + + private Node first;// 链表头 + private Node last;// 链表尾 + + public CmLRUPageFrame(int capacity) { + this.capacity = capacity; + + } + + /** + * 获取缓存中对象 + * + * @param pageNum + */ + public void access(int pageNum) { + Node node = first; + Node foundNode = null; + while(node!=null){ + if(node.pageNum==pageNum){ + foundNode = node; + } + node = node.next; + } + + //在该队列中存在, 则提到队列头 + if(foundNode!=null){ + + }else{ + + } + + + + } + + @Override + 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/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..3dba1b554b --- /dev/null +++ b/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,163 @@ +package com.coding.basic.linklist; + + +/** + * 实现一个简单的LRU算法,即是 Least Recently Used 近期最少使用算法 + * 作用:需要维护一个页面中的栈,并且需要把某一个页面从栈中提到栈顶,用硬件实现的话,开销比较大,注意:实际上并不是一个真正的栈 + * @author Administrator + * + */ +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/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java index 3f7c043ec5..cf4108c0d9 100644 --- a/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -77,5 +77,11 @@ private String byteToHexString(byte[] codes ){ } return buffer.toString(); } + + public static void main(String[] args) { + System.out.println(0xFF); + System.out.println(Integer.toBinaryString(0xFF)); + System.out.println(0x09); + } } diff --git a/group03/345943980/mini-jvm-0330/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java b/group03/345943980/mini-jvm-0330/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..4ad236a4a2 --- /dev/null +++ b/group03/345943980/mini-jvm-0330/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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()); + + } + +} From 4416b8746b7eb9cd6b7b908d579377a9c24d6d43 Mon Sep 17 00:00:00 2001 From: cmhello88 Date: Sun, 7 May 2017 22:38:38 +0800 Subject: [PATCH 474/552] =?UTF-8?q?4=E6=9C=885=E5=8F=B7=EF=BC=8CJVM?= =?UTF-8?q?=E4=B8=AD=E4=BB=85=E5=AE=8C=E6=88=90=E7=AC=AC=E4=BA=8C=E6=AC=A1?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/basic/linklist/CmLRUPageFrame.java | 69 ++++++ .../coding/basic/linklist/LRUPageFrame.java | 163 ++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 6 + .../basic/linklist/LRUPageFrameTest.java | 34 +++ .../com/coderising/jvm/clz/AccessFlag.java | 25 +++ .../com/coderising/jvm/clz/ClassFile.java | 75 +++++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 ++ .../coderising/jvm/constant/ClassInfo.java | 24 +++ .../coderising/jvm/constant/ConstantInfo.java | 29 +++ .../coderising/jvm/constant/ConstantPool.java | 29 +++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++++ .../jvm/constant/MethodRefInfo.java | 55 +++++ .../jvm/constant/NameAndTypeInfo.java | 45 ++++ .../jvm/constant/NullConstantInfo.java | 13 ++ .../coderising/jvm/constant/StringInfo.java | 26 +++ .../com/coderising/jvm/constant/UTF8Info.java | 32 +++ .../jvm/loader/ByteCodeIterator.java | 5 + .../jvm/loader/ClassFileLoader.java | 132 ++++++++++++ .../jvm/loader/ClassFileParser.java | 44 ++++ .../java/com/coderising/jvm/util/Util.java | 24 +++ .../com/coding/basic/stack/StackUtil.java | 179 +++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 203 ++++++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 +++ .../com/coding/basic/stack/StackUtilTest.java | 77 +++++++ 24 files changed, 1390 insertions(+) create mode 100644 group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/CmLRUPageFrame.java create mode 100644 group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group03/345943980/mini-jvm-0330/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/ClassFile.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/StringInfo.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/util/Util.java create mode 100644 group03/345943980/mini-jvm-0405/src/main/java/com/coding/basic/stack/StackUtil.java create mode 100644 group03/345943980/mini-jvm-0405/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group03/345943980/mini-jvm-0405/src/test/java/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group03/345943980/mini-jvm-0405/src/test/java/com/coding/basic/stack/StackUtilTest.java diff --git a/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/CmLRUPageFrame.java b/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/CmLRUPageFrame.java new file mode 100644 index 0000000000..890db81fb5 --- /dev/null +++ b/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/CmLRUPageFrame.java @@ -0,0 +1,69 @@ +package com.coding.basic.linklist; + +/** + * + * @author chenming E-mail:cm_20094020@163.com + * @version 创建时间:2017年4月10日 上午12:35:03 + */ +public class CmLRUPageFrame { + + private static class Node { + Node prev; + Node next; + int pageNum; + + Node() { + } + } + + private int capacity; + + private Node first;// 链表头 + private Node last;// 链表尾 + + public CmLRUPageFrame(int capacity) { + this.capacity = capacity; + + } + + /** + * 获取缓存中对象 + * + * @param pageNum + */ + public void access(int pageNum) { + Node node = first; + Node foundNode = null; + while(node!=null){ + if(node.pageNum==pageNum){ + foundNode = node; + } + node = node.next; + } + + //在该队列中存在, 则提到队列头 + if(foundNode!=null){ + + }else{ + + } + + + + } + + @Override + 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/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/LRUPageFrame.java b/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..3dba1b554b --- /dev/null +++ b/group03/345943980/mini-jvm-0330/src/main/java/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,163 @@ +package com.coding.basic.linklist; + + +/** + * 实现一个简单的LRU算法,即是 Least Recently Used 近期最少使用算法 + * 作用:需要维护一个页面中的栈,并且需要把某一个页面从栈中提到栈顶,用硬件实现的话,开销比较大,注意:实际上并不是一个真正的栈 + * @author Administrator + * + */ +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/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java b/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java index 3f7c043ec5..cf4108c0d9 100644 --- a/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group03/345943980/mini-jvm-0330/src/test/java/com/coderising/jvm/test/ClassFileloaderTest.java @@ -77,5 +77,11 @@ private String byteToHexString(byte[] codes ){ } return buffer.toString(); } + + public static void main(String[] args) { + System.out.println(0xFF); + System.out.println(Integer.toBinaryString(0xFF)); + System.out.println(0x09); + } } diff --git a/group03/345943980/mini-jvm-0330/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java b/group03/345943980/mini-jvm-0330/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..4ad236a4a2 --- /dev/null +++ b/group03/345943980/mini-jvm-0330/src/test/java/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/AccessFlag.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..cdb8f8859a --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/ClassFile.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..1b5a8b95a6 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/ClassIndex.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..df22981441 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ClassInfo.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..e12b3e164e --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ConstantInfo.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..c8035ae876 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ConstantPool.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..0e940b78d0 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ff9d5fb77 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..0feffa65b5 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..dcac7f97c4 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..fa90d110fe --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/StringInfo.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..d01065fd53 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/UTF8Info.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..b7407d146f --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..2dff6746da --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,5 @@ +package com.coderising.jvm.loader; + +public class ByteCodeIterator { + +} diff --git a/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..aebcbd109f --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/main/java/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,132 @@ +package com.coderising.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.coderising.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 s) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack<>(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + /** + * QQ号为:247565311的解法 + * @param s + */ + public static void reverse_247565311(Stack s){ + if(s == null || s.isEmpty()) { + return; + } + + int size = s.size(); + Stack tmpStack = new Stack(); + + for(int i=0;ii){ + tmpStack.push(s.pop()); + } + s.push(top); + while(tmpStack.size()>0){ + s.push(tmpStack.pop()); + } + } + } + + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + + Stack tmp = new Stack(); + while(!s.isEmpty()){ + tmp.push(s.pop()); + } + while(!tmp.isEmpty()){ + Integer top = tmp.pop(); + addToBottom(s,top); + } + + + } + public static void addToBottom(Stack s, Integer value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Integer top = s.pop(); + addToBottom(s,value); + s.push(top); + } + + } + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + + while(!s.isEmpty()){ + Object value = s.pop(); + if(!value.equals(o)){ + tmpStack.push(value); + } + } + + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static Object[] getTop(Stack s,int len) { + + if(s == null || s.isEmpty() || s.size() tmpStack = new Stack<>(); + int i = 0; + Object[] result = new Object[len]; + while(!s.isEmpty()){ + Object value = s.pop(); + tmpStack.push(value); + result[i++] = value; + if(i == len){ + break; + } + } + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + return result; + } + /** + * 字符串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){ + + Stack stack = new Stack<>(); + 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/group03/345943980/mini-jvm-0405/src/test/java/com/coderising/jvm/test/EmployeeV1.java b/group03/345943980/mini-jvm-0405/src/test/java/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..9a36573dd3 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/test/java/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group03/345943980/mini-jvm-0405/src/test/java/com/coding/basic/stack/StackUtilTest.java b/group03/345943980/mini-jvm-0405/src/test/java/com/coding/basic/stack/StackUtilTest.java new file mode 100644 index 0000000000..6c8db075d0 --- /dev/null +++ b/group03/345943980/mini-jvm-0405/src/test/java/com/coding/basic/stack/StackUtilTest.java @@ -0,0 +1,77 @@ +package com.coding.basic.stack; + +import java.util.Stack; + +import org.junit.Assert; +import org.junit.Test; +public class StackUtilTest { + + @Test + public void testAddToBottom() { + + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.addToBottom(s, 0); + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + + @Test + public void testReverse() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testReverse_247565311() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + + Assert.assertEquals("[1, 2, 3]", s.toString()); + StackUtil.reverse_247565311(s); + Assert.assertEquals("[3, 2, 1]", s.toString()); + } + @Test + public void testRemove() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack<>(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} From 43395012e901a5b35b52c1dd547d840f169f6ea6 Mon Sep 17 00:00:00 2001 From: xiaomingbai <498654356@qq.com> Date: Sun, 7 May 2017 23:16:00 +0800 Subject: [PATCH 475/552] edit StackUtil.reverse() --- .../one/src/org/coding/five/StackUtil.java | 40 +++++++++++++++---- .../test/org/coding/five/StackUtilTest.java | 13 ++++-- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/group04/498654356/one/src/org/coding/five/StackUtil.java b/group04/498654356/one/src/org/coding/five/StackUtil.java index 0d9526139e..5df8131893 100644 --- a/group04/498654356/one/src/org/coding/five/StackUtil.java +++ b/group04/498654356/one/src/org/coding/five/StackUtil.java @@ -10,23 +10,49 @@ 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) { if(isEmpty(s)) { return; } Stack temp = new Stack(); - reversePush(s, temp); - Stack temp2 = new Stack(); - reversePush(temp, temp2); - reversePush(temp2, s); + int size = s.size(); + int count = 0; + while(count < size) { + Object pop = s.pop(); + for(int i = count + 1; i < size; i++) { + temp.push(s.pop()); + } + s.push(pop); + move(temp, s); + count++; + } + } + + // ***递归,通过每一个函数栈存放一个元素 + public static void reverse2(Stack s) { + if(isEmpty(s)) { + return; + } + Stack temp = new Stack(); + move(s, temp); + addTop(temp.pop(), temp, s); + } + + + private static void addTop(Object pop, Stack temp, Stack s) { + if(!temp.isEmpty()) { + addTop(temp.pop(), temp, s); + } + s.push(pop); } private static boolean isEmpty(Stack s) { return s == null || s.isEmpty(); } - private static void reversePush(Stack source, Stack dest) { + private static void move(Stack source, Stack dest) { while(!source.isEmpty()) { dest.push(source.pop()); } @@ -48,7 +74,7 @@ public static void remove(Stack s,Object o) { temp.push(dest); } } - reversePush(temp, s); + move(temp, s); } /** @@ -70,7 +96,7 @@ public static Object[] getTop(Stack s,int len) { temp.push(v); count++; } - reversePush(temp, s); + move(temp, s); return Arrays.copyOf(result, count); } /** diff --git a/group04/498654356/one/test/org/coding/five/StackUtilTest.java b/group04/498654356/one/test/org/coding/five/StackUtilTest.java index bab59b8690..bb5dc80813 100644 --- a/group04/498654356/one/test/org/coding/five/StackUtilTest.java +++ b/group04/498654356/one/test/org/coding/five/StackUtilTest.java @@ -1,7 +1,5 @@ package org.coding.five; -import static org.junit.Assert.fail; - import org.coding.one.Stack; import org.junit.After; import org.junit.Assert; @@ -37,7 +35,16 @@ public void testReverse() { Assert.assertEquals(4, s.pop()); Assert.assertEquals(5, s.pop()); } - + @Test + public void testReverse2() { + StackUtil.reverse2(s); + Assert.assertEquals(5, s.size()); + Assert.assertEquals(1, s.pop()); + Assert.assertEquals(2, s.pop()); + Assert.assertEquals(3, s.pop()); + Assert.assertEquals(4, s.pop()); + Assert.assertEquals(5, s.pop()); + } @Test public void testRemove() { StackUtil.remove(s, 1); From 5716efde2e9985c41486be6cec7181c786f2faaf Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Sun, 7 May 2017 23:53:15 +0800 Subject: [PATCH 476/552] the sixth homework ... InfixExpr --- group19/1294642551/src/expr/InfixExpr.java | 162 ++++++++++++++++++ .../1294642551/test/expr/InfixExprTest.java | 53 ++++++ 2 files changed, 215 insertions(+) create mode 100644 group19/1294642551/src/expr/InfixExpr.java create mode 100644 group19/1294642551/test/expr/InfixExprTest.java diff --git a/group19/1294642551/src/expr/InfixExpr.java b/group19/1294642551/src/expr/InfixExpr.java new file mode 100644 index 0000000000..2d53dd91ff --- /dev/null +++ b/group19/1294642551/src/expr/InfixExpr.java @@ -0,0 +1,162 @@ +package expr; + +import java.util.ArrayList; +import java.util.Stack; + + +/** + * 中序表达式求值: + * 1. 只支持加减乘除,不支持括号 + * 2. 表达式中只支持int,但结果可能是float + * 3. 要求用两个栈来实现 + * @author 12946 + * + */ +public class InfixExpr { + String expr = null; + + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + Stack operatorStack = new Stack(); + Stack valueStack = new Stack(); + String[] arr = toArr(expr); + inStack(operatorStack, valueStack, arr); + outStack(operatorStack, valueStack); + + if(valueStack.size() == 1){ + return valueStack.peek(); + }else{ + throw new RuntimeException("数值栈中最后的元素个数不对"); + } + + } + + // 将表达式字符串分解成数值和操作符的数组 + public String[] toArr(String expr){ + ArrayList al = new ArrayList(); + for(int i = 0; i < expr.length(); i++){ + char c = expr.charAt(i); + if(isOperator(c)){ + al.add(c+""); + } + } + + for(int i = 0; i < expr.length(); i++){ + char c = expr.charAt(i); + if(isOperator(c)){ + expr = expr.replace(c, ','); + } + } + String[] arr = expr.split(","); + String[] totalArr = new String[2 * arr.length - 1]; + for(int i = 0; i < totalArr.length; i++){ + if(i % 2 == 0){ + totalArr[i] = arr[i/2]; + }else{ + totalArr[i] = al.get((i-1)/2); + } + } + + return totalArr; + } + + // 表达式入栈操作 + public void inStack(Stack operatorStack, Stack valueStack, + String[] arr) { + for(int i = 0; i < arr.length; i++){ + if(isOperator(arr[i])){//新元素是操作符 + if(operatorStack.size() == 0){//第一个操作符 + operatorStack.push(arr[i]+""); + }else if(operatorStack.size() > 0){ + while(priority(operatorStack.peek(), arr[i]+"") != -1){//第一个操作符的优先级>=第二个的 + popCompute(operatorStack, valueStack); + if(operatorStack.isEmpty()){ + break; + } + } + operatorStack.push(arr[i]+"");//操作符入栈 + } + + }else{// 新元素是数值 + float value = Float.valueOf(arr[i]+""); + valueStack.push(value); + } + + } + } + + // 出栈操作,将两个栈中的操作符和数值进行计算,当操作符栈为空时,数值栈的值就是最后的值 + public void outStack(Stack operatorStack, Stack valueStack){ + while(!operatorStack.isEmpty()){ + popCompute(operatorStack, valueStack); + } + } + + public boolean isOperator(String c){ + if(c.equals("+") || c.equals("-") || c.equals("*") || c.equals("/")){ + return true; + }else{ + return false; + } + } + + public boolean isOperator(char c){ + if(c=='+' || c=='-' || c=='*' || c=='/'){ + return true; + }else{ + return false; + } + } + + // 第一个操作符的优先级 > 第二个操作符的优先级: 返回 1 + // 第一个操作符的优先级 = 第二个操作符的优先级: 返回 0 + // 第一个操作符的优先级 < 第二个操作符的优先级: 返回 -1 + public int priority(String c1, String c2){ + + if(c1.equals("+") || c1.equals("-")){ + if(c2.equals("*") || c2.equals("/")){ + return -1; + }else{ + return 0; + } + }else{//(c1=='*' || c1=='/') + if(c2.equals("+") || c2.equals("-")){ + return 1; + }else{ + return 0; + } + } + + } + + + + // 计算加减乘除的结果 + public float compute(float num1, float num2, String operator){ + if(operator.equals("+")){ + return num1 + num2; + }else if(operator.equals("-")){ + return num1 - num2; + }else if(operator.equals("*")){ + return num1 * num2; + }else{ + return num1 / num2; + } + } + + // 弹栈计算,取一个操作符和两个操作数进行计算,并将得到的操作数压入数值栈 + public void popCompute(Stack operatorStack, Stack valueStack){ + float num2 = valueStack.pop(); + float num1 = valueStack.pop(); + String operator = operatorStack.pop(); + float value = compute(num1, num2, operator); + valueStack.push(value); + + } + + +} diff --git a/group19/1294642551/test/expr/InfixExprTest.java b/group19/1294642551/test/expr/InfixExprTest.java new file mode 100644 index 0000000000..936682df20 --- /dev/null +++ b/group19/1294642551/test/expr/InfixExprTest.java @@ -0,0 +1,53 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + + +} From 621f9305fa1421eb1eb3fb06b2df64c24bd48c84 Mon Sep 17 00:00:00 2001 From: chk Date: Sun, 7 May 2017 23:56:30 +0800 Subject: [PATCH 477/552] 4 mother --- .../week4/jvm/loader/ClassFileLoader.java | 74 ++++++++ .../com/basic/week4/jvm/test/EmployeeV1.java | 30 +++ .../com/basic/week4/lru/LRUPageFrame.java | 131 +++++++++++++ .../com/basic/week5/stack/StackUtil.java | 103 +++++++++++ .../com/basic/week6/expr/InfixExpr.java | 127 +++++++++++++ .../632678665/com/basic/week6/expr/Token.java | 52 ++++++ .../com/basic/week6/exprNew/InfixExpr.java | 57 ++++++ .../com/basic/week6/exprNew/Operator.java | 75 ++++++++ .../com/basic/week6/exprNew/Token.java | 63 +++++++ .../com/basic/week6/exprNew/TokenParser.java | 60 ++++++ .../com/basic/week7/stack/MyStack.java | 42 +++++ .../com/basic/week7/stack/StackUtil.java | 173 ++++++++++++++++++ .../basic/week7/stack/expr/ExprIterator.java | 57 ++++++ .../com/basic/week7/stack/expr/InfixExpr.java | 74 ++++++++ .../week7/stack/expr/InfixToPostExpr.java | 41 +++++ .../week7/stack/expr/InfixToPostExprTest.java | 30 +++ .../basic/week7/stack/expr/PostfixExpr.java | 48 +++++ .../week7/stack/expr/PostfixExprTest.java | 34 ++++ .../basic/week7/stack/expr/PrefixExpr.java | 59 ++++++ .../week7/stack/expr/PrefixExprTest.java | 39 ++++ .../com/basic/week7/stack/expr/Token.java | 49 +++++ .../basic/week7/stack/expr/TokenParser.java | 56 ++++++ .../week7/stack/expr/TokenParserTest.java | 36 ++++ .../com/basic/week8/CircleQueue.java | 44 +++++ .../632678665/com/basic/week8/Josephus.java | 44 +++++ group23/632678665/com/basic/week8/Queue.java | 55 ++++++ .../com/basic/week8/QueueWithTwoStacks.java | 47 +++++ .../com/basic/week9/QuickMinStack.java | 48 +++++ .../com/basic/week9/StackWithTwoQueues.java | 53 ++++++ .../com/basic/week9/TwoStackInOneArray.java | 82 +++++++++ 30 files changed, 1883 insertions(+) create mode 100644 group23/632678665/com/basic/week4/jvm/loader/ClassFileLoader.java create mode 100644 group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java create mode 100644 group23/632678665/com/basic/week4/lru/LRUPageFrame.java create mode 100644 group23/632678665/com/basic/week5/stack/StackUtil.java create mode 100644 group23/632678665/com/basic/week6/expr/InfixExpr.java create mode 100644 group23/632678665/com/basic/week6/expr/Token.java create mode 100644 group23/632678665/com/basic/week6/exprNew/InfixExpr.java create mode 100644 group23/632678665/com/basic/week6/exprNew/Operator.java create mode 100644 group23/632678665/com/basic/week6/exprNew/Token.java create mode 100644 group23/632678665/com/basic/week6/exprNew/TokenParser.java create mode 100644 group23/632678665/com/basic/week7/stack/MyStack.java create mode 100644 group23/632678665/com/basic/week7/stack/StackUtil.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/ExprIterator.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixExpr.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/Token.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/TokenParser.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java create mode 100644 group23/632678665/com/basic/week8/CircleQueue.java create mode 100644 group23/632678665/com/basic/week8/Josephus.java create mode 100644 group23/632678665/com/basic/week8/Queue.java create mode 100644 group23/632678665/com/basic/week8/QueueWithTwoStacks.java create mode 100644 group23/632678665/com/basic/week9/QuickMinStack.java create mode 100644 group23/632678665/com/basic/week9/StackWithTwoQueues.java create mode 100644 group23/632678665/com/basic/week9/TwoStackInOneArray.java diff --git a/group23/632678665/com/basic/week4/jvm/loader/ClassFileLoader.java b/group23/632678665/com/basic/week4/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..7528e27324 --- /dev/null +++ b/group23/632678665/com/basic/week4/jvm/loader/ClassFileLoader.java @@ -0,0 +1,74 @@ +package com.coding2017.week4.jvm.loader; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class ClassFileLoader { + private static Joiner SEMICOLON_JOINER = Joiner.on(";").skipNulls(); + private static Splitter DOT_SPLITTER = Splitter.on(".").trimResults(); + private static Joiner SLASH_JOINER = Joiner.on("/").skipNulls(); + + private static String CLASS_SUFFIX = ".class"; + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + List list = DOT_SPLITTER.splitToList(className); + String childDirectory = SLASH_JOINER.join(list); + for (String clzPath : clzPaths) { + String fullPath = makeFullPath(clzPath, childDirectory); + if (fileExist(fullPath)) { + return readFileBytes(fullPath); + } + } + System.out.println("no this class file: " + className); + return null; + } + + private byte[] readFileBytes(String filePath) { + try { + File file = new File(filePath); + long length = file.length(); + byte[] fileBytes = new byte[(int) length]; + int readLength = new FileInputStream(filePath).read(fileBytes); + if (readLength != length) { + System.out.println("read file error. read length: " + readLength + ", full length : " + length); + return null; + } + return fileBytes; + } catch (IOException e) { + System.out.println("read file error. " + filePath); + return null; + } + } + + private boolean fileExist(String fullPath) { + File classFile = new File(fullPath); + return classFile.exists() && classFile.isFile(); + } + + private String makeFullPath(String clzPath, String childDirectory) { + if (clzPath.endsWith("/") || clzPath.endsWith("\\")) { + return clzPath + childDirectory + CLASS_SUFFIX; + } else { + return clzPath + "/" + childDirectory + CLASS_SUFFIX; + } + } + + public void addClassPath(String path) { + if (!clzPaths.contains(path)) { + clzPaths.add(path); + } + } + + public String getClassPath() { + return SEMICOLON_JOINER.join(clzPaths); + } + +} diff --git a/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java b/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..7d0419dc77 --- /dev/null +++ b/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java @@ -0,0 +1,30 @@ +package com.coding2017.week4.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/group23/632678665/com/basic/week4/lru/LRUPageFrame.java b/group23/632678665/com/basic/week4/lru/LRUPageFrame.java new file mode 100644 index 0000000000..55039dda56 --- /dev/null +++ b/group23/632678665/com/basic/week4/lru/LRUPageFrame.java @@ -0,0 +1,131 @@ +package com.coding2017.week4.lru; + +/** + * 用双向链表实现LRU算法 + * + * @author liuxin + * + */ +public class LRUPageFrame { + private static class Node { + Node prev; + Node next; + int pageNum; + + Node() { + } + } + + private int capacity; + + private Node first;// 链表头 + private Node last;// 链表尾 + private int size; // 当前个数 + + public LRUPageFrame(int capacity) { + this.capacity = capacity; + size = 0; + } + + /** + * 获取缓存中对象 + * + * @param pageNum + * @return + */ + public void access(int pageNum) { + Node node = query(pageNum); + if (node == null) { + Node newNode = new Node(); + newNode.pageNum = pageNum; + accessNotExist(newNode); + } else { + accessExist(node); + } + } + + private void accessExist(Node node) { + removeNode(node); + addFirst(node); + } + + /** + * 此处没有要求传入的node的prev和next, 所以需要自己处理 + * + * @param node + */ + private void addFirst(Node node) { + node.prev = null; + node.next = null; + if (first == null) { + first = node; + last = node; + } else { + first.prev = node; + node.next = first; + first = node; + } + size++; + } + + /** + * 需要考虑删除的节点是头结点, 或尾节点的情况 + */ + private void removeNode(Node node) { + if (node.prev == null) { + first = node.next; + } + if (node.next == null) { + last = node.prev; + } + if (node.prev != null) { + node.prev.next = node.next; + } + if (node.next != null) { + node.next.prev = node.prev; + } + size--; + } + + /** + * 如果已经满了, 则挤出去一个, 然后追加 + * + * @param node + */ + private void accessNotExist(Node node) { + if (size == capacity) { + removeLast(); + } + addFirst(node); + } + + private void removeLast() { + last.prev.next = null; + last = last.prev; + size--; + } + + private Node query(int pageNum) { + for (Node node = first; node != null; node = node.next) { + if (pageNum == node.pageNum) { + return node; + } + } + return 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/group23/632678665/com/basic/week5/stack/StackUtil.java b/group23/632678665/com/basic/week5/stack/StackUtil.java new file mode 100644 index 0000000000..7b750b3549 --- /dev/null +++ b/group23/632678665/com/basic/week5/stack/StackUtil.java @@ -0,0 +1,103 @@ +package com.coding.week5.stack; + +import com.coding.weak1.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 stack = new Stack(); + Stack stack1 = new Stack(); + while (!s.isEmpty()) { + stack.push(s.pop()); + } + while (!stack.isEmpty()) { + stack1.push(stack.pop()); + } + while (!stack1.isEmpty()) { + s.push(stack1.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + Stack stack = new Stack(); + while (!s.isEmpty()){ + Object o1 = s.pop(); + if (!o.equals(o1)) { + stack.push(o1); + } + } + while (!stack.isEmpty()) { + s.push(stack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + if (len > s.size() || len <= 0) { + throw new IllegalArgumentException(len+""); + } + + Object[] objects = new Object[len]; + for (int i = 0; i < len; i++) { + objects[i] = s.pop(); + } + for (int i = len - 1; i >= 0 ; i--) { + s.push(objects[i]); + } + return objects; + } + /** + * 字符串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){ + Stack stack = new Stack(); + char[] chars = s.toCharArray(); + for (char c : chars) { + if (c == '(' || c == '{' || c == '[') { + stack.push(c); + } else if (c == ')' || c == '}' || c == ']'){ + if (stack.isEmpty()) { + return false; + } + if (!isPair((char)stack.pop(), c)){ + return false; + } + } + } + return stack.isEmpty(); + } + + private static boolean isPair(char left, char right) { + switch (left) { + case '{': + return right == '}'; + case '[': + return right == ']'; + case '(': + return right == ')'; + default: + return false; + } + } + +} diff --git a/group23/632678665/com/basic/week6/expr/InfixExpr.java b/group23/632678665/com/basic/week6/expr/InfixExpr.java new file mode 100644 index 0000000000..34c1b15123 --- /dev/null +++ b/group23/632678665/com/basic/week6/expr/InfixExpr.java @@ -0,0 +1,127 @@ +package com.coding.week6.expr; + +import com.coding.weak1.Stack; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class InfixExpr { + String expr = null; + private Stack numberStack; + private Stack operatorStack; + private List tokens; + public InfixExpr(String expr) { + this.expr = expr; + this.numberStack = new Stack(); + this.operatorStack = new Stack(); + tokens = new ArrayList<>(); + } + + + public float evaluate() { + fillStack(); + while (!operatorStack.isEmpty()) { + char symbol = (char) operatorStack.pop(); + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(caculate(symbol, operTop2, operTop1)); + } + return (float)numberStack.pop(); + } + + public void parseTokens() { + char[] chars = expr.toCharArray(); + for (int i = 0; i < chars.length; i++) { + char c = chars[i]; + if (Token.isOperator(c)) { + Token token = new Token(c+""); + tokens.add(token); + } else { + String t = ""; + while (Token.isDigit(c)){ + t += c; + i++; + if (i == chars.length) + break; + c = chars[i]; + } + Token token = new Token(t); + tokens.add(token); + i--; + } + } + } + + + public void fillStack() { + parseTokens(); + Iterator iterator = tokens.iterator(); + while (iterator.hasNext()) { + Token token = iterator.next(); + if (token.isNumber()) { + numberStack.push((float)token.parseInt()); + continue; + } + if (token.isOperator()) { + char operator = token.parseOperator(); + if (operatorStack.isEmpty()) { + operatorStack.push(operator); + }else { + char topSymbol = (char)operatorStack.peek(); + if (compare(operator, topSymbol) > 0) { + operatorStack.push(operator); + } else { + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(caculate(topSymbol, operTop2, operTop1)); + operatorStack.pop(); + operatorStack.push(operator); + } + } + } + + } + } + + + private float caculate(char symbol, float oper1, float oper2) { + if ('*' == symbol) + return oper1 * oper2; + else if ('/' == symbol) + return oper1 / oper2; + else if ('+' == symbol) + return oper1 + oper2; + else if ('-' == symbol) + return oper1 - oper2; + else + throw new RuntimeException("this operation has not implement"); + } + + public int compare(char opertor1, char opertor2) { + if (!Token.isOperator(opertor1) ) + throw new IllegalArgumentException(opertor1 + "is not supported opertor"); + if (!Token.isOperator(opertor2)) + throw new IllegalArgumentException(opertor2 + "is not supported opertor"); + if (Token.isAddOrSub(opertor1)) { + if (Token.isAddOrSub(opertor2)) + return 0; + else + return -1; + } + else { + if (Token.isAddOrSub(opertor2)) + return 1; + else + return 0; + } + } + + public String printNumberStack() { + return numberStack.toString(); + } + + public String printOperatorStack() { + return operatorStack.toString(); + } +} diff --git a/group23/632678665/com/basic/week6/expr/Token.java b/group23/632678665/com/basic/week6/expr/Token.java new file mode 100644 index 0000000000..b58aa36968 --- /dev/null +++ b/group23/632678665/com/basic/week6/expr/Token.java @@ -0,0 +1,52 @@ +package com.coding.week6.expr; + +/** + * Created by Administrator on 2017/4/16 0016. + */ +public class Token { + + private String symbol; + + public Token(String symbol) { + this.symbol = symbol; + } + + public boolean isNumber() { + return symbol.matches("^\\d+$"); + } + + + public boolean isOperator() { + return symbol.matches("^[\\+|\\*|\\-|\\/]$"); + } + + public int parseInt() { + return Integer.valueOf(symbol); + } + + public char parseOperator() { + return symbol.charAt(0); + } + + + public static boolean isOperator(char c) { + return isAddOrSub(c) || isMulityOrDivide(c); + } + + public static boolean isAddOrSub(char c) { + return c == '+' || c == '-'; + } + + public static boolean isMulityOrDivide(char c) { + return c == '/' || c == '*'; + } + + public static boolean isDigit(char c) { + return c >= '0' && c <= '9'; + } + + @Override + public String toString(){ + return symbol; + } +} diff --git a/group23/632678665/com/basic/week6/exprNew/InfixExpr.java b/group23/632678665/com/basic/week6/exprNew/InfixExpr.java new file mode 100644 index 0000000000..3962b49fce --- /dev/null +++ b/group23/632678665/com/basic/week6/exprNew/InfixExpr.java @@ -0,0 +1,57 @@ +package com.coding.week6.exprNew; + +import com.coding.weak1.Stack; + +import java.util.List; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + + public float evaluate() { + + Stack operatorStack = new Stack(); + Stack numberStack = new Stack(); + fillStack(numberStack, operatorStack); + while (!operatorStack.isEmpty()) { + Operator symbol = (Operator) operatorStack.pop(); + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(symbol.apply(operTop2, operTop1)); + } + return (float)numberStack.pop(); + } + + public void fillStack(Stack numberStack, Stack operatorStack) { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + for (Token token : tokens) { + if (token.isNumber()) { + numberStack.push(token.getFloatValue()); + } + else if (token.isOperator()) { + Operator o = token.getOperator(); + if (operatorStack.isEmpty()) { + operatorStack.push(o); + }else { + Operator top = (Operator)operatorStack.peek(); + if (o.hasHigherPriority(top)) { + operatorStack.push(o); + } else { + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(top.apply(operTop2, operTop1)); + operatorStack.pop(); + operatorStack.push(o); + } + } + } + + } + } + +} diff --git a/group23/632678665/com/basic/week6/exprNew/Operator.java b/group23/632678665/com/basic/week6/exprNew/Operator.java new file mode 100644 index 0000000000..f6b4681e46 --- /dev/null +++ b/group23/632678665/com/basic/week6/exprNew/Operator.java @@ -0,0 +1,75 @@ +package com.coding.week6.exprNew; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public enum Operator { + ADD("+", 1) { + public float apply(float x, float y){ + return x + y; + } + }, + + SUB("-", 1) { + @Override + public float apply(float x, float y) { + return x - y; + } + }, + + MULT("*", 2) { + @Override + public float apply(float x, float y) { + return x * y; + } + }, + + DIVI("/", 2) { + @Override + public float apply(float x, float y) { + return x / y; + } + }; + private String symbol; + private int priority; + + Operator(String symbol, int priority) { + this.symbol = symbol; + this.priority = priority; + } + + public boolean hasHigherPriority(Operator o) { + return this.priority > o.priority; + } + + public String symbol() { + return symbol; + } + + public static List symbols() { + List symbos = new ArrayList<>(); + for (Operator o : Operator.values()) { + symbos.add(o.symbol); + } + return symbos; + } + + public abstract float apply(float x, float y); + + private static final Map map = new HashMap(); + + static { + for (Operator o : Operator.values()) { + map.put(o.symbol, o); + } + } + + public static Map getOperatorMap() { + return map; + } +} diff --git a/group23/632678665/com/basic/week6/exprNew/Token.java b/group23/632678665/com/basic/week6/exprNew/Token.java new file mode 100644 index 0000000000..c925a22705 --- /dev/null +++ b/group23/632678665/com/basic/week6/exprNew/Token.java @@ -0,0 +1,63 @@ +package com.coding.week6.exprNew; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class Token { + + private int type; + private String value; + + static final int NUMBER = 1; + static final int OPERATOR = 2; + static final int LEFT_BRACKET = 3; + static final int RIGHT_BRACKET = 4; + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + + public boolean isNumber(){ + return type == NUMBER; + } + + public boolean isOperator(){ + return type == OPERATOR; + } + + public boolean isLeftBracket() { + return type == LEFT_BRACKET; + } + + public boolean isRightBracket() { + return type == RIGHT_BRACKET; + } + + public float getFloatValue() { + if (isNumber()) + return Integer.valueOf(value); + else + throw new RuntimeException("not a number"); + } + + public String toString() { + return value; + } + + + public Operator getOperator() { + if (isOperator()) { + return Operator.getOperatorMap().get(value); + } else { + throw new RuntimeException("not a operator"); + } + } + + + public String getValue() { + return value; + } + + +} diff --git a/group23/632678665/com/basic/week6/exprNew/TokenParser.java b/group23/632678665/com/basic/week6/exprNew/TokenParser.java new file mode 100644 index 0000000000..52757dc0c7 --- /dev/null +++ b/group23/632678665/com/basic/week6/exprNew/TokenParser.java @@ -0,0 +1,60 @@ +package com.coding.week6.exprNew; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class TokenParser { + + private static List operators = Operator.symbols(); + public List parse(String expr) { + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + char c = expr.charAt(i); + Token token; + if (Character.isDigit(c)) { + int nextOperIndex = getNextOperIndex(i, expr); + String n = expr.substring(i, nextOperIndex); + token = new Token(Token.NUMBER, n); + tokens.add(token); + i = nextOperIndex; + } else if (isOperator(c)) { + token = new Token(Token.OPERATOR, c+""); + tokens.add(token); + i++; + } else if (String.valueOf(c).matches("\\s")){ + i++; + } else if (c == '(') { + token = new Token(Token.LEFT_BRACKET, String.valueOf(c)); + tokens.add(token); + i++; + } else if (c == ')') { + token = new Token(Token.RIGHT_BRACKET, String.valueOf(c)); + tokens.add(token); + i++; + } else { + throw new RuntimeException(c +" is not number or support operator"); + } + } + return tokens; + } + + private int getNextOperIndex(int i, String expr) { + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char c) { + return operators.contains(String.valueOf(c)); + } + + +} diff --git a/group23/632678665/com/basic/week7/stack/MyStack.java b/group23/632678665/com/basic/week7/stack/MyStack.java new file mode 100644 index 0000000000..9a8bf42296 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/MyStack.java @@ -0,0 +1,42 @@ +package com.ralf.stack; + +import java.util.LinkedList; +import java.util.NoSuchElementException; + +/** + * ʵֻݽṹջ + * + * @author chk + * + */ +public class MyStack { + + private LinkedList linkedList = new LinkedList<>(); + + public MyStack() { + + } + + public void push(T t) { + linkedList.addFirst(t); + } + + public T pop() { + if (size() == 0) { + throw new NoSuchElementException(); + } + return linkedList.removeFirst(); + } + + public T peek() { + return (size() == 0) ? null : linkedList.getFirst(); + } + + public int size() { + return linkedList.size(); + } + + public boolean isEmpty(){ + return linkedList.isEmpty(); + } +} diff --git a/group23/632678665/com/basic/week7/stack/StackUtil.java b/group23/632678665/com/basic/week7/stack/StackUtil.java new file mode 100644 index 0000000000..758178131c --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/StackUtil.java @@ -0,0 +1,173 @@ +package com.ralf.stack; + +import java.util.NoSuchElementException; + +public class StackUtil { + + private static MyStack myStack = new MyStack<>(); + + /** + * ջеԪInteger, ջջ : 5,4,3,2,1 ø÷ ԪشΪ: 1,2,3,4,5 + * ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ + * + * @param + */ + public static void reverse(MyStack stack) { + + if (stack.isEmpty()) { + System.out.println("ջΪջ"); + return; + } + @SuppressWarnings("unchecked") + T[] elements = (T[]) new Object[stack.size()]; + for (int i = 0; i < elements.length; i++) { + elements[i] = stack.pop(); + } + for (int i = 0; i < elements.length; i++) { + stack.push(elements[i]); + } + + } + + public static void bad_reverse(MyStack s) { + if(s == null || s.isEmpty()){ + return; + } + MyStack tmpStack = new MyStack<>(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + + /** + * ɾջеijԪ ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ + * + * @param o + */ + public static void remove(MyStack s, T o) { + if (s.isEmpty()) { + System.out.println("ջΪգ"); + return; + } + MyStack stack = new MyStack<>(); + + while (!s.isEmpty()) { + T t = s.pop(); + if (t.equals(o)) { + PopAndPush(s, stack); + return; + } + stack.push(t); + } + throw new NoSuchElementException("ջûиԪأ"); + + } + + private static void PopAndPush(MyStack s, MyStack stack) { + while (!stack.isEmpty()) { + T t = stack.pop(); + s.push(t); + } + } + + /** + * ջȡlenԪ, ԭջԪرֲ ע⣺ֻʹStackĻpush,pop,peek,isEmpty + * ʹһջ + * + * @param len + * @return + */ + @SuppressWarnings("unchecked") + public static T[] getTop(MyStack s, int len) { + + if (s.isEmpty() || len > s.size()) { + return null; + } + MyStack oldStack = s; + T[] elements = (T[]) new Object[len]; + for (int i = 0; i < len; i++) { + elements[i] = s.pop(); + } + s = oldStack; + return elements; + } + + /** + * ַs ܰЩַ ( ) [ ] { }, a,b,c... x,yz ʹöջַsеDzdzɶԳֵġ s = + * "([e{d}f])" , ַеdzɶԳ֣ ÷true s = "([b{x]y})", + * ַеŲdzɶԳֵģ ÷false; + * + * @param s + * @return + */ + public static boolean isValidPairs(String s) { + + char[] ch = s.toCharArray(); + if (ch.length < 1) { + return false; + } + + MyStack leftStack = new MyStack<>(); + MyStack rightStack = new MyStack<>(); + + for (int i = 0; i < ch.length; i++) { + + switch (ch[i]) { + case '(': + leftStack.push(String.valueOf(ch[i])); + break; + + case '[': + leftStack.push(String.valueOf(ch[i])); + break; + + case '{': + leftStack.push(String.valueOf(ch[i])); + break; + + case ')': + rightStack.push(String.valueOf(ch[i])); + break; + + case ']': + rightStack.push(String.valueOf(ch[i])); + break; + + case '}': + rightStack.push(String.valueOf(ch[i])); + break; + + default: + break; + } + } + return isPair(leftStack, rightStack); + + } + + private static boolean isPair(MyStack leftStack, + MyStack rightStack) { + + if (leftStack.size() != rightStack.size()) { + return false; + } + + reverse(rightStack); + while (!leftStack.isEmpty()) { + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(leftStack.pop()).append(rightStack.pop()); + + String pair = stringBuilder.toString(); + if (!pair.equals("()") && !pair.equals("[]") && !pair.equals("{}")) { + return false; + } + } + return true; + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java b/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java new file mode 100644 index 0000000000..d82db3e915 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java @@ -0,0 +1,57 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; + +public class ExprIterator { + + private int operPos; + private int numPos; + private ArrayList operateList = new ArrayList<>(); + private ArrayList numList = new ArrayList<>(); + + public ExprIterator(String exprString) { + char[] chs = exprString.toCharArray(); + transToString(chs); + } + + public Integer nextNumString() { + if (hasNextNum()) { + return Integer.parseInt(numList.get(numPos++)); + } + return null; + } + public String nextOperateString() { + if (hasNextOperate()) { + return operateList.get(operPos++); + } + return null; + } + + public boolean hasNextNum() { + return numPos < numList.size(); + } + + public boolean hasNextOperate() { + return operPos < operateList.size(); + } + + private void transToString(char[] chs) { + + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < chs.length; i++) { + if (chs[i] == '+' || chs[i] == '-' || chs[i] == '*' + || chs[i] == '/') { + numList.add(stringBuilder.toString()); + operateList.add(String.valueOf(chs[i])); + stringBuilder.delete(0, stringBuilder.length()); + } + else { + stringBuilder.append(chs[i]); + } + + } + numList.add(stringBuilder.toString()); + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java b/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..86a060845c --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java @@ -0,0 +1,74 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class InfixExpr { + + private String exprString; + + public InfixExpr(String exprString) { + this.exprString = exprString; + } + + public double evaluate() { + + MyStack numStack = new MyStack(); + MyStack operStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + + List list = parser.parse(exprString); + + for (Token token : list) { + if (token.isOperator()) { + if (operStack.isEmpty()) { + operStack.push(token); + } else { + while (!operStack.isEmpty() + && !token.hasHigherPriority(operStack.peek())) { + String operator = operStack.pop().toString(); + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = operate(operator,num1,num2); + numStack.push(result); + } + operStack.push(token); + } + } + if (token.isNumber()) { + numStack.push(new Float(token.getValue())); + } + } + + while(!operStack.isEmpty()){ + String operator = operStack.pop().toString(); + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = operate(operator,num1,num2); + numStack.push(result); + } + + return numStack.pop().floatValue(); + } + + private Float operate(String operator,Float num1, Float num2) { + float result = 0.0f; + switch (operator) { + case "+": + result = num2 + num1; + break; + case "-": + result = num2 - num1; + break; + case "*": + result = num2 * num1; + break; + case "/": + result = num2 / num1; + break; + } + return result; + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java new file mode 100644 index 0000000000..6296d160ef --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java @@ -0,0 +1,41 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +import com.ralf.stack.MyStack; +import com.ralf.stack.StackUtil; + +public class InfixToPostExpr { + + public static List convert(String infixString){ + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(infixString); + + MyStack S1 = new MyStack(); + MyStack S2 = new MyStack<>(); + + + for(Token token : tokens){ + if (token.isNumber()) { + S2.push(token); + } + else{ + while(!S1.isEmpty() && !token.hasHigherPriority(S1.peek())) { + S2.push(S1.pop()); + } + S1.push(token); + } + } + while(!S1.isEmpty()){ + S2.push(S1.pop()); + } + ArrayList list = new ArrayList<>(); + StackUtil.reverse(S2); + while(!S2.isEmpty()){ + list.add(S2.pop()); + } + return list; + } +} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java new file mode 100644 index 0000000000..d21344ea1e --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java @@ -0,0 +1,30 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixToPostExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + //10-2*3+50 + String string = "10-2*3+50"; + List tokens = InfixToPostExpr.convert(string); + + Assert.assertEquals(10, tokens.get(0).getValue()); + Assert.assertEquals(2, tokens.get(1).getValue()); + Assert.assertEquals(3, tokens.get(2).getValue()); + Assert.assertEquals("*", tokens.get(3).toString()); + Assert.assertEquals("-", tokens.get(4).toString()); + Assert.assertEquals(50, tokens.get(5).getValue()); + Assert.assertEquals("+", tokens.get(6).toString()); + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java b/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..6e40dbe72f --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java @@ -0,0 +1,48 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class PostfixExpr { + + private String exprString; + + public PostfixExpr(String exprString){ + this.exprString = exprString; + } + + public float evaluate() { + MyStack myStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(exprString); + for(Token token : tokens){ + if (token.isNumber()) { + myStack.push(new Float(token.getValue())); + } + if (token.isOperator()) { + float f2 = myStack.pop(); + float f1 = myStack.pop(); + myStack.push(calculate(token.toString(), f1, f2)); + } + } + return myStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java b/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..d5ff875c0f --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java @@ -0,0 +1,34 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java b/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..651889259e --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java @@ -0,0 +1,59 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class PrefixExpr { + + private String exprString; + + public PrefixExpr(String exprString) { + this.exprString = exprString; + } + + public float evaluate() { + + MyStack myStack = new MyStack<>(); + MyStack exprStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(exprString); + + for(Token token : tokens){ + exprStack.push(token); + } + + while(!exprStack.isEmpty()){ + Token token = exprStack.pop(); + if (token.isNumber()) { + myStack.push(new Float(token.getValue())); + } + else { + Float f1 = myStack.pop(); + Float f2 = myStack.pop(); + myStack.push(calculate(token.toString(),f1,f2)); + } + } + return myStack.pop().floatValue(); + } + + private Float calculate(String operator, Float f1, Float f2) { + if ("+".equals(operator)) { + return f1 + f2; + } + if ("-".equals(operator)) { + return f1 - f2; + } + if ("*".equals(operator)) { + return f1 * f2; + } + if ("/".equals(operator)) { + return f1 / f2; + } + else { + throw new RuntimeException("this operator is not supported!"); + } + + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java b/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..ff11cc2395 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java @@ -0,0 +1,39 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/Token.java b/group23/632678665/com/basic/week7/stack/expr/Token.java new file mode 100644 index 0000000000..1696dafbef --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/Token.java @@ -0,0 +1,49 @@ +package com.ralf.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + + public static final List OPERATORS = Arrays.asList("+","-","*","/"); + private static final Map priorities = new HashMap(); + static{ + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int NUMBER = 1; + static final int OPERATOR = 2; + String value; + int type; + + public Token(String value, int type){ + this.value = value; + this.type = type; + } + public int getValue() { + + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + public boolean isNumber(){ + return type == NUMBER; + } + public boolean isOperator(){ + return type == OPERATOR; + } + public boolean hasHigherPriority(Token token){ + + if (!this.isOperator() || !token.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(token.value) > 0; + + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/TokenParser.java b/group23/632678665/com/basic/week7/stack/expr/TokenParser.java new file mode 100644 index 0000000000..66206c9f11 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/TokenParser.java @@ -0,0 +1,56 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + public TokenParser(){ + + } + public List parse(String string) { + List tokens = new ArrayList(); + int i = 0; + while(i < string.length()){ + + char ch = string.charAt(i); + if (isOperator(ch)) { + Token token = new Token(String.valueOf(ch), Token.OPERATOR); + tokens.add(token); + i++; + } + else if (Character.isDigit(ch)) { + int nextIndexOfChar = nextIndexOfOperator(i,string); + String value = string.substring(i, nextIndexOfChar); + Token token = new Token(value, Token.NUMBER); + tokens.add(token); + i = nextIndexOfChar; + } + else { + System.out.println("char:" + ch + " is not a number or operator,ignore!"); + i++; + } + + } + + + return tokens; + } + + private int nextIndexOfOperator(int i, String string) { + + while(Character.isDigit(string.charAt(i))){ + i++; + if (i == string.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char ch) { + String string = String.valueOf(ch); + return Token.OPERATORS.contains(string); + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java b/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..3066880551 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java @@ -0,0 +1,36 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + TokenParser tokenParser = new TokenParser(); + + List list = tokenParser.parse("300*20+12*5-20/4"); + Assert.assertEquals(300, list.get(0).getValue()); + Assert.assertEquals("*", list.get(1).toString()); + Assert.assertEquals(20, list.get(2).getValue()); + Assert.assertEquals("+", list.get(3).toString()); + Assert.assertEquals(12, list.get(4).getValue()); + Assert.assertEquals("*", list.get(5).toString()); + Assert.assertEquals(5, list.get(6).getValue()); + Assert.assertEquals("-", list.get(7).toString()); + Assert.assertEquals(20, list.get(8).getValue()); + Assert.assertEquals("/", list.get(9).toString()); + Assert.assertEquals(4, list.get(10).getValue()); + + } + +} diff --git a/group23/632678665/com/basic/week8/CircleQueue.java b/group23/632678665/com/basic/week8/CircleQueue.java new file mode 100644 index 0000000000..1a6f022a4e --- /dev/null +++ b/group23/632678665/com/basic/week8/CircleQueue.java @@ -0,0 +1,44 @@ +/** + * @author chk + */ +public class CircleQueue{ + + private int size; + private int first; + private int last; + Object[] queue; + + public CircleQueue(int size){ + queue = new Object[size]; + first = 0; + last = 0; + } + + public boolean isEmpty(){ + return first == last; + } + + public void enCircleQueue(Object o){ + if( (last+1) % size == first){ + System.out.println("Circle Queue is full"); + }else { + queue[last] = o; + last = (last+1) % queue.length; + } + } + + public int getSize(){ + return (last - first + queue.length) % queue.length; + } + + public Object deCircleQueue(){ + if(isEmpty()){ + return null; + }else{ + Object item = queue[first]; + first = (first+1)%queue.length; + return item; + } + + } +} diff --git a/group23/632678665/com/basic/week8/Josephus.java b/group23/632678665/com/basic/week8/Josephus.java new file mode 100644 index 0000000000..e3380c0ca6 --- /dev/null +++ b/group23/632678665/com/basic/week8/Josephus.java @@ -0,0 +1,44 @@ + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * @author chk + * + */ +public class Josephus { + + private static class Node { + int data; + Node next; + + public Node(int i) { + data = i; + } + } + + public static void execute(int n, int m) { + + Node header = new Node(0); + Node pointer = header; + for (int i = 1; i < n; i++) { + pointer.next = new Node(i); + pointer = pointer.next; + } + pointer.next = header; + while (pointer != pointer.next) { + for (int i = 1; i <= m; i++) { + pointer = pointer.next; + } + System.out.println(pointer.next.data); + pointer.next = pointer.next.next; + } + System.out.println(pointer.next.data); + + } + public static void main(String args[]){ + Josephus circle = new Josephus(); + circle.execute(8,4); + } +} diff --git a/group23/632678665/com/basic/week8/Queue.java b/group23/632678665/com/basic/week8/Queue.java new file mode 100644 index 0000000000..ea0e0cd621 --- /dev/null +++ b/group23/632678665/com/basic/week8/Queue.java @@ -0,0 +1,55 @@ +import javax.xml.soap.Node; +import java.util.NoSuchElementException; + +/** + * @author chk + */ +public class Queue { + + private Node first; + private Node last; + private int size; + + private static class Node{ + private E item; + private Node next; + } + public Queue(){ + first = null; + last = null; + size = 0; + } + public boolean isEmpty(){ + return first == null; + } + public int size(){ + return size; + } + public void enQueue(E data){ + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if(isEmpty()){ + first = last; + }else { + oldlast.next = last; + } + size++; + } + public E deQueue(){ + if(isEmpty()){ + throw new NoSuchElementException("queue is empty"); + }else{ + E item = first.item; + first = first.next; + size--; + if(isEmpty()){ + last = null; + } + return item; + } + } + + +} diff --git a/group23/632678665/com/basic/week8/QueueWithTwoStacks.java b/group23/632678665/com/basic/week8/QueueWithTwoStacks.java new file mode 100644 index 0000000000..af5d8a03df --- /dev/null +++ b/group23/632678665/com/basic/week8/QueueWithTwoStacks.java @@ -0,0 +1,47 @@ +import java.util.Stack; + +/** + * @author chk + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + public QueueWithTwoStacks(){ + stackk = new Stack(); + stackkk = new Stack(); + } + + public boolean isEmpty(){ + return stackk.isEmpty() && stackkk.isEmpty(); + } + + public int size() + { + return stackk.size() + stack2.size(); + } + + public void enQueue(E item){ + + stackk.push(item); + } + + public E deQueue(){ + if(stackkk.isEmpty()){ + while(!stackk.isEmpty()){ + stackkk.push(stackk.pop()); + } + } + return stackkk.pop(); + } + public static void main(String args[]){ + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + queue.enQueue(1); + queue.enQueue(5); + queue.enQueue(4); + queue.enQueue(0); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + } +} diff --git a/group23/632678665/com/basic/week9/QuickMinStack.java b/group23/632678665/com/basic/week9/QuickMinStack.java new file mode 100644 index 0000000000..bac723e3f1 --- /dev/null +++ b/group23/632678665/com/basic/week9/QuickMinStack.java @@ -0,0 +1,48 @@ + + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author chk + * + */ +public class QuickMinStack extends Stack { + + Stack sMin; + public QuickMinStack(){ + sMin = new Stack(); + } + public void push(int data){ + if(data <= findMin()){ + sMin.push(data); + } + super.push(data); + } + public Integer pop(){ + int value = super.pop(); + if(value == findMin()){ + sMin.pop(); + } + return value; + } + public int findMin(){ + if(sMin.isEmpty()){ + return Integer.MAX_VALUE; + } + return sMin.peek(); + } + + public static void main(String args[]){ + QuickMinStack stack = new QuickMinStack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(0); + System.out.println(stack.pop().intValue()); + System.out.println(stack.findMin()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } +} diff --git a/group23/632678665/com/basic/week9/StackWithTwoQueues.java b/group23/632678665/com/basic/week9/StackWithTwoQueues.java new file mode 100644 index 0000000000..7fcf9162c9 --- /dev/null +++ b/group23/632678665/com/basic/week9/StackWithTwoQueues.java @@ -0,0 +1,53 @@ +package com.basic.week9; +import java.util.LinkedList; + + +/** + * @author chk + */ +public class StackWithTwoQueues { + + LinkedList queue1=new LinkedList(); + LinkedList queue2=new LinkedList(); + public void push(int data){ + queue1.addLast(data); + } + public int pop() { + if (sSize() > 0) { + if (!queue1.isEmpty()) { + while (queue1.size() > 1) { + queue2.addLast(queue1.removeFirst()); + } + return queue1.removeFirst(); + } else { + while (queue2.size() > 1) { + queue1.addLast(queue2.removeFirst()); + } + return queue2.removeFirst(); + } + } else { + System.out.println("栈空,不能出栈"); + return Integer.MAX_VALUE; + } + } + public int sSize(){ + return queue1.size() + queue2.size(); + } + public static void main(String[] args) + { + StackWithTwoQueues stack=new StackWithTwoQueues(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + stack.push(5); + stack.push(6); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } +} diff --git a/group23/632678665/com/basic/week9/TwoStackInOneArray.java b/group23/632678665/com/basic/week9/TwoStackInOneArray.java new file mode 100644 index 0000000000..5443e6d6e4 --- /dev/null +++ b/group23/632678665/com/basic/week9/TwoStackInOneArray.java @@ -0,0 +1,82 @@ +package com.basic.week9; +import java.util.Stack; + +/** + * @author chk + */ +public class TwoStackInOneArray { + + + + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = data.length - 1; + + + private boolean isFull() { + if (index1 == index2) { + return true; + } else + return false; + } + + private void extendCapacity() { + + } + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return null; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + return null; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + return null; + } + +} From 0fa3e44719c1c068f28e03dc7e1c45af042c2955 Mon Sep 17 00:00:00 2001 From: chk Date: Mon, 8 May 2017 00:18:14 +0800 Subject: [PATCH 478/552] 6522 --- group23/1028361767/1028361767.md | 1 - .../coderising/download/DownloadThread.java | 31 -- .../coderising/download/FileDownloader.java | 104 ---- .../download/FileDownloaderTest.java | 59 --- .../coderising/download/api/Connection.java | 26 - .../download/api/ConnectionException.java | 8 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 62 --- .../download/impl/ConnectionManagerImpl.java | 26 - .../coderising/litestruts/LoginAction.java | 39 -- .../src/com/coderising/litestruts/Struts.java | 181 ------- .../com/coderising/litestruts/StrutsTest.java | 43 -- .../src/com/coderising/litestruts/View.java | 23 - .../src/com/coding/basic/BinaryTreeNode.java | 97 ---- .../src/com/coding/basic/Iterator.java | 8 - .../src/com/coding/basic/List.java | 13 - .../src/com/coding/basic/Queue.java | 24 - .../src/com/coding/basic/array/ArrayList.java | 83 ---- .../src/com/coding/basic/array/ArrayUtil.java | 210 --------- .../coding/basic/linklist/LRUPageFrame.java | 112 ----- .../basic/linklist/LRUPageFrameTest.java | 57 --- .../com/coding/basic/linklist/LinkedList.java | 402 ---------------- .../com/coding/basic/queue/CircleQueue.java | 57 --- .../basic/queue/EmptyQueueException.java | 14 - .../basic/queue/FullQueueException.java | 14 - .../src/com/coding/basic/queue/Josephus.java | 32 -- .../com/coding/basic/queue/JosephusTest.java | 28 -- .../src/com/coding/basic/queue/Queue.java | 61 --- .../basic/queue/QueueWithTwoStacks.java | 54 --- .../com/coding/basic/stack/QuickMinStack.java | 45 -- .../src/com/coding/basic/stack/Stack.java | 47 -- .../src/com/coding/basic/stack/StackUtil.java | 111 ----- .../basic/stack/StackWithTwoQueues.java | 34 -- .../basic/stack/TwoStackInOneArray.java | 108 ----- .../coding/basic/stack/expr/InfixExpr.java | 159 ------- .../basic/stack/expr/InfixExprTest.java | 48 -- .../basic/stack/expr/InfixToPostfix.java | 44 -- .../coding/basic/stack/expr/PostfixExpr.java | 62 --- .../basic/stack/expr/PostfixExprTest.java | 42 -- .../coding/basic/stack/expr/PrefixExpr.java | 85 ---- .../basic/stack/expr/PrefixExprTest.java | 45 -- .../com/coding/basic/stack/expr/Token.java | 50 -- .../coding/basic/stack/expr/TokenParser.java | 64 --- .../basic/stack/expr/TokenParserTest.java | 41 -- .../src/com/coding/me/Palindrome.java | 82 ---- .../me/book/algorithms/BasicBinarySearch.java | 12 - .../me/leetcode/algorithms/AddTwoNums.java | 84 ---- .../algorithms/LongestCommonPrefix.java | 223 --------- ...stSubstringWithoutRepeatingCharacters.java | 229 --------- .../algorithms/MedianOfTwoSortedArrays.java | 102 ---- .../leetcode/algorithms/OptimalDivision.java | 76 --- .../algorithms/StudentAttendanceRecord1.java | 46 -- .../coding/me/leetcode/algorithms/TwoSum.java | 102 ---- .../test/com/coding/basic/TestArrayList.java | 61 --- .../com/coding/basic/TestBinaryTreeNode.java | 37 -- .../test/com/coding/basic/TestLinkedList.java | 176 ------- .../com/coding/basic/stack/TestStackUtil.java | 63 --- .../src/me/practise/chapter2.java | 44 -- .../src/practise/chapter1/HelloService.java | 35 -- .../practise/chapter1/HelloWorldService.java | 9 - .../learn-spring/src/test/practise/Test1.java | 39 -- .../coderising/jvm/attr/AttributeInfo.java | 19 - .../src/com/coderising/jvm/attr/CodeAttr.java | 89 ---- .../coderising/jvm/attr/LineNumberTable.java | 51 -- .../jvm/attr/LocalVariableItem.java | 39 -- .../jvm/attr/LocalVariableTable.java | 40 -- .../coderising/jvm/attr/StackMapTable.java | 30 -- .../com/coderising/jvm/clz/AccessFlag.java | 25 - .../src/com/coderising/jvm/clz/ClassFile.java | 121 ----- .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 - .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ----- .../com/coderising/jvm/cmd/CommandParser.java | 138 ------ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 - .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 - .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 - .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 - .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 -- .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 - .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 - .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 -- .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 - .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 --- .../coderising/jvm/constant/ClassInfo.java | 28 -- .../coderising/jvm/constant/ConstantInfo.java | 41 -- .../coderising/jvm/constant/ConstantPool.java | 29 -- .../coderising/jvm/constant/FieldRefInfo.java | 58 --- .../jvm/constant/MethodRefInfo.java | 60 --- .../jvm/constant/NameAndTypeInfo.java | 50 -- .../jvm/constant/NullConstantInfo.java | 17 - .../coderising/jvm/constant/StringInfo.java | 31 -- .../com/coderising/jvm/constant/UTF8Info.java | 36 -- .../src/com/coderising/jvm/field/Field.java | 45 -- .../jvm/loader/ByteCodeIterator.java | 69 --- .../jvm/loader/ClassFileLoader.java | 99 ---- .../jvm/loader/ClassFileParser.java | 134 ------ .../src/com/coderising/jvm/method/Method.java | 84 ---- .../jvm/print/ClassFilePrinter.java | 54 --- .../jvm/print/ConstantPoolPrinter.java | 77 --- .../jvm/test/ClassFileloaderTest.java | 353 -------------- .../com/coderising/jvm/test/EmployeeV1.java | 28 -- .../src/com/coderising/jvm/util/Util.java | 24 - .../src/com/skomefen/list/ArrayList.java | 83 ---- .../com/skomefen/list/ArrayListIterator.java | 25 - .../src/com/skomefen/list/BinaryTreeNode.java | 32 -- .../src/com/skomefen/list/Iterator.java | 7 - .../src/com/skomefen/list/LinkedList.java | 252 ---------- .../com/skomefen/list/LinkedListiterator.java | 25 - .../day3-11/src/com/skomefen/list/List.java | 9 - .../day3-11/src/com/skomefen/list/Queue.java | 26 - .../day3-11/src/com/skomefen/list/Stack.java | 28 -- .../day3-11/src/com/skomefen/test/test.java | 109 ----- .../src/com/coderising/array/ArrayUtil.java | 117 ----- .../com/coderising/litestruts/StrutsTest.java | 54 --- .../coderising/download/DownloadThread.java | 65 --- .../coderising/download/FileDownloader.java | 89 ---- .../download/FileDownloaderTest.java | 58 --- .../coderising/download/api/Connection.java | 24 - .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 143 ------ .../download/impl/ConnectionManagerImpl.java | 16 - .../src/junit/test/ConnectionImplTest.java | 92 ---- .../junit/test/ConnectionManagerImplTest.java | 31 -- .../src/junit/test/DownloadThreadTest.java | 77 --- .../src/com/coding/datastructs/ArrayList.java | 98 ---- .../src/com/coding/datastructs/Iterator.java | 7 - .../com/coding/datastructs/LinkedList.java | 229 --------- .../src/com/coding/datastructs/List.java | 9 - .../com/coding/datastructs/MyIterator.java | 35 -- .../src/com/coding/datastructs/Queue.java | 30 -- .../src/com/coding/datastructs/Stack.java | 33 -- .../src/com/coding/test/ArrayListTest.java | 32 -- .../src/com/coding/test/LinkedListTest.java | 28 -- .../src/com/coding/test/QueueTest.java | 22 - .../src/com/coding/test/StackTest.java | 25 - .../com/coding/datastructs/ArrayUtil.java" | 141 ------ .../src/com/coding/test/ArrayUtilTest.java" | 86 ---- .../coderising/litestruts/LoginAction.java" | 35 -- .../com/coderising/litestruts/Struts.java" | 122 ----- .../coderising/litestruts/StrutsTest.java" | 43 -- .../src/com/coderising/litestruts/Test.java" | 94 ---- .../src/com/coderising/litestruts/View.java" | 23 - .../01_5BasicDS/src/main/ArrayList.java | 82 ---- .../01_5BasicDS/src/main/BinaryTreeNode.java | 65 --- .../01_5BasicDS/src/main/Iterator.java | 6 - .../01_5BasicDS/src/main/LinkedList.java | 114 ----- .../01_5BasicDS/src/main/List.java | 9 - .../01_5BasicDS/src/main/Queue.java | 22 - .../01_5BasicDS/src/main/Stack.java | 25 - .../01_5BasicDS/src/test/ArrayListTest.java | 144 ------ .../src/test/BinaryTreeNodeTest.java | 25 - .../01_5BasicDS/src/test/LinkedListTest.java | 126 ----- .../01_5BasicDS/src/test/QueueTest.java | 50 -- .../01_5BasicDS/src/test/StackTest.java | 67 --- .../01_5BasicDS/src/utils/ListUtils.java | 11 - .../02_ArrayUtil/src/main/ArrayUtil.java | 209 -------- .../02_ArrayUtil/src/test/ArrayUtilTest.java | 101 ---- .../src/main/Iterator.java | 6 - .../src/main/LinkedList.java | 256 ---------- .../src/main/List.java | 9 - .../src/test/LinkedListTest.java | 251 ---------- .../src/utils/ListUtils.java | 11 - .../04_LRU/src/main/LRUPageFrame.java | 117 ----- .../04_LRU/src/test/LRUPageFrameTest.java | 35 -- .../05_StackUtil/src/main/ArrayList.java | 75 --- .../05_StackUtil/src/main/Iterator.java | 6 - .../05_StackUtil/src/main/ListUtils.java | 11 - .../05_StackUtil/src/main/Stack.java | 25 - .../05_StackUtil/src/main/StackUtil.java | 110 ----- .../05_StackUtil/src/test/StackUtilTest.java | 93 ---- .../01_litestruts/src/main/LoginAction.java | 36 -- .../01_litestruts/src/main/Struts.java | 71 --- .../01_litestruts/src/main/View.java | 27 -- .../01_litestruts/src/test/StrutsTest.java | 55 --- .../02_downloader/src/api/Connection.java | 23 - .../src/api/ConnectionException.java | 6 - .../src/api/ConnectionManager.java | 10 - .../src/api/DownloadListener.java | 5 - .../src/impl/ConnectionImpl.java | 54 --- .../src/impl/ConnectionManagerImpl.java | 15 - .../src/main/DownloadThread.java | 50 -- .../src/main/FileDownloader.java | 73 --- .../src/test/DownloaderTest.java | 21 - .../src/com/xiaol/study/ArrayList.java | 94 ---- .../src/com/xiaol/study/ArrayListTest.java | 82 ---- .../src/com/xiaol/study/BinaryTreeNode.java | 59 --- .../com/xiaol/study/BinaryTreeNodeTest.java | 82 ---- .../src/com/xiaol/study/Iterator.java | 12 - .../src/com/xiaol/study/LinkedList.java | 253 ---------- .../src/com/xiaol/study/LinkedListTest.java | 131 ----- .../src/com/xiaol/study/List.java | 13 - .../src/com/xiaol/study/Queue.java | 41 -- .../src/com/xiaol/study/QueueTest.java | 64 --- .../src/com/xiaol/study/Stack.java | 49 -- .../src/com/xiaol/study/StackTest.java | 68 --- group23/381519422/array/.classpath | 7 - group23/381519422/array/.gitignore | 1 - group23/381519422/array/.project | 17 - .../381519422/array/src/array/ArrayUtil.java | 354 -------------- .../array/src/array/ArrayUtilTest.java | 116 ----- .../java/com/xiaol/download/DownloadDemo.java | 53 --- .../com/xiaol/download/DownloadThread.java | 37 -- .../com/xiaol/download/FileDownloader.java | 133 ------ .../xiaol/download/FileDownloaderTest.java | 60 --- .../com/xiaol/download/api/Connection.java | 23 - .../download/api/ConnectionException.java | 5 - .../xiaol/download/api/ConnectionManager.java | 10 - .../xiaol/download/api/DownloadListener.java | 5 - .../xiaol/download/impl/ConnectionImpl.java | 60 --- .../download/impl/ConnectionManagerImpl.java | 15 - .../java/com/xiaol/study/LoginAction.java | 36 -- .../src/main/java/com/xiaol/study/Struts.java | 176 ------- .../main/java/com/xiaol/study/StrutsTest.java | 43 -- .../src/main/java/com/xiaol/study/View.java | 26 - .../litestruts/src/main/resources/struts.xml | 24 - .../jvm/loader/ClassFileLoader.java | 81 ---- .../jvm/test/ClassFileloaderTest.java | 92 ---- .../com/coderising/jvm/test/EmployeeV1.java | 28 -- .../563253496/week4_lru/src/LRUPageFrame.java | 135 ------ .../week4_lru/src/LRUPageFrameTest.java | 34 -- .../com/coderising/jvm/clz/AccessFlag.java | 25 - .../src/com/coderising/jvm/clz/ClassFile.java | 75 --- .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../coderising/jvm/constant/ClassInfo.java | 24 - .../coderising/jvm/constant/ConstantInfo.java | 29 -- .../coderising/jvm/constant/ConstantPool.java | 29 -- .../coderising/jvm/constant/FieldRefInfo.java | 54 --- .../jvm/constant/MethodRefInfo.java | 55 --- .../jvm/constant/NameAndTypeInfo.java | 45 -- .../jvm/constant/NullConstantInfo.java | 13 - .../coderising/jvm/constant/StringInfo.java | 26 - .../com/coderising/jvm/constant/UTF8Info.java | 32 -- .../jvm/loader/ByteCodeIterator.java | 54 --- .../jvm/loader/ClassFileLoader.java | 140 ------ .../jvm/loader/ClassFileParser.java | 112 ----- .../jvm/test/ClassFileloaderTest.java | 202 -------- .../com/coderising/jvm/test/EmployeeV1.java | 31 -- .../src/com/coderising/jvm/util/Util.java | 24 - .../week5_stack/src/stack/Stack.java | 63 --- .../week5_stack/src/stack/StackUtil.java | 129 ----- .../week5_stack/src/test/StackUtilTest.java | 95 ---- .../coderising/jvm/attr/AttributeInfo.java | 19 - .../src/com/coderising/jvm/attr/CodeAttr.java | 142 ------ .../coderising/jvm/attr/LineNumberTable.java | 83 ---- .../jvm/attr/LocalVariableItem.java | 39 -- .../jvm/attr/LocalVariableTable.java | 58 --- .../coderising/jvm/attr/StackMapTable.java | 30 -- .../com/coderising/jvm/clz/AccessFlag.java | 25 - .../src/com/coderising/jvm/clz/ClassFile.java | 113 ----- .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 - .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ----- .../com/coderising/jvm/cmd/CommandParser.java | 130 ----- .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 - .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 - .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 - .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 - .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 -- .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 - .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 - .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 -- .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 - .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 --- .../coderising/jvm/constant/ClassInfo.java | 24 - .../coderising/jvm/constant/ConstantInfo.java | 29 -- .../coderising/jvm/constant/ConstantPool.java | 29 -- .../coderising/jvm/constant/FieldRefInfo.java | 54 --- .../jvm/constant/MethodRefInfo.java | 55 --- .../jvm/constant/NameAndTypeInfo.java | 45 -- .../jvm/constant/NullConstantInfo.java | 13 - .../coderising/jvm/constant/StringInfo.java | 26 - .../com/coderising/jvm/constant/UTF8Info.java | 32 -- .../src/com/coderising/jvm/field/Field.java | 44 -- .../jvm/loader/ByteCodeIterator.java | 65 --- .../jvm/loader/ClassFileLoader.java | 140 ------ .../jvm/loader/ClassFileParser.java | 170 ------- .../src/com/coderising/jvm/method/Method.java | 66 --- .../jvm/test/ClassFileloaderTest.java | 354 -------------- .../com/coderising/jvm/test/EmployeeV1.java | 28 -- .../src/com/coderising/jvm/util/Util.java | 24 - .../coderising/download/DownloadThread.java | 20 - .../coderising/download/FileDownloader.java | 73 --- .../download/FileDownloaderTest.java | 59 --- .../coderising/download/api/Connection.java | 23 - .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 27 -- .../download/impl/ConnectionManagerImpl.java | 15 - .../coderising/litestruts/LoginAction.java | 39 -- .../src/com/coderising/litestruts/Struts.java | 34 -- .../com/coderising/litestruts/StrutsTest.java | 43 -- .../src/com/coderising/litestruts/View.java | 23 - .../src/com/coding/basic/BinaryTreeNode.java | 32 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/Queue.java | 19 - .../src/com/coding/basic/array/ArrayList.java | 35 -- .../src/com/coding/basic/array/ArrayUtil.java | 96 ---- .../coding/basic/linklist/LRUPageFrame.java | 164 ------- .../basic/linklist/LRUPageFrameTest.java | 34 -- .../com/coding/basic/linklist/LinkedList.java | 125 ----- .../src/com/coding/basic/stack/Stack.java | 64 --- .../src/com/coding/basic/stack/StackUtil.java | 136 ------ .../com/coding/basic/stack/StackUtilTest.java | 78 --- .../coding/basic/stack/expr/InfixExpr.java | 112 ----- .../basic/stack/expr/InfixExprTest.java | 48 -- .../coderising/jvm/attr/AttributeInfo.java | 19 - .../src/com/coderising/jvm/attr/CodeAttr.java | 72 --- .../coderising/jvm/attr/LineNumberTable.java | 55 --- .../jvm/attr/LocalVariableItem.java | 39 -- .../jvm/attr/LocalVariableTable.java | 42 -- .../coderising/jvm/attr/StackMapTable.java | 30 -- .../com/coderising/jvm/clz/AccessFlag.java | 25 - .../src/com/coderising/jvm/clz/ClassFile.java | 102 ---- .../com/coderising/jvm/clz/ClassIndex.java | 19 - .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 - .../coderising/jvm/cmd/ByteCodeCommand.java | 128 ----- .../com/coderising/jvm/cmd/CommandParser.java | 85 ---- .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 - .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 - .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 - .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 - .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 -- .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 - .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 - .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 -- .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 - .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 --- .../coderising/jvm/constant/ClassInfo.java | 28 -- .../coderising/jvm/constant/ConstantInfo.java | 40 -- .../coderising/jvm/constant/ConstantPool.java | 31 -- .../coderising/jvm/constant/FieldRefInfo.java | 58 --- .../jvm/constant/MethodRefInfo.java | 60 --- .../jvm/constant/NameAndTypeInfo.java | 51 -- .../jvm/constant/NullConstantInfo.java | 17 - .../coderising/jvm/constant/StringInfo.java | 32 -- .../com/coderising/jvm/constant/UTF8Info.java | 37 -- .../src/com/coderising/jvm/field/Field.java | 50 -- .../jvm/loader/ByteCodeIterator.java | 57 --- .../jvm/loader/ClassFileLoader.java | 140 ------ .../jvm/loader/ClassFileParser.java | 62 --- .../src/com/coderising/jvm/method/Method.java | 80 ---- .../jvm/print/ClassFilePrinter.java | 54 --- .../jvm/print/ConstantPoolPrinter.java | 25 - .../jvm/test/ClassFileloaderTest.java | 354 -------------- .../com/coderising/jvm/test/EmployeeV1.java | 28 -- .../src/com/coderising/jvm/util/Util.java | 24 - .../coderising/download/DownloadThread.java | 20 - .../coderising/download/FileDownloader.java | 73 --- .../download/FileDownloaderTest.java | 59 --- .../coderising/download/api/Connection.java | 23 - .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 27 -- .../download/impl/ConnectionManagerImpl.java | 15 - .../coderising/litestruts/LoginAction.java | 39 -- .../src/com/coderising/litestruts/Struts.java | 34 -- .../com/coderising/litestruts/StrutsTest.java | 43 -- .../src/com/coderising/litestruts/View.java | 23 - .../src/com/coding/basic/BinaryTreeNode.java | 32 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/List.java | 9 - .../src/com/coding/basic/array/ArrayList.java | 35 -- .../src/com/coding/basic/array/ArrayUtil.java | 96 ---- .../coding/basic/linklist/LRUPageFrame.java | 57 --- .../basic/linklist/LRUPageFrameTest.java | 34 -- .../com/coding/basic/linklist/LinkedList.java | 125 ----- .../com/coding/basic/queue/CircleQueue.java | 5 - .../src/com/coding/basic/queue/Josephus.java | 19 - .../com/coding/basic/queue/JosephusTest.java | 27 -- .../src/com/coding/basic/queue/Queue.java | 61 --- .../basic/queue/QueueWithTwoStacks.java | 40 -- .../src/com/coding/basic/stack/Stack.java | 64 --- .../src/com/coding/basic/stack/StackUtil.java | 136 ------ .../com/coding/basic/stack/StackUtilTest.java | 65 --- .../coding/basic/stack/expr/InfixExpr.java | 15 - .../basic/stack/expr/InfixExprTest.java | 52 -- .../basic/stack/expr/InfixToPostfix.java | 110 ----- .../coding/basic/stack/expr/PostfixExpr.java | 95 ---- .../basic/stack/expr/PostfixExprTest.java | 41 -- .../coding/basic/stack/expr/PrefixExpr.java | 98 ---- .../basic/stack/expr/PrefixExprTest.java | 45 -- .../com/coding/basic/stack/expr/Token.java | 50 -- .../coding/basic/stack/expr/TokenParser.java | 57 --- .../basic/stack/expr/TokenParserTest.java | 41 -- .../week8_datastructure/src/CircleQueue.java | 53 --- .../week8_datastructure/src/Josephus.java | 47 -- .../week8_datastructure/src/JosephusTest.java | 28 -- .../week8_datastructure/src/Queue.java | 62 --- .../src/QueueWithTwoStacks.java | 60 --- .../src/QuickMinStack.java | 40 -- .../src/StackWithTwoQueues.java | 53 --- .../src/TwoStackInOneArray.java | 100 ---- .../src/com/coderising/array/ArrayUtil.java | 96 ---- .../coderising/download/DownloadThread.java | 20 - .../coderising/download/FileDownloader.java | 73 --- .../download/FileDownloaderTest.java | 59 --- .../coderising/download/api/Connection.java | 23 - .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 27 -- .../download/impl/ConnectionManagerImpl.java | 15 - .../coderising/litestruts/LoginAction.java | 39 -- .../src/com/coderising/litestruts/Struts.java | 37 -- .../com/coderising/litestruts/StrutsTest.java | 43 -- .../src/com/coderising/litestruts/View.java | 23 - .../src/com/coding/basic/ArrayList.java | 32 -- .../src/com/coding/basic/BinaryTreeNode.java | 32 -- .../src/com/coding/basic/Iterator.java | 7 - .../src/com/coding/basic/LinkedList.java | 265 ----------- .../565832157/src/com/coding/basic/List.java | 9 - .../565832157/src/com/coding/basic/Queue.java | 19 - .../565832157/src/com/coding/basic/Stack.java | 22 - group23/601689050/.gitattributes | 17 - .../1List&BinaryTreeNode/ArrayList.java | 58 --- .../1List&BinaryTreeNode/BinaryTreeNode.java | 50 -- .../1List&BinaryTreeNode/Iterator.java | 7 - .../1List&BinaryTreeNode/LinkedList.java | 117 ----- .../601689050/1List&BinaryTreeNode/List.java | 10 - .../601689050/1List&BinaryTreeNode/Queue.java | 45 -- .../601689050/1List&BinaryTreeNode/Stack.java | 39 -- .../JVM/loader/ClassFileLoader.java | 65 --- .../JVM/test/loader/ClassFileLoaderTest.java | 86 ---- .../JVM/test/loader/EmployeeV1.java | 28 -- .../601689050/4weekLRU&JVM/LRU/Iterator.java | 5 - .../4weekLRU&JVM/LRU/LRUPageFrame.java | 117 ----- .../4weekLRU&JVM/LRU/LRUPageFrameTest.java | 29 -- .../4weekLRU&JVM/LRU/LinkedList.java | 313 ------------ group23/601689050/4weekLRU&JVM/LRU/List.java | 7 - group23/601689050/5weekStack/stack/Stack.java | 70 --- .../601689050/5weekStack/stack/StackUtil.java | 133 ------ .../5weekStack/test/StackUtilTest.java | 69 --- .../601689050/6weekInfixExpr/InfixExpr.java | 61 --- .../6weekInfixExpr/InfixExprTest.java | 50 -- group23/601689050/6weekInfixExpr/Stack.java | 50 -- group23/601689050/6weekInfixExpr/Token.java | 46 -- .../601689050/6weekInfixExpr/TokenParser.java | 47 -- group23/601689050/7weekExpr2/InfixExpr.java | 61 --- .../601689050/7weekExpr2/InfixToPostfix.java | 35 -- group23/601689050/7weekExpr2/PostfixExpr.java | 45 -- .../601689050/7weekExpr2/PostfixExprTest.java | 37 -- group23/601689050/7weekExpr2/PrefixExpr.java | 51 -- .../601689050/7weekExpr2/PrefixExprTest.java | 42 -- group23/601689050/7weekExpr2/Stack.java | 50 -- group23/601689050/7weekExpr2/Token.java | 49 -- group23/601689050/7weekExpr2/TokenParser.java | 47 -- group23/601689050/8weekQueue/CircleQueue.java | 44 -- group23/601689050/8weekQueue/Josephus.java | 50 -- group23/601689050/8weekQueue/Queue.java | 55 --- .../8weekQueue/QueueWithTwoStacks.java | 47 -- .../601689050/9weekStack/QuickMinStack.java | 50 -- .../9weekStack/StackWithTwoQueues.java | 52 -- .../9weekStack/TwoStackInOneArray.java | 81 ---- group23/609041842/src/code/ArrayList.java | 49 -- group23/609041842/src/code/LinkedList.java | 87 ---- group23/609041842/src/code/Queue.java | 17 - group23/609041842/src/code/Stack.java | 30 -- .../src/com/homework01/ArrayList.java | 49 -- .../src/com/homework01/LinkedList.java | 87 ---- .../609041842/src/com/homework01/Queue.java | 17 - .../609041842/src/com/homework01/Stack.java | 30 -- group23/609041842/src/test.java | 9 - .../com/basic/datastructure/ArrayList.java | 62 --- .../com/basic/datastructure/LinkedList.java | 98 ---- .../com/basic/datastructure/List.java | 9 - .../com/basic/datastructure/Queue.java | 23 - .../com/basic/datastructure/Stack.java | 29 -- .../datastructure/TestDataStructure.java | 27 -- .../basic/week2/datastructure/ArrayTest.java | 50 -- .../basic/week2/datastructure/ArrayUtil.java | 228 --------- .../basic/week2/litestruts/LoginAction.java | 39 -- .../com/basic/week2/litestruts/Struts.java | 35 -- .../basic/week2/litestruts/StrutsTest.java | 43 -- .../com/basic/week2/litestruts/View.java | 24 - .../basic/week3/datastructure/LinkedList.java | 446 ------------------ .../com/basic/week3/download/Demo.java | 36 -- .../basic/week3/download/DownloadThread.java | 31 -- .../basic/week3/download/FileDownloader.java | 97 ---- .../week3/download/FileDownloaderTest.java | 59 --- .../basic/week3/download/api/Connection.java | 24 - .../download/api/ConnectionException.java | 12 - .../week3/download/api/ConnectionManager.java | 10 - .../week3/download/api/DownloadListener.java | 5 - .../week3/download/impl/ConnectionImpl.java | 59 --- .../download/impl/ConnectionManagerImpl.java | 35 -- .../week4/jvm/loader/ClassFileLoader.java | 74 --- .../com/basic/week4/jvm/test/EmployeeV1.java | 30 -- .../com/basic/week4/lru/LRUPageFrame.java | 131 ----- .../com/basic/week5/stack/StackUtil.java | 103 ---- .../com/basic/week6/expr/InfixExpr.java | 127 ----- .../632678665/com/basic/week6/expr/Token.java | 52 -- .../com/basic/week6/exprNew/InfixExpr.java | 57 --- .../com/basic/week6/exprNew/Operator.java | 75 --- .../com/basic/week6/exprNew/Token.java | 63 --- .../com/basic/week6/exprNew/TokenParser.java | 60 --- .../com/basic/week7/stack/MyStack.java | 42 -- .../com/basic/week7/stack/StackUtil.java | 173 ------- .../basic/week7/stack/expr/ExprIterator.java | 57 --- .../com/basic/week7/stack/expr/InfixExpr.java | 74 --- .../week7/stack/expr/InfixToPostExpr.java | 41 -- .../week7/stack/expr/InfixToPostExprTest.java | 30 -- .../basic/week7/stack/expr/PostfixExpr.java | 48 -- .../week7/stack/expr/PostfixExprTest.java | 34 -- .../basic/week7/stack/expr/PrefixExpr.java | 59 --- .../week7/stack/expr/PrefixExprTest.java | 39 -- .../com/basic/week7/stack/expr/Token.java | 49 -- .../basic/week7/stack/expr/TokenParser.java | 56 --- .../week7/stack/expr/TokenParserTest.java | 36 -- .../com/basic/week8/CircleQueue.java | 44 -- .../632678665/com/basic/week8/Josephus.java | 44 -- group23/632678665/com/basic/week8/Queue.java | 55 --- .../com/basic/week8/QueueWithTwoStacks.java | 47 -- .../com/basic/week9/QuickMinStack.java | 48 -- .../com/basic/week9/StackWithTwoQueues.java | 53 --- .../com/basic/week9/TwoStackInOneArray.java | 82 ---- group23/729693763/First_Homework1/readme.md | 2 - .../src/com/danny/hw1/ArrayList.java | 117 ----- .../src/com/danny/hw1/BinaryTreeNode.java | 101 ---- .../src/com/danny/hw1/Iterator.java | 6 - .../src/com/danny/hw1/LinkedList.java | 296 ------------ .../src/com/danny/hw1/List.java | 10 - .../src/com/danny/hw1/Queue.java | 25 - .../src/com/danny/hw1/Stack.java | 40 -- .../src/com/danny/hw1/test/ArrayListTest.java | 80 ---- .../danny/hw1/test/BinaryTreeNodeTest.java | 48 -- .../com/danny/hw1/test/LinkedListTest.java | 86 ---- .../src/com/danny/hw1/test/QueueTest.java | 47 -- .../src/com/danny/hw1/test/StackTest.java | 54 --- .../src/com/danny/hw1/test/SuitTest.java | 17 - .../src/com/danny/hw2/ArrayUtil.java | 221 --------- .../src/com/danny/hw2/LoginAction.java | 39 -- .../src/com/danny/hw2/Struts.java | 163 ------- .../src/com/danny/hw2/View.java | 23 - .../src/com/danny/hw2/test/ArrayUtilTest.java | 95 ---- .../src/com/danny/hw2/test/StrutsTest.java | 46 -- .../Third_Homework3/DataStruct/Iterator.java | 6 - .../DataStruct/LinkedList.java | 327 ------------- .../Third_Homework3/DataStruct/List.java | 10 - .../download/DownloadThread.java | 49 -- .../download/FileDownloader.java | 96 ---- .../download/FileDownloaderTest.java | 58 --- .../download/api/Connection.java | 23 - .../download/api/ConnectionException.java | 5 - .../download/api/ConnectionManager.java | 10 - .../download/api/DownloadListener.java | 5 - .../download/impl/ConnectionImpl.java | 80 ---- .../download/impl/ConnectionManagerImpl.java | 27 -- .../729693763/homework1_demo/ArrayList.java | 32 -- .../homework1_demo/BinaryTreeNode.java | 32 -- .../729693763/homework1_demo/Iterator.java | 7 - .../729693763/homework1_demo/LinkedList.java | 124 ----- group23/729693763/homework1_demo/List.java | 9 - group23/729693763/homework1_demo/Queue.java | 19 - group23/729693763/homework1_demo/Stack.java | 22 - group23/729693763/readme.md | 12 - .../src/main/java/code01/ArrayList.java | 138 ------ .../src/main/java/code01/BinaryTree.java | 97 ---- .../coding/src/main/java/code01/Iterator.java | 7 - .../src/main/java/code01/LinkedList.java | 327 ------------- .../coding/src/main/java/code01/List.java | 9 - .../coding/src/main/java/code01/Queue.java | 24 - .../coding/src/main/java/code01/Stack.java | 31 -- .../src/main/java/code02/ArrayUtil.java | 257 ---------- .../java/code02/litestruts/ActionConfig.java | 28 -- .../java/code02/litestruts/Configuration.java | 64 --- .../java/code02/litestruts/LoginAction.java | 39 -- .../code02/litestruts/ReflectionUtil.java | 119 ----- .../main/java/code02/litestruts/Struts.java | 76 --- .../src/main/java/code02/litestruts/View.java | 23 - .../src/main/java/code03/DownloadThread.java | 47 -- .../src/main/java/code03/FileDownloader.java | 109 ----- .../src/main/java/code03/api/Connection.java | 23 - .../java/code03/api/ConnectionException.java | 9 - .../java/code03/api/ConnectionManager.java | 10 - .../java/code03/api/DownloadListener.java | 5 - .../main/java/code03/impl/ConnectionImpl.java | 106 ----- .../code03/impl/ConnectionManagerImpl.java | 36 -- .../src/main/java/code04/LRUPageFrame.java | 162 ------- .../java/mini_jvm/loader/ClassFileLoader.java | 108 ----- .../src/test/java/code01/ArrayListTest.java | 67 --- .../src/test/java/code01/BinaryTreeTest.java | 27 -- .../src/test/java/code01/LinkedListTest.java | 174 ------- .../src/test/java/code01/QueueTest.java | 24 - .../src/test/java/code01/StackTest.java | 27 -- .../src/test/java/code02/ArrayUtilTest.java | 73 --- .../java/code02/litestruts/StrutsTest.java | 43 -- .../test/java/code03/FileDownloaderTest.java | 59 --- .../test/java/code04/LRUPageFrameTest.java | 38 -- .../java/mini_jvm/ClassFileloaderTest.java | 71 --- .../src/test/java/mini_jvm/EmployeeV1.java | 28 -- .../810181789/src/firstday/ArrayListt.java | 86 ---- group23/810181789/src/firstday/LinkListt.java | 167 ------- group23/810181789/src/firstday/Queue.java | 43 -- group23/810181789/src/firstday/Stack.java | 43 -- group23/group23.md | 1 - 601 files changed, 35579 deletions(-) delete mode 100644 group23/1028361767/1028361767.md delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/Connection.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/LoginAction.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/Struts.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/View.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Iterator.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/List.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Queue.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LinkedList.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/JosephusTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/Queue.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/StackUtil.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/Palindrome.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/book/algorithms/BasicBinarySearch.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/AddTwoNums.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestSubstringWithoutRepeatingCharacters.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/StudentAttendanceRecord1.java delete mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java delete mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java delete mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java delete mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java delete mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/stack/TestStackUtil.java delete mode 100644 group23/1028361767/java8-function-coding/src/me/practise/chapter2.java delete mode 100644 group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java delete mode 100644 group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java delete mode 100644 group23/1028361767/learn-spring/src/test/practise/Test1.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/AccessFlag.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/method/Method.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayList.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/BinaryTreeNode.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Iterator.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedList.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/List.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Queue.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Stack.java delete mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/test/test.java delete mode 100644 group23/1072760797-skomefen/day3-19/src/com/coderising/array/ArrayUtil.java delete mode 100644 group23/1072760797-skomefen/day3-19/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionImplTest.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java delete mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/ArrayList.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/Iterator.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/LinkedList.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/List.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/MyIterator.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/Queue.java delete mode 100644 group23/1246614258/src/com/coding/datastructs/Stack.java delete mode 100644 group23/1246614258/src/com/coding/test/ArrayListTest.java delete mode 100644 group23/1246614258/src/com/coding/test/LinkedListTest.java delete mode 100644 group23/1246614258/src/com/coding/test/QueueTest.java delete mode 100644 group23/1246614258/src/com/coding/test/StackTest.java delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/test/ArrayUtilTest.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/LoginAction.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Struts.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" delete mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java delete mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java delete mode 100644 group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java delete mode 100644 group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java delete mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java delete mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java delete mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/List.java delete mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/test/LinkedListTest.java delete mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/utils/ListUtils.java delete mode 100644 group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java delete mode 100644 group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java delete mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java delete mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java delete mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java delete mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java delete mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java delete mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java delete mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java delete mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/Struts.java delete mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/View.java delete mode 100644 group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/api/Connection.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java delete mode 100644 group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/List.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Queue.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Stack.java delete mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java delete mode 100644 group23/381519422/array/.classpath delete mode 100644 group23/381519422/array/.gitignore delete mode 100644 group23/381519422/array/.project delete mode 100644 group23/381519422/array/src/array/ArrayUtil.java delete mode 100644 group23/381519422/array/src/array/ArrayUtilTest.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java delete mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java delete mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java delete mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java delete mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java delete mode 100644 group23/381519422/litestruts/src/main/resources/struts.xml delete mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group23/563253496/week4_lru/src/LRUPageFrame.java delete mode 100644 group23/563253496/week4_lru/src/LRUPageFrameTest.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java delete mode 100644 group23/563253496/week5_stack/src/stack/Stack.java delete mode 100644 group23/563253496/week5_stack/src/stack/StackUtil.java delete mode 100644 group23/563253496/week5_stack/src/test/StackUtilTest.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/method/Method.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/Connection.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/LoginAction.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/Struts.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/View.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/Iterator.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/List.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/Queue.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtilTest.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java delete mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LineNumberTable.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileParser.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/method/Method.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java delete mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/Connection.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/LoginAction.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/Struts.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/View.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/Iterator.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/List.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtilTest.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java delete mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java delete mode 100644 group23/563253496/week8_datastructure/src/CircleQueue.java delete mode 100644 group23/563253496/week8_datastructure/src/Josephus.java delete mode 100644 group23/563253496/week8_datastructure/src/JosephusTest.java delete mode 100644 group23/563253496/week8_datastructure/src/Queue.java delete mode 100644 group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java delete mode 100644 group23/563253496/week9_datastructure/src/QuickMinStack.java delete mode 100644 group23/563253496/week9_datastructure/src/StackWithTwoQueues.java delete mode 100644 group23/563253496/week9_datastructure/src/TwoStackInOneArray.java delete mode 100644 group23/565832157/src/com/coderising/array/ArrayUtil.java delete mode 100644 group23/565832157/src/com/coderising/download/DownloadThread.java delete mode 100644 group23/565832157/src/com/coderising/download/FileDownloader.java delete mode 100644 group23/565832157/src/com/coderising/download/FileDownloaderTest.java delete mode 100644 group23/565832157/src/com/coderising/download/api/Connection.java delete mode 100644 group23/565832157/src/com/coderising/download/api/ConnectionException.java delete mode 100644 group23/565832157/src/com/coderising/download/api/ConnectionManager.java delete mode 100644 group23/565832157/src/com/coderising/download/api/DownloadListener.java delete mode 100644 group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java delete mode 100644 group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/LoginAction.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/Struts.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/StrutsTest.java delete mode 100644 group23/565832157/src/com/coderising/litestruts/View.java delete mode 100644 group23/565832157/src/com/coding/basic/ArrayList.java delete mode 100644 group23/565832157/src/com/coding/basic/BinaryTreeNode.java delete mode 100644 group23/565832157/src/com/coding/basic/Iterator.java delete mode 100644 group23/565832157/src/com/coding/basic/LinkedList.java delete mode 100644 group23/565832157/src/com/coding/basic/List.java delete mode 100644 group23/565832157/src/com/coding/basic/Queue.java delete mode 100644 group23/565832157/src/com/coding/basic/Stack.java delete mode 100644 group23/601689050/.gitattributes delete mode 100644 group23/601689050/1List&BinaryTreeNode/ArrayList.java delete mode 100644 group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java delete mode 100644 group23/601689050/1List&BinaryTreeNode/Iterator.java delete mode 100644 group23/601689050/1List&BinaryTreeNode/LinkedList.java delete mode 100644 group23/601689050/1List&BinaryTreeNode/List.java delete mode 100644 group23/601689050/1List&BinaryTreeNode/Queue.java delete mode 100644 group23/601689050/1List&BinaryTreeNode/Stack.java delete mode 100644 group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java delete mode 100644 group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java delete mode 100644 group23/601689050/4weekLRU&JVM/JVM/test/loader/EmployeeV1.java delete mode 100644 group23/601689050/4weekLRU&JVM/LRU/Iterator.java delete mode 100644 group23/601689050/4weekLRU&JVM/LRU/LRUPageFrame.java delete mode 100644 group23/601689050/4weekLRU&JVM/LRU/LRUPageFrameTest.java delete mode 100644 group23/601689050/4weekLRU&JVM/LRU/LinkedList.java delete mode 100644 group23/601689050/4weekLRU&JVM/LRU/List.java delete mode 100644 group23/601689050/5weekStack/stack/Stack.java delete mode 100644 group23/601689050/5weekStack/stack/StackUtil.java delete mode 100644 group23/601689050/5weekStack/test/StackUtilTest.java delete mode 100644 group23/601689050/6weekInfixExpr/InfixExpr.java delete mode 100644 group23/601689050/6weekInfixExpr/InfixExprTest.java delete mode 100644 group23/601689050/6weekInfixExpr/Stack.java delete mode 100644 group23/601689050/6weekInfixExpr/Token.java delete mode 100644 group23/601689050/6weekInfixExpr/TokenParser.java delete mode 100644 group23/601689050/7weekExpr2/InfixExpr.java delete mode 100644 group23/601689050/7weekExpr2/InfixToPostfix.java delete mode 100644 group23/601689050/7weekExpr2/PostfixExpr.java delete mode 100644 group23/601689050/7weekExpr2/PostfixExprTest.java delete mode 100644 group23/601689050/7weekExpr2/PrefixExpr.java delete mode 100644 group23/601689050/7weekExpr2/PrefixExprTest.java delete mode 100644 group23/601689050/7weekExpr2/Stack.java delete mode 100644 group23/601689050/7weekExpr2/Token.java delete mode 100644 group23/601689050/7weekExpr2/TokenParser.java delete mode 100644 group23/601689050/8weekQueue/CircleQueue.java delete mode 100644 group23/601689050/8weekQueue/Josephus.java delete mode 100644 group23/601689050/8weekQueue/Queue.java delete mode 100644 group23/601689050/8weekQueue/QueueWithTwoStacks.java delete mode 100644 group23/601689050/9weekStack/QuickMinStack.java delete mode 100644 group23/601689050/9weekStack/StackWithTwoQueues.java delete mode 100644 group23/601689050/9weekStack/TwoStackInOneArray.java delete mode 100644 group23/609041842/src/code/ArrayList.java delete mode 100644 group23/609041842/src/code/LinkedList.java delete mode 100644 group23/609041842/src/code/Queue.java delete mode 100644 group23/609041842/src/code/Stack.java delete mode 100644 group23/609041842/src/com/homework01/ArrayList.java delete mode 100644 group23/609041842/src/com/homework01/LinkedList.java delete mode 100644 group23/609041842/src/com/homework01/Queue.java delete mode 100644 group23/609041842/src/com/homework01/Stack.java delete mode 100644 group23/609041842/src/test.java delete mode 100644 group23/632678665/com/basic/datastructure/ArrayList.java delete mode 100644 group23/632678665/com/basic/datastructure/LinkedList.java delete mode 100644 group23/632678665/com/basic/datastructure/List.java delete mode 100644 group23/632678665/com/basic/datastructure/Queue.java delete mode 100644 group23/632678665/com/basic/datastructure/Stack.java delete mode 100644 group23/632678665/com/basic/datastructure/TestDataStructure.java delete mode 100644 group23/632678665/com/basic/week2/datastructure/ArrayTest.java delete mode 100644 group23/632678665/com/basic/week2/datastructure/ArrayUtil.java delete mode 100644 group23/632678665/com/basic/week2/litestruts/LoginAction.java delete mode 100644 group23/632678665/com/basic/week2/litestruts/Struts.java delete mode 100644 group23/632678665/com/basic/week2/litestruts/StrutsTest.java delete mode 100644 group23/632678665/com/basic/week2/litestruts/View.java delete mode 100644 group23/632678665/com/basic/week3/datastructure/LinkedList.java delete mode 100644 group23/632678665/com/basic/week3/download/Demo.java delete mode 100644 group23/632678665/com/basic/week3/download/DownloadThread.java delete mode 100644 group23/632678665/com/basic/week3/download/FileDownloader.java delete mode 100644 group23/632678665/com/basic/week3/download/FileDownloaderTest.java delete mode 100644 group23/632678665/com/basic/week3/download/api/Connection.java delete mode 100644 group23/632678665/com/basic/week3/download/api/ConnectionException.java delete mode 100644 group23/632678665/com/basic/week3/download/api/ConnectionManager.java delete mode 100644 group23/632678665/com/basic/week3/download/api/DownloadListener.java delete mode 100644 group23/632678665/com/basic/week3/download/impl/ConnectionImpl.java delete mode 100644 group23/632678665/com/basic/week3/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/632678665/com/basic/week4/jvm/loader/ClassFileLoader.java delete mode 100644 group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java delete mode 100644 group23/632678665/com/basic/week4/lru/LRUPageFrame.java delete mode 100644 group23/632678665/com/basic/week5/stack/StackUtil.java delete mode 100644 group23/632678665/com/basic/week6/expr/InfixExpr.java delete mode 100644 group23/632678665/com/basic/week6/expr/Token.java delete mode 100644 group23/632678665/com/basic/week6/exprNew/InfixExpr.java delete mode 100644 group23/632678665/com/basic/week6/exprNew/Operator.java delete mode 100644 group23/632678665/com/basic/week6/exprNew/Token.java delete mode 100644 group23/632678665/com/basic/week6/exprNew/TokenParser.java delete mode 100644 group23/632678665/com/basic/week7/stack/MyStack.java delete mode 100644 group23/632678665/com/basic/week7/stack/StackUtil.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/ExprIterator.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixExpr.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/Token.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/TokenParser.java delete mode 100644 group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java delete mode 100644 group23/632678665/com/basic/week8/CircleQueue.java delete mode 100644 group23/632678665/com/basic/week8/Josephus.java delete mode 100644 group23/632678665/com/basic/week8/Queue.java delete mode 100644 group23/632678665/com/basic/week8/QueueWithTwoStacks.java delete mode 100644 group23/632678665/com/basic/week9/QuickMinStack.java delete mode 100644 group23/632678665/com/basic/week9/StackWithTwoQueues.java delete mode 100644 group23/632678665/com/basic/week9/TwoStackInOneArray.java delete mode 100644 group23/729693763/First_Homework1/readme.md delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/List.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java delete mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/View.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java delete mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java delete mode 100644 group23/729693763/Third_Homework3/DataStruct/Iterator.java delete mode 100644 group23/729693763/Third_Homework3/DataStruct/LinkedList.java delete mode 100644 group23/729693763/Third_Homework3/DataStruct/List.java delete mode 100644 group23/729693763/Third_Homework3/download/DownloadThread.java delete mode 100644 group23/729693763/Third_Homework3/download/FileDownloader.java delete mode 100644 group23/729693763/Third_Homework3/download/FileDownloaderTest.java delete mode 100644 group23/729693763/Third_Homework3/download/api/Connection.java delete mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionException.java delete mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionManager.java delete mode 100644 group23/729693763/Third_Homework3/download/api/DownloadListener.java delete mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java delete mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java delete mode 100644 group23/729693763/homework1_demo/ArrayList.java delete mode 100644 group23/729693763/homework1_demo/BinaryTreeNode.java delete mode 100644 group23/729693763/homework1_demo/Iterator.java delete mode 100644 group23/729693763/homework1_demo/LinkedList.java delete mode 100644 group23/729693763/homework1_demo/List.java delete mode 100644 group23/729693763/homework1_demo/Queue.java delete mode 100644 group23/729693763/homework1_demo/Stack.java delete mode 100644 group23/729693763/readme.md delete mode 100644 group23/769232552/coding/src/main/java/code01/ArrayList.java delete mode 100644 group23/769232552/coding/src/main/java/code01/BinaryTree.java delete mode 100644 group23/769232552/coding/src/main/java/code01/Iterator.java delete mode 100644 group23/769232552/coding/src/main/java/code01/LinkedList.java delete mode 100644 group23/769232552/coding/src/main/java/code01/List.java delete mode 100644 group23/769232552/coding/src/main/java/code01/Queue.java delete mode 100644 group23/769232552/coding/src/main/java/code01/Stack.java delete mode 100644 group23/769232552/coding/src/main/java/code02/ArrayUtil.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/Struts.java delete mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/View.java delete mode 100644 group23/769232552/coding/src/main/java/code03/DownloadThread.java delete mode 100644 group23/769232552/coding/src/main/java/code03/FileDownloader.java delete mode 100644 group23/769232552/coding/src/main/java/code03/api/Connection.java delete mode 100644 group23/769232552/coding/src/main/java/code03/api/ConnectionException.java delete mode 100644 group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java delete mode 100644 group23/769232552/coding/src/main/java/code03/api/DownloadListener.java delete mode 100644 group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java delete mode 100644 group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java delete mode 100644 group23/769232552/coding/src/main/java/code04/LRUPageFrame.java delete mode 100644 group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java delete mode 100644 group23/769232552/coding/src/test/java/code01/ArrayListTest.java delete mode 100644 group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java delete mode 100644 group23/769232552/coding/src/test/java/code01/LinkedListTest.java delete mode 100644 group23/769232552/coding/src/test/java/code01/QueueTest.java delete mode 100644 group23/769232552/coding/src/test/java/code01/StackTest.java delete mode 100644 group23/769232552/coding/src/test/java/code02/ArrayUtilTest.java delete mode 100644 group23/769232552/coding/src/test/java/code02/litestruts/StrutsTest.java delete mode 100644 group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java delete mode 100644 group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java delete mode 100644 group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java delete mode 100644 group23/769232552/coding/src/test/java/mini_jvm/EmployeeV1.java delete mode 100644 group23/810181789/src/firstday/ArrayListt.java delete mode 100644 group23/810181789/src/firstday/LinkListt.java delete mode 100644 group23/810181789/src/firstday/Queue.java delete mode 100644 group23/810181789/src/firstday/Stack.java delete mode 100644 group23/group23.md diff --git a/group23/1028361767/1028361767.md b/group23/1028361767/1028361767.md deleted file mode 100644 index 741976ad6e..0000000000 --- a/group23/1028361767/1028361767.md +++ /dev/null @@ -1 +0,0 @@ -This is 1028361767's project. \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java b/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java deleted file mode 100644 index 8cf0ae1e42..0000000000 --- a/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.download; - -import java.io.IOException; -import java.io.RandomAccessFile; - -import com.coderising.download.api.Connection; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - - public DownloadThread( Connection conn, int startPos, int endPos){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - public void run(){ - try { - byte[] bytes = conn.read(startPos, endPos); - RandomAccessFile file = new RandomAccessFile("/Users/jie/Desktop/test.png", "rw"); - file.seek(startPos); - file.write(bytes); - file.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java b/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java deleted file mode 100644 index 1fe4ebb159..0000000000 --- a/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; - - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - Thread[] threads = new Thread[3]; - - - public FileDownloader(String _url) { - this.url = _url; - - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - try { - - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - int size = length / 3; - int remain = length - size; - - for(int i=0;i<3;i++){ - conn = cm.open(this.url); - int startPos = i*size; - int endPos = (i+1) * size - 1; - if(i == 2){ - endPos = (i+1) * size - 1 + remain; - } - threads[i] = new DownloadThread(conn,startPos,endPos); - threads[i].start(); - } - - new Thread(new Runnable(){ - public void run(){ - boolean finish; - do{ - finish = true; - for(int i=0;i actions = new HashMap(); - - @SuppressWarnings("rawtypes") - public static View runAction(String actionName, Map parameters) throws Exception { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - //读取xml,把xml信息放到actions - readStrutsXML(); - - Action action = actions.get(actionName); - View view = new View(); - if(action != null){ - Class clazz = Class.forName(action.getClassName()); - Object obj = clazz.newInstance(); - - //根据parameters调用set方法 - initClass(clazz, obj, action, parameters); - - //调用execute方法 - String result = execute(clazz, obj); - //调用所有get方法 - Map resultParameters = getResultParameters(clazz, obj); - - view.setJsp(action.getResults().get(result)); - view.setParameters(resultParameters); - } - - return view; - } - - @SuppressWarnings("rawtypes") - private static Map getResultParameters(Class clazz, Object obj) throws Exception { - Map resultParameters = new HashMap(); - Method[] methods = clazz.getMethods(); - String methodName; - String propName; - String propValue; - for(Method method : methods){ - methodName = method.getName(); - if(methodName.startsWith("get") && !"getClass".equals(methodName)){ - propName = firstLetterLowerCase(methodName.substring(3, methodName.length())); - propValue = (String) method.invoke(obj); - resultParameters.put(propName, propValue); - } - } - return resultParameters; - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static String execute(Class clazz, Object obj) throws Exception{ - Method method = clazz.getMethod("execute"); - return (String)method.invoke(obj); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static void initClass(Class clazz, Object obj, Action action, Map parameters) throws Exception { - String setMethodName; - Method method = null; - for (String parameter : parameters.keySet()) { - setMethodName = "set" + firstLetterUpperCase(parameter); - method = clazz.getMethod(setMethodName, String.class); - method.invoke(obj, parameters.get(parameter)); - } - } - - private static String firstLetterLowerCase(String string){ - char[] cs = string.toCharArray(); - cs[0] += 32; - return String.valueOf(cs); - } - - private static String firstLetterUpperCase(String string){ - char[] cs = string.toCharArray(); - cs[0] -= 32; - return String.valueOf(cs); - } - - @SuppressWarnings("unchecked") - private static void readStrutsXML() { - SAXReader saxReader = new SAXReader(); - Document document; - try { - document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml")); - } catch (DocumentException e) { - System.out.println("error:file not found"); - return ; - } - Element root = document.getRootElement(); - Iterator actionItr = root.elementIterator(); - Element action; - Action act; - Iterator resultItr; - Element result; - Map results; - while(actionItr.hasNext()){ - action = actionItr.next(); - - resultItr = action.elementIterator(); - results = new HashMap(); - while(resultItr.hasNext()){ - result = resultItr.next(); - results.put(result.attributeValue("name"), result.getStringValue()); - } - - act = new Action(); - act.setName(action.attributeValue("name")); - act.setClassName(action.attributeValue("class")); - act.setResults(results); - - actions.put(act.getName(), act); - } - } - - static class Action { - - private String name; - - private String className; - - private Map results = new HashMap<>(); - - public Map getResults() { - return results; - } - - public void setResults(Map results) { - this.results = results; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - } - -} diff --git a/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index 92a6758a69..0000000000 --- a/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() throws Exception { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() throws Exception { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java b/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index dced34e873..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode parent; - - public BinaryTreeNode(Object data) { - this.data = data; - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public void setParent(BinaryTreeNode parent) { - this.parent = parent; - } - - public BinaryTreeNode getParent() { - return parent; - } - - public BinaryTreeNode insert(Object o) { - BinaryTreeNode newNode = new BinaryTreeNode(o); - BinaryTreeNode root = findRoot(this); - if (root.data == null) { - root.data = newNode; - } else { - int newVal = getNodeIntVal(newNode); - insert(root, newNode, newVal); - } - return newNode; - } - - private void insert(BinaryTreeNode node, BinaryTreeNode newNode, int newVal) { - int nodeVal = getNodeIntVal(node); - if (newVal < nodeVal) { - if (node.left == null) { - newNode.parent = node; - node.left = newNode; - } else { - insert(node.left, newNode, newVal); - } - } else { - if (node.right == null) { - newNode.parent = node; - node.right = newNode; - } else { - insert(node.right, newNode, newVal); - } - } - } - - private BinaryTreeNode findRoot(BinaryTreeNode binaryTreeNode) { - while (binaryTreeNode.parent != null) { - binaryTreeNode = binaryTreeNode.parent; - } - return binaryTreeNode; - } - - private int getNodeIntVal(BinaryTreeNode node) { - if (node.data instanceof Integer) { - return ((Integer) node.data).intValue(); - } - return 0; - } - - public int getDataIntVal() { - if (data instanceof Integer) { - return ((Integer) data).intValue(); - } - return 0; - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java b/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java deleted file mode 100644 index 96adcd6d3a..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - - public Object next(); - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/List.java b/group23/1028361767/data-structure/src/com/coding/basic/List.java deleted file mode 100644 index 01398944e6..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Queue.java b/group23/1028361767/data-structure/src/com/coding/basic/Queue.java deleted file mode 100644 index ddd1b74d90..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coding.basic; - -import com.coding.basic.linklist.LinkedList; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o) { - linkedList.add(o); - } - - public Object deQueue() { - return linkedList.removeFirst(); - } - - public boolean isEmpty() { - return linkedList.size() == 0; - } - - public int size() { - return linkedList.size(); - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java deleted file mode 100644 index 43bdae82fa..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.coding.basic.array; - -import java.util.Arrays; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class ArrayList implements List { - - private int size = 0; - - private int HALF_MAX_VALUE = Integer.MAX_VALUE; - - private Object[] elementData = new Object[100]; - - public void add(Object o) { - if (noSpace()) { - elementData = grow(); - } - elementData[size++] = o; - } - - public void add(int index, Object o) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > size) { - throw new IndexOutOfBoundsException("size is" + size); - } - if (noSpace()) { - elementData = grow(); - } - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[size++] = o; - } - - public Object get(int index) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > (size - 1)) { - throw new IndexOutOfBoundsException("size is" + size); - } - return elementData[index]; - } - - public Object remove(int index) { - if (index < 0) { - throw new IllegalArgumentException("index must be positive integer"); - } - if (index > (size - 1)) { - throw new IndexOutOfBoundsException("size is" + size); - } - Object obj = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index); - elementData[size-1] = null; - size--; - return obj; - } - - public int size() { - return size; - } - - public Iterator iterator() { - return null; - } - - private boolean noSpace() { - return size == elementData.length; - } - - private Object[] grow() { - int newSize; - if (size < HALF_MAX_VALUE) { - newSize = size * 2; - } else { - newSize = Integer.MAX_VALUE; - } - return Arrays.copyOf(elementData, newSize); - } - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java deleted file mode 100644 index 8e1b170dc0..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java +++ /dev/null @@ -1,210 +0,0 @@ -package com.coding.basic.array; - -import java.util.Arrays; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public int[] reverseArray(int[] origin){ - int len = origin.length; - int[] ret = new int[len]; - for(int i=0;i len1 && i2 > len2){ - break; - }else if(i1 > len1){ - ret[i++] = array2[i2++]; - }else{ - ret[i++] = array1[i1++]; - } - } - - } - if(sameNum > 0){ - ret = Arrays.copyOf(ret, ret.length - sameNum); - } - return ret; - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - return Arrays.copyOf(oldArray, oldArray.length + size); - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max){ - if(max == 1){ - return new int[0]; - }else{ - int[] tmp = new int[max + 1]; - int x1 = 1, x2 = 1; - int i = 1, j = 0; - tmp[j++] = x1; - tmp[j++] = x2; - while(true){ - i = x1 + x2; - if(i > max){ - break; - } - x1 = x2; - x2 = i; - tmp[j++] = i; - } - return Arrays.copyOf(tmp, j); - } - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - int[] tmp = new int[max/2 + 1]; - boolean isPrime; - int k = 0; - for(int i=2;i max) { - throw new IndexOutOfBoundsException(); - } - } - - - public Object get(int index) { - checkMinBound(index); - checkMaxBound(index, size - 1); - Node cur = head; - if (index != 0) { - int pos = 0; - do { - cur = cur.next; - pos++; - } while (pos != index); - } - return cur.data; - } - - public Object remove(int index) { - checkMinBound(index); - checkMaxBound(index, size - 1); - Node cur = head; - if (index == 0) { - head = cur.next; - } else { - int pos = 1; - Node prev = cur; - while (pos != index) { - prev = prev.next; - pos++; - } - cur = prev.next; - prev.next = cur.next; - } - size--; - return cur.data; - } - - public int size() { - return size; - } - - public void addFirst(Object o) { - Node newNode = new Node(o, null); - newNode.next = head; - head = newNode; - size++; - } - - public void addLast(Object o) { - Node newNode = new Node(o, null); - if (head == null) { - head = newNode; - } else { - Node tmp = head; - while (tmp.next != null) { - tmp = tmp.next; - } - tmp.next = newNode; - } - size++; - } - - public Object removeFirst() { - if (head == null) { - throw new NoSuchElementException(); - } - Node ret = head; - head = head.next; - size--; - return ret.data; - } - - public Object removeLast() { - if (head == null) { - throw new NoSuchElementException(); - } - Node ret; - if (head.next == null) { - ret = head; - head = null; - } else { - Node prev = head; - ret = head.next; - while (ret.next != null) { - prev = ret; - ret = ret.next; - } - prev.next = null; - } - size--; - return ret.data; - } - - public Iterator iterator() { - return null; - } - - - private static class Node { - Object data; - Node next; - - public Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse() { - if(size == 0 || size == 1){ - return ; - } - Node node = head; - Node nextNode = head.next; - Node tmp; - node.next = null; - do{ - tmp = nextNode.next; - nextNode.next = node; - node = nextNode; - nextNode = tmp; - }while(nextNode != null); - head = node; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - */ - public void removeFirstHalf() { - if(size == 0 || size == 1){ - return ; - } - int num = size / 2; - size -= num; - Node node = head; - while(num > 0){ - node = node.next; - num--; - } - head = node; - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * - * @param i - * @param length - */ - public void remove(int i, int length) { - checkMinBound(i); - checkMaxBound(i + length, size); - Node prev = null; - Node node = head; - int index = 0; - while(index < i){ - prev = node; - node = node.next; - index++; - } - Node nextNode = node.next; - while(index < (i + length - 1)){ - nextNode = nextNode.next; - index++; - } - size -= length; - if(i == 0){ - head = nextNode; - }else{ - prev.next = nextNode; - head = prev; - } - } - - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * - * @param list - */ - public int[] getElements(LinkedList list) { - int[] ret = new int[list.size()]; - if(ret.length == 0){ - return ret; - } - int index; - int j = 0; - Node node = head; - for(int i=0;i min){ - foundMin = true; - } - if(foundMin && (int)node.data > max){ - break; - } - if(foundMin == false){ - prev = node; - }else{ - size -= 1; - } - node = node.next; - }while(node != null); - if(prev == null){ - head = node; - }else{ - prev.next = node; - } - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * - * @param list - */ - public LinkedList intersection(LinkedList list) { - LinkedList ret = new LinkedList(); - Node node = head; - int nodeValue; - int elementValue; - for(int i=0;i elementValue){ - break; - } - node = node.next; - } - } - } - return ret; - } - - public String toString(){ - Node node = head; - StringBuilder sb = new StringBuilder(); - if(node == null){ - return ""; - }else{ - sb.append(head.data); - while((node = node.next) != null){ - sb.append(",").append(node.data); - } - return sb.toString(); - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java deleted file mode 100644 index eeed686419..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.queue; - -/** - * 用数组实现循环队列 - * @author liuxin - * - * @param - */ -public class CircleQueue { - - private final static int DEFAULT_SIZE = 10; - - //用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE] ; - - private int maxSize = DEFAULT_SIZE; - - //队头 - private int front = 0; - //队尾 - private int rear = 0; - - public CircleQueue(int maxSize){ - elementData = new Object[maxSize]; - this.maxSize = maxSize; - } - - public boolean isEmpty() { - return rear == front; - - } - - public int size() { - return rear - front; - } - - - - public void enQueue(E data) { - if((rear+1)%maxSize == front){ - throw new FullQueueException(); - } - elementData[rear] = data; - rear = (rear + 1) % maxSize; - } - - public E deQueue() { - if(rear == front){ - throw new EmptyQueueException(); - } - E data = (E)elementData[front]; - elementData[front] = null; - front = (front + 1) % maxSize; - return data; - } - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java deleted file mode 100644 index 925c9de7ec..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.coding.basic.queue; - -public class EmptyQueueException extends RuntimeException { - - private static final long serialVersionUID = 7013504079461713464L; - - public EmptyQueueException() { - super(); - } - - public EmptyQueueException(String message) { - super(message); - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java deleted file mode 100644 index 96cc1ab4fb..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.coding.basic.queue; - -public class FullQueueException extends RuntimeException { - - private static final long serialVersionUID = 5782713639805661798L; - - public FullQueueException() { - super(); - } - - public FullQueueException(String message) { - super(message); - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java deleted file mode 100644 index 8400d503b4..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic.queue; - -import java.util.ArrayList; -import java.util.List; - -/** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * 该方法返回一个List, 包含了被杀死人的次序 - * @author liuxin - * - */ -public class Josephus { - - public static List execute(int n, int m){ - List numbers = new ArrayList<>(); - CircleQueue queue = new CircleQueue<>(n+1); - for(int i=0;i { - private Node first; - private Node last; - private int size; - - - private static class Node { - private E item; - private Node next; - } - - - public Queue() { - first = null; - last = null; - size = 0; - } - - - public boolean isEmpty() { - return first == null; - } - - public int size() { - return size; - } - - - - public void enQueue(E data) { - Node oldlast = last; - last = new Node(); - last.item = data; - last.next = null; - if (isEmpty()) { - first = last; - } - else{ - oldlast.next = last; - } - size++; - } - - public E deQueue() { - if (isEmpty()) { - throw new NoSuchElementException("Queue underflow"); - } - E item = first.item; - first = first.next; - size--; - if (isEmpty()) { - last = null; - } - return item; - } - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java deleted file mode 100644 index d56e7b97ff..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.coding.basic.queue; - -import java.util.Stack; - -/** - * 用两个栈来实现一个队列 - * @author liuxin - * - * @param - */ -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - - - - public boolean isEmpty() { - return stack1.size() == 0; - } - - - - public int size() { - return stack1.size(); - } - - - - public void enQueue(E item) { - stack1.push(item); - } - - public E deQueue() { - while(!stack1.isEmpty()){ - stack2.push(stack1.pop()); - } - E data = stack2.pop(); - while(!stack2.isEmpty()){ - stack1.push(stack2.pop()); - } - return data; - } - - - - } - diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java deleted file mode 100644 index a04191da19..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.basic.stack; - -import java.util.Arrays; - -/** - * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 - * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 - * @author liuxin - * - */ -public class QuickMinStack { - - int[] datas = new int[10]; - int size; - int minIndex; - - public void push(int data){ - checkAndresize(); - datas[size] = data; - if(datas[minIndex] > data){ - minIndex = size; - } - size++; - } - - public int pop(){ - checkOutBound(); - return datas[size-1]; - } - public int findMin(){ - checkOutBound(); - return datas[minIndex]; - } - - private void checkAndresize() { - if(size == datas.length){ - datas = Arrays.copyOf(datas, datas.length*2); - } - } - private void checkOutBound(){ - if(size <= 0){ - throw new IndexOutOfBoundsException(); - } - } -} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java deleted file mode 100644 index 58a4846f2b..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.coding.basic.stack; - -import java.util.EmptyStackException; - -import com.coding.basic.array.ArrayList; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o) { - elementData.add(o); - } - - public Object pop() { - checkBound(); - return elementData.remove(size() - 1); - } - - public Object peek() { - checkBound(); - return elementData.get(size() - 1); - } - - public boolean isEmpty() { - return size() == 0; - } - - public int size() { - return elementData.size(); - } - - private void checkBound() { - if (isEmpty()) { - throw new EmptyStackException(); - } - } - - public String toString(){ - StringBuilder sb = new StringBuilder(); - for(int i=0;i i) { - tmp.push(s.pop()); - } - s.push(top); - while(tmp.size() > 0){ - s.push(tmp.pop()); - } - } - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s,Object o) { - Stack tmp = new Stack(); - boolean found = false; - while(!s.isEmpty() && !found){ - Object obj = s.pop(); - if(obj == o){ - found = true; - }else{ - tmp.push(obj); - } - } - while(!tmp.isEmpty()) - s.push(tmp.pop()); - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param len - * @return - */ - public static Object[] getTop(Stack s,int len) { - Object[] objs = new Object[len]; - if(s.isEmpty() || len == 0) - return objs; - int i = 0; - while(i < len && !s.isEmpty()){ - objs[i++] = s.pop(); - } - for(i=objs.length-1;i>=0;i--) - s.push(objs[i]); - return objs; - } - /** - * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz - * 使用堆栈检查字符串s中的括号是不是成对出现的。 - * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true - * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; - * - * ( 40 ) 41 [ 91 ] 93 {123 }125 - * @param s - * @return - */ - public static boolean isValidPairs(String s){ - if(s == null || s.length() == 0) - return true; - Stack stack = new Stack(); - char[] chars = s.toCharArray(); - for(int i=0;i queue1 = new LinkedList(); - Queue queue2 = new LinkedList(); - - public void push(int data) { - queue1.add(data); - } - - public int pop() { - while(queue1.size() > 1){ - queue2.add(queue1.poll()); - } - queue1.addAll(queue2); - return queue1.poll(); - } - - public static void main(String[] args) { - StackWithTwoQueues s = new StackWithTwoQueues(); - for (int i = 0; i < 5; i++) { - s.push(i); - } - System.out.println(s.pop()); - System.out.println(s.pop()); - System.out.println(s.pop()); - System.out.println(s.pop()); - } - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java deleted file mode 100644 index 2173d65b5a..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.coding.basic.stack; - -/** - * 用一个数组实现两个栈 - * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 - * @author liuxin - * - */ -public class TwoStackInOneArray { - Object[] data = new Object[10]; - int front; - int rear; - - /** - * 向第一个栈中压入元素 - * @param o - */ - public void push1(Object o){ - checkInBound(); - data[front++] = o; - } - - /** - * 从第一个栈中弹出元素 - * @return - */ - public Object pop1(){ - checkOutBound(front); - Object o = data[--front]; - data[front] = null; - return o; - } - - /** - * 获取第一个栈的栈顶元素 - * @return - */ - - public Object peek1(){ - checkOutBound(front); - return data[front-1]; - } - /* - * 向第二个栈压入元素 - */ - public void push2(Object o){ - checkInBound(); - data[data.length-rear-1] = o; - rear++; - } - /** - * 从第二个栈弹出元素 - * @return - */ - public Object pop2(){ - checkOutBound(rear); - int index = data.length-rear; - Object o = data[index]; - data[index] = null; - rear--; - return o; - } - /** - * 获取第二个栈的栈顶元素 - * @return - */ - - public Object peek2(){ - checkOutBound(rear); - return data[data.length-rear]; - } - - private Object[] resize(int len) { - int newLen = len * 2; - Object[] newData = new Object[newLen]; - if(front > 0){ - System.arraycopy(data, 0, newData, 0, front); - } - if(rear > 0){ - System.arraycopy(data, len-rear, newData, newLen-rear, rear); - } - return newData; - } - - private void checkOutBound(int index){ - if(index <= 0){ - throw new IndexOutOfBoundsException(); - } - } - - private void checkInBound() { - if((front+rear) >= data.length){ - data = resize(data.length); - } - } - - public static void main(String[] args) { - TwoStackInOneArray t = new TwoStackInOneArray(); - for(int i=0;i<25;i++){ - t.push1(i); - t.push2(i); - } - System.out.println(t.front+t.rear); - for(int i=0;i 1){ -// doAddOrSubOps(numStack, opStack); -// } -// return new Float((String)numStack.pop()); - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - - - Stack opStack = new Stack<>(); - Stack numStack = new Stack<>(); - - for(Token token : tokens){ - - if (token.isOperator()){ - - if(opStack.isEmpty()){ - - opStack.push(token); - } else{ - - while(!opStack.isEmpty() - && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(), f1,f2); - numStack.push(result); - - } - opStack.push(token); - } - } - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - - while(!opStack.isEmpty()){ - Token token = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(), f1,f2)); - } - - - return numStack.pop().floatValue(); - } - - /** - * 多个加减 - * @param numStack - * @param opStack - */ - private void doAddOrSubOps(Stack numStack, Stack opStack) { - Stack calStack = new Stack(); - while(numStack.size() > 1){ - calStack.push(numStack.pop()); - calStack.push(opStack.pop()); - } - float num1 = new Float((String)numStack.pop()); - float num2; - while(calStack.size() > 0){ - String op = (String)calStack.pop(); - num2 = new Float((String)calStack.pop()); - if("+".equals(op)){ - num1 += num2; - }else{ - num1 -= num2; - } - } - numStack.push(num1 + ""); - } - - /** - * 单个乘除 - * @param numStack - * @param op - */ - private void doMulOrDivOp(Stack numStack, String op){ - float num2 = new Float((String)numStack.pop()); - float num1 = new Float((String)numStack.pop()); - String result = null; - if("*".equals(op)){ - result = (num1 * num2) + ""; - }else{ - result = (num1 / num2) + ""; - } - numStack.push(result); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } -} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index 1d679bdb32..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - -} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java deleted file mode 100644 index a518e43c13..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -public class InfixToPostfix { - - public static List convert(String expr) { - // 3*20+12*5-40/2 --> 3 20 * 12 5 * + 40 2 / - - // 10-30+50 --> 10 30 - 50 + - List ret = new ArrayList<>(); - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - Stack opStack = new Stack<>(); - for(Token token : tokens){ - if(token.isNumber()){ - ret.add(token); - }else{ - while(!opStack.isEmpty() && opStack.peek().hasHigherPriority(token)){ - ret.add(opStack.pop()); - } - opStack.push(token); - } - } - while(!opStack.isEmpty()){ - ret.add(opStack.pop()); - } - return ret; - } - - public static String toString(List tokens){ - StringBuilder sb = new StringBuilder(); - for(Token token : tokens){ - sb.append(token.value); - } - return sb.toString(); - } - - public static void main(String[] args) { - System.out.println(toString(convert("10-30+50"))); - System.out.println(toString(convert("3*20+12*5-40/2"))); - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index d4af19f583..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.List; -import java.util.Stack; - -public class PostfixExpr { -String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - Stack numStack = new Stack<>(); - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(expr); - for(Token token : tokens) { - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - }else{ - String op = token.value; - float num2 = numStack.pop(); - float num1 = numStack.pop(); - float result = calculate(op, num1, num2); - numStack.push(result); - } - } - return numStack.pop(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - - private void reverse(Stack s){ - Stack tmp = new Stack(); - int len = s.size(); - for(int i=0;i i) { - tmp.push(s.pop()); - } - s.push(top); - while(tmp.size() > 0){ - s.push(tmp.pop()); - } - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java deleted file mode 100644 index ad2b6dfd69..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coding.basic.stack.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 6*(3+5+(2+3)*8) - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java deleted file mode 100644 index b5264d1362..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.List; -import java.util.Stack; - -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - Stack opStack = new Stack<>(); - Stack numStack = new Stack<>(); - int preContinueOp = 0; - int preContinueNum = 0; - for(Token token : tokens){ - if(token.isOperator()) { - opStack.push(token); - if(preContinueNum > 0){ - preContinueNum = 0; - preContinueOp = 1; - }else{ - preContinueOp++; - } - }else{ - numStack.push(new Float(token.getIntValue())); - preContinueNum++; - } - if(preContinueNum >= 2 && preContinueOp > 0){ - float num2 = numStack.pop(); - float num1 = numStack.pop(); - float result = calculate(opStack.pop().value, num1, num2); - numStack.push(result); - preContinueNum--; - preContinueOp--; - } - } - if(!opStack.isEmpty()){ - reverse(numStack); - } - while(!opStack.isEmpty()) { - String op = opStack.pop().value; - float num1 = numStack.pop(); - float num2 = numStack.pop(); - float result = calculate(op, num1, num2); - numStack.push(result); - } - return numStack.pop(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - - private void reverse(Stack s){ - Stack tmp = new Stack(); - int len = s.size(); - for(int i=0;i i) { - tmp.push(s.pop()); - } - s.push(top); - while(tmp.size() > 0){ - s.push(tmp.pop()); - } - } - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java deleted file mode 100644 index 5cec210e75..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java deleted file mode 100644 index 8579743fe9..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - - -} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java deleted file mode 100644 index bf62a9df26..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - if(isBlank(c)){ - i++; - continue; - } - else if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } - - private boolean isBlank(char c){ - return c == 32; - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java deleted file mode 100644 index 399d3e857e..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic.stack.expr; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} diff --git a/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java b/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java deleted file mode 100644 index 2de0c4370d..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.coding.me; - -/** - * 回文 - * - */ -public class Palindrome { - - private static String oddCase(char[] chars, int index) { - int maxLength = 1; - int i = 1; - while((index - i) >= 0 && (index + i) < chars.length - 1){ - if(chars[index - i] != chars[index + i]){ - break; - } - maxLength += 2; - i++; - } - return String.valueOf(chars, index + 1 - i, maxLength); - } - - private static String evenCase(char[] chars, int index) { - int maxLength = 0; - int i = 0; - while((index - i) >= 0 && (index + 1 + i) <= chars.length - 1){ - if(chars[index - i] != chars[index + 1 + i]){ - break; - } - i++; - maxLength += 2; - } - return String.valueOf(chars, index + 1 - i, maxLength); - } - - public static String findLongestPalindrome(String s){ - char[] chars = s.toCharArray(); - String longestPalindrome = ""; - String tmp = ""; - for(int i=0;i= 10){ - carry = 1; - sum -= 10; - }else{ - carry = 0; - } - if(ret == null){ - ret = new ListNode(sum); - first = ret; - }else{ - ret.next = new ListNode(sum); - ret = ret.next; - } - if(l1 != null){ - l1 = l1.next; - } - if(l2 != null){ - l2 = l2.next; - } - } - if(carry > 0){ - ret.next = new ListNode(carry); - } - return first; - } - - public ListNode leetcodeSolution(ListNode l1, ListNode l2) { - ListNode dummyHead = new ListNode(0); - ListNode p = l1, q = l2, curr = dummyHead; - int carry = 0; - while (p != null || q != null) { - int x = (p != null) ? p.val : 0; - int y = (q != null) ? q.val : 0; - int sum = carry + x + y; - carry = sum / 10; - curr.next = new ListNode(sum % 10); - curr = curr.next; - if (p != null) p = p.next; - if (q != null) q = q.next; - } - if (carry > 0) { - curr.next = new ListNode(carry); - } - return dummyHead.next; - } - - public static void main(String[] args) { - ListNode l11 = new ListNode(2); - ListNode l12 = new ListNode(4); - ListNode l13 = new ListNode(3); - l11.next = l12; - l12.next = l13; - - ListNode l21 = new ListNode(5); - ListNode l22 = new ListNode(6); - ListNode l23 = new ListNode(4); - l21.next = l22; - l22.next = l23; - - ListNode ret = new AddTwoNums().mySolution(l11, l21); - while(ret != null){ - System.out.println(ret.val); - ret = ret.next; - } - } -} - -class ListNode { - int val; - ListNode next; - ListNode(int x) { val = x; } -} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java deleted file mode 100644 index 910241063f..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java +++ /dev/null @@ -1,223 +0,0 @@ -package com.coding.me.leetcode.algorithms; - -/** - * Write a function to find the longest common prefix string amongst an array of strings. - * ["a", "b"] return "" - * ["a", "a"] return "a" - * ["ac", "ac", "a", "a"] return "a" - * - */ -public class LongestCommonPrefix { - - public static String mySolution(String[] strs){ - if(strs.length == 0) return ""; - char[] chars = strs[0].toCharArray(); - int count = chars.length; - if(count == 0) return ""; - char[] tmp; - for(int i = 1;i set = new HashSet<>(); - for (int i = start; i < end; i++) { - Character ch = s.charAt(i); - if (set.contains(ch)) return false; - set.add(ch); - } - return true; - } - - /** - * Sliding Window - * The naive approach is very straightforward. But it is too slow. So how - * can we optimize it? - * - * In the naive approaches, we repeatedly check a substring to see if it has - * duplicate character. But it is unnecessary. If a substring S​ij ​​ from - * index i i to j 1 j−1 is already checked to have no duplicate characters. - * We only need to check if s[j] is already in the substring S​ij ​​ . - * - * To check if a character is already in the substring, we can scan the - * substring, which leads to an O(n^2) algorithm. But we can do better. - * - * By using HashSet as a sliding window, checking if a character in the - * current can be done in O 1 O(1). - * - * A sliding window is an abstract concept commonly used in array/string - * problems. A window is a range of elements in the array/string which - * usually defined by the start and end indices, i.e. i j [i,j) - * (left-closed, right-open). A sliding window is a window "slides" its two - * boundaries to the certain direction. For example, if we slide i j [i,j) - * to the right by 1 1 element, then it becomes i 1 j 1 [i+1,j+1) - * (left-closed, right-open). - * - * Back to our problem. We use HashSet to store the characters in current - * window i j [i,j) ( j i j=i initially). Then we slide the index j j to the - * right. If it is not in the HashSet, we slide j j further. Doing so until - * s[j] is already in the HashSet. At this point, we found the maximum size - * of substrings without duplicate characters start with index i i. If we do - * this for all i i, we get our answer. - * - * Time complexity : O(2n)=O(n). In the worst case each character will be - * visited twice by i and j. - * - * Space complexity : O(min(m,n)). Same as the previous approach. We need - * O(k) space for the sliding window, where k is the size of the Set. The - * size of the Set is upper bounded by the size of the string n n and the - * size of the charset/alphabet m m. - * - * @param s - * @return - */ - public int leetcodeSolution2(String s) { - int n = s.length(); - Set set = new HashSet<>(); - int ans = 0, i = 0, j = 0; - while (i < n && j < n) { - // try to extend the range [i, j] - if (!set.contains(s.charAt(j))){ - set.add(s.charAt(j++)); - ans = Math.max(ans, j - i); - } - else { - set.remove(s.charAt(i++)); - } - } - return ans; - } - - /** - * Sliding Window Optimized - * - * The above solution requires at most 2n steps. In fact, it could be - * optimized to require only n steps. Instead of using a set to tell if a - * character exists or not, we could define a mapping of the characters to - * its index. Then we can skip the characters immediately when we found a - * repeated character. - * - * The reason is that if s[j] have a duplicate in the range [i,j) - * with index j ​′ ​​ , we don't need to increase i little by little. - * We can skip all the elements in the range [i,j ​′ ​​ ] and let i i - * to be j ​′+1 directly. - * - * @param s - * @return - */ - public int leetCodeSolution3(String s){ - int n = s.length(), ans = 0; - Map map = new HashMap<>(); // current index of character - // try to extend the range [i, j] - for (int j = 0, i = 0; j < n; j++) { - if (map.containsKey(s.charAt(j))) { - i = Math.max(map.get(s.charAt(j)), i); - } - ans = Math.max(ans, j - i + 1); - map.put(s.charAt(j), j + 1); - } - return ans; - } - - /** - * Java (Assuming ASCII 128) - * - * The previous implements all have no assumption on the charset of the - * string s. - * - * If we know that the charset is rather small, we can replace the Map with - * an integer array as direct access table. - * - * Commonly used tables are: - * - * int[26] for Letters 'a' - 'z' or 'A' - 'Z' - * int[128] for ASCII - * int[256] for Extended ASCII - * - * @param s - * @return - */ - public int leetCodeSolution4(String s) { - int n = s.length(), ans = 0; - int[] index = new int[128]; // current index of character - // try to extend the range [i, j] - for (int j = 0, i = 0; j < n; j++) { - i = Math.max(index[s.charAt(j)], i); - ans = Math.max(ans, j - i + 1); - index[s.charAt(j)] = j + 1; - } - return ans; - } - - - private LongestSubstringWithoutRepeatingCharacters lswrc; - @Before - public void setup(){ - lswrc = new LongestSubstringWithoutRepeatingCharacters(); - } - - @Test - public void testMySolution(){ - Assert.assertEquals(3, lswrc.mySolution("abcabcbb")); - Assert.assertEquals(4, lswrc.mySolution("abcdabcdbbd")); - } - - @Test - public void testLeetcodeSolution3(){ - Assert.assertEquals(3, lswrc.leetCodeSolution3("abcabcbb")); - Assert.assertEquals(4, lswrc.leetCodeSolution3("abcdabcdbbd")); - } - - @Test - public void testLeetcodeSolution4(){ - Assert.assertEquals(3, lswrc.leetCodeSolution4("abcabcbb")); -// Assert.assertEquals(4, lswrc.leetCodeSolution4("abcdabcdbbd")); - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java deleted file mode 100644 index b80850e24a..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.coding.me.leetcode.algorithms; - -import org.junit.Before; -import org.junit.Test; - -/** - * There are two sorted arrays nums1 and nums2 of size m and n respectively. - * - * Find the median of the two sorted arrays. The overall run time complexity - * should be O(log (m+n)). - * - * Example 1: nums1 = [1, 3] nums2 = [2] - * - * The median is 2.0 Example 2: nums1 = [1, 2] nums2 = [3, 4] - * - * The median is (2 + 3)/2 = 2.5 - * - * @author hewj - * - */ -public class MedianOfTwoSortedArrays { - - public double mySolution(int[] nums1, int[] nums2) { - int[] nums = new int[nums1.length + nums2.length]; - int mid = nums.length/2; - int remain = nums.length%2; - int i=0,j=0; - int a,b; - int k=0; - while(i n) - return findKthSmallest(b, n, begin2, a, m, begin1, k); - if (m == 0) - return b[begin2 + k - 1]; - if (k == 1) - return Integer.min(a[begin1], b[begin2]); - int partA = Integer.min(k / 2, m), partB = k - partA; - if (a[begin1 + partA - 1] == b[begin2 + partB - 1]) - return a[begin1 + partA - 1]; - else if (a[begin1 + partA - 1] > b[begin2 + partB - 1]) - return findKthSmallest(a, m, begin1, b, n - partB, begin2 + partB, k - partB); - else - return findKthSmallest(a, m - partA, begin1 + partA, b, n, begin2, k - partA); - - } - - private MedianOfTwoSortedArrays motsa; - - @Before - public void setup(){ - motsa = new MedianOfTwoSortedArrays(); - } - - @Test - public void testMySolution(){ - int[] nums1 = {2}; - int[] nums2 = {1,3}; - System.out.println(motsa.mySolution(nums1, nums2)); - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java deleted file mode 100644 index 8821941630..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.coding.me.leetcode.algorithms; - -/** - * Given a list of positive integers, the adjacent integers will perform the - * float division. For example, [2,3,4] -> 2 / 3 / 4. - * - * However, you can add any number of parenthesis at any position to change the - * priority of operations. You should find out how to add parenthesis to get the - * maximum result, and return the corresponding expression in string format. - * Your expression should NOT contain redundant parenthesis. - * - * Example: Input: [1000,100,10,2] Output: "1000/(100/10/2)" Explanation: - * 1000/(100/10/2) = 1000/((100/10)/2) = 200 However, the bold parenthesis in - * "1000/((100/10)/2)" are redundant, since they don't influence the operation - * priority. So you should return "1000/(100/10/2)". - * - * Other cases: 1000/(100/10)/2 = 50 1000/(100/(10/2)) = 50 1000/100/10/2 = 0.5 - * 1000/100/(10/2) = 2 Note: - * - * The length of the input array is [1, 10]. Elements in the given array will be - * in range [2, 1000]. There is only one optimal division for each test case. - * - * @author hewj - * - */ -public class OptimalDivision { - - public static String mySolution(int[] nums) { - if(nums.length == 0 || nums.length > 10) { - return ""; - } - if(nums.length == 1) { - return "" + nums[0]; - } - straightInsertionSort(nums); - StringBuilder sb = new StringBuilder(); - sb.append(nums[0]).append("/"); - if(nums.length == 2){ - sb.append(nums[1]); - }else{ - sb.append("("); - for(int k=1;k lList = new ArrayList<>(); - for(int i=0;i 1 || lList.size() > 2){ - return false; - } - } - return true; - } - - public static void main(String[] args) { - System.out.println(mySolution("LPLPLPLPLPL")); - } -} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java deleted file mode 100644 index d91eb869fb..0000000000 --- a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.coding.me.leetcode.algorithms; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Given an array of integers, return indices of the two numbers such that - * they add up to a specific target. - * - * You may assume that each input would have exactly one solution, and you - * may not use the same element twice. - * - * Example: Given nums = [2, 7, 11, 15], target = 9, - * - * Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. Subscribe to see - * which companies asked this question. - */ -public class TwoSum { - /** - * Time complexity : O(n^2) - * Space complexity : O(1) - * @param nums - * @param target - * @return - */ - public int[] mySolution(int[] nums, int target) { - int[] ret = new int[2]; - for(int i=0;i map = new HashMap<>(); - for (int i = 0; i < nums.length; i++) { - map.put(nums[i], i); - } - for (int i = 0; i < nums.length; i++) { - int complement = target - nums[i]; - if (map.containsKey(complement) && map.get(complement) != i) { - return new int[] { i, map.get(complement) }; - } - } - throw new IllegalArgumentException("No two sum solution"); - } - - /** - * one pass hash table - * Time complexity : O(n) - * Space complexity : O(n) - * @param nums - * @param target - * @return - */ - public int[] leetCodeSolution2(int[] nums, int target) { - Map map = new HashMap<>(); - for (int i = 0; i < nums.length; i++) { - int complement = target - nums[i]; - if (map.containsKey(complement)) { - return new int[] { map.get(complement), i }; - } - map.put(nums[i], i); - } - throw new IllegalArgumentException("No two sum solution"); - } - - - public static void main(String[] args) throws InterruptedException { -// String s = new String("字符串在内存中"); - List s = new ArrayList(); - s.add(new Object()); - WeakReference wr = new WeakReference(s.get(0)); - -// Thread.sleep(500); - System.out.println(wr.get()); - - s.remove(0); - System.gc(); - - System.out.println(wr.get()); -// Thread.sleep(500); -// System.out.println(wr.get()); - } -} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java deleted file mode 100644 index 791157d0d6..0000000000 --- a/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java +++ /dev/null @@ -1,61 +0,0 @@ -package test.com.coding.basic; - -import org.junit.Assert; -import org.junit.Test; - -import com.coding.basic.array.ArrayList; - -public class TestArrayList { - - @Test - public void testAdd() { - ArrayList list = new ArrayList(); - int i = 0; - for (; i < 1000; i++) { - list.add(new Object()); - } - Assert.assertTrue(list.size() == i); - } - - @Test - public void testGet() { - ArrayList list = new ArrayList(); - int i = 0; - for (; i < 10; i++) { - list.add(new Object()); - } - Assert.assertFalse(list.get(5) == null); - try { - list.get(10); - Assert.assertTrue(false); - } catch (IndexOutOfBoundsException e) { - Assert.assertTrue(true); - } - } - - @Test - public void testAddWithIndex() { - ArrayList list = new ArrayList(); - int i = 0; - for (; i < 10; i++) { - list.add(new Object()); - } - Object obj = list.get(5); - list.add(5, new Object()); - Assert.assertTrue(list.size() == (i + 1)); - Assert.assertTrue(obj == list.get(6)); - } - - @Test - public void testRemove() { - ArrayList list = new ArrayList(); - int i = 0; - for (; i < 10; i++) { - list.add(i); - } - Object tempObj = list.get(5); - Assert.assertTrue(tempObj == list.remove(5)); - Assert.assertTrue(list.size() == (i - 1)); - Assert.assertTrue((int) list.get(list.size() - 1) == (i - 1)); - } -} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java deleted file mode 100644 index a137ceffb8..0000000000 --- a/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java +++ /dev/null @@ -1,37 +0,0 @@ -package test.com.coding.basic; - -import com.coding.basic.BinaryTreeNode; -import org.junit.Test; - -public class TestBinaryTreeNode { - - @Test - public void testInsert() { - BinaryTreeNode binaryTree = new BinaryTreeNode(5); - binaryTree.insert(2); - binaryTree.insert(7); - binaryTree.insert(1); - binaryTree.insert(6); - - printNode(binaryTree); - - binaryTree.insert(4); - binaryTree.insert(8); - - System.out.println("*************************"); - printNode(binaryTree); - } - - private void printNode(BinaryTreeNode node) { - System.out.print("node's data is " + node.getDataIntVal()); - System.out.println(" ,node's parent' data is " + (node.getParent() == null ? "null" : node.getParent().getDataIntVal())); - if (node.getLeft() != null) { - System.out.println("find left child node."); - printNode(node.getLeft()); - } - if (node.getRight() != null) { - System.out.println("find right child node."); - printNode(node.getRight()); - } - } -} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java deleted file mode 100644 index 3a4a79ba0d..0000000000 --- a/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java +++ /dev/null @@ -1,176 +0,0 @@ -package test.com.coding.basic; - -import static org.junit.Assert.fail; - -import org.junit.Assert; -import org.junit.Test; - -import com.coding.basic.linklist.LinkedList; - -public class TestLinkedList { - - @Test - public void testReverse(){ - LinkedList list = new LinkedList(); - list.add(3); - list.add(7); - list.add(10); - list.reverse(); - Assert.assertEquals("10,7,3", list.toString()); - Assert.assertEquals("10", list.get(0).toString()); - } - - @Test - public void testRemoveFirstHalf(){ - LinkedList list = new LinkedList(); - list.add(3); - list.add(7); - list.add(10); - list.add(12); - list.add(15); - list.removeFirstHalf(); - Assert.assertEquals("10", list.get(0).toString()); - Assert.assertEquals("10,12,15", list.toString()); - Assert.assertEquals(3, list.size()); - } - - @Test - public void testRemoveByLength(){ - LinkedList list = new LinkedList(); - list.add(3); - list.add(7); - list.add(10); - list.add(12); - list.add(15); - list.remove(0, 2); - Assert.assertEquals("10", list.get(0).toString()); - Assert.assertEquals("10,12,15", list.toString()); - Assert.assertEquals(3, list.size()); - - list.remove(1, 1); - Assert.assertEquals("10", list.get(0).toString()); - Assert.assertEquals("10,15", list.toString()); - Assert.assertEquals(2, list.size()); - } - - @Test - public void testGetElements(){ - LinkedList list = new LinkedList(); - list.add(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - list.add(6); - - LinkedList indices = new LinkedList(); - indices.add(1); - indices.add(3); - indices.add(4); - indices.add(6); - int[] elements = list.getElements(indices); - StringBuilder sb = new StringBuilder(); - for(int i=0;i System.out.println("runnable with no argument."); - Thread thread = new Thread(noArg); - thread.start(); - - ActionListener oneArg = event -> System.out.println("actionListener with one argument."); - - Runnable multiStatement = () -> { - System.out.println("Runnable with multi statement."); - System.out.println("Hello Java8!"); - }; - BinaryOperator add = (x, y) -> x + y; - BinaryOperator addExplicit = (Long x, Long y) -> x + y; - - String name = "abc"; - name = "def"; - //ActionListener oneArg1 = event -> System.out.println("actionListener with one argument." + name); - // 编译无法通过:方法块中使用的变量必须使用final声明或既成事实的final变量,即变成赋值成功后不能再赋值 - - - Predicate atLeast5 = x -> x > 5; - System.out.println(atLeast5.test(6)); - -// BinaryOperator addE = (x,y) -> x + y;//编译不通过 - BinaryOperator addLongs = (x,y) -> x + y; - - } - - interface IntPred { - boolean test(Integer value); - } - interface A { - boolean check(Predicate predicate); - boolean check(IntPred predicate); - } -} diff --git a/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java b/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java deleted file mode 100644 index c6d60e339c..0000000000 --- a/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java +++ /dev/null @@ -1,35 +0,0 @@ -package practise.chapter1; - -import java.util.List; - -public class HelloService { - - private String target; - - private List targets; - - public HelloService(String target){ - this.target = target; - } - - public String say(){ - return "hello " + this.target; - } - - public String getTarget() { - return target; - } - - public void setTarget(String target) { - this.target = target; - } - - public List getTargets() { - return targets; - } - - public void setTargets(List targets) { - this.targets = targets; - } - -} diff --git a/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java b/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java deleted file mode 100644 index 390a7b7e68..0000000000 --- a/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java +++ /dev/null @@ -1,9 +0,0 @@ -package practise.chapter1; - -public class HelloWorldService { - - public String hello(){ - System.out.println("Hello Spring!"); - return "hello"; - } -} diff --git a/group23/1028361767/learn-spring/src/test/practise/Test1.java b/group23/1028361767/learn-spring/src/test/practise/Test1.java deleted file mode 100644 index 7867ac294d..0000000000 --- a/group23/1028361767/learn-spring/src/test/practise/Test1.java +++ /dev/null @@ -1,39 +0,0 @@ -package test.practise; - -import org.junit.Assert; -import org.junit.Test; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import practise.chapter1.HelloService; -import practise.chapter1.HelloWorldService; - -public class Test1 { - - ApplicationContext context = new ClassPathXmlApplicationContext("practise/chapter1.xml"); - - @Test - public void testHello(){ - HelloWorldService helloWorldService = context.getBean("helloWorldService", HelloWorldService.class); - Assert.assertEquals("hello", helloWorldService.hello()); - HelloWorldService helloWorldService1 = context.getBean("helloWorldService1", HelloWorldService.class); - Assert.assertEquals("hello", helloWorldService1.hello()); - HelloWorldService helloWorldService2 = context.getBean("helloWorldService2", HelloWorldService.class); - Assert.assertEquals("hello", helloWorldService2.hello()); - String[] alias = context.getAliases("helloWorldService"); - Assert.assertEquals(2, alias.length); - for(String alia : alias){ - System.out.println(alia); - } - } - - @Test - public void testSay(){ - HelloService helloService = context.getBean("helloService", HelloService.class); - Assert.assertEquals("hello spring3", helloService.say()); - for(String target : helloService.getTargets()){ - System.out.println(target); - } - Assert.assertEquals(3, helloService.getTargets().size()); - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 88f60c77f6..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index e5d5e522ee..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.CommandParser; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, ByteCodeCommand[] cmds) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - int maxStack = iter.nextU2ToInt(); - int maxLocals = iter.nextU2ToInt(); - int codeLen = iter.nextU4ToInt(); - - String code = iter.nextUxToHexString(codeLen); - ByteCodeCommand[] commands = CommandParser.parse(clzFile, code); - - CodeAttr attr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, commands); - int expTableLen = iter.nextU2ToInt(); - if(expTableLen > 0){ - String expTable = iter.nextUxToHexString(expTableLen); - System.out.println("expTable: " + expTable); - // TODO 异常表处理 - } - int subAttrCount = iter.nextU2ToInt(); - ConstantPool pool = clzFile.getConstantPool(); - for (int i = 1; i <= subAttrCount; i++) { - int subAttrNameIndex = iter.nextU2ToInt(); - String subAttrName = pool.getUTF8String(subAttrNameIndex); - iter.back(2); - if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ - attr.setLineNumberTable(LineNumberTable.parse(iter)); - }else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ - attr.setLocalVariableTable(LocalVariableTable.parse(iter)); - }else if(AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ - attr.setStackMapTable(StackMapTable.parse(iter)); - }else{ - //TODO - throw new RuntimeException("CodeAttr.parse not implement " + subAttrName); - } - } - return attr; - } - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - - } - - - - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java deleted file mode 100644 index f83202d6c3..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.coderising.jvm.attr; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LineNumberTable extends AttributeInfo { - List items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - LineNumberTable table = new LineNumberTable(attrNameIndex, attrLen); - int lineNumberTableLen = iter.nextU2ToInt(); - for(int i=0;i items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - int attrNameIndex = iter.nextU2ToInt(); - int attrLen = iter.nextU4ToInt(); - LocalVariableTable table = new LocalVariableTable(attrNameIndex, attrLen); - int localVarLen = iter.nextU2ToInt(); - for(int i=0;i fields = new ArrayList<>(); - private List methods = new ArrayList<>(); - - - public ConstantPool getPool() { - return pool; - } - public void setPool(ConstantPool pool) { - this.pool = pool; - } - public List getMethods() { - return methods; - } - public void setMethods(List methods) { - this.methods = methods; - } - public void setClzIndex(ClassIndex clzIndex) { - this.clzIndex = clzIndex; - } - 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()); - - - } - - public String getClassName(){ - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - public List getFields() { - return fields; - } - public void setFields(List fields) { - this.fields = fields; - } - - public Method getMethod(String methodName, String paramAndReturnType){ - for(Method m : this.methods){ - String mName = this.getConstantPool().getUTF8String(m.getNameIndex()); - String pAndRT = this.getConstantPool().getUTF8String(m.getDescriptorIndex()); - if(methodName.equals(mName) - && paramAndReturnType.equals(pAndRT)){ - return m; - } - } - - return null; - } - public Method getMainMethod(){ - - return getMethod("main", "([Ljava/lang/String;)V"); - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java deleted file mode 100644 index e424f284b3..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java deleted file mode 100644 index cd0fbd4848..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index a3abeacc82..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java deleted file mode 100644 index fca703c59a..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - List cmds = new ArrayList<>(); - CommandIterator iter = new CommandIterator(codes); - while(iter.hasNext()){ - String opCode = iter.next2CharAsString().toUpperCase(); - if(new_object.equals(opCode)){ - NewObjectCmd newObjCmd = new NewObjectCmd(clzFile, opCode); - newObjCmd.setOprand1(iter.next2CharAsInt()); - newObjCmd.setOprand2(iter.next2CharAsInt()); - cmds.add(newObjCmd); - }else if(getfield.equals(opCode)){ - GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, opCode); - getFieldCmd.setOprand1(iter.next2CharAsInt()); - getFieldCmd.setOprand2(iter.next2CharAsInt()); - cmds.add(getFieldCmd); - }else if(getstatic.equals(opCode)){ - GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, opCode); - getStaticFieldCmd.setOprand1(iter.next2CharAsInt()); - getStaticFieldCmd.setOprand2(iter.next2CharAsInt()); - cmds.add(getStaticFieldCmd); - }else if(putfield.equals(opCode)){ - PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, opCode); - putFieldCmd.setOprand1(iter.next2CharAsInt()); - putFieldCmd.setOprand2(iter.next2CharAsInt()); - cmds.add(putFieldCmd); - }else if(invokevirtual.equals(opCode)){ - InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, opCode); - invokeVirtualCmd.setOprand1(iter.next2CharAsInt()); - invokeVirtualCmd.setOprand2(iter.next2CharAsInt()); - cmds.add(invokeVirtualCmd); - }else if(invokespecial.equals(opCode)){ - InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, opCode); - invokeSpecialCmd.setOprand1(iter.next2CharAsInt()); - invokeSpecialCmd.setOprand2(iter.next2CharAsInt()); - cmds.add(invokeSpecialCmd); - }else if(ldc.equals(opCode)){ - LdcCmd ldcCmd = new LdcCmd(clzFile, opCode); - ldcCmd.setOperand(iter.next2CharAsInt()); - cmds.add(ldcCmd); - }else if(bipush.equals(opCode)){ - BiPushCmd biPushCmd = new BiPushCmd(clzFile, opCode); - biPushCmd.setOperand(iter.next2CharAsInt()); - cmds.add(biPushCmd); - }else if(dup.equals(opCode) || aload_0.equals(opCode) - || aload_1.equals(opCode) || aload_2.equals(opCode) - || astore_1.equals(opCode) || voidreturn.equals(opCode) - || iload.equals(opCode) || iload_1.equals(opCode) - || iload_2.equals(opCode) || iload_3.equals(opCode)){ - NoOperandCmd noOpCmd = new NoOperandCmd(clzFile, opCode); - cmds.add(noOpCmd); - }else{ - throw new RuntimeException("cmd " + opCode + " has not bean implemented yet."); - } - } - calcuateOffset(cmds); - ByteCodeCommand[] byteCodeCmds = new ByteCodeCommand[cmds.size()]; - return cmds.toArray(byteCodeCmds); - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 2e6061edd2..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e6cf9d5960..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index ac228d0e4d..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index c15d827797..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java deleted file mode 100644 index ffb66f811c..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 33813b5d59..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 56c28fefe2..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 963d064257..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 85bb369c19..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 6c0cf53082..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java deleted file mode 100644 index 92ac5b67eb..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java deleted file mode 100644 index 8d4fc6f0de..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coderising.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); - } - - public abstract void accept(Visitor visitor); - - public static interface Visitor { - void visitClassInfo(ClassInfo classInfo); - void visitFieldRefInfo(FieldRefInfo fieldRefInfo); - void visitMethodRefInfo(MethodRefInfo methodRefInfo); - void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo); - void visitNullConstantInfo(NullConstantInfo nullConstantInfo); - void visitStringInfo(StringInfo stringInfo); - void visitUTF8Info(UTF8Info utf8Info); - } - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java deleted file mode 100644 index 93506b1e20..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.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 int getSize() { - return this.constantInfos.size() -1; - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index cb31499dd3..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRefInfo(this); - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 466b06f9ea..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coderising.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRefInfo(this); - } - - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index c13d8c4fc6..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coderising.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()+")"; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndTypeInfo(this); - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 655c273621..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - @Override - public void accept(Visitor visitor) { - visitor.visitNullConstantInfo(this); - } - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index 84ae36c4ca..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.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); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitStringInfo(this); - } - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index 7c4aeb1861..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.coderising.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; - } - @Override - public void accept(Visitor visitor) { - visitor.visitUTF8Info(this); - } - - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java deleted file mode 100644 index 01a009331c..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descriptorIndex = iter.nextU2ToInt(); - Field field = new Field(accessFlag, nameIndex, descriptorIndex, pool); - int attCount = iter.nextU2ToInt(); - if(attCount > 0){ - //TODO handle field attrs - throw new RuntimeException("Field.attr not implements"); - } - return field; - } - - public String toString() { - return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex); - } - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index c0c4598800..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.coderising.jvm.loader; - -import java.io.UnsupportedEncodingException; - -public class ByteCodeIterator { - - private byte[] codes; - private int pos; - - public ByteCodeIterator(byte[] codes){ - this.codes = codes; - } - - public byte[] nextU2(){ return new byte[]{codes[pos++], codes[pos++]};} - - public byte[] nextU4(){ return new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]};} - - public int nextU1ToInt() { - return (codes[pos++] & 0xff); - } - - public int nextU2ToInt() { - return ((codes[pos++] & 0xff00) << 8) | (codes[pos++] & 0x00ff); - } - - public int nextU4ToInt() { - return ((codes[pos++] & 0xff000000) << 24) | ((codes[pos++] & 0x00ff0000) << 16) - | ((codes[pos++] & 0x0000ff00) << 8) | (codes[pos++] & 0x000000ff) ; - } - - public String nextUxToHexString(int len) { - StringBuffer buffer = new StringBuffer(); - for(int i=0;i 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; - } - - public ClassFile loadClass(String className) { - byte[] codes = this.readBinaryCode(className); - ClassFileParser parser = new ClassFileParser(); - return parser.parse(codes); - - } - - public void addClassPath(String path) { - if(clzPaths.contains(path)) - return ; - clzPaths.add(path); - } - - - - public String getClassPath(){ - StringBuilder sb = new StringBuilder(); - for(String clzPath : clzPaths){ - sb.append(clzPath).append(";"); - } - return sb.length() == 0?"":sb.substring(0, sb.length()-1); - } - - private byte[] loadClassFile(String clzFileName) { - - BufferedInputStream bis = null; - - try { - - File f = new File(clzFileName); - - - bis = new BufferedInputStream(new FileInputStream(f)); - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - - byte[] buffer = new byte[1024]; - int length = -1; - - while((length = bis.read(buffer)) != -1){ - bos.write(buffer, 0, length); - } - - byte [] codes = bos.toByteArray(); - - return codes; - - } catch(IOException e){ - e.printStackTrace(); - - } finally{ - if(bis != null){ - try { - bis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return null; - } - - - -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java deleted file mode 100644 index 3a6258e26b..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.AccessFlag; -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.clz.ClassIndex; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; -import com.coderising.jvm.constant.NameAndTypeInfo; -import com.coderising.jvm.constant.NullConstantInfo; -import com.coderising.jvm.constant.StringInfo; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFileParser { - - public ClassFile parse(byte[] codes) { - ClassFile classFile = new ClassFile(); - ByteCodeIterator iter = new ByteCodeIterator(codes); - -// String magicNumber = iter.nextUxToHexString(4); - iter.nextUxToHexString(4); - - classFile.setMinorVersion(iter.nextU2ToInt()); - classFile.setMajorVersion(iter.nextU2ToInt()); - - ConstantPool pool = parseConstantPool(iter); - classFile.setConstPool(pool); - - classFile.setAccessFlag(parseAccessFlag(iter)); - - classFile.setClassIndex(parseClassInfex(iter)); - - parseInterfaces(iter); - - classFile.setFields(prarseField(iter, pool)); - classFile.setMethods(parseMethod(iter, classFile)); - return classFile; - } - - private List parseMethod(ByteCodeIterator iter, ClassFile classFile) { - List methods = new ArrayList<>(); - int mthodsCount = iter.nextU2ToInt(); - for(int i=0;i prarseField(ByteCodeIterator iter, ConstantPool pool) { - List fields = new ArrayList<>(); - int fieldsCount = iter.nextU2ToInt(); - 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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } -} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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;isize||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - - if(sizesize||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - - return elementData[index]; - - } - - public Object remove(int index){ - if(index>size||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - Object revalue = elementData[index]; - Object[] dest = new Object[elementData.length]; - System.arraycopy(elementData, 0, dest, 0, index); - System.arraycopy(elementData, index+1, dest, index, elementData.length-1-index); - elementData = dest; - size--; - return revalue; - } - - public int size(){ - return size; - } - - public Iterator iterator(){ - iterator = new ArrayListIterator(this); - return iterator; - } - -} diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java deleted file mode 100644 index 345d620c0e..0000000000 --- a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.skomefen.list; - -public class ArrayListIterator implements Iterator { - private ArrayList array = null; - private int index = 0; - public ArrayListIterator(ArrayList array) { - this.array = array; - } - public boolean hasNext() { - if(array==null){ - return false; - } - if(indexsize||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - insertoflist(index, o); - - - } - public Object get(int index){ - if(index>=size||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - if(head==null){ - return null; - } - if(index==point){ - return node.data; - } - this.point=0; - node = head; - while(index>=this.point){ - - if(index==point){ - return node.data; - } - point++; - node = node.next; - } - return null; - } - public Object remove(int index){ - if(index>=size||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - size--; - if(index==(this.point+1)){ - Object o =node.next.data; - node.next = node.next.next; - return o; - } - this.point = 0; - if(index==0){ - head = head.next; - Object o =head.data; - node = head; - return o; - } - - Object o = null; - while(index<=(this.point+1)){ - if(index==(this.point+1)){ - o =node.next.data; - node.next = node.next.next; - - } - point++; - node = node.next; - } - return o; - } - - public int size(){ - - return size; - } - - public void addFirst(Object o){ - add(0,o); - } - public void addLast(Object o){ - add(size,o); - } - public Object removeFirst(){ - if(head==null){ - return null; - } - remove(0); - return null; - } - public Object removeLast(){ - if(head==null){ - return null; - } - remove(size-1); - return null; - } - public Iterator iterator(){ - iterator = new LinkedListiterator(this); - return iterator; - } - - - private static class Node{ - private Object data; - private Node next; - - - } - - private void insertoflist(int index,Object o){ - - if(index>size||index<0){ - throw new IndexOutOfBoundsException("index:"+index+"size:"+size); - } - - if(head==null){ - head = new Node(); - head.data=o; - head.next=new Node(); - size++; - node = head; - this.point = 0; - return; - } - if(index==(this.point+1)){ - pointlast(index, o); - return; - } - //head不等于空,先从head顺序往下找 - this.point = 0; - if(index == this.point){ - Node next = head; - head = new Node(); - head.next = next; - head.data = o; - node = head;//当前节点为head - this.point = index; - size++; - return; - } - do{ - if(index==(this.point+1)){ - pointlast(index, o); - return; - } - node = node.next; - this.point++; - }while(index>(this.point+1)); - - } - - private void pointlast(int index, Object o) { - if(index==(this.point+1)){ - if(index==size){//index插入List结尾 - this.point = this.point+1; - node = node.next; - node.data=o; - node.next = new Node(); - size++; - return; - } - this.point = this.point+1; - Node next = node.next;//从上一个node获取下一个node - node.next = new Node();//上一个节点指向新建节点 - node = node.next;//获取新建节点 - node.data=o;//新建节点获取值 - node.next = next;//新建节点指向下一个节点 - size++; - return; - } - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java deleted file mode 100644 index c04de32a93..0000000000 --- a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.skomefen.list; - -public class LinkedListiterator implements Iterator { - - private LinkedList link = null; - private int index = 0; - public LinkedListiterator(LinkedList link) { - this.link = link; - } - public boolean hasNext() { - if(link==null){ - return false; - } - if(index params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - - View view = Struts.runAction(actionName,params); - - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一�? - - - View view = Struts.runAction(actionName,params); - - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java deleted file mode 100644 index 66024b0ccf..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coderising.download; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -import com.coderising.download.api.Connection; - -public class DownloadThread extends Thread{ - - private Connection conn; - private int startPos; - private int endPos; - private byte[] b = null; - private static Lock lock = new ReentrantLock(); - private static int index=0; - - static FileOutputStream file = null; - static{ - try { - file = new FileOutputStream(new File("e://readme.txt")); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - public DownloadThread( Connection conn, int startPos, int endPos){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - try { - this.b = conn.read(startPos, endPos); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - throw new RuntimeException(); - }finally{ - conn.close(); - } - - } - public void run(){ - if(lock.tryLock()){ - if(index==startPos){ - try { - if (file!=null) { - file.write(b); - } - index=endPos+1; - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(); - } - - }else{ - lock.unlock(); - } - } - } -} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java deleted file mode 100644 index ed4a1cf9a1..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; - - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String _url) { - this.url = _url; - - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - try { - - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - if(length%3==0){ - for(int i=1;i<=3;i++){ - int startPos = length/3*i-1; - int endPos = length/3*(i-1); - new DownloadThread(conn, endPos, startPos).start(); - } - }else{ - for(int i=1;i<=2;i++){ - - int startPos = length/3*(i-1); - int endPos = length/3*i-1; - new DownloadThread(conn, startPos, endPos).start(); - } - int startPos = length/3*2; - new DownloadThread(conn, startPos, length).start(); - } - - listener.notifyFinished(); - } catch (ConnectionException e) { - e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } - } - - - - - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - -} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java deleted file mode 100644 index ce99026d2b..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; -import com.coderising.download.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url = "http://localhost:8080/TimeCapsule/readme.txt"; - - FileDownloader downloader = new FileDownloader(url); - - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - public void notifyFinished() { - downloadFinished = true; - } - - }); - - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java deleted file mode 100644 index 3982b8e310..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.download.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - * - */ - public void close(); -} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java deleted file mode 100644 index 1551a80b3d..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public class ConnectionException extends Exception { - -} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java deleted file mode 100644 index ce045393b1..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderising.download.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java deleted file mode 100644 index bf9807b307..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java deleted file mode 100644 index ae639d2651..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.coderising.download.impl; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; - -import com.coderising.download.api.Connection; - -public class ConnectionImpl implements Connection{ - - private String url = null; - private InputStream in = null; - - - public ConnectionImpl(String url) { - this.url = url; - - - } - - public byte[] read(int startPos, int endPos) throws IOException { - - try { - if(url==null||url.trim()==""){ - return null; - } - - URL u = new URL(url); - in = u.openStream(); - - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - if(in==null){ - return null; - } - byte[] read = insert(startPos, endPos); - - return read; - } - - private byte[] insert(int startPos, int endPos) throws IOException { - byte[] b = new byte[1024]; - int len = 0; - int index = 0; - byte[] read = new byte[endPos-startPos+1]; - - while((len=in.read(b))>0){ - if((index+1024)<=startPos){ - index+=1024; - continue; - } - - if(index<=startPos&&startPos<(index+1024)){ - - if(endPos<(index+1024)){ - for(int i=0,j=startPos-index;i0){ - count+=len; - } - Assert.assertEquals(count, conn.getContentLength()); - - } - - - @Test - public void testClose() { - conn.close(); - } - -} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java deleted file mode 100644 index 589c1bf1d2..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package junit.test; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.impl.ConnectionImpl; -import com.coderising.download.impl.ConnectionManagerImpl; - -public class ConnectionManagerImplTest { - - @Before - public void setUp() throws Exception { - } - - - @Test - public void testOpen() throws ConnectionException { - ConnectionManager cm = new ConnectionManagerImpl(); - String url = "http://localhost:8080/TimeCapsule/readme.txt"; - Connection conn = cm.open(url); - } - -} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java deleted file mode 100644 index 5ae230e97b..0000000000 --- a/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java +++ /dev/null @@ -1,77 +0,0 @@ -package junit.test; - -import static org.junit.Assert.*; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; - - - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.download.DownloadThread; -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.impl.ConnectionManagerImpl; - -public class DownloadThreadTest { - - @Before - public void setUp() throws Exception { - } - - @Test - public void testRun() throws ConnectionException, IOException { - ConnectionManager cm = new ConnectionManagerImpl(); - String url = "http://localhost:8080/TimeCapsule/readme.txt"; - Connection conn = cm.open(url); - DownloadThread dt = new DownloadThread(conn, 0, conn.getContentLength()); - dt.start(); - - File file = new File("e://readme.txt"); - FileInputStream in = new FileInputStream(file); - byte[] b = new byte[10]; - int len = 0; - ArrayList a = new ArrayList(); - while((len=in.read(b))>0){ - a.add(b); - } - - int length = conn.getContentLength(); - if(length%3==0){ - for(int i=1;i<=3;i++){ - int startPos = length/3*i-1; - int endPos = length/3*(i-1); - new DownloadThread(conn, endPos, startPos).start(); - } - }else{ - for(int i=1;i<=2;i++){ - - int startPos = length/3*(i-1); - int endPos = length/3*i-1; - new DownloadThread(conn, startPos, endPos).start(); - } - int startPos = length/3*2; - new DownloadThread(conn, startPos, length).start(); - } - - file = new File("e://readme.txt"); - in = new FileInputStream(file); - b = new byte[10]; - len = 0; - ArrayList a1 = new ArrayList(); - while((len=in.read(b))>0){ - a1.add(b); - } - for(int i = 0;isize || index < 0||index == size) - throw new IndexOutOfBoundsException( - "Index: "+index+", Size: "+size); - Object temp = elementData; - elementData=grow(elementData,1); // Increments modCount!! - System.arraycopy(temp, index, elementData, index + 1, - size - index); - elementData[index] = o; - } - - public Object get(int index){ - size(); - if (index > size || index < 0 ||index == size) - throw new IndexOutOfBoundsException( - "Index: "+index+", Size: "+size); - return elementData[index]; - } - - public Object remove(int index){ - size(); - if (index > size || index < 0 ||index == size) - throw new IndexOutOfBoundsException( - "Index: "+index+", Size: "+size); - Object tempData = elementData[index]; - System.arraycopy(elementData, index+1, elementData, index, - size - index); - return tempData; - } - - public int size(){ - for(int i=0;i= size) - throw new NoSuchElementException(); - Object[] elementData = ArrayList.this.elementData; - if (i >= elementData.length) - throw new ConcurrentModificationException(); - cursor = i + 1; - return elementData[lastRet = i]; - } - - -} - - - -} diff --git a/group23/1246614258/src/com/coding/datastructs/Iterator.java b/group23/1246614258/src/com/coding/datastructs/Iterator.java deleted file mode 100644 index 56acec15a3..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.datastructs; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/1246614258/src/com/coding/datastructs/LinkedList.java b/group23/1246614258/src/com/coding/datastructs/LinkedList.java deleted file mode 100644 index cd5de44121..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/LinkedList.java +++ /dev/null @@ -1,229 +0,0 @@ -package com.coding.datastructs; - -public class LinkedList implements List{ - - private Node head; - private int size ; - - public LinkedList() { - size = 0; - head=new Node(); - } - - public void add(Object o) { - Node pnew = new Node(); - pnew.setData(o); - pnew.next = null; - if(null==head.getNext()){ - head.setNext(pnew); - return; - } - Node ptr = head.getNext(); - Node ptr1 = new Node(); - - while (ptr != null) { - ptr1 = ptr; - ptr = ptr.getNext(); - } - ptr1.next = pnew; - - } - - public void add(int index, Object o) { - size(); - if (index > size || index < 0) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - Node ptr; - Node ptemp = new Node(); - ; - Node pnew;// ʵ½ڵ - ptr = head.getNext(); - int i = 0; - if (ptr == null && size == 0) { - System.out.println("ʧܣ"); - } - while (ptr != null) { - ptemp = ptr; - if (index == 0) { - pnew = new Node(); - pnew.setData(o); - pnew.setNext(ptr); - head.setNext(pnew); - break; - } - if (index == i && index > 0) { - ptemp = getNode(i-1); - pnew = new Node(); - pnew.setData(o); - pnew.setNext(ptr); - ptemp.setNext(pnew);// - System.out.println("" + o + "ɹ"); - break; - } - ptr = ptr.getNext(); - i++; - } - if (ptr == null && size > 0) { - pnew = new Node(); - pnew.setData(o); - pnew.setNext(null); - ptemp.setNext(pnew);// - System.out.println("" + o + "ɹ"); - } - - } - - public Object get(int index) { - size(); - if (index > size || index < 0 || index == size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - Node ptr = head.getNext(); - Object tempData = null; - int i = 0; - while (ptr != null) { - if (index == i) { - tempData = ptr.getData(); - } - ptr = ptr.getNext(); - i++; - } - - return tempData; - } - - public Node getNode(int index) { - size(); - if (index > size || index < 0 || index == size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - Node ptr = head.getNext(); - Node tempData = null; - int i = 0; - while (ptr != null) { - if (index == i) { - tempData = ptr; - } - ptr = ptr.getNext(); - i++; - } - - return tempData; - } - - public Object remove(int index) { - size(); - if(size()==0){ - throw new NullPointerException("listڲΪգɾ"); - } - if (index > size || index < 0 || index == size) - throw new IndexOutOfBoundsException("Index: " + index + ", Size: " - + size); - Node ptr = head.getNext(); - Node ptrNext = new Node(); - Object tempData = null; - int i = 0; - while (ptr != null) { - if (index == 0) { - ptrNext = ptr.getNext(); - head.setNext(ptrNext); - break; - } - if (index == i && index > 0) { - Node ptrprevious = getNode(i - 1); - tempData = ptr.getData(); - ptrprevious.setNext(ptr.getNext()); - break; - } - ptr = ptr.getNext(); - i++; - } - return tempData; - } - - public int size() { - int i = 0; - Node ptr = head.getNext(); - while (ptr != null) { - ptr = ptr.getNext(); - i++; - } - size = i; - return size; - } - - public void addFirst(Object o) { - add(0,o); - - } - - public void addLast(Object o) { - /*Node ptr = head.getNext(); - Node pnew = new Node(); - pnew.setData(o); - Node ptemp = new Node(); - if (ptr == null) { - head.setNext(pnew); - } else { - while (ptr != null) { - ptemp = ptr; - ptr = ptr.getNext(); - } - if (ptr == null) { - ptemp.setNext(pnew); - } - }*/ - add(size(),o); - - } - - public Object removeFirst() { - Node ptr = head.getNext(); - Object temp = null; - if (ptr == null) { - throw new NullPointerException("LinkedListݣܽɾ"); - } else { - temp = ptr.getData(); - remove(0); - } - - return temp; - } - - public Object removeLast() { - size(); - Node ptr = head.getNext(); - Object temp = null; - if (ptr == null) { - throw new NullPointerException("LinkedListݣܽɾ"); - } else { - temp = remove(size - 1); - } - - return temp; - } - - private static class Node { - Object data; - Node next; - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public Node getNext() { - return next; - } - - public void setNext(Node next) { - this.next = next; - } - - } - -} diff --git a/group23/1246614258/src/com/coding/datastructs/List.java b/group23/1246614258/src/com/coding/datastructs/List.java deleted file mode 100644 index 35ece31ca6..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.datastructs; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/1246614258/src/com/coding/datastructs/MyIterator.java b/group23/1246614258/src/com/coding/datastructs/MyIterator.java deleted file mode 100644 index be827a7875..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/MyIterator.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.datastructs; - -import java.util.Iterator; - -public class MyIterator { - public Iterator iterator(){ - return null; - } - private class Itera implements Iterator{ - int cursor; - int lastRet = -1; - - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return false; - } - - @Override - public Object next() { - // TODO Auto-generated method stub - return null; - } - - @Override - public void remove() { - // TODO Auto-generated method stub - - } - - - - } - -} diff --git a/group23/1246614258/src/com/coding/datastructs/Queue.java b/group23/1246614258/src/com/coding/datastructs/Queue.java deleted file mode 100644 index 4e36db418a..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/Queue.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding.datastructs; - public class Queue{ - private LinkedList list = new LinkedList(); - - public void enQueue(Object o){ - list.add(o); - } - - public Object deQueue(){ - if (list.size()<=0) { - throw new NullPointerException("Queueݣܽɾ"); - } - Object o = list.get(0); - list.removeFirst(); - return o; - } - - public boolean isEmpty(){ - int count = size(); - if(count<0){ - return true; - } - return false; - } - - public int size(){ - return list.size(); - } - } - diff --git a/group23/1246614258/src/com/coding/datastructs/Stack.java b/group23/1246614258/src/com/coding/datastructs/Stack.java deleted file mode 100644 index 269f3c900e..0000000000 --- a/group23/1246614258/src/com/coding/datastructs/Stack.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.coding.datastructs; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - if (elementData.size()<=0) { - throw new NullPointerException("Stackݣܽɾ"); - } - Object data = elementData.get(elementData.size()-1); - elementData.remove(size()-1); - return data; - } - - public Object peek(){ - Object data = elementData.get(elementData.size()-1); - return data; - } - public boolean isEmpty(){ - if(elementData.size()>0){ - return false; - }else{ - return false; - } - } - public int size(){ - return elementData.size(); - } -} diff --git a/group23/1246614258/src/com/coding/test/ArrayListTest.java b/group23/1246614258/src/com/coding/test/ArrayListTest.java deleted file mode 100644 index 76ba571c78..0000000000 --- a/group23/1246614258/src/com/coding/test/ArrayListTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.test; -import com.coding.datastructs.ArrayList; -import com.coding.datastructs.Iterator; - - -public class ArrayListTest { - - /** - *

    Description:

    - * @param args - * @author:Wilson huang - * @date 2017-3-1212:08:10 - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - ArrayList aa = new ArrayList(); - aa.add("aa"); - aa.add("bb"); - aa.add("cc"); - //aa.remove(3); - aa.add(2, "44"); - for(int i=0;iDescription:

    - * @param args - * @author:Wilson huang - * @date 2017-3-121:45:58 - */ - - public static void main(String[] args) { - // TODO Auto-generated method stub - LinkedList list = new LinkedList(); - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - list.removeLast(); - for(int i=0;iDescription:

    - * @param args - * @author:Wilson huang - * @date 2017-3-122:42:15 - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - Queue q = new Queue(); - q.enQueue("a"); - q.enQueue("b"); - System.out.println(q.deQueue()); - - } - -} diff --git a/group23/1246614258/src/com/coding/test/StackTest.java b/group23/1246614258/src/com/coding/test/StackTest.java deleted file mode 100644 index 41f2a15b5b..0000000000 --- a/group23/1246614258/src/com/coding/test/StackTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coding.test; -import com.coding.datastructs.Stack; - - -public class StackTest { - - /** - *

    Description:

    - * @param args - * @author:Wilson huang - * @date 2017-3-122:34:15 - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - Stack a = new Stack(); - a.push("a"); - a.push("b"); - a.push("c"); - System.out.println(a.isEmpty()); - System.out.println(a.peek()); - System.out.println(a.pop()); - - } - -} diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" deleted file mode 100644 index ff773dffcc..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" +++ /dev/null @@ -1,141 +0,0 @@ -/** - * - */ -package com.coding.datastructs; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - - -public class ArrayUtil { - - - public void reverseArray(int[] origin){ - for (int i=0; i temp = new HashSet(); - for(Integer i : newArray) - temp.add(i); - for (int i = 0; i < temp.size(); i++) { - newArray[i]=(int)temp.toArray()[i]; - } - Arrays.sort(Arrays.copyOfRange(newArray, 0, temp.size())); - return Arrays.copyOfRange(newArray, 0, temp.size()); - } - - public int[] grow(int [] oldArray, int size){ - int[] target = new int[oldArray.length+size]; - System.arraycopy(oldArray, 0, target, 0, oldArray.length); - return target; - } - - - public int[] fibonacci(int max){ - ArrayList list = new ArrayList(); - list.add(1); - list.add(1); - if(max<=1){ - return new int[0]; - } - for (int i = 2; i < max; i++) { - int a = list.get(i-1)+list.get(i-2); - if(a list = new ArrayList(); - int j=1; - for(int i=2;i<100;i++){ - j=i; - while(j>0){ - if(i%j==0&&i!=j&&j!=1){ - break; - }else{ - j--; - } - } - if(j==0){ - list.add(i); - } - } - int[] newArray = new int[list.size()]; - for(int i=0;i list = new ArrayList(); - for(int i = 1; i < max; i++) - { - int sum = 0; - for(int j = 1; j < i; j++) - { - if(i % j == 0) - { - sum = sum + j; - } - } - if(sum == i) - { - list.add(i); - } - } - int[] newArray = new int[list.size()]; - for(int i=0;i parameters) { - - - View view = new View(); - Map> array = new HashMap>(); - Map params = new HashMap(); - Map classData = new HashMap(); - try { - analysisXml(classData,array); - Map jspData = array.get(actionName); - String s = "ԲݹactionNameûжӦclass࣬Ҫ´"; - if (!classData.containsKey(actionName)) { - throw new ClassNotFoundException(s); - } - - Class class1 = Class.forName(classData.get(actionName)); - LoginAction login = (LoginAction) class1.newInstance(); - for (String ss : parameters.keySet()) { - Method[] methos1 = class1.getMethods(); - for (int i = 0; i < methos1.length; i++) { - if (("set" + ss.substring(0, 1).toUpperCase() + ss - .substring(1)).equals(methos1[i].getName())) { - methos1[i].invoke(login, parameters.get(ss)); - break; - - } - } - } - - Method method1 = class1.getMethod("execute"); - String result = (String) method1.invoke(login); - if(null!=result){ - view.setJsp(jspData.get(result)); - } - Method[] methos2 = class1.getMethods(); - for (int i = 0; i < methos2.length; i++) { - if(methos2[i].getName().substring(0, 3).equals("get")){ - Object value1 = (Object) (methos2[i].invoke(login)); - String name1 = methos2[i].getName(); - params.put(name1.substring(3, 4).toLowerCase()+name1.substring(4), value1); - } - } - view.setParameters(params); - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - return view; - } - - - public static void analysisXml(Map xmlData,Map> array) { - try { - - String dirpath = System.getProperty("user.dir"); - String xmlFile = dirpath + "/WebContent/WEB-INF/etc/struts.xml"; - SAXBuilder builder = new SAXBuilder(); - Document doc = builder.build(new File(xmlFile)); - Element xRoot = doc.getRootElement(); - List actions = getChildren(xRoot, "action"); - for (int i = 0; i < actions.size(); i++) { - Element e = (Element) actions.get(i); - String actionName1 = getAttributeValue(e, "name"); - String className = getAttributeValue(e, "class"); - xmlData.put(actionName1, className); - List results = getChildren(e, "result"); - Map jspData = new HashMap(); - for (int j = 0; j < results.size(); j++) { - Element result = (Element) results.get(j); - String jspUrl = getValue(result); - String resultName = getAttributeValue(result, "name"); - jspData.put(resultName, jspUrl); - array.put(actionName1, jspData); - } - } - - // /StrutsDemo/WebContent/WEB-INF/etc/struts.xml - } catch (Exception e) { - e.printStackTrace(); - } - } - - - public static Element getChild(Element element, String sonMark) { - return element == null ? null : element.getChild(sonMark); - } - - - public static List getChildren(Element element, String sonMark) { - return element == null ? null : element.getChildren(sonMark); - } - - - public static String getValue(Element element) { - return element == null ? "" : element.getValue(); - } - - - public static String getAttributeValue(Element element, String attribute) { - return element == null ? null : element.getAttributeValue(attribute); - } - -} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" deleted file mode 100644 index 52f08f3652..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //ԤIJһ - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" deleted file mode 100644 index d7bcd36d42..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" +++ /dev/null @@ -1,94 +0,0 @@ -/** - * - */ -package com.coderising.litestruts; - -import java.io.BufferedReader; -import java.io.File; -import java.io.StringReader; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.jdom.Document; -import org.jdom.Element; -import org.jdom.input.SAXBuilder; - -/** - * Title: - * Description: - * @author HuangLiang - * @201731710:55:39 - * - */ -public class Test { - - /**Description: - * @param args - * @author HuangLiang 2017317 10:55:39 - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - String name1 = "getName"; - System.out.println(name1.substring(3, 4).toLowerCase()+name1.substring(4)); - try { - Class class1 = Class.forName("com.coderising.litestruts.LoginAction"); - Method[] methos1 = class1.getMethods(); - for(int i=0;i para[] = methos1[i].getParameterTypes(); - throw new ClassNotFoundException(); - } - System.out.println(""); - } catch (ClassNotFoundException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - /** - * ȡXMLӱǩ - * - * @param element - * ǩڵ - * @param sonMark - * ӱǩ - * @return - */ - public static Element getChild(Element element, String sonMark) { - return element == null ? null : element.getChild(sonMark); - } - - /** - * ȡXMLӱǩ - * - * @param element - * ǩڵ - * @param sonMark - * ӱǩ - * @return - */ - public static List getChildren(Element element, String sonMark) { - return element == null ? null : element.getChildren(sonMark); - } - - /** - * s ȡXMLǩֵ - * - * @param element - * @return - */ - public static String getValue(Element element) { - return element == null ? "" : element.getValue(); - } - /** - * s ȡXMLֵ - * - * @param element - * @return - */ - public static String getAttributeValue(Element element, String attribute) { - return element == null ? null : element.getAttributeValue(attribute); - } - -} diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" deleted file mode 100644 index f68a8c438b..0000000000 --- "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} \ No newline at end of file diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java deleted file mode 100644 index f5e2b03a8a..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java +++ /dev/null @@ -1,82 +0,0 @@ -package main; - -import java.util.Arrays; - -import utils.ListUtils; - -public class ArrayList implements List { - private Object[] elementData = new Object[10]; - private int size; - - @Override - public void add(Object o) { - add(size, o); - - } - - @Override - public void add(int index, Object o) { - // 检查是否越界 - ListUtils.CheckIndexInRange(0, size, index); - if (size == elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length + 10); - } - if (index < size) { - for (int i = size; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - } - elementData[index] = o; - size++; - } - - @Override - public Object remove(int index) { - ListUtils.CheckIndexInRange(0, size - 1, index); - Object tag = elementData[index]; - for (int i = index; i < size - 1; i++) { - elementData[i] = elementData[i + 1]; - } - elementData[size - 1] = null; - size--; - return tag; - - } - - @Override - public Object get(int index) { - ListUtils.CheckIndexInRange(0, size - 1, index); - return elementData[index]; - - } - - @Override - public int size() { - return size; - } - - public Iterator iterator() { - return new Iterator() { - private int cursor; - - @Override - public boolean hasNext() { - if (size > 0) { - return cursor < size; - } else { - return false; - } - - } - - @Override - public Object next() { - Object tag = get(cursor); - cursor++; - return tag; - } - }; - - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java deleted file mode 100644 index 3192984cdc..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java +++ /dev/null @@ -1,65 +0,0 @@ -package main; - -public class BinaryTreeNode { - @SuppressWarnings("rawtypes") - private Comparable data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - @SuppressWarnings("rawtypes") - public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) { - this.data = data; - this.left = left; - this.right = right; - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public BinaryTreeNode insert(Comparable o) { - int result = o.compareTo(data); - if (0 == result) { - return this; - } else if (0 < result) { - if (null == this.right) { - BinaryTreeNode node = new BinaryTreeNode(o, null, null); - this.right = node; - return node; - } - return this.right.insert(o); - } else { - if (null == this.left) { - BinaryTreeNode node = new BinaryTreeNode(o, null, null); - this.left = node; - return node; - } - return this.left.insert(o); - } - - } - - @SuppressWarnings("rawtypes") - public Comparable getData() { - return data; - } - - @SuppressWarnings("rawtypes") - public void setData(Comparable data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java deleted file mode 100644 index 4a052a8646..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package main; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java deleted file mode 100644 index bc142a6b06..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java +++ /dev/null @@ -1,114 +0,0 @@ -package main; - -import utils.ListUtils; - -public class LinkedList implements List { - private Node head; - private int size; - - private static class Node { - private Object data; - private Node next; - } - - @Override - public void add(Object o) { - add(size, o); - } - - @Override - public void add(int index, Object o) { - ListUtils.CheckIndexInRange(0, size, index); - if (0==size) { - head = new Node(); - head.data = o; - size++; - return; - } - if (0 == index) { - Node node = new Node(); - node.data = o; - node.next = head; - head = node; - size++; - return; - } - if (index == size) { - Node node = head; - while (null != node.next) { - node = node.next; - } - Node addNode = new Node(); - addNode.data = o; - node.next = addNode; - size++; - return; - } - Node node = head; - for (int i = 0; i < index - 1; i++) { - node = node.next; - } - Node addNode = new Node(); - addNode.data = o; - addNode.next = node.next; - node.next = addNode; - size++; - } - - @Override - public Object remove(int index) { - ListUtils.CheckIndexInRange(0, size - 1, index); - Node node = head; - if (0 == index) { - head = head.next; - size--; - return node.data; - } - for (int i = 0; i < index - 1; i++) { - node = node.next; - } - Node removeNode = node.next; - node.next = removeNode.next; - size--; - return removeNode.data; - } - - @Override - public Object get(int index) { - ListUtils.CheckIndexInRange(0, size - 1, index); - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node.data; - } - - @Override - public int size() { - return size; - } - - public Iterator iterator() { - return new Iterator() { - private int cursor; - - @Override - public boolean hasNext() { - if (size > 0) { - return cursor < size; - } else { - return false; - } - - } - - @Override - public Object next() { - Object tag = get(cursor); - cursor++; - return tag; - } - }; - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java deleted file mode 100644 index f5825a0ea6..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package main; - -public interface List { - public void add(Object o); - public void add(int index,Object o); - public Object remove(int index); - public Object get(int index); - public int size(); -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java deleted file mode 100644 index 76d80e419c..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java +++ /dev/null @@ -1,22 +0,0 @@ -package main; - -public class Queue { - private LinkedList list = new LinkedList(); - - public void enQueue(Object o) { - list.add(o); - } - - public Object deQueue() { - return list.remove(0); - } - - public boolean isEmpty() { - return list.size() == 0; - } - - public int size() { - return list.size(); - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java deleted file mode 100644 index bd489f7a98..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package main; - -public class Stack { - private ArrayList list = new ArrayList(); - - public void push(Object o) { - list.add(o); - } - - public Object pop() { - return list.remove(list.size() - 1); - } - - public Object peek() { - return list.get(list.size() - 1); - } - - public boolean isEmpty() { - return list.size() == 0; - } - - public int size() { - return list.size(); - } -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java deleted file mode 100644 index dc958d5731..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java +++ /dev/null @@ -1,144 +0,0 @@ -package test; - - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - - -import main.ArrayList; -import main.Iterator; - -public class ArrayListTest { - ArrayList list; - - @Before - public void init() { - list = new ArrayList(); - } - - @Test - public void testAddObject() { - list.add(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - list.add(6); - list.add(7); - list.add(8); - list.add(9); - list.add(10); - assertEquals(0, list.get(0)); - assertEquals(1, list.get(1)); - assertEquals(2, list.get(2)); - - } - - @Test - public void testAddIntObject() { - list.add("b"); - list.add("d"); - list.add("e"); - list.add(0, "a"); - list.add(2, "c"); - list.add(5, "f"); - assertEquals("a", list.get(0)); - assertEquals("c", list.get(2)); - assertEquals("f", list.get(5)); - try { - list.add(-1, "hh"); - fail("-1 cann't be index"); - } catch (Exception e) { - } - - try { - list.add(7, "xx"); - fail("index should <=size"); - } catch (Exception e) { - } - - } - - @Test - public void testRemove() { - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - assertEquals("d", list.remove(3)); - assertEquals("a", list.remove(0)); - assertEquals("c", list.remove(1)); - try { - list.remove(-1); - fail("-1 cann't be index"); - } catch (Exception e) { - } - - try { - list.remove(1); - fail("index should <=size"); - } catch (Exception e) { - } - - } - - @Test - public void testGet() { - - list.add("a"); - assertEquals("a", list.get(0)); - - try { - list.get(-1); - fail("-1 cann't be index"); - } catch (Exception e) { - } - - try { - list.get(1); - fail("index should <=size"); - } catch (Exception e) { - } - - } - - @Test - public void testSize() { - list.add("a"); - assertEquals(1, list.size()); - list.remove(0); - assertEquals(0, list.size()); - } - - @Test - public void testIterator() { - Iterator i = list.iterator(); - assertEquals(0, list.size()); - assertFalse(i.hasNext()); - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - i = list.iterator(); - assertTrue(i.hasNext()); - assertEquals("a", i.next()); - assertTrue(i.hasNext()); - assertEquals("b", i.next()); - assertTrue(i.hasNext()); - assertEquals("c", i.next()); - assertTrue(i.hasNext()); - assertEquals("d", i.next()); - assertFalse(i.hasNext()); - - try { - i.next(); - fail("index should <=size"); - } catch (Exception e) { - } - - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java deleted file mode 100644 index b52f06d70d..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import main.BinaryTreeNode; - -public class BinaryTreeNodeTest { - - @Test - public void testInsert() { - BinaryTreeNode node = new BinaryTreeNode(5, null,null); - node.insert(2); - node.insert(7); - node.insert(7); - node.insert(1); - node.insert(6); - node.insert(4); - node.insert(8); - assertEquals(8, node.getRight().getRight().getData()); - assertEquals(4, node.getLeft().getRight().getData()); - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java deleted file mode 100644 index 56f6b0bad9..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import main.Iterator; -import main.LinkedList; - -public class LinkedListTest { - private LinkedList list; - - @Before - public void init(){ - list = new LinkedList(); - } - - @Test - public void testAddObject() { - list.add(0); - list.add(1); - list.add(2); - assertEquals(0, list.get(0)); - assertEquals(1, list.get(1)); - assertEquals(2, list.get(2)); - } - - @Test - public void testAddIntObject() { - list.add("b"); - list.add("d"); - list.add("e"); - list.add(0, "a"); - list.add(2, "c"); - list.add(5, "f"); - assertEquals("a", list.get(0)); - assertEquals("c", list.get(2)); - assertEquals("f", list.get(5)); - try { - list.add(-1, "hh"); - fail("-1 cann't be index"); - } catch (Exception e) { - } - - try { - list.add(7, "xx"); - fail("index should <=size"); - } catch (Exception e) {} - } - - @Test - public void testRemove() { - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - assertEquals("d", list.remove(3)); - assertEquals("a", list.remove(0)); - assertEquals("c", list.remove(1)); - try { - list.remove(-1); - fail("-1 cann't be index"); - } catch (Exception e) { - } - - try { - list.remove(1); - fail("index should <=size"); - } catch (Exception e) { - } - - } - - @Test - public void testGet() { - - list.add("a"); - assertEquals("a", list.get(0)); - - try { - list.get(-1); - fail("-1 cann't be index"); - } catch (Exception e) { - } - - try { - list.get(1); - fail("index should <=size"); - } catch (Exception e) { - } - } - - @Test - public void testSize() { - list.add("a"); - assertEquals(1, list.size()); - list.remove(0); - assertEquals(0, list.size()); - } - - @Test - public void testIterator() { - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - Iterator i = list.iterator(); - assertTrue(i.hasNext()); - assertEquals("a", i.next()); - assertTrue(i.hasNext()); - assertEquals("b", i.next()); - assertTrue(i.hasNext()); - assertEquals("c", i.next()); - assertTrue(i.hasNext()); - assertEquals("d", i.next()); - assertFalse(i.hasNext()); - - try { - i.next(); - fail("index should <=size"); - } catch (Exception e) { - } - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java deleted file mode 100644 index ca085df0c8..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import main.Queue; - -public class QueueTest { - private Queue queue; - - @Before - public void init(){ - queue = new Queue(); - } - - @Test - public void testEnQueue() { - } - - @Test - public void testDeQueue() { - try{ - queue.deQueue(); - fail("empty queue hasn't element"); - }catch (Exception e) { - } - queue.enQueue("a"); - queue.enQueue("b"); - assertEquals("a", queue.deQueue()); - assertEquals("b", queue.deQueue()); - } - - @Test - public void testIsEmpty() { - assertTrue(queue.isEmpty()); - queue.enQueue("a"); - assertFalse(queue.isEmpty()); - } - - @Test - public void testSize() { - assertEquals(0, queue.size()); - queue.enQueue("a"); - queue.enQueue("a"); - assertEquals(2, queue.size()); - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java deleted file mode 100644 index 00c3d23a5e..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import main.Stack; - -public class StackTest { - private Stack stack; - - @Before - public void init(){ - stack = new Stack(); - } - - @Test - public void testPush() { - stack.push("a"); - assertEquals("a", stack.peek()); - stack.push("b"); - assertEquals("b", stack.peek()); - } - - @Test - public void testPop() { - try{ - stack.pop(); - fail("empty stack hasn't element"); - }catch (Exception e) { - } - stack.push("a"); - stack.push("b"); - stack.push("c"); - assertEquals("c", stack.pop()); - assertEquals("b", stack.pop()); - assertEquals("a", stack.pop()); - } - - @Test - public void testPeek() { - } - - @Test - public void testIsEmpty() { - assertTrue(stack.isEmpty()); - stack.push("a"); - stack.push("b"); - assertFalse(stack.isEmpty()); - stack.pop(); - assertFalse(stack.isEmpty()); - stack.pop(); - assertTrue(stack.isEmpty()); - - - } - - @Test - public void testSize() { - assertEquals(0, stack.size()); - stack.push("a"); - stack.push("b"); - assertEquals(2, stack.size()); - } - -} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java deleted file mode 100644 index 82b62d462c..0000000000 --- a/group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java +++ /dev/null @@ -1,11 +0,0 @@ -package utils; - -public class ListUtils { - public static boolean CheckIndexInRange(int start, int end, int index) { - if (index >= start && index <= end) { - return true; - } - throw new IndexOutOfBoundsException(); - } - -} diff --git a/group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java b/group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java deleted file mode 100644 index fd9ff8c8bd..0000000000 --- a/group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java +++ /dev/null @@ -1,209 +0,0 @@ -package main; - -import java.util.Arrays; - -public class ArrayUtil { - /** - * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = - * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * - * @param origin - * @return - */ - public static void reverseArray(int[] origin) { - if (null == origin) { - return; - } - for (int temp = 0, i = 0; i < origin.length / 2; i++) { - temp = origin[i]; - origin[i] = origin[origin.length - i - 1]; - origin[origin.length - i - 1] = temp; - } - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} - * - * @param oldArray - * @param newArray - * @return - */ - - public static int[] removeZero(int[] oldArray) { - if (null == oldArray) { - return null; - } - int counter = 0; - int[] newArray = new int[oldArray.length]; - for (int i = 0; i < oldArray.length; i++) { - if (oldArray[i] != 0) { - newArray[counter++] = oldArray[i]; - } - } - return Arrays.copyOf(newArray, counter); - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = - * [3, 5, 7,8] a2 = [4, 5,6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * - * @param array1 - * @param array2 - * @return - */ - - public static int[] merge(int[] array1, int[] array2) { - if (null == array1) { - return array2; - } - if (null == array2) { - return array1; - } - if (0 == array1.length && 0 == array2.length) { - return new int[0]; - } - Arrays.sort(array1); - Arrays.sort(array2); - int[] array = new int[array1.length + array2.length]; - System.arraycopy(array1, 0, array, 0, array1.length); - System.arraycopy(array2, 0, array, array1.length, array2.length); - int counter = 0; - for (int i = 0; i < array.length - 1 - counter; i++) { - for (int j = i + 1; j < array.length - counter; j++) { - if (array[i] == array[j]) { - int k = 0; - for (k = i; k < array.length - 1; k++) { - array[k] = array[k + 1]; - } - i--; - counter++; - break; - } - } - } - array = Arrays.copyOf(array, array.length - counter); - Arrays.sort(array); - return array; - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * - * @param oldArray - * @param size - * @return - */ - public static int[] grow(int[] oldArray, int size) { - if (null == oldArray) { - return null; - } - int[] array = new int[oldArray.length + size]; - for (int i = 0; i < oldArray.length; i++) { - array[i] = oldArray[i]; - } - return array; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , - * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] - * - * @param max - * @return - */ - public static int[] fibonacci(int max) { - if (max <= 1) { - return new int[0]; - } - int[] array = new int[max]; - array[0] = 1; - array[1] = 1; - int i = 1; - do { - i++; - array[i] = array[i - 1] + array[i - 2]; - } while (array[i] < max); - return Arrays.copyOf(array, i); - } - - /** - * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * - * @param max - * @return - */ - public static int[] getPrimes(int max) { - if (max < 3) { - return new int[0]; - } - int[] array = new int[max]; - int counter = 0; - for (int i = 2; i < max; i++) { - int j = 2; - for (; j * j <= i; j++) { - if (i % j == 0) { - break; - } - } - if (j * j > i) { - array[counter] = i; - counter++; - } - } - return Arrays.copyOf(array, counter); - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * - * @param max - * @return - */ - public static int[] getPerfectNumbers(int max) { - if (max < 7) { - return new int[0]; - } - int[] array = new int[2]; - int counter = 0; - for (int i = 6; i < max; i++) { - int sum = 0; - for (int j = 1; j <= i / 2; j++) { - if (i % j == 0) { - sum = sum + j; - } - } - if (sum == i) { - if (counter == array.length) { - array = ArrayUtil.grow(array, 2); - } - array[counter++] = i; - } - } - return Arrays.copyOf(array, counter); - } - - /** - * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" - * - * @param array - * @param s - * @return - */ - public static String join(int[] array, String seperator) { - if (null == array) { - return null; - } - if (array.length == 0) { - return ""; - } - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < array.length; i++) { - sb.append(seperator).append(array[i]); - } - return sb.toString().substring(seperator.length()); - } - -} diff --git a/group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java b/group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java deleted file mode 100644 index 103d34daff..0000000000 --- a/group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import main.ArrayUtil; - -public class ArrayUtilTest { - @Test - public void testReverseArray() { - int[] origin = null; - ArrayUtil.reverseArray(origin); - assertEquals(null, origin); - - int[] origin1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; - ArrayUtil.reverseArray(origin1); - int[] expected1 = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; - for (int i = 0; i < 4; i++) { - assertEquals(expected1[i], origin1[i]); - } - - int[] origin2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; - ArrayUtil.reverseArray(origin2); - int[] expected2 = { 8, 7, 6, 5, 4, 3, 2, 1, 0 }; - for (int i = 0; i < 4; i++) { - assertEquals(expected2[i], origin2[i]); - } - } - - @Test - public void testRemoveZero() { - int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; - int excepted[] = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }; - oldArr = ArrayUtil.removeZero(oldArr); - System.out.println(oldArr.length); - for (int i = 0; i < oldArr.length; i++) { - assertEquals(excepted[i], oldArr[i]); - } - } - - @Test - public void testMerge() { - int[] array1 = { 3, 4, 4, 5, 7, 8 }; - int[] array2 = { 4, 5, 6, 7 }; - int[] expected = { 3, 4, 5, 6, 7, 8 }; - int[] array = ArrayUtil.merge(array1, array2); - for (int i = 0; i < array.length; i++) { - assertEquals(expected[i], array[i]); - } - } - - @Test - public void testGrow() { - int[] oldArray = { 2, 3, 6 }; - int[] array = ArrayUtil.grow(oldArray, 3); - int[] expected = { 2, 3, 6, 0, 0, 0 }; - for (int i = 0; i < array.length; i++) { - assertEquals(expected[i], array[i]); - } - } - - @Test - public void testFibonacci() { - int[] fibonacci = ArrayUtil.fibonacci(1); - assertEquals(0, fibonacci.length); - - int[] fibonacci1 = ArrayUtil.fibonacci(16); - int[] excepted1 = { 1, 1, 2, 3, 5, 8, 13, 15 }; - for (int i = 0; i < fibonacci1.length; i++) { - assertEquals(excepted1[i], fibonacci1[i]); - } - } - - @Test - public void testGetPrimes() { - int[] primes = ArrayUtil.getPrimes(23); - int[] excepted = { 2, 3, 5, 7, 11, 13, 17, 19 }; - for (int i = 0; i < primes.length; i++) { - assertEquals(excepted[i], primes[i]); - } - } - - @Test - public void testGetPerfectNumbers() { - int[] PerfectNumbers = ArrayUtil.getPerfectNumbers(497); - int[] excepted = { 6, 28, 496 }; - for (int i = 0; i < PerfectNumbers.length; i++) { - assertEquals(excepted[i], PerfectNumbers[i]); - } - } - - @Test - public void testJoin() { - int[] array1 = { 3 }; - assertEquals("3", ArrayUtil.join(array1, "-%")); - int[] array2 = { 3, 8, 9, 7 }; - assertEquals("3-%8-%9-%7", ArrayUtil.join(array2, "-%")); - } - -} diff --git a/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java deleted file mode 100644 index 4a052a8646..0000000000 --- a/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package main; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java deleted file mode 100644 index 7242de720f..0000000000 --- a/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java +++ /dev/null @@ -1,256 +0,0 @@ -package main; - -import java.util.Arrays; - -import utils.ListUtils; - -public class LinkedList implements List{ - private Node head; - private int size; - - private static class Node { - private Object data; - private Node next; - } - - @Override - public void add(Object o) { - add(size, o); - } - - @Override - public void add(int index, Object o) { - ListUtils.CheckIndexInRange(0, size, index); - if (0==size) { - head = new Node(); - head.data = o; - size++; - return; - } - if (0 == index) { - Node node = new Node(); - node.data = o; - node.next = head; - head = node; - size++; - return; - } - if (index == size) { - Node node = head; - while (null != node.next) { - node = node.next; - } - Node addNode = new Node(); - addNode.data = o; - node.next = addNode; - size++; - return; - } - Node node = head; - for (int i = 0; i < index - 1; i++) { - node = node.next; - } - Node addNode = new Node(); - addNode.data = o; - addNode.next = node.next; - node.next = addNode; - size++; - } - - @Override - public Object remove(int index) { - if(size == 0){ - return null; - } - ListUtils.CheckIndexInRange(0, size - 1, index); - Node node = head; - if (0 == index) { - head = head.next; - size--; - return node.data; - } - for (int i = 0; i < index - 1; i++) { - node = node.next; - } - Node removeNode = node.next; - node.next = removeNode.next; - size--; - return removeNode.data; - } - - @Override - public Object get(int index) { - ListUtils.CheckIndexInRange(0, size - 1, index); - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node.data; - } - - @Override - public int size() { - return size; - } - - public Iterator iterator() { - return new Iterator() { - private int cursor; - - @Override - public boolean hasNext() { - if (size > 0) { - return cursor < size; - } else { - return false; - } - - } - - @Override - public Object next() { - Object tag = get(cursor); - cursor++; - return tag; - } - }; - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - if(this.size == 0){ - return; - } - LinkedList list = new LinkedList(); - for(int i =this.size-1;i>=0;i--){ - list.add(this.get(i)); - } - this.head = list.head; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - */ - public void removeFirstHalf(){ - int end = size/2; - for(int i=0;isize){ - return; - } - for(int j =0;j101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - if(null==list||list.size==0){ - return new int[0]; - } - int[] result = new int[list.size]; - int counter = 0; - for(int i=0;imax){ - return; - } - for(int i=0;imin&&(int)get(i)= start && index <= end) { - return true; - } - throw new IndexOutOfBoundsException(); - } - -} diff --git a/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java b/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java deleted file mode 100644 index b9e7bc9c79..0000000000 --- a/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java +++ /dev/null @@ -1,117 +0,0 @@ -package main; - -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.capacity = capacity; - this.currentSize = 0; - } - - /** - * 获取缓存中的对象 - * - * @param pageNum - */ - public void access(int pageNum) { - if (first == null && last == null) { - first = new Node(); - first.pageNum = pageNum; - last = first; - currentSize++; - return; - } - Node tagNode = find(pageNum); - if (tagNode != null) { - moveExistingNodeToHead(tagNode); - return; - } - Node node = new Node(); - node.pageNum = pageNum; - addNewNodeToHead(node); - - } - - private void addNewNodeToHead(Node node) { - if (currentSize == capacity) { - removeLast(); - } - Node temp = first; - temp.prev = node; - node.next = temp; - first = node; - 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 temp = last.prev; - temp.next = null; - last = temp; - currentSize--; - } - - /** - * 移动到表头,表示这个节点是最新使用过的 - */ - private void moveExistingNodeToHead(Node node) { - if (node.prev == null) { - return; - } - Node prev = node.prev; - Node next = node.next; - if (next == null) { - last = prev; - } - prev.next = next; - if (next != null) { - next.prev = prev; - } - Node temp = first; - temp.prev = node; - node.prev = null; - node.next = temp; - first = node; - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - Node node = first; - while (node != null) { - sb.append(node.pageNum); - node = node.next; - if (node != null) { - sb.append(","); - } - } - return sb.toString(); - } - -} diff --git a/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java b/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java deleted file mode 100644 index 02d1461149..0000000000 --- a/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import main.LRUPageFrame; - -public class LRUPageFrameTest { - - @Test - public void testAccess() { - LRUPageFrame pf = new LRUPageFrame(3); - pf.access(7); - pf.access(0); - pf.access(1); - assertEquals("1,0,7", pf.toString()); - pf.access(2); - assertEquals("2,1,0", pf.toString()); - pf.access(0); - assertEquals("0,2,1", pf.toString()); - pf.access(0); - assertEquals("0,2,1", pf.toString()); - pf.access(3); - assertEquals("3,0,2", pf.toString()); - pf.access(0); - assertEquals("0,3,2", pf.toString()); - pf.access(4); - assertEquals("4,0,3", pf.toString()); - pf.access(5); - assertEquals("5,4,0", pf.toString()); - - } - -} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java deleted file mode 100644 index cb3e96bb69..0000000000 --- a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java +++ /dev/null @@ -1,75 +0,0 @@ -package main; - -import java.util.Arrays; - -public class ArrayList{ - private Object[] elementData = new Object[10]; - private int size; - - public void add(Object o) { - add(size, o); - - } - - public void add(int index, Object o) { - // 检查是否越界 - ListUtils.CheckIndexInRange(0, size, index); - if (size == elementData.length) { - elementData = Arrays.copyOf(elementData, elementData.length + 10); - } - if (index < size) { - for (int i = size; i > index; i--) { - elementData[i] = elementData[i - 1]; - } - } - elementData[index] = o; - size++; - } - - public Object remove(int index) { - ListUtils.CheckIndexInRange(0, size - 1, index); - Object tag = elementData[index]; - for (int i = index; i < size - 1; i++) { - elementData[i] = elementData[i + 1]; - } - elementData[size - 1] = null; - size--; - return tag; - - } - - public Object get(int index) { - ListUtils.CheckIndexInRange(0, size - 1, index); - return elementData[index]; - - } - - public int size() { - return size; - } - - public Iterator iterator() { - return new Iterator() { - private int cursor; - - @Override - public boolean hasNext() { - if (size > 0) { - return cursor < size; - } else { - return false; - } - - } - - @Override - public Object next() { - Object tag = get(cursor); - cursor++; - return tag; - } - }; - - } - -} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java deleted file mode 100644 index 4a052a8646..0000000000 --- a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package main; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java deleted file mode 100644 index 1a52071c8b..0000000000 --- a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java +++ /dev/null @@ -1,11 +0,0 @@ -package main; - -public class ListUtils { - public static boolean CheckIndexInRange(int start, int end, int index) { - if (index >= start && index <= end) { - return true; - } - throw new IndexOutOfBoundsException(); - } - -} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java deleted file mode 100644 index bd489f7a98..0000000000 --- a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java +++ /dev/null @@ -1,25 +0,0 @@ -package main; - -public class Stack { - private ArrayList list = new ArrayList(); - - public void push(Object o) { - list.add(o); - } - - public Object pop() { - return list.remove(list.size() - 1); - } - - public Object peek() { - return list.get(list.size() - 1); - } - - public boolean isEmpty() { - return list.size() == 0; - } - - public int size() { - return list.size(); - } -} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java deleted file mode 100644 index 7267563541..0000000000 --- a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java +++ /dev/null @@ -1,110 +0,0 @@ -package main; - -import java.util.Arrays; - -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 stack1 = new Stack(); - while (!s.isEmpty()) { - stack1.push(s.pop()); - } - Stack stack2 = new Stack(); - while (!stack1.isEmpty()) { - stack2.push(stack1.pop()); - } - while (!stack2.isEmpty()) { - s.push(stack2.pop()); - } - - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s, Object o) { - Stack stack = new Stack(); - while (!s.isEmpty()) { - stack.push(s.pop()); - } - while (!stack.isEmpty()) { - Object temp = stack.pop(); - if (!o.equals(temp)) { - s.push(temp); - } - } - - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, - * 可以使用另外一个栈来辅助 - * - * @param len - * @return - */ - public static Object[] getTop(Stack s, int len) { - if (len < 0) { - return new Object[0]; - } - Object[] objArray = new Object[len]; - int i = 0; - for (; i < len; i++) { - if (s.isEmpty()) { - break; - } - objArray[i] = s.pop(); - } - objArray = Arrays.copyOf(objArray, i); - for (int j = objArray.length - 1; j >= 0; j--) { - s.push(objArray[j]); - } - return objArray; - } - - /** - * 字符串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) { - String[] array = s.split(""); - Stack stack = new Stack(); - for (String s1 : array) { - if ("{[()]}".contains(s1)) { - if (!stack.isEmpty()) { - if (")]}".contains(s1)) { - if (s1.replace(")", "(").equals(stack.peek().toString()) - || s1.replace("]", "[").equals(stack.peek().toString()) - || s1.replace("}", "{").equals(stack.peek().toString())) { - stack.pop(); - } else { - return false; - } - } else { - stack.push(s1); - } - } else { - if (")]}".contains(s1)) { - return false; - } - stack.push(s1); - } - } - } - if (stack.isEmpty()) { - return true; - } - return false; - } - -} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java deleted file mode 100644 index d2eb27dad7..0000000000 --- a/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import main.Stack; -import main.StackUtil; - -public class StackUtilTest { - Stack stack; - - @Before - public void setUp() throws Exception { - stack = new Stack(); - } - - @Test - public void testReverse() { - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - StackUtil.reverse(stack); - int[] expected = { 1, 2, 3, 4, 5 }; - for (int i = 0; !stack.isEmpty(); i++) { - assertEquals(expected[i], stack.pop()); - } - } - - @Test - public void testRemove() { - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - StackUtil.remove(stack, 9); - int[] expected = { 5, 4, 3, 2, 1 }; - for (int i = 0; !stack.isEmpty(); i++) { - assertEquals(expected[i], stack.pop()); - } - - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - StackUtil.remove(stack, 3); - int[] expected1 = { 5, 4, 2, 1 }; - for (int i = 0; !stack.isEmpty(); i++) { - assertEquals(expected1[i], stack.pop()); - } - } - - @Test - public void testGetTop() { - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - Object[] result = StackUtil.getTop(stack, 3); - int[] expected = { 5, 4, 3 }; - for (int i = 0; i < result.length; i++) { - assertEquals(expected[i], result[i]); - } - - result = StackUtil.getTop(stack, 9); - int[] expected1 = { 5, 4, 3, 2, 1 }; - for (int i = 0; i < result.length; i++) { - assertEquals(expected1[i], result[i]); - } - - result = StackUtil.getTop(stack, -1); - assertEquals(0, result.length); - } - - @Test - public void testIsValidPairs() { - assertTrue(StackUtil.isValidPairs("12wed333")); - assertTrue(StackUtil.isValidPairs("1{2[3(4)5]6}")); - assertTrue(StackUtil.isValidPairs("{{{[[[((()))]]]}}}")); - assertTrue(StackUtil.isValidPairs("{}[]()([{}])")); - assertFalse(StackUtil.isValidPairs(")abcd{}[]()")); - assertFalse(StackUtil.isValidPairs("a{b[c}d]()")); - assertFalse(StackUtil.isValidPairs("a{b)c}[]{}")); - assertFalse(StackUtil.isValidPairs("{}[](()")); - } - -} diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java b/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java deleted file mode 100644 index 4f48122d92..0000000000 --- a/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java +++ /dev/null @@ -1,36 +0,0 @@ -package main; - -public class LoginAction { - private String name; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute() { - if ("test".equals(name) && "1234".equals(password)) { - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name) { - this.name = name; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getMessage() { - return this.message; - } -} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java b/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java deleted file mode 100644 index 5cd2261413..0000000000 --- a/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java +++ /dev/null @@ -1,71 +0,0 @@ -package main; - -import java.io.File; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.util.Iterator; -import java.util.Map; - -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -public class Struts { - /* - * - * 0. 读取配置文件struts.xml - * - * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , - * "password"="1234") , 那就应该调用 setName和setPassword方法 - * - * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - * - * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 - * {"message": "登录成功"} , 放到View对象的parameters - * - * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 - * - */ - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static View runAction(String actionName, Map parameters) - throws DocumentException, ReflectiveOperationException, SecurityException { - View view = null; - SAXReader reader = new SAXReader(); - Document document = reader.read(new File("./xml/struts.xml")); - Element root = document.getRootElement(); - for (Iterator iterator = (Iterator) root.elementIterator("action"); iterator.hasNext();) { - Element actionElement = (Element) iterator.next(); - String actionElementName = actionElement.attributeValue("name"); - if (actionElementName.equals(actionName)) { - Class c = Class.forName(actionElement.attributeValue("class")); - Constructor con = c.getConstructor(); - Object o = con.newInstance(); - Method setName = c.getMethod("setName", String.class); - setName.invoke(o, parameters.get("name")); - Method setPassword = c.getMethod("setPassword", String.class); - setPassword.invoke(o, parameters.get("password")); - Method execute = c.getMethod("execute"); - String resultStr = execute.invoke(o).toString(); - - for (iterator = actionElement.elementIterator("result"); iterator.hasNext();) { - Element resultElement = (Element) iterator.next(); - if (resultElement.attributeValue("name").equals(resultStr)) { - view = new View(); - parameters.put("name", c.getMethod("getName").invoke(o).toString()); - parameters.put("password", c.getMethod("getPassword").invoke(o).toString()); - parameters.put("message", c.getMethod("getMessage").invoke(o).toString()); - view.setJsp(resultElement.getStringValue()); - view.setParameters(parameters); - } - } - } - - } - return view; - - } - -} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/View.java b/group23/1323434545/work_Other/01_litestruts/src/main/View.java deleted file mode 100644 index 93c37fd966..0000000000 --- a/group23/1323434545/work_Other/01_litestruts/src/main/View.java +++ /dev/null @@ -1,27 +0,0 @@ -package main; - -import java.util.Map; - -@SuppressWarnings("rawtypes") -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - - public Map getParameters() { - return parameters; - } - - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java b/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java deleted file mode 100644 index 836897b221..0000000000 --- a/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package test; - -import java.util.HashMap; -import java.util.Map; - -import org.dom4j.DocumentException; -import org.junit.Assert; -import org.junit.Test; - -import main.Struts; -import main.View; - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name", "test"); - params.put("password", "1234"); - View view = null; - try { - view = Struts.runAction(actionName, params); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (DocumentException e) { - e.printStackTrace(); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name", "tes"); - params.put("password", "1234"); - View view = null; - try { - view = Struts.runAction(actionName, params); - } catch (SecurityException e) { - e.printStackTrace(); - } catch (DocumentException e) { - e.printStackTrace(); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); - } - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } - -} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/Connection.java b/group23/1323434545/work_Other/02_downloader/src/api/Connection.java deleted file mode 100644 index 5b41847037..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java deleted file mode 100644 index 8840863aba..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java +++ /dev/null @@ -1,6 +0,0 @@ -package api; - -@SuppressWarnings("serial") -public class ConnectionException extends Exception{ - -} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java deleted file mode 100644 index 4f297a48ef..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java b/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java deleted file mode 100644 index e652867321..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java deleted file mode 100644 index 0764117f5b..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package impl; - -import java.io.BufferedInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - -import api.Connection; - -public class ConnectionImpl implements Connection{ - private HttpURLConnection huConn; - - - public ConnectionImpl(String url) { - try { - huConn = (HttpURLConnection) new URL(url).openConnection(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - huConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); - ByteArrayOutputStream os = new ByteArrayOutputStream(); - BufferedInputStream bis = new BufferedInputStream(huConn.getInputStream()); - int len =0; - byte[] bytes = new byte[1024]; - while((len=bis.read(bytes))!=-1){ - os.write(bytes, 0, len); - } - os.flush(); - return os.toByteArray(); - } - - @Override - public int getContentLength() { - return huConn.getContentLength(); - } - - @Override - public void close() { - if(null!=huConn){ - huConn.disconnect(); - } - - } - -} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java deleted file mode 100644 index a24b3b800b..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package impl; - - - -import api.Connection; -import api.ConnectionManager; - -public class ConnectionManagerImpl implements ConnectionManager { - - @Override - public Connection open(String url) { - return new ConnectionImpl(url); - } - -} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java b/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java deleted file mode 100644 index 84b17f6c9d..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java +++ /dev/null @@ -1,50 +0,0 @@ -package main; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.concurrent.CyclicBarrier; - -import api.Connection; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - File saveLocation; - CyclicBarrier barrier; - - public DownloadThread( Connection conn, int startPos, int endPos,File saveLocation,CyclicBarrier barrier){ - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - this.saveLocation = saveLocation; - this.barrier = barrier; - } - - @Override - public void run() { - RandomAccessFile rf = null; - try { - rf = new RandomAccessFile(saveLocation,"rw"); - rf.seek(startPos); - rf.write(conn.read(startPos, endPos)); - barrier.await(); - }catch (Exception e) { - e.printStackTrace(); - }finally { - if(null!=rf){ - try { - rf.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if(null!=conn){ - conn.close(); - } - - } - } -} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java b/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java deleted file mode 100644 index 8febebeada..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java +++ /dev/null @@ -1,73 +0,0 @@ -package main; - -import java.io.File; -import java.util.concurrent.CyclicBarrier; -import api.ConnectionException; -import api.ConnectionManager; -import api.DownloadListener; -import impl.ConnectionManagerImpl; - -public class FileDownloader { - - String url; - File saveLocation; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String url,File saveLocation) { - this.url = url; - this.saveLocation = saveLocation; - } - - - public void execute() throws ConnectionException{ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - - cm = new ConnectionManagerImpl(); - int length = cm.open(this.url).getContentLength(); - System.out.println("文件长度:"+length); - long time = System.currentTimeMillis(); - CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() { - @Override - public void run() { - listener.notifyFinished(); - System.out.println("耗时:"+(System.currentTimeMillis()-time)/1000+"秒"); - } - }); - - new DownloadThread(cm.open(this.url),0,length/3-1,saveLocation,barrier).start(); - new DownloadThread(cm.open(this.url),length/3,length*2/3-1,saveLocation,barrier).start(); - new DownloadThread(cm.open(this.url),length*2/3,length-1,saveLocation,barrier).start(); - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - - -} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java b/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java deleted file mode 100644 index 220c23d57e..0000000000 --- a/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package test; - -import java.io.File; - -import api.ConnectionException; -import api.DownloadListener; -import main.FileDownloader; - -public class DownloaderTest { - public static void main(String[] args) throws ConnectionException { - FileDownloader fd = new FileDownloader("http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.13/bin/apache-tomcat-8.5.13.exe",new File("E:\\tomcat.exe")); - fd.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - System.out.println("下载完了!"); - } - }); - fd.execute(); - } - -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java deleted file mode 100644 index 53fec62e67..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.xiaol.study; - -/** - * @Description TODO - * @date 创建时间:2017年3月4日 下午11:03:26 - */ -public class ArrayList implements List { - - // 记录有多少元素 - private int size = 0; - - // 存放元素的数组 - private Object[] elementData = new Object[10]; - - // 添加元素 - public void add(Object o) { - checkSizeAndGrow(); - elementData[size++] = o; - } - - // 检查数组容量大小,不足就扩容 - private void checkSizeAndGrow() { - if (size >= elementData.length) { - Object[] oldData = elementData; - elementData = new Object[size * 2]; - System.arraycopy(oldData, 0, elementData, 0, size); - } - } - - // 在指定位置添加元素 - public void add(int index, Object o) { - checkIndex(index); - checkSizeAndGrow(); - // 把index位置的元素往后移一位 - System.arraycopy(elementData, index, elementData, index + 1, size - index); - elementData[index] = o; - size++; - } - - // 检查插入元素的位置是否非法 - private void checkIndex(int index) { - if (index < 0 || index > size) { - throw new RuntimeException("参数非法"); - } - } - - // 获取指定位置元素 - public Object get(int index) { - checkIndex(index); - return elementData[index]; - } - - // 移除指定位置元素 - public Object remove(int index) { - checkIndex(index); - Object returnVal = elementData[index]; - System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); - size--; - return returnVal; - } - - // 获取ArrayList元素数量 - public int size() { - return size; - } - - // 获取迭代器 - public Iterator iterator() { - return new ArrayListIterator(); - } - - // 尽量实现迭代器 - private class ArrayListIterator implements Iterator { - - ArrayList list = null; - - @Override - public boolean hasNext() { - - return false; - } - - @Override - public Object next() { - return null; - } - - public Object remove() { - return null; - } - - } - -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java deleted file mode 100644 index fc54a78e47..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.xiaol.study; - -import static org.junit.Assert.assertEquals; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class ArrayListTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testAddObject() { - ArrayList list = new ArrayList(); - list.add("a"); - list.add("b"); - list.add("c"); - list.add("d"); - list.add("e"); - list.add("f"); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - list.add(6); - assertEquals(12, list.size()); - } - - @Test - public void testAddIntObject() { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(0, 3); - assertEquals(3, list.get(0)); - assertEquals(1, list.get(1)); - assertEquals(2, list.get(2)); - assertEquals(3, list.size()); - } - - @Test - public void testGet() { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(0, 3); - assertEquals(3, list.get(0)); - assertEquals(1, list.get(1)); - assertEquals(2, list.get(2)); - assertEquals(3, list.size()); - } - - @Test - public void testRemove() { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(0, 3); - assertEquals(3, list.remove(0)); - assertEquals(1, list.remove(0)); - assertEquals(2, list.remove(0)); - assertEquals(0, list.size()); - } - - @Test - public void testSize() { - ArrayList list = new ArrayList(); - list.add(1); - list.add(2); - list.add(0, 3); - assertEquals(3, list.size()); - } - -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java deleted file mode 100644 index 7572a945df..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.xiaol.study; - -/** - * @Description TODO - * @date 创建时间:2017年3月5日 上午12:57:18 - */ -public class BinaryTreeNode { - // 要求,左节点比父节点小,右节点比父节点大 - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode insert(Object o) { - // 当前没有数据就放入当前节点 - if (data == null) { - this.data = o; - } else if ((int) data >= (int) o) {// 放入左节点 - if (left == null) { - left = new BinaryTreeNode(); - left.setData(o); - } else { - left.insert(o); - } - } else if ((int) data < (int) o) {// 放入右节点 - if (right == null) { - right = new BinaryTreeNode(); - right.setData(o); - } else { - right.insert(o); - } - } - return this; - } - - public Object getData() { - return data; - } - - public void setData(Object data) { - this.data = data; - } - - public BinaryTreeNode getLeft() { - return left; - } - - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - - public BinaryTreeNode getRight() { - return right; - } - - public void setRight(BinaryTreeNode right) { - this.right = right; - } - -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java deleted file mode 100644 index 7e028ac8a5..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.xiaol.study; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class BinaryTreeNodeTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testInsert() { - BinaryTreeNode btn = new BinaryTreeNode(); - btn.insert(1); - btn.insert(2); - btn.insert(0); - btn.insert(3); - assertEquals(0, btn.getLeft().getData()); - assertEquals(1, btn.getData()); - assertEquals(2, btn.getRight().getData()); - assertEquals(3, btn.getRight().getRight().getData()); - } - - @Test - public void testGetData() { - BinaryTreeNode btn = new BinaryTreeNode(); - btn.insert(1); - assertEquals(1, btn.getData()); - } - - @Test - public void testSetData() { - BinaryTreeNode btn = new BinaryTreeNode(); - btn.setData(1); - assertEquals(1, btn.getData()); - } - - @Test - public void testGetLeft() { - BinaryTreeNode btn = new BinaryTreeNode(); - btn.insert(1); - btn.insert(0); - assertEquals(0, btn.getLeft().getData()); - } - - @Test - public void testSetLeft() { - BinaryTreeNode btn = new BinaryTreeNode(); - btn.insert(1); - BinaryTreeNode left = new BinaryTreeNode(); - left.setData(2); - btn.setLeft(left); - assertEquals(2, btn.getLeft().getData()); - } - - @Test - public void testGetRight() { - BinaryTreeNode btn = new BinaryTreeNode(); - btn.insert(1); - btn.insert(2); - assertEquals(2, btn.getRight().getData()); - } - - @Test - public void testSetRight() { - BinaryTreeNode btn = new BinaryTreeNode(); - btn.insert(1); - BinaryTreeNode right = new BinaryTreeNode(); - right.setData(2); - btn.setRight(right); - assertEquals(2, btn.getRight().getData()); - } - -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java b/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java deleted file mode 100644 index 3f9192d422..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.xiaol.study; - -/** - * @Description TODO - * @date 创建时间:2017年3月5日 上午1:12:05 - */ -public interface Iterator { - - public boolean hasNext(); - - public Object next(); -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java deleted file mode 100644 index 2b3104756e..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.xiaol.study; - -/** - * @Description TODO - * @date 创建时间:2017年3月5日 上午12:30:18 - */ -public class LinkedList implements List { - - // 头指针 - private Node head; - - // 最后一个节点 - private Node lastNode; - - // 链表长度 - private int size; - - // 添加元素到最后一个节点 - public void add(Object o) { - if (null == head) { - head = new Node(o); - head.next = null; - lastNode = head; - size++; - } else { - lastNode.next = new Node(o); - lastNode = getLastNode(); - size++; - } - } - - // 获取最后一个节点 - private Node getLastNode() { - Node last = head; - while (last.next != null) { - last = last.next; - } - return last; - } - - // 获取指定位置的Node - private Node getIndexNode(int index) { - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node; - } - - // 添加元素到指定位置 - public void add(int index, Object o) { - checkIndex(index); - if (index == 0) { - // 将head暂存为headNext - Node headNext = head; - // 创建新的head - Node newHead = new Node(o); - head = newHead; - head.next = headNext; - } else { - // 获取第index-1个位置的Node - Node node = getIndexNode(index - 1); - // 暂存index位置的Node - Node nodeNext = node.next; - // 向index位置插入数据 - node.next = new Node(o); - node.next.next = nodeNext; - } - size++; - } - - // 获取指定位置元素 - public Object get(int index) { - checkIndex(index); - Node node = head; - for (int i = 0; i < index; i++) { - node = node.next; - } - return node.data; - } - - private void checkIndex(int index) { - if (index < 0 || index > size) { - throw new RuntimeException("非法参数"); - } - } - - // 移除指定位置元素 - public Object remove(int index) { - checkIndex(index); - Object data = null; - if (index == 0) { - // 新的head - Node newHead = head.next; - // 获取移除元素 - data = head.data; - // 将newHead设为head - head = newHead; - } else { - // 获取第index-1个位置的Node - Node node = getIndexNode(index - 1); - // 获取返回的元素 - data = node.next.data; - // 将index位置从链表删除 - node.next = node.next.next; - } - size--; - return data; - } - - // 获取链表长度 - public int size() { - return size; - } - - // 添加元素到第一个节点 - public void addFirst(Object o) { - add(0, o); - } - - public void addLast(Object o) { - Node lastNode = getLastNode(); - lastNode.next = new Node(o); - size++; - } - - // 移除第一个元素 - public Object removeFirst() { - return remove(0); - } - - // 移除最后一个元素 - public Object removeLast() { - Node lastNode = getLastNode(); - Object data = lastNode.data; - lastNode = null; - size--; - return data; - } - - public Iterator iterator() { - return null; - } - - // 用于存储数据的节点 - private static class Node { - Object data; - Node next; - - // 无参构造 - private Node() { - - } - - // 有参构造 - private Node(Object o) { - this.data = o; - } - } - - //---------------下面的方法暂时先不实现 - // removeDuplicateValues(),removeRange()可以不实现 - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length) { - if (i < 0) { - throw new RuntimeException("非法参数"); - } - Node indexNode = getIndexNode(i); - Node nextNode = getIndexNode(i); - for (int j = 0; j < length; j++) { - nextNode = nextNode.next; - } - indexNode.next = nextNode; - } - - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list) { - int[] retVal = new int[list.size()]; - for (int i = 0; i < list.size(); i++) { - int index = (int) list.get(i); - Node indexNode = getIndexNode(index); - int data = (int) indexNode.data; - retVal[i] = data; - } - return retVal; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java deleted file mode 100644 index f6399c1a1a..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.xiaol.study; - -import static org.junit.Assert.assertEquals; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class LinkedListTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testAddObject() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.add(3); - assertEquals(1, ll.get(0)); - assertEquals(2, ll.get(1)); - assertEquals(3, ll.get(2)); - } - - @Test - public void testAddIntObject() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.add(3); - ll.add(3, 0); - assertEquals(1, ll.get(0)); - assertEquals(2, ll.get(1)); - assertEquals(3, ll.get(2)); - assertEquals(0, ll.get(3)); - assertEquals(4, ll.size()); - } - - @Test - public void testGet() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.add(3); - ll.add(3, 0); - assertEquals(1, ll.get(0)); - assertEquals(2, ll.get(1)); - assertEquals(3, ll.get(2)); - assertEquals(0, ll.get(3)); - assertEquals(4, ll.size()); - } - - @Test - public void testRemove() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.add(3); - ll.add(0, 0); - ll.remove(0); - assertEquals(1, ll.get(0)); - assertEquals(2, ll.get(1)); - assertEquals(3, ll.get(2)); - } - - @Test - public void testSize() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.add(3); - ll.add(0, 0); - assertEquals(4, ll.size()); - } - - @Test - public void testAddFirst() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.addFirst(001); - ll.addFirst(002); - assertEquals(002, ll.get(0)); - assertEquals(001, ll.get(1)); - assertEquals(1, ll.get(2)); - assertEquals(2, ll.get(3)); - } - - @Test - public void testAddLast() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.addLast(001); - ll.addLast(002); - assertEquals(1, ll.get(0)); - assertEquals(2, ll.get(1)); - assertEquals(001, ll.get(2)); - assertEquals(002, ll.get(3)); - } - - @Test - public void testRemoveFirst() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.add(3); - ll.removeFirst(); - ll.removeFirst(); - assertEquals(3, ll.get(0)); - assertEquals(1, ll.size()); - } - - @Test - public void testRemoveLast() { - LinkedList ll = new LinkedList(); - ll.add(1); - ll.add(2); - ll.add(3); - ll.removeLast(); - assertEquals(1, ll.get(0)); - assertEquals(2, ll.get(1)); - assertEquals(2, ll.size()); - } - -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/List.java b/group23/381519422/DataStructure/src/com/xiaol/study/List.java deleted file mode 100644 index 870635c7bb..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/List.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.xiaol.study; - -public interface List { - public void add(Object o); - - public void add(int index, Object o); - - public Object get(int index); - - public Object remove(int index); - - public int size(); -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java b/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java deleted file mode 100644 index 6a18fe5c4e..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.xiaol.study; - -import java.util.LinkedList; - -/** - * @Description TODO - * @date 创建时间:2017年3月5日 上午12:51:34 - */ -public class Queue { - - // 队列 - private LinkedList elementData = new LinkedList(); - // 队列长度 - private int size; - - // 添加元素到队列尾 - public void enQueue(Object o) { - elementData.add(o); - size++; - } - - // 移除队列头的元素 - public Object deQueue() { - Object data = elementData.removeLast(); - size--; - return data; - } - - // 队列是否为空 - public boolean isEmpty() { - if (size == 0) { - return true; - } - return false; - } - - // 队列长度 - public int size() { - return size; - } -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java deleted file mode 100644 index a89e8840ce..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.xiaol.study; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class QueueTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEnQueue() { - Queue q = new Queue(); - assertEquals(0, q.size()); - q.enQueue(1); - q.enQueue(2); - assertEquals(2, q.size()); - } - - @Test - public void testDeQueue() { - Queue q = new Queue(); - assertEquals(0, q.size()); - q.enQueue(1); - q.enQueue(2); - assertEquals(2, q.size()); - q.deQueue(); - q.deQueue(); - assertEquals(0, q.size()); - } - - @Test - public void testIsEmpty() { - Queue q = new Queue(); - assertEquals(true, q.isEmpty()); - q.enQueue(1); - q.enQueue(2); - assertEquals(false, q.isEmpty()); - q.deQueue(); - q.deQueue(); - assertEquals(true, q.isEmpty()); - } - - @Test - public void testSize() { - Queue q = new Queue(); - assertEquals(0, q.size()); - q.enQueue(1); - q.enQueue(2); - assertEquals(2, q.size()); - q.deQueue(); - q.deQueue(); - assertEquals(0, q.size()); - } - -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java b/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java deleted file mode 100644 index 6e1eaf2cf8..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.xiaol.study; - -import java.util.ArrayList; - -/** - * @Description TODO - * @date 创建时间:2017年3月5日 上午12:47:15 - */ -public class Stack { - // 存数据的List - private ArrayList elementData = new ArrayList(); - - // 栈元素数量 - private int size; - - // 压栈 - public void push(Object o) { - elementData.add(o); - size++; - } - - // 弹出栈顶元素 - public Object pop() { - if (size == 0) { - throw new RuntimeException("Stack is Empty"); - } - Object data = elementData.remove(size - 1); - size--; - return data; - } - - // 获取栈顶元素 - public Object peek() { - return elementData.get(size - 1); - } - - // 是否为空 - public boolean isEmpty() { - if (size == 0) { - return true; - } - return false; - } - - // 栈大小 - public int size() { - return size; - } -} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java deleted file mode 100644 index 90eae7470d..0000000000 --- a/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.xiaol.study; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class StackTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testPush() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - assertEquals(3, s.size()); - } - - @Test - public void testPop() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - assertEquals(3, s.pop()); - assertEquals(2, s.pop()); - assertEquals(1, s.pop()); - assertEquals(0, s.size()); - } - - @Test - public void testPeek() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - assertEquals(3, s.peek()); - } - - @Test - public void testIsEmpty() { - Stack s = new Stack(); - assertEquals(true, s.isEmpty()); - s.push(1); - s.push(2); - s.push(3); - assertEquals(false, s.isEmpty()); - } - - @Test - public void testSize() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - assertEquals(3, s.size()); - } - -} diff --git a/group23/381519422/array/.classpath b/group23/381519422/array/.classpath deleted file mode 100644 index 3e0fb272a8..0000000000 --- a/group23/381519422/array/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/group23/381519422/array/.gitignore b/group23/381519422/array/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/group23/381519422/array/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/group23/381519422/array/.project b/group23/381519422/array/.project deleted file mode 100644 index ef3cae8954..0000000000 --- a/group23/381519422/array/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - array - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/group23/381519422/array/src/array/ArrayUtil.java b/group23/381519422/array/src/array/ArrayUtil.java deleted file mode 100644 index cb1d3f49dc..0000000000 --- a/group23/381519422/array/src/array/ArrayUtil.java +++ /dev/null @@ -1,354 +0,0 @@ -package array; - -import java.util.ArrayList; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin) { - if (origin == null || origin.length <= 1) { - return; - } - //第1和第length互换位置,第2和第length-1互换,以此类推 - for (int i = 0; i < origin.length / 2; i++) { - int temp = origin[i]; - origin[i] = origin[origin.length - 1 - i]; - origin[origin.length - 1 - i] = temp; - } - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - public int[] removeZero(int[] oldArray) { - // 判断非法输入 - if (oldArray == null || oldArray.length == 0) { - return null; - } - - // 创建临时数组,长度与原oldArray一样长 - int[] temp = new int[oldArray.length]; - int tempCount = 0; - for (int i = 0; i < oldArray.length; i++) { - // 判断元素是0跳过 - if (oldArray[i] == 0) { - continue; - } else {// 非零放入临时数组,计数器加1 - temp[tempCount++] = oldArray[i]; - } - } - - // 如果计数器与原数组长度一致,直接返回临时数组 - if (tempCount == oldArray.length) { - return temp; - } else {// 否则返回长度为tempCount的数组 - int[] retVal = new int[tempCount]; - System.arraycopy(temp, 0, retVal, 0, tempCount); - return retVal; - } - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - public int[] merge(int[] array1, int[] array2) { - // 创建临时数组,长度为array1+array2的长度 - int[] temp = new int[array1.length + array2.length]; - int index = 0;// temp的下标 - int i = 0;// array1的下标 - int j = 0;// array2的下标 - int count = 0;// temp存放元素的计数器 - - while (true) { - - if (i == array1.length) {// 当array1已经全部添加到temp,就把array2剩余的放入temp - for (int l = j; l < array2.length; l++) { - temp[index++] = array2[l]; - count++; - } - break; - } else if (j == array2.length) {// 当array2已经全部添加到temp,就把array1剩余的放入temp - for (int l = i; l < array1.length; l++) { - temp[index++] = array1[l]; - count++; - } - break; - } - - // 取array1第i和array2第j个元素比较。如果array1[i]的小于array2[j],则array1[i]放入temp - // 同时i++,使得下次为i+1和j个元素比较。 - // 如果array1第i和array2第j个元素相等。则array1[i]放入temp - // 同时i++,j++,使得下次为i+1和j+1个元素比较。 - if (array1[i] < array2[j]) { - temp[index++] = array1[i++]; - count++; - } else if (array1[i] > array2[j]) { - temp[index++] = array2[j++]; - count++; - } else { - temp[index++] = array1[i]; - i++; - j++; - count++; - } - } - - // 如果计数器和temp.length相等,直接返回 - if (count == temp.length) { - return temp; - } else {// 否则创建长度为count的新数组返回 - int[] retVal = new int[count]; - System.arraycopy(temp, 0, retVal, 0, count); - return retVal; - } - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int[] oldArray, int size) { - // 参数校验 - if (size < 0) { - throw new RuntimeException("非法参数"); - } - if (size == 0) { - return oldArray; - } - - // 扩容 - int[] retVal = new int[oldArray.length + size]; - for (int i = 0; i < oldArray.length; i++) { - retVal[i] = oldArray[i]; - } - return retVal; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max) { - // 0直接返回空数组 - if (max == 1) { - return new int[0]; - } - - int retVal = 0;// 每一轮循环的斐波那契数 - int i = 1;// 获取第几个斐波那契数 - ArrayList list = new ArrayList();// 用于暂时保存斐波那契数 - while (retVal < max) {// 获取所有小于max的斐波那契数 - retVal = getFibonacci(i++); - if (retVal < max) { - list.add(retVal); - } else { - break; - } - } - - // 将arraylist转为array - int[] retArray = new int[list.size()]; - for (int j = 0; j < list.size(); j++) { - retArray[j] = list.get(j); - } - return retArray; - } - - /** - * 循环获取第N个斐波那契数 - * @param index - * @return - */ - private int getFibonacci(int index) { - if (index < 1) { - throw new RuntimeException("非法参数"); - } - if (index == 1 || index == 2) { - return 1; - } - - int first = 1; - int second = 1; - int retVal = 0; - for (int i = 3; i <= index; i++) { - retVal = first + second; - first = second; - second = retVal; - } - return retVal; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max) { - // 排除非法参数 - if (max < 0) { - throw new RuntimeException("非法参数"); - } - - // 小于2没有素数 - if (max <= 1) { - return new int[0]; - } - - ArrayList list = new ArrayList(); - // 取出每个数判断是不是素数,是就放入arraylist - for (int i = 2; i < max; i++) { - boolean primes = isPrimes(i); - if (primes) { - list.add(i); - } - } - - int[] retArray = new int[list.size()]; - // 将ArrayList转为数组返回 - for (int i = 0; i < list.size(); i++) { - retArray[i] = list.get(i); - } - return retArray; - } - - /** - * 判断输入的数字是不是素数 - * @param num - * @return - */ - private boolean isPrimes(int num) { - // 排除非法参数 - if (num <= 0) { - throw new RuntimeException("非法参数"); - } - - // 小于2没有素数 - if (num == 1) { - return false; - } - - // 2是素数,但是2%2==0为true,所以单独列出 - if (num == 2) { - return true; - } - - // num依次从2到num的平方根取余数,如果余数为零说明不是素数 - for (int i = 2; i <= Math.sqrt(num); i++) { - if (num % i == 0) { - return false; - } - } - return true; - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) { - if (max < 0) { - throw new RuntimeException("非法参数"); - } - if (max <= 2) { - return new int[0]; - } - - // 获取小于max 的所有完数 - ArrayList list = new ArrayList(); - for (int i = 1; i < max; i++) { - if (isPerfectNumber(i)) { - list.add(i); - } - } - - // 将ArrayList转为array返回 - int[] array = new int[list.size()]; - for (int i = 0; i < list.size(); i++) { - array[i] = list.get(i); - } - return array; - } - - /** - * 判断输入的数是不是完美数 - * @param num - * @return - */ - private boolean isPerfectNumber(int num) { - if (num <= 0) { - throw new RuntimeException("非法参数"); - } - - // 放置num的所有约数 - ArrayList divisorList = new ArrayList(); - for (int i = 1; i < num; i++) { - if (num % i == 0) { - divisorList.add(i); - } - } - - // 所有因数相加是否等于num,是就是完美数 - int count = 0; - for (int i = 0; i < divisorList.size(); i++) { - count += divisorList.get(i); - } - if (count == num) { - return true; - } else { - return false; - } - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator) { - // 检查非法输入 - if (array == null) { - return null; - } - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < array.length; i++) { - if (i == array.length - 1) {// 最后一个元素后面不拼接- - sb.append(array[i]); - } else { - sb.append(array[i]); - sb.append("-"); - } - } - return sb.toString(); - } - - -} \ No newline at end of file diff --git a/group23/381519422/array/src/array/ArrayUtilTest.java b/group23/381519422/array/src/array/ArrayUtilTest.java deleted file mode 100644 index a202afdb20..0000000000 --- a/group23/381519422/array/src/array/ArrayUtilTest.java +++ /dev/null @@ -1,116 +0,0 @@ -package array; - -import static org.junit.Assert.*; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class ArrayUtilTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testReverseArray() { - int[] a = { 7, 9, 30, 3, 4 }; - int[] expecteds = { 4, 3, 30, 9, 7 }; - ArrayUtil util = new ArrayUtil(); - util.reverseArray(a); - assertArrayEquals(expecteds, a); - } - - @Test - public void testRemoveZero() { - int[] oldArr = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; - int[] expecteds = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }; - ArrayUtil util = new ArrayUtil(); - int[] removeZero = util.removeZero(oldArr); - assertArrayEquals(expecteds, removeZero); - } - - @Test - public void testMerge() { - int[] a1 = { 3, 5, 7, 8 }; - int[] a2 = { 4, 5, 6, 7 }; - ArrayUtil util = new ArrayUtil(); - int[] merge = util.merge(a1, a2); - int[] expecteds = { 3, 4, 5, 6, 7, 8 }; - assertArrayEquals(expecteds, merge); - } - - @Test - public void testGrow() { - int[] oldArray = { 2, 3, 6 }; - int size = 3; - int[] expecteds = { 2, 3, 6, 0, 0, 0 }; - ArrayUtil util = new ArrayUtil(); - int[] grow = util.grow(oldArray, size); - assertArrayEquals(expecteds, grow); - } - - @Test - public void testFibonacci() { - int max1 = 15; - int[] expecteds1 = { 1, 1, 2, 3, 5, 8, 13 }; - ArrayUtil util = new ArrayUtil(); - int[] fibonacci1 = util.fibonacci(max1); - assertArrayEquals(expecteds1, fibonacci1); - - int max2 = 1; - int[] expecteds2 = {}; - int[] fibonacci2 = util.fibonacci(max2); - assertArrayEquals(expecteds2, fibonacci2); - } - - @Test - public void testGetPrimes() { - int max1 = 23; - int[] expecteds1 = { 2, 3, 5, 7, 11, 13, 17, 19 }; - ArrayUtil util = new ArrayUtil(); - int[] primes1 = util.getPrimes(max1); - assertArrayEquals(expecteds1, primes1); - - int max2 = 2; - int[] expecteds2 = {}; - int[] primes2 = util.getPrimes(max2); - assertArrayEquals(expecteds2, primes2); - } - - @Test - public void testGetPerfectNumbers() { - int max1 = 2; - int[] expecteds1 = {}; - ArrayUtil util = new ArrayUtil(); - int[] perfectNumbers1 = util.getPerfectNumbers(max1); - assertArrayEquals(expecteds1, perfectNumbers1); - - // 6=1+2+3 - int max2 = 7; - int[] expecteds2 = { 6 }; - int[] perfectNumbers2 = util.getPerfectNumbers(max2); - assertArrayEquals(expecteds2, perfectNumbers2); - - // 28=1+2+4+7+14 - int max3 = 30; - int[] expecteds3 = { 6, 28 }; - int[] perfectNumbers3 = util.getPerfectNumbers(max3); - assertArrayEquals(expecteds3, perfectNumbers3); - } - - @Test - public void testJoin() { - int[] array = { 3, 8, 9 }; - String seperator = "-"; - String expecteds = "3-8-9"; - ArrayUtil util = new ArrayUtil(); - String join = util.join(array, seperator); - assertEquals(expecteds, join); - } - -} diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java deleted file mode 100644 index d1ed7bb700..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.xiaol.download; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.RandomAccessFile; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; - -/** - * 下载DEMO - * @author ShawnLin - */ -public class DownloadDemo { - - public void download(String url) { - URL u; - try { - u = new URL(url); - HttpURLConnection httpURLConnection = (HttpURLConnection) u.openConnection(); - int contentLength = httpURLConnection.getContentLength(); - httpURLConnection.connect(); - InputStream inputStream = httpURLConnection.getInputStream(); - File file = new File(getFileName(url)); - RandomAccessFile raf = new RandomAccessFile(file, "rwd"); - byte[] read = new byte[1024]; - int length = 0; - while ((length = inputStream.read(read)) != -1) { - raf.write(read, 0, length); - } - inputStream.close(); - raf.close(); - System.out.println("下载完毕,位置[" + file.getAbsolutePath() + "]"); - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - - } - - public String getFileName(String path) { - int index = path.lastIndexOf("/"); - return path.substring(index + 1); - } - - public static void main(String[] args) { - DownloadDemo dd = new DownloadDemo(); - String url = "http://ww3.sinaimg.cn/large/729119fdgw1f0nnftw3hij21kw11x4qp.jpg"; - dd.download(url); - } -} diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java deleted file mode 100644 index cc2da86116..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.xiaol.download; - -import java.io.IOException; -import java.io.RandomAccessFile; - -import com.xiaol.download.api.Connection; -import com.xiaol.download.api.DownloadListener; - -public class DownloadThread extends Thread { - - Connection conn; - int startPos; - int endPos; - RandomAccessFile randomAccessFile; - DownloadListener listener; - - public DownloadThread(Connection conn, int startPos, int endPos, RandomAccessFile randomAccessFile) { - this.randomAccessFile = randomAccessFile; - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - - @Override - public void run() { - try { - byte[] read = conn.read(startPos, endPos); - randomAccessFile.seek(startPos); - randomAccessFile.write(read, 0, endPos - startPos); - System.out.println(this.getName() + "完成下载,从" + startPos + "到" + endPos + "共" + (endPos - startPos)); - conn.close(); - FileDownloader.finishCount(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java deleted file mode 100644 index ced422ed96..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.xiaol.download; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; - -import com.xiaol.download.api.Connection; -import com.xiaol.download.api.ConnectionException; -import com.xiaol.download.api.ConnectionManager; -import com.xiaol.download.api.DownloadListener; - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - private static int count = 0; - - public FileDownloader(String _url) { - this.url = _url; - - } - - public void execute() { - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, - // endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, - // 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - // Connection conn = null; - // try { - // - // conn = cm.open(this.url); - // - // int length = conn.getContentLength(); - // - // new DownloadThread(conn,0,length-1).start(); - // - // } catch (ConnectionException e) { - // e.printStackTrace(); - // }finally{ - // if(conn != null){ - // conn.close(); - // } - // } - - Connection conn = null; - try { - - File file = new File(getFileName(url)); - RandomAccessFile raf = new RandomAccessFile(file, "rwd"); - System.out.println("文件下载位置:[" + file.getAbsolutePath() + "]"); - int threadNum = 3; - conn = cm.open(this.url); - int length = conn.getContentLength(); - int avg = length / threadNum; - for (int i = 0; i < threadNum; i++) { - Connection cTemp = cm.open(this.url); - int start = i * avg; - int end = start + avg - 1; - if (i == threadNum - 1) { - end = length - 1; - } - new DownloadThread(cTemp, start, end, raf).start(); - } - - while (true) { - if (threadNum == getFinishCount()) { - listener.notifyFinished(); - try { - raf.close(); - } catch (IOException e) { - e.printStackTrace(); - } - break; - } - } - } catch (ConnectionException e) { - e.printStackTrace(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } finally { - if (conn != null) { - conn.close(); - } - } - - } - - /** - * 获取文件名 - * - * @param path - * @return - */ - public String getFileName(String path) { - int index = path.lastIndexOf("/"); - return path.substring(index + 1); - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - public void setConnectionManager(ConnectionManager ucm) { - this.cm = ucm; - } - - public DownloadListener getListener() { - return this.listener; - } - - public static void finishCount() { - count++; - } - - public int getFinishCount() { - return count; - } -} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java deleted file mode 100644 index 3656f4a7da..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.xiaol.download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.xiaol.download.api.ConnectionManager; -import com.xiaol.download.api.DownloadListener; -import com.xiaol.download.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - -// String url = "http://localhost:8080/test.jpg"; - String url = "http://ww3.sinaimg.cn/large/729119fdgw1f0nnftw3hij21kw11x4qp.jpg"; - - FileDownloader downloader = new FileDownloader(url); - - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); - - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java deleted file mode 100644 index 425fe784a7..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.xiaol.download.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java deleted file mode 100644 index 83cbd33c7e..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.xiaol.download.api; - -public class ConnectionException extends Exception { - -} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java deleted file mode 100644 index fcd90b77da..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.xiaol.download.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java deleted file mode 100644 index 549a36e478..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.xiaol.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java deleted file mode 100644 index 8f19cb40e8..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.xiaol.download.impl; - -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; - -import com.xiaol.download.api.Connection; - -public class ConnectionImpl implements Connection { - - private HttpURLConnection httpURLConnection; - - public ConnectionImpl(String url) { - try { - this.httpURLConnection = (HttpURLConnection) new URL(url).openConnection(); - } catch (MalformedURLException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - httpURLConnection.setRequestMethod("GET"); - httpURLConnection.setConnectTimeout(5000); - httpURLConnection.setReadTimeout(5000); - httpURLConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); - httpURLConnection.connect(); - List list = new ArrayList<>(); - byte[] byteArray = null; - byte[] read = new byte[1024]; - int length = 0; - if (httpURLConnection.getResponseCode() == 206) { - InputStream inputStream = httpURLConnection.getInputStream(); - byteArray = new byte[endPos - startPos + 1]; - while ((length = inputStream.read(byteArray)) != -1) { - - } - inputStream.close(); - } - close(); - return byteArray; - } - - @Override - public int getContentLength() { - return httpURLConnection.getContentLength(); - } - - @Override - public void close() { - httpURLConnection.disconnect(); - } - -} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java deleted file mode 100644 index 77fc547e6e..0000000000 --- a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.xiaol.download.impl; - -import com.xiaol.download.api.Connection; -import com.xiaol.download.api.ConnectionException; -import com.xiaol.download.api.ConnectionManager; - -public class ConnectionManagerImpl implements ConnectionManager { - - @Override - public Connection open(String url) throws ConnectionException { - Connection connection = new ConnectionImpl(url); - return connection; - } - -} \ No newline at end of file diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java deleted file mode 100644 index d31d404165..0000000000 --- a/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.xiaol.study; - -public class LoginAction { - private String name; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute() { - if ("test".equals(name) && "1234".equals(password)) { - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name) { - this.name = name; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getMessage() { - return this.message; - } -} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java deleted file mode 100644 index 5adabb38ad..0000000000 --- a/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.xiaol.study; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import javax.management.RuntimeErrorException; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - - - -public class Struts { - - // 每一个action的信息存放到一个Map里 - // 所有的Map放到rootMap方便统一管理 - private static HashMap> rootMap = new HashMap>(); - - public static View runAction(String actionName, Map parameters) { - View view = new View(); - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - try { - // 1、初始化读取配置文件 - init(); - - // 2、获取根据参数获取对应的class的名字 - Map actionMap = rootMap.get(actionName); - String className = actionMap.get("class"); - // 3、根据名字获取Class对象 - Class clazzType = Class.forName(className); - // 4、通过无参构造获取一个对象 - Object newInstance = clazzType.getConstructor(new Class[] {}).newInstance(new Object[] {}); - // 5、调用set方法,把("name"="test" , "password"="1234")值set进去 - Set> entrySet = parameters.entrySet(); - Iterator> iterator = entrySet.iterator(); - while (iterator.hasNext()) { - Entry next = iterator.next(); - String key = next.getKey(); - String value = next.getValue(); - String setMethodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); - Field declaredField = clazzType.getDeclaredField(key); - Method setMehtod = clazzType.getDeclaredMethod(setMethodName, new Class[] { declaredField.getType() }); - setMehtod.invoke(newInstance, value); - } - // 6、执行execute方法 - String executeMethodName = "execute"; - Method executeMethod = clazzType.getDeclaredMethod(executeMethodName); - Object resultString = (String) executeMethod.invoke(newInstance); - - // 7、通过反射获取message信息 - String getMethodName = "getMessage"; - Field declaredField = clazzType.getDeclaredField("message"); - Method getMehtod = clazzType.getDeclaredMethod(getMethodName); - String message = (String) getMehtod.invoke(newInstance); - - // 8\ - String jsp = actionMap.get(resultString); - view.setJsp(jsp); - Map hashMap = new HashMap<>(); - hashMap.put("message", message); - view.setParameters(hashMap); - } catch (Exception e) { - e.printStackTrace(); - throw new ExceptionInInitializerError(); - } - return view; - } - - public static void init() throws Exception { - - // 1、获取工厂实例 - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - // 2、获取dom解析器 - DocumentBuilder db = dbf.newDocumentBuilder(); - // 3、解析xml文档,获取document对象(根节点) - // 也可以获取流使用db.parse(InputStream) - // InputStream is = - // this.getClass().getResourceAsStream("D:\\GitHub\\coding2017\\group23\\381519422\\litestruts\\src\\main\\resources\\struts.xml"); - Document document = db.parse( - new File("D:\\GitHub\\coding2017\\group23\\381519422\\litestruts\\src\\main\\resources\\struts.xml")); - NodeList list = document.getElementsByTagName("action"); - - /* - * 开始循环list,list中每一个元素结构如下 - * - /jsp/homepage.jsp - /jsp/showLogin.jsp - - */ - for (int i = 0; i < list.getLength(); i++) { - Map actionMap = new HashMap(); - // 注意:使用的都是org.w3c.dom包下的 - Element element = (Element) list.item(i); - // 获取中 name对应的属性值 - String actionAttributeName = element.getAttribute("name"); - String className = element.getAttribute("class"); - actionMap.put("class", className); - - // 读取第一个action - NamedNodeMap nnm = element.getElementsByTagName("result").item(0).getAttributes(); - // 获取的属性 name - // String nodeName = nnm.item(0).getNodeName(); - // element.getElementsByTagName("result").item(0) - // 是/jsp/homepage.jsp - // getFirstChild().getNodeValue() 是获取上面内容的/jsp/homepage.jsp - String context = element.getElementsByTagName("result").item(0).getTextContent(); - // 获取的属性 name对应的值success - String nodeValue = nnm.item(0).getNodeValue(); - actionMap.put(nodeValue, context); - - // 读取第二个action - nnm = element.getElementsByTagName("result").item(1).getAttributes(); - // 获取的属性 name - // nodeName = nnm.item(0).getNodeName(); - context = element.getElementsByTagName("result").item(1).getFirstChild().getNodeValue(); - // 获取的属性 name对应的值success - nodeValue = nnm.item(0).getNodeValue(); - actionMap.put(nodeValue, context); - - rootMap.put(actionAttributeName, actionMap); - } - } - - public static void main(String[] args) { - try { - init(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - // 内部类用于存放从配置文件读取的数据 - class StrutsMap { - private HashMap map; - - public String get(String key) { - return map.get(key); - } - - public void set(String key, String value) { - map.put(key, value); - } - } -} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java deleted file mode 100644 index 53c1e7187c..0000000000 --- a/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.xiaol.study; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java deleted file mode 100644 index 41999670b8..0000000000 --- a/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.xiaol.study; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - - public Map getParameters() { - return parameters; - } - - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/381519422/litestruts/src/main/resources/struts.xml b/group23/381519422/litestruts/src/main/resources/struts.xml deleted file mode 100644 index 32cf9d90c4..0000000000 --- a/group23/381519422/litestruts/src/main/resources/struts.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - /jsp/homepage.jsp - /jsp/showLogin.jsp - - - /jsp/welcome.jsp - /jsp/error.jsp - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 5f56b80bff..0000000000 --- a/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.coderising.jvm.loader; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; - - -public class ClassFileLoader { - - private List clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - String path = getClassFilePath(className); - if (path != null) { - try { - BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path)); - int count = bis.available(); - byte[] content = new byte[count]; - int len = bis.read(content,0,count); - return content; - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return null; - - - } - - private byte[] loadClassFile(String clzFileName) { - - return null; - } - - - public void addClassPath(String path) { - clzPaths.add(path); - } - - public String getClassPath_V1() { - - return null; - } - - public String getClassPath() { - StringBuilder sb = new StringBuilder(); - for (String s : clzPaths) { - sb.append(s); - sb.append(";"); - } - sb.deleteCharAt(sb.length() - 1); - return sb.toString(); - } - - private String getClassFilePath(String className) { - StringBuilder sb = new StringBuilder(); - for (String path : clzPaths - ) { - sb.append(path); - sb.append("\\"); - char[] classname = className.toCharArray(); - for (int i = 0; i < classname.length; i++) { - if (classname[i] == '.') { - sb.append("\\"); - - } else { - sb.append(classname[i]); - } - } - sb.append(".class"); - String classpath = sb.toString(); - File file = new File(classpath); - if (file.exists()) { - return classpath; - } - } - return null; - } -} diff --git a/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java deleted file mode 100644 index 1e00b5f2f5..0000000000 --- a/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.coderising.jvm.test; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.jvm.loader.ClassFileLoader; - - - - - -public class ClassFileloaderTest { - - - static String path1 = "D:\\mygit\\coding2017\\group23\\563253496\\week5_jvm\\out\\production\\untitled"; - static String path2 = "C:\\temp"; - - - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - - } - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "com.coderising.jvm.test.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "com.coderising.jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i -* @since
     29, 2017
    -* @version 1.0 -*/ 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()); - } - -} diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java deleted file mode 100644 index faae056835..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java deleted file mode 100644 index 650ca8375d..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coderising.jvm.clz; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java deleted file mode 100644 index e424f284b3..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java deleted file mode 100644 index aea9048ea4..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java deleted file mode 100644 index 466b072244..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java deleted file mode 100644 index 86c0445695..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 65475e194c..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 7f05870020..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 402f9dec86..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 936736016f..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - -} diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index f1f8eb4ed4..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index 5cac9f04f7..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 577e41536b..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.coderising.jvm.loader; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - private byte[] codes; - private int pos; - - public ByteCodeIterator(byte[] codes) { - this.codes = codes; - this.pos = 0; - } - - public byte[] getCodes(int length) { - if (this.pos + length >= this.codes.length) { - throw new IndexOutOfBoundsException(); - } - - byte[] buffer = new byte[length]; - for (int i = 0; i < length; i++) { - buffer[i] = this.codes[pos++]; - } - return buffer; - } - - public int nextU1ToInt() { - return Util.byteToInt(new byte[]{codes[pos++]}); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[]{codes[pos++], codes[pos++]}); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); - } - - public String nextU4ToHexString() { - return Util.byteToHexString(new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); - } - - public String nextUxToHexString(int len) { - byte[] buffer = new byte[len]; - for (int i = 0; i < len; i++) { - buffer[i] = this.codes[pos++]; - } - return Util.byteToHexString(buffer); - } - - public void back(int i) { - this.pos -= i; - - } -} diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java deleted file mode 100644 index be4e12c7de..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.coderising.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.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java deleted file mode 100644 index c3e3931582..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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 s.size()) { - throw new IndexOutOfBoundsException(); - } - Object[] o = new Object[len]; - Stack temp = new Stack(); - - for (int i = 0; i < len; i++) { - o[i] = s.peek(); - temp.push(s.pop()); - - } - while (!temp.isEmpty()) { - s.push(temp.pop()); - } - return o; - - } - - - /** - * 字符串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) { - char[] chars = s.toCharArray(); - Stack stack = new Stack(); - - for (int i = 0; i < chars.length; i++) { - switch (chars[i]) { - case '(': - stack.push('('); - break; - case '[': - stack.push('['); - break; - case '{': - stack.push('{'); - break; - case ')': - if (!stack.pop().equals('(')) { - return false; - } - break; - case ']': - if (!stack.pop().equals('[')) { - return false; - } - break; - case '}': - if (!stack.pop().equals('{')) { - return false; - } - break; - } - } - - return true; - } - - -} diff --git a/group23/563253496/week5_stack/src/test/StackUtilTest.java b/group23/563253496/week5_stack/src/test/StackUtilTest.java deleted file mode 100644 index fc1e727103..0000000000 --- a/group23/563253496/week5_stack/src/test/StackUtilTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package test; - -import junit.framework.Assert; -import org.junit.Test; -import org.junit.Before; -import org.junit.After; - -import stack.Stack; -import stack.StackUtil; - -import static com.sun.xml.internal.ws.dump.LoggingDumpTube.Position.After; -import static com.sun.xml.internal.ws.dump.LoggingDumpTube.Position.Before; - -/** -* stack.StackUtil Tester. -* -* @author -* @since
     8, 2017
    -* @version 1.0 -*/ -public class StackUtilTest { - -@Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: reverse(stack.Stack s) -* -*/ -@Test -public void testReverse() throws Exception { -//TODO: Test goes here... - Stack s = new Stack(); - for (int i = 1; i <=5 ; i++) { - s.push(i); - } - Assert.assertEquals("5,4,3,2,1,",s.toString()); - StackUtil.reverse(s); - - Assert.assertEquals("1,2,3,4,5,",s.toString()); -} - -/** -* -* Method: remove(stack.Stack s, Object o) -* -*/ -@Test -public void testRemove() throws Exception { - Stack s = new Stack(); - for (int i = 1; i <=5 ; i++) { - s.push(i); - } - Assert.assertEquals("5,4,3,2,1,",s.toString()); - StackUtil.remove(s,1); - - Assert.assertEquals("5,4,3,2,",s.toString()); -//TODO: Test goes here... -} - -/** -* -* Method: getTop(stack.Stack s, int len) -* -*/ -@Test -public void testGetTop() throws Exception { -//TODO: Test goes here... -} - -/** -* -* Method: isValidPairs(String s) -* -*/ -@Test -public void testIsValidPairs() throws Exception { -//TODO: Test goes here... - String s = "([e{d}f])"; - boolean b = StackUtil.isValidPairs(s); - Assert.assertEquals(true,b); - s = "([b{x]y})"; - b = StackUtil.isValidPairs(s); - Assert.assertEquals(false,b); - -} - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 88f60c77f6..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index 9bace446db..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; -import com.coderising.jvm.loader.ClassFileLoader; -import com.coderising.jvm.cmd.*; -import sun.text.CodePointIterator; - -import java.io.UnsupportedEncodingException; - - -public class CodeAttr extends AttributeInfo { - private int maxStack; - private int maxLocals; - private int codeLen; - private String code; - - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code ,ByteCodeCommand[] cmds) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { - - int attribute_name_index = iter.nextU2ToInt(); - if (!clzFile.getConstantPool().getUTF8String(attribute_name_index).equalsIgnoreCase(CODE)) { - throw new RuntimeException("CODE属性的attributenameindex解析错误"); - } - - int attribute_len = iter.nextU4ToInt(); - byte[] bytes = iter.getBytes(attribute_len); - ByteCodeIterator codeIter = new ByteCodeIterator(bytes); - - int max_stack = codeIter.nextU2ToInt(); - int max_locals = codeIter.nextU2ToInt(); - int code_len = codeIter.nextU4ToInt(); - /*byte[] codes = codeIter.getBytes(code_len); - - String code = null; - try { - - code = new String(codes, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } -*/ - - String code = codeIter.nextUxToHexString(code_len); - - ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); - - CodeAttr codeAttr = new CodeAttr(attribute_name_index, attribute_len, max_stack, max_locals, code_len, code, cmds); - - int exception_table_len = codeIter.nextU2ToInt(); - if (exception_table_len > 0) { - throw new RuntimeException("方法的code属性中有异常未进行解析"); - } - - //code中的属性 - int attribute_count = codeIter.nextU2ToInt(); - /*byte[] bytes1 = codeIter.getBytes(attribute_length); - ByteCodeIterator codeAttrIter = new ByteCodeIterator(bytes1); - - while (codeAttrIter.isNotEnd()) { - int attributenameindex = codeAttrIter.nextU2ToInt(); - if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LINE_NUM_TABLE)) { - LineNumberTable table = LineNumberTable.parse(codeAttrIter, attributenameindex); - codeAttr.setLineNumberTable(table); - } else if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LOCAL_VAR_TABLE)) { - LocalVariableTable table = LocalVariableTable.parse(codeAttrIter,attributenameindex); - codeAttr.setLocalVariableTable(table); - }else if(clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(STACK_MAP_TABLE)){ - codeIter.back(2); - StackMapTable table = StackMapTable.parse(codeIter); - codeAttr.setStackMapTable(table); - } - }*/ - for (int i = 0; i < attribute_count; i++) { - int attributenameindex = codeIter.nextU2ToInt(); - if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LINE_NUM_TABLE)) { - LineNumberTable table = LineNumberTable.parse(codeIter, attributenameindex); - codeAttr.setLineNumberTable(table); - } else if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LOCAL_VAR_TABLE)) { - LocalVariableTable table = LocalVariableTable.parse(codeIter,attributenameindex); - codeAttr.setLocalVariableTable(table); - }else if(clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(STACK_MAP_TABLE)){ - codeIter.back(2); - StackMapTable table = StackMapTable.parse(codeIter); - codeAttr.setStackMapTable(table); - } - - } - - - - - return codeAttr; - } - - private void setStackMapTable(StackMapTable t) { - this.stackMapTable = t; - - } - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - for(int i=0;i items = new ArrayList(); - - private static class LineNumberItem { - int startPC; - int lineNum; - - public int getStartPC() { - return startPC; - } - - public void setStartPC(int startPC) { - this.startPC = startPC; - } - - public int getLineNum() { - return lineNum; - } - - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - - public void addLineNumberItem(LineNumberItem item) { - this.items.add(item); - } - - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter, int attribute_name_index) { - int ccc = (iter.codes.length); - long attribute_len = iter.nextU4ToInt(); - int line_number_table_len = iter.nextU2ToInt(); - LineNumberTable table = new LineNumberTable(attribute_name_index,(int)attribute_len); - - /*byte[] bytes = iter.getBytes(line_number_table_len); - ByteCodeIterator lntIter = new ByteCodeIterator(bytes);*/ - - - /*while (lntIter.isNotEnd()) { - //int c = lntIter.codes.length; - LineNumberItem item = new LineNumberItem(); - item.setStartPC(lntIter.nextU2ToInt()); - item.setLineNum(lntIter.nextU2ToInt()); - table.addLineNumberItem(item); - }*/ - - - - for (int i = 0; i items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static LocalVariableTable parse(ByteCodeIterator iter,int attribute_name_index) { - int attribute_len = iter.nextU2ToInt(); - - byte[] bytes = iter.getBytes(attribute_len); - ByteCodeIterator lvtIter = new ByteCodeIterator(bytes); - - LocalVariableTable table = new LocalVariableTable(attribute_name_index,attribute_len); - - while(lvtIter.isNotEnd()){ - LocalVariableItem item = new LocalVariableItem(); - item.setStartPC(lvtIter.nextU2ToInt()); - item.setLength(lvtIter.nextU2ToInt()); - item.setNameIndex(lvtIter.nextU2ToInt()); - item.setDescIndex(lvtIter.nextU2ToInt()); - item.setIndex(lvtIter.nextU2ToInt()); - table.addLocalVariableItem(item); - } - - - return table; - } - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index 18f2ad0360..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java deleted file mode 100644 index faae056835..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java deleted file mode 100644 index aa4f4cb5ad..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f) { - this.fields.add(f); - } - - public List getFields() { - return this.fields; - } - - public void addMethod(Method m) { - this.methods.add(m); - } - - public List getMethods() { - return methods; - } - - - 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(); - } - - public Method getMethod(String methodName, String paramAndReturnType) { - Method method = new Method(this,this.accessFlag,) - - } - - public Method getMainMethod() { - - - } -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java deleted file mode 100644 index e424f284b3..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java deleted file mode 100644 index cd0fbd4848..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index a3abeacc82..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java deleted file mode 100644 index d84508c68b..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; -import com.sun.org.apache.bcel.internal.generic.BIPUSH; -import com.sun.org.apache.bcel.internal.generic.INVOKESPECIAL; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - codes = codes.toUpperCase(); - if (codes == "" || codes == null) { - throw new RuntimeException("codes为空!"); - } - List cmds = new LinkedList(); - - CommandIterator iter = new CommandIterator(codes); - while (iter.hasNext()) { - String opCode = iter.next2CharAsString(); - if (opCode.equals(new_object)) { - NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile,opCode); - newObjectCmd.setOprand1(iter.next2CharAsInt()); - newObjectCmd.setOprand2(iter.next2CharAsInt()); - cmds.add(newObjectCmd); - } else if (opCode.equals(dup)||opCode.equals(astore_1)||opCode.equals(aload_0)||opCode.equals(aload_1)||opCode.equals(aload_2)||opCode.equals(voidreturn)) { - NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, opCode); - cmds.add(noOperandCmd); - - }else if (opCode.equals(ldc)){ - LdcCmd cmd = new LdcCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - }else if (opCode.equals(bipush)){ - BiPushCmd cmd = new BiPushCmd(clzFile, opCode); - cmd.setOperand(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (opCode.equals(invokespecial)) { - InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - } else if (opCode.equals(invokevirtual)) { - InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); - cmd.setOprand1(iter.next2CharAsInt()); - cmd.setOprand2(iter.next2CharAsInt()); - cmds.add(cmd); - }else{ - throw new RuntimeException(opCode + "未进行判断!"); - } - } - - calcuateOffset(cmds); - ByteCodeCommand[] cmd = (ByteCodeCommand[])cmds.toArray(); - return cmd; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 2e6061edd2..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e6cf9d5960..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index ac228d0e4d..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index c15d827797..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java deleted file mode 100644 index ffb66f811c..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 33813b5d59..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 56c28fefe2..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 963d064257..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 85bb369c19..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 6c0cf53082..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java deleted file mode 100644 index aea9048ea4..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java deleted file mode 100644 index 466b072244..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java deleted file mode 100644 index 86c0445695..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 65475e194c..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 7f05870020..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 402f9dec86..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 936736016f..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index f1f8eb4ed4..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index 5cac9f04f7..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java deleted file mode 100644 index dc4dfff971..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - int accessflag = iter.nextU2ToInt(); - int nameindex = iter.nextU2ToInt(); - int descriptorindex = iter.nextU2ToInt(); - int attributecount = iter.nextU2ToInt(); - if (attributecount > 0) { - throw new RuntimeException("该字段中有属性" + attributecount + "个,未进行解析"); - } - Field field = new Field(accessflag, nameindex, descriptorindex, pool); - return field; - - } - public String toString() { - return pool.getUTF8String(this.nameIndex)+":"+pool.getUTF8String(this.descriptorIndex); - } - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 40b792eda5..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.Arrays; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - public byte[] codes; - public int pos = 0; - - public ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - - - public byte[] getBytes(int len) { - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public int nextU1toInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextU4ToHexString() { - return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } - - public boolean isNotEnd(){ - if(pos 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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand[] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - -} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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 parameters) { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - return null; - } - -} diff --git a/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java b/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index b8c81faf3c..0000000000 --- a/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java b/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java b/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java b/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/List.java b/group23/563253496/week6_stack/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/Queue.java b/group23/563253496/week6_stack/src/com/coding/basic/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java deleted file mode 100644 index 4576c016af..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic.array; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java deleted file mode 100644 index 45740e6d57..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.coding.basic.array; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin){ - - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray){ - return null; - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2){ - return null; - } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - return null; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max){ - return null; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - return null; - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max){ - return null; - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator){ - return null; - } - - -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java deleted file mode 100644 index 24b9d8b155..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.coding.basic.linklist; - - -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/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java deleted file mode 100644 index 7fd72fc2b4..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.basic.linklist; - -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/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java deleted file mode 100644 index f4c7556a2e..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.coding.basic.linklist; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java deleted file mode 100644 index fff3778da5..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.coding.basic.stack; - -import java.util.ArrayList; -import java.util.ArrayList; - -/** - * Created by bdl19 on 2017/4/8. - */ -public class Stack { - private int count; - private ArrayList elementData; - - public Stack() { - this.count = 0; - elementData = new ArrayList(); - } - - public void push(Object o) { - count++; - elementData.add(o); - - } - - public Object pop() { - count--; - Object o = elementData.get(count); - elementData.remove(count); - return o; - } - - public Object peek() { - - return elementData.get(count-1); - } - - public boolean isEmpty() { - if (count == 0) { - return true; - } else { - return false; - } - } - - public int size() { - return count; - } - - public String toString(){ - StringBuilder sb = new StringBuilder(); - Stack s = new Stack(); - while(!this.isEmpty()){ - sb.append(this.peek().toString()); - sb.append(","); - s.push(this.pop()); - } - while(!s.isEmpty()){ - this.push(s.pop()); - } - -// sb.deleteCharAt(sb.length()-1); - return sb.toString(); - } -} - diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java deleted file mode 100644 index 70bd34e37f..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.coding.basic.stack; -import java.util.Stack; -public class StackUtil { - - public static void bad_reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack(); - while(!s.isEmpty()){ - tmpStack.push(s.pop()); - } - - s = tmpStack; - - } - - /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - */ - public static void reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - Integer top = s.pop(); - reverse(s); - addToBottom(s,top); - - - } - public static void addToBottom(Stack s, Integer value){ - if(s.isEmpty()){ - s.push(value); - } else{ - Integer top = s.pop(); - addToBottom(s,value); - s.push(top); - } - - } - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s,Object o) { - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack(); - - while(!s.isEmpty()){ - Object value = s.pop(); - if(!value.equals(o)){ - tmpStack.push(value); - } - } - - while(!tmpStack.isEmpty()){ - s.push(tmpStack.pop()); - } - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param len - * @return - */ - public static Object[] getTop(Stack s,int len) { - - if(s == null || s.isEmpty() || s.size() stack = new Stack(); - for(int i=0;i s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - - StackUtil.addToBottom(s, 0); - - Assert.assertEquals("[0, 1, 2, 3]", s.toString()); - - } - @Test - public void testReverse() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); - } - - @Test - public void testRemove() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("[1, 3]", s.toString()); - } - - @Test - public void testGetTop() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } - } - - @Test - public void testIsValidPairs() { - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } - -} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java deleted file mode 100644 index 091c670ba8..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.Stack; - -import java.util.HashMap; - -public class InfixExpr { - String expr = null; - char[] chars; - Stack opStack; - Stack numStack; - private HashMap level = new HashMap<>(); - - int pos; - - public InfixExpr(String expr) { - this.expr = expr; - - - this.level.put('+', 0); - this.level.put('-', 0); - this.level.put('*', 1); - this.level.put('/', 1); - - - this.opStack = new Stack(); - this.numStack = new Stack(); - this.pos = 0; - } - - public float evaluate() { - chars = expr.toCharArray(); - while (this.pos < chars.length) { - if (isOp(chars[pos])) { - if (opStack.isEmpty()) { - opStack.push(chars[pos]); - pos++; - } else { - //TODO analyze - char op = (char) opStack.pop(); - if (level.get(chars[pos]) <= level.get(op)) { - - int c = this.caculate(op); - numStack.push(c); - opStack.push(chars[pos]); - pos++; - - - }else { - opStack.push(op); - opStack.push(chars[pos]); - pos++; - } - } - } else { - int num = this.getNumber(); - numStack.push(num); - - } - } - - while(!opStack.isEmpty()){ - char op = (char) opStack.pop(); - - int c = this.caculate(op); - numStack.push(c); - } - - return (int)numStack.pop(); - } - - private boolean isOp(char c) { - switch (c) { - case '+': - case '-': - case '*': - case '/': - return true; - - default: - return false; - } - } - - private int getNumber() { - int num = Integer.parseInt("" + chars[pos]); - pos++; - while ((pos < chars.length)&&(!isOp(chars[pos])) ) { - num *= 10; - num += Integer.parseInt("" + chars[pos]); - pos++; - } - return num; - } - - private int caculate(char c) { - int b = (int) numStack.pop(); - int a = (int) numStack.pop(); - switch (c) { - case '+': - return a + b; - case '-': - return a - b; - case '*': - return a * b; - case '/': - return a / b; - } - return -1; - } -} - diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index 20f52b4c63..0000000000 --- a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java deleted file mode 100644 index 88f60c77f6..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.attr; - -public abstract class AttributeInfo { - public static final String CODE = "Code"; - public static final String CONST_VALUE = "ConstantValue"; - public static final String EXCEPTIONS = "Exceptions"; - public static final String LINE_NUM_TABLE = "LineNumberTable"; - public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; - public static final String STACK_MAP_TABLE = "StackMapTable"; - int attrNameIndex; - int attrLen ; - public AttributeInfo(int attrNameIndex, int attrLen) { - - this.attrNameIndex = attrNameIndex; - this.attrLen = attrLen; - } - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java deleted file mode 100644 index a57a8b5446..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.coderising.jvm.attr; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.cmd.ByteCodeCommand; -import com.coderising.jvm.cmd.CommandParser; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class CodeAttr extends AttributeInfo { - private int maxStack ; - private int maxLocals ; - private int codeLen ; - private String code; - public String getCode() { - return code; - } - - private ByteCodeCommand[] cmds ; - public ByteCodeCommand[] getCmds() { - return cmds; - } - private LineNumberTable lineNumTable; - private LocalVariableTable localVarTable; - private StackMapTable stackMapTable; - - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { - super(attrNameIndex, attrLen); - this.maxStack = maxStack; - this.maxLocals = maxLocals; - this.codeLen = codeLen; - this.code = code; - this.cmds = cmds; - } - - public void setLineNumberTable(LineNumberTable t) { - this.lineNumTable = t; - } - - public void setLocalVariableTable(LocalVariableTable t) { - this.localVarTable = t; - } - - public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ - - return null; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); - for(int i=0;i items = new ArrayList(); - - private static class LineNumberItem{ - int startPC; - int lineNum; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLineNum() { - return lineNum; - } - public void setLineNum(int lineNum) { - this.lineNum = lineNum; - } - } - public void addLineNumberItem(LineNumberItem item){ - this.items.add(item); - } - public LineNumberTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - - } - - public static LineNumberTable parse(ByteCodeIterator iter){ - - return null; - } - - public String toString(){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Line Number Table:\n"); - for(LineNumberItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("lineNum:"+item.getLineNum()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - - } - - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java deleted file mode 100644 index 962c3b8bc4..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.jvm.attr; - -public class LocalVariableItem { - private int startPC; - private int length; - private int nameIndex; - private int descIndex; - private int index; - public int getStartPC() { - return startPC; - } - public void setStartPC(int startPC) { - this.startPC = startPC; - } - public int getLength() { - return length; - } - public void setLength(int length) { - this.length = length; - } - public int getNameIndex() { - return nameIndex; - } - public void setNameIndex(int nameIndex) { - this.nameIndex = nameIndex; - } - public int getDescIndex() { - return descIndex; - } - public void setDescIndex(int descIndex) { - this.descIndex = descIndex; - } - public int getIndex() { - return index; - } - public void setIndex(int index) { - this.index = index; - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java deleted file mode 100644 index 14db5dca46..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.coderising.jvm.attr; - - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ConstantPool; - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class LocalVariableTable extends AttributeInfo{ - - List items = new ArrayList(); - - public LocalVariableTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - - private void addLocalVariableItem(LocalVariableItem item) { - this.items.add(item); - } - - public static LocalVariableTable parse(ByteCodeIterator iter){ - - return null; - } - - - public String toString(ConstantPool pool){ - StringBuilder buffer = new StringBuilder(); - buffer.append("Local Variable Table:\n"); - for(LocalVariableItem item : items){ - buffer.append("startPC:"+item.getStartPC()).append(","); - buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); - buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); - buffer.append("slotIndex:"+ item.getIndex()).append("\n"); - } - buffer.append("\n"); - return buffer.toString(); - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java deleted file mode 100644 index 18f2ad0360..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coderising.jvm.attr; - - -import com.coderising.jvm.loader.ByteCodeIterator; - -public class StackMapTable extends AttributeInfo{ - - private String originalCode; - - public StackMapTable(int attrNameIndex, int attrLen) { - super(attrNameIndex, attrLen); - } - - public static StackMapTable parse(ByteCodeIterator iter){ - int index = iter.nextU2ToInt(); - int len = iter.nextU4ToInt(); - StackMapTable t = new StackMapTable(index,len); - - //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 - String code = iter.nextUxToHexString(len); - t.setOriginalCode(code); - - return t; - } - - private void setOriginalCode(String code) { - this.originalCode = code; - - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java deleted file mode 100644 index faae056835..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java deleted file mode 100644 index 2a8dfb6123..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.coderising.jvm.clz; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.field.Field; -import com.coderising.jvm.method.Method; - -public class ClassFile { - - private int minorVersion; - private int majorVersion; - - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; - private List fields = new ArrayList(); - private List methods = new ArrayList(); - - 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 addField(Field f){ - this.fields.add(f); - } - public List getFields(){ - return this.fields; - } - public void addMethod(Method m){ - this.methods.add(m); - } - public List getMethods() { - return methods; - } - - - 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()); - - - } - - public String getClassName(){ - int thisClassIndex = this.clzIndex.getThisClassIndex(); - ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); - return thisClass.getClassName(); - } - public String getSuperClassName(){ - ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); - return superClass.getClassName(); - } - - public Method getMethod(String methodName, String paramAndReturnType){ - - - return null; - } - public Method getMainMethod(){ - - return null; - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java deleted file mode 100644 index e424f284b3..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java deleted file mode 100644 index cd0fbd4848..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public class BiPushCmd extends OneOperandCmd { - - public BiPushCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); - } - - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java deleted file mode 100644 index a3abeacc82..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.HashMap; -import java.util.Map; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; - - -public abstract class ByteCodeCommand { - - String opCode; - ClassFile clzFile; - private int offset; - - private static Map codeMap = new HashMap(); - - static{ - codeMap.put("01", "aconst_null"); - - codeMap.put("BB", "new"); - codeMap.put("37", "lstore"); - codeMap.put("B7", "invokespecial"); - codeMap.put("B6", "invokevirtual"); - codeMap.put("B4", "getfield"); - codeMap.put("B5", "putfield"); - codeMap.put("B2", "getstatic"); - - codeMap.put("2A", "aload_0"); - codeMap.put("2B", "aload_1"); - codeMap.put("2C", "aload_2"); - - codeMap.put("10", "bipush"); - codeMap.put("15", "iload"); - codeMap.put("1A", "iload_0"); - codeMap.put("1B", "iload_1"); - codeMap.put("1C", "iload_2"); - codeMap.put("1D", "iload_3"); - - codeMap.put("25", "fload_3"); - - codeMap.put("1E", "lload_0"); - - codeMap.put("24", "fload_2"); - codeMap.put("4C", "astore_1"); - - codeMap.put("A2", "if_icmp_ge"); - codeMap.put("A4", "if_icmple"); - - codeMap.put("A7", "goto"); - - codeMap.put("B1", "return"); - codeMap.put("AC", "ireturn"); - codeMap.put("AE", "freturn"); - - codeMap.put("03", "iconst_0"); - codeMap.put("04", "iconst_1"); - - codeMap.put("3C", "istore_1"); - codeMap.put("3D", "istore_2"); - - codeMap.put("59", "dup"); - - codeMap.put("60", "iadd"); - codeMap.put("84", "iinc"); - - codeMap.put("12", "ldc"); - } - - - - - - protected ByteCodeCommand(ClassFile clzFile, String opCode){ - this.clzFile = clzFile; - this.opCode = opCode; - } - - protected ClassFile getClassFile() { - return clzFile; - } - - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } - protected ConstantInfo getConstantInfo(int index){ - return this.getClassFile().getConstantPool().getConstantInfo(index); - } - - protected ConstantPool getConstantPool(){ - return this.getClassFile().getConstantPool(); - } - - - - public String getOpCode() { - return opCode; - } - - public abstract int getLength(); - - - - - public String toString(){ - - StringBuffer buffer = new StringBuffer(); - buffer.append(this.opCode); - - return buffer.toString(); - } - public abstract String toString(ConstantPool pool); - - public String getReadableCodeText(){ - String txt = codeMap.get(opCode); - if(txt == null){ - return opCode; - } - return txt; - } - - //public abstract void execute(StackFrame frame,FrameResult result); -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java deleted file mode 100644 index 2bb36340f5..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.coderising.jvm.cmd; - -import java.util.ArrayList; -import java.util.List; - -import com.coderising.jvm.clz.ClassFile; - -public class CommandParser { - - public static final String aconst_null = "01"; - public static final String new_object = "BB"; - public static final String lstore = "37"; - public static final String invokespecial = "B7"; - public static final String invokevirtual = "B6"; - public static final String getfield = "B4"; - public static final String putfield = "B5"; - public static final String getstatic = "B2"; - public static final String ldc = "12"; - public static final String dup = "59"; - public static final String bipush = "10"; - public static final String aload_0 = "2A"; - public static final String aload_1 = "2B"; - public static final String aload_2 = "2C"; - public static final String iload = "15"; - public static final String iload_1 = "1B"; - public static final String iload_2 = "1C"; - public static final String iload_3 = "1D"; - public static final String fload_3 = "25"; - - public static final String voidreturn = "B1"; - public static final String ireturn = "AC"; - public static final String freturn = "AE"; - - public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; - public static final String if_icmple = "A4"; - public static final String goto_no_condition = "A7"; - public static final String iconst_0 = "03"; - public static final String iconst_1 = "04"; - public static final String istore_1 = "3C"; - public static final String istore_2 = "3D"; - public static final String iadd = "60"; - public static final String iinc = "84"; - - public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { - - - return null; - } - - private static void calcuateOffset(List cmds) { - - int offset = 0; - for (ByteCodeCommand cmd : cmds) { - cmd.setOffset(offset); - offset += cmd.getLength(); - } - - } - - private static class CommandIterator { - String codes = null; - int pos = 0; - - CommandIterator(String codes) { - this.codes = codes; - } - - public boolean hasNext() { - return pos < this.codes.length(); - } - - public String next2CharAsString() { - String result = codes.substring(pos, pos + 2); - pos += 2; - return result; - } - - public int next2CharAsInt() { - String s = this.next2CharAsString(); - return Integer.valueOf(s, 16).intValue(); - } - - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java deleted file mode 100644 index 2e6061edd2..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class GetFieldCmd extends TwoOperandCmd { - - public GetFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java deleted file mode 100644 index e6cf9d5960..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.UTF8Info; - - -public class GetStaticFieldCmd extends TwoOperandCmd { - - public GetStaticFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java deleted file mode 100644 index ac228d0e4d..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.MethodRefInfo; - - -public class InvokeSpecialCmd extends TwoOperandCmd { - - public InvokeSpecialCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java deleted file mode 100644 index c15d827797..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - - -public class InvokeVirtualCmd extends TwoOperandCmd { - - public InvokeVirtualCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); - } - - - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java deleted file mode 100644 index ffb66f811c..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.StringInfo; - -public class LdcCmd extends OneOperandCmd { - - public LdcCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - - String value = "TBD"; - if(info instanceof StringInfo){ - StringInfo strInfo = (StringInfo)info; - value = strInfo.toString(); - } - - return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - - } - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java deleted file mode 100644 index 33813b5d59..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NewObjectCmd extends TwoOperandCmd{ - - public NewObjectCmd(ClassFile clzFile, String opCode){ - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); - } - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java deleted file mode 100644 index 56c28fefe2..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class NoOperandCmd extends ByteCodeCommand{ - - public NoOperandCmd(ClassFile clzFile, String opCode) { - super(clzFile, opCode); - } - - @Override - public String toString(ConstantPool pool) { - return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); - } - - - - public int getLength(){ - return 1; - } - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java deleted file mode 100644 index 963d064257..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; - -public abstract class OneOperandCmd extends ByteCodeCommand { - - private int operand; - - public OneOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - - } - public int getOperand() { - - return this.operand; - } - - public void setOperand(int oprand1) { - this.operand = oprand1; - - } - public int getLength(){ - return 2; - } - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java deleted file mode 100644 index 85bb369c19..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ConstantPool; - -public class PutFieldCmd extends TwoOperandCmd { - - public PutFieldCmd(ClassFile clzFile,String opCode) { - super(clzFile,opCode); - } - - @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); - } - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java deleted file mode 100644 index 6c0cf53082..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.coderising.jvm.cmd; - -import com.coderising.jvm.clz.ClassFile; -import com.coderising.jvm.constant.ClassInfo; -import com.coderising.jvm.constant.ConstantInfo; -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.FieldRefInfo; -import com.coderising.jvm.constant.MethodRefInfo; - -public abstract class TwoOperandCmd extends ByteCodeCommand{ - - int oprand1 = -1; - int oprand2 = -1; - - public int getOprand1() { - return oprand1; - } - - public void setOprand1(int oprand1) { - this.oprand1 = oprand1; - } - - public void setOprand2(int oprand2) { - this.oprand2 = oprand2; - } - - public int getOprand2() { - return oprand2; - } - - public TwoOperandCmd(ClassFile clzFile,String opCode) { - super(clzFile, opCode); - } - - public int getIndex(){ - int oprand1 = this.getOprand1(); - int oprand2 = this.getOprand2(); - int index = oprand1 << 8 | oprand2; - return index; - } - - protected String getOperandAsClassInfo(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); - } - - protected String getOperandAsMethod(ConstantPool pool){ - int index = getIndex(); - String codeTxt = getReadableCodeText(); - ConstantInfo constInfo = this.getConstantInfo(index); - MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - - protected String getOperandAsField(ConstantPool pool){ - int index = getIndex(); - - String codeTxt = getReadableCodeText(); - FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); - return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); - } - public int getLength(){ - return 3; - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java deleted file mode 100644 index c8e65ff493..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitClassInfo(this); - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java deleted file mode 100644 index 88353df2d3..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coderising.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); - } - - public abstract void accept(Visitor visitor); - - public static interface Visitor{ - public void visitClassInfo(ClassInfo info); - public void visitFieldRef(FieldRefInfo info); - public void visitMethodRef(MethodRefInfo info); - public void visitNameAndType(NameAndTypeInfo info); - public void visitString(StringInfo info); - public void visistUTF8(UTF8Info info); - - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java deleted file mode 100644 index 7130eb3a9f..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.coderising.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 int getSize() { - return this.constantInfos.size() -1; - } - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java deleted file mode 100644 index 7ae71396ef..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.coderising.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(); - } - @Override - public void accept(Visitor visitor) { - visitor.visitFieldRef(this); - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java deleted file mode 100644 index 036e6d9055..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coderising.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(); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitMethodRef(this); - } - - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java deleted file mode 100644 index 5cbbba6033..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.coderising.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()+")"; - } - - @Override - public void accept(Visitor visitor) { - visitor.visitNameAndType(this); - - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java deleted file mode 100644 index 41e0fd7e7a..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.coderising.jvm.constant; - -public class NullConstantInfo extends ConstantInfo { - - public NullConstantInfo(){ - - } - @Override - public int getType() { - return -1; - } - @Override - public void accept(Visitor visitor) { - - } - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java deleted file mode 100644 index 6bfcb47273..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coderising.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); - } - - @Override - public void accept(Visitor visitor) { - visitor.visitString(this); - - } - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java deleted file mode 100644 index 7db88a939e..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.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; - } - @Override - public void accept(Visitor visitor) { - visitor.visistUTF8(this); - - } - - - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java deleted file mode 100644 index c6eb0196f8..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coderising.jvm.field; - -import com.coderising.jvm.constant.ConstantPool; -import com.coderising.jvm.constant.UTF8Info; -import com.coderising.jvm.loader.ByteCodeIterator; - - -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; - - - - private ConstantPool pool; - - public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { - - this.accessFlag = accessFlag; - this.nameIndex = nameIndex; - this.descriptorIndex = descriptorIndex; - this.pool = pool; - } - - public String toString() { - String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); - - String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); - return name +":"+ desc; - } - - - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ - - int accessFlag = iter.nextU2ToInt(); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - int attribCount = iter.nextU2ToInt(); - //System.out.println("field attribute count:"+ attribCount); - - Field f = new Field(accessFlag, nameIndex, descIndex,pool); - - if(attribCount > 0){ - throw new RuntimeException("Field Attribute has not been implemented"); - } - - return f; - } - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java deleted file mode 100644 index 6fb5570dff..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coderising.jvm.loader; - -import java.util.Arrays; - -import com.coderising.jvm.util.Util; - -public class ByteCodeIterator { - byte[] codes; - int pos = 0; - - ByteCodeIterator(byte[] codes) { - this.codes = codes; - } - - - - public byte[] getBytes(int len) { - if (pos + len >= codes.length) { - throw new ArrayIndexOutOfBoundsException(); - } - - byte[] data = Arrays.copyOfRange(codes, pos, pos + len); - pos += len; - return data; - } - - public int nextU1toInt() { - - return Util.byteToInt(new byte[] { codes[pos++] }); - } - - public int nextU2ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); - } - - public int nextU4ToInt() { - return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); - } - - public String nextU4ToHexString() { - return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); - } - - public String nextUxToHexString(int len) { - byte[] tmp = new byte[len]; - - for (int i = 0; i < len; i++) { - tmp[i] = codes[pos++]; - } - return Util.byteToHexString(tmp).toLowerCase(); - - } - - public void back(int n) { - this.pos -= n; - } -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java deleted file mode 100644 index 33185d8175..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.coderising.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.coderising.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()); - } - - /** - * 下面是第三次JVM课应实现的测试用例 - */ - @Test - public void testReadFields(){ - - List fields = clzFile.getFields(); - Assert.assertEquals(2, fields.size()); - { - Field f = fields.get(0); - Assert.assertEquals("name:Ljava/lang/String;", f.toString()); - } - { - Field f = fields.get(1); - Assert.assertEquals("age:I", f.toString()); - } - } - @Test - public void testMethods(){ - - List methods = clzFile.getMethods(); - ConstantPool pool = clzFile.getConstantPool(); - - { - Method m = methods.get(0); - assertMethodEquals(pool,m, - "", - "(Ljava/lang/String;I)V", - "2ab7000c2a2bb5000f2a1cb50011b1"); - - } - { - Method m = methods.get(1); - assertMethodEquals(pool,m, - "setName", - "(Ljava/lang/String;)V", - "2a2bb5000fb1"); - - } - { - Method m = methods.get(2); - assertMethodEquals(pool,m, - "setAge", - "(I)V", - "2a1bb50011b1"); - } - { - Method m = methods.get(3); - assertMethodEquals(pool,m, - "sayHello", - "()V", - "b2001c1222b60024b1"); - - } - { - Method m = methods.get(4); - assertMethodEquals(pool,m, - "main", - "([Ljava/lang/String;)V", - "bb000159122b101db7002d4c2bb6002fb1"); - } - } - - private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ - String methodName = pool.getUTF8String(m.getNameIndex()); - String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); - String code = m.getCodeAttr().getCode(); - Assert.assertEquals(expectedName, methodName); - Assert.assertEquals(expectedDesc, methodDesc); - Assert.assertEquals(expectedCode, code); - } - - @Test - public void testByteCodeCommand(){ - { - Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); - ByteCodeCommand [] cmds = initMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: invokespecial #12", cmds[1]); - assertOpCodeEquals("4: aload_0", cmds[2]); - assertOpCodeEquals("5: aload_1", cmds[3]); - assertOpCodeEquals("6: putfield #15", cmds[4]); - assertOpCodeEquals("9: aload_0", cmds[5]); - assertOpCodeEquals("10: iload_2", cmds[6]); - assertOpCodeEquals("11: putfield #17", cmds[7]); - assertOpCodeEquals("14: return", cmds[8]); - } - - { - Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); - ByteCodeCommand [] cmds = setNameMethod.getCmds(); - - assertOpCodeEquals("0: aload_0", cmds[0]); - assertOpCodeEquals("1: aload_1", cmds[1]); - assertOpCodeEquals("2: putfield #15", cmds[2]); - assertOpCodeEquals("5: return", cmds[3]); - - } - - { - Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); - ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); - - assertOpCodeEquals("0: getstatic #28", cmds[0]); - assertOpCodeEquals("3: ldc #34", cmds[1]); - assertOpCodeEquals("5: invokevirtual #36", cmds[2]); - assertOpCodeEquals("8: return", cmds[3]); - - } - - { - Method mainMethod = this.clzFile.getMainMethod(); - - ByteCodeCommand [] cmds = mainMethod.getCmds(); - - assertOpCodeEquals("0: new #1", cmds[0]); - assertOpCodeEquals("3: dup", cmds[1]); - assertOpCodeEquals("4: ldc #43", cmds[2]); - assertOpCodeEquals("6: bipush 29", cmds[3]); - assertOpCodeEquals("8: invokespecial #45", cmds[4]); - assertOpCodeEquals("11: astore_1", cmds[5]); - assertOpCodeEquals("12: aload_1", cmds[6]); - assertOpCodeEquals("13: invokevirtual #47", cmds[7]); - assertOpCodeEquals("16: return", cmds[8]); - } - - } - - private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ - - String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); - - if(cmd instanceof OneOperandCmd){ - if(cmd instanceof BiPushCmd){ - acctual += " " + ((OneOperandCmd)cmd).getOperand(); - } else{ - acctual += " #" + ((OneOperandCmd)cmd).getOperand(); - } - } - if(cmd instanceof TwoOperandCmd){ - acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); - } - Assert.assertEquals(expected, acctual); - } - -} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java deleted file mode 100644 index 12e3d7efdd..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java deleted file mode 100644 index 0c4cc8c57c..0000000000 --- a/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.coderising.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 parameters) { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - return null; - } - -} diff --git a/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java b/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index b8c81faf3c..0000000000 --- a/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java b/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java b/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java b/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/List.java b/group23/563253496/week7_stack/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java deleted file mode 100644 index 4576c016af..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.coding.basic.array; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java deleted file mode 100644 index 45740e6d57..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.coding.basic.array; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin){ - - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray){ - return null; - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2){ - return null; - } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - return null; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max){ - return null; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - return null; - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max){ - return null; - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator){ - return null; - } - - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java deleted file mode 100644 index 994a241a3d..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.linklist; - - -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) { - - - } - - - 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/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java deleted file mode 100644 index 7fd72fc2b4..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.coding.basic.linklist; - -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/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java deleted file mode 100644 index f4c7556a2e..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.coding.basic.linklist; - -import com.coding.basic.Iterator; -import com.coding.basic.List; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java deleted file mode 100644 index 1ac659da3d..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coding.basic.queue; - -public class CircleQueue { - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java deleted file mode 100644 index d629d847f4..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic.queue; - -import java.util.ArrayList; -import java.util.List; - -/** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 - * @author liuxin - * - */ -public class Josephus { - - public static List execute(int n, int m){ - - return null; - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java deleted file mode 100644 index 7d90318b51..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coding.basic.queue; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class JosephusTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testExecute() { - - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); - - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java deleted file mode 100644 index c4c4b7325e..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.coding.basic.queue; - -import java.util.NoSuchElementException; - -public class Queue { - private Node first; - private Node last; - private int size; - - - private static class Node { - private E item; - private Node next; - } - - - public Queue() { - first = null; - last = null; - size = 0; - } - - - public boolean isEmpty() { - return first == null; - } - - public int size() { - return size; - } - - - - public void enQueue(E data) { - Node oldlast = last; - last = new Node(); - last.item = data; - last.next = null; - if (isEmpty()) { - first = last; - } - else{ - oldlast.next = last; - } - size++; - } - - public E deQueue() { - if (isEmpty()) { - throw new NoSuchElementException("Queue underflow"); - } - E item = first.item; - first = first.next; - size--; - if (isEmpty()) { - last = null; - } - return item; - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java deleted file mode 100644 index bbd4715ca6..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.coding.basic.queue; - -import java.util.Stack; - -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - - - - public boolean isEmpty() { - return false; - } - - - - public int size() { - return -1; - } - - - - public void enQueue(E item) { - - } - - public E deQueue() { - return null; - } - - - } - diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java deleted file mode 100644 index de597befb4..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.coding.basic.stack; - -import java.util.ArrayList; -import java.util.ArrayList; - -/** - * Created by bdl19 on 2017/4/8. - */ -public class Stack { - private int count; - private ArrayList elementData; - - public Stack() { - this.count = 0; - elementData = new ArrayList(); - } - - public void push(Object o) { - count++; - elementData.add(o); - - } - - public Object pop() { - count--; - Object o = elementData.get(count); - elementData.remove(count); - return o; - } - - public Object peek() { - - return elementData.get(count-1); - } - - public boolean isEmpty() { - if (count == 0) { - return true; - } else { - return false; - } - } - - public int size() { - return count; - } - - public String toString(){ - StringBuilder sb = new StringBuilder(); - Stack s = new Stack(); - while(!this.isEmpty()){ - sb.append(this.peek().toString()); - sb.append(","); - s.push(this.pop()); - } - while(!s.isEmpty()){ - this.push(s.pop()); - } - -// sb.deleteCharAt(sb.length()-1); - return sb.toString(); - } -} - diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java deleted file mode 100644 index 0148188b29..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.coding.basic.stack; -import java.util.Stack; -public class StackUtil { - - public static void bad_reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack(); - while(!s.isEmpty()){ - tmpStack.push(s.pop()); - } - - s = tmpStack; - - } - - /** - * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - */ - public static void reverse(Stack s) { - if(s == null || s.isEmpty()){ - return; - } - Integer top = s.pop(); - reverse(s); - addToBottom(s,top); - - - } - public static void addToBottom(Stack s, Integer value){ - if(s.isEmpty()){ - s.push(value); - } else{ - Integer top = s.pop(); - addToBottom(s,value); - s.push(top); - } - - } - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s,Object o) { - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack(); - - while(!s.isEmpty()){ - Object value = s.pop(); - if(!value.equals(o)){ - tmpStack.push(value); - } - } - - while(!tmpStack.isEmpty()){ - s.push(tmpStack.pop()); - } - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param len - * @return - */ - public static Object[] getTop(Stack s,int len) { - - if(s == null || s.isEmpty() || s.size() stack = new Stack(); - for(int i=0;i s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); - } - - @Test - public void testRemove() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("[1, 3]", s.toString()); - } - - @Test - public void testGetTop() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } - } - - @Test - public void testIsValidPairs() { - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java deleted file mode 100644 index ef85ff007f..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.coding.basic.stack.expr; - -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - return 0.0f; - } - - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java deleted file mode 100644 index 20e34e8852..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class InfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("10-2*3+50"); - Assert.assertEquals(54, expr.evaluate(), 0.001f); - } - - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java deleted file mode 100644 index 92c31a1085..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.coding.basic.stack.expr; - -import com.coding.basic.stack.Stack; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -public class InfixToPostfix { - private static List op = new ArrayList(); - - public static List convert(String expr) { - op.add('+'); - op.add('-'); - op.add('*'); - op.add('/'); - List numList = new LinkedList<>(); - List opList = new LinkedList<>(); - - List list = new ArrayList(); - - - char[] chars = expr.toCharArray(); - - int index = 0; - while (index < chars.length) { - if (op.contains(chars[index])) { - if (chars[index] == '*' || chars[index] == '/') { - - char oper = chars[index]; - - StringBuilder sb = new StringBuilder(); - index++; - while (chars[index] >= '0' && chars[index] <= '9') { - sb.append(chars[index]); - index++; - } - String s = numList.get(numList.size() - 1); - numList.remove(numList.size() - 1); - StringBuilder buffer = new StringBuilder(); - buffer.append(s + ' '); - buffer.append(sb); - buffer.append(oper); - numList.add(buffer.toString()); - //numStack.push(buffer.toString()); - - } else { - opList.add("" + chars[index]); - //opStack.push(chars[index]); - } - index++; - } else if (chars[index] == ' ') { - index++; - } else { - StringBuilder sb = new StringBuilder(); - while (chars[index] >= '0' && chars[index] <= '9') { - sb.append(chars[index]); - index++; - } - numList.add(sb.toString()); - //numStack.push(sb.toString()); - } - - } - - int opListIndex = 0; - while (opListIndex < opList.size()) { - for (int i = 0; i < opList.size(); i++) { - String a = numList.get(0); - String b = numList.get(1); - numList.set(0, a + " " + b + " " + opList.get(opListIndex)); - numList.remove(1); - } - } - - String postfixExpr = numList.get(0); - char[] chars1 = postfixExpr.toCharArray(); - index = 0; - while (index < chars1.length) { - if (chars1[index] == '+') { - Token token = new Token(1, "+"); - list.add(token); - } else if (chars1[index] == '-') { - Token token = new Token(1, "-"); - list.add(token); - } else if (chars1[index] == '*') { - Token token = new Token(1, "*"); - list.add(token); - } else if (chars1[index] == '/') { - Token token = new Token(1, "/"); - list.add(token); - }else if (chars1[index] == ' '){ - index++; - }else { - StringBuilder sb = new StringBuilder(); - while (chars1[index] >= '0' && chars1[index] <= '9') { - sb.append(chars1[index]); - index++; - } - Token token = new Token(2, sb.toString()); - list.add(token); - } - - } - - return list; - } - - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java deleted file mode 100644 index 8400bef4f8..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -public class PostfixExpr { - String expr = null; - int count; - ArrayList operator = new ArrayList(); - Stack numStack = new Stack(); - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - operator.add('+'); - operator.add('-'); - operator.add('*'); - operator.add('/'); - this.count = 0; - char[] exprs = this.expr.toCharArray(); - - - - while (count < exprs.length) { - if (operator.contains(exprs[count])) { - switch (exprs[count]) { - case '+': - add(); - break; - case '-': - subtract(); - break; - case '*': - multiply(); - break; - case '/': - divide(); - break; - - } - this.count++; - } else if (exprs[count] == ' ') { - this.count++; - } else { - int num = getNum(exprs); - numStack.push(num); - } - - } - int result = (int)numStack.pop(); - return result; - } - - private int getNum(char[] exprs) { - - int num = exprs[count]-'0'; - this.count++; - - while (exprs[count] >= '0' && exprs[count] <= '9') { - - num *= 10; - num += exprs[count]-'0'; - this.count++; - } - return num; - } - - private void add() { - int a = (int) numStack.pop(); - int b = (int) numStack.pop(); - numStack.push(a + b); - } - - private void subtract() { - int a = (int) numStack.pop(); - int b = (int) numStack.pop(); - numStack.push(b - a); - } - - private void multiply() { - int a = (int) numStack.pop(); - int b = (int) numStack.pop(); - numStack.push(b * a); - } - - private void divide() { - int a = (int) numStack.pop(); - int b = (int) numStack.pop(); - numStack.push(b / a); - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java deleted file mode 100644 index c0435a2db5..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic.stack.expr; - - - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java deleted file mode 100644 index 7a2c0379a1..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -public class PrefixExpr { - String expr = null; - int index; - ArrayList operator = new ArrayList(); - Stack numStack = new Stack(); - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - - operator.add('+'); - operator.add('-'); - operator.add('*'); - operator.add('/'); - char[] exprs = this.expr.toCharArray(); - this.index = exprs.length - 1; - - while (index >= 0) { - if (operator.contains(exprs[index])) { - switch (exprs[index]) { - case '+': - add(); - break; - case '-': - subtract(); - break; - case '*': - multiply(); - break; - case '/': - divide(); - break; - - } - this.index--; - } else if (exprs[index] == ' ') { - this.index--; - } else { - int num = getNum(exprs); - numStack.push(num); - } - - } - int result = (int) numStack.pop(); - return result; - - } - - private int getNum(char[] exprs) { - - int num = exprs[index] - '0'; - this.index--; - int i = 10; - while (exprs[index] >= '0' && exprs[index] <= '9') { - - int temp = exprs[index] - '0'; - temp *= i; - num += temp; - i *= 10; - this.index--; - } - return num; - } - - private void add() { - int a = (int) numStack.pop(); - int b = (int) numStack.pop(); - numStack.push(a + b); - } - - private void subtract() { - int a = (int) numStack.pop(); - int b = (int) numStack.pop(); - numStack.push(a - b); - } - - private void multiply() { - int a = (int) numStack.pop(); - int b = (int) numStack.pop(); - numStack.push(b * a); - } - - private void divide() { - int a = (int) numStack.pop(); - int b = (int) numStack.pop(); - numStack.push(a / b); - } - - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java deleted file mode 100644 index 5cec210e75..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.coding.basic.stack.expr; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - - } - -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java deleted file mode 100644 index 8579743fe9..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -class Token { - public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - - - -} \ No newline at end of file diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java deleted file mode 100644 index d3b0f167e1..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.basic.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - - public List parse(String expr) { - List tokens = new ArrayList<>(); - - int i = 0; - - while (i < expr.length()) { - - char c = expr.charAt(i); - - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR, String.valueOf(c)); - tokens.add(t); - i++; - - } else if (Character.isDigit(c)) { - - int nextOperatorIndex = indexOfNextOperator(i, expr); - String value = expr.substring(i, nextOperatorIndex); - Token t = new Token(Token.NUMBER, value); - tokens.add(t); - i = nextOperatorIndex; - - } else{ - System.out.println("char :["+c+"] is not number or operator,ignore"); - i++; - } - - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java deleted file mode 100644 index 399d3e857e..0000000000 --- a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.coding.basic.stack.expr; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void test() { - - TokenParser parser = new TokenParser(); - List tokens = parser.parse("300*20+12*5-20/4"); - - Assert.assertEquals(300, tokens.get(0).getIntValue()); - Assert.assertEquals("*", tokens.get(1).toString()); - Assert.assertEquals(20, tokens.get(2).getIntValue()); - Assert.assertEquals("+", tokens.get(3).toString()); - Assert.assertEquals(12, tokens.get(4).getIntValue()); - Assert.assertEquals("*", tokens.get(5).toString()); - Assert.assertEquals(5, tokens.get(6).getIntValue()); - Assert.assertEquals("-", tokens.get(7).toString()); - Assert.assertEquals(20, tokens.get(8).getIntValue()); - Assert.assertEquals("/", tokens.get(9).toString()); - Assert.assertEquals(4, tokens.get(10).getIntValue()); - } - -} diff --git a/group23/563253496/week8_datastructure/src/CircleQueue.java b/group23/563253496/week8_datastructure/src/CircleQueue.java deleted file mode 100644 index f69e5e6c5b..0000000000 --- a/group23/563253496/week8_datastructure/src/CircleQueue.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Created by bdl19 on 2017/4/25. - */ -public class CircleQueue { - - private final static int DEFAULT_SIZE = 10; - - //用数组来保存循环队列的元素 - private Object[] elementData = new Object[DEFAULT_SIZE]; - - //队头 - private int front = 0; - //队尾 - private int rear = 0; - - public boolean isEmpty() { - return this.front == this.rear; - } - - public int size() { - int size = this.rear - this.front; - return size < 0 ? size += DEFAULT_SIZE : size; - - } - - - public void enQueue(E data) { - if (this.isFull()) { - System.out.println("队列已满"); - return; - } - elementData[this.rear] = data; - this.rear = ++this.rear % DEFAULT_SIZE; - } - - - public E deQueue() { - if (this.isEmpty()) { - System.out.println("队列为空"); - return null; - } - E ele; - ele = (E) elementData[this.front]; - this.front = (++this.front) % DEFAULT_SIZE; - return ele; - } - - public boolean isFull() { - if ((this.rear + 1) % DEFAULT_SIZE == this.front) { - return true; - } else return false; - } -} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/Josephus.java b/group23/563253496/week8_datastructure/src/Josephus.java deleted file mode 100644 index 3d1425e125..0000000000 --- a/group23/563253496/week8_datastructure/src/Josephus.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Created by bdl19 on 2017/4/25. - */ - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -/** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, - * N个深陷绝境的人一致同意用这种方式减少生存人数: - * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * 该方法返回一个List, 包含了被杀死人的次序 - * "[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2) - * - * @author liuxin - */ -public class Josephus { - - public static List execute(int n, int m) { - List result = new ArrayList<>(); - - List list = new LinkedList(); - int interval = m - 1; - - for (int i = 0; i < n; i++) { - list.add(i); - } - int index = 0; - while (list.size() > 0) { - /*for (int i = 0; i < m; i++) { - index = (++index) % list.size(); - - }*/ - index += interval; - index %= list.size(); - result.add(list.get(index)); - list.remove(index); - - } - - - return result; - } - -} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/JosephusTest.java b/group23/563253496/week8_datastructure/src/JosephusTest.java deleted file mode 100644 index fb38138a32..0000000000 --- a/group23/563253496/week8_datastructure/src/JosephusTest.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Created by bdl19 on 2017/4/25. - */ -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - - - -public class JosephusTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testExecute() { - - Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); - - } - -} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/Queue.java b/group23/563253496/week8_datastructure/src/Queue.java deleted file mode 100644 index e2f5ce9a41..0000000000 --- a/group23/563253496/week8_datastructure/src/Queue.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Created by bdl19 on 2017/4/25. - */ -import java.util.NoSuchElementException; - -public class Queue { - private Node first; - private Node last; - private int size; - - - private static class Node { - private E item; - private Node next; - } - - - public Queue() { - first = null; - last = null; - size = 0; - } - - - public boolean isEmpty() { - return first == null; - } - - public int size() { - return size; - } - - - - public void enQueue(E data) { - Node oldlast = last; - last = new Node(); - last.item = data; - last.next = null; - if (isEmpty()) { - first = last; - } - else{ - oldlast.next = last; - } - size++; - } - - public E deQueue() { - if (isEmpty()) { - throw new NoSuchElementException("Queue underflow"); - } - E item = first.item; - first = first.next; - size--; - if (isEmpty()) { - last = null; - } - return item; - } - -} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java b/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java deleted file mode 100644 index c960f09bbb..0000000000 --- a/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Created by bdl19 on 2017/4/25. - */ -import java.util.Stack; - -/** - * 用两个栈来实现一个队列 - * @author liuxin - * - * @param - */ -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - - - public QueueWithTwoStacks() { - stack1 = new Stack(); - stack2 = new Stack(); - } - - - - - public boolean isEmpty() { - - return stack1.isEmpty(); - } - - - - public int size() { - return stack1.size(); - } - - - - public void enQueue(E item) { - stack1.push(item); - } - - public E deQueue() { - E ele ; - if (stack1.size() == 0) { - throw new RuntimeException("队列为空!"); - } - while (stack1.size() > 1) { - stack2.push(stack1.pop()); - } - ele = stack1.pop(); - while(!stack2.isEmpty()){ - stack1.push(stack2.pop()); - } - - return ele; - } - - - -} \ No newline at end of file diff --git a/group23/563253496/week9_datastructure/src/QuickMinStack.java b/group23/563253496/week9_datastructure/src/QuickMinStack.java deleted file mode 100644 index 3b135521a0..0000000000 --- a/group23/563253496/week9_datastructure/src/QuickMinStack.java +++ /dev/null @@ -1,40 +0,0 @@ -//package com.coding.basic.stack; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -/** - * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 - * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 - * - * @author liuxin - */ -public class QuickMinStack { - LinkedList list = new LinkedList(); - LinkedList temp = new LinkedList<>(); - int min = Integer.MAX_VALUE; - - public void push(int data) { - if (data < min) { - min = data; - } - list.add(data); - } - - public int pop() { - int num = list.remove(list.size() - 1); - if (num == min) { - for (int tmp : list) { - temp.add(tmp); - } - } - Collections.sort(temp); - min = temp.get(0); - return list.remove(list.size() - 1); - } - - public int findMin() { - return min; - } -} \ No newline at end of file diff --git a/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java b/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java deleted file mode 100644 index 238f5cff0f..0000000000 --- a/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Created by bdl19 on 2017/5/6. - */ - -import java.util.*; - - -public class StackWithTwoQueues { - - private Queue queue1 = new LinkedList(); - private Queue queue2 = new LinkedList(); - - public void push(int data) { - if(queue2.isEmpty()){ - queue1.add(data); - }else{ - queue2.add(data); - } - } - - public int pop() { - if (queue1.size() == 0 && queue2.size() == 0) { - throw new IndexOutOfBoundsException(); - } - - - - if(queue2.isEmpty()){ - while(!(queue1.size()==1)){ - queue2.add(queue1.remove()); - } - return queue1.remove(); - - }else{ - while(!(queue2.size()==1)){ - queue1.add(queue2.remove()); - } - return queue2.remove(); - } - - - } - - public static void main(String[] args) { - StackWithTwoQueues s = new StackWithTwoQueues(); - s.push(1); - s.push(2); - s.push(3); - for (int i = 0; i < 3; i++) { - System.out.println(s.pop()); - } - } -} \ No newline at end of file diff --git a/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java b/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java deleted file mode 100644 index 28bc0a30af..0000000000 --- a/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Created by bdl19 on 2017/5/6. - */ -public class TwoStackInOneArray { - Object[] data = new Object[10]; - - private int index1 = 0; - private int index2 = data.length - 1; - - private boolean isFull() { - if (index1 == index2) { - return true; - } else return false; - } - - private void extendCapacity() { - Object[] temp = new Object[data.length + data.length / 2]; - for (int i = 0; i <= index1; i++) { - temp[i] = data[i]; - } - int indext = data.length - 1; - for (int i = temp.length - 1; i >= data.length - index2; i--) { - temp[i] = indext; - indext--; - } - index2 = temp.length - (temp.length - index1); - this.data = temp; - } - - /** - * 向第一个栈中压入元素 - * - * @param o - */ - public void push1(Object o) { - if (this.isFull()) { - extendCapacity(); - } - data[index1] = o; - index1++; - - } - - /** - * 从第一个栈中弹出元素 - * - * @return - */ - public Object pop1() { - index1--; - Object o = data[index1]; - data[index1] = null; - return o; - } - - /** - * 获取第一个栈的栈顶元素 - * - * @return - */ - - public Object peek1() { - return data[index1 - 1]; - } - - /* - * 向第二个栈压入元素 - */ - public void push2(Object o) { - if (this.isFull()) { - extendCapacity(); - } - data[index2] = o; - index2--; - } - - /** - * 从第二个栈弹出元素 - * - * @return - */ - public Object pop2() { - - Object o = data[++index2]; - data[index2] = null; - return o; - } - - /** - * 获取第二个栈的栈顶元素 - * - * @return - */ - - public Object peek2() { - - return data[index2 + 1]; - } - -} \ No newline at end of file diff --git a/group23/565832157/src/com/coderising/array/ArrayUtil.java b/group23/565832157/src/com/coderising/array/ArrayUtil.java deleted file mode 100644 index e5ddb476a6..0000000000 --- a/group23/565832157/src/com/coderising/array/ArrayUtil.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.coderising.array; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin){ - - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - - public int[] removeZero(int[] oldArray){ - return null; - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2){ - return null; - } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - return null; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - public int[] fibonacci(int max){ - return null; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - */ - public int[] getPrimes(int max){ - return null; - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max){ - return null; - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator){ - return null; - } - - -} diff --git a/group23/565832157/src/com/coderising/download/DownloadThread.java b/group23/565832157/src/com/coderising/download/DownloadThread.java deleted file mode 100644 index 900a3ad358..0000000000 --- a/group23/565832157/src/com/coderising/download/DownloadThread.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - - public DownloadThread( Connection conn, int startPos, int endPos){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - public void run(){ - - } -} diff --git a/group23/565832157/src/com/coderising/download/FileDownloader.java b/group23/565832157/src/com/coderising/download/FileDownloader.java deleted file mode 100644 index c3c8a3f27d..0000000000 --- a/group23/565832157/src/com/coderising/download/FileDownloader.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.coderising.download; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; - - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - - public FileDownloader(String _url) { - this.url = _url; - - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - try { - - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - new DownloadThread(conn,0,length-1).start(); - - } catch (ConnectionException e) { - e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } - } - - - - - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - -} diff --git a/group23/565832157/src/com/coderising/download/FileDownloaderTest.java b/group23/565832157/src/com/coderising/download/FileDownloaderTest.java deleted file mode 100644 index 4ff7f46ae0..0000000000 --- a/group23/565832157/src/com/coderising/download/FileDownloaderTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.coderising.download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.coderising.download.api.ConnectionManager; -import com.coderising.download.api.DownloadListener; -import com.coderising.download.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url = "http://localhost:8080/test.jpg"; - - FileDownloader downloader = new FileDownloader(url); - - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); - - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} diff --git a/group23/565832157/src/com/coderising/download/api/Connection.java b/group23/565832157/src/com/coderising/download/api/Connection.java deleted file mode 100644 index 0957eaf7f4..0000000000 --- a/group23/565832157/src/com/coderising/download/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.download.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group23/565832157/src/com/coderising/download/api/ConnectionException.java b/group23/565832157/src/com/coderising/download/api/ConnectionException.java deleted file mode 100644 index 1551a80b3d..0000000000 --- a/group23/565832157/src/com/coderising/download/api/ConnectionException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public class ConnectionException extends Exception { - -} diff --git a/group23/565832157/src/com/coderising/download/api/ConnectionManager.java b/group23/565832157/src/com/coderising/download/api/ConnectionManager.java deleted file mode 100644 index ce045393b1..0000000000 --- a/group23/565832157/src/com/coderising/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.coderising.download.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group23/565832157/src/com/coderising/download/api/DownloadListener.java b/group23/565832157/src/com/coderising/download/api/DownloadListener.java deleted file mode 100644 index bf9807b307..0000000000 --- a/group23/565832157/src/com/coderising/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.coderising.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java b/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java deleted file mode 100644 index 36a9d2ce15..0000000000 --- a/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.coderising.download.impl; - -import java.io.IOException; - -import com.coderising.download.api.Connection; - -public class ConnectionImpl implements Connection{ - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - - return null; - } - - @Override - public int getContentLength() { - - return 0; - } - - @Override - public void close() { - - - } - -} diff --git a/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java deleted file mode 100644 index 172371dd55..0000000000 --- a/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.coderising.download.impl; - -import com.coderising.download.api.Connection; -import com.coderising.download.api.ConnectionException; -import com.coderising.download.api.ConnectionManager; - -public class ConnectionManagerImpl implements ConnectionManager { - - @Override - public Connection open(String url) throws ConnectionException { - - return null; - } - -} diff --git a/group23/565832157/src/com/coderising/litestruts/LoginAction.java b/group23/565832157/src/com/coderising/litestruts/LoginAction.java deleted file mode 100644 index dcdbe226ed..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.coderising.litestruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/group23/565832157/src/com/coderising/litestruts/Struts.java b/group23/565832157/src/com/coderising/litestruts/Struts.java deleted file mode 100644 index 6df190d484..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/Struts.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.coderising.litestruts; - -import java.lang.reflect.Method; -import java.util.Map; - - - -public class Struts { - - - public static View runAction(String actionName, Map parameters) { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - - return null; - } - -} diff --git a/group23/565832157/src/com/coderising/litestruts/StrutsTest.java b/group23/565832157/src/com/coderising/litestruts/StrutsTest.java deleted file mode 100644 index b8c81faf3c..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.coderising.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/565832157/src/com/coderising/litestruts/View.java b/group23/565832157/src/com/coderising/litestruts/View.java deleted file mode 100644 index 07df2a5dab..0000000000 --- a/group23/565832157/src/com/coderising/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.coderising.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/565832157/src/com/coding/basic/ArrayList.java b/group23/565832157/src/com/coding/basic/ArrayList.java deleted file mode 100644 index 1f185736f9..0000000000 --- a/group23/565832157/src/com/coding/basic/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group23/565832157/src/com/coding/basic/BinaryTreeNode.java b/group23/565832157/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group23/565832157/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group23/565832157/src/com/coding/basic/Iterator.java b/group23/565832157/src/com/coding/basic/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group23/565832157/src/com/coding/basic/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/565832157/src/com/coding/basic/LinkedList.java b/group23/565832157/src/com/coding/basic/LinkedList.java deleted file mode 100644 index 7d037a6428..0000000000 --- a/group23/565832157/src/com/coding/basic/LinkedList.java +++ /dev/null @@ -1,265 +0,0 @@ -<<<<<<< HEAD:liuxin/src/com/coding/basic/LinkedList.java -package com.coding.basic; - -public class LinkedList implements List { - private int size; - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - - return size; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - } - - /** - * 把该链表逆置 - * head head - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - /** - * 长度超过1的单链表需要逆转 - */ - if(size>1){ - Node pre = head; - Node cur = head.next; - Node next = null; - while(cur!=null){ - next = cur.next; - cur.next = pre; - pre = cur; - cur = next; - } - - } - } - - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始,删除length个元素 ,注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection(LinkedList list){ - - return null; - } -} -======= -package com.coding.basic; - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} ->>>>>>> upstream/master:group23/565832157/src/com/coding/basic/LinkedList.java diff --git a/group23/565832157/src/com/coding/basic/List.java b/group23/565832157/src/com/coding/basic/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group23/565832157/src/com/coding/basic/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/565832157/src/com/coding/basic/Queue.java b/group23/565832157/src/com/coding/basic/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group23/565832157/src/com/coding/basic/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group23/565832157/src/com/coding/basic/Stack.java b/group23/565832157/src/com/coding/basic/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group23/565832157/src/com/coding/basic/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group23/601689050/.gitattributes b/group23/601689050/.gitattributes deleted file mode 100644 index bdb0cabc87..0000000000 --- a/group23/601689050/.gitattributes +++ /dev/null @@ -1,17 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Custom for Visual Studio -*.cs diff=csharp - -# Standard to msysgit -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain diff --git a/group23/601689050/1List&BinaryTreeNode/ArrayList.java b/group23/601689050/1List&BinaryTreeNode/ArrayList.java deleted file mode 100644 index 5a4169dc9b..0000000000 --- a/group23/601689050/1List&BinaryTreeNode/ArrayList.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.bjsxd.test; - -public class ArrayList implements List { - private Object[] elementData = new Object[100]; - private int size = 0; - Object[] temp = null; - - public void add(Object o) { - if (size < elementData.length) { - size++; - Object[] target = new Object[elementData.length + size]; - System.arraycopy(elementData, 0, target, 0, elementData.length); - elementData[size] = o; - } - } - - public void add(int index, Object o) { - if (index < 0 || o == null) { - throw new IllegalArgumentException("��Ӷ������"); - } else if (index <= elementData.length) { - add(o); - } else if (index > elementData.length) { - throw new IllegalArgumentException("��Ӷ���Խ��"); - } - - if (size <= elementData.length) { - this.size++; - } - Object[] target = new Object[this.size]; - System.arraycopy(elementData, 0, target, 0, index); - target[index] = o; - System.arraycopy(elementData, index, target, index + 1, elementData.length - index); - } - - public Object get(int index) { - if (index < 0 || index >= elementData.length) { - return false; - } else { - return elementData[index]; - } - } - - public Object remove(int index) { - if (index < 0 || index >= elementData.length) { - throw new IllegalArgumentException("ɾ�����󲻴���"); - } else { - for (int i = index; i < elementData.length; i++) { - elementData[i] = elementData[i + 1]; - } - return elementData[index]; - } - } - - public int size() { - return this.size; - } - -} diff --git a/group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java b/group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java deleted file mode 100644 index 3687306f5e..0000000000 --- a/group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.bjsxd.test; - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - private BinaryTreeNode root; - - public BinaryTreeNode(BinaryTreeNode root){ - this.root = root; - - } - - public BinaryTreeNode(BinaryTreeNode left,BinaryTreeNode right,Object data){ - this.left = left; - this.right = right; - this.data = data; - } - - public void buildTree(){ - - } - - public BinaryTreeNode(Object data){ - this(null,null,data); - } - public Object getData(){ - return data; - } - public void setData(Object data){ - this.data = data; - } - public BinaryTreeNode getLeft(){ - return left; - } - public void setLeft(BinaryTreeNode left){ - this.left = left; - - } - public BinaryTreeNode getRight(){ - return right; - } - public void setRight(BinaryTreeNode right){ - this.right = right; - } - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group23/601689050/1List&BinaryTreeNode/Iterator.java b/group23/601689050/1List&BinaryTreeNode/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group23/601689050/1List&BinaryTreeNode/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/601689050/1List&BinaryTreeNode/LinkedList.java b/group23/601689050/1List&BinaryTreeNode/LinkedList.java deleted file mode 100644 index ee173bec67..0000000000 --- a/group23/601689050/1List&BinaryTreeNode/LinkedList.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.bjsxd.test; - -public class LinkedList implements List{ - private static class Node{ - Object data; - Node next; - } - private Node head; - private Node last; - public void add (Object o){ - if (head == null){ - head = new Node(); - head.data = o; - head.next = null; - }else{ - Node MyNode = new Node(); - MyNode = head; - while (MyNode.next != null){ - MyNode = MyNode.next; - } - Node AddNode = new Node(); - MyNode.next = AddNode; - AddNode.data = o; - } - } - public void add(int index,Object o){ - if(index<0 || o ==null){ - throw new IllegalArgumentException("ӶλóҲΪ"); - }else if (index == 0 && head == null){ - head = new Node(); - head.data = o; - head.next = null; - }else if (index > 0 && head == null){ - throw new IllegalArgumentException("Ӷλó"); - }else{ - Node SrcNode = new Node(); - Node AddNode = new Node(); - Node SrcNode2 = new Node(); - SrcNode = head; - for(int i=0;i<=index;i++){ - SrcNode = SrcNode.next; - } - AddNode.next = SrcNode; - AddNode.data = o; - for (int i=0;i size){ - throw new IllegalArgumentException("ɾλó"); - }else{ - for (int i=0;i front){ - return rear - front; - }else - return Q.length-1; - } - -} diff --git a/group23/601689050/1List&BinaryTreeNode/Stack.java b/group23/601689050/1List&BinaryTreeNode/Stack.java deleted file mode 100644 index 106d2ecc7d..0000000000 --- a/group23/601689050/1List&BinaryTreeNode/Stack.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.bjsxd.test; - -public class Stack { - private int top = -1; - private Object[] elements; - private int size = 0; - public Stack(){ - elements = new Object[100]; - } - public void push (Object o){ - elements[this.size] = o; - this.size++; - } - public Object pop(){ - if (this.size != 0){ - Object temp = elements[size-1]; - elements[size-1]=0; - size--; - return temp; - }else{ - System.out.println("ջ"); - return 0; - } - } - public Object peek(){ - if(!this.isEmpty()){ - Object temp = elements[this.size-1]; - elements[this.size-1] = 0; - this.size--; - return temp; - }else{ - System.out.println("ջ"); - return 0; - } - } - public boolean isEmpty(){ - return this.size == 0; - } -} diff --git a/group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java b/group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java deleted file mode 100644 index 3c6244ff90..0000000000 --- a/group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java +++ /dev/null @@ -1,65 +0,0 @@ -package loader; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; -/** - * Created by Lxx on 2017/4/23. - */ -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,";"); - } - - -} diff --git a/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java b/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java deleted file mode 100644 index 8e4e172f25..0000000000 --- a/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package test.loader; - -import loader.ClassFileLoader; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class ClassFileLoaderTest { - static String path1 = "D:\\JavaProject\\4week_minijvm\\out\\production\\4week_minijvm"; - static String path2 = "D:\\temp"; - - - - @Before -public void before() throws Exception { -} - -@After -public void after() throws Exception { -} - -/** -* -* Method: readBinaryCode(String className) -* -*/ -public void testClassPath(){ - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - loader.addClassPath(path2); - - String clzPath = loader.getClassPath(); - - Assert.assertEquals(path1+";"+path2,clzPath); - -} - - @Test - public void testClassFileLength() { - - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - - String className = "test.loader.EmployeeV1"; - - byte[] byteCodes = loader.readBinaryCode(className); - - // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1056, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); - String className = "test.loader.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - - - String acctualValue = this.byteToHexString(codes); - - Assert.assertEquals("cafebabe", acctualValue); - } - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i capacity) { - last = last.prev; - last.next = null; - } - } else { - moveToFirst(iteratorNode); - } - } - } - - } - - private void moveLastToFirst() { - last.next = first; - first.prev = last; - first = last; - last = last.prev; - last.next = null; - first.prev = null; - } - private void moveToFirst(Node iteratorNode){ - iteratorNode.prev.next = iteratorNode.next; - iteratorNode.next.prev = iteratorNode.prev; - iteratorNode.prev = null; - iteratorNode.next = first; - first.prev = iteratorNode; - first = iteratorNode; - } - - private void addToFirst(int pageNum) { - Node node = new Node(); - node.pageNum = pageNum; - node.prev = null; - node.next = first; - first.prev = node; - first = node; - size++; - } - - - 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/group23/601689050/4weekLRU&JVM/LRU/LRUPageFrameTest.java b/group23/601689050/4weekLRU&JVM/LRU/LRUPageFrameTest.java deleted file mode 100644 index a7dd99ec58..0000000000 --- a/group23/601689050/4weekLRU&JVM/LRU/LRUPageFrameTest.java +++ /dev/null @@ -1,29 +0,0 @@ -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()); - } - -} diff --git a/group23/601689050/4weekLRU&JVM/LRU/LinkedList.java b/group23/601689050/4weekLRU&JVM/LRU/LinkedList.java deleted file mode 100644 index 4a71816e5d..0000000000 --- a/group23/601689050/4weekLRU&JVM/LRU/LinkedList.java +++ /dev/null @@ -1,313 +0,0 @@ -import java.util.Objects; -import java.util.Stack; - -public class LinkedList implements List { - - private Node head; - private Node rear; - public boolean isEmpty(){ - return true; - } - - public void add(Object o){ - if(isEmpty()) - addFirst(o); - else - addLast(o); - } - public void add(int index , Object o){ - if(index<0 || o ==null){ - throw new IllegalArgumentException("不合法"); - } else if (index == 0 && head == null){ - addFirst(o); - }else if(index>0 && head == null){ - throw new IllegalArgumentException("不合法"); - }else{ - Node srcNode = (Node) this.get(index); - Node newNode = new Node(); - newNode.data = o; - newNode.next = srcNode.next; - srcNode.next.previous = newNode; - srcNode.next = newNode; - newNode.previous = srcNode; - } - } - public Object get(int index){ - Node newNode = new Node(); - for(int i = 0;i7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - Node p1,p2 = null; - p1 = head; - while (head.next != null){ - p2 = head.next; - head.next = p2.next; - p2.next = p1; - p1 = p2; - } - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - int size = this.size(); - Node newNode = new Node(); - newNode = head; - if(size%2 == 0){ - int length = size/2; - for(int i = 0;i101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - int[] listB = new int[list.size()-1]; - int[] listA = new int[list.size()-1]; - int size = list.size(); - for(int i=0;i min && (int)newNode.data min && (int)newNode.data > max){ - break; - } - } - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - LinkedList listA = this; - LinkedList listB = list; - LinkedList listC = new LinkedList(); - if(listA == null){ - return list; - } - if(listB == null){ - return this; - } - Node p1 = listA.head; - Node p2 = listB.head; - Node p3 = listC.head; - while(p1 != null && p2 !=null) { - if ((int) p1.data <= (int) p2.data) { - p3.next = p1; - p1 = p1.next; - } else { - p3.next = p2; - p2 = p2.next; - } - p3 = p3.next; - } - if(p1 == null){ - p3.next = p2; - } - if(p2 == null){ - p3.next = p1; - } - return listC; - } -} diff --git a/group23/601689050/4weekLRU&JVM/LRU/List.java b/group23/601689050/4weekLRU&JVM/LRU/List.java deleted file mode 100644 index 4f7bcc71a8..0000000000 --- a/group23/601689050/4weekLRU&JVM/LRU/List.java +++ /dev/null @@ -1,7 +0,0 @@ -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/601689050/5weekStack/stack/Stack.java b/group23/601689050/5weekStack/stack/Stack.java deleted file mode 100644 index 7b394d9f30..0000000000 --- a/group23/601689050/5weekStack/stack/Stack.java +++ /dev/null @@ -1,70 +0,0 @@ -package stack; - -import java.util.ArrayList; -import java.util.EmptyStackException; - -/** - * Created by Lxx on 2017/4/23. - */ -public class Stack { - - private ArrayList array; - private int count; - - - public Stack() { - array = new ArrayList(); - } - - public void push(Object o) { - count++; - array.add(o); - - } - - public Object pop() { - count--; - Object o = array.get(count); - array.remove(count); - - return o; - } - - public Object peek() { - - if(count == 0){ - throw new EmptyStackException(); - } - return array.get(array.size()-1); - } - - public boolean isEmpty() { - return array.size() == 0; - } - - public int size() { - - return count; - } - - public String toString(){ - - StringBuilder string = new StringBuilder(); - Stack s = new Stack(); - int size = this.size(); - for(int i = 0; i < size; i++){ - string.append(this.peek().toString()); - if(i < size-1 ) - string.append(","); - s.push(this.pop()); - } - - while(!s.isEmpty()){ - this.push(s.pop()); - } - - return string.toString(); - } - - -} diff --git a/group23/601689050/5weekStack/stack/StackUtil.java b/group23/601689050/5weekStack/stack/StackUtil.java deleted file mode 100644 index 00920cdb08..0000000000 --- a/group23/601689050/5weekStack/stack/StackUtil.java +++ /dev/null @@ -1,133 +0,0 @@ -package stack; - -/** - * Created by Lxx on 2017/4/23. - */ -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) { - if(s == null || s.isEmpty()){ - return; - } - - Stack tmp = new Stack(); - while(!s.isEmpty()){ - tmp.push(s.pop()); - } - while(!tmp.isEmpty()){ - Integer top = (Integer) tmp.pop(); - addToBottom(s,top); - } - - - } - public static void addToBottom(Stack s, Integer value){ - if(s.isEmpty()){ - s.push(value); - } else{ - Integer top = (Integer) s.pop(); - addToBottom(s,value); - s.push(top); - } - - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s, Object o) { - - if(s == null || s.isEmpty()){ - return; - } - Stack tmpStack = new Stack(); - Stack s1 = new Stack(); - while(!s.isEmpty()){ - Object value = s.pop(); - if(!value.equals(o)){ - tmpStack.push(value); - } - } - - while(!tmpStack.isEmpty()){ - s1.push(tmpStack.pop()); - } - while(!s1.isEmpty()){ - s.push(s1.pop()); - } - - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param len - * @return - */ - public static Object[] getTop(Stack s, int len) { - - if(s == null || s.isEmpty() || s.size() < len || len <= 0){ - return null; - } - Stack tmpStack = new Stack(); - int i = 0; - Object[] topElement = new Object[len]; - while(!s.isEmpty()){ - Object top = s.pop(); - tmpStack.push(top); - topElement[i++] = top; - if(i == len){ - break; - } - } - while (!tmpStack.isEmpty()){ - s.push(tmpStack.pop()); - } - return topElement; - } - - - /** - * 字符串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) { - - Stack tmpStack = new Stack(); - for (int i = 0; i < s.length(); i++) { - char tmpChar = s.charAt(i); - if (tmpChar == '(' || tmpChar == '{' || tmpChar == '[') { - tmpStack.push(tmpChar); - } else if (tmpChar == ')') { - char compareChar = (char) tmpStack.pop(); - if (compareChar != '(') { - return false; - } - } else if (tmpChar == ']') { - char compareChar = (char) tmpStack.pop(); - if (compareChar != '[') { - return false; - } - } else if (tmpChar == '}') { - char compareChar = (char) tmpStack.pop(); - if (compareChar != '{') { - return false; - } - } - } - return tmpStack.size() == 0; - } -} diff --git a/group23/601689050/5weekStack/test/StackUtilTest.java b/group23/601689050/5weekStack/test/StackUtilTest.java deleted file mode 100644 index 413d9f3c4e..0000000000 --- a/group23/601689050/5weekStack/test/StackUtilTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package test; -import stack.*; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import stack.StackUtil; - -/** - * Created by Lxx on 2017/4/23. - */ -public class StackUtilTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - - @Test - public void testReverse() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("5,4,3,2,1", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("1,2,3,4,5", s.toString()); - } - - @Test - public void testRemove() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("1,3", s.toString()); - } - - @Test - public void testGetTop() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } - } - - @Test - public void testIsValidPairs() { - - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } - -} diff --git a/group23/601689050/6weekInfixExpr/InfixExpr.java b/group23/601689050/6weekInfixExpr/InfixExpr.java deleted file mode 100644 index 7b833931b3..0000000000 --- a/group23/601689050/6weekInfixExpr/InfixExpr.java +++ /dev/null @@ -1,61 +0,0 @@ -import java.util.*; -import java.util.Stack; - -/** - * Created by Lxx on 2017/4/28. - */ -public class InfixExpr { - String expr = null; - public InfixExpr(String expr){ - this.expr = expr; - } - public float evaluate(){ - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - Stack opStack = new Stack<>(); - Stack numStack = new Stack(); - for(Token token : tokens){ - if(token.isOpretor()){ - if(opStack.isEmpty()){ - opStack.push(token); - }else { - while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(),f1,f2); - numStack.push(result); - } - opStack.push(token); - } - } - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - while (!opStack.isEmpty()){ - Token token = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(),f1,f2)); - } - return numStack.pop().floatValue(); - - } - - private Float calculate(String op, float f1, float f2) { - if(op.equals("+")){ - return f1 + f2; - } - if(op.equals("-")){ - return f1 - f2; - } - if(op.equals("*")){ - return f1 * f2; - } - if(op.equals("/")){ - return f1 / f2; - } - return null; - } -} diff --git a/group23/601689050/6weekInfixExpr/InfixExprTest.java b/group23/601689050/6weekInfixExpr/InfixExprTest.java deleted file mode 100644 index bf2f8e91a9..0000000000 --- a/group23/601689050/6weekInfixExpr/InfixExprTest.java +++ /dev/null @@ -1,50 +0,0 @@ -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Lxx on 2017/4/28. - */ -public class InfixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); - { - InfixExpr expr = new InfixExpr("2+3*4+5"); - Assert.assertEquals(19.0, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); - Assert.assertEquals(100.0, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("3*20/2"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("20/2*3"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - - { - InfixExpr expr = new InfixExpr("10-30+50"); - Assert.assertEquals(30, expr.evaluate(), 0.001f); - } - { - InfixExpr expr = new InfixExpr("10-2*3+50"); - Assert.assertEquals(54, expr.evaluate(), 0.001f); - } - - } -} diff --git a/group23/601689050/6weekInfixExpr/Stack.java b/group23/601689050/6weekInfixExpr/Stack.java deleted file mode 100644 index 8a15be4366..0000000000 --- a/group23/601689050/6weekInfixExpr/Stack.java +++ /dev/null @@ -1,50 +0,0 @@ -import java.util.ArrayList; -import java.util.EmptyStackException; - -/** - * Created by Lxx on 2017/4/28. - */ -public class Stack { - public ArrayList array; - public int count; - public Stack(){ - array = new ArrayList(); - } - public void push (Object o){ - count ++ ; - array.add(o); - } - public Object pop(){ - count -- ; - Object o = array.get(count); - array.remove(o); - return o; - } - public Object peek(){ - if(count == 0){ - throw new EmptyStackException(); - } - return array.get(array.size()-1); - } - public boolean isEmpty(){ - return array.size() == 0; - } - public int size(){ - return count; - } - public String toString(){ - StringBuilder string = new StringBuilder(); - Stack s = new Stack(); - int size = this.size(); - for(int i = 0;i OPERATORS = Arrays.asList("+","-","*","/"); - public static final Map priorities = new HashMap<>(); - static { - priorities.put("+",1); - priorities.put("-",1); - priorities.put("*",2); - priorities.put("/",2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type,String value){ - this.type = type; - this.value = value; - } - public boolean isNumber(){ - return type == NUMBER; - } - public boolean isOpretor(){ - return type == OPERATOR; - } - public int getIntValue(){ - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - public boolean hasHigherPriority(Token t){ - if (!this.isOpretor() && !t.isOpretor()){ - throw new RuntimeException(); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } -} diff --git a/group23/601689050/6weekInfixExpr/TokenParser.java b/group23/601689050/6weekInfixExpr/TokenParser.java deleted file mode 100644 index 3e966cc0a3..0000000000 --- a/group23/601689050/6weekInfixExpr/TokenParser.java +++ /dev/null @@ -1,47 +0,0 @@ -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Lxx on 2017/4/28. - */ -public class TokenParser { - public List parse(String expr){ - List tokens = new ArrayList<>(); - int i = 0; - while (i < expr.length()) { - - char c = expr.charAt(i); - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR,String.valueOf(c)); - tokens.add(t); - i++; - }else if(Character.isDigit(c)){ - int nextOperatorIndex = indexOfNextOperator(i,expr); - String value = expr.substring(i,nextOperatorIndex); - Token t = new Token(Token.NUMBER,value); - tokens.add(t); - i = nextOperatorIndex; - }else { - System.out.println("输入值不符合要求"); - i++; - } - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - while(Character.isDigit(expr.charAt(i))){ - i++; - if(i == expr.length()){ - break; - } - } - return i; - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group23/601689050/7weekExpr2/InfixExpr.java b/group23/601689050/7weekExpr2/InfixExpr.java deleted file mode 100644 index 77c310465e..0000000000 --- a/group23/601689050/7weekExpr2/InfixExpr.java +++ /dev/null @@ -1,61 +0,0 @@ -import java.util.List; -import java.util.Stack; - -/** - * Created by Lxx on 2017/4/29. - */ -public class InfixExpr { - String expr = null; - public InfixExpr(String expr){ - this.expr = expr; - } - public float evaluate(){ - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - Stack opStack = new Stack<>(); - Stack numStack = new Stack(); - for(Token token : tokens){ - if(token.isOperator()){ - if(opStack.isEmpty()){ - opStack.push(token); - }else { - while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ - Token prevOperator = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - Float result = calculate(prevOperator.toString(),f1,f2); - numStack.push(result); - } - opStack.push(token); - } - } - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - } - while (!opStack.isEmpty()){ - Token token = opStack.pop(); - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(),f1,f2)); - } - return numStack.pop().floatValue(); - - } - - private Float calculate(String op, float f1, float f2) { - if(op.equals("+")){ - return f1 + f2; - } - if(op.equals("-")){ - return f1 - f2; - } - if(op.equals("*")){ - return f1 * f2; - } - if(op.equals("/")){ - return f1 / f2; - } - return null; - } -} diff --git a/group23/601689050/7weekExpr2/InfixToPostfix.java b/group23/601689050/7weekExpr2/InfixToPostfix.java deleted file mode 100644 index 7833ebf8f7..0000000000 --- a/group23/601689050/7weekExpr2/InfixToPostfix.java +++ /dev/null @@ -1,35 +0,0 @@ -import java.util.*; -import java.util.Stack; - -/** - * Created by Lxx on 2017/4/29. - */ -public class InfixToPostfix { - - String expr = null; - public InfixToPostfix(String expr){ - this.expr = expr; - } - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - Stack opStack = new Stack<>(); - Stack allStack = new Stack<>(); - public Stack change(){ - for(Token token : tokens){ - if(token.isOperator()){ - if(opStack.isEmpty()){ - opStack.push(token); - }else{ - while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ - Token preOperator = opStack.pop(); - allStack.push(preOperator.toString()); - } - } - } - if (token.isNumber()){ - allStack.push(token.toString()); - } - } - return allStack; - } -} diff --git a/group23/601689050/7weekExpr2/PostfixExpr.java b/group23/601689050/7weekExpr2/PostfixExpr.java deleted file mode 100644 index 5c128db330..0000000000 --- a/group23/601689050/7weekExpr2/PostfixExpr.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.*; -import java.util.Stack; - -/** - * Created by Lxx on 2017/4/29. - */ -public class PostfixExpr { - String expr = null; - - public PostfixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - Stack numStack = new Stack<>(); - for(Token token : tokens){ - if(token.isNumber()){ - numStack.push(new Float(token.getIntValue())); - } - if(token.isOperator()){ - Float f2 = numStack.pop(); - Float f1 = numStack.pop(); - numStack.push(calculate(token.toString(),f1,f2)); - } - } - return numStack.pop().floatValue(); - } - private Float calculate(String op, float f1, float f2){ - if(op.equals("+")){ - return f1 + f2; - } - if(op.equals("-")){ - return f1 - f2; - } - if(op.equals("*")){ - return f1 * f2; - } - if (op.equals("/")){ - return f1 / f2; - } - return null; - } -} diff --git a/group23/601689050/7weekExpr2/PostfixExprTest.java b/group23/601689050/7weekExpr2/PostfixExprTest.java deleted file mode 100644 index bad5b82bec..0000000000 --- a/group23/601689050/7weekExpr2/PostfixExprTest.java +++ /dev/null @@ -1,37 +0,0 @@ -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Lxx on 2017/4/29. - */ -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } -} diff --git a/group23/601689050/7weekExpr2/PrefixExpr.java b/group23/601689050/7weekExpr2/PrefixExpr.java deleted file mode 100644 index 77652af742..0000000000 --- a/group23/601689050/7weekExpr2/PrefixExpr.java +++ /dev/null @@ -1,51 +0,0 @@ -import java.util.*; -import java.util.Stack; - -/** - * Created by Lxx on 2017/4/29. - */ -public class PrefixExpr { - String expr = null; - - public PrefixExpr(String expr) { - this.expr = expr; - } - - public float evaluate() { - TokenParser parser = new TokenParser(); - List tokens = parser.parse(this.expr); - Stack numStack = new Stack<>(); - Stack allStack = new Stack<>(); - for (Token token : tokens) { - allStack.push(token); - } - while (!allStack.isEmpty()) { - if (allStack.peek().isNumber()) { - numStack.push(new Float(allStack.pop().getIntValue())); - } - if (allStack.peek().isOperator()) { - Token token = allStack.pop(); - Float f1 = numStack.pop(); - Float f2 = numStack.pop(); - numStack.push(calculate(token.toString(), f1, f2)); - } - } - return numStack.pop().floatValue(); - } - - private Float calculate(String op, float f1, float f2){ - if(op.equals("+")){ - return f1 + f2; - } - if(op.equals("-")){ - return f1 - f2; - } - if(op.equals("*")){ - return f1 * f2; - } - if (op.equals("/")){ - return f1 / f2; - } - return null; - } -} diff --git a/group23/601689050/7weekExpr2/PrefixExprTest.java b/group23/601689050/7weekExpr2/PrefixExprTest.java deleted file mode 100644 index 8d1074d5d3..0000000000 --- a/group23/601689050/7weekExpr2/PrefixExprTest.java +++ /dev/null @@ -1,42 +0,0 @@ -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by Lxx on 2017/4/29. - */ -public class PrefixExprTest { - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testEvaluate() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - - } -} diff --git a/group23/601689050/7weekExpr2/Stack.java b/group23/601689050/7weekExpr2/Stack.java deleted file mode 100644 index 614ba2860c..0000000000 --- a/group23/601689050/7weekExpr2/Stack.java +++ /dev/null @@ -1,50 +0,0 @@ -import java.util.ArrayList; -import java.util.EmptyStackException; - -/** - * Created by Lxx on 2017/4/29. - */ -public class Stack { - public ArrayList array; - public int count; - public Stack(){ - array = new ArrayList(); - } - public void push (Object o){ - count ++ ; - array.add(o); - } - public Object pop(){ - count -- ; - Object o = array.get(count); - array.remove(o); - return o; - } - public Object peek(){ - if(count == 0){ - throw new EmptyStackException(); - } - return array.get(array.size()-1); - } - public boolean isEmpty(){ - return array.size() == 0; - } - public int size(){ - return count; - } - public String toString(){ - StringBuilder string = new StringBuilder(); - Stack s = new Stack(); - int size = this.size(); - for(int i = 0;i OPERATORS = Arrays.asList("+", "-", "*", "/"); - private static final Map priorities = new HashMap<>(); - static { - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int OPERATOR = 1; - static final int NUMBER = 2; - String value; - int type; - public Token(int type, String value){ - this.type = type; - this.value = value; - } - - public boolean isNumber() { - return type == NUMBER; - } - - public boolean isOperator() { - return type == OPERATOR; - } - - public int getIntValue() { - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - - public boolean hasHigherPriority(Token t){ - if(!this.isOperator() && !t.isOperator()){ - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(t.value) > 0; - } - -} diff --git a/group23/601689050/7weekExpr2/TokenParser.java b/group23/601689050/7weekExpr2/TokenParser.java deleted file mode 100644 index 17716e0c08..0000000000 --- a/group23/601689050/7weekExpr2/TokenParser.java +++ /dev/null @@ -1,47 +0,0 @@ -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Lxx on 2017/4/29. - */ -public class TokenParser { - public List parse(String expr){ - List tokens = new ArrayList<>(); - int i = 0; - while (i < expr.length()) { - - char c = expr.charAt(i); - if (isOperator(c)) { - - Token t = new Token(Token.OPERATOR,String.valueOf(c)); - tokens.add(t); - i++; - }else if(Character.isDigit(c)){ - int nextOperatorIndex = indexOfNextOperator(i,expr); - String value = expr.substring(i,nextOperatorIndex); - Token t = new Token(Token.NUMBER,value); - tokens.add(t); - i = nextOperatorIndex; - }else { - //System.out.println("输入值不符合要求"); - i++; - } - } - return tokens; - } - - private int indexOfNextOperator(int i, String expr) { - while(Character.isDigit(expr.charAt(i))){ - i++; - if(i == expr.length()){ - break; - } - } - return i; - } - - private boolean isOperator(char c) { - String sc = String.valueOf(c); - return Token.OPERATORS.contains(sc); - } -} diff --git a/group23/601689050/8weekQueue/CircleQueue.java b/group23/601689050/8weekQueue/CircleQueue.java deleted file mode 100644 index 7ca98467ec..0000000000 --- a/group23/601689050/8weekQueue/CircleQueue.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Created by lxx on 2017/5/6. - */ -public class CircleQueue{ - - private int size; - private int first; - private int last; - Object[] queue; - - public CircleQueue(int size){ - queue = new Object[size]; - first = 0; - last = 0; - } - - public boolean isEmpty(){ - return first == last; - } - - public void enCircleQueue(Object o){ - if( (last+1) % size == first){ - System.out.println("Circle Queue is full"); - }else { - queue[last] = o; - last = (last+1) % queue.length; - } - } - - public int getSize(){ - return (last - first + queue.length) % queue.length; - } - - public Object deCircleQueue(){ - if(isEmpty()){ - return null; - }else{ - Object item = queue[first]; - first = (first+1)%queue.length; - return item; - } - - } -} diff --git a/group23/601689050/8weekQueue/Josephus.java b/group23/601689050/8weekQueue/Josephus.java deleted file mode 100644 index 6e24811da3..0000000000 --- a/group23/601689050/8weekQueue/Josephus.java +++ /dev/null @@ -1,50 +0,0 @@ - -/** - * Created by lxx on 2017/5/6. - */ - - - -/** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: - * N个人围成一圈(位置记为0到N-1), - * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * @author - * - */ -public class Josephus { - - private static class Node { - int data; - Node next; - - public Node(int i) { - data = i; - } - } - - public static void execute(int n, int m) { - - Node header = new Node(0); - Node pointer = header; - for (int i = 1; i < n; i++) { - pointer.next = new Node(i); - pointer = pointer.next; - } - pointer.next = header; - while (pointer != pointer.next) { - for (int i = 1; i <= m; i++) { - pointer = pointer.next; - } - System.out.println(pointer.next.data); - pointer.next = pointer.next.next; - } - System.out.println(pointer.next.data); - - } - public static void main(String args[]){ - Josephus circle = new Josephus(); - circle.execute(8,4); - } -} diff --git a/group23/601689050/8weekQueue/Queue.java b/group23/601689050/8weekQueue/Queue.java deleted file mode 100644 index bdfd22b16f..0000000000 --- a/group23/601689050/8weekQueue/Queue.java +++ /dev/null @@ -1,55 +0,0 @@ -import javax.xml.soap.Node; -import java.util.NoSuchElementException; - -/** - * Created by lxx on 2017/5/6. - */ -public class Queue { - - private Node first; - private Node last; - private int size; - - private static class Node{ - private E item; - private Node next; - } - public Queue(){ - first = null; - last = null; - size = 0; - } - public boolean isEmpty(){ - return first == null; - } - public int size(){ - return size; - } - public void enQueue(E data){ - Node oldlast = last; - last = new Node(); - last.item = data; - last.next = null; - if(isEmpty()){ - first = last; - }else { - oldlast.next = last; - } - size++; - } - public E deQueue(){ - if(isEmpty()){ - throw new NoSuchElementException("queue is empty"); - }else{ - E item = first.item; - first = first.next; - size--; - if(isEmpty()){ - last = null; - } - return item; - } - } - - -} diff --git a/group23/601689050/8weekQueue/QueueWithTwoStacks.java b/group23/601689050/8weekQueue/QueueWithTwoStacks.java deleted file mode 100644 index c8976aca56..0000000000 --- a/group23/601689050/8weekQueue/QueueWithTwoStacks.java +++ /dev/null @@ -1,47 +0,0 @@ -import java.util.Stack; - -/** - * Created by lxx on 2017/5/6. - */ -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - public QueueWithTwoStacks(){ - stack1 = new Stack(); - stack2 = new Stack(); - } - - public boolean isEmpty(){ - return stack1.isEmpty() && stack2.isEmpty(); - } - - public int size() - { - return stack1.size() + stack2.size(); - } - - public void enQueue(E item){ - - stack1.push(item); - } - - public E deQueue(){ - if(stack2.isEmpty()){ - while(!stack1.isEmpty()){ - stack2.push(stack1.pop()); - } - } - return stack2.pop(); - } - public static void main(String args[]){ - QueueWithTwoStacks queue = new QueueWithTwoStacks(); - queue.enQueue(1); - queue.enQueue(5); - queue.enQueue(4); - queue.enQueue(0); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - } -} diff --git a/group23/601689050/9weekStack/QuickMinStack.java b/group23/601689050/9weekStack/QuickMinStack.java deleted file mode 100644 index 4033461599..0000000000 --- a/group23/601689050/9weekStack/QuickMinStack.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Created by lxx on 2017/5/6. - */ - -import java.util.Stack; - -/** - * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 - * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 - * @author liuxin - * - */ -public class QuickMinStack extends Stack { - - Stack sMin; - public QuickMinStack(){ - sMin = new Stack(); - } - public void push(int data){ - if(data <= findMin()){ - sMin.push(data); - } - super.push(data); - } - public Integer pop(){ - int value = super.pop(); - if(value == findMin()){ - sMin.pop(); - } - return value; - } - public int findMin(){ - if(sMin.isEmpty()){ - return Integer.MAX_VALUE; - } - return sMin.peek(); - } - - public static void main(String args[]){ - QuickMinStack stack = new QuickMinStack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(0); - System.out.println(stack.pop().intValue()); - System.out.println(stack.findMin()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - } -} diff --git a/group23/601689050/9weekStack/StackWithTwoQueues.java b/group23/601689050/9weekStack/StackWithTwoQueues.java deleted file mode 100644 index 8eb1d996bf..0000000000 --- a/group23/601689050/9weekStack/StackWithTwoQueues.java +++ /dev/null @@ -1,52 +0,0 @@ -import java.util.LinkedList; - - -/** - * Created by lxx on 2017/5/6. - */ -public class StackWithTwoQueues { - - LinkedList queue1=new LinkedList(); - LinkedList queue2=new LinkedList(); - public void push(int data){ - queue1.addLast(data); - } - public int pop() { - if (sSize() > 0) { - if (!queue1.isEmpty()) { - while (queue1.size() > 1) { - queue2.addLast(queue1.removeFirst()); - } - return queue1.removeFirst(); - } else { - while (queue2.size() > 1) { - queue1.addLast(queue2.removeFirst()); - } - return queue2.removeFirst(); - } - } else { - System.out.println("栈空,不能出栈"); - return Integer.MAX_VALUE; - } - } - public int sSize(){ - return queue1.size() + queue2.size(); - } - public static void main(String[] args) - { - StackWithTwoQueues stack=new StackWithTwoQueues(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - stack.push(5); - stack.push(6); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - } -} diff --git a/group23/601689050/9weekStack/TwoStackInOneArray.java b/group23/601689050/9weekStack/TwoStackInOneArray.java deleted file mode 100644 index 916e1dab3b..0000000000 --- a/group23/601689050/9weekStack/TwoStackInOneArray.java +++ /dev/null @@ -1,81 +0,0 @@ -import java.util.Stack; - -/** - * Created by lxx on 2017/5/6. - */ -public class TwoStackInOneArray { - - - - Object[] data = new Object[10]; - - private int index1 = 0; - private int index2 = data.length - 1; - - - private boolean isFull() { - if (index1 == index2) { - return true; - } else - return false; - } - - private void extendCapacity() { - - } - - /** - * 向第一个栈中压入元素 - * - * @param o - */ - public void push1(Object o) { - - } - - /** - * 从第一个栈中弹出元素 - * - * @return - */ - public Object pop1() { - return null; - } - - /** - * 获取第一个栈的栈顶元素 - * - * @return - */ - - public Object peek1() { - return null; - } - - /* - * 向第二个栈压入元素 - */ - public void push2(Object o) { - - } - - /** - * 从第二个栈弹出元素 - * - * @return - */ - public Object pop2() { - return null; - } - - /** - * 获取第二个栈的栈顶元素 - * - * @return - */ - - public Object peek2() { - return null; - } - -} diff --git a/group23/609041842/src/code/ArrayList.java b/group23/609041842/src/code/ArrayList.java deleted file mode 100644 index 8acbfe7de5..0000000000 --- a/group23/609041842/src/code/ArrayList.java +++ /dev/null @@ -1,49 +0,0 @@ -package code; - -import java.util.Arrays; - -public class ArrayList { - - private Object[] obj = new Object[0]; - - public void add(Object o) { - Object[] tar = new Object[obj.length + 1]; - System.arraycopy(obj, 0, tar, 0, obj.length); - tar[tar.length - 1] = o; - obj = tar; - System.out.println(Arrays.toString(obj)); - } - - public void add(int index, Object o) { - Object[] tar = new Object[obj.length + 1]; - System.arraycopy(obj, 0, tar, 0, index); - tar[index] = o; - System.arraycopy(obj, index, tar, index + 1, obj.length - index); - obj = tar; - } - - public Object get(int index) { - return obj[index]; - } - - public int size(){ - return obj.length; - } - - public Object remove(int index){ - Object[] tar = new Object[obj.length-1]; - System.arraycopy(obj, 0, tar, 0, index); - System.arraycopy(obj, index+1, tar, index, obj.length-index-1); - Object o = obj[index]; - obj = tar; - return o;//رɾԪ - } - public static void main(String[] args) { - ArrayList al = new ArrayList(); - al.add("hello"); - al.add("java"); - al.add(2, "addm"); - System.out.println(al.remove(1)); - } - -} diff --git a/group23/609041842/src/code/LinkedList.java b/group23/609041842/src/code/LinkedList.java deleted file mode 100644 index e42138022e..0000000000 --- a/group23/609041842/src/code/LinkedList.java +++ /dev/null @@ -1,87 +0,0 @@ -package code; - -public class LinkedList { - private static Node head; - private Node last; - public int size; - - public void add(Object o) { - Node l = last; - Node newNode = new Node(l, o, null); - last = newNode; - if (head == null) { - head = newNode; - size = 1; - } else { - l.next = newNode; - size++; - } - } - - public void add(int index, Object o) { - Node n = node(index); - System.out.println(n.data); - Node pred = n.prev; - Node newNode = new Node(pred, o, n); - if (pred == null) { - head = newNode; - } else { - pred.next = newNode; - } - size++; - } - - - public Node get(int index){ - return node(index); - } - public Node node(int index) { - Node n = head; - for (int i = 0; i < index; i++) { - n = n.next; - } - return n; - } - - public Node remove(int index){ - Node del = node(index); - Node after = del.next; - Node before = del.prev; - before.next = after; - after.prev = before; - size--; - return del; - } - private static class Node { - Node next; - Object data; - Node prev; - - private Node(Node prev, Object data, Node next) { - this.data = data; - this.next = next; - this.prev = prev; - } - } - - public static void main(String[] arg) { - LinkedList ll = new LinkedList(); - ll.add("hello"); - ll.add("java"); - ll.add("jvm"); - ll.add("jvmd"); - // System.out.println(ll.get(2)); -// ll.add(1, "ds"); - System.out.println(ll.get(0).data); - System.out.println(ll.get(1).data); - System.out.println(ll.get(2).data); - System.out.println(ll.get(3).data); - System.out.println(ll.size); - System.out.println(ll.remove(1).data); - System.out.println(ll.get(0).data); - System.out.println(ll.get(1).data); - System.out.println(ll.get(2).data); - System.out.println(ll.size); - } - -} diff --git a/group23/609041842/src/code/Queue.java b/group23/609041842/src/code/Queue.java deleted file mode 100644 index d4f70c2125..0000000000 --- a/group23/609041842/src/code/Queue.java +++ /dev/null @@ -1,17 +0,0 @@ -package code; - -public class Queue { - - private LinkedList lk = new LinkedList(); - public void enQueue(Object o){ - lk.add(o); - } - public void deQueue(){ - lk.remove(lk.size-1); - } - public boolean isEmpty(){ - if(lk.size == 0) - return true; - return false; - } -} diff --git a/group23/609041842/src/code/Stack.java b/group23/609041842/src/code/Stack.java deleted file mode 100644 index 7226d4d403..0000000000 --- a/group23/609041842/src/code/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package code; - -public class Stack { - - private ArrayList array = new ArrayList(); - - public void push(Object o){ - array.add(o); - } - public Object pop(){ - return array.remove(array.size()-1); - } - - public boolean isEmpty(){ - if(array.size()<=0) - return true; - return false; - } - - public int size(){ - return array.size(); - } - public static void main(String[] args) { - Stack sc = new Stack(); - sc.push("hello world"); - sc.push("java"); - sc.push("jvm"); - } - -} diff --git a/group23/609041842/src/com/homework01/ArrayList.java b/group23/609041842/src/com/homework01/ArrayList.java deleted file mode 100644 index 1702690ae7..0000000000 --- a/group23/609041842/src/com/homework01/ArrayList.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.homework01; - -import java.util.Arrays; - -public class ArrayList { - - private Object[] obj = new Object[0]; - - public void add(Object o) { - Object[] tar = new Object[obj.length + 1]; - System.arraycopy(obj, 0, tar, 0, obj.length); - tar[tar.length - 1] = o; - obj = tar; - System.out.println(Arrays.toString(obj)); - } - - public void add(int index, Object o) { - Object[] tar = new Object[obj.length + 1]; - System.arraycopy(obj, 0, tar, 0, index); - tar[index] = o; - System.arraycopy(obj, index, tar, index + 1, obj.length - index); - obj = tar; - } - - public Object get(int index) { - return obj[index]; - } - - public int size(){ - return obj.length; - } - - public Object remove(int index){ - Object[] tar = new Object[obj.length-1]; - System.arraycopy(obj, 0, tar, 0, index); - System.arraycopy(obj, index+1, tar, index, obj.length-index-1); - Object o = obj[index]; - obj = tar; - return o;//���ر�ɾԪ�� - } - public static void main(String[] args) { - ArrayList al = new ArrayList(); - al.add("hello"); - al.add("java"); - al.add(2, "addm"); - System.out.println(al.remove(1)); - } - -} diff --git a/group23/609041842/src/com/homework01/LinkedList.java b/group23/609041842/src/com/homework01/LinkedList.java deleted file mode 100644 index cc72fc2e4c..0000000000 --- a/group23/609041842/src/com/homework01/LinkedList.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.homework01; - -public class LinkedList { - private static Node head; - private Node last; - public int size; - - public void add(Object o) { - Node l = last; - Node newNode = new Node(l, o, null); - last = newNode; - if (head == null) { - head = newNode; - size = 1; - } else { - l.next = newNode; - size++; - } - } - - public void add(int index, Object o) { - Node n = node(index); - System.out.println(n.data); - Node pred = n.prev; - Node newNode = new Node(pred, o, n); - if (pred == null) { - head = newNode; - } else { - pred.next = newNode; - } - size++; - } - - - public Node get(int index){ - return node(index); - } - public Node node(int index) { - Node n = head; - for (int i = 0; i < index; i++) { - n = n.next; - } - return n; - } - - public Node remove(int index){ - Node del = node(index); - Node after = del.next; - Node before = del.prev; - before.next = after; - after.prev = before; - size--; - return del; - } - private static class Node { - Node next; - Object data; - Node prev; - - private Node(Node prev, Object data, Node next) { - this.data = data; - this.next = next; - this.prev = prev; - } - } - - public static void main(String[] arg) { - LinkedList ll = new LinkedList(); - ll.add("hello"); - ll.add("java"); - ll.add("jvm"); - ll.add("jvmd"); - // System.out.println(ll.get(2)); -// ll.add(1, "ds"); - System.out.println(ll.get(0).data); - System.out.println(ll.get(1).data); - System.out.println(ll.get(2).data); - System.out.println(ll.get(3).data); - System.out.println(ll.size); - System.out.println(ll.remove(1).data); - System.out.println(ll.get(0).data); - System.out.println(ll.get(1).data); - System.out.println(ll.get(2).data); - System.out.println(ll.size); - } - -} diff --git a/group23/609041842/src/com/homework01/Queue.java b/group23/609041842/src/com/homework01/Queue.java deleted file mode 100644 index db8fb359b5..0000000000 --- a/group23/609041842/src/com/homework01/Queue.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.homework01; - -public class Queue { - - private LinkedList lk = new LinkedList(); - public void enQueue(Object o){ - lk.add(o); - } - public void deQueue(){ - lk.remove(lk.size-1); - } - public boolean isEmpty(){ - if(lk.size == 0) - return true; - return false; - } -} diff --git a/group23/609041842/src/com/homework01/Stack.java b/group23/609041842/src/com/homework01/Stack.java deleted file mode 100644 index ee5d71d830..0000000000 --- a/group23/609041842/src/com/homework01/Stack.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.homework01; - -public class Stack { - - private ArrayList array = new ArrayList(); - - public void push(Object o){ - array.add(o); - } - public Object pop(){ - return array.remove(array.size()-1); - } - - public boolean isEmpty(){ - if(array.size()<=0) - return true; - return false; - } - - public int size(){ - return array.size(); - } - public static void main(String[] args) { - Stack sc = new Stack(); - sc.push("hello world"); - sc.push("java"); - sc.push("jvm"); - } - -} diff --git a/group23/609041842/src/test.java b/group23/609041842/src/test.java deleted file mode 100644 index 931a307711..0000000000 --- a/group23/609041842/src/test.java +++ /dev/null @@ -1,9 +0,0 @@ -import org.junit.Test; - -public class test { - - @Test - public void test(){ - System.out.println("Heool"); - } -} diff --git a/group23/632678665/com/basic/datastructure/ArrayList.java b/group23/632678665/com/basic/datastructure/ArrayList.java deleted file mode 100644 index 7669e8fba0..0000000000 --- a/group23/632678665/com/basic/datastructure/ArrayList.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.basic.datastructure; - -import java.util.Arrays; - - -public class ArrayList implements List{ - private Object [] array =new Object [15]; - private int size=0; - private int aindex=0; - @Override - public void add(Object o) { - if(aindex>(int)(array.length/3*2)){ - array=autoGrew(array); - } - array[aindex]=o; - size++; - aindex++; - } - - @Override - public void add(int index, Object o) { - if(index>=array.length){ - throw new IndexOutOfBoundsException(); - } - array[index]=o; - size++; - aindex=index; - } - - @Override - public Object get(int index) { - if(index>=array.length){ - throw new IndexOutOfBoundsException(); - } - return array[index]; - } - - @Override - public Object remove(int index) { - if(index>=array.length){ - throw new IndexOutOfBoundsException(); - } - Object o=array[index]; - for(int i=index;iarray=new ArrayList (); - int from; - int to; - for(int i=0;i list=new ArrayList(); - for(int i=0;i set=new HashSet(); - set.addAll(list); - Object[] array=set.toArray(); - int [] arrayInt=new int [array.length]; - for(int i=0;ilist=new ArrayList(); - list.add(front); - list.add(behind); - while(true){ - result=front+behind; - if(max list=new ArrayList(); - int num=3; - list.add(2); - boolean flag=true; - while(true){ - flag=true; - for(int i=2;i list=new ArrayList(); - Set temp=new HashSet(); - int num=1; - int result=0; - while(true){ - for(int i=1;imax){ - break; - } - if(num==result){ - list.add(num); - } - temp.clear(); - result=0; - num++; - } - int [] array=new int [list.size()]; - for(int i=0;i list=new ArrayList(); - for(int i=0;i parameters) { - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - return null; - } - -} diff --git a/group23/632678665/com/basic/week2/litestruts/StrutsTest.java b/group23/632678665/com/basic/week2/litestruts/StrutsTest.java deleted file mode 100644 index 5549100269..0000000000 --- a/group23/632678665/com/basic/week2/litestruts/StrutsTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.basic.week2.litestruts; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/632678665/com/basic/week2/litestruts/View.java b/group23/632678665/com/basic/week2/litestruts/View.java deleted file mode 100644 index 7260afd69b..0000000000 --- a/group23/632678665/com/basic/week2/litestruts/View.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.basic.week2.litestruts; - - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/632678665/com/basic/week3/datastructure/LinkedList.java b/group23/632678665/com/basic/week3/datastructure/LinkedList.java deleted file mode 100644 index 09b08dd25f..0000000000 --- a/group23/632678665/com/basic/week3/datastructure/LinkedList.java +++ /dev/null @@ -1,446 +0,0 @@ -package com.basic.week3.datastructure; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; - -public class LinkedList implements List { - - private int size = 0; - // 头结点 - private Node head; - // 尾结点 - private Node tail; - - private void rangeCheck(int index) { - if (index < 0 || index > size) { - throw new IndexOutOfBoundsException(); - } - } - -// public void add(Object o) { -// Node node = new Node(o, null); -// if (head == null) { -// head = tail = node; -// } -// Node oldTail = tail; -// tail = node; -// oldTail.next = tail; -// size++; -// } - - public void add(int index, Object o) { - rangeCheck(index); - if (index == size) { - this.add(o); - } else { - // 保存index处节点 - Node x = head; - // 保存index-1处的节点 - Node y = null; - for (int i = 0; i < index; i++) { - y = x; - x = x.next; - } - Node node = new Node(o, x); - y.next = node; - size++; - } - } - - public Object get(int index) { - rangeCheck(index); - Node x = head; - for (int i = 0; i < index; i++) { - x = x.next; - } - return x.data; - } - - public Object remove(int index) { - rangeCheck(index); - Object removeData; - if (index == 0) { - removeData = removeFirst(); - } else if (index == size - 1) { - removeData = removeLast(); - } else { - Node x = head; - Node y = head; - for (int i = 0; i < index; i++) { - y = x; - x = x.next; - } - y.next = x.next; - size--; - removeData = x.data; - } - return removeData; - } - - @Override - public int size() { - return size; - } - - public void addFirst(Object o) { - Node oldHead = head; - head = new Node(o, oldHead); - size++; - } - - public void addLast(Object o) { - Node oldTail = tail; - tail = new Node(o, null); - oldTail.next = tail; - size++; - } - - public Object removeFirst() { - Node next = head.next; - Object data = head.data; - head.data = null; - head.next = null; - head = next; - size--; - return data; - } - - public Object removeLast() { - Node oldTail = tail; - Node temp = head; - for (int i = 0; i < size - 2; i++) { - temp = temp.next; - } - tail = temp; - size--; - return oldTail.data; - } - - public void clear() { - for (Node x = head; x != null;) { - Node next = x.next; - x.data = null; - x.next = null; - x = next; - } - head = tail = null; - size = 0; - } - - public Object getTail() { - Node l = tail; - // 如果链表为空 - if (l == null) { - throw new NoSuchElementException(); - } - return l.data; - } - - public Object getHead() { - Node l = head; - // 如果链表为空 - if (l == null) { - throw new NoSuchElementException(); - } - return l.data; - } - - public Iterator iterator() { - return new LinkedListIterator(); - } - - private static class Node { - Object data; - Node next; - - Node(Object data, Node next) { - this.data = data; - this.next = next; - } - - } - - private class LinkedListIterator implements Iterator { - Node x = head; - - @Override - public boolean hasNext() { - return x != null; - } - - @Override - public Object next() { - Object data = x.data; - x = x.next; - return data; - } - - @Override - public void remove() { - // TODO Auto-generated method stub - - } - - } - - /** - * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse() { - Object[] temp = new Object[size]; - for (int i = 0; i < size; i++) { - temp[i] = this.get(i); - } - this.clear(); - for (int i = temp.length - 1; i >= 0; i--) { - this.add(temp[i]); - } - } - - /** - * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 - * ,删除以后的值为7,8,10 - * - */ - public void removeFirstHalf() { - int s = size; - for (int i = 0; i < s / 2; i++) { - this.removeFirst(); - } - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * - * @param i - * @param length - * @throws Exception - */ - public void remove(int i, int length) throws Exception { - if (i + length > size) { - throw new Exception(); - } - for (int j = i; j < i + length; j++) { - this.remove(i); - } - } - - /** - * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = - * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * - * @param list - * @throws Exception - */ - public int[] getElements(LinkedList list) throws Exception { - if ((int) list.getTail() > this.size()) { - throw new Exception(); - } - int[] temp = new int[list.size()]; - for (int i = 0; i < list.size(); i++) { - temp[i] = (int) this.get((int) list.get(i)); - } - return temp; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 从当前链表中中删除在list中出现的元素 - * - * @param list - */ - - public void subtract(LinkedList list) { - Node x = head; - Node y = list.head; - while (x != null && y != null) { - if ((int) x.data < (int) y.data) { - x = x.next; - continue; - } - if ((int) x.data == (int) y.data) { - Node next = x.next; - continue; - } - if ((int) x.data > (int) y.data) { - y = y.next; - continue; - } - } - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues() { - for (Node x = head; x != null;) { - Node next = x.next; - if (next == null) { - return; - } - if (x.data == next.data) { - x.next = next.next; - size--; - } else { - x = x.next; - } - } - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * - * @param min - * @param max - */ - public void removeRange(int min, int max) { - if ((int) this.getTail() < min) { - this.clear(); - } - - if ((int) this.getHead() > max) { - return; - } - - for (Node x = head; x != null; x = x.next) { - if ((int) x.data <= min) { - continue; - } - - } - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * - * @param list - */ - public LinkedList intersection(LinkedList list) { - LinkedList linkedList = new LinkedList(); - Node x = head; - Node y = list.head; - while (x != null && y != null) { - if ((int) x.data < (int) y.data) { - x = x.next; - continue; - } - if ((int) x.data == (int) y.data) { - linkedList.add(x.data); - x = x.next; - y = y.next; - continue; - } - if ((int) x.data > (int) y.data) { - y = y.next; - continue; - } - } - return linkedList; - } - - @Override - public boolean isEmpty() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean contains(Object o) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Object[] toArray() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Object[] toArray(Object[] a) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean remove(Object o) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean containsAll(Collection c) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean addAll(Collection c) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean addAll(int index, Collection c) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean removeAll(Collection c) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean retainAll(Collection c) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Object set(int index, Object element) { - // TODO Auto-generated method stub - return null; - } - - @Override - public int indexOf(Object o) { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int lastIndexOf(Object o) { - // TODO Auto-generated method stub - return 0; - } - - @Override - public ListIterator listIterator() { - // TODO Auto-generated method stub - return null; - } - - @Override - public ListIterator listIterator(int index) { - // TODO Auto-generated method stub - return null; - } - - @Override - public List subList(int fromIndex, int toIndex) { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean add(Object e) { - // TODO Auto-generated method stub - return false; - } -} diff --git a/group23/632678665/com/basic/week3/download/Demo.java b/group23/632678665/com/basic/week3/download/Demo.java deleted file mode 100644 index f4dc344cb5..0000000000 --- a/group23/632678665/com/basic/week3/download/Demo.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.basic.week3.download; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintStream; -import java.io.RandomAccessFile; -import java.net.URL; - -public class Demo { - - public static void main(String[] args) throws Exception { -// File f=new File("E://123.txt"); -// InputStream ii=new FileInputStream(f); -// byte [] b=new byte [2]; -// int j; -// while(true){ -// if(ii.read(b)==0){ -// System.out.println("1111"); -// } -// if(ii.read(b)==-1){ -// System.out.println("3333"); -// } -// } - URL url=new URL("Http://localhsot:8080/123.txt"); - String [] s=url.toString().split("/"); - for(String str:s){ - - } - } - -} diff --git a/group23/632678665/com/basic/week3/download/DownloadThread.java b/group23/632678665/com/basic/week3/download/DownloadThread.java deleted file mode 100644 index 89b7fdc3f5..0000000000 --- a/group23/632678665/com/basic/week3/download/DownloadThread.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.basic.week3.download; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; - -import com.basic.week3.download.api.Connection; - -public class DownloadThread extends Thread{ - public static int count=0; - Connection conn; - int startPos; - int endPos; - - public DownloadThread(Connection conn, int startPos, int endPos){ - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - public void run(){ - try { - count++; - conn.read(startPos, endPos); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - }finally{ - count--; - } - } -} diff --git a/group23/632678665/com/basic/week3/download/FileDownloader.java b/group23/632678665/com/basic/week3/download/FileDownloader.java deleted file mode 100644 index d32975f4b5..0000000000 --- a/group23/632678665/com/basic/week3/download/FileDownloader.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.basic.week3.download; - -import com.basic.week3.download.api.Connection; -import com.basic.week3.download.api.ConnectionException; -import com.basic.week3.download.api.ConnectionManager; -import com.basic.week3.download.api.DownloadListener; - - -public class FileDownloader { - - String url; - - DownloadListener listener; - - ConnectionManager cm; - - Connection conn; - - DownloadThread dt; - - private static final int THREAD_NUM=4; - public FileDownloader(String _url) { - this.url = _url; - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - /*Connection conn = null; - try { - - conn = cm.open(this.url); - - int length = conn.getContentLength(); - - new DownloadThread(conn,0,length-1).start(); - - } catch (ConnectionException e) { - e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } - }*/ - try { - //打开url - conn=cm.open(url); - //判断资源长度 - int length=conn.getContentLength(); - //每个线程所占的资源 - int off=(int)(length/3); - int start=0; - for(int i=0;i clzPaths = new ArrayList(); - - public byte[] readBinaryCode(String className) { - List list = DOT_SPLITTER.splitToList(className); - String childDirectory = SLASH_JOINER.join(list); - for (String clzPath : clzPaths) { - String fullPath = makeFullPath(clzPath, childDirectory); - if (fileExist(fullPath)) { - return readFileBytes(fullPath); - } - } - System.out.println("no this class file: " + className); - return null; - } - - private byte[] readFileBytes(String filePath) { - try { - File file = new File(filePath); - long length = file.length(); - byte[] fileBytes = new byte[(int) length]; - int readLength = new FileInputStream(filePath).read(fileBytes); - if (readLength != length) { - System.out.println("read file error. read length: " + readLength + ", full length : " + length); - return null; - } - return fileBytes; - } catch (IOException e) { - System.out.println("read file error. " + filePath); - return null; - } - } - - private boolean fileExist(String fullPath) { - File classFile = new File(fullPath); - return classFile.exists() && classFile.isFile(); - } - - private String makeFullPath(String clzPath, String childDirectory) { - if (clzPath.endsWith("/") || clzPath.endsWith("\\")) { - return clzPath + childDirectory + CLASS_SUFFIX; - } else { - return clzPath + "/" + childDirectory + CLASS_SUFFIX; - } - } - - public void addClassPath(String path) { - if (!clzPaths.contains(path)) { - clzPaths.add(path); - } - } - - public String getClassPath() { - return SEMICOLON_JOINER.join(clzPaths); - } - -} diff --git a/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java b/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java deleted file mode 100644 index 7d0419dc77..0000000000 --- a/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.coding2017.week4.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/group23/632678665/com/basic/week4/lru/LRUPageFrame.java b/group23/632678665/com/basic/week4/lru/LRUPageFrame.java deleted file mode 100644 index 55039dda56..0000000000 --- a/group23/632678665/com/basic/week4/lru/LRUPageFrame.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.coding2017.week4.lru; - -/** - * 用双向链表实现LRU算法 - * - * @author liuxin - * - */ -public class LRUPageFrame { - private static class Node { - Node prev; - Node next; - int pageNum; - - Node() { - } - } - - private int capacity; - - private Node first;// 链表头 - private Node last;// 链表尾 - private int size; // 当前个数 - - public LRUPageFrame(int capacity) { - this.capacity = capacity; - size = 0; - } - - /** - * 获取缓存中对象 - * - * @param pageNum - * @return - */ - public void access(int pageNum) { - Node node = query(pageNum); - if (node == null) { - Node newNode = new Node(); - newNode.pageNum = pageNum; - accessNotExist(newNode); - } else { - accessExist(node); - } - } - - private void accessExist(Node node) { - removeNode(node); - addFirst(node); - } - - /** - * 此处没有要求传入的node的prev和next, 所以需要自己处理 - * - * @param node - */ - private void addFirst(Node node) { - node.prev = null; - node.next = null; - if (first == null) { - first = node; - last = node; - } else { - first.prev = node; - node.next = first; - first = node; - } - size++; - } - - /** - * 需要考虑删除的节点是头结点, 或尾节点的情况 - */ - private void removeNode(Node node) { - if (node.prev == null) { - first = node.next; - } - if (node.next == null) { - last = node.prev; - } - if (node.prev != null) { - node.prev.next = node.next; - } - if (node.next != null) { - node.next.prev = node.prev; - } - size--; - } - - /** - * 如果已经满了, 则挤出去一个, 然后追加 - * - * @param node - */ - private void accessNotExist(Node node) { - if (size == capacity) { - removeLast(); - } - addFirst(node); - } - - private void removeLast() { - last.prev.next = null; - last = last.prev; - size--; - } - - private Node query(int pageNum) { - for (Node node = first; node != null; node = node.next) { - if (pageNum == node.pageNum) { - return node; - } - } - return 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/group23/632678665/com/basic/week5/stack/StackUtil.java b/group23/632678665/com/basic/week5/stack/StackUtil.java deleted file mode 100644 index 7b750b3549..0000000000 --- a/group23/632678665/com/basic/week5/stack/StackUtil.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.coding.week5.stack; - -import com.coding.weak1.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 stack = new Stack(); - Stack stack1 = new Stack(); - while (!s.isEmpty()) { - stack.push(s.pop()); - } - while (!stack.isEmpty()) { - stack1.push(stack.pop()); - } - while (!stack1.isEmpty()) { - s.push(stack1.pop()); - } - } - - /** - * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * - * @param o - */ - public static void remove(Stack s,Object o) { - Stack stack = new Stack(); - while (!s.isEmpty()){ - Object o1 = s.pop(); - if (!o.equals(o1)) { - stack.push(o1); - } - } - while (!stack.isEmpty()) { - s.push(stack.pop()); - } - } - - /** - * 从栈顶取得len个元素, 原来的栈中元素保持不变 - * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 - * @param len - * @return - */ - public static Object[] getTop(Stack s,int len) { - if (len > s.size() || len <= 0) { - throw new IllegalArgumentException(len+""); - } - - Object[] objects = new Object[len]; - for (int i = 0; i < len; i++) { - objects[i] = s.pop(); - } - for (int i = len - 1; i >= 0 ; i--) { - s.push(objects[i]); - } - return objects; - } - /** - * 字符串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){ - Stack stack = new Stack(); - char[] chars = s.toCharArray(); - for (char c : chars) { - if (c == '(' || c == '{' || c == '[') { - stack.push(c); - } else if (c == ')' || c == '}' || c == ']'){ - if (stack.isEmpty()) { - return false; - } - if (!isPair((char)stack.pop(), c)){ - return false; - } - } - } - return stack.isEmpty(); - } - - private static boolean isPair(char left, char right) { - switch (left) { - case '{': - return right == '}'; - case '[': - return right == ']'; - case '(': - return right == ')'; - default: - return false; - } - } - -} diff --git a/group23/632678665/com/basic/week6/expr/InfixExpr.java b/group23/632678665/com/basic/week6/expr/InfixExpr.java deleted file mode 100644 index 34c1b15123..0000000000 --- a/group23/632678665/com/basic/week6/expr/InfixExpr.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.coding.week6.expr; - -import com.coding.weak1.Stack; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class InfixExpr { - String expr = null; - private Stack numberStack; - private Stack operatorStack; - private List tokens; - public InfixExpr(String expr) { - this.expr = expr; - this.numberStack = new Stack(); - this.operatorStack = new Stack(); - tokens = new ArrayList<>(); - } - - - public float evaluate() { - fillStack(); - while (!operatorStack.isEmpty()) { - char symbol = (char) operatorStack.pop(); - float operTop1 = (float) numberStack.pop(); - float operTop2 = (float) numberStack.pop(); - numberStack.push(caculate(symbol, operTop2, operTop1)); - } - return (float)numberStack.pop(); - } - - public void parseTokens() { - char[] chars = expr.toCharArray(); - for (int i = 0; i < chars.length; i++) { - char c = chars[i]; - if (Token.isOperator(c)) { - Token token = new Token(c+""); - tokens.add(token); - } else { - String t = ""; - while (Token.isDigit(c)){ - t += c; - i++; - if (i == chars.length) - break; - c = chars[i]; - } - Token token = new Token(t); - tokens.add(token); - i--; - } - } - } - - - public void fillStack() { - parseTokens(); - Iterator iterator = tokens.iterator(); - while (iterator.hasNext()) { - Token token = iterator.next(); - if (token.isNumber()) { - numberStack.push((float)token.parseInt()); - continue; - } - if (token.isOperator()) { - char operator = token.parseOperator(); - if (operatorStack.isEmpty()) { - operatorStack.push(operator); - }else { - char topSymbol = (char)operatorStack.peek(); - if (compare(operator, topSymbol) > 0) { - operatorStack.push(operator); - } else { - float operTop1 = (float) numberStack.pop(); - float operTop2 = (float) numberStack.pop(); - numberStack.push(caculate(topSymbol, operTop2, operTop1)); - operatorStack.pop(); - operatorStack.push(operator); - } - } - } - - } - } - - - private float caculate(char symbol, float oper1, float oper2) { - if ('*' == symbol) - return oper1 * oper2; - else if ('/' == symbol) - return oper1 / oper2; - else if ('+' == symbol) - return oper1 + oper2; - else if ('-' == symbol) - return oper1 - oper2; - else - throw new RuntimeException("this operation has not implement"); - } - - public int compare(char opertor1, char opertor2) { - if (!Token.isOperator(opertor1) ) - throw new IllegalArgumentException(opertor1 + "is not supported opertor"); - if (!Token.isOperator(opertor2)) - throw new IllegalArgumentException(opertor2 + "is not supported opertor"); - if (Token.isAddOrSub(opertor1)) { - if (Token.isAddOrSub(opertor2)) - return 0; - else - return -1; - } - else { - if (Token.isAddOrSub(opertor2)) - return 1; - else - return 0; - } - } - - public String printNumberStack() { - return numberStack.toString(); - } - - public String printOperatorStack() { - return operatorStack.toString(); - } -} diff --git a/group23/632678665/com/basic/week6/expr/Token.java b/group23/632678665/com/basic/week6/expr/Token.java deleted file mode 100644 index b58aa36968..0000000000 --- a/group23/632678665/com/basic/week6/expr/Token.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.coding.week6.expr; - -/** - * Created by Administrator on 2017/4/16 0016. - */ -public class Token { - - private String symbol; - - public Token(String symbol) { - this.symbol = symbol; - } - - public boolean isNumber() { - return symbol.matches("^\\d+$"); - } - - - public boolean isOperator() { - return symbol.matches("^[\\+|\\*|\\-|\\/]$"); - } - - public int parseInt() { - return Integer.valueOf(symbol); - } - - public char parseOperator() { - return symbol.charAt(0); - } - - - public static boolean isOperator(char c) { - return isAddOrSub(c) || isMulityOrDivide(c); - } - - public static boolean isAddOrSub(char c) { - return c == '+' || c == '-'; - } - - public static boolean isMulityOrDivide(char c) { - return c == '/' || c == '*'; - } - - public static boolean isDigit(char c) { - return c >= '0' && c <= '9'; - } - - @Override - public String toString(){ - return symbol; - } -} diff --git a/group23/632678665/com/basic/week6/exprNew/InfixExpr.java b/group23/632678665/com/basic/week6/exprNew/InfixExpr.java deleted file mode 100644 index 3962b49fce..0000000000 --- a/group23/632678665/com/basic/week6/exprNew/InfixExpr.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.coding.week6.exprNew; - -import com.coding.weak1.Stack; - -import java.util.List; - -public class InfixExpr { - String expr = null; - - public InfixExpr(String expr) { - this.expr = expr; - } - - - public float evaluate() { - - Stack operatorStack = new Stack(); - Stack numberStack = new Stack(); - fillStack(numberStack, operatorStack); - while (!operatorStack.isEmpty()) { - Operator symbol = (Operator) operatorStack.pop(); - float operTop1 = (float) numberStack.pop(); - float operTop2 = (float) numberStack.pop(); - numberStack.push(symbol.apply(operTop2, operTop1)); - } - return (float)numberStack.pop(); - } - - public void fillStack(Stack numberStack, Stack operatorStack) { - TokenParser tokenParser = new TokenParser(); - List tokens = tokenParser.parse(expr); - for (Token token : tokens) { - if (token.isNumber()) { - numberStack.push(token.getFloatValue()); - } - else if (token.isOperator()) { - Operator o = token.getOperator(); - if (operatorStack.isEmpty()) { - operatorStack.push(o); - }else { - Operator top = (Operator)operatorStack.peek(); - if (o.hasHigherPriority(top)) { - operatorStack.push(o); - } else { - float operTop1 = (float) numberStack.pop(); - float operTop2 = (float) numberStack.pop(); - numberStack.push(top.apply(operTop2, operTop1)); - operatorStack.pop(); - operatorStack.push(o); - } - } - } - - } - } - -} diff --git a/group23/632678665/com/basic/week6/exprNew/Operator.java b/group23/632678665/com/basic/week6/exprNew/Operator.java deleted file mode 100644 index f6b4681e46..0000000000 --- a/group23/632678665/com/basic/week6/exprNew/Operator.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.coding.week6.exprNew; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by Administrator on 2017/4/22 0022. - */ -public enum Operator { - ADD("+", 1) { - public float apply(float x, float y){ - return x + y; - } - }, - - SUB("-", 1) { - @Override - public float apply(float x, float y) { - return x - y; - } - }, - - MULT("*", 2) { - @Override - public float apply(float x, float y) { - return x * y; - } - }, - - DIVI("/", 2) { - @Override - public float apply(float x, float y) { - return x / y; - } - }; - private String symbol; - private int priority; - - Operator(String symbol, int priority) { - this.symbol = symbol; - this.priority = priority; - } - - public boolean hasHigherPriority(Operator o) { - return this.priority > o.priority; - } - - public String symbol() { - return symbol; - } - - public static List symbols() { - List symbos = new ArrayList<>(); - for (Operator o : Operator.values()) { - symbos.add(o.symbol); - } - return symbos; - } - - public abstract float apply(float x, float y); - - private static final Map map = new HashMap(); - - static { - for (Operator o : Operator.values()) { - map.put(o.symbol, o); - } - } - - public static Map getOperatorMap() { - return map; - } -} diff --git a/group23/632678665/com/basic/week6/exprNew/Token.java b/group23/632678665/com/basic/week6/exprNew/Token.java deleted file mode 100644 index c925a22705..0000000000 --- a/group23/632678665/com/basic/week6/exprNew/Token.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.coding.week6.exprNew; - -/** - * Created by Administrator on 2017/4/22 0022. - */ -public class Token { - - private int type; - private String value; - - static final int NUMBER = 1; - static final int OPERATOR = 2; - static final int LEFT_BRACKET = 3; - static final int RIGHT_BRACKET = 4; - public Token(int type, String value) { - this.type = type; - this.value = value; - } - - - public boolean isNumber(){ - return type == NUMBER; - } - - public boolean isOperator(){ - return type == OPERATOR; - } - - public boolean isLeftBracket() { - return type == LEFT_BRACKET; - } - - public boolean isRightBracket() { - return type == RIGHT_BRACKET; - } - - public float getFloatValue() { - if (isNumber()) - return Integer.valueOf(value); - else - throw new RuntimeException("not a number"); - } - - public String toString() { - return value; - } - - - public Operator getOperator() { - if (isOperator()) { - return Operator.getOperatorMap().get(value); - } else { - throw new RuntimeException("not a operator"); - } - } - - - public String getValue() { - return value; - } - - -} diff --git a/group23/632678665/com/basic/week6/exprNew/TokenParser.java b/group23/632678665/com/basic/week6/exprNew/TokenParser.java deleted file mode 100644 index 52757dc0c7..0000000000 --- a/group23/632678665/com/basic/week6/exprNew/TokenParser.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.coding.week6.exprNew; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Administrator on 2017/4/22 0022. - */ -public class TokenParser { - - private static List operators = Operator.symbols(); - public List parse(String expr) { - List tokens = new ArrayList<>(); - int i = 0; - while (i < expr.length()) { - char c = expr.charAt(i); - Token token; - if (Character.isDigit(c)) { - int nextOperIndex = getNextOperIndex(i, expr); - String n = expr.substring(i, nextOperIndex); - token = new Token(Token.NUMBER, n); - tokens.add(token); - i = nextOperIndex; - } else if (isOperator(c)) { - token = new Token(Token.OPERATOR, c+""); - tokens.add(token); - i++; - } else if (String.valueOf(c).matches("\\s")){ - i++; - } else if (c == '(') { - token = new Token(Token.LEFT_BRACKET, String.valueOf(c)); - tokens.add(token); - i++; - } else if (c == ')') { - token = new Token(Token.RIGHT_BRACKET, String.valueOf(c)); - tokens.add(token); - i++; - } else { - throw new RuntimeException(c +" is not number or support operator"); - } - } - return tokens; - } - - private int getNextOperIndex(int i, String expr) { - while (Character.isDigit(expr.charAt(i))) { - i++; - if (i == expr.length()) { - break; - } - } - return i; - } - - private boolean isOperator(char c) { - return operators.contains(String.valueOf(c)); - } - - -} diff --git a/group23/632678665/com/basic/week7/stack/MyStack.java b/group23/632678665/com/basic/week7/stack/MyStack.java deleted file mode 100644 index 9a8bf42296..0000000000 --- a/group23/632678665/com/basic/week7/stack/MyStack.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ralf.stack; - -import java.util.LinkedList; -import java.util.NoSuchElementException; - -/** - * ʵֻݽṹջ - * - * @author chk - * - */ -public class MyStack { - - private LinkedList linkedList = new LinkedList<>(); - - public MyStack() { - - } - - public void push(T t) { - linkedList.addFirst(t); - } - - public T pop() { - if (size() == 0) { - throw new NoSuchElementException(); - } - return linkedList.removeFirst(); - } - - public T peek() { - return (size() == 0) ? null : linkedList.getFirst(); - } - - public int size() { - return linkedList.size(); - } - - public boolean isEmpty(){ - return linkedList.isEmpty(); - } -} diff --git a/group23/632678665/com/basic/week7/stack/StackUtil.java b/group23/632678665/com/basic/week7/stack/StackUtil.java deleted file mode 100644 index 758178131c..0000000000 --- a/group23/632678665/com/basic/week7/stack/StackUtil.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.ralf.stack; - -import java.util.NoSuchElementException; - -public class StackUtil { - - private static MyStack myStack = new MyStack<>(); - - /** - * ջеԪInteger, ջջ : 5,4,3,2,1 ø÷ ԪشΪ: 1,2,3,4,5 - * ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ - * - * @param - */ - public static void reverse(MyStack stack) { - - if (stack.isEmpty()) { - System.out.println("ջΪջ"); - return; - } - @SuppressWarnings("unchecked") - T[] elements = (T[]) new Object[stack.size()]; - for (int i = 0; i < elements.length; i++) { - elements[i] = stack.pop(); - } - for (int i = 0; i < elements.length; i++) { - stack.push(elements[i]); - } - - } - - public static void bad_reverse(MyStack s) { - if(s == null || s.isEmpty()){ - return; - } - MyStack tmpStack = new MyStack<>(); - while(!s.isEmpty()){ - tmpStack.push(s.pop()); - } - - s = tmpStack; - - } - - - /** - * ɾջеijԪ ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ - * - * @param o - */ - public static void remove(MyStack s, T o) { - if (s.isEmpty()) { - System.out.println("ջΪգ"); - return; - } - MyStack stack = new MyStack<>(); - - while (!s.isEmpty()) { - T t = s.pop(); - if (t.equals(o)) { - PopAndPush(s, stack); - return; - } - stack.push(t); - } - throw new NoSuchElementException("ջûиԪأ"); - - } - - private static void PopAndPush(MyStack s, MyStack stack) { - while (!stack.isEmpty()) { - T t = stack.pop(); - s.push(t); - } - } - - /** - * ջȡlenԪ, ԭջԪرֲ ע⣺ֻʹStackĻpush,pop,peek,isEmpty - * ʹһջ - * - * @param len - * @return - */ - @SuppressWarnings("unchecked") - public static T[] getTop(MyStack s, int len) { - - if (s.isEmpty() || len > s.size()) { - return null; - } - MyStack oldStack = s; - T[] elements = (T[]) new Object[len]; - for (int i = 0; i < len; i++) { - elements[i] = s.pop(); - } - s = oldStack; - return elements; - } - - /** - * ַs ܰЩַ ( ) [ ] { }, a,b,c... x,yz ʹöջַsеDzdzɶԳֵġ s = - * "([e{d}f])" , ַеdzɶԳ֣ ÷true s = "([b{x]y})", - * ַеŲdzɶԳֵģ ÷false; - * - * @param s - * @return - */ - public static boolean isValidPairs(String s) { - - char[] ch = s.toCharArray(); - if (ch.length < 1) { - return false; - } - - MyStack leftStack = new MyStack<>(); - MyStack rightStack = new MyStack<>(); - - for (int i = 0; i < ch.length; i++) { - - switch (ch[i]) { - case '(': - leftStack.push(String.valueOf(ch[i])); - break; - - case '[': - leftStack.push(String.valueOf(ch[i])); - break; - - case '{': - leftStack.push(String.valueOf(ch[i])); - break; - - case ')': - rightStack.push(String.valueOf(ch[i])); - break; - - case ']': - rightStack.push(String.valueOf(ch[i])); - break; - - case '}': - rightStack.push(String.valueOf(ch[i])); - break; - - default: - break; - } - } - return isPair(leftStack, rightStack); - - } - - private static boolean isPair(MyStack leftStack, - MyStack rightStack) { - - if (leftStack.size() != rightStack.size()) { - return false; - } - - reverse(rightStack); - while (!leftStack.isEmpty()) { - - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(leftStack.pop()).append(rightStack.pop()); - - String pair = stringBuilder.toString(); - if (!pair.equals("()") && !pair.equals("[]") && !pair.equals("{}")) { - return false; - } - } - return true; - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java b/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java deleted file mode 100644 index d82db3e915..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.ralf.stack.expr; - -import java.util.ArrayList; - -public class ExprIterator { - - private int operPos; - private int numPos; - private ArrayList operateList = new ArrayList<>(); - private ArrayList numList = new ArrayList<>(); - - public ExprIterator(String exprString) { - char[] chs = exprString.toCharArray(); - transToString(chs); - } - - public Integer nextNumString() { - if (hasNextNum()) { - return Integer.parseInt(numList.get(numPos++)); - } - return null; - } - public String nextOperateString() { - if (hasNextOperate()) { - return operateList.get(operPos++); - } - return null; - } - - public boolean hasNextNum() { - return numPos < numList.size(); - } - - public boolean hasNextOperate() { - return operPos < operateList.size(); - } - - private void transToString(char[] chs) { - - StringBuilder stringBuilder = new StringBuilder(); - - for (int i = 0; i < chs.length; i++) { - if (chs[i] == '+' || chs[i] == '-' || chs[i] == '*' - || chs[i] == '/') { - numList.add(stringBuilder.toString()); - operateList.add(String.valueOf(chs[i])); - stringBuilder.delete(0, stringBuilder.length()); - } - else { - stringBuilder.append(chs[i]); - } - - } - numList.add(stringBuilder.toString()); - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java b/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java deleted file mode 100644 index 86a060845c..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.ralf.stack.expr; - -import java.util.List; - -import com.ralf.stack.MyStack; - -public class InfixExpr { - - private String exprString; - - public InfixExpr(String exprString) { - this.exprString = exprString; - } - - public double evaluate() { - - MyStack numStack = new MyStack(); - MyStack operStack = new MyStack<>(); - TokenParser parser = new TokenParser(); - - List list = parser.parse(exprString); - - for (Token token : list) { - if (token.isOperator()) { - if (operStack.isEmpty()) { - operStack.push(token); - } else { - while (!operStack.isEmpty() - && !token.hasHigherPriority(operStack.peek())) { - String operator = operStack.pop().toString(); - Float num1 = numStack.pop(); - Float num2 = numStack.pop(); - Float result = operate(operator,num1,num2); - numStack.push(result); - } - operStack.push(token); - } - } - if (token.isNumber()) { - numStack.push(new Float(token.getValue())); - } - } - - while(!operStack.isEmpty()){ - String operator = operStack.pop().toString(); - Float num1 = numStack.pop(); - Float num2 = numStack.pop(); - Float result = operate(operator,num1,num2); - numStack.push(result); - } - - return numStack.pop().floatValue(); - } - - private Float operate(String operator,Float num1, Float num2) { - float result = 0.0f; - switch (operator) { - case "+": - result = num2 + num1; - break; - case "-": - result = num2 - num1; - break; - case "*": - result = num2 * num1; - break; - case "/": - result = num2 / num1; - break; - } - return result; - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java deleted file mode 100644 index 6296d160ef..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ralf.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -import com.ralf.stack.MyStack; -import com.ralf.stack.StackUtil; - -public class InfixToPostExpr { - - public static List convert(String infixString){ - - TokenParser parser = new TokenParser(); - List tokens = parser.parse(infixString); - - MyStack S1 = new MyStack(); - MyStack S2 = new MyStack<>(); - - - for(Token token : tokens){ - if (token.isNumber()) { - S2.push(token); - } - else{ - while(!S1.isEmpty() && !token.hasHigherPriority(S1.peek())) { - S2.push(S1.pop()); - } - S1.push(token); - } - } - while(!S1.isEmpty()){ - S2.push(S1.pop()); - } - ArrayList list = new ArrayList<>(); - StackUtil.reverse(S2); - while(!S2.isEmpty()){ - list.add(S2.pop()); - } - return list; - } -} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java deleted file mode 100644 index d21344ea1e..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ralf.stack.expr; - -import java.util.List; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class InfixToPostExprTest { - - @Before - public void setUp() throws Exception { - } - - @Test - public void test() { - //10-2*3+50 - String string = "10-2*3+50"; - List tokens = InfixToPostExpr.convert(string); - - Assert.assertEquals(10, tokens.get(0).getValue()); - Assert.assertEquals(2, tokens.get(1).getValue()); - Assert.assertEquals(3, tokens.get(2).getValue()); - Assert.assertEquals("*", tokens.get(3).toString()); - Assert.assertEquals("-", tokens.get(4).toString()); - Assert.assertEquals(50, tokens.get(5).getValue()); - Assert.assertEquals("+", tokens.get(6).toString()); - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java b/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java deleted file mode 100644 index 6e40dbe72f..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ralf.stack.expr; - -import java.util.List; - -import com.ralf.stack.MyStack; - -public class PostfixExpr { - - private String exprString; - - public PostfixExpr(String exprString){ - this.exprString = exprString; - } - - public float evaluate() { - MyStack myStack = new MyStack<>(); - TokenParser parser = new TokenParser(); - List tokens = parser.parse(exprString); - for(Token token : tokens){ - if (token.isNumber()) { - myStack.push(new Float(token.getValue())); - } - if (token.isOperator()) { - float f2 = myStack.pop(); - float f1 = myStack.pop(); - myStack.push(calculate(token.toString(), f1, f2)); - } - } - return myStack.pop().floatValue(); - } - - private Float calculate(String op, Float f1, Float f2){ - if(op.equals("+")){ - return f1+f2; - } - if(op.equals("-")){ - return f1-f2; - } - if(op.equals("*")){ - return f1*f2; - } - if(op.equals("/")){ - return f1/f2; - } - throw new RuntimeException(op + " is not supported"); - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java b/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java deleted file mode 100644 index d5ff875c0f..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.ralf.stack.expr; - -import static org.junit.Assert.*; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PostfixExprTest { - - @Before - public void setUp() throws Exception { - } - - @Test - public void test() { - { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); - Assert.assertEquals(288, expr.evaluate(),0.0f); - } - { - //9+(3-1)*3+10/2 - PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); - Assert.assertEquals(20, expr.evaluate(),0.0f); - } - - { - //10-2*3+50 - PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); - Assert.assertEquals(54, expr.evaluate(),0.0f); - } - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java b/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java deleted file mode 100644 index 651889259e..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.ralf.stack.expr; - -import java.util.List; - -import com.ralf.stack.MyStack; - -public class PrefixExpr { - - private String exprString; - - public PrefixExpr(String exprString) { - this.exprString = exprString; - } - - public float evaluate() { - - MyStack myStack = new MyStack<>(); - MyStack exprStack = new MyStack<>(); - TokenParser parser = new TokenParser(); - List tokens = parser.parse(exprString); - - for(Token token : tokens){ - exprStack.push(token); - } - - while(!exprStack.isEmpty()){ - Token token = exprStack.pop(); - if (token.isNumber()) { - myStack.push(new Float(token.getValue())); - } - else { - Float f1 = myStack.pop(); - Float f2 = myStack.pop(); - myStack.push(calculate(token.toString(),f1,f2)); - } - } - return myStack.pop().floatValue(); - } - - private Float calculate(String operator, Float f1, Float f2) { - if ("+".equals(operator)) { - return f1 + f2; - } - if ("-".equals(operator)) { - return f1 - f2; - } - if ("*".equals(operator)) { - return f1 * f2; - } - if ("/".equals(operator)) { - return f1 / f2; - } - else { - throw new RuntimeException("this operator is not supported!"); - } - - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java b/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java deleted file mode 100644 index ff11cc2395..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.ralf.stack.expr; - -import static org.junit.Assert.*; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class PrefixExprTest { - - @Before - public void setUp() throws Exception { - } - - @Test - public void test() { - { - // 2*3+4*5 - PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); - Assert.assertEquals(26, expr.evaluate(),0.001f); - } - { - // 4*2 + 6+9*2/3 -8 - PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); - Assert.assertEquals(12, expr.evaluate(),0.001f); - } - { - //(3+4)*5-6 - PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); - Assert.assertEquals(29, expr.evaluate(),0.001f); - } - { - //1+((2+3)*4)-5 - PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); - Assert.assertEquals(16, expr.evaluate(),0.001f); - } - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/Token.java b/group23/632678665/com/basic/week7/stack/expr/Token.java deleted file mode 100644 index 1696dafbef..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/Token.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.ralf.stack.expr; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Token { - - public static final List OPERATORS = Arrays.asList("+","-","*","/"); - private static final Map priorities = new HashMap(); - static{ - priorities.put("+", 1); - priorities.put("-", 1); - priorities.put("*", 2); - priorities.put("/", 2); - } - static final int NUMBER = 1; - static final int OPERATOR = 2; - String value; - int type; - - public Token(String value, int type){ - this.value = value; - this.type = type; - } - public int getValue() { - - return Integer.valueOf(value).intValue(); - } - public String toString(){ - return value; - } - public boolean isNumber(){ - return type == NUMBER; - } - public boolean isOperator(){ - return type == OPERATOR; - } - public boolean hasHigherPriority(Token token){ - - if (!this.isOperator() || !token.isOperator()) { - throw new RuntimeException("numbers can't compare priority"); - } - return priorities.get(this.value) - priorities.get(token.value) > 0; - - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/TokenParser.java b/group23/632678665/com/basic/week7/stack/expr/TokenParser.java deleted file mode 100644 index 66206c9f11..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/TokenParser.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.ralf.stack.expr; - -import java.util.ArrayList; -import java.util.List; - -public class TokenParser { - - public TokenParser(){ - - } - public List parse(String string) { - List tokens = new ArrayList(); - int i = 0; - while(i < string.length()){ - - char ch = string.charAt(i); - if (isOperator(ch)) { - Token token = new Token(String.valueOf(ch), Token.OPERATOR); - tokens.add(token); - i++; - } - else if (Character.isDigit(ch)) { - int nextIndexOfChar = nextIndexOfOperator(i,string); - String value = string.substring(i, nextIndexOfChar); - Token token = new Token(value, Token.NUMBER); - tokens.add(token); - i = nextIndexOfChar; - } - else { - System.out.println("char:" + ch + " is not a number or operator,ignore!"); - i++; - } - - } - - - return tokens; - } - - private int nextIndexOfOperator(int i, String string) { - - while(Character.isDigit(string.charAt(i))){ - i++; - if (i == string.length()) { - break; - } - } - return i; - } - - private boolean isOperator(char ch) { - String string = String.valueOf(ch); - return Token.OPERATORS.contains(string); - } - -} diff --git a/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java b/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java deleted file mode 100644 index 3066880551..0000000000 --- a/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ralf.stack.expr; - -import static org.junit.Assert.*; - -import java.util.List; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class TokenParserTest { - - @Before - public void setUp() throws Exception { - } - - @Test - public void test() { - TokenParser tokenParser = new TokenParser(); - - List list = tokenParser.parse("300*20+12*5-20/4"); - Assert.assertEquals(300, list.get(0).getValue()); - Assert.assertEquals("*", list.get(1).toString()); - Assert.assertEquals(20, list.get(2).getValue()); - Assert.assertEquals("+", list.get(3).toString()); - Assert.assertEquals(12, list.get(4).getValue()); - Assert.assertEquals("*", list.get(5).toString()); - Assert.assertEquals(5, list.get(6).getValue()); - Assert.assertEquals("-", list.get(7).toString()); - Assert.assertEquals(20, list.get(8).getValue()); - Assert.assertEquals("/", list.get(9).toString()); - Assert.assertEquals(4, list.get(10).getValue()); - - } - -} diff --git a/group23/632678665/com/basic/week8/CircleQueue.java b/group23/632678665/com/basic/week8/CircleQueue.java deleted file mode 100644 index 1a6f022a4e..0000000000 --- a/group23/632678665/com/basic/week8/CircleQueue.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @author chk - */ -public class CircleQueue{ - - private int size; - private int first; - private int last; - Object[] queue; - - public CircleQueue(int size){ - queue = new Object[size]; - first = 0; - last = 0; - } - - public boolean isEmpty(){ - return first == last; - } - - public void enCircleQueue(Object o){ - if( (last+1) % size == first){ - System.out.println("Circle Queue is full"); - }else { - queue[last] = o; - last = (last+1) % queue.length; - } - } - - public int getSize(){ - return (last - first + queue.length) % queue.length; - } - - public Object deCircleQueue(){ - if(isEmpty()){ - return null; - }else{ - Object item = queue[first]; - first = (first+1)%queue.length; - return item; - } - - } -} diff --git a/group23/632678665/com/basic/week8/Josephus.java b/group23/632678665/com/basic/week8/Josephus.java deleted file mode 100644 index e3380c0ca6..0000000000 --- a/group23/632678665/com/basic/week8/Josephus.java +++ /dev/null @@ -1,44 +0,0 @@ - -/** - * 用Queue来实现Josephus问题 - * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: - * N个人围成一圈(位置记为0到N-1), - * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 - * @author chk - * - */ -public class Josephus { - - private static class Node { - int data; - Node next; - - public Node(int i) { - data = i; - } - } - - public static void execute(int n, int m) { - - Node header = new Node(0); - Node pointer = header; - for (int i = 1; i < n; i++) { - pointer.next = new Node(i); - pointer = pointer.next; - } - pointer.next = header; - while (pointer != pointer.next) { - for (int i = 1; i <= m; i++) { - pointer = pointer.next; - } - System.out.println(pointer.next.data); - pointer.next = pointer.next.next; - } - System.out.println(pointer.next.data); - - } - public static void main(String args[]){ - Josephus circle = new Josephus(); - circle.execute(8,4); - } -} diff --git a/group23/632678665/com/basic/week8/Queue.java b/group23/632678665/com/basic/week8/Queue.java deleted file mode 100644 index ea0e0cd621..0000000000 --- a/group23/632678665/com/basic/week8/Queue.java +++ /dev/null @@ -1,55 +0,0 @@ -import javax.xml.soap.Node; -import java.util.NoSuchElementException; - -/** - * @author chk - */ -public class Queue { - - private Node first; - private Node last; - private int size; - - private static class Node{ - private E item; - private Node next; - } - public Queue(){ - first = null; - last = null; - size = 0; - } - public boolean isEmpty(){ - return first == null; - } - public int size(){ - return size; - } - public void enQueue(E data){ - Node oldlast = last; - last = new Node(); - last.item = data; - last.next = null; - if(isEmpty()){ - first = last; - }else { - oldlast.next = last; - } - size++; - } - public E deQueue(){ - if(isEmpty()){ - throw new NoSuchElementException("queue is empty"); - }else{ - E item = first.item; - first = first.next; - size--; - if(isEmpty()){ - last = null; - } - return item; - } - } - - -} diff --git a/group23/632678665/com/basic/week8/QueueWithTwoStacks.java b/group23/632678665/com/basic/week8/QueueWithTwoStacks.java deleted file mode 100644 index af5d8a03df..0000000000 --- a/group23/632678665/com/basic/week8/QueueWithTwoStacks.java +++ /dev/null @@ -1,47 +0,0 @@ -import java.util.Stack; - -/** - * @author chk - */ -public class QueueWithTwoStacks { - private Stack stack1; - private Stack stack2; - public QueueWithTwoStacks(){ - stackk = new Stack(); - stackkk = new Stack(); - } - - public boolean isEmpty(){ - return stackk.isEmpty() && stackkk.isEmpty(); - } - - public int size() - { - return stackk.size() + stack2.size(); - } - - public void enQueue(E item){ - - stackk.push(item); - } - - public E deQueue(){ - if(stackkk.isEmpty()){ - while(!stackk.isEmpty()){ - stackkk.push(stackk.pop()); - } - } - return stackkk.pop(); - } - public static void main(String args[]){ - QueueWithTwoStacks queue = new QueueWithTwoStacks(); - queue.enQueue(1); - queue.enQueue(5); - queue.enQueue(4); - queue.enQueue(0); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - System.out.println(queue.deQueue()); - } -} diff --git a/group23/632678665/com/basic/week9/QuickMinStack.java b/group23/632678665/com/basic/week9/QuickMinStack.java deleted file mode 100644 index bac723e3f1..0000000000 --- a/group23/632678665/com/basic/week9/QuickMinStack.java +++ /dev/null @@ -1,48 +0,0 @@ - - -import java.util.Stack; - -/** - * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 - * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 - * @author chk - * - */ -public class QuickMinStack extends Stack { - - Stack sMin; - public QuickMinStack(){ - sMin = new Stack(); - } - public void push(int data){ - if(data <= findMin()){ - sMin.push(data); - } - super.push(data); - } - public Integer pop(){ - int value = super.pop(); - if(value == findMin()){ - sMin.pop(); - } - return value; - } - public int findMin(){ - if(sMin.isEmpty()){ - return Integer.MAX_VALUE; - } - return sMin.peek(); - } - - public static void main(String args[]){ - QuickMinStack stack = new QuickMinStack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(0); - System.out.println(stack.pop().intValue()); - System.out.println(stack.findMin()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - } -} diff --git a/group23/632678665/com/basic/week9/StackWithTwoQueues.java b/group23/632678665/com/basic/week9/StackWithTwoQueues.java deleted file mode 100644 index 7fcf9162c9..0000000000 --- a/group23/632678665/com/basic/week9/StackWithTwoQueues.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.basic.week9; -import java.util.LinkedList; - - -/** - * @author chk - */ -public class StackWithTwoQueues { - - LinkedList queue1=new LinkedList(); - LinkedList queue2=new LinkedList(); - public void push(int data){ - queue1.addLast(data); - } - public int pop() { - if (sSize() > 0) { - if (!queue1.isEmpty()) { - while (queue1.size() > 1) { - queue2.addLast(queue1.removeFirst()); - } - return queue1.removeFirst(); - } else { - while (queue2.size() > 1) { - queue1.addLast(queue2.removeFirst()); - } - return queue2.removeFirst(); - } - } else { - System.out.println("栈空,不能出栈"); - return Integer.MAX_VALUE; - } - } - public int sSize(){ - return queue1.size() + queue2.size(); - } - public static void main(String[] args) - { - StackWithTwoQueues stack=new StackWithTwoQueues(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - stack.push(5); - stack.push(6); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - System.out.println(stack.pop()); - } -} diff --git a/group23/632678665/com/basic/week9/TwoStackInOneArray.java b/group23/632678665/com/basic/week9/TwoStackInOneArray.java deleted file mode 100644 index 5443e6d6e4..0000000000 --- a/group23/632678665/com/basic/week9/TwoStackInOneArray.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.basic.week9; -import java.util.Stack; - -/** - * @author chk - */ -public class TwoStackInOneArray { - - - - Object[] data = new Object[10]; - - private int index1 = 0; - private int index2 = data.length - 1; - - - private boolean isFull() { - if (index1 == index2) { - return true; - } else - return false; - } - - private void extendCapacity() { - - } - - /** - * 向第一个栈中压入元素 - * - * @param o - */ - public void push1(Object o) { - - } - - /** - * 从第一个栈中弹出元素 - * - * @return - */ - public Object pop1() { - return null; - } - - /** - * 获取第一个栈的栈顶元素 - * - * @return - */ - - public Object peek1() { - return null; - } - - /* - * 向第二个栈压入元素 - */ - public void push2(Object o) { - - } - - /** - * 从第二个栈弹出元素 - * - * @return - */ - public Object pop2() { - return null; - } - - /** - * 获取第二个栈的栈顶元素 - * - * @return - */ - - public Object peek2() { - return null; - } - -} diff --git a/group23/729693763/First_Homework1/readme.md b/group23/729693763/First_Homework1/readme.md deleted file mode 100644 index 219dee010b..0000000000 --- a/group23/729693763/First_Homework1/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -It contain source code and Test file by JUnit, -you can run SuitTest for testing whole file. diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java b/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java deleted file mode 100644 index ccb3bcb12c..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.danny.hw1; - -import java.lang.reflect.Array; -import java.util.Arrays; - -import javax.print.attribute.Size2DSyntax; - -public class ArrayList implements List{ - //ArrayList Size - private int size=0; - private int array_len=2; - - //total element in here - private Object[] elementData = new Object[array_len]; - - @Override - public void add(Object o) { - // TODO Auto-generated method stub - adjustCapacity(); - this.elementData[size++] = o; - } - - @Override - public void add(int index, Object o) { - // TODO Auto-generated method stub - //Check range. if index is invalid,then would not add anythings - rangeCheckForAdd(index); - - adjustCapacity(); - System.arraycopy(elementData, index, elementData, - index + 1,size - index); - this.elementData[index] = o; - this.size++; - - } - - @Override - public Object get(int index) { - // TODO Auto-generated method stub - rangeCheckExist(index); - - return elementData[index]; - - } - - @Override - public Object remove(int index) { - // TODO Auto-generated method stub - rangeCheckExist(index); - - Object oldValue = elementData[index]; - //deal with copy operation - int moveStep = size - index - 1; - if ( moveStep > 0 ) - System.arraycopy(elementData, index+1, elementData, index,moveStep); - elementData[--size] = null; // clear to let GC do its work - - return oldValue; - - } - - @Override - public int size() { - // TODO Auto-generated method stub - return this.size; - } - - //Get Iterator - public Iterator iterator() { - return new ArrayListIterator(); - } - - /******* Iterator *******/ - private class ArrayListIterator implements Iterator{ - - private int currentIndex = 0; - - @Override - public boolean hasNext() { - return currentIndex < size(); - } - - @Override - public Object next() { - rangeCheckExist(currentIndex); - - return elementData[currentIndex++]; - } - } - - - /*******Inner function*******/ - //Increase arraylist size - private void adjustCapacity(){ - //array length can not satisfy data size; - if ( this.array_len < size() + 1 ) { - this.array_len *= 2; - this.elementData = Arrays.copyOf(elementData, array_len); - } else { - return ; - } - } - - private void rangeCheckForAdd(int index) { - //Add operation is allow to add value in [ size() ] even if [ size() ] has not data - if ( index > size() || index < 0 ) - throw new IndexOutOfBoundsException("Invalid Adding Index:"+index); - } - private void rangeCheckExist(int index) { - if ( index >= size() || index < 0 ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java b/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java deleted file mode 100644 index 8e3178b50b..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.danny.hw1; - -import java.util.Map; -import java.util.TreeMap; - -public class BinaryTreeNode { - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode insert(Object o){ - if ( this.data == null && left == null && right == null ) { - this.data = o; - return this; - } else { - BinaryTreeNode temp = findNode(this, o); - - BinaryTreeNode newNode = new BinaryTreeNode(); - newNode.data = o; - //assert more than one null node in the temp(left,right,or both); - if ( temp.compareTo(o) >= 0 ) { - temp.left = newNode; - } else { - temp.right = newNode; - } - return newNode; - } - } - - public BinaryTreeNode() { - // TODO Auto-generated constructor stub - data=null; - left =null; - right = null; - - } - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - private int compareTo(Object o){ - // o1 > o2 == 1; o1 = o2 == 0 ; o1 < o2 == -1 - //假设这个比较现在只用在数字上 - return Integer.parseInt(this.data.toString()) - Integer.parseInt(o.toString()); - } - - private static BinaryTreeNode findNode(BinaryTreeNode root,Object o){ - if ( root.left == null && root.right == null || - ( root.compareTo(o) < 0 && root.right == null) || - ( root.compareTo(o) >= 0 && root.left == null) ){ - return root; - } else if ( root.compareTo(o) >= 0 ) { - //root data is bigger than object - return findNode(root.left, o); - } else { - return findNode(root.right, o); - } -// else if(root.compareTo(o) < 0 ){ -// return findNode(root.right, o); -// } -// - } - - //For Test value - private Map teMap = new TreeMap<>(); - public void printWholeTree(BinaryTreeNode root,int layer){ - if(root == null) { - return ; - } - teMap.put(root.data,layer); - - layer++; - printWholeTree(root.left,layer); - printWholeTree(root.right,layer); - - } - - public Map getTeMap() { - return teMap; - } - - public void setTeMap(Map teMap) { - this.teMap = teMap; - } -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java deleted file mode 100644 index b1ff654263..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.danny.hw1; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java b/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java deleted file mode 100644 index 64c9b9bbca..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java +++ /dev/null @@ -1,296 +0,0 @@ -package com.danny.hw1; - -public class LinkedList implements List{ - - private Node Head = null; - private Node Tail = null; - private int size = 0; - - @Override - public void add(Object o) { - // TODO Auto-generated method stub - addLastNode(o); - } - - @Override - public void add(int index, Object o) { - // TODO Auto-generated method stub - checkPositionIndex(index); - - if ( index == size() ){ - addLastNode(o); - } else { - addBeforeNode(index,o); - } - } - - @Override - public Object get(int index) { - // TODO Auto-generated method stub - checkElementIndex(index); - - Node findGetNode = findIndexNode(index); - return findGetNode.data; - } - - @Override - public Object remove(int index) { - // TODO Auto-generated method stub - checkElementIndex(index); - Node deleteNode = null; - - //delete all node - if ( size() == 1 ) { - deleteNode = this.Head; - this.Head = null; - this.Tail = null; - } else if ( index == 0 ) { - //Remove Head - deleteNode = this.Head; - this.Head = this.Head.next; - } else if ( index == size() - 1) { - //Remove Tail - deleteNode = this.Tail; - Node findDeleteNode = findIndexNode(index - 1); - findDeleteNode.next = null; - this.Tail = findDeleteNode; - } else { - //Remove Mid - Node findDeleteNode = findIndexNode(index - 1); - deleteNode = findDeleteNode.next; - findDeleteNode.next = findDeleteNode.next.next; - } - this.size--; - return deleteNode.data; - } - - @Override - public int size() { - // TODO Auto-generated method stub - return this.size; - } - - @Override - public Iterator iterator(){ - return new LinkedListIterator(); - } - - /************Other function (without Interface function)**************/ - - public void addFirst(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = this.Head; - this.Head = newNode; - } - - public Object removeFirst(){ - checkElementIndex(0); - - Node deleteNode = this.Head; - this.Head = this.Head.next; - - this.size--; - return deleteNode.data; - } - - public Object removeLast(){ - checkElementIndex(size() - 1); - - Node deleteNode = this.Tail; - if ( this.Head == this.Tail ) { - this.Head = this.Tail = null; - } else { - this.Tail = findIndexNode(size() - 2); - } - this.size--; - return deleteNode.data; - - } - /************Iterator**************/ - private class LinkedListIterator implements Iterator{ - private Node currentNode; - private int currentIndex; - - public LinkedListIterator() { - // TODO Auto-generated constructor stub - this.currentIndex = 0; - this.currentNode = new Node(); - } - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return currentIndex < size(); - } - - @Override - public Object next() { - // TODO Auto-generated method stub - checkElementIndex(currentIndex); - if ( currentNode.data == null ) { - this.currentNode = findIndexNode(currentIndex); - } - Object value = currentNode.data; - currentNode = currentNode.next; - currentIndex++; - return value; - } - } - - /************Node class for supporting LinkedList**************/ - private static class Node{ - Object data ; - Node next ; - public Node() { - // TODO Auto-generated constructor stub - data = null; - next = null; - } - } - - /************Inner function **************/ - private void checkPositionIndex(int index){ - if ( !( index >= 0 && index <= size ) ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - private void checkElementIndex(int index){ - if ( !( index >= 0 && index < size ) ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - private void addLastNode(Object o){ - Node newNode = new Node(); - newNode.data = o; - - if ( this.Head == null ) { - this.Head = newNode; - this.Tail = newNode; - } else { - if(this.Head == this.Tail ){ - this.Tail = newNode; - this.Head.next = this.Tail; - } - else{ - //Tail and Head are different Object, - this.Tail.next = newNode; - this.Tail = newNode; - } - } - this.size++; - } - - private void addBeforeNode(int index,Object o){ - Node newNode = new Node(); - Node beforeInserNode = this.Head; - newNode.data = o; - - // if index is in Head - if ( index == 0 ) { - newNode.next = this.Head; - this.Head = newNode; - } else { - for (int i=0; i7->10 , 逆置后变为 10->7->3 -// */ -//public void reverse(){ -// -//} -// -///** -// * 删除一个单链表的前半部分 -// * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 -// * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 -// -// */ -//public void removeFirstHalf(){ -// -//} -// -///** -// * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 -// * @param i -// * @param length -// */ -//public void remove(int i, int length){ -// -//} -///** -// * 假定当前链表和list均包含已升序排列的整数 -// * 从当前链表中取出那些list所指定的元素 -// * 例如当前链表 = 11->101->201->301->401->501->601->701 -// * listB = 1->3->4->6 -// * 返回的结果应该是[101,301,401,601] -// * @param list -// */ -//public static int[] getElements(LinkedList list){ -// return null; -//} -// -///** -// * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 -// * 从当前链表中中删除在list中出现的元素 -// -// * @param list -// */ -// -//public void subtract(LinkedList list){ -// -//} -// -///** -// * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 -// * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) -// */ -//public void removeDuplicateValues(){ -// -//} -// -///** -// * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 -// * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) -// * @param min -// * @param max -// */ -//public void removeRange(int min, int max){ -// -//} -// -///** -// * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) -// * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 -// * @param list -// */ -//public LinkedList intersection( LinkedList list){ -// return null; -//} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/List.java b/group23/729693763/First_Homework1/src/com/danny/hw1/List.java deleted file mode 100644 index e71a86c78d..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.danny.hw1; - -public interface List { - void add(Object o); - void add(int index,Object o); - Object get(int index); - Object remove(int index); - int size(); - Iterator iterator(); -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java deleted file mode 100644 index 58f957dd31..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.danny.hw1; - -public class Queue { - private LinkedList elementData = new LinkedList(); - - public void enQueue(Object o){ - elementData.add(o); - } - - public Object deQueue(){ - if ( size() > 0 ) { - return elementData.remove(0); - } else { - throw new IndexOutOfBoundsException("Queue is Null"); - } - } - - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return elementData.size(); - } -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java deleted file mode 100644 index 165387695b..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.danny.hw1; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - this.elementData.add(o); - - } - - public Object pop(){ - int size = this.elementData.size(); - - if ( size > 0 ) { - return this.elementData.remove(size - 1 ); - } else{ - throw new IndexOutOfBoundsException("Stack is empty"); - } - } - - public Object peek(){ - - if ( size() > 0 ) { - return this.elementData.get(size() - 1 ); - } else{ - throw new IndexOutOfBoundsException("Stack is empty"); - } - } - public boolean isEmpty(){ - return size() == 0; - } - - public int size(){ - return this.elementData.size(); - } - - public Stack() { - // TODO Auto-generated constructor stub - } -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java deleted file mode 100644 index de4c734eb8..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import java.lang.reflect.Array; -import java.lang.reflect.Parameter; -import java.util.Arrays; -import java.util.Collection; - -import javax.print.attribute.standard.RequestingUserName; -import javax.xml.crypto.Data; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; - -import com.danny.hw1.ArrayList; -import com.danny.hw1.Iterator; -import com.danny.hw1.test_al; - -import junit.extensions.TestSetup; - - -public class ArrayListTest { - - static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; - ArrayList test; - @Before - public void setUp() throws Exception{ - test = new ArrayList(); - for(Object data: Data){ - test.add(data); - } - } - - @Test - public void testAddObject() { - int len = test.size(); - test.add(10); - assertEquals(len, test.size()-1); - } - - @Test - public void testAddIntObject() { - int len = test.size(); - test.add(len, 10); - - assertEquals(len, test.size()-1); - } - - @Test - public void testGet() { - assertEquals(Data[3], test.get(3)); - } - - @Test - public void testRemove() { - assertEquals(Data[4], test.remove(4)); - assertEquals(Data.length-1, test.size()); - } - - @Test - public void testSize() { - assertEquals(Data.length, test.size()); - } - - @Test - public void testIterator() { - Iterator iterator =test.iterator(); - for(Object i:Data){ - if(iterator.hasNext()){ - assertEquals(i,iterator.next()); - } - } - } - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java deleted file mode 100644 index 2d99534098..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.danny.hw1.BinaryTreeNode; -import com.danny.hw1.LinkedList; - -public class BinaryTreeNodeTest { - - static Object[] Data = new Object[]{5,10,3,2,15,12,56,8}; - BinaryTreeNode test; - @Before - public void setUp() throws Exception{ - test = new BinaryTreeNode(); - for(Object data: Data){ - test.insert(data); - - } - } - @Test - public void testPrintWholeTree(){ - test.printWholeTree(test, 1); - int layer = 1; - int printNum = 0; - System.out.println("var {5,10,3,2,15,12,56,8} insert tree\n"+"Print binary tree:"); - while(true){ - if(printNum == test.getTeMap().size()) break; - for (Object key : test.getTeMap().keySet()) { - Integer value = test.getTeMap().get(key); - - if (value.intValue() == layer){ - System.out.print(key.toString()+" "); - printNum++; - } - - } - System.out.println(""); - layer++; - } - - - } - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java deleted file mode 100644 index ab49d2823c..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.danny.hw1.ArrayList; -import com.danny.hw1.Iterator; -import com.danny.hw1.LinkedList; - -public class LinkedListTest { - - static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; - LinkedList test; - @Before - public void setUp() throws Exception{ - test = new LinkedList(); - for(Object data: Data){ - test.add(data); - } - } - - @Test - public void testAddObject() { - int len = test.size(); - test.add(10); - assertEquals(len, test.size()-1); - } - - @Test - public void testAddIntObject() { - int len = test.size(); - test.add(len, 10); - - assertEquals(len, test.size()-1); - } - - @Test - public void testGet() { - assertEquals(Data[3], test.get(3)); - } - - @Test - public void testRemove() { - System.out.println(Data[4]); - assertEquals(Data[4], test.remove(4)); - assertEquals(Data.length -1, test.size()); - } - - @Test - public void testSize() { - assertEquals(Data.length, test.size()); - } - - @Test - public void testIterator() { - Iterator iterator =test.iterator(); - for(Object i:Data){ - if(iterator.hasNext()){ - assertEquals(i,iterator.next()); - } - } - } - - @Test - public void testAddFirst() { - test.addFirst(10); - assertEquals(10, test.get(0)); - } - - @Test - public void testRemoveFirst() { - Object ans=test.get(0); - assertEquals(ans,test.removeFirst()); - assertEquals(Data.length-1,test.size()); - } - - @Test - public void testRemoveLast() { - Object ans=test.get(Data.length - 1); - assertEquals(ans,test.removeLast()); - assertEquals(Data.length-1,test.size()); - } - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java deleted file mode 100644 index 7292129e95..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.danny.hw1.LinkedList; -import com.danny.hw1.Queue; - -public class QueueTest { - - static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; - Queue test; - @Before - public void setUp() throws Exception{ - test = new Queue(); - for(Object data: Data){ - test.enQueue(data); - } - } - - @Test - public void testEnQueue() { - Object t=10; - test.enQueue(t); - assertEquals(Data.length+1,test.size()); - } - - @Test - public void testDeQueue() { - Object t=test.deQueue(); - assertEquals(Data.length-1,test.size()); - assertEquals(Data[0], t); - } - @Test - public void testIsEmpty() { - assertFalse(test.isEmpty()); - } - - @Test - public void testSize() { - assertEquals(Data.length,test.size()); - } - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java deleted file mode 100644 index 11484c0043..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import com.danny.hw1.Queue; -import com.danny.hw1.Stack; - -public class StackTest { - - static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; - Stack test; - @Before - public void setUp() throws Exception{ - test = new Stack(); - for(Object data: Data){ - test.push(data); - } - } - - @Test - public void testPush() { - Object t=10; - test.push(t); - assertEquals(Data.length+1,test.size()); - } - - @Test - public void testPop() { - assertEquals(Data[Data.length-1], test.pop()); - assertEquals(Data.length-1, test.size()); - } - - @Test - public void testPeek() { - assertEquals(Data[Data.length-1], test.peek()); - assertEquals(Data.length, test.size()); - } - - @Test - public void testIsEmpty() { - assertFalse(test.isEmpty()); - } - - @Test - public void testSize() { - assertEquals(Data.length, test.size()); - } - - - -} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java deleted file mode 100644 index 25eb57411b..0000000000 --- a/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.danny.hw1.test; - -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@Suite.SuiteClasses({ArrayListTest.class,BinaryTreeNodeTest.class, - LinkedListTest.class,QueueTest.class,StackTest.class - }) -public class SuitTest { - -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java deleted file mode 100644 index af11509593..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.danny.hw2; - -import java.util.Arrays; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = - * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * - * @param origin - * @return - */ - public void reverseArray(int[] origin) { - int size = origin.length; - int[] temp = new int[size]; - - for(int i=0;i < size; i++){ - temp[i] = origin[size-i-1]; - } - - for(int i=0;i array2[index2] ){ - result[resultIndex++] = array2[index2++]; - break; - } - } else{ - result[resultIndex++] = array1[index1++]; - } - } - System.out.println(resultIndex); - return Arrays.copyOf(result, resultIndex); - - } - - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * - * @param oldArray - * @param size - * @return - */ - public int[] grow(int[] oldArray, int size) { - int oldSize = oldArray.length; - int[] newArray= new int[oldSize+size]; - - for ( int i = 0; i < newArray.length; i++) { - if ( i < oldSize ) { - newArray[i] = oldArray[i]; - } else{ - newArray[i] = 0; - } - } - return newArray; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , - * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] - * - * @param max - * @return - */ - public int[] fibonacci(int max) { - if(max == 1){ - return new int[0]; - } - - int maxIndex = 1000; - int realIndex = 0; - int[] array=new int[maxIndex]; - for (; realIndex <= array.length; realIndex++) { - int fibonacciNum = getFibonacciArray(realIndex+1); - if(fibonacciNum > max){ - break; - } - array[realIndex] = fibonacciNum; - } - - - - return Arrays.copyOf(array, realIndex); - } - - - private int getFibonacciArray(int index){ - - if(index == 0 || index == 1){ - return index; - } - return getFibonacciArray(index - 1) + getFibonacciArray(index - 2); - } - /** - * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * - * @param max - * @return - */ - public int[] getPrimes(int max) { - int maxIndex = 1000; - int realSize = 0; - int[] array = new int[maxIndex]; - for (int i = 0; i < max; i++) { - if(isPrimers(i)){ - array[realSize++] = i; - } - } - return Arrays.copyOf(array, realSize); - } - private static boolean isPrimers(int n){ - if (n <= 3) { - return n > 1; - } - - for(int i=2;i<=Math.sqrt(n);i++){ - if(n%i == 0) - return false; - } - return true; - } - - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * - * @param max - * @return - */ - public int[] getPerfectNumbers(int max) { - int maxIndex = 1000; - int realIndex = 0; - int[] array = new int[maxIndex]; - int sum = 0; - - for (int i = 1; i < max /2 +1; i++) { - if(max % i == 0){ - sum += i; - array[realIndex++] = i; - } - } - if(sum == max){ - return Arrays.copyOf(array, realIndex); - }else{ - return new int[0]; - } - - } - - /** - * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" - * - * @param array - * @param s - * @return - */ - public String join(int[] array, String seperator) { - String result=""; - for (int i = 0; i < array.length; i++) { - result+= String.valueOf(array[i]) + seperator; - } - //去掉多余的一个seperator - return result.substring(0, result.length()-1); - } - - - - -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java deleted file mode 100644 index 340d542dec..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.danny.hw2; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java deleted file mode 100644 index 6e1cb4ba96..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.danny.hw2; - -import java.io.File; -import java.lang.invoke.CallSite; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import org.jaxen.*; - -public class Struts { - - private static Document file = null; - private static String file_path = - new File("").getAbsolutePath()+".\\xmlFolder\\struts.xml"; - - private static String viewPath="com.danny.hw2.View"; - - //0. 读取配置文件struts.xml - private static Document parse(String path){ - SAXReader reader = new SAXReader(); - Document document = null; - try { - document = reader.read(path); - } catch (DocumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return document; - } - - private static Element getAction(Document document,String name){ - - List lElement = (List) file.selectObject("/struts/action"); - Element actionElement = null; - for(Element e:lElement){ - if(e.attributeValue("name").equals(name)){ - actionElement = e; - break; - } - } - return actionElement; - } - - public static View runAction(String actionName, Map parameters) { - - file = parse(file_path); - - //返回的class View; - Object viewClass = null; - - - //0 Get Action Element - Element actionElement = getAction(file, actionName); - - - String actionClassPath = actionElement.attributeValue("class"); - System.out.println(actionClassPath); - - Object action = null; - - try { - /* - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - */ - action = Class.forName(actionClassPath).newInstance(); - - Method setName = action.getClass().getMethod("setName",String.class); - setName.invoke(action, parameters.get("name")); - - Method setPassword = action.getClass().getMethod("setPassword",String.class); - setPassword.invoke(action, parameters.get("password")); - - - //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - Method execute = action.getClass().getMethod("execute", null); - Object status = execute.invoke(action); - - System.out.println(status.toString()); - - - //3获得所有的Getter字段 - Field[] files = action.getClass().getDeclaredFields(); - - HashMap save = new HashMap<>(); - - //找到需要的数据,线存到save中 - for (int i = 0; i < files.length; i++) { - String name = files[i].getName(); - name = "get" + name.substring(0,1).toUpperCase() + - name.substring(1); - - - Method getter = action.getClass().getMethod(name,null); - save.put(files[i].getName(), (String) getter.invoke(action)); - - } - //塞进viewClass里面 - viewClass = Class.forName(viewPath).newInstance(); - Method setParameters = viewClass.getClass().getMethod("setParameters", Map.class); - setParameters.invoke(viewClass, save); - - - - //4将jsp放进去 - List resultElement = actionElement.selectNodes("result"); - for(Element e:resultElement){ - if(e.attributeValue("name").equals(status.toString())){ - String jspFields= e.getStringValue(); - viewClass.getClass().getMethod("setJsp", String.class). - invoke(viewClass, jspFields); - } - - } - - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - - throw new RuntimeException(e.getMessage()); - } - - - - - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" - - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters - - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ - - - return (View) viewClass; - } - - -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java deleted file mode 100644 index 67ff0a061b..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.danny.hw2; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java deleted file mode 100644 index a7fce5320a..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.danny.hw2.test; - -import static org.junit.Assert.*; - -import org.junit.Test; - -import com.danny.hw2.ArrayUtil; - -public class ArrayUtilTest { - - @Test - public void testReverseArray() { -// * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = -// * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - int[] testData = new int[]{7,9,30,3}; - int[] ans = new int[]{3,30,9,7}; - new ArrayUtil().reverseArray(testData); - - for (int i = 0; i < ans.length; i++) { - assertEquals(ans[i], testData[i]); - } - } - - @Test - public void testRemoveZero() { - int[] testData = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; - int[] ans = new int[]{1,3,4,5,6,6,5,4,7,6,7,5}; - - int[] test = new ArrayUtil().removeZero(testData); - for (int i = 0; i < ans.length; i++) { - assertEquals(ans[i], test[i]); - } - } - - @Test - public void testMerge() { -// * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = -// * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - int[] a1 = new int[]{3, 5, 7,8}; - int[] a2 = new int[]{4,5,6,7}; - - int[] ans = new int[]{3,4,5,6,7,8}; - - int[] test = new ArrayUtil().merge(a1, a2); - - for (int i = 0; i < test.length; i++) { - assertEquals(ans[i], test[i]); - } - - } - - @Test - public void testGrow() { -// 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size -// * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 -// * [2,3,6,0,0,0] - - int size = 3; - int[] testData = new int[]{2,3,6}; - int[] test = new ArrayUtil().grow(testData, size); - assertEquals(testData.length+size, test.length); - - } - - @Test - public void testFibonacci() { - int[] ans = new int[]{1,1,2,3,5,8,13}; - int[] array = new ArrayUtil().fibonacci(15); - for (int i = 0; i < ans.length; i++) { - assertEquals(ans[i], array[i]); - } - - } - - @Test - public void testGetPerfectNumbers() { - - int[] ans=new int[]{1,2,4,7,14}; - int[] array=new ArrayUtil().getPerfectNumbers(28); - for (int i = 0; i < array.length; i++) { - assertEquals(ans[i], array[i]); - } - } - - @Test - public void testJoin() { - //* 用seperator 把数组 array给连接起来 例如array= [3,8,9], - //seperator = "-" 则返回值为"3-8-9" - int[] test = new int[]{3,8,9}; - - String test1 = new ArrayUtil().join(test, "-"); - assertEquals("3-8-9", test1); - } - -} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java deleted file mode 100644 index 49b770f015..0000000000 --- a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.danny.hw2.test; - -import java.util.HashMap; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Test; - -import com.danny.hw2.Struts; -import com.danny.hw2.View; - - - - - -public class StrutsTest { - - @Test - public void testLoginActionSuccess() { - - String actionName = "login"; - - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } -} diff --git a/group23/729693763/Third_Homework3/DataStruct/Iterator.java b/group23/729693763/Third_Homework3/DataStruct/Iterator.java deleted file mode 100644 index 2ca354f82a..0000000000 --- a/group23/729693763/Third_Homework3/DataStruct/Iterator.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.zhous.DataStruct; - -public interface Iterator { - public boolean hasNext(); - public Object next(); -} diff --git a/group23/729693763/Third_Homework3/DataStruct/LinkedList.java b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java deleted file mode 100644 index 2a6663a3ba..0000000000 --- a/group23/729693763/Third_Homework3/DataStruct/LinkedList.java +++ /dev/null @@ -1,327 +0,0 @@ -package com.zhous.DataStruct; - -import javafx.beans.binding.ObjectExpression; - - - -public class LinkedList implements List { - - private Node head = null; - private int size = 0; - - public void add(Object o){ - addLast(o); - this.size++; - } - - //内部调用的方法: - //2 返回添加到哪个Node - private Node findBeforeInsertNode(int needInsertIndex){ - Node findGetNode = this.head; - for ( int i=0; i< needInsertIndex - 1; i++ ) { - findGetNode = findGetNode.next; - } - return findGetNode; - } - //3 - private void checkPositionIndex(int index) { - if ( !( index >= 0 && index <= size ) ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - //4 - private void addBeforeNode(int index, Object o) { - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - - Node beforeInserNode = this.head; - - - beforeInserNode = findBeforeInsertNode(index); - - newNode.next = beforeInserNode.next; - beforeInserNode.next = newNode; - - } - //5 - private Node findIndexNode(int index){ - Node findGetNode = this.head; - for ( int i=0; i< index; i++ ) { - findGetNode = findGetNode.next; - } - return findGetNode; - } - - - public void add(int index , Object o){ - checkPositionIndex(index); - if( index == size()){ - addLast(o); - } else if ( index == 0 ) { - addFirst(o); - } else{ - addBeforeNode(index,o); - } - this.size++; - } - - - - - public Object get(int index){ - checkElementIndex(index); - return findIndexNode(index); - } - public Object remove(int index){ - checkElementIndex(index); - Object deleteData = null; - - if(index == 0){ - deleteData = removeFirst(); - } else if(index == (size() - 1) ){ - deleteData = removeLast(); - } else { - Node temp = findBeforeInsertNode(index); - Node tempNext = temp.next; - deleteData = tempNext.data; - - temp.next = tempNext.next; - tempNext = null; - } - - return deleteData; - } - - //6 - private void checkElementIndex(int index) { - if ( !( index >= 0 && index < size ) ) - throw new IndexOutOfBoundsException("Invalid Index:"+index); - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - if ( this.head == null ) { - this.head = newNode; - } else { - newNode.next = this.head; - this.head = newNode; - } - } - private void addLast(Object o){ - Node newNode = new Node(); - newNode.data = o; - newNode.next = null; - if ( head == null ) { - head = newNode; - } else{ - findBeforeInsertNode(this.size).next = newNode; - } - } - public Object removeFirst(){ - Object data; - Node newHead = new Node(); - newHead = this.head; - this.head = newHead.next; - - data = newHead.data; - newHead = null; - return data; - } - public Object removeLast(){ - Object data; - Node last = findIndexNode(this.size() -1); - data = last.data; - last = null; - - return data; - } - public Iterator iterator() - { - return new LinkedListIterator(); - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - Node first ; - int currentIndex = 1; - this.head = findIndexNode(this.size - 1); - if(this.size() <= 1){ - return; - } - while(currentIndex < this.size() ){ - first = findIndexNode(this.size() - currentIndex); - first.next = findIndexNode(this.size - currentIndex - 1); - currentIndex++; - } - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - checkElementIndex(this.size()); - - int mid = this.size / 2; - Node temp = this.head; - this.head = findIndexNode(mid); - for (int i = 0; i < mid; i++) { - Node T = temp.next; - temp = null; - temp = T; - } - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param index - * @param length - */ - public void remove(int index, int length){ - checkElementIndex(length + index ); - - Node before = findBeforeInsertNode(index); - Node temp = findIndexNode(index); - for (int i= 0; i < length; i++) { - Node T = temp.next; - temp = null; - temp = T; - } - before.next = temp; - } - /** - * 假定当前链表和listB均包含已升序排列的整数 - * 从当前链表中取出那些listB所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public int[] getElements(LinkedList list){ - Node listNode = list.head; - Node myNode = this.head; - int[] data = new int[list.size()]; - for (int i = 0; i < this.size(); i++) { - if(i == (Integer) listNode.data){ - data[i] = (Integer)myNode.data; - } - myNode = myNode.next; - } - - return data; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在listB中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - int[] data = new int[list.size()]; - for (int i = 0,j = 0; i < this.size(); i++) { - for (; j < list.size(); j++) { - if(this.get(i).equals(list.get(j))){ - this.remove(i); - break; - } - } - } - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - * (选做) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - * (选做) - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - LinkedList listC = new LinkedList(); - - for (int i = 0,j = 0; i < this.size(); i++) { - for (; j < list.size(); j++) { - if(this.get(i).equals(list.get(j))){ - listC.add(this.get(i)); - break; - } - } - } - - - - return listC; - } - - - - /************Iterator**************/ - private class LinkedListIterator implements Iterator{ - private Node currentNode; - private int currentIndex; - - public LinkedListIterator() { - // TODO Auto-generated constructor stub - this.currentIndex = 0; - this.currentNode = new Node(); - } - @Override - public boolean hasNext() { - // TODO Auto-generated method stub - return currentIndex < size(); - } - - @Override - public Object next() { - // TODO Auto-generated method stub - checkElementIndex(currentIndex); - if ( currentNode.data == null ) { - this.currentNode = findIndexNode(currentIndex); - } - Object value = currentNode.data; - currentNode = currentNode.next; - currentIndex++; - return value; - } - } -} diff --git a/group23/729693763/Third_Homework3/DataStruct/List.java b/group23/729693763/Third_Homework3/DataStruct/List.java deleted file mode 100644 index aa8b039453..0000000000 --- a/group23/729693763/Third_Homework3/DataStruct/List.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.zhous.DataStruct; - -public interface List { - void add(Object o); - void add(int index, Object o); - Object get(int index); - Object remove(int index); - int size(); - Iterator iterator(); -} diff --git a/group23/729693763/Third_Homework3/download/DownloadThread.java b/group23/729693763/Third_Homework3/download/DownloadThread.java deleted file mode 100644 index 3ab337e352..0000000000 --- a/group23/729693763/Third_Homework3/download/DownloadThread.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.zhous.download; - -import com.zhous.download.api.Connection; -import com.zhous.download.api.DownloadListener; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; - -public class DownloadThread extends Thread{ - - Connection conn; - int startPos; - int endPos; - File targetFile; - DownloadListener downloadListener; - - public DownloadThread( Connection conn, int startPos, int endPos,File targetFile,DownloadListener downloadListener){ - - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - this.targetFile = targetFile; - this.downloadListener = downloadListener; - } - public void run(){ - try { - //读取到指定长度的二进制数据 - System.out.println(this.getName()+"开始下载"); - byte[] data = conn.read(startPos,endPos); - - //插入的file中去 - RandomAccessFile raFile = new RandomAccessFile(this.targetFile,"rw"); - raFile.seek(startPos); - raFile.write(data,0,endPos-startPos ); - - raFile.close(); - //做完了 - if(FileDownloader.isDownloadFinish() ){ - downloadListener.notifyFinished(); - System.out.println(this.getName()+"完成最后的下载,并写入文件"); - } - - - }catch (IOException e){ - - } - } -} diff --git a/group23/729693763/Third_Homework3/download/FileDownloader.java b/group23/729693763/Third_Homework3/download/FileDownloader.java deleted file mode 100644 index 098f9408f0..0000000000 --- a/group23/729693763/Third_Homework3/download/FileDownloader.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.zhous.download; - -import com.zhous.download.api.Connection; -import com.zhous.download.api.ConnectionException; -import com.zhous.download.api.ConnectionManager; -import com.zhous.download.api.DownloadListener; - -import java.io.File; -import java.util.Set; - - -public class FileDownloader { - - String url="https://image.baidu.com/search/down?tn=download&word=download&ie=utf8&fr=detail&url=https%3A%2F%2Ftimgsa.baidu.com%2Ftimg%3Fimage%26quality%3D80%26size%3Db9999_10000%26sec%3D1490203615530%26di%3D2b1827956a01011d3634f3e04b01b15c%26imgtype%3D0%26src%3Dhttp%253A%252F%252Fimg15.3lian.com%252F2015%252Fh1%252F338%252Fd%252F157.jpg&thumburl=https%3A%2F%2Fss1.bdstatic.com%2F70cFvXSh_Q1YnxGkpoWK1HF6hhy%2Fit%2Fu%3D2613489365%2C2336631324%26fm%3D23%26gp%3D0.jpg"; - private static int threadNum = 5; - private static int threadCount = 0; - int avgBytes = 0; - - DownloadListener listener; - ConnectionManager cm; - File file = null; - - public FileDownloader(String _url,String fileName) { - this.url = _url; - this.file = new File(fileName); - } - - public void execute(){ - // 在这里实现你的代码, 注意: 需要用多线程实现下载 - // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 - // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 - // 具体的实现思路: - // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 - // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 - // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 - // 3. 把byte数组写入到文件中 - // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 - - // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 - Connection conn = null; - try { - - conn = cm.open(this.url); - int length = conn.getContentLength(); - avgBytes = length / threadNum; - //使用5个线程去下载; - for (int i = 0; i < threadNum; i++) { - int startPos = i*avgBytes; - int endPos = startPos + avgBytes - 1; - if(i == threadNum -1) { - endPos = length; - } - - Connection c = cm.open(this.url); - DownloadThread thread = new DownloadThread(c,startPos,endPos,file,this.getListener()); - thread.setName("Thread"+(i+1) ); - thread.start(); - } - - } catch (ConnectionException e) { - e.printStackTrace(); - }finally{ - if(conn != null){ - conn.close(); - } - } - - - - - } - - - - public void setListener (DownloadListener listener){ - this.listener = listener; - } - - public synchronized static boolean isDownloadFinish(){ - threadCount++; - return threadCount == threadNum; - } - - - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - -} diff --git a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java deleted file mode 100644 index ca8817ba88..0000000000 --- a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.zhous.download; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import com.zhous.download.api.ConnectionManager; -import com.zhous.download.api.DownloadListener; -import com.zhous.download.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url="http://www.mydeskcity.com//upload/pc/112/960x600/1351650816239.jpg"; - String github = "https://github.com/em14Vito/coding2017/archive/master.zip"; - -// FileDownloader downloader = new FileDownloader(url,"Data23.jpg"); - FileDownloader downloader = new FileDownloader(github,"github.zip"); - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} diff --git a/group23/729693763/Third_Homework3/download/api/Connection.java b/group23/729693763/Third_Homework3/download/api/Connection.java deleted file mode 100644 index 170791e8ba..0000000000 --- a/group23/729693763/Third_Homework3/download/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.zhous.download.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos, int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionException.java b/group23/729693763/Third_Homework3/download/api/ConnectionException.java deleted file mode 100644 index 925368135d..0000000000 --- a/group23/729693763/Third_Homework3/download/api/ConnectionException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.zhous.download.api; - -public class ConnectionException extends Exception { - -} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java deleted file mode 100644 index b331ee7f1f..0000000000 --- a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.zhous.download.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group23/729693763/Third_Homework3/download/api/DownloadListener.java b/group23/729693763/Third_Homework3/download/api/DownloadListener.java deleted file mode 100644 index 07b1a950ce..0000000000 --- a/group23/729693763/Third_Homework3/download/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.zhous.download.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java deleted file mode 100644 index 6a4b98fe06..0000000000 --- a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.zhous.download.impl; - -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -import com.zhous.download.api.*; - -public class ConnectionImpl implements Connection{ - - - InputStream is = null; - URL url = null; - HttpURLConnection http = null; - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - - //构造方法: - public ConnectionImpl() { - } - - //打开url并且创建连接 - public ConnectionImpl(String url) { - try { - this.url = new URL(url); - http = (HttpURLConnection) this.url.openConnection(); - //设置超时 - http.setConnectTimeout(5000); - http.setReadTimeout(5000); - - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public byte[] read(int startPos, int endPos) throws IOException { - - //指定http中读取一定长度的byte - http.setRequestProperty("Range","bytes= "+Integer.toString(startPos)+"-"+Integer.toString(endPos)); - http.connect(); - - //读取输入流到其中 - is = http.getInputStream(); - byte[] buffer = new byte[1024]; - int len = 0; - while( (len = is.read(buffer) ) != -1) { - - bos.write(buffer, 0, len); - } - - //关闭所有流,每次read的时候自动关闭。 - close(); - return bos.toByteArray(); - } - - @Override - public int getContentLength() { - return http.getContentLength(); - } - - @Override - public void close() { - try { - bos.close(); - if(is != null) { - is.close(); - } - http.disconnect(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println(e.getMessage()); - } - } - -} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java deleted file mode 100644 index 28af08a0cd..0000000000 --- a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.zhous.download.impl; - -import com.zhous.download.api.*; - -import java.net.MalformedURLException; -import java.net.URL; - -public class ConnectionManagerImpl implements ConnectionManager { - - - - @Override - public Connection open(String url) throws ConnectionException { - Connection ct = null; - URL u = null; - try { - u = new URL(url); - ct = new ConnectionImpl(url); - } catch (MalformedURLException e) { - e.printStackTrace(); - } finally { - //URL类不需要关闭 - } - return ct; - } - -} diff --git a/group23/729693763/homework1_demo/ArrayList.java b/group23/729693763/homework1_demo/ArrayList.java deleted file mode 100644 index 1f185736f9..0000000000 --- a/group23/729693763/homework1_demo/ArrayList.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class ArrayList implements List { - - private int size = 0; - - private Object[] elementData = new Object[100]; - - public void add(Object o){ - - } - public void add(int index, Object o){ - - } - - public Object get(int index){ - return null; - } - - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public Iterator iterator(){ - return null; - } - -} diff --git a/group23/729693763/homework1_demo/BinaryTreeNode.java b/group23/729693763/homework1_demo/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/group23/729693763/homework1_demo/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/group23/729693763/homework1_demo/Iterator.java b/group23/729693763/homework1_demo/Iterator.java deleted file mode 100644 index 06ef6311b2..0000000000 --- a/group23/729693763/homework1_demo/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.coding.basic; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - -} diff --git a/group23/729693763/homework1_demo/LinkedList.java b/group23/729693763/homework1_demo/LinkedList.java deleted file mode 100644 index 4fdb03db8a..0000000000 --- a/group23/729693763/homework1_demo/LinkedList.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.coding.basic; - - - -public class LinkedList implements List { - - private Node head; - - public void add(Object o){ - - } - public void add(int index , Object o){ - - } - public Object get(int index){ - return null; - } - public Object remove(int index){ - return null; - } - - public int size(){ - return -1; - } - - public void addFirst(Object o){ - - } - public void addLast(Object o){ - - } - public Object removeFirst(){ - return null; - } - public Object removeLast(){ - return null; - } - public Iterator iterator(){ - return null; - } - - - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - - } - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public static int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在list中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } -} diff --git a/group23/729693763/homework1_demo/List.java b/group23/729693763/homework1_demo/List.java deleted file mode 100644 index 10d13b5832..0000000000 --- a/group23/729693763/homework1_demo/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.coding.basic; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/729693763/homework1_demo/Queue.java b/group23/729693763/homework1_demo/Queue.java deleted file mode 100644 index 36e516e266..0000000000 --- a/group23/729693763/homework1_demo/Queue.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.coding.basic; - -public class Queue { - - public void enQueue(Object o){ - } - - public Object deQueue(){ - return null; - } - - public boolean isEmpty(){ - return false; - } - - public int size(){ - return -1; - } -} diff --git a/group23/729693763/homework1_demo/Stack.java b/group23/729693763/homework1_demo/Stack.java deleted file mode 100644 index a5a04de76d..0000000000 --- a/group23/729693763/homework1_demo/Stack.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.coding.basic; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - } - - public Object pop(){ - return null; - } - - public Object peek(){ - return null; - } - public boolean isEmpty(){ - return false; - } - public int size(){ - return -1; - } -} diff --git a/group23/729693763/readme.md b/group23/729693763/readme.md deleted file mode 100644 index 89b8633e07..0000000000 --- a/group23/729693763/readme.md +++ /dev/null @@ -1,12 +0,0 @@ -Data Struct contain: ArrayList, LinkedList, BinaryTreeNode, Stack, Queue, Iterator -<<<<<<< HEAD ---- --- -Add Blog link: -http://www.cnblogs.com/CodeSaveMe/p/6523745.html -======= ---- --- -Add Blog link: http://www.cnblogs.com/CodeSaveMe/p/6523745.html - -Add week2 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6571621.html - -Add week3 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6624431.html diff --git a/group23/769232552/coding/src/main/java/code01/ArrayList.java b/group23/769232552/coding/src/main/java/code01/ArrayList.java deleted file mode 100644 index 6746de2a50..0000000000 --- a/group23/769232552/coding/src/main/java/code01/ArrayList.java +++ /dev/null @@ -1,138 +0,0 @@ -package code01; - -/** - * Created by yaoyuan on 2017/3/6. - */ -public class ArrayList implements List { - - private int max_size = 0;//总长度 - private int current_size = 0; //当前长度 - private float extendPercent = 2; //扩展系数 - - private Object[] elementData; - - /** - * 默认构造函数,初始化数组长度为100 - */ - public ArrayList(){ - this.elementData = new Object[100]; - this.max_size = 100; - } - /** - * 构造函数 - * @param size,初始化数组长度 - */ - public ArrayList(int size){ - this.elementData = new Object[size]; - this.max_size = size; - } - - /** - * 顺序添加元素,超出原始界限时,数组自动扩展 - */ - public void add(Object o) { - //如果越界了,需要复制原有的数组到扩充后的数组中 - if(this.current_size + 1 > this.max_size) { - this.max_size = (int) Math.floor(this.max_size * this.extendPercent); - this.elementData = copyToNew(this.elementData,this.max_size); - } - this.elementData[this.current_size] = o; - this.current_size ++; - - } - - /** - * 指定位置添加元素 - * 一种是在中间,一种是当前插入的位置尾部(如果超过尾部则默认添加到尾部) - */ - public void add(int index, Object o){ - assert(index>=0); - //如果越界了,需要复制原有的数组到扩充后的数组中 - if(this.current_size + 1 > this.max_size) { - //如果越界了,需要复制原有的数组到扩充后的数组中 - this.max_size = (int) Math.floor(this.max_size * this.extendPercent); - this.elementData = copyToNew(this.elementData,this.max_size); - } - //数组中间插入 - if(index < this.current_size){ - //需要把当前位置的元素往后移动 - for (int i = this.current_size - 1; i >= index; i--) { - this.elementData[i+1] = this.elementData[i]; - } - this.elementData[index] = o; - }else { - //后面加入 - this.elementData[this.current_size] = o; - } - this.current_size ++; - } - - public Object get(int index){ - if(index >= 0 && index <= this.current_size-1){ - return this.elementData[index]; - }else { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - /** - * 删除指定位置的元素 - * @param index - * @return - */ - public Object remove(int index){ - Object result = null; - if(index >= 0 && index <= current_size-1){ - result = elementData[index]; - //删除操作 - if(index == current_size - 1){ - elementData[index] = null; - }else { - //需要把当前位置后面的元素往前移动 - for (int i = index; i < this.current_size-1 ; i++) { - this.elementData[i] = this.elementData[i+1]; - } - this.elementData[this.current_size-1] = null; - } - this.current_size --; - }else { - throw new ArrayIndexOutOfBoundsException(index); - } - return result; - } - - public int size(){ - return this.current_size; - } - - public Iterator iterator(){ - return new Iterator() { - int next_pos = 0; - int pos = -1; - public boolean hasNext() { - if(max_size <= 0){ - return false; - } - return next_pos < ArrayList.this.size(); - } - - public Object next() { - Object next = ArrayList.this.get(next_pos); - pos = next_pos ++; - return next; - } - public void remove(){ - ArrayList.this.remove(pos); - } - }; - } - - private Object[] copyToNew(Object[] oldArray, int extendSize){ - Object[] newArray = new Object[extendSize]; - for (int i = 0; i < size(); i++) { - newArray[i] = oldArray[i]; - } - return newArray; - } - -} \ No newline at end of file diff --git a/group23/769232552/coding/src/main/java/code01/BinaryTree.java b/group23/769232552/coding/src/main/java/code01/BinaryTree.java deleted file mode 100644 index b29fb960cb..0000000000 --- a/group23/769232552/coding/src/main/java/code01/BinaryTree.java +++ /dev/null @@ -1,97 +0,0 @@ -package code01; - -/** - * Created by yaoyuan on 2017/3/10. - */ -public class BinaryTree>{ - - private BinaryTreeNode root = null; - private int size = 0; - - public BinaryTreeNode createBinaryTree(T[] array){ - for(T data : array){ - this.insert(data); - } - return this.root; - } - - // recursive way, - // t is the node that roots the subtree. - public BinaryTreeNode insert(T data, BinaryTreeNode t){ - if(t == null){ - return new BinaryTreeNode(data); - } - int comparator = ((T) t.data).compareTo(data); - if(comparator > 0){ - t.left = insert(data,t.right); - }else if(comparator < 0){ - t.right = insert(data,t.left); - }else { - // do nothing - } - return t; - - } - - - //loop way - public void insert(T data){ - if(this.root == null){ - BinaryTreeNode node = new BinaryTreeNode(data); - this.root = node; - this.size ++; - return; - } - BinaryTreeNode cursor = this.root; - while (cursor != null){ - if(data.compareTo((T) cursor.data) <= 0){ - if(cursor.left == null) { - cursor.left = new BinaryTreeNode(data); - return; - } - cursor = cursor.left; - } - if(data.compareTo((T) cursor.data) > 0){ - if(cursor.right == null) { - cursor.right = new BinaryTreeNode(data); - return; - } - cursor = cursor.right; - } - } - this.size ++; - } - - public void leftOrderScan(BinaryTreeNode cursor){ - if(cursor == null){ - return; - } - leftOrderScan(cursor.left); - System.out.println(cursor.data.toString() + " "); - leftOrderScan(cursor.right); - } - - public BinaryTreeNode getRoot(){ - return this.root; - } - - class BinaryTreeNode { - - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(T data, BinaryTreeNode left, BinaryTreeNode right) { - this.left = right; - this.right = left; - this.data = data; - } - - public BinaryTreeNode(T data) { - this.left = null; - this.right = null; - this.data = data; - } - - } -} diff --git a/group23/769232552/coding/src/main/java/code01/Iterator.java b/group23/769232552/coding/src/main/java/code01/Iterator.java deleted file mode 100644 index b4074067bb..0000000000 --- a/group23/769232552/coding/src/main/java/code01/Iterator.java +++ /dev/null @@ -1,7 +0,0 @@ -package code01; - -public interface Iterator { - public boolean hasNext(); - public Object next(); - public void remove(); -} diff --git a/group23/769232552/coding/src/main/java/code01/LinkedList.java b/group23/769232552/coding/src/main/java/code01/LinkedList.java deleted file mode 100644 index f7bbc970a9..0000000000 --- a/group23/769232552/coding/src/main/java/code01/LinkedList.java +++ /dev/null @@ -1,327 +0,0 @@ -package code01; - - -public class LinkedList implements List { - - private Node head; - private Node tail; //指向链表最后一个元素的引用 - - private int size; //总长度 - - public LinkedList() { - this.head = null; - this.tail = null; - this.size = 0; - } - - /** - * 新增顺序添加一个元素 - * @param o - */ - public void add(Object o){ - Node node = new Node(); - node.data = o; - node.next = null; - //空链表 - if(head == null){ - this.head = node; - this.tail = node; - }else { //非空链表,要先找到链表尾部,再加入新解答 - this.tail.next = node; - this.tail = node; - } - this.size ++; - } - - /** - * 指定索引处添加node - */ - public void add(int index, Object o) { - assert(index >= 0); - Node node = new Node(); - node.data = o; - node.next = null; - - if(index == 0){ - //添加在头部 - node.next = head; - head = node; - }else if(index >= this.size){ - //添加在尾部 - this.tail.next = node; - }else { - //添加在中间 - Node cursor = this.head; - for (int i = 0; i < index - 1; i++) { - cursor = cursor.next; - } - node.next = cursor.next; - cursor.next = node; - } - this.size ++; - } - - public Object get(int index){ - assert(index < this.size); - Node cursor = this.head; - for (int i = 0; i < index; i++) { - cursor = cursor.next; - } - return cursor.data; - } - - public Object remove(int index){ - assert(index >= 0 && index < this.size); - Object result = null; - //删除的是链表尾部的元素 - if(index == this.size - 1){ - Node cursor = this.head; - for (int i = 0; i < index - 1; i++) { - cursor = cursor.next; - } - result = cursor.next.data; - tail = cursor; - cursor.next = null; - }else if(index == 0){ - //删除的是头部元素 - result = head.data; - head = head.next; - }else { - //删除的是链表中间的元素 - Node cursor = this.head; - for (int i = 0; i < index - 1; i++) { - cursor = cursor.next; - } - result = cursor.next.data; - cursor.next = cursor.next.next; - } - this.size --; - return result; - } - - public int size(){ - return this.size; - } - - public void addFirst(Object o){ - Node node = new Node(); - node.data = o; - node.next = null; - if(this.head == null){ - this.head = node; - this.tail = node; - }else { - node.next = head; - this.head = node; - } - this.size ++; - } - public void addLast(Object o){ - Node node = new Node(); - node.data = o; - node.next = null; - if(this.head == null){ - this.head = node; - this.tail = node; - }else { - this.tail.next = node; - this.tail = node; - } - this.size ++; - } - - public Object removeFirst(){ - Object first = null; - if(this.head != null){ - first = this.head.data; - head = head.next; - this.size --; - } - return first; - } - - public Object removeLast(){ - Object last = null; - if(this.tail != null){ - if(this.head != this.tail){ - Node cursor; - for (cursor = head;cursor.next!=tail;cursor=cursor.next); - last = this.tail.data; - this.tail = cursor; - this.tail.next = null; - }else { - last = this.tail.data; - this.head = null; - this.tail = null; - } - this.size --; - } - return last; - } - public Iterator iterator(){ - return null; - } - - /** - * 节点类 - */ - private static class Node{ - Object data; - Node next; - - } - - /** - * 把该链表逆置 - * 例如链表为 3->7->10 , 逆置后变为 10->7->3 - */ - public void reverse(){ - if(this.head == null || this.head == this.tail){ - return; - } - - Node pre_cursor = null; - Node cursor = this.head; - Node after_cursor = cursor.next; - - while(cursor != null){ - cursor.next = pre_cursor; - pre_cursor = cursor; - cursor = after_cursor; - if(after_cursor != null){ - after_cursor = after_cursor.next; - } - } - - Node tmpNode = this.head; - this.head = this.tail; - this.tail = tmpNode; - } - - /** - * 删除一个单链表的前半部分 - * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 - * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 - - */ - public void removeFirstHalf(){ - if(this.head == null || this.head.next == null){ - return; - } - if(this.head.next.next == null){ - this.head = this.head.next; - } - - Node stepOne = this.head; - Node stepTwo = this.head; - - while (stepTwo.next != null){ - stepOne = stepOne.next; - stepTwo = stepTwo.next.next; - } - this.head = stepOne; - } - - /** - * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 - * @param i - * @param length - */ - public void remove(int i, int length){ - Node current = head; - Node firstHalf = null; - for (int k = 0; k < i; k ++){ - if(current == null){ - return; - } - firstHalf = current; //记录待删除节点的前一个节点 - current = current.next; - } - - //移动length长度 - for (int j = 0; j < length; j++) { - if(current == null){ - return; - } - current = current.next; - } - - if(i == 0){ - head = current; - }else { - firstHalf.next = current; - } - } - /** - * 假定当前链表和list均包含已升序排列的整数 - * 从当前链表中取出那些list所指定的元素 - * 例如当前链表 = 11->101->201->301->401->501->601->701 - * listB = 1->3->4->6 - * 返回的结果应该是[101,301,401,601] - * @param list - */ - public static int[] getElements(LinkedList list){ - return null; - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 从当前链表中中删除在list中出现的元素 - - * @param list - */ - - public void subtract(LinkedList list){ - - } - - /** - * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) - */ - public void removeDuplicateValues(){ - if(this.head == null){ - return; - } - Node current = this.head; - Node current_next = this.head; - while (current_next != null){ - current_next = current_next.next; //如果放到下个while循环后面写,就需要判断一次current_next是不是null了 - while(current_next != null && current_next.data.equals(current.data)){ - //删除重复节点 - current.next = current_next.next; - current_next = current_next.next; - } - current = current_next; - } - } - - /** - * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 - * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) - * @param min - * @param max - */ - public void removeRange(int min, int max){ - //怎么才能高效呢 - } - - /** - * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) - * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 - * @param list - */ - public LinkedList intersection( LinkedList list){ - return null; - } - - /** - * 遍历列表 - */ - public void printList(){ - System.out.println(); - for (Node cursor = this.head;cursor!=null;cursor=cursor.next){ - System.out.print(cursor.data+" "); - } - } -} diff --git a/group23/769232552/coding/src/main/java/code01/List.java b/group23/769232552/coding/src/main/java/code01/List.java deleted file mode 100644 index 95bc37d172..0000000000 --- a/group23/769232552/coding/src/main/java/code01/List.java +++ /dev/null @@ -1,9 +0,0 @@ -package code01; - -public interface List { - public void add(Object o); - public void add(int index, Object o); - public Object get(int index); - public Object remove(int index); - public int size(); -} diff --git a/group23/769232552/coding/src/main/java/code01/Queue.java b/group23/769232552/coding/src/main/java/code01/Queue.java deleted file mode 100644 index d9956deb9a..0000000000 --- a/group23/769232552/coding/src/main/java/code01/Queue.java +++ /dev/null @@ -1,24 +0,0 @@ -package code01; - -public class Queue { - - private LinkedList linkedList = new LinkedList(); - - public void enQueue(Object o){ - linkedList.addFirst(o); - } - - public Object deQueue(){ - Object result = linkedList.removeLast(); - return result; - } - - public boolean isEmpty(){ - return linkedList.size() == 0; - } - - public int size(){ - return linkedList.size(); - } - -} diff --git a/group23/769232552/coding/src/main/java/code01/Stack.java b/group23/769232552/coding/src/main/java/code01/Stack.java deleted file mode 100644 index dbaeb91a48..0000000000 --- a/group23/769232552/coding/src/main/java/code01/Stack.java +++ /dev/null @@ -1,31 +0,0 @@ -package code01; - -public class Stack { - private ArrayList elementData = new ArrayList(); - - public void push(Object o){ - elementData.add(o); - } - - public Object pop(){ - Object result = null; - if(elementData.size()!=0) { - result = elementData.remove(elementData.size() - 1); - } - return result; - } - - public Object peek(){ - Object result = null; - if(elementData.size()!=0) { - result = elementData.get(elementData.size() - 1); - } - return result; - } - public boolean isEmpty(){ - return elementData.size() == 0; - } - public int size(){ - return elementData.size(); - } -} diff --git a/group23/769232552/coding/src/main/java/code02/ArrayUtil.java b/group23/769232552/coding/src/main/java/code02/ArrayUtil.java deleted file mode 100644 index 23055ef138..0000000000 --- a/group23/769232552/coding/src/main/java/code02/ArrayUtil.java +++ /dev/null @@ -1,257 +0,0 @@ -package code02; -import org.apache.commons.lang.ArrayUtils; -import java.util.ArrayList; -import java.util.List; - -public class ArrayUtil { - - /** - * 给定一个整形数组a , 对该数组的值进行置换 - 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] - 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] - * @param origin - * @return - */ - public void reverseArray(int[] origin){ - if (origin == null || origin.length <= 1){ - return; - } - - int head = 0; - int tail = origin.length - 1; - int tmp; - while (head != tail){ - //调换位置 - tmp = origin[head]; - origin[head] = origin[tail]; - origin[tail] = tmp; - - head ++; - tail --; - } - - } - - /** - * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} - * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: - * {1,3,4,5,6,6,5,4,7,6,7,5} - * @param oldArray - * @return - */ - public int[] removeZero(int[] oldArray){ - if (oldArray == null || oldArray.length < 1){ - return null; - } - - List newList = new ArrayList(); - for(int number : oldArray){ - if(number != 0){ - newList.add(number); - } - } - - Integer[] result = new Integer[newList.size()]; - result = (Integer[]) newList.toArray(result); - return ArrayUtils.toPrimitive(result); - - - } - - /** - * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 - * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 - * @param array1 - * @param array2 - * @return - */ - - public int[] merge(int[] array1, int[] array2){ - if(array1 == null && array2 == null){ - return null; - } - if(array1 == null){ - return array2; - } - if(array2 == null){ - return array1; - } - int[] newArray = new int[array1.length + array2.length]; - int m = 0,n = 0, k = 0; - while (m < array1.length && n < array2.length){ - if(array1[m] <= array2[n]){ - newArray[k++] = array1[m++]; - }else { - newArray[k++] = array2[n++]; - } - } - if(m >= array1.length){ - while (n < array2.length){ - newArray[k++] = array2[n++]; - } - } - if(n >= array2.length){ - while (m < array1.length){ - newArray[k++] = array1[m++]; - } - } - return newArray; - } - /** - * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size - * 注意,老数组的元素在新数组中需要保持 - * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 - * [2,3,6,0,0,0] - * @param oldArray - * @param size - * @return - */ - public int[] grow(int [] oldArray, int size){ - int[] newArray = new int[oldArray.length + size]; - int i = 0; - for (; i < oldArray.length; i++) { - newArray[i] = oldArray[i]; - } - for (int j = 0; j < size; j++){ - newArray[i++] = 0; - } - return newArray; - } - - /** - * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 - * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] - * max = 1, 则返回空数组 [] - * @param max - * @return - */ - //也就是需要生成一个小于max值的fibonacci数组 - public int[] fibonacci(int max){ - if(max < 2){ - return new int[]{}; - } - if(max < 3){ - return new int[]{1,1}; - } - List list = new ArrayList(); - list.add(0,1); - list.add(1,1); - int i=0; - while (list.get(i) + list.get(i+1) < max){ - list.add(i+2,list.get(i) + list.get(i+1)); - i++; - } - - int[] newArray = new int[list.size()]; - for (int j = 0; j < list.size(); j++) { - newArray[j] = list.get(j).intValue(); - } - return newArray; - } - - /** - * 返回小于给定最大值max的所有素数数组 - * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] - * @param max - * @return - * - * 原理: - * 1,判断一个数字是否为素数,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n) - * 2,当i是素数的时候,i的所有的倍数必然是合数。 - */ - public int[] getPrimes(int max){ - - if(max <= 2){ - return null; - } - boolean[] prime = new boolean[max + 1]; - for (int i = 2; i <= max; i++) { - if(i%2 == 0){ - prime[i] = false; //偶数 - }else { - prime[i] = true; - } - } - - for (int i = 2; i <= Math.sqrt(max) ; i++) { - if(prime[i]){//奇数 - //如果i是素数,那么把i的倍数标记为非素数 - for(int j = i+i; j <= max; j += i){ - prime[j] = false; - } - } - } - - List num = new ArrayList(); - for (int i = 2; i <= max; i++) { - if(prime[i]){ - num.add(i); - } - } - - Integer[] result = new Integer[num.size()]; - result = (Integer[]) num.toArray(result); - return ArrayUtils.toPrimitive(result); - } - - /** - * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 - * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 - * @param max - * @return - */ - public int[] getPerfectNumbers(int max){ - - if(max < 6){ - return null; - } - - List perfectNumlist = new ArrayList(); - - for (int j = 6;j <= max; j++){ - List factorNumlist = new ArrayList(); - factorNumlist.add(1); - for (int i = 2; i < j; i++) { - if(j % i == 0){ - factorNumlist.add(i); - } - } - int sum = 0; - for(Integer num : factorNumlist){ - sum += num; - } - - if(sum == j){ - perfectNumlist.add(j); - } - } - Integer[] result = new Integer[perfectNumlist.size()]; - result = (Integer[]) perfectNumlist.toArray(result); - return ArrayUtils.toPrimitive(result); - } - - /** - * 用seperator 把数组 array给连接起来 - * 例如array= [3,8,9], seperator = "-" - * 则返回值为"3-8-9" - * @param array - * @param seperator - * @return - */ - public String join(int[] array, String seperator){ - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < array.length - 1; i++) { - sb.append(array[i]); - sb.append(seperator); - } - sb.append(array[array.length - 1]); - return sb.toString(); - } - - public void printArr(int[] array){ - for(int num : array){ - System.out.print(num + " "); - } - } - -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java b/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java deleted file mode 100644 index b5e077e7a5..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package code02.litestruts; - -import java.util.HashMap; -import java.util.Map; - -/** - * Created by yaoyuan on 2017/3/22. - */ -public class ActionConfig { - String name; - String clzName; - Map viewResult = new HashMap(); - - - public ActionConfig(String actionName, String clzName) { - this.name = actionName; - this.clzName = clzName; - } - public String getClassName(){ - return clzName; - } - public void addViewResult(String name, String viewName){ - viewResult.put(name, viewName); - } - public String getViewName(String resultName){ - return viewResult.get(resultName); - } -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java b/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java deleted file mode 100644 index 85d3d98a1f..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java +++ /dev/null @@ -1,64 +0,0 @@ -package code02.litestruts; - -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - -import java.io.File; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -/** - * Created by yaoyuan on 2017/3/21. - */ -public class Configuration { - - - private String path; - private final Map actionMap = new HashMap(); - - Configuration(String path){ - parseXML(path); - } - - //解析xml文件 - private void parseXML(String path){ - //读取文件 - File file = new File(path); - SAXReader reader = new SAXReader(); - Document document = null; - try { - document = reader.read(file); - } catch (DocumentException e) { - e.printStackTrace(); - } - Element root = document.getRootElement(); - - for (Iterator iterator = root.elementIterator("action"); iterator.hasNext();) { - Element e = iterator.next(); - String actionName = e.attributeValue("name"); - String clazName = e.attributeValue("class"); - ActionConfig actionConfig = new ActionConfig(actionName,clazName); - for(Iterator childIterator = e.elementIterator();childIterator.hasNext();){ - Element child = childIterator.next(); - String jspKey = child.attributeValue("name"); - String jspValue = child.getTextTrim(); - actionConfig.addViewResult(jspKey,jspValue); - } - actionMap.put(actionName,actionConfig); - } - } - - public String getView(String actionName, String result){ - String jspKey = actionName + "." + result; - return actionMap.get(actionName).getViewName(result); - } - - - public Map getActionMap() { - return actionMap; - } - -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java b/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java deleted file mode 100644 index 0799eae71a..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package code02.litestruts; - -/** - * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 - * @author liuxin - * - */ -public class LoginAction{ - private String name ; - private String password; - private String message; - - public String getName() { - return name; - } - - public String getPassword() { - return password; - } - - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; - } - - public void setName(String name){ - this.name = name; - } - public void setPassword(String password){ - this.password = password; - } - public String getMessage(){ - return this.message; - } -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java b/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java deleted file mode 100644 index 2a499f104b..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java +++ /dev/null @@ -1,119 +0,0 @@ -package code02.litestruts; - -import org.slf4j.LoggerFactory; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by yaoyuan on 2017/3/21. - */ -public class ReflectionUtil { - private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ReflectionUtil.class); - - private static final Map> clazzMap = new HashMap>(); - - //加载xml文件中的类 - public void initiateClazz(Configuration cfg){ - Map actionMap = cfg.getActionMap(); - - for (Map.Entry entry : actionMap.entrySet()) { - String actionName = entry.getKey(); //login - ActionConfig actionConfig =entry.getValue(); - String className = actionConfig.getClassName(); //code02.litestruts.LoginAction - Class cls; - try { - cls = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); - clazzMap.put(actionName,cls); - } catch (Exception e) { - logger.warn("加载类 " + className + "出错!"); - } - } - } - - - //返回实例对象 - public Object getInstance(String actionName){ - Object instance = null; - for (Map.Entry> entry : clazzMap.entrySet()) { - String action = entry.getKey(); //login - Class cls = entry.getValue(); //code02.litestruts.LoginAction.class - if(actionName.equals(action)){ - try { - instance = cls.newInstance(); - } catch (Exception e) { - logger.error("生成实例出错!", e); - throw new RuntimeException(e); - } - } - } - return instance; - } - - - //参数赋值 - public void setParameters(Object o, Map params) { - - List methods = getSetterMethods(o.getClass()); - for (String name : params.keySet()) { - String methodName = "set" + name; - for (Method m : methods) { - if (m.getName().equalsIgnoreCase(methodName)) { - try { - m.invoke(o, params.get(name)); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - } - } - - //运行无参方法 - public Object runMethodWithoutParams(Object o , String methodName){ - Class clz = o.getClass(); - Object result = null; - try { - Method method = clz.getDeclaredMethod(methodName); - try { - result = method.invoke(o); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - return result; - } - - //返回以set开头的方法 - public List getSetterMethods(Object o){ - return getMethods(o.getClass(),"set"); - } - - //返回以get开头的方法 - public List getGetterMethods(Object o){ - return getMethods(o.getClass(),"get"); - } - - private List getMethods(Class clz, String startWithName){ - List methodsList = new ArrayList(); - Method[] methods = clz.getDeclaredMethods(); - for (int i = 0; i < methods.length; i++) { - String methodName = methods[i].getName(); - if(methodName.startsWith(startWithName)){ - methodsList.add(methods[i]); - } - } - return methodsList; - } - -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java b/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java deleted file mode 100644 index b954f25bd5..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java +++ /dev/null @@ -1,76 +0,0 @@ -package code02.litestruts; - -import org.slf4j.LoggerFactory; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -public class Struts { - private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Struts.class); - /* - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - - - - */ - public static View runAction(String actionName, Map parameters) { - View view = new View(); - Configuration cfg = new Configuration("src/main/resources/struts.xml"); - ReflectionUtil reflectionUtil = new ReflectionUtil(); - reflectionUtil.initiateClazz(cfg); - /* 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象)*/ - Object o = reflectionUtil.getInstance(actionName); - /*2. 根据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") ,那就应该调用 setName和setPassword方法*/ - reflectionUtil.setParameters(o,parameters); - /*3. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success"*/ - String result = (String) reflectionUtil.runMethodWithoutParams(o,"execute"); - /* 4. 通过反射找到对象的所有getter方法(例如 getMessage),通过反射来调用, - 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,放到View对象的parameters*/ - Map params = new HashMap(); - List methods = reflectionUtil.getGetterMethods(o); - for(Method method : methods){ - String key = method.getName().substring(3); - String value = null; - try { - value = (String) method.invoke(o); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } - params.put(key,value); - } - /*5. 根据struts.xml中的 配置,以及execute的返回值,确定哪一个jsp,放到View对象的jsp字段中。*/ - String jsp = cfg.getView(actionName,result); - view.setParameters(params); - view.setJsp(jsp); - - return view; - } - - public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { - - String actionName = "login"; - HashMap params = new HashMap(); - params.put("name","test"); - params.put("password","12345"); - - View view = Struts.runAction(actionName,params); - System.out.println(view.getJsp()); - System.out.println(view.getParameters()); - - - } - -} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/View.java b/group23/769232552/coding/src/main/java/code02/litestruts/View.java deleted file mode 100644 index c7e630587c..0000000000 --- a/group23/769232552/coding/src/main/java/code02/litestruts/View.java +++ /dev/null @@ -1,23 +0,0 @@ -package code02.litestruts; - -import java.util.Map; - -public class View { - private String jsp; - private Map parameters; - - public String getJsp() { - return jsp; - } - public View setJsp(String jsp) { - this.jsp = jsp; - return this; - } - public Map getParameters() { - return parameters; - } - public View setParameters(Map parameters) { - this.parameters = parameters; - return this; - } -} diff --git a/group23/769232552/coding/src/main/java/code03/DownloadThread.java b/group23/769232552/coding/src/main/java/code03/DownloadThread.java deleted file mode 100644 index 7bf8a8e765..0000000000 --- a/group23/769232552/coding/src/main/java/code03/DownloadThread.java +++ /dev/null @@ -1,47 +0,0 @@ -package code03; - -import code03.api.Connection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.*; - -/** - * 定义线程类 - */ - - -public class DownloadThread extends Thread{ - - private static final Logger logger = LoggerFactory.getLogger(DownloadThread.class); - - private Connection conn; - private int startPos; - private int endPos; - private static final String fileName = "D://test.png"; - - - public DownloadThread(Connection conn, int startPos, int endPos){ - this.conn = conn; - this.startPos = startPos; - this.endPos = endPos; - } - - @Override - public void run(){ - logger.debug("thread {} begin to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos); - - try { - byte[] data = conn.read(startPos,endPos); - RandomAccessFile rfile = new RandomAccessFile(fileName,"rw"); - rfile.seek(startPos); - rfile.write(data,0,data.length); - rfile.close(); - } catch (IOException e) { - e.printStackTrace(); - } - logger.debug("thread {} end to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos); - - - } -} diff --git a/group23/769232552/coding/src/main/java/code03/FileDownloader.java b/group23/769232552/coding/src/main/java/code03/FileDownloader.java deleted file mode 100644 index 6814c49f9c..0000000000 --- a/group23/769232552/coding/src/main/java/code03/FileDownloader.java +++ /dev/null @@ -1,109 +0,0 @@ -package code03; - -import code03.api.Connection; -import code03.api.ConnectionException; -import code03.api.ConnectionManager; -import code03.api.DownloadListener; -import code03.impl.ConnectionManagerImpl; - -import java.util.ArrayList; -import java.util.List; - -/** - * 线程启动类 - */ - -public class FileDownloader { - - private String url; - private DownloadListener listener; - private ConnectionManager cm; - private static boolean downloadFinished = false; - - private final static int THREAD_NUM = 5; - - public FileDownloader(String _url) { - this.url = _url; - } - - /* - (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) - (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 - 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。*/ - public void execute(){ - Connection conn = null; - try { - //启动线程 - int startPos = 0, endPos = 0; - List threads = new ArrayList(); - for (int i = 0; i < THREAD_NUM; i++) { - conn = cm.open(this.url); //每次都要重新获取一个connection.imputstream - int length = conn.getContentLength(); - startPos = length/THREAD_NUM * i; - endPos = length/THREAD_NUM * (i + 1)- 1; - DownloadThread downloadThread = new DownloadThread(conn,startPos,endPos); - threads.add(downloadThread); - downloadThread.start(); - } - - //调用join方法,确保所有线程的工作已经完成 - for (int i = 0; i < THREAD_NUM; i++) { - try { - threads.get(i).join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - listener.notifyFinished(); - } catch (ConnectionException e) { - e.printStackTrace(); - } finally { - if(conn != null){ - conn.close(); - } - } - } - - public void setListener(DownloadListener listener) { - this.listener = listener; - } - - public void setConnectionManager(ConnectionManager ucm){ - this.cm = ucm; - } - - public DownloadListener getListener(){ - return this.listener; - } - - - public static void main(String[] args) { - - String url = "http://litten.me/assets/blogImg/litten.png"; - FileDownloader fileDownloader = new FileDownloader(url); - ConnectionManager cm = new ConnectionManagerImpl(); - fileDownloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - }); - fileDownloader.setConnectionManager(cm); - fileDownloader.execute(); - - - while (!downloadFinished){ - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("download finished ! "); - - - } - -} diff --git a/group23/769232552/coding/src/main/java/code03/api/Connection.java b/group23/769232552/coding/src/main/java/code03/api/Connection.java deleted file mode 100644 index 1f2e4e1d39..0000000000 --- a/group23/769232552/coding/src/main/java/code03/api/Connection.java +++ /dev/null @@ -1,23 +0,0 @@ -package code03.api; - -import java.io.IOException; - -public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - public byte[] read(int startPos,int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - public int getContentLength(); - - /** - * 关闭连接 - */ - public void close(); -} diff --git a/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java b/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java deleted file mode 100644 index 77e886e987..0000000000 --- a/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java +++ /dev/null @@ -1,9 +0,0 @@ -package code03.api; - -public class ConnectionException extends Exception { - - public ConnectionException(String message,Throwable e){ - super(message,e); - } - -} diff --git a/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java b/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java deleted file mode 100644 index 4cbd46445a..0000000000 --- a/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package code03.api; - -public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - public Connection open(String url) throws ConnectionException; -} diff --git a/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java b/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java deleted file mode 100644 index f5e7e146a7..0000000000 --- a/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package code03.api; - -public interface DownloadListener { - public void notifyFinished(); -} diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java deleted file mode 100644 index ce69eceb99..0000000000 --- a/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java +++ /dev/null @@ -1,106 +0,0 @@ -package code03.impl; - -import code03.api.Connection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLConnection; - - -public class ConnectionImpl implements Connection{ - - private static final Logger logger = LoggerFactory.getLogger(ConnectionImpl.class); - - - private URLConnection urlConnection; - private int length = -1; - - public ConnectionImpl(URLConnection urlConnection){ - this.urlConnection = urlConnection; - } - - /** - * 读取urlConnection.getInputStream()中的数据,返回byte[] - */ - @Override - public byte[] read(int startPos, int endPos) throws IOException { - int contentLength = getContentLength(); - if(startPos < 0 || endPos > contentLength || contentLength <= 0){ - logger.info("index out of range !"); - return null; - } - - InputStream raw = null; - BufferedInputStream in = null; - int size = endPos - startPos + 1; - byte[] data = new byte[size]; - try{ - raw = urlConnection.getInputStream(); - in = new BufferedInputStream(raw); - in.skip(startPos); - - int offset = 0; - while(offset < size){ - int bytesRead = in.read(data, offset, size - offset); - while (bytesRead == -1){break;} - offset += bytesRead; - } - } catch (IOException e) { - e.printStackTrace(); - }finally { - raw.close(); - in.close(); - } - return data; - } - - @Override - public int getContentLength() { - if(length != -1){ - return length; - } - length = urlConnection.getContentLength(); - - //if without content-length header - if(length == -1) { - int offset = 0; - InputStream raws = null; - BufferedInputStream ins = null; - try { - raws = urlConnection.getInputStream(); - ins = new BufferedInputStream(raws); - - int max_size = 1024 * 1024;//1M - byte[] data = new byte[max_size]; - - int bytesRead = 0; - while (bytesRead != -1) { - ins.read(data, offset, max_size - offset); - offset += bytesRead; - } - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - raws.close(); - ins.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - length = offset; - } - return length; - } - - @Override - public void close() { - if(urlConnection != null){ - urlConnection = null; - } - } - -} diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java deleted file mode 100644 index 5078c7608c..0000000000 --- a/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package code03.impl; - -import code03.api.Connection; -import code03.api.ConnectionException; -import code03.api.ConnectionManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; - -/** - * 获取Connection实例 - */ - -public class ConnectionManagerImpl implements ConnectionManager { - private static final Logger logger = LoggerFactory.getLogger(ConnectionManagerImpl.class); - - @Override - public Connection open(String url) throws ConnectionException { - Connection connection = null; - try { - URL _url = new URL(url); - URLConnection urlConnection = _url.openConnection(); - connection = new ConnectionImpl(urlConnection); - } catch (MalformedURLException e) { - logger.error("url {} format error",url); - } catch (IOException e) { - e.printStackTrace(); - } - return connection; - } - -} diff --git a/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java b/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java deleted file mode 100644 index 0ffce58b83..0000000000 --- a/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java +++ /dev/null @@ -1,162 +0,0 @@ -package code04; - -/** - * 用双向链表实现LRU算法 - */ -public class LRUPageFrame { - - private class Node { - - Node prev; - Node next; - int pageNum; - Node() { - } - } - - private int size; - private int capacity; - - private Node first;// 链表头 - private Node last;// 链表尾 - - public LRUPageFrame(int capacity) { - this.capacity = capacity; - this.size = 0; - } - - /** - * 获取缓存中对象 - * 1、如果缓存中不存在,则直接加入表头 - * 2、如果缓存中存在,则把该对象移动到表头 - * @param pageNum - * @return - */ - public void access(int pageNum) { - Node node = hasContains(pageNum); - if(node != null){ - moveToHead(node); - }else { - addToHead(pageNum); - } - - } - - /** - * 对象是否存在缓存中,如存在则返回该对象在链表中的位置,否则返回null - * @return - */ - private Node hasContains(int key){ - Node node = this.first; - while (node != null){ - if(node.pageNum == key){ - return node; - } - node = node.next; - } - return node; - } - - /** - * 对象加入表头,先先判断缓存是否已经满了 - * @return - */ - private void addToHead(int key){ - Node node = new Node(); - node.pageNum = key; - if(size < capacity){ - addFirst(node); - }else { - removeLast(); - addFirst(node); - } - - } - - - /** - * 对象移动到表头 - * @return - */ - private void moveToHead(Node node){ - if(node == first){ - return; - } - if(node == last){ - node.next = first; - first.prev = node; - first = node; - last = node.prev; - last.next = null; - node.prev = null; - return; - } - node.prev.next = node.next; - node.next.prev = node.prev; - node.next = first; - node.prev = null; - first.prev = node; - first = node; - } - - /** - * 删除表尾 - * @return - */ - private void removeLast(){ - if(last != null){ - Node newLast = last.prev; - last.prev = null; - last = newLast; - last.next = null; - size --; - } - } - /** - * 添加元素到表头 - * @return - */ - private void addFirst(Node node){ - //0个节点 - if(first == null){ - first = node; - last = node; - size ++; - return; - } - //一个节点 - else if(first == last){ - first = node; - first.next = last; - last.prev = first; - size ++; - return; - }else { - node.next = first; - first.prev = node; - first = node; - size ++; - } - } - /** - * 当前链表空间 - * @return - */ - public int getSize() { - return size; - } - - 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/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java b/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java deleted file mode 100644 index 81e6973856..0000000000 --- a/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java +++ /dev/null @@ -1,108 +0,0 @@ -package mini_jvm.loader; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; - - - -public class ClassFileLoader { - - private List clzPaths = new ArrayList(); - - /** - * 读取class文件的二进制代码 - * @param className - * @return - */ - public byte[] readBinaryCode(String className) { - String clazzPath = getClassPath(className); - BufferedInputStream bins = null; - ByteArrayOutputStream bouts = new ByteArrayOutputStream(); - try { - bins = new BufferedInputStream(new FileInputStream(new File(clazzPath))); - byte[] buffer = new byte[1024]; - int length = -1; - while((length = bins.read(buffer)) != -1){ - bouts.write(buffer, 0, length); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } - byte[] codes = bouts.toByteArray(); - //关闭流 - try { - if(bins != null){ - //调用外层流的close方法就关闭其装饰的内层流 - bins.close(); - } - if(bouts != null){ - bouts.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - return codes; - } - - /** - * 从扫描根目录,获取指定类的绝对路径 - * @param className - * @return - */ - private String getClassPath(String className){ - String clazzPath = null; - //遍历clzPaths中所有路径 - for (String path : this.clzPaths){ - File file = new File(path); - clazzPath = getClassPath(className,file); - if(clazzPath!=null) break; - } - return clazzPath; - } - - private String getClassPath(String className, File file){ - String clazzPath = null; - if(file.exists()){ - //如果是目录,则遍历所有目录下的文件 - if(file.isDirectory()){ - File[] fs = file.listFiles(); - for (File f : fs){ - clazzPath = getClassPath(className,f); - } - }else { - //检查是否是该类对应的class文件 - if(isClazzFile(file.getName(),className)){ - clazzPath = file.getAbsolutePath(); - } - } - } - return clazzPath; - } - - private boolean isClazzFile(String filename , String className){ - String fileClazzName = null; - String [] names = filename.split("\\."); - if(names.length > 0){ - fileClazzName = names[0]; - } - return className.endsWith(fileClazzName); - } - - public void addClassPath(String path) { - clzPaths.add(path); - } - - public String getClassPath(){ - StringBuilder sb = new StringBuilder(); - int i = 0; - for (; i < clzPaths.size() - 1; i++) { - sb.append(clzPaths.get(i)); - sb.append(";"); - } - sb.append(clzPaths.get(i)); - return sb.toString(); - } -} diff --git a/group23/769232552/coding/src/test/java/code01/ArrayListTest.java b/group23/769232552/coding/src/test/java/code01/ArrayListTest.java deleted file mode 100644 index 2bfd7f52e1..0000000000 --- a/group23/769232552/coding/src/test/java/code01/ArrayListTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package code01; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -/** - * Created by yaoyuan on 2017/3/8. - */ -public class ArrayListTest { - ArrayList arrayList; - @Before - public void setUp(){ - arrayList = new ArrayList(); - } - - @Test - public void testAdd() throws Exception { - - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - arrayList.add(str); - } - - // size() - Assert.assertEquals(array.length,arrayList.size()); - - //add(),get() - for (int i = 0; i < arrayList.size(); i++){ - Assert.assertEquals(array[i],arrayList.get(i)); - } - } - - @Test - public void testAddWithIndex() throws Exception { - ArrayList arrayList2 = new ArrayList(3);//自动扩容 - String[] array = new String[]{"a","b","c","d","e"}; - for (int i = 0; i < array.length; i++){ - arrayList2.add(i,array[i]); - } - //add(),get() - for (int i = 0; i < arrayList2.size(); i++){ - Assert.assertEquals(array[i],arrayList2.get(i)); - } - arrayList2.add(3,"new"); - Assert.assertEquals("new",arrayList2.get(3)); - - - } - - @Test - public void testRemove() throws Exception { - - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - arrayList.add(str); - } - arrayList.remove(0); - arrayList.remove(0); - - - for (int i = 0; i < arrayList.size(); i++) { - Assert.assertEquals(array[i+2],arrayList.get(i)); - } - - } -} \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java b/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java deleted file mode 100644 index 8c1f4e8e09..0000000000 --- a/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package code01; - -import org.junit.Test; - -/** - * Created by yaoyuan on 2017/3/10. - */ -public class BinaryTreeTest { - - @Test - public void testCreateBinaryTree(){ - - BinaryTree binaryTree1 = new BinaryTree(); - BinaryTree binaryTree2 = new BinaryTree(); - Integer[] array1 = new Integer[]{3,4,1,2,5}; - Integer[] array2 = new Integer[]{3,1,4,5,2}; - binaryTree1.createBinaryTree(array1); - binaryTree2.createBinaryTree(array2); - binaryTree1.leftOrderScan(binaryTree1.getRoot()); - binaryTree2.leftOrderScan(binaryTree2.getRoot()); - } - - @Test - public void testInsert(){ - BinaryTree binaryTree3 = new BinaryTree(); - } -} \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/LinkedListTest.java b/group23/769232552/coding/src/test/java/code01/LinkedListTest.java deleted file mode 100644 index 5481783932..0000000000 --- a/group23/769232552/coding/src/test/java/code01/LinkedListTest.java +++ /dev/null @@ -1,174 +0,0 @@ -package code01; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by yaoyuan on 2017/3/8. - */ -public class LinkedListTest { - - @Test - public void testAdd() throws Exception { - - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - - // size() - Assert.assertEquals(array.length,linklist.size()); - - //add(),get() - for (int i = 0; i < linklist.size(); i++){ - Assert.assertEquals(array[i],linklist.get(i)); - } - - } - - @Test - public void testAddWithIndex() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - - //add(),get() - for (int i = 0; i < linklist.size(); i++){ - Assert.assertEquals(array[i],linklist.get(i)); - } - - String str = "new"; - linklist.add(0,str); - Assert.assertEquals(str,linklist.get(0)); - - linklist.add(3,str); - Assert.assertEquals(str,linklist.get(3)); - - linklist.add(linklist.size() ,str); - Assert.assertEquals(str,linklist.get(linklist.size()-1)); - } - - @Test - public void testRemove() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - - //remove(),get() - Assert.assertEquals(linklist.remove(0),array[0]); - Assert.assertEquals(linklist.size(),array.length - 1); - - Assert.assertEquals(linklist.remove(linklist.size() - 1),array[array.length-1]); - Assert.assertEquals(linklist.size(),array.length - 2); - - } - - @Test - public void testAddFirst() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - //addFirst(),get() - String str = "new"; - linklist.addFirst(str); - Assert.assertEquals(str,linklist.get(0)); - Assert.assertEquals(linklist.size(),array.length + 1); - } - - @Test - public void testAddLast() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - //addLast(),get() - String str = "new"; - linklist.addLast(str); - Assert.assertEquals(str,linklist.get(linklist.size()-1)); - Assert.assertEquals(linklist.size(),array.length + 1); - } - - @Test - public void testRemoveFirst() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - //removeFirst(),get() - Assert.assertEquals(linklist.removeFirst(),array[0]); - Assert.assertEquals(linklist.size(),array.length - 1); - } - - @Test - public void testRemoveLast() throws Exception { - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - //removeLast(),get() - Assert.assertEquals(linklist.removeLast(),array[array.length-1]); - Assert.assertEquals(linklist.size(),array.length - 1); - - } - - @Test - public void testReverse(){ - LinkedList linklist = new LinkedList(); - String[] array = new String[]{"a","b","c","d","e"}; - for (String str : array){ - linklist.add(str); - } - linklist.reverse(); - for(int i=0; i params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); - - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); - Assert.assertEquals("login successful", view.getParameters().get("Message")); - } - - @Test - public void testLoginActionFailed() { - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 - - View view = Struts.runAction(actionName,params); - - Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); - Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("Message")); - } -} diff --git a/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java b/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java deleted file mode 100644 index cdc58d24b3..0000000000 --- a/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package code03; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import code03.api.ConnectionManager; -import code03.api.DownloadListener; -import code03.impl.ConnectionManagerImpl; - -public class FileDownloaderTest { - boolean downloadFinished = false; - @Before - public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testDownload() { - - String url = "http://litten.me/assets/blogImg/litten.png"; - - FileDownloader downloader = new FileDownloader(url); - - - ConnectionManager cm = new ConnectionManagerImpl(); - downloader.setConnectionManager(cm); - - downloader.setListener(new DownloadListener() { - @Override - public void notifyFinished() { - downloadFinished = true; - } - - }); - - - downloader.execute(); - - // 等待多线程下载程序执行完毕 - while (!downloadFinished) { - try { - System.out.println("还没有下载完成,休眠五秒"); - //休眠5秒 - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - System.out.println("下载完成!"); - - - - } - -} diff --git a/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java b/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java deleted file mode 100644 index 7448e3ee56..0000000000 --- a/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package code04; - -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); - //1,0,7 - Assert.assertEquals("1,0,7", frame.toString()); - frame.access(2); - //2,1,0 - Assert.assertEquals("2,1,0", frame.toString()); - frame.access(0); - //0,2,1 - Assert.assertEquals("0,2,1", frame.toString()); - frame.access(0); - //0,2,1 - Assert.assertEquals("0,2,1", frame.toString()); - frame.access(3); - //3,0,2 - Assert.assertEquals("3,0,2", frame.toString()); - frame.access(0); - //0,3,2 - Assert.assertEquals("0,3,2", frame.toString()); - frame.access(4); - //4,0,3 - Assert.assertEquals("4,0,3", frame.toString()); - } - -} diff --git a/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java b/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java deleted file mode 100644 index 9602743b02..0000000000 --- a/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package mini_jvm; - -import mini_jvm.loader.ClassFileLoader; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -public class ClassFileloaderTest { - - - static String path1 = "D:\\worksapce\\gitRepo\\java_coding2017\\coding2017\\group23\\769232552\\coding\\target\\classes"; - static String path2 = "D:\\worksapce\\gitRepo\\java_coding2017\\coding2017\\group23\\769232552\\coding\\target\\test-classes"; - - - ClassFileLoader loader = new ClassFileLoader(); - - @Before - public void setUp() throws Exception { - loader.addClassPath(path1); - loader.addClassPath(path2); - } - - @After - public void tearDown() throws Exception { - } - - @Test - public void testClassPath(){ - String clzPath = loader.getClassPath(); - Assert.assertEquals(path1+";"+path2,clzPath); - } - - @Test - public void testClassFileLength() { - String className = "mini_jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - Assert.assertEquals(1026, byteCodes.length); - - } - - - @Test - public void testMagicNumber(){ - String className = "mini_jvm.test.EmployeeV1"; - byte[] byteCodes = loader.readBinaryCode(className); - byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; - String acctualValue = this.byteToHexString(codes); - Assert.assertEquals("cafebabe", acctualValue); - } - - - - - - - private String byteToHexString(byte[] codes ){ - StringBuffer buffer = new StringBuffer(); - for(int i=0;i=arr.length) - { - arr=Arrays.copyOf(arr, arr.length+1); - arr[pos] = o; - pos++; - return true; - } - return false; - } - public boolean add(Object o, int index) - { - if(pos=arr.length) - { - arr=Arrays.copyOf(arr, arr.length+1); - for(int i=arr.length-2;i>=index;i--) - { - arr[i+1] = arr[i]; - } - arr[index] = o; - return true; - } - return false; - } - public Object get(int i) - { - Object o = arr[i]; - return o; - } - public Object remove(int index) - { - Object var=arr[index]; - for(int i=index+1;i Date: Mon, 8 May 2017 00:21:58 +0800 Subject: [PATCH 479/552] 6666666 --- group23/1028361767/1028361767.md | 1 + .../coderising/download/DownloadThread.java | 31 ++ .../coderising/download/FileDownloader.java | 104 ++++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 26 + .../download/api/ConnectionException.java | 8 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 62 +++ .../download/impl/ConnectionManagerImpl.java | 26 + .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 181 +++++++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coding/basic/BinaryTreeNode.java | 97 ++++ .../src/com/coding/basic/Iterator.java | 8 + .../src/com/coding/basic/List.java | 13 + .../src/com/coding/basic/Queue.java | 24 + .../src/com/coding/basic/array/ArrayList.java | 83 ++++ .../src/com/coding/basic/array/ArrayUtil.java | 210 +++++++++ .../coding/basic/linklist/LRUPageFrame.java | 112 +++++ .../basic/linklist/LRUPageFrameTest.java | 57 +++ .../com/coding/basic/linklist/LinkedList.java | 402 ++++++++++++++++ .../com/coding/basic/queue/CircleQueue.java | 57 +++ .../basic/queue/EmptyQueueException.java | 14 + .../basic/queue/FullQueueException.java | 14 + .../src/com/coding/basic/queue/Josephus.java | 32 ++ .../com/coding/basic/queue/JosephusTest.java | 28 ++ .../src/com/coding/basic/queue/Queue.java | 61 +++ .../basic/queue/QueueWithTwoStacks.java | 54 +++ .../com/coding/basic/stack/QuickMinStack.java | 45 ++ .../src/com/coding/basic/stack/Stack.java | 47 ++ .../src/com/coding/basic/stack/StackUtil.java | 111 +++++ .../basic/stack/StackWithTwoQueues.java | 34 ++ .../basic/stack/TwoStackInOneArray.java | 108 +++++ .../coding/basic/stack/expr/InfixExpr.java | 159 +++++++ .../basic/stack/expr/InfixExprTest.java | 48 ++ .../basic/stack/expr/InfixToPostfix.java | 44 ++ .../coding/basic/stack/expr/PostfixExpr.java | 62 +++ .../basic/stack/expr/PostfixExprTest.java | 42 ++ .../coding/basic/stack/expr/PrefixExpr.java | 85 ++++ .../basic/stack/expr/PrefixExprTest.java | 45 ++ .../com/coding/basic/stack/expr/Token.java | 50 ++ .../coding/basic/stack/expr/TokenParser.java | 64 +++ .../basic/stack/expr/TokenParserTest.java | 41 ++ .../src/com/coding/me/Palindrome.java | 82 ++++ .../me/book/algorithms/BasicBinarySearch.java | 12 + .../me/leetcode/algorithms/AddTwoNums.java | 84 ++++ .../algorithms/LongestCommonPrefix.java | 223 +++++++++ ...stSubstringWithoutRepeatingCharacters.java | 229 +++++++++ .../algorithms/MedianOfTwoSortedArrays.java | 102 ++++ .../leetcode/algorithms/OptimalDivision.java | 76 +++ .../algorithms/StudentAttendanceRecord1.java | 46 ++ .../coding/me/leetcode/algorithms/TwoSum.java | 102 ++++ .../test/com/coding/basic/TestArrayList.java | 61 +++ .../com/coding/basic/TestBinaryTreeNode.java | 37 ++ .../test/com/coding/basic/TestLinkedList.java | 176 +++++++ .../com/coding/basic/stack/TestStackUtil.java | 63 +++ .../src/me/practise/chapter2.java | 44 ++ .../src/practise/chapter1/HelloService.java | 35 ++ .../practise/chapter1/HelloWorldService.java | 9 + .../learn-spring/src/test/practise/Test1.java | 39 ++ .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 89 ++++ .../coderising/jvm/attr/LineNumberTable.java | 51 ++ .../jvm/attr/LocalVariableItem.java | 39 ++ .../jvm/attr/LocalVariableTable.java | 40 ++ .../coderising/jvm/attr/StackMapTable.java | 30 ++ .../com/coderising/jvm/clz/AccessFlag.java | 25 + .../src/com/coderising/jvm/clz/ClassFile.java | 121 +++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 + .../coderising/jvm/cmd/ByteCodeCommand.java | 128 +++++ .../com/coderising/jvm/cmd/CommandParser.java | 138 ++++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 + .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 +++ .../coderising/jvm/constant/ClassInfo.java | 28 ++ .../coderising/jvm/constant/ConstantInfo.java | 41 ++ .../coderising/jvm/constant/ConstantPool.java | 29 ++ .../coderising/jvm/constant/FieldRefInfo.java | 58 +++ .../jvm/constant/MethodRefInfo.java | 60 +++ .../jvm/constant/NameAndTypeInfo.java | 50 ++ .../jvm/constant/NullConstantInfo.java | 17 + .../coderising/jvm/constant/StringInfo.java | 31 ++ .../com/coderising/jvm/constant/UTF8Info.java | 36 ++ .../src/com/coderising/jvm/field/Field.java | 45 ++ .../jvm/loader/ByteCodeIterator.java | 69 +++ .../jvm/loader/ClassFileLoader.java | 99 ++++ .../jvm/loader/ClassFileParser.java | 134 ++++++ .../src/com/coderising/jvm/method/Method.java | 84 ++++ .../jvm/print/ClassFilePrinter.java | 54 +++ .../jvm/print/ConstantPoolPrinter.java | 77 +++ .../jvm/test/ClassFileloaderTest.java | 353 ++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++ .../src/com/coderising/jvm/util/Util.java | 24 + .../src/com/skomefen/list/ArrayList.java | 83 ++++ .../com/skomefen/list/ArrayListIterator.java | 25 + .../src/com/skomefen/list/BinaryTreeNode.java | 32 ++ .../src/com/skomefen/list/Iterator.java | 7 + .../src/com/skomefen/list/LinkedList.java | 252 ++++++++++ .../com/skomefen/list/LinkedListiterator.java | 25 + .../day3-11/src/com/skomefen/list/List.java | 9 + .../day3-11/src/com/skomefen/list/Queue.java | 26 + .../day3-11/src/com/skomefen/list/Stack.java | 28 ++ .../day3-11/src/com/skomefen/test/test.java | 109 +++++ .../src/com/coderising/array/ArrayUtil.java | 117 +++++ .../com/coderising/litestruts/StrutsTest.java | 54 +++ .../coderising/download/DownloadThread.java | 65 +++ .../coderising/download/FileDownloader.java | 89 ++++ .../download/FileDownloaderTest.java | 58 +++ .../coderising/download/api/Connection.java | 24 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 143 ++++++ .../download/impl/ConnectionManagerImpl.java | 16 + .../src/junit/test/ConnectionImplTest.java | 92 ++++ .../junit/test/ConnectionManagerImplTest.java | 31 ++ .../src/junit/test/DownloadThreadTest.java | 77 +++ .../src/com/coding/datastructs/ArrayList.java | 98 ++++ .../src/com/coding/datastructs/Iterator.java | 7 + .../com/coding/datastructs/LinkedList.java | 229 +++++++++ .../src/com/coding/datastructs/List.java | 9 + .../com/coding/datastructs/MyIterator.java | 35 ++ .../src/com/coding/datastructs/Queue.java | 30 ++ .../src/com/coding/datastructs/Stack.java | 33 ++ .../src/com/coding/test/ArrayListTest.java | 32 ++ .../src/com/coding/test/LinkedListTest.java | 28 ++ .../src/com/coding/test/QueueTest.java | 22 + .../src/com/coding/test/StackTest.java | 25 + .../com/coding/datastructs/ArrayUtil.java" | 141 ++++++ .../src/com/coding/test/ArrayUtilTest.java" | 86 ++++ .../coderising/litestruts/LoginAction.java" | 35 ++ .../com/coderising/litestruts/Struts.java" | 122 +++++ .../coderising/litestruts/StrutsTest.java" | 43 ++ .../src/com/coderising/litestruts/Test.java" | 94 ++++ .../src/com/coderising/litestruts/View.java" | 23 + .../01_5BasicDS/src/main/ArrayList.java | 82 ++++ .../01_5BasicDS/src/main/BinaryTreeNode.java | 65 +++ .../01_5BasicDS/src/main/Iterator.java | 6 + .../01_5BasicDS/src/main/LinkedList.java | 114 +++++ .../01_5BasicDS/src/main/List.java | 9 + .../01_5BasicDS/src/main/Queue.java | 22 + .../01_5BasicDS/src/main/Stack.java | 25 + .../01_5BasicDS/src/test/ArrayListTest.java | 144 ++++++ .../src/test/BinaryTreeNodeTest.java | 25 + .../01_5BasicDS/src/test/LinkedListTest.java | 126 +++++ .../01_5BasicDS/src/test/QueueTest.java | 50 ++ .../01_5BasicDS/src/test/StackTest.java | 67 +++ .../01_5BasicDS/src/utils/ListUtils.java | 11 + .../02_ArrayUtil/src/main/ArrayUtil.java | 209 ++++++++ .../02_ArrayUtil/src/test/ArrayUtilTest.java | 101 ++++ .../src/main/Iterator.java | 6 + .../src/main/LinkedList.java | 256 ++++++++++ .../src/main/List.java | 9 + .../src/test/LinkedListTest.java | 251 ++++++++++ .../src/utils/ListUtils.java | 11 + .../04_LRU/src/main/LRUPageFrame.java | 117 +++++ .../04_LRU/src/test/LRUPageFrameTest.java | 35 ++ .../05_StackUtil/src/main/ArrayList.java | 75 +++ .../05_StackUtil/src/main/Iterator.java | 6 + .../05_StackUtil/src/main/ListUtils.java | 11 + .../05_StackUtil/src/main/Stack.java | 25 + .../05_StackUtil/src/main/StackUtil.java | 110 +++++ .../05_StackUtil/src/test/StackUtilTest.java | 93 ++++ .../01_litestruts/src/main/LoginAction.java | 36 ++ .../01_litestruts/src/main/Struts.java | 71 +++ .../01_litestruts/src/main/View.java | 27 ++ .../01_litestruts/src/test/StrutsTest.java | 55 +++ .../02_downloader/src/api/Connection.java | 23 + .../src/api/ConnectionException.java | 6 + .../src/api/ConnectionManager.java | 10 + .../src/api/DownloadListener.java | 5 + .../src/impl/ConnectionImpl.java | 54 +++ .../src/impl/ConnectionManagerImpl.java | 15 + .../src/main/DownloadThread.java | 50 ++ .../src/main/FileDownloader.java | 73 +++ .../src/test/DownloaderTest.java | 21 + .../src/com/xiaol/study/ArrayList.java | 94 ++++ .../src/com/xiaol/study/ArrayListTest.java | 82 ++++ .../src/com/xiaol/study/BinaryTreeNode.java | 59 +++ .../com/xiaol/study/BinaryTreeNodeTest.java | 82 ++++ .../src/com/xiaol/study/Iterator.java | 12 + .../src/com/xiaol/study/LinkedList.java | 253 ++++++++++ .../src/com/xiaol/study/LinkedListTest.java | 131 +++++ .../src/com/xiaol/study/List.java | 13 + .../src/com/xiaol/study/Queue.java | 41 ++ .../src/com/xiaol/study/QueueTest.java | 64 +++ .../src/com/xiaol/study/Stack.java | 49 ++ .../src/com/xiaol/study/StackTest.java | 68 +++ .../381519422/array/src/array/ArrayUtil.java | 354 ++++++++++++++ .../array/src/array/ArrayUtilTest.java | 116 +++++ .../java/com/xiaol/download/DownloadDemo.java | 53 +++ .../com/xiaol/download/DownloadThread.java | 37 ++ .../com/xiaol/download/FileDownloader.java | 133 ++++++ .../xiaol/download/FileDownloaderTest.java | 60 +++ .../com/xiaol/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../xiaol/download/api/ConnectionManager.java | 10 + .../xiaol/download/api/DownloadListener.java | 5 + .../xiaol/download/impl/ConnectionImpl.java | 60 +++ .../download/impl/ConnectionManagerImpl.java | 15 + .../java/com/xiaol/study/LoginAction.java | 36 ++ .../src/main/java/com/xiaol/study/Struts.java | 176 +++++++ .../main/java/com/xiaol/study/StrutsTest.java | 43 ++ .../src/main/java/com/xiaol/study/View.java | 26 + .../jvm/loader/ClassFileLoader.java | 81 ++++ .../jvm/test/ClassFileloaderTest.java | 92 ++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++ .../563253496/week4_lru/src/LRUPageFrame.java | 135 ++++++ .../week4_lru/src/LRUPageFrameTest.java | 34 ++ .../com/coderising/jvm/clz/AccessFlag.java | 25 + .../src/com/coderising/jvm/clz/ClassFile.java | 75 +++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../coderising/jvm/constant/ClassInfo.java | 24 + .../coderising/jvm/constant/ConstantInfo.java | 29 ++ .../coderising/jvm/constant/ConstantPool.java | 29 ++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++ .../jvm/constant/MethodRefInfo.java | 55 +++ .../jvm/constant/NameAndTypeInfo.java | 45 ++ .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 + .../com/coderising/jvm/constant/UTF8Info.java | 32 ++ .../jvm/loader/ByteCodeIterator.java | 54 +++ .../jvm/loader/ClassFileLoader.java | 140 ++++++ .../jvm/loader/ClassFileParser.java | 112 +++++ .../jvm/test/ClassFileloaderTest.java | 202 ++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 31 ++ .../src/com/coderising/jvm/util/Util.java | 24 + .../week5_stack/src/stack/Stack.java | 63 +++ .../week5_stack/src/stack/StackUtil.java | 129 +++++ .../week5_stack/src/test/StackUtilTest.java | 95 ++++ .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 142 ++++++ .../coderising/jvm/attr/LineNumberTable.java | 83 ++++ .../jvm/attr/LocalVariableItem.java | 39 ++ .../jvm/attr/LocalVariableTable.java | 58 +++ .../coderising/jvm/attr/StackMapTable.java | 30 ++ .../com/coderising/jvm/clz/AccessFlag.java | 25 + .../src/com/coderising/jvm/clz/ClassFile.java | 113 +++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 + .../coderising/jvm/cmd/ByteCodeCommand.java | 128 +++++ .../com/coderising/jvm/cmd/CommandParser.java | 130 +++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 + .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 +++ .../coderising/jvm/constant/ClassInfo.java | 24 + .../coderising/jvm/constant/ConstantInfo.java | 29 ++ .../coderising/jvm/constant/ConstantPool.java | 29 ++ .../coderising/jvm/constant/FieldRefInfo.java | 54 +++ .../jvm/constant/MethodRefInfo.java | 55 +++ .../jvm/constant/NameAndTypeInfo.java | 45 ++ .../jvm/constant/NullConstantInfo.java | 13 + .../coderising/jvm/constant/StringInfo.java | 26 + .../com/coderising/jvm/constant/UTF8Info.java | 32 ++ .../src/com/coderising/jvm/field/Field.java | 44 ++ .../jvm/loader/ByteCodeIterator.java | 65 +++ .../jvm/loader/ClassFileLoader.java | 140 ++++++ .../jvm/loader/ClassFileParser.java | 170 +++++++ .../src/com/coderising/jvm/method/Method.java | 66 +++ .../jvm/test/ClassFileloaderTest.java | 354 ++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++ .../src/com/coderising/jvm/util/Util.java | 24 + .../coderising/download/DownloadThread.java | 20 + .../coderising/download/FileDownloader.java | 73 +++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 ++ .../download/impl/ConnectionManagerImpl.java | 15 + .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 34 ++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/Queue.java | 19 + .../src/com/coding/basic/array/ArrayList.java | 35 ++ .../src/com/coding/basic/array/ArrayUtil.java | 96 ++++ .../coding/basic/linklist/LRUPageFrame.java | 164 +++++++ .../basic/linklist/LRUPageFrameTest.java | 34 ++ .../com/coding/basic/linklist/LinkedList.java | 125 +++++ .../src/com/coding/basic/stack/Stack.java | 64 +++ .../src/com/coding/basic/stack/StackUtil.java | 136 ++++++ .../com/coding/basic/stack/StackUtilTest.java | 78 +++ .../coding/basic/stack/expr/InfixExpr.java | 112 +++++ .../basic/stack/expr/InfixExprTest.java | 48 ++ .../coderising/jvm/attr/AttributeInfo.java | 19 + .../src/com/coderising/jvm/attr/CodeAttr.java | 72 +++ .../coderising/jvm/attr/LineNumberTable.java | 55 +++ .../jvm/attr/LocalVariableItem.java | 39 ++ .../jvm/attr/LocalVariableTable.java | 42 ++ .../coderising/jvm/attr/StackMapTable.java | 30 ++ .../com/coderising/jvm/clz/AccessFlag.java | 25 + .../src/com/coderising/jvm/clz/ClassFile.java | 102 ++++ .../com/coderising/jvm/clz/ClassIndex.java | 19 + .../src/com/coderising/jvm/cmd/BiPushCmd.java | 23 + .../coderising/jvm/cmd/ByteCodeCommand.java | 128 +++++ .../com/coderising/jvm/cmd/CommandParser.java | 85 ++++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 22 + .../coderising/jvm/cmd/GetStaticFieldCmd.java | 23 + .../coderising/jvm/cmd/InvokeSpecialCmd.java | 23 + .../coderising/jvm/cmd/InvokeVirtualCmd.java | 22 + .../src/com/coderising/jvm/cmd/LdcCmd.java | 29 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 19 + .../com/coderising/jvm/cmd/NoOperandCmd.java | 23 + .../com/coderising/jvm/cmd/OneOperandCmd.java | 27 ++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 19 + .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 +++ .../coderising/jvm/constant/ClassInfo.java | 28 ++ .../coderising/jvm/constant/ConstantInfo.java | 40 ++ .../coderising/jvm/constant/ConstantPool.java | 31 ++ .../coderising/jvm/constant/FieldRefInfo.java | 58 +++ .../jvm/constant/MethodRefInfo.java | 60 +++ .../jvm/constant/NameAndTypeInfo.java | 51 ++ .../jvm/constant/NullConstantInfo.java | 17 + .../coderising/jvm/constant/StringInfo.java | 32 ++ .../com/coderising/jvm/constant/UTF8Info.java | 37 ++ .../src/com/coderising/jvm/field/Field.java | 50 ++ .../jvm/loader/ByteCodeIterator.java | 57 +++ .../jvm/loader/ClassFileLoader.java | 140 ++++++ .../jvm/loader/ClassFileParser.java | 62 +++ .../src/com/coderising/jvm/method/Method.java | 80 ++++ .../jvm/print/ClassFilePrinter.java | 54 +++ .../jvm/print/ConstantPoolPrinter.java | 25 + .../jvm/test/ClassFileloaderTest.java | 354 ++++++++++++++ .../com/coderising/jvm/test/EmployeeV1.java | 28 ++ .../src/com/coderising/jvm/util/Util.java | 24 + .../coderising/download/DownloadThread.java | 20 + .../coderising/download/FileDownloader.java | 73 +++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 ++ .../download/impl/ConnectionManagerImpl.java | 15 + .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 34 ++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/List.java | 9 + .../src/com/coding/basic/array/ArrayList.java | 35 ++ .../src/com/coding/basic/array/ArrayUtil.java | 96 ++++ .../coding/basic/linklist/LRUPageFrame.java | 57 +++ .../basic/linklist/LRUPageFrameTest.java | 34 ++ .../com/coding/basic/linklist/LinkedList.java | 125 +++++ .../com/coding/basic/queue/CircleQueue.java | 5 + .../src/com/coding/basic/queue/Josephus.java | 19 + .../com/coding/basic/queue/JosephusTest.java | 27 ++ .../src/com/coding/basic/queue/Queue.java | 61 +++ .../basic/queue/QueueWithTwoStacks.java | 40 ++ .../src/com/coding/basic/stack/Stack.java | 64 +++ .../src/com/coding/basic/stack/StackUtil.java | 136 ++++++ .../com/coding/basic/stack/StackUtilTest.java | 65 +++ .../coding/basic/stack/expr/InfixExpr.java | 15 + .../basic/stack/expr/InfixExprTest.java | 52 ++ .../basic/stack/expr/InfixToPostfix.java | 110 +++++ .../coding/basic/stack/expr/PostfixExpr.java | 95 ++++ .../basic/stack/expr/PostfixExprTest.java | 41 ++ .../coding/basic/stack/expr/PrefixExpr.java | 98 ++++ .../basic/stack/expr/PrefixExprTest.java | 45 ++ .../com/coding/basic/stack/expr/Token.java | 50 ++ .../coding/basic/stack/expr/TokenParser.java | 57 +++ .../basic/stack/expr/TokenParserTest.java | 41 ++ .../week8_datastructure/src/CircleQueue.java | 53 +++ .../week8_datastructure/src/Josephus.java | 47 ++ .../week8_datastructure/src/JosephusTest.java | 28 ++ .../week8_datastructure/src/Queue.java | 62 +++ .../src/QueueWithTwoStacks.java | 60 +++ .../src/QuickMinStack.java | 40 ++ .../src/StackWithTwoQueues.java | 53 +++ .../src/TwoStackInOneArray.java | 100 ++++ .../src/com/coderising/array/ArrayUtil.java | 96 ++++ .../coderising/download/DownloadThread.java | 20 + .../coderising/download/FileDownloader.java | 73 +++ .../download/FileDownloaderTest.java | 59 +++ .../coderising/download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 27 ++ .../download/impl/ConnectionManagerImpl.java | 15 + .../coderising/litestruts/LoginAction.java | 39 ++ .../src/com/coderising/litestruts/Struts.java | 37 ++ .../com/coderising/litestruts/StrutsTest.java | 43 ++ .../src/com/coderising/litestruts/View.java | 23 + .../src/com/coding/basic/ArrayList.java | 32 ++ .../src/com/coding/basic/BinaryTreeNode.java | 32 ++ .../src/com/coding/basic/Iterator.java | 7 + .../src/com/coding/basic/LinkedList.java | 265 +++++++++++ .../565832157/src/com/coding/basic/List.java | 9 + .../565832157/src/com/coding/basic/Queue.java | 19 + .../565832157/src/com/coding/basic/Stack.java | 22 + group23/601689050/.gitattributes | 17 + .../1List&BinaryTreeNode/ArrayList.java | 58 +++ .../1List&BinaryTreeNode/BinaryTreeNode.java | 50 ++ .../1List&BinaryTreeNode/Iterator.java | 7 + .../1List&BinaryTreeNode/LinkedList.java | 117 +++++ .../601689050/1List&BinaryTreeNode/List.java | 10 + .../601689050/1List&BinaryTreeNode/Queue.java | 45 ++ .../601689050/1List&BinaryTreeNode/Stack.java | 39 ++ .../JVM/loader/ClassFileLoader.java | 65 +++ .../JVM/test/loader/ClassFileLoaderTest.java | 86 ++++ .../JVM/test/loader/EmployeeV1.java | 28 ++ .../601689050/4weekLRU&JVM/LRU/Iterator.java | 5 + .../4weekLRU&JVM/LRU/LRUPageFrame.java | 117 +++++ .../4weekLRU&JVM/LRU/LRUPageFrameTest.java | 29 ++ .../4weekLRU&JVM/LRU/LinkedList.java | 313 ++++++++++++ group23/601689050/4weekLRU&JVM/LRU/List.java | 7 + group23/601689050/5weekStack/stack/Stack.java | 70 +++ .../601689050/5weekStack/stack/StackUtil.java | 133 ++++++ .../5weekStack/test/StackUtilTest.java | 69 +++ .../601689050/6weekInfixExpr/InfixExpr.java | 61 +++ .../6weekInfixExpr/InfixExprTest.java | 50 ++ group23/601689050/6weekInfixExpr/Stack.java | 50 ++ group23/601689050/6weekInfixExpr/Token.java | 46 ++ .../601689050/6weekInfixExpr/TokenParser.java | 47 ++ group23/601689050/7weekExpr2/InfixExpr.java | 61 +++ .../601689050/7weekExpr2/InfixToPostfix.java | 35 ++ group23/601689050/7weekExpr2/PostfixExpr.java | 45 ++ .../601689050/7weekExpr2/PostfixExprTest.java | 37 ++ group23/601689050/7weekExpr2/PrefixExpr.java | 51 ++ .../601689050/7weekExpr2/PrefixExprTest.java | 42 ++ group23/601689050/7weekExpr2/Stack.java | 50 ++ group23/601689050/7weekExpr2/Token.java | 49 ++ group23/601689050/7weekExpr2/TokenParser.java | 47 ++ group23/601689050/8weekQueue/CircleQueue.java | 44 ++ group23/601689050/8weekQueue/Josephus.java | 50 ++ group23/601689050/8weekQueue/Queue.java | 55 +++ .../8weekQueue/QueueWithTwoStacks.java | 47 ++ .../601689050/9weekStack/QuickMinStack.java | 50 ++ .../9weekStack/StackWithTwoQueues.java | 52 ++ .../9weekStack/TwoStackInOneArray.java | 81 ++++ group23/609041842/src/code/ArrayList.java | 49 ++ group23/609041842/src/code/LinkedList.java | 87 ++++ group23/609041842/src/code/Queue.java | 17 + group23/609041842/src/code/Stack.java | 30 ++ .../src/com/homework01/ArrayList.java | 49 ++ .../src/com/homework01/LinkedList.java | 87 ++++ .../609041842/src/com/homework01/Queue.java | 17 + .../609041842/src/com/homework01/Stack.java | 30 ++ group23/609041842/src/test.java | 9 + .../com/basic/datastructure/ArrayList.java | 62 +++ .../com/basic/datastructure/LinkedList.java | 98 ++++ .../com/basic/datastructure/List.java | 9 + .../com/basic/datastructure/Queue.java | 23 + .../com/basic/datastructure/Stack.java | 29 ++ .../datastructure/TestDataStructure.java | 27 ++ .../basic/week2/datastructure/ArrayTest.java | 50 ++ .../basic/week2/datastructure/ArrayUtil.java | 228 +++++++++ .../basic/week2/litestruts/LoginAction.java | 39 ++ .../com/basic/week2/litestruts/Struts.java | 35 ++ .../basic/week2/litestruts/StrutsTest.java | 43 ++ .../com/basic/week2/litestruts/View.java | 24 + .../basic/week3/datastructure/LinkedList.java | 446 ++++++++++++++++++ .../com/basic/week3/download/Demo.java | 36 ++ .../basic/week3/download/DownloadThread.java | 31 ++ .../basic/week3/download/FileDownloader.java | 97 ++++ .../week3/download/FileDownloaderTest.java | 59 +++ .../basic/week3/download/api/Connection.java | 24 + .../download/api/ConnectionException.java | 12 + .../week3/download/api/ConnectionManager.java | 10 + .../week3/download/api/DownloadListener.java | 5 + .../week3/download/impl/ConnectionImpl.java | 59 +++ .../download/impl/ConnectionManagerImpl.java | 35 ++ .../week4/jvm/loader/ClassFileLoader.java | 74 +++ .../com/basic/week4/jvm/test/EmployeeV1.java | 30 ++ .../com/basic/week4/lru/LRUPageFrame.java | 131 +++++ .../com/basic/week5/stack/StackUtil.java | 103 ++++ .../com/basic/week6/expr/InfixExpr.java | 127 +++++ .../632678665/com/basic/week6/expr/Token.java | 52 ++ .../com/basic/week6/exprNew/InfixExpr.java | 57 +++ .../com/basic/week6/exprNew/Operator.java | 75 +++ .../com/basic/week6/exprNew/Token.java | 63 +++ .../com/basic/week6/exprNew/TokenParser.java | 60 +++ .../com/basic/week7/stack/MyStack.java | 42 ++ .../com/basic/week7/stack/StackUtil.java | 173 +++++++ .../basic/week7/stack/expr/ExprIterator.java | 57 +++ .../com/basic/week7/stack/expr/InfixExpr.java | 74 +++ .../week7/stack/expr/InfixToPostExpr.java | 41 ++ .../week7/stack/expr/InfixToPostExprTest.java | 30 ++ .../basic/week7/stack/expr/PostfixExpr.java | 48 ++ .../week7/stack/expr/PostfixExprTest.java | 34 ++ .../basic/week7/stack/expr/PrefixExpr.java | 59 +++ .../week7/stack/expr/PrefixExprTest.java | 39 ++ .../com/basic/week7/stack/expr/Token.java | 49 ++ .../basic/week7/stack/expr/TokenParser.java | 56 +++ .../week7/stack/expr/TokenParserTest.java | 36 ++ .../com/basic/week8/CircleQueue.java | 44 ++ .../632678665/com/basic/week8/Josephus.java | 44 ++ group23/632678665/com/basic/week8/Queue.java | 55 +++ .../com/basic/week8/QueueWithTwoStacks.java | 47 ++ .../com/basic/week9/QuickMinStack.java | 48 ++ .../com/basic/week9/StackWithTwoQueues.java | 53 +++ .../com/basic/week9/TwoStackInOneArray.java | 82 ++++ group23/729693763/First_Homework1/readme.md | 2 + .../src/com/danny/hw1/ArrayList.java | 117 +++++ .../src/com/danny/hw1/BinaryTreeNode.java | 101 ++++ .../src/com/danny/hw1/Iterator.java | 6 + .../src/com/danny/hw1/LinkedList.java | 296 ++++++++++++ .../src/com/danny/hw1/List.java | 10 + .../src/com/danny/hw1/Queue.java | 25 + .../src/com/danny/hw1/Stack.java | 40 ++ .../src/com/danny/hw1/test/ArrayListTest.java | 80 ++++ .../danny/hw1/test/BinaryTreeNodeTest.java | 48 ++ .../com/danny/hw1/test/LinkedListTest.java | 86 ++++ .../src/com/danny/hw1/test/QueueTest.java | 47 ++ .../src/com/danny/hw1/test/StackTest.java | 54 +++ .../src/com/danny/hw1/test/SuitTest.java | 17 + .../src/com/danny/hw2/ArrayUtil.java | 221 +++++++++ .../src/com/danny/hw2/LoginAction.java | 39 ++ .../src/com/danny/hw2/Struts.java | 163 +++++++ .../src/com/danny/hw2/View.java | 23 + .../src/com/danny/hw2/test/ArrayUtilTest.java | 95 ++++ .../src/com/danny/hw2/test/StrutsTest.java | 46 ++ .../Third_Homework3/DataStruct/Iterator.java | 6 + .../DataStruct/LinkedList.java | 327 +++++++++++++ .../Third_Homework3/DataStruct/List.java | 10 + .../download/DownloadThread.java | 49 ++ .../download/FileDownloader.java | 96 ++++ .../download/FileDownloaderTest.java | 58 +++ .../download/api/Connection.java | 23 + .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 + .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 80 ++++ .../download/impl/ConnectionManagerImpl.java | 27 ++ .../729693763/homework1_demo/ArrayList.java | 32 ++ .../homework1_demo/BinaryTreeNode.java | 32 ++ .../729693763/homework1_demo/Iterator.java | 7 + .../729693763/homework1_demo/LinkedList.java | 124 +++++ group23/729693763/homework1_demo/List.java | 9 + group23/729693763/homework1_demo/Queue.java | 19 + group23/729693763/homework1_demo/Stack.java | 22 + group23/729693763/readme.md | 12 + .../src/main/java/code01/ArrayList.java | 138 ++++++ .../src/main/java/code01/BinaryTree.java | 97 ++++ .../coding/src/main/java/code01/Iterator.java | 7 + .../src/main/java/code01/LinkedList.java | 327 +++++++++++++ .../coding/src/main/java/code01/List.java | 9 + .../coding/src/main/java/code01/Queue.java | 24 + .../coding/src/main/java/code01/Stack.java | 31 ++ .../src/main/java/code02/ArrayUtil.java | 257 ++++++++++ .../java/code02/litestruts/ActionConfig.java | 28 ++ .../java/code02/litestruts/Configuration.java | 64 +++ .../java/code02/litestruts/LoginAction.java | 39 ++ .../code02/litestruts/ReflectionUtil.java | 119 +++++ .../main/java/code02/litestruts/Struts.java | 76 +++ .../src/main/java/code02/litestruts/View.java | 23 + .../src/main/java/code03/DownloadThread.java | 47 ++ .../src/main/java/code03/FileDownloader.java | 109 +++++ .../src/main/java/code03/api/Connection.java | 23 + .../java/code03/api/ConnectionException.java | 9 + .../java/code03/api/ConnectionManager.java | 10 + .../java/code03/api/DownloadListener.java | 5 + .../main/java/code03/impl/ConnectionImpl.java | 106 +++++ .../code03/impl/ConnectionManagerImpl.java | 36 ++ .../src/main/java/code04/LRUPageFrame.java | 162 +++++++ .../java/mini_jvm/loader/ClassFileLoader.java | 108 +++++ .../src/test/java/code01/ArrayListTest.java | 67 +++ .../src/test/java/code01/BinaryTreeTest.java | 27 ++ .../src/test/java/code01/LinkedListTest.java | 174 +++++++ .../src/test/java/code01/QueueTest.java | 24 + .../src/test/java/code01/StackTest.java | 27 ++ .../src/test/java/code02/ArrayUtilTest.java | 73 +++ .../java/code02/litestruts/StrutsTest.java | 43 ++ .../test/java/code03/FileDownloaderTest.java | 59 +++ .../test/java/code04/LRUPageFrameTest.java | 38 ++ .../java/mini_jvm/ClassFileloaderTest.java | 71 +++ .../src/test/java/mini_jvm/EmployeeV1.java | 28 ++ .../810181789/src/firstday/ArrayListt.java | 86 ++++ group23/810181789/src/firstday/LinkListt.java | 167 +++++++ group23/810181789/src/firstday/Queue.java | 43 ++ group23/810181789/src/firstday/Stack.java | 43 ++ group23/group23.md | 1 + 597 files changed, 35530 insertions(+) create mode 100644 group23/1028361767/1028361767.md create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/Connection.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/Struts.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/1028361767/data-structure/src/com/coderising/litestruts/View.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Iterator.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/List.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/Queue.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/linklist/LinkedList.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/Queue.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/StackUtil.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/Palindrome.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/book/algorithms/BasicBinarySearch.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/AddTwoNums.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestSubstringWithoutRepeatingCharacters.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/StudentAttendanceRecord1.java create mode 100644 group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java create mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java create mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java create mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java create mode 100644 group23/1028361767/data-structure/src/test/com/coding/basic/stack/TestStackUtil.java create mode 100644 group23/1028361767/java8-function-coding/src/me/practise/chapter2.java create mode 100644 group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java create mode 100644 group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java create mode 100644 group23/1028361767/learn-spring/src/test/practise/Test1.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/method/Method.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayList.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/BinaryTreeNode.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Iterator.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedList.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/List.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Queue.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/list/Stack.java create mode 100644 group23/1072760797-skomefen/day3-11/src/com/skomefen/test/test.java create mode 100644 group23/1072760797-skomefen/day3-19/src/com/coderising/array/ArrayUtil.java create mode 100644 group23/1072760797-skomefen/day3-19/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionImplTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java create mode 100644 group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java create mode 100644 group23/1246614258/src/com/coding/datastructs/ArrayList.java create mode 100644 group23/1246614258/src/com/coding/datastructs/Iterator.java create mode 100644 group23/1246614258/src/com/coding/datastructs/LinkedList.java create mode 100644 group23/1246614258/src/com/coding/datastructs/List.java create mode 100644 group23/1246614258/src/com/coding/datastructs/MyIterator.java create mode 100644 group23/1246614258/src/com/coding/datastructs/Queue.java create mode 100644 group23/1246614258/src/com/coding/datastructs/Stack.java create mode 100644 group23/1246614258/src/com/coding/test/ArrayListTest.java create mode 100644 group23/1246614258/src/com/coding/test/LinkedListTest.java create mode 100644 group23/1246614258/src/com/coding/test/QueueTest.java create mode 100644 group23/1246614258/src/com/coding/test/StackTest.java create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/test/ArrayUtilTest.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/LoginAction.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Struts.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" create mode 100644 "group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java create mode 100644 group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java create mode 100644 group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java create mode 100644 group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/List.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/test/LinkedListTest.java create mode 100644 group23/1323434545/work_DataStructure/03_LinkedListOperations/src/utils/ListUtils.java create mode 100644 group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java create mode 100644 group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java create mode 100644 group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java create mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java create mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/Struts.java create mode 100644 group23/1323434545/work_Other/01_litestruts/src/main/View.java create mode 100644 group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/api/Connection.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java create mode 100644 group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/List.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Queue.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/Stack.java create mode 100644 group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java create mode 100644 group23/381519422/array/src/array/ArrayUtil.java create mode 100644 group23/381519422/array/src/array/ArrayUtilTest.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java create mode 100644 group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java create mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java create mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java create mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java create mode 100644 group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java create mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/563253496/week4_jvm1/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/563253496/week4_lru/src/LRUPageFrame.java create mode 100644 group23/563253496/week4_lru/src/LRUPageFrameTest.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java create mode 100644 group23/563253496/week5_stack/src/stack/Stack.java create mode 100644 group23/563253496/week5_stack/src/stack/StackUtil.java create mode 100644 group23/563253496/week5_stack/src/test/StackUtilTest.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/method/Method.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/DownloadThread.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/FileDownloader.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/Connection.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/Struts.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/563253496/week6_stack/src/com/coderising/litestruts/View.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/Iterator.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/List.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/Queue.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LineNumberTable.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileParser.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/method/Method.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java create mode 100644 group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/DownloadThread.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/FileDownloader.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/Connection.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/Struts.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/563253496/week7_stack/src/com/coderising/litestruts/View.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/Iterator.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/List.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtilTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java create mode 100644 group23/563253496/week8_datastructure/src/CircleQueue.java create mode 100644 group23/563253496/week8_datastructure/src/Josephus.java create mode 100644 group23/563253496/week8_datastructure/src/JosephusTest.java create mode 100644 group23/563253496/week8_datastructure/src/Queue.java create mode 100644 group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java create mode 100644 group23/563253496/week9_datastructure/src/QuickMinStack.java create mode 100644 group23/563253496/week9_datastructure/src/StackWithTwoQueues.java create mode 100644 group23/563253496/week9_datastructure/src/TwoStackInOneArray.java create mode 100644 group23/565832157/src/com/coderising/array/ArrayUtil.java create mode 100644 group23/565832157/src/com/coderising/download/DownloadThread.java create mode 100644 group23/565832157/src/com/coderising/download/FileDownloader.java create mode 100644 group23/565832157/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group23/565832157/src/com/coderising/download/api/Connection.java create mode 100644 group23/565832157/src/com/coderising/download/api/ConnectionException.java create mode 100644 group23/565832157/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group23/565832157/src/com/coderising/download/api/DownloadListener.java create mode 100644 group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java create mode 100644 group23/565832157/src/com/coderising/litestruts/LoginAction.java create mode 100644 group23/565832157/src/com/coderising/litestruts/Struts.java create mode 100644 group23/565832157/src/com/coderising/litestruts/StrutsTest.java create mode 100644 group23/565832157/src/com/coderising/litestruts/View.java create mode 100644 group23/565832157/src/com/coding/basic/ArrayList.java create mode 100644 group23/565832157/src/com/coding/basic/BinaryTreeNode.java create mode 100644 group23/565832157/src/com/coding/basic/Iterator.java create mode 100644 group23/565832157/src/com/coding/basic/LinkedList.java create mode 100644 group23/565832157/src/com/coding/basic/List.java create mode 100644 group23/565832157/src/com/coding/basic/Queue.java create mode 100644 group23/565832157/src/com/coding/basic/Stack.java create mode 100644 group23/601689050/.gitattributes create mode 100644 group23/601689050/1List&BinaryTreeNode/ArrayList.java create mode 100644 group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java create mode 100644 group23/601689050/1List&BinaryTreeNode/Iterator.java create mode 100644 group23/601689050/1List&BinaryTreeNode/LinkedList.java create mode 100644 group23/601689050/1List&BinaryTreeNode/List.java create mode 100644 group23/601689050/1List&BinaryTreeNode/Queue.java create mode 100644 group23/601689050/1List&BinaryTreeNode/Stack.java create mode 100644 group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java create mode 100644 group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java create mode 100644 group23/601689050/4weekLRU&JVM/JVM/test/loader/EmployeeV1.java create mode 100644 group23/601689050/4weekLRU&JVM/LRU/Iterator.java create mode 100644 group23/601689050/4weekLRU&JVM/LRU/LRUPageFrame.java create mode 100644 group23/601689050/4weekLRU&JVM/LRU/LRUPageFrameTest.java create mode 100644 group23/601689050/4weekLRU&JVM/LRU/LinkedList.java create mode 100644 group23/601689050/4weekLRU&JVM/LRU/List.java create mode 100644 group23/601689050/5weekStack/stack/Stack.java create mode 100644 group23/601689050/5weekStack/stack/StackUtil.java create mode 100644 group23/601689050/5weekStack/test/StackUtilTest.java create mode 100644 group23/601689050/6weekInfixExpr/InfixExpr.java create mode 100644 group23/601689050/6weekInfixExpr/InfixExprTest.java create mode 100644 group23/601689050/6weekInfixExpr/Stack.java create mode 100644 group23/601689050/6weekInfixExpr/Token.java create mode 100644 group23/601689050/6weekInfixExpr/TokenParser.java create mode 100644 group23/601689050/7weekExpr2/InfixExpr.java create mode 100644 group23/601689050/7weekExpr2/InfixToPostfix.java create mode 100644 group23/601689050/7weekExpr2/PostfixExpr.java create mode 100644 group23/601689050/7weekExpr2/PostfixExprTest.java create mode 100644 group23/601689050/7weekExpr2/PrefixExpr.java create mode 100644 group23/601689050/7weekExpr2/PrefixExprTest.java create mode 100644 group23/601689050/7weekExpr2/Stack.java create mode 100644 group23/601689050/7weekExpr2/Token.java create mode 100644 group23/601689050/7weekExpr2/TokenParser.java create mode 100644 group23/601689050/8weekQueue/CircleQueue.java create mode 100644 group23/601689050/8weekQueue/Josephus.java create mode 100644 group23/601689050/8weekQueue/Queue.java create mode 100644 group23/601689050/8weekQueue/QueueWithTwoStacks.java create mode 100644 group23/601689050/9weekStack/QuickMinStack.java create mode 100644 group23/601689050/9weekStack/StackWithTwoQueues.java create mode 100644 group23/601689050/9weekStack/TwoStackInOneArray.java create mode 100644 group23/609041842/src/code/ArrayList.java create mode 100644 group23/609041842/src/code/LinkedList.java create mode 100644 group23/609041842/src/code/Queue.java create mode 100644 group23/609041842/src/code/Stack.java create mode 100644 group23/609041842/src/com/homework01/ArrayList.java create mode 100644 group23/609041842/src/com/homework01/LinkedList.java create mode 100644 group23/609041842/src/com/homework01/Queue.java create mode 100644 group23/609041842/src/com/homework01/Stack.java create mode 100644 group23/609041842/src/test.java create mode 100644 group23/632678665/com/basic/datastructure/ArrayList.java create mode 100644 group23/632678665/com/basic/datastructure/LinkedList.java create mode 100644 group23/632678665/com/basic/datastructure/List.java create mode 100644 group23/632678665/com/basic/datastructure/Queue.java create mode 100644 group23/632678665/com/basic/datastructure/Stack.java create mode 100644 group23/632678665/com/basic/datastructure/TestDataStructure.java create mode 100644 group23/632678665/com/basic/week2/datastructure/ArrayTest.java create mode 100644 group23/632678665/com/basic/week2/datastructure/ArrayUtil.java create mode 100644 group23/632678665/com/basic/week2/litestruts/LoginAction.java create mode 100644 group23/632678665/com/basic/week2/litestruts/Struts.java create mode 100644 group23/632678665/com/basic/week2/litestruts/StrutsTest.java create mode 100644 group23/632678665/com/basic/week2/litestruts/View.java create mode 100644 group23/632678665/com/basic/week3/datastructure/LinkedList.java create mode 100644 group23/632678665/com/basic/week3/download/Demo.java create mode 100644 group23/632678665/com/basic/week3/download/DownloadThread.java create mode 100644 group23/632678665/com/basic/week3/download/FileDownloader.java create mode 100644 group23/632678665/com/basic/week3/download/FileDownloaderTest.java create mode 100644 group23/632678665/com/basic/week3/download/api/Connection.java create mode 100644 group23/632678665/com/basic/week3/download/api/ConnectionException.java create mode 100644 group23/632678665/com/basic/week3/download/api/ConnectionManager.java create mode 100644 group23/632678665/com/basic/week3/download/api/DownloadListener.java create mode 100644 group23/632678665/com/basic/week3/download/impl/ConnectionImpl.java create mode 100644 group23/632678665/com/basic/week3/download/impl/ConnectionManagerImpl.java create mode 100644 group23/632678665/com/basic/week4/jvm/loader/ClassFileLoader.java create mode 100644 group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java create mode 100644 group23/632678665/com/basic/week4/lru/LRUPageFrame.java create mode 100644 group23/632678665/com/basic/week5/stack/StackUtil.java create mode 100644 group23/632678665/com/basic/week6/expr/InfixExpr.java create mode 100644 group23/632678665/com/basic/week6/expr/Token.java create mode 100644 group23/632678665/com/basic/week6/exprNew/InfixExpr.java create mode 100644 group23/632678665/com/basic/week6/exprNew/Operator.java create mode 100644 group23/632678665/com/basic/week6/exprNew/Token.java create mode 100644 group23/632678665/com/basic/week6/exprNew/TokenParser.java create mode 100644 group23/632678665/com/basic/week7/stack/MyStack.java create mode 100644 group23/632678665/com/basic/week7/stack/StackUtil.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/ExprIterator.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixExpr.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/Token.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/TokenParser.java create mode 100644 group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java create mode 100644 group23/632678665/com/basic/week8/CircleQueue.java create mode 100644 group23/632678665/com/basic/week8/Josephus.java create mode 100644 group23/632678665/com/basic/week8/Queue.java create mode 100644 group23/632678665/com/basic/week8/QueueWithTwoStacks.java create mode 100644 group23/632678665/com/basic/week9/QuickMinStack.java create mode 100644 group23/632678665/com/basic/week9/StackWithTwoQueues.java create mode 100644 group23/632678665/com/basic/week9/TwoStackInOneArray.java create mode 100644 group23/729693763/First_Homework1/readme.md create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/List.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java create mode 100644 group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/View.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java create mode 100644 group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java create mode 100644 group23/729693763/Third_Homework3/DataStruct/Iterator.java create mode 100644 group23/729693763/Third_Homework3/DataStruct/LinkedList.java create mode 100644 group23/729693763/Third_Homework3/DataStruct/List.java create mode 100644 group23/729693763/Third_Homework3/download/DownloadThread.java create mode 100644 group23/729693763/Third_Homework3/download/FileDownloader.java create mode 100644 group23/729693763/Third_Homework3/download/FileDownloaderTest.java create mode 100644 group23/729693763/Third_Homework3/download/api/Connection.java create mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionException.java create mode 100644 group23/729693763/Third_Homework3/download/api/ConnectionManager.java create mode 100644 group23/729693763/Third_Homework3/download/api/DownloadListener.java create mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java create mode 100644 group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java create mode 100644 group23/729693763/homework1_demo/ArrayList.java create mode 100644 group23/729693763/homework1_demo/BinaryTreeNode.java create mode 100644 group23/729693763/homework1_demo/Iterator.java create mode 100644 group23/729693763/homework1_demo/LinkedList.java create mode 100644 group23/729693763/homework1_demo/List.java create mode 100644 group23/729693763/homework1_demo/Queue.java create mode 100644 group23/729693763/homework1_demo/Stack.java create mode 100644 group23/729693763/readme.md create mode 100644 group23/769232552/coding/src/main/java/code01/ArrayList.java create mode 100644 group23/769232552/coding/src/main/java/code01/BinaryTree.java create mode 100644 group23/769232552/coding/src/main/java/code01/Iterator.java create mode 100644 group23/769232552/coding/src/main/java/code01/LinkedList.java create mode 100644 group23/769232552/coding/src/main/java/code01/List.java create mode 100644 group23/769232552/coding/src/main/java/code01/Queue.java create mode 100644 group23/769232552/coding/src/main/java/code01/Stack.java create mode 100644 group23/769232552/coding/src/main/java/code02/ArrayUtil.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/Struts.java create mode 100644 group23/769232552/coding/src/main/java/code02/litestruts/View.java create mode 100644 group23/769232552/coding/src/main/java/code03/DownloadThread.java create mode 100644 group23/769232552/coding/src/main/java/code03/FileDownloader.java create mode 100644 group23/769232552/coding/src/main/java/code03/api/Connection.java create mode 100644 group23/769232552/coding/src/main/java/code03/api/ConnectionException.java create mode 100644 group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java create mode 100644 group23/769232552/coding/src/main/java/code03/api/DownloadListener.java create mode 100644 group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java create mode 100644 group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java create mode 100644 group23/769232552/coding/src/main/java/code04/LRUPageFrame.java create mode 100644 group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java create mode 100644 group23/769232552/coding/src/test/java/code01/ArrayListTest.java create mode 100644 group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java create mode 100644 group23/769232552/coding/src/test/java/code01/LinkedListTest.java create mode 100644 group23/769232552/coding/src/test/java/code01/QueueTest.java create mode 100644 group23/769232552/coding/src/test/java/code01/StackTest.java create mode 100644 group23/769232552/coding/src/test/java/code02/ArrayUtilTest.java create mode 100644 group23/769232552/coding/src/test/java/code02/litestruts/StrutsTest.java create mode 100644 group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java create mode 100644 group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java create mode 100644 group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java create mode 100644 group23/769232552/coding/src/test/java/mini_jvm/EmployeeV1.java create mode 100644 group23/810181789/src/firstday/ArrayListt.java create mode 100644 group23/810181789/src/firstday/LinkListt.java create mode 100644 group23/810181789/src/firstday/Queue.java create mode 100644 group23/810181789/src/firstday/Stack.java create mode 100644 group23/group23.md diff --git a/group23/1028361767/1028361767.md b/group23/1028361767/1028361767.md new file mode 100644 index 0000000000..741976ad6e --- /dev/null +++ b/group23/1028361767/1028361767.md @@ -0,0 +1 @@ +This is 1028361767's project. \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java b/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..8cf0ae1e42 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,31 @@ +package com.coderising.download; + +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + try { + byte[] bytes = conn.read(startPos, endPos); + RandomAccessFile file = new RandomAccessFile("/Users/jie/Desktop/test.png", "rw"); + file.seek(startPos); + file.write(bytes); + file.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java b/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..1fe4ebb159 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,104 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + Thread[] threads = new Thread[3]; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + int size = length / 3; + int remain = length - size; + + for(int i=0;i<3;i++){ + conn = cm.open(this.url); + int startPos = i*size; + int endPos = (i+1) * size - 1; + if(i == 2){ + endPos = (i+1) * size - 1 + remain; + } + threads[i] = new DownloadThread(conn,startPos,endPos); + threads[i].start(); + } + + new Thread(new Runnable(){ + public void run(){ + boolean finish; + do{ + finish = true; + for(int i=0;i actions = new HashMap(); + + @SuppressWarnings("rawtypes") + public static View runAction(String actionName, Map parameters) throws Exception { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + //读取xml,把xml信息放到actions + readStrutsXML(); + + Action action = actions.get(actionName); + View view = new View(); + if(action != null){ + Class clazz = Class.forName(action.getClassName()); + Object obj = clazz.newInstance(); + + //根据parameters调用set方法 + initClass(clazz, obj, action, parameters); + + //调用execute方法 + String result = execute(clazz, obj); + //调用所有get方法 + Map resultParameters = getResultParameters(clazz, obj); + + view.setJsp(action.getResults().get(result)); + view.setParameters(resultParameters); + } + + return view; + } + + @SuppressWarnings("rawtypes") + private static Map getResultParameters(Class clazz, Object obj) throws Exception { + Map resultParameters = new HashMap(); + Method[] methods = clazz.getMethods(); + String methodName; + String propName; + String propValue; + for(Method method : methods){ + methodName = method.getName(); + if(methodName.startsWith("get") && !"getClass".equals(methodName)){ + propName = firstLetterLowerCase(methodName.substring(3, methodName.length())); + propValue = (String) method.invoke(obj); + resultParameters.put(propName, propValue); + } + } + return resultParameters; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static String execute(Class clazz, Object obj) throws Exception{ + Method method = clazz.getMethod("execute"); + return (String)method.invoke(obj); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private static void initClass(Class clazz, Object obj, Action action, Map parameters) throws Exception { + String setMethodName; + Method method = null; + for (String parameter : parameters.keySet()) { + setMethodName = "set" + firstLetterUpperCase(parameter); + method = clazz.getMethod(setMethodName, String.class); + method.invoke(obj, parameters.get(parameter)); + } + } + + private static String firstLetterLowerCase(String string){ + char[] cs = string.toCharArray(); + cs[0] += 32; + return String.valueOf(cs); + } + + private static String firstLetterUpperCase(String string){ + char[] cs = string.toCharArray(); + cs[0] -= 32; + return String.valueOf(cs); + } + + @SuppressWarnings("unchecked") + private static void readStrutsXML() { + SAXReader saxReader = new SAXReader(); + Document document; + try { + document = saxReader.read(new File("src/com/coderising/litestruts/struts.xml")); + } catch (DocumentException e) { + System.out.println("error:file not found"); + return ; + } + Element root = document.getRootElement(); + Iterator actionItr = root.elementIterator(); + Element action; + Action act; + Iterator resultItr; + Element result; + Map results; + while(actionItr.hasNext()){ + action = actionItr.next(); + + resultItr = action.elementIterator(); + results = new HashMap(); + while(resultItr.hasNext()){ + result = resultItr.next(); + results.put(result.attributeValue("name"), result.getStringValue()); + } + + act = new Action(); + act.setName(action.attributeValue("name")); + act.setClassName(action.attributeValue("class")); + act.setResults(results); + + actions.put(act.getName(), act); + } + } + + static class Action { + + private String name; + + private String className; + + private Map results = new HashMap<>(); + + public Map getResults() { + return results; + } + + public void setResults(Map results) { + this.results = results; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + } + +} diff --git a/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..92a6758a69 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() throws Exception { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java b/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java b/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..dced34e873 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,97 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode parent; + + public BinaryTreeNode(Object data) { + this.data = data; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public void setParent(BinaryTreeNode parent) { + this.parent = parent; + } + + public BinaryTreeNode getParent() { + return parent; + } + + public BinaryTreeNode insert(Object o) { + BinaryTreeNode newNode = new BinaryTreeNode(o); + BinaryTreeNode root = findRoot(this); + if (root.data == null) { + root.data = newNode; + } else { + int newVal = getNodeIntVal(newNode); + insert(root, newNode, newVal); + } + return newNode; + } + + private void insert(BinaryTreeNode node, BinaryTreeNode newNode, int newVal) { + int nodeVal = getNodeIntVal(node); + if (newVal < nodeVal) { + if (node.left == null) { + newNode.parent = node; + node.left = newNode; + } else { + insert(node.left, newNode, newVal); + } + } else { + if (node.right == null) { + newNode.parent = node; + node.right = newNode; + } else { + insert(node.right, newNode, newVal); + } + } + } + + private BinaryTreeNode findRoot(BinaryTreeNode binaryTreeNode) { + while (binaryTreeNode.parent != null) { + binaryTreeNode = binaryTreeNode.parent; + } + return binaryTreeNode; + } + + private int getNodeIntVal(BinaryTreeNode node) { + if (node.data instanceof Integer) { + return ((Integer) node.data).intValue(); + } + return 0; + } + + public int getDataIntVal() { + if (data instanceof Integer) { + return ((Integer) data).intValue(); + } + return 0; + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java b/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..96adcd6d3a --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/Iterator.java @@ -0,0 +1,8 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + + public Object next(); + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/List.java b/group23/1028361767/data-structure/src/com/coding/basic/List.java new file mode 100644 index 0000000000..01398944e6 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/List.java @@ -0,0 +1,13 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/Queue.java b/group23/1028361767/data-structure/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..ddd1b74d90 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/Queue.java @@ -0,0 +1,24 @@ +package com.coding.basic; + +import com.coding.basic.linklist.LinkedList; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o) { + linkedList.add(o); + } + + public Object deQueue() { + return linkedList.removeFirst(); + } + + public boolean isEmpty() { + return linkedList.size() == 0; + } + + public int size() { + return linkedList.size(); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..43bdae82fa --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayList.java @@ -0,0 +1,83 @@ +package com.coding.basic.array; + +import java.util.Arrays; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + + private int HALF_MAX_VALUE = Integer.MAX_VALUE; + + private Object[] elementData = new Object[100]; + + public void add(Object o) { + if (noSpace()) { + elementData = grow(); + } + elementData[size++] = o; + } + + public void add(int index, Object o) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > size) { + throw new IndexOutOfBoundsException("size is" + size); + } + if (noSpace()) { + elementData = grow(); + } + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[size++] = o; + } + + public Object get(int index) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > (size - 1)) { + throw new IndexOutOfBoundsException("size is" + size); + } + return elementData[index]; + } + + public Object remove(int index) { + if (index < 0) { + throw new IllegalArgumentException("index must be positive integer"); + } + if (index > (size - 1)) { + throw new IndexOutOfBoundsException("size is" + size); + } + Object obj = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index); + elementData[size-1] = null; + size--; + return obj; + } + + public int size() { + return size; + } + + public Iterator iterator() { + return null; + } + + private boolean noSpace() { + return size == elementData.length; + } + + private Object[] grow() { + int newSize; + if (size < HALF_MAX_VALUE) { + newSize = size * 2; + } else { + newSize = Integer.MAX_VALUE; + } + return Arrays.copyOf(elementData, newSize); + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java new file mode 100644 index 0000000000..8e1b170dc0 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/array/ArrayUtil.java @@ -0,0 +1,210 @@ +package com.coding.basic.array; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public int[] reverseArray(int[] origin){ + int len = origin.length; + int[] ret = new int[len]; + for(int i=0;i len1 && i2 > len2){ + break; + }else if(i1 > len1){ + ret[i++] = array2[i2++]; + }else{ + ret[i++] = array1[i1++]; + } + } + + } + if(sameNum > 0){ + ret = Arrays.copyOf(ret, ret.length - sameNum); + } + return ret; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return Arrays.copyOf(oldArray, oldArray.length + size); + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + if(max == 1){ + return new int[0]; + }else{ + int[] tmp = new int[max + 1]; + int x1 = 1, x2 = 1; + int i = 1, j = 0; + tmp[j++] = x1; + tmp[j++] = x2; + while(true){ + i = x1 + x2; + if(i > max){ + break; + } + x1 = x2; + x2 = i; + tmp[j++] = i; + } + return Arrays.copyOf(tmp, j); + } + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + int[] tmp = new int[max/2 + 1]; + boolean isPrime; + int k = 0; + for(int i=2;i max) { + throw new IndexOutOfBoundsException(); + } + } + + + public Object get(int index) { + checkMinBound(index); + checkMaxBound(index, size - 1); + Node cur = head; + if (index != 0) { + int pos = 0; + do { + cur = cur.next; + pos++; + } while (pos != index); + } + return cur.data; + } + + public Object remove(int index) { + checkMinBound(index); + checkMaxBound(index, size - 1); + Node cur = head; + if (index == 0) { + head = cur.next; + } else { + int pos = 1; + Node prev = cur; + while (pos != index) { + prev = prev.next; + pos++; + } + cur = prev.next; + prev.next = cur.next; + } + size--; + return cur.data; + } + + public int size() { + return size; + } + + public void addFirst(Object o) { + Node newNode = new Node(o, null); + newNode.next = head; + head = newNode; + size++; + } + + public void addLast(Object o) { + Node newNode = new Node(o, null); + if (head == null) { + head = newNode; + } else { + Node tmp = head; + while (tmp.next != null) { + tmp = tmp.next; + } + tmp.next = newNode; + } + size++; + } + + public Object removeFirst() { + if (head == null) { + throw new NoSuchElementException(); + } + Node ret = head; + head = head.next; + size--; + return ret.data; + } + + public Object removeLast() { + if (head == null) { + throw new NoSuchElementException(); + } + Node ret; + if (head.next == null) { + ret = head; + head = null; + } else { + Node prev = head; + ret = head.next; + while (ret.next != null) { + prev = ret; + ret = ret.next; + } + prev.next = null; + } + size--; + return ret.data; + } + + public Iterator iterator() { + return null; + } + + + private static class Node { + Object data; + Node next; + + public Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + if(size == 0 || size == 1){ + return ; + } + Node node = head; + Node nextNode = head.next; + Node tmp; + node.next = null; + do{ + tmp = nextNode.next; + nextNode.next = node; + node = nextNode; + nextNode = tmp; + }while(nextNode != null); + head = node; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf() { + if(size == 0 || size == 1){ + return ; + } + int num = size / 2; + size -= num; + Node node = head; + while(num > 0){ + node = node.next; + num--; + } + head = node; + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + */ + public void remove(int i, int length) { + checkMinBound(i); + checkMaxBound(i + length, size); + Node prev = null; + Node node = head; + int index = 0; + while(index < i){ + prev = node; + node = node.next; + index++; + } + Node nextNode = node.next; + while(index < (i + length - 1)){ + nextNode = nextNode.next; + index++; + } + size -= length; + if(i == 0){ + head = nextNode; + }else{ + prev.next = nextNode; + head = prev; + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + */ + public int[] getElements(LinkedList list) { + int[] ret = new int[list.size()]; + if(ret.length == 0){ + return ret; + } + int index; + int j = 0; + Node node = head; + for(int i=0;i min){ + foundMin = true; + } + if(foundMin && (int)node.data > max){ + break; + } + if(foundMin == false){ + prev = node; + }else{ + size -= 1; + } + node = node.next; + }while(node != null); + if(prev == null){ + head = node; + }else{ + prev.next = node; + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * + * @param list + */ + public LinkedList intersection(LinkedList list) { + LinkedList ret = new LinkedList(); + Node node = head; + int nodeValue; + int elementValue; + for(int i=0;i elementValue){ + break; + } + node = node.next; + } + } + } + return ret; + } + + public String toString(){ + Node node = head; + StringBuilder sb = new StringBuilder(); + if(node == null){ + return ""; + }else{ + sb.append(head.data); + while((node = node.next) != null){ + sb.append(",").append(node.data); + } + return sb.toString(); + } + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..eeed686419 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,57 @@ +package com.coding.basic.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + private int maxSize = DEFAULT_SIZE; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public CircleQueue(int maxSize){ + elementData = new Object[maxSize]; + this.maxSize = maxSize; + } + + public boolean isEmpty() { + return rear == front; + + } + + public int size() { + return rear - front; + } + + + + public void enQueue(E data) { + if((rear+1)%maxSize == front){ + throw new FullQueueException(); + } + elementData[rear] = data; + rear = (rear + 1) % maxSize; + } + + public E deQueue() { + if(rear == front){ + throw new EmptyQueueException(); + } + E data = (E)elementData[front]; + elementData[front] = null; + front = (front + 1) % maxSize; + return data; + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java new file mode 100644 index 0000000000..925c9de7ec --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/EmptyQueueException.java @@ -0,0 +1,14 @@ +package com.coding.basic.queue; + +public class EmptyQueueException extends RuntimeException { + + private static final long serialVersionUID = 7013504079461713464L; + + public EmptyQueueException() { + super(); + } + + public EmptyQueueException(String message) { + super(message); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java new file mode 100644 index 0000000000..96cc1ab4fb --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/FullQueueException.java @@ -0,0 +1,14 @@ +package com.coding.basic.queue; + +public class FullQueueException extends RuntimeException { + + private static final long serialVersionUID = 5782713639805661798L; + + public FullQueueException() { + super(); + } + + public FullQueueException(String message) { + super(message); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..8400d503b4 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,32 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + List numbers = new ArrayList<>(); + CircleQueue queue = new CircleQueue<>(n+1); + for(int i=0;i { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..d56e7b97ff --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,54 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return stack1.size() == 0; + } + + + + public int size() { + return stack1.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + E data = stack2.pop(); + while(!stack2.isEmpty()){ + stack1.push(stack2.pop()); + } + return data; + } + + + + } + diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..a04191da19 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack; + +import java.util.Arrays; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + int[] datas = new int[10]; + int size; + int minIndex; + + public void push(int data){ + checkAndresize(); + datas[size] = data; + if(datas[minIndex] > data){ + minIndex = size; + } + size++; + } + + public int pop(){ + checkOutBound(); + return datas[size-1]; + } + public int findMin(){ + checkOutBound(); + return datas[minIndex]; + } + + private void checkAndresize() { + if(size == datas.length){ + datas = Arrays.copyOf(datas, datas.length*2); + } + } + private void checkOutBound(){ + if(size <= 0){ + throw new IndexOutOfBoundsException(); + } + } +} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..58a4846f2b --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,47 @@ +package com.coding.basic.stack; + +import java.util.EmptyStackException; + +import com.coding.basic.array.ArrayList; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o) { + elementData.add(o); + } + + public Object pop() { + checkBound(); + return elementData.remove(size() - 1); + } + + public Object peek() { + checkBound(); + return elementData.get(size() - 1); + } + + public boolean isEmpty() { + return size() == 0; + } + + public int size() { + return elementData.size(); + } + + private void checkBound() { + if (isEmpty()) { + throw new EmptyStackException(); + } + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + for(int i=0;i i) { + tmp.push(s.pop()); + } + s.push(top); + while(tmp.size() > 0){ + s.push(tmp.pop()); + } + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + Stack tmp = new Stack(); + boolean found = false; + while(!s.isEmpty() && !found){ + Object obj = s.pop(); + if(obj == o){ + found = true; + }else{ + tmp.push(obj); + } + } + while(!tmp.isEmpty()) + s.push(tmp.pop()); + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + Object[] objs = new Object[len]; + if(s.isEmpty() || len == 0) + return objs; + int i = 0; + while(i < len && !s.isEmpty()){ + objs[i++] = s.pop(); + } + for(i=objs.length-1;i>=0;i--) + s.push(objs[i]); + return objs; + } + /** + * 字符串s 可能包含这些字符: ( ) [ ] { }, a,b,c... x,yz + * 使用堆栈检查字符串s中的括号是不是成对出现的。 + * 例如s = "([e{d}f])" , 则该字符串中的括号是成对出现, 该方法返回true + * 如果 s = "([b{x]y})", 则该字符串中的括号不是成对出现的, 该方法返回false; + * + * ( 40 ) 41 [ 91 ] 93 {123 }125 + * @param s + * @return + */ + public static boolean isValidPairs(String s){ + if(s == null || s.length() == 0) + return true; + Stack stack = new Stack(); + char[] chars = s.toCharArray(); + for(int i=0;i queue1 = new LinkedList(); + Queue queue2 = new LinkedList(); + + public void push(int data) { + queue1.add(data); + } + + public int pop() { + while(queue1.size() > 1){ + queue2.add(queue1.poll()); + } + queue1.addAll(queue2); + return queue1.poll(); + } + + public static void main(String[] args) { + StackWithTwoQueues s = new StackWithTwoQueues(); + for (int i = 0; i < 5; i++) { + s.push(i); + } + System.out.println(s.pop()); + System.out.println(s.pop()); + System.out.println(s.pop()); + System.out.println(s.pop()); + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..2173d65b5a --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,108 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + int front; + int rear; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + checkInBound(); + data[front++] = o; + } + + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + checkOutBound(front); + Object o = data[--front]; + data[front] = null; + return o; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + checkOutBound(front); + return data[front-1]; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + checkInBound(); + data[data.length-rear-1] = o; + rear++; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + checkOutBound(rear); + int index = data.length-rear; + Object o = data[index]; + data[index] = null; + rear--; + return o; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + checkOutBound(rear); + return data[data.length-rear]; + } + + private Object[] resize(int len) { + int newLen = len * 2; + Object[] newData = new Object[newLen]; + if(front > 0){ + System.arraycopy(data, 0, newData, 0, front); + } + if(rear > 0){ + System.arraycopy(data, len-rear, newData, newLen-rear, rear); + } + return newData; + } + + private void checkOutBound(int index){ + if(index <= 0){ + throw new IndexOutOfBoundsException(); + } + } + + private void checkInBound() { + if((front+rear) >= data.length){ + data = resize(data.length); + } + } + + public static void main(String[] args) { + TwoStackInOneArray t = new TwoStackInOneArray(); + for(int i=0;i<25;i++){ + t.push1(i); + t.push2(i); + } + System.out.println(t.front+t.rear); + for(int i=0;i 1){ +// doAddOrSubOps(numStack, opStack); +// } +// return new Float((String)numStack.pop()); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + + if(opStack.isEmpty()){ + + opStack.push(token); + } else{ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + + + return numStack.pop().floatValue(); + } + + /** + * 多个加减 + * @param numStack + * @param opStack + */ + private void doAddOrSubOps(Stack numStack, Stack opStack) { + Stack calStack = new Stack(); + while(numStack.size() > 1){ + calStack.push(numStack.pop()); + calStack.push(opStack.pop()); + } + float num1 = new Float((String)numStack.pop()); + float num2; + while(calStack.size() > 0){ + String op = (String)calStack.pop(); + num2 = new Float((String)calStack.pop()); + if("+".equals(op)){ + num1 += num2; + }else{ + num1 -= num2; + } + } + numStack.push(num1 + ""); + } + + /** + * 单个乘除 + * @param numStack + * @param op + */ + private void doMulOrDivOp(Stack numStack, String op){ + float num2 = new Float((String)numStack.pop()); + float num1 = new Float((String)numStack.pop()); + String result = null; + if("*".equals(op)){ + result = (num1 * num2) + ""; + }else{ + result = (num1 / num2) + ""; + } + numStack.push(result); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..1d679bdb32 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..a518e43c13 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,44 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + // 3*20+12*5-40/2 --> 3 20 * 12 5 * + 40 2 / - + // 10-30+50 --> 10 30 - 50 + + List ret = new ArrayList<>(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + Stack opStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + ret.add(token); + }else{ + while(!opStack.isEmpty() && opStack.peek().hasHigherPriority(token)){ + ret.add(opStack.pop()); + } + opStack.push(token); + } + } + while(!opStack.isEmpty()){ + ret.add(opStack.pop()); + } + return ret; + } + + public static String toString(List tokens){ + StringBuilder sb = new StringBuilder(); + for(Token token : tokens){ + sb.append(token.value); + } + return sb.toString(); + } + + public static void main(String[] args) { + System.out.println(toString(convert("10-30+50"))); + System.out.println(toString(convert("3*20+12*5-40/2"))); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..d4af19f583 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,62 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + Stack numStack = new Stack<>(); + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + for(Token token : tokens) { + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + }else{ + String op = token.value; + float num2 = numStack.pop(); + float num1 = numStack.pop(); + float result = calculate(op, num1, num2); + numStack.push(result); + } + } + return numStack.pop(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + private void reverse(Stack s){ + Stack tmp = new Stack(); + int len = s.size(); + for(int i=0;i i) { + tmp.push(s.pop()); + } + s.push(top); + while(tmp.size() > 0){ + s.push(tmp.pop()); + } + } + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..ad2b6dfd69 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,42 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 6*(3+5+(2+3)*8) + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..b5264d1362 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,85 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + int preContinueOp = 0; + int preContinueNum = 0; + for(Token token : tokens){ + if(token.isOperator()) { + opStack.push(token); + if(preContinueNum > 0){ + preContinueNum = 0; + preContinueOp = 1; + }else{ + preContinueOp++; + } + }else{ + numStack.push(new Float(token.getIntValue())); + preContinueNum++; + } + if(preContinueNum >= 2 && preContinueOp > 0){ + float num2 = numStack.pop(); + float num1 = numStack.pop(); + float result = calculate(opStack.pop().value, num1, num2); + numStack.push(result); + preContinueNum--; + preContinueOp--; + } + } + if(!opStack.isEmpty()){ + reverse(numStack); + } + while(!opStack.isEmpty()) { + String op = opStack.pop().value; + float num1 = numStack.pop(); + float num2 = numStack.pop(); + float result = calculate(op, num1, num2); + numStack.push(result); + } + return numStack.pop(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + private void reverse(Stack s){ + Stack tmp = new Stack(); + int len = s.size(); + for(int i=0;i i) { + tmp.push(s.pop()); + } + s.push(top); + while(tmp.size() > 0){ + s.push(tmp.pop()); + } + } + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..bf62a9df26 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,64 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + if(isBlank(c)){ + i++; + continue; + } + else if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } + + private boolean isBlank(char c){ + return c == 32; + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java b/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java new file mode 100644 index 0000000000..2de0c4370d --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/Palindrome.java @@ -0,0 +1,82 @@ +package com.coding.me; + +/** + * 回文 + * + */ +public class Palindrome { + + private static String oddCase(char[] chars, int index) { + int maxLength = 1; + int i = 1; + while((index - i) >= 0 && (index + i) < chars.length - 1){ + if(chars[index - i] != chars[index + i]){ + break; + } + maxLength += 2; + i++; + } + return String.valueOf(chars, index + 1 - i, maxLength); + } + + private static String evenCase(char[] chars, int index) { + int maxLength = 0; + int i = 0; + while((index - i) >= 0 && (index + 1 + i) <= chars.length - 1){ + if(chars[index - i] != chars[index + 1 + i]){ + break; + } + i++; + maxLength += 2; + } + return String.valueOf(chars, index + 1 - i, maxLength); + } + + public static String findLongestPalindrome(String s){ + char[] chars = s.toCharArray(); + String longestPalindrome = ""; + String tmp = ""; + for(int i=0;i= 10){ + carry = 1; + sum -= 10; + }else{ + carry = 0; + } + if(ret == null){ + ret = new ListNode(sum); + first = ret; + }else{ + ret.next = new ListNode(sum); + ret = ret.next; + } + if(l1 != null){ + l1 = l1.next; + } + if(l2 != null){ + l2 = l2.next; + } + } + if(carry > 0){ + ret.next = new ListNode(carry); + } + return first; + } + + public ListNode leetcodeSolution(ListNode l1, ListNode l2) { + ListNode dummyHead = new ListNode(0); + ListNode p = l1, q = l2, curr = dummyHead; + int carry = 0; + while (p != null || q != null) { + int x = (p != null) ? p.val : 0; + int y = (q != null) ? q.val : 0; + int sum = carry + x + y; + carry = sum / 10; + curr.next = new ListNode(sum % 10); + curr = curr.next; + if (p != null) p = p.next; + if (q != null) q = q.next; + } + if (carry > 0) { + curr.next = new ListNode(carry); + } + return dummyHead.next; + } + + public static void main(String[] args) { + ListNode l11 = new ListNode(2); + ListNode l12 = new ListNode(4); + ListNode l13 = new ListNode(3); + l11.next = l12; + l12.next = l13; + + ListNode l21 = new ListNode(5); + ListNode l22 = new ListNode(6); + ListNode l23 = new ListNode(4); + l21.next = l22; + l22.next = l23; + + ListNode ret = new AddTwoNums().mySolution(l11, l21); + while(ret != null){ + System.out.println(ret.val); + ret = ret.next; + } + } +} + +class ListNode { + int val; + ListNode next; + ListNode(int x) { val = x; } +} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java new file mode 100644 index 0000000000..910241063f --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/LongestCommonPrefix.java @@ -0,0 +1,223 @@ +package com.coding.me.leetcode.algorithms; + +/** + * Write a function to find the longest common prefix string amongst an array of strings. + * ["a", "b"] return "" + * ["a", "a"] return "a" + * ["ac", "ac", "a", "a"] return "a" + * + */ +public class LongestCommonPrefix { + + public static String mySolution(String[] strs){ + if(strs.length == 0) return ""; + char[] chars = strs[0].toCharArray(); + int count = chars.length; + if(count == 0) return ""; + char[] tmp; + for(int i = 1;i set = new HashSet<>(); + for (int i = start; i < end; i++) { + Character ch = s.charAt(i); + if (set.contains(ch)) return false; + set.add(ch); + } + return true; + } + + /** + * Sliding Window + * The naive approach is very straightforward. But it is too slow. So how + * can we optimize it? + * + * In the naive approaches, we repeatedly check a substring to see if it has + * duplicate character. But it is unnecessary. If a substring S​ij ​​ from + * index i i to j 1 j−1 is already checked to have no duplicate characters. + * We only need to check if s[j] is already in the substring S​ij ​​ . + * + * To check if a character is already in the substring, we can scan the + * substring, which leads to an O(n^2) algorithm. But we can do better. + * + * By using HashSet as a sliding window, checking if a character in the + * current can be done in O 1 O(1). + * + * A sliding window is an abstract concept commonly used in array/string + * problems. A window is a range of elements in the array/string which + * usually defined by the start and end indices, i.e. i j [i,j) + * (left-closed, right-open). A sliding window is a window "slides" its two + * boundaries to the certain direction. For example, if we slide i j [i,j) + * to the right by 1 1 element, then it becomes i 1 j 1 [i+1,j+1) + * (left-closed, right-open). + * + * Back to our problem. We use HashSet to store the characters in current + * window i j [i,j) ( j i j=i initially). Then we slide the index j j to the + * right. If it is not in the HashSet, we slide j j further. Doing so until + * s[j] is already in the HashSet. At this point, we found the maximum size + * of substrings without duplicate characters start with index i i. If we do + * this for all i i, we get our answer. + * + * Time complexity : O(2n)=O(n). In the worst case each character will be + * visited twice by i and j. + * + * Space complexity : O(min(m,n)). Same as the previous approach. We need + * O(k) space for the sliding window, where k is the size of the Set. The + * size of the Set is upper bounded by the size of the string n n and the + * size of the charset/alphabet m m. + * + * @param s + * @return + */ + public int leetcodeSolution2(String s) { + int n = s.length(); + Set set = new HashSet<>(); + int ans = 0, i = 0, j = 0; + while (i < n && j < n) { + // try to extend the range [i, j] + if (!set.contains(s.charAt(j))){ + set.add(s.charAt(j++)); + ans = Math.max(ans, j - i); + } + else { + set.remove(s.charAt(i++)); + } + } + return ans; + } + + /** + * Sliding Window Optimized + * + * The above solution requires at most 2n steps. In fact, it could be + * optimized to require only n steps. Instead of using a set to tell if a + * character exists or not, we could define a mapping of the characters to + * its index. Then we can skip the characters immediately when we found a + * repeated character. + * + * The reason is that if s[j] have a duplicate in the range [i,j) + * with index j ​′ ​​ , we don't need to increase i little by little. + * We can skip all the elements in the range [i,j ​′ ​​ ] and let i i + * to be j ​′+1 directly. + * + * @param s + * @return + */ + public int leetCodeSolution3(String s){ + int n = s.length(), ans = 0; + Map map = new HashMap<>(); // current index of character + // try to extend the range [i, j] + for (int j = 0, i = 0; j < n; j++) { + if (map.containsKey(s.charAt(j))) { + i = Math.max(map.get(s.charAt(j)), i); + } + ans = Math.max(ans, j - i + 1); + map.put(s.charAt(j), j + 1); + } + return ans; + } + + /** + * Java (Assuming ASCII 128) + * + * The previous implements all have no assumption on the charset of the + * string s. + * + * If we know that the charset is rather small, we can replace the Map with + * an integer array as direct access table. + * + * Commonly used tables are: + * + * int[26] for Letters 'a' - 'z' or 'A' - 'Z' + * int[128] for ASCII + * int[256] for Extended ASCII + * + * @param s + * @return + */ + public int leetCodeSolution4(String s) { + int n = s.length(), ans = 0; + int[] index = new int[128]; // current index of character + // try to extend the range [i, j] + for (int j = 0, i = 0; j < n; j++) { + i = Math.max(index[s.charAt(j)], i); + ans = Math.max(ans, j - i + 1); + index[s.charAt(j)] = j + 1; + } + return ans; + } + + + private LongestSubstringWithoutRepeatingCharacters lswrc; + @Before + public void setup(){ + lswrc = new LongestSubstringWithoutRepeatingCharacters(); + } + + @Test + public void testMySolution(){ + Assert.assertEquals(3, lswrc.mySolution("abcabcbb")); + Assert.assertEquals(4, lswrc.mySolution("abcdabcdbbd")); + } + + @Test + public void testLeetcodeSolution3(){ + Assert.assertEquals(3, lswrc.leetCodeSolution3("abcabcbb")); + Assert.assertEquals(4, lswrc.leetCodeSolution3("abcdabcdbbd")); + } + + @Test + public void testLeetcodeSolution4(){ + Assert.assertEquals(3, lswrc.leetCodeSolution4("abcabcbb")); +// Assert.assertEquals(4, lswrc.leetCodeSolution4("abcdabcdbbd")); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java new file mode 100644 index 0000000000..b80850e24a --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/MedianOfTwoSortedArrays.java @@ -0,0 +1,102 @@ +package com.coding.me.leetcode.algorithms; + +import org.junit.Before; +import org.junit.Test; + +/** + * There are two sorted arrays nums1 and nums2 of size m and n respectively. + * + * Find the median of the two sorted arrays. The overall run time complexity + * should be O(log (m+n)). + * + * Example 1: nums1 = [1, 3] nums2 = [2] + * + * The median is 2.0 Example 2: nums1 = [1, 2] nums2 = [3, 4] + * + * The median is (2 + 3)/2 = 2.5 + * + * @author hewj + * + */ +public class MedianOfTwoSortedArrays { + + public double mySolution(int[] nums1, int[] nums2) { + int[] nums = new int[nums1.length + nums2.length]; + int mid = nums.length/2; + int remain = nums.length%2; + int i=0,j=0; + int a,b; + int k=0; + while(i n) + return findKthSmallest(b, n, begin2, a, m, begin1, k); + if (m == 0) + return b[begin2 + k - 1]; + if (k == 1) + return Integer.min(a[begin1], b[begin2]); + int partA = Integer.min(k / 2, m), partB = k - partA; + if (a[begin1 + partA - 1] == b[begin2 + partB - 1]) + return a[begin1 + partA - 1]; + else if (a[begin1 + partA - 1] > b[begin2 + partB - 1]) + return findKthSmallest(a, m, begin1, b, n - partB, begin2 + partB, k - partB); + else + return findKthSmallest(a, m - partA, begin1 + partA, b, n, begin2, k - partA); + + } + + private MedianOfTwoSortedArrays motsa; + + @Before + public void setup(){ + motsa = new MedianOfTwoSortedArrays(); + } + + @Test + public void testMySolution(){ + int[] nums1 = {2}; + int[] nums2 = {1,3}; + System.out.println(motsa.mySolution(nums1, nums2)); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java new file mode 100644 index 0000000000..8821941630 --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/OptimalDivision.java @@ -0,0 +1,76 @@ +package com.coding.me.leetcode.algorithms; + +/** + * Given a list of positive integers, the adjacent integers will perform the + * float division. For example, [2,3,4] -> 2 / 3 / 4. + * + * However, you can add any number of parenthesis at any position to change the + * priority of operations. You should find out how to add parenthesis to get the + * maximum result, and return the corresponding expression in string format. + * Your expression should NOT contain redundant parenthesis. + * + * Example: Input: [1000,100,10,2] Output: "1000/(100/10/2)" Explanation: + * 1000/(100/10/2) = 1000/((100/10)/2) = 200 However, the bold parenthesis in + * "1000/((100/10)/2)" are redundant, since they don't influence the operation + * priority. So you should return "1000/(100/10/2)". + * + * Other cases: 1000/(100/10)/2 = 50 1000/(100/(10/2)) = 50 1000/100/10/2 = 0.5 + * 1000/100/(10/2) = 2 Note: + * + * The length of the input array is [1, 10]. Elements in the given array will be + * in range [2, 1000]. There is only one optimal division for each test case. + * + * @author hewj + * + */ +public class OptimalDivision { + + public static String mySolution(int[] nums) { + if(nums.length == 0 || nums.length > 10) { + return ""; + } + if(nums.length == 1) { + return "" + nums[0]; + } + straightInsertionSort(nums); + StringBuilder sb = new StringBuilder(); + sb.append(nums[0]).append("/"); + if(nums.length == 2){ + sb.append(nums[1]); + }else{ + sb.append("("); + for(int k=1;k lList = new ArrayList<>(); + for(int i=0;i 1 || lList.size() > 2){ + return false; + } + } + return true; + } + + public static void main(String[] args) { + System.out.println(mySolution("LPLPLPLPLPL")); + } +} diff --git a/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java new file mode 100644 index 0000000000..d91eb869fb --- /dev/null +++ b/group23/1028361767/data-structure/src/com/coding/me/leetcode/algorithms/TwoSum.java @@ -0,0 +1,102 @@ +package com.coding.me.leetcode.algorithms; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Given an array of integers, return indices of the two numbers such that + * they add up to a specific target. + * + * You may assume that each input would have exactly one solution, and you + * may not use the same element twice. + * + * Example: Given nums = [2, 7, 11, 15], target = 9, + * + * Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1]. Subscribe to see + * which companies asked this question. + */ +public class TwoSum { + /** + * Time complexity : O(n^2) + * Space complexity : O(1) + * @param nums + * @param target + * @return + */ + public int[] mySolution(int[] nums, int target) { + int[] ret = new int[2]; + for(int i=0;i map = new HashMap<>(); + for (int i = 0; i < nums.length; i++) { + map.put(nums[i], i); + } + for (int i = 0; i < nums.length; i++) { + int complement = target - nums[i]; + if (map.containsKey(complement) && map.get(complement) != i) { + return new int[] { i, map.get(complement) }; + } + } + throw new IllegalArgumentException("No two sum solution"); + } + + /** + * one pass hash table + * Time complexity : O(n) + * Space complexity : O(n) + * @param nums + * @param target + * @return + */ + public int[] leetCodeSolution2(int[] nums, int target) { + Map map = new HashMap<>(); + for (int i = 0; i < nums.length; i++) { + int complement = target - nums[i]; + if (map.containsKey(complement)) { + return new int[] { map.get(complement), i }; + } + map.put(nums[i], i); + } + throw new IllegalArgumentException("No two sum solution"); + } + + + public static void main(String[] args) throws InterruptedException { +// String s = new String("字符串在内存中"); + List s = new ArrayList(); + s.add(new Object()); + WeakReference wr = new WeakReference(s.get(0)); + +// Thread.sleep(500); + System.out.println(wr.get()); + + s.remove(0); + System.gc(); + + System.out.println(wr.get()); +// Thread.sleep(500); +// System.out.println(wr.get()); + } +} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java new file mode 100644 index 0000000000..791157d0d6 --- /dev/null +++ b/group23/1028361767/data-structure/src/test/com/coding/basic/TestArrayList.java @@ -0,0 +1,61 @@ +package test.com.coding.basic; + +import org.junit.Assert; +import org.junit.Test; + +import com.coding.basic.array.ArrayList; + +public class TestArrayList { + + @Test + public void testAdd() { + ArrayList list = new ArrayList(); + int i = 0; + for (; i < 1000; i++) { + list.add(new Object()); + } + Assert.assertTrue(list.size() == i); + } + + @Test + public void testGet() { + ArrayList list = new ArrayList(); + int i = 0; + for (; i < 10; i++) { + list.add(new Object()); + } + Assert.assertFalse(list.get(5) == null); + try { + list.get(10); + Assert.assertTrue(false); + } catch (IndexOutOfBoundsException e) { + Assert.assertTrue(true); + } + } + + @Test + public void testAddWithIndex() { + ArrayList list = new ArrayList(); + int i = 0; + for (; i < 10; i++) { + list.add(new Object()); + } + Object obj = list.get(5); + list.add(5, new Object()); + Assert.assertTrue(list.size() == (i + 1)); + Assert.assertTrue(obj == list.get(6)); + } + + @Test + public void testRemove() { + ArrayList list = new ArrayList(); + int i = 0; + for (; i < 10; i++) { + list.add(i); + } + Object tempObj = list.get(5); + Assert.assertTrue(tempObj == list.remove(5)); + Assert.assertTrue(list.size() == (i - 1)); + Assert.assertTrue((int) list.get(list.size() - 1) == (i - 1)); + } +} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java new file mode 100644 index 0000000000..a137ceffb8 --- /dev/null +++ b/group23/1028361767/data-structure/src/test/com/coding/basic/TestBinaryTreeNode.java @@ -0,0 +1,37 @@ +package test.com.coding.basic; + +import com.coding.basic.BinaryTreeNode; +import org.junit.Test; + +public class TestBinaryTreeNode { + + @Test + public void testInsert() { + BinaryTreeNode binaryTree = new BinaryTreeNode(5); + binaryTree.insert(2); + binaryTree.insert(7); + binaryTree.insert(1); + binaryTree.insert(6); + + printNode(binaryTree); + + binaryTree.insert(4); + binaryTree.insert(8); + + System.out.println("*************************"); + printNode(binaryTree); + } + + private void printNode(BinaryTreeNode node) { + System.out.print("node's data is " + node.getDataIntVal()); + System.out.println(" ,node's parent' data is " + (node.getParent() == null ? "null" : node.getParent().getDataIntVal())); + if (node.getLeft() != null) { + System.out.println("find left child node."); + printNode(node.getLeft()); + } + if (node.getRight() != null) { + System.out.println("find right child node."); + printNode(node.getRight()); + } + } +} diff --git a/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java b/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java new file mode 100644 index 0000000000..3a4a79ba0d --- /dev/null +++ b/group23/1028361767/data-structure/src/test/com/coding/basic/TestLinkedList.java @@ -0,0 +1,176 @@ +package test.com.coding.basic; + +import static org.junit.Assert.fail; + +import org.junit.Assert; +import org.junit.Test; + +import com.coding.basic.linklist.LinkedList; + +public class TestLinkedList { + + @Test + public void testReverse(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.reverse(); + Assert.assertEquals("10,7,3", list.toString()); + Assert.assertEquals("10", list.get(0).toString()); + } + + @Test + public void testRemoveFirstHalf(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.add(12); + list.add(15); + list.removeFirstHalf(); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,12,15", list.toString()); + Assert.assertEquals(3, list.size()); + } + + @Test + public void testRemoveByLength(){ + LinkedList list = new LinkedList(); + list.add(3); + list.add(7); + list.add(10); + list.add(12); + list.add(15); + list.remove(0, 2); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,12,15", list.toString()); + Assert.assertEquals(3, list.size()); + + list.remove(1, 1); + Assert.assertEquals("10", list.get(0).toString()); + Assert.assertEquals("10,15", list.toString()); + Assert.assertEquals(2, list.size()); + } + + @Test + public void testGetElements(){ + LinkedList list = new LinkedList(); + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + + LinkedList indices = new LinkedList(); + indices.add(1); + indices.add(3); + indices.add(4); + indices.add(6); + int[] elements = list.getElements(indices); + StringBuilder sb = new StringBuilder(); + for(int i=0;i System.out.println("runnable with no argument."); + Thread thread = new Thread(noArg); + thread.start(); + + ActionListener oneArg = event -> System.out.println("actionListener with one argument."); + + Runnable multiStatement = () -> { + System.out.println("Runnable with multi statement."); + System.out.println("Hello Java8!"); + }; + BinaryOperator add = (x, y) -> x + y; + BinaryOperator addExplicit = (Long x, Long y) -> x + y; + + String name = "abc"; + name = "def"; + //ActionListener oneArg1 = event -> System.out.println("actionListener with one argument." + name); + // 编译无法通过:方法块中使用的变量必须使用final声明或既成事实的final变量,即变成赋值成功后不能再赋值 + + + Predicate atLeast5 = x -> x > 5; + System.out.println(atLeast5.test(6)); + +// BinaryOperator addE = (x,y) -> x + y;//编译不通过 + BinaryOperator addLongs = (x,y) -> x + y; + + } + + interface IntPred { + boolean test(Integer value); + } + interface A { + boolean check(Predicate predicate); + boolean check(IntPred predicate); + } +} diff --git a/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java b/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java new file mode 100644 index 0000000000..c6d60e339c --- /dev/null +++ b/group23/1028361767/learn-spring/src/practise/chapter1/HelloService.java @@ -0,0 +1,35 @@ +package practise.chapter1; + +import java.util.List; + +public class HelloService { + + private String target; + + private List targets; + + public HelloService(String target){ + this.target = target; + } + + public String say(){ + return "hello " + this.target; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + + public List getTargets() { + return targets; + } + + public void setTargets(List targets) { + this.targets = targets; + } + +} diff --git a/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java b/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java new file mode 100644 index 0000000000..390a7b7e68 --- /dev/null +++ b/group23/1028361767/learn-spring/src/practise/chapter1/HelloWorldService.java @@ -0,0 +1,9 @@ +package practise.chapter1; + +public class HelloWorldService { + + public String hello(){ + System.out.println("Hello Spring!"); + return "hello"; + } +} diff --git a/group23/1028361767/learn-spring/src/test/practise/Test1.java b/group23/1028361767/learn-spring/src/test/practise/Test1.java new file mode 100644 index 0000000000..7867ac294d --- /dev/null +++ b/group23/1028361767/learn-spring/src/test/practise/Test1.java @@ -0,0 +1,39 @@ +package test.practise; + +import org.junit.Assert; +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import practise.chapter1.HelloService; +import practise.chapter1.HelloWorldService; + +public class Test1 { + + ApplicationContext context = new ClassPathXmlApplicationContext("practise/chapter1.xml"); + + @Test + public void testHello(){ + HelloWorldService helloWorldService = context.getBean("helloWorldService", HelloWorldService.class); + Assert.assertEquals("hello", helloWorldService.hello()); + HelloWorldService helloWorldService1 = context.getBean("helloWorldService1", HelloWorldService.class); + Assert.assertEquals("hello", helloWorldService1.hello()); + HelloWorldService helloWorldService2 = context.getBean("helloWorldService2", HelloWorldService.class); + Assert.assertEquals("hello", helloWorldService2.hello()); + String[] alias = context.getAliases("helloWorldService"); + Assert.assertEquals(2, alias.length); + for(String alia : alias){ + System.out.println(alia); + } + } + + @Test + public void testSay(){ + HelloService helloService = context.getBean("helloService", HelloService.class); + Assert.assertEquals("hello spring3", helloService.say()); + for(String target : helloService.getTargets()){ + System.out.println(target); + } + Assert.assertEquals(3, helloService.getTargets().size()); + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..e5d5e522ee --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,89 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code, ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + + String code = iter.nextUxToHexString(codeLen); + ByteCodeCommand[] commands = CommandParser.parse(clzFile, code); + + CodeAttr attr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, commands); + int expTableLen = iter.nextU2ToInt(); + if(expTableLen > 0){ + String expTable = iter.nextUxToHexString(expTableLen); + System.out.println("expTable: " + expTable); + // TODO 异常表处理 + } + int subAttrCount = iter.nextU2ToInt(); + ConstantPool pool = clzFile.getConstantPool(); + for (int i = 1; i <= subAttrCount; i++) { + int subAttrNameIndex = iter.nextU2ToInt(); + String subAttrName = pool.getUTF8String(subAttrNameIndex); + iter.back(2); + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + attr.setLineNumberTable(LineNumberTable.parse(iter)); + }else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + attr.setLocalVariableTable(LocalVariableTable.parse(iter)); + }else if(AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + attr.setStackMapTable(StackMapTable.parse(iter)); + }else{ + //TODO + throw new RuntimeException("CodeAttr.parse not implement " + subAttrName); + } + } + return attr; + } + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java new file mode 100644 index 0000000000..f83202d6c3 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/attr/LineNumberTable.java @@ -0,0 +1,51 @@ +package com.coderising.jvm.attr; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LineNumberTable extends AttributeInfo { + List items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LineNumberTable table = new LineNumberTable(attrNameIndex, attrLen); + int lineNumberTableLen = iter.nextU2ToInt(); + for(int i=0;i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LocalVariableTable table = new LocalVariableTable(attrNameIndex, attrLen); + int localVarLen = iter.nextU2ToInt(); + for(int i=0;i fields = new ArrayList<>(); + private List methods = new ArrayList<>(); + + + public ConstantPool getPool() { + return pool; + } + public void setPool(ConstantPool pool) { + this.pool = pool; + } + public List getMethods() { + return methods; + } + public void setMethods(List methods) { + this.methods = methods; + } + public void setClzIndex(ClassIndex clzIndex) { + this.clzIndex = clzIndex; + } + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + public List getFields() { + return fields; + } + public void setFields(List fields) { + this.fields = fields; + } + + public Method getMethod(String methodName, String paramAndReturnType){ + for(Method m : this.methods){ + String mName = this.getConstantPool().getUTF8String(m.getNameIndex()); + String pAndRT = this.getConstantPool().getUTF8String(m.getDescriptorIndex()); + if(methodName.equals(mName) + && paramAndReturnType.equals(pAndRT)){ + return m; + } + } + + return null; + } + public Method getMainMethod(){ + + return getMethod("main", "([Ljava/lang/String;)V"); + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..fca703c59a --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,138 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + List cmds = new ArrayList<>(); + CommandIterator iter = new CommandIterator(codes); + while(iter.hasNext()){ + String opCode = iter.next2CharAsString().toUpperCase(); + if(new_object.equals(opCode)){ + NewObjectCmd newObjCmd = new NewObjectCmd(clzFile, opCode); + newObjCmd.setOprand1(iter.next2CharAsInt()); + newObjCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(newObjCmd); + }else if(getfield.equals(opCode)){ + GetFieldCmd getFieldCmd = new GetFieldCmd(clzFile, opCode); + getFieldCmd.setOprand1(iter.next2CharAsInt()); + getFieldCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(getFieldCmd); + }else if(getstatic.equals(opCode)){ + GetStaticFieldCmd getStaticFieldCmd = new GetStaticFieldCmd(clzFile, opCode); + getStaticFieldCmd.setOprand1(iter.next2CharAsInt()); + getStaticFieldCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(getStaticFieldCmd); + }else if(putfield.equals(opCode)){ + PutFieldCmd putFieldCmd = new PutFieldCmd(clzFile, opCode); + putFieldCmd.setOprand1(iter.next2CharAsInt()); + putFieldCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(putFieldCmd); + }else if(invokevirtual.equals(opCode)){ + InvokeVirtualCmd invokeVirtualCmd = new InvokeVirtualCmd(clzFile, opCode); + invokeVirtualCmd.setOprand1(iter.next2CharAsInt()); + invokeVirtualCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(invokeVirtualCmd); + }else if(invokespecial.equals(opCode)){ + InvokeSpecialCmd invokeSpecialCmd = new InvokeSpecialCmd(clzFile, opCode); + invokeSpecialCmd.setOprand1(iter.next2CharAsInt()); + invokeSpecialCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(invokeSpecialCmd); + }else if(ldc.equals(opCode)){ + LdcCmd ldcCmd = new LdcCmd(clzFile, opCode); + ldcCmd.setOperand(iter.next2CharAsInt()); + cmds.add(ldcCmd); + }else if(bipush.equals(opCode)){ + BiPushCmd biPushCmd = new BiPushCmd(clzFile, opCode); + biPushCmd.setOperand(iter.next2CharAsInt()); + cmds.add(biPushCmd); + }else if(dup.equals(opCode) || aload_0.equals(opCode) + || aload_1.equals(opCode) || aload_2.equals(opCode) + || astore_1.equals(opCode) || voidreturn.equals(opCode) + || iload.equals(opCode) || iload_1.equals(opCode) + || iload_2.equals(opCode) || iload_3.equals(opCode)){ + NoOperandCmd noOpCmd = new NoOperandCmd(clzFile, opCode); + cmds.add(noOpCmd); + }else{ + throw new RuntimeException("cmd " + opCode + " has not bean implemented yet."); + } + } + calcuateOffset(cmds); + ByteCodeCommand[] byteCodeCmds = new ByteCodeCommand[cmds.size()]; + return cmds.toArray(byteCodeCmds); + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..92ac5b67eb --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..8d4fc6f0de --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,41 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor { + void visitClassInfo(ClassInfo classInfo); + void visitFieldRefInfo(FieldRefInfo fieldRefInfo); + void visitMethodRefInfo(MethodRefInfo methodRefInfo); + void visitNameAndTypeInfo(NameAndTypeInfo nameAndTypeInfo); + void visitNullConstantInfo(NullConstantInfo nullConstantInfo); + void visitStringInfo(StringInfo stringInfo); + void visitUTF8Info(UTF8Info utf8Info); + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..93506b1e20 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..cb31499dd3 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRefInfo(this); + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..466b06f9ea --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRefInfo(this); + } + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..c13d8c4fc6 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,50 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndTypeInfo(this); + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..655c273621 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + visitor.visitNullConstantInfo(this); + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..84ae36c4ca --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,31 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitStringInfo(this); + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..7c4aeb1861 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,36 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visitUTF8Info(this); + } + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..01a009331c --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,45 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descriptorIndex = iter.nextU2ToInt(); + Field field = new Field(accessFlag, nameIndex, descriptorIndex, pool); + int attCount = iter.nextU2ToInt(); + if(attCount > 0){ + //TODO handle field attrs + throw new RuntimeException("Field.attr not implements"); + } + return field; + } + + public String toString() { + return pool.getUTF8String(nameIndex) + ":" + pool.getUTF8String(descriptorIndex); + } + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..c0c4598800 --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,69 @@ +package com.coderising.jvm.loader; + +import java.io.UnsupportedEncodingException; + +public class ByteCodeIterator { + + private byte[] codes; + private int pos; + + public ByteCodeIterator(byte[] codes){ + this.codes = codes; + } + + public byte[] nextU2(){ return new byte[]{codes[pos++], codes[pos++]};} + + public byte[] nextU4(){ return new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]};} + + public int nextU1ToInt() { + return (codes[pos++] & 0xff); + } + + public int nextU2ToInt() { + return ((codes[pos++] & 0xff00) << 8) | (codes[pos++] & 0x00ff); + } + + public int nextU4ToInt() { + return ((codes[pos++] & 0xff000000) << 24) | ((codes[pos++] & 0x00ff0000) << 16) + | ((codes[pos++] & 0x0000ff00) << 8) | (codes[pos++] & 0x000000ff) ; + } + + public String nextUxToHexString(int len) { + StringBuffer buffer = new StringBuffer(); + for(int i=0;i 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; + } + + public ClassFile loadClass(String className) { + byte[] codes = this.readBinaryCode(className); + ClassFileParser parser = new ClassFileParser(); + return parser.parse(codes); + + } + + public void addClassPath(String path) { + if(clzPaths.contains(path)) + return ; + clzPaths.add(path); + } + + + + public String getClassPath(){ + StringBuilder sb = new StringBuilder(); + for(String clzPath : clzPaths){ + sb.append(clzPath).append(";"); + } + return sb.length() == 0?"":sb.substring(0, sb.length()-1); + } + + private byte[] loadClassFile(String clzFileName) { + + BufferedInputStream bis = null; + + try { + + File f = new File(clzFileName); + + + bis = new BufferedInputStream(new FileInputStream(f)); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + + byte[] buffer = new byte[1024]; + int length = -1; + + while((length = bis.read(buffer)) != -1){ + bos.write(buffer, 0, length); + } + + byte [] codes = bos.toByteArray(); + + return codes; + + } catch(IOException e){ + e.printStackTrace(); + + } finally{ + if(bis != null){ + try { + bis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + + +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java new file mode 100644 index 0000000000..3a6258e26b --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/loader/ClassFileParser.java @@ -0,0 +1,134 @@ +package com.coderising.jvm.loader; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.AccessFlag; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.NullConstantInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFileParser { + + public ClassFile parse(byte[] codes) { + ClassFile classFile = new ClassFile(); + ByteCodeIterator iter = new ByteCodeIterator(codes); + +// String magicNumber = iter.nextUxToHexString(4); + iter.nextUxToHexString(4); + + classFile.setMinorVersion(iter.nextU2ToInt()); + classFile.setMajorVersion(iter.nextU2ToInt()); + + ConstantPool pool = parseConstantPool(iter); + classFile.setConstPool(pool); + + classFile.setAccessFlag(parseAccessFlag(iter)); + + classFile.setClassIndex(parseClassInfex(iter)); + + parseInterfaces(iter); + + classFile.setFields(prarseField(iter, pool)); + classFile.setMethods(parseMethod(iter, classFile)); + return classFile; + } + + private List parseMethod(ByteCodeIterator iter, ClassFile classFile) { + List methods = new ArrayList<>(); + int mthodsCount = iter.nextU2ToInt(); + for(int i=0;i prarseField(ByteCodeIterator iter, ConstantPool pool) { + List fields = new ArrayList<>(); + int fieldsCount = iter.nextU2ToInt(); + 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } +} diff --git a/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java b/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group23/1028361767/mini-jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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;isize||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + + if(sizesize||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + + return elementData[index]; + + } + + public Object remove(int index){ + if(index>size||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + Object revalue = elementData[index]; + Object[] dest = new Object[elementData.length]; + System.arraycopy(elementData, 0, dest, 0, index); + System.arraycopy(elementData, index+1, dest, index, elementData.length-1-index); + elementData = dest; + size--; + return revalue; + } + + public int size(){ + return size; + } + + public Iterator iterator(){ + iterator = new ArrayListIterator(this); + return iterator; + } + +} diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java new file mode 100644 index 0000000000..345d620c0e --- /dev/null +++ b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/ArrayListIterator.java @@ -0,0 +1,25 @@ +package com.skomefen.list; + +public class ArrayListIterator implements Iterator { + private ArrayList array = null; + private int index = 0; + public ArrayListIterator(ArrayList array) { + this.array = array; + } + public boolean hasNext() { + if(array==null){ + return false; + } + if(indexsize||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + insertoflist(index, o); + + + } + public Object get(int index){ + if(index>=size||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + if(head==null){ + return null; + } + if(index==point){ + return node.data; + } + this.point=0; + node = head; + while(index>=this.point){ + + if(index==point){ + return node.data; + } + point++; + node = node.next; + } + return null; + } + public Object remove(int index){ + if(index>=size||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + size--; + if(index==(this.point+1)){ + Object o =node.next.data; + node.next = node.next.next; + return o; + } + this.point = 0; + if(index==0){ + head = head.next; + Object o =head.data; + node = head; + return o; + } + + Object o = null; + while(index<=(this.point+1)){ + if(index==(this.point+1)){ + o =node.next.data; + node.next = node.next.next; + + } + point++; + node = node.next; + } + return o; + } + + public int size(){ + + return size; + } + + public void addFirst(Object o){ + add(0,o); + } + public void addLast(Object o){ + add(size,o); + } + public Object removeFirst(){ + if(head==null){ + return null; + } + remove(0); + return null; + } + public Object removeLast(){ + if(head==null){ + return null; + } + remove(size-1); + return null; + } + public Iterator iterator(){ + iterator = new LinkedListiterator(this); + return iterator; + } + + + private static class Node{ + private Object data; + private Node next; + + + } + + private void insertoflist(int index,Object o){ + + if(index>size||index<0){ + throw new IndexOutOfBoundsException("index:"+index+"size:"+size); + } + + if(head==null){ + head = new Node(); + head.data=o; + head.next=new Node(); + size++; + node = head; + this.point = 0; + return; + } + if(index==(this.point+1)){ + pointlast(index, o); + return; + } + //head不等于空,先从head顺序往下找 + this.point = 0; + if(index == this.point){ + Node next = head; + head = new Node(); + head.next = next; + head.data = o; + node = head;//当前节点为head + this.point = index; + size++; + return; + } + do{ + if(index==(this.point+1)){ + pointlast(index, o); + return; + } + node = node.next; + this.point++; + }while(index>(this.point+1)); + + } + + private void pointlast(int index, Object o) { + if(index==(this.point+1)){ + if(index==size){//index插入List结尾 + this.point = this.point+1; + node = node.next; + node.data=o; + node.next = new Node(); + size++; + return; + } + this.point = this.point+1; + Node next = node.next;//从上一个node获取下一个node + node.next = new Node();//上一个节点指向新建节点 + node = node.next;//获取新建节点 + node.data=o;//新建节点获取值 + node.next = next;//新建节点指向下一个节点 + size++; + return; + } + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java new file mode 100644 index 0000000000..c04de32a93 --- /dev/null +++ b/group23/1072760797-skomefen/day3-11/src/com/skomefen/list/LinkedListiterator.java @@ -0,0 +1,25 @@ +package com.skomefen.list; + +public class LinkedListiterator implements Iterator { + + private LinkedList link = null; + private int index = 0; + public LinkedListiterator(LinkedList link) { + this.link = link; + } + public boolean hasNext() { + if(link==null){ + return false; + } + if(index params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + + View view = Struts.runAction(actionName,params); + + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一�? + + + View view = Struts.runAction(actionName,params); + + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..66024b0ccf --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,65 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + private Connection conn; + private int startPos; + private int endPos; + private byte[] b = null; + private static Lock lock = new ReentrantLock(); + private static int index=0; + + static FileOutputStream file = null; + static{ + try { + file = new FileOutputStream(new File("e://readme.txt")); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + try { + this.b = conn.read(startPos, endPos); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new RuntimeException(); + }finally{ + conn.close(); + } + + } + public void run(){ + if(lock.tryLock()){ + if(index==startPos){ + try { + if (file!=null) { + file.write(b); + } + index=endPos+1; + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(); + } + + }else{ + lock.unlock(); + } + } + } +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..ed4a1cf9a1 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,89 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + if(length%3==0){ + for(int i=1;i<=3;i++){ + int startPos = length/3*i-1; + int endPos = length/3*(i-1); + new DownloadThread(conn, endPos, startPos).start(); + } + }else{ + for(int i=1;i<=2;i++){ + + int startPos = length/3*(i-1); + int endPos = length/3*i-1; + new DownloadThread(conn, startPos, endPos).start(); + } + int startPos = length/3*2; + new DownloadThread(conn, startPos, length).start(); + } + + listener.notifyFinished(); + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..ce99026d2b --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,58 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..3982b8e310 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/Connection.java @@ -0,0 +1,24 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + * + */ + public void close(); +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..ae639d2651 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,143 @@ +package com.coderising.download.impl; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + private String url = null; + private InputStream in = null; + + + public ConnectionImpl(String url) { + this.url = url; + + + } + + public byte[] read(int startPos, int endPos) throws IOException { + + try { + if(url==null||url.trim()==""){ + return null; + } + + URL u = new URL(url); + in = u.openStream(); + + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + if(in==null){ + return null; + } + byte[] read = insert(startPos, endPos); + + return read; + } + + private byte[] insert(int startPos, int endPos) throws IOException { + byte[] b = new byte[1024]; + int len = 0; + int index = 0; + byte[] read = new byte[endPos-startPos+1]; + + while((len=in.read(b))>0){ + if((index+1024)<=startPos){ + index+=1024; + continue; + } + + if(index<=startPos&&startPos<(index+1024)){ + + if(endPos<(index+1024)){ + for(int i=0,j=startPos-index;i0){ + count+=len; + } + Assert.assertEquals(count, conn.getContentLength()); + + } + + + @Test + public void testClose() { + conn.close(); + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java new file mode 100644 index 0000000000..589c1bf1d2 --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/junit/test/ConnectionManagerImplTest.java @@ -0,0 +1,31 @@ +package junit.test; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.impl.ConnectionImpl; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class ConnectionManagerImplTest { + + @Before + public void setUp() throws Exception { + } + + + @Test + public void testOpen() throws ConnectionException { + ConnectionManager cm = new ConnectionManagerImpl(); + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + Connection conn = cm.open(url); + } + +} diff --git a/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java b/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java new file mode 100644 index 0000000000..5ae230e97b --- /dev/null +++ b/group23/1072760797-skomefen/day3-26/src/junit/test/DownloadThreadTest.java @@ -0,0 +1,77 @@ +package junit.test; + +import static org.junit.Assert.*; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; + + + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.DownloadThread; +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class DownloadThreadTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void testRun() throws ConnectionException, IOException { + ConnectionManager cm = new ConnectionManagerImpl(); + String url = "http://localhost:8080/TimeCapsule/readme.txt"; + Connection conn = cm.open(url); + DownloadThread dt = new DownloadThread(conn, 0, conn.getContentLength()); + dt.start(); + + File file = new File("e://readme.txt"); + FileInputStream in = new FileInputStream(file); + byte[] b = new byte[10]; + int len = 0; + ArrayList a = new ArrayList(); + while((len=in.read(b))>0){ + a.add(b); + } + + int length = conn.getContentLength(); + if(length%3==0){ + for(int i=1;i<=3;i++){ + int startPos = length/3*i-1; + int endPos = length/3*(i-1); + new DownloadThread(conn, endPos, startPos).start(); + } + }else{ + for(int i=1;i<=2;i++){ + + int startPos = length/3*(i-1); + int endPos = length/3*i-1; + new DownloadThread(conn, startPos, endPos).start(); + } + int startPos = length/3*2; + new DownloadThread(conn, startPos, length).start(); + } + + file = new File("e://readme.txt"); + in = new FileInputStream(file); + b = new byte[10]; + len = 0; + ArrayList a1 = new ArrayList(); + while((len=in.read(b))>0){ + a1.add(b); + } + for(int i = 0;isize || index < 0||index == size) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + Object temp = elementData; + elementData=grow(elementData,1); // Increments modCount!! + System.arraycopy(temp, index, elementData, index + 1, + size - index); + elementData[index] = o; + } + + public Object get(int index){ + size(); + if (index > size || index < 0 ||index == size) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + return elementData[index]; + } + + public Object remove(int index){ + size(); + if (index > size || index < 0 ||index == size) + throw new IndexOutOfBoundsException( + "Index: "+index+", Size: "+size); + Object tempData = elementData[index]; + System.arraycopy(elementData, index+1, elementData, index, + size - index); + return tempData; + } + + public int size(){ + for(int i=0;i= size) + throw new NoSuchElementException(); + Object[] elementData = ArrayList.this.elementData; + if (i >= elementData.length) + throw new ConcurrentModificationException(); + cursor = i + 1; + return elementData[lastRet = i]; + } + + +} + + + +} diff --git a/group23/1246614258/src/com/coding/datastructs/Iterator.java b/group23/1246614258/src/com/coding/datastructs/Iterator.java new file mode 100644 index 0000000000..56acec15a3 --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.datastructs; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/1246614258/src/com/coding/datastructs/LinkedList.java b/group23/1246614258/src/com/coding/datastructs/LinkedList.java new file mode 100644 index 0000000000..cd5de44121 --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/LinkedList.java @@ -0,0 +1,229 @@ +package com.coding.datastructs; + +public class LinkedList implements List{ + + private Node head; + private int size ; + + public LinkedList() { + size = 0; + head=new Node(); + } + + public void add(Object o) { + Node pnew = new Node(); + pnew.setData(o); + pnew.next = null; + if(null==head.getNext()){ + head.setNext(pnew); + return; + } + Node ptr = head.getNext(); + Node ptr1 = new Node(); + + while (ptr != null) { + ptr1 = ptr; + ptr = ptr.getNext(); + } + ptr1.next = pnew; + + } + + public void add(int index, Object o) { + size(); + if (index > size || index < 0) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + Node ptr; + Node ptemp = new Node(); + ; + Node pnew;// ʵ½ڵ + ptr = head.getNext(); + int i = 0; + if (ptr == null && size == 0) { + System.out.println("ʧܣ"); + } + while (ptr != null) { + ptemp = ptr; + if (index == 0) { + pnew = new Node(); + pnew.setData(o); + pnew.setNext(ptr); + head.setNext(pnew); + break; + } + if (index == i && index > 0) { + ptemp = getNode(i-1); + pnew = new Node(); + pnew.setData(o); + pnew.setNext(ptr); + ptemp.setNext(pnew);// + System.out.println("" + o + "ɹ"); + break; + } + ptr = ptr.getNext(); + i++; + } + if (ptr == null && size > 0) { + pnew = new Node(); + pnew.setData(o); + pnew.setNext(null); + ptemp.setNext(pnew);// + System.out.println("" + o + "ɹ"); + } + + } + + public Object get(int index) { + size(); + if (index > size || index < 0 || index == size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + Node ptr = head.getNext(); + Object tempData = null; + int i = 0; + while (ptr != null) { + if (index == i) { + tempData = ptr.getData(); + } + ptr = ptr.getNext(); + i++; + } + + return tempData; + } + + public Node getNode(int index) { + size(); + if (index > size || index < 0 || index == size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + Node ptr = head.getNext(); + Node tempData = null; + int i = 0; + while (ptr != null) { + if (index == i) { + tempData = ptr; + } + ptr = ptr.getNext(); + i++; + } + + return tempData; + } + + public Object remove(int index) { + size(); + if(size()==0){ + throw new NullPointerException("listڲΪգɾ"); + } + if (index > size || index < 0 || index == size) + throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + + size); + Node ptr = head.getNext(); + Node ptrNext = new Node(); + Object tempData = null; + int i = 0; + while (ptr != null) { + if (index == 0) { + ptrNext = ptr.getNext(); + head.setNext(ptrNext); + break; + } + if (index == i && index > 0) { + Node ptrprevious = getNode(i - 1); + tempData = ptr.getData(); + ptrprevious.setNext(ptr.getNext()); + break; + } + ptr = ptr.getNext(); + i++; + } + return tempData; + } + + public int size() { + int i = 0; + Node ptr = head.getNext(); + while (ptr != null) { + ptr = ptr.getNext(); + i++; + } + size = i; + return size; + } + + public void addFirst(Object o) { + add(0,o); + + } + + public void addLast(Object o) { + /*Node ptr = head.getNext(); + Node pnew = new Node(); + pnew.setData(o); + Node ptemp = new Node(); + if (ptr == null) { + head.setNext(pnew); + } else { + while (ptr != null) { + ptemp = ptr; + ptr = ptr.getNext(); + } + if (ptr == null) { + ptemp.setNext(pnew); + } + }*/ + add(size(),o); + + } + + public Object removeFirst() { + Node ptr = head.getNext(); + Object temp = null; + if (ptr == null) { + throw new NullPointerException("LinkedListݣܽɾ"); + } else { + temp = ptr.getData(); + remove(0); + } + + return temp; + } + + public Object removeLast() { + size(); + Node ptr = head.getNext(); + Object temp = null; + if (ptr == null) { + throw new NullPointerException("LinkedListݣܽɾ"); + } else { + temp = remove(size - 1); + } + + return temp; + } + + private static class Node { + Object data; + Node next; + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public Node getNext() { + return next; + } + + public void setNext(Node next) { + this.next = next; + } + + } + +} diff --git a/group23/1246614258/src/com/coding/datastructs/List.java b/group23/1246614258/src/com/coding/datastructs/List.java new file mode 100644 index 0000000000..35ece31ca6 --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/List.java @@ -0,0 +1,9 @@ +package com.coding.datastructs; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/1246614258/src/com/coding/datastructs/MyIterator.java b/group23/1246614258/src/com/coding/datastructs/MyIterator.java new file mode 100644 index 0000000000..be827a7875 --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/MyIterator.java @@ -0,0 +1,35 @@ +package com.coding.datastructs; + +import java.util.Iterator; + +public class MyIterator { + public Iterator iterator(){ + return null; + } + private class Itera implements Iterator{ + int cursor; + int lastRet = -1; + + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object next() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void remove() { + // TODO Auto-generated method stub + + } + + + + } + +} diff --git a/group23/1246614258/src/com/coding/datastructs/Queue.java b/group23/1246614258/src/com/coding/datastructs/Queue.java new file mode 100644 index 0000000000..4e36db418a --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/Queue.java @@ -0,0 +1,30 @@ +package com.coding.datastructs; + public class Queue{ + private LinkedList list = new LinkedList(); + + public void enQueue(Object o){ + list.add(o); + } + + public Object deQueue(){ + if (list.size()<=0) { + throw new NullPointerException("Queueݣܽɾ"); + } + Object o = list.get(0); + list.removeFirst(); + return o; + } + + public boolean isEmpty(){ + int count = size(); + if(count<0){ + return true; + } + return false; + } + + public int size(){ + return list.size(); + } + } + diff --git a/group23/1246614258/src/com/coding/datastructs/Stack.java b/group23/1246614258/src/com/coding/datastructs/Stack.java new file mode 100644 index 0000000000..269f3c900e --- /dev/null +++ b/group23/1246614258/src/com/coding/datastructs/Stack.java @@ -0,0 +1,33 @@ +package com.coding.datastructs; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + if (elementData.size()<=0) { + throw new NullPointerException("Stackݣܽɾ"); + } + Object data = elementData.get(elementData.size()-1); + elementData.remove(size()-1); + return data; + } + + public Object peek(){ + Object data = elementData.get(elementData.size()-1); + return data; + } + public boolean isEmpty(){ + if(elementData.size()>0){ + return false; + }else{ + return false; + } + } + public int size(){ + return elementData.size(); + } +} diff --git a/group23/1246614258/src/com/coding/test/ArrayListTest.java b/group23/1246614258/src/com/coding/test/ArrayListTest.java new file mode 100644 index 0000000000..76ba571c78 --- /dev/null +++ b/group23/1246614258/src/com/coding/test/ArrayListTest.java @@ -0,0 +1,32 @@ +package com.coding.test; +import com.coding.datastructs.ArrayList; +import com.coding.datastructs.Iterator; + + +public class ArrayListTest { + + /** + *

    Description:

    + * @param args + * @author:Wilson huang + * @date 2017-3-1212:08:10 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + ArrayList aa = new ArrayList(); + aa.add("aa"); + aa.add("bb"); + aa.add("cc"); + //aa.remove(3); + aa.add(2, "44"); + for(int i=0;iDescription:

    + * @param args + * @author:Wilson huang + * @date 2017-3-121:45:58 + */ + + public static void main(String[] args) { + // TODO Auto-generated method stub + LinkedList list = new LinkedList(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + list.removeLast(); + for(int i=0;iDescription:

    + * @param args + * @author:Wilson huang + * @date 2017-3-122:42:15 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + Queue q = new Queue(); + q.enQueue("a"); + q.enQueue("b"); + System.out.println(q.deQueue()); + + } + +} diff --git a/group23/1246614258/src/com/coding/test/StackTest.java b/group23/1246614258/src/com/coding/test/StackTest.java new file mode 100644 index 0000000000..41f2a15b5b --- /dev/null +++ b/group23/1246614258/src/com/coding/test/StackTest.java @@ -0,0 +1,25 @@ +package com.coding.test; +import com.coding.datastructs.Stack; + + +public class StackTest { + + /** + *

    Description:

    + * @param args + * @author:Wilson huang + * @date 2017-3-122:34:15 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + Stack a = new Stack(); + a.push("a"); + a.push("b"); + a.push("c"); + System.out.println(a.isEmpty()); + System.out.println(a.peek()); + System.out.println(a.pop()); + + } + +} diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" new file mode 100644 index 0000000000..ff773dffcc --- /dev/null +++ "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/DataStructsTest/src/com/coding/datastructs/ArrayUtil.java" @@ -0,0 +1,141 @@ +/** + * + */ +package com.coding.datastructs; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + + +public class ArrayUtil { + + + public void reverseArray(int[] origin){ + for (int i=0; i temp = new HashSet(); + for(Integer i : newArray) + temp.add(i); + for (int i = 0; i < temp.size(); i++) { + newArray[i]=(int)temp.toArray()[i]; + } + Arrays.sort(Arrays.copyOfRange(newArray, 0, temp.size())); + return Arrays.copyOfRange(newArray, 0, temp.size()); + } + + public int[] grow(int [] oldArray, int size){ + int[] target = new int[oldArray.length+size]; + System.arraycopy(oldArray, 0, target, 0, oldArray.length); + return target; + } + + + public int[] fibonacci(int max){ + ArrayList list = new ArrayList(); + list.add(1); + list.add(1); + if(max<=1){ + return new int[0]; + } + for (int i = 2; i < max; i++) { + int a = list.get(i-1)+list.get(i-2); + if(a list = new ArrayList(); + int j=1; + for(int i=2;i<100;i++){ + j=i; + while(j>0){ + if(i%j==0&&i!=j&&j!=1){ + break; + }else{ + j--; + } + } + if(j==0){ + list.add(i); + } + } + int[] newArray = new int[list.size()]; + for(int i=0;i list = new ArrayList(); + for(int i = 1; i < max; i++) + { + int sum = 0; + for(int j = 1; j < i; j++) + { + if(i % j == 0) + { + sum = sum + j; + } + } + if(sum == i) + { + list.add(i); + } + } + int[] newArray = new int[list.size()]; + for(int i=0;i parameters) { + + + View view = new View(); + Map> array = new HashMap>(); + Map params = new HashMap(); + Map classData = new HashMap(); + try { + analysisXml(classData,array); + Map jspData = array.get(actionName); + String s = "ԲݹactionNameûжӦclass࣬Ҫ´"; + if (!classData.containsKey(actionName)) { + throw new ClassNotFoundException(s); + } + + Class class1 = Class.forName(classData.get(actionName)); + LoginAction login = (LoginAction) class1.newInstance(); + for (String ss : parameters.keySet()) { + Method[] methos1 = class1.getMethods(); + for (int i = 0; i < methos1.length; i++) { + if (("set" + ss.substring(0, 1).toUpperCase() + ss + .substring(1)).equals(methos1[i].getName())) { + methos1[i].invoke(login, parameters.get(ss)); + break; + + } + } + } + + Method method1 = class1.getMethod("execute"); + String result = (String) method1.invoke(login); + if(null!=result){ + view.setJsp(jspData.get(result)); + } + Method[] methos2 = class1.getMethods(); + for (int i = 0; i < methos2.length; i++) { + if(methos2[i].getName().substring(0, 3).equals("get")){ + Object value1 = (Object) (methos2[i].invoke(login)); + String name1 = methos2[i].getName(); + params.put(name1.substring(3, 4).toLowerCase()+name1.substring(4), value1); + } + } + view.setParameters(params); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return view; + } + + + public static void analysisXml(Map xmlData,Map> array) { + try { + + String dirpath = System.getProperty("user.dir"); + String xmlFile = dirpath + "/WebContent/WEB-INF/etc/struts.xml"; + SAXBuilder builder = new SAXBuilder(); + Document doc = builder.build(new File(xmlFile)); + Element xRoot = doc.getRootElement(); + List actions = getChildren(xRoot, "action"); + for (int i = 0; i < actions.size(); i++) { + Element e = (Element) actions.get(i); + String actionName1 = getAttributeValue(e, "name"); + String className = getAttributeValue(e, "class"); + xmlData.put(actionName1, className); + List results = getChildren(e, "result"); + Map jspData = new HashMap(); + for (int j = 0; j < results.size(); j++) { + Element result = (Element) results.get(j); + String jspUrl = getValue(result); + String resultName = getAttributeValue(result, "name"); + jspData.put(resultName, jspUrl); + array.put(actionName1, jspData); + } + } + + // /StrutsDemo/WebContent/WEB-INF/etc/struts.xml + } catch (Exception e) { + e.printStackTrace(); + } + } + + + public static Element getChild(Element element, String sonMark) { + return element == null ? null : element.getChild(sonMark); + } + + + public static List getChildren(Element element, String sonMark) { + return element == null ? null : element.getChildren(sonMark); + } + + + public static String getValue(Element element) { + return element == null ? "" : element.getValue(); + } + + + public static String getAttributeValue(Element element, String attribute) { + return element == null ? null : element.getAttributeValue(attribute); + } + +} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" new file mode 100644 index 0000000000..52f08f3652 --- /dev/null +++ "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/StrutsTest.java" @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //ԤIJһ + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} \ No newline at end of file diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" new file mode 100644 index 0000000000..d7bcd36d42 --- /dev/null +++ "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/Test.java" @@ -0,0 +1,94 @@ +/** + * + */ +package com.coderising.litestruts; + +import java.io.BufferedReader; +import java.io.File; +import java.io.StringReader; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.input.SAXBuilder; + +/** + * Title: + * Description: + * @author HuangLiang + * @201731710:55:39 + * + */ +public class Test { + + /**Description: + * @param args + * @author HuangLiang 2017317 10:55:39 + */ + public static void main(String[] args) { + // TODO Auto-generated method stub + String name1 = "getName"; + System.out.println(name1.substring(3, 4).toLowerCase()+name1.substring(4)); + try { + Class class1 = Class.forName("com.coderising.litestruts.LoginAction"); + Method[] methos1 = class1.getMethods(); + for(int i=0;i para[] = methos1[i].getParameterTypes(); + throw new ClassNotFoundException(); + } + System.out.println(""); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + /** + * ȡXMLӱǩ + * + * @param element + * ǩڵ + * @param sonMark + * ӱǩ + * @return + */ + public static Element getChild(Element element, String sonMark) { + return element == null ? null : element.getChild(sonMark); + } + + /** + * ȡXMLӱǩ + * + * @param element + * ǩڵ + * @param sonMark + * ӱǩ + * @return + */ + public static List getChildren(Element element, String sonMark) { + return element == null ? null : element.getChildren(sonMark); + } + + /** + * s ȡXMLǩֵ + * + * @param element + * @return + */ + public static String getValue(Element element) { + return element == null ? "" : element.getValue(); + } + /** + * s ȡXMLֵ + * + * @param element + * @return + */ + public static String getAttributeValue(Element element, String attribute) { + return element == null ? null : element.getAttributeValue(attribute); + } + +} diff --git "a/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" new file mode 100644 index 0000000000..f68a8c438b --- /dev/null +++ "b/group23/1246614258/\347\254\254\344\272\214\346\254\241\344\275\234\344\270\232/StrutsDemo/src/com/coderising/litestruts/View.java" @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java new file mode 100644 index 0000000000..fd6f80a806 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/ArrayList.java @@ -0,0 +1,82 @@ +package main; + +import java.util.Arrays; + +import utils.ListUtils; + +public class ArrayList implements List { + private Object[] elementData = new Object[10]; + private int size; + + @Override + public void add(Object o) { + add(size, o); + + } + + @Override + public void add(int index, Object o) { + // 检查是否越界 + ListUtils.CheckIndexInRange(0, size, index); + if (size == elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length + 10); + } + if (index < size) { + for (int i = size; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + } + elementData[index] = o; + size++; + } + + @Override + public Object remove(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Object tag = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size - 1] = null; + size--; + return tag; + + } + + @Override + public Object get(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + return elementData[index]; + + } + + @Override + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + private int cursor; + + @Override + public boolean hasNext() { + if (size > 0) { + return cursor < size; + } else { + return false; + } + + } + + @Override + public Object next() { + Object tag = get(cursor); + cursor++; + return tag; + } + }; + + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java new file mode 100644 index 0000000000..b67a56b5a7 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/BinaryTreeNode.java @@ -0,0 +1,65 @@ +package main; + +public class BinaryTreeNode { + @SuppressWarnings("rawtypes") + private Comparable data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + @SuppressWarnings("rawtypes") + public BinaryTreeNode(Comparable data, BinaryTreeNode left, BinaryTreeNode right) { + this.data = data; + this.left = left; + this.right = right; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public BinaryTreeNode insert(Comparable o) { + int result = o.compareTo(data); + if (0 == result) { + return this; + } else if (0 < result) { + if (null == this.right) { + BinaryTreeNode node = new BinaryTreeNode(o, null, null); + this.right = node; + return node; + } + return this.right.insert(o); + } else { + if (null == this.left) { + BinaryTreeNode node = new BinaryTreeNode(o, null, null); + this.left = node; + return node; + } + return this.left.insert(o); + } + + } + + @SuppressWarnings("rawtypes") + public Comparable getData() { + return data; + } + + @SuppressWarnings("rawtypes") + public void setData(Comparable data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java new file mode 100644 index 0000000000..166a6181e3 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Iterator.java @@ -0,0 +1,6 @@ +package main; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java new file mode 100644 index 0000000000..a6d82a0545 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/LinkedList.java @@ -0,0 +1,114 @@ +package main; + +import utils.ListUtils; + +public class LinkedList implements List { + private Node head; + private int size; + + private static class Node { + private Object data; + private Node next; + } + + @Override + public void add(Object o) { + add(size, o); + } + + @Override + public void add(int index, Object o) { + ListUtils.CheckIndexInRange(0, size, index); + if (0==size) { + head = new Node(); + head.data = o; + size++; + return; + } + if (0 == index) { + Node node = new Node(); + node.data = o; + node.next = head; + head = node; + size++; + return; + } + if (index == size) { + Node node = head; + while (null != node.next) { + node = node.next; + } + Node addNode = new Node(); + addNode.data = o; + node.next = addNode; + size++; + return; + } + Node node = head; + for (int i = 0; i < index - 1; i++) { + node = node.next; + } + Node addNode = new Node(); + addNode.data = o; + addNode.next = node.next; + node.next = addNode; + size++; + } + + @Override + public Object remove(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Node node = head; + if (0 == index) { + head = head.next; + size--; + return node.data; + } + for (int i = 0; i < index - 1; i++) { + node = node.next; + } + Node removeNode = node.next; + node.next = removeNode.next; + size--; + return removeNode.data; + } + + @Override + public Object get(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + @Override + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + private int cursor; + + @Override + public boolean hasNext() { + if (size > 0) { + return cursor < size; + } else { + return false; + } + + } + + @Override + public Object next() { + Object tag = get(cursor); + cursor++; + return tag; + } + }; + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java new file mode 100644 index 0000000000..73e3865ed7 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/List.java @@ -0,0 +1,9 @@ +package main; + +public interface List { + public void add(Object o); + public void add(int index,Object o); + public Object remove(int index); + public Object get(int index); + public int size(); +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java new file mode 100644 index 0000000000..feebe25b99 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Queue.java @@ -0,0 +1,22 @@ +package main; + +public class Queue { + private LinkedList list = new LinkedList(); + + public void enQueue(Object o) { + list.add(o); + } + + public Object deQueue() { + return list.remove(0); + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java new file mode 100644 index 0000000000..a584680425 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/main/Stack.java @@ -0,0 +1,25 @@ +package main; + +public class Stack { + private ArrayList list = new ArrayList(); + + public void push(Object o) { + list.add(o); + } + + public Object pop() { + return list.remove(list.size() - 1); + } + + public Object peek() { + return list.get(list.size() - 1); + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java new file mode 100644 index 0000000000..f9f67e86f0 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/ArrayListTest.java @@ -0,0 +1,144 @@ +package test; + + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + + +import main.ArrayList; +import main.Iterator; + +public class ArrayListTest { + ArrayList list; + + @Before + public void init() { + list = new ArrayList(); + } + + @Test + public void testAddObject() { + list.add(0); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + list.add(7); + list.add(8); + list.add(9); + list.add(10); + assertEquals(0, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(2, list.get(2)); + + } + + @Test + public void testAddIntObject() { + list.add("b"); + list.add("d"); + list.add("e"); + list.add(0, "a"); + list.add(2, "c"); + list.add(5, "f"); + assertEquals("a", list.get(0)); + assertEquals("c", list.get(2)); + assertEquals("f", list.get(5)); + try { + list.add(-1, "hh"); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.add(7, "xx"); + fail("index should <=size"); + } catch (Exception e) { + } + + } + + @Test + public void testRemove() { + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + assertEquals("d", list.remove(3)); + assertEquals("a", list.remove(0)); + assertEquals("c", list.remove(1)); + try { + list.remove(-1); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.remove(1); + fail("index should <=size"); + } catch (Exception e) { + } + + } + + @Test + public void testGet() { + + list.add("a"); + assertEquals("a", list.get(0)); + + try { + list.get(-1); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.get(1); + fail("index should <=size"); + } catch (Exception e) { + } + + } + + @Test + public void testSize() { + list.add("a"); + assertEquals(1, list.size()); + list.remove(0); + assertEquals(0, list.size()); + } + + @Test + public void testIterator() { + Iterator i = list.iterator(); + assertEquals(0, list.size()); + assertFalse(i.hasNext()); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + i = list.iterator(); + assertTrue(i.hasNext()); + assertEquals("a", i.next()); + assertTrue(i.hasNext()); + assertEquals("b", i.next()); + assertTrue(i.hasNext()); + assertEquals("c", i.next()); + assertTrue(i.hasNext()); + assertEquals("d", i.next()); + assertFalse(i.hasNext()); + + try { + i.next(); + fail("index should <=size"); + } catch (Exception e) { + } + + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..9487991ba0 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/BinaryTreeNodeTest.java @@ -0,0 +1,25 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import main.BinaryTreeNode; + +public class BinaryTreeNodeTest { + + @Test + public void testInsert() { + BinaryTreeNode node = new BinaryTreeNode(5, null,null); + node.insert(2); + node.insert(7); + node.insert(7); + node.insert(1); + node.insert(6); + node.insert(4); + node.insert(8); + assertEquals(8, node.getRight().getRight().getData()); + assertEquals(4, node.getLeft().getRight().getData()); + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java new file mode 100644 index 0000000000..a4db15567d --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/LinkedListTest.java @@ -0,0 +1,126 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import main.Iterator; +import main.LinkedList; + +public class LinkedListTest { + private LinkedList list; + + @Before + public void init(){ + list = new LinkedList(); + } + + @Test + public void testAddObject() { + list.add(0); + list.add(1); + list.add(2); + assertEquals(0, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(2, list.get(2)); + } + + @Test + public void testAddIntObject() { + list.add("b"); + list.add("d"); + list.add("e"); + list.add(0, "a"); + list.add(2, "c"); + list.add(5, "f"); + assertEquals("a", list.get(0)); + assertEquals("c", list.get(2)); + assertEquals("f", list.get(5)); + try { + list.add(-1, "hh"); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.add(7, "xx"); + fail("index should <=size"); + } catch (Exception e) {} + } + + @Test + public void testRemove() { + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + assertEquals("d", list.remove(3)); + assertEquals("a", list.remove(0)); + assertEquals("c", list.remove(1)); + try { + list.remove(-1); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.remove(1); + fail("index should <=size"); + } catch (Exception e) { + } + + } + + @Test + public void testGet() { + + list.add("a"); + assertEquals("a", list.get(0)); + + try { + list.get(-1); + fail("-1 cann't be index"); + } catch (Exception e) { + } + + try { + list.get(1); + fail("index should <=size"); + } catch (Exception e) { + } + } + + @Test + public void testSize() { + list.add("a"); + assertEquals(1, list.size()); + list.remove(0); + assertEquals(0, list.size()); + } + + @Test + public void testIterator() { + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + Iterator i = list.iterator(); + assertTrue(i.hasNext()); + assertEquals("a", i.next()); + assertTrue(i.hasNext()); + assertEquals("b", i.next()); + assertTrue(i.hasNext()); + assertEquals("c", i.next()); + assertTrue(i.hasNext()); + assertEquals("d", i.next()); + assertFalse(i.hasNext()); + + try { + i.next(); + fail("index should <=size"); + } catch (Exception e) { + } + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java new file mode 100644 index 0000000000..be1feeb465 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/QueueTest.java @@ -0,0 +1,50 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import main.Queue; + +public class QueueTest { + private Queue queue; + + @Before + public void init(){ + queue = new Queue(); + } + + @Test + public void testEnQueue() { + } + + @Test + public void testDeQueue() { + try{ + queue.deQueue(); + fail("empty queue hasn't element"); + }catch (Exception e) { + } + queue.enQueue("a"); + queue.enQueue("b"); + assertEquals("a", queue.deQueue()); + assertEquals("b", queue.deQueue()); + } + + @Test + public void testIsEmpty() { + assertTrue(queue.isEmpty()); + queue.enQueue("a"); + assertFalse(queue.isEmpty()); + } + + @Test + public void testSize() { + assertEquals(0, queue.size()); + queue.enQueue("a"); + queue.enQueue("a"); + assertEquals(2, queue.size()); + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java new file mode 100644 index 0000000000..7b75a4d218 --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/test/StackTest.java @@ -0,0 +1,67 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import main.Stack; + +public class StackTest { + private Stack stack; + + @Before + public void init(){ + stack = new Stack(); + } + + @Test + public void testPush() { + stack.push("a"); + assertEquals("a", stack.peek()); + stack.push("b"); + assertEquals("b", stack.peek()); + } + + @Test + public void testPop() { + try{ + stack.pop(); + fail("empty stack hasn't element"); + }catch (Exception e) { + } + stack.push("a"); + stack.push("b"); + stack.push("c"); + assertEquals("c", stack.pop()); + assertEquals("b", stack.pop()); + assertEquals("a", stack.pop()); + } + + @Test + public void testPeek() { + } + + @Test + public void testIsEmpty() { + assertTrue(stack.isEmpty()); + stack.push("a"); + stack.push("b"); + assertFalse(stack.isEmpty()); + stack.pop(); + assertFalse(stack.isEmpty()); + stack.pop(); + assertTrue(stack.isEmpty()); + + + } + + @Test + public void testSize() { + assertEquals(0, stack.size()); + stack.push("a"); + stack.push("b"); + assertEquals(2, stack.size()); + } + +} diff --git a/group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java b/group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java new file mode 100644 index 0000000000..0fe8959b8a --- /dev/null +++ b/group23/1323434545/work_DataStructure/01_5BasicDS/src/utils/ListUtils.java @@ -0,0 +1,11 @@ +package utils; + +public class ListUtils { + public static boolean CheckIndexInRange(int start, int end, int index) { + if (index >= start && index <= end) { + return true; + } + throw new IndexOutOfBoundsException(); + } + +} diff --git a/group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java b/group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java new file mode 100644 index 0000000000..59670e0272 --- /dev/null +++ b/group23/1323434545/work_DataStructure/02_ArrayUtil/src/main/ArrayUtil.java @@ -0,0 +1,209 @@ +package main; + +import java.util.Arrays; + +public class ArrayUtil { + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public static void reverseArray(int[] origin) { + if (null == origin) { + return; + } + for (int temp = 0, i = 0; i < origin.length / 2; i++) { + temp = origin[i]; + origin[i] = origin[origin.length - i - 1]; + origin[origin.length - i - 1] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: {1,3,4,5,6,6,5,4,7,6,7,5} + * + * @param oldArray + * @param newArray + * @return + */ + + public static int[] removeZero(int[] oldArray) { + if (null == oldArray) { + return null; + } + int counter = 0; + int[] newArray = new int[oldArray.length]; + for (int i = 0; i < oldArray.length; i++) { + if (oldArray[i] != 0) { + newArray[counter++] = oldArray[i]; + } + } + return Arrays.copyOf(newArray, counter); + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = + * [3, 5, 7,8] a2 = [4, 5,6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * + * @param array1 + * @param array2 + * @return + */ + + public static int[] merge(int[] array1, int[] array2) { + if (null == array1) { + return array2; + } + if (null == array2) { + return array1; + } + if (0 == array1.length && 0 == array2.length) { + return new int[0]; + } + Arrays.sort(array1); + Arrays.sort(array2); + int[] array = new int[array1.length + array2.length]; + System.arraycopy(array1, 0, array, 0, array1.length); + System.arraycopy(array2, 0, array, array1.length, array2.length); + int counter = 0; + for (int i = 0; i < array.length - 1 - counter; i++) { + for (int j = i + 1; j < array.length - counter; j++) { + if (array[i] == array[j]) { + int k = 0; + for (k = i; k < array.length - 1; k++) { + array[k] = array[k + 1]; + } + i--; + counter++; + break; + } + } + } + array = Arrays.copyOf(array, array.length - counter); + Arrays.sort(array); + return array; + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public static int[] grow(int[] oldArray, int size) { + if (null == oldArray) { + return null; + } + int[] array = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + array[i] = oldArray[i]; + } + return array; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public static int[] fibonacci(int max) { + if (max <= 1) { + return new int[0]; + } + int[] array = new int[max]; + array[0] = 1; + array[1] = 1; + int i = 1; + do { + i++; + array[i] = array[i - 1] + array[i - 2]; + } while (array[i] < max); + return Arrays.copyOf(array, i); + } + + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public static int[] getPrimes(int max) { + if (max < 3) { + return new int[0]; + } + int[] array = new int[max]; + int counter = 0; + for (int i = 2; i < max; i++) { + int j = 2; + for (; j * j <= i; j++) { + if (i % j == 0) { + break; + } + } + if (j * j > i) { + array[counter] = i; + counter++; + } + } + return Arrays.copyOf(array, counter); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public static int[] getPerfectNumbers(int max) { + if (max < 7) { + return new int[0]; + } + int[] array = new int[2]; + int counter = 0; + for (int i = 6; i < max; i++) { + int sum = 0; + for (int j = 1; j <= i / 2; j++) { + if (i % j == 0) { + sum = sum + j; + } + } + if (sum == i) { + if (counter == array.length) { + array = ArrayUtil.grow(array, 2); + } + array[counter++] = i; + } + } + return Arrays.copyOf(array, counter); + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public static String join(int[] array, String seperator) { + if (null == array) { + return null; + } + if (array.length == 0) { + return ""; + } + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < array.length; i++) { + sb.append(seperator).append(array[i]); + } + return sb.toString().substring(seperator.length()); + } + +} diff --git a/group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java b/group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java new file mode 100644 index 0000000000..c87caa30c5 --- /dev/null +++ b/group23/1323434545/work_DataStructure/02_ArrayUtil/src/test/ArrayUtilTest.java @@ -0,0 +1,101 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import main.ArrayUtil; + +public class ArrayUtilTest { + @Test + public void testReverseArray() { + int[] origin = null; + ArrayUtil.reverseArray(origin); + assertEquals(null, origin); + + int[] origin1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + ArrayUtil.reverseArray(origin1); + int[] expected1 = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; + for (int i = 0; i < 4; i++) { + assertEquals(expected1[i], origin1[i]); + } + + int[] origin2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; + ArrayUtil.reverseArray(origin2); + int[] expected2 = { 8, 7, 6, 5, 4, 3, 2, 1, 0 }; + for (int i = 0; i < 4; i++) { + assertEquals(expected2[i], origin2[i]); + } + } + + @Test + public void testRemoveZero() { + int oldArr[] = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; + int excepted[] = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }; + oldArr = ArrayUtil.removeZero(oldArr); + System.out.println(oldArr.length); + for (int i = 0; i < oldArr.length; i++) { + assertEquals(excepted[i], oldArr[i]); + } + } + + @Test + public void testMerge() { + int[] array1 = { 3, 4, 4, 5, 7, 8 }; + int[] array2 = { 4, 5, 6, 7 }; + int[] expected = { 3, 4, 5, 6, 7, 8 }; + int[] array = ArrayUtil.merge(array1, array2); + for (int i = 0; i < array.length; i++) { + assertEquals(expected[i], array[i]); + } + } + + @Test + public void testGrow() { + int[] oldArray = { 2, 3, 6 }; + int[] array = ArrayUtil.grow(oldArray, 3); + int[] expected = { 2, 3, 6, 0, 0, 0 }; + for (int i = 0; i < array.length; i++) { + assertEquals(expected[i], array[i]); + } + } + + @Test + public void testFibonacci() { + int[] fibonacci = ArrayUtil.fibonacci(1); + assertEquals(0, fibonacci.length); + + int[] fibonacci1 = ArrayUtil.fibonacci(16); + int[] excepted1 = { 1, 1, 2, 3, 5, 8, 13, 15 }; + for (int i = 0; i < fibonacci1.length; i++) { + assertEquals(excepted1[i], fibonacci1[i]); + } + } + + @Test + public void testGetPrimes() { + int[] primes = ArrayUtil.getPrimes(23); + int[] excepted = { 2, 3, 5, 7, 11, 13, 17, 19 }; + for (int i = 0; i < primes.length; i++) { + assertEquals(excepted[i], primes[i]); + } + } + + @Test + public void testGetPerfectNumbers() { + int[] PerfectNumbers = ArrayUtil.getPerfectNumbers(497); + int[] excepted = { 6, 28, 496 }; + for (int i = 0; i < PerfectNumbers.length; i++) { + assertEquals(excepted[i], PerfectNumbers[i]); + } + } + + @Test + public void testJoin() { + int[] array1 = { 3 }; + assertEquals("3", ArrayUtil.join(array1, "-%")); + int[] array2 = { 3, 8, 9, 7 }; + assertEquals("3-%8-%9-%7", ArrayUtil.join(array2, "-%")); + } + +} diff --git a/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java new file mode 100644 index 0000000000..166a6181e3 --- /dev/null +++ b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/Iterator.java @@ -0,0 +1,6 @@ +package main; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java new file mode 100644 index 0000000000..96ffdd77a5 --- /dev/null +++ b/group23/1323434545/work_DataStructure/03_LinkedListOperations/src/main/LinkedList.java @@ -0,0 +1,256 @@ +package main; + +import java.util.Arrays; + +import utils.ListUtils; + +public class LinkedList implements List{ + private Node head; + private int size; + + private static class Node { + private Object data; + private Node next; + } + + @Override + public void add(Object o) { + add(size, o); + } + + @Override + public void add(int index, Object o) { + ListUtils.CheckIndexInRange(0, size, index); + if (0==size) { + head = new Node(); + head.data = o; + size++; + return; + } + if (0 == index) { + Node node = new Node(); + node.data = o; + node.next = head; + head = node; + size++; + return; + } + if (index == size) { + Node node = head; + while (null != node.next) { + node = node.next; + } + Node addNode = new Node(); + addNode.data = o; + node.next = addNode; + size++; + return; + } + Node node = head; + for (int i = 0; i < index - 1; i++) { + node = node.next; + } + Node addNode = new Node(); + addNode.data = o; + addNode.next = node.next; + node.next = addNode; + size++; + } + + @Override + public Object remove(int index) { + if(size == 0){ + return null; + } + ListUtils.CheckIndexInRange(0, size - 1, index); + Node node = head; + if (0 == index) { + head = head.next; + size--; + return node.data; + } + for (int i = 0; i < index - 1; i++) { + node = node.next; + } + Node removeNode = node.next; + node.next = removeNode.next; + size--; + return removeNode.data; + } + + @Override + public Object get(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + @Override + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + private int cursor; + + @Override + public boolean hasNext() { + if (size > 0) { + return cursor < size; + } else { + return false; + } + + } + + @Override + public Object next() { + Object tag = get(cursor); + cursor++; + return tag; + } + }; + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + if(this.size == 0){ + return; + } + LinkedList list = new LinkedList(); + for(int i =this.size-1;i>=0;i--){ + list.add(this.get(i)); + } + this.head = list.head; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf(){ + int end = size/2; + for(int i=0;isize){ + return; + } + for(int j =0;j101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + if(null==list||list.size==0){ + return new int[0]; + } + int[] result = new int[list.size]; + int counter = 0; + for(int i=0;imax){ + return; + } + for(int i=0;imin&&(int)get(i)= start && index <= end) { + return true; + } + throw new IndexOutOfBoundsException(); + } + +} diff --git a/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java b/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java new file mode 100644 index 0000000000..26a03c58f4 --- /dev/null +++ b/group23/1323434545/work_DataStructure/04_LRU/src/main/LRUPageFrame.java @@ -0,0 +1,117 @@ +package main; + +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.capacity = capacity; + this.currentSize = 0; + } + + /** + * 获取缓存中的对象 + * + * @param pageNum + */ + public void access(int pageNum) { + if (first == null && last == null) { + first = new Node(); + first.pageNum = pageNum; + last = first; + currentSize++; + return; + } + Node tagNode = find(pageNum); + if (tagNode != null) { + moveExistingNodeToHead(tagNode); + return; + } + Node node = new Node(); + node.pageNum = pageNum; + addNewNodeToHead(node); + + } + + private void addNewNodeToHead(Node node) { + if (currentSize == capacity) { + removeLast(); + } + Node temp = first; + temp.prev = node; + node.next = temp; + first = node; + 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 temp = last.prev; + temp.next = null; + last = temp; + currentSize--; + } + + /** + * 移动到表头,表示这个节点是最新使用过的 + */ + private void moveExistingNodeToHead(Node node) { + if (node.prev == null) { + return; + } + Node prev = node.prev; + Node next = node.next; + if (next == null) { + last = prev; + } + prev.next = next; + if (next != null) { + next.prev = prev; + } + Node temp = first; + temp.prev = node; + node.prev = null; + node.next = temp; + first = node; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + Node node = first; + while (node != null) { + sb.append(node.pageNum); + node = node.next; + if (node != null) { + sb.append(","); + } + } + return sb.toString(); + } + +} diff --git a/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java b/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java new file mode 100644 index 0000000000..e190a31b82 --- /dev/null +++ b/group23/1323434545/work_DataStructure/04_LRU/src/test/LRUPageFrameTest.java @@ -0,0 +1,35 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import main.LRUPageFrame; + +public class LRUPageFrameTest { + + @Test + public void testAccess() { + LRUPageFrame pf = new LRUPageFrame(3); + pf.access(7); + pf.access(0); + pf.access(1); + assertEquals("1,0,7", pf.toString()); + pf.access(2); + assertEquals("2,1,0", pf.toString()); + pf.access(0); + assertEquals("0,2,1", pf.toString()); + pf.access(0); + assertEquals("0,2,1", pf.toString()); + pf.access(3); + assertEquals("3,0,2", pf.toString()); + pf.access(0); + assertEquals("0,3,2", pf.toString()); + pf.access(4); + assertEquals("4,0,3", pf.toString()); + pf.access(5); + assertEquals("5,4,0", pf.toString()); + + } + +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java new file mode 100644 index 0000000000..3593756817 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ArrayList.java @@ -0,0 +1,75 @@ +package main; + +import java.util.Arrays; + +public class ArrayList{ + private Object[] elementData = new Object[10]; + private int size; + + public void add(Object o) { + add(size, o); + + } + + public void add(int index, Object o) { + // 检查是否越界 + ListUtils.CheckIndexInRange(0, size, index); + if (size == elementData.length) { + elementData = Arrays.copyOf(elementData, elementData.length + 10); + } + if (index < size) { + for (int i = size; i > index; i--) { + elementData[i] = elementData[i - 1]; + } + } + elementData[index] = o; + size++; + } + + public Object remove(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + Object tag = elementData[index]; + for (int i = index; i < size - 1; i++) { + elementData[i] = elementData[i + 1]; + } + elementData[size - 1] = null; + size--; + return tag; + + } + + public Object get(int index) { + ListUtils.CheckIndexInRange(0, size - 1, index); + return elementData[index]; + + } + + public int size() { + return size; + } + + public Iterator iterator() { + return new Iterator() { + private int cursor; + + @Override + public boolean hasNext() { + if (size > 0) { + return cursor < size; + } else { + return false; + } + + } + + @Override + public Object next() { + Object tag = get(cursor); + cursor++; + return tag; + } + }; + + } + +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java new file mode 100644 index 0000000000..166a6181e3 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Iterator.java @@ -0,0 +1,6 @@ +package main; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java new file mode 100644 index 0000000000..379e3b5a31 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/ListUtils.java @@ -0,0 +1,11 @@ +package main; + +public class ListUtils { + public static boolean CheckIndexInRange(int start, int end, int index) { + if (index >= start && index <= end) { + return true; + } + throw new IndexOutOfBoundsException(); + } + +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java new file mode 100644 index 0000000000..a584680425 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/Stack.java @@ -0,0 +1,25 @@ +package main; + +public class Stack { + private ArrayList list = new ArrayList(); + + public void push(Object o) { + list.add(o); + } + + public Object pop() { + return list.remove(list.size() - 1); + } + + public Object peek() { + return list.get(list.size() - 1); + } + + public boolean isEmpty() { + return list.size() == 0; + } + + public int size() { + return list.size(); + } +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java new file mode 100644 index 0000000000..125c9a0d72 --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/main/StackUtil.java @@ -0,0 +1,110 @@ +package main; + +import java.util.Arrays; + +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 stack1 = new Stack(); + while (!s.isEmpty()) { + stack1.push(s.pop()); + } + Stack stack2 = new Stack(); + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + while (!stack2.isEmpty()) { + s.push(stack2.pop()); + } + + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + Stack stack = new Stack(); + while (!s.isEmpty()) { + stack.push(s.pop()); + } + while (!stack.isEmpty()) { + Object temp = stack.pop(); + if (!o.equals(temp)) { + s.push(temp); + } + } + + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, + * 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + if (len < 0) { + return new Object[0]; + } + Object[] objArray = new Object[len]; + int i = 0; + for (; i < len; i++) { + if (s.isEmpty()) { + break; + } + objArray[i] = s.pop(); + } + objArray = Arrays.copyOf(objArray, i); + for (int j = objArray.length - 1; j >= 0; j--) { + s.push(objArray[j]); + } + return objArray; + } + + /** + * 字符串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) { + String[] array = s.split(""); + Stack stack = new Stack(); + for (String s1 : array) { + if ("{[()]}".contains(s1)) { + if (!stack.isEmpty()) { + if (")]}".contains(s1)) { + if (s1.replace(")", "(").equals(stack.peek().toString()) + || s1.replace("]", "[").equals(stack.peek().toString()) + || s1.replace("}", "{").equals(stack.peek().toString())) { + stack.pop(); + } else { + return false; + } + } else { + stack.push(s1); + } + } else { + if (")]}".contains(s1)) { + return false; + } + stack.push(s1); + } + } + } + if (stack.isEmpty()) { + return true; + } + return false; + } + +} diff --git a/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java b/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java new file mode 100644 index 0000000000..87cddd271b --- /dev/null +++ b/group23/1323434545/work_DataStructure/05_StackUtil/src/test/StackUtilTest.java @@ -0,0 +1,93 @@ +package test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import main.Stack; +import main.StackUtil; + +public class StackUtilTest { + Stack stack; + + @Before + public void setUp() throws Exception { + stack = new Stack(); + } + + @Test + public void testReverse() { + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + StackUtil.reverse(stack); + int[] expected = { 1, 2, 3, 4, 5 }; + for (int i = 0; !stack.isEmpty(); i++) { + assertEquals(expected[i], stack.pop()); + } + } + + @Test + public void testRemove() { + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + StackUtil.remove(stack, 9); + int[] expected = { 5, 4, 3, 2, 1 }; + for (int i = 0; !stack.isEmpty(); i++) { + assertEquals(expected[i], stack.pop()); + } + + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + StackUtil.remove(stack, 3); + int[] expected1 = { 5, 4, 2, 1 }; + for (int i = 0; !stack.isEmpty(); i++) { + assertEquals(expected1[i], stack.pop()); + } + } + + @Test + public void testGetTop() { + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + stack.push(5); + Object[] result = StackUtil.getTop(stack, 3); + int[] expected = { 5, 4, 3 }; + for (int i = 0; i < result.length; i++) { + assertEquals(expected[i], result[i]); + } + + result = StackUtil.getTop(stack, 9); + int[] expected1 = { 5, 4, 3, 2, 1 }; + for (int i = 0; i < result.length; i++) { + assertEquals(expected1[i], result[i]); + } + + result = StackUtil.getTop(stack, -1); + assertEquals(0, result.length); + } + + @Test + public void testIsValidPairs() { + assertTrue(StackUtil.isValidPairs("12wed333")); + assertTrue(StackUtil.isValidPairs("1{2[3(4)5]6}")); + assertTrue(StackUtil.isValidPairs("{{{[[[((()))]]]}}}")); + assertTrue(StackUtil.isValidPairs("{}[]()([{}])")); + assertFalse(StackUtil.isValidPairs(")abcd{}[]()")); + assertFalse(StackUtil.isValidPairs("a{b[c}d]()")); + assertFalse(StackUtil.isValidPairs("a{b)c}[]{}")); + assertFalse(StackUtil.isValidPairs("{}[](()")); + } + +} diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java b/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java new file mode 100644 index 0000000000..1d62da0e04 --- /dev/null +++ b/group23/1323434545/work_Other/01_litestruts/src/main/LoginAction.java @@ -0,0 +1,36 @@ +package main; + +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java b/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java new file mode 100644 index 0000000000..21b889c070 --- /dev/null +++ b/group23/1323434545/work_Other/01_litestruts/src/main/Struts.java @@ -0,0 +1,71 @@ +package main; + +import java.io.File; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Iterator; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +public class Struts { + /* + * + * 0. 读取配置文件struts.xml + * + * 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + * 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" , + * "password"="1234") , 那就应该调用 setName和setPassword方法 + * + * 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + * + * 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如 + * {"message": "登录成功"} , 放到View对象的parameters + * + * 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, 放到View对象的jsp字段中。 + * + */ + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static View runAction(String actionName, Map parameters) + throws DocumentException, ReflectiveOperationException, SecurityException { + View view = null; + SAXReader reader = new SAXReader(); + Document document = reader.read(new File("./xml/struts.xml")); + Element root = document.getRootElement(); + for (Iterator iterator = (Iterator) root.elementIterator("action"); iterator.hasNext();) { + Element actionElement = (Element) iterator.next(); + String actionElementName = actionElement.attributeValue("name"); + if (actionElementName.equals(actionName)) { + Class c = Class.forName(actionElement.attributeValue("class")); + Constructor con = c.getConstructor(); + Object o = con.newInstance(); + Method setName = c.getMethod("setName", String.class); + setName.invoke(o, parameters.get("name")); + Method setPassword = c.getMethod("setPassword", String.class); + setPassword.invoke(o, parameters.get("password")); + Method execute = c.getMethod("execute"); + String resultStr = execute.invoke(o).toString(); + + for (iterator = actionElement.elementIterator("result"); iterator.hasNext();) { + Element resultElement = (Element) iterator.next(); + if (resultElement.attributeValue("name").equals(resultStr)) { + view = new View(); + parameters.put("name", c.getMethod("getName").invoke(o).toString()); + parameters.put("password", c.getMethod("getPassword").invoke(o).toString()); + parameters.put("message", c.getMethod("getMessage").invoke(o).toString()); + view.setJsp(resultElement.getStringValue()); + view.setParameters(parameters); + } + } + } + + } + return view; + + } + +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/main/View.java b/group23/1323434545/work_Other/01_litestruts/src/main/View.java new file mode 100644 index 0000000000..2f54206090 --- /dev/null +++ b/group23/1323434545/work_Other/01_litestruts/src/main/View.java @@ -0,0 +1,27 @@ +package main; + +import java.util.Map; + +@SuppressWarnings("rawtypes") +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java b/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java new file mode 100644 index 0000000000..7d5d431ac0 --- /dev/null +++ b/group23/1323434545/work_Other/01_litestruts/src/test/StrutsTest.java @@ -0,0 +1,55 @@ +package test; + +import java.util.HashMap; +import java.util.Map; + +import org.dom4j.DocumentException; +import org.junit.Assert; +import org.junit.Test; + +import main.Struts; +import main.View; + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "tes"); + params.put("password", "1234"); + View view = null; + try { + view = Struts.runAction(actionName, params); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (DocumentException e) { + e.printStackTrace(); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } + +} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/Connection.java b/group23/1323434545/work_Other/02_downloader/src/api/Connection.java new file mode 100644 index 0000000000..828332de3b --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/api/Connection.java @@ -0,0 +1,23 @@ +package api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java new file mode 100644 index 0000000000..d6265a5c4a --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionException.java @@ -0,0 +1,6 @@ +package api; + +@SuppressWarnings("serial") +public class ConnectionException extends Exception{ + +} diff --git a/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java new file mode 100644 index 0000000000..1ff4788bf4 --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java b/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java new file mode 100644 index 0000000000..b8ab21d462 --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/api/DownloadListener.java @@ -0,0 +1,5 @@ +package api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java new file mode 100644 index 0000000000..222284c175 --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionImpl.java @@ -0,0 +1,54 @@ +package impl; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +import api.Connection; + +public class ConnectionImpl implements Connection{ + private HttpURLConnection huConn; + + + public ConnectionImpl(String url) { + try { + huConn = (HttpURLConnection) new URL(url).openConnection(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + huConn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + BufferedInputStream bis = new BufferedInputStream(huConn.getInputStream()); + int len =0; + byte[] bytes = new byte[1024]; + while((len=bis.read(bytes))!=-1){ + os.write(bytes, 0, len); + } + os.flush(); + return os.toByteArray(); + } + + @Override + public int getContentLength() { + return huConn.getContentLength(); + } + + @Override + public void close() { + if(null!=huConn){ + huConn.disconnect(); + } + + } + +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..c9c9e7378b --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package impl; + + + +import api.Connection; +import api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) { + return new ConnectionImpl(url); + } + +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java b/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java new file mode 100644 index 0000000000..138dadf32f --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/main/DownloadThread.java @@ -0,0 +1,50 @@ +package main; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + +import api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + File saveLocation; + CyclicBarrier barrier; + + public DownloadThread( Connection conn, int startPos, int endPos,File saveLocation,CyclicBarrier barrier){ + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.saveLocation = saveLocation; + this.barrier = barrier; + } + + @Override + public void run() { + RandomAccessFile rf = null; + try { + rf = new RandomAccessFile(saveLocation,"rw"); + rf.seek(startPos); + rf.write(conn.read(startPos, endPos)); + barrier.await(); + }catch (Exception e) { + e.printStackTrace(); + }finally { + if(null!=rf){ + try { + rf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(null!=conn){ + conn.close(); + } + + } + } +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java b/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java new file mode 100644 index 0000000000..13f84bcb73 --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/main/FileDownloader.java @@ -0,0 +1,73 @@ +package main; + +import java.io.File; +import java.util.concurrent.CyclicBarrier; +import api.ConnectionException; +import api.ConnectionManager; +import api.DownloadListener; +import impl.ConnectionManagerImpl; + +public class FileDownloader { + + String url; + File saveLocation; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String url,File saveLocation) { + this.url = url; + this.saveLocation = saveLocation; + } + + + public void execute() throws ConnectionException{ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + + cm = new ConnectionManagerImpl(); + int length = cm.open(this.url).getContentLength(); + System.out.println("文件长度:"+length); + long time = System.currentTimeMillis(); + CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() { + @Override + public void run() { + listener.notifyFinished(); + System.out.println("耗时:"+(System.currentTimeMillis()-time)/1000+"秒"); + } + }); + + new DownloadThread(cm.open(this.url),0,length/3-1,saveLocation,barrier).start(); + new DownloadThread(cm.open(this.url),length/3,length*2/3-1,saveLocation,barrier).start(); + new DownloadThread(cm.open(this.url),length*2/3,length-1,saveLocation,barrier).start(); + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + + +} \ No newline at end of file diff --git a/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java b/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java new file mode 100644 index 0000000000..823e5ece37 --- /dev/null +++ b/group23/1323434545/work_Other/02_downloader/src/test/DownloaderTest.java @@ -0,0 +1,21 @@ +package test; + +import java.io.File; + +import api.ConnectionException; +import api.DownloadListener; +import main.FileDownloader; + +public class DownloaderTest { + public static void main(String[] args) throws ConnectionException { + FileDownloader fd = new FileDownloader("http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.13/bin/apache-tomcat-8.5.13.exe",new File("E:\\tomcat.exe")); + fd.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + System.out.println("下载完了!"); + } + }); + fd.execute(); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java new file mode 100644 index 0000000000..f3d936f79b --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayList.java @@ -0,0 +1,94 @@ +package com.xiaol.study; + +/** + * @Description TODO + * @date 创建时间:2017年3月4日 下午11:03:26 + */ +public class ArrayList implements List { + + // 记录有多少元素 + private int size = 0; + + // 存放元素的数组 + private Object[] elementData = new Object[10]; + + // 添加元素 + public void add(Object o) { + checkSizeAndGrow(); + elementData[size++] = o; + } + + // 检查数组容量大小,不足就扩容 + private void checkSizeAndGrow() { + if (size >= elementData.length) { + Object[] oldData = elementData; + elementData = new Object[size * 2]; + System.arraycopy(oldData, 0, elementData, 0, size); + } + } + + // 在指定位置添加元素 + public void add(int index, Object o) { + checkIndex(index); + checkSizeAndGrow(); + // 把index位置的元素往后移一位 + System.arraycopy(elementData, index, elementData, index + 1, size - index); + elementData[index] = o; + size++; + } + + // 检查插入元素的位置是否非法 + private void checkIndex(int index) { + if (index < 0 || index > size) { + throw new RuntimeException("参数非法"); + } + } + + // 获取指定位置元素 + public Object get(int index) { + checkIndex(index); + return elementData[index]; + } + + // 移除指定位置元素 + public Object remove(int index) { + checkIndex(index); + Object returnVal = elementData[index]; + System.arraycopy(elementData, index + 1, elementData, index, size - index - 1); + size--; + return returnVal; + } + + // 获取ArrayList元素数量 + public int size() { + return size; + } + + // 获取迭代器 + public Iterator iterator() { + return new ArrayListIterator(); + } + + // 尽量实现迭代器 + private class ArrayListIterator implements Iterator { + + ArrayList list = null; + + @Override + public boolean hasNext() { + + return false; + } + + @Override + public Object next() { + return null; + } + + public Object remove() { + return null; + } + + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java new file mode 100644 index 0000000000..c8d865a394 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/ArrayListTest.java @@ -0,0 +1,82 @@ +package com.xiaol.study; + +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ArrayListTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddObject() { + ArrayList list = new ArrayList(); + list.add("a"); + list.add("b"); + list.add("c"); + list.add("d"); + list.add("e"); + list.add("f"); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + assertEquals(12, list.size()); + } + + @Test + public void testAddIntObject() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(0, 3); + assertEquals(3, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(2, list.get(2)); + assertEquals(3, list.size()); + } + + @Test + public void testGet() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(0, 3); + assertEquals(3, list.get(0)); + assertEquals(1, list.get(1)); + assertEquals(2, list.get(2)); + assertEquals(3, list.size()); + } + + @Test + public void testRemove() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(0, 3); + assertEquals(3, list.remove(0)); + assertEquals(1, list.remove(0)); + assertEquals(2, list.remove(0)); + assertEquals(0, list.size()); + } + + @Test + public void testSize() { + ArrayList list = new ArrayList(); + list.add(1); + list.add(2); + list.add(0, 3); + assertEquals(3, list.size()); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java new file mode 100644 index 0000000000..a6275111e3 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNode.java @@ -0,0 +1,59 @@ +package com.xiaol.study; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午12:57:18 + */ +public class BinaryTreeNode { + // 要求,左节点比父节点小,右节点比父节点大 + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode insert(Object o) { + // 当前没有数据就放入当前节点 + if (data == null) { + this.data = o; + } else if ((int) data >= (int) o) {// 放入左节点 + if (left == null) { + left = new BinaryTreeNode(); + left.setData(o); + } else { + left.insert(o); + } + } else if ((int) data < (int) o) {// 放入右节点 + if (right == null) { + right = new BinaryTreeNode(); + right.setData(o); + } else { + right.insert(o); + } + } + return this; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..654d79f0f3 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/BinaryTreeNodeTest.java @@ -0,0 +1,82 @@ +package com.xiaol.study; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class BinaryTreeNodeTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testInsert() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + btn.insert(2); + btn.insert(0); + btn.insert(3); + assertEquals(0, btn.getLeft().getData()); + assertEquals(1, btn.getData()); + assertEquals(2, btn.getRight().getData()); + assertEquals(3, btn.getRight().getRight().getData()); + } + + @Test + public void testGetData() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + assertEquals(1, btn.getData()); + } + + @Test + public void testSetData() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.setData(1); + assertEquals(1, btn.getData()); + } + + @Test + public void testGetLeft() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + btn.insert(0); + assertEquals(0, btn.getLeft().getData()); + } + + @Test + public void testSetLeft() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + BinaryTreeNode left = new BinaryTreeNode(); + left.setData(2); + btn.setLeft(left); + assertEquals(2, btn.getLeft().getData()); + } + + @Test + public void testGetRight() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + btn.insert(2); + assertEquals(2, btn.getRight().getData()); + } + + @Test + public void testSetRight() { + BinaryTreeNode btn = new BinaryTreeNode(); + btn.insert(1); + BinaryTreeNode right = new BinaryTreeNode(); + right.setData(2); + btn.setRight(right); + assertEquals(2, btn.getRight().getData()); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java b/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java new file mode 100644 index 0000000000..745c732730 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/Iterator.java @@ -0,0 +1,12 @@ +package com.xiaol.study; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午1:12:05 + */ +public interface Iterator { + + public boolean hasNext(); + + public Object next(); +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java new file mode 100644 index 0000000000..aecd901e2d --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedList.java @@ -0,0 +1,253 @@ +package com.xiaol.study; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午12:30:18 + */ +public class LinkedList implements List { + + // 头指针 + private Node head; + + // 最后一个节点 + private Node lastNode; + + // 链表长度 + private int size; + + // 添加元素到最后一个节点 + public void add(Object o) { + if (null == head) { + head = new Node(o); + head.next = null; + lastNode = head; + size++; + } else { + lastNode.next = new Node(o); + lastNode = getLastNode(); + size++; + } + } + + // 获取最后一个节点 + private Node getLastNode() { + Node last = head; + while (last.next != null) { + last = last.next; + } + return last; + } + + // 获取指定位置的Node + private Node getIndexNode(int index) { + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node; + } + + // 添加元素到指定位置 + public void add(int index, Object o) { + checkIndex(index); + if (index == 0) { + // 将head暂存为headNext + Node headNext = head; + // 创建新的head + Node newHead = new Node(o); + head = newHead; + head.next = headNext; + } else { + // 获取第index-1个位置的Node + Node node = getIndexNode(index - 1); + // 暂存index位置的Node + Node nodeNext = node.next; + // 向index位置插入数据 + node.next = new Node(o); + node.next.next = nodeNext; + } + size++; + } + + // 获取指定位置元素 + public Object get(int index) { + checkIndex(index); + Node node = head; + for (int i = 0; i < index; i++) { + node = node.next; + } + return node.data; + } + + private void checkIndex(int index) { + if (index < 0 || index > size) { + throw new RuntimeException("非法参数"); + } + } + + // 移除指定位置元素 + public Object remove(int index) { + checkIndex(index); + Object data = null; + if (index == 0) { + // 新的head + Node newHead = head.next; + // 获取移除元素 + data = head.data; + // 将newHead设为head + head = newHead; + } else { + // 获取第index-1个位置的Node + Node node = getIndexNode(index - 1); + // 获取返回的元素 + data = node.next.data; + // 将index位置从链表删除 + node.next = node.next.next; + } + size--; + return data; + } + + // 获取链表长度 + public int size() { + return size; + } + + // 添加元素到第一个节点 + public void addFirst(Object o) { + add(0, o); + } + + public void addLast(Object o) { + Node lastNode = getLastNode(); + lastNode.next = new Node(o); + size++; + } + + // 移除第一个元素 + public Object removeFirst() { + return remove(0); + } + + // 移除最后一个元素 + public Object removeLast() { + Node lastNode = getLastNode(); + Object data = lastNode.data; + lastNode = null; + size--; + return data; + } + + public Iterator iterator() { + return null; + } + + // 用于存储数据的节点 + private static class Node { + Object data; + Node next; + + // 无参构造 + private Node() { + + } + + // 有参构造 + private Node(Object o) { + this.data = o; + } + } + + //---------------下面的方法暂时先不实现 + // removeDuplicateValues(),removeRange()可以不实现 + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length) { + if (i < 0) { + throw new RuntimeException("非法参数"); + } + Node indexNode = getIndexNode(i); + Node nextNode = getIndexNode(i); + for (int j = 0; j < length; j++) { + nextNode = nextNode.next; + } + indexNode.next = nextNode; + } + + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list) { + int[] retVal = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + int index = (int) list.get(i); + Node indexNode = getIndexNode(index); + int data = (int) indexNode.data; + retVal[i] = data; + } + return retVal; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java new file mode 100644 index 0000000000..faaa113907 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/LinkedListTest.java @@ -0,0 +1,131 @@ +package com.xiaol.study; + +import static org.junit.Assert.assertEquals; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class LinkedListTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testAddObject() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(3, ll.get(2)); + } + + @Test + public void testAddIntObject() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(3, 0); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(3, ll.get(2)); + assertEquals(0, ll.get(3)); + assertEquals(4, ll.size()); + } + + @Test + public void testGet() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(3, 0); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(3, ll.get(2)); + assertEquals(0, ll.get(3)); + assertEquals(4, ll.size()); + } + + @Test + public void testRemove() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(0, 0); + ll.remove(0); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(3, ll.get(2)); + } + + @Test + public void testSize() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.add(0, 0); + assertEquals(4, ll.size()); + } + + @Test + public void testAddFirst() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.addFirst(001); + ll.addFirst(002); + assertEquals(002, ll.get(0)); + assertEquals(001, ll.get(1)); + assertEquals(1, ll.get(2)); + assertEquals(2, ll.get(3)); + } + + @Test + public void testAddLast() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.addLast(001); + ll.addLast(002); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(001, ll.get(2)); + assertEquals(002, ll.get(3)); + } + + @Test + public void testRemoveFirst() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.removeFirst(); + ll.removeFirst(); + assertEquals(3, ll.get(0)); + assertEquals(1, ll.size()); + } + + @Test + public void testRemoveLast() { + LinkedList ll = new LinkedList(); + ll.add(1); + ll.add(2); + ll.add(3); + ll.removeLast(); + assertEquals(1, ll.get(0)); + assertEquals(2, ll.get(1)); + assertEquals(2, ll.size()); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/List.java b/group23/381519422/DataStructure/src/com/xiaol/study/List.java new file mode 100644 index 0000000000..aa8c23fba3 --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/List.java @@ -0,0 +1,13 @@ +package com.xiaol.study; + +public interface List { + public void add(Object o); + + public void add(int index, Object o); + + public Object get(int index); + + public Object remove(int index); + + public int size(); +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java b/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java new file mode 100644 index 0000000000..cae4a91cfb --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/Queue.java @@ -0,0 +1,41 @@ +package com.xiaol.study; + +import java.util.LinkedList; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午12:51:34 + */ +public class Queue { + + // 队列 + private LinkedList elementData = new LinkedList(); + // 队列长度 + private int size; + + // 添加元素到队列尾 + public void enQueue(Object o) { + elementData.add(o); + size++; + } + + // 移除队列头的元素 + public Object deQueue() { + Object data = elementData.removeLast(); + size--; + return data; + } + + // 队列是否为空 + public boolean isEmpty() { + if (size == 0) { + return true; + } + return false; + } + + // 队列长度 + public int size() { + return size; + } +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java new file mode 100644 index 0000000000..88fa5597db --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/QueueTest.java @@ -0,0 +1,64 @@ +package com.xiaol.study; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class QueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEnQueue() { + Queue q = new Queue(); + assertEquals(0, q.size()); + q.enQueue(1); + q.enQueue(2); + assertEquals(2, q.size()); + } + + @Test + public void testDeQueue() { + Queue q = new Queue(); + assertEquals(0, q.size()); + q.enQueue(1); + q.enQueue(2); + assertEquals(2, q.size()); + q.deQueue(); + q.deQueue(); + assertEquals(0, q.size()); + } + + @Test + public void testIsEmpty() { + Queue q = new Queue(); + assertEquals(true, q.isEmpty()); + q.enQueue(1); + q.enQueue(2); + assertEquals(false, q.isEmpty()); + q.deQueue(); + q.deQueue(); + assertEquals(true, q.isEmpty()); + } + + @Test + public void testSize() { + Queue q = new Queue(); + assertEquals(0, q.size()); + q.enQueue(1); + q.enQueue(2); + assertEquals(2, q.size()); + q.deQueue(); + q.deQueue(); + assertEquals(0, q.size()); + } + +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java b/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java new file mode 100644 index 0000000000..7a71ab6c6b --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/Stack.java @@ -0,0 +1,49 @@ +package com.xiaol.study; + +import java.util.ArrayList; + +/** + * @Description TODO + * @date 创建时间:2017年3月5日 上午12:47:15 + */ +public class Stack { + // 存数据的List + private ArrayList elementData = new ArrayList(); + + // 栈元素数量 + private int size; + + // 压栈 + public void push(Object o) { + elementData.add(o); + size++; + } + + // 弹出栈顶元素 + public Object pop() { + if (size == 0) { + throw new RuntimeException("Stack is Empty"); + } + Object data = elementData.remove(size - 1); + size--; + return data; + } + + // 获取栈顶元素 + public Object peek() { + return elementData.get(size - 1); + } + + // 是否为空 + public boolean isEmpty() { + if (size == 0) { + return true; + } + return false; + } + + // 栈大小 + public int size() { + return size; + } +} diff --git a/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java b/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java new file mode 100644 index 0000000000..937bbb831b --- /dev/null +++ b/group23/381519422/DataStructure/src/com/xiaol/study/StackTest.java @@ -0,0 +1,68 @@ +package com.xiaol.study; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class StackTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPush() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + assertEquals(3, s.size()); + } + + @Test + public void testPop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + assertEquals(3, s.pop()); + assertEquals(2, s.pop()); + assertEquals(1, s.pop()); + assertEquals(0, s.size()); + } + + @Test + public void testPeek() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + assertEquals(3, s.peek()); + } + + @Test + public void testIsEmpty() { + Stack s = new Stack(); + assertEquals(true, s.isEmpty()); + s.push(1); + s.push(2); + s.push(3); + assertEquals(false, s.isEmpty()); + } + + @Test + public void testSize() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + assertEquals(3, s.size()); + } + +} diff --git a/group23/381519422/array/src/array/ArrayUtil.java b/group23/381519422/array/src/array/ArrayUtil.java new file mode 100644 index 0000000000..cb1d3f49dc --- /dev/null +++ b/group23/381519422/array/src/array/ArrayUtil.java @@ -0,0 +1,354 @@ +package array; + +import java.util.ArrayList; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + if (origin == null || origin.length <= 1) { + return; + } + //第1和第length互换位置,第2和第length-1互换,以此类推 + for (int i = 0; i < origin.length / 2; i++) { + int temp = origin[i]; + origin[i] = origin[origin.length - 1 - i]; + origin[origin.length - 1 - i] = temp; + } + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray) { + // 判断非法输入 + if (oldArray == null || oldArray.length == 0) { + return null; + } + + // 创建临时数组,长度与原oldArray一样长 + int[] temp = new int[oldArray.length]; + int tempCount = 0; + for (int i = 0; i < oldArray.length; i++) { + // 判断元素是0跳过 + if (oldArray[i] == 0) { + continue; + } else {// 非零放入临时数组,计数器加1 + temp[tempCount++] = oldArray[i]; + } + } + + // 如果计数器与原数组长度一致,直接返回临时数组 + if (tempCount == oldArray.length) { + return temp; + } else {// 否则返回长度为tempCount的数组 + int[] retVal = new int[tempCount]; + System.arraycopy(temp, 0, retVal, 0, tempCount); + return retVal; + } + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + public int[] merge(int[] array1, int[] array2) { + // 创建临时数组,长度为array1+array2的长度 + int[] temp = new int[array1.length + array2.length]; + int index = 0;// temp的下标 + int i = 0;// array1的下标 + int j = 0;// array2的下标 + int count = 0;// temp存放元素的计数器 + + while (true) { + + if (i == array1.length) {// 当array1已经全部添加到temp,就把array2剩余的放入temp + for (int l = j; l < array2.length; l++) { + temp[index++] = array2[l]; + count++; + } + break; + } else if (j == array2.length) {// 当array2已经全部添加到temp,就把array1剩余的放入temp + for (int l = i; l < array1.length; l++) { + temp[index++] = array1[l]; + count++; + } + break; + } + + // 取array1第i和array2第j个元素比较。如果array1[i]的小于array2[j],则array1[i]放入temp + // 同时i++,使得下次为i+1和j个元素比较。 + // 如果array1第i和array2第j个元素相等。则array1[i]放入temp + // 同时i++,j++,使得下次为i+1和j+1个元素比较。 + if (array1[i] < array2[j]) { + temp[index++] = array1[i++]; + count++; + } else if (array1[i] > array2[j]) { + temp[index++] = array2[j++]; + count++; + } else { + temp[index++] = array1[i]; + i++; + j++; + count++; + } + } + + // 如果计数器和temp.length相等,直接返回 + if (count == temp.length) { + return temp; + } else {// 否则创建长度为count的新数组返回 + int[] retVal = new int[count]; + System.arraycopy(temp, 0, retVal, 0, count); + return retVal; + } + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + // 参数校验 + if (size < 0) { + throw new RuntimeException("非法参数"); + } + if (size == 0) { + return oldArray; + } + + // 扩容 + int[] retVal = new int[oldArray.length + size]; + for (int i = 0; i < oldArray.length; i++) { + retVal[i] = oldArray[i]; + } + return retVal; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max) { + // 0直接返回空数组 + if (max == 1) { + return new int[0]; + } + + int retVal = 0;// 每一轮循环的斐波那契数 + int i = 1;// 获取第几个斐波那契数 + ArrayList list = new ArrayList();// 用于暂时保存斐波那契数 + while (retVal < max) {// 获取所有小于max的斐波那契数 + retVal = getFibonacci(i++); + if (retVal < max) { + list.add(retVal); + } else { + break; + } + } + + // 将arraylist转为array + int[] retArray = new int[list.size()]; + for (int j = 0; j < list.size(); j++) { + retArray[j] = list.get(j); + } + return retArray; + } + + /** + * 循环获取第N个斐波那契数 + * @param index + * @return + */ + private int getFibonacci(int index) { + if (index < 1) { + throw new RuntimeException("非法参数"); + } + if (index == 1 || index == 2) { + return 1; + } + + int first = 1; + int second = 1; + int retVal = 0; + for (int i = 3; i <= index; i++) { + retVal = first + second; + first = second; + second = retVal; + } + return retVal; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max) { + // 排除非法参数 + if (max < 0) { + throw new RuntimeException("非法参数"); + } + + // 小于2没有素数 + if (max <= 1) { + return new int[0]; + } + + ArrayList list = new ArrayList(); + // 取出每个数判断是不是素数,是就放入arraylist + for (int i = 2; i < max; i++) { + boolean primes = isPrimes(i); + if (primes) { + list.add(i); + } + } + + int[] retArray = new int[list.size()]; + // 将ArrayList转为数组返回 + for (int i = 0; i < list.size(); i++) { + retArray[i] = list.get(i); + } + return retArray; + } + + /** + * 判断输入的数字是不是素数 + * @param num + * @return + */ + private boolean isPrimes(int num) { + // 排除非法参数 + if (num <= 0) { + throw new RuntimeException("非法参数"); + } + + // 小于2没有素数 + if (num == 1) { + return false; + } + + // 2是素数,但是2%2==0为true,所以单独列出 + if (num == 2) { + return true; + } + + // num依次从2到num的平方根取余数,如果余数为零说明不是素数 + for (int i = 2; i <= Math.sqrt(num); i++) { + if (num % i == 0) { + return false; + } + } + return true; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + if (max < 0) { + throw new RuntimeException("非法参数"); + } + if (max <= 2) { + return new int[0]; + } + + // 获取小于max 的所有完数 + ArrayList list = new ArrayList(); + for (int i = 1; i < max; i++) { + if (isPerfectNumber(i)) { + list.add(i); + } + } + + // 将ArrayList转为array返回 + int[] array = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + return array; + } + + /** + * 判断输入的数是不是完美数 + * @param num + * @return + */ + private boolean isPerfectNumber(int num) { + if (num <= 0) { + throw new RuntimeException("非法参数"); + } + + // 放置num的所有约数 + ArrayList divisorList = new ArrayList(); + for (int i = 1; i < num; i++) { + if (num % i == 0) { + divisorList.add(i); + } + } + + // 所有因数相加是否等于num,是就是完美数 + int count = 0; + for (int i = 0; i < divisorList.size(); i++) { + count += divisorList.get(i); + } + if (count == num) { + return true; + } else { + return false; + } + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + // 检查非法输入 + if (array == null) { + return null; + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length; i++) { + if (i == array.length - 1) {// 最后一个元素后面不拼接- + sb.append(array[i]); + } else { + sb.append(array[i]); + sb.append("-"); + } + } + return sb.toString(); + } + + +} \ No newline at end of file diff --git a/group23/381519422/array/src/array/ArrayUtilTest.java b/group23/381519422/array/src/array/ArrayUtilTest.java new file mode 100644 index 0000000000..a202afdb20 --- /dev/null +++ b/group23/381519422/array/src/array/ArrayUtilTest.java @@ -0,0 +1,116 @@ +package array; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class ArrayUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testReverseArray() { + int[] a = { 7, 9, 30, 3, 4 }; + int[] expecteds = { 4, 3, 30, 9, 7 }; + ArrayUtil util = new ArrayUtil(); + util.reverseArray(a); + assertArrayEquals(expecteds, a); + } + + @Test + public void testRemoveZero() { + int[] oldArr = { 1, 3, 4, 5, 0, 0, 6, 6, 0, 5, 4, 7, 6, 7, 0, 5 }; + int[] expecteds = { 1, 3, 4, 5, 6, 6, 5, 4, 7, 6, 7, 5 }; + ArrayUtil util = new ArrayUtil(); + int[] removeZero = util.removeZero(oldArr); + assertArrayEquals(expecteds, removeZero); + } + + @Test + public void testMerge() { + int[] a1 = { 3, 5, 7, 8 }; + int[] a2 = { 4, 5, 6, 7 }; + ArrayUtil util = new ArrayUtil(); + int[] merge = util.merge(a1, a2); + int[] expecteds = { 3, 4, 5, 6, 7, 8 }; + assertArrayEquals(expecteds, merge); + } + + @Test + public void testGrow() { + int[] oldArray = { 2, 3, 6 }; + int size = 3; + int[] expecteds = { 2, 3, 6, 0, 0, 0 }; + ArrayUtil util = new ArrayUtil(); + int[] grow = util.grow(oldArray, size); + assertArrayEquals(expecteds, grow); + } + + @Test + public void testFibonacci() { + int max1 = 15; + int[] expecteds1 = { 1, 1, 2, 3, 5, 8, 13 }; + ArrayUtil util = new ArrayUtil(); + int[] fibonacci1 = util.fibonacci(max1); + assertArrayEquals(expecteds1, fibonacci1); + + int max2 = 1; + int[] expecteds2 = {}; + int[] fibonacci2 = util.fibonacci(max2); + assertArrayEquals(expecteds2, fibonacci2); + } + + @Test + public void testGetPrimes() { + int max1 = 23; + int[] expecteds1 = { 2, 3, 5, 7, 11, 13, 17, 19 }; + ArrayUtil util = new ArrayUtil(); + int[] primes1 = util.getPrimes(max1); + assertArrayEquals(expecteds1, primes1); + + int max2 = 2; + int[] expecteds2 = {}; + int[] primes2 = util.getPrimes(max2); + assertArrayEquals(expecteds2, primes2); + } + + @Test + public void testGetPerfectNumbers() { + int max1 = 2; + int[] expecteds1 = {}; + ArrayUtil util = new ArrayUtil(); + int[] perfectNumbers1 = util.getPerfectNumbers(max1); + assertArrayEquals(expecteds1, perfectNumbers1); + + // 6=1+2+3 + int max2 = 7; + int[] expecteds2 = { 6 }; + int[] perfectNumbers2 = util.getPerfectNumbers(max2); + assertArrayEquals(expecteds2, perfectNumbers2); + + // 28=1+2+4+7+14 + int max3 = 30; + int[] expecteds3 = { 6, 28 }; + int[] perfectNumbers3 = util.getPerfectNumbers(max3); + assertArrayEquals(expecteds3, perfectNumbers3); + } + + @Test + public void testJoin() { + int[] array = { 3, 8, 9 }; + String seperator = "-"; + String expecteds = "3-8-9"; + ArrayUtil util = new ArrayUtil(); + String join = util.join(array, seperator); + assertEquals(expecteds, join); + } + +} diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java new file mode 100644 index 0000000000..fc1ec892f9 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadDemo.java @@ -0,0 +1,53 @@ +package com.xiaol.download; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.RandomAccessFile; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + +/** + * 下载DEMO + * @author ShawnLin + */ +public class DownloadDemo { + + public void download(String url) { + URL u; + try { + u = new URL(url); + HttpURLConnection httpURLConnection = (HttpURLConnection) u.openConnection(); + int contentLength = httpURLConnection.getContentLength(); + httpURLConnection.connect(); + InputStream inputStream = httpURLConnection.getInputStream(); + File file = new File(getFileName(url)); + RandomAccessFile raf = new RandomAccessFile(file, "rwd"); + byte[] read = new byte[1024]; + int length = 0; + while ((length = inputStream.read(read)) != -1) { + raf.write(read, 0, length); + } + inputStream.close(); + raf.close(); + System.out.println("下载完毕,位置[" + file.getAbsolutePath() + "]"); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + public String getFileName(String path) { + int index = path.lastIndexOf("/"); + return path.substring(index + 1); + } + + public static void main(String[] args) { + DownloadDemo dd = new DownloadDemo(); + String url = "http://ww3.sinaimg.cn/large/729119fdgw1f0nnftw3hij21kw11x4qp.jpg"; + dd.download(url); + } +} diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java new file mode 100644 index 0000000000..bb9c5cdac7 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/DownloadThread.java @@ -0,0 +1,37 @@ +package com.xiaol.download; + +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.xiaol.download.api.Connection; +import com.xiaol.download.api.DownloadListener; + +public class DownloadThread extends Thread { + + Connection conn; + int startPos; + int endPos; + RandomAccessFile randomAccessFile; + DownloadListener listener; + + public DownloadThread(Connection conn, int startPos, int endPos, RandomAccessFile randomAccessFile) { + this.randomAccessFile = randomAccessFile; + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + + @Override + public void run() { + try { + byte[] read = conn.read(startPos, endPos); + randomAccessFile.seek(startPos); + randomAccessFile.write(read, 0, endPos - startPos); + System.out.println(this.getName() + "完成下载,从" + startPos + "到" + endPos + "共" + (endPos - startPos)); + conn.close(); + FileDownloader.finishCount(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java new file mode 100644 index 0000000000..e56d9d8939 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloader.java @@ -0,0 +1,133 @@ +package com.xiaol.download; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.xiaol.download.api.Connection; +import com.xiaol.download.api.ConnectionException; +import com.xiaol.download.api.ConnectionManager; +import com.xiaol.download.api.DownloadListener; + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + private static int count = 0; + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute() { + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, + // endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, + // 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + // Connection conn = null; + // try { + // + // conn = cm.open(this.url); + // + // int length = conn.getContentLength(); + // + // new DownloadThread(conn,0,length-1).start(); + // + // } catch (ConnectionException e) { + // e.printStackTrace(); + // }finally{ + // if(conn != null){ + // conn.close(); + // } + // } + + Connection conn = null; + try { + + File file = new File(getFileName(url)); + RandomAccessFile raf = new RandomAccessFile(file, "rwd"); + System.out.println("文件下载位置:[" + file.getAbsolutePath() + "]"); + int threadNum = 3; + conn = cm.open(this.url); + int length = conn.getContentLength(); + int avg = length / threadNum; + for (int i = 0; i < threadNum; i++) { + Connection cTemp = cm.open(this.url); + int start = i * avg; + int end = start + avg - 1; + if (i == threadNum - 1) { + end = length - 1; + } + new DownloadThread(cTemp, start, end, raf).start(); + } + + while (true) { + if (threadNum == getFinishCount()) { + listener.notifyFinished(); + try { + raf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + break; + } + } + } catch (ConnectionException e) { + e.printStackTrace(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } finally { + if (conn != null) { + conn.close(); + } + } + + } + + /** + * 获取文件名 + * + * @param path + * @return + */ + public String getFileName(String path) { + int index = path.lastIndexOf("/"); + return path.substring(index + 1); + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + public void setConnectionManager(ConnectionManager ucm) { + this.cm = ucm; + } + + public DownloadListener getListener() { + return this.listener; + } + + public static void finishCount() { + count++; + } + + public int getFinishCount() { + return count; + } +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java new file mode 100644 index 0000000000..ee724f5d44 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/FileDownloaderTest.java @@ -0,0 +1,60 @@ +package com.xiaol.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.xiaol.download.api.ConnectionManager; +import com.xiaol.download.api.DownloadListener; +import com.xiaol.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + +// String url = "http://localhost:8080/test.jpg"; + String url = "http://ww3.sinaimg.cn/large/729119fdgw1f0nnftw3hij21kw11x4qp.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java new file mode 100644 index 0000000000..dc688e1fbe --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.xiaol.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java new file mode 100644 index 0000000000..813f6756bf --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.xiaol.download.api; + +public class ConnectionException extends Exception { + +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java new file mode 100644 index 0000000000..84adef2054 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.xiaol.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java b/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java new file mode 100644 index 0000000000..30e7eaced2 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.xiaol.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..fcd2a37cdc --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionImpl.java @@ -0,0 +1,60 @@ +package com.xiaol.download.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import com.xiaol.download.api.Connection; + +public class ConnectionImpl implements Connection { + + private HttpURLConnection httpURLConnection; + + public ConnectionImpl(String url) { + try { + this.httpURLConnection = (HttpURLConnection) new URL(url).openConnection(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + httpURLConnection.setRequestMethod("GET"); + httpURLConnection.setConnectTimeout(5000); + httpURLConnection.setReadTimeout(5000); + httpURLConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + httpURLConnection.connect(); + List list = new ArrayList<>(); + byte[] byteArray = null; + byte[] read = new byte[1024]; + int length = 0; + if (httpURLConnection.getResponseCode() == 206) { + InputStream inputStream = httpURLConnection.getInputStream(); + byteArray = new byte[endPos - startPos + 1]; + while ((length = inputStream.read(byteArray)) != -1) { + + } + inputStream.close(); + } + close(); + return byteArray; + } + + @Override + public int getContentLength() { + return httpURLConnection.getContentLength(); + } + + @Override + public void close() { + httpURLConnection.disconnect(); + } + +} \ No newline at end of file diff --git a/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..730aaca153 --- /dev/null +++ b/group23/381519422/download/src/main/java/com/xiaol/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.xiaol.download.impl; + +import com.xiaol.download.api.Connection; +import com.xiaol.download.api.ConnectionException; +import com.xiaol.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + Connection connection = new ConnectionImpl(url); + return connection; + } + +} \ No newline at end of file diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java new file mode 100644 index 0000000000..0a0bde6888 --- /dev/null +++ b/group23/381519422/litestruts/src/main/java/com/xiaol/study/LoginAction.java @@ -0,0 +1,36 @@ +package com.xiaol.study; + +public class LoginAction { + private String name; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name) { + this.name = name; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMessage() { + return this.message; + } +} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java new file mode 100644 index 0000000000..cadbfc9300 --- /dev/null +++ b/group23/381519422/litestruts/src/main/java/com/xiaol/study/Struts.java @@ -0,0 +1,176 @@ +package com.xiaol.study; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.management.RuntimeErrorException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + + + +public class Struts { + + // 每一个action的信息存放到一个Map里 + // 所有的Map放到rootMap方便统一管理 + private static HashMap> rootMap = new HashMap>(); + + public static View runAction(String actionName, Map parameters) { + View view = new View(); + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + try { + // 1、初始化读取配置文件 + init(); + + // 2、获取根据参数获取对应的class的名字 + Map actionMap = rootMap.get(actionName); + String className = actionMap.get("class"); + // 3、根据名字获取Class对象 + Class clazzType = Class.forName(className); + // 4、通过无参构造获取一个对象 + Object newInstance = clazzType.getConstructor(new Class[] {}).newInstance(new Object[] {}); + // 5、调用set方法,把("name"="test" , "password"="1234")值set进去 + Set> entrySet = parameters.entrySet(); + Iterator> iterator = entrySet.iterator(); + while (iterator.hasNext()) { + Entry next = iterator.next(); + String key = next.getKey(); + String value = next.getValue(); + String setMethodName = "set" + key.substring(0, 1).toUpperCase() + key.substring(1); + Field declaredField = clazzType.getDeclaredField(key); + Method setMehtod = clazzType.getDeclaredMethod(setMethodName, new Class[] { declaredField.getType() }); + setMehtod.invoke(newInstance, value); + } + // 6、执行execute方法 + String executeMethodName = "execute"; + Method executeMethod = clazzType.getDeclaredMethod(executeMethodName); + Object resultString = (String) executeMethod.invoke(newInstance); + + // 7、通过反射获取message信息 + String getMethodName = "getMessage"; + Field declaredField = clazzType.getDeclaredField("message"); + Method getMehtod = clazzType.getDeclaredMethod(getMethodName); + String message = (String) getMehtod.invoke(newInstance); + + // 8\ + String jsp = actionMap.get(resultString); + view.setJsp(jsp); + Map hashMap = new HashMap<>(); + hashMap.put("message", message); + view.setParameters(hashMap); + } catch (Exception e) { + e.printStackTrace(); + throw new ExceptionInInitializerError(); + } + return view; + } + + public static void init() throws Exception { + + // 1、获取工厂实例 + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + // 2、获取dom解析器 + DocumentBuilder db = dbf.newDocumentBuilder(); + // 3、解析xml文档,获取document对象(根节点) + // 也可以获取流使用db.parse(InputStream) + // InputStream is = + // this.getClass().getResourceAsStream("D:\\GitHub\\coding2017\\group23\\381519422\\litestruts\\src\\main\\resources\\struts.xml"); + Document document = db.parse( + new File("D:\\GitHub\\coding2017\\group23\\381519422\\litestruts\\src\\main\\resources\\struts.xml")); + NodeList list = document.getElementsByTagName("action"); + + /* + * 开始循环list,list中每一个元素结构如下 + * + /jsp/homepage.jsp + /jsp/showLogin.jsp + + */ + for (int i = 0; i < list.getLength(); i++) { + Map actionMap = new HashMap(); + // 注意:使用的都是org.w3c.dom包下的 + Element element = (Element) list.item(i); + // 获取中 name对应的属性值 + String actionAttributeName = element.getAttribute("name"); + String className = element.getAttribute("class"); + actionMap.put("class", className); + + // 读取第一个action + NamedNodeMap nnm = element.getElementsByTagName("result").item(0).getAttributes(); + // 获取的属性 name + // String nodeName = nnm.item(0).getNodeName(); + // element.getElementsByTagName("result").item(0) + // 是/jsp/homepage.jsp + // getFirstChild().getNodeValue() 是获取上面内容的/jsp/homepage.jsp + String context = element.getElementsByTagName("result").item(0).getTextContent(); + // 获取的属性 name对应的值success + String nodeValue = nnm.item(0).getNodeValue(); + actionMap.put(nodeValue, context); + + // 读取第二个action + nnm = element.getElementsByTagName("result").item(1).getAttributes(); + // 获取的属性 name + // nodeName = nnm.item(0).getNodeName(); + context = element.getElementsByTagName("result").item(1).getFirstChild().getNodeValue(); + // 获取的属性 name对应的值success + nodeValue = nnm.item(0).getNodeValue(); + actionMap.put(nodeValue, context); + + rootMap.put(actionAttributeName, actionMap); + } + } + + public static void main(String[] args) { + try { + init(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + // 内部类用于存放从配置文件读取的数据 + class StrutsMap { + private HashMap map; + + public String get(String key) { + return map.get(key); + } + + public void set(String key, String value) { + map.put(key, value); + } + } +} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java new file mode 100644 index 0000000000..40bc45d280 --- /dev/null +++ b/group23/381519422/litestruts/src/main/java/com/xiaol/study/StrutsTest.java @@ -0,0 +1,43 @@ +package com.xiaol.study; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java b/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java new file mode 100644 index 0000000000..03a1538403 --- /dev/null +++ b/group23/381519422/litestruts/src/main/java/com/xiaol/study/View.java @@ -0,0 +1,26 @@ +package com.xiaol.study; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + + public Map getParameters() { + return parameters; + } + + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..5f56b80bff --- /dev/null +++ b/group23/563253496/week4_jvm1/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,81 @@ +package com.coderising.jvm.loader; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + String path = getClassFilePath(className); + if (path != null) { + try { + BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path)); + int count = bis.available(); + byte[] content = new byte[count]; + int len = bis.read(content,0,count); + return content; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + + + } + + private byte[] loadClassFile(String clzFileName) { + + return null; + } + + + public void addClassPath(String path) { + clzPaths.add(path); + } + + public String getClassPath_V1() { + + return null; + } + + public String getClassPath() { + StringBuilder sb = new StringBuilder(); + for (String s : clzPaths) { + sb.append(s); + sb.append(";"); + } + sb.deleteCharAt(sb.length() - 1); + return sb.toString(); + } + + private String getClassFilePath(String className) { + StringBuilder sb = new StringBuilder(); + for (String path : clzPaths + ) { + sb.append(path); + sb.append("\\"); + char[] classname = className.toCharArray(); + for (int i = 0; i < classname.length; i++) { + if (classname[i] == '.') { + sb.append("\\"); + + } else { + sb.append(classname[i]); + } + } + sb.append(".class"); + String classpath = sb.toString(); + File file = new File(classpath); + if (file.exists()) { + return classpath; + } + } + return null; + } +} diff --git a/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java new file mode 100644 index 0000000000..1e00b5f2f5 --- /dev/null +++ b/group23/563253496/week4_jvm1/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -0,0 +1,92 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.loader.ClassFileLoader; + + + + + +public class ClassFileloaderTest { + + + static String path1 = "D:\\mygit\\coding2017\\group23\\563253496\\week5_jvm\\out\\production\\untitled"; + static String path2 = "C:\\temp"; + + + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + + } + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "com.coderising.jvm.test.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "com.coderising.jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i +* @since
     29, 2017
    +* @version 1.0 +*/ 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()); + } + +} diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..650ca8375d --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,75 @@ +package com.coderising.jvm.clz; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..577e41536b --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.loader; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + private byte[] codes; + private int pos; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + this.pos = 0; + } + + public byte[] getCodes(int length) { + if (this.pos + length >= this.codes.length) { + throw new IndexOutOfBoundsException(); + } + + byte[] buffer = new byte[length]; + for (int i = 0; i < length; i++) { + buffer[i] = this.codes[pos++]; + } + return buffer; + } + + public int nextU1ToInt() { + return Util.byteToInt(new byte[]{codes[pos++]}); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[]{codes[pos++], codes[pos++]}); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextU4ToHexString() { + return Util.byteToHexString(new byte[]{codes[pos++], codes[pos++], codes[pos++], codes[pos++]}); + } + + public String nextUxToHexString(int len) { + byte[] buffer = new byte[len]; + for (int i = 0; i < len; i++) { + buffer[i] = this.codes[pos++]; + } + return Util.byteToHexString(buffer); + } + + public void back(int i) { + this.pos -= i; + + } +} diff --git a/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..be4e12c7de --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..c3e3931582 --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,31 @@ +package com.coderising.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/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group23/563253496/week5_jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 s.size()) { + throw new IndexOutOfBoundsException(); + } + Object[] o = new Object[len]; + Stack temp = new Stack(); + + for (int i = 0; i < len; i++) { + o[i] = s.peek(); + temp.push(s.pop()); + + } + while (!temp.isEmpty()) { + s.push(temp.pop()); + } + return o; + + } + + + /** + * 字符串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) { + char[] chars = s.toCharArray(); + Stack stack = new Stack(); + + for (int i = 0; i < chars.length; i++) { + switch (chars[i]) { + case '(': + stack.push('('); + break; + case '[': + stack.push('['); + break; + case '{': + stack.push('{'); + break; + case ')': + if (!stack.pop().equals('(')) { + return false; + } + break; + case ']': + if (!stack.pop().equals('[')) { + return false; + } + break; + case '}': + if (!stack.pop().equals('{')) { + return false; + } + break; + } + } + + return true; + } + + +} diff --git a/group23/563253496/week5_stack/src/test/StackUtilTest.java b/group23/563253496/week5_stack/src/test/StackUtilTest.java new file mode 100644 index 0000000000..fc1e727103 --- /dev/null +++ b/group23/563253496/week5_stack/src/test/StackUtilTest.java @@ -0,0 +1,95 @@ +package test; + +import junit.framework.Assert; +import org.junit.Test; +import org.junit.Before; +import org.junit.After; + +import stack.Stack; +import stack.StackUtil; + +import static com.sun.xml.internal.ws.dump.LoggingDumpTube.Position.After; +import static com.sun.xml.internal.ws.dump.LoggingDumpTube.Position.Before; + +/** +* stack.StackUtil Tester. +* +* @author +* @since
     8, 2017
    +* @version 1.0 +*/ +public class StackUtilTest { + +@Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: reverse(stack.Stack s) +* +*/ +@Test +public void testReverse() throws Exception { +//TODO: Test goes here... + Stack s = new Stack(); + for (int i = 1; i <=5 ; i++) { + s.push(i); + } + Assert.assertEquals("5,4,3,2,1,",s.toString()); + StackUtil.reverse(s); + + Assert.assertEquals("1,2,3,4,5,",s.toString()); +} + +/** +* +* Method: remove(stack.Stack s, Object o) +* +*/ +@Test +public void testRemove() throws Exception { + Stack s = new Stack(); + for (int i = 1; i <=5 ; i++) { + s.push(i); + } + Assert.assertEquals("5,4,3,2,1,",s.toString()); + StackUtil.remove(s,1); + + Assert.assertEquals("5,4,3,2,",s.toString()); +//TODO: Test goes here... +} + +/** +* +* Method: getTop(stack.Stack s, int len) +* +*/ +@Test +public void testGetTop() throws Exception { +//TODO: Test goes here... +} + +/** +* +* Method: isValidPairs(String s) +* +*/ +@Test +public void testIsValidPairs() throws Exception { +//TODO: Test goes here... + String s = "([e{d}f])"; + boolean b = StackUtil.isValidPairs(s); + Assert.assertEquals(true,b); + s = "([b{x]y})"; + b = StackUtil.isValidPairs(s); + Assert.assertEquals(false,b); + +} + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..9bace446db --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,142 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.cmd.*; +import sun.text.CodePointIterator; + +import java.io.UnsupportedEncodingException; + + +public class CodeAttr extends AttributeInfo { + private int maxStack; + private int maxLocals; + private int codeLen; + private String code; + + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen, String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter) { + + int attribute_name_index = iter.nextU2ToInt(); + if (!clzFile.getConstantPool().getUTF8String(attribute_name_index).equalsIgnoreCase(CODE)) { + throw new RuntimeException("CODE属性的attributenameindex解析错误"); + } + + int attribute_len = iter.nextU4ToInt(); + byte[] bytes = iter.getBytes(attribute_len); + ByteCodeIterator codeIter = new ByteCodeIterator(bytes); + + int max_stack = codeIter.nextU2ToInt(); + int max_locals = codeIter.nextU2ToInt(); + int code_len = codeIter.nextU4ToInt(); + /*byte[] codes = codeIter.getBytes(code_len); + + String code = null; + try { + + code = new String(codes, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } +*/ + + String code = codeIter.nextUxToHexString(code_len); + + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); + + CodeAttr codeAttr = new CodeAttr(attribute_name_index, attribute_len, max_stack, max_locals, code_len, code, cmds); + + int exception_table_len = codeIter.nextU2ToInt(); + if (exception_table_len > 0) { + throw new RuntimeException("方法的code属性中有异常未进行解析"); + } + + //code中的属性 + int attribute_count = codeIter.nextU2ToInt(); + /*byte[] bytes1 = codeIter.getBytes(attribute_length); + ByteCodeIterator codeAttrIter = new ByteCodeIterator(bytes1); + + while (codeAttrIter.isNotEnd()) { + int attributenameindex = codeAttrIter.nextU2ToInt(); + if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LINE_NUM_TABLE)) { + LineNumberTable table = LineNumberTable.parse(codeAttrIter, attributenameindex); + codeAttr.setLineNumberTable(table); + } else if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LOCAL_VAR_TABLE)) { + LocalVariableTable table = LocalVariableTable.parse(codeAttrIter,attributenameindex); + codeAttr.setLocalVariableTable(table); + }else if(clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(STACK_MAP_TABLE)){ + codeIter.back(2); + StackMapTable table = StackMapTable.parse(codeIter); + codeAttr.setStackMapTable(table); + } + }*/ + for (int i = 0; i < attribute_count; i++) { + int attributenameindex = codeIter.nextU2ToInt(); + if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LINE_NUM_TABLE)) { + LineNumberTable table = LineNumberTable.parse(codeIter, attributenameindex); + codeAttr.setLineNumberTable(table); + } else if (clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(LOCAL_VAR_TABLE)) { + LocalVariableTable table = LocalVariableTable.parse(codeIter,attributenameindex); + codeAttr.setLocalVariableTable(table); + }else if(clzFile.getConstantPool().getUTF8String(attributenameindex).equalsIgnoreCase(STACK_MAP_TABLE)){ + codeIter.back(2); + StackMapTable table = StackMapTable.parse(codeIter); + codeAttr.setStackMapTable(table); + } + + } + + + + + return codeAttr; + } + + private void setStackMapTable(StackMapTable t) { + this.stackMapTable = t; + + } + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem { + int startPC; + int lineNum; + + public int getStartPC() { + return startPC; + } + + public void setStartPC(int startPC) { + this.startPC = startPC; + } + + public int getLineNum() { + return lineNum; + } + + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + + public void addLineNumberItem(LineNumberItem item) { + this.items.add(item); + } + + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter, int attribute_name_index) { + int ccc = (iter.codes.length); + long attribute_len = iter.nextU4ToInt(); + int line_number_table_len = iter.nextU2ToInt(); + LineNumberTable table = new LineNumberTable(attribute_name_index,(int)attribute_len); + + /*byte[] bytes = iter.getBytes(line_number_table_len); + ByteCodeIterator lntIter = new ByteCodeIterator(bytes);*/ + + + /*while (lntIter.isNotEnd()) { + //int c = lntIter.codes.length; + LineNumberItem item = new LineNumberItem(); + item.setStartPC(lntIter.nextU2ToInt()); + item.setLineNum(lntIter.nextU2ToInt()); + table.addLineNumberItem(item); + }*/ + + + + for (int i = 0; i items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static LocalVariableTable parse(ByteCodeIterator iter,int attribute_name_index) { + int attribute_len = iter.nextU2ToInt(); + + byte[] bytes = iter.getBytes(attribute_len); + ByteCodeIterator lvtIter = new ByteCodeIterator(bytes); + + LocalVariableTable table = new LocalVariableTable(attribute_name_index,attribute_len); + + while(lvtIter.isNotEnd()){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(lvtIter.nextU2ToInt()); + item.setLength(lvtIter.nextU2ToInt()); + item.setNameIndex(lvtIter.nextU2ToInt()); + item.setDescIndex(lvtIter.nextU2ToInt()); + item.setIndex(lvtIter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + + + return table; + } + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..aa4f4cb5ad --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,113 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f) { + this.fields.add(f); + } + + public List getFields() { + return this.fields; + } + + public void addMethod(Method m) { + this.methods.add(m); + } + + public List getMethods() { + return methods; + } + + + 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(); + } + + public Method getMethod(String methodName, String paramAndReturnType) { + Method method = new Method(this,this.accessFlag,) + + } + + public Method getMainMethod() { + + + } +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..d84508c68b --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,130 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; +import com.sun.org.apache.bcel.internal.generic.BIPUSH; +import com.sun.org.apache.bcel.internal.generic.INVOKESPECIAL; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + codes = codes.toUpperCase(); + if (codes == "" || codes == null) { + throw new RuntimeException("codes为空!"); + } + List cmds = new LinkedList(); + + CommandIterator iter = new CommandIterator(codes); + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + if (opCode.equals(new_object)) { + NewObjectCmd newObjectCmd = new NewObjectCmd(clzFile,opCode); + newObjectCmd.setOprand1(iter.next2CharAsInt()); + newObjectCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(newObjectCmd); + } else if (opCode.equals(dup)||opCode.equals(astore_1)||opCode.equals(aload_0)||opCode.equals(aload_1)||opCode.equals(aload_2)||opCode.equals(voidreturn)) { + NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, opCode); + cmds.add(noOperandCmd); + + }else if (opCode.equals(ldc)){ + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + }else if (opCode.equals(bipush)){ + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equals(invokespecial)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (opCode.equals(invokevirtual)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + }else{ + throw new RuntimeException(opCode + "未进行判断!"); + } + } + + calcuateOffset(cmds); + ByteCodeCommand[] cmd = (ByteCodeCommand[])cmds.toArray(); + return cmd; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..aea9048ea4 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,24 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..466b072244 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,29 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..86c0445695 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,29 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..65475e194c --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,54 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..7f05870020 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,55 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..402f9dec86 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,45 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..936736016f --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,13 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..f1f8eb4ed4 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,26 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..5cac9f04f7 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,32 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..dc4dfff971 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,44 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + int accessflag = iter.nextU2ToInt(); + int nameindex = iter.nextU2ToInt(); + int descriptorindex = iter.nextU2ToInt(); + int attributecount = iter.nextU2ToInt(); + if (attributecount > 0) { + throw new RuntimeException("该字段中有属性" + attributecount + "个,未进行解析"); + } + Field field = new Field(accessflag, nameindex, descriptorindex, pool); + return field; + + } + public String toString() { + return pool.getUTF8String(this.nameIndex)+":"+pool.getUTF8String(this.descriptorIndex); + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..40b792eda5 --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,65 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + public byte[] codes; + public int pos = 0; + + public ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } + + public boolean isNotEnd(){ + if(pos 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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand[] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group23/563253496/week6_jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java b/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java b/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java b/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java b/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/List.java b/group23/563253496/week6_stack/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/Queue.java b/group23/563253496/week6_stack/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..4576c016af --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayList.java @@ -0,0 +1,35 @@ +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java new file mode 100644 index 0000000000..45740e6d57 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coding.basic.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..24b9d8b155 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,164 @@ +package com.coding.basic.linklist; + + +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/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java new file mode 100644 index 0000000000..f4c7556a2e --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/linklist/LinkedList.java @@ -0,0 +1,125 @@ +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..fff3778da5 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,64 @@ +package com.coding.basic.stack; + +import java.util.ArrayList; +import java.util.ArrayList; + +/** + * Created by bdl19 on 2017/4/8. + */ +public class Stack { + private int count; + private ArrayList elementData; + + public Stack() { + this.count = 0; + elementData = new ArrayList(); + } + + public void push(Object o) { + count++; + elementData.add(o); + + } + + public Object pop() { + count--; + Object o = elementData.get(count); + elementData.remove(count); + return o; + } + + public Object peek() { + + return elementData.get(count-1); + } + + public boolean isEmpty() { + if (count == 0) { + return true; + } else { + return false; + } + } + + public int size() { + return count; + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + Stack s = new Stack(); + while(!this.isEmpty()){ + sb.append(this.peek().toString()); + sb.append(","); + s.push(this.pop()); + } + while(!s.isEmpty()){ + this.push(s.pop()); + } + +// sb.deleteCharAt(sb.length()-1); + return sb.toString(); + } +} + diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..70bd34e37f --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,136 @@ +package com.coding.basic.stack; +import java.util.Stack; +public class StackUtil { + + public static void bad_reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Integer top = s.pop(); + reverse(s); + addToBottom(s,top); + + + } + public static void addToBottom(Stack s, Integer value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Integer top = s.pop(); + addToBottom(s,value); + s.push(top); + } + + } + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + + while(!s.isEmpty()){ + Object value = s.pop(); + if(!value.equals(o)){ + tmpStack.push(value); + } + } + + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + + if(s == null || s.isEmpty() || s.size() stack = new Stack(); + for(int i=0;i s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + + StackUtil.addToBottom(s, 0); + + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + + } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..091c670ba8 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,112 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +import java.util.HashMap; + +public class InfixExpr { + String expr = null; + char[] chars; + Stack opStack; + Stack numStack; + private HashMap level = new HashMap<>(); + + int pos; + + public InfixExpr(String expr) { + this.expr = expr; + + + this.level.put('+', 0); + this.level.put('-', 0); + this.level.put('*', 1); + this.level.put('/', 1); + + + this.opStack = new Stack(); + this.numStack = new Stack(); + this.pos = 0; + } + + public float evaluate() { + chars = expr.toCharArray(); + while (this.pos < chars.length) { + if (isOp(chars[pos])) { + if (opStack.isEmpty()) { + opStack.push(chars[pos]); + pos++; + } else { + //TODO analyze + char op = (char) opStack.pop(); + if (level.get(chars[pos]) <= level.get(op)) { + + int c = this.caculate(op); + numStack.push(c); + opStack.push(chars[pos]); + pos++; + + + }else { + opStack.push(op); + opStack.push(chars[pos]); + pos++; + } + } + } else { + int num = this.getNumber(); + numStack.push(num); + + } + } + + while(!opStack.isEmpty()){ + char op = (char) opStack.pop(); + + int c = this.caculate(op); + numStack.push(c); + } + + return (int)numStack.pop(); + } + + private boolean isOp(char c) { + switch (c) { + case '+': + case '-': + case '*': + case '/': + return true; + + default: + return false; + } + } + + private int getNumber() { + int num = Integer.parseInt("" + chars[pos]); + pos++; + while ((pos < chars.length)&&(!isOp(chars[pos])) ) { + num *= 10; + num += Integer.parseInt("" + chars[pos]); + pos++; + } + return num; + } + + private int caculate(char c) { + int b = (int) numStack.pop(); + int a = (int) numStack.pop(); + switch (c) { + case '+': + return a + b; + case '-': + return a - b; + case '*': + return a * b; + case '/': + return a / b; + } + return -1; + } +} + diff --git a/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..20f52b4c63 --- /dev/null +++ b/group23/563253496/week6_stack/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,48 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..88f60c77f6 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/AttributeInfo.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.attr; + +public abstract class AttributeInfo { + public static final String CODE = "Code"; + public static final String CONST_VALUE = "ConstantValue"; + public static final String EXCEPTIONS = "Exceptions"; + public static final String LINE_NUM_TABLE = "LineNumberTable"; + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; + public static final String STACK_MAP_TABLE = "StackMapTable"; + int attrNameIndex; + int attrLen ; + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..a57a8b5446 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/CodeAttr.java @@ -0,0 +1,72 @@ +package com.coderising.jvm.attr; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private ByteCodeCommand[] cmds ; + public ByteCodeCommand[] getCmds() { + return cmds; + } + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + return null; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..962c3b8bc4 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..14db5dca46 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/LocalVariableTable.java @@ -0,0 +1,42 @@ +package com.coderising.jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ConstantPool; + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + return null; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..18f2ad0360 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.attr; + + +import com.coderising.jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java new file mode 100644 index 0000000000..faae056835 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/AccessFlag.java @@ -0,0 +1,25 @@ +package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java new file mode 100644 index 0000000000..2a8dfb6123 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassFile.java @@ -0,0 +1,102 @@ +package com.coderising.jvm.clz; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.field.Field; +import com.coderising.jvm.method.Method; + +public class ClassFile { + + private int minorVersion; + private int majorVersion; + + private AccessFlag accessFlag; + private ClassIndex clzIndex; + private ConstantPool pool; + private List fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + + return null; + } + public Method getMainMethod(){ + + return null; + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java new file mode 100644 index 0000000000..e424f284b3 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/clz/ClassIndex.java @@ -0,0 +1,19 @@ +package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..cd0fbd4848 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..a3abeacc82 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,128 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + + //public abstract void execute(StackFrame frame,FrameResult result); +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..2bb36340f5 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,85 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + + + return null; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..2e6061edd2 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6cf9d5960 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ac228d0e4d --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..c15d827797 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,22 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..ffb66f811c --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..33813b5d59 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..56c28fefe2 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,23 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..963d064257 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..85bb369c19 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,19 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..c8e65ff493 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java new file mode 100644 index 0000000000..88353df2d3 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantInfo.java @@ -0,0 +1,40 @@ +package com.coderising.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); + } + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java new file mode 100644 index 0000000000..7130eb3a9f --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/ConstantPool.java @@ -0,0 +1,31 @@ +package com.coderising.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 int getSize() { + return this.constantInfos.size() -1; + } + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java new file mode 100644 index 0000000000..7ae71396ef --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/FieldRefInfo.java @@ -0,0 +1,58 @@ +package com.coderising.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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java new file mode 100644 index 0000000000..036e6d9055 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/MethodRefInfo.java @@ -0,0 +1,60 @@ +package com.coderising.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(); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java new file mode 100644 index 0000000000..5cbbba6033 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NameAndTypeInfo.java @@ -0,0 +1,51 @@ +package com.coderising.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()+")"; + } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java new file mode 100644 index 0000000000..41e0fd7e7a --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/NullConstantInfo.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.constant; + +public class NullConstantInfo extends ConstantInfo { + + public NullConstantInfo(){ + + } + @Override + public int getType() { + return -1; + } + @Override + public void accept(Visitor visitor) { + + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java new file mode 100644 index 0000000000..6bfcb47273 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/StringInfo.java @@ -0,0 +1,32 @@ +package com.coderising.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); + } + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java new file mode 100644 index 0000000000..7db88a939e --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/constant/UTF8Info.java @@ -0,0 +1,37 @@ +package com.coderising.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; + } + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + + } + + + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java new file mode 100644 index 0000000000..c6eb0196f8 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/field/Field.java @@ -0,0 +1,50 @@ +package com.coderising.jvm.field; + +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java new file mode 100644 index 0000000000..6fb5570dff --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ByteCodeIterator.java @@ -0,0 +1,57 @@ +package com.coderising.jvm.loader; + +import java.util.Arrays; + +import com.coderising.jvm.util.Util; + +public class ByteCodeIterator { + byte[] codes; + int pos = 0; + + ByteCodeIterator(byte[] codes) { + this.codes = codes; + } + + + + public byte[] getBytes(int len) { + if (pos + len >= codes.length) { + throw new ArrayIndexOutOfBoundsException(); + } + + byte[] data = Arrays.copyOfRange(codes, pos, pos + len); + pos += len; + return data; + } + + public int nextU1toInt() { + + return Util.byteToInt(new byte[] { codes[pos++] }); + } + + public int nextU2ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++] }); + } + + public int nextU4ToInt() { + return Util.byteToInt(new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] }); + } + + public String nextU4ToHexString() { + return Util.byteToHexString((new byte[] { codes[pos++], codes[pos++], codes[pos++], codes[pos++] })); + } + + public String nextUxToHexString(int len) { + byte[] tmp = new byte[len]; + + for (int i = 0; i < len; i++) { + tmp[i] = codes[pos++]; + } + return Util.byteToHexString(tmp).toLowerCase(); + + } + + public void back(int n) { + this.pos -= n; + } +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..33185d8175 --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/loader/ClassFileLoader.java @@ -0,0 +1,140 @@ +package com.coderising.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.coderising.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()); + } + + /** + * 下面是第三次JVM课应实现的测试用例 + */ + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + +} diff --git a/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..12e3d7efdd --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -0,0 +1,28 @@ +package com.coderising.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/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java b/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java new file mode 100644 index 0000000000..0c4cc8c57c --- /dev/null +++ b/group23/563253496/week7_jvm/src/com/coderising/jvm/util/Util.java @@ -0,0 +1,24 @@ +package com.coderising.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 parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java b/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java b/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java b/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java b/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/List.java b/group23/563253496/week7_stack/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java new file mode 100644 index 0000000000..4576c016af --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayList.java @@ -0,0 +1,35 @@ +package com.coding.basic.array; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java new file mode 100644 index 0000000000..45740e6d57 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coding.basic.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java new file mode 100644 index 0000000000..994a241a3d --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrame.java @@ -0,0 +1,57 @@ +package com.coding.basic.linklist; + + +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) { + + + } + + + 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/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java new file mode 100644 index 0000000000..7fd72fc2b4 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LRUPageFrameTest.java @@ -0,0 +1,34 @@ +package com.coding.basic.linklist; + +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/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java new file mode 100644 index 0000000000..f4c7556a2e --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/linklist/LinkedList.java @@ -0,0 +1,125 @@ +package com.coding.basic.linklist; + +import com.coding.basic.Iterator; +import com.coding.basic.List; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..1ac659da3d --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,5 @@ +package com.coding.basic.queue; + +public class CircleQueue { + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..d629d847f4 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,19 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 知道最后一个人留下来 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + + return null; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d90318b51 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..c4c4b7325e --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/Queue.java @@ -0,0 +1,61 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..bbd4715ca6 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,40 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return false; + } + + + + public int size() { + return -1; + } + + + + public void enQueue(E item) { + + } + + public E deQueue() { + return null; + } + + + } + diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java new file mode 100644 index 0000000000..de597befb4 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/Stack.java @@ -0,0 +1,64 @@ +package com.coding.basic.stack; + +import java.util.ArrayList; +import java.util.ArrayList; + +/** + * Created by bdl19 on 2017/4/8. + */ +public class Stack { + private int count; + private ArrayList elementData; + + public Stack() { + this.count = 0; + elementData = new ArrayList(); + } + + public void push(Object o) { + count++; + elementData.add(o); + + } + + public Object pop() { + count--; + Object o = elementData.get(count); + elementData.remove(count); + return o; + } + + public Object peek() { + + return elementData.get(count-1); + } + + public boolean isEmpty() { + if (count == 0) { + return true; + } else { + return false; + } + } + + public int size() { + return count; + } + + public String toString(){ + StringBuilder sb = new StringBuilder(); + Stack s = new Stack(); + while(!this.isEmpty()){ + sb.append(this.peek().toString()); + sb.append(","); + s.push(this.pop()); + } + while(!s.isEmpty()){ + this.push(s.pop()); + } + +// sb.deleteCharAt(sb.length()-1); + return sb.toString(); + } +} + diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java new file mode 100644 index 0000000000..0148188b29 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/StackUtil.java @@ -0,0 +1,136 @@ +package com.coding.basic.stack; +import java.util.Stack; +public class StackUtil { + + public static void bad_reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + /** + * 假设栈中的元素是Integer, 从栈顶到栈底是 : 5,4,3,2,1 调用该方法后, 元素次序变为: 1,2,3,4,5 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + */ + public static void reverse(Stack s) { + if(s == null || s.isEmpty()){ + return; + } + Integer top = s.pop(); + reverse(s); + addToBottom(s,top); + + + } + public static void addToBottom(Stack s, Integer value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Integer top = s.pop(); + addToBottom(s,value); + s.push(top); + } + + } + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + + while(!s.isEmpty()){ + Object value = s.pop(); + if(!value.equals(o)){ + tmpStack.push(value); + } + } + + while(!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + + if(s == null || s.isEmpty() || s.size() stack = new Stack(); + for(int i=0;i s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..ef85ff007f --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExpr.java @@ -0,0 +1,15 @@ +package com.coding.basic.stack.expr; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + return 0.0f; + } + + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..20e34e8852 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..92c31a1085 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,110 @@ +package com.coding.basic.stack.expr; + +import com.coding.basic.stack.Stack; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +public class InfixToPostfix { + private static List op = new ArrayList(); + + public static List convert(String expr) { + op.add('+'); + op.add('-'); + op.add('*'); + op.add('/'); + List numList = new LinkedList<>(); + List opList = new LinkedList<>(); + + List list = new ArrayList(); + + + char[] chars = expr.toCharArray(); + + int index = 0; + while (index < chars.length) { + if (op.contains(chars[index])) { + if (chars[index] == '*' || chars[index] == '/') { + + char oper = chars[index]; + + StringBuilder sb = new StringBuilder(); + index++; + while (chars[index] >= '0' && chars[index] <= '9') { + sb.append(chars[index]); + index++; + } + String s = numList.get(numList.size() - 1); + numList.remove(numList.size() - 1); + StringBuilder buffer = new StringBuilder(); + buffer.append(s + ' '); + buffer.append(sb); + buffer.append(oper); + numList.add(buffer.toString()); + //numStack.push(buffer.toString()); + + } else { + opList.add("" + chars[index]); + //opStack.push(chars[index]); + } + index++; + } else if (chars[index] == ' ') { + index++; + } else { + StringBuilder sb = new StringBuilder(); + while (chars[index] >= '0' && chars[index] <= '9') { + sb.append(chars[index]); + index++; + } + numList.add(sb.toString()); + //numStack.push(sb.toString()); + } + + } + + int opListIndex = 0; + while (opListIndex < opList.size()) { + for (int i = 0; i < opList.size(); i++) { + String a = numList.get(0); + String b = numList.get(1); + numList.set(0, a + " " + b + " " + opList.get(opListIndex)); + numList.remove(1); + } + } + + String postfixExpr = numList.get(0); + char[] chars1 = postfixExpr.toCharArray(); + index = 0; + while (index < chars1.length) { + if (chars1[index] == '+') { + Token token = new Token(1, "+"); + list.add(token); + } else if (chars1[index] == '-') { + Token token = new Token(1, "-"); + list.add(token); + } else if (chars1[index] == '*') { + Token token = new Token(1, "*"); + list.add(token); + } else if (chars1[index] == '/') { + Token token = new Token(1, "/"); + list.add(token); + }else if (chars1[index] == ' '){ + index++; + }else { + StringBuilder sb = new StringBuilder(); + while (chars1[index] >= '0' && chars1[index] <= '9') { + sb.append(chars1[index]); + index++; + } + Token token = new Token(2, sb.toString()); + list.add(token); + } + + } + + return list; + } + + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..8400bef4f8 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,95 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + int count; + ArrayList operator = new ArrayList(); + Stack numStack = new Stack(); + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + operator.add('+'); + operator.add('-'); + operator.add('*'); + operator.add('/'); + this.count = 0; + char[] exprs = this.expr.toCharArray(); + + + + while (count < exprs.length) { + if (operator.contains(exprs[count])) { + switch (exprs[count]) { + case '+': + add(); + break; + case '-': + subtract(); + break; + case '*': + multiply(); + break; + case '/': + divide(); + break; + + } + this.count++; + } else if (exprs[count] == ' ') { + this.count++; + } else { + int num = getNum(exprs); + numStack.push(num); + } + + } + int result = (int)numStack.pop(); + return result; + } + + private int getNum(char[] exprs) { + + int num = exprs[count]-'0'; + this.count++; + + while (exprs[count] >= '0' && exprs[count] <= '9') { + + num *= 10; + num += exprs[count]-'0'; + this.count++; + } + return num; + } + + private void add() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(a + b); + } + + private void subtract() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(b - a); + } + + private void multiply() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(b * a); + } + + private void divide() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(b / a); + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..7a2c0379a1 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,98 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + int index; + ArrayList operator = new ArrayList(); + Stack numStack = new Stack(); + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + operator.add('+'); + operator.add('-'); + operator.add('*'); + operator.add('/'); + char[] exprs = this.expr.toCharArray(); + this.index = exprs.length - 1; + + while (index >= 0) { + if (operator.contains(exprs[index])) { + switch (exprs[index]) { + case '+': + add(); + break; + case '-': + subtract(); + break; + case '*': + multiply(); + break; + case '/': + divide(); + break; + + } + this.index--; + } else if (exprs[index] == ' ') { + this.index--; + } else { + int num = getNum(exprs); + numStack.push(num); + } + + } + int result = (int) numStack.pop(); + return result; + + } + + private int getNum(char[] exprs) { + + int num = exprs[index] - '0'; + this.index--; + int i = 10; + while (exprs[index] >= '0' && exprs[index] <= '9') { + + int temp = exprs[index] - '0'; + temp *= i; + num += temp; + i *= 10; + this.index--; + } + return num; + } + + private void add() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(a + b); + } + + private void subtract() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(a - b); + } + + private void multiply() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(b * a); + } + + private void divide() { + int a = (int) numStack.pop(); + int b = (int) numStack.pop(); + numStack.push(a / b); + } + + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..8579743fe9 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..d3b0f167e1 --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..399d3e857e --- /dev/null +++ b/group23/563253496/week7_stack/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group23/563253496/week8_datastructure/src/CircleQueue.java b/group23/563253496/week8_datastructure/src/CircleQueue.java new file mode 100644 index 0000000000..f69e5e6c5b --- /dev/null +++ b/group23/563253496/week8_datastructure/src/CircleQueue.java @@ -0,0 +1,53 @@ +/** + * Created by bdl19 on 2017/4/25. + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE]; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return this.front == this.rear; + } + + public int size() { + int size = this.rear - this.front; + return size < 0 ? size += DEFAULT_SIZE : size; + + } + + + public void enQueue(E data) { + if (this.isFull()) { + System.out.println("队列已满"); + return; + } + elementData[this.rear] = data; + this.rear = ++this.rear % DEFAULT_SIZE; + } + + + public E deQueue() { + if (this.isEmpty()) { + System.out.println("队列为空"); + return null; + } + E ele; + ele = (E) elementData[this.front]; + this.front = (++this.front) % DEFAULT_SIZE; + return ele; + } + + public boolean isFull() { + if ((this.rear + 1) % DEFAULT_SIZE == this.front) { + return true; + } else return false; + } +} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/Josephus.java b/group23/563253496/week8_datastructure/src/Josephus.java new file mode 100644 index 0000000000..3d1425e125 --- /dev/null +++ b/group23/563253496/week8_datastructure/src/Josephus.java @@ -0,0 +1,47 @@ +/** + * Created by bdl19 on 2017/4/25. + */ + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, + * N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * "[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2) + * + * @author liuxin + */ +public class Josephus { + + public static List execute(int n, int m) { + List result = new ArrayList<>(); + + List list = new LinkedList(); + int interval = m - 1; + + for (int i = 0; i < n; i++) { + list.add(i); + } + int index = 0; + while (list.size() > 0) { + /*for (int i = 0; i < m; i++) { + index = (++index) % list.size(); + + }*/ + index += interval; + index %= list.size(); + result.add(list.get(index)); + list.remove(index); + + } + + + return result; + } + +} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/JosephusTest.java b/group23/563253496/week8_datastructure/src/JosephusTest.java new file mode 100644 index 0000000000..fb38138a32 --- /dev/null +++ b/group23/563253496/week8_datastructure/src/JosephusTest.java @@ -0,0 +1,28 @@ +/** + * Created by bdl19 on 2017/4/25. + */ +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/Queue.java b/group23/563253496/week8_datastructure/src/Queue.java new file mode 100644 index 0000000000..e2f5ce9a41 --- /dev/null +++ b/group23/563253496/week8_datastructure/src/Queue.java @@ -0,0 +1,62 @@ +/** + * Created by bdl19 on 2017/4/25. + */ +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} \ No newline at end of file diff --git a/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java b/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java new file mode 100644 index 0000000000..c960f09bbb --- /dev/null +++ b/group23/563253496/week8_datastructure/src/QueueWithTwoStacks.java @@ -0,0 +1,60 @@ +/** + * Created by bdl19 on 2017/4/25. + */ +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + + return stack1.isEmpty(); + } + + + + public int size() { + return stack1.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + E ele ; + if (stack1.size() == 0) { + throw new RuntimeException("队列为空!"); + } + while (stack1.size() > 1) { + stack2.push(stack1.pop()); + } + ele = stack1.pop(); + while(!stack2.isEmpty()){ + stack1.push(stack2.pop()); + } + + return ele; + } + + + +} \ No newline at end of file diff --git a/group23/563253496/week9_datastructure/src/QuickMinStack.java b/group23/563253496/week9_datastructure/src/QuickMinStack.java new file mode 100644 index 0000000000..3b135521a0 --- /dev/null +++ b/group23/563253496/week9_datastructure/src/QuickMinStack.java @@ -0,0 +1,40 @@ +//package com.coding.basic.stack; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * + * @author liuxin + */ +public class QuickMinStack { + LinkedList list = new LinkedList(); + LinkedList temp = new LinkedList<>(); + int min = Integer.MAX_VALUE; + + public void push(int data) { + if (data < min) { + min = data; + } + list.add(data); + } + + public int pop() { + int num = list.remove(list.size() - 1); + if (num == min) { + for (int tmp : list) { + temp.add(tmp); + } + } + Collections.sort(temp); + min = temp.get(0); + return list.remove(list.size() - 1); + } + + public int findMin() { + return min; + } +} \ No newline at end of file diff --git a/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java b/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java new file mode 100644 index 0000000000..238f5cff0f --- /dev/null +++ b/group23/563253496/week9_datastructure/src/StackWithTwoQueues.java @@ -0,0 +1,53 @@ +/** + * Created by bdl19 on 2017/5/6. + */ + +import java.util.*; + + +public class StackWithTwoQueues { + + private Queue queue1 = new LinkedList(); + private Queue queue2 = new LinkedList(); + + public void push(int data) { + if(queue2.isEmpty()){ + queue1.add(data); + }else{ + queue2.add(data); + } + } + + public int pop() { + if (queue1.size() == 0 && queue2.size() == 0) { + throw new IndexOutOfBoundsException(); + } + + + + if(queue2.isEmpty()){ + while(!(queue1.size()==1)){ + queue2.add(queue1.remove()); + } + return queue1.remove(); + + }else{ + while(!(queue2.size()==1)){ + queue1.add(queue2.remove()); + } + return queue2.remove(); + } + + + } + + public static void main(String[] args) { + StackWithTwoQueues s = new StackWithTwoQueues(); + s.push(1); + s.push(2); + s.push(3); + for (int i = 0; i < 3; i++) { + System.out.println(s.pop()); + } + } +} \ No newline at end of file diff --git a/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java b/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java new file mode 100644 index 0000000000..28bc0a30af --- /dev/null +++ b/group23/563253496/week9_datastructure/src/TwoStackInOneArray.java @@ -0,0 +1,100 @@ +/** + * Created by bdl19 on 2017/5/6. + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = data.length - 1; + + private boolean isFull() { + if (index1 == index2) { + return true; + } else return false; + } + + private void extendCapacity() { + Object[] temp = new Object[data.length + data.length / 2]; + for (int i = 0; i <= index1; i++) { + temp[i] = data[i]; + } + int indext = data.length - 1; + for (int i = temp.length - 1; i >= data.length - index2; i--) { + temp[i] = indext; + indext--; + } + index2 = temp.length - (temp.length - index1); + this.data = temp; + } + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + if (this.isFull()) { + extendCapacity(); + } + data[index1] = o; + index1++; + + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + index1--; + Object o = data[index1]; + data[index1] = null; + return o; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return data[index1 - 1]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + if (this.isFull()) { + extendCapacity(); + } + data[index2] = o; + index2--; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + + Object o = data[++index2]; + data[index2] = null; + return o; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + + return data[index2 + 1]; + } + +} \ No newline at end of file diff --git a/group23/565832157/src/com/coderising/array/ArrayUtil.java b/group23/565832157/src/com/coderising/array/ArrayUtil.java new file mode 100644 index 0000000000..e5ddb476a6 --- /dev/null +++ b/group23/565832157/src/com/coderising/array/ArrayUtil.java @@ -0,0 +1,96 @@ +package com.coderising.array; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + + public int[] removeZero(int[] oldArray){ + return null; + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + return null; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + return null; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + public int[] fibonacci(int max){ + return null; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + */ + public int[] getPrimes(int max){ + return null; + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + return null; + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator){ + return null; + } + + +} diff --git a/group23/565832157/src/com/coderising/download/DownloadThread.java b/group23/565832157/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..900a3ad358 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,20 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + + public DownloadThread( Connection conn, int startPos, int endPos){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + + } +} diff --git a/group23/565832157/src/com/coderising/download/FileDownloader.java b/group23/565832157/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..c3c8a3f27d --- /dev/null +++ b/group23/565832157/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,73 @@ +package com.coderising.download; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/565832157/src/com/coderising/download/FileDownloaderTest.java b/group23/565832157/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..4ff7f46ae0 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://localhost:8080/test.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/565832157/src/com/coderising/download/api/Connection.java b/group23/565832157/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..0957eaf7f4 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/565832157/src/com/coderising/download/api/ConnectionException.java b/group23/565832157/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..1551a80b3d --- /dev/null +++ b/group23/565832157/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/565832157/src/com/coderising/download/api/ConnectionManager.java b/group23/565832157/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..ce045393b1 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/565832157/src/com/coderising/download/api/DownloadListener.java b/group23/565832157/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..bf9807b307 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java b/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..36a9d2ce15 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,27 @@ +package com.coderising.download.impl; + +import java.io.IOException; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + return null; + } + + @Override + public int getContentLength() { + + return 0; + } + + @Override + public void close() { + + + } + +} diff --git a/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..172371dd55 --- /dev/null +++ b/group23/565832157/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,15 @@ +package com.coderising.download.impl; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + + return null; + } + +} diff --git a/group23/565832157/src/com/coderising/litestruts/LoginAction.java b/group23/565832157/src/com/coderising/litestruts/LoginAction.java new file mode 100644 index 0000000000..dcdbe226ed --- /dev/null +++ b/group23/565832157/src/com/coderising/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package com.coderising.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group23/565832157/src/com/coderising/litestruts/Struts.java b/group23/565832157/src/com/coderising/litestruts/Struts.java new file mode 100644 index 0000000000..6df190d484 --- /dev/null +++ b/group23/565832157/src/com/coderising/litestruts/Struts.java @@ -0,0 +1,37 @@ +package com.coderising.litestruts; + +import java.lang.reflect.Method; +import java.util.Map; + + + +public class Struts { + + + public static View runAction(String actionName, Map parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + + return null; + } + +} diff --git a/group23/565832157/src/com/coderising/litestruts/StrutsTest.java b/group23/565832157/src/com/coderising/litestruts/StrutsTest.java new file mode 100644 index 0000000000..b8c81faf3c --- /dev/null +++ b/group23/565832157/src/com/coderising/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.coderising.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/565832157/src/com/coderising/litestruts/View.java b/group23/565832157/src/com/coderising/litestruts/View.java new file mode 100644 index 0000000000..07df2a5dab --- /dev/null +++ b/group23/565832157/src/com/coderising/litestruts/View.java @@ -0,0 +1,23 @@ +package com.coderising.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/565832157/src/com/coding/basic/ArrayList.java b/group23/565832157/src/com/coding/basic/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/ArrayList.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group23/565832157/src/com/coding/basic/BinaryTreeNode.java b/group23/565832157/src/com/coding/basic/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/565832157/src/com/coding/basic/Iterator.java b/group23/565832157/src/com/coding/basic/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/565832157/src/com/coding/basic/LinkedList.java b/group23/565832157/src/com/coding/basic/LinkedList.java new file mode 100644 index 0000000000..77657e57c1 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/LinkedList.java @@ -0,0 +1,265 @@ +<<<<<<< HEAD:liuxin/src/com/coding/basic/LinkedList.java +package com.coding.basic; + +public class LinkedList implements List { + private int size; + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + + return size; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + } + + /** + * 把该链表逆置 + * head head + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + /** + * 长度超过1的单链表需要逆转 + */ + if(size>1){ + Node pre = head; + Node cur = head.next; + Node next = null; + while(cur!=null){ + next = cur.next; + cur.next = pre; + pre = cur; + cur = next; + } + + } + } + + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始,删除length个元素 ,注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection(LinkedList list){ + + return null; + } +} +======= +package com.coding.basic; + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} +>>>>>>> upstream/master:group23/565832157/src/com/coding/basic/LinkedList.java diff --git a/group23/565832157/src/com/coding/basic/List.java b/group23/565832157/src/com/coding/basic/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/565832157/src/com/coding/basic/Queue.java b/group23/565832157/src/com/coding/basic/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group23/565832157/src/com/coding/basic/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group23/565832157/src/com/coding/basic/Stack.java b/group23/565832157/src/com/coding/basic/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group23/565832157/src/com/coding/basic/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group23/601689050/.gitattributes b/group23/601689050/.gitattributes new file mode 100644 index 0000000000..bdb0cabc87 --- /dev/null +++ b/group23/601689050/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/group23/601689050/1List&BinaryTreeNode/ArrayList.java b/group23/601689050/1List&BinaryTreeNode/ArrayList.java new file mode 100644 index 0000000000..5a4169dc9b --- /dev/null +++ b/group23/601689050/1List&BinaryTreeNode/ArrayList.java @@ -0,0 +1,58 @@ +package com.bjsxd.test; + +public class ArrayList implements List { + private Object[] elementData = new Object[100]; + private int size = 0; + Object[] temp = null; + + public void add(Object o) { + if (size < elementData.length) { + size++; + Object[] target = new Object[elementData.length + size]; + System.arraycopy(elementData, 0, target, 0, elementData.length); + elementData[size] = o; + } + } + + public void add(int index, Object o) { + if (index < 0 || o == null) { + throw new IllegalArgumentException("��Ӷ������"); + } else if (index <= elementData.length) { + add(o); + } else if (index > elementData.length) { + throw new IllegalArgumentException("��Ӷ���Խ��"); + } + + if (size <= elementData.length) { + this.size++; + } + Object[] target = new Object[this.size]; + System.arraycopy(elementData, 0, target, 0, index); + target[index] = o; + System.arraycopy(elementData, index, target, index + 1, elementData.length - index); + } + + public Object get(int index) { + if (index < 0 || index >= elementData.length) { + return false; + } else { + return elementData[index]; + } + } + + public Object remove(int index) { + if (index < 0 || index >= elementData.length) { + throw new IllegalArgumentException("ɾ�����󲻴���"); + } else { + for (int i = index; i < elementData.length; i++) { + elementData[i] = elementData[i + 1]; + } + return elementData[index]; + } + } + + public int size() { + return this.size; + } + +} diff --git a/group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java b/group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java new file mode 100644 index 0000000000..3687306f5e --- /dev/null +++ b/group23/601689050/1List&BinaryTreeNode/BinaryTreeNode.java @@ -0,0 +1,50 @@ +package com.bjsxd.test; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + private BinaryTreeNode root; + + public BinaryTreeNode(BinaryTreeNode root){ + this.root = root; + + } + + public BinaryTreeNode(BinaryTreeNode left,BinaryTreeNode right,Object data){ + this.left = left; + this.right = right; + this.data = data; + } + + public void buildTree(){ + + } + + public BinaryTreeNode(Object data){ + this(null,null,data); + } + public Object getData(){ + return data; + } + public void setData(Object data){ + this.data = data; + } + public BinaryTreeNode getLeft(){ + return left; + } + public void setLeft(BinaryTreeNode left){ + this.left = left; + + } + public BinaryTreeNode getRight(){ + return right; + } + public void setRight(BinaryTreeNode right){ + this.right = right; + } + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/601689050/1List&BinaryTreeNode/Iterator.java b/group23/601689050/1List&BinaryTreeNode/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/601689050/1List&BinaryTreeNode/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/601689050/1List&BinaryTreeNode/LinkedList.java b/group23/601689050/1List&BinaryTreeNode/LinkedList.java new file mode 100644 index 0000000000..ee173bec67 --- /dev/null +++ b/group23/601689050/1List&BinaryTreeNode/LinkedList.java @@ -0,0 +1,117 @@ +package com.bjsxd.test; + +public class LinkedList implements List{ + private static class Node{ + Object data; + Node next; + } + private Node head; + private Node last; + public void add (Object o){ + if (head == null){ + head = new Node(); + head.data = o; + head.next = null; + }else{ + Node MyNode = new Node(); + MyNode = head; + while (MyNode.next != null){ + MyNode = MyNode.next; + } + Node AddNode = new Node(); + MyNode.next = AddNode; + AddNode.data = o; + } + } + public void add(int index,Object o){ + if(index<0 || o ==null){ + throw new IllegalArgumentException("ӶλóҲΪ"); + }else if (index == 0 && head == null){ + head = new Node(); + head.data = o; + head.next = null; + }else if (index > 0 && head == null){ + throw new IllegalArgumentException("Ӷλó"); + }else{ + Node SrcNode = new Node(); + Node AddNode = new Node(); + Node SrcNode2 = new Node(); + SrcNode = head; + for(int i=0;i<=index;i++){ + SrcNode = SrcNode.next; + } + AddNode.next = SrcNode; + AddNode.data = o; + for (int i=0;i size){ + throw new IllegalArgumentException("ɾλó"); + }else{ + for (int i=0;i front){ + return rear - front; + }else + return Q.length-1; + } + +} diff --git a/group23/601689050/1List&BinaryTreeNode/Stack.java b/group23/601689050/1List&BinaryTreeNode/Stack.java new file mode 100644 index 0000000000..106d2ecc7d --- /dev/null +++ b/group23/601689050/1List&BinaryTreeNode/Stack.java @@ -0,0 +1,39 @@ +package com.bjsxd.test; + +public class Stack { + private int top = -1; + private Object[] elements; + private int size = 0; + public Stack(){ + elements = new Object[100]; + } + public void push (Object o){ + elements[this.size] = o; + this.size++; + } + public Object pop(){ + if (this.size != 0){ + Object temp = elements[size-1]; + elements[size-1]=0; + size--; + return temp; + }else{ + System.out.println("ջ"); + return 0; + } + } + public Object peek(){ + if(!this.isEmpty()){ + Object temp = elements[this.size-1]; + elements[this.size-1] = 0; + this.size--; + return temp; + }else{ + System.out.println("ջ"); + return 0; + } + } + public boolean isEmpty(){ + return this.size == 0; + } +} diff --git a/group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java b/group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java new file mode 100644 index 0000000000..3c6244ff90 --- /dev/null +++ b/group23/601689050/4weekLRU&JVM/JVM/loader/ClassFileLoader.java @@ -0,0 +1,65 @@ +package loader; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; +/** + * Created by Lxx on 2017/4/23. + */ +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,";"); + } + + +} diff --git a/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java b/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java new file mode 100644 index 0000000000..8e4e172f25 --- /dev/null +++ b/group23/601689050/4weekLRU&JVM/JVM/test/loader/ClassFileLoaderTest.java @@ -0,0 +1,86 @@ +package test.loader; + +import loader.ClassFileLoader; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ClassFileLoaderTest { + static String path1 = "D:\\JavaProject\\4week_minijvm\\out\\production\\4week_minijvm"; + static String path2 = "D:\\temp"; + + + + @Before +public void before() throws Exception { +} + +@After +public void after() throws Exception { +} + +/** +* +* Method: readBinaryCode(String className) +* +*/ +public void testClassPath(){ + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + loader.addClassPath(path2); + + String clzPath = loader.getClassPath(); + + Assert.assertEquals(path1+";"+path2,clzPath); + +} + + @Test + public void testClassFileLength() { + + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + + String className = "test.loader.EmployeeV1"; + + byte[] byteCodes = loader.readBinaryCode(className); + + // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 + Assert.assertEquals(1056, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path1); + String className = "test.loader.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + + + String acctualValue = this.byteToHexString(codes); + + Assert.assertEquals("cafebabe", acctualValue); + } + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i capacity) { + last = last.prev; + last.next = null; + } + } else { + moveToFirst(iteratorNode); + } + } + } + + } + + private void moveLastToFirst() { + last.next = first; + first.prev = last; + first = last; + last = last.prev; + last.next = null; + first.prev = null; + } + private void moveToFirst(Node iteratorNode){ + iteratorNode.prev.next = iteratorNode.next; + iteratorNode.next.prev = iteratorNode.prev; + iteratorNode.prev = null; + iteratorNode.next = first; + first.prev = iteratorNode; + first = iteratorNode; + } + + private void addToFirst(int pageNum) { + Node node = new Node(); + node.pageNum = pageNum; + node.prev = null; + node.next = first; + first.prev = node; + first = node; + size++; + } + + + 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/group23/601689050/4weekLRU&JVM/LRU/LRUPageFrameTest.java b/group23/601689050/4weekLRU&JVM/LRU/LRUPageFrameTest.java new file mode 100644 index 0000000000..a7dd99ec58 --- /dev/null +++ b/group23/601689050/4weekLRU&JVM/LRU/LRUPageFrameTest.java @@ -0,0 +1,29 @@ +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()); + } + +} diff --git a/group23/601689050/4weekLRU&JVM/LRU/LinkedList.java b/group23/601689050/4weekLRU&JVM/LRU/LinkedList.java new file mode 100644 index 0000000000..4a71816e5d --- /dev/null +++ b/group23/601689050/4weekLRU&JVM/LRU/LinkedList.java @@ -0,0 +1,313 @@ +import java.util.Objects; +import java.util.Stack; + +public class LinkedList implements List { + + private Node head; + private Node rear; + public boolean isEmpty(){ + return true; + } + + public void add(Object o){ + if(isEmpty()) + addFirst(o); + else + addLast(o); + } + public void add(int index , Object o){ + if(index<0 || o ==null){ + throw new IllegalArgumentException("不合法"); + } else if (index == 0 && head == null){ + addFirst(o); + }else if(index>0 && head == null){ + throw new IllegalArgumentException("不合法"); + }else{ + Node srcNode = (Node) this.get(index); + Node newNode = new Node(); + newNode.data = o; + newNode.next = srcNode.next; + srcNode.next.previous = newNode; + srcNode.next = newNode; + newNode.previous = srcNode; + } + } + public Object get(int index){ + Node newNode = new Node(); + for(int i = 0;i7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + Node p1,p2 = null; + p1 = head; + while (head.next != null){ + p2 = head.next; + head.next = p2.next; + p2.next = p1; + p1 = p2; + } + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + int size = this.size(); + Node newNode = new Node(); + newNode = head; + if(size%2 == 0){ + int length = size/2; + for(int i = 0;i101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + int[] listB = new int[list.size()-1]; + int[] listA = new int[list.size()-1]; + int size = list.size(); + for(int i=0;i min && (int)newNode.data min && (int)newNode.data > max){ + break; + } + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + LinkedList listA = this; + LinkedList listB = list; + LinkedList listC = new LinkedList(); + if(listA == null){ + return list; + } + if(listB == null){ + return this; + } + Node p1 = listA.head; + Node p2 = listB.head; + Node p3 = listC.head; + while(p1 != null && p2 !=null) { + if ((int) p1.data <= (int) p2.data) { + p3.next = p1; + p1 = p1.next; + } else { + p3.next = p2; + p2 = p2.next; + } + p3 = p3.next; + } + if(p1 == null){ + p3.next = p2; + } + if(p2 == null){ + p3.next = p1; + } + return listC; + } +} diff --git a/group23/601689050/4weekLRU&JVM/LRU/List.java b/group23/601689050/4weekLRU&JVM/LRU/List.java new file mode 100644 index 0000000000..4f7bcc71a8 --- /dev/null +++ b/group23/601689050/4weekLRU&JVM/LRU/List.java @@ -0,0 +1,7 @@ +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/601689050/5weekStack/stack/Stack.java b/group23/601689050/5weekStack/stack/Stack.java new file mode 100644 index 0000000000..7b394d9f30 --- /dev/null +++ b/group23/601689050/5weekStack/stack/Stack.java @@ -0,0 +1,70 @@ +package stack; + +import java.util.ArrayList; +import java.util.EmptyStackException; + +/** + * Created by Lxx on 2017/4/23. + */ +public class Stack { + + private ArrayList array; + private int count; + + + public Stack() { + array = new ArrayList(); + } + + public void push(Object o) { + count++; + array.add(o); + + } + + public Object pop() { + count--; + Object o = array.get(count); + array.remove(count); + + return o; + } + + public Object peek() { + + if(count == 0){ + throw new EmptyStackException(); + } + return array.get(array.size()-1); + } + + public boolean isEmpty() { + return array.size() == 0; + } + + public int size() { + + return count; + } + + public String toString(){ + + StringBuilder string = new StringBuilder(); + Stack s = new Stack(); + int size = this.size(); + for(int i = 0; i < size; i++){ + string.append(this.peek().toString()); + if(i < size-1 ) + string.append(","); + s.push(this.pop()); + } + + while(!s.isEmpty()){ + this.push(s.pop()); + } + + return string.toString(); + } + + +} diff --git a/group23/601689050/5weekStack/stack/StackUtil.java b/group23/601689050/5weekStack/stack/StackUtil.java new file mode 100644 index 0000000000..00920cdb08 --- /dev/null +++ b/group23/601689050/5weekStack/stack/StackUtil.java @@ -0,0 +1,133 @@ +package stack; + +/** + * Created by Lxx on 2017/4/23. + */ +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) { + if(s == null || s.isEmpty()){ + return; + } + + Stack tmp = new Stack(); + while(!s.isEmpty()){ + tmp.push(s.pop()); + } + while(!tmp.isEmpty()){ + Integer top = (Integer) tmp.pop(); + addToBottom(s,top); + } + + + } + public static void addToBottom(Stack s, Integer value){ + if(s.isEmpty()){ + s.push(value); + } else{ + Integer top = (Integer) s.pop(); + addToBottom(s,value); + s.push(top); + } + + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s, Object o) { + + if(s == null || s.isEmpty()){ + return; + } + Stack tmpStack = new Stack(); + Stack s1 = new Stack(); + while(!s.isEmpty()){ + Object value = s.pop(); + if(!value.equals(o)){ + tmpStack.push(value); + } + } + + while(!tmpStack.isEmpty()){ + s1.push(tmpStack.pop()); + } + while(!s1.isEmpty()){ + s.push(s1.pop()); + } + + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param len + * @return + */ + public static Object[] getTop(Stack s, int len) { + + if(s == null || s.isEmpty() || s.size() < len || len <= 0){ + return null; + } + Stack tmpStack = new Stack(); + int i = 0; + Object[] topElement = new Object[len]; + while(!s.isEmpty()){ + Object top = s.pop(); + tmpStack.push(top); + topElement[i++] = top; + if(i == len){ + break; + } + } + while (!tmpStack.isEmpty()){ + s.push(tmpStack.pop()); + } + return topElement; + } + + + /** + * 字符串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) { + + Stack tmpStack = new Stack(); + for (int i = 0; i < s.length(); i++) { + char tmpChar = s.charAt(i); + if (tmpChar == '(' || tmpChar == '{' || tmpChar == '[') { + tmpStack.push(tmpChar); + } else if (tmpChar == ')') { + char compareChar = (char) tmpStack.pop(); + if (compareChar != '(') { + return false; + } + } else if (tmpChar == ']') { + char compareChar = (char) tmpStack.pop(); + if (compareChar != '[') { + return false; + } + } else if (tmpChar == '}') { + char compareChar = (char) tmpStack.pop(); + if (compareChar != '{') { + return false; + } + } + } + return tmpStack.size() == 0; + } +} diff --git a/group23/601689050/5weekStack/test/StackUtilTest.java b/group23/601689050/5weekStack/test/StackUtilTest.java new file mode 100644 index 0000000000..413d9f3c4e --- /dev/null +++ b/group23/601689050/5weekStack/test/StackUtilTest.java @@ -0,0 +1,69 @@ +package test; +import stack.*; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import stack.StackUtil; + +/** + * Created by Lxx on 2017/4/23. + */ +public class StackUtilTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("5,4,3,2,1", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("1,2,3,4,5", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("1,3", s.toString()); + } + + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } + } + + @Test + public void testIsValidPairs() { + + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } + +} diff --git a/group23/601689050/6weekInfixExpr/InfixExpr.java b/group23/601689050/6weekInfixExpr/InfixExpr.java new file mode 100644 index 0000000000..7b833931b3 --- /dev/null +++ b/group23/601689050/6weekInfixExpr/InfixExpr.java @@ -0,0 +1,61 @@ +import java.util.*; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/28. + */ +public class InfixExpr { + String expr = null; + public InfixExpr(String expr){ + this.expr = expr; + } + public float evaluate(){ + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack numStack = new Stack(); + for(Token token : tokens){ + if(token.isOpretor()){ + if(opStack.isEmpty()){ + opStack.push(token); + }else { + while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(),f1,f2); + numStack.push(result); + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + while (!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + return numStack.pop().floatValue(); + + } + + private Float calculate(String op, float f1, float f2) { + if(op.equals("+")){ + return f1 + f2; + } + if(op.equals("-")){ + return f1 - f2; + } + if(op.equals("*")){ + return f1 * f2; + } + if(op.equals("/")){ + return f1 / f2; + } + return null; + } +} diff --git a/group23/601689050/6weekInfixExpr/InfixExprTest.java b/group23/601689050/6weekInfixExpr/InfixExprTest.java new file mode 100644 index 0000000000..bf2f8e91a9 --- /dev/null +++ b/group23/601689050/6weekInfixExpr/InfixExprTest.java @@ -0,0 +1,50 @@ +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Lxx on 2017/4/28. + */ +public class InfixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } +} diff --git a/group23/601689050/6weekInfixExpr/Stack.java b/group23/601689050/6weekInfixExpr/Stack.java new file mode 100644 index 0000000000..8a15be4366 --- /dev/null +++ b/group23/601689050/6weekInfixExpr/Stack.java @@ -0,0 +1,50 @@ +import java.util.ArrayList; +import java.util.EmptyStackException; + +/** + * Created by Lxx on 2017/4/28. + */ +public class Stack { + public ArrayList array; + public int count; + public Stack(){ + array = new ArrayList(); + } + public void push (Object o){ + count ++ ; + array.add(o); + } + public Object pop(){ + count -- ; + Object o = array.get(count); + array.remove(o); + return o; + } + public Object peek(){ + if(count == 0){ + throw new EmptyStackException(); + } + return array.get(array.size()-1); + } + public boolean isEmpty(){ + return array.size() == 0; + } + public int size(){ + return count; + } + public String toString(){ + StringBuilder string = new StringBuilder(); + Stack s = new Stack(); + int size = this.size(); + for(int i = 0;i OPERATORS = Arrays.asList("+","-","*","/"); + public static final Map priorities = new HashMap<>(); + static { + priorities.put("+",1); + priorities.put("-",1); + priorities.put("*",2); + priorities.put("/",2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type,String value){ + this.type = type; + this.value = value; + } + public boolean isNumber(){ + return type == NUMBER; + } + public boolean isOpretor(){ + return type == OPERATOR; + } + public int getIntValue(){ + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + public boolean hasHigherPriority(Token t){ + if (!this.isOpretor() && !t.isOpretor()){ + throw new RuntimeException(); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } +} diff --git a/group23/601689050/6weekInfixExpr/TokenParser.java b/group23/601689050/6weekInfixExpr/TokenParser.java new file mode 100644 index 0000000000..3e966cc0a3 --- /dev/null +++ b/group23/601689050/6weekInfixExpr/TokenParser.java @@ -0,0 +1,47 @@ +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Lxx on 2017/4/28. + */ +public class TokenParser { + public List parse(String expr){ + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + + char c = expr.charAt(i); + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR,String.valueOf(c)); + tokens.add(t); + i++; + }else if(Character.isDigit(c)){ + int nextOperatorIndex = indexOfNextOperator(i,expr); + String value = expr.substring(i,nextOperatorIndex); + Token t = new Token(Token.NUMBER,value); + tokens.add(t); + i = nextOperatorIndex; + }else { + System.out.println("输入值不符合要求"); + i++; + } + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + while(Character.isDigit(expr.charAt(i))){ + i++; + if(i == expr.length()){ + break; + } + } + return i; + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group23/601689050/7weekExpr2/InfixExpr.java b/group23/601689050/7weekExpr2/InfixExpr.java new file mode 100644 index 0000000000..77c310465e --- /dev/null +++ b/group23/601689050/7weekExpr2/InfixExpr.java @@ -0,0 +1,61 @@ +import java.util.List; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/29. + */ +public class InfixExpr { + String expr = null; + public InfixExpr(String expr){ + this.expr = expr; + } + public float evaluate(){ + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack numStack = new Stack(); + for(Token token : tokens){ + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + }else { + while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(),f1,f2); + numStack.push(result); + } + opStack.push(token); + } + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + while (!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + return numStack.pop().floatValue(); + + } + + private Float calculate(String op, float f1, float f2) { + if(op.equals("+")){ + return f1 + f2; + } + if(op.equals("-")){ + return f1 - f2; + } + if(op.equals("*")){ + return f1 * f2; + } + if(op.equals("/")){ + return f1 / f2; + } + return null; + } +} diff --git a/group23/601689050/7weekExpr2/InfixToPostfix.java b/group23/601689050/7weekExpr2/InfixToPostfix.java new file mode 100644 index 0000000000..7833ebf8f7 --- /dev/null +++ b/group23/601689050/7weekExpr2/InfixToPostfix.java @@ -0,0 +1,35 @@ +import java.util.*; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/29. + */ +public class InfixToPostfix { + + String expr = null; + public InfixToPostfix(String expr){ + this.expr = expr; + } + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack allStack = new Stack<>(); + public Stack change(){ + for(Token token : tokens){ + if(token.isOperator()){ + if(opStack.isEmpty()){ + opStack.push(token); + }else{ + while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ + Token preOperator = opStack.pop(); + allStack.push(preOperator.toString()); + } + } + } + if (token.isNumber()){ + allStack.push(token.toString()); + } + } + return allStack; + } +} diff --git a/group23/601689050/7weekExpr2/PostfixExpr.java b/group23/601689050/7weekExpr2/PostfixExpr.java new file mode 100644 index 0000000000..5c128db330 --- /dev/null +++ b/group23/601689050/7weekExpr2/PostfixExpr.java @@ -0,0 +1,45 @@ +import java.util.*; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/29. + */ +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack numStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + if(token.isOperator()){ + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(),f1,f2)); + } + } + return numStack.pop().floatValue(); + } + private Float calculate(String op, float f1, float f2){ + if(op.equals("+")){ + return f1 + f2; + } + if(op.equals("-")){ + return f1 - f2; + } + if(op.equals("*")){ + return f1 * f2; + } + if (op.equals("/")){ + return f1 / f2; + } + return null; + } +} diff --git a/group23/601689050/7weekExpr2/PostfixExprTest.java b/group23/601689050/7weekExpr2/PostfixExprTest.java new file mode 100644 index 0000000000..bad5b82bec --- /dev/null +++ b/group23/601689050/7weekExpr2/PostfixExprTest.java @@ -0,0 +1,37 @@ +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Lxx on 2017/4/29. + */ +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } +} diff --git a/group23/601689050/7weekExpr2/PrefixExpr.java b/group23/601689050/7weekExpr2/PrefixExpr.java new file mode 100644 index 0000000000..77652af742 --- /dev/null +++ b/group23/601689050/7weekExpr2/PrefixExpr.java @@ -0,0 +1,51 @@ +import java.util.*; +import java.util.Stack; + +/** + * Created by Lxx on 2017/4/29. + */ +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack numStack = new Stack<>(); + Stack allStack = new Stack<>(); + for (Token token : tokens) { + allStack.push(token); + } + while (!allStack.isEmpty()) { + if (allStack.peek().isNumber()) { + numStack.push(new Float(allStack.pop().getIntValue())); + } + if (allStack.peek().isOperator()) { + Token token = allStack.pop(); + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(token.toString(), f1, f2)); + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, float f1, float f2){ + if(op.equals("+")){ + return f1 + f2; + } + if(op.equals("-")){ + return f1 - f2; + } + if(op.equals("*")){ + return f1 * f2; + } + if (op.equals("/")){ + return f1 / f2; + } + return null; + } +} diff --git a/group23/601689050/7weekExpr2/PrefixExprTest.java b/group23/601689050/7weekExpr2/PrefixExprTest.java new file mode 100644 index 0000000000..8d1074d5d3 --- /dev/null +++ b/group23/601689050/7weekExpr2/PrefixExprTest.java @@ -0,0 +1,42 @@ +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by Lxx on 2017/4/29. + */ +public class PrefixExprTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + } +} diff --git a/group23/601689050/7weekExpr2/Stack.java b/group23/601689050/7weekExpr2/Stack.java new file mode 100644 index 0000000000..614ba2860c --- /dev/null +++ b/group23/601689050/7weekExpr2/Stack.java @@ -0,0 +1,50 @@ +import java.util.ArrayList; +import java.util.EmptyStackException; + +/** + * Created by Lxx on 2017/4/29. + */ +public class Stack { + public ArrayList array; + public int count; + public Stack(){ + array = new ArrayList(); + } + public void push (Object o){ + count ++ ; + array.add(o); + } + public Object pop(){ + count -- ; + Object o = array.get(count); + array.remove(o); + return o; + } + public Object peek(){ + if(count == 0){ + throw new EmptyStackException(); + } + return array.get(array.size()-1); + } + public boolean isEmpty(){ + return array.size() == 0; + } + public int size(){ + return count; + } + public String toString(){ + StringBuilder string = new StringBuilder(); + Stack s = new Stack(); + int size = this.size(); + for(int i = 0;i OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + +} diff --git a/group23/601689050/7weekExpr2/TokenParser.java b/group23/601689050/7weekExpr2/TokenParser.java new file mode 100644 index 0000000000..17716e0c08 --- /dev/null +++ b/group23/601689050/7weekExpr2/TokenParser.java @@ -0,0 +1,47 @@ +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Lxx on 2017/4/29. + */ +public class TokenParser { + public List parse(String expr){ + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + + char c = expr.charAt(i); + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR,String.valueOf(c)); + tokens.add(t); + i++; + }else if(Character.isDigit(c)){ + int nextOperatorIndex = indexOfNextOperator(i,expr); + String value = expr.substring(i,nextOperatorIndex); + Token t = new Token(Token.NUMBER,value); + tokens.add(t); + i = nextOperatorIndex; + }else { + //System.out.println("输入值不符合要求"); + i++; + } + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + while(Character.isDigit(expr.charAt(i))){ + i++; + if(i == expr.length()){ + break; + } + } + return i; + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group23/601689050/8weekQueue/CircleQueue.java b/group23/601689050/8weekQueue/CircleQueue.java new file mode 100644 index 0000000000..7ca98467ec --- /dev/null +++ b/group23/601689050/8weekQueue/CircleQueue.java @@ -0,0 +1,44 @@ +/** + * Created by lxx on 2017/5/6. + */ +public class CircleQueue{ + + private int size; + private int first; + private int last; + Object[] queue; + + public CircleQueue(int size){ + queue = new Object[size]; + first = 0; + last = 0; + } + + public boolean isEmpty(){ + return first == last; + } + + public void enCircleQueue(Object o){ + if( (last+1) % size == first){ + System.out.println("Circle Queue is full"); + }else { + queue[last] = o; + last = (last+1) % queue.length; + } + } + + public int getSize(){ + return (last - first + queue.length) % queue.length; + } + + public Object deCircleQueue(){ + if(isEmpty()){ + return null; + }else{ + Object item = queue[first]; + first = (first+1)%queue.length; + return item; + } + + } +} diff --git a/group23/601689050/8weekQueue/Josephus.java b/group23/601689050/8weekQueue/Josephus.java new file mode 100644 index 0000000000..6e24811da3 --- /dev/null +++ b/group23/601689050/8weekQueue/Josephus.java @@ -0,0 +1,50 @@ + +/** + * Created by lxx on 2017/5/6. + */ + + + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * @author + * + */ +public class Josephus { + + private static class Node { + int data; + Node next; + + public Node(int i) { + data = i; + } + } + + public static void execute(int n, int m) { + + Node header = new Node(0); + Node pointer = header; + for (int i = 1; i < n; i++) { + pointer.next = new Node(i); + pointer = pointer.next; + } + pointer.next = header; + while (pointer != pointer.next) { + for (int i = 1; i <= m; i++) { + pointer = pointer.next; + } + System.out.println(pointer.next.data); + pointer.next = pointer.next.next; + } + System.out.println(pointer.next.data); + + } + public static void main(String args[]){ + Josephus circle = new Josephus(); + circle.execute(8,4); + } +} diff --git a/group23/601689050/8weekQueue/Queue.java b/group23/601689050/8weekQueue/Queue.java new file mode 100644 index 0000000000..bdfd22b16f --- /dev/null +++ b/group23/601689050/8weekQueue/Queue.java @@ -0,0 +1,55 @@ +import javax.xml.soap.Node; +import java.util.NoSuchElementException; + +/** + * Created by lxx on 2017/5/6. + */ +public class Queue { + + private Node first; + private Node last; + private int size; + + private static class Node{ + private E item; + private Node next; + } + public Queue(){ + first = null; + last = null; + size = 0; + } + public boolean isEmpty(){ + return first == null; + } + public int size(){ + return size; + } + public void enQueue(E data){ + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if(isEmpty()){ + first = last; + }else { + oldlast.next = last; + } + size++; + } + public E deQueue(){ + if(isEmpty()){ + throw new NoSuchElementException("queue is empty"); + }else{ + E item = first.item; + first = first.next; + size--; + if(isEmpty()){ + last = null; + } + return item; + } + } + + +} diff --git a/group23/601689050/8weekQueue/QueueWithTwoStacks.java b/group23/601689050/8weekQueue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..c8976aca56 --- /dev/null +++ b/group23/601689050/8weekQueue/QueueWithTwoStacks.java @@ -0,0 +1,47 @@ +import java.util.Stack; + +/** + * Created by lxx on 2017/5/6. + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + public QueueWithTwoStacks(){ + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty(){ + return stack1.isEmpty() && stack2.isEmpty(); + } + + public int size() + { + return stack1.size() + stack2.size(); + } + + public void enQueue(E item){ + + stack1.push(item); + } + + public E deQueue(){ + if(stack2.isEmpty()){ + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + } + return stack2.pop(); + } + public static void main(String args[]){ + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + queue.enQueue(1); + queue.enQueue(5); + queue.enQueue(4); + queue.enQueue(0); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + } +} diff --git a/group23/601689050/9weekStack/QuickMinStack.java b/group23/601689050/9weekStack/QuickMinStack.java new file mode 100644 index 0000000000..4033461599 --- /dev/null +++ b/group23/601689050/9weekStack/QuickMinStack.java @@ -0,0 +1,50 @@ +/** + * Created by lxx on 2017/5/6. + */ + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack extends Stack { + + Stack sMin; + public QuickMinStack(){ + sMin = new Stack(); + } + public void push(int data){ + if(data <= findMin()){ + sMin.push(data); + } + super.push(data); + } + public Integer pop(){ + int value = super.pop(); + if(value == findMin()){ + sMin.pop(); + } + return value; + } + public int findMin(){ + if(sMin.isEmpty()){ + return Integer.MAX_VALUE; + } + return sMin.peek(); + } + + public static void main(String args[]){ + QuickMinStack stack = new QuickMinStack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(0); + System.out.println(stack.pop().intValue()); + System.out.println(stack.findMin()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } +} diff --git a/group23/601689050/9weekStack/StackWithTwoQueues.java b/group23/601689050/9weekStack/StackWithTwoQueues.java new file mode 100644 index 0000000000..8eb1d996bf --- /dev/null +++ b/group23/601689050/9weekStack/StackWithTwoQueues.java @@ -0,0 +1,52 @@ +import java.util.LinkedList; + + +/** + * Created by lxx on 2017/5/6. + */ +public class StackWithTwoQueues { + + LinkedList queue1=new LinkedList(); + LinkedList queue2=new LinkedList(); + public void push(int data){ + queue1.addLast(data); + } + public int pop() { + if (sSize() > 0) { + if (!queue1.isEmpty()) { + while (queue1.size() > 1) { + queue2.addLast(queue1.removeFirst()); + } + return queue1.removeFirst(); + } else { + while (queue2.size() > 1) { + queue1.addLast(queue2.removeFirst()); + } + return queue2.removeFirst(); + } + } else { + System.out.println("栈空,不能出栈"); + return Integer.MAX_VALUE; + } + } + public int sSize(){ + return queue1.size() + queue2.size(); + } + public static void main(String[] args) + { + StackWithTwoQueues stack=new StackWithTwoQueues(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + stack.push(5); + stack.push(6); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } +} diff --git a/group23/601689050/9weekStack/TwoStackInOneArray.java b/group23/601689050/9weekStack/TwoStackInOneArray.java new file mode 100644 index 0000000000..916e1dab3b --- /dev/null +++ b/group23/601689050/9weekStack/TwoStackInOneArray.java @@ -0,0 +1,81 @@ +import java.util.Stack; + +/** + * Created by lxx on 2017/5/6. + */ +public class TwoStackInOneArray { + + + + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = data.length - 1; + + + private boolean isFull() { + if (index1 == index2) { + return true; + } else + return false; + } + + private void extendCapacity() { + + } + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return null; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + return null; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + return null; + } + +} diff --git a/group23/609041842/src/code/ArrayList.java b/group23/609041842/src/code/ArrayList.java new file mode 100644 index 0000000000..8acbfe7de5 --- /dev/null +++ b/group23/609041842/src/code/ArrayList.java @@ -0,0 +1,49 @@ +package code; + +import java.util.Arrays; + +public class ArrayList { + + private Object[] obj = new Object[0]; + + public void add(Object o) { + Object[] tar = new Object[obj.length + 1]; + System.arraycopy(obj, 0, tar, 0, obj.length); + tar[tar.length - 1] = o; + obj = tar; + System.out.println(Arrays.toString(obj)); + } + + public void add(int index, Object o) { + Object[] tar = new Object[obj.length + 1]; + System.arraycopy(obj, 0, tar, 0, index); + tar[index] = o; + System.arraycopy(obj, index, tar, index + 1, obj.length - index); + obj = tar; + } + + public Object get(int index) { + return obj[index]; + } + + public int size(){ + return obj.length; + } + + public Object remove(int index){ + Object[] tar = new Object[obj.length-1]; + System.arraycopy(obj, 0, tar, 0, index); + System.arraycopy(obj, index+1, tar, index, obj.length-index-1); + Object o = obj[index]; + obj = tar; + return o;//رɾԪ + } + public static void main(String[] args) { + ArrayList al = new ArrayList(); + al.add("hello"); + al.add("java"); + al.add(2, "addm"); + System.out.println(al.remove(1)); + } + +} diff --git a/group23/609041842/src/code/LinkedList.java b/group23/609041842/src/code/LinkedList.java new file mode 100644 index 0000000000..e42138022e --- /dev/null +++ b/group23/609041842/src/code/LinkedList.java @@ -0,0 +1,87 @@ +package code; + +public class LinkedList { + private static Node head; + private Node last; + public int size; + + public void add(Object o) { + Node l = last; + Node newNode = new Node(l, o, null); + last = newNode; + if (head == null) { + head = newNode; + size = 1; + } else { + l.next = newNode; + size++; + } + } + + public void add(int index, Object o) { + Node n = node(index); + System.out.println(n.data); + Node pred = n.prev; + Node newNode = new Node(pred, o, n); + if (pred == null) { + head = newNode; + } else { + pred.next = newNode; + } + size++; + } + + + public Node get(int index){ + return node(index); + } + public Node node(int index) { + Node n = head; + for (int i = 0; i < index; i++) { + n = n.next; + } + return n; + } + + public Node remove(int index){ + Node del = node(index); + Node after = del.next; + Node before = del.prev; + before.next = after; + after.prev = before; + size--; + return del; + } + private static class Node { + Node next; + Object data; + Node prev; + + private Node(Node prev, Object data, Node next) { + this.data = data; + this.next = next; + this.prev = prev; + } + } + + public static void main(String[] arg) { + LinkedList ll = new LinkedList(); + ll.add("hello"); + ll.add("java"); + ll.add("jvm"); + ll.add("jvmd"); + // System.out.println(ll.get(2)); +// ll.add(1, "ds"); + System.out.println(ll.get(0).data); + System.out.println(ll.get(1).data); + System.out.println(ll.get(2).data); + System.out.println(ll.get(3).data); + System.out.println(ll.size); + System.out.println(ll.remove(1).data); + System.out.println(ll.get(0).data); + System.out.println(ll.get(1).data); + System.out.println(ll.get(2).data); + System.out.println(ll.size); + } + +} diff --git a/group23/609041842/src/code/Queue.java b/group23/609041842/src/code/Queue.java new file mode 100644 index 0000000000..d4f70c2125 --- /dev/null +++ b/group23/609041842/src/code/Queue.java @@ -0,0 +1,17 @@ +package code; + +public class Queue { + + private LinkedList lk = new LinkedList(); + public void enQueue(Object o){ + lk.add(o); + } + public void deQueue(){ + lk.remove(lk.size-1); + } + public boolean isEmpty(){ + if(lk.size == 0) + return true; + return false; + } +} diff --git a/group23/609041842/src/code/Stack.java b/group23/609041842/src/code/Stack.java new file mode 100644 index 0000000000..7226d4d403 --- /dev/null +++ b/group23/609041842/src/code/Stack.java @@ -0,0 +1,30 @@ +package code; + +public class Stack { + + private ArrayList array = new ArrayList(); + + public void push(Object o){ + array.add(o); + } + public Object pop(){ + return array.remove(array.size()-1); + } + + public boolean isEmpty(){ + if(array.size()<=0) + return true; + return false; + } + + public int size(){ + return array.size(); + } + public static void main(String[] args) { + Stack sc = new Stack(); + sc.push("hello world"); + sc.push("java"); + sc.push("jvm"); + } + +} diff --git a/group23/609041842/src/com/homework01/ArrayList.java b/group23/609041842/src/com/homework01/ArrayList.java new file mode 100644 index 0000000000..1702690ae7 --- /dev/null +++ b/group23/609041842/src/com/homework01/ArrayList.java @@ -0,0 +1,49 @@ +package com.homework01; + +import java.util.Arrays; + +public class ArrayList { + + private Object[] obj = new Object[0]; + + public void add(Object o) { + Object[] tar = new Object[obj.length + 1]; + System.arraycopy(obj, 0, tar, 0, obj.length); + tar[tar.length - 1] = o; + obj = tar; + System.out.println(Arrays.toString(obj)); + } + + public void add(int index, Object o) { + Object[] tar = new Object[obj.length + 1]; + System.arraycopy(obj, 0, tar, 0, index); + tar[index] = o; + System.arraycopy(obj, index, tar, index + 1, obj.length - index); + obj = tar; + } + + public Object get(int index) { + return obj[index]; + } + + public int size(){ + return obj.length; + } + + public Object remove(int index){ + Object[] tar = new Object[obj.length-1]; + System.arraycopy(obj, 0, tar, 0, index); + System.arraycopy(obj, index+1, tar, index, obj.length-index-1); + Object o = obj[index]; + obj = tar; + return o;//���ر�ɾԪ�� + } + public static void main(String[] args) { + ArrayList al = new ArrayList(); + al.add("hello"); + al.add("java"); + al.add(2, "addm"); + System.out.println(al.remove(1)); + } + +} diff --git a/group23/609041842/src/com/homework01/LinkedList.java b/group23/609041842/src/com/homework01/LinkedList.java new file mode 100644 index 0000000000..cc72fc2e4c --- /dev/null +++ b/group23/609041842/src/com/homework01/LinkedList.java @@ -0,0 +1,87 @@ +package com.homework01; + +public class LinkedList { + private static Node head; + private Node last; + public int size; + + public void add(Object o) { + Node l = last; + Node newNode = new Node(l, o, null); + last = newNode; + if (head == null) { + head = newNode; + size = 1; + } else { + l.next = newNode; + size++; + } + } + + public void add(int index, Object o) { + Node n = node(index); + System.out.println(n.data); + Node pred = n.prev; + Node newNode = new Node(pred, o, n); + if (pred == null) { + head = newNode; + } else { + pred.next = newNode; + } + size++; + } + + + public Node get(int index){ + return node(index); + } + public Node node(int index) { + Node n = head; + for (int i = 0; i < index; i++) { + n = n.next; + } + return n; + } + + public Node remove(int index){ + Node del = node(index); + Node after = del.next; + Node before = del.prev; + before.next = after; + after.prev = before; + size--; + return del; + } + private static class Node { + Node next; + Object data; + Node prev; + + private Node(Node prev, Object data, Node next) { + this.data = data; + this.next = next; + this.prev = prev; + } + } + + public static void main(String[] arg) { + LinkedList ll = new LinkedList(); + ll.add("hello"); + ll.add("java"); + ll.add("jvm"); + ll.add("jvmd"); + // System.out.println(ll.get(2)); +// ll.add(1, "ds"); + System.out.println(ll.get(0).data); + System.out.println(ll.get(1).data); + System.out.println(ll.get(2).data); + System.out.println(ll.get(3).data); + System.out.println(ll.size); + System.out.println(ll.remove(1).data); + System.out.println(ll.get(0).data); + System.out.println(ll.get(1).data); + System.out.println(ll.get(2).data); + System.out.println(ll.size); + } + +} diff --git a/group23/609041842/src/com/homework01/Queue.java b/group23/609041842/src/com/homework01/Queue.java new file mode 100644 index 0000000000..db8fb359b5 --- /dev/null +++ b/group23/609041842/src/com/homework01/Queue.java @@ -0,0 +1,17 @@ +package com.homework01; + +public class Queue { + + private LinkedList lk = new LinkedList(); + public void enQueue(Object o){ + lk.add(o); + } + public void deQueue(){ + lk.remove(lk.size-1); + } + public boolean isEmpty(){ + if(lk.size == 0) + return true; + return false; + } +} diff --git a/group23/609041842/src/com/homework01/Stack.java b/group23/609041842/src/com/homework01/Stack.java new file mode 100644 index 0000000000..ee5d71d830 --- /dev/null +++ b/group23/609041842/src/com/homework01/Stack.java @@ -0,0 +1,30 @@ +package com.homework01; + +public class Stack { + + private ArrayList array = new ArrayList(); + + public void push(Object o){ + array.add(o); + } + public Object pop(){ + return array.remove(array.size()-1); + } + + public boolean isEmpty(){ + if(array.size()<=0) + return true; + return false; + } + + public int size(){ + return array.size(); + } + public static void main(String[] args) { + Stack sc = new Stack(); + sc.push("hello world"); + sc.push("java"); + sc.push("jvm"); + } + +} diff --git a/group23/609041842/src/test.java b/group23/609041842/src/test.java new file mode 100644 index 0000000000..931a307711 --- /dev/null +++ b/group23/609041842/src/test.java @@ -0,0 +1,9 @@ +import org.junit.Test; + +public class test { + + @Test + public void test(){ + System.out.println("Heool"); + } +} diff --git a/group23/632678665/com/basic/datastructure/ArrayList.java b/group23/632678665/com/basic/datastructure/ArrayList.java new file mode 100644 index 0000000000..7669e8fba0 --- /dev/null +++ b/group23/632678665/com/basic/datastructure/ArrayList.java @@ -0,0 +1,62 @@ +package com.basic.datastructure; + +import java.util.Arrays; + + +public class ArrayList implements List{ + private Object [] array =new Object [15]; + private int size=0; + private int aindex=0; + @Override + public void add(Object o) { + if(aindex>(int)(array.length/3*2)){ + array=autoGrew(array); + } + array[aindex]=o; + size++; + aindex++; + } + + @Override + public void add(int index, Object o) { + if(index>=array.length){ + throw new IndexOutOfBoundsException(); + } + array[index]=o; + size++; + aindex=index; + } + + @Override + public Object get(int index) { + if(index>=array.length){ + throw new IndexOutOfBoundsException(); + } + return array[index]; + } + + @Override + public Object remove(int index) { + if(index>=array.length){ + throw new IndexOutOfBoundsException(); + } + Object o=array[index]; + for(int i=index;iarray=new ArrayList (); + int from; + int to; + for(int i=0;i list=new ArrayList(); + for(int i=0;i set=new HashSet(); + set.addAll(list); + Object[] array=set.toArray(); + int [] arrayInt=new int [array.length]; + for(int i=0;ilist=new ArrayList(); + list.add(front); + list.add(behind); + while(true){ + result=front+behind; + if(max list=new ArrayList(); + int num=3; + list.add(2); + boolean flag=true; + while(true){ + flag=true; + for(int i=2;i list=new ArrayList(); + Set temp=new HashSet(); + int num=1; + int result=0; + while(true){ + for(int i=1;imax){ + break; + } + if(num==result){ + list.add(num); + } + temp.clear(); + result=0; + num++; + } + int [] array=new int [list.size()]; + for(int i=0;i list=new ArrayList(); + for(int i=0;i parameters) { + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + return null; + } + +} diff --git a/group23/632678665/com/basic/week2/litestruts/StrutsTest.java b/group23/632678665/com/basic/week2/litestruts/StrutsTest.java new file mode 100644 index 0000000000..5549100269 --- /dev/null +++ b/group23/632678665/com/basic/week2/litestruts/StrutsTest.java @@ -0,0 +1,43 @@ +package com.basic.week2.litestruts; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/632678665/com/basic/week2/litestruts/View.java b/group23/632678665/com/basic/week2/litestruts/View.java new file mode 100644 index 0000000000..7260afd69b --- /dev/null +++ b/group23/632678665/com/basic/week2/litestruts/View.java @@ -0,0 +1,24 @@ +package com.basic.week2.litestruts; + + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/632678665/com/basic/week3/datastructure/LinkedList.java b/group23/632678665/com/basic/week3/datastructure/LinkedList.java new file mode 100644 index 0000000000..09b08dd25f --- /dev/null +++ b/group23/632678665/com/basic/week3/datastructure/LinkedList.java @@ -0,0 +1,446 @@ +package com.basic.week3.datastructure; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; + +public class LinkedList implements List { + + private int size = 0; + // 头结点 + private Node head; + // 尾结点 + private Node tail; + + private void rangeCheck(int index) { + if (index < 0 || index > size) { + throw new IndexOutOfBoundsException(); + } + } + +// public void add(Object o) { +// Node node = new Node(o, null); +// if (head == null) { +// head = tail = node; +// } +// Node oldTail = tail; +// tail = node; +// oldTail.next = tail; +// size++; +// } + + public void add(int index, Object o) { + rangeCheck(index); + if (index == size) { + this.add(o); + } else { + // 保存index处节点 + Node x = head; + // 保存index-1处的节点 + Node y = null; + for (int i = 0; i < index; i++) { + y = x; + x = x.next; + } + Node node = new Node(o, x); + y.next = node; + size++; + } + } + + public Object get(int index) { + rangeCheck(index); + Node x = head; + for (int i = 0; i < index; i++) { + x = x.next; + } + return x.data; + } + + public Object remove(int index) { + rangeCheck(index); + Object removeData; + if (index == 0) { + removeData = removeFirst(); + } else if (index == size - 1) { + removeData = removeLast(); + } else { + Node x = head; + Node y = head; + for (int i = 0; i < index; i++) { + y = x; + x = x.next; + } + y.next = x.next; + size--; + removeData = x.data; + } + return removeData; + } + + @Override + public int size() { + return size; + } + + public void addFirst(Object o) { + Node oldHead = head; + head = new Node(o, oldHead); + size++; + } + + public void addLast(Object o) { + Node oldTail = tail; + tail = new Node(o, null); + oldTail.next = tail; + size++; + } + + public Object removeFirst() { + Node next = head.next; + Object data = head.data; + head.data = null; + head.next = null; + head = next; + size--; + return data; + } + + public Object removeLast() { + Node oldTail = tail; + Node temp = head; + for (int i = 0; i < size - 2; i++) { + temp = temp.next; + } + tail = temp; + size--; + return oldTail.data; + } + + public void clear() { + for (Node x = head; x != null;) { + Node next = x.next; + x.data = null; + x.next = null; + x = next; + } + head = tail = null; + size = 0; + } + + public Object getTail() { + Node l = tail; + // 如果链表为空 + if (l == null) { + throw new NoSuchElementException(); + } + return l.data; + } + + public Object getHead() { + Node l = head; + // 如果链表为空 + if (l == null) { + throw new NoSuchElementException(); + } + return l.data; + } + + public Iterator iterator() { + return new LinkedListIterator(); + } + + private static class Node { + Object data; + Node next; + + Node(Object data, Node next) { + this.data = data; + this.next = next; + } + + } + + private class LinkedListIterator implements Iterator { + Node x = head; + + @Override + public boolean hasNext() { + return x != null; + } + + @Override + public Object next() { + Object data = x.data; + x = x.next; + return data; + } + + @Override + public void remove() { + // TODO Auto-generated method stub + + } + + } + + /** + * 把该链表逆置 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse() { + Object[] temp = new Object[size]; + for (int i = 0; i < size; i++) { + temp[i] = this.get(i); + } + this.clear(); + for (int i = temp.length - 1; i >= 0; i--) { + this.add(temp[i]); + } + } + + /** + * 删除一个单链表的前半部分 例如:list = 2->5->7->8 , 删除以后的值为 7->8 如果list = 2->5->7->8->10 + * ,删除以后的值为7,8,10 + * + */ + public void removeFirstHalf() { + int s = size; + for (int i = 0; i < s / 2; i++) { + this.removeFirst(); + } + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * + * @param i + * @param length + * @throws Exception + */ + public void remove(int i, int length) throws Exception { + if (i + length > size) { + throw new Exception(); + } + for (int j = i; j < i + length; j++) { + this.remove(i); + } + } + + /** + * 假定当前链表和list均包含已升序排列的整数 从当前链表中取出那些list所指定的元素 例如当前链表 = + * 11->101->201->301->401->501->601->701 listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * + * @param list + * @throws Exception + */ + public int[] getElements(LinkedList list) throws Exception { + if ((int) list.getTail() > this.size()) { + throw new Exception(); + } + int[] temp = new int[list.size()]; + for (int i = 0; i < list.size(); i++) { + temp[i] = (int) this.get((int) list.get(i)); + } + return temp; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 从当前链表中中删除在list中出现的元素 + * + * @param list + */ + + public void subtract(LinkedList list) { + Node x = head; + Node y = list.head; + while (x != null && y != null) { + if ((int) x.data < (int) y.data) { + x = x.next; + continue; + } + if ((int) x.data == (int) y.data) { + Node next = x.next; + continue; + } + if ((int) x.data > (int) y.data) { + y = y.next; + continue; + } + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues() { + for (Node x = head; x != null;) { + Node next = x.next; + if (next == null) { + return; + } + if (x.data == next.data) { + x.next = next.next; + size--; + } else { + x = x.next; + } + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * + * @param min + * @param max + */ + public void removeRange(int min, int max) { + if ((int) this.getTail() < min) { + this.clear(); + } + + if ((int) this.getHead() > max) { + return; + } + + for (Node x = head; x != null; x = x.next) { + if ((int) x.data <= min) { + continue; + } + + } + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * + * @param list + */ + public LinkedList intersection(LinkedList list) { + LinkedList linkedList = new LinkedList(); + Node x = head; + Node y = list.head; + while (x != null && y != null) { + if ((int) x.data < (int) y.data) { + x = x.next; + continue; + } + if ((int) x.data == (int) y.data) { + linkedList.add(x.data); + x = x.next; + y = y.next; + continue; + } + if ((int) x.data > (int) y.data) { + y = y.next; + continue; + } + } + return linkedList; + } + + @Override + public boolean isEmpty() { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean contains(Object o) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object[] toArray() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object[] toArray(Object[] a) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean remove(Object o) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean containsAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addAll(int index, Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean removeAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean retainAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object set(int index, Object element) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int indexOf(Object o) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int lastIndexOf(Object o) { + // TODO Auto-generated method stub + return 0; + } + + @Override + public ListIterator listIterator() { + // TODO Auto-generated method stub + return null; + } + + @Override + public ListIterator listIterator(int index) { + // TODO Auto-generated method stub + return null; + } + + @Override + public List subList(int fromIndex, int toIndex) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean add(Object e) { + // TODO Auto-generated method stub + return false; + } +} diff --git a/group23/632678665/com/basic/week3/download/Demo.java b/group23/632678665/com/basic/week3/download/Demo.java new file mode 100644 index 0000000000..f4dc344cb5 --- /dev/null +++ b/group23/632678665/com/basic/week3/download/Demo.java @@ -0,0 +1,36 @@ +package com.basic.week3.download; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintStream; +import java.io.RandomAccessFile; +import java.net.URL; + +public class Demo { + + public static void main(String[] args) throws Exception { +// File f=new File("E://123.txt"); +// InputStream ii=new FileInputStream(f); +// byte [] b=new byte [2]; +// int j; +// while(true){ +// if(ii.read(b)==0){ +// System.out.println("1111"); +// } +// if(ii.read(b)==-1){ +// System.out.println("3333"); +// } +// } + URL url=new URL("Http://localhsot:8080/123.txt"); + String [] s=url.toString().split("/"); + for(String str:s){ + + } + } + +} diff --git a/group23/632678665/com/basic/week3/download/DownloadThread.java b/group23/632678665/com/basic/week3/download/DownloadThread.java new file mode 100644 index 0000000000..89b7fdc3f5 --- /dev/null +++ b/group23/632678665/com/basic/week3/download/DownloadThread.java @@ -0,0 +1,31 @@ +package com.basic.week3.download; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +import com.basic.week3.download.api.Connection; + +public class DownloadThread extends Thread{ + public static int count=0; + Connection conn; + int startPos; + int endPos; + + public DownloadThread(Connection conn, int startPos, int endPos){ + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + public void run(){ + try { + count++; + conn.read(startPos, endPos); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }finally{ + count--; + } + } +} diff --git a/group23/632678665/com/basic/week3/download/FileDownloader.java b/group23/632678665/com/basic/week3/download/FileDownloader.java new file mode 100644 index 0000000000..d32975f4b5 --- /dev/null +++ b/group23/632678665/com/basic/week3/download/FileDownloader.java @@ -0,0 +1,97 @@ +package com.basic.week3.download; + +import com.basic.week3.download.api.Connection; +import com.basic.week3.download.api.ConnectionException; +import com.basic.week3.download.api.ConnectionManager; +import com.basic.week3.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + Connection conn; + + DownloadThread dt; + + private static final int THREAD_NUM=4; + public FileDownloader(String _url) { + this.url = _url; + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + /*Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + }*/ + try { + //打开url + conn=cm.open(url); + //判断资源长度 + int length=conn.getContentLength(); + //每个线程所占的资源 + int off=(int)(length/3); + int start=0; + for(int i=0;i clzPaths = new ArrayList(); + + public byte[] readBinaryCode(String className) { + List list = DOT_SPLITTER.splitToList(className); + String childDirectory = SLASH_JOINER.join(list); + for (String clzPath : clzPaths) { + String fullPath = makeFullPath(clzPath, childDirectory); + if (fileExist(fullPath)) { + return readFileBytes(fullPath); + } + } + System.out.println("no this class file: " + className); + return null; + } + + private byte[] readFileBytes(String filePath) { + try { + File file = new File(filePath); + long length = file.length(); + byte[] fileBytes = new byte[(int) length]; + int readLength = new FileInputStream(filePath).read(fileBytes); + if (readLength != length) { + System.out.println("read file error. read length: " + readLength + ", full length : " + length); + return null; + } + return fileBytes; + } catch (IOException e) { + System.out.println("read file error. " + filePath); + return null; + } + } + + private boolean fileExist(String fullPath) { + File classFile = new File(fullPath); + return classFile.exists() && classFile.isFile(); + } + + private String makeFullPath(String clzPath, String childDirectory) { + if (clzPath.endsWith("/") || clzPath.endsWith("\\")) { + return clzPath + childDirectory + CLASS_SUFFIX; + } else { + return clzPath + "/" + childDirectory + CLASS_SUFFIX; + } + } + + public void addClassPath(String path) { + if (!clzPaths.contains(path)) { + clzPaths.add(path); + } + } + + public String getClassPath() { + return SEMICOLON_JOINER.join(clzPaths); + } + +} diff --git a/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java b/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java new file mode 100644 index 0000000000..7d0419dc77 --- /dev/null +++ b/group23/632678665/com/basic/week4/jvm/test/EmployeeV1.java @@ -0,0 +1,30 @@ +package com.coding2017.week4.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/group23/632678665/com/basic/week4/lru/LRUPageFrame.java b/group23/632678665/com/basic/week4/lru/LRUPageFrame.java new file mode 100644 index 0000000000..55039dda56 --- /dev/null +++ b/group23/632678665/com/basic/week4/lru/LRUPageFrame.java @@ -0,0 +1,131 @@ +package com.coding2017.week4.lru; + +/** + * 用双向链表实现LRU算法 + * + * @author liuxin + * + */ +public class LRUPageFrame { + private static class Node { + Node prev; + Node next; + int pageNum; + + Node() { + } + } + + private int capacity; + + private Node first;// 链表头 + private Node last;// 链表尾 + private int size; // 当前个数 + + public LRUPageFrame(int capacity) { + this.capacity = capacity; + size = 0; + } + + /** + * 获取缓存中对象 + * + * @param pageNum + * @return + */ + public void access(int pageNum) { + Node node = query(pageNum); + if (node == null) { + Node newNode = new Node(); + newNode.pageNum = pageNum; + accessNotExist(newNode); + } else { + accessExist(node); + } + } + + private void accessExist(Node node) { + removeNode(node); + addFirst(node); + } + + /** + * 此处没有要求传入的node的prev和next, 所以需要自己处理 + * + * @param node + */ + private void addFirst(Node node) { + node.prev = null; + node.next = null; + if (first == null) { + first = node; + last = node; + } else { + first.prev = node; + node.next = first; + first = node; + } + size++; + } + + /** + * 需要考虑删除的节点是头结点, 或尾节点的情况 + */ + private void removeNode(Node node) { + if (node.prev == null) { + first = node.next; + } + if (node.next == null) { + last = node.prev; + } + if (node.prev != null) { + node.prev.next = node.next; + } + if (node.next != null) { + node.next.prev = node.prev; + } + size--; + } + + /** + * 如果已经满了, 则挤出去一个, 然后追加 + * + * @param node + */ + private void accessNotExist(Node node) { + if (size == capacity) { + removeLast(); + } + addFirst(node); + } + + private void removeLast() { + last.prev.next = null; + last = last.prev; + size--; + } + + private Node query(int pageNum) { + for (Node node = first; node != null; node = node.next) { + if (pageNum == node.pageNum) { + return node; + } + } + return 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/group23/632678665/com/basic/week5/stack/StackUtil.java b/group23/632678665/com/basic/week5/stack/StackUtil.java new file mode 100644 index 0000000000..7b750b3549 --- /dev/null +++ b/group23/632678665/com/basic/week5/stack/StackUtil.java @@ -0,0 +1,103 @@ +package com.coding.week5.stack; + +import com.coding.weak1.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 stack = new Stack(); + Stack stack1 = new Stack(); + while (!s.isEmpty()) { + stack.push(s.pop()); + } + while (!stack.isEmpty()) { + stack1.push(stack.pop()); + } + while (!stack1.isEmpty()) { + s.push(stack1.pop()); + } + } + + /** + * 删除栈中的某个元素 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * + * @param o + */ + public static void remove(Stack s,Object o) { + Stack stack = new Stack(); + while (!s.isEmpty()){ + Object o1 = s.pop(); + if (!o.equals(o1)) { + stack.push(o1); + } + } + while (!stack.isEmpty()) { + s.push(stack.pop()); + } + } + + /** + * 从栈顶取得len个元素, 原来的栈中元素保持不变 + * 注意:只能使用Stack的基本操作,即push,pop,peek,isEmpty, 可以使用另外一个栈来辅助 + * @param len + * @return + */ + public static Object[] getTop(Stack s,int len) { + if (len > s.size() || len <= 0) { + throw new IllegalArgumentException(len+""); + } + + Object[] objects = new Object[len]; + for (int i = 0; i < len; i++) { + objects[i] = s.pop(); + } + for (int i = len - 1; i >= 0 ; i--) { + s.push(objects[i]); + } + return objects; + } + /** + * 字符串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){ + Stack stack = new Stack(); + char[] chars = s.toCharArray(); + for (char c : chars) { + if (c == '(' || c == '{' || c == '[') { + stack.push(c); + } else if (c == ')' || c == '}' || c == ']'){ + if (stack.isEmpty()) { + return false; + } + if (!isPair((char)stack.pop(), c)){ + return false; + } + } + } + return stack.isEmpty(); + } + + private static boolean isPair(char left, char right) { + switch (left) { + case '{': + return right == '}'; + case '[': + return right == ']'; + case '(': + return right == ')'; + default: + return false; + } + } + +} diff --git a/group23/632678665/com/basic/week6/expr/InfixExpr.java b/group23/632678665/com/basic/week6/expr/InfixExpr.java new file mode 100644 index 0000000000..34c1b15123 --- /dev/null +++ b/group23/632678665/com/basic/week6/expr/InfixExpr.java @@ -0,0 +1,127 @@ +package com.coding.week6.expr; + +import com.coding.weak1.Stack; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class InfixExpr { + String expr = null; + private Stack numberStack; + private Stack operatorStack; + private List tokens; + public InfixExpr(String expr) { + this.expr = expr; + this.numberStack = new Stack(); + this.operatorStack = new Stack(); + tokens = new ArrayList<>(); + } + + + public float evaluate() { + fillStack(); + while (!operatorStack.isEmpty()) { + char symbol = (char) operatorStack.pop(); + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(caculate(symbol, operTop2, operTop1)); + } + return (float)numberStack.pop(); + } + + public void parseTokens() { + char[] chars = expr.toCharArray(); + for (int i = 0; i < chars.length; i++) { + char c = chars[i]; + if (Token.isOperator(c)) { + Token token = new Token(c+""); + tokens.add(token); + } else { + String t = ""; + while (Token.isDigit(c)){ + t += c; + i++; + if (i == chars.length) + break; + c = chars[i]; + } + Token token = new Token(t); + tokens.add(token); + i--; + } + } + } + + + public void fillStack() { + parseTokens(); + Iterator iterator = tokens.iterator(); + while (iterator.hasNext()) { + Token token = iterator.next(); + if (token.isNumber()) { + numberStack.push((float)token.parseInt()); + continue; + } + if (token.isOperator()) { + char operator = token.parseOperator(); + if (operatorStack.isEmpty()) { + operatorStack.push(operator); + }else { + char topSymbol = (char)operatorStack.peek(); + if (compare(operator, topSymbol) > 0) { + operatorStack.push(operator); + } else { + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(caculate(topSymbol, operTop2, operTop1)); + operatorStack.pop(); + operatorStack.push(operator); + } + } + } + + } + } + + + private float caculate(char symbol, float oper1, float oper2) { + if ('*' == symbol) + return oper1 * oper2; + else if ('/' == symbol) + return oper1 / oper2; + else if ('+' == symbol) + return oper1 + oper2; + else if ('-' == symbol) + return oper1 - oper2; + else + throw new RuntimeException("this operation has not implement"); + } + + public int compare(char opertor1, char opertor2) { + if (!Token.isOperator(opertor1) ) + throw new IllegalArgumentException(opertor1 + "is not supported opertor"); + if (!Token.isOperator(opertor2)) + throw new IllegalArgumentException(opertor2 + "is not supported opertor"); + if (Token.isAddOrSub(opertor1)) { + if (Token.isAddOrSub(opertor2)) + return 0; + else + return -1; + } + else { + if (Token.isAddOrSub(opertor2)) + return 1; + else + return 0; + } + } + + public String printNumberStack() { + return numberStack.toString(); + } + + public String printOperatorStack() { + return operatorStack.toString(); + } +} diff --git a/group23/632678665/com/basic/week6/expr/Token.java b/group23/632678665/com/basic/week6/expr/Token.java new file mode 100644 index 0000000000..b58aa36968 --- /dev/null +++ b/group23/632678665/com/basic/week6/expr/Token.java @@ -0,0 +1,52 @@ +package com.coding.week6.expr; + +/** + * Created by Administrator on 2017/4/16 0016. + */ +public class Token { + + private String symbol; + + public Token(String symbol) { + this.symbol = symbol; + } + + public boolean isNumber() { + return symbol.matches("^\\d+$"); + } + + + public boolean isOperator() { + return symbol.matches("^[\\+|\\*|\\-|\\/]$"); + } + + public int parseInt() { + return Integer.valueOf(symbol); + } + + public char parseOperator() { + return symbol.charAt(0); + } + + + public static boolean isOperator(char c) { + return isAddOrSub(c) || isMulityOrDivide(c); + } + + public static boolean isAddOrSub(char c) { + return c == '+' || c == '-'; + } + + public static boolean isMulityOrDivide(char c) { + return c == '/' || c == '*'; + } + + public static boolean isDigit(char c) { + return c >= '0' && c <= '9'; + } + + @Override + public String toString(){ + return symbol; + } +} diff --git a/group23/632678665/com/basic/week6/exprNew/InfixExpr.java b/group23/632678665/com/basic/week6/exprNew/InfixExpr.java new file mode 100644 index 0000000000..3962b49fce --- /dev/null +++ b/group23/632678665/com/basic/week6/exprNew/InfixExpr.java @@ -0,0 +1,57 @@ +package com.coding.week6.exprNew; + +import com.coding.weak1.Stack; + +import java.util.List; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + + public float evaluate() { + + Stack operatorStack = new Stack(); + Stack numberStack = new Stack(); + fillStack(numberStack, operatorStack); + while (!operatorStack.isEmpty()) { + Operator symbol = (Operator) operatorStack.pop(); + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(symbol.apply(operTop2, operTop1)); + } + return (float)numberStack.pop(); + } + + public void fillStack(Stack numberStack, Stack operatorStack) { + TokenParser tokenParser = new TokenParser(); + List tokens = tokenParser.parse(expr); + for (Token token : tokens) { + if (token.isNumber()) { + numberStack.push(token.getFloatValue()); + } + else if (token.isOperator()) { + Operator o = token.getOperator(); + if (operatorStack.isEmpty()) { + operatorStack.push(o); + }else { + Operator top = (Operator)operatorStack.peek(); + if (o.hasHigherPriority(top)) { + operatorStack.push(o); + } else { + float operTop1 = (float) numberStack.pop(); + float operTop2 = (float) numberStack.pop(); + numberStack.push(top.apply(operTop2, operTop1)); + operatorStack.pop(); + operatorStack.push(o); + } + } + } + + } + } + +} diff --git a/group23/632678665/com/basic/week6/exprNew/Operator.java b/group23/632678665/com/basic/week6/exprNew/Operator.java new file mode 100644 index 0000000000..f6b4681e46 --- /dev/null +++ b/group23/632678665/com/basic/week6/exprNew/Operator.java @@ -0,0 +1,75 @@ +package com.coding.week6.exprNew; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public enum Operator { + ADD("+", 1) { + public float apply(float x, float y){ + return x + y; + } + }, + + SUB("-", 1) { + @Override + public float apply(float x, float y) { + return x - y; + } + }, + + MULT("*", 2) { + @Override + public float apply(float x, float y) { + return x * y; + } + }, + + DIVI("/", 2) { + @Override + public float apply(float x, float y) { + return x / y; + } + }; + private String symbol; + private int priority; + + Operator(String symbol, int priority) { + this.symbol = symbol; + this.priority = priority; + } + + public boolean hasHigherPriority(Operator o) { + return this.priority > o.priority; + } + + public String symbol() { + return symbol; + } + + public static List symbols() { + List symbos = new ArrayList<>(); + for (Operator o : Operator.values()) { + symbos.add(o.symbol); + } + return symbos; + } + + public abstract float apply(float x, float y); + + private static final Map map = new HashMap(); + + static { + for (Operator o : Operator.values()) { + map.put(o.symbol, o); + } + } + + public static Map getOperatorMap() { + return map; + } +} diff --git a/group23/632678665/com/basic/week6/exprNew/Token.java b/group23/632678665/com/basic/week6/exprNew/Token.java new file mode 100644 index 0000000000..c925a22705 --- /dev/null +++ b/group23/632678665/com/basic/week6/exprNew/Token.java @@ -0,0 +1,63 @@ +package com.coding.week6.exprNew; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class Token { + + private int type; + private String value; + + static final int NUMBER = 1; + static final int OPERATOR = 2; + static final int LEFT_BRACKET = 3; + static final int RIGHT_BRACKET = 4; + public Token(int type, String value) { + this.type = type; + this.value = value; + } + + + public boolean isNumber(){ + return type == NUMBER; + } + + public boolean isOperator(){ + return type == OPERATOR; + } + + public boolean isLeftBracket() { + return type == LEFT_BRACKET; + } + + public boolean isRightBracket() { + return type == RIGHT_BRACKET; + } + + public float getFloatValue() { + if (isNumber()) + return Integer.valueOf(value); + else + throw new RuntimeException("not a number"); + } + + public String toString() { + return value; + } + + + public Operator getOperator() { + if (isOperator()) { + return Operator.getOperatorMap().get(value); + } else { + throw new RuntimeException("not a operator"); + } + } + + + public String getValue() { + return value; + } + + +} diff --git a/group23/632678665/com/basic/week6/exprNew/TokenParser.java b/group23/632678665/com/basic/week6/exprNew/TokenParser.java new file mode 100644 index 0000000000..52757dc0c7 --- /dev/null +++ b/group23/632678665/com/basic/week6/exprNew/TokenParser.java @@ -0,0 +1,60 @@ +package com.coding.week6.exprNew; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by Administrator on 2017/4/22 0022. + */ +public class TokenParser { + + private static List operators = Operator.symbols(); + public List parse(String expr) { + List tokens = new ArrayList<>(); + int i = 0; + while (i < expr.length()) { + char c = expr.charAt(i); + Token token; + if (Character.isDigit(c)) { + int nextOperIndex = getNextOperIndex(i, expr); + String n = expr.substring(i, nextOperIndex); + token = new Token(Token.NUMBER, n); + tokens.add(token); + i = nextOperIndex; + } else if (isOperator(c)) { + token = new Token(Token.OPERATOR, c+""); + tokens.add(token); + i++; + } else if (String.valueOf(c).matches("\\s")){ + i++; + } else if (c == '(') { + token = new Token(Token.LEFT_BRACKET, String.valueOf(c)); + tokens.add(token); + i++; + } else if (c == ')') { + token = new Token(Token.RIGHT_BRACKET, String.valueOf(c)); + tokens.add(token); + i++; + } else { + throw new RuntimeException(c +" is not number or support operator"); + } + } + return tokens; + } + + private int getNextOperIndex(int i, String expr) { + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char c) { + return operators.contains(String.valueOf(c)); + } + + +} diff --git a/group23/632678665/com/basic/week7/stack/MyStack.java b/group23/632678665/com/basic/week7/stack/MyStack.java new file mode 100644 index 0000000000..9a8bf42296 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/MyStack.java @@ -0,0 +1,42 @@ +package com.ralf.stack; + +import java.util.LinkedList; +import java.util.NoSuchElementException; + +/** + * ʵֻݽṹջ + * + * @author chk + * + */ +public class MyStack { + + private LinkedList linkedList = new LinkedList<>(); + + public MyStack() { + + } + + public void push(T t) { + linkedList.addFirst(t); + } + + public T pop() { + if (size() == 0) { + throw new NoSuchElementException(); + } + return linkedList.removeFirst(); + } + + public T peek() { + return (size() == 0) ? null : linkedList.getFirst(); + } + + public int size() { + return linkedList.size(); + } + + public boolean isEmpty(){ + return linkedList.isEmpty(); + } +} diff --git a/group23/632678665/com/basic/week7/stack/StackUtil.java b/group23/632678665/com/basic/week7/stack/StackUtil.java new file mode 100644 index 0000000000..758178131c --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/StackUtil.java @@ -0,0 +1,173 @@ +package com.ralf.stack; + +import java.util.NoSuchElementException; + +public class StackUtil { + + private static MyStack myStack = new MyStack<>(); + + /** + * ջеԪInteger, ջջ : 5,4,3,2,1 ø÷ ԪشΪ: 1,2,3,4,5 + * ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ + * + * @param + */ + public static void reverse(MyStack stack) { + + if (stack.isEmpty()) { + System.out.println("ջΪջ"); + return; + } + @SuppressWarnings("unchecked") + T[] elements = (T[]) new Object[stack.size()]; + for (int i = 0; i < elements.length; i++) { + elements[i] = stack.pop(); + } + for (int i = 0; i < elements.length; i++) { + stack.push(elements[i]); + } + + } + + public static void bad_reverse(MyStack s) { + if(s == null || s.isEmpty()){ + return; + } + MyStack tmpStack = new MyStack<>(); + while(!s.isEmpty()){ + tmpStack.push(s.pop()); + } + + s = tmpStack; + + } + + + /** + * ɾջеijԪ ע⣺ֻʹStackĻpush,pop,peek,isEmpty ʹһջ + * + * @param o + */ + public static void remove(MyStack s, T o) { + if (s.isEmpty()) { + System.out.println("ջΪգ"); + return; + } + MyStack stack = new MyStack<>(); + + while (!s.isEmpty()) { + T t = s.pop(); + if (t.equals(o)) { + PopAndPush(s, stack); + return; + } + stack.push(t); + } + throw new NoSuchElementException("ջûиԪأ"); + + } + + private static void PopAndPush(MyStack s, MyStack stack) { + while (!stack.isEmpty()) { + T t = stack.pop(); + s.push(t); + } + } + + /** + * ջȡlenԪ, ԭջԪرֲ ע⣺ֻʹStackĻpush,pop,peek,isEmpty + * ʹһջ + * + * @param len + * @return + */ + @SuppressWarnings("unchecked") + public static T[] getTop(MyStack s, int len) { + + if (s.isEmpty() || len > s.size()) { + return null; + } + MyStack oldStack = s; + T[] elements = (T[]) new Object[len]; + for (int i = 0; i < len; i++) { + elements[i] = s.pop(); + } + s = oldStack; + return elements; + } + + /** + * ַs ܰЩַ ( ) [ ] { }, a,b,c... x,yz ʹöջַsеDzdzɶԳֵġ s = + * "([e{d}f])" , ַеdzɶԳ֣ ÷true s = "([b{x]y})", + * ַеŲdzɶԳֵģ ÷false; + * + * @param s + * @return + */ + public static boolean isValidPairs(String s) { + + char[] ch = s.toCharArray(); + if (ch.length < 1) { + return false; + } + + MyStack leftStack = new MyStack<>(); + MyStack rightStack = new MyStack<>(); + + for (int i = 0; i < ch.length; i++) { + + switch (ch[i]) { + case '(': + leftStack.push(String.valueOf(ch[i])); + break; + + case '[': + leftStack.push(String.valueOf(ch[i])); + break; + + case '{': + leftStack.push(String.valueOf(ch[i])); + break; + + case ')': + rightStack.push(String.valueOf(ch[i])); + break; + + case ']': + rightStack.push(String.valueOf(ch[i])); + break; + + case '}': + rightStack.push(String.valueOf(ch[i])); + break; + + default: + break; + } + } + return isPair(leftStack, rightStack); + + } + + private static boolean isPair(MyStack leftStack, + MyStack rightStack) { + + if (leftStack.size() != rightStack.size()) { + return false; + } + + reverse(rightStack); + while (!leftStack.isEmpty()) { + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(leftStack.pop()).append(rightStack.pop()); + + String pair = stringBuilder.toString(); + if (!pair.equals("()") && !pair.equals("[]") && !pair.equals("{}")) { + return false; + } + } + return true; + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java b/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java new file mode 100644 index 0000000000..d82db3e915 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/ExprIterator.java @@ -0,0 +1,57 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; + +public class ExprIterator { + + private int operPos; + private int numPos; + private ArrayList operateList = new ArrayList<>(); + private ArrayList numList = new ArrayList<>(); + + public ExprIterator(String exprString) { + char[] chs = exprString.toCharArray(); + transToString(chs); + } + + public Integer nextNumString() { + if (hasNextNum()) { + return Integer.parseInt(numList.get(numPos++)); + } + return null; + } + public String nextOperateString() { + if (hasNextOperate()) { + return operateList.get(operPos++); + } + return null; + } + + public boolean hasNextNum() { + return numPos < numList.size(); + } + + public boolean hasNextOperate() { + return operPos < operateList.size(); + } + + private void transToString(char[] chs) { + + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < chs.length; i++) { + if (chs[i] == '+' || chs[i] == '-' || chs[i] == '*' + || chs[i] == '/') { + numList.add(stringBuilder.toString()); + operateList.add(String.valueOf(chs[i])); + stringBuilder.delete(0, stringBuilder.length()); + } + else { + stringBuilder.append(chs[i]); + } + + } + numList.add(stringBuilder.toString()); + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java b/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..86a060845c --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/InfixExpr.java @@ -0,0 +1,74 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class InfixExpr { + + private String exprString; + + public InfixExpr(String exprString) { + this.exprString = exprString; + } + + public double evaluate() { + + MyStack numStack = new MyStack(); + MyStack operStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + + List list = parser.parse(exprString); + + for (Token token : list) { + if (token.isOperator()) { + if (operStack.isEmpty()) { + operStack.push(token); + } else { + while (!operStack.isEmpty() + && !token.hasHigherPriority(operStack.peek())) { + String operator = operStack.pop().toString(); + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = operate(operator,num1,num2); + numStack.push(result); + } + operStack.push(token); + } + } + if (token.isNumber()) { + numStack.push(new Float(token.getValue())); + } + } + + while(!operStack.isEmpty()){ + String operator = operStack.pop().toString(); + Float num1 = numStack.pop(); + Float num2 = numStack.pop(); + Float result = operate(operator,num1,num2); + numStack.push(result); + } + + return numStack.pop().floatValue(); + } + + private Float operate(String operator,Float num1, Float num2) { + float result = 0.0f; + switch (operator) { + case "+": + result = num2 + num1; + break; + case "-": + result = num2 - num1; + break; + case "*": + result = num2 * num1; + break; + case "/": + result = num2 / num1; + break; + } + return result; + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java new file mode 100644 index 0000000000..6296d160ef --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExpr.java @@ -0,0 +1,41 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +import com.ralf.stack.MyStack; +import com.ralf.stack.StackUtil; + +public class InfixToPostExpr { + + public static List convert(String infixString){ + + TokenParser parser = new TokenParser(); + List tokens = parser.parse(infixString); + + MyStack S1 = new MyStack(); + MyStack S2 = new MyStack<>(); + + + for(Token token : tokens){ + if (token.isNumber()) { + S2.push(token); + } + else{ + while(!S1.isEmpty() && !token.hasHigherPriority(S1.peek())) { + S2.push(S1.pop()); + } + S1.push(token); + } + } + while(!S1.isEmpty()){ + S2.push(S1.pop()); + } + ArrayList list = new ArrayList<>(); + StackUtil.reverse(S2); + while(!S2.isEmpty()){ + list.add(S2.pop()); + } + return list; + } +} diff --git a/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java new file mode 100644 index 0000000000..d21344ea1e --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/InfixToPostExprTest.java @@ -0,0 +1,30 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixToPostExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + //10-2*3+50 + String string = "10-2*3+50"; + List tokens = InfixToPostExpr.convert(string); + + Assert.assertEquals(10, tokens.get(0).getValue()); + Assert.assertEquals(2, tokens.get(1).getValue()); + Assert.assertEquals(3, tokens.get(2).getValue()); + Assert.assertEquals("*", tokens.get(3).toString()); + Assert.assertEquals("-", tokens.get(4).toString()); + Assert.assertEquals(50, tokens.get(5).getValue()); + Assert.assertEquals("+", tokens.get(6).toString()); + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java b/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..6e40dbe72f --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/PostfixExpr.java @@ -0,0 +1,48 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class PostfixExpr { + + private String exprString; + + public PostfixExpr(String exprString){ + this.exprString = exprString; + } + + public float evaluate() { + MyStack myStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(exprString); + for(Token token : tokens){ + if (token.isNumber()) { + myStack.push(new Float(token.getValue())); + } + if (token.isOperator()) { + float f2 = myStack.pop(); + float f1 = myStack.pop(); + myStack.push(calculate(token.toString(), f1, f2)); + } + } + return myStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java b/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..d5ff875c0f --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/PostfixExprTest.java @@ -0,0 +1,34 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java b/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..651889259e --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/PrefixExpr.java @@ -0,0 +1,59 @@ +package com.ralf.stack.expr; + +import java.util.List; + +import com.ralf.stack.MyStack; + +public class PrefixExpr { + + private String exprString; + + public PrefixExpr(String exprString) { + this.exprString = exprString; + } + + public float evaluate() { + + MyStack myStack = new MyStack<>(); + MyStack exprStack = new MyStack<>(); + TokenParser parser = new TokenParser(); + List tokens = parser.parse(exprString); + + for(Token token : tokens){ + exprStack.push(token); + } + + while(!exprStack.isEmpty()){ + Token token = exprStack.pop(); + if (token.isNumber()) { + myStack.push(new Float(token.getValue())); + } + else { + Float f1 = myStack.pop(); + Float f2 = myStack.pop(); + myStack.push(calculate(token.toString(),f1,f2)); + } + } + return myStack.pop().floatValue(); + } + + private Float calculate(String operator, Float f1, Float f2) { + if ("+".equals(operator)) { + return f1 + f2; + } + if ("-".equals(operator)) { + return f1 - f2; + } + if ("*".equals(operator)) { + return f1 * f2; + } + if ("/".equals(operator)) { + return f1 / f2; + } + else { + throw new RuntimeException("this operator is not supported!"); + } + + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java b/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..ff11cc2395 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/PrefixExprTest.java @@ -0,0 +1,39 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/Token.java b/group23/632678665/com/basic/week7/stack/expr/Token.java new file mode 100644 index 0000000000..1696dafbef --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/Token.java @@ -0,0 +1,49 @@ +package com.ralf.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Token { + + public static final List OPERATORS = Arrays.asList("+","-","*","/"); + private static final Map priorities = new HashMap(); + static{ + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int NUMBER = 1; + static final int OPERATOR = 2; + String value; + int type; + + public Token(String value, int type){ + this.value = value; + this.type = type; + } + public int getValue() { + + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + public boolean isNumber(){ + return type == NUMBER; + } + public boolean isOperator(){ + return type == OPERATOR; + } + public boolean hasHigherPriority(Token token){ + + if (!this.isOperator() || !token.isOperator()) { + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(token.value) > 0; + + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/TokenParser.java b/group23/632678665/com/basic/week7/stack/expr/TokenParser.java new file mode 100644 index 0000000000..66206c9f11 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/TokenParser.java @@ -0,0 +1,56 @@ +package com.ralf.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + public TokenParser(){ + + } + public List parse(String string) { + List tokens = new ArrayList(); + int i = 0; + while(i < string.length()){ + + char ch = string.charAt(i); + if (isOperator(ch)) { + Token token = new Token(String.valueOf(ch), Token.OPERATOR); + tokens.add(token); + i++; + } + else if (Character.isDigit(ch)) { + int nextIndexOfChar = nextIndexOfOperator(i,string); + String value = string.substring(i, nextIndexOfChar); + Token token = new Token(value, Token.NUMBER); + tokens.add(token); + i = nextIndexOfChar; + } + else { + System.out.println("char:" + ch + " is not a number or operator,ignore!"); + i++; + } + + } + + + return tokens; + } + + private int nextIndexOfOperator(int i, String string) { + + while(Character.isDigit(string.charAt(i))){ + i++; + if (i == string.length()) { + break; + } + } + return i; + } + + private boolean isOperator(char ch) { + String string = String.valueOf(ch); + return Token.OPERATORS.contains(string); + } + +} diff --git a/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java b/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..3066880551 --- /dev/null +++ b/group23/632678665/com/basic/week7/stack/expr/TokenParserTest.java @@ -0,0 +1,36 @@ +package com.ralf.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @Test + public void test() { + TokenParser tokenParser = new TokenParser(); + + List list = tokenParser.parse("300*20+12*5-20/4"); + Assert.assertEquals(300, list.get(0).getValue()); + Assert.assertEquals("*", list.get(1).toString()); + Assert.assertEquals(20, list.get(2).getValue()); + Assert.assertEquals("+", list.get(3).toString()); + Assert.assertEquals(12, list.get(4).getValue()); + Assert.assertEquals("*", list.get(5).toString()); + Assert.assertEquals(5, list.get(6).getValue()); + Assert.assertEquals("-", list.get(7).toString()); + Assert.assertEquals(20, list.get(8).getValue()); + Assert.assertEquals("/", list.get(9).toString()); + Assert.assertEquals(4, list.get(10).getValue()); + + } + +} diff --git a/group23/632678665/com/basic/week8/CircleQueue.java b/group23/632678665/com/basic/week8/CircleQueue.java new file mode 100644 index 0000000000..1a6f022a4e --- /dev/null +++ b/group23/632678665/com/basic/week8/CircleQueue.java @@ -0,0 +1,44 @@ +/** + * @author chk + */ +public class CircleQueue{ + + private int size; + private int first; + private int last; + Object[] queue; + + public CircleQueue(int size){ + queue = new Object[size]; + first = 0; + last = 0; + } + + public boolean isEmpty(){ + return first == last; + } + + public void enCircleQueue(Object o){ + if( (last+1) % size == first){ + System.out.println("Circle Queue is full"); + }else { + queue[last] = o; + last = (last+1) % queue.length; + } + } + + public int getSize(){ + return (last - first + queue.length) % queue.length; + } + + public Object deCircleQueue(){ + if(isEmpty()){ + return null; + }else{ + Object item = queue[first]; + first = (first+1)%queue.length; + return item; + } + + } +} diff --git a/group23/632678665/com/basic/week8/Josephus.java b/group23/632678665/com/basic/week8/Josephus.java new file mode 100644 index 0000000000..e3380c0ca6 --- /dev/null +++ b/group23/632678665/com/basic/week8/Josephus.java @@ -0,0 +1,44 @@ + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: + * N个人围成一圈(位置记为0到N-1), + * 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * @author chk + * + */ +public class Josephus { + + private static class Node { + int data; + Node next; + + public Node(int i) { + data = i; + } + } + + public static void execute(int n, int m) { + + Node header = new Node(0); + Node pointer = header; + for (int i = 1; i < n; i++) { + pointer.next = new Node(i); + pointer = pointer.next; + } + pointer.next = header; + while (pointer != pointer.next) { + for (int i = 1; i <= m; i++) { + pointer = pointer.next; + } + System.out.println(pointer.next.data); + pointer.next = pointer.next.next; + } + System.out.println(pointer.next.data); + + } + public static void main(String args[]){ + Josephus circle = new Josephus(); + circle.execute(8,4); + } +} diff --git a/group23/632678665/com/basic/week8/Queue.java b/group23/632678665/com/basic/week8/Queue.java new file mode 100644 index 0000000000..ea0e0cd621 --- /dev/null +++ b/group23/632678665/com/basic/week8/Queue.java @@ -0,0 +1,55 @@ +import javax.xml.soap.Node; +import java.util.NoSuchElementException; + +/** + * @author chk + */ +public class Queue { + + private Node first; + private Node last; + private int size; + + private static class Node{ + private E item; + private Node next; + } + public Queue(){ + first = null; + last = null; + size = 0; + } + public boolean isEmpty(){ + return first == null; + } + public int size(){ + return size; + } + public void enQueue(E data){ + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if(isEmpty()){ + first = last; + }else { + oldlast.next = last; + } + size++; + } + public E deQueue(){ + if(isEmpty()){ + throw new NoSuchElementException("queue is empty"); + }else{ + E item = first.item; + first = first.next; + size--; + if(isEmpty()){ + last = null; + } + return item; + } + } + + +} diff --git a/group23/632678665/com/basic/week8/QueueWithTwoStacks.java b/group23/632678665/com/basic/week8/QueueWithTwoStacks.java new file mode 100644 index 0000000000..af5d8a03df --- /dev/null +++ b/group23/632678665/com/basic/week8/QueueWithTwoStacks.java @@ -0,0 +1,47 @@ +import java.util.Stack; + +/** + * @author chk + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + public QueueWithTwoStacks(){ + stackk = new Stack(); + stackkk = new Stack(); + } + + public boolean isEmpty(){ + return stackk.isEmpty() && stackkk.isEmpty(); + } + + public int size() + { + return stackk.size() + stack2.size(); + } + + public void enQueue(E item){ + + stackk.push(item); + } + + public E deQueue(){ + if(stackkk.isEmpty()){ + while(!stackk.isEmpty()){ + stackkk.push(stackk.pop()); + } + } + return stackkk.pop(); + } + public static void main(String args[]){ + QueueWithTwoStacks queue = new QueueWithTwoStacks(); + queue.enQueue(1); + queue.enQueue(5); + queue.enQueue(4); + queue.enQueue(0); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + System.out.println(queue.deQueue()); + } +} diff --git a/group23/632678665/com/basic/week9/QuickMinStack.java b/group23/632678665/com/basic/week9/QuickMinStack.java new file mode 100644 index 0000000000..bac723e3f1 --- /dev/null +++ b/group23/632678665/com/basic/week9/QuickMinStack.java @@ -0,0 +1,48 @@ + + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author chk + * + */ +public class QuickMinStack extends Stack { + + Stack sMin; + public QuickMinStack(){ + sMin = new Stack(); + } + public void push(int data){ + if(data <= findMin()){ + sMin.push(data); + } + super.push(data); + } + public Integer pop(){ + int value = super.pop(); + if(value == findMin()){ + sMin.pop(); + } + return value; + } + public int findMin(){ + if(sMin.isEmpty()){ + return Integer.MAX_VALUE; + } + return sMin.peek(); + } + + public static void main(String args[]){ + QuickMinStack stack = new QuickMinStack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(0); + System.out.println(stack.pop().intValue()); + System.out.println(stack.findMin()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } +} diff --git a/group23/632678665/com/basic/week9/StackWithTwoQueues.java b/group23/632678665/com/basic/week9/StackWithTwoQueues.java new file mode 100644 index 0000000000..7fcf9162c9 --- /dev/null +++ b/group23/632678665/com/basic/week9/StackWithTwoQueues.java @@ -0,0 +1,53 @@ +package com.basic.week9; +import java.util.LinkedList; + + +/** + * @author chk + */ +public class StackWithTwoQueues { + + LinkedList queue1=new LinkedList(); + LinkedList queue2=new LinkedList(); + public void push(int data){ + queue1.addLast(data); + } + public int pop() { + if (sSize() > 0) { + if (!queue1.isEmpty()) { + while (queue1.size() > 1) { + queue2.addLast(queue1.removeFirst()); + } + return queue1.removeFirst(); + } else { + while (queue2.size() > 1) { + queue1.addLast(queue2.removeFirst()); + } + return queue2.removeFirst(); + } + } else { + System.out.println("栈空,不能出栈"); + return Integer.MAX_VALUE; + } + } + public int sSize(){ + return queue1.size() + queue2.size(); + } + public static void main(String[] args) + { + StackWithTwoQueues stack=new StackWithTwoQueues(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + stack.push(5); + stack.push(6); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + System.out.println(stack.pop()); + } +} diff --git a/group23/632678665/com/basic/week9/TwoStackInOneArray.java b/group23/632678665/com/basic/week9/TwoStackInOneArray.java new file mode 100644 index 0000000000..5443e6d6e4 --- /dev/null +++ b/group23/632678665/com/basic/week9/TwoStackInOneArray.java @@ -0,0 +1,82 @@ +package com.basic.week9; +import java.util.Stack; + +/** + * @author chk + */ +public class TwoStackInOneArray { + + + + Object[] data = new Object[10]; + + private int index1 = 0; + private int index2 = data.length - 1; + + + private boolean isFull() { + if (index1 == index2) { + return true; + } else + return false; + } + + private void extendCapacity() { + + } + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + return null; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + return null; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + return null; + } + +} diff --git a/group23/729693763/First_Homework1/readme.md b/group23/729693763/First_Homework1/readme.md new file mode 100644 index 0000000000..219dee010b --- /dev/null +++ b/group23/729693763/First_Homework1/readme.md @@ -0,0 +1,2 @@ +It contain source code and Test file by JUnit, +you can run SuitTest for testing whole file. diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java b/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java new file mode 100644 index 0000000000..ccb3bcb12c --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/ArrayList.java @@ -0,0 +1,117 @@ +package com.danny.hw1; + +import java.lang.reflect.Array; +import java.util.Arrays; + +import javax.print.attribute.Size2DSyntax; + +public class ArrayList implements List{ + //ArrayList Size + private int size=0; + private int array_len=2; + + //total element in here + private Object[] elementData = new Object[array_len]; + + @Override + public void add(Object o) { + // TODO Auto-generated method stub + adjustCapacity(); + this.elementData[size++] = o; + } + + @Override + public void add(int index, Object o) { + // TODO Auto-generated method stub + //Check range. if index is invalid,then would not add anythings + rangeCheckForAdd(index); + + adjustCapacity(); + System.arraycopy(elementData, index, elementData, + index + 1,size - index); + this.elementData[index] = o; + this.size++; + + } + + @Override + public Object get(int index) { + // TODO Auto-generated method stub + rangeCheckExist(index); + + return elementData[index]; + + } + + @Override + public Object remove(int index) { + // TODO Auto-generated method stub + rangeCheckExist(index); + + Object oldValue = elementData[index]; + //deal with copy operation + int moveStep = size - index - 1; + if ( moveStep > 0 ) + System.arraycopy(elementData, index+1, elementData, index,moveStep); + elementData[--size] = null; // clear to let GC do its work + + return oldValue; + + } + + @Override + public int size() { + // TODO Auto-generated method stub + return this.size; + } + + //Get Iterator + public Iterator iterator() { + return new ArrayListIterator(); + } + + /******* Iterator *******/ + private class ArrayListIterator implements Iterator{ + + private int currentIndex = 0; + + @Override + public boolean hasNext() { + return currentIndex < size(); + } + + @Override + public Object next() { + rangeCheckExist(currentIndex); + + return elementData[currentIndex++]; + } + } + + + /*******Inner function*******/ + //Increase arraylist size + private void adjustCapacity(){ + //array length can not satisfy data size; + if ( this.array_len < size() + 1 ) { + this.array_len *= 2; + this.elementData = Arrays.copyOf(elementData, array_len); + } else { + return ; + } + } + + private void rangeCheckForAdd(int index) { + //Add operation is allow to add value in [ size() ] even if [ size() ] has not data + if ( index > size() || index < 0 ) + throw new IndexOutOfBoundsException("Invalid Adding Index:"+index); + } + private void rangeCheckExist(int index) { + if ( index >= size() || index < 0 ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java b/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java new file mode 100644 index 0000000000..8e3178b50b --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/BinaryTreeNode.java @@ -0,0 +1,101 @@ +package com.danny.hw1; + +import java.util.Map; +import java.util.TreeMap; + +public class BinaryTreeNode { + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode insert(Object o){ + if ( this.data == null && left == null && right == null ) { + this.data = o; + return this; + } else { + BinaryTreeNode temp = findNode(this, o); + + BinaryTreeNode newNode = new BinaryTreeNode(); + newNode.data = o; + //assert more than one null node in the temp(left,right,or both); + if ( temp.compareTo(o) >= 0 ) { + temp.left = newNode; + } else { + temp.right = newNode; + } + return newNode; + } + } + + public BinaryTreeNode() { + // TODO Auto-generated constructor stub + data=null; + left =null; + right = null; + + } + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + private int compareTo(Object o){ + // o1 > o2 == 1; o1 = o2 == 0 ; o1 < o2 == -1 + //假设这个比较现在只用在数字上 + return Integer.parseInt(this.data.toString()) - Integer.parseInt(o.toString()); + } + + private static BinaryTreeNode findNode(BinaryTreeNode root,Object o){ + if ( root.left == null && root.right == null || + ( root.compareTo(o) < 0 && root.right == null) || + ( root.compareTo(o) >= 0 && root.left == null) ){ + return root; + } else if ( root.compareTo(o) >= 0 ) { + //root data is bigger than object + return findNode(root.left, o); + } else { + return findNode(root.right, o); + } +// else if(root.compareTo(o) < 0 ){ +// return findNode(root.right, o); +// } +// + } + + //For Test value + private Map teMap = new TreeMap<>(); + public void printWholeTree(BinaryTreeNode root,int layer){ + if(root == null) { + return ; + } + teMap.put(root.data,layer); + + layer++; + printWholeTree(root.left,layer); + printWholeTree(root.right,layer); + + } + + public Map getTeMap() { + return teMap; + } + + public void setTeMap(Map teMap) { + this.teMap = teMap; + } +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java new file mode 100644 index 0000000000..b1ff654263 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/Iterator.java @@ -0,0 +1,6 @@ +package com.danny.hw1; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java b/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java new file mode 100644 index 0000000000..64c9b9bbca --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/LinkedList.java @@ -0,0 +1,296 @@ +package com.danny.hw1; + +public class LinkedList implements List{ + + private Node Head = null; + private Node Tail = null; + private int size = 0; + + @Override + public void add(Object o) { + // TODO Auto-generated method stub + addLastNode(o); + } + + @Override + public void add(int index, Object o) { + // TODO Auto-generated method stub + checkPositionIndex(index); + + if ( index == size() ){ + addLastNode(o); + } else { + addBeforeNode(index,o); + } + } + + @Override + public Object get(int index) { + // TODO Auto-generated method stub + checkElementIndex(index); + + Node findGetNode = findIndexNode(index); + return findGetNode.data; + } + + @Override + public Object remove(int index) { + // TODO Auto-generated method stub + checkElementIndex(index); + Node deleteNode = null; + + //delete all node + if ( size() == 1 ) { + deleteNode = this.Head; + this.Head = null; + this.Tail = null; + } else if ( index == 0 ) { + //Remove Head + deleteNode = this.Head; + this.Head = this.Head.next; + } else if ( index == size() - 1) { + //Remove Tail + deleteNode = this.Tail; + Node findDeleteNode = findIndexNode(index - 1); + findDeleteNode.next = null; + this.Tail = findDeleteNode; + } else { + //Remove Mid + Node findDeleteNode = findIndexNode(index - 1); + deleteNode = findDeleteNode.next; + findDeleteNode.next = findDeleteNode.next.next; + } + this.size--; + return deleteNode.data; + } + + @Override + public int size() { + // TODO Auto-generated method stub + return this.size; + } + + @Override + public Iterator iterator(){ + return new LinkedListIterator(); + } + + /************Other function (without Interface function)**************/ + + public void addFirst(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = this.Head; + this.Head = newNode; + } + + public Object removeFirst(){ + checkElementIndex(0); + + Node deleteNode = this.Head; + this.Head = this.Head.next; + + this.size--; + return deleteNode.data; + } + + public Object removeLast(){ + checkElementIndex(size() - 1); + + Node deleteNode = this.Tail; + if ( this.Head == this.Tail ) { + this.Head = this.Tail = null; + } else { + this.Tail = findIndexNode(size() - 2); + } + this.size--; + return deleteNode.data; + + } + /************Iterator**************/ + private class LinkedListIterator implements Iterator{ + private Node currentNode; + private int currentIndex; + + public LinkedListIterator() { + // TODO Auto-generated constructor stub + this.currentIndex = 0; + this.currentNode = new Node(); + } + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return currentIndex < size(); + } + + @Override + public Object next() { + // TODO Auto-generated method stub + checkElementIndex(currentIndex); + if ( currentNode.data == null ) { + this.currentNode = findIndexNode(currentIndex); + } + Object value = currentNode.data; + currentNode = currentNode.next; + currentIndex++; + return value; + } + } + + /************Node class for supporting LinkedList**************/ + private static class Node{ + Object data ; + Node next ; + public Node() { + // TODO Auto-generated constructor stub + data = null; + next = null; + } + } + + /************Inner function **************/ + private void checkPositionIndex(int index){ + if ( !( index >= 0 && index <= size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + private void checkElementIndex(int index){ + if ( !( index >= 0 && index < size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + private void addLastNode(Object o){ + Node newNode = new Node(); + newNode.data = o; + + if ( this.Head == null ) { + this.Head = newNode; + this.Tail = newNode; + } else { + if(this.Head == this.Tail ){ + this.Tail = newNode; + this.Head.next = this.Tail; + } + else{ + //Tail and Head are different Object, + this.Tail.next = newNode; + this.Tail = newNode; + } + } + this.size++; + } + + private void addBeforeNode(int index,Object o){ + Node newNode = new Node(); + Node beforeInserNode = this.Head; + newNode.data = o; + + // if index is in Head + if ( index == 0 ) { + newNode.next = this.Head; + this.Head = newNode; + } else { + for (int i=0; i7->10 , 逆置后变为 10->7->3 +// */ +//public void reverse(){ +// +//} +// +///** +// * 删除一个单链表的前半部分 +// * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 +// * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 +// +// */ +//public void removeFirstHalf(){ +// +//} +// +///** +// * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 +// * @param i +// * @param length +// */ +//public void remove(int i, int length){ +// +//} +///** +// * 假定当前链表和list均包含已升序排列的整数 +// * 从当前链表中取出那些list所指定的元素 +// * 例如当前链表 = 11->101->201->301->401->501->601->701 +// * listB = 1->3->4->6 +// * 返回的结果应该是[101,301,401,601] +// * @param list +// */ +//public static int[] getElements(LinkedList list){ +// return null; +//} +// +///** +// * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 +// * 从当前链表中中删除在list中出现的元素 +// +// * @param list +// */ +// +//public void subtract(LinkedList list){ +// +//} +// +///** +// * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 +// * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) +// */ +//public void removeDuplicateValues(){ +// +//} +// +///** +// * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 +// * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) +// * @param min +// * @param max +// */ +//public void removeRange(int min, int max){ +// +//} +// +///** +// * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) +// * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 +// * @param list +// */ +//public LinkedList intersection( LinkedList list){ +// return null; +//} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/List.java b/group23/729693763/First_Homework1/src/com/danny/hw1/List.java new file mode 100644 index 0000000000..e71a86c78d --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/List.java @@ -0,0 +1,10 @@ +package com.danny.hw1; + +public interface List { + void add(Object o); + void add(int index,Object o); + Object get(int index); + Object remove(int index); + int size(); + Iterator iterator(); +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java new file mode 100644 index 0000000000..58f957dd31 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/Queue.java @@ -0,0 +1,25 @@ +package com.danny.hw1; + +public class Queue { + private LinkedList elementData = new LinkedList(); + + public void enQueue(Object o){ + elementData.add(o); + } + + public Object deQueue(){ + if ( size() > 0 ) { + return elementData.remove(0); + } else { + throw new IndexOutOfBoundsException("Queue is Null"); + } + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return elementData.size(); + } +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java b/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java new file mode 100644 index 0000000000..165387695b --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/Stack.java @@ -0,0 +1,40 @@ +package com.danny.hw1; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + this.elementData.add(o); + + } + + public Object pop(){ + int size = this.elementData.size(); + + if ( size > 0 ) { + return this.elementData.remove(size - 1 ); + } else{ + throw new IndexOutOfBoundsException("Stack is empty"); + } + } + + public Object peek(){ + + if ( size() > 0 ) { + return this.elementData.get(size() - 1 ); + } else{ + throw new IndexOutOfBoundsException("Stack is empty"); + } + } + public boolean isEmpty(){ + return size() == 0; + } + + public int size(){ + return this.elementData.size(); + } + + public Stack() { + // TODO Auto-generated constructor stub + } +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java new file mode 100644 index 0000000000..de4c734eb8 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/ArrayListTest.java @@ -0,0 +1,80 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import java.lang.reflect.Array; +import java.lang.reflect.Parameter; +import java.util.Arrays; +import java.util.Collection; + +import javax.print.attribute.standard.RequestingUserName; +import javax.xml.crypto.Data; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +import com.danny.hw1.ArrayList; +import com.danny.hw1.Iterator; +import com.danny.hw1.test_al; + +import junit.extensions.TestSetup; + + +public class ArrayListTest { + + static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; + ArrayList test; + @Before + public void setUp() throws Exception{ + test = new ArrayList(); + for(Object data: Data){ + test.add(data); + } + } + + @Test + public void testAddObject() { + int len = test.size(); + test.add(10); + assertEquals(len, test.size()-1); + } + + @Test + public void testAddIntObject() { + int len = test.size(); + test.add(len, 10); + + assertEquals(len, test.size()-1); + } + + @Test + public void testGet() { + assertEquals(Data[3], test.get(3)); + } + + @Test + public void testRemove() { + assertEquals(Data[4], test.remove(4)); + assertEquals(Data.length-1, test.size()); + } + + @Test + public void testSize() { + assertEquals(Data.length, test.size()); + } + + @Test + public void testIterator() { + Iterator iterator =test.iterator(); + for(Object i:Data){ + if(iterator.hasNext()){ + assertEquals(i,iterator.next()); + } + } + } + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java new file mode 100644 index 0000000000..2d99534098 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/BinaryTreeNodeTest.java @@ -0,0 +1,48 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.danny.hw1.BinaryTreeNode; +import com.danny.hw1.LinkedList; + +public class BinaryTreeNodeTest { + + static Object[] Data = new Object[]{5,10,3,2,15,12,56,8}; + BinaryTreeNode test; + @Before + public void setUp() throws Exception{ + test = new BinaryTreeNode(); + for(Object data: Data){ + test.insert(data); + + } + } + @Test + public void testPrintWholeTree(){ + test.printWholeTree(test, 1); + int layer = 1; + int printNum = 0; + System.out.println("var {5,10,3,2,15,12,56,8} insert tree\n"+"Print binary tree:"); + while(true){ + if(printNum == test.getTeMap().size()) break; + for (Object key : test.getTeMap().keySet()) { + Integer value = test.getTeMap().get(key); + + if (value.intValue() == layer){ + System.out.print(key.toString()+" "); + printNum++; + } + + } + System.out.println(""); + layer++; + } + + + } + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java new file mode 100644 index 0000000000..ab49d2823c --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/LinkedListTest.java @@ -0,0 +1,86 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.danny.hw1.ArrayList; +import com.danny.hw1.Iterator; +import com.danny.hw1.LinkedList; + +public class LinkedListTest { + + static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; + LinkedList test; + @Before + public void setUp() throws Exception{ + test = new LinkedList(); + for(Object data: Data){ + test.add(data); + } + } + + @Test + public void testAddObject() { + int len = test.size(); + test.add(10); + assertEquals(len, test.size()-1); + } + + @Test + public void testAddIntObject() { + int len = test.size(); + test.add(len, 10); + + assertEquals(len, test.size()-1); + } + + @Test + public void testGet() { + assertEquals(Data[3], test.get(3)); + } + + @Test + public void testRemove() { + System.out.println(Data[4]); + assertEquals(Data[4], test.remove(4)); + assertEquals(Data.length -1, test.size()); + } + + @Test + public void testSize() { + assertEquals(Data.length, test.size()); + } + + @Test + public void testIterator() { + Iterator iterator =test.iterator(); + for(Object i:Data){ + if(iterator.hasNext()){ + assertEquals(i,iterator.next()); + } + } + } + + @Test + public void testAddFirst() { + test.addFirst(10); + assertEquals(10, test.get(0)); + } + + @Test + public void testRemoveFirst() { + Object ans=test.get(0); + assertEquals(ans,test.removeFirst()); + assertEquals(Data.length-1,test.size()); + } + + @Test + public void testRemoveLast() { + Object ans=test.get(Data.length - 1); + assertEquals(ans,test.removeLast()); + assertEquals(Data.length-1,test.size()); + } + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java new file mode 100644 index 0000000000..7292129e95 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/QueueTest.java @@ -0,0 +1,47 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.danny.hw1.LinkedList; +import com.danny.hw1.Queue; + +public class QueueTest { + + static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; + Queue test; + @Before + public void setUp() throws Exception{ + test = new Queue(); + for(Object data: Data){ + test.enQueue(data); + } + } + + @Test + public void testEnQueue() { + Object t=10; + test.enQueue(t); + assertEquals(Data.length+1,test.size()); + } + + @Test + public void testDeQueue() { + Object t=test.deQueue(); + assertEquals(Data.length-1,test.size()); + assertEquals(Data[0], t); + } + @Test + public void testIsEmpty() { + assertFalse(test.isEmpty()); + } + + @Test + public void testSize() { + assertEquals(Data.length,test.size()); + } + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java new file mode 100644 index 0000000000..11484c0043 --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/StackTest.java @@ -0,0 +1,54 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import com.danny.hw1.Queue; +import com.danny.hw1.Stack; + +public class StackTest { + + static Object[] Data = new Object[]{1,2,3,4,5,6,7,8}; + Stack test; + @Before + public void setUp() throws Exception{ + test = new Stack(); + for(Object data: Data){ + test.push(data); + } + } + + @Test + public void testPush() { + Object t=10; + test.push(t); + assertEquals(Data.length+1,test.size()); + } + + @Test + public void testPop() { + assertEquals(Data[Data.length-1], test.pop()); + assertEquals(Data.length-1, test.size()); + } + + @Test + public void testPeek() { + assertEquals(Data[Data.length-1], test.peek()); + assertEquals(Data.length, test.size()); + } + + @Test + public void testIsEmpty() { + assertFalse(test.isEmpty()); + } + + @Test + public void testSize() { + assertEquals(Data.length, test.size()); + } + + + +} diff --git a/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java b/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java new file mode 100644 index 0000000000..25eb57411b --- /dev/null +++ b/group23/729693763/First_Homework1/src/com/danny/hw1/test/SuitTest.java @@ -0,0 +1,17 @@ +package com.danny.hw1.test; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@Suite.SuiteClasses({ArrayListTest.class,BinaryTreeNodeTest.class, + LinkedListTest.class,QueueTest.class,StackTest.class + }) +public class SuitTest { + +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java new file mode 100644 index 0000000000..af11509593 --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/ArrayUtil.java @@ -0,0 +1,221 @@ +package com.danny.hw2; + +import java.util.Arrays; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = + * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * + * @param origin + * @return + */ + public void reverseArray(int[] origin) { + int size = origin.length; + int[] temp = new int[size]; + + for(int i=0;i < size; i++){ + temp[i] = origin[size-i-1]; + } + + for(int i=0;i array2[index2] ){ + result[resultIndex++] = array2[index2++]; + break; + } + } else{ + result[resultIndex++] = array1[index1++]; + } + } + System.out.println(resultIndex); + return Arrays.copyOf(result, resultIndex); + + } + + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * + * @param oldArray + * @param size + * @return + */ + public int[] grow(int[] oldArray, int size) { + int oldSize = oldArray.length; + int[] newArray= new int[oldSize+size]; + + for ( int i = 0; i < newArray.length; i++) { + if ( i < oldSize ) { + newArray[i] = oldArray[i]; + } else{ + newArray[i] = 0; + } + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 例如, max = 15 , + * 则返回的数组应该为 [1,1,2,3,5,8,13] max = 1, 则返回空数组 [] + * + * @param max + * @return + */ + public int[] fibonacci(int max) { + if(max == 1){ + return new int[0]; + } + + int maxIndex = 1000; + int realIndex = 0; + int[] array=new int[maxIndex]; + for (; realIndex <= array.length; realIndex++) { + int fibonacciNum = getFibonacciArray(realIndex+1); + if(fibonacciNum > max){ + break; + } + array[realIndex] = fibonacciNum; + } + + + + return Arrays.copyOf(array, realIndex); + } + + + private int getFibonacciArray(int index){ + + if(index == 0 || index == 1){ + return index; + } + return getFibonacciArray(index - 1) + getFibonacciArray(index - 2); + } + /** + * 返回小于给定最大值max的所有素数数组 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * + * @param max + * @return + */ + public int[] getPrimes(int max) { + int maxIndex = 1000; + int realSize = 0; + int[] array = new int[maxIndex]; + for (int i = 0; i < max; i++) { + if(isPrimers(i)){ + array[realSize++] = i; + } + } + return Arrays.copyOf(array, realSize); + } + private static boolean isPrimers(int n){ + if (n <= 3) { + return n > 1; + } + + for(int i=2;i<=Math.sqrt(n);i++){ + if(n%i == 0) + return false; + } + return true; + } + + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * + * @param max + * @return + */ + public int[] getPerfectNumbers(int max) { + int maxIndex = 1000; + int realIndex = 0; + int[] array = new int[maxIndex]; + int sum = 0; + + for (int i = 1; i < max /2 +1; i++) { + if(max % i == 0){ + sum += i; + array[realIndex++] = i; + } + } + if(sum == max){ + return Arrays.copyOf(array, realIndex); + }else{ + return new int[0]; + } + + } + + /** + * 用seperator 把数组 array给连接起来 例如array= [3,8,9], seperator = "-" 则返回值为"3-8-9" + * + * @param array + * @param s + * @return + */ + public String join(int[] array, String seperator) { + String result=""; + for (int i = 0; i < array.length; i++) { + result+= String.valueOf(array[i]) + seperator; + } + //去掉多余的一个seperator + return result.substring(0, result.length()-1); + } + + + + +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java new file mode 100644 index 0000000000..340d542dec --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/LoginAction.java @@ -0,0 +1,39 @@ +package com.danny.hw2; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java new file mode 100644 index 0000000000..6e1cb4ba96 --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/Struts.java @@ -0,0 +1,163 @@ +package com.danny.hw2; + +import java.io.File; +import java.lang.invoke.CallSite; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import org.jaxen.*; + +public class Struts { + + private static Document file = null; + private static String file_path = + new File("").getAbsolutePath()+".\\xmlFolder\\struts.xml"; + + private static String viewPath="com.danny.hw2.View"; + + //0. 读取配置文件struts.xml + private static Document parse(String path){ + SAXReader reader = new SAXReader(); + Document document = null; + try { + document = reader.read(path); + } catch (DocumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return document; + } + + private static Element getAction(Document document,String name){ + + List lElement = (List) file.selectObject("/struts/action"); + Element actionElement = null; + for(Element e:lElement){ + if(e.attributeValue("name").equals(name)){ + actionElement = e; + break; + } + } + return actionElement; + } + + public static View runAction(String actionName, Map parameters) { + + file = parse(file_path); + + //返回的class View; + Object viewClass = null; + + + //0 Get Action Element + Element actionElement = getAction(file, actionName); + + + String actionClassPath = actionElement.attributeValue("class"); + System.out.println(actionClassPath); + + Object action = null; + + try { + /* + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + */ + action = Class.forName(actionClassPath).newInstance(); + + Method setName = action.getClass().getMethod("setName",String.class); + setName.invoke(action, parameters.get("name")); + + Method setPassword = action.getClass().getMethod("setPassword",String.class); + setPassword.invoke(action, parameters.get("password")); + + + //2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Method execute = action.getClass().getMethod("execute", null); + Object status = execute.invoke(action); + + System.out.println(status.toString()); + + + //3获得所有的Getter字段 + Field[] files = action.getClass().getDeclaredFields(); + + HashMap save = new HashMap<>(); + + //找到需要的数据,线存到save中 + for (int i = 0; i < files.length; i++) { + String name = files[i].getName(); + name = "get" + name.substring(0,1).toUpperCase() + + name.substring(1); + + + Method getter = action.getClass().getMethod(name,null); + save.put(files[i].getName(), (String) getter.invoke(action)); + + } + //塞进viewClass里面 + viewClass = Class.forName(viewPath).newInstance(); + Method setParameters = viewClass.getClass().getMethod("setParameters", Map.class); + setParameters.invoke(viewClass, save); + + + + //4将jsp放进去 + List resultElement = actionElement.selectNodes("result"); + for(Element e:resultElement){ + if(e.attributeValue("name").equals(status.toString())){ + String jspFields= e.getStringValue(); + viewClass.getClass().getMethod("setJsp", String.class). + invoke(viewClass, jspFields); + } + + } + + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + + throw new RuntimeException(e.getMessage()); + } + + + + + /* + + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + + 3. 通过反射找到对象的所有getter方法(例如 getMessage), + 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , + 放到View对象的parameters + + 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, + 放到View对象的jsp字段中。 + + */ + + + return (View) viewClass; + } + + +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java new file mode 100644 index 0000000000..67ff0a061b --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/View.java @@ -0,0 +1,23 @@ +package com.danny.hw2; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java new file mode 100644 index 0000000000..a7fce5320a --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/ArrayUtilTest.java @@ -0,0 +1,95 @@ +package com.danny.hw2.test; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.danny.hw2.ArrayUtil; + +public class ArrayUtilTest { + + @Test + public void testReverseArray() { +// * 给定一个整形数组a , 对该数组的值进行置换 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] 如果 a = +// * [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + int[] testData = new int[]{7,9,30,3}; + int[] ans = new int[]{3,30,9,7}; + new ArrayUtil().reverseArray(testData); + + for (int i = 0; i < ans.length; i++) { + assertEquals(ans[i], testData[i]); + } + } + + @Test + public void testRemoveZero() { + int[] testData = new int[]{1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; + int[] ans = new int[]{1,3,4,5,6,6,5,4,7,6,7,5}; + + int[] test = new ArrayUtil().removeZero(testData); + for (int i = 0; i < ans.length; i++) { + assertEquals(ans[i], test[i]); + } + } + + @Test + public void testMerge() { +// * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 例如 a1 = +// * [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + int[] a1 = new int[]{3, 5, 7,8}; + int[] a2 = new int[]{4,5,6,7}; + + int[] ans = new int[]{3,4,5,6,7,8}; + + int[] test = new ArrayUtil().merge(a1, a2); + + for (int i = 0; i < test.length; i++) { + assertEquals(ans[i], test[i]); + } + + } + + @Test + public void testGrow() { +// 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size +// * 注意,老数组的元素在新数组中需要保持 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 +// * [2,3,6,0,0,0] + + int size = 3; + int[] testData = new int[]{2,3,6}; + int[] test = new ArrayUtil().grow(testData, size); + assertEquals(testData.length+size, test.length); + + } + + @Test + public void testFibonacci() { + int[] ans = new int[]{1,1,2,3,5,8,13}; + int[] array = new ArrayUtil().fibonacci(15); + for (int i = 0; i < ans.length; i++) { + assertEquals(ans[i], array[i]); + } + + } + + @Test + public void testGetPerfectNumbers() { + + int[] ans=new int[]{1,2,4,7,14}; + int[] array=new ArrayUtil().getPerfectNumbers(28); + for (int i = 0; i < array.length; i++) { + assertEquals(ans[i], array[i]); + } + } + + @Test + public void testJoin() { + //* 用seperator 把数组 array给连接起来 例如array= [3,8,9], + //seperator = "-" 则返回值为"3-8-9" + int[] test = new int[]{3,8,9}; + + String test1 = new ArrayUtil().join(test, "-"); + assertEquals("3-8-9", test1); + } + +} diff --git a/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java new file mode 100644 index 0000000000..49b770f015 --- /dev/null +++ b/group23/729693763/Second_Homework2/src/com/danny/hw2/test/StrutsTest.java @@ -0,0 +1,46 @@ +package com.danny.hw2.test; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; + +import com.danny.hw2.Struts; +import com.danny.hw2.View; + + + + + +public class StrutsTest { + + @Test + public void testLoginActionSuccess() { + + String actionName = "login"; + + Map params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); + } +} diff --git a/group23/729693763/Third_Homework3/DataStruct/Iterator.java b/group23/729693763/Third_Homework3/DataStruct/Iterator.java new file mode 100644 index 0000000000..2ca354f82a --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/Iterator.java @@ -0,0 +1,6 @@ +package com.zhous.DataStruct; + +public interface Iterator { + public boolean hasNext(); + public Object next(); +} diff --git a/group23/729693763/Third_Homework3/DataStruct/LinkedList.java b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java new file mode 100644 index 0000000000..2a6663a3ba --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/LinkedList.java @@ -0,0 +1,327 @@ +package com.zhous.DataStruct; + +import javafx.beans.binding.ObjectExpression; + + + +public class LinkedList implements List { + + private Node head = null; + private int size = 0; + + public void add(Object o){ + addLast(o); + this.size++; + } + + //内部调用的方法: + //2 返回添加到哪个Node + private Node findBeforeInsertNode(int needInsertIndex){ + Node findGetNode = this.head; + for ( int i=0; i< needInsertIndex - 1; i++ ) { + findGetNode = findGetNode.next; + } + return findGetNode; + } + //3 + private void checkPositionIndex(int index) { + if ( !( index >= 0 && index <= size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + //4 + private void addBeforeNode(int index, Object o) { + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + + Node beforeInserNode = this.head; + + + beforeInserNode = findBeforeInsertNode(index); + + newNode.next = beforeInserNode.next; + beforeInserNode.next = newNode; + + } + //5 + private Node findIndexNode(int index){ + Node findGetNode = this.head; + for ( int i=0; i< index; i++ ) { + findGetNode = findGetNode.next; + } + return findGetNode; + } + + + public void add(int index , Object o){ + checkPositionIndex(index); + if( index == size()){ + addLast(o); + } else if ( index == 0 ) { + addFirst(o); + } else{ + addBeforeNode(index,o); + } + this.size++; + } + + + + + public Object get(int index){ + checkElementIndex(index); + return findIndexNode(index); + } + public Object remove(int index){ + checkElementIndex(index); + Object deleteData = null; + + if(index == 0){ + deleteData = removeFirst(); + } else if(index == (size() - 1) ){ + deleteData = removeLast(); + } else { + Node temp = findBeforeInsertNode(index); + Node tempNext = temp.next; + deleteData = tempNext.data; + + temp.next = tempNext.next; + tempNext = null; + } + + return deleteData; + } + + //6 + private void checkElementIndex(int index) { + if ( !( index >= 0 && index < size ) ) + throw new IndexOutOfBoundsException("Invalid Index:"+index); + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + if ( this.head == null ) { + this.head = newNode; + } else { + newNode.next = this.head; + this.head = newNode; + } + } + private void addLast(Object o){ + Node newNode = new Node(); + newNode.data = o; + newNode.next = null; + if ( head == null ) { + head = newNode; + } else{ + findBeforeInsertNode(this.size).next = newNode; + } + } + public Object removeFirst(){ + Object data; + Node newHead = new Node(); + newHead = this.head; + this.head = newHead.next; + + data = newHead.data; + newHead = null; + return data; + } + public Object removeLast(){ + Object data; + Node last = findIndexNode(this.size() -1); + data = last.data; + last = null; + + return data; + } + public Iterator iterator() + { + return new LinkedListIterator(); + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + Node first ; + int currentIndex = 1; + this.head = findIndexNode(this.size - 1); + if(this.size() <= 1){ + return; + } + while(currentIndex < this.size() ){ + first = findIndexNode(this.size() - currentIndex); + first.next = findIndexNode(this.size - currentIndex - 1); + currentIndex++; + } + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + checkElementIndex(this.size()); + + int mid = this.size / 2; + Node temp = this.head; + this.head = findIndexNode(mid); + for (int i = 0; i < mid; i++) { + Node T = temp.next; + temp = null; + temp = T; + } + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param index + * @param length + */ + public void remove(int index, int length){ + checkElementIndex(length + index ); + + Node before = findBeforeInsertNode(index); + Node temp = findIndexNode(index); + for (int i= 0; i < length; i++) { + Node T = temp.next; + temp = null; + temp = T; + } + before.next = temp; + } + /** + * 假定当前链表和listB均包含已升序排列的整数 + * 从当前链表中取出那些listB所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public int[] getElements(LinkedList list){ + Node listNode = list.head; + Node myNode = this.head; + int[] data = new int[list.size()]; + for (int i = 0; i < this.size(); i++) { + if(i == (Integer) listNode.data){ + data[i] = (Integer)myNode.data; + } + myNode = myNode.next; + } + + return data; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在listB中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + int[] data = new int[list.size()]; + for (int i = 0,j = 0; i < this.size(); i++) { + for (; j < list.size(); j++) { + if(this.get(i).equals(list.get(j))){ + this.remove(i); + break; + } + } + } + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + * (选做) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + * (选做) + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + LinkedList listC = new LinkedList(); + + for (int i = 0,j = 0; i < this.size(); i++) { + for (; j < list.size(); j++) { + if(this.get(i).equals(list.get(j))){ + listC.add(this.get(i)); + break; + } + } + } + + + + return listC; + } + + + + /************Iterator**************/ + private class LinkedListIterator implements Iterator{ + private Node currentNode; + private int currentIndex; + + public LinkedListIterator() { + // TODO Auto-generated constructor stub + this.currentIndex = 0; + this.currentNode = new Node(); + } + @Override + public boolean hasNext() { + // TODO Auto-generated method stub + return currentIndex < size(); + } + + @Override + public Object next() { + // TODO Auto-generated method stub + checkElementIndex(currentIndex); + if ( currentNode.data == null ) { + this.currentNode = findIndexNode(currentIndex); + } + Object value = currentNode.data; + currentNode = currentNode.next; + currentIndex++; + return value; + } + } +} diff --git a/group23/729693763/Third_Homework3/DataStruct/List.java b/group23/729693763/Third_Homework3/DataStruct/List.java new file mode 100644 index 0000000000..aa8b039453 --- /dev/null +++ b/group23/729693763/Third_Homework3/DataStruct/List.java @@ -0,0 +1,10 @@ +package com.zhous.DataStruct; + +public interface List { + void add(Object o); + void add(int index, Object o); + Object get(int index); + Object remove(int index); + int size(); + Iterator iterator(); +} diff --git a/group23/729693763/Third_Homework3/download/DownloadThread.java b/group23/729693763/Third_Homework3/download/DownloadThread.java new file mode 100644 index 0000000000..3ab337e352 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/DownloadThread.java @@ -0,0 +1,49 @@ +package com.zhous.download; + +import com.zhous.download.api.Connection; +import com.zhous.download.api.DownloadListener; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + File targetFile; + DownloadListener downloadListener; + + public DownloadThread( Connection conn, int startPos, int endPos,File targetFile,DownloadListener downloadListener){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.targetFile = targetFile; + this.downloadListener = downloadListener; + } + public void run(){ + try { + //读取到指定长度的二进制数据 + System.out.println(this.getName()+"开始下载"); + byte[] data = conn.read(startPos,endPos); + + //插入的file中去 + RandomAccessFile raFile = new RandomAccessFile(this.targetFile,"rw"); + raFile.seek(startPos); + raFile.write(data,0,endPos-startPos ); + + raFile.close(); + //做完了 + if(FileDownloader.isDownloadFinish() ){ + downloadListener.notifyFinished(); + System.out.println(this.getName()+"完成最后的下载,并写入文件"); + } + + + }catch (IOException e){ + + } + } +} diff --git a/group23/729693763/Third_Homework3/download/FileDownloader.java b/group23/729693763/Third_Homework3/download/FileDownloader.java new file mode 100644 index 0000000000..098f9408f0 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/FileDownloader.java @@ -0,0 +1,96 @@ +package com.zhous.download; + +import com.zhous.download.api.Connection; +import com.zhous.download.api.ConnectionException; +import com.zhous.download.api.ConnectionManager; +import com.zhous.download.api.DownloadListener; + +import java.io.File; +import java.util.Set; + + +public class FileDownloader { + + String url="https://image.baidu.com/search/down?tn=download&word=download&ie=utf8&fr=detail&url=https%3A%2F%2Ftimgsa.baidu.com%2Ftimg%3Fimage%26quality%3D80%26size%3Db9999_10000%26sec%3D1490203615530%26di%3D2b1827956a01011d3634f3e04b01b15c%26imgtype%3D0%26src%3Dhttp%253A%252F%252Fimg15.3lian.com%252F2015%252Fh1%252F338%252Fd%252F157.jpg&thumburl=https%3A%2F%2Fss1.bdstatic.com%2F70cFvXSh_Q1YnxGkpoWK1HF6hhy%2Fit%2Fu%3D2613489365%2C2336631324%26fm%3D23%26gp%3D0.jpg"; + private static int threadNum = 5; + private static int threadCount = 0; + int avgBytes = 0; + + DownloadListener listener; + ConnectionManager cm; + File file = null; + + public FileDownloader(String _url,String fileName) { + this.url = _url; + this.file = new File(fileName); + } + + public void execute(){ + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + Connection conn = null; + try { + + conn = cm.open(this.url); + int length = conn.getContentLength(); + avgBytes = length / threadNum; + //使用5个线程去下载; + for (int i = 0; i < threadNum; i++) { + int startPos = i*avgBytes; + int endPos = startPos + avgBytes - 1; + if(i == threadNum -1) { + endPos = length; + } + + Connection c = cm.open(this.url); + DownloadThread thread = new DownloadThread(c,startPos,endPos,file,this.getListener()); + thread.setName("Thread"+(i+1) ); + thread.start(); + } + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + } + + + + + } + + + + public void setListener (DownloadListener listener){ + this.listener = listener; + } + + public synchronized static boolean isDownloadFinish(){ + threadCount++; + return threadCount == threadNum; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group23/729693763/Third_Homework3/download/FileDownloaderTest.java b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java new file mode 100644 index 0000000000..ca8817ba88 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/FileDownloaderTest.java @@ -0,0 +1,58 @@ +package com.zhous.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.zhous.download.api.ConnectionManager; +import com.zhous.download.api.DownloadListener; +import com.zhous.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url="http://www.mydeskcity.com//upload/pc/112/960x600/1351650816239.jpg"; + String github = "https://github.com/em14Vito/coding2017/archive/master.zip"; + +// FileDownloader downloader = new FileDownloader(url,"Data23.jpg"); + FileDownloader downloader = new FileDownloader(github,"github.zip"); + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/729693763/Third_Homework3/download/api/Connection.java b/group23/729693763/Third_Homework3/download/api/Connection.java new file mode 100644 index 0000000000..170791e8ba --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.zhous.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos, int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionException.java b/group23/729693763/Third_Homework3/download/api/ConnectionException.java new file mode 100644 index 0000000000..925368135d --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.zhous.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group23/729693763/Third_Homework3/download/api/ConnectionManager.java b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java new file mode 100644 index 0000000000..b331ee7f1f --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.zhous.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/729693763/Third_Homework3/download/api/DownloadListener.java b/group23/729693763/Third_Homework3/download/api/DownloadListener.java new file mode 100644 index 0000000000..07b1a950ce --- /dev/null +++ b/group23/729693763/Third_Homework3/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.zhous.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..6a4b98fe06 --- /dev/null +++ b/group23/729693763/Third_Homework3/download/impl/ConnectionImpl.java @@ -0,0 +1,80 @@ +package com.zhous.download.impl; + +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +import com.zhous.download.api.*; + +public class ConnectionImpl implements Connection{ + + + InputStream is = null; + URL url = null; + HttpURLConnection http = null; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + //构造方法: + public ConnectionImpl() { + } + + //打开url并且创建连接 + public ConnectionImpl(String url) { + try { + this.url = new URL(url); + http = (HttpURLConnection) this.url.openConnection(); + //设置超时 + http.setConnectTimeout(5000); + http.setReadTimeout(5000); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + + //指定http中读取一定长度的byte + http.setRequestProperty("Range","bytes= "+Integer.toString(startPos)+"-"+Integer.toString(endPos)); + http.connect(); + + //读取输入流到其中 + is = http.getInputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while( (len = is.read(buffer) ) != -1) { + + bos.write(buffer, 0, len); + } + + //关闭所有流,每次read的时候自动关闭。 + close(); + return bos.toByteArray(); + } + + @Override + public int getContentLength() { + return http.getContentLength(); + } + + @Override + public void close() { + try { + bos.close(); + if(is != null) { + is.close(); + } + http.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + System.out.println(e.getMessage()); + } + } + +} diff --git a/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..28af08a0cd --- /dev/null +++ b/group23/729693763/Third_Homework3/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,27 @@ +package com.zhous.download.impl; + +import com.zhous.download.api.*; + +import java.net.MalformedURLException; +import java.net.URL; + +public class ConnectionManagerImpl implements ConnectionManager { + + + + @Override + public Connection open(String url) throws ConnectionException { + Connection ct = null; + URL u = null; + try { + u = new URL(url); + ct = new ConnectionImpl(url); + } catch (MalformedURLException e) { + e.printStackTrace(); + } finally { + //URL类不需要关闭 + } + return ct; + } + +} diff --git a/group23/729693763/homework1_demo/ArrayList.java b/group23/729693763/homework1_demo/ArrayList.java new file mode 100644 index 0000000000..1f185736f9 --- /dev/null +++ b/group23/729693763/homework1_demo/ArrayList.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class ArrayList implements List { + + private int size = 0; + + private Object[] elementData = new Object[100]; + + public void add(Object o){ + + } + public void add(int index, Object o){ + + } + + public Object get(int index){ + return null; + } + + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public Iterator iterator(){ + return null; + } + +} diff --git a/group23/729693763/homework1_demo/BinaryTreeNode.java b/group23/729693763/homework1_demo/BinaryTreeNode.java new file mode 100644 index 0000000000..d7ac820192 --- /dev/null +++ b/group23/729693763/homework1_demo/BinaryTreeNode.java @@ -0,0 +1,32 @@ +package com.coding.basic; + +public class BinaryTreeNode { + + private Object data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public Object getData() { + return data; + } + public void setData(Object data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group23/729693763/homework1_demo/Iterator.java b/group23/729693763/homework1_demo/Iterator.java new file mode 100644 index 0000000000..06ef6311b2 --- /dev/null +++ b/group23/729693763/homework1_demo/Iterator.java @@ -0,0 +1,7 @@ +package com.coding.basic; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + +} diff --git a/group23/729693763/homework1_demo/LinkedList.java b/group23/729693763/homework1_demo/LinkedList.java new file mode 100644 index 0000000000..4fdb03db8a --- /dev/null +++ b/group23/729693763/homework1_demo/LinkedList.java @@ -0,0 +1,124 @@ +package com.coding.basic; + + + +public class LinkedList implements List { + + private Node head; + + public void add(Object o){ + + } + public void add(int index , Object o){ + + } + public Object get(int index){ + return null; + } + public Object remove(int index){ + return null; + } + + public int size(){ + return -1; + } + + public void addFirst(Object o){ + + } + public void addLast(Object o){ + + } + public Object removeFirst(){ + return null; + } + public Object removeLast(){ + return null; + } + public Iterator iterator(){ + return null; + } + + + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + + } + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public static int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } +} diff --git a/group23/729693763/homework1_demo/List.java b/group23/729693763/homework1_demo/List.java new file mode 100644 index 0000000000..10d13b5832 --- /dev/null +++ b/group23/729693763/homework1_demo/List.java @@ -0,0 +1,9 @@ +package com.coding.basic; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/729693763/homework1_demo/Queue.java b/group23/729693763/homework1_demo/Queue.java new file mode 100644 index 0000000000..36e516e266 --- /dev/null +++ b/group23/729693763/homework1_demo/Queue.java @@ -0,0 +1,19 @@ +package com.coding.basic; + +public class Queue { + + public void enQueue(Object o){ + } + + public Object deQueue(){ + return null; + } + + public boolean isEmpty(){ + return false; + } + + public int size(){ + return -1; + } +} diff --git a/group23/729693763/homework1_demo/Stack.java b/group23/729693763/homework1_demo/Stack.java new file mode 100644 index 0000000000..a5a04de76d --- /dev/null +++ b/group23/729693763/homework1_demo/Stack.java @@ -0,0 +1,22 @@ +package com.coding.basic; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + } + + public Object pop(){ + return null; + } + + public Object peek(){ + return null; + } + public boolean isEmpty(){ + return false; + } + public int size(){ + return -1; + } +} diff --git a/group23/729693763/readme.md b/group23/729693763/readme.md new file mode 100644 index 0000000000..89b8633e07 --- /dev/null +++ b/group23/729693763/readme.md @@ -0,0 +1,12 @@ +Data Struct contain: ArrayList, LinkedList, BinaryTreeNode, Stack, Queue, Iterator +<<<<<<< HEAD +--- --- +Add Blog link: +http://www.cnblogs.com/CodeSaveMe/p/6523745.html +======= +--- --- +Add Blog link: http://www.cnblogs.com/CodeSaveMe/p/6523745.html + +Add week2 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6571621.html + +Add week3 Blog link:http://www.cnblogs.com/CodeSaveMe/p/6624431.html diff --git a/group23/769232552/coding/src/main/java/code01/ArrayList.java b/group23/769232552/coding/src/main/java/code01/ArrayList.java new file mode 100644 index 0000000000..6746de2a50 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/ArrayList.java @@ -0,0 +1,138 @@ +package code01; + +/** + * Created by yaoyuan on 2017/3/6. + */ +public class ArrayList implements List { + + private int max_size = 0;//总长度 + private int current_size = 0; //当前长度 + private float extendPercent = 2; //扩展系数 + + private Object[] elementData; + + /** + * 默认构造函数,初始化数组长度为100 + */ + public ArrayList(){ + this.elementData = new Object[100]; + this.max_size = 100; + } + /** + * 构造函数 + * @param size,初始化数组长度 + */ + public ArrayList(int size){ + this.elementData = new Object[size]; + this.max_size = size; + } + + /** + * 顺序添加元素,超出原始界限时,数组自动扩展 + */ + public void add(Object o) { + //如果越界了,需要复制原有的数组到扩充后的数组中 + if(this.current_size + 1 > this.max_size) { + this.max_size = (int) Math.floor(this.max_size * this.extendPercent); + this.elementData = copyToNew(this.elementData,this.max_size); + } + this.elementData[this.current_size] = o; + this.current_size ++; + + } + + /** + * 指定位置添加元素 + * 一种是在中间,一种是当前插入的位置尾部(如果超过尾部则默认添加到尾部) + */ + public void add(int index, Object o){ + assert(index>=0); + //如果越界了,需要复制原有的数组到扩充后的数组中 + if(this.current_size + 1 > this.max_size) { + //如果越界了,需要复制原有的数组到扩充后的数组中 + this.max_size = (int) Math.floor(this.max_size * this.extendPercent); + this.elementData = copyToNew(this.elementData,this.max_size); + } + //数组中间插入 + if(index < this.current_size){ + //需要把当前位置的元素往后移动 + for (int i = this.current_size - 1; i >= index; i--) { + this.elementData[i+1] = this.elementData[i]; + } + this.elementData[index] = o; + }else { + //后面加入 + this.elementData[this.current_size] = o; + } + this.current_size ++; + } + + public Object get(int index){ + if(index >= 0 && index <= this.current_size-1){ + return this.elementData[index]; + }else { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + /** + * 删除指定位置的元素 + * @param index + * @return + */ + public Object remove(int index){ + Object result = null; + if(index >= 0 && index <= current_size-1){ + result = elementData[index]; + //删除操作 + if(index == current_size - 1){ + elementData[index] = null; + }else { + //需要把当前位置后面的元素往前移动 + for (int i = index; i < this.current_size-1 ; i++) { + this.elementData[i] = this.elementData[i+1]; + } + this.elementData[this.current_size-1] = null; + } + this.current_size --; + }else { + throw new ArrayIndexOutOfBoundsException(index); + } + return result; + } + + public int size(){ + return this.current_size; + } + + public Iterator iterator(){ + return new Iterator() { + int next_pos = 0; + int pos = -1; + public boolean hasNext() { + if(max_size <= 0){ + return false; + } + return next_pos < ArrayList.this.size(); + } + + public Object next() { + Object next = ArrayList.this.get(next_pos); + pos = next_pos ++; + return next; + } + public void remove(){ + ArrayList.this.remove(pos); + } + }; + } + + private Object[] copyToNew(Object[] oldArray, int extendSize){ + Object[] newArray = new Object[extendSize]; + for (int i = 0; i < size(); i++) { + newArray[i] = oldArray[i]; + } + return newArray; + } + +} \ No newline at end of file diff --git a/group23/769232552/coding/src/main/java/code01/BinaryTree.java b/group23/769232552/coding/src/main/java/code01/BinaryTree.java new file mode 100644 index 0000000000..b29fb960cb --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/BinaryTree.java @@ -0,0 +1,97 @@ +package code01; + +/** + * Created by yaoyuan on 2017/3/10. + */ +public class BinaryTree>{ + + private BinaryTreeNode root = null; + private int size = 0; + + public BinaryTreeNode createBinaryTree(T[] array){ + for(T data : array){ + this.insert(data); + } + return this.root; + } + + // recursive way, + // t is the node that roots the subtree. + public BinaryTreeNode insert(T data, BinaryTreeNode t){ + if(t == null){ + return new BinaryTreeNode(data); + } + int comparator = ((T) t.data).compareTo(data); + if(comparator > 0){ + t.left = insert(data,t.right); + }else if(comparator < 0){ + t.right = insert(data,t.left); + }else { + // do nothing + } + return t; + + } + + + //loop way + public void insert(T data){ + if(this.root == null){ + BinaryTreeNode node = new BinaryTreeNode(data); + this.root = node; + this.size ++; + return; + } + BinaryTreeNode cursor = this.root; + while (cursor != null){ + if(data.compareTo((T) cursor.data) <= 0){ + if(cursor.left == null) { + cursor.left = new BinaryTreeNode(data); + return; + } + cursor = cursor.left; + } + if(data.compareTo((T) cursor.data) > 0){ + if(cursor.right == null) { + cursor.right = new BinaryTreeNode(data); + return; + } + cursor = cursor.right; + } + } + this.size ++; + } + + public void leftOrderScan(BinaryTreeNode cursor){ + if(cursor == null){ + return; + } + leftOrderScan(cursor.left); + System.out.println(cursor.data.toString() + " "); + leftOrderScan(cursor.right); + } + + public BinaryTreeNode getRoot(){ + return this.root; + } + + class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data, BinaryTreeNode left, BinaryTreeNode right) { + this.left = right; + this.right = left; + this.data = data; + } + + public BinaryTreeNode(T data) { + this.left = null; + this.right = null; + this.data = data; + } + + } +} diff --git a/group23/769232552/coding/src/main/java/code01/Iterator.java b/group23/769232552/coding/src/main/java/code01/Iterator.java new file mode 100644 index 0000000000..b4074067bb --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/Iterator.java @@ -0,0 +1,7 @@ +package code01; + +public interface Iterator { + public boolean hasNext(); + public Object next(); + public void remove(); +} diff --git a/group23/769232552/coding/src/main/java/code01/LinkedList.java b/group23/769232552/coding/src/main/java/code01/LinkedList.java new file mode 100644 index 0000000000..f7bbc970a9 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/LinkedList.java @@ -0,0 +1,327 @@ +package code01; + + +public class LinkedList implements List { + + private Node head; + private Node tail; //指向链表最后一个元素的引用 + + private int size; //总长度 + + public LinkedList() { + this.head = null; + this.tail = null; + this.size = 0; + } + + /** + * 新增顺序添加一个元素 + * @param o + */ + public void add(Object o){ + Node node = new Node(); + node.data = o; + node.next = null; + //空链表 + if(head == null){ + this.head = node; + this.tail = node; + }else { //非空链表,要先找到链表尾部,再加入新解答 + this.tail.next = node; + this.tail = node; + } + this.size ++; + } + + /** + * 指定索引处添加node + */ + public void add(int index, Object o) { + assert(index >= 0); + Node node = new Node(); + node.data = o; + node.next = null; + + if(index == 0){ + //添加在头部 + node.next = head; + head = node; + }else if(index >= this.size){ + //添加在尾部 + this.tail.next = node; + }else { + //添加在中间 + Node cursor = this.head; + for (int i = 0; i < index - 1; i++) { + cursor = cursor.next; + } + node.next = cursor.next; + cursor.next = node; + } + this.size ++; + } + + public Object get(int index){ + assert(index < this.size); + Node cursor = this.head; + for (int i = 0; i < index; i++) { + cursor = cursor.next; + } + return cursor.data; + } + + public Object remove(int index){ + assert(index >= 0 && index < this.size); + Object result = null; + //删除的是链表尾部的元素 + if(index == this.size - 1){ + Node cursor = this.head; + for (int i = 0; i < index - 1; i++) { + cursor = cursor.next; + } + result = cursor.next.data; + tail = cursor; + cursor.next = null; + }else if(index == 0){ + //删除的是头部元素 + result = head.data; + head = head.next; + }else { + //删除的是链表中间的元素 + Node cursor = this.head; + for (int i = 0; i < index - 1; i++) { + cursor = cursor.next; + } + result = cursor.next.data; + cursor.next = cursor.next.next; + } + this.size --; + return result; + } + + public int size(){ + return this.size; + } + + public void addFirst(Object o){ + Node node = new Node(); + node.data = o; + node.next = null; + if(this.head == null){ + this.head = node; + this.tail = node; + }else { + node.next = head; + this.head = node; + } + this.size ++; + } + public void addLast(Object o){ + Node node = new Node(); + node.data = o; + node.next = null; + if(this.head == null){ + this.head = node; + this.tail = node; + }else { + this.tail.next = node; + this.tail = node; + } + this.size ++; + } + + public Object removeFirst(){ + Object first = null; + if(this.head != null){ + first = this.head.data; + head = head.next; + this.size --; + } + return first; + } + + public Object removeLast(){ + Object last = null; + if(this.tail != null){ + if(this.head != this.tail){ + Node cursor; + for (cursor = head;cursor.next!=tail;cursor=cursor.next); + last = this.tail.data; + this.tail = cursor; + this.tail.next = null; + }else { + last = this.tail.data; + this.head = null; + this.tail = null; + } + this.size --; + } + return last; + } + public Iterator iterator(){ + return null; + } + + /** + * 节点类 + */ + private static class Node{ + Object data; + Node next; + + } + + /** + * 把该链表逆置 + * 例如链表为 3->7->10 , 逆置后变为 10->7->3 + */ + public void reverse(){ + if(this.head == null || this.head == this.tail){ + return; + } + + Node pre_cursor = null; + Node cursor = this.head; + Node after_cursor = cursor.next; + + while(cursor != null){ + cursor.next = pre_cursor; + pre_cursor = cursor; + cursor = after_cursor; + if(after_cursor != null){ + after_cursor = after_cursor.next; + } + } + + Node tmpNode = this.head; + this.head = this.tail; + this.tail = tmpNode; + } + + /** + * 删除一个单链表的前半部分 + * 例如:list = 2->5->7->8 , 删除以后的值为 7->8 + * 如果list = 2->5->7->8->10 ,删除以后的值为7,8,10 + + */ + public void removeFirstHalf(){ + if(this.head == null || this.head.next == null){ + return; + } + if(this.head.next.next == null){ + this.head = this.head.next; + } + + Node stepOne = this.head; + Node stepTwo = this.head; + + while (stepTwo.next != null){ + stepOne = stepOne.next; + stepTwo = stepTwo.next.next; + } + this.head = stepOne; + } + + /** + * 从第i个元素开始, 删除length 个元素 , 注意i从0开始 + * @param i + * @param length + */ + public void remove(int i, int length){ + Node current = head; + Node firstHalf = null; + for (int k = 0; k < i; k ++){ + if(current == null){ + return; + } + firstHalf = current; //记录待删除节点的前一个节点 + current = current.next; + } + + //移动length长度 + for (int j = 0; j < length; j++) { + if(current == null){ + return; + } + current = current.next; + } + + if(i == 0){ + head = current; + }else { + firstHalf.next = current; + } + } + /** + * 假定当前链表和list均包含已升序排列的整数 + * 从当前链表中取出那些list所指定的元素 + * 例如当前链表 = 11->101->201->301->401->501->601->701 + * listB = 1->3->4->6 + * 返回的结果应该是[101,301,401,601] + * @param list + */ + public static int[] getElements(LinkedList list){ + return null; + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 从当前链表中中删除在list中出现的元素 + + * @param list + */ + + public void subtract(LinkedList list){ + + } + + /** + * 已知当前链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) + */ + public void removeDuplicateValues(){ + if(this.head == null){ + return; + } + Node current = this.head; + Node current_next = this.head; + while (current_next != null){ + current_next = current_next.next; //如果放到下个while循环后面写,就需要判断一次current_next是不是null了 + while(current_next != null && current_next.data.equals(current.data)){ + //删除重复节点 + current.next = current_next.next; + current_next = current_next.next; + } + current = current_next; + } + } + + /** + * 已知链表中的元素以值递增有序排列,并以单链表作存储结构。 + * 试写一高效的算法,删除表中所有值大于min且小于max的元素(若表中存在这样的元素) + * @param min + * @param max + */ + public void removeRange(int min, int max){ + //怎么才能高效呢 + } + + /** + * 假设当前链表和参数list指定的链表均以元素依值递增有序排列(同一表中的元素值各不相同) + * 现要求生成新链表C,其元素为当前链表和list中元素的交集,且表C中的元素有依值递增有序排列 + * @param list + */ + public LinkedList intersection( LinkedList list){ + return null; + } + + /** + * 遍历列表 + */ + public void printList(){ + System.out.println(); + for (Node cursor = this.head;cursor!=null;cursor=cursor.next){ + System.out.print(cursor.data+" "); + } + } +} diff --git a/group23/769232552/coding/src/main/java/code01/List.java b/group23/769232552/coding/src/main/java/code01/List.java new file mode 100644 index 0000000000..95bc37d172 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/List.java @@ -0,0 +1,9 @@ +package code01; + +public interface List { + public void add(Object o); + public void add(int index, Object o); + public Object get(int index); + public Object remove(int index); + public int size(); +} diff --git a/group23/769232552/coding/src/main/java/code01/Queue.java b/group23/769232552/coding/src/main/java/code01/Queue.java new file mode 100644 index 0000000000..d9956deb9a --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/Queue.java @@ -0,0 +1,24 @@ +package code01; + +public class Queue { + + private LinkedList linkedList = new LinkedList(); + + public void enQueue(Object o){ + linkedList.addFirst(o); + } + + public Object deQueue(){ + Object result = linkedList.removeLast(); + return result; + } + + public boolean isEmpty(){ + return linkedList.size() == 0; + } + + public int size(){ + return linkedList.size(); + } + +} diff --git a/group23/769232552/coding/src/main/java/code01/Stack.java b/group23/769232552/coding/src/main/java/code01/Stack.java new file mode 100644 index 0000000000..dbaeb91a48 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code01/Stack.java @@ -0,0 +1,31 @@ +package code01; + +public class Stack { + private ArrayList elementData = new ArrayList(); + + public void push(Object o){ + elementData.add(o); + } + + public Object pop(){ + Object result = null; + if(elementData.size()!=0) { + result = elementData.remove(elementData.size() - 1); + } + return result; + } + + public Object peek(){ + Object result = null; + if(elementData.size()!=0) { + result = elementData.get(elementData.size() - 1); + } + return result; + } + public boolean isEmpty(){ + return elementData.size() == 0; + } + public int size(){ + return elementData.size(); + } +} diff --git a/group23/769232552/coding/src/main/java/code02/ArrayUtil.java b/group23/769232552/coding/src/main/java/code02/ArrayUtil.java new file mode 100644 index 0000000000..23055ef138 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/ArrayUtil.java @@ -0,0 +1,257 @@ +package code02; +import org.apache.commons.lang.ArrayUtils; +import java.util.ArrayList; +import java.util.List; + +public class ArrayUtil { + + /** + * 给定一个整形数组a , 对该数组的值进行置换 + 例如: a = [7, 9 , 30, 3] , 置换后为 [3, 30, 9,7] + 如果 a = [7, 9, 30, 3, 4] , 置换后为 [4,3, 30 , 9,7] + * @param origin + * @return + */ + public void reverseArray(int[] origin){ + if (origin == null || origin.length <= 1){ + return; + } + + int head = 0; + int tail = origin.length - 1; + int tmp; + while (head != tail){ + //调换位置 + tmp = origin[head]; + origin[head] = origin[tail]; + origin[tail] = tmp; + + head ++; + tail --; + } + + } + + /** + * 现在有如下的一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5} + * 要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组,生成的新数组为: + * {1,3,4,5,6,6,5,4,7,6,7,5} + * @param oldArray + * @return + */ + public int[] removeZero(int[] oldArray){ + if (oldArray == null || oldArray.length < 1){ + return null; + } + + List newList = new ArrayList(); + for(int number : oldArray){ + if(number != 0){ + newList.add(number); + } + } + + Integer[] result = new Integer[newList.size()]; + result = (Integer[]) newList.toArray(result); + return ArrayUtils.toPrimitive(result); + + + } + + /** + * 给定两个已经排序好的整形数组, a1和a2 , 创建一个新的数组a3, 使得a3 包含a1和a2 的所有元素, 并且仍然是有序的 + * 例如 a1 = [3, 5, 7,8] a2 = [4, 5, 6,7] 则 a3 为[3,4,5,6,7,8] , 注意: 已经消除了重复 + * @param array1 + * @param array2 + * @return + */ + + public int[] merge(int[] array1, int[] array2){ + if(array1 == null && array2 == null){ + return null; + } + if(array1 == null){ + return array2; + } + if(array2 == null){ + return array1; + } + int[] newArray = new int[array1.length + array2.length]; + int m = 0,n = 0, k = 0; + while (m < array1.length && n < array2.length){ + if(array1[m] <= array2[n]){ + newArray[k++] = array1[m++]; + }else { + newArray[k++] = array2[n++]; + } + } + if(m >= array1.length){ + while (n < array2.length){ + newArray[k++] = array2[n++]; + } + } + if(n >= array2.length){ + while (m < array1.length){ + newArray[k++] = array1[m++]; + } + } + return newArray; + } + /** + * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size + * 注意,老数组的元素在新数组中需要保持 + * 例如 oldArray = [2,3,6] , size = 3,则返回的新数组为 + * [2,3,6,0,0,0] + * @param oldArray + * @param size + * @return + */ + public int[] grow(int [] oldArray, int size){ + int[] newArray = new int[oldArray.length + size]; + int i = 0; + for (; i < oldArray.length; i++) { + newArray[i] = oldArray[i]; + } + for (int j = 0; j < size; j++){ + newArray[i++] = 0; + } + return newArray; + } + + /** + * 斐波那契数列为:1,1,2,3,5,8,13,21...... ,给定一个最大值, 返回小于该值的数列 + * 例如, max = 15 , 则返回的数组应该为 [1,1,2,3,5,8,13] + * max = 1, 则返回空数组 [] + * @param max + * @return + */ + //也就是需要生成一个小于max值的fibonacci数组 + public int[] fibonacci(int max){ + if(max < 2){ + return new int[]{}; + } + if(max < 3){ + return new int[]{1,1}; + } + List list = new ArrayList(); + list.add(0,1); + list.add(1,1); + int i=0; + while (list.get(i) + list.get(i+1) < max){ + list.add(i+2,list.get(i) + list.get(i+1)); + i++; + } + + int[] newArray = new int[list.size()]; + for (int j = 0; j < list.size(); j++) { + newArray[j] = list.get(j).intValue(); + } + return newArray; + } + + /** + * 返回小于给定最大值max的所有素数数组 + * 例如max = 23, 返回的数组为[2,3,5,7,11,13,17,19] + * @param max + * @return + * + * 原理: + * 1,判断一个数字是否为素数,一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n) + * 2,当i是素数的时候,i的所有的倍数必然是合数。 + */ + public int[] getPrimes(int max){ + + if(max <= 2){ + return null; + } + boolean[] prime = new boolean[max + 1]; + for (int i = 2; i <= max; i++) { + if(i%2 == 0){ + prime[i] = false; //偶数 + }else { + prime[i] = true; + } + } + + for (int i = 2; i <= Math.sqrt(max) ; i++) { + if(prime[i]){//奇数 + //如果i是素数,那么把i的倍数标记为非素数 + for(int j = i+i; j <= max; j += i){ + prime[j] = false; + } + } + } + + List num = new ArrayList(); + for (int i = 2; i <= max; i++) { + if(prime[i]){ + num.add(i); + } + } + + Integer[] result = new Integer[num.size()]; + result = (Integer[]) num.toArray(result); + return ArrayUtils.toPrimitive(result); + } + + /** + * 所谓“完数”, 是指这个数恰好等于它的因子之和,例如6=1+2+3 + * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 + * @param max + * @return + */ + public int[] getPerfectNumbers(int max){ + + if(max < 6){ + return null; + } + + List perfectNumlist = new ArrayList(); + + for (int j = 6;j <= max; j++){ + List factorNumlist = new ArrayList(); + factorNumlist.add(1); + for (int i = 2; i < j; i++) { + if(j % i == 0){ + factorNumlist.add(i); + } + } + int sum = 0; + for(Integer num : factorNumlist){ + sum += num; + } + + if(sum == j){ + perfectNumlist.add(j); + } + } + Integer[] result = new Integer[perfectNumlist.size()]; + result = (Integer[]) perfectNumlist.toArray(result); + return ArrayUtils.toPrimitive(result); + } + + /** + * 用seperator 把数组 array给连接起来 + * 例如array= [3,8,9], seperator = "-" + * 则返回值为"3-8-9" + * @param array + * @param seperator + * @return + */ + public String join(int[] array, String seperator){ + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < array.length - 1; i++) { + sb.append(array[i]); + sb.append(seperator); + } + sb.append(array[array.length - 1]); + return sb.toString(); + } + + public void printArr(int[] array){ + for(int num : array){ + System.out.print(num + " "); + } + } + +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java b/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java new file mode 100644 index 0000000000..b5e077e7a5 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/ActionConfig.java @@ -0,0 +1,28 @@ +package code02.litestruts; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by yaoyuan on 2017/3/22. + */ +public class ActionConfig { + String name; + String clzName; + Map viewResult = new HashMap(); + + + public ActionConfig(String actionName, String clzName) { + this.name = actionName; + this.clzName = clzName; + } + public String getClassName(){ + return clzName; + } + public void addViewResult(String name, String viewName){ + viewResult.put(name, viewName); + } + public String getViewName(String resultName){ + return viewResult.get(resultName); + } +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java b/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java new file mode 100644 index 0000000000..85d3d98a1f --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/Configuration.java @@ -0,0 +1,64 @@ +package code02.litestruts; + +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * Created by yaoyuan on 2017/3/21. + */ +public class Configuration { + + + private String path; + private final Map actionMap = new HashMap(); + + Configuration(String path){ + parseXML(path); + } + + //解析xml文件 + private void parseXML(String path){ + //读取文件 + File file = new File(path); + SAXReader reader = new SAXReader(); + Document document = null; + try { + document = reader.read(file); + } catch (DocumentException e) { + e.printStackTrace(); + } + Element root = document.getRootElement(); + + for (Iterator iterator = root.elementIterator("action"); iterator.hasNext();) { + Element e = iterator.next(); + String actionName = e.attributeValue("name"); + String clazName = e.attributeValue("class"); + ActionConfig actionConfig = new ActionConfig(actionName,clazName); + for(Iterator childIterator = e.elementIterator();childIterator.hasNext();){ + Element child = childIterator.next(); + String jspKey = child.attributeValue("name"); + String jspValue = child.getTextTrim(); + actionConfig.addViewResult(jspKey,jspValue); + } + actionMap.put(actionName,actionConfig); + } + } + + public String getView(String actionName, String result){ + String jspKey = actionName + "." + result; + return actionMap.get(actionName).getViewName(result); + } + + + public Map getActionMap() { + return actionMap; + } + +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java b/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java new file mode 100644 index 0000000000..0799eae71a --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/LoginAction.java @@ -0,0 +1,39 @@ +package code02.litestruts; + +/** + * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 + * @author liuxin + * + */ +public class LoginAction{ + private String name ; + private String password; + private String message; + + public String getName() { + return name; + } + + public String getPassword() { + return password; + } + + public String execute(){ + if("test".equals(name) && "1234".equals(password)){ + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; + } + + public void setName(String name){ + this.name = name; + } + public void setPassword(String password){ + this.password = password; + } + public String getMessage(){ + return this.message; + } +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java b/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java new file mode 100644 index 0000000000..2a499f104b --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/ReflectionUtil.java @@ -0,0 +1,119 @@ +package code02.litestruts; + +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by yaoyuan on 2017/3/21. + */ +public class ReflectionUtil { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ReflectionUtil.class); + + private static final Map> clazzMap = new HashMap>(); + + //加载xml文件中的类 + public void initiateClazz(Configuration cfg){ + Map actionMap = cfg.getActionMap(); + + for (Map.Entry entry : actionMap.entrySet()) { + String actionName = entry.getKey(); //login + ActionConfig actionConfig =entry.getValue(); + String className = actionConfig.getClassName(); //code02.litestruts.LoginAction + Class cls; + try { + cls = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); + clazzMap.put(actionName,cls); + } catch (Exception e) { + logger.warn("加载类 " + className + "出错!"); + } + } + } + + + //返回实例对象 + public Object getInstance(String actionName){ + Object instance = null; + for (Map.Entry> entry : clazzMap.entrySet()) { + String action = entry.getKey(); //login + Class cls = entry.getValue(); //code02.litestruts.LoginAction.class + if(actionName.equals(action)){ + try { + instance = cls.newInstance(); + } catch (Exception e) { + logger.error("生成实例出错!", e); + throw new RuntimeException(e); + } + } + } + return instance; + } + + + //参数赋值 + public void setParameters(Object o, Map params) { + + List methods = getSetterMethods(o.getClass()); + for (String name : params.keySet()) { + String methodName = "set" + name; + for (Method m : methods) { + if (m.getName().equalsIgnoreCase(methodName)) { + try { + m.invoke(o, params.get(name)); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + } + } + + //运行无参方法 + public Object runMethodWithoutParams(Object o , String methodName){ + Class clz = o.getClass(); + Object result = null; + try { + Method method = clz.getDeclaredMethod(methodName); + try { + result = method.invoke(o); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + return result; + } + + //返回以set开头的方法 + public List getSetterMethods(Object o){ + return getMethods(o.getClass(),"set"); + } + + //返回以get开头的方法 + public List getGetterMethods(Object o){ + return getMethods(o.getClass(),"get"); + } + + private List getMethods(Class clz, String startWithName){ + List methodsList = new ArrayList(); + Method[] methods = clz.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + String methodName = methods[i].getName(); + if(methodName.startsWith(startWithName)){ + methodsList.add(methods[i]); + } + } + return methodsList; + } + +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java b/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java new file mode 100644 index 0000000000..b954f25bd5 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/Struts.java @@ -0,0 +1,76 @@ +package code02.litestruts; + +import org.slf4j.LoggerFactory; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +public class Struts { + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Struts.class); + /* + 0. 读取配置文件struts.xml + + 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) + 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") , + 那就应该调用 setName和setPassword方法 + + + + + */ + public static View runAction(String actionName, Map parameters) { + View view = new View(); + Configuration cfg = new Configuration("src/main/resources/struts.xml"); + ReflectionUtil reflectionUtil = new ReflectionUtil(); + reflectionUtil.initiateClazz(cfg); + /* 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象)*/ + Object o = reflectionUtil.getInstance(actionName); + /*2. 根据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 + ("name"="test" , "password"="1234") ,那就应该调用 setName和setPassword方法*/ + reflectionUtil.setParameters(o,parameters); + /*3. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success"*/ + String result = (String) reflectionUtil.runMethodWithoutParams(o,"execute"); + /* 4. 通过反射找到对象的所有getter方法(例如 getMessage),通过反射来调用, + 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,放到View对象的parameters*/ + Map params = new HashMap(); + List methods = reflectionUtil.getGetterMethods(o); + for(Method method : methods){ + String key = method.getName().substring(3); + String value = null; + try { + value = (String) method.invoke(o); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + params.put(key,value); + } + /*5. 根据struts.xml中的 配置,以及execute的返回值,确定哪一个jsp,放到View对象的jsp字段中。*/ + String jsp = cfg.getView(actionName,result); + view.setParameters(params); + view.setJsp(jsp); + + return view; + } + + public static void main(String[] args) throws InvocationTargetException, IllegalAccessException { + + String actionName = "login"; + HashMap params = new HashMap(); + params.put("name","test"); + params.put("password","12345"); + + View view = Struts.runAction(actionName,params); + System.out.println(view.getJsp()); + System.out.println(view.getParameters()); + + + } + +} diff --git a/group23/769232552/coding/src/main/java/code02/litestruts/View.java b/group23/769232552/coding/src/main/java/code02/litestruts/View.java new file mode 100644 index 0000000000..c7e630587c --- /dev/null +++ b/group23/769232552/coding/src/main/java/code02/litestruts/View.java @@ -0,0 +1,23 @@ +package code02.litestruts; + +import java.util.Map; + +public class View { + private String jsp; + private Map parameters; + + public String getJsp() { + return jsp; + } + public View setJsp(String jsp) { + this.jsp = jsp; + return this; + } + public Map getParameters() { + return parameters; + } + public View setParameters(Map parameters) { + this.parameters = parameters; + return this; + } +} diff --git a/group23/769232552/coding/src/main/java/code03/DownloadThread.java b/group23/769232552/coding/src/main/java/code03/DownloadThread.java new file mode 100644 index 0000000000..7bf8a8e765 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/DownloadThread.java @@ -0,0 +1,47 @@ +package code03; + +import code03.api.Connection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; + +/** + * 定义线程类 + */ + + +public class DownloadThread extends Thread{ + + private static final Logger logger = LoggerFactory.getLogger(DownloadThread.class); + + private Connection conn; + private int startPos; + private int endPos; + private static final String fileName = "D://test.png"; + + + public DownloadThread(Connection conn, int startPos, int endPos){ + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + } + + @Override + public void run(){ + logger.debug("thread {} begin to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos); + + try { + byte[] data = conn.read(startPos,endPos); + RandomAccessFile rfile = new RandomAccessFile(fileName,"rw"); + rfile.seek(startPos); + rfile.write(data,0,data.length); + rfile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + logger.debug("thread {} end to download from start {} to end {} ",Thread.currentThread().getName(),startPos,endPos); + + + } +} diff --git a/group23/769232552/coding/src/main/java/code03/FileDownloader.java b/group23/769232552/coding/src/main/java/code03/FileDownloader.java new file mode 100644 index 0000000000..6814c49f9c --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/FileDownloader.java @@ -0,0 +1,109 @@ +package code03; + +import code03.api.Connection; +import code03.api.ConnectionException; +import code03.api.ConnectionManager; +import code03.api.DownloadListener; +import code03.impl.ConnectionManagerImpl; + +import java.util.ArrayList; +import java.util.List; + +/** + * 线程启动类 + */ + +public class FileDownloader { + + private String url; + private DownloadListener listener; + private ConnectionManager cm; + private static boolean downloadFinished = false; + + private final static int THREAD_NUM = 5; + + public FileDownloader(String _url) { + this.url = _url; + } + + /* + (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。*/ + public void execute(){ + Connection conn = null; + try { + //启动线程 + int startPos = 0, endPos = 0; + List threads = new ArrayList(); + for (int i = 0; i < THREAD_NUM; i++) { + conn = cm.open(this.url); //每次都要重新获取一个connection.imputstream + int length = conn.getContentLength(); + startPos = length/THREAD_NUM * i; + endPos = length/THREAD_NUM * (i + 1)- 1; + DownloadThread downloadThread = new DownloadThread(conn,startPos,endPos); + threads.add(downloadThread); + downloadThread.start(); + } + + //调用join方法,确保所有线程的工作已经完成 + for (int i = 0; i < THREAD_NUM; i++) { + try { + threads.get(i).join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + listener.notifyFinished(); + } catch (ConnectionException e) { + e.printStackTrace(); + } finally { + if(conn != null){ + conn.close(); + } + } + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + + + public static void main(String[] args) { + + String url = "http://litten.me/assets/blogImg/litten.png"; + FileDownloader fileDownloader = new FileDownloader(url); + ConnectionManager cm = new ConnectionManagerImpl(); + fileDownloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + }); + fileDownloader.setConnectionManager(cm); + fileDownloader.execute(); + + + while (!downloadFinished){ + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("download finished ! "); + + + } + +} diff --git a/group23/769232552/coding/src/main/java/code03/api/Connection.java b/group23/769232552/coding/src/main/java/code03/api/Connection.java new file mode 100644 index 0000000000..1f2e4e1d39 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/api/Connection.java @@ -0,0 +1,23 @@ +package code03.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java b/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java new file mode 100644 index 0000000000..77e886e987 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/api/ConnectionException.java @@ -0,0 +1,9 @@ +package code03.api; + +public class ConnectionException extends Exception { + + public ConnectionException(String message,Throwable e){ + super(message,e); + } + +} diff --git a/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java b/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java new file mode 100644 index 0000000000..4cbd46445a --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package code03.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java b/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java new file mode 100644 index 0000000000..f5e7e146a7 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/api/DownloadListener.java @@ -0,0 +1,5 @@ +package code03.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java new file mode 100644 index 0000000000..ce69eceb99 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/impl/ConnectionImpl.java @@ -0,0 +1,106 @@ +package code03.impl; + +import code03.api.Connection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLConnection; + + +public class ConnectionImpl implements Connection{ + + private static final Logger logger = LoggerFactory.getLogger(ConnectionImpl.class); + + + private URLConnection urlConnection; + private int length = -1; + + public ConnectionImpl(URLConnection urlConnection){ + this.urlConnection = urlConnection; + } + + /** + * 读取urlConnection.getInputStream()中的数据,返回byte[] + */ + @Override + public byte[] read(int startPos, int endPos) throws IOException { + int contentLength = getContentLength(); + if(startPos < 0 || endPos > contentLength || contentLength <= 0){ + logger.info("index out of range !"); + return null; + } + + InputStream raw = null; + BufferedInputStream in = null; + int size = endPos - startPos + 1; + byte[] data = new byte[size]; + try{ + raw = urlConnection.getInputStream(); + in = new BufferedInputStream(raw); + in.skip(startPos); + + int offset = 0; + while(offset < size){ + int bytesRead = in.read(data, offset, size - offset); + while (bytesRead == -1){break;} + offset += bytesRead; + } + } catch (IOException e) { + e.printStackTrace(); + }finally { + raw.close(); + in.close(); + } + return data; + } + + @Override + public int getContentLength() { + if(length != -1){ + return length; + } + length = urlConnection.getContentLength(); + + //if without content-length header + if(length == -1) { + int offset = 0; + InputStream raws = null; + BufferedInputStream ins = null; + try { + raws = urlConnection.getInputStream(); + ins = new BufferedInputStream(raws); + + int max_size = 1024 * 1024;//1M + byte[] data = new byte[max_size]; + + int bytesRead = 0; + while (bytesRead != -1) { + ins.read(data, offset, max_size - offset); + offset += bytesRead; + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + raws.close(); + ins.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + length = offset; + } + return length; + } + + @Override + public void close() { + if(urlConnection != null){ + urlConnection = null; + } + } + +} diff --git a/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java b/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..5078c7608c --- /dev/null +++ b/group23/769232552/coding/src/main/java/code03/impl/ConnectionManagerImpl.java @@ -0,0 +1,36 @@ +package code03.impl; + +import code03.api.Connection; +import code03.api.ConnectionException; +import code03.api.ConnectionManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +/** + * 获取Connection实例 + */ + +public class ConnectionManagerImpl implements ConnectionManager { + private static final Logger logger = LoggerFactory.getLogger(ConnectionManagerImpl.class); + + @Override + public Connection open(String url) throws ConnectionException { + Connection connection = null; + try { + URL _url = new URL(url); + URLConnection urlConnection = _url.openConnection(); + connection = new ConnectionImpl(urlConnection); + } catch (MalformedURLException e) { + logger.error("url {} format error",url); + } catch (IOException e) { + e.printStackTrace(); + } + return connection; + } + +} diff --git a/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java b/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java new file mode 100644 index 0000000000..0ffce58b83 --- /dev/null +++ b/group23/769232552/coding/src/main/java/code04/LRUPageFrame.java @@ -0,0 +1,162 @@ +package code04; + +/** + * 用双向链表实现LRU算法 + */ +public class LRUPageFrame { + + private class Node { + + Node prev; + Node next; + int pageNum; + Node() { + } + } + + private int size; + private int capacity; + + private Node first;// 链表头 + private Node last;// 链表尾 + + public LRUPageFrame(int capacity) { + this.capacity = capacity; + this.size = 0; + } + + /** + * 获取缓存中对象 + * 1、如果缓存中不存在,则直接加入表头 + * 2、如果缓存中存在,则把该对象移动到表头 + * @param pageNum + * @return + */ + public void access(int pageNum) { + Node node = hasContains(pageNum); + if(node != null){ + moveToHead(node); + }else { + addToHead(pageNum); + } + + } + + /** + * 对象是否存在缓存中,如存在则返回该对象在链表中的位置,否则返回null + * @return + */ + private Node hasContains(int key){ + Node node = this.first; + while (node != null){ + if(node.pageNum == key){ + return node; + } + node = node.next; + } + return node; + } + + /** + * 对象加入表头,先先判断缓存是否已经满了 + * @return + */ + private void addToHead(int key){ + Node node = new Node(); + node.pageNum = key; + if(size < capacity){ + addFirst(node); + }else { + removeLast(); + addFirst(node); + } + + } + + + /** + * 对象移动到表头 + * @return + */ + private void moveToHead(Node node){ + if(node == first){ + return; + } + if(node == last){ + node.next = first; + first.prev = node; + first = node; + last = node.prev; + last.next = null; + node.prev = null; + return; + } + node.prev.next = node.next; + node.next.prev = node.prev; + node.next = first; + node.prev = null; + first.prev = node; + first = node; + } + + /** + * 删除表尾 + * @return + */ + private void removeLast(){ + if(last != null){ + Node newLast = last.prev; + last.prev = null; + last = newLast; + last.next = null; + size --; + } + } + /** + * 添加元素到表头 + * @return + */ + private void addFirst(Node node){ + //0个节点 + if(first == null){ + first = node; + last = node; + size ++; + return; + } + //一个节点 + else if(first == last){ + first = node; + first.next = last; + last.prev = first; + size ++; + return; + }else { + node.next = first; + first.prev = node; + first = node; + size ++; + } + } + /** + * 当前链表空间 + * @return + */ + public int getSize() { + return size; + } + + 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/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java b/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java new file mode 100644 index 0000000000..81e6973856 --- /dev/null +++ b/group23/769232552/coding/src/main/java/mini_jvm/loader/ClassFileLoader.java @@ -0,0 +1,108 @@ +package mini_jvm.loader; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + + + +public class ClassFileLoader { + + private List clzPaths = new ArrayList(); + + /** + * 读取class文件的二进制代码 + * @param className + * @return + */ + public byte[] readBinaryCode(String className) { + String clazzPath = getClassPath(className); + BufferedInputStream bins = null; + ByteArrayOutputStream bouts = new ByteArrayOutputStream(); + try { + bins = new BufferedInputStream(new FileInputStream(new File(clazzPath))); + byte[] buffer = new byte[1024]; + int length = -1; + while((length = bins.read(buffer)) != -1){ + bouts.write(buffer, 0, length); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + byte[] codes = bouts.toByteArray(); + //关闭流 + try { + if(bins != null){ + //调用外层流的close方法就关闭其装饰的内层流 + bins.close(); + } + if(bouts != null){ + bouts.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return codes; + } + + /** + * 从扫描根目录,获取指定类的绝对路径 + * @param className + * @return + */ + private String getClassPath(String className){ + String clazzPath = null; + //遍历clzPaths中所有路径 + for (String path : this.clzPaths){ + File file = new File(path); + clazzPath = getClassPath(className,file); + if(clazzPath!=null) break; + } + return clazzPath; + } + + private String getClassPath(String className, File file){ + String clazzPath = null; + if(file.exists()){ + //如果是目录,则遍历所有目录下的文件 + if(file.isDirectory()){ + File[] fs = file.listFiles(); + for (File f : fs){ + clazzPath = getClassPath(className,f); + } + }else { + //检查是否是该类对应的class文件 + if(isClazzFile(file.getName(),className)){ + clazzPath = file.getAbsolutePath(); + } + } + } + return clazzPath; + } + + private boolean isClazzFile(String filename , String className){ + String fileClazzName = null; + String [] names = filename.split("\\."); + if(names.length > 0){ + fileClazzName = names[0]; + } + return className.endsWith(fileClazzName); + } + + public void addClassPath(String path) { + clzPaths.add(path); + } + + public String getClassPath(){ + StringBuilder sb = new StringBuilder(); + int i = 0; + for (; i < clzPaths.size() - 1; i++) { + sb.append(clzPaths.get(i)); + sb.append(";"); + } + sb.append(clzPaths.get(i)); + return sb.toString(); + } +} diff --git a/group23/769232552/coding/src/test/java/code01/ArrayListTest.java b/group23/769232552/coding/src/test/java/code01/ArrayListTest.java new file mode 100644 index 0000000000..2bfd7f52e1 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code01/ArrayListTest.java @@ -0,0 +1,67 @@ +package code01; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by yaoyuan on 2017/3/8. + */ +public class ArrayListTest { + ArrayList arrayList; + @Before + public void setUp(){ + arrayList = new ArrayList(); + } + + @Test + public void testAdd() throws Exception { + + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + arrayList.add(str); + } + + // size() + Assert.assertEquals(array.length,arrayList.size()); + + //add(),get() + for (int i = 0; i < arrayList.size(); i++){ + Assert.assertEquals(array[i],arrayList.get(i)); + } + } + + @Test + public void testAddWithIndex() throws Exception { + ArrayList arrayList2 = new ArrayList(3);//自动扩容 + String[] array = new String[]{"a","b","c","d","e"}; + for (int i = 0; i < array.length; i++){ + arrayList2.add(i,array[i]); + } + //add(),get() + for (int i = 0; i < arrayList2.size(); i++){ + Assert.assertEquals(array[i],arrayList2.get(i)); + } + arrayList2.add(3,"new"); + Assert.assertEquals("new",arrayList2.get(3)); + + + } + + @Test + public void testRemove() throws Exception { + + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + arrayList.add(str); + } + arrayList.remove(0); + arrayList.remove(0); + + + for (int i = 0; i < arrayList.size(); i++) { + Assert.assertEquals(array[i+2],arrayList.get(i)); + } + + } +} \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java b/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java new file mode 100644 index 0000000000..8c1f4e8e09 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code01/BinaryTreeTest.java @@ -0,0 +1,27 @@ +package code01; + +import org.junit.Test; + +/** + * Created by yaoyuan on 2017/3/10. + */ +public class BinaryTreeTest { + + @Test + public void testCreateBinaryTree(){ + + BinaryTree binaryTree1 = new BinaryTree(); + BinaryTree binaryTree2 = new BinaryTree(); + Integer[] array1 = new Integer[]{3,4,1,2,5}; + Integer[] array2 = new Integer[]{3,1,4,5,2}; + binaryTree1.createBinaryTree(array1); + binaryTree2.createBinaryTree(array2); + binaryTree1.leftOrderScan(binaryTree1.getRoot()); + binaryTree2.leftOrderScan(binaryTree2.getRoot()); + } + + @Test + public void testInsert(){ + BinaryTree binaryTree3 = new BinaryTree(); + } +} \ No newline at end of file diff --git a/group23/769232552/coding/src/test/java/code01/LinkedListTest.java b/group23/769232552/coding/src/test/java/code01/LinkedListTest.java new file mode 100644 index 0000000000..5481783932 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code01/LinkedListTest.java @@ -0,0 +1,174 @@ +package code01; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Created by yaoyuan on 2017/3/8. + */ +public class LinkedListTest { + + @Test + public void testAdd() throws Exception { + + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + + // size() + Assert.assertEquals(array.length,linklist.size()); + + //add(),get() + for (int i = 0; i < linklist.size(); i++){ + Assert.assertEquals(array[i],linklist.get(i)); + } + + } + + @Test + public void testAddWithIndex() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + + //add(),get() + for (int i = 0; i < linklist.size(); i++){ + Assert.assertEquals(array[i],linklist.get(i)); + } + + String str = "new"; + linklist.add(0,str); + Assert.assertEquals(str,linklist.get(0)); + + linklist.add(3,str); + Assert.assertEquals(str,linklist.get(3)); + + linklist.add(linklist.size() ,str); + Assert.assertEquals(str,linklist.get(linklist.size()-1)); + } + + @Test + public void testRemove() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + + //remove(),get() + Assert.assertEquals(linklist.remove(0),array[0]); + Assert.assertEquals(linklist.size(),array.length - 1); + + Assert.assertEquals(linklist.remove(linklist.size() - 1),array[array.length-1]); + Assert.assertEquals(linklist.size(),array.length - 2); + + } + + @Test + public void testAddFirst() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + //addFirst(),get() + String str = "new"; + linklist.addFirst(str); + Assert.assertEquals(str,linklist.get(0)); + Assert.assertEquals(linklist.size(),array.length + 1); + } + + @Test + public void testAddLast() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + //addLast(),get() + String str = "new"; + linklist.addLast(str); + Assert.assertEquals(str,linklist.get(linklist.size()-1)); + Assert.assertEquals(linklist.size(),array.length + 1); + } + + @Test + public void testRemoveFirst() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + //removeFirst(),get() + Assert.assertEquals(linklist.removeFirst(),array[0]); + Assert.assertEquals(linklist.size(),array.length - 1); + } + + @Test + public void testRemoveLast() throws Exception { + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + //removeLast(),get() + Assert.assertEquals(linklist.removeLast(),array[array.length-1]); + Assert.assertEquals(linklist.size(),array.length - 1); + + } + + @Test + public void testReverse(){ + LinkedList linklist = new LinkedList(); + String[] array = new String[]{"a","b","c","d","e"}; + for (String str : array){ + linklist.add(str); + } + linklist.reverse(); + for(int i=0; i params = new HashMap(); + params.put("name","test"); + params.put("password","1234"); + + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); + Assert.assertEquals("login successful", view.getParameters().get("Message")); + } + + @Test + public void testLoginActionFailed() { + String actionName = "login"; + Map params = new HashMap(); + params.put("name","test"); + params.put("password","123456"); //密码和预设的不一致 + + View view = Struts.runAction(actionName,params); + + Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); + Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("Message")); + } +} diff --git a/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java b/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java new file mode 100644 index 0000000000..cdc58d24b3 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code03/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package code03; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import code03.api.ConnectionManager; +import code03.api.DownloadListener; +import code03.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "http://litten.me/assets/blogImg/litten.png"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // 等待多线程下载程序执行完毕 + while (!downloadFinished) { + try { + System.out.println("还没有下载完成,休眠五秒"); + //休眠5秒 + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("下载完成!"); + + + + } + +} diff --git a/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java b/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java new file mode 100644 index 0000000000..7448e3ee56 --- /dev/null +++ b/group23/769232552/coding/src/test/java/code04/LRUPageFrameTest.java @@ -0,0 +1,38 @@ +package code04; + +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); + //1,0,7 + Assert.assertEquals("1,0,7", frame.toString()); + frame.access(2); + //2,1,0 + Assert.assertEquals("2,1,0", frame.toString()); + frame.access(0); + //0,2,1 + Assert.assertEquals("0,2,1", frame.toString()); + frame.access(0); + //0,2,1 + Assert.assertEquals("0,2,1", frame.toString()); + frame.access(3); + //3,0,2 + Assert.assertEquals("3,0,2", frame.toString()); + frame.access(0); + //0,3,2 + Assert.assertEquals("0,3,2", frame.toString()); + frame.access(4); + //4,0,3 + Assert.assertEquals("4,0,3", frame.toString()); + } + +} diff --git a/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java b/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java new file mode 100644 index 0000000000..9602743b02 --- /dev/null +++ b/group23/769232552/coding/src/test/java/mini_jvm/ClassFileloaderTest.java @@ -0,0 +1,71 @@ +package mini_jvm; + +import mini_jvm.loader.ClassFileLoader; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ClassFileloaderTest { + + + static String path1 = "D:\\worksapce\\gitRepo\\java_coding2017\\coding2017\\group23\\769232552\\coding\\target\\classes"; + static String path2 = "D:\\worksapce\\gitRepo\\java_coding2017\\coding2017\\group23\\769232552\\coding\\target\\test-classes"; + + + ClassFileLoader loader = new ClassFileLoader(); + + @Before + public void setUp() throws Exception { + loader.addClassPath(path1); + loader.addClassPath(path2); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testClassPath(){ + String clzPath = loader.getClassPath(); + Assert.assertEquals(path1+";"+path2,clzPath); + } + + @Test + public void testClassFileLength() { + String className = "mini_jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + Assert.assertEquals(1026, byteCodes.length); + + } + + + @Test + public void testMagicNumber(){ + String className = "mini_jvm.test.EmployeeV1"; + byte[] byteCodes = loader.readBinaryCode(className); + byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; + String acctualValue = this.byteToHexString(codes); + Assert.assertEquals("cafebabe", acctualValue); + } + + + + + + + private String byteToHexString(byte[] codes ){ + StringBuffer buffer = new StringBuffer(); + for(int i=0;i=arr.length) + { + arr=Arrays.copyOf(arr, arr.length+1); + arr[pos] = o; + pos++; + return true; + } + return false; + } + public boolean add(Object o, int index) + { + if(pos=arr.length) + { + arr=Arrays.copyOf(arr, arr.length+1); + for(int i=arr.length-2;i>=index;i--) + { + arr[i+1] = arr[i]; + } + arr[index] = o; + return true; + } + return false; + } + public Object get(int i) + { + Object o = arr[i]; + return o; + } + public Object remove(int index) + { + Object var=arr[index]; + for(int i=index+1;i Date: Mon, 8 May 2017 09:29:40 +0800 Subject: [PATCH 480/552] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E4=BA=8C=E8=BF=9B=E5=88=B6=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group03/345943980/download-0335/test | Bin 69464 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 group03/345943980/download-0335/test diff --git a/group03/345943980/download-0335/test b/group03/345943980/download-0335/test deleted file mode 100644 index e52791509fe4c7a96bc8344e71c6f52781e4b214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69464 zcmeF)W0x#ln=ksc%C>FWu2r?lwr$(CZQHhO+qP}jzMt+s=k)2_yT|?j6*==&jFFKq zW?b_>u9?3K8F4@$q+ekFya+t}xPSep1L+sgFG)cKK59`ZAzDd3DN!Loc?B9tp|7!D zzwRX`#wEn5X=b6tsVSx=rt9VC78rL9_YMJm$%uo3)p-M4VgB<`=>NQB{@)9Xy8r(# zfcDQ>eQQfvQwKXods;JlYb)Bn0unU(7P|KKmCEKen9Atf%5jZx9d*c@VtFHChcbHV zahG##Rw0P2QSmIWydoDX1%FDZtS#81h{Wyo;P7UOV))k^xG?3-f|J!DB6NG`Cuf{= zNT5D)=>E7OarEB+e$h?Pabeid9d9XO4aa2~flOaqEnYcy55G=1JALkdcij;9tlvUI zqxjaT+?jZCrQ=L4z#7JdzAa^1VpsrV<(|}@w3#|d;W?%pSnBPP1^?wSj z`KkkTT;56qJ^R(}8VrF&MUd1B)rmjzoOBO~5@S0ax zO%4;FR*w3b{T5fu+(3`x><4HJ^q@WGyQ)}}4R&K8O=rTb^IQbRz=QWpm$KT#m&ss{ z9T6IKDx4o}=(z;euUg0?2|dhYI28Kry^BG7Fjl1`4WE~Gim1}8p#*SMMRjiyU1ZlmD@q#eOj_8T znHbW-yH>bLIBh+q=&~@;?gl3=)Y2( zd)%hVY98ahRk{y%m2Ya6Fi@?&!7C4^G&bYwED!4>@a|vRYr=ssj&Z7!2>3j&saT^X zclLXAwZz~$D{)1@iSa($KGPWqHp8#VhMq7z|< zi(W189a(Jf7%R7@wjSq7I2YpM3OaahGnr*JsV>7yHkZ{wqH_0oe`6y&&?31dTMc0l zchOXdD0qPD_+}{xtQT*7=SI(VWji-}WH1kzVZ6OK=7H^Qf|9{7bY;a#tHC3rnRZXM z%6(mrfB~tZIyv>K{CfcU3b{O(J$P)~{$bz-m%MGXb1sS6JrL%w=u;OgWAK)Yl%$H+ z0>!ZPcsm6id^p$mw#<24zFz}4IHTvmdbtk0%{6Fo%n|1=SXo5|wLyalYk1|Vq1S{i zLc$P;c2U+d@%J1&5uk>J+6%YD9;tXGp^11F6eTpkJ18k})p^F&J;~|kyI@@ush=Hx z_9v%~6rbAK;_^>ZY^60II{md792sCJQfrX!s#7Svh;A!xmAR`uICIGyen(l`>F%aO zoYAXj(NDLT_LO7ZaSIU_CkC5iW>>^n4OmrKb}+)H@x3Z_ld{o&2W{_Xqy{*@5&~&kL?$vJXyDcZRbMXIH!0~kmzRf=YL~~ec~(wWq3uqBlyk;DqvBp z+x+egL+>c8Fau#`44K$zN;dmsG&#vk`{uiZx=JgGpEQ&_L%6$nZ88n2EdzMYi#V>N zGRG7*IWps%uH?ENu-fo<+89S&w6Zgxg}S>#y5@?|Wb>Ee3i@=3ljaSy;t~wkQ%s=1 zrC!PH!6>fI3^3+=zT6w**KR*~)*9ND3~!v!gOTLd@Rc{YIW6QFHe9)|5u2UrUyki( zb%cKpk#<)%LBYO^6<0yd>g62Dt#7-sMG8HoQ||0U=sNNtCAdxZX2yHJUG@=}!Mg#S%wnOL~nu>JOiQ_nS-^b#QhFVvvj9u`eQO%cWIHF zF2ZW;s|WZvq)BZU+6QB)e-+x?ytB$tstjkZVkW367{={c3pXn1p;2dS%CQ3NJQ${L z$2$ly*U;L4ltpY~4#sQixd&K0a`K;o?c5$kDh&=6KC}sxCkd9_^u#8bUB6%mwR}*w z1953%v{14~86|A!IdS>9zM|&f{Z_NOM#3Halzzx+3V{HBdwqTHXYlxIt#Y;rQ1)D#-XpCt zPbsihe6c!R1H(HE^5IwV6<5+FHu#R*c(L5@37z*sJ$%L-b$M-r)m=Q-872Js&iDdI zax2Vmfb0S3t!MpJ!C})QAf8Jd>?%Z#sm(!|kZNsc|u5QBB} z2KSqH8Ko;gQsCfT4je%4fS^7lV-U5(0Ul;SS;8}2s{r~u^`DzI>$`XR`+)LFd%>So zCj6UfF6>QX&}o6p>()Liu?VH1@AqBB(gL^_=0V{rp&R+0<8fT6Y=L<*i!?r35kPi4 zP=1rJ2MY%G@P^`iB>|k0q&K&nW-}{2MgZbqpJ3#|F0xexDsc%?;m7laKgd^?dO|q| z#>5L`eLW*-zt$3oyUA{PsoLYrm{meKg=HBFYgpK8)10BRhg?oqk-@?FH{id*jnIn2 zY%6|z)CIP!EP;A)9?sm7!yIBq=*Q18WXvwY1%-{fD_K+auY6+QoYi9CvPbw zLTcNjmiR4ilo#j)g{Bf z&wt^;s7;g`9Ap`f=Z=d|AN;6yICWEkxbb#QPcz|U?3N;M0zfY*I&Q!n4xr_6D`}+8 z4{a^mN+1L7mG~&7Obq{au||Y(TPpzJj5Skb8De+J&4@*K6p(IT=uOaI9%(c^d&$GO z*DOchG!S#-cZ+dYN&9u&YlyPvDC;OiWv`c)~gpobfH|AMQt=_`` z_0QevBlGfQMD=wj;Sh<4P1{&YUA>ovW$)r~tCbd{GXl(JZG0YXa&Yw#p4{%&^lTXk zM3Fc8RVFJw5a7e5G>%E5*@Kk3xCdbx%2B)>zymfN8W{|V>BDz@Hvr`IkPZi9H7FJV zx8W=xNssO`*ri0{*SJqCK_m+|$oY#bHcdrkVs0h~w-Kvzidb3cyzQK-@zJgZ87h68 zpss8axKIv6#{+D_N}vw>TKi-pzOe~Uu|2P|65|2A4Ny2YHS1PvNBsQ}gq60IN24FC zm@ybHu&`kM)I!YKxI;&29$kVq$j+}+h7jJ1GJ4Nxz3`kzIG(M1%QR%bOGR6lcs>by z19jS+hg>cd9M5o|Dje;gNmTebwRCK7jLiquk+Uc0AcLnk->LlDM2^rcS8b^<0FuHe zXWaZ*PLWc{39o+jY|v?<_r`y1d;TG-t|G50l>)^k6*`Ld6DoEyy_*&f^VhYu$3Te! znBa%a_il^s5ad*3bTZk!U?vAI0cW#9!cAOH)tKV^l3DS%VL6q}LvWb6I4ukmGBQiq zg~cqzIgD6@P$4MJyJqf{2{h&|UVriENhs008>Si}HyftrDAr+$f$bnR z#cd{R7>qTAhF*m+Y%ja1qC(7ED$ zySDDp!t;K5h~KM=nD3bbef0`r`h7gG4*{+WN-sk1JX?7+i%wv$!HuT8*Qu1+kr`SbZ@V8bDJ*@*9eW}AdzQ!W~i|~#g_NR7B!!BsHS_0 z2-CIP`ZQ;Ej|m00rj5AQ3rR%btRWg0+?FWgjct53BHcD#Od`K)OH;4D#6beKo@zzx zksBrMeCx4QD|(SXdZU0nKMwYVSf78sGM%G`edLV+j>dIHB0~JmQlDsTy&x~y6YK(} z1BKNLhPcK?GV5;)J_ek%Lm;(>0D57MHhll_4M2K=6h^jVSfw>cm4tRrb7~T2Q_t6@ znrAx*Z~TiDO`DJfqg-py`t_9o+*Vn)!*Bam77JlY96_q@+>f)zc;>L@{7+SYif641$=xfktH_`p!0($hWeV1m`1 zM}%6mSuuoaVb>C>s@UFTTbSk1P0RxW@Nk#-ZeZ4zCzP$;^_D^DQK@2gjbL!Pb@wSp zIGD5c9FK5(3U-upJS|$Q$Y7@Q7{()t;lIzJAPR(8zK#;adRUO?#CZX6;N9pGyi=Gp`9pqcR7*cYKLe{)|$tk0B$RPP!J3Bnk$ zxCl@**Hy$V`*nRJN548>Qr1+9tgP;vwsQ4&dv!g=C_m9pwR*vnN_UyHE~j(%Da#yF zT`D-yGHhY@BY@apEsf!BXnBMx;Uig=W-?=Ubg$@*L&zrFVplchoNsKfehb0JJ#}U&{Y|r9{3uE7%43^~(?He_APV|4%EWgsHv5f2@`Ymre-E zNSml4AR{X?K&5Dnk&8%Ru|*i`AbQLS=1_3R5)o@lz7lcZbp3w0l%5Gkz#r>hz0nSj zzuy2n(=eW~MM~*T&6dWvou@XRJud27y}LZ`L49a-C~m+6D3!PkS0i{Wid*0 z&Qv8o8i`UaJNSlXD9)OltIfx3a~DrCf zKxVsCx@r^1khjG_9VslmUMCjkufNr`fy>^>^E1tAuPfM-*Fd;wmh4oV#V~LjO2kj@ zfuAUOfue`uU;5JzQCBw@5T;7Rz9p1?rB3tP-aqeU8h=DX*`O+cFty?%OPRc|npFvH^r8GG=0ie$ge%!qtI)Y6BVUN7=D7~n-wR{P^EFVU-J%v{PfUb zsCU!j*ton^5Z!VOeojQU2w&SRw|FCt3$|JVXv&R{IoyJnJ)mf$6a$^nq_`ZqUdLO) z?H(bclgVtEoB{^%_|pg4cu7#yj&zR@xTqPMhmotT24tI#j&R!|PIRQn)38xrX`hSa zvP*RR8h5wP`xNyWf6*XYe9l`UXkQvN^{V_o zejgQk^{On8uDjL1KTdY`<-_3Ev)(qC6JNb&Ehq1O9s__1TjzDbP<&>gj?&m9H&)aH zDJmu8_uP5-LSDE-+in;O!>;~?S53J272Ptvi;ly|rE#uw;XrHrilsi2Da%W&y#A1J zyc*U2H^kOSw`RW~e${hF0A0-kYs^w-vJXT7&)|T4kM=6PRSTKw%pDuo471MVcEo znrKl*2*ScfpQEeyAfHF$!pZF4tBbBrAP=BYW88GQ}dRjvcGECwq00EA*kR~ z%hE_ITkOl++2}RRn7ro`J1G=Tk;3&fe`^S3*V$Y2`I7=EErMl1-s%MQgaPk*m<;N{ zDuGv2$X@!;=b}2y2eVYfVpSL_H;!Q^z@H;k41@R%`FTw_F#xBnbK*ch>moL})V$`l zCO#uIh=&L^*;<&1vFfJ{-U5l1RtOyhA`8?cV%c~VSr*zkIr*l|X>p0x8R{9xuu|LM zr*Bs6kYDVC6o(OY7YiA6s7XX)2ct^YZxvLo3Q`gP?+-F6sB~A+)7cT3*8z`8CHq-j zJ zR=D^_m=mx8el=waRpT-KF}RsZlVl~+G6sR+fc{y9uJ2Od$&RBmh9F};?ue)@^Vn7M zm`Vj8>9{wT*WS!8R%O`jvz6x1|YyHAoc8 zLR5bl^ONSCY>Nf^Lbw|+PhKBr)Pjv_7`#v|{|0DmqSD~Uge26+UXtNEK=#I99G*8R zh+HPP8`>MUbOjg}N^aYia;~7txl`!YzSf*nxPoH#Noq=*+OeO1DVPMF>q7CsNb$Z< zJ^+rFIj3NS225*jsVhw_499TnP47rj^7}($twm@LB zp1h}U#-(5%CWRgxoej1Rh{wbgw)pk4@yDszgqm1oS<9h)HfV5xM%Zi$SA$mKG`QB7 zI&P}naro#jb}Wr5puS#$CDDn<%@aKv5R^D2-ON#6z?5-f=QAQGINGd1W zNBm&+Jq2y1yj~c`yr1v#VfN5Eim2*|X01iBww+V1g|^m5t-=pF&zR)QxP(SxYbV(1 z7wnkMgnfC3W4(p%>L-1{$=)UHn%uGfh@!nA?Hbr_3G}9m^uA3j8D8#-Ue7~k9W?VG zWZ6>}#_qk_!IHdroAJ&_1k)o@jZDvf3RkQ+r8rMaGx^&Oh;m@3pnKC+knoF?14b zGHcXU&6zOuj9g;l)3v2MBh0=kPQa_ST{?&3sVbWO9xU4r0llD_QD+U<;TaU^43Jo3 zX9q1i=y3<42H7%shp#{p6JrzJDF%5h&BLY$GLFDDNT@FtJy{U{vK&lQ(V&ukdt*Zl zq38g#zvsMJ7i~u7ZR3`}oh^MiXj5}-yLQC|r+JXK7JG(ZoiE7k>bXU(pVjs80qr?+-F|)+mgm5@V_{OEB#2V+)lU+ZnX(1?;~~d2QB^LV#bt zEP(#=l;8O;dzv`^`;-@xmzLtQv(t6`_X(e=3a*2AocNU`RA)dBvI}VAfrsZ~xym-l z2L=Y4ehWD)jyHJ7TDg3Udukl=1uH+x^=88PoePQ=S%}MTO@yP@FEGvbLN) zP3-BBKdALsPFbNa@len{ZtH`-(jR3=7D1vAXttiEYQdXo}yGnPLl1soOvNM0@fRz!Wf$};vK=%z^};8+b& zb9bf4hN0~0Qqb8BfS*I~d)Zoo`(L6@SjlX}B3UQW6*6oe{AWB1A` zjVrzE5LvP@eX%!Oq9Z)YPT%Yf5dGcQ`gu>T_d#P-=|NC`GqwO068PxMv%QsZ z4jT$I^ag=SPN{<+*d1h^gf@*~X%SZG3XHU$E9*g@KB*+%0nB+)><~U#CpGj?g-;p$ zdJ8)gQSL8~i2lpU9rJ6A7@k@gbJ*M>I}ny+wD6xy3zk_wbKow8KDU%|iu5p8b8rrI z%*T8GPy-t;(n;#~lOV)b>Sl-A`nYUvzr06sH3v(VW*Ab#TEQ`CR`O4YVh%S%&rup| zcl`mlgk^)l+c5zuA>V{yvcx34@Vwbxyi>a@u%biW-9aV4$>$JX2AJf@#&nWhAq&P? zV2laWLd$;g!-IJt;uItIPE!Q8ntsT#MwbhDMA^e)tHWZg4S~ssi(I#k6~PYI1+&&5 zTzVp;t<8s43s+YK@Ul1<)d#=R>1OV}5}4IqqSUo&54{O=WOMosX>glxKi(zB#yYo~--x&al>paKHrAN2X9IPrbj%pnVULc& zOV6>P)EPFLl?h@=uM4Btp|erC_ZXzOGT^vFo?08@8(Dxo1D|STCe>5sURXVRv^ZFa zaB;CXhOU(2=`LWnx=Ohe>V&tKrP%v77D@#;^tZBHVkH~YDcQ!__E`Z1eLMOjFuB>J z&d;|8ejVhx8*Tgj`+mrTqiTyeCTu7h<#jqW&cb=LOV}GIx*tzxK63b62oz^D6;sqV z`B>pVIG)2X5vx9hso5m}JXtT^`g`(hLbr(R@;n|vxhEp^g2WlqWeSh%N8z(bcJk}; z6P=m8E(FLIq7Q@ZsgK;VF3tg8r^Q0bL&$awq;j}Kdt{lr?rtbBj z$1xW!i~5|89W_-#JD}C9vmTPQ(e%j zZL%GUT-~{1BPyVtg@#HI(-Skit@p&m@ScMlF_qtM%FHO^JmGP*ifuA`O{#@(Vb=Pn zYq+cx^QO)Cz&sLBwK0h^7F%C#6+QX~FkeU@ZJW2OQTc{8DR{RAnmb>XO8ik25x0AJ z=?NO@HI@leoTKdYu+8O&x_A4#>FDYYqRe$sTyCxN#q#9$PetI1Z81MZ8l?x;u%uQ0 zq$3yLroPa7<=I(rG5Zy(qJQ&Bc%WLCV<(T?(n>m0)?Y8uFoIixS{ z$JAkO2Y>59OynAJ6Vg|Yp@A!^A*Y}KA32kFMf1)S&{sw0nAS#Qlnxla>It}$_t)U9 ztuLX5BQt<^8}30}5xh1|i5G?~rPx0nHB$8AwOlmFX^uz=Zd{ zAU7R69j69=&>5E5;W}GCcq%kypN>XRQT!2;Bu8;N%1S$$d{t~Lquwv}Q9tcFyS0$_V-V(D+M?={dVPQSJ!&tXG>)>` zjNW~Jr_~z8A!jTW8Nd{aawtduP2%Oh9j6{noRXPwps6S77)l;#S4zP#VZb5{ z$8gZOEZ0A{@2ISvf(woR{UHm2B;-XKYKm;;%utOhG^~=8`7B z-G(BA!0vmDR+N-!kpI87P|hk*;F_qB_Ki@PH0CaGnt+)K?N;eTSxs`s6bU>!QZ=v@LIBTVSZ<~AY|1WdBhA%8*%!3h82@QA7+{xy z@Wit%>uHZpI?a`znKoLWH9A)G@@<=Bnf6f1)UDiT>KYXR6+`gO_GiqC`4`hMrP4z2 z+4^27bA~^nXm&?7gZ1gdDCnqt_}FoHf|-@F<1P%JWS0=TH#}AnXJQ1EJMydHLg_Z? zbBu1M_M$j-uotzB{gIlJTp}weyDgZ}dPjcfkW*vaM9aj8pEgcHaEBdTJX!{6(FUzK zQcUpTBA^&OZ24sL9g1>IdQx<03-16yVx&!fl);`6Gf=rRs2$rpS**pqqiUp_Z&J)4 zO$;R*e9aB{-^9iv_OauyN4GRBL`BX0gIFBl%OR>G1ApQO3OU*y7f15y&YRoz80SbC z>fbx1?*Jd9uDgDt*8rU_I7qka4J>Ms)*9|t+ZAuz+^#{cs#+5fPQ6jo zh<28L9ZWF8u7*+dx4i^C$@eT9Tw{$1mQ8EMsv z)kpL!OoC;d#>DguAo8o8>xmt~1%cQlOzjH`9(!7kV_ugd-fCOa2;xzrWd*6fP_$Lm1Zm-{1X1@!?SyC#O+mB@~cm{!G8G&ulQ zIiMH?i+-H8sIO$1z`N)qkj;gJUT!}1Dc6DY_fQbiCliP{%SUfxaO9;o>IT6dSxi@_ z!xuAfI4XK{bAXPyW%yhfL;9D_7;=iP7B9|#V=sr;gTbJ;x5+{_(OfA8pBm72SiMn0D z*11FW<0(i+Yp+i0WL%XH({lQ`?!UtM4XpswF36u%gsw=145gzDHyDQZvLXhr9mG@H z&sJ{E_wlrSL_fZG3SWN9e#VG+37C3KMBE`3)n_yCdk2}fE=6hMM`#-x23tm=YS-cdA5kwO093`uXpIAL~x-`hA_NJXl3;(EUVv;V|ym>WtrcvyJ{ha zthI$P@w7I5F#{n}WlHi+T8u6F?vYk9mBlP&JLI64?|+8&bq{jcf!vSQiiGEZbJ&=n z9|@1t{IYN8p`oVBoVgR_*@a^hs~aU=^Jn$@54%sXk`G7MCjp{YNjke zD=%PzG+FtL;pAgA3cvw=RiBa{Ay;~Ll6;#;uhMO>yk^Lg}D*rI2ZmvV`8 z4-(dzs%Mp(lKw45@9n?+CAjo?9pMPelc~Rnoj@U0>NM9j+dbAM1|a33f1uijyeMHZ zL^}7PFZGw&Qx#h{x4&w}i1dZGh@gB@RVa3W=3ezflvMaAd7pj3YBJA=V?iPq1GJN# zpzBXtSsiVu`2HnvG5rQT*<8{2>;=O!BAEqP;o#y{j+t~SCv_G+xeR36UCohKH$L@O zELDYgCD*TLtQ;ZOJOP|Os8_JELwJ%(e-)x=qeet=Ec|4;(bB1@e(WNeM!^=5Fo8+P z-%VLcv8vU(XxA|n$@4kg0i;w}xjZpNWfMay_FgE&EjVvq^4$&C)v_M(sJ1Y-oLqRDBn zwvlL9AvADYG=YzG!w3;m^l-|<2HlD?KZ{l;*_K~>omzVQx+BZvZfj6akf(iS(Bn^)&DM6bjMjoc$lX=GqTtlTPUR@trZKe zPc-gev6RQk;0(vV6{EKMOGoQBP?CQjyl99|_uryO?6^cyq5Kn!8E)kXPzw+DG7xsn zxP?EM#tK_H@W{_cwbs$M_Q2BjD{N z8YgVS-eE=!S>8)BdBo2t-egB$Tz&z!NqSXu(jv}w zHqObcns%(xd&{6SGeeEWwFP03w8h(a!UfWx=q_85*=}YX?i<3?GpLS46cDi*rcy0u zPT-UJ)z^%KMTPOHCZdi58rbS+PzhU5DRT-`Zb`y-7U>`5G#n7Sg$TS46N(u(g;Y)E zKc>vNscYqB6U<6Si$83l$UdwKD6io#jd~HHVu;_Mo4u@3`Nd=T#e;p)sE;}7Pq=_8 z=1|Kj%d(Gg8h)x=d!!z@6L-I6oRH0Xong3A8k{-nHpQD|H(ozV51F$@##&@rX8q9& zwA*nz>_N}1i|zIut+F-(N45!oVB-gFploLYAJPomTF4D;}xZh*CzW}@W@e<$3v~Y1}dX9OwI>f;N{}* z0_*t5ZmJ@^C&aulB=Hh~cZ5+tt25E7r;nqAW2J&vAn>_Gk49~;w4$Nur6&9 zAea*g(_F?(!(S{Py*>g(V_=&kpSj$_XqukWmAGVps#R1EsTM;~wHivYCH&Ab<-$p5W7Q+yUIq(zQ--0(+7Y zc2Ki`6?YWx{}R5c?5->yHP0tc?F2ET0$E`(DtB#d-*F1 zGSe(~gVC&KGZfOrm6B`7l8i~^Ad*woY9r8W-)aHvIVY++8RK~mVxNbK^=f!=2+)KX zMkn7EPCX)cW^h|`sDH(n%TN8q9rSs_nk!5=VtB^d18Vr?y}%Z28Y9}AySo12=)`qo z_CCf#g;WTZr&`zuuzW@zcI=QXFW4Bist2bv*&O)daO{9b%e4`*BIuin^g-9i4?wec z0rz)s?|1laBg#VrG*YJF%gc05+W>Ec+TO)xM@RO&S5+&k4B8`tYj&ZDBTBgkI<6*0Pa78JQS zHdv-cIRY`_y*{le@Fjo7Fm-(+97+V~E<={zvP+r~r!T@jQ4!{J&e#i=g%PO7N zN3u!P%qEp9S38chr1*Lip3_+itlF&@U(TeHnD#MK)?1CN4nxaT#^<+#Gyf))xgG9Y8_9 zEyUeJR$k@OFE3sA07*bo127~6l$Je*y1GdA&x^T-B-STvTbjiOdqivjsn7X&G-nUrqCs~)hjaaI2cyG9TAi;4=0{l$!8ma!j zulr-PevH&IyQ7_A?p^<%VtjMk6Q`Y~ERM(dw_`v2$nF&IyQ7_A?p^<%VtjMk6Q z`Y~ERM(f9D{TQtuqxEC7evHp>S5yny_2gzvh5Df`WB$K%@4$xNRX;|CfnXuP zdS#hsY(Yp6h6W}jPtOFnEQeMFUx^7duKH6`E_#WchHXqaigu{{l-5Uf(HxrERz)yo znbax9kj~iDt?oxH#eTz1;YZ;5YFlwi55E#DF3PAc*7W$tA?~flNDb|obA#E!1zk;9 zMmJWl#A^wF9WPm!>3>cx1`6pm5Xb7->28=XL+alutT8E}k}M&iywfAk6a5}j`Hox5 zy`w0iL5+evYk@vscYWwO`$ItW_vmHPMd_;hpGfs8z~ilop0Q zvZpCv8J-_1N;6=HCDLHa^CK1KOeBYNph^(Wv@buSMLbPDFA>DH7P&xvDeF|32%no1 z%cWhk1;$vZSa?%eM<7hZA%-gta7~Rm^iwpBhu6FwOw1r$yf4Ej2O2JS&)aj>eTSztS4@a4@2u(Dwur;*Jtqt;(RpC0n&_iBsi3;!=o-<^I##%dP zA4pbm>m`ZC2BQaE4tLs0GcQSY6aCbyoj>j^+AZWuXoR}eC-l(r2q>@clyc%BdD<2! z!N6xLK7mX>8kD?vGhr-t;$GIFwL049=#xktg$7t+8n-Z$P9IyM=CD#^*Qj3zU$+Dt zq{WO#aw=RdcJRQ+))f;wol8-nLF#+`2GnU{AlQ?_&PJa95Mo-}THDeqP%Ui-gWKcg zxEl1#P@*>SuxwK`yy52sgFRt`E`FDdP}FjOb5N>W6cJ7*?$P?^sX_ZQgNx%V0OZ@- z`-3oDCEG4h=(cnunFWe9)li~&ub~E%_SJgE6^vlUQCXID1jmA>di@_gdU+qEM-}pk zIkP(t1!&$Vc4~u@k#@drBtkQmGGwWg)Mi;O;=HyNf75K$j2l)v?Ik#7s}JFzGAsI2 zl)zPrLigPrE(X2&BI21>;=%S*iY@@k)FBRq0>rGRx>cU4>ovglV(nqu2^f zdr;1MmBA5%n!}jQCkk*qZ$$Gt3-;k)>`5w^=Ubg*W$J7OylhFdW^c#%X=JMthkc0+S10CSfrh?X7lwaJ9gd%j z(&s6Id&ks+4q6{VDau3q-j83p$D@l=l#mwvi#ZwX;ozTAaPih0^}VAi1hmc!mLG-k zySW>GHY+0SULRs$sen_m;7(vuq@*3!MvP-TleINngu`ZPN zISL@}Fuxczs{GN|eq%iOzCgsgSrKFPlRSm9Y-{jXr@|GiAzjx7>cb^pjl6rY) zC)rsK{VI1e;v!)Cpt`LS?NH^#;6kGB4Nn4yC%Oh)3!DEb`ou=?DlOPGj>456FH*@^ z&Rbwkwfcd^Qs{e1lSx~BPpWbopz&BZRZ2CFKQZM?XDwyA-kBn&jqKG}PZ*SvlTO{9 zQQyl*?!_Khw`P2=BV}9N;y(}UY8_TMpB)MS&~qTt-!+M7aY zX*P^@GTf|NTnnwu{gYlY;c|ngoWY5l1$aFIgB6x0td7lp7%H$d|C;HZHiEVK!B!Cwq9}n}4E>vuSwbLA%z zCAW?f`)8*J-NQs9rT24f=2NIt^c!80eghhSlA}H@*g&qDWE~!w9)hD5 ztVE5xqr52PN0p&z%GXabs$L8#K}w97AR&vrP0ZT3;ZjAeOO3#HTWFl2MwbZTT~ZtD ztbIL4I7t_1lBhiN?cLf3%Zg#xSwHQX1YW$T?%N$#EK32AI9OARVgCc7jX#21vw=6@ zWxdo2;nWRK&2x<{k!dal>cP@-SlM}!E&f(RnGTpd;?8?kZII7%pIj>30iY(JI0p{b zImR`KPdo5uyZEPu7X{0=Xq}s2biYI%$EOB5=AZN-oqpD3FU1Zgxk{irzRKj-+siTw|BwZBSv4tC8ysY|{ z8?j%4nlP))(K~Xndzu@LZ57V@)7QdX)ZNjqO{{k`FEzcsz!b|o8dU?qId4l6c(u5L zh6@XB%}_aVYmt@nAhmbMwnCqV{v>Ws1S`o-_PUGrSo%My~nDcJo8{G8U8PAOJi}_D{5tOs2BzDM&m2H` zskRH|-{3CQHCjIGJl9b_8)oC&2wrK8 zleUT%dVkb%F2l9J39PhlfSIt|l^_5+kdw?~Wr!<=$S~6sxTcIAHv1jv!%+8m&>%s! zBGKk^ROGoa&FWPY5{t~p(JU+9&|ZOfq+!_dCZAbOyc1OpSkbJypY)&Pp4-GgVdauV z#f3JTKugb<-|{f;A0zc|w-(?Y=iW1!w02ENG#?n*eQ z6Q7k#hYJlM_ZwjZTgYo=Y|;h>p?QsxZ|~_8N7xWG2`Ez@4aboSdn%I50;n&xcP2yt ziOI#8j)6n~i9srP6N|2i%|y)C*tm)F806h)9P@v1_D;c~M9r4&vTfV8ZQHhOuf1&B zw)e7a+qP}p{om6a9nrT>Kir6_dauZ;IWuRD9N)|GKC;0*%fQv1_Fl=XBh%J!eH*s& znI6i#Z~DaIFz6G2*__(c38gU{Z?x7%=%q&o(>Y?(!%{+V&YDcz!_ouB;J#z7l-oYx z#Zb{yZ&vPro)^}qCl#l}wnqwi68qWYm$n_f_@U-kFw<9*J-**;$s5NtIXZ5>&qayk z6VAVUF?3KcQ_xpMQojW218aFf8Vbp}x>%uNrZ>}~K+5buKjjgXgT)755)=}gJ=qqD zOD^{`m0F^0E!77UlD#L4C6+M{pkM+_h?=lRa_5o5nm5l!cYV z+gHxlw~1GH_EvzF`<=l4Ij11w(WpTZCo)BXoS=TgUk4UMyRU}4x1JCjVb_7#wnJyn zBNN)tfm-tJH|U`C8yHL{?|yp2!66|?PZSI)UinBrCmy7IcfJQu;TrU|E&PW$<#xK0 zg9dcQ>gS&tqcFnTj{p*p?(OsGi2^slY_cu#%Hx+uw^MLf5G_wzye^*b_Rr6Mt7S)| zBSW~bJl-_jR3*1)b)tvl0tR2xZ&?p>Q-6J*0em2d%WzMbn@a8o+cHq-f;y#W+vy_( zQbLG3OiVA+qStT?tr1&6E)R^W_XO<(&V!6<=PHGsqCp>-wnP+vgG5U*Y&?BZ-61Fy zR#!p4*sBv5XRZ(ymLxxfp4AbcD(u7YGxyr%Hvd=_dOI{#x-yBP)Zau{D6~EHD3Z+V5m#$mk_X3PA`XA)#rS zkr^T?3>H>n!8ii;gD8ZV{7GN{&VY;xZ?nEsqpg8$fl|$)qbt7#5dpj=cd>77wp!k( ztAVz%uDVvYPWbXa?O{)nWQzESn%d%a=X|}I^o93#dKecLVG-@z5yeWX<7_cBBAH*o z%k%K$LCa~g825xdt?A*}%63SYIqK$V;$&%HMbYJ+$1-)Yfv`29DpzN|j*z$<8ZL-o zPJarGy12}Uy!f>1&-ONRwkE-noEmw#M@}`o@6wQ76ZMoK1`{!m5%#vO3X`E?7?%!_ znaN;_o`%MvXG>d`I<#wjReq)RfR!p0zF(03%rklR2MWGanh zn{c*)IY2xcSTnsJ6Cpu^_n@aR>q5iuyr zDwCqQ-onzthXdOhAc>bLR@QF8wRjh>n&HBg)1QnCYcD%x4I5S{1$o*IX`aVaRtdgc z38JQAYY|6YsTQ^>R;a2?6yd6R*bbLxJiL)!YI1yQ5SY1N z$~m_OI0GxLeWmPPu6&xolEuSx>9X{^{8lI>h> zh-T}fwwV#F50)&4+-3o^K8p@O8r^0aLSjF)QenAm!%?+>HNpY=<8p9wt0}mG#F>wy zmTHAeLpW8tpekq_Ryy-O1Dq2;%|6Z0_^1%IJ6j&=yYSxkYbMx~t^=fF(HbRl#a(wX z*tESVQi!aE4Ce+;9NBjBANhqSgfh0g86z`6+EDAVkhQzdXrR~?MAuckFHAvbh`(ud zhszrWU}X^uy%}itr*YuaSqG$%;wI!E9W+phPSi3<(w4~hb)%ltD1lVYzHEABuWLm? zXR0ENW;y@wQ4N`G5w(K{30zWSOYnx)jD3_XOe<+i1klqabAhB>_d+qQQzbHZHuetL z)`sQ6vJ31GNLruE$J>uq>NKv&Gu>*0dAAT*|w~{@q~OtDIb~@q%g0~H>ip1G=fH_Y)4oR9Dkf` z)L?{b0~&%Fqn}V|k_~j7C1@gYjc4<_vX|JD|k6?E&`CT~;Pjr%-%Mkp-E zKr#54Aer(^bhF5c$bhZm@EI4p>w>$^lP!i{>hz0NQjhd5GIDs{Zchg*ko3ans;os~ z5I);Eq9YsKAG<%j?u&e6PK$>CafI-!^RKcWfTV(sJcw4(LurHa&k2$fA#CFh-(aSHl);%2I&Qd3=k@VtHn8HWWGmxy%w)XM{6h+l9SWP-!68pP z@Vw%qIxZ}x;i>WUL?C5gQvM?Rp`CF<^cxgj=#gQjyF5{Ad6`elADk}8$vJVj*aK^S zT{gucoP@oi7);Y-pQMxgNO2})hc1k@Y0~Mu2ve+05LjAy7ob=ZWP1_Gx+p@G(_)-7 z9}*?$7peEY%pB29YtE5h8Zpeg9v`17F;1+3!woa4-?}C3=kWWw5ik&K4J&`5iwn_V zFXBZ98u>Gx%)O8uh~}rmL1fHL`kjVPpC~%dY?F2rZ-|ic7FWz>ELx@VVi&;&B6`Vx&Y3(vMI=mm-C|BsN zr)}vU7WU>mA-y!Rg+zzH9CmcPupYFf!`p%O@TKWk89wfQp|^<%srMJDV=?io)>Trj zy#RH!qcJN<0qeR)6|nmFZ%YvirsXOEqfM;u{=1T)#bl?EaFd zBPGjr*lX+-l5ab)O0q7-aFAjo2nl8`B_mb#QALwMq~<_9yw~u~LV?azaCZI#L*+8{ z>liPazlLCmaL`FimyjkYh(-{daI6(I>Q_k0tj2&f8H8%oOiTh`Hf~J$a+;c!D0lW= zI7hXUq?J}v6+KX$*8p0##1e`L6I-Z?_l-h2T5!?QVe<21`yE5|iH+DWK|G5Zx-7IV z22gc0;5z^?yOh+mE!Q2=6m3OGGPM!ygyt4lpvUt7XM7U8SvkscP8jGR)9 z#I-iMo=?S^v|i7oj$aj&w9tW5e>f(qGe4>w8Q^@DM(aykdR2C?4z7Qv>*+{?)qVxQ+ZkWY^uZ-QoosIEuPu#-o<_eX#P!Xv z|FA*RE~D0MUzyeyF-i@vP{CC*HeJ5s118WUKijf`0zG;F1Pl@j4ca37ce*~&OK0E152zqLuw5}bQcpr*@6WAdlyv0lEo!R{}q}5O# zwi-nWOPq#xK@?sf?y6fL*e3`U^Q}HGGgk zd%#*qg3M-FlVR^zWw* zFB`Y+V~T$Q!_kl#2k818car{zdZT@L(n0jQYm)uGc0a_`gafGO%WSe~=bg5VV$0Y3 z5&vD@UtwL4#-T)Z*&i%-0h=fqqiW3zPP>QAFT1>s-e1oz9lcasvF$wuDa{A3pE0Ou;64o&4jBC3yuP=zJ`EBEGx*w~iyte6W0N0| zhw2nNKEQJd?jZ8=goq?E_eoxQr7PHmX~WhL3H{SndlAK06q!`j7$<8u2(%bLat5np zX=g#yk5x)|61&t)xs@3QYfpeSr{-$<_~&woz`RC^CO{O( zKf&7AM7B#cuqkda+Sp{aS=z#ZH|Z>vNFYTiSy~}F!1*?O~@;J*vZJFb8L?;CU%(pBfeSQ-2Sh^ zv|{5mw!(fR&XCO)uN!aAnqNFB6yCgAXep_Ms4u$dilzoCw%@lt`LbqdhuNBJT+o3dj9CNDE}pZ zwZ1Cc=g>xlv)19h*=~oaS4X7En58}*S{bXa#`W)cwE&Wo{x{911y<&vF(TN2_)Jq zndzzFH%s-K>smT2_|A-zhx--{gOWo!i8t8M{zfCAq#M*c%54pgTGYA5{mDm_@-Fv~ z>TQjB^=O*ZyRpIO*M6m7E~C0dpkSWEK4^Dbt&D2N{Ssd*cX_4vsF8mr1ek2LPpT4m zD=s*LoGiXOs)3GT&fmuesUSZu!zE%qZ^#uEyI{m6CVeK}l;|fj{iGZ@H)}!s9ax*c zJBQ~L(IZU1=zi}01ko)OH-AYHwmXI}9MD7oH>cDAG4*7)%A^H{mLr^XW>lU{3dPW_ zeN=G75OW5i`WJb(NO!3?1KBw{6|Sbq)rq_XGA)cU2L`8zN1L8o5`L}Yd~9y|_0P;F z!6!Xbd%?;Mi_>88bG^_J%6x*)#np%FcX>N{dZGIkl0(VyeU%)uFT(3xH(lgtsTiC=2AE$ z_Kn43U6-0>5CwaKjqPs%`1M6X&B8drmtMofyg!A%eE{+TvV0+w*~OYmvgpL05r4&O zEn1CkupGKXD$)wcrgN=rUnFj!pF|nz64eHy?fNyBA+%cuJkKIMQ;OXWAtv+H_8av` zIHyJD<;x$C-$)EMuUlYdTTIib(T?FcI?iJG=s+QRXNboJQ!tGtWe-!N-6`XNp1iQn zK-W&s0JU;K&nf`8PzA~;^Ho7cueSuyqjqtOkt??W$0eBUuJV>OR) zkNV?c<(vxM#cFQS?OdG7q@_q84 zi*%dq-uPkgRD#<1(h9(QZ%BB3>GiLixf5MX_`l`BSD};ha5knNmx_DB9*Q5K0~pp% zS87~4&y$0me28BR_g2$)1NB4Y1XSd>%6{Q}3 z&L#nKB)zJFCThlmT)O7dfLnUfw4BG%9$~t71yeGhW9L3K9#@w#xBr@{j$o--s~Jx3 zDqFKvH73)-G^D;eDLKos;o*~>>x<_75$x<|wT1wqkfjaNmc7Qv^Hho}aZwVic_hfO zc;f6lJKDd5rDOE@DCj0n<0q>Na6soDx5=6#M)^}LPab5RINnH+H(N-QD~xJE?MbIL zTSh>izvw|YebQ)2mlt$Z9-I0|1a;qzBFNPdfo%bvC(i!x?gFkafa^oZJ0^VwKwn}$ zk9Ta{y^%3r9UD4#`GkFb7QnYC{>^v)>b5s?O2+vbIw)1JNN z0lkrZT(r{?(u=fGJxs6SA}1nO{<*Y3z0?cviAu%3xc7{68S{kRN+}0uO0_a~-$TNm z;+oqU1sVAWXg{PYW5NSExI2aHfsHGuF5j~YH?Sv>?f|z5>(Xl>#|&>A={1-V?B1V( zWF|sUf zr73u1A-E|tHc=;T-{;+J> zPul|z$fRXV0A23VaMCA9@fSe!O+QR;UYZy`JYARK7vGjgzJB3}kiJPhPg`Eud;c*b z?DA;55m?~t+&vr>3i$GH8F-QpSRyD3bN`t@b0$qWpU|i&nDF2iptmI}n2AE_$Lq6V z5=q-`h{a$0pM8Loha`oRAQrT5D~)j#zs#9~L4_1^riH>|OQlrmNhC>{)AjfWumkkR zj5AG3MOw^l3CZd|8^!5Y_0I8RlG0xC91FeKqQU^rF+W#=6K2O-)Lso`EV4F{b8`O( za!f<`5{|=I_^$C{Y*H4KCyfXS00+-Txz?h|bh-W4R?$LaMFkCa z(Ttw3(0!qz4ujVZ^v>fnoj!ySybuqC{!S`fnt6Ok z&!q-prUh!qBAO*8*e9$cYeN>|l{tQscyg0aimXsj(!t>+{n?df`g~_1%}&MJH`(LX z=?Vm6ujU*pI#;Q{WWlpV_*hQDTrLh#G=?6OJWPS0k=YlQQ&4D%JDzCAPxb%XpaV|x zuMpik#F2am-By8ewzg5JRESS>l%ODpwu1>0^f&dX;+ z>Y*A!zTT_)Ncb_{TtZtb<{#wdrl9u-b|-t!lsi{k^y?uUXXoEw0MOMR%a>-rfP9qn z{B5|~C zGE52V;2PDuJ0`e8>uJUh&}Jm+!b%9~+vK7Y5AAjFmN%e9qG{sn^PpqM6-Tx3=HMfW z*$!uM8)V{$tvA>wLAUlnH_~bO1PNea4T*cBXJ7O2*#-E@$r81v>EyuI&;y{MFDA03 zj9H`$oS~WSbF;$Qtgy7P{@4&rFh%ctqs{|XZ*e#daQMFX(^g0|pBZ2c?Vt;+vkJ7z z`b%1?4~+H8@3fPX_=pStn&8Y`zX4O-A~2KnOU-%daPj)!+oH@Lx~-HhCr;O9Zie}n zZ71wzXV_F;IVnXFRh?M0VT(MY^^=S=N2x|>irDG*HEHUEvE}6g52SN?S zIwpgl<)O!s6#|IQ`Lav+^)iW#nm@*9yeM_x?7ht#9u{sPL=8YonxLepl7g5bvKdFW zbc)T=!#g*IKO`m(GuXB_edYREJYMuPV z!r3JcLie`HDlr64s*kU4gmdaJ_)Z$z*{XryLX;O^b5_f+LY9!{Gf9PFV<-40@|5c3 z(_vD)1JmCsR;g6g;|n>>6kEYy)ZfbLup32~j7;P;jGQea3{VPX?JyQ*SeY52Zv3J)7Ut!fkU}MZOK^9u z*ID^JO+QRU!4wj^>3F5di89Uo9yAQPTXB8rOavYa2$cyjS_p2NXgupP4;Lx>E=qoV zOz4uH$}JCoBu)U5WYW9OFJ3yAj!{Eu9Y)ubBfz7E(K4S zz!$B;atk16zi58rkLczn4mnatQL^(JDp>4j7C58{q-{%R;c%3*XBtyp{aG&h#l}|> z@*JfcwYDQ|U6Yh`irX(~UcYs;lFZjKuO7g0B>6VPjd4sd6?84jYnzbxNBRE(+V)}b znpX1rl^1*wmY6-Mx( zap_ouN!O{CgLJ-~o;%SLS-C7J^%#qV@_8+udjGpT*?y(y(B3>vY;8V?d5_~l@1P}r zri*;vR9`WF&ODP@(aOuNIZTg_o#v|!Onc(Xnt%m3+;tk{%qD`cL!EX+MkOz~dBX z5HEH$<*7y`QS*Yx%3S{?4_(|gvXzj<%0<8BojFA;D%%&5RERRXcM5c`i!!L#glThL ztmj^^sAoy#8hJ7$A1GK=@+J9vzH^iKkaUfUdJrh+Fsuw$vwQLC5t9UpQ#-uhWCgS;{o#vtb77S-DQN&N_{p$+^IwP&UQhO+Vr;b~WvmCJW(Ex^;$?%`pJdMX!-?0P>u zqfGjUDOFu0>|L{9Aw?_H`f-wAlnD6}yZ9l;%p=deyJc3}mnuKgx`g(m)ULKJ)_kNq znfikJs_shauhx}?ZuK6!u3 zd1?1X?JT>`OMX+^T<9Mwer)@+?DWHWanrB%_NQIEQo(YKDuLLNJcXXA;1$Fa9xEgX z=~?v>D-M>e*HtAu1+i)AQbq4`ZeU!aFnOR%yfv&@^9E;$hqOzaicK713=x>6og|+! zqgMjT!J?cTA5G*PbZM1+Bh;F+a&4a@mB{PX#4LWG)qb>s*Hsn_of-Yt@Nko1pqdMYb;466WH4wd&$6}#jwcKmRjbLTMq_RK8k6^Qw$J6HN`7mE&F_8w}|^8!(G@7oaq(jUyNI%{^)!v{o!-@2KEx4odVlY zJ+3<{h}-!1Vy0RwwJs}BMzy!o)5CiprNi+A{I}&8jsH+RA+szD_t+_|OD8>ZVEoAb zNUHGXeFxXbq4!1Qp8AJUb6F(+La388FS-YfR;q6bDyzCInN`+5z@%wbO(bsESfhHG zyR9)UX)Qm3#dJt5@{1<(K*G5xlN!xg0JHLF^#*j!&RGT+D&*`Jdo`V6=fZS1=PD)S z>|Lbf?muwtYi?xw6}xQAQkM~ac~n=S3*Y=%=AAb3q_&fo!w2AXUbbDroLC<3=-$2s z`vh?{rZ~nbNj85gAHt9ujA6oxdr>JOBCg3vWm~dTsj0P)Dwon-u~3mZ#=ITPC_a5C zGbwB`q+iLAer|z;YuF9dCVrK8Mrw>~e%IX)!sxf5xLN-Irf}^NbQ}V7?O#GjuGX&o zyWbMDqm=;}iC?bfj`!K@Y(iw9FNh20K0 zW2h~A8-il7)aT>oeiqh5>M+z7@nfvdbPu&Y`r2ZDLRvQ4B6LTlG3}3v_4W3;k`3mq zRYE3hS=4#y9p*kM=xcJ3Kc1?;(MCq4*kR|MdKP5KV@g_^$)+Z<5|ffsJNEB{-Q=5| zpdN~MRusG>$~Rr^zGGw#rGSWzq5~EUw}P-nKvTgxEB3Iv>gSshgEhZJ^#rz!8@BK;lP)a4czx2 zSf6>&7lkVA<}#I0gE|Z*LxgwR^|gV+b=tF_zGo3`#bRxFL6f56VAmkZGp_M#xr8~FqP)*U|RG=nCig_295?bzMnPNWo6Yz?a z4mVjw-r#bKeA29dU)lkVs0134#DS|Npvl*!g_G?JLB)%Fy!Z3 zV}zgD9Mj=2Gwfq4WLJaHVBZ?SEW1l>v2=t(c@=HJ#K=PzUq7cUH3FFlX;&=N2yCVO*VX0!< z3sCq6EBuHwMzdS?+@l@5afk1Z5@x?rm~_cs#`G#>-2;L=x_=bj6K)%S1>v#$NXldU zP9RJO{yTXn;e8R@tQSwra1=i((OGOz8W8cTUDejoiu5rELc1o9#x?rEXji5Z+Sx?7 zvy-=Kkc%9vQ4}z;n(~TjQ-gndO16&yCn+7dVh^Q(O@4z`31#`V_yKAuXIu z2J3#ZNMR1R%+bxVtSRA~Evj-#Q))Ux=n~NwyuvL_x&Jh8cC~&^Q-qy;?2^d#8;N-d#hVvVFwnQl}Yeu?Ua>rD19 z_`%y>x^m29}%X6HFuqh6pQ* zA50Wp&Poid?%-#s=v1j~CPzgK%r6v#Cqau%3``8n3=F{lL~Cej0NjAF7C?dw4E|5# z1`dITka6t)PtsWU@BZ&aZ-oD6(c^!;i>cH9pu;8V(hn+NjQ)z7=UiYg!#v8h=vo{s zh=dP?B(RFg|PpwF~kE}YLriw^N_yFKb@s!ngL|805c6~qG{#wp#em+wFajm{M zGfsaAj3qT$yVR<&+tdD(`<_cExSRDTCmvS#0_K1VIU*GHQhpP%W3)Jy3L7zMuoti(BZrQPMl+PS9jwZa6SncF+peLT?O7+Xn>wzIZ3&Gn(wyH_E z{aHnc26ZYDLS=Py<+vkK~nF4XiDJUN0KL7w^y$0}XShp;h5;2xu-GGh!>jFiEY zak-K}r%=IH7|Yoqke0khEYa=&ac7w$>URNI-yMRASOe;IDSFuCLbI&L@zi+#f1^pl z=YQk>Pr_*Te}%&l{GX$#VsC9~_dkOfqweXVvW)q=ZIYM)lf)ni5HNlgj+96kRXBze zE(8Kgk{>(_Kt-Q{j*&hE^GHTha-b(V4B81Q+E?NzxmnJT-%#jU(X3VD-~8Qp+LW7{ zyOE36sk!m=y8UW~lxUHa^t$8wy8XF*`}y5tyYo9+RR^3Nq~DfM#?Z|?uZu5R=2iW1 ztwyBRTWI@S*&Kmuwk6ZPuXJb6?uPlyNZixx=Q`@v$Xug<5Ft)EI*ef>6Lg8T)nqs$Mc2{Mkls;#iK|9Ed-R`N#f+x#Pm8>4KquZ_5znmPNu6IPPh^5V8(=?WGuqjEtt>AdC8 z3U)<#7k5(aQ%iY?!u-Q=A5zvqOVfON(Xs?rCmA<{MgHbOg@q3_qXTg@17%ekZ;omw z7HgqfN*a|Kg1qz-CUMY*%N+se?O)y;GbUWwAzF62!&JwmN!ojZS|L^K4H+^@5)ve# z^X-WEVN7b2W}$l#E)!G1mxT-~lt`izHfQ-VvsKk)71>*b92_@trBaIav9Mu+_1d;} z@|ph+PBEO!%pXST{)Gi=COrU1klwAp=VZZ8h7eQdej^ ztS+=qRWvTsRn9GnV9g{4w1+-6^{Vzxhh8C%VnyvuxF!)>o%)IBp-J!86tZwE(3I-o@pmga5*D+-=ypu{5Ae`CEH}m?(Y$Ec*!)aNg zoMXUVgux4T1<99Ns#%$tSyfrQ5==asUR*TYOiKx85#rVHlvZsCT;$;E16^woO&$X9 zjff=@EfiOCjy3VE5#wb183qDJqf>3zo#$B_?M9{j#@$RaMogYOp;%jOtXT{*f|_u5 zM*LE|Z9!W#QDxIA?kslU*c!2BpN?q`?yW)wJ};u-q2G9r;pOPy4!zi~l*w>)wxvfk ziHmrBf==lyN~z*iRlEoQD57lrZlWCM9 z0HA5jko_;4d_LmYqr<4%Bq_Bz@BW-dL05iLVWW=0Ul&{r9nwaXnhOE!Mk9sWih*XF z$<^#eyeAg3O_$N3XOj3Y1&U(wpLecX2P3a2r7?#=FL?C1{f!6cvy?gt&#IUjNJG%U z#@VFON|eTR=(C5K@P7GwRhk}$w9i@QHXEz;Z$ymtePQVLNcT+cFBpv0DmQM)bvtMM zkfrY{<)#txw@AXG-O=!64w?Ek{+d}11aJCpTuz?V&BU2HS!2Df78VkP=dAdC!K%S2VglN7*{BKgsII%G%3%W5rE(#|Jcu%wBXAbp6>sgQd+ z5W-KIPaX*6su;yS6iZ!_R|Wh1ReL-?l~QxsA%D0I-vLw!mG8&T%@OpZ-)j71Fhp3~ zFwYa(BMIF9N@^3ZL+=?&d2b7UeWb)~%kDf?xykNIt;x0)0ouKQ_A-e8I0 z=;mX?A5KDH-cInFm8&fKv&&IZrfw%^3m}C84gNc)N^~M)Nv%+n!!{L zCJ5FIHpYmc9KyCBEUXbRWHpOl)NIqc+-o%D;+p#VZiuWZQhdT~wk@b@vb=TvBOP00 z(&68)eCL33o_C{PNS=Bb;mKrp7D30`K)8^%${!g&&GR6Zd|(FB5K`$fcP6I;<{ZrB zEE%_|SO)N3;&&e&vgFG`1|}Y8Xvq;2DjG0IF?M@;C#C*NafsYSZn-4akv?2=jtG*> zHG+QkM0&^dgf5gb3_=)mJ(C{9U*zI=0xKj&KhuhP2a@`d=rcWtwjY4}-37|r=B0?g z7#^?c47HjIi9;B$)tLMNM-Pv45WPbJOFd9NEHxS(Vgg?cQf;a7$d-KQ2IN7mzCEb= ziZldlas|k;M^HNu^z=7u{Eb*6NO)t3A*HM%w!%XU_$`xa$M$QMiFIQ19qBh@tCQ7pT~OBTx$?2Qlf>Yi=rRp(mpD+W9Nu$qrR+>gSbOHFKb zH)r|_5>9~&(7{^Bc5rd}xiS3dLwo6;U1(1?V)ykTYlsqs+XV-;!NVW+($0IG`Unhs%hcDs^)mx6jccBEC$5%l zS8mhWcWgYT)j9o_=}FPCmiSG1Svlt5b+TO@EO!J)iFSWb>bN~iJTtnyNDQpLb75|_ z=GaY^KBBJXL$!KW@tRjYd|%2dR`hM+(3V2CF?|Ma`D47{*OgP6QC|o!=)4ucRrWA= znlX8J;=dE~fIFh#K)(`HujQNGW~a{c4yC?e)emo%e)7%+(XSF_7BGKfkTC`b9&azH z;BU))y2_yL5~zmACxUj%iN4fQ_Ta6E_>@cDsxqVLmr!6TDs-OL9b)&jMqxRhGouukM24Hx6ZXIN-k)Ep7V1KN2U3aNsUK0$VCPB2XiB#1W1m5~ zXzV7;gAO5UgeZYOC?Y->m!GoA>cnSQ*t1>{~+n*#3Pp6T-|hMww2X z&6M57GVeo-CHFXGxw4V){IL&ETFM1A6>}>p94kv)D<-=8gW0SpGIt8FO=gTWmPhmI zMx`B4%T|z$=Ex_NrWOiOVj4^7jpYfF9eT=|X(frY%M2+g4yF|@jbmIUY9{11T+Joo z=Wa!V?m@Uc9)Vyu`Y3bvtzxGD++Qag`{c7!5_zU!**vfJnfPW6o>l@=_(ROsHYlIj zX{W~}{sd75_)=EDfl)abUj>JEDZY8kVffe|-w;n)))Ot}cY}J87xdEM%h@C20XT`1 z8728E`2saX@LPYx&@xJ_kku-)>b16`v6tX%6d8YBF2q!Z->Er6wN;Q>t5D!5pu<$K zx~*0riu1-yyYkn3)UxZIhIcY~Z<=`TkCv+HgKMKAn5wgf*mgUXfR4Rg6f^1M}u=gYGKhB@=J zqw%dtCf3Q;_}Js9uM`2l_h@xz|Jp{y$mP5lMgT`4;b$L^pnMy(-nzXfj)Y2gXh>eO zy?RNZW(69RH!(KKAKJ1pvAptjdK;$E${DynDj5{SMpNkaXI}`SS#&1d8aP`=*}Hta zN_Gf)>4PBu!0_eo%`1J1u?!~RR6yaMtK$En|ED(WZ0~agfB^vb{D%+!?`y;VW*|!4 z$`t^S!67C!3D||XEPFO)e zh#p5gi4z$Anj;xAKbloiAn35r&1AM8XaYK_u!>7ZF`M}fq>m$*vRIZxPZcM~PuiO^D)3~{%@w0tpeMEoXo%67o0)?m z!O@_;-5c@c@HYCJPap0NqASZtWsc9)M-jdtxQPZzK%5no$dIKrE@)ao6v4NS8(gDV zJTmcNj^M5p?H>ZgToTtB)8ClbsdhlLoR-se$=h9}M#4)BgM)HWp~`1ZYonX^lyir7 zf^Mh+4p%ENnoSQwowO%r$Yy+Ffn}ViCjFZjL4eT|1nZhmx0{P=DIUeVVU3=|;xRkQ zK3c+j?{bthke06j2+Mdz#LW{)gm5kait@LXk0DA;7ds!5^t@B%awEbUa$I?6a3M@% zR64PdS-&>7t&Fz6#KfvR7C@-JTxnk9G0D1sKUjpB>&Ou-(aPj2I3$sqmylDUnqww8 zCq#QMX35qYwdeLadaVTVk40oSu}U_HqTnk$lmar#s$ zm1g!jcdAkgD$vD72f7kO(oaju5h2eMfL{9fT98L(&N^_#N(t}yU9nN2xFtPfR@<|d zS8jf}xzKdjOqN-^xySQTxFcv2>2gNeX{?Z2u~RBH`I=0hDd-JJei}0)@T!~n;mDyT z39F~07Av#{=^Sxn(L?R;E2k#UVB#7O{n;Cj-qu{PRf%!UXv5ra{gY`i+j>t#8mo?` zE$f89!bI-;J*`g`s#cR)RI{wr!vz2)A2E~gB$wW>`?xo1KjiC?oBZv+9@}MSbXL+` zo9aZ_6tU&HSmw&tZQ9?qjD*BiLteI`So>7AULS~uecT~WfgJ&>81!f?&+c+pJvtn0 zPqIj~9_@Ei$KBEUR1ZvB$6r>LA>woEHJrGn9}L~qdez$DgYMP2?^2}~#hzBGqOyvG z{CP|)i2~rpH6Y~e^uf`#O}naLw=009>aY{dl)sku+f_P9SBDERzX-{}Dc8R6u($d4 zTpRi$HT)61A=8M~kR6#AlWl29vD8mX@2S|^2|br>x^iB1hqb6II7v_+6Kl8G`eGD# zn(_HSNV}>f{sI?e-xy$w(ZWr13D<^mCJI0{*fC?yt>M~=1G;Sj6;T|~(ip?0GW&!) zf5gMT6%YJ$2xHeFbcQsyf(W%ZrZ8Y1uLlupFXphaxW)c85ox;-Z*hM~X%#FtYwWnjLn??*|5%H%fgopA9uW-Ew-p@Yr_!@$->=uikXS z$%~_)_sLQ88v4;WUd`ixcfg6)bD=8`*1AdtgcG~f7u0o;BCTnRw#8>f>Wu?_3wYqN^WGQp`qN&Y z0JF!O{q8Xk+pcdYm45?<`pF8>4+TRs){C7e`4YLSH-DG!FGCi}9V)J6=e{st#Y6<3 z%;>yqD$>2-QAJcrILh7sQC?w1_)s5K>CUT~fw%NtCyYB;GLtQx6JokGIFgS#IML@B#+~I5*bA)I*e2hc^?JS`&-sbz z?l0%=AFz2Ree)f;{>Iw=h^@9_<0Ne{|~z{=B;r7b@vftZS z@EsKKMSlKB5A@|OIuc3^p$hJ=>j-g$!1n~n{}RrHgY?W0qLz@v z$xiMZsh>Q$9qH^Q*HOSK4nF)lM?yAUe&|EBcANxE`cB;n^-H}(e;d)guq|;}1=lu8 zMLfricdH9NDCV14z6wwwMxKd)gxC~L@e628n6Cz8Rn->z(joA20O=EJC-KU?XOHRb zlR9J7wQE}j>YwOSFkv~^&P;qiLw)6=pPX|`skWfHial(ISXGbXNGpD48jL%cwTE57 z&}H=_X!=I28VYX8=xAdw&d1wb6m4F6_zs&RJVag1)~1HNcBda0b9Sj33D3n#g0lO< z*0V2Aq2eVTvJhXzGW6v;s`ybDro=5%z~Mca7`D(4ulRx0QnW&Z2%I7S`XCwV#LH!ov+iaiM)0$30X2}ThqT@vDlv|}SQ1*nK?2`fS@k=2CHdq(UaZ8&p~ zP6kP4!YK+|?r8Rzk7~)eBW{ZzF*c(GS=7`W3!CgvJQbptUU54d-NkNLi3%f+}&) zR|acWP?JPT>J_Ype{(c^^`fV1OW{$Cofb+`q$3XDk`a+8f1f#Fd}w55j8;uhCVMx< z*RDc*_v%pkw5=5C_ci?a;kDoa9wbPbmAt>rmd2YsdWM7rRXpVB>9%1r@hKTRXiQO0 zGkOKPr6Qhgei|WiF++XKEJb-%W4h8TNZEHd(0EV9*-EhpX{lTG3mbWakWg5DmvD58 zXQiP{sEvQV@hn{wDn#SK{Vge`cJrhc`Vu_EUp0W%gKl#K5qwp5C0_4WlDt;g)M*sJ zw^f!l8h(v2iHa_Lr*$K!+6qM$6O`xBJN-5G;tkvSnnxKyKg+ukRotdoNsRBpyfM%! z+89j6qF#*|yO)N!^9{r3Qo6})4oJmgX=4GX@5fnl`er$pZbE##Fik~BGV5t0=dgsSCyPJ>yg4>a zJtDhD+r<_hy%Hk*mOQ3M+eX{=e6OyhJ$KhqR~h%m>laYppvUg+5v_C9Mq;A9Acf60 zRizjVF~)8>7{~7SpAVrmMIac>0~E_PN4{cJ7ZA^Y7a@D}@!R!6{>7oV);xGR){WMS ztSk-Hi0@y$5+XM5SzNFf2?#hXz;J!b-;%cV)C=naX2T1nvEhkf(x)R>)jG=qG_4QG zjpjL8+E+ZM&v0!ySjH=Cm^FCjY!)eJSi2NAjkPxoC?h+G84fC?Cq8977g{L`EoH?a z?ExGum<%-w5KkOMOZt<)k++f$^PeWMkjftCRahhaZpOk{%xw>(P|T=#!BZ8mAE;{_ zYOlfr%~;$+AlQ_VxpUz+V0`x?V9XL#83|{&P^u*lQMrtrIsIjs56-87X4<}a@z)9S zR6SUSCdcuFlPG#Zt>Bxi(49pUqay3Md$70y@EZ&VNwulNRE$^Ghp&n}sA?d#}7#)nRxJu8%GsB;avRBa|u+C)2 zC@>GlX?qsa7Pbc{P723LB~bSo8zPD6>)$wv356_)xw-1GQBIJ2o@(~pU);cDpcp;V z=y_6_M|n^%zsM#dstVD3c@-Zzxo6c=!P*d6r@UVJgrZy4s)I$^o{J<*Yh@AZav*SS zge$YWK-3@?y-RmI&(39`30hI{E}fqeXZv8j$nm?*Wp_Jdj|e=6H$h+p<4qXddfSEd zv(lQFy?qVmeUlW%2~e&ht)wFGwtx)ZR8U;DP#GqM*5BNCvb?x9nnz-g0L@wtH9Nb? zSQS#I&}2jJVMnwkwRXJIGY&)`OSUlwaj_=@s}T#BchsXR6#5l(tfj`Pi>$E9-?}k1 z&}5vKwhW~d%5ul@Kp*zjEvRJzsUf77hhP&;SF{E!; zdX4%dX_!64~c=Ub+cd3?oGj6X;CkG2U0yE3Bm&dqV= zz9Z#aEM=ORd_)r~H6V>5ENW#z>pfPVTuMoYzvmOZjvPG7nL^AJKtNFMCeF%f*GAV) zOtDq#$HFF=5;PZ~Y;Q;ZsH#UQfr=#lKrR#ClycM!ILX3#gg!4D8$a6tHImKB5AzSS z&yNtO@C;YyS@USMl^&sET^uimTdb9Th6fIoMj`(sfqT(POZ?D|JA#%pUU*Q_Z1ZgtGVmRwDgSP zKD-(%HHgk&^^(Tf&Lv~}Vj5S9(Ls1lJZ##dHn(WS^kK10p(&s4QAx)#LGJvPIvI{$ z3T5YF4|)EBbNi^!qb>Q|k>**u5H;*vWo?yw?5~lg zci0C|!Dq}@5)ieAEVS}0S2n%W>&8ClaZY&3&N(=RWWLZqv<6{X>eY3TPU=3;n&@^zU-A9br)`;Ic2PX9d0+Djo@^T*%1=Py|fj;t`j()e|tpnC0v?JqO~MH;n4 z)q?E>4(~qQxU8PwYKGZyrPn1rJ>eaSbj)+RCor#9i-xm6NWSLm<4+D;?Ur#{6q0>K zDZ}Y{VUIW0mU$|g+RS_zvICiyyChX!P)s4j@u7>|GfsMIo^@}qhfSE#)J>dlUP>n% z(ye-_&tY0<5TUhq9%~q*P1L6g$0l_Y;w?k^YU2QrS49 zUC$BSH=c2?MmV6U_uw?R;kD~Bk(<`H){A|C;|-4^DFCc0`6VBxXMcT3^S9>jD=Svb^UR>;|=YE<*U zMcknaabusYyvVDDE_Dfwk(ps3cg9KOBLSgFWx2j3s;wUWP0*T7u#SHgIq#@*>~x?A z2f2F3-K>XQ!N`3{IVaK?s1_#gDpK$ljjLSyGBxZwN=pqD4PZXyIOH)el?1I!(aXrC7p89u%t|%t zR8?1;yb~?IgkOuWmUD0`Yj}92^1eXO@GEgz@}ksOn_(8r9ojj z(+SpXN-XtP217?J%r@(N1`_NBIbQ^t2wn1h+XxcbLHBXBytd7gzq$E)e7xejj%g5`i>`Kl^OHqFh z^homViL7uG$)d@mUy+GfQRf}YcDkt$%L+6pM|$}cmbl(=?XHb0?oTMabRmzXf{yT> zWWIKYx0VUpY*x}d%93>W+-_f4wdA+?#RjjFBIYqs;gyQdNzb#CXtG_kGyG>U%9Xq` zT}rzo*O(2VAYWN z#fuR-Q}Zg^j8*z1zP-Bcx$HNi&}V2=_bE1p))691b_pVrX#L10Dj zq7yCoIi*>tV9DsdM~r&&_H)zUD_Wd$6waZ!n+pz0|_$=AOW^+A-7Z zp+|{5rQfWedf2*Qy%nz@Ia9>)u*#Uk(*g;j`HAjFS8>3K!0adwoZ;%_-MU$wAF>Z*=Fsh zDZbRCGc+zgxk{V*;MoFS+b37nT@;^7q0_Z3eEkvJOq+zr+?MBzLY{+M+~EZ8Yf)3F zlZQSh8|+_(TqDpfscZL~{&z-}fPrl0BWwU*lk`9BKmYJcHEjR+TiS~iEbWEhT8Sr8 zC^if&Q=AInt`rqDHK8R~E`*MH-#&(GSqk(jxx0TksJoBLDOkov13zEGnw7oADBhyD zTz>i3X@*H~jZO z=$qb^)spk#VjJ`X^kpfzYe3u)QZ6AH6&kA~kk>se> zke1;-TK&M}{QNKu_+yw!h1CZyO|HWQDtn3ds-r*}IT@K_BSgk1wCWpK)r;=@$wJh0 zoir+ME?e;3_pl5T_j(Wh$)_i+`1X8w;)QRDQDb9tdGb3w*FOS26UugVO- zF!B%vAM1exdS7u6Ob_?JLbcSk`?_o!M=Ow5t1|K}aiTw}T3+6@02-*f8k1BeV5m=H z9bt_^7BQ%Bg4)+~kMz|;n;gQawq?ifDlY;#aRrjvMv=Y`O+_NKH$Z9a_t-)+jqW)h zjLW(nk>#W+fpHB;N3?4sJVf)2IPuXvYKwuECJpn_Qlkh3P)2sAJyTGLP}(9@qvW=% zm!gt4bLz%-^2Vdnitui&J1l11Q#W|Y2r~tX{Gm-lvcb-=$5lD}#42rZ#vco7k%HH0 zd2!`8C)FZ!zj7B3htV#%SiN~hJ5iX6KO+?*K(_wCv}J{_H$Ymr%NqTwi=&Nw63{h6 z_j-ob0Z5Q{DdwPeZnfO=q2h(NM2CO_5RG7bea!SmLT=!>rI$j-M+g1pdgU)k%= z-LEOL*et**I@mz9JtQ6MS)26p8bwu}qD8bqNB+Q-AF(W{6&t1!-o4Vyr_pbKdaSJ! ziZ*N|v?k7XlOUuI7T?PqS@t3VrT4;#ln+9Z{3fDg+nw1<7Inf^OfPEQGL&HVzoWwX z_CsB&(1XP-^$o+*A>(r@_q2Ir2HK8p;`=!QwGA&n`6qVeqZA7elPGh@k+Ty|qO6P2 zf9{mE9Uoam2A^Y-O!A+NN)f$7Lo{T*Cj>>&Hp27vwv@xeO+5M{D`j%LHv5>NsfEo- z!9*4J>X8IG1|#|n%O|V^F5rQ?);t1dr2aAfwda%t(;T)=X7j4kt}79K+ zR#qc2<}GO_L~KgEp*AzAG?n~>)x&LsZN42OJ)||FC=xP+8OZCIuI39gzZ0F9-L@k@K^!Q(Aym36Yydk#TCJicW-A~GP6ui(JK*M5M+_9CGUs|mvzM_<;K^+P| zdyp9iNUV5V+DbVP$qjaRqC7P8*}@pnI@s_bqlLuFlqKohrIhSA*~DcX4zwZQ8n@Qz zK$`;5DLSI?x#})?67j=h@h@KniQayL!+T!k52vP0?lh z+omp@s5hx2#6Ny=h#?b^^vB@_MDiR^(q;o0;~`WLkanMx)_&nC+YU?3sa%qIb9;fv zvkScWM99?k$H*(bctVU4z2l z^($xh$XA#5`7Q(Fcf41-=iI!ng;*!<)*|1S7@QJWwFVa<0HaxeOM;??9KLU4c1b81 z#g)pTVvPH8?|ql}7S^yHci6R)H_&pl?nqI8BXH_Kao}!Zl$WezBAAv0Ifo&JsalyJ z;|r`Zjjw<TULBykRea>3d4O&<+_yTFyBnSK1H&8PL}nkfuOu3{>g`XN zxS0MeajysSI3AQ~0^Pd=5B6|3=x(teH_ksRT-K`edj=*lrBpo2C1mO-k)jAT$bf2W zdedF_l;?ik(lu9PU3=%*-(xgM{7eXq-glOZ5co38NPw}G6Zm<2d#1-#9_Tmi0xkgK zXn0DN%P6@$5%nk(X`2dmGMo;UavldShZS1>AoUp>PtzVVO4knV$iNmar|e~_m)Gyy z*^S5}oID_7dd;3eLOtxSSq>ZQyXPU(Wy!`!MnYm5bYpv^D+892d`aS-OK zS{Y(NhWABWM>@gnd-}s-Zy~yg$zUI?YfQ0R1tOjwTNw~)rFx=y2O2vpjv#l&XXb;7 z>)e?0 z`=6w%-{pSJ=A!yV&erCSa{qR=-QLlkBfh_mw88z4YOs7TTh9O8I{zzg?Drx3yv_gB zr>wsE$A|tETK-+-XV3bp>1I)XQu(*n;no@d>_~5&@!#!X@-MC#q<{?bV*mgi>=1?d zjzrko004ZQ|9K(7*ZJ-2_&>hR;fxlX(SkEta7GKxXu%mRIHLt;wBU>uoY8_aT5v`S z&S=3IEjXhEXSCpq7M#(7Gg@#)3(jc487(-Y1!uJ2j24{Hf-_ohMhnhp!5J+$qXlQQ z;EWcW(SkEta7GKxXu%mRIHLt;wBU>uoYA_)wBU>uoY8_aT5v`S&S*KhIB|lV>})x2 zc`rDl1-K=b;EWak@b4L||Bu+Kzo6IKSrG+iF#&KE^RItq`<)s5KgVMJZ`b*M0ZM@@ AyZ`_I From 87527dd1b4f743429937683dc3583b11eee0f41a Mon Sep 17 00:00:00 2001 From: '1299310140' <'13437282785@163.com'> Date: Mon, 8 May 2017 15:56:27 +0800 Subject: [PATCH 481/552] QuickMinStack&&StackWithTwoQueues&&TwoStackInOneArray --- .../com/coding/basic/stack/QuickMinStack.java | 68 ++++++++++++ .../coding/basic/stack/QuickMinStackTest.java | 53 ++++++++++ .../basic/stack/StackWithTwoQueues.java | 54 ++++++++++ .../basic/stack/StackWithTwoQueuesTest.java | 52 +++++++++ .../basic/stack/TwoStackInOneArray.java | 100 ++++++++++++++++++ .../basic/stack/TwoStackInOneArrayTest.java | 65 ++++++++++++ 6 files changed, 392 insertions(+) create mode 100644 group04/1299310140/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 group04/1299310140/src/com/coding/basic/stack/QuickMinStackTest.java create mode 100644 group04/1299310140/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group04/1299310140/src/com/coding/basic/stack/StackWithTwoQueuesTest.java create mode 100644 group04/1299310140/src/com/coding/basic/stack/TwoStackInOneArray.java create mode 100644 group04/1299310140/src/com/coding/basic/stack/TwoStackInOneArrayTest.java diff --git a/group04/1299310140/src/com/coding/basic/stack/QuickMinStack.java b/group04/1299310140/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..324ea1ba9a --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,68 @@ +package com.coding.basic.stack; + +import java.util.ArrayList; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回该数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + private ArrayList elementData = new ArrayList(); + + public Boolean isEmpty(){ + return elementData.size() == 0; + } + + public int size(){ + return elementData.size(); + } + + public void push(int data){ + int[] temp = new int[3];//data min max + if(isEmpty()){ + temp[0] = data; + temp[1] = data; + temp[2] = data; + elementData.add(temp); + return; + } + + int min = this.elementData.get(size()-1)[1]; + int max = this.elementData.get(size()-1)[2]; + + temp[0] = data; + + if(data < min){ + temp[1] = data; + }else{ + temp[1] = min; + } + + if(data > max){ + temp[2] = data; + }else{ + temp[2] = max; + } + + elementData.add(temp); + } + + public int pop(){ + return this.elementData.remove(size()-1)[0]; + } + + public int peek(){ + return this.elementData.get(size()-1)[0]; + } + + public int findMin(){ + return this.elementData.get(size()-1)[1]; + } + + public int findMax(){ + return this.elementData.get(size()-1)[2]; + } +} diff --git a/group04/1299310140/src/com/coding/basic/stack/QuickMinStackTest.java b/group04/1299310140/src/com/coding/basic/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..09be7c9496 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/QuickMinStackTest.java @@ -0,0 +1,53 @@ +package com.coding.basic.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class QuickMinStackTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + QuickMinStack stack = new QuickMinStack(); + Assert.assertTrue(stack.isEmpty()); + Assert.assertEquals(0,stack.size()); + + stack.push(3); + Assert.assertFalse(stack.isEmpty()); + Assert.assertEquals(1,stack.size()); + Assert.assertEquals(3,stack.peek()); + Assert.assertEquals(3,stack.findMin()); + Assert.assertEquals(3,stack.findMax()); + Assert.assertEquals(3,stack.pop()); + Assert.assertTrue(stack.isEmpty()); + Assert.assertEquals(0,stack.size()); + + stack.push(5); + stack.push(6); + stack.push(3); + stack.push(7); + stack.push(1); + Assert.assertEquals(1,stack.findMin()); + Assert.assertEquals(7,stack.findMax()); + + stack.pop(); + Assert.assertEquals(3,stack.findMin()); + Assert.assertEquals(7,stack.findMax()); + + stack.pop(); + Assert.assertEquals(3,stack.findMin()); + Assert.assertEquals(6,stack.findMax()); + } + +} diff --git a/group04/1299310140/src/com/coding/basic/stack/StackWithTwoQueues.java b/group04/1299310140/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..c176be9b95 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,54 @@ +package com.coding.basic.stack; + +import com.coding.basic.Queue; + +public class StackWithTwoQueues { + + private Queue queue1; + private Queue queue2; + + public StackWithTwoQueues() { + queue1 = new Queue(); + queue2 = new Queue(); + } + + public Boolean isEmpty(){ + return queue1.isEmpty() && queue2.isEmpty(); + } + + public int size(){ + return queue1.size() + queue2.size(); + } + + public void push(int data) { + queue1.enQueue(data); + } + + public int pop() { + if(isEmpty()){ + throw new RuntimeException("The Stack is empty!!!"); + } + + while(!queue1.isEmpty()){ + Object temp = queue1.deQueue(); + if(queue1.isEmpty()){ + return (int)temp; + }else{ + queue2.enQueue(temp); + } + } + + //queue1为空,queue2不为空 + while(!queue2.isEmpty()){ + Object temp = queue2.deQueue(); + if(queue2.isEmpty()){ + return (int)temp; + }else{ + queue1.enQueue(temp); + } + } + + return -1;//永远不会执行 + } + +} diff --git a/group04/1299310140/src/com/coding/basic/stack/StackWithTwoQueuesTest.java b/group04/1299310140/src/com/coding/basic/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..013ceaa10e --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class StackWithTwoQueuesTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + StackWithTwoQueues stack = new StackWithTwoQueues(); + Assert.assertTrue(stack.isEmpty()); + Assert.assertEquals(0,stack.size()); + + stack.push(4); + Assert.assertFalse(stack.isEmpty()); + Assert.assertEquals(1,stack.size()); + + Assert.assertEquals(4,stack.pop()); + Assert.assertTrue(stack.isEmpty()); + + stack.push(2); + stack.push(3); + stack.push(5); + Assert.assertFalse(stack.isEmpty()); + Assert.assertEquals(3,stack.size()); + + Assert.assertEquals(5,stack.pop()); + + stack.push(6); + stack.push(7); + stack.push(8); + Assert.assertEquals(8,stack.pop()); + Assert.assertEquals(7,stack.pop()); + Assert.assertEquals(6,stack.pop()); + Assert.assertEquals(3,stack.pop()); + Assert.assertEquals(2,stack.pop()); + Assert.assertTrue(stack.isEmpty()); + } + +} diff --git a/group04/1299310140/src/com/coding/basic/stack/TwoStackInOneArray.java b/group04/1299310140/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..311233daaa --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,100 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + + private Object[] data = new Object[10]; + private int pos1 = 0;//指向栈1的下一个空位 + private int pos2 = data.length - 1;//指向栈2的下一个空位 + + public Boolean isEmpty1(){ + return pos1 == 0; + } + + public Boolean isEmpty2(){ + return pos2 == data.length - 1; + } + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + this.data[pos1] = o; + pos1++; + if(pos1 == pos2){//扩容 + grow(); + } + } + + private void grow(){//容量增加一倍 + Object[] target = new Object[this.data.length * 2]; + System.arraycopy(this.data, 0, target, 0, pos1); + System.arraycopy(this.data, pos2 + 1, target, pos2 + 1 + data.length, data.length - pos2 -1); + pos2 = pos2 + data.length; + data = target; + } + + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + if(this.isEmpty1()){ + throw new RuntimeException("The stack1 is empty!!!"); + } + + pos1--; + Object result = this.data[pos1]; + this.data[pos1] = null; + return result; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + public Object peek1(){ + return this.data[pos1-1]; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + this.data[pos2] = o; + pos2--; + if(pos1 == pos2){//扩容 + grow(); + } + } + + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + if(isEmpty2()){ + throw new RuntimeException("The stack2 is empty!!!"); + } + + pos2++; + Object result = this.data[pos2]; + this.data[pos2] = null; + return result; + } + + /** + * 获取第二个栈的栈顶元素 + * @return + */ + public Object peek2(){ + return this.data[pos2 + 1]; + } + +} diff --git a/group04/1299310140/src/com/coding/basic/stack/TwoStackInOneArrayTest.java b/group04/1299310140/src/com/coding/basic/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..0fc822b4c7 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,65 @@ +package com.coding.basic.stack; + +import static org.junit.Assert.*; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TwoStackInOneArrayTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + TwoStackInOneArray twoStack = new TwoStackInOneArray(); + Assert.assertTrue(twoStack.isEmpty1()); + Assert.assertTrue(twoStack.isEmpty2()); + + twoStack.push1(1); + twoStack.push1(2); + twoStack.push1(3); + twoStack.push1(4); + twoStack.push1(5); + + twoStack.push2(6); + twoStack.push2(7); + twoStack.push2(8); + twoStack.push2(9); + twoStack.push2(10); + twoStack.push2(11); + + twoStack.push1(12); + twoStack.push1(13); + twoStack.push1(14); + twoStack.push1(15); + + Assert.assertEquals(15,twoStack.pop1()); + Assert.assertEquals(14,twoStack.pop1()); + Assert.assertEquals(13,twoStack.pop1()); + Assert.assertEquals(12,twoStack.pop1()); + Assert.assertEquals(5,twoStack.pop1()); + Assert.assertEquals(4,twoStack.pop1()); + Assert.assertEquals(3,twoStack.pop1()); + Assert.assertEquals(2,twoStack.pop1()); + Assert.assertEquals(1,twoStack.pop1()); + + Assert.assertEquals(11,twoStack.pop2()); + Assert.assertEquals(10,twoStack.pop2()); + Assert.assertEquals(9,twoStack.pop2()); + Assert.assertEquals(8,twoStack.pop2()); + Assert.assertEquals(7,twoStack.pop2()); + Assert.assertEquals(6,twoStack.pop2()); + + Assert.assertTrue(twoStack.isEmpty1()); + Assert.assertTrue(twoStack.isEmpty2()); + } + +} From 5389f19a0eb8d040985359d0b325d1bfb0052544 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 8 May 2017 16:05:36 +0800 Subject: [PATCH 482/552] =?UTF-8?q?JVM=E4=B8=BB=E9=A2=98=E7=AC=AC7?= =?UTF-8?q?=E6=AC=A1=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coding/basic/BinaryTreeNode.java | 32 -------- .../com/coding/basic/tree/BinaryTreeNode.java | 35 +++++++++ .../com/coding/basic/tree/BinaryTreeUtil.java | 66 ++++++++++++++++ .../coding/basic/tree/BinaryTreeUtilTest.java | 75 +++++++++++++++++++ .../src/com/coding/basic/tree/FileList.java | 10 +++ 5 files changed, 186 insertions(+), 32 deletions(-) delete mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/BinaryTreeNode.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeNode.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeUtil.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeUtilTest.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/tree/FileList.java diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/BinaryTreeNode.java b/liuxin/data-structure/assignment/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/liuxin/data-structure/assignment/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeNode.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..467101a16f --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeNode.java @@ -0,0 +1,35 @@ +package com.coding.basic.tree; + +public class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeUtil.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..b033cbe1d5 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeUtil.java @@ -0,0 +1,66 @@ +package com.coding.basic.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeUtilTest.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..41857e137d --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeUtilTest.java @@ -0,0 +1,75 @@ +package com.coding.basic.tree; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/FileList.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/FileList.java new file mode 100644 index 0000000000..6e65192e4a --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/FileList.java @@ -0,0 +1,10 @@ +package com.coding.basic.tree; + +import java.io.File; + +public class FileList { + public void list(File f) { + } + + +} From 798c6ad88108ad7634d318b6bad38724da7ba8b5 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 8 May 2017 16:10:19 +0800 Subject: [PATCH 483/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../answer/src/com/coding/basic/queue/CircleQueue.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java b/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java index 8bd2577c53..f169d5f8e4 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/queue/CircleQueue.java @@ -14,7 +14,7 @@ public CircleQueue(int capacity){ elementData = new Object[capacity]; } public boolean isEmpty() { - return front == rear; + return (front == rear) && !isFull(); } @@ -29,6 +29,7 @@ public void enQueue(E data) { if(isFull()){ throw new RuntimeException("The queue is full"); } + rear = (rear+1) % elementData.length; elementData[rear++] = data; size++; } From e031bf4309ba60e96d3cf203bd5e59e987d0800b Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 8 May 2017 16:11:18 +0800 Subject: [PATCH 484/552] =?UTF-8?q?JVM=E4=B8=BB=E9=A2=98=E7=AC=AC6?= =?UTF-8?q?=E6=AC=A1=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E4=B9=A0=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/stack/QuickMinStack.java | 41 ++++++ .../coding/basic/stack/QuickMinStackTest.java | 39 ++++++ .../basic/stack/StackWithTwoQueues.java | 53 ++++++++ .../basic/stack/StackWithTwoQueuesTest.java | 36 ++++++ .../basic/stack/TwoStackInOneArray.java | 117 ++++++++++++++++++ .../basic/stack/TwoStackInOneArrayTest.java | 65 ++++++++++ 6 files changed, 351 insertions(+) create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStackTest.java create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/StackWithTwoQueuesTest.java create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/TwoStackInOneArray.java create mode 100644 liuxin/data-structure/answer/src/com/coding/basic/stack/TwoStackInOneArrayTest.java diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStack.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..b55762e8af --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack; + +import java.util.Stack; +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + private Stack normalStack = new Stack(); + private Stack minNumStack = new Stack(); + + public void push(int data){ + + normalStack.push(data); + + if(minNumStack.isEmpty()){ + minNumStack.push(data); + } else{ + if(minNumStack.peek() >= data) { + minNumStack.push(data); + } + } + + } + public int pop(){ + if(normalStack.isEmpty()){ + throw new RuntimeException("the stack is empty"); + } + int value = normalStack.pop(); + if(value == minNumStack.peek()){ + minNumStack.pop(); + } + return value; + } + public int findMin(){ + return minNumStack.peek(); + } +} \ No newline at end of file diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStackTest.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..efe41a9f8f --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStackTest.java @@ -0,0 +1,39 @@ +package com.coding.basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class QuickMinStackTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + QuickMinStack stack = new QuickMinStack(); + stack.push(5); + Assert.assertEquals(5, stack.findMin()); + stack.push(6); + Assert.assertEquals(5, stack.findMin()); + stack.push(4); + Assert.assertEquals(4, stack.findMin()); + stack.push(4); + Assert.assertEquals(4, stack.findMin()); + + stack.pop(); + Assert.assertEquals(4, stack.findMin()); + stack.pop(); + Assert.assertEquals(5, stack.findMin()); + stack.pop(); + Assert.assertEquals(5, stack.findMin()); + } + +} diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/StackWithTwoQueues.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..7a58fbff56 --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,53 @@ +package com.coding.basic.stack; + +import java.util.ArrayDeque; +import java.util.Queue; + +public class StackWithTwoQueues { + Queue queue1 = new ArrayDeque<>(); + Queue queue2 = new ArrayDeque<>(); + + public void push(int data) { + //两个栈都为空时,优先考虑queue1 + if (queue1.isEmpty()&&queue2.isEmpty()) { + queue1.add(data); + return; + } + + if (queue1.isEmpty()) { + queue2.add(data); + return; + } + + if (queue2.isEmpty()) { + queue1.add(data); + return; + } + + } + + public int pop() { + + if (queue1.isEmpty()&&queue2.isEmpty()) { + throw new RuntimeException("stack is empty"); + } + + if (queue1.isEmpty()) { + while (queue2.size()>1) { + queue1.add(queue2.poll()); + } + return queue2.poll(); + } + + if (queue2.isEmpty()) { + while (queue1.size()>1) { + queue2.add(queue1.poll()); + } + return queue1.poll(); + } + + throw new RuntimeException("no queue is empty, this is not allowed"); + + + } +} diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/StackWithTwoQueuesTest.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..4541b1f040 --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,36 @@ +package com.coding.basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class StackWithTwoQueuesTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + StackWithTwoQueues stack = new StackWithTwoQueues(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + Assert.assertEquals(4, stack.pop()); + Assert.assertEquals(3, stack.pop()); + + stack.push(5); + Assert.assertEquals(5, stack.pop()); + Assert.assertEquals(2, stack.pop()); + Assert.assertEquals(1, stack.pop()); + } + +} diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/TwoStackInOneArray.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..a532fd6e6c --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,117 @@ +package com.coding.basic.stack; + +import java.util.Arrays; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + private Object[] data = new Object[10]; + private int size; + private int top1, top2; + + public TwoStackInOneArray(int n){ + data = new Object[n]; + size = n; + top1 = -1; + top2 = data.length; + } + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + ensureCapacity(); + data[++top1] = o; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + ensureCapacity(); + data[--top2] = o; + } + public void ensureCapacity(){ + if(top2-top1>1){ + return; + } else{ + + Object[] newArray = new Object[data.length*2]; + System.arraycopy(data, 0, newArray, 0, top1+1); + + int stack2Size = data.length-top2; + int newTop2 = newArray.length-stack2Size; + System.arraycopy(data, top2, newArray, newTop2, stack2Size); + + top2 = newTop2; + data = newArray; + } + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + if(top1 == -1){ + throw new RuntimeException("Stack1 is empty"); + } + Object o = data[top1]; + data[top1] = null; + top1--; + return o; + + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + if(top2 == data.length){ + throw new RuntimeException("Stack2 is empty"); + } + Object o = data[top2]; + data[top2] = null; + top2++; + return o; + } + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + if(top1 == -1){ + throw new RuntimeException("Stack1 is empty"); + } + return data[top1]; + } + + + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + if(top2 == data.length){ + throw new RuntimeException("Stack2 is empty"); + } + return data[top2]; + } + + public Object[] stack1ToArray(){ + return Arrays.copyOf(data, top1+1); + } + public Object[] stack2ToArray(){ + int size = data.length-top2; + Object [] stack2Data = new Object[size]; + int j=0; + for(int i=data.length-1; i>=top2 ;i--){ + stack2Data[j++] = data[i]; + } + return stack2Data; + } +} diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/TwoStackInOneArrayTest.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..b743d422c6 --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,65 @@ +package com.coding.basic.stack; + +import java.util.Arrays; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class TwoStackInOneArrayTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test1() { + TwoStackInOneArray stack = new TwoStackInOneArray(10); + stack.push1(1); + stack.push1(2); + stack.push1(3); + stack.push1(4); + stack.push1(5); + + stack.push2(1); + stack.push2(2); + stack.push2(3); + stack.push2(4); + stack.push2(5); + + for(int i=1;i<=5;i++){ + Assert.assertEquals(stack.peek1(), stack.peek2()); + Assert.assertEquals(stack.pop1(), stack.pop2()); + } + + + } + @Test + public void test2() { + TwoStackInOneArray stack = new TwoStackInOneArray(5); + stack.push1(1); + stack.push1(2); + stack.push1(3); + stack.push1(4); + stack.push1(5); + stack.push1(6); + stack.push1(7); + + stack.push2(1); + stack.push2(2); + stack.push2(3); + stack.push2(4); + + + Assert.assertEquals("[1, 2, 3, 4, 5, 6, 7]",Arrays.toString(stack.stack1ToArray())); + Assert.assertEquals("[1, 2, 3, 4]",Arrays.toString(stack.stack2ToArray())); + } + +} From 8d4b447eeb9917c538b9e28665e85d20d6f952bc Mon Sep 17 00:00:00 2001 From: myThinkPad <1252327158@qq.com> Date: Mon, 8 May 2017 16:58:21 +0800 Subject: [PATCH 485/552] update from idea --- .../src/com/coderising/jvm/test/ClassFileloaderTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java index 2ac4100aef..dfb56a30bd 100644 --- a/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group27/1252327158/task4_20170402/mini-jvm/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -53,9 +53,8 @@ public void testClassPath(){ loader.addClassPath(path2); String clzPath = loader.getClassPath(); - + Assert.assertEquals(path1+";"+path2,clzPath); - } @Test @@ -70,7 +69,6 @@ public void testClassFileLength() { // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 Assert.assertEquals(1056, byteCodes.length); - } From ae89730aecf2539d3a33113ceecbb0d0d3dd5c52 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Mon, 8 May 2017 19:30:40 +0800 Subject: [PATCH 486/552] Tenth Week Homework --- .../448641125/src/java/io/PrintStream.java | 1138 ----------------- .../10-TenthWeek/tree/BinaryTreeNode.java | 35 + .../10-TenthWeek/tree/BinaryTreeUtil.java | 66 + .../10-TenthWeek/tree/BinaryTreeUtilTest.java | 75 ++ .../Homework/10-TenthWeek/tree/FileList.java | 10 + .../Homework/9-NinthWeek/QuickMinStack.java | 19 + .../9-NinthWeek/StackWithTwoQueues.java | 16 + .../9-NinthWeek/TwoStackInOneArray.java | 57 + 8 files changed, 278 insertions(+), 1138 deletions(-) delete mode 100644 group24/448641125/src/java/io/PrintStream.java create mode 100644 group24/Homework/10-TenthWeek/tree/BinaryTreeNode.java create mode 100644 group24/Homework/10-TenthWeek/tree/BinaryTreeUtil.java create mode 100644 group24/Homework/10-TenthWeek/tree/BinaryTreeUtilTest.java create mode 100644 group24/Homework/10-TenthWeek/tree/FileList.java create mode 100644 group24/Homework/9-NinthWeek/QuickMinStack.java create mode 100644 group24/Homework/9-NinthWeek/StackWithTwoQueues.java create mode 100644 group24/Homework/9-NinthWeek/TwoStackInOneArray.java diff --git a/group24/448641125/src/java/io/PrintStream.java b/group24/448641125/src/java/io/PrintStream.java deleted file mode 100644 index 659e3c4ea2..0000000000 --- a/group24/448641125/src/java/io/PrintStream.java +++ /dev/null @@ -1,1138 +0,0 @@ -package java.io; - -/** - * Created by DonaldY on 2017/4/29. - */ -/* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. - * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - */ - -import java.nio.charset.Charset; -import java.nio.charset.IllegalCharsetNameException; -import java.nio.charset.UnsupportedCharsetException; -import java.util.Formatter; -import java.util.Locale; - -import java.util.Formatter; -import java.util.Locale; -import java.nio.charset.Charset; -import java.nio.charset.IllegalCharsetNameException; -import java.nio.charset.UnsupportedCharsetException; - -/** - * A PrintStream adds functionality to another output stream, - * namely the ability to print representations of various data values - * conveniently. Two other features are provided as well. Unlike other output - * streams, a PrintStream never throws an - * IOException; instead, exceptional situations merely set an - * internal flag that can be tested via the checkError method. - * Optionally, a PrintStream can be created so as to flush - * automatically; this means that the flush method is - * automatically invoked after a byte array is written, one of the - * println methods is invoked, or a newline character or byte - * ('\n') is written. - * - *

    All characters printed by a PrintStream are converted into - * bytes using the platform's default character encoding. The {@link - * PrintWriter} class should be used in situations that require writing - * characters rather than bytes. - * - * @author Frank Yellin - * @author Mark Reinhold - * @since JDK1.0 - */ - -public class PrintStream extends FilterOutputStream - implements Appendable, Closeable -{ - - private final boolean autoFlush; - private boolean trouble = false; - private Formatter formatter; - - /** - * Track both the text- and character-output streams, so that their buffers - * can be flushed without flushing the entire stream. - */ - private BufferedWriter textOut; - private OutputStreamWriter charOut; - - /** - * requireNonNull is explicitly declared here so as not to create an extra - * dependency on java.util.Objects.requireNonNull. PrintStream is loaded - * early during system initialization. - */ - private static T requireNonNull(T obj, String message) { - if (obj == null) - throw new NullPointerException(message); - return obj; - } - - /** - * Returns a charset object for the given charset name. - * @throws NullPointerException is csn is null - * @throws UnsupportedEncodingException if the charset is not supported - */ - private static Charset toCharset(String csn) - throws UnsupportedEncodingException - { - requireNonNull(csn, "charsetName"); - try { - return Charset.forName(csn); - } catch (IllegalCharsetNameException |UnsupportedCharsetException unused) { - // UnsupportedEncodingException should be thrown - throw new UnsupportedEncodingException(csn); - } - } - - /* Private constructors */ - private PrintStream(boolean autoFlush, OutputStream out) { - super(out); - this.autoFlush = autoFlush; - this.charOut = new OutputStreamWriter(this); - this.textOut = new BufferedWriter(charOut); - } - - private PrintStream(boolean autoFlush, OutputStream out, Charset charset) { - super(out); - this.autoFlush = autoFlush; - this.charOut = new OutputStreamWriter(this, charset); - this.textOut = new BufferedWriter(charOut); - } - - /* Variant of the private constructor so that the given charset name - * can be verified before evaluating the OutputStream argument. Used - * by constructors creating a FileOutputStream that also take a - * charset name. - */ - private PrintStream(boolean autoFlush, Charset charset, OutputStream out) - throws UnsupportedEncodingException - { - this(autoFlush, out, charset); - } - - /** - * Creates a new print stream. This stream will not flush automatically. - * - * @param out The output stream to which values and objects will be - * printed - * - * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream) - */ - public PrintStream(OutputStream out) { - this(out, false); - } - - /** - * Creates a new print stream. - * - * @param out The output stream to which values and objects will be - * printed - * @param autoFlush A boolean; if true, the output buffer will be flushed - * whenever a byte array is written, one of the - * println methods is invoked, or a newline - * character or byte ('\n') is written - * - * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream, boolean) - */ - public PrintStream(OutputStream out, boolean autoFlush) { - this(autoFlush, requireNonNull(out, "Null output stream")); - } - - /** - * Creates a new print stream. - * - * @param out The output stream to which values and objects will be - * printed - * @param autoFlush A boolean; if true, the output buffer will be flushed - * whenever a byte array is written, one of the - * println methods is invoked, or a newline - * character or byte ('\n') is written - * @param encoding The name of a supported - * - * character encoding - * - * @throws UnsupportedEncodingException - * If the named encoding is not supported - * - * @since 1.4 - */ - public PrintStream(OutputStream out, boolean autoFlush, String encoding) - throws UnsupportedEncodingException - { - this(autoFlush, - requireNonNull(out, "Null output stream"), - toCharset(encoding)); - } - - /** - * Creates a new print stream, without automatic line flushing, with the - * specified file name. This convenience constructor creates - * the necessary intermediate {@link java.io.OutputStreamWriter - * OutputStreamWriter}, which will encode characters using the - * {@linkplain java.nio.charset.Charset#defaultCharset() default charset} - * for this instance of the Java virtual machine. - * - * @param fileName - * The name of the file to use as the destination of this print - * stream. If the file exists, then it will be truncated to - * zero size; otherwise, a new file will be created. The output - * will be written to the file and is buffered. - * - * @throws FileNotFoundException - * If the given file object does not denote an existing, writable - * regular file and a new regular file of that name cannot be - * created, or if some other error occurs while opening or - * creating the file - * - * @throws SecurityException - * If a security manager is present and {@link - * SecurityManager#checkWrite checkWrite(fileName)} denies write - * access to the file - * - * @since 1.5 - */ - public PrintStream(String fileName) throws FileNotFoundException { - this(false, new FileOutputStream(fileName)); - } - - /** - * Creates a new print stream, without automatic line flushing, with the - * specified file name and charset. This convenience constructor creates - * the necessary intermediate {@link java.io.OutputStreamWriter - * OutputStreamWriter}, which will encode characters using the provided - * charset. - * - * @param fileName - * The name of the file to use as the destination of this print - * stream. If the file exists, then it will be truncated to - * zero size; otherwise, a new file will be created. The output - * will be written to the file and is buffered. - * - * @param csn - * The name of a supported {@linkplain java.nio.charset.Charset - * charset} - * - * @throws FileNotFoundException - * If the given file object does not denote an existing, writable - * regular file and a new regular file of that name cannot be - * created, or if some other error occurs while opening or - * creating the file - * - * @throws SecurityException - * If a security manager is present and {@link - * SecurityManager#checkWrite checkWrite(fileName)} denies write - * access to the file - * - * @throws UnsupportedEncodingException - * If the named charset is not supported - * - * @since 1.5 - */ - public PrintStream(String fileName, String csn) - throws FileNotFoundException, UnsupportedEncodingException - { - // ensure charset is checked before the file is opened - this(false, toCharset(csn), new FileOutputStream(fileName)); - } - - /** - * Creates a new print stream, without automatic line flushing, with the - * specified file. This convenience constructor creates the necessary - * intermediate {@link java.io.OutputStreamWriter OutputStreamWriter}, - * which will encode characters using the {@linkplain - * java.nio.charset.Charset#defaultCharset() default charset} for this - * instance of the Java virtual machine. - * - * @param file - * The file to use as the destination of this print stream. If the - * file exists, then it will be truncated to zero size; otherwise, - * a new file will be created. The output will be written to the - * file and is buffered. - * - * @throws FileNotFoundException - * If the given file object does not denote an existing, writable - * regular file and a new regular file of that name cannot be - * created, or if some other error occurs while opening or - * creating the file - * - * @throws SecurityException - * If a security manager is present and {@link - * SecurityManager#checkWrite checkWrite(file.getPath())} - * denies write access to the file - * - * @since 1.5 - */ - public PrintStream(File file) throws FileNotFoundException { - this(false, new FileOutputStream(file)); - } - - /** - * Creates a new print stream, without automatic line flushing, with the - * specified file and charset. This convenience constructor creates - * the necessary intermediate {@link java.io.OutputStreamWriter - * OutputStreamWriter}, which will encode characters using the provided - * charset. - * - * @param file - * The file to use as the destination of this print stream. If the - * file exists, then it will be truncated to zero size; otherwise, - * a new file will be created. The output will be written to the - * file and is buffered. - * - * @param csn - * The name of a supported {@linkplain java.nio.charset.Charset - * charset} - * - * @throws FileNotFoundException - * If the given file object does not denote an existing, writable - * regular file and a new regular file of that name cannot be - * created, or if some other error occurs while opening or - * creating the file - * - * @throws SecurityException - * If a security manager is present and {@link - * SecurityManager#checkWrite checkWrite(file.getPath())} - * denies write access to the file - * - * @throws UnsupportedEncodingException - * If the named charset is not supported - * - * @since 1.5 - */ - public PrintStream(File file, String csn) - throws FileNotFoundException, UnsupportedEncodingException - { - // ensure charset is checked before the file is opened - this(false, toCharset(csn), new FileOutputStream(file)); - } - - /** Check to make sure that the stream has not been closed */ - private void ensureOpen() throws IOException { - if (out == null) - throw new IOException("Stream closed"); - } - - /** - * Flushes the stream. This is done by writing any buffered output bytes to - * the underlying output stream and then flushing that stream. - * - * @see java.io.OutputStream#flush() - */ - public void flush() { - synchronized (this) { - try { - ensureOpen(); - out.flush(); - } - catch (IOException x) { - trouble = true; - } - } - } - - private boolean closing = false; /* To avoid recursive closing */ - - /** - * Closes the stream. This is done by flushing the stream and then closing - * the underlying output stream. - * - * @see java.io.OutputStream#close() - */ - public void close() { - synchronized (this) { - if (! closing) { - closing = true; - try { - textOut.close(); - out.close(); - } - catch (IOException x) { - trouble = true; - } - textOut = null; - charOut = null; - out = null; - } - } - } - - /** - * Flushes the stream and checks its error state. The internal error state - * is set to true when the underlying output stream throws an - * IOException other than InterruptedIOException, - * and when the setError method is invoked. If an operation - * on the underlying output stream throws an - * InterruptedIOException, then the PrintStream - * converts the exception back into an interrupt by doing: - *

    -     *     Thread.currentThread().interrupt();
    -     * 
    - * or the equivalent. - * - * @return true if and only if this stream has encountered an - * IOException other than - * InterruptedIOException, or the - * setError method has been invoked - */ - public boolean checkError() { - if (out != null) - flush(); - if (out instanceof java.io.PrintStream) { - PrintStream ps = (PrintStream) out; - return ps.checkError(); - } - return trouble; - } - - /** - * Sets the error state of the stream to true. - * - *

    This method will cause subsequent invocations of {@link - * #checkError()} to return true until {@link - * #clearError()} is invoked. - * - * @since JDK1.1 - */ - protected void setError() { - trouble = true; - } - - /** - * Clears the internal error state of this stream. - * - *

    This method will cause subsequent invocations of {@link - * #checkError()} to return false until another write - * operation fails and invokes {@link #setError()}. - * - * @since 1.6 - */ - protected void clearError() { - trouble = false; - } - - /* - * Exception-catching, synchronized output operations, - * which also implement the write() methods of OutputStream - */ - - /** - * Writes the specified byte to this stream. If the byte is a newline and - * automatic flushing is enabled then the flush method will be - * invoked. - * - *

    Note that the byte is written as given; to write a character that - * will be translated according to the platform's default character - * encoding, use the print(char) or println(char) - * methods. - * - * @param b The byte to be written - * @see #print(char) - * @see #println(char) - */ - public void write(int b) { - try { - synchronized (this) { - ensureOpen(); - out.write(b); - if ((b == '\n') && autoFlush) - out.flush(); - } - } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } - catch (IOException x) { - trouble = true; - } - } - - /** - * Writes len bytes from the specified byte array starting at - * offset off to this stream. If automatic flushing is - * enabled then the flush method will be invoked. - * - *

    Note that the bytes will be written as given; to write characters - * that will be translated according to the platform's default character - * encoding, use the print(char) or println(char) - * methods. - * - * @param buf A byte array - * @param off Offset from which to start taking bytes - * @param len Number of bytes to write - */ - public void write(byte buf[], int off, int len) { - try { - synchronized (this) { - ensureOpen(); - out.write(buf, off, len); - if (autoFlush) - out.flush(); - } - } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } - catch (IOException x) { - trouble = true; - } - } - - /* - * The following private methods on the text- and character-output streams - * always flush the stream buffers, so that writes to the underlying byte - * stream occur as promptly as with the original PrintStream. - */ - - private void write(char buf[]) { - try { - synchronized (this) { - ensureOpen(); - textOut.write(buf); - textOut.flushBuffer(); - charOut.flushBuffer(); - if (autoFlush) { - for (int i = 0; i < buf.length; i++) - if (buf[i] == '\n') - out.flush(); - } - } - } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } - catch (IOException x) { - trouble = true; - } - } - - private void write(String s) { - try { - synchronized (this) { - ensureOpen(); - textOut.write(s); - textOut.flushBuffer(); - charOut.flushBuffer(); - if (autoFlush && (s.indexOf('\n') >= 0)) - out.flush(); - } - } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } - catch (IOException x) { - trouble = true; - } - } - - private void newLine() { - try { - synchronized (this) { - ensureOpen(); - textOut.newLine(); - textOut.flushBuffer(); - charOut.flushBuffer(); - if (autoFlush) - out.flush(); - } - } - catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } - catch (IOException x) { - trouble = true; - } - } - - /* Methods that do not terminate lines */ - - /** - * Prints a boolean value. The string produced by {@link - * java.lang.String#valueOf(boolean)} is translated into bytes - * according to the platform's default character encoding, and these bytes - * are written in exactly the manner of the - * {@link #write(int)} method. - * - * @param b The boolean to be printed - */ - public void print(boolean b) { - write(b ? "true" : "false"); - } - - /** - * Prints a character. The character is translated into one or more bytes - * according to the platform's default character encoding, and these bytes - * are written in exactly the manner of the - * {@link #write(int)} method. - * - * @param c The char to be printed - */ - public void print(char c) { - write(String.valueOf(c)); - } - - /** - * Prints an integer. The string produced by {@link - * java.lang.String#valueOf(int)} is translated into bytes - * according to the platform's default character encoding, and these bytes - * are written in exactly the manner of the - * {@link #write(int)} method. - * - * @param i The int to be printed - * @see java.lang.Integer#toString(int) - */ - public void print(int i) { - write(String.valueOf(i)); - } - - /** - * Prints a long integer. The string produced by {@link - * java.lang.String#valueOf(long)} is translated into bytes - * according to the platform's default character encoding, and these bytes - * are written in exactly the manner of the - * {@link #write(int)} method. - * - * @param l The long to be printed - * @see java.lang.Long#toString(long) - */ - public void print(long l) { - write(String.valueOf(l)); - } - - /** - * Prints a floating-point number. The string produced by {@link - * java.lang.String#valueOf(float)} is translated into bytes - * according to the platform's default character encoding, and these bytes - * are written in exactly the manner of the - * {@link #write(int)} method. - * - * @param f The float to be printed - * @see java.lang.Float#toString(float) - */ - public void print(float f) { - write(String.valueOf(f)); - } - - /** - * Prints a double-precision floating-point number. The string produced by - * {@link java.lang.String#valueOf(double)} is translated into - * bytes according to the platform's default character encoding, and these - * bytes are written in exactly the manner of the {@link - * #write(int)} method. - * - * @param d The double to be printed - * @see java.lang.Double#toString(double) - */ - public void print(double d) { - write(String.valueOf(d)); - } - - /** - * Prints an array of characters. The characters are converted into bytes - * according to the platform's default character encoding, and these bytes - * are written in exactly the manner of the - * {@link #write(int)} method. - * - * @param s The array of chars to be printed - * - * @throws NullPointerException If s is null - */ - public void print(char s[]) { - write(s); - } - - /** - * Prints a string. If the argument is null then the string - * "null" is printed. Otherwise, the string's characters are - * converted into bytes according to the platform's default character - * encoding, and these bytes are written in exactly the manner of the - * {@link #write(int)} method. - * - * @param s The String to be printed - */ - public void print(String s) { - if (s == null) { - s = "null"; - } - write(s); - } - - /** - * Prints an object. The string produced by the {@link - * java.lang.String#valueOf(Object)} method is translated into bytes - * according to the platform's default character encoding, and these bytes - * are written in exactly the manner of the - * {@link #write(int)} method. - * - * @param obj The Object to be printed - * @see java.lang.Object#toString() - */ - public void print(Object obj) { - write(String.valueOf(obj)); - } - - - /* Methods that do terminate lines */ - - /** - * Terminates the current line by writing the line separator string. The - * line separator string is defined by the system property - * line.separator, and is not necessarily a single newline - * character ('\n'). - */ - public void println() { - newLine(); - } - - /** - * Prints a boolean and then terminate the line. This method behaves as - * though it invokes {@link #print(boolean)} and then - * {@link #println()}. - * - * @param x The boolean to be printed - */ - public void println(boolean x) { - synchronized (this) { - print(x); - newLine(); - } - } - - /** - * Prints a character and then terminate the line. This method behaves as - * though it invokes {@link #print(char)} and then - * {@link #println()}. - * - * @param x The char to be printed. - */ - public void println(char x) { - synchronized (this) { - print(x); - newLine(); - } - } - - /** - * Prints an integer and then terminate the line. This method behaves as - * though it invokes {@link #print(int)} and then - * {@link #println()}. - * - * @param x The int to be printed. - */ - public void println(int x) { - synchronized (this) { - print(x); - newLine(); - } - } - - /** - * Prints a long and then terminate the line. This method behaves as - * though it invokes {@link #print(long)} and then - * {@link #println()}. - * - * @param x a The long to be printed. - */ - public void println(long x) { - synchronized (this) { - print(x); - newLine(); - } - } - - /** - * Prints a float and then terminate the line. This method behaves as - * though it invokes {@link #print(float)} and then - * {@link #println()}. - * - * @param x The float to be printed. - */ - public void println(float x) { - synchronized (this) { - print(x); - newLine(); - } - } - - /** - * Prints a double and then terminate the line. This method behaves as - * though it invokes {@link #print(double)} and then - * {@link #println()}. - * - * @param x The double to be printed. - */ - public void println(double x) { - synchronized (this) { - print(x); - newLine(); - } - } - - /** - * Prints an array of characters and then terminate the line. This method - * behaves as though it invokes {@link #print(char[])} and - * then {@link #println()}. - * - * @param x an array of chars to print. - */ - public void println(char x[]) { - synchronized (this) { - print(x); - newLine(); - } - } - - /** - * Prints a String and then terminate the line. This method behaves as - * though it invokes {@link #print(String)} and then - * {@link #println()}. - * - * @param x The String to be printed. - */ - public void println(String x) { - synchronized (this) { - print(x); - newLine(); - } - } - - /** - * Prints an Object and then terminate the line. This method calls - * at first String.valueOf(x) to get the printed object's string value, - * then behaves as - * though it invokes {@link #print(String)} and then - * {@link #println()}. - * - * @param x The Object to be printed. - */ - public void println(Object x) { - String s = String.valueOf(x); - synchronized (this) { - print(s); - newLine(); - } - } - - - /** - * A convenience method to write a formatted string to this output stream - * using the specified format string and arguments. - * - *

    An invocation of this method of the form out.printf(format, - * args) behaves in exactly the same way as the invocation - * - *

    -     *     out.format(format, args) 
    - * - * @param format - * A format string as described in Format string syntax - * - * @param args - * Arguments referenced by the format specifiers in the format - * string. If there are more arguments than format specifiers, the - * extra arguments are ignored. The number of arguments is - * variable and may be zero. The maximum number of arguments is - * limited by the maximum dimension of a Java array as defined by - * The Java™ Virtual Machine Specification. - * The behaviour on a - * null argument depends on the conversion. - * - * @throws java.util.IllegalFormatException - * If a format string contains an illegal syntax, a format - * specifier that is incompatible with the given arguments, - * insufficient arguments given the format string, or other - * illegal conditions. For specification of all possible - * formatting errors, see the Details section of the - * formatter class specification. - * - * @throws NullPointerException - * If the format is null - * - * @return This output stream - * - * @since 1.5 - */ - public PrintStream printf(String format, Object ... args) { - return format(format, args); - } - - /** - * A convenience method to write a formatted string to this output stream - * using the specified format string and arguments. - * - *

    An invocation of this method of the form out.printf(l, format, - * args) behaves in exactly the same way as the invocation - * - *

    -     *     out.format(l, format, args) 
    - * - * @param l - * The {@linkplain java.util.Locale locale} to apply during - * formatting. If l is null then no localization - * is applied. - * - * @param format - * A format string as described in Format string syntax - * - * @param args - * Arguments referenced by the format specifiers in the format - * string. If there are more arguments than format specifiers, the - * extra arguments are ignored. The number of arguments is - * variable and may be zero. The maximum number of arguments is - * limited by the maximum dimension of a Java array as defined by - * The Java™ Virtual Machine Specification. - * The behaviour on a - * null argument depends on the conversion. - * - * @throws java.util.IllegalFormatException - * If a format string contains an illegal syntax, a format - * specifier that is incompatible with the given arguments, - * insufficient arguments given the format string, or other - * illegal conditions. For specification of all possible - * formatting errors, see the Details section of the - * formatter class specification. - * - * @throws NullPointerException - * If the format is null - * - * @return This output stream - * - * @since 1.5 - */ - public PrintStream printf(Locale l, String format, Object ... args) { - return format(l, format, args); - } - - /** - * Writes a formatted string to this output stream using the specified - * format string and arguments. - * - *

    The locale always used is the one returned by {@link - * java.util.Locale#getDefault() Locale.getDefault()}, regardless of any - * previous invocations of other formatting methods on this object. - * - * @param format - * A format string as described in Format string syntax - * - * @param args - * Arguments referenced by the format specifiers in the format - * string. If there are more arguments than format specifiers, the - * extra arguments are ignored. The number of arguments is - * variable and may be zero. The maximum number of arguments is - * limited by the maximum dimension of a Java array as defined by - * The Java™ Virtual Machine Specification. - * The behaviour on a - * null argument depends on the conversion. - * - * @throws java.util.IllegalFormatException - * If a format string contains an illegal syntax, a format - * specifier that is incompatible with the given arguments, - * insufficient arguments given the format string, or other - * illegal conditions. For specification of all possible - * formatting errors, see the Details section of the - * formatter class specification. - * - * @throws NullPointerException - * If the format is null - * - * @return This output stream - * - * @since 1.5 - */ - public PrintStream format(String format, Object ... args) { - try { - synchronized (this) { - ensureOpen(); - if ((formatter == null) - || (formatter.locale() != Locale.getDefault())) - formatter = new Formatter((Appendable) this); - formatter.format(Locale.getDefault(), format, args); - } - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } catch (IOException x) { - trouble = true; - } - return this; - } - - /** - * Writes a formatted string to this output stream using the specified - * format string and arguments. - * - * @param l - * The {@linkplain java.util.Locale locale} to apply during - * formatting. If l is null then no localization - * is applied. - * - * @param format - * A format string as described in Format string syntax - * - * @param args - * Arguments referenced by the format specifiers in the format - * string. If there are more arguments than format specifiers, the - * extra arguments are ignored. The number of arguments is - * variable and may be zero. The maximum number of arguments is - * limited by the maximum dimension of a Java array as defined by - * The Java™ Virtual Machine Specification. - * The behaviour on a - * null argument depends on the conversion. - * - * @throws java.util.IllegalFormatException - * If a format string contains an illegal syntax, a format - * specifier that is incompatible with the given arguments, - * insufficient arguments given the format string, or other - * illegal conditions. For specification of all possible - * formatting errors, see the Details section of the - * formatter class specification. - * - * @throws NullPointerException - * If the format is null - * - * @return This output stream - * - * @since 1.5 - */ - public PrintStream format(Locale l, String format, Object ... args) { - try { - synchronized (this) { - ensureOpen(); - if ((formatter == null) - || (formatter.locale() != l)) - formatter = new Formatter(this, l); - formatter.format(l, format, args); - } - } catch (InterruptedIOException x) { - Thread.currentThread().interrupt(); - } catch (IOException x) { - trouble = true; - } - return this; - } - - /** - * Appends the specified character sequence to this output stream. - * - *

    An invocation of this method of the form out.append(csq) - * behaves in exactly the same way as the invocation - * - *

    -     *     out.print(csq.toString()) 
    - * - *

    Depending on the specification of toString for the - * character sequence csq, the entire sequence may not be - * appended. For instance, invoking then toString method of a - * character buffer will return a subsequence whose content depends upon - * the buffer's position and limit. - * - * @param csq - * The character sequence to append. If csq is - * null, then the four characters "null" are - * appended to this output stream. - * - * @return This output stream - * - * @since 1.5 - */ - public PrintStream append(CharSequence csq) { - if (csq == null) - print("null"); - else - print(csq.toString()); - return this; - } - - /** - * Appends a subsequence of the specified character sequence to this output - * stream. - * - *

    An invocation of this method of the form out.append(csq, start, - * end) when csq is not null, behaves in - * exactly the same way as the invocation - * - *

    -     *     out.print(csq.subSequence(start, end).toString()) 
    - * - * @param csq - * The character sequence from which a subsequence will be - * appended. If csq is null, then characters - * will be appended as if csq contained the four - * characters "null". - * - * @param start - * The index of the first character in the subsequence - * - * @param end - * The index of the character following the last character in the - * subsequence - * - * @return This output stream - * - * @throws IndexOutOfBoundsException - * If start or end are negative, start - * is greater than end, or end is greater than - * csq.length() - * - * @since 1.5 - */ - public PrintStream append(CharSequence csq, int start, int end) { - CharSequence cs = (csq == null ? "null" : csq); - write(cs.subSequence(start, end).toString()); - return this; - } - - /** - * Appends the specified character to this output stream. - * - *

    An invocation of this method of the form out.append(c) - * behaves in exactly the same way as the invocation - * - *

    -     *     out.print(c) 
    - * - * @param c - * The 16-bit character to append - * - * @return This output stream - * - * @since 1.5 - */ - public PrintStream append(char c) { - print(c); - return this; - } - -} diff --git a/group24/Homework/10-TenthWeek/tree/BinaryTreeNode.java b/group24/Homework/10-TenthWeek/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..467101a16f --- /dev/null +++ b/group24/Homework/10-TenthWeek/tree/BinaryTreeNode.java @@ -0,0 +1,35 @@ +package com.coding.basic.tree; + +public class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group24/Homework/10-TenthWeek/tree/BinaryTreeUtil.java b/group24/Homework/10-TenthWeek/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..b033cbe1d5 --- /dev/null +++ b/group24/Homework/10-TenthWeek/tree/BinaryTreeUtil.java @@ -0,0 +1,66 @@ +package com.coding.basic.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + +} diff --git a/group24/Homework/10-TenthWeek/tree/BinaryTreeUtilTest.java b/group24/Homework/10-TenthWeek/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..41857e137d --- /dev/null +++ b/group24/Homework/10-TenthWeek/tree/BinaryTreeUtilTest.java @@ -0,0 +1,75 @@ +package com.coding.basic.tree; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} diff --git a/group24/Homework/10-TenthWeek/tree/FileList.java b/group24/Homework/10-TenthWeek/tree/FileList.java new file mode 100644 index 0000000000..6e65192e4a --- /dev/null +++ b/group24/Homework/10-TenthWeek/tree/FileList.java @@ -0,0 +1,10 @@ +package com.coding.basic.tree; + +import java.io.File; + +public class FileList { + public void list(File f) { + } + + +} diff --git a/group24/Homework/9-NinthWeek/QuickMinStack.java b/group24/Homework/9-NinthWeek/QuickMinStack.java new file mode 100644 index 0000000000..f391d92b8f --- /dev/null +++ b/group24/Homework/9-NinthWeek/QuickMinStack.java @@ -0,0 +1,19 @@ +package com.coding.basic.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + public void push(int data){ + + } + public int pop(){ + return -1; + } + public int findMin(){ + return -1; + } +} diff --git a/group24/Homework/9-NinthWeek/StackWithTwoQueues.java b/group24/Homework/9-NinthWeek/StackWithTwoQueues.java new file mode 100644 index 0000000000..d0ab4387d2 --- /dev/null +++ b/group24/Homework/9-NinthWeek/StackWithTwoQueues.java @@ -0,0 +1,16 @@ +package com.coding.basic.stack; + + +public class StackWithTwoQueues { + + + public void push(int data) { + + } + + public int pop() { + return -1; + } + + +} diff --git a/group24/Homework/9-NinthWeek/TwoStackInOneArray.java b/group24/Homework/9-NinthWeek/TwoStackInOneArray.java new file mode 100644 index 0000000000..e86d056a24 --- /dev/null +++ b/group24/Homework/9-NinthWeek/TwoStackInOneArray.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return null; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + return null; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return null; + } + +} From b183eb4a27784e872e8a130d477694982bda87f6 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Mon, 8 May 2017 20:14:12 +0800 Subject: [PATCH 487/552] finished Tenth Week Homework --- .../donaldy/basic/tree/BinaryTreeNode.java | 35 ++++ .../donaldy/basic/tree/BinaryTreeUtil.java | 158 ++++++++++++++++++ .../basic/tree/BinaryTreeUtilTest.java | 75 +++++++++ .../src/com/donaldy/basic/tree/FileList.java | 10 ++ 4 files changed, 278 insertions(+) create mode 100644 group24/448641125/src/com/donaldy/basic/tree/BinaryTreeNode.java create mode 100644 group24/448641125/src/com/donaldy/basic/tree/BinaryTreeUtil.java create mode 100644 group24/448641125/src/com/donaldy/basic/tree/BinaryTreeUtilTest.java create mode 100644 group24/448641125/src/com/donaldy/basic/tree/FileList.java diff --git a/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeNode.java b/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..c6e1db078d --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeNode.java @@ -0,0 +1,35 @@ +package com.donaldy.basic.tree; + +public class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeUtil.java b/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..82ef6e4620 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeUtil.java @@ -0,0 +1,158 @@ +package com.donaldy.basic.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + preOrder(root, result); + + return result; + } + + private static void preOrder(BinaryTreeNode root, List result) { + + if (root == null) { + return ; + } + + result.add(root.getData()); + + preOrder(root.getLeft(), result); + + preOrder(root.getRight(), result); + + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + inOrder(root, result); + + return result; + } + + private static void inOrder(BinaryTreeNode root, List result) { + + if (root == null) { + return ; + } + + inOrder(root.getLeft(), result); + + result.add(root.getData()); + + inOrder(root.getRight(), result); + + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + postOrder(root, result); + + return result; + } + + + private static void postOrder(BinaryTreeNode root, List result) { + + if (root == null) { + return ; + } + + postOrder(root.getLeft(), result); + + postOrder(root.getRight(), result); + + result.add(root.getData()); + + } + + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + Stack treeStack = new Stack<>(); + + while (root != null || !treeStack.isEmpty()) { + + while (root != null) { + + result.add(root.getData()); + + treeStack.push(root); + + root = root.getLeft(); + } + + root = treeStack.pop(); + + root = root.getRight(); + + + } + + return result; + } + + + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + Stack treeStack = new Stack<>(); + + while (root != null || !treeStack.isEmpty()) { + + while (root != null) { + + treeStack.push(root); + + root = root.getLeft(); + + } + + root = treeStack.pop(); + + result.add(root.getData()); + + root = root.getRight(); + + } + + return result; + } + +} diff --git a/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeUtilTest.java b/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..48fae655f9 --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/tree/BinaryTreeUtilTest.java @@ -0,0 +1,75 @@ +package com.donaldy.basic.tree; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} diff --git a/group24/448641125/src/com/donaldy/basic/tree/FileList.java b/group24/448641125/src/com/donaldy/basic/tree/FileList.java new file mode 100644 index 0000000000..e93cabae5b --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/tree/FileList.java @@ -0,0 +1,10 @@ +package com.donaldy.basic.tree; + +import java.io.File; + +public class FileList { + public void list(File f) { + } + + +} From fb72152f0361edab3ba1d77420c4a8fa7a4bd001 Mon Sep 17 00:00:00 2001 From: GordenChow <513274874@qq.com> Date: Mon, 8 May 2017 21:15:04 +0800 Subject: [PATCH 488/552] =?UTF-8?q?Jvm=E7=AC=AC=E5=85=AD=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/stack/QuickMinStack.java | 42 ++++++++++++++ .../basic/stack/StackWithTwoQueues.java | 45 +++++++++++++++ .../basic/stack/TwoStackInOneArray.java | 57 +++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group27/513274874/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/QuickMinStack.java b/group27/513274874/data-structure/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..830c347ad5 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,42 @@ +package com.coding.basic.stack; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + + //存储栈中元素,升序排列,minAscList.get(0)即能取出 + private List minAscList = new ArrayList<>(); + + private Stack stack; + + public void push(int data){ + stack.push(data); + minAscList.add(data); + minAscList.sort(new Comparator() { + @Override + public int compare(Integer o1, Integer o2) { + return o1.compareTo(o2); + } + }); + } + public int pop(){ + + int val = (Integer)stack.pop(); + minAscList.remove(new Integer(val)); + + return val; + } + public int findMin(){ + return minAscList.get(0); + } + + +} \ No newline at end of file diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java b/group27/513274874/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..fef1b31bbd --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack; + + +import com.coding.basic.queue.Queue; + +public class StackWithTwoQueues { + + Queue q1 = new Queue<>(); + Queue q2 = new Queue<>(); + + + public void push(int data) { + if (q1.isEmpty()) { + q2.enQueue(data); + } else { + q1.enQueue(data); + } + } + + public int pop() { + if (!q1.isEmpty()) { + while (!q1.isEmpty()) { + int val = q1.deQueue(); + if (q1.isEmpty()) { + q2.enQueue(val); + } else { + return val; + } + } + } else { + while (!q2.isEmpty()) { + int val = q2.deQueue(); + if (!q2.isEmpty()) { + q1.enQueue(val); + } else { + return val; + } + } + + } + return 0; + } + + +} \ No newline at end of file diff --git a/group27/513274874/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java b/group27/513274874/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..4d311762f6 --- /dev/null +++ b/group27/513274874/data-structure/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + return null; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + return null; + } + /** + * 获取第二个栈的栈顶元素 + * @return + */ + + public Object peek2(){ + return null; + } + +} \ No newline at end of file From 31269d1398e5dec21232ad1a99e04c938117c6fb Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Tue, 9 May 2017 08:38:39 +0800 Subject: [PATCH 489/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/linklist/LinkedList.java | 60 ++++++++------- .../com/coding/basic/stack/QuickMinStack.java | 28 ++++++- .../basic/stack/StackWithTwoQueues.java | 30 +++++++- .../basic/stack/TwoStackInOneArray.java | 74 +++++++++++++++++-- 4 files changed, 150 insertions(+), 42 deletions(-) diff --git a/group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java b/group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java index 7a36a83263..c01589f572 100644 --- a/group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java +++ b/group27/383117348/data-structure/com/coding/basic/linklist/LinkedList.java @@ -1,6 +1,5 @@ package com.coding.basic.linklist; -import java.util.Arrays; import java.util.NoSuchElementException; import org.junit.Test; @@ -123,43 +122,42 @@ public void addLast(Object o) { * * @return */ - public Object removeFirst() { - Node node = first; - if (node == null) - throw new NoSuchElementException(); - else { - Node next = node.next; - if (next == null) - first = null; - else { - first = next; - first.prev = null; - } - } - size--; - return node.data; + public Object removeFirst(){ + final Node f = first; + if (f == null) + throw new NoSuchElementException(); + final Object element = f.data; + final Node next = f.next; + f.data = null; + f.next = null; // help GC + first = next; + if (next == null) + last = null; + else + next.prev = null; + size--; + return element; } - /** * 移除链表最后一个元素 * * @return */ public Object removeLast() { - Node node = last; - if (last == null) - throw new NoSuchElementException(); - else { - Node prev = node.prev; - if (prev == null) - last = null; - else { - last = prev; - last.next = null; - } - } - size--; - return node.data; + final Node l = last; + if (l == null) + throw new NoSuchElementException(); + final Object element = l.data; + final Node prev = l.prev; + l.data = null; + l.prev = null; + last = prev; + if (prev == null) + first = null; + else + prev.next = null; + size--; + return element; } /** diff --git a/group27/383117348/data-structure/com/coding/basic/stack/QuickMinStack.java b/group27/383117348/data-structure/com/coding/basic/stack/QuickMinStack.java index 4f257ab9fb..13eb6a2cbf 100644 --- a/group27/383117348/data-structure/com/coding/basic/stack/QuickMinStack.java +++ b/group27/383117348/data-structure/com/coding/basic/stack/QuickMinStack.java @@ -3,17 +3,41 @@ /** * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * * @author liuxin * */ +import java.util.Stack; + public class QuickMinStack { + + private Stack normalStack = new Stack(); + private Stack minNumStack = new Stack(); + public void push(int data){ + normalStack.push(data); + + if(minNumStack.isEmpty()){ + minNumStack.push(data); + } else{ + if(minNumStack.peek() >= data) { + minNumStack.push(data); + } + } + } public int pop(){ - return -1; + if(normalStack.isEmpty()){ + throw new RuntimeException("the stack is empty"); + } + int value = normalStack.pop(); + if(value == minNumStack.peek()){ + minNumStack.pop(); + } + return value; } public int findMin(){ - return -1; + return minNumStack.peek(); } } diff --git a/group27/383117348/data-structure/com/coding/basic/stack/StackWithTwoQueues.java b/group27/383117348/data-structure/com/coding/basic/stack/StackWithTwoQueues.java index 6f1d5bd04d..a8c5e37387 100644 --- a/group27/383117348/data-structure/com/coding/basic/stack/StackWithTwoQueues.java +++ b/group27/383117348/data-structure/com/coding/basic/stack/StackWithTwoQueues.java @@ -1,15 +1,39 @@ package com.coding.basic.stack; +import com.coding.basic.queue.Queue; public class StackWithTwoQueues { - + /*private QueueWithTwoStacks first; + private QueueWithTwoStacks end;*/ + private Queue first; + private Queue end; + + public StackWithTwoQueues(){ + first = new Queue(); + end = new Queue(); + } + public void push(int data) { - + first.enQueue(data); } public int pop() { - return -1; + int result = 0; + if(first.isEmpty()){ + throw new NullPointerException("空栈!"); + } + while(!first.isEmpty()){ + if(first.size()==1){ + result = (Integer)first.deQueue(); + }else{ + end.enQueue(first.deQueue()); + } + } + while(!end.isEmpty()){ + first.enQueue(end.deQueue()); + } + return result; } diff --git a/group27/383117348/data-structure/com/coding/basic/stack/TwoStackInOneArray.java b/group27/383117348/data-structure/com/coding/basic/stack/TwoStackInOneArray.java index 53a902ba17..33b65f82de 100644 --- a/group27/383117348/data-structure/com/coding/basic/stack/TwoStackInOneArray.java +++ b/group27/383117348/data-structure/com/coding/basic/stack/TwoStackInOneArray.java @@ -1,5 +1,7 @@ package com.coding.basic.stack; +import java.util.NoSuchElementException; + /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 @@ -9,19 +11,31 @@ public class TwoStackInOneArray { Object[] data = new Object[10]; + private static final int GROW_UP_SIZE = 100; + private int index1 =0; + private int index2 = data.length-1; /** * 向第一个栈中压入元素 * @param o */ public void push1(Object o){ - + if(o!=null){ + checkIsMeeting(index1); + data[index1++] = o; + }else{ + throw new NullPointerException(); + } } /** * 从第一个栈中弹出元素 * @return */ public Object pop1(){ - return null; + if(index1==0) + throw new NoSuchElementException(); + Object first = data[index1-1]; + data[index1--] = null; + return first; } /** @@ -30,20 +44,31 @@ public Object pop1(){ */ public Object peek1(){ - return null; + if(index1==0) + throw new NoSuchElementException(); + return data[index1-1]; } /* * 向第二个栈压入元素 */ public void push2(Object o){ - + if(o!=null){ + checkIsMeeting(index2); + data[index2--] = o; + }else{ + throw new NoSuchElementException(); + } } /** * 从第二个栈弹出元素 * @return */ public Object pop2(){ - return null; + if(index2==data.length-1) + throw new NoSuchElementException(); + Object last = data[index2+1]; + data[index2++] = null; + return last; } /** * 获取第二个栈的栈顶元素 @@ -51,7 +76,44 @@ public Object pop2(){ */ public Object peek2(){ - return null; + if(index2==data.length-1) + throw new NoSuchElementException(); + return data[index2+1]; + } + + public int getSize(){ + System.out.println(index1); + System.out.println(index2); + return (index1-0)+(data.length-1-index2); + } + + /** + * 检查是否碰头 + */ + private void checkIsMeeting(int index){ + if(data[index]!=null){ + growUp(); + } + } + + /** + * 检查数组长度是否越界,越界就自动增长100 + */ + private void growUp() { + Object[] elementGrow = new Object[data.length + GROW_UP_SIZE]; + int start = 0; + int end = elementGrow.length-1; + if(index1!=0) + while(data[index1-1]!=null){ + elementGrow[start++] = pop1(); + } + if(index2!=data.length-1) + while(data[index2+1]!=null){ + elementGrow[end--] = pop2(); + } + data = elementGrow; + index1 = start; + index2 = end; } } From 309244b777c0070925066c39f0c1a356bf5b222e Mon Sep 17 00:00:00 2001 From: zhanglei <383117348@qq.com> Date: Tue, 9 May 2017 08:39:16 +0800 Subject: [PATCH 490/552] =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stack/test/StackWithTwoQueuesTest.java | 24 +++++++++++++ .../stack/test/TwoStackInOneArrayTest.java | 35 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/test/StackWithTwoQueuesTest.java create mode 100644 group27/383117348/data-structure/com/coding/basic/stack/test/TwoStackInOneArrayTest.java diff --git a/group27/383117348/data-structure/com/coding/basic/stack/test/StackWithTwoQueuesTest.java b/group27/383117348/data-structure/com/coding/basic/stack/test/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..eb09709f21 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/test/StackWithTwoQueuesTest.java @@ -0,0 +1,24 @@ +package com.coding.basic.stack.test; + +import java.util.LinkedList; + +import org.junit.Test; + +import com.coding.basic.stack.StackWithTwoQueues; + +import junit.framework.Assert; + +public class StackWithTwoQueuesTest { + + @Test + public void testTwoQueuesStack(){ + StackWithTwoQueues swq = new StackWithTwoQueues(); + swq.push(3); + swq.push(7); + swq.push(10); + LinkedList list = null; + Assert.assertEquals(10, swq.pop()); + Assert.assertEquals(7, swq.pop()); + Assert.assertEquals(3, swq.pop()); + } +} diff --git a/group27/383117348/data-structure/com/coding/basic/stack/test/TwoStackInOneArrayTest.java b/group27/383117348/data-structure/com/coding/basic/stack/test/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..6f9643eaf7 --- /dev/null +++ b/group27/383117348/data-structure/com/coding/basic/stack/test/TwoStackInOneArrayTest.java @@ -0,0 +1,35 @@ +package com.coding.basic.stack.test; + +import org.junit.Test; + +import com.coding.basic.stack.TwoStackInOneArray; + +import junit.framework.Assert; + +public class TwoStackInOneArrayTest { + + @Test + public void testTwoStack(){ + TwoStackInOneArray tso = new TwoStackInOneArray(); + tso.push1("aaa"); + tso.push1("bbb"); + tso.push1("ccc"); + tso.push1("ddd"); + tso.push2("zzz"); + tso.push2("yyy"); + Assert.assertEquals(6, tso.getSize()); + Assert.assertEquals("ddd", tso.pop1()); + Assert.assertEquals("ccc", tso.pop1()); + Assert.assertEquals("bbb", tso.pop1()); + Assert.assertEquals("aaa", tso.pop1()); + Assert.assertEquals("yyy", tso.pop2()); + Assert.assertEquals("zzz", tso.pop2()); + tso.push2("abcd"); + tso.push2("bcdf"); + Assert.assertEquals("bcdf", tso.pop2()); + Assert.assertEquals("abcd", tso.pop2()); + Assert.assertEquals(0, tso.getSize()); + + } + +} From ff7608719aedbf5b68a43076ee63389965da950a Mon Sep 17 00:00:00 2001 From: sulei Date: Tue, 9 May 2017 11:39:03 +0800 Subject: [PATCH 491/552] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 作业修正 --- .../src/com/coding/basic/queue/Josephus.java | 4 +- .../com/coding/basic/queue/JosephusTest.java | 16 ++++ .../coding/basic/stack/expr/InfixExpr.java | 3 +- .../coding/basic/stack/expr/PostfixExpr.java | 1 + .../basic/stack/expr/PostfixExprTest.java | 2 +- .../coding/basic/stack/expr/TokenParser.java | 5 +- .../coding/basic/stack/myself/InfixExpr.java | 73 +++++++++++++++++ .../basic/stack/myself/InfixExprTest.java | 52 ++++++++++++ .../basic/stack/myself/InfixToPostfix.java | 79 +++++++++++++++++++ .../stack/myself/InfixToPostfixTest.java | 40 ++++++++++ .../basic/stack/myself/PostfixExpr.java | 49 ++++++++++++ .../basic/stack/myself/PostfixExprTest.java | 41 ++++++++++ .../coding/basic/stack/myself/PrefixExpr.java | 59 ++++++++++++++ .../basic/stack/myself/PrefixExprTest.java | 45 +++++++++++ .../com/coding/basic/stack/myself/Token.java | 50 ++++++++++++ .../basic/stack/myself/TokenParser.java | 57 +++++++++++++ .../basic/stack/myself/TokenParserTest.java | 41 ++++++++++ .../basic/stack/myselfQueue/CircleQueue.java | 62 +++++++++++++++ .../stack/myselfQueue/CircleQueueTest.java | 44 +++++++++++ .../basic/stack/myselfQueue/Josephus.java | 35 ++++++++ .../basic/stack/myselfQueue/JosephusTest.java | 27 +++++++ .../coding/basic/stack/myselfQueue/Queue.java | 61 ++++++++++++++ .../stack/myselfQueue/QueueWithTwoStacks.java | 63 +++++++++++++++ 23 files changed, 901 insertions(+), 8 deletions(-) create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixExpr.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixExprTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixToPostfix.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixToPostfixTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PostfixExpr.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PostfixExprTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PrefixExpr.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PrefixExprTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/Token.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/TokenParser.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/TokenParserTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/CircleQueue.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/CircleQueueTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/Josephus.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/JosephusTest.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/Queue.java create mode 100644 group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/QueueWithTwoStacks.java diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Josephus.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Josephus.java index 36ec615d36..497abc5f07 100644 --- a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Josephus.java +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/Josephus.java @@ -21,7 +21,7 @@ public static List execute(int n, int m){ List result = new ArrayList(); int i = 0; - while (!queue.isEmpty()) { + while (!queue.isEmpty() && queue.size() > 1) { int x = queue.deQueue(); @@ -32,7 +32,7 @@ public static List execute(int n, int m){ } } - + System.out.println(result); return result; } diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/JosephusTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/JosephusTest.java index 7d90318b51..5c2cf2cbec 100644 --- a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/JosephusTest.java +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/queue/JosephusTest.java @@ -5,6 +5,8 @@ import org.junit.Before; import org.junit.Test; +import com.coding.basic.stack.myselfQueue.QueueWithTwoStacks; + public class JosephusTest { @@ -23,5 +25,19 @@ public void testExecute() { Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); } + + @Test + public void testTwoStackQueue(){ + QueueWithTwoStacks q = new QueueWithTwoStacks(); + q.enQueue(1); + q.enQueue(2); + q.enQueue(3); + q.enQueue(4); + + System.out.println(q.deQueue()); + System.out.println(q.deQueue()); + System.out.println(q.deQueue()); + System.out.println(q.deQueue()); + } } diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExpr.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExpr.java index cebef21fa3..777a2f8014 100644 --- a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExpr.java +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/InfixExpr.java @@ -17,8 +17,9 @@ public float evaluate() { TokenParser parser = new TokenParser(); List tokens = parser.parse(this.expr); - + //存放操作符栈 Stack opStack = new Stack<>(); + //操作数据值栈 Stack numStack = new Stack<>(); for(Token token : tokens){ diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExpr.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExpr.java index c54eb69e2a..d65121633f 100644 --- a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExpr.java +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -17,6 +17,7 @@ public float evaluate() { Stack numStack = new Stack<>(); for(Token token : tokens){ + System.out.println(token+"----"); if(token.isNumber()){ numStack.push(new Float(token.getIntValue())); } else{ diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExprTest.java index c0435a2db5..0fc55de6fd 100644 --- a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExprTest.java +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -22,7 +22,7 @@ public void tearDown() throws Exception { @Test public void testEvaluate() { { - PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + * "); Assert.assertEquals(288, expr.evaluate(),0.0f); } { diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParser.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParser.java index d3b0f167e1..7a6cb2598e 100644 --- a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParser.java +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/expr/TokenParser.java @@ -10,11 +10,9 @@ public List parse(String expr) { List tokens = new ArrayList<>(); int i = 0; - while (i < expr.length()) { - + char c = expr.charAt(i); - if (isOperator(c)) { Token t = new Token(Token.OPERATOR, String.valueOf(c)); @@ -22,7 +20,6 @@ public List parse(String expr) { i++; } else if (Character.isDigit(c)) { - int nextOperatorIndex = indexOfNextOperator(i, expr); String value = expr.substring(i, nextOperatorIndex); Token t = new Token(Token.NUMBER, value); diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixExpr.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixExpr.java new file mode 100644 index 0000000000..0611a75c0a --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixExpr.java @@ -0,0 +1,73 @@ +package com.coding.basic.stack.myself; + +import java.util.List; +import java.util.Stack; + +import com.coding.basic.stack.myself.Token; + +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + //存放操作符栈 + Stack opStack = new Stack<>(); + //操作数据值栈 + Stack numStack = new Stack<>(); + + for (Token token:tokens){ + //当前的token代表的是操作符时 + if (token.isOperator()){ + //当前操作符栈不为空并且当前操作符并不比栈顶优先级更高 + while (!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token preOperate = opStack.pop(); + float f2 = numStack.pop(); + float f1 = numStack.pop(); + float result = calculate(preOperate.toString(), f1, f2); + numStack.push(result); + } + opStack.push(token); + } + + if (token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + + + } + while (!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + + return numStack.pop().floatValue(); + + } + + public float calculate(String op, float f1, float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixExprTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixExprTest.java new file mode 100644 index 0000000000..b0a58bcd0d --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.myself; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixToPostfix.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixToPostfix.java new file mode 100644 index 0000000000..b2a5206c81 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixToPostfix.java @@ -0,0 +1,79 @@ +package com.coding.basic.stack.myself; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coding.basic.stack.myself.Token; + +public class InfixToPostfix { + + public static List convert(String expr) { + /*List infixPost = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList<>(); + + Stack opStack = new Stack(); + //2-3*4+5 + for (Token token:infixPost){ + if(token.isOperator()){ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + System.out.println("满足条件的token"+token); + postFixTokens.add(opStack.pop());// + } + + opStack.push(token);//- + + } + + if(token.isNumber()){ + + postFixTokens.add(token);//2 3 + + } + } + + while (!opStack.isEmpty()){ + + postFixTokens.add(opStack.pop()); + + } + + return postFixTokens;*/ + + List infixPost = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList(); + + Stack openStack = new Stack(); + + for (Token token:infixPost){ + + if (token.isOperator()){ + + while (!openStack.isEmpty() + && !token.hasHigherPriority(openStack.peek())){ + postFixTokens.add(openStack.pop()); + } + + openStack.push(token); + } + + if (token.isNumber()){ + + postFixTokens.add(token); + } + } + + while (!openStack.isEmpty()){ + postFixTokens.add(openStack.pop()); + } + + return postFixTokens; + } + + + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixToPostfixTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixToPostfixTest.java new file mode 100644 index 0000000000..c2b1aedacc --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/InfixToPostfixTest.java @@ -0,0 +1,40 @@ +package com.coding.basic.stack.myself; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PostfixExpr.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PostfixExpr.java new file mode 100644 index 0000000000..9fc596ef64 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PostfixExpr.java @@ -0,0 +1,49 @@ +package com.coding.basic.stack.myself; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { + String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack numStack = new Stack(); + for (Token token:tokens){ + if (token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + }else{ + float f2 = numStack.pop(); + float f1 = numStack.pop(); + float result = calculate(token.toString(), f1, f2); + numStack.push(result); + } + + + } + return numStack.pop().floatValue(); + } + + public float calculate(String op, float f1, float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PostfixExprTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PostfixExprTest.java new file mode 100644 index 0000000000..2353fae242 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.myself; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PrefixExpr.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PrefixExpr.java new file mode 100644 index 0000000000..dcce38cfce --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PrefixExpr.java @@ -0,0 +1,59 @@ +package com.coding.basic.stack.myself; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coding.basic.stack.myself.Token; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(expr); + + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for(Token token : tokens){ + exprStack.push(token); + } + + while(!exprStack.isEmpty()){ + Token t = exprStack.pop(); + if(t.isNumber()){ + numStack.push(new Float(t.getIntValue())); + }else{ + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(t.toString(),f1,f2)); + + } + } + return numStack.pop().floatValue(); + + } + + + public float calculate(String op, float f1, float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PrefixExprTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PrefixExprTest.java new file mode 100644 index 0000000000..694904d686 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.myself; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/Token.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/Token.java new file mode 100644 index 0000000000..9c81783697 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/Token.java @@ -0,0 +1,50 @@ +package com.coding.basic.stack.myself; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/TokenParser.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/TokenParser.java new file mode 100644 index 0000000000..c6a96986fd --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/TokenParser.java @@ -0,0 +1,57 @@ +package com.coding.basic.stack.myself; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + //返回下一个操作数的位置 + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/TokenParserTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/TokenParserTest.java new file mode 100644 index 0000000000..84a0df926b --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myself/TokenParserTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.myself; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/CircleQueue.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/CircleQueue.java new file mode 100644 index 0000000000..42a13baed3 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/CircleQueue.java @@ -0,0 +1,62 @@ +package com.coding.basic.stack.myselfQueue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + //用数组来保存循环队列的元素 + private Object[] elementData; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + private int size = 0; + + public CircleQueue(int capcility){ + elementData = new Object[capcility]; + } + + public boolean isEmpty() { + + return front == rear; + + } + + public boolean isFull(){ + return size == elementData.length; + } + + public int size() { + + return size; + } + + + + public void enQueue(E data) { + if (isFull()){ + throw new RuntimeException("the queue is full"); + } + + elementData[rear++] = data; + size++; + } + + public E deQueue() { + if (isEmpty()){ + throw new RuntimeException("the queue is empty"); + } + E data = (E) elementData[front]; + elementData[front] = null; + front = (front + 1) % elementData.length; + size --; + return data; + + } +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/CircleQueueTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/CircleQueueTest.java new file mode 100644 index 0000000000..f7ebe87fb3 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/CircleQueueTest.java @@ -0,0 +1,44 @@ +package com.coding.basic.stack.myselfQueue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class CircleQueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(5); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertTrue(queue.isFull()); + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/Josephus.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/Josephus.java new file mode 100644 index 0000000000..ce1187cf02 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/Josephus.java @@ -0,0 +1,35 @@ +package com.coding.basic.stack.myselfQueue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + List result = new ArrayList(); + Queue queue = new Queue(); + for (int i = 0; i < n; i++){ + queue.enQueue(i); + } + int x = 0; + while (queue.size() > 1){ + int data = queue.deQueue(); + + if (++x % m == 0){ + result.add(data); + }else { + queue.enQueue(data); + } + } + + return result; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/JosephusTest.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/JosephusTest.java new file mode 100644 index 0000000000..273b6456bc --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.stack.myselfQueue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/Queue.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/Queue.java new file mode 100644 index 0000000000..47410c6070 --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/Queue.java @@ -0,0 +1,61 @@ +package com.coding.basic.stack.myselfQueue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/QueueWithTwoStacks.java b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..59e141991d --- /dev/null +++ b/group04/1020483199/HomeworkSuppned/src/com/coding/basic/stack/myselfQueue/QueueWithTwoStacks.java @@ -0,0 +1,63 @@ +package com.coding.basic.stack.myselfQueue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + + + public int size() { + return stack1.size() + stack2.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if (stack2.isEmpty()){ + stack2 = convert(stack1); + } + + E pop = stack2.pop(); + return pop; + } + + + + + private Stack convert(Stack stack) { + Stack newStack = new Stack(); + while (!stack.isEmpty()){ + newStack.push(stack.pop()); + } + return newStack; + } + + + + } + From 26aaba9ed4f27a5e2aa422d982c9538abc3ad051 Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Tue, 9 May 2017 16:42:21 +0800 Subject: [PATCH 492/552] the sixth homework --JVM3 Field and Method Parse --- group19/1294642551/src/jvm/attr/CodeAttr.java | 90 ++++++++++++++++++ .../src/jvm/attr/LineNumberTable.java | 71 ++++++++++++++ .../src/jvm/attr/LocalVariableItem.java | 52 ++++++++++ .../src/jvm/attr/LocalVariableTable.java | 58 +++++++++++ group19/1294642551/src/jvm/field/Field.java | 49 ++++++++++ .../src/jvm/loader/ClassFileParser.java | 95 +++++++++++-------- group19/1294642551/src/jvm/method/Method.java | 94 ++++++++++++++++++ .../test/jvm/ClassFileloaderTest.java | 73 ++++++++++++++ 8 files changed, 543 insertions(+), 39 deletions(-) create mode 100644 group19/1294642551/src/jvm/attr/CodeAttr.java create mode 100644 group19/1294642551/src/jvm/attr/LineNumberTable.java create mode 100644 group19/1294642551/src/jvm/attr/LocalVariableItem.java create mode 100644 group19/1294642551/src/jvm/attr/LocalVariableTable.java create mode 100644 group19/1294642551/src/jvm/field/Field.java create mode 100644 group19/1294642551/src/jvm/method/Method.java diff --git a/group19/1294642551/src/jvm/attr/CodeAttr.java b/group19/1294642551/src/jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..8552e5d17f --- /dev/null +++ b/group19/1294642551/src/jvm/attr/CodeAttr.java @@ -0,0 +1,90 @@ +package jvm.attr; + +import jvm.clz.ClassFile; +import jvm.cmd.ByteCodeCommand; +import jvm.cmd.CommandParser; +import jvm.constant.ConstantPool; +import jvm.loader.ByteCodeIterator; + + +public class CodeAttr extends AttributeInfo { + private int maxStack ; + private int maxLocals ; + private int codeLen ; + private String code; + public String getCode() { + return code; + } + + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + iter.back(2); + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + int exceptionLen = iter.nextU2ToInt(); + int childAttrLen = iter.nextU2ToInt(); + + + for(int i = 0; i < childAttrLen; i++){ + int childAttrNameIndex = iter.nextU2ToInt(); + String childAttrName = clzFile.getConstantPool().getUTF8String(childAttrNameIndex); + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(childAttrName)){ + LineNumberTable lineNumberTable = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(lineNumberTable); + }else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(childAttrName)){ + LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(localVariableTable); + }else{ + throw new RuntimeException("code 的子属性 "+ childAttrName+"没有解析"); + } + } + return codeAttr; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); +// for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; + int lineNum; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + iter.back(2); + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + LineNumberTable lineNumberTable = new LineNumberTable(attrNameIndex, attrLen); + + int itemLen = iter.nextU2ToInt(); + for(int i = 0; i < itemLen; i++){ + LineNumberItem item = new LineNumberItem(); + int startPC = iter.nextU2ToInt(); + int lineNumber = iter.nextU2ToInt(); + item.setStartPC(startPC); + item.setLineNum(lineNumber); + + lineNumberTable.addLineNumberItem(item); + + } + + return lineNumberTable; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group19/1294642551/src/jvm/attr/LocalVariableItem.java b/group19/1294642551/src/jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..96dde8a0d2 --- /dev/null +++ b/group19/1294642551/src/jvm/attr/LocalVariableItem.java @@ -0,0 +1,52 @@ +package jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + + + + public LocalVariableItem(int startPC, int length, int nameIndex, + int descIndex, int index) { + super(); + this.startPC = startPC; + this.length = length; + this.nameIndex = nameIndex; + this.descIndex = descIndex; + this.index = index; + } + + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group19/1294642551/src/jvm/attr/LocalVariableTable.java b/group19/1294642551/src/jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..28d41fcd26 --- /dev/null +++ b/group19/1294642551/src/jvm/attr/LocalVariableTable.java @@ -0,0 +1,58 @@ +package jvm.attr; + + +import java.util.ArrayList; +import java.util.List; + +import jvm.constant.ConstantPool; + +import jvm.loader.ByteCodeIterator; + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + iter.back(2); + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int itemLen = iter.nextU2ToInt(); + LocalVariableTable localVariableTable = new LocalVariableTable(attrNameIndex, attrLen); + + for(int i = 0; i < itemLen; i++){ + int startPC = iter.nextU2ToInt(); + int length = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int slotIndex = iter.nextU2ToInt(); + LocalVariableItem item = new LocalVariableItem(startPC, length, nameIndex, descIndex, slotIndex); + localVariableTable.addLocalVariableItem(item); + + } + + return localVariableTable; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group19/1294642551/src/jvm/field/Field.java b/group19/1294642551/src/jvm/field/Field.java new file mode 100644 index 0000000000..edb9051797 --- /dev/null +++ b/group19/1294642551/src/jvm/field/Field.java @@ -0,0 +1,49 @@ +package jvm.field; + +import jvm.constant.ConstantPool; +import jvm.constant.UTF8Info; +import jvm.loader.ByteCodeIterator; + + +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group19/1294642551/src/jvm/loader/ClassFileParser.java b/group19/1294642551/src/jvm/loader/ClassFileParser.java index f282790d0e..2eb1552c2e 100644 --- a/group19/1294642551/src/jvm/loader/ClassFileParser.java +++ b/group19/1294642551/src/jvm/loader/ClassFileParser.java @@ -2,6 +2,8 @@ +import java.io.UnsupportedEncodingException; + import jvm.clz.AccessFlag; import jvm.clz.ClassFile; import jvm.clz.ClassIndex; @@ -14,9 +16,13 @@ import jvm.constant.NullConstantInfo; import jvm.constant.StringInfo; import jvm.constant.UTF8Info; +import jvm.field.Field; +import jvm.method.Method; public class ClassFileParser { + private ConstantPool constantPool; + public ClassFile parse(byte[] codes) { @@ -24,13 +30,10 @@ public ClassFile parse(byte[] codes) { ByteCodeIterator iter = new ByteCodeIterator(codes); iter.nextUxToHexString(4); - int minorVersion = getMinorVersion(iter); - clzFile.setMinorVersion(minorVersion); - - int majorVersion = getMajorVersion(iter); - clzFile.setMajorVersion(majorVersion); + clzFile.setMinorVersion(iter.nextU2ToInt()); + clzFile.setMajorVersion(iter.nextU2ToInt()); - ConstantPool constantPool = parseConstantPool(iter); + this.constantPool = parseConstantPool(iter); clzFile.setConstPool(constantPool); AccessFlag accessFlag = parseAccessFlag(iter); @@ -39,20 +42,17 @@ public ClassFile parse(byte[] codes) { ClassIndex clzIndex = parseClassInfex(iter); clzFile.setClassIndex(clzIndex); + parseInterfaces(iter);//接口 + + parseFileds(clzFile, iter); + + parseMethods(clzFile, iter); + + + return clzFile; } - // 次版本号 - private int getMinorVersion(ByteCodeIterator iter){ - int minorVersion = iter.nextU2ToInt(); - return minorVersion; - } - - // 主版本号 - private int getMajorVersion(ByteCodeIterator iter){ - int majorVersion = iter.nextU2ToInt(); - return majorVersion; - } // 访问标志 @@ -87,13 +87,13 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { if(type == 1){ UTF8Info utf8Info = new UTF8Info(constantPool); int length = iter.nextU2ToInt(); - int[] codes = new int[length]; - StringBuilder sb = new StringBuilder(); - for(int j = 0; j < length; j++){ - codes[j] = iter.nextU1toInt(); - sb.append((char)codes[j]); + byte[] data = iter.getBytes(length); + String value = null; + try { + value = new String(data, "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); } - String value = sb.toString(); utf8Info.setLength(length); utf8Info.setValue(value); @@ -101,38 +101,30 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { }else if(type == 7){ ClassInfo classInfo = new ClassInfo(constantPool); - int utf8Index = iter.nextU2ToInt(); - classInfo.setUtf8Index(utf8Index); + classInfo.setUtf8Index(iter.nextU2ToInt()); constantInfo = classInfo; }else if(type == 8){ StringInfo stringInfo = new StringInfo(constantPool); - int index = iter.nextU2ToInt(); - stringInfo.setIndex(index); + stringInfo.setIndex(iter.nextU2ToInt()); constantInfo = stringInfo; }else if(type == 9){ FieldRefInfo fieldRefInfo = new FieldRefInfo(constantPool); - int classInfoIndex = iter.nextU2ToInt(); - int nameAndTypeIndex = iter.nextU2ToInt(); - fieldRefInfo.setClassInfoIndex(classInfoIndex); - fieldRefInfo.setNameAndTypeIndex(nameAndTypeIndex); + fieldRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + fieldRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); constantInfo = fieldRefInfo; }else if(type == 10){ MethodRefInfo methodRefInfo = new MethodRefInfo(constantPool); - int classInfoIndex = iter.nextU2ToInt(); - int nameAndTypeIndex = iter.nextU2ToInt(); - methodRefInfo.setClassInfoIndex(classInfoIndex); - methodRefInfo.setNameAndTypeIndex(nameAndTypeIndex); + methodRefInfo.setClassInfoIndex(iter.nextU2ToInt()); + methodRefInfo.setNameAndTypeIndex(iter.nextU2ToInt()); constantInfo = methodRefInfo; }else if(type == 12){ NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(constantPool); - int nameIndex = iter.nextU2ToInt(); - int descIndex = iter.nextU2ToInt(); - nameAndTypeInfo.setIndex1(nameIndex); - nameAndTypeInfo.setIndex2(descIndex); + nameAndTypeInfo.setIndex1(iter.nextU2ToInt()); + nameAndTypeInfo.setIndex2(iter.nextU2ToInt()); constantInfo = nameAndTypeInfo; }else{ @@ -145,7 +137,32 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { return constantPool; } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); +// System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { + int fieldCount = iter.nextU2ToInt(); + for(int i = 0; i < fieldCount; i++){ + Field field = Field.parse(constantPool, iter); + clzFile.addField(field); + } + + } + + private void parseMethods(ClassFile clzFile, ByteCodeIterator iter) { + int methodCount = iter.nextU2ToInt(); + for(int i = 0; i < methodCount; i++){ + Method method = Method.parse(clzFile, iter); + clzFile.addMethod(method); + } + + + } } diff --git a/group19/1294642551/src/jvm/method/Method.java b/group19/1294642551/src/jvm/method/Method.java new file mode 100644 index 0000000000..e2f4a9cbd4 --- /dev/null +++ b/group19/1294642551/src/jvm/method/Method.java @@ -0,0 +1,94 @@ +package jvm.method; + +import jvm.clz.ClassFile; +import jvm.attr.AttributeInfo; +import jvm.attr.CodeAttr; +import jvm.constant.ConstantPool; +import jvm.constant.UTF8Info; +import jvm.loader.ByteCodeIterator; + + + +public class Method { + + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + + private CodeAttr codeAttr; + + private ClassFile clzFile; + + + public ClassFile getClzFile() { + return clzFile; + } + + public int getNameIndex() { + return nameIndex; + } + public int getDescriptorIndex() { + return descriptorIndex; + } + + public CodeAttr getCodeAttr() { + return codeAttr; + } + + public void setCodeAttr(CodeAttr code) { + this.codeAttr = code; + } + + + + public Method(ClassFile clzFile,int accessFlag, int nameIndex, int descriptorIndex) { + this.clzFile = clzFile; + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + } + + + + + + public String toString() { + + ConstantPool pool = this.clzFile.getConstantPool(); + StringBuilder buffer = new StringBuilder(); + + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + + buffer.append(name).append(":").append(desc).append("\n"); + + buffer.append(this.codeAttr.toString(pool)); + + return buffer.toString(); + } + + public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attributeCount = iter.nextU2ToInt(); + + Method method = new Method(clzFile, accessFlag, nameIndex, descIndex); + for(int i = 0; i < attributeCount; i++){ + int attrNameIndex = iter.nextU2ToInt(); + String attributeName = clzFile.getConstantPool().getUTF8String(attrNameIndex); + if(AttributeInfo.CODE.equalsIgnoreCase(attributeName)){ + CodeAttr codeAttr = CodeAttr.parse(clzFile, iter); + method.setCodeAttr(codeAttr); + }else{ + throw new RuntimeException("Method 中的属性"+attributeName+"未定义"); + } + } + + + return method; + + } + +} diff --git a/group19/1294642551/test/jvm/ClassFileloaderTest.java b/group19/1294642551/test/jvm/ClassFileloaderTest.java index d7e2312925..be5ae2ae7c 100644 --- a/group19/1294642551/test/jvm/ClassFileloaderTest.java +++ b/group19/1294642551/test/jvm/ClassFileloaderTest.java @@ -1,6 +1,8 @@ package jvm; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -13,7 +15,9 @@ import jvm.constant.MethodRefInfo; import jvm.constant.NameAndTypeInfo; import jvm.constant.UTF8Info; +import jvm.field.Field; import jvm.loader.ClassFileLoader; +import jvm.method.Method; @@ -191,6 +195,75 @@ public void testClassIndex(){ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } } From 1d760dfe606b87ed92065ffe81b5b080ecc11138 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 9 May 2017 17:44:38 +0800 Subject: [PATCH 493/552] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/dataStructure/BinaryTreeNode.java | 58 --------- .../binaryTree/BinaryTreeNode.java | 104 +++++++++++++++ .../binaryTree/BinaryTreeUtil.java | 120 ++++++++++++++++++ .../dataStructure/binaryTree/FileList.java | 10 ++ .../binaryTree/BinaryTreeUtilTest.java | 77 +++++++++++ .../list/BinaryNodeTreeTest.java | 2 +- 6 files changed, 312 insertions(+), 59 deletions(-) delete mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeNode.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeUtil.java create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/FileList.java create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinaryTreeUtilTest.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java deleted file mode 100644 index 5050ae3c95..0000000000 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/BinaryTreeNode.java +++ /dev/null @@ -1,58 +0,0 @@ -package basic.dataStructure; - -/** - * Created by macvi on 2017/4/4. - */ -public class BinaryTreeNode { - private int data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - private BinaryTreeNode(){} - - public BinaryTreeNode(int data){ - this.data = data; - this.left = null; - this.right = null; - } - - public void setData(int data){ - BinaryTreeNode node = new BinaryTreeNode(data); - if(compareTo(data)){ - if(this.left == null){ - this.left = node; - }else{ - this.left.setData(data); - } - }else{ - if(this.right == null){ - this.right = node; - }else{ - this.right.setData(data); - } - } - } - - public int getData(){ - return data; - } - - private boolean compareTo(int d) { - System.out.println("data=" + this.data + ", d=" + d); - return this.data > d; - } - - private StringBuffer dataStr = new StringBuffer(); - private int index = 0; -// public String toString(BinaryTreeNode node) { -// while (node.left != null || node.right != null){ -// dataStr.append(index + "层,数据=").append(node.data).append("|"); -// if(node.left != null){ -// dataStr.append(node.left.data) -// } -// index ++; -// } -// -// return dataStr.toString(); -// } -} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeNode.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeNode.java new file mode 100644 index 0000000000..b2b96c0349 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeNode.java @@ -0,0 +1,104 @@ +package basic.dataStructure.binaryTree; + +/** + * Created by macvi on 2017/4/4. + */ +public class BinaryTreeNode { +// private T data; +// private BinaryTreeNode left; +// private BinaryTreeNode right; +// private BinaryTreeNode before; +// +// private BinaryTreeNode(){} +// +// public BinaryTreeNode(T data){ +// this.data = data; +// this.left = null; +// this.right = null; +// } +// +// public void setData(int data){ +// BinaryTreeNode node = new BinaryTreeNode(data); +// if(compareTo(data)){ +// if(this.left == null){ +// this.left = node; +// }else{ +// this.left.setData(data); +// } +// }else{ +// if(this.right == null){ +// this.right = node; +// }else{ +// this.right.setData(data); +// } +// } +// } +// +// public BinaryTreeNode getLeft() { +// return left; +// } +// +// public void setLeft(BinaryTreeNode left) { +// this.left = left; +// } +// +// public BinaryTreeNode getRight() { +// return right; +// } +// +// public void setRight(BinaryTreeNode right) { +// this.right = right; +// } +// +// public T getData(){ +// return data; +// } +// +// private boolean compareTo(int d) { +// System.out.println("data=" + this.data + ", d=" + d); +// return (Integer)this.data > d; +// } +// +// private StringBuffer dataStr = new StringBuffer(); +// private int index = 0; +//// public String toString(BinaryTreeNode node) { +//// while (node.left != null || node.right != null){ +//// dataStr.append(index + "层,数据=").append(node.data).append("|"); +//// if(node.left != null){ +//// dataStr.append(node.left.data) +//// } +//// index ++; +//// } +//// +//// return dataStr.toString(); +//// } + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeUtil.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeUtil.java new file mode 100644 index 0000000000..182785b346 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeUtil.java @@ -0,0 +1,120 @@ +package basic.dataStructure.binaryTree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + preOrder(root, result); + + return result; + } + + private static void preOrder(BinaryTreeNode tree, List result){ + if(tree == null) return; + result.add(tree.getData()); + + preOrder(tree.getLeft(), result); + preOrder(tree.getRight(), result); + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + inOrder(root, result); + return result; + } + + private static void inOrder(BinaryTreeNode tree, List result){ + if(tree == null) return; + + inOrder(tree.getLeft(), result); + result.add(tree.getData()); + inOrder(tree.getRight(), result); + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + postOrder(root, result); + return result; + } + + private static void postOrder(BinaryTreeNode tree, List result){ + if(tree == null) return; + + postOrder(tree.getLeft(), result); + postOrder(tree.getRight(), result); + result.add(tree.getData()); + } + + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + List result = new ArrayList(); + Stack buffer = new Stack(); + BinaryTreeNode tmp = root; + while(tmp != null){ + //遍历这一排的左边节点,右边节点入栈缓存 + BinaryTreeNode node = tmp; + while(node != null){ + result.add(node.getData()); + if(node.getRight() != null) buffer.add(node.getRight()); + node = node.getLeft(); + } + + //遍历右边 + //栈中没有节点则表示遍历结束 + if (buffer.isEmpty()) break; + + tmp = buffer.pop(); + } + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + List result = new ArrayList(); + Stack buffer = new Stack(); + + BinaryTreeNode tmp = root; + while (tmp != null || !buffer.isEmpty()){ + while(tmp != null){ + buffer.push(tmp); + tmp = tmp.getLeft(); + } + + tmp = buffer.pop(); + result.add(tmp.getData()); + tmp = tmp.getRight(); + } + return result; + } + +} diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/FileList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/FileList.java new file mode 100644 index 0000000000..7d7af85490 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/FileList.java @@ -0,0 +1,10 @@ +package basic.dataStructure.binaryTree; + +import java.io.File; + +public class FileList { + public void list(File f) { + } + + +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinaryTreeUtilTest.java b/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..09b50a1148 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinaryTreeUtilTest.java @@ -0,0 +1,77 @@ +package data_structure.binaryTree; + +import basic.dataStructure.binaryTree.BinaryTreeNode; +import basic.dataStructure.binaryTree.BinaryTreeUtil; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + + + +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} diff --git a/group24/75939388/learning2017/src/test/java/data_structure/list/BinaryNodeTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/list/BinaryNodeTreeTest.java index f5648c6596..0d14cdbd8c 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/list/BinaryNodeTreeTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/list/BinaryNodeTreeTest.java @@ -1,7 +1,7 @@ package data_structure.list; import org.junit.Test; -import basic.dataStructure.BinaryTreeNode; +import basic.dataStructure.binaryTree.BinaryTreeNode; /** * @author : 温友朝 From 1fa5299407222df8e72c88c91224309ced6d7c20 Mon Sep 17 00:00:00 2001 From: patrickfeng Date: Tue, 9 May 2017 18:31:37 +0800 Subject: [PATCH 494/552] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E7=BB=83?= =?UTF-8?q?=E4=B9=A0=E4=BD=9C=E4=B8=9A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/test/BinaryTreeNodeTest.java | 6 +- .../coding2017/basic/tree/BinaryTreeNode.java | 70 +++++++++++++++ .../BinaryTreeNode1.java} | 22 ++--- .../coding2017/basic/tree/BinaryTreeUtil.java | 86 +++++++++++++++++++ .../basic/tree/BinaryTreeUtilTest.java | 75 ++++++++++++++++ .../coding2017/basic/tree/FileList.java | 12 +++ 6 files changed, 258 insertions(+), 13 deletions(-) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode.java rename group24/121111914/src/com/github/ipk2015/coding2017/basic/{BinaryTreeNode.java => tree/BinaryTreeNode1.java} (65%) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtil.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtilTest.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/BinaryTreeNodeTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/BinaryTreeNodeTest.java index 4b2fe88ee0..585bbd7e6a 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/BinaryTreeNodeTest.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/test/BinaryTreeNodeTest.java @@ -5,7 +5,9 @@ import org.junit.Before; import org.junit.Test; -import com.github.ipk2015.coding2017.basic.BinaryTreeNode; +import com.github.ipk2015.coding2017.basic.tree.BinaryTreeNode1; + + public class BinaryTreeNodeTest { @@ -15,7 +17,7 @@ public void setUp() throws Exception { @Test public void testInsert() { - BinaryTreeNode node=new BinaryTreeNode(); + BinaryTreeNode1 node=new BinaryTreeNode1(); node.setData(5); node.insert(2); diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..7da18fa204 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode.java @@ -0,0 +1,70 @@ +package com.github.ipk2015.coding2017.basic.tree; + + + +public class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public BinaryTreeNode(){ + + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(T o){ + BinaryTreeNode insertNode=new BinaryTreeNode(o); + BinaryTreeNode compareNode=this; + + while(null!=compareNode){ + if(null==compareNode.getData()){ + compareNode.setData(o); + break; + }else{ + Comparable com=(Comparable) compareNode.getData(); + + int result = com.compareTo(o); + + if(result==0){ + break; + }else if(result>0){ + if(null==compareNode.getLeft()){ + compareNode.setLeft(insertNode); + break; + } + compareNode=compareNode.getLeft(); + }else if(result<0){ + if(null==compareNode.getRight()){ + compareNode.setRight(insertNode); + break; + } + compareNode=compareNode.getRight(); + } + } + } + + return insertNode; + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/BinaryTreeNode.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode1.java similarity index 65% rename from group24/121111914/src/com/github/ipk2015/coding2017/basic/BinaryTreeNode.java rename to group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode1.java index 9fbcb7f585..a6f0c96a12 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/BinaryTreeNode.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode1.java @@ -1,10 +1,10 @@ -package com.github.ipk2015.coding2017.basic; +package com.github.ipk2015.coding2017.basic.tree; -public class BinaryTreeNode { +public class BinaryTreeNode1 { private Comparable data; - private BinaryTreeNode left; - private BinaryTreeNode right; + private BinaryTreeNode1 left; + private BinaryTreeNode1 right; public Object getData() { return data; @@ -12,22 +12,22 @@ public Object getData() { public void setData(Comparable data) { this.data = data; } - public BinaryTreeNode getLeft() { + public BinaryTreeNode1 getLeft() { return left; } - public void setLeft(BinaryTreeNode left) { + public void setLeft(BinaryTreeNode1 left) { this.left = left; } - public BinaryTreeNode getRight() { + public BinaryTreeNode1 getRight() { return right; } - public void setRight(BinaryTreeNode right) { + public void setRight(BinaryTreeNode1 right) { this.right = right; } - public BinaryTreeNode insert(Comparable o){ - BinaryTreeNode insertNode=new BinaryTreeNode(); - BinaryTreeNode compareNode=this; + public BinaryTreeNode1 insert(Comparable o){ + BinaryTreeNode1 insertNode=new BinaryTreeNode1(); + BinaryTreeNode1 compareNode=this; insertNode.setData(o); while(null!=compareNode){ diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtil.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..c1dad24448 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtil.java @@ -0,0 +1,86 @@ +package com.github.ipk2015.coding2017.basic.tree; + + + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; +/* + * 二叉树的遍历 + 对于二叉树的遍历方式一般分为三种先序、中序、后序三种方式 + 先序遍历 + 若二叉树为空,则不进行任何操作:否则 + 1、访问根结点。 + 2、先序方式遍历左子树。 + 3、先序遍历右子树。 + 中序遍历 + 若二叉树为空,则不进行任何操作:否则 + 1、中序遍历左子树。 + 2、访问根结点。 + 3、中序遍历右子树。 + 后序遍历 + 若二叉树为空,则不进行任何操作:否则 + 1、后序遍历左子树。 + 2、后序遍历右子树。 + 3、访问根结点。 + * */ +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtilTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..bee37c03a9 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtilTest.java @@ -0,0 +1,75 @@ +package com.github.ipk2015.coding2017.basic.tree; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java new file mode 100644 index 0000000000..f1ded18eda --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java @@ -0,0 +1,12 @@ +package com.github.ipk2015.coding2017.basic.tree; + + + +import java.io.File; + +public class FileList { + public void list(File f) { + } + + +} From 22c2ea48c289562bc281704c0f48ab856a4b78ec Mon Sep 17 00:00:00 2001 From: TonyHui Date: Tue, 9 May 2017 18:38:07 +0800 Subject: [PATCH 495/552] =?UTF-8?q?=E5=AE=8C=E6=88=90jvm=E7=AC=AC=E4=B8=83?= =?UTF-8?q?=E6=AC=A1=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/aaront/exercise/basic/FileList.java | 23 ++++++ .../exercise/generic/BinaryTreeUtil.java | 66 ++++++++++++++++ .../exercise/generic/GenericBinaryTree.java | 76 ++++++++++++++++++- .../aaront/execrise/basic/FileListTest.java | 20 +++++ .../{ => basic}/expr/InfixExprTest.java | 2 +- .../{ => basic}/expr/InfixToPostfixTest.java | 2 +- .../{ => basic}/expr/PostfixExprTest.java | 2 +- .../{ => basic}/expr/PrefixExprTest.java | 2 +- .../{ => basic}/expr/TokenParserTest.java | 2 +- .../execrise/generic/BinaryTreeUtilTest.java | 68 +++++++++++++++++ .../generic/GenericBinaryTreeTest.java | 9 +++ 11 files changed, 266 insertions(+), 6 deletions(-) create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/FileList.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/BinaryTreeUtil.java create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/FileListTest.java rename group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/{ => basic}/expr/InfixExprTest.java (96%) rename group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/{ => basic}/expr/InfixToPostfixTest.java (96%) rename group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/{ => basic}/expr/PostfixExprTest.java (94%) rename group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/{ => basic}/expr/PrefixExprTest.java (95%) rename group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/{ => basic}/expr/TokenParserTest.java (96%) create mode 100644 group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/BinaryTreeUtilTest.java diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/FileList.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/FileList.java new file mode 100644 index 0000000000..99e4077372 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/basic/FileList.java @@ -0,0 +1,23 @@ +package com.aaront.exercise.basic; + +import java.io.File; + +public class FileList { + public void list(File f, int deep) { + if(f == null) return; + System.out.println(_leftPad(deep) + f.getName()); + if(f.isFile()) return; + File[] files = f.listFiles(); + for (int i = 0, len = files.length; i < len; i++) { + list(files[i], deep + 1); + } + } + + private String _leftPad(int deep) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < deep; i++) { + sb.append("----"); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/BinaryTreeUtil.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/BinaryTreeUtil.java new file mode 100644 index 0000000000..b46b122dbd --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/BinaryTreeUtil.java @@ -0,0 +1,66 @@ +package com.aaront.exercise.generic; + +import java.util.Arrays; +import java.util.List; + +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static > List preOrderVisit(GenericBinaryTree root) { + T[] result = root.traversal(GenericBinaryTree.PREORDER, (T[]) new Integer[0]); + return Arrays.asList(result); + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static > List inOrderVisit(GenericBinaryTree root) { + T[] result = root.traversal(GenericBinaryTree.INORDER, (T[]) new Integer[0]); + return Arrays.asList(result); + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static > List postOrderVisit(GenericBinaryTree root) { + T[] result = root.traversal(GenericBinaryTree.POSTORDER, (T[]) new Integer[0]); + return Arrays.asList(result); + } + + /** + * 用非递归的方式实现对二叉树的前序遍历 + * + * @param root + * @return + */ + public static > List preOrderWithoutRecursion(GenericBinaryTree root) { + + List result = root.traversalWithoutRecursion(GenericBinaryTree.PREORDER); + + return result; + } + + /** + * 用非递归的方式实现对二叉树的中序遍历 + * + * @param root + * @return + */ + public static > List inOrderWithoutRecursion(GenericBinaryTree root) { + + List result = root.traversalWithoutRecursion(GenericBinaryTree.INORDER); + + return result; + } + +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java index e5cf3b439a..ef689f1c54 100644 --- a/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java +++ b/group01/954958168/class01/BasicDataStructure/src/main/java/com/aaront/exercise/generic/GenericBinaryTree.java @@ -1,6 +1,9 @@ package com.aaront.exercise.generic; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.Stack; public class GenericBinaryTree> { @@ -176,6 +179,77 @@ public Object[] traversal(int order) { return datas; } + public List traversalWithoutRecursion(int order) { + if (order == PREORDER) { + return preorderWithoutRecursion(root); + } else if (order == INORDER) { + return inorderWithoutRecursion(root); + } else if (order == POSTORDER) { + return postorderWithoutRecursion(root); + } else { + return hierarchicalTraversalWithoutRecursion(root); + } + } + + private List preorderWithoutRecursion(BinaryTreeNode root) { + List nodes = new ArrayList<>(); + Stack> stack = new Stack<>(); + while (root != null) { + nodes.add(root.getData()); + if (root.getRight() != null) { + stack.push(root.getRight()); + } + if (root.getLeft() != null) { + root = root.getLeft(); + } else { + if (stack.isEmpty()) break; + root = stack.pop(); + } + } + + return nodes; + } + + private List inorderWithoutRecursion(BinaryTreeNode root) { + List nodes = new ArrayList<>(); + Stack> stack = new Stack<>(); + while (root != null || !stack.isEmpty()) { + while (root != null) { + stack.push(root); + root = root.getLeft(); + } + BinaryTreeNode node = stack.pop(); + nodes.add(node.getData()); + root = node.getRight(); + } + return nodes; + } + + private List postorderWithoutRecursion(BinaryTreeNode root) { + List nodes = new ArrayList<>(); + Stack> stack = new Stack<>(); + stack.push(root); + BinaryTreeNode pre = null; + BinaryTreeNode cur = null; + while (!stack.isEmpty()) { + cur = stack.peek(); + // 如果当前节点是叶子节点 || 当前节点的左右节点都已经被访问过了, 则可以直接访问当前节点 + if (cur.getLeft() == null && cur.getRight() == null || pre != null && (cur.getLeft() == pre || cur.getRight() == pre)) { + nodes.add(cur.getData()); + stack.pop(); + pre = cur; + } else { + if (cur.getRight() != null) stack.push(cur.getRight()); + if (cur.getLeft() != null) stack.push(cur.getLeft()); + } + } + return nodes; + } + + private List hierarchicalTraversalWithoutRecursion(BinaryTreeNode root) { + return new ArrayList<>(); + } + private void preorderTraversal(BinaryTreeNode node, Object[] datas) { if (node == null) { return; @@ -211,7 +285,7 @@ private void hierarchicalTraversal(BinaryTreeNode node, Object[] datas) { GenericQueue> queue = new GenericQueue<>(); queue.enQueue(node); while (!queue.isEmpty()) { - BinaryTreeNode tmp = queue.deQueue(); + BinaryTreeNode tmp = queue.deQueue(); datas[index++] = tmp.getData(); if (tmp.getLeft() != null) queue.enQueue(tmp.getLeft()); if (tmp.getRight() != null) queue.enQueue(tmp.getRight()); diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/FileListTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/FileListTest.java new file mode 100644 index 0000000000..0743437140 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/FileListTest.java @@ -0,0 +1,20 @@ +package com.aaront.execrise.basic; + +import com.aaront.exercise.basic.FileList; +import org.junit.Test; + +import java.io.File; + +/** + * @author tonyhui + * @since 17/5/8 + */ +public class FileListTest { + + @Test + public void testList() { + FileList list = new FileList(); + File file = new File("/Users/tonyhui/Code/coding2017/group01/954958168"); + list.list(file, 0); + } +} diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixExprTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/InfixExprTest.java similarity index 96% rename from group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixExprTest.java rename to group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/InfixExprTest.java index 515fe9ea57..ed30a0e82a 100644 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixExprTest.java +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/InfixExprTest.java @@ -1,4 +1,4 @@ -package com.aaront.execrise.expr; +package com.aaront.execrise.basic.expr; import com.aaront.exercise.basic.expr.InfixExpr; import org.junit.After; diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixToPostfixTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/InfixToPostfixTest.java similarity index 96% rename from group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixToPostfixTest.java rename to group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/InfixToPostfixTest.java index 7f92bf24b7..94e1aec62d 100644 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/InfixToPostfixTest.java +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/InfixToPostfixTest.java @@ -1,4 +1,4 @@ -package com.aaront.execrise.expr; +package com.aaront.execrise.basic.expr; import com.aaront.exercise.basic.expr.InfixToPostfix; import com.aaront.exercise.basic.expr.PostfixExpr; diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PostfixExprTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/PostfixExprTest.java similarity index 94% rename from group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PostfixExprTest.java rename to group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/PostfixExprTest.java index 7a6511d663..0d4ecb3052 100644 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PostfixExprTest.java +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/PostfixExprTest.java @@ -1,4 +1,4 @@ -package com.aaront.execrise.expr; +package com.aaront.execrise.basic.expr; diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PrefixExprTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/PrefixExprTest.java similarity index 95% rename from group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PrefixExprTest.java rename to group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/PrefixExprTest.java index cfd2c8e4a1..502ea71a64 100644 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/PrefixExprTest.java +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/PrefixExprTest.java @@ -1,4 +1,4 @@ -package com.aaront.execrise.expr; +package com.aaront.execrise.basic.expr; import com.aaront.exercise.basic.expr.PrefixExpr; import org.junit.After; diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/TokenParserTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/TokenParserTest.java similarity index 96% rename from group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/TokenParserTest.java rename to group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/TokenParserTest.java index 67c54c53ed..11cd06d370 100644 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/expr/TokenParserTest.java +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/basic/expr/TokenParserTest.java @@ -1,4 +1,4 @@ -package com.aaront.execrise.expr; +package com.aaront.execrise.basic.expr; import com.aaront.exercise.basic.expr.Token; import com.aaront.exercise.basic.expr.TokenParser; diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/BinaryTreeUtilTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..2b0271f229 --- /dev/null +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/BinaryTreeUtilTest.java @@ -0,0 +1,68 @@ +package com.aaront.execrise.generic; + +import com.aaront.exercise.generic.BinaryTreeUtil; +import com.aaront.exercise.generic.GenericBinaryTree; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + + +public class BinaryTreeUtilTest { + + GenericBinaryTree root = null; + + @Before + public void setUp() throws Exception { + root = new GenericBinaryTree<>(); + root.add(1); + root.add(2); + root.add(5); + root.add(3); + root.add(4); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 5, 3, 4]", result.toString()); + } + + @Test + public void testInOrderVisit() { + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + } + + @Test + public void testPostOrderVisit() { + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[4, 3, 5, 2, 1]", result.toString()); + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + root.add(6); + root.add(7); + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 5, 6, 7]", result.toString()); + + } + + @Test + public void testPreOrderVisitWithoutRecursion() { + root.add(6); + root.add(7); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 5, 3, 4, 6, 7]", result.toString()); + + } +} \ No newline at end of file diff --git a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java index 6c39ab07e7..97947a385c 100644 --- a/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java +++ b/group01/954958168/class01/BasicDataStructure/src/test/java/com/aaront/execrise/generic/GenericBinaryTreeTest.java @@ -5,6 +5,9 @@ import org.junit.Before; import org.junit.Test; +import java.util.Arrays; +import java.util.List; + /** * @author tonyhui * @since 17/2/20 @@ -27,6 +30,12 @@ public void testAdd() { for (String data : datas) { binaryTree.add(data); } + List preorderWithoutRecursionDatas = binaryTree.traversalWithoutRecursion(GenericBinaryTree.PREORDER); + Assert.assertEquals(Arrays.asList(new String[]{"9", "4", "1", "2", "10", "17", "3", "5", "7", "9" }), preorderWithoutRecursionDatas); + List inorderWithoutRecursionDatas = binaryTree.traversalWithoutRecursion(GenericBinaryTree.INORDER); + Assert.assertEquals(Arrays.asList(new String[]{"1", "10", "17", "2", "3", "4", "5", "7", "9", "9" }), inorderWithoutRecursionDatas); + List postorderWithoutRecursionDatas = binaryTree.traversalWithoutRecursion(GenericBinaryTree.POSTORDER); + Assert.assertEquals(Arrays.asList(new String[]{"17", "10", "3", "2", "1", "7", "5", "4", "9", "9" }), postorderWithoutRecursionDatas); String[] preorderDatas = binaryTree.traversal(GenericBinaryTree.PREORDER, new String[0]); Assert.assertArrayEquals(new String[]{"9", "4", "1", "2", "10", "17", "3", "5", "7", "9" }, preorderDatas); String[] inorderDatas = binaryTree.traversal(GenericBinaryTree.INORDER, new String[0]); From b24141e042fde1808c05625d860cf3ca00251466 Mon Sep 17 00:00:00 2001 From: Pan Date: Wed, 10 May 2017 00:09:04 +0800 Subject: [PATCH 496/552] bad code, go to sleep --- .../java/com/pan/tree/BinaryTreeNode.java | 35 ++++++++ .../java/com/pan/tree/BinaryTreeUtil.java | 90 +++++++++++++++++++ .../src/main/java/com/pan/tree/FileList.java | 28 ++++++ .../java/com/pan/tree/BinaryTreeUtilTest.java | 73 +++++++++++++++ .../test/java/com/pan/tree/FileListTest.java | 19 ++++ 5 files changed, 245 insertions(+) create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/tree/BinaryTreeNode.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/tree/BinaryTreeUtil.java create mode 100644 group11/252308879/data-structure/src/main/java/com/pan/tree/FileList.java create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/tree/BinaryTreeUtilTest.java create mode 100644 group11/252308879/data-structure/src/test/java/com/pan/tree/FileListTest.java diff --git a/group11/252308879/data-structure/src/main/java/com/pan/tree/BinaryTreeNode.java b/group11/252308879/data-structure/src/main/java/com/pan/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..7860b6b0da --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/tree/BinaryTreeNode.java @@ -0,0 +1,35 @@ +package com.pan.tree; + +public class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/tree/BinaryTreeUtil.java b/group11/252308879/data-structure/src/main/java/com/pan/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..c3c5301eb9 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/tree/BinaryTreeUtil.java @@ -0,0 +1,90 @@ +package com.pan.tree; + +import java.util.ArrayList; +import java.util.List; + +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + if (root != null){ + List leftResult = inOrderVisit(root.getLeft()); + result.add(root.getData()); +// result = leftResult; + List rightResult = inOrderVisit(root.getRight()); + } + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + if (root == null){ + return result; + } + // 没有子节点 + if (root.getLeft() == null && root.getRight() == null){ + result.add(root.getData()); + return result; + } + + BinaryTreeNode leftDepth1 = root.getLeft(); + BinaryTreeNode leftDepthMax = leftDepth1.getLeft(); +// int leftDe + while (leftDepthMax != null){ + leftDepthMax = leftDepthMax.getLeft(); + } + + + + BinaryTreeNode rightDepth1 = root.getRight(); + + + return result; + } + +} diff --git a/group11/252308879/data-structure/src/main/java/com/pan/tree/FileList.java b/group11/252308879/data-structure/src/main/java/com/pan/tree/FileList.java new file mode 100644 index 0000000000..bb25628a82 --- /dev/null +++ b/group11/252308879/data-structure/src/main/java/com/pan/tree/FileList.java @@ -0,0 +1,28 @@ +package com.pan.tree; + +import java.io.File; + + +public class FileList { + + /** + * 给定一个目录,递归给出这个目录下的子目录和文件 + * @param file + */ + public void list(File file) { + String[] path = file.list(); + for (String pathItem : path) { + File fileTmp = new File(file.getAbsolutePath()+"\\"+pathItem); + if (fileTmp.isDirectory()){ + System.out.print("\t"); + System.out.println(fileTmp); + list(fileTmp); + }else { + System.out.print("\t\t"); + System.out.println(pathItem); + } + } + } + + +} diff --git a/group11/252308879/data-structure/src/test/java/com/pan/tree/BinaryTreeUtilTest.java b/group11/252308879/data-structure/src/test/java/com/pan/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..ae2cb14f30 --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/tree/BinaryTreeUtilTest.java @@ -0,0 +1,73 @@ +package com.pan.tree; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} diff --git a/group11/252308879/data-structure/src/test/java/com/pan/tree/FileListTest.java b/group11/252308879/data-structure/src/test/java/com/pan/tree/FileListTest.java new file mode 100644 index 0000000000..be080a82ab --- /dev/null +++ b/group11/252308879/data-structure/src/test/java/com/pan/tree/FileListTest.java @@ -0,0 +1,19 @@ +package com.pan.tree; + +import org.junit.Test; + +import java.io.File; + +/** + * Created by Pan on. + * 2017/5/9 + */ +public class FileListTest { + + @Test + public void testFileList(){ + FileList fileList = new FileList(); + fileList.list(new File("E:\\DevWorkspace\\GitHub\\coding2017\\group11")); + } + +} From 7a3c0f05ed6e1417d53d0be413cda2e5f8003d70 Mon Sep 17 00:00:00 2001 From: GallenZhang <1298552064@qq.com> Date: Wed, 10 May 2017 03:07:13 +0800 Subject: [PATCH 497/552] =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=B9=8B=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 第九次作业之数据结构 --- .../1298552064/src/week09/basic/Queue.java | 75 ++++++++ .../src/week09/basic/QuickMinStack.java | 47 +++++ .../src/week09/basic/StackWithTwoQueues.java | 111 ++++++++++++ .../src/week09/basic/TwoStackInOneArray.java | 170 ++++++++++++++++++ .../src/week09/test/QuickMinStackTest.java | 43 +++++ .../week09/test/StackWithTwoQueuesTest.java | 45 +++++ .../week09/test/TwoStackInOneArrayTest.java | 48 +++++ 7 files changed, 539 insertions(+) create mode 100644 group01/1298552064/src/week09/basic/Queue.java create mode 100644 group01/1298552064/src/week09/basic/QuickMinStack.java create mode 100644 group01/1298552064/src/week09/basic/StackWithTwoQueues.java create mode 100644 group01/1298552064/src/week09/basic/TwoStackInOneArray.java create mode 100644 group01/1298552064/src/week09/test/QuickMinStackTest.java create mode 100644 group01/1298552064/src/week09/test/StackWithTwoQueuesTest.java create mode 100644 group01/1298552064/src/week09/test/TwoStackInOneArrayTest.java diff --git a/group01/1298552064/src/week09/basic/Queue.java b/group01/1298552064/src/week09/basic/Queue.java new file mode 100644 index 0000000000..fc4cae727b --- /dev/null +++ b/group01/1298552064/src/week09/basic/Queue.java @@ -0,0 +1,75 @@ +package week09.basic; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + private static class Node{ + private Node next; + private T data; + } + + public Queue(){ + first = null; + last = null; + size = 0; + } + + public boolean isEmpty(){ + return first == null; + } + + public int size(){ + return size; + } + + public void enQueue(T data){ + Node oldlast = last; + last = new Node(); + last.data = data; + last.next = null; + if(isEmpty()){ + first = last; + }else{ + oldlast.next = last; + } + size ++; + } + + public T deQueue(){ + if(isEmpty()){ + throw new NoSuchElementException("Queue is Empty"); + } + T item = first.data; + first = first.next; + size --; + if(isEmpty()){ + last = null; + } + return item; + } + + @Override + public String toString(){ + if(isEmpty()){ + return "[]"; + } + + StringBuffer sb = new StringBuffer("["); + Node node = first; + while(node != null){ + if(node.next == null){ + sb.append(node.data); + }else{ + sb.append(node.data); + sb.append(","); + } + node = node.next; + } + sb.append("]"); + return sb.toString(); + } +} diff --git a/group01/1298552064/src/week09/basic/QuickMinStack.java b/group01/1298552064/src/week09/basic/QuickMinStack.java new file mode 100644 index 0000000000..bf4297c182 --- /dev/null +++ b/group01/1298552064/src/week09/basic/QuickMinStack.java @@ -0,0 +1,47 @@ +package week09.basic; + +import java.util.EmptyStackException; +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author gallenzhang + * + */ +public class QuickMinStack { + Stack stack = new Stack<>(); + Stack minStack = new Stack<>(); + + public void push(int data) { + stack.push(data); + if(minStack.isEmpty()){ + minStack.push(data); + return ; + } + + if(minStack.peek() > data){ + minStack.push(data); + } + } + + public int pop() { + if(stack.isEmpty()){ + throw new EmptyStackException(); + } + + int item = stack.pop(); + if(item == minStack.peek()){ + minStack.pop(); + } + return item; + } + + public int findMin() { + if(minStack.isEmpty()){ + throw new EmptyStackException(); + } + return minStack.peek(); + } + +} diff --git a/group01/1298552064/src/week09/basic/StackWithTwoQueues.java b/group01/1298552064/src/week09/basic/StackWithTwoQueues.java new file mode 100644 index 0000000000..d714c4614e --- /dev/null +++ b/group01/1298552064/src/week09/basic/StackWithTwoQueues.java @@ -0,0 +1,111 @@ +package week09.basic; + +import java.util.EmptyStackException; + +/** + * 用两个队列实现栈 + * + * @author gallenzhang + * + */ +public class StackWithTwoQueues { + private Queue firstQueue = new Queue<>(); + private Queue secondQueue = new Queue<>(); + + public void push(int data) { + + if(!firstQueue.isEmpty()){ + firstQueue.enQueue(data); + return ; + } + + if(!secondQueue.isEmpty()){ + secondQueue.enQueue(data); + return ; + } + + firstQueue.enQueue(data); + } + + public int pop() { + if(firstQueue.isEmpty() && secondQueue.isEmpty()){ + throw new EmptyStackException(); + } + + int item = -1; + int queueSize = 0; + + if(!firstQueue.isEmpty()){ + queueSize = firstQueue.size(); + for(int i = 0 ; i < queueSize; i++){ + if(i == queueSize - 1){ + item = firstQueue.deQueue(); + return item; + } + secondQueue.enQueue(firstQueue.deQueue()); + } + + } + + if(!secondQueue.isEmpty()){ + queueSize = secondQueue.size(); + for(int i = 0; i < queueSize; i++){ + if(i == queueSize -1){ + item = secondQueue.deQueue(); + return item; + } + firstQueue.enQueue(secondQueue.deQueue()); + } + } + return item; + } + + public int size(){ + return Math.max(firstQueue.size(), secondQueue.size()); + } + + public boolean isEmpty(){ + return size() == 0; + } + + public int peek(){ + int item = -1; + int queueSize = 0; + if(firstQueue.isEmpty() && secondQueue.isEmpty()){ + throw new EmptyStackException(); + } + + if(!firstQueue.isEmpty()){ + queueSize = firstQueue.size(); + for(int i = 0; i < queueSize; i++){ + if(i == queueSize - 1){ + item = firstQueue.deQueue(); + break; + } + firstQueue.enQueue(firstQueue.deQueue()); + } + firstQueue.enQueue(item); + return item; + } + + if(!secondQueue.isEmpty()){ + queueSize = secondQueue.size(); + for(int i = 0; i < queueSize; i++){ + if(i == queueSize - 1){ + item = secondQueue.deQueue(); + break; + } + secondQueue.enQueue(secondQueue.deQueue()); + } + secondQueue.enQueue(item); + return item; + } + return item; + } + + @Override + public String toString(){ + return firstQueue.isEmpty() ? secondQueue.toString() : firstQueue.toString(); + } + +} diff --git a/group01/1298552064/src/week09/basic/TwoStackInOneArray.java b/group01/1298552064/src/week09/basic/TwoStackInOneArray.java new file mode 100644 index 0000000000..ce4f57e7db --- /dev/null +++ b/group01/1298552064/src/week09/basic/TwoStackInOneArray.java @@ -0,0 +1,170 @@ +package week09.basic; + +import java.util.Arrays; +import java.util.EmptyStackException; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author gallenzhang + * + */ +public class TwoStackInOneArray { + private int DEFAULT_SIZE = 10; + + Object[] data = null; + + private int size1; + + private int size2; + + public TwoStackInOneArray(int size){ + if(size <= 0){ + throw new IllegalArgumentException("size can not be negative or zero"); + } + data = new Object[size]; + } + + public TwoStackInOneArray(){ + data = new Object[DEFAULT_SIZE]; + } + + /** + * 向第一个栈中压入元素 + * + * @param o + */ + public void push1(Object o) { + ensureCapacity(size1 + size2 + 1); + data[size1] = o; + size1 ++; + } + + /** + * 从第一个栈中弹出元素 + * + * @return + */ + public Object pop1() { + checkStack1Empty(); + Object obj = data[size1 - 1]; + data[size1 - 1] = null; + size1--; + return obj; + } + + /** + * 获取第一个栈的栈顶元素 + * + * @return + */ + + public Object peek1() { + checkStack1Empty(); + return data[size1-1]; + } + + /** + * 第一个栈是否为空 + * @return + */ + public boolean isStack1Empty(){ + return size1 == 0 ; + } + + /** + * 获取第一个栈的大小 + * @return + */ + public int size1(){ + return size1; + } + + /* + * 向第二个栈压入元素 + */ + public void push2(Object o) { + ensureCapacity(size1 + size2 + 1); + data[data.length - size2 - 1] = o; + size2 ++; + } + + /** + * 从第二个栈弹出元素 + * + * @return + */ + public Object pop2() { + checkStack2Empty(); + Object obj = data[data.length - size2]; + data[data.length - size2] = null; + size2 --; + return obj; + } + + /** + * 获取第二个栈的栈顶元素 + * + * @return + */ + + public Object peek2() { + checkStack2Empty(); + if(size2 == 0){ + throw new EmptyStackException(); + } + return data[data.length - size2]; + } + + public boolean isStack2Empty(){ + return size2 == 0 ; + } + + public int size2(){ + return size2; + } + + private void ensureCapacity(int minCapacity){ + int capacity = data.length; + if (minCapacity > capacity) { + capacity += capacity / 2; + grow(capacity); + } + } + + private void checkStack1Empty(){ + if(size1 == 0){ + throw new EmptyStackException(); + } + } + + private void checkStack2Empty(){ + if(size2 == 0){ + throw new EmptyStackException(); + } + } + + private void grow(int capacity){ + data = Arrays.copyOf(data, capacity); + System.arraycopy(data, size1, data, data.length - size2, size2); + for(int i = size1; i < data.length - size2;i++){ + data[i] = null; + } + } + + @Override + public String toString(){ + StringBuffer sb = new StringBuffer("["); + for(int i=0; i < data.length; i++){ + if(i == data.length - 1){ + sb.append(data[i]); + }else{ + sb.append(data[i]); + sb.append(","); + } + } + sb.append("]"); + return sb.toString(); + } + +} diff --git a/group01/1298552064/src/week09/test/QuickMinStackTest.java b/group01/1298552064/src/week09/test/QuickMinStackTest.java new file mode 100644 index 0000000000..8078cabeef --- /dev/null +++ b/group01/1298552064/src/week09/test/QuickMinStackTest.java @@ -0,0 +1,43 @@ +package week09.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week09.basic.QuickMinStack; + +public class QuickMinStackTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + QuickMinStack stack = new QuickMinStack(); + stack.push(3); + stack.push(5); + stack.push(2); + stack.push(8); + stack.push(1); + stack.push(6); + + Assert.assertEquals(1, stack.findMin()); + + Assert.assertEquals(6, stack.pop()); + Assert.assertEquals(1, stack.pop()); + + Assert.assertEquals(2, stack.findMin()); + + Assert.assertEquals(8, stack.pop()); + Assert.assertEquals(2, stack.pop()); + + Assert.assertEquals(3, stack.findMin()); + } + +} diff --git a/group01/1298552064/src/week09/test/StackWithTwoQueuesTest.java b/group01/1298552064/src/week09/test/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..d582dfa7f9 --- /dev/null +++ b/group01/1298552064/src/week09/test/StackWithTwoQueuesTest.java @@ -0,0 +1,45 @@ +package week09.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week09.basic.StackWithTwoQueues; + +public class StackWithTwoQueuesTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + StackWithTwoQueues stack = new StackWithTwoQueues(); + + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + + Assert.assertEquals("[1,2,3,4]", stack.toString()); + Assert.assertEquals(4L, stack.size()); + + stack.pop(); + stack.pop(); + Assert.assertEquals("[1,2]", stack.toString()); + Assert.assertEquals(2L, stack.size()); + + int item = stack.peek(); + Assert.assertEquals("[1,2]", stack.toString()); + Assert.assertEquals(2L, stack.size()); + Assert.assertEquals(2L, item); + + stack.pop(); + stack.pop(); + Assert.assertEquals("[]", stack.toString()); + } +} diff --git a/group01/1298552064/src/week09/test/TwoStackInOneArrayTest.java b/group01/1298552064/src/week09/test/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..536630fd4d --- /dev/null +++ b/group01/1298552064/src/week09/test/TwoStackInOneArrayTest.java @@ -0,0 +1,48 @@ +package week09.test; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import week09.basic.TwoStackInOneArray; + +public class TwoStackInOneArrayTest { + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + TwoStackInOneArray ts = new TwoStackInOneArray(5); + ts.push1(1); + ts.push1(2); + + ts.push2(5); + ts.push2(6); + ts.push2(7); + + Assert.assertEquals("[1,2,7,6,5]", ts.toString()); + + Object o = ts.peek1(); + Assert.assertEquals(2, o); + + o = ts.peek2(); + Assert.assertEquals(7, o); + + Assert.assertEquals(2, ts.pop1()); + Assert.assertEquals(7, ts.pop2()); + + Assert.assertEquals("[1,null,null,6,5]", ts.toString()); + + ts.push1(2); + ts.push1(3); + + ts.push2(7); + Assert.assertEquals("[1,2,3,null,7,6,5]", ts.toString()); + } +} From f3b08c1982c68b054067d9e0337b90936b52f476 Mon Sep 17 00:00:00 2001 From: '1299310140' <'13437282785@163.com'> Date: Wed, 10 May 2017 10:34:22 +0800 Subject: [PATCH 498/552] BinaryTreeUtil --- .../com/coding/basic/tree/BinaryTreeUtil.java | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 group04/1299310140/src/com/coding/basic/tree/BinaryTreeUtil.java diff --git a/group04/1299310140/src/com/coding/basic/tree/BinaryTreeUtil.java b/group04/1299310140/src/com/coding/basic/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..6d48f6e68f --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/tree/BinaryTreeUtil.java @@ -0,0 +1,130 @@ +package com.coding.basic.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class BinaryTreeUtil { + /** + * 用 递归 的方式实现对二叉树的 前序 遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + if(root == null || root.getData() == null){ + return result; + } + + result.add(root.getData()); + result.addAll(preOrderVisit(root.getLeft())); + result.addAll(preOrderVisit(root.getRight())); + + return result; + } + + /** + * 用 递归 的方式实现对二叉树的 中序 遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + if(root == null || root.getData() == null){ + return result; + } + + result.addAll(inOrderVisit(root.getLeft())); + result.add(root.getData()); + result.addAll(inOrderVisit(root.getRight())); + + return result; + } + + /** + * 用 递归 的方式实现对二叉树的 后序 遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + + if(root == null || root.getData() == null){ + return result; + } + + result.addAll(postOrderVisit(root.getLeft())); + result.addAll(postOrderVisit(root.getRight())); + result.add(root.getData()); + + return result; + } + + /** + * 用 非递归 的方式实现对二叉树的 前序 遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + List result = new ArrayList(); + + if(root == null || root.getData() == null){ + return result; + } + + Stack> stack = new Stack>(); + stack.push(root); + while(!stack.isEmpty()){ + BinaryTreeNode temp = stack.pop(); + result.add(temp.getData()); + + if(temp.getRight() != null){ + stack.push(temp.getRight()); + } + + if(temp.getLeft() != null){ + stack.push(temp.getLeft()); + } + } + + return result; + } + + /** + * 用 非递归 的方式实现对二叉树的 中序 遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + List result = new ArrayList(); + + if(root == null || root.getData() == null){ + return result; + } + + Stack> stack = new Stack>(); + while(root != null){ + stack.push(root); + root = root.getLeft(); + } + + while(!stack.isEmpty()){ + BinaryTreeNode temp = stack.pop(); + result.add(temp.getData()); + + temp = temp.getRight(); + while(temp != null){ + stack.push(temp); + temp = temp.getLeft(); + } + } + + return result; + } + +} From a8421d5ccdf3115875861f6c5738d680d81227d2 Mon Sep 17 00:00:00 2001 From: patrickfeng Date: Wed, 10 May 2017 12:04:17 +0800 Subject: [PATCH 499/552] =?UTF-8?q?tree=E7=BB=83=E4=B9=A0=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/tree/BinaryTreeUtil.java | 109 +++++++++++++++++- .../coding2017/basic/tree/FileList.java | 25 +++- 2 files changed, 125 insertions(+), 9 deletions(-) diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtil.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtil.java index c1dad24448..268e00ddd8 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtil.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeUtil.java @@ -33,10 +33,25 @@ public class BinaryTreeUtil { */ public static List preOrderVisit(BinaryTreeNode root) { List result = new ArrayList(); - + preOrderNode(root,result); return result; } - + private static void preOrderNode(BinaryTreeNode node,List list){ + if(null == node){ + return; + } + + T data = node.getData(); + if(null != data){ + list.add(data); + } + + BinaryTreeNode leftNode = node.getLeft(); + preOrderNode(leftNode,list); + + BinaryTreeNode rightNode = node.getRight(); + preOrderNode(rightNode,list); + } /** * 用递归的方式实现对二叉树的中遍历 * @@ -45,10 +60,26 @@ public static List preOrderVisit(BinaryTreeNode root) { */ public static List inOrderVisit(BinaryTreeNode root) { List result = new ArrayList(); - + inOrderNode(root,result); return result; } + private static void inOrderNode(BinaryTreeNode node,List list){ + if(null == node){ + return; + } + + BinaryTreeNode leftNode = node.getLeft(); + inOrderNode(leftNode,list); + + T data = node.getData(); + if(null != data){ + list.add(data); + } + + BinaryTreeNode rightNode = node.getRight(); + inOrderNode(rightNode,list); + } /** * 用递归的方式实现对二叉树的后遍历 * @@ -57,9 +88,27 @@ public static List inOrderVisit(BinaryTreeNode root) { */ public static List postOrderVisit(BinaryTreeNode root) { List result = new ArrayList(); - + postOrderNode(root,result); return result; } + + private static void postOrderNode(BinaryTreeNode node,List list){ + if(null == node){ + return; + } + + BinaryTreeNode leftNode = node.getLeft(); + postOrderNode(leftNode,list); + + BinaryTreeNode rightNode = node.getRight(); + postOrderNode(rightNode,list); + + T data = node.getData(); + if(null != data){ + list.add(data); + } + + } /** * 用非递归的方式实现对二叉树的前序遍历 * @param root @@ -67,7 +116,28 @@ public static List postOrderVisit(BinaryTreeNode root) { */ public static List preOrderWithoutRecursion(BinaryTreeNode root) { - List result = new ArrayList(); + List result = new ArrayList(); + Stack stack = new Stack(); + stack.push(root); + while(!stack.isEmpty()){ + BinaryTreeNode node = (BinaryTreeNode) stack.pop(); + if(null == node){ + break; + } + T data = node.getData(); + if(null != data){ + result.add(data); + } + + BinaryTreeNode rightNode = node.getRight(); + if(null != rightNode){ + stack.push(rightNode); + } + BinaryTreeNode leftNode = node.getLeft(); + if(null != leftNode){ + stack.push(leftNode); + } + } return result; } @@ -79,7 +149,34 @@ public static List preOrderWithoutRecursion(BinaryTreeNode root) { public static List inOrderWithoutRecursion(BinaryTreeNode root) { List result = new ArrayList(); - + Stack nodeStack = new Stack(); + Stack midStack = new Stack(); + nodeStack.push(root); + while(!nodeStack.isEmpty()){ + BinaryTreeNode node = (BinaryTreeNode) nodeStack.pop(); + if(null == node){ + break; + } + + BinaryTreeNode rightNode = node.getRight(); + if(null != rightNode){ + nodeStack.push(rightNode); + } + + BinaryTreeNode leftNode = node.getLeft(); + if(null != leftNode){ + midStack.push(node.getData()); + nodeStack.push(leftNode); + }else{ + T data = node.getData(); + if(null != data){ + result.add(data); + } + if(!midStack.isEmpty()){ + result.add((T) midStack.pop()); + } + } + } return result; } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java index f1ded18eda..eac9a7e789 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java @@ -3,10 +3,29 @@ import java.io.File; - +/* + * 给定一个目录,递归的列出下面所有的子目录和文件 + * */ public class FileList { - public void list(File f) { + public void list(File f) { + listOneFile(f,0); + } + + private void listOneFile(File f,int space){ + if(f.exists()){ + String stringSpace = " "; + + File[] listFiles = f.listFiles(); + for(int i = 0;i Date: Wed, 10 May 2017 12:47:43 +0800 Subject: [PATCH 500/552] FileList --- .../src/com/coding/basic/tree/FileList.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 group04/1299310140/src/com/coding/basic/tree/FileList.java diff --git a/group04/1299310140/src/com/coding/basic/tree/FileList.java b/group04/1299310140/src/com/coding/basic/tree/FileList.java new file mode 100644 index 0000000000..a346803663 --- /dev/null +++ b/group04/1299310140/src/com/coding/basic/tree/FileList.java @@ -0,0 +1,28 @@ +package com.coding.basic.tree; + +import java.io.File; + +public class FileList { + + public static void list(File f,int l) { + if(!f.isFile() && !f.isDirectory()){ + return; + } + + for(int i = 0;i < l;i++){//对齐 + System.out.print("|--"); + } + + System.out.println(f.getName()); + if(f.isDirectory()){ + File[] files_L = f.listFiles(); + for(File file : files_L){ + list(file,l+1); + } + } + } + + public static void main(String[] args){ + list(new File("C:/"),0); + } +} From 3d868b1f73a5121c8fc8b91ec95d3a8b5d1691ab Mon Sep 17 00:00:00 2001 From: Patrick Date: Wed, 10 May 2017 23:17:17 +0800 Subject: [PATCH 501/552] =?UTF-8?q?5.8-5.14=20tree=E7=BB=83=E4=B9=A0?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/tree/FileList.java | 7 ++--- .../coding2017/basic/tree/FileListTest.java | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileListTest.java diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java index eac9a7e789..93c80da541 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/FileList.java @@ -7,14 +7,13 @@ * 给定一个目录,递归的列出下面所有的子目录和文件 * */ public class FileList { - public void list(File f) { + private static String stringSpace = " "; + public static void list(File f) { listOneFile(f,0); } - private void listOneFile(File f,int space){ + private static void listOneFile(File f,int space){ if(f.exists()){ - String stringSpace = " "; - File[] listFiles = f.listFiles(); for(int i = 0;i Date: Thu, 11 May 2017 03:06:59 +0800 Subject: [PATCH 502/552] =?UTF-8?q?jvm=E7=AC=AC=E4=B8=83=E6=AC=A1=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../1148285693/{ => learning2017}/.gitignore | 0 .../src/main/java/me/lzb/basic/FileList.java | 54 ++++++ .../me/lzb/basic/{ => list}/ArrayList.java | 2 +- .../me/lzb/basic/{ => list}/ArrayUtil.java | 2 +- .../me/lzb/basic/{ => list}/Iterator.java | 2 +- .../me/lzb/basic/{ => list}/LinkedList.java | 2 +- .../java/me/lzb/basic/{ => list}/List.java | 2 +- .../main/java/me/lzb/basic/queue/Queue.java | 2 +- .../main/java/me/lzb/basic/stack/Stack.java | 2 +- .../{BinaryTreeNode.java => tree/BTNode.java} | 14 +- .../me/lzb/basic/tree/BinaryTreeNode.java | 43 +++++ .../me/lzb/basic/tree/BinaryTreeUtil.java | 177 ++++++++++++++++++ .../test/java/me/lzb/basic/FileListTest.java | 23 +++ .../lzb/basic/{ => list}/ArrayListTest.java | 4 +- .../lzb/basic/{ => list}/LinkedListTest.java | 6 +- .../me/lzb/basic/tree/BinaryTreeUtilTest.java | 90 +++++++++ .../consistenthash/ConsistentHash.java | 119 ++++++++++++ .../consistenthash/HashFunction.java | 48 +++++ .../consistenthash/PhysicalNode.java | 46 +++++ .../algorithm/consistenthash/VirtualNode.java | 43 +++++ .../me/lzb/other/proxy/UserServiceImpl.java | 2 +- .../other/algorithm/ConsistentHashTest.java | 94 ++++++++++ group24/1148285693/learning2017/pom.xml | 5 + 23 files changed, 761 insertions(+), 21 deletions(-) rename group24/1148285693/{ => learning2017}/.gitignore (100%) create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/FileList.java rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{ => list}/ArrayList.java (98%) rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{ => list}/ArrayUtil.java (99%) rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{ => list}/Iterator.java (81%) rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{ => list}/LinkedList.java (99%) rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{ => list}/List.java (88%) rename group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/{BinaryTreeNode.java => tree/BTNode.java} (76%) create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeUtil.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/FileListTest.java rename group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/{ => list}/ArrayListTest.java (97%) rename group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/{ => list}/LinkedListTest.java (98%) create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinaryTreeUtilTest.java create mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/ConsistentHash.java create mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/HashFunction.java create mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/PhysicalNode.java create mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/VirtualNode.java create mode 100644 group24/1148285693/learning2017/other/src/test/java/me/lzb/other/algorithm/ConsistentHashTest.java diff --git a/group24/1148285693/.gitignore b/group24/1148285693/learning2017/.gitignore similarity index 100% rename from group24/1148285693/.gitignore rename to group24/1148285693/learning2017/.gitignore diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/FileList.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/FileList.java new file mode 100644 index 0000000000..ce0d19e330 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/FileList.java @@ -0,0 +1,54 @@ +package me.lzb.basic; + +import java.io.File; + +/** + * 给定一个目录,递归的列出下面所有的子目录和文件 + * + * @author LZB + */ +public class FileList { + + public void list(File f) { + System.out.println(f.getPath()); + + list(f, 0); + } + + + private void list(File file, int level) { + if (file.isDirectory()) { + print(file, level); + } + level++; + File[] files = file.listFiles(); + for (int i = 0; i < files.length; i++) { + if (files[i].isDirectory()) { + list(files[i], level); + } else { + print(files[i], level); + } + } + } + + private void print(File f, int level) { + System.out.println(getFileFormat(level) + f.getName()); + + } + + + private String getFileFormat(int level) { + StringBuffer sb = new StringBuffer(); + if (level > 1) { + sb.append("|"); + } + + for (int i = 0; i < level - 1; i++) { + sb.append(" "); + } + if (level > 0) { + sb.append("|--"); + } + return sb.toString(); + } +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/ArrayList.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayList.java similarity index 98% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/ArrayList.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayList.java index af897cd58f..a999b662f1 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/ArrayList.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayList.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.list; /** * 简易ArrayList diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/ArrayUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayUtil.java similarity index 99% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/ArrayUtil.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayUtil.java index eab32c80cc..dcfa9c39f6 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/ArrayUtil.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayUtil.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.list; public class ArrayUtil { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Iterator.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/Iterator.java similarity index 81% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Iterator.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/Iterator.java index 86e8cae942..d6122132cc 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/Iterator.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/Iterator.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.list; /** * Created by LZB on 2017/3/11. diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/LinkedList.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/LinkedList.java similarity index 99% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/LinkedList.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/LinkedList.java index 268b69bf50..f55c92cdc6 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/LinkedList.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/LinkedList.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.list; /** diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/List.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/List.java similarity index 88% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/List.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/List.java index df7f30812b..3e34154092 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/List.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/List.java @@ -1,4 +1,4 @@ -package me.lzb.basic; +package me.lzb.basic.list; /** * list接口 diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java index a70c6065c4..b1ef522855 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java @@ -1,6 +1,6 @@ package me.lzb.basic.queue; -import me.lzb.basic.LinkedList; +import me.lzb.basic.list.LinkedList; /** * 先进先出 diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java index ff5f8156a0..a5469ff8ce 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java @@ -1,6 +1,6 @@ package me.lzb.basic.stack; -import me.lzb.basic.ArrayList; +import me.lzb.basic.list.ArrayList; /** * 先进后出 diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/BinaryTreeNode.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BTNode.java similarity index 76% rename from group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/BinaryTreeNode.java rename to group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BTNode.java index 88395e3010..ee0b9d6e33 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/BinaryTreeNode.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BTNode.java @@ -1,16 +1,16 @@ -package me.lzb.basic; +package me.lzb.basic.tree; /** * 左边比父节点小,右边比父节点大 * Created by LZB on 2017/3/11. */ -public class BinaryTreeNode { +public class BTNode { private int data; - private BinaryTreeNode left; - private BinaryTreeNode right; + private BTNode left; + private BTNode right; - public BinaryTreeNode(int data){ + public BTNode(int data){ this.data = data; } @@ -21,7 +21,7 @@ public int getData() { //这层满了就下一层继续add,直到找到空位 public void add(int d){ - BinaryTreeNode b = new BinaryTreeNode(d); + BTNode b = new BTNode(d); if(compareTo(b)){ //比父节点小,左边 if(this.left == null){ @@ -42,7 +42,7 @@ public void add(int d){ } - public boolean compareTo(BinaryTreeNode node){ + public boolean compareTo(BTNode node){ if(this.data > node.getData()){ return true; } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..fc56ca100f --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java @@ -0,0 +1,43 @@ +package me.lzb.basic.tree; + +/** + * @author LZB + */ +public class BinaryTreeNode { + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + return null; + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..c5543271ad --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeUtil.java @@ -0,0 +1,177 @@ +package me.lzb.basic.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +/** + * 前序遍历:根节点->左子树->右子树 + * 中序遍历:左子树->根节点->右子树 + * 后序遍历:左子树->右子树->根节点 + * + * @author LZB + */ +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList<>(); + preOrderVisit(root, result); + return result; + } + + + private static void preOrderVisit(BinaryTreeNode root, List result) { + result.add(root.getData()); + + if (root.getLeft() != null) { + preOrderVisit(root.getLeft(), result); + } + if (root.getRight() != null) { + preOrderVisit(root.getRight(), result); + } + } + + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList<>(); + inOrderVisit(root, result); + return result; + } + + private static void inOrderVisit(BinaryTreeNode root, List result) { + if (root.getLeft() != null) { + inOrderVisit(root.getLeft(), result); + } + + result.add(root.getData()); + + if (root.getRight() != null) { + inOrderVisit(root.getRight(), result); + } + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList<>(); + postOrderVisit(root, result); + return result; + } + + private static void postOrderVisit(BinaryTreeNode root, List result) { + if (root.getLeft() != null) { + postOrderVisit(root.getLeft(), result); + } + if (root.getRight() != null) { + postOrderVisit(root.getRight(), result); + } + result.add(root.getData()); + } + + + /** + * 用非递归的方式实现对二叉树的前序遍历 + * + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList<>(); + Stack> stack = new Stack<>(); + BinaryTreeNode node = root; + //先把左侧节点全部入栈,然后一个个pop出来检查右侧节点 + while (node != null || stack.size() > 0) { + while (node != null) { + result.add(node.getData()); + stack.push(node); + node = node.getLeft(); + } + if (stack.size() > 0) { + node = stack.pop(); + node = node.getRight(); + } + } + + + return result; + } + + /** + * 用非递归的方式实现对二叉树的中序遍历 + * + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList<>(); + Stack> stack = new Stack<>(); + BinaryTreeNode node = root; + while (node != null || stack.size() > 0) { + while (node != null) { + stack.push(node); + node = node.getLeft(); + } + if (stack.size() > 0) { + node = stack.pop(); + result.add(node.getData()); + node = node.getRight(); + } + } + return result; + } + + /** + * 用非递归的方式实现对二叉树的后序遍历 + * + * @param root + * @return + */ + public static List postOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList<>(); + Stack> stack = new Stack<>(); + + Stack> s2 = new Stack<>(); + + BinaryTreeNode node = root; + + BinaryTreeNode r = root; + while (node != null || stack.size() > 0) { + //s2先入根节点,在入右边节点 + while (node != null) { + stack.push(node); + s2.push(node); + node = node.getRight(); + } + + //最底层节点出栈,左节点继续循环 + if (stack.size() > 0) { + node = stack.pop(); + node = node.getLeft(); + } + } + while (s2.size() > 0) { + result.add(s2.pop().getData()); + } + return result; + } + + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/FileListTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/FileListTest.java new file mode 100644 index 0000000000..c9f6cd2429 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/FileListTest.java @@ -0,0 +1,23 @@ +package me.lzb.basic; + +import org.junit.Test; + +import java.io.File; + +/** + * @author LZB + * @date 2017/5/10 + */ +public class FileListTest { + + @Test + public void listTest(){ + File file = new File("D:\\code\\learning\\tmp"); + + + FileList list = new FileList(); + list.list(file); + + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/ArrayListTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/list/ArrayListTest.java similarity index 97% rename from group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/ArrayListTest.java rename to group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/list/ArrayListTest.java index efcfdbae1d..2240264590 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/ArrayListTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/list/ArrayListTest.java @@ -1,7 +1,5 @@ -package me.lzb.basic; +package me.lzb.basic.list; -import me.lzb.basic.ArrayList; -import me.lzb.basic.Iterator; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/LinkedListTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/list/LinkedListTest.java similarity index 98% rename from group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/LinkedListTest.java rename to group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/list/LinkedListTest.java index 6f02328060..486957915f 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/LinkedListTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/list/LinkedListTest.java @@ -1,7 +1,7 @@ -package me.lzb.basic; +package me.lzb.basic.list; -import me.lzb.basic.Iterator; -import me.lzb.basic.LinkedList; +import me.lzb.basic.list.Iterator; +import me.lzb.basic.list.LinkedList; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinaryTreeUtilTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..6656fdfc4a --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinaryTreeUtilTest.java @@ -0,0 +1,90 @@ +package me.lzb.basic.tree; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +/** + * @author LZB + */ +public class BinaryTreeUtilTest { + BinaryTreeNode root = null; + + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode<>(1); + root.setLeft(new BinaryTreeNode<>(2)); + root.setRight(new BinaryTreeNode<>(5)); + root.getLeft().setLeft(new BinaryTreeNode<>(3)); + root.getLeft().setRight(new BinaryTreeNode<>(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode<>(6)); + node.setRight(new BinaryTreeNode<>(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode<>(6)); + node.setRight(new BinaryTreeNode<>(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode<>(6)); + node.setRight(new BinaryTreeNode<>(7)); + + List result = BinaryTreeUtil.postOrderWithoutRecursion(root); + Assert.assertEquals("[3, 6, 7, 4, 2, 5, 1]", result.toString()); + + } +} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/ConsistentHash.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/ConsistentHash.java new file mode 100644 index 0000000000..01e7c8f8b2 --- /dev/null +++ b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/ConsistentHash.java @@ -0,0 +1,119 @@ +package me.lzb.other.algorithm.consistenthash; + +import java.util.*; + +/** + * @author LZB + * @date 2017/5/9 + */ +public class ConsistentHash { + + private int vnNumber; + + private HashFunction hashFunction; + + private final SortedMap nodes = new TreeMap<>(); + + private int size; + + private final Map pns = new HashMap<>(); + + public ConsistentHash(int pnNum, int vnNum) { + this.hashFunction = new HashFunction(); + this.vnNumber = vnNum; + + //创建好节点 + int a = 100; + + for (int i = 0; i < pnNum; i++) { + PhysicalNode pn = new PhysicalNode("192.168.1." + a, "8888"); + pns.put(pn.getAddr(), pn); + addNode(pn); + a++; + } + } + + + public void addNode(PhysicalNode pn) { + //添加一个物理节点,增加vnNumber个虚拟节点 + for (int i = 0; i < this.vnNumber; i++) { + VirtualNode vn = new VirtualNode(pn, String.valueOf(i)); + nodes.put(hashFunction.hash(vn.getAddr()), vn); + } + + } + + public void removeNode(PhysicalNode node) { + for (int i = 0; i < this.vnNumber; i++) + nodes.remove(hashFunction.hash(node.getAddr() + "-" + i)); + } + + /** + * 获取顺时针方向最近的节点 + * + * @param key + * @return + */ + public VirtualNode getNode(String key) { + if (nodes.isEmpty()) { + return null; + } + + long hash = hashFunction.hash(key); + if (!nodes.containsKey(hash)) { + SortedMap tailMap = nodes.tailMap(hash); + hash = tailMap.isEmpty() ? nodes.firstKey() : tailMap.firstKey(); + } + return nodes.get(hash); + } + + public long getSize() { + return nodes.size(); + } + + + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + for (Long key : nodes.keySet()) { + VirtualNode n = nodes.get(key); + sb.append(n.getAddr()); + sb.append(" "); + sb.append(n.size()); + sb.append("\r\n"); + } + return sb.toString(); + } + + + public SortedMap getNodes() { + return this.nodes; + } + + public Map getPNodes() { + return this.pns; + } + + + public void put(String key, String value) { + VirtualNode node = getNode(key); + node.put(key, value); + size++; + } + + public void remove(String key) { + VirtualNode node = getNode(key); + node.remove(key); + size--; + } + + public String get(String key) { + VirtualNode node = getNode(key); + return node.get(key); + } + + public int size() { + return size; + } + +} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/HashFunction.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/HashFunction.java new file mode 100644 index 0000000000..f17fd7957a --- /dev/null +++ b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/HashFunction.java @@ -0,0 +1,48 @@ +package me.lzb.other.algorithm.consistenthash; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * @author LZB + * @date 2017/5/11 + */ +public class HashFunction { + + /** + * ketama + * @param key + * @return + */ + public long hash(String key) { + byte[] bytes = md5(key); + return ketama(bytes, 0); + + } + + private long ketama(byte[] digest, int nTime) { + //0xff = 255 + long a = ((long) (digest[3 + nTime * 4] & 0xFF) << 24) + | ((long) (digest[2 + nTime * 4] & 0xFF) << 16) + | ((long) (digest[1 + nTime * 4] & 0xFF) << 8) + | (digest[0 + nTime * 4] & 0xFF); + + return a & 0xffffffffL; + } + + //输入任意长的信息,输出128位的信息,不可逆,唯一 + private byte[] md5(String key) { + MessageDigest md5 = null; + if (md5 == null) { + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } + + md5.reset(); + md5.update(key.getBytes()); + return md5.digest(); + } +} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/PhysicalNode.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/PhysicalNode.java new file mode 100644 index 0000000000..0c3a286494 --- /dev/null +++ b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/PhysicalNode.java @@ -0,0 +1,46 @@ +package me.lzb.other.algorithm.consistenthash; + +import java.util.HashMap; + +/** + * @author LZB + * @date 2017/5/10 + */ +public class PhysicalNode { + private String ip; + + private String port; + + private HashMap data = new HashMap<>(); + + public PhysicalNode(String ip, String port) { + this.ip = ip; + this.port = port; + } + + + public void put(String key, String value) { + data.put(key, value); + } + + public void remove(String key) { + data.remove(key); + } + + public String get(String key) { + return data.get(key); + } + + public String getAddr() { + return this.ip + ":" + this.port; + } + + public int size() { + return data.size(); + } + + public HashMap getDate(){ + return data; + } + +} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/VirtualNode.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/VirtualNode.java new file mode 100644 index 0000000000..e409786389 --- /dev/null +++ b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/VirtualNode.java @@ -0,0 +1,43 @@ +package me.lzb.other.algorithm.consistenthash; + +/** + * @author LZB + * @date 2017/5/10 + */ +public class VirtualNode { + private PhysicalNode physicalNode; + + private String id; + + private int size; + + public VirtualNode(PhysicalNode node, String id) { + this.physicalNode = node; + this.id = id; + } + + + public void put(String key, String value) { + physicalNode.put(key, value); + size++; + } + + public void remove(String key) { + physicalNode.remove(key); + size--; + } + + public String get(String key) { + return physicalNode.get(key); + } + + public String getAddr() { + return physicalNode.getAddr() + "-" + id; + } + + public int size() { + return size; + } + + +} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserServiceImpl.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserServiceImpl.java index 614b60d9c9..147abda59b 100644 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserServiceImpl.java +++ b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserServiceImpl.java @@ -6,6 +6,6 @@ public class UserServiceImpl implements UserService { public void add() { - System.out.println("--------------------add---------------"); + System.out.println("--------------------addNode---------------"); } } \ No newline at end of file diff --git a/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/algorithm/ConsistentHashTest.java b/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/algorithm/ConsistentHashTest.java new file mode 100644 index 0000000000..08902c756a --- /dev/null +++ b/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/algorithm/ConsistentHashTest.java @@ -0,0 +1,94 @@ +package me.lzb.other.algorithm; + +import me.lzb.other.algorithm.consistenthash.ConsistentHash; +import me.lzb.other.algorithm.consistenthash.HashFunction; +import me.lzb.other.algorithm.consistenthash.PhysicalNode; +import org.junit.Test; + +import java.text.NumberFormat; +import java.util.HashMap; +import java.util.Map; + +/** + * @author LZB + * @date 2017/5/10 + */ +public class ConsistentHashTest { + + + @Test + public void hashFunctionTest() { + + HashFunction hashFunction = new HashFunction(); + + System.out.println(hashFunction.hash("192.168.1.100")); + System.out.println(hashFunction.hash("192.168.1.101")); + System.out.println(hashFunction.hash("192.168.1.102")); + System.out.println(hashFunction.hash("192.168.1.103")); + System.out.println(hashFunction.hash("192.168.1.104")); + } + + @Test + public void consistentHashTest() { + int all = 100000; + + ConsistentHash ch10 = new ConsistentHash(10, 5); + put(ch10, all); + + + ConsistentHash ch12 = new ConsistentHash(12, 5); + put(ch12, all); + + System.out.print("增加两台 "); + hitRate(ch10.getPNodes(), ch12.getPNodes(), all); + + System.out.print("减少两台 "); + ConsistentHash ch8 = new ConsistentHash(8, 5); + put(ch8, all); + + hitRate(ch10.getPNodes(), ch8.getPNodes(), all); + } + + + public static void put(ConsistentHash ch, int all) { + for (int i = 0; i < all; i++) { + ch.put(String.valueOf(i), "aaaaa" + i); + } + } + + public static void hitRate(Map m1, Map m2, int all) { + + Map s; + Map l; + + if (m1.size() < m2.size()) { + s = m1; + l = m2; + } else { + s = m2; + l = m1; + } + + int count = 0; + + for (String key : s.keySet()) { + + PhysicalNode sn = s.get(key); + PhysicalNode ln = l.get(key); + + HashMap sData = sn.getDate(); + + HashMap lData = ln.getDate(); + for (String k : sData.keySet()) { + if (lData.containsKey(k)) { + count++; + } + } + } + NumberFormat nf = NumberFormat.getPercentInstance(); + nf.setMinimumFractionDigits(2); + System.out.println("hit rate : " + (nf.format((double) count / (double) all))); + } + + +} diff --git a/group24/1148285693/learning2017/pom.xml b/group24/1148285693/learning2017/pom.xml index 8dc41781ba..d1b38a50b4 100644 --- a/group24/1148285693/learning2017/pom.xml +++ b/group24/1148285693/learning2017/pom.xml @@ -116,6 +116,11 @@ httpclient 4.5.3 + + org.apache.zookeeper + zookeeper + 3.4.10 + From b20c520e5c8c0be9408bba3674c3d372ea253425 Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Thu, 11 May 2017 16:02:46 +0800 Subject: [PATCH 503/552] the seventh homework --- JVM4 commandParser --- group19/1294642551/src/jvm/attr/CodeAttr.java | 43 +++-- group19/1294642551/src/jvm/clz/ClassFile.java | 112 +++++++++++ .../1294642551/src/jvm/cmd/CommandParser.java | 175 ++++++++++++++++++ group19/1294642551/src/jvm/method/Method.java | 5 + .../test/jvm/ClassFileloaderTest.java | 79 ++++++++ 5 files changed, 403 insertions(+), 11 deletions(-) create mode 100644 group19/1294642551/src/jvm/clz/ClassFile.java create mode 100644 group19/1294642551/src/jvm/cmd/CommandParser.java diff --git a/group19/1294642551/src/jvm/attr/CodeAttr.java b/group19/1294642551/src/jvm/attr/CodeAttr.java index 8552e5d17f..e3dde08c77 100644 --- a/group19/1294642551/src/jvm/attr/CodeAttr.java +++ b/group19/1294642551/src/jvm/attr/CodeAttr.java @@ -1,5 +1,7 @@ package jvm.attr; +import java.util.Arrays; + import jvm.clz.ClassFile; import jvm.cmd.ByteCodeCommand; import jvm.cmd.CommandParser; @@ -12,20 +14,27 @@ public class CodeAttr extends AttributeInfo { private int maxLocals ; private int codeLen ; private String code; - public String getCode() { - return code; - } - private LineNumberTable lineNumTable; private LocalVariableTable localVarTable; private StackMapTable stackMapTable; - public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code) { + private ByteCodeCommand[] cmds ; + + public String getCode() { + return code; + } + + public ByteCodeCommand[] getCmds() { + return cmds; + } + + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code, ByteCodeCommand[] cmds) { super(attrNameIndex, attrLen); this.maxStack = maxStack; this.maxLocals = maxLocals; this.codeLen = codeLen; this.code = code; + this.cmds = cmds; } public void setLineNumberTable(LineNumberTable t) { @@ -45,8 +54,18 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ int codeLen = iter.nextU4ToInt(); String code = iter.nextUxToHexString(codeLen); - CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile, code); +// System.out.println(Arrays.toString(cmds)); + + CodeAttr codeAttr = new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code, cmds); + int exceptionLen = iter.nextU2ToInt(); + if(exceptionLen>0){ + String exTable = iter.nextUxToHexString(exceptionLen); + System.out.println("Encountered exception table , just ignore it :" + exTable); + + } + int childAttrLen = iter.nextU2ToInt(); @@ -59,6 +78,9 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ }else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(childAttrName)){ LocalVariableTable localVariableTable = LocalVariableTable.parse(iter); codeAttr.setLocalVariableTable(localVariableTable); + }else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(childAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); }else{ throw new RuntimeException("code 的子属性 "+ childAttrName+"没有解析"); } @@ -69,11 +91,10 @@ public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); - //buffer.append("Code:").append(code).append("\n"); -// for(int i=0;i fields = new ArrayList(); + private List methods = new ArrayList(); + + 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 addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + 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()); + + + } + + public String getClassName(){ + int thisClassIndex = this.clzIndex.getThisClassIndex(); + ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); + return thisClass.getClassName(); + } + public String getSuperClassName(){ + ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); + return superClass.getClassName(); + } + + public Method getMethod(String methodName, String paramAndReturnType){ + + for(Method m :methods){ + + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + public Method getMainMethod(){ + + return getMethod("main","([Ljava/lang/String;)V"); + } +} diff --git a/group19/1294642551/src/jvm/cmd/CommandParser.java b/group19/1294642551/src/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..8529a49ed5 --- /dev/null +++ b/group19/1294642551/src/jvm/cmd/CommandParser.java @@ -0,0 +1,175 @@ +package jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import jvm.clz.ClassFile; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if(codes == null || codes.length()== 0){ + throw new RuntimeException("code 代码不正确"); + } + + codes = codes.toUpperCase(); + CommandIterator iter = new CommandIterator(codes); + ArrayList cmds = new ArrayList(); + + while(iter.hasNext()){ + String opCode = iter.next2CharAsString(); + int cmdsLen = cmds.size(); + addNoOperandCmd(clzFile, cmds, opCode); + addOneOperandCmd(clzFile, iter, cmds, opCode); + addTwoOperandCmd(clzFile, iter, cmds, opCode); + + if(cmds.size() == cmdsLen){//说明opCode没有加入进cmds + throw new RuntimeException("oprate code: "+opCode+"未实现"); + } + + } + + calcuateOffset(cmds);//计算偏移 + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + + + return result; + } + + public static void addNoOperandCmd(ClassFile clzFile, + ArrayList cmds, String opCode ) { + NoOperandCmd noOperandCmd = null; + if(opCode.equals(aload_0) || opCode.equals(aload_1) || opCode.equals(aload_2) + || opCode.equals(iload_1) || opCode.equals(iload_2) ||opCode.equals(iload_3) + || opCode.equals(fload_3) || opCode.equals(voidreturn) || opCode.equals(dup) + || opCode.equals(astore_1)){ + noOperandCmd = new NoOperandCmd(clzFile, opCode); + cmds.add(noOperandCmd); + } + } + + public static void addOneOperandCmd(ClassFile clzFile, + CommandIterator iter, ArrayList cmds, String opCode ) { + OneOperandCmd oneOperandCmd = null; + boolean flag = false; + if(bipush.equals(opCode)){ + oneOperandCmd = new BiPushCmd(clzFile, opCode); + flag = true; + }else if(ldc.equals(opCode)){ + oneOperandCmd = new LdcCmd(clzFile, opCode); + flag = true; + } + if(flag){ + oneOperandCmd.setOperand(iter.next2CharAsInt()); + cmds.add(oneOperandCmd); + } + } + + public static void addTwoOperandCmd(ClassFile clzFile, + CommandIterator iter, ArrayList cmds, String opCode) { + TwoOperandCmd twoOperandCmd = null; + boolean flag = false; + if(new_object.equals(opCode)){ + twoOperandCmd = new NewObjectCmd(clzFile, opCode); + flag = true; + + }else if(invokespecial.equals(opCode)){ + twoOperandCmd = new InvokeSpecialCmd(clzFile, opCode); + flag = true; + + }else if(invokevirtual.equals(opCode)){ + twoOperandCmd = new InvokeVirtualCmd(clzFile, opCode); + flag = true; + + }else if(getfield.equals(opCode)){ + twoOperandCmd = new GetFieldCmd(clzFile, opCode); + flag = true; + + }else if(getstatic.equals(opCode)){ + twoOperandCmd = new GetStaticFieldCmd(clzFile, opCode); + flag = true; + + }else if(putfield.equals(opCode)){ + twoOperandCmd = new PutFieldCmd(clzFile, opCode); + flag = true; + + } + + if(flag){ + twoOperandCmd.setOprand1(iter.next2CharAsInt()); + twoOperandCmd.setOprand2(iter.next2CharAsInt()); + cmds.add(twoOperandCmd); + } + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group19/1294642551/src/jvm/method/Method.java b/group19/1294642551/src/jvm/method/Method.java index e2f4a9cbd4..5749091ffe 100644 --- a/group19/1294642551/src/jvm/method/Method.java +++ b/group19/1294642551/src/jvm/method/Method.java @@ -1,6 +1,7 @@ package jvm.method; import jvm.clz.ClassFile; +import jvm.cmd.ByteCodeCommand; import jvm.attr.AttributeInfo; import jvm.attr.CodeAttr; import jvm.constant.ConstantPool; @@ -90,5 +91,9 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return method; } + + public ByteCodeCommand[] getCmds() { + return this.getCodeAttr().getCmds(); + } } diff --git a/group19/1294642551/test/jvm/ClassFileloaderTest.java b/group19/1294642551/test/jvm/ClassFileloaderTest.java index be5ae2ae7c..d0f4ca4186 100644 --- a/group19/1294642551/test/jvm/ClassFileloaderTest.java +++ b/group19/1294642551/test/jvm/ClassFileloaderTest.java @@ -10,6 +10,10 @@ import jvm.clz.ClassFile; import jvm.clz.ClassIndex; +import jvm.cmd.BiPushCmd; +import jvm.cmd.ByteCodeCommand; +import jvm.cmd.OneOperandCmd; +import jvm.cmd.TwoOperandCmd; import jvm.constant.ClassInfo; import jvm.constant.ConstantPool; import jvm.constant.MethodRefInfo; @@ -264,6 +268,81 @@ private void assertMethodEquals(ConstantPool pool,Method m , String expectedName Assert.assertEquals(expectedDesc, methodDesc); Assert.assertEquals(expectedCode, code); } + + + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } From 7c294c0944869720a47d147a996bf2d32791af2f Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Thu, 11 May 2017 16:44:04 +0800 Subject: [PATCH 504/552] the seventh homework ---JVM4 javap --- .../src/jvm/constant/ClassInfo.java | 28 ++++++ .../src/jvm/print/ClassFilePrinter.java | 54 ++++++++++++ .../src/jvm/print/ConstantPoolPrinter.java | 87 +++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 group19/1294642551/src/jvm/constant/ClassInfo.java create mode 100644 group19/1294642551/src/jvm/print/ClassFilePrinter.java create mode 100644 group19/1294642551/src/jvm/print/ConstantPoolPrinter.java diff --git a/group19/1294642551/src/jvm/constant/ClassInfo.java b/group19/1294642551/src/jvm/constant/ClassInfo.java new file mode 100644 index 0000000000..4a3fb0474a --- /dev/null +++ b/group19/1294642551/src/jvm/constant/ClassInfo.java @@ -0,0 +1,28 @@ +package 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(); + } + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } +} diff --git a/group19/1294642551/src/jvm/print/ClassFilePrinter.java b/group19/1294642551/src/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..abff3602fe --- /dev/null +++ b/group19/1294642551/src/jvm/print/ClassFilePrinter.java @@ -0,0 +1,54 @@ +package jvm.print; + +import jvm.clz.ClassFile; +import jvm.constant.ClassInfo; +import jvm.constant.ConstantInfo; +import jvm.constant.ConstantPool; +import jvm.constant.FieldRefInfo; +import jvm.constant.MethodRefInfo; +import jvm.constant.NameAndTypeInfo; + +import jvm.constant.StringInfo; +import jvm.constant.UTF8Info; +import jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMajorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "D:\\Git Files\\coding2017\\group19\\1294642551\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "jvm.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group19/1294642551/src/jvm/print/ConstantPoolPrinter.java b/group19/1294642551/src/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..de85de2eaf --- /dev/null +++ b/group19/1294642551/src/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,87 @@ +package jvm.print; + +import jvm.constant.ClassInfo; +import jvm.constant.ConstantInfo; +import jvm.constant.ConstantPool; +import jvm.constant.FieldRefInfo; +import jvm.constant.MethodRefInfo; +import jvm.constant.NameAndTypeInfo; +import jvm.constant.StringInfo; +import jvm.constant.UTF8Info; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + ConstantInfo.Visitor visitor = new ConstantInfo.Visitor() { + + @Override + public void visitString(StringInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("String #").append(info.getIndex()); + System.out.println(buffer); + + } + + @Override + public void visitNameAndType(NameAndTypeInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("NameAndType #").append(info.getIndex1()).append(":#") + .append(info.getIndex2()); + System.out.println(buffer); + + } + + @Override + public void visitMethodRef(MethodRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("MethodRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitFieldRef(FieldRefInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("FieldRef #").append(info.getClassInfoIndex()).append(".#") + .append(info.getNameAndTypeIndex()); + System.out.println(buffer); + + } + + @Override + public void visitClassInfo(ClassInfo info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("Class #").append(info.getUtf8Index()) + .append(" ").append(info.getClassName()); + + System.out.println(buffer); + + } + + @Override + public void visistUTF8(UTF8Info info) { + StringBuilder buffer = new StringBuilder(); + buffer.append("UTF8 ").append(info.getValue()); + System.out.println(buffer); + + } + }; + + for(int i=1; i<=pool.getSize(); i++){ + ConstantInfo constantInfo = pool.getConstantInfo(i); + System.out.print("#"+i+"="); + constantInfo.accept(visitor); + } + } + + + + +} From e9ec7bd7b7ae8557fde6db92150c1f00a787c0b2 Mon Sep 17 00:00:00 2001 From: "wangxg922@chinaunincom.cn" Date: Thu, 11 May 2017 17:08:58 +0800 Subject: [PATCH 505/552] =?UTF-8?q?Signed-off-by:=20=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/coderising/jvm/attr/CodeAttr.java | 18 ++ .../src/com/coderising/jvm/clz/ClassFile.java | 18 +- .../src/com/coderising/jvm/cmd/AstoreCmd.java | 12 ++ .../src/com/coderising/jvm/cmd/BiPushCmd.java | 31 ++++ .../coderising/jvm/cmd/ByteCodeCommand.java | 130 ++++++++++++++ .../com/coderising/jvm/cmd/CommandParser.java | 163 ++++++++++++++++++ .../src/com/coderising/jvm/cmd/DupCmd.java | 17 ++ .../com/coderising/jvm/cmd/GetFieldCmd.java | 30 ++++ .../coderising/jvm/cmd/GetStaticFieldCmd.java | 31 ++++ .../coderising/jvm/cmd/InvokeSpecialCmd.java | 31 ++++ .../coderising/jvm/cmd/InvokeVirtualCmd.java | 29 ++++ .../src/com/coderising/jvm/cmd/LdcCmd.java | 37 ++++ .../src/com/coderising/jvm/cmd/LoadCmd.java | 12 ++ .../com/coderising/jvm/cmd/NewObjectCmd.java | 27 +++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 31 ++++ .../com/coderising/jvm/cmd/OneOperandCmd.java | 29 ++++ .../com/coderising/jvm/cmd/PutFieldCmd.java | 27 +++ .../com/coderising/jvm/cmd/TwoOperandCmd.java | 67 +++++++ .../com/coderising/jvm/cmd/VoidReturnCmd.java | 12 ++ .../coderising/jvm/constant/ConstantPool.java | 2 +- .../jvm/engine/ExecutionResult.java | 56 ++++++ .../coderising/jvm/engine/ExecutorEngine.java | 54 ++++++ .../src/com/coderising/jvm/engine/Heap.java | 39 +++++ .../com/coderising/jvm/engine/JavaObject.java | 71 ++++++++ .../com/coderising/jvm/engine/MethodArea.java | 68 ++++++++ .../com/coderising/jvm/engine/MiniJVM.java | 28 +++ .../com/coderising/jvm/engine/StackFrame.java | 95 ++++++++++ .../src/com/coderising/jvm/field/Field.java | 5 + .../jvm/loader/ClassFileParser.java | 4 +- .../src/com/coderising/jvm/method/Method.java | 12 ++ .../jvm/print/ClassFilePrinter.java | 54 ++++++ .../jvm/print/ConstantPoolPrinter.java | 130 ++++++++++++++ .../jvm/test/ClassFileloaderTest.java | 151 +++++++++++++++- .../com/coderising/jvm/test/MiniJVMTest.java | 28 +++ .../com/coding/basic/queue/CircleQueue.java | 54 ++++++ .../src/com/coding/basic/queue/Josephus.java | 33 ++++ .../com/coding/basic/queue/JosephusTest.java | 27 +++ .../src/com/coding/basic/queue/Queue.java | 61 +++++++ .../basic/queue/QueueWithTwoStacks.java | 55 ++++++ .../com/coding/basic/stack/QuickMinStack.java | 45 +++++ .../com/coding/basic/stack/StackUtilTest.java | 2 + .../basic/stack/StackWithTwoQueues.java | 42 +++++ .../basic/stack/TwoStackInOneArray.java | 84 +++++++++ .../coding/basic/stack/expr/InfixExpr.java | 69 ++++++++ .../basic/stack/expr/InfixExprTest.java | 52 ++++++ .../basic/stack/expr/InfixToPostfix.java | 46 +++++ .../coding/basic/stack/expr/PostfixExpr.java | 52 ++++++ .../basic/stack/expr/PostfixExprTest.java | 41 +++++ .../coding/basic/stack/expr/PrefixExpr.java | 55 ++++++ .../basic/stack/expr/PrefixExprTest.java | 45 +++++ .../com/coding/basic/stack/expr/Token.java | 51 ++++++ .../coding/basic/stack/expr/TokenParser.java | 41 +++++ .../basic/stack/expr/TokenParserTest.java | 40 +++++ 53 files changed, 2439 insertions(+), 5 deletions(-) create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/AstoreCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/BiPushCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/ByteCodeCommand.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/CommandParser.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/DupCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/GetFieldCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/LdcCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/LoadCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/NewObjectCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/NoOperandCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/OneOperandCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/PutFieldCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/TwoOperandCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/cmd/VoidReturnCmd.java create mode 100644 group11/996108220/src/com/coderising/jvm/engine/ExecutionResult.java create mode 100644 group11/996108220/src/com/coderising/jvm/engine/ExecutorEngine.java create mode 100644 group11/996108220/src/com/coderising/jvm/engine/Heap.java create mode 100644 group11/996108220/src/com/coderising/jvm/engine/JavaObject.java create mode 100644 group11/996108220/src/com/coderising/jvm/engine/MethodArea.java create mode 100644 group11/996108220/src/com/coderising/jvm/engine/MiniJVM.java create mode 100644 group11/996108220/src/com/coderising/jvm/engine/StackFrame.java create mode 100644 group11/996108220/src/com/coderising/jvm/print/ClassFilePrinter.java create mode 100644 group11/996108220/src/com/coderising/jvm/print/ConstantPoolPrinter.java create mode 100644 group11/996108220/src/com/coderising/jvm/test/MiniJVMTest.java create mode 100644 group11/996108220/src/com/coding/basic/queue/CircleQueue.java create mode 100644 group11/996108220/src/com/coding/basic/queue/Josephus.java create mode 100644 group11/996108220/src/com/coding/basic/queue/JosephusTest.java create mode 100644 group11/996108220/src/com/coding/basic/queue/Queue.java create mode 100644 group11/996108220/src/com/coding/basic/queue/QueueWithTwoStacks.java create mode 100644 group11/996108220/src/com/coding/basic/stack/QuickMinStack.java create mode 100644 group11/996108220/src/com/coding/basic/stack/StackWithTwoQueues.java create mode 100644 group11/996108220/src/com/coding/basic/stack/TwoStackInOneArray.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/InfixExpr.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/InfixExprTest.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/InfixToPostfix.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/PostfixExpr.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/PostfixExprTest.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/PrefixExpr.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/PrefixExprTest.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/Token.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/TokenParser.java create mode 100644 group11/996108220/src/com/coding/basic/stack/expr/TokenParserTest.java diff --git a/group11/996108220/src/com/coderising/jvm/attr/CodeAttr.java b/group11/996108220/src/com/coderising/jvm/attr/CodeAttr.java index aeb0d91f16..dfc85bdb8e 100644 --- a/group11/996108220/src/com/coderising/jvm/attr/CodeAttr.java +++ b/group11/996108220/src/com/coderising/jvm/attr/CodeAttr.java @@ -1,6 +1,10 @@ package com.coderising.jvm.attr; +import java.util.ArrayList; + import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.LdcCmd; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.loader.ByteCodeIterator; @@ -49,6 +53,20 @@ private void setStackMapTable(StackMapTable t) { } +// public ByteCodeCommand[] getCmds() { +// // TODO Auto-generated method stub +// int index=0; +// ArrayList list=new ArrayList<>(); +// while (index<=code.length()) { +// String opCode=code.substring(index,index+1); +// if (opCode.equals("2a")) { +// list.add(new LdcCmd(clzFile, opCode)); +// } +// +// } +// return null; +// } + diff --git a/group11/996108220/src/com/coderising/jvm/clz/ClassFile.java b/group11/996108220/src/com/coderising/jvm/clz/ClassFile.java index 5fb4b5c922..94056eb2e0 100644 --- a/group11/996108220/src/com/coderising/jvm/clz/ClassFile.java +++ b/group11/996108220/src/com/coderising/jvm/clz/ClassFile.java @@ -5,6 +5,7 @@ import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.field.Field; import com.coderising.jvm.method.Method; @@ -79,13 +80,26 @@ public void print(){ } - private String getClassName(){ + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + public Method getMainMethod() { + return getMethod("main", null); + } + public Method getMethod(String string, String string2) { + for (int i = 0; i < methods.size(); i++) { + Method method=methods.get(i); + UTF8Info utf8Info=(UTF8Info)pool.getConstantInfo(method.getNameIndex()); + if (utf8Info.getValue().equals(string)) { + return method; + } + } + return null; + } } diff --git a/group11/996108220/src/com/coderising/jvm/cmd/AstoreCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/AstoreCmd.java new file mode 100644 index 0000000000..ea84805be1 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/AstoreCmd.java @@ -0,0 +1,12 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public class AstoreCmd extends NoOperandCmd{ + + public AstoreCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + // TODO Auto-generated constructor stub + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/BiPushCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..1f60641d2d --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/BiPushCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group11/996108220/src/com/coderising/jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..892bfcd51d --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,130 @@ +package com.coderising.jvm.cmd; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial");//3 + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield");//3 + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0");//1 + codeMap.put("2B", "aload_1");//1 + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + + + + public String toString(){ + + StringBuffer buffer = new StringBuffer(); + buffer.append(this.opCode); + + return buffer.toString(); + } + public abstract String toString(ConstantPool pool); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode.toUpperCase()); + if(txt == null){ + return opCode; + } + return txt; + } + + public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/CommandParser.java b/group11/996108220/src/com/coderising/jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..fb48eb2910 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/CommandParser.java @@ -0,0 +1,163 @@ +package com.coderising.jvm.cmd; + +import java.util.ArrayList; +import java.util.List; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + ArrayList list=new ArrayList<>(); + CommandIterator iterator=new CommandIterator(codes); + while (iterator.hasNext()) { + String opCode=iterator.next2CharAsString(); + if (opCode.equalsIgnoreCase(aload_0)) { + list.add(new LoadCmd(clzFile, opCode)); + } + else if (opCode.equalsIgnoreCase(invokespecial)) { + InvokeSpecialCmd invokeSpecialCmd=new InvokeSpecialCmd(clzFile, opCode); + invokeSpecialCmd.setOprand1(iterator.next2CharAsInt()); + invokeSpecialCmd.setOprand2(iterator.next2CharAsInt()); + list.add(invokeSpecialCmd); + + } + else if (opCode.equalsIgnoreCase(aload_1)) { + list.add(new LoadCmd(clzFile, opCode)); + } + else if (opCode.equalsIgnoreCase(putfield)){ + PutFieldCmd putFieldCmd=new PutFieldCmd(clzFile, opCode); + putFieldCmd.setOprand1(iterator.next2CharAsInt()); + putFieldCmd.setOprand2(iterator.next2CharAsInt()); + list.add(putFieldCmd); + + } + else if (opCode.equalsIgnoreCase(iload_2)) { + list.add(new LoadCmd(clzFile, opCode)); + } + else if (opCode.equalsIgnoreCase(new_object)) { + NewObjectCmd newObjectCmd=new NewObjectCmd(clzFile, opCode); + newObjectCmd.setOprand1(iterator.next2CharAsInt()); + newObjectCmd.setOprand2(iterator.next2CharAsInt()); + list.add(newObjectCmd); + } + else if (opCode.equalsIgnoreCase(dup)) { + + list.add(new DupCmd(clzFile, opCode)); + } + else if (opCode.equalsIgnoreCase(bipush)) { + BiPushCmd biPushCmd=new BiPushCmd(clzFile, opCode); + biPushCmd.setOperand(iterator.next2CharAsInt()); + list.add(biPushCmd); + } + else if (opCode.equalsIgnoreCase(invokevirtual)) { + InvokeVirtualCmd invokeVirtualCmd=new InvokeVirtualCmd(clzFile, opCode); + invokeVirtualCmd.setOprand1(iterator.next2CharAsInt()); + invokeVirtualCmd.setOprand2(iterator.next2CharAsInt()); + list.add(invokeVirtualCmd); + } + else if (opCode.equalsIgnoreCase(voidreturn)) { + list.add(new VoidReturnCmd(clzFile, opCode)); + } + else if (opCode.equalsIgnoreCase(getstatic)) { + GetStaticFieldCmd getStaticFieldCmd=new GetStaticFieldCmd(clzFile, opCode); + getStaticFieldCmd.setOprand1(iterator.next2CharAsInt()); + getStaticFieldCmd.setOprand2(iterator.next2CharAsInt()); + list.add(getStaticFieldCmd); + } + else if (opCode.equalsIgnoreCase(getfield)) { + GetFieldCmd getFieldCmd=new GetFieldCmd(clzFile, opCode); + getFieldCmd.setOprand1(iterator.next2CharAsInt()); + getFieldCmd.setOprand2(iterator.next2CharAsInt()); + list.add(getFieldCmd); + } + else if (opCode.equalsIgnoreCase(ldc)) { + LdcCmd ldcCmd=new LdcCmd(clzFile, opCode); + ldcCmd.setOperand(iterator.next2CharAsInt()); + list.add(ldcCmd); + } + else if (opCode.equalsIgnoreCase(astore_1)) { + list.add(new AstoreCmd(clzFile, opCode)); + } + } + calcuateOffset(list); + ByteCodeCommand [] byteCodeCommands=new ByteCodeCommand [list.size()]; + for (int i = 0; i < byteCodeCommands.length; i++) { + byteCodeCommands[i]=list.get(i); + } + return byteCodeCommands; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/DupCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/DupCmd.java new file mode 100644 index 0000000000..6ad1802585 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/DupCmd.java @@ -0,0 +1,17 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class DupCmd extends NoOperandCmd{ + + public DupCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + // TODO Auto-generated constructor stub + } + + + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/GetFieldCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..c771d535f7 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/GetFieldCmd.java @@ -0,0 +1,30 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..e6876c36bb --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..8d60e72341 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..a1f2d1a1c6 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + + + + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/LdcCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..d6b102981b --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/LdcCmd.java @@ -0,0 +1,37 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} \ No newline at end of file diff --git a/group11/996108220/src/com/coderising/jvm/cmd/LoadCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/LoadCmd.java new file mode 100644 index 0000000000..8597ec613d --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/LoadCmd.java @@ -0,0 +1,12 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public class LoadCmd extends NoOperandCmd { + + public LoadCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + // TODO Auto-generated constructor stub + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/NewObjectCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..caa2609928 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/NewObjectCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..c3cda9b52e --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -0,0 +1,31 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/OneOperandCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..71e09f7578 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/OneOperandCmd.java @@ -0,0 +1,29 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/PutFieldCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..dc31cf084d --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/PutFieldCmd.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.StackFrame; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile,String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/TwoOperandCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..6c0cf53082 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile,String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } +} diff --git a/group11/996108220/src/com/coderising/jvm/cmd/VoidReturnCmd.java b/group11/996108220/src/com/coderising/jvm/cmd/VoidReturnCmd.java new file mode 100644 index 0000000000..ffc06f8fa1 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/cmd/VoidReturnCmd.java @@ -0,0 +1,12 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; + +public class VoidReturnCmd extends NoOperandCmd{ + + public VoidReturnCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + // TODO Auto-generated constructor stub + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/constant/ConstantPool.java b/group11/996108220/src/com/coderising/jvm/constant/ConstantPool.java index 86c0445695..93506b1e20 100644 --- a/group11/996108220/src/com/coderising/jvm/constant/ConstantPool.java +++ b/group11/996108220/src/com/coderising/jvm/constant/ConstantPool.java @@ -23,7 +23,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group11/996108220/src/com/coderising/jvm/engine/ExecutionResult.java b/group11/996108220/src/com/coderising/jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..8f6c51e52a --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/engine/ExecutionResult.java @@ -0,0 +1,56 @@ +package com.coderising.jvm.engine; + +import com.coderising.jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group11/996108220/src/com/coderising/jvm/engine/ExecutorEngine.java b/group11/996108220/src/com/coderising/jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..9b671c4cdb --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/engine/ExecutorEngine.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.engine; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.coderising.jvm.attr.CodeAttr; +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.method.Method; + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + StackFrame mainFrame=StackFrame.create(mainMethod); + stack.push(mainFrame); + while (!stack.isEmpty()) { + StackFrame frame=stack.peek(); + ExecutionResult result=frame.execute(); + if (result.isPauseAndRunNewFrame()) { + Method nextMethod=result.getNextMethod(); + StackFrame nextFrame=StackFrame.create(nextMethod); + nextFrame.setCallerFrame(frame); + //设置传入参数 + setupFunctionCallParams(frame, nextFrame); + stack.push(nextFrame); + } + else { + stack.pop(); + } + + } + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + Method nextMethod=nextFrame.getMethod(); + n + + + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/engine/Heap.java b/group11/996108220/src/com/coderising/jvm/engine/Heap.java new file mode 100644 index 0000000000..82ad210cef --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package com.coderising.jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/engine/JavaObject.java b/group11/996108220/src/com/coderising/jvm/engine/JavaObject.java new file mode 100644 index 0000000000..71ba382d9a --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group11/996108220/src/com/coderising/jvm/engine/MethodArea.java b/group11/996108220/src/com/coderising/jvm/engine/MethodArea.java new file mode 100644 index 0000000000..781e81acf1 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/engine/MethodArea.java @@ -0,0 +1,68 @@ +package com.coderising.jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group11/996108220/src/com/coderising/jvm/engine/MiniJVM.java b/group11/996108220/src/com/coderising/jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..443524cc5f --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/engine/MiniJVM.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.engine; +import java.io.FileNotFoundException; +import java.io.IOException; + +import com.coderising.jvm.loader.ClassFileLoader; + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand [] cmds = m.getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group11/996108220/src/com/coderising/jvm/field/Field.java b/group11/996108220/src/com/coderising/jvm/field/Field.java index 07d4633599..5c58695b9a 100644 --- a/group11/996108220/src/com/coderising/jvm/field/Field.java +++ b/group11/996108220/src/com/coderising/jvm/field/Field.java @@ -29,5 +29,10 @@ public static Field parse(ConstantPool pool,ByteCodeIterator iter){ return null; } + public String toString() { + UTF8Info name=(UTF8Info)(pool.getConstantInfo(nameIndex)); + UTF8Info descriptor=(UTF8Info)(pool.getConstantInfo(descriptorIndex)); + return name.getValue()+":"+descriptor.getValue(); + } } diff --git a/group11/996108220/src/com/coderising/jvm/loader/ClassFileParser.java b/group11/996108220/src/com/coderising/jvm/loader/ClassFileParser.java index 2b705bb4dc..cbe619c4a5 100644 --- a/group11/996108220/src/com/coderising/jvm/loader/ClassFileParser.java +++ b/group11/996108220/src/com/coderising/jvm/loader/ClassFileParser.java @@ -57,7 +57,9 @@ private Method parseMethod(ByteCodeIterator iter,ClassFile clzFile) { int maxStack=iter.nextU2ToInt(); int maxLocals=iter.nextU2ToInt(); int codeLen=iter.nextU4ToInt(); - String code=iter.getByte(codeLen).toString(); + byte[] codes=iter.getByte(codeLen); + + String code=Util.byteToHexString(codes); CodeAttr codeAttr=new CodeAttr(attrNameIndex, attrLen, maxStack, maxLocals, codeLen, code); int exceptionLength=iter.nextU2ToInt(); int count=iter.nextU2ToInt(); diff --git a/group11/996108220/src/com/coderising/jvm/method/Method.java b/group11/996108220/src/com/coderising/jvm/method/Method.java index 2e90726e95..44c8e89ec6 100644 --- a/group11/996108220/src/com/coderising/jvm/method/Method.java +++ b/group11/996108220/src/com/coderising/jvm/method/Method.java @@ -1,6 +1,13 @@ package com.coderising.jvm.method; +import java.util.ArrayList; + import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.CommandParser; +import com.coderising.jvm.cmd.InvokeSpecialCmd; +import com.coderising.jvm.cmd.LdcCmd; +import com.coderising.jvm.cmd.PutFieldCmd; import com.coderising.jvm.attr.AttributeInfo; import com.coderising.jvm.attr.CodeAttr; import com.coderising.jvm.constant.ConstantPool; @@ -52,4 +59,9 @@ public static Method parse(ClassFile clzFile, ByteCodeIterator iter){ return null; } + + public ByteCodeCommand[] getCmds() { + + return CommandParser.parse(clzFile, codeAttr.getCode()); + } } diff --git a/group11/996108220/src/com/coderising/jvm/print/ClassFilePrinter.java b/group11/996108220/src/com/coderising/jvm/print/ClassFilePrinter.java new file mode 100644 index 0000000000..5b51e51aed --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/print/ClassFilePrinter.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.print; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; + +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ClassFilePrinter { + ClassFile clzFile = null; + public ClassFilePrinter(ClassFile clzFile){ + this.clzFile = clzFile; + } + + public void print(){ + + if(clzFile.getAccessFlag().isPublicClass()){ + System.out.println("Access flag : public "); + } + System.out.println("Class Name:"+ clzFile.getClassName()); + + System.out.println("Super Class Name:"+ clzFile.getSuperClassName()); + + System.out.println("minor version:" + clzFile.getMinorVersion()); + + System.out.println("major version:" + clzFile.getMinorVersion()); + + ConstantPoolPrinter cnstPoolPrinter = new ConstantPoolPrinter(clzFile.getConstantPool()); + cnstPoolPrinter.print(); + + + + + } + + public static void main(String[] args){ + String path = "F:\\mycoding2017\\group11\\996108220\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + + ClassFilePrinter printer = new ClassFilePrinter(clzFile); + + printer.print(); + } +} diff --git a/group11/996108220/src/com/coderising/jvm/print/ConstantPoolPrinter.java b/group11/996108220/src/com/coderising/jvm/print/ConstantPoolPrinter.java new file mode 100644 index 0000000000..ced6fc2354 --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/print/ConstantPoolPrinter.java @@ -0,0 +1,130 @@ +package com.coderising.jvm.print; + +import java.nio.Buffer; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.constant.ClassInfo; +import com.coderising.jvm.constant.ConstantInfo; +import com.coderising.jvm.constant.ConstantPool; +import com.coderising.jvm.constant.FieldRefInfo; +import com.coderising.jvm.constant.MethodRefInfo; +import com.coderising.jvm.constant.NameAndTypeInfo; +import com.coderising.jvm.constant.StringInfo; +import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.loader.ClassFileLoader; + +public class ConstantPoolPrinter { + ConstantPool pool; + ConstantPoolPrinter(ConstantPool pool){ + this.pool = pool; + } + public void print(){ + + System.out.println("Constant Pool:"); + + for (int i = 0; i < pool.getSize(); i++) { + ConstantInfo info=pool.getConstantInfo(i); + StringBuffer pringBuffer=new StringBuffer(); + if (i<10) { + pringBuffer.append(" #"+Integer.toString(i)+" "); + } + else { + pringBuffer.append("#"+Integer.toString(i)+" "); + } + if (info instanceof UTF8Info) { + pringBuffer.append("Utf8"); + String buffer=String.format("%-30s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + UTF8Info utf8Info=(UTF8Info)info; + pringBuffer.append(utf8Info.getValue()); + } + else if (info instanceof ClassInfo) { + pringBuffer.append("Class"); + String buffer=String.format("%-30s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + ClassInfo classInfo=(ClassInfo)info; + pringBuffer.append("#"+Integer.toString(classInfo.getUtf8Index())); + buffer=String.format("%-40s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + UTF8Info utf8Info=(UTF8Info)pool.getConstantInfo(classInfo.getUtf8Index()); + pringBuffer.append("// "+utf8Info.getValue()); + } + else if (info instanceof NameAndTypeInfo) { + pringBuffer.append("NameAndType"); + String buffer=String.format("%-30s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + NameAndTypeInfo nameAndTypeInfo=(NameAndTypeInfo)info; + int index1=nameAndTypeInfo.getIndex1(); + int index2=nameAndTypeInfo.getIndex2(); + pringBuffer.append("#"+Integer.toString(index1)+";"+"#"+Integer.toString(index2)); + buffer=String.format("%-40s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + String string1=((UTF8Info)pool.getConstantInfo(index1)).getValue(); + String string2=((UTF8Info)pool.getConstantInfo(index2)).getValue(); + pringBuffer.append("// "+string1+";"+string2); + + } + else if (info instanceof FieldRefInfo) { + pringBuffer.append("FieldRef"); + String buffer=String.format("%-30s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + FieldRefInfo fieldRefInfo=(FieldRefInfo)info; + int classInfoIndex=fieldRefInfo.getClassInfoIndex(); + int nameAndTypeIndex=fieldRefInfo.getNameAndTypeIndex(); + pringBuffer.append("#"+Integer.toString(classInfoIndex)+";"+"#"+Integer.toString(nameAndTypeIndex)); + buffer=String.format("%-40s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + int index1=((ClassInfo)pool.getConstantInfo(classInfoIndex)).getUtf8Index(); + int index2=((NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex)).getIndex1(); + int index3=((NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex)).getIndex2(); + String string1=((UTF8Info)pool.getConstantInfo(index1)).getValue(); + String string2=((UTF8Info)pool.getConstantInfo(index2)).getValue(); + String string3=((UTF8Info)pool.getConstantInfo(index3)).getValue(); + pringBuffer.append("// "+string1+";"+string2+";"+string3); + } + else if (info instanceof MethodRefInfo) { + pringBuffer.append("MethodRef"); + String buffer=String.format("%-30s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + MethodRefInfo methodRefInfo=(MethodRefInfo)info; + int classInfoIndex=methodRefInfo.getClassInfoIndex(); + int nameAndTypeIndex=methodRefInfo.getNameAndTypeIndex(); + pringBuffer.append("#"+Integer.toString(classInfoIndex)+";"+"#"+Integer.toString(nameAndTypeIndex)); + buffer=String.format("%-40s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + int index1=((ClassInfo)pool.getConstantInfo(classInfoIndex)).getUtf8Index(); + int index2=((NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex)).getIndex1(); + int index3=((NameAndTypeInfo)pool.getConstantInfo(nameAndTypeIndex)).getIndex2(); + String string1=((UTF8Info)pool.getConstantInfo(index1)).getValue(); + String string2=((UTF8Info)pool.getConstantInfo(index2)).getValue(); + String string3=((UTF8Info)pool.getConstantInfo(index3)).getValue(); + pringBuffer.append("// "+string1+";"+string2+";"+string3); + } + else if (info instanceof StringInfo) { + pringBuffer.append("String"); + String buffer=String.format("%-30s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + StringInfo stringInfo=(StringInfo)info; + pringBuffer.append("#"+Integer.toString(stringInfo.getIndex())); + buffer=String.format("%-40s", pringBuffer); + pringBuffer=new StringBuffer(buffer); + UTF8Info utf8Info=(UTF8Info)pool.getConstantInfo(stringInfo.getIndex()); + pringBuffer.append("// "+utf8Info.getValue()); + } + System.out.println(pringBuffer); + } + + + } + public static void main(String[] args) { + String path = "F:\\mycoding2017\\group11\\996108220\\bin"; + ClassFileLoader loader = new ClassFileLoader(); + loader.addClassPath(path); + String className = "com.coderising.jvm.test.EmployeeV1"; + + ClassFile clzFile = loader.loadClass(className); + ConstantPool pool=clzFile.getConstantPool(); + ConstantPoolPrinter printer=new ConstantPoolPrinter(pool); + printer.print(); + } +} diff --git a/group11/996108220/src/com/coderising/jvm/test/ClassFileloaderTest.java b/group11/996108220/src/com/coderising/jvm/test/ClassFileloaderTest.java index 44d000a19a..eae273edc6 100644 --- a/group11/996108220/src/com/coderising/jvm/test/ClassFileloaderTest.java +++ b/group11/996108220/src/com/coderising/jvm/test/ClassFileloaderTest.java @@ -1,17 +1,26 @@ package com.coderising.jvm.test; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; + import com.coderising.jvm.clz.ClassFile; import com.coderising.jvm.clz.ClassIndex; +import com.coderising.jvm.cmd.BiPushCmd; +import com.coderising.jvm.cmd.ByteCodeCommand; +import com.coderising.jvm.cmd.OneOperandCmd; +import com.coderising.jvm.cmd.TwoOperandCmd; import com.coderising.jvm.constant.ClassInfo; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.MethodRefInfo; import com.coderising.jvm.constant.NameAndTypeInfo; import com.coderising.jvm.constant.UTF8Info; +import com.coderising.jvm.field.Field; import com.coderising.jvm.loader.ClassFileLoader; +import com.coderising.jvm.method.Method; @@ -195,7 +204,147 @@ public void testClassIndex(){ Assert.assertEquals(FULL_QUALIFIED_CLASS_NAME, thisClassInfo.getClassName()); Assert.assertEquals("java/lang/Object", superClassInfo.getClassName()); } + @Test + public void testReadFields(){ + + List fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + @Test + public void testByteCodeCommand(){ + { + Method initMethod = clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } - + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } } diff --git a/group11/996108220/src/com/coderising/jvm/test/MiniJVMTest.java b/group11/996108220/src/com/coderising/jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..787c0d954d --- /dev/null +++ b/group11/996108220/src/com/coderising/jvm/test/MiniJVMTest.java @@ -0,0 +1,28 @@ +package com.coderising.jvm.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.jvm.engine.MiniJVM; + +public class MiniJVMTest { + + static final String PATH = "C:\\Users\\liuxin\\git\\coding2017\\liuxin\\mini-jvm\\answer\\bin"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + + } + +} diff --git a/group11/996108220/src/com/coding/basic/queue/CircleQueue.java b/group11/996108220/src/com/coding/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..cfb51ef3b1 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/queue/CircleQueue.java @@ -0,0 +1,54 @@ +package com.coding.basic.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + //用数组来保存循环队列的元素 + private Object[] elementData = new Object[DEFAULT_SIZE] ; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public boolean isEmpty() { + return front==rear; + + } + + public int size() { + return (rear-front)%DEFAULT_SIZE; + } + + + + public void enQueue(E data) { + if ((rear+1)%DEFAULT_SIZE==front) { + throw(new ArrayIndexOutOfBoundsException()); + } + else { + elementData[rear]=data; + rear=(rear+1)%DEFAULT_SIZE; + } + } + + public E deQueue() { + if (isEmpty()) { + throw(new NullPointerException()); + + } + else { + int index=front; + front=(front+1)%DEFAULT_SIZE; + return (E) elementData[index] ; + } + + } +} diff --git a/group11/996108220/src/com/coding/basic/queue/Josephus.java b/group11/996108220/src/com/coding/basic/queue/Josephus.java new file mode 100644 index 0000000000..2816df89b7 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/queue/Josephus.java @@ -0,0 +1,33 @@ +package com.coding.basic.queue; + +import java.util.ArrayList; +import java.util.List; + + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + List list=new ArrayList(); + for (int i = 1; i <= n; i++) { + list.add(fun(n,m,i)); + } + return list; + } + + private static Integer fun(int n, int m, int i) { + if (i==1) { + return (n+m-1)%n; + } + else { + return (fun(n-1, m, i-1)+m)%n; + } + } + +} diff --git a/group11/996108220/src/com/coding/basic/queue/JosephusTest.java b/group11/996108220/src/com/coding/basic/queue/JosephusTest.java new file mode 100644 index 0000000000..7d90318b51 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/queue/JosephusTest.java @@ -0,0 +1,27 @@ +package com.coding.basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class JosephusTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testExecute() { + + Assert.assertEquals("[1, 3, 5, 0, 4, 2, 6]", Josephus.execute(7, 2).toString()); + + } + +} diff --git a/group11/996108220/src/com/coding/basic/queue/Queue.java b/group11/996108220/src/com/coding/basic/queue/Queue.java new file mode 100644 index 0000000000..c4c4b7325e --- /dev/null +++ b/group11/996108220/src/com/coding/basic/queue/Queue.java @@ -0,0 +1,61 @@ +package com.coding.basic.queue; + +import java.util.NoSuchElementException; + +public class Queue { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group11/996108220/src/com/coding/basic/queue/QueueWithTwoStacks.java b/group11/996108220/src/com/coding/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..5d4a25fb96 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,55 @@ +package com.coding.basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + + + + public boolean isEmpty() { + return size()==0; + } + + + + public int size() { + return stack1.size()+stack2.size(); + } + + + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if(isEmpty()){ + throw(new NullPointerException()); + } + if (stack2.isEmpty()) { + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + } + return stack2.pop(); + } + + + + } + diff --git a/group11/996108220/src/com/coding/basic/stack/QuickMinStack.java b/group11/996108220/src/com/coding/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..1b124ab005 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/QuickMinStack.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + Stack stack=null; + Stack min=null; + public QuickMinStack() { + stack=new Stack(); + min=new Stack(); + } + public void push(int data){ + if (stack.isEmpty()) { + int copy=data; + push(data); + push(copy); + + } + else { + if (data<(int)min.peek()) { + int copy=data; + push(data); + push(copy); + } + else { + stack.push(data); + min.push(min.peek()); + } + } + } + public int pop(){ + if (stack.isEmpty()) { + throw(new NullPointerException()); + } + min.pop(); + return (int) stack.pop(); + } + public int findMin(){ + return (int) min.peek(); + } +} diff --git a/group11/996108220/src/com/coding/basic/stack/StackUtilTest.java b/group11/996108220/src/com/coding/basic/stack/StackUtilTest.java index e921ed991c..6d7d2e013f 100644 --- a/group11/996108220/src/com/coding/basic/stack/StackUtilTest.java +++ b/group11/996108220/src/com/coding/basic/stack/StackUtilTest.java @@ -9,6 +9,8 @@ import org.junit.BeforeClass; import org.junit.Test; +import com.coding.basic.stack.expr.InfixExpr; + public class StackUtilTest { Stack s; @Before diff --git a/group11/996108220/src/com/coding/basic/stack/StackWithTwoQueues.java b/group11/996108220/src/com/coding/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..15eba7add3 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,42 @@ +package com.coding.basic.stack; + +import com.coding.basic.Queue; + + +public class StackWithTwoQueues { + Queue queue1=new Queue<>(); + Queue queue2=new Queue<>(); + + public void push(int data) { + if (queue1.isEmpty()&&queue2.isEmpty()) { + queue1.enQueue(data); + } + else if (queue1.isEmpty()&&!queue2.isEmpty()) { + queue2.enQueue(data); + } + else if (!queue1.isEmpty()&&queue2.isEmpty()) { + queue1.enQueue(data); + } + } + + public int pop() { + if (queue1.isEmpty()&&queue2.isEmpty()) { + throw(new RuntimeException()); + } + else if (queue1.isEmpty()&&!queue2.isEmpty()) { + for (int i = 0; i < queue2.size()-1; i++) { + queue1.enQueue((int)queue2.deQueue()); + } + return (int) queue2.deQueue(); + } + else if (!queue1.isEmpty()&&queue2.isEmpty()) { + for (int i = 0; i < queue1.size()-1; i++) { + queue2.enQueue((int)queue1.deQueue()); + } + return (int) queue1.deQueue(); + } + return 0; + } + + +} diff --git a/group11/996108220/src/com/coding/basic/stack/TwoStackInOneArray.java b/group11/996108220/src/com/coding/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..83e8f611dc --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,84 @@ +package com.coding.basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + Object[] data = new Object[10]; + int top1=-1; + int top2=10; + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + if (top1+1==top2) { + grow(data,top1,top2); + } + data[++top1]=o; + } + private void grow(Object[] data2,int top1, int top2) { + // TODO Auto-generated method stub + Object[] data=new Object[data2.length+data2.length/2]; + System.arraycopy(data2,0,data,0,top1+1); + System.arraycopy(data2,top2,data,top2+data2.length/2,data2.length-top2+1); + this.top2=top2+data2.length/2; + this.data=data; + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + if (top1+1>0) { + return data[top1--]; + } + return null; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + + public Object peek1(){ + if (top1+1>0) { + return data[top1]; + } + return null; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + if (top1+1==top2) { + grow(data,top1,top2); + } + data[--top2]=o; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + if (top2 tokens= tokenParser.parse(expr); + Stack opStack=new Stack<>(); + Stack numStack=new Stack<>(); + for (Token token : tokens) { + if (token.isNumber()) { + numStack.push((float)(token.getIntValue())); + } + else { + while (!opStack.isEmpty()&&!token.hasHigherPriority(opStack.peek())) { + float op2=numStack.pop(); + float op1= numStack.pop(); + + char op=opStack.pop().toString().charAt(0); + numStack.add(caculate(op1,op2,op)); + + } + opStack.push(token); + } + } + + while (opStack.size()!=0) { + + float op2=numStack.pop(); + float op1= numStack.pop(); + char op=opStack.pop().toString().charAt(0); + numStack.add(caculate(op1,op2,op)); + } + return (float) numStack.pop(); + } + public float caculate(float op1,float op2,char op){ + + + float tmpResult = 0; + switch(op){ + case '+': + tmpResult = op1 + op2; + break; + case '-': + tmpResult = op1 - op2; + break; + case '*': + tmpResult = op1 * op2; + break; + case '/': + tmpResult = op1 / op2; + break; + } + return tmpResult; + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/expr/InfixExprTest.java b/group11/996108220/src/com/coding/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..02af48b92b --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300* 20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3 *4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3* 20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/ 2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/expr/InfixToPostfix.java b/group11/996108220/src/com/coding/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..e53af75714 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,46 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + + +public class InfixToPostfix { + + public static List convert(String expr) { + TokenParser tokenParser=new TokenParser(); + List tokens=tokenParser.parse(expr); + List postfixTokens=new ArrayList<>(); + Stack opStack=new Stack<>(); + for (Token token : tokens) { + if (token.isNumber()) { + postfixTokens.add(token); + } + else { + while (!opStack.isEmpty()&&opStack.peek().hasHigherPriority(token)) { + postfixTokens.add(opStack.pop()); + } + opStack.add(token); + } + } + while (!opStack.isEmpty()) { + postfixTokens.add(opStack.pop()); + + } + return postfixTokens; + } + + public static void main(String[] args) { + List post=InfixToPostfix.convert("4*2 + 6+9*2/3 -8"); + for (Token token : post) { + if (token.isNumber()) { + System.out.println(token.getIntValue()); + } + else { + System.out.println(token.toString()); + } + } + + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/expr/PostfixExpr.java b/group11/996108220/src/com/coding/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..d32b346ef0 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,52 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser tokenParser =new TokenParser(); + List tokens=tokenParser.parse(expr); + Stack numStack =new Stack<>(); + for (Token token : tokens) { + if (token.isOperator()) { + float op2=(float)numStack.pop(); + float op1=(float)numStack.pop(); + char op =token.toString().charAt(0); + numStack.push(caculate(op1, op2, op)); + } + else { + numStack.push((float)token.getIntValue()); + } + } + + return numStack.pop(); + } + private float caculate(float op1,float op2,char op){ + + + float tmpResult = 0; + switch(op){ + case '+': + tmpResult = op1 + op2; + break; + case '-': + tmpResult = op1 - op2; + break; + case '*': + tmpResult = op1 * op2; + break; + case '/': + tmpResult = op1 / op2; + break; + } + return tmpResult; + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/expr/PostfixExprTest.java b/group11/996108220/src/com/coding/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c0435a2db5 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/expr/PrefixExpr.java b/group11/996108220/src/com/coding/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..b545cd0d64 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,55 @@ +package com.coding.basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + + TokenParser tokenParser =new TokenParser(); + List tokens=tokenParser.parse(expr); + Stack numStack =new Stack<>(); + for (int i = tokens.size()-1; i >=0; i--) { + Token token=tokens.get(i); + if (token.isOperator()) { + float op1=(float)numStack.pop(); + float op2=(float)numStack.pop(); + char op =token.toString().charAt(0); + numStack.push(caculate(op1, op2, op)); + } + else { + numStack.push((float)token.getIntValue()); + } + + } + return numStack.pop(); + + } + private float caculate(float op1,float op2,char op){ + + + float tmpResult = 0; + switch(op){ + case '+': + tmpResult = op1 + op2; + break; + case '-': + tmpResult = op1 - op2; + break; + case '*': + tmpResult = op1 * op2; + break; + case '/': + tmpResult = op1 / op2; + break; + } + return tmpResult; + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/expr/PrefixExprTest.java b/group11/996108220/src/com/coding/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..5cec210e75 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package com.coding.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/expr/Token.java b/group11/996108220/src/com/coding/basic/stack/expr/Token.java new file mode 100644 index 0000000000..296e67e04a --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/Token.java @@ -0,0 +1,51 @@ +package com.coding.basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + public String toString(){ + return value; + } + + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group11/996108220/src/com/coding/basic/stack/expr/TokenParser.java b/group11/996108220/src/com/coding/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..29f81b457c --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/TokenParser.java @@ -0,0 +1,41 @@ +package com.coding.basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + + StringTokenizer st = new StringTokenizer(expr, "\\+|\\-|\\*|\\/|\\ ", true); + + while(st.hasMoreElements()){ + String value=st.nextToken(); + //可能有空格 + if (isOperator(value)) { + tokens.add(new Token(Token.OPERATOR, value)); + } + else if (isNumber(value)) { + tokens.add(new Token(Token.NUMBER, value)); + } + } + + return tokens; + } + + + + private boolean isOperator(String value) { + + return value.length()==1&&Token.OPERATORS.contains(value); + } + private boolean isNumber(String value) { + + return value.matches("[0-9]+"); + } + +} diff --git a/group11/996108220/src/com/coding/basic/stack/expr/TokenParserTest.java b/group11/996108220/src/com/coding/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..4ddb3669a6 --- /dev/null +++ b/group11/996108220/src/com/coding/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,40 @@ +package com.coding.basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From 9a194e951737c29d2aba0f9ffba38e45a80c9817 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Thu, 11 May 2017 21:23:59 +0800 Subject: [PATCH 506/552] Tenth week finished --- .../src/com/donaldy/basic/tree/FileList.java | 19 +++++++++++++++- .../com/donaldy/basic/tree/FileListTest.java | 22 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 group24/448641125/src/com/donaldy/basic/tree/FileListTest.java diff --git a/group24/448641125/src/com/donaldy/basic/tree/FileList.java b/group24/448641125/src/com/donaldy/basic/tree/FileList.java index e93cabae5b..e349450d4e 100644 --- a/group24/448641125/src/com/donaldy/basic/tree/FileList.java +++ b/group24/448641125/src/com/donaldy/basic/tree/FileList.java @@ -3,7 +3,24 @@ import java.io.File; public class FileList { - public void list(File f) { + + public void list(File f) { + + System.out.println(f.getName() + " : "); + + for (File file : f.listFiles()) { + + System.out.println(file.getName()); + + if (file.isDirectory()) { + + list(file); + + } + + } + + } diff --git a/group24/448641125/src/com/donaldy/basic/tree/FileListTest.java b/group24/448641125/src/com/donaldy/basic/tree/FileListTest.java new file mode 100644 index 0000000000..80a8b29dbb --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/tree/FileListTest.java @@ -0,0 +1,22 @@ +package com.donaldy.basic.tree; + +import org.junit.Test; + +import java.io.File; + +/** + * Created by DonaldY on 2017/5/11. + */ +public class FileListTest { + + @Test + public void test() { + + FileList fileList = new FileList(); + + fileList.list(new File("D:\\computer\\SoftwareEngineering\\软件工程讲稿(第三版)")); + + } + + +} From af6c9ef9e92fef0bb1fee212788d1f380c9c3663 Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Thu, 11 May 2017 21:32:02 +0800 Subject: [PATCH 507/552] the seventh homework --- infixExpr prefixExpr postfixExpr infixToPostfix --- group19/1294642551/src/expr/InfixExpr.java | 136 +++--------------- .../1294642551/src/expr/InfixToPostfix.java | 52 +++++++ group19/1294642551/src/expr/PostfixExpr.java | 55 +++++++ group19/1294642551/src/expr/PrefixExpr.java | 69 +++++++++ group19/1294642551/src/expr/Token.java | 62 ++++++++ group19/1294642551/src/expr/TokenParser.java | 57 ++++++++ .../1294642551/test/expr/InfixExprTest.java | 1 - .../test/expr/InfixToPostfixTest.java | 28 ++++ .../1294642551/test/expr/PostfixExprTest.java | 41 ++++++ .../1294642551/test/expr/PrefixExprTest.java | 45 ++++++ .../1294642551/test/expr/TokenParserTest.java | 40 ++++++ 11 files changed, 472 insertions(+), 114 deletions(-) create mode 100644 group19/1294642551/src/expr/InfixToPostfix.java create mode 100644 group19/1294642551/src/expr/PostfixExpr.java create mode 100644 group19/1294642551/src/expr/PrefixExpr.java create mode 100644 group19/1294642551/src/expr/Token.java create mode 100644 group19/1294642551/src/expr/TokenParser.java create mode 100644 group19/1294642551/test/expr/InfixToPostfixTest.java create mode 100644 group19/1294642551/test/expr/PostfixExprTest.java create mode 100644 group19/1294642551/test/expr/PrefixExprTest.java create mode 100644 group19/1294642551/test/expr/TokenParserTest.java diff --git a/group19/1294642551/src/expr/InfixExpr.java b/group19/1294642551/src/expr/InfixExpr.java index 2d53dd91ff..41593c9ea7 100644 --- a/group19/1294642551/src/expr/InfixExpr.java +++ b/group19/1294642551/src/expr/InfixExpr.java @@ -1,140 +1,50 @@ package expr; -import java.util.ArrayList; +import java.util.List; import java.util.Stack; - -/** - * 中序表达式求值: - * 1. 只支持加减乘除,不支持括号 - * 2. 表达式中只支持int,但结果可能是float - * 3. 要求用两个栈来实现 - * @author 12946 - * - */ public class InfixExpr { String expr = null; - public InfixExpr(String expr) { this.expr = expr; + } public float evaluate() { - Stack operatorStack = new Stack(); - Stack valueStack = new Stack(); - String[] arr = toArr(expr); - inStack(operatorStack, valueStack, arr); - outStack(operatorStack, valueStack); - - if(valueStack.size() == 1){ - return valueStack.peek(); - }else{ - throw new RuntimeException("数值栈中最后的元素个数不对"); - } + List tokenList = TokenParser.parse(expr); + Stack operatorStack = new Stack(); + Stack valueStack = new Stack(); - } - - // 将表达式字符串分解成数值和操作符的数组 - public String[] toArr(String expr){ - ArrayList al = new ArrayList(); - for(int i = 0; i < expr.length(); i++){ - char c = expr.charAt(i); - if(isOperator(c)){ - al.add(c+""); - } - } - - for(int i = 0; i < expr.length(); i++){ - char c = expr.charAt(i); - if(isOperator(c)){ - expr = expr.replace(c, ','); - } - } - String[] arr = expr.split(","); - String[] totalArr = new String[2 * arr.length - 1]; - for(int i = 0; i < totalArr.length; i++){ - if(i % 2 == 0){ - totalArr[i] = arr[i/2]; - }else{ - totalArr[i] = al.get((i-1)/2); - } - } - - return totalArr; - } - - // 表达式入栈操作 - public void inStack(Stack operatorStack, Stack valueStack, - String[] arr) { - for(int i = 0; i < arr.length; i++){ - if(isOperator(arr[i])){//新元素是操作符 - if(operatorStack.size() == 0){//第一个操作符 - operatorStack.push(arr[i]+""); - }else if(operatorStack.size() > 0){ - while(priority(operatorStack.peek(), arr[i]+"") != -1){//第一个操作符的优先级>=第二个的 + for(int i = 0; i < tokenList.size(); i++){ + Token token = tokenList.get(i); + if(token.isOperator()){//新元素是操作符 + if(operatorStack.isEmpty()){ + operatorStack.push(token); + }else{ + while(!token.hasHigherPriority(operatorStack.peek())){ popCompute(operatorStack, valueStack); if(operatorStack.isEmpty()){ break; } } - operatorStack.push(arr[i]+"");//操作符入栈 + operatorStack.push(token); } - - }else{// 新元素是数值 - float value = Float.valueOf(arr[i]+""); - valueStack.push(value); + }else{//新元素是数值 + valueStack.push(token); } + } - } - - // 出栈操作,将两个栈中的操作符和数值进行计算,当操作符栈为空时,数值栈的值就是最后的值 - public void outStack(Stack operatorStack, Stack valueStack){ + while(!operatorStack.isEmpty()){ popCompute(operatorStack, valueStack); } - } - - public boolean isOperator(String c){ - if(c.equals("+") || c.equals("-") || c.equals("*") || c.equals("/")){ - return true; - }else{ - return false; - } - } - - public boolean isOperator(char c){ - if(c=='+' || c=='-' || c=='*' || c=='/'){ - return true; - }else{ - return false; - } - } - - // 第一个操作符的优先级 > 第二个操作符的优先级: 返回 1 - // 第一个操作符的优先级 = 第二个操作符的优先级: 返回 0 - // 第一个操作符的优先级 < 第二个操作符的优先级: 返回 -1 - public int priority(String c1, String c2){ - if(c1.equals("+") || c1.equals("-")){ - if(c2.equals("*") || c2.equals("/")){ - return -1; - }else{ - return 0; - } - }else{//(c1=='*' || c1=='/') - if(c2.equals("+") || c2.equals("-")){ - return 1; - }else{ - return 0; - } - } + return valueStack.peek().getFloatValue(); } - - // 计算加减乘除的结果 public float compute(float num1, float num2, String operator){ if(operator.equals("+")){ @@ -149,12 +59,12 @@ public float compute(float num1, float num2, String operator){ } // 弹栈计算,取一个操作符和两个操作数进行计算,并将得到的操作数压入数值栈 - public void popCompute(Stack operatorStack, Stack valueStack){ - float num2 = valueStack.pop(); - float num1 = valueStack.pop(); - String operator = operatorStack.pop(); + public void popCompute(Stack operatorStack, Stack valueStack){ + float num2 = valueStack.pop().getFloatValue(); + float num1 = valueStack.pop().getFloatValue(); + String operator = operatorStack.pop().getOperator(); float value = compute(num1, num2, operator); - valueStack.push(value); + valueStack.push(new Token(1, String.valueOf(value))); } diff --git a/group19/1294642551/src/expr/InfixToPostfix.java b/group19/1294642551/src/expr/InfixToPostfix.java new file mode 100644 index 0000000000..7645befd4b --- /dev/null +++ b/group19/1294642551/src/expr/InfixToPostfix.java @@ -0,0 +1,52 @@ +package expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + List inList = TokenParser.parse(expr); + List postList = new ArrayList(); + Stack operatorStack = new Stack(); + for(int i = 0; i < inList.size(); i++){ + Token token = inList.get(i); + if(token.isOperator()){ + if(!operatorStack.isEmpty()){ + while(!token.hasHigherPriority(operatorStack.peek())){ + postList.add(operatorStack.pop()); + if(operatorStack.isEmpty()){ + break; + } + } + } + operatorStack.add(token); + + }else{ + postList.add(token); + } + } + + while(!operatorStack.isEmpty()){ + postList.add(operatorStack.pop()); + } + + + return postList; + } + + public static String toString(List tokenList){ + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < tokenList.size(); i++){ + sb.append(tokenList.get(i).getValue()); + if(i < tokenList.size()-1){ + sb.append(" "); + } + } + return sb.toString(); + } + + + +} diff --git a/group19/1294642551/src/expr/PostfixExpr.java b/group19/1294642551/src/expr/PostfixExpr.java new file mode 100644 index 0000000000..1fb335fc9f --- /dev/null +++ b/group19/1294642551/src/expr/PostfixExpr.java @@ -0,0 +1,55 @@ +package expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List tokenList = TokenParser.parse(expr); + Stack operatorStack = new Stack(); + Stack valueStack = new Stack(); + for(int i = 0; i < tokenList.size(); i++){ + Token token = tokenList.get(i); + if(token.isOperator()){ + operatorStack.push(token); + popCompute(operatorStack, valueStack); + }else{ + valueStack.push(token); + } + + } + + return valueStack.peek().getFloatValue(); + } + + // 计算加减乘除的结果 + public float compute(float num1, float num2, String operator){ + if(operator.equals("+")){ + return num1 + num2; + }else if(operator.equals("-")){ + return num1 - num2; + }else if(operator.equals("*")){ + return num1 * num2; + }else{ + return num1 / num2; + } + } + + // 弹栈计算,取一个操作符和两个操作数进行计算,并将得到的操作数压入数值栈 + public void popCompute(Stack operatorStack, Stack valueStack){ + float num2 = valueStack.pop().getFloatValue(); + float num1 = valueStack.pop().getFloatValue(); + String operator = operatorStack.pop().getOperator(); + float value = compute(num1, num2, operator); + valueStack.push(new Token(1, String.valueOf(value))); + + } + + +} diff --git a/group19/1294642551/src/expr/PrefixExpr.java b/group19/1294642551/src/expr/PrefixExpr.java new file mode 100644 index 0000000000..4afda30732 --- /dev/null +++ b/group19/1294642551/src/expr/PrefixExpr.java @@ -0,0 +1,69 @@ +package expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + List tokenList = TokenParser.parse(expr); + tokenList = reverse(tokenList); + Stack operatorStack = new Stack(); + Stack valueStack = new Stack(); + for(int i = 0; i < tokenList.size(); i++){ + Token token = tokenList.get(i); + if(token.isOperator()){ + operatorStack.push(token); + popCompute(operatorStack, valueStack); + }else{ + valueStack.push(token); + } + + } + + return valueStack.peek().getFloatValue(); + } + + public List reverse(List tokenList){ + List newList = new ArrayList(); + int size = tokenList.size(); + for(int i = 0; i < size; i++){ + newList.add(tokenList.get(size - 1 - i)); + } + return newList; + } + + // 计算加减乘除的结果 + public float compute(float num1, float num2, String operator){ + if(operator.equals("+")){ + return num1 + num2; + }else if(operator.equals("-")){ + return num1 - num2; + }else if(operator.equals("*")){ + return num1 * num2; + }else{ + return num1 / num2; + } + } + + // 弹栈计算,取一个操作符和两个操作数进行计算,并将得到的操作数压入数值栈 + // 注:在前缀表达式的计算中交换了第一个操作数和第二个操作数的位置,因为前缀表示式是从后向前遍历的 + public void popCompute(Stack operatorStack, Stack valueStack){ + float num2 = valueStack.pop().getFloatValue(); + float num1 = valueStack.pop().getFloatValue(); + String operator = operatorStack.pop().getOperator(); + float value = compute(num2, num1, operator);//交换了操作数的位置 + valueStack.push(new Token(1, String.valueOf(value))); + + } + + + +} diff --git a/group19/1294642551/src/expr/Token.java b/group19/1294642551/src/expr/Token.java new file mode 100644 index 0000000000..130aea44a3 --- /dev/null +++ b/group19/1294642551/src/expr/Token.java @@ -0,0 +1,62 @@ +package expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + public float getFloatValue(){ + return Float.valueOf(value); + } + + public String getValue(){ + return value; + } + + public String getOperator(){ + return value; + } + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group19/1294642551/src/expr/TokenParser.java b/group19/1294642551/src/expr/TokenParser.java new file mode 100644 index 0000000000..110bdb1702 --- /dev/null +++ b/group19/1294642551/src/expr/TokenParser.java @@ -0,0 +1,57 @@ +package expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public static List parse(String expr) { + List tokens = new ArrayList(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ +// System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private static int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private static boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group19/1294642551/test/expr/InfixExprTest.java b/group19/1294642551/test/expr/InfixExprTest.java index 936682df20..5adcfc70ee 100644 --- a/group19/1294642551/test/expr/InfixExprTest.java +++ b/group19/1294642551/test/expr/InfixExprTest.java @@ -49,5 +49,4 @@ public void testEvaluate() { } - } diff --git a/group19/1294642551/test/expr/InfixToPostfixTest.java b/group19/1294642551/test/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..3f3bd31a93 --- /dev/null +++ b/group19/1294642551/test/expr/InfixToPostfixTest.java @@ -0,0 +1,28 @@ +package expr; + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { +// InfixExpr expr = new InfixExpr("2+3*4+5"); + String expr = "2+9/3-5"; + Assert.assertEquals("2 9 3 / + 5 -", InfixToPostfix.toString(InfixToPostfix.convert(expr))); + } + } + +} diff --git a/group19/1294642551/test/expr/PostfixExprTest.java b/group19/1294642551/test/expr/PostfixExprTest.java new file mode 100644 index 0000000000..c3bb438ac4 --- /dev/null +++ b/group19/1294642551/test/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group19/1294642551/test/expr/PrefixExprTest.java b/group19/1294642551/test/expr/PrefixExprTest.java new file mode 100644 index 0000000000..9a4e8dae7d --- /dev/null +++ b/group19/1294642551/test/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3* 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("-++6/*2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group19/1294642551/test/expr/TokenParserTest.java b/group19/1294642551/test/expr/TokenParserTest.java new file mode 100644 index 0000000000..b435de08f7 --- /dev/null +++ b/group19/1294642551/test/expr/TokenParserTest.java @@ -0,0 +1,40 @@ +package expr; + + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + +// TokenParser parser = new TokenParser(); + List tokens = TokenParser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} From 877b31e463b327417ba7960371c52d0ab285ec91 Mon Sep 17 00:00:00 2001 From: lzb Date: Fri, 12 May 2017 01:23:04 +0800 Subject: [PATCH 508/552] =?UTF-8?q?=E6=95=B4=E7=90=86=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group24/1148285693/learning2017/.gitignore | 79 ++-- group24/1148285693/learning2017/other/pom.xml | 15 - .../other/src/main/java/ThreadTest.java | 25 -- .../java/me/lzb/other/algorithm/Paxos.java | 7 - .../consistenthash/ConsistentHash.java | 119 ------ .../consistenthash/HashFunction.java | 48 --- .../consistenthash/PhysicalNode.java | 46 --- .../algorithm/consistenthash/VirtualNode.java | 43 -- .../main/java/me/lzb/other/graph/Graph.java | 366 ------------------ .../me/lzb/other/lock/ReentrantTest1.java | 27 -- .../me/lzb/other/lock/ReentrantTest2.java | 35 -- .../lzb/other/proxy/MyInvocationHandler.java | 52 --- .../java/me/lzb/other/proxy/UserService.java | 11 - .../me/lzb/other/proxy/UserServiceImpl.java | 11 - .../other/algorithm/ConsistentHashTest.java | 94 ----- .../java/me/lzb/other/proxy/ProxyTest.java | 25 -- group24/1148285693/learning2017/pom.xml | 319 +++++++-------- 17 files changed, 199 insertions(+), 1123 deletions(-) delete mode 100644 group24/1148285693/learning2017/other/pom.xml delete mode 100644 group24/1148285693/learning2017/other/src/main/java/ThreadTest.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/Paxos.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/ConsistentHash.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/HashFunction.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/PhysicalNode.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/VirtualNode.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/graph/Graph.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/lock/ReentrantTest1.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/lock/ReentrantTest2.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/MyInvocationHandler.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserService.java delete mode 100644 group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserServiceImpl.java delete mode 100644 group24/1148285693/learning2017/other/src/test/java/me/lzb/other/algorithm/ConsistentHashTest.java delete mode 100644 group24/1148285693/learning2017/other/src/test/java/me/lzb/other/proxy/ProxyTest.java diff --git a/group24/1148285693/learning2017/.gitignore b/group24/1148285693/learning2017/.gitignore index f41f37aecb..556caf3bbd 100644 --- a/group24/1148285693/learning2017/.gitignore +++ b/group24/1148285693/learning2017/.gitignore @@ -1,40 +1,39 @@ -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files -*.war -*.ear -*.bk -.gradle -target -*.class -*.real - -# virtual machine crash logs -# see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -# Eclipse Files # -.project -.classpath -.settings - -# Idea -*.iml -*.ipr -*.iws -.idea - -# log -*_IS_UNDEFINED -logs -*.log - -# other -*.bak -.directory -.DS_Store - - -Test.java -example \ No newline at end of file +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files +*.war +*.ear +*.bk +.gradle +target +*.class +*.real + +# virtual machine crash logs +# see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +# Eclipse Files # +.project +.classpath +.settings + +# Idea +*.iml +*.ipr +*.iws +.idea + +# log +*_IS_UNDEFINED +logs +*.log + +# other +*.bak +.directory +.DS_Store + + +Test.java diff --git a/group24/1148285693/learning2017/other/pom.xml b/group24/1148285693/learning2017/other/pom.xml deleted file mode 100644 index 1f0b7eb9c0..0000000000 --- a/group24/1148285693/learning2017/other/pom.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - learning2017 - me.lzb - 1.0 - - 4.0.0 - - other - - - \ No newline at end of file diff --git a/group24/1148285693/learning2017/other/src/main/java/ThreadTest.java b/group24/1148285693/learning2017/other/src/main/java/ThreadTest.java deleted file mode 100644 index fb460c5bf9..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/ThreadTest.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Created by LZB on 2017/5/3. - */ -public class ThreadTest extends Thread { - boolean stop = false; - int value = 0; - public void run() { - while (!stop) { - value++; - } - } - public static void main(String[] args) - throws Exception { - - ThreadTest t = new ThreadTest(); - t.start(); - Thread.sleep(2000); - t.stop = true; - System.out.println("value =" + t.value); - Thread.sleep(2000); - System.out.println("value =" + t.value); - - } - -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/Paxos.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/Paxos.java deleted file mode 100644 index 20ca1177dd..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/Paxos.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.lzb.other.algorithm; - -/** - * Created by LZB on 2017/5/4. - */ -public class Paxos { -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/ConsistentHash.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/ConsistentHash.java deleted file mode 100644 index 01e7c8f8b2..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/ConsistentHash.java +++ /dev/null @@ -1,119 +0,0 @@ -package me.lzb.other.algorithm.consistenthash; - -import java.util.*; - -/** - * @author LZB - * @date 2017/5/9 - */ -public class ConsistentHash { - - private int vnNumber; - - private HashFunction hashFunction; - - private final SortedMap nodes = new TreeMap<>(); - - private int size; - - private final Map pns = new HashMap<>(); - - public ConsistentHash(int pnNum, int vnNum) { - this.hashFunction = new HashFunction(); - this.vnNumber = vnNum; - - //创建好节点 - int a = 100; - - for (int i = 0; i < pnNum; i++) { - PhysicalNode pn = new PhysicalNode("192.168.1." + a, "8888"); - pns.put(pn.getAddr(), pn); - addNode(pn); - a++; - } - } - - - public void addNode(PhysicalNode pn) { - //添加一个物理节点,增加vnNumber个虚拟节点 - for (int i = 0; i < this.vnNumber; i++) { - VirtualNode vn = new VirtualNode(pn, String.valueOf(i)); - nodes.put(hashFunction.hash(vn.getAddr()), vn); - } - - } - - public void removeNode(PhysicalNode node) { - for (int i = 0; i < this.vnNumber; i++) - nodes.remove(hashFunction.hash(node.getAddr() + "-" + i)); - } - - /** - * 获取顺时针方向最近的节点 - * - * @param key - * @return - */ - public VirtualNode getNode(String key) { - if (nodes.isEmpty()) { - return null; - } - - long hash = hashFunction.hash(key); - if (!nodes.containsKey(hash)) { - SortedMap tailMap = nodes.tailMap(hash); - hash = tailMap.isEmpty() ? nodes.firstKey() : tailMap.firstKey(); - } - return nodes.get(hash); - } - - public long getSize() { - return nodes.size(); - } - - - @Override - public String toString() { - StringBuffer sb = new StringBuffer(); - for (Long key : nodes.keySet()) { - VirtualNode n = nodes.get(key); - sb.append(n.getAddr()); - sb.append(" "); - sb.append(n.size()); - sb.append("\r\n"); - } - return sb.toString(); - } - - - public SortedMap getNodes() { - return this.nodes; - } - - public Map getPNodes() { - return this.pns; - } - - - public void put(String key, String value) { - VirtualNode node = getNode(key); - node.put(key, value); - size++; - } - - public void remove(String key) { - VirtualNode node = getNode(key); - node.remove(key); - size--; - } - - public String get(String key) { - VirtualNode node = getNode(key); - return node.get(key); - } - - public int size() { - return size; - } - -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/HashFunction.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/HashFunction.java deleted file mode 100644 index f17fd7957a..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/HashFunction.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.lzb.other.algorithm.consistenthash; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -/** - * @author LZB - * @date 2017/5/11 - */ -public class HashFunction { - - /** - * ketama - * @param key - * @return - */ - public long hash(String key) { - byte[] bytes = md5(key); - return ketama(bytes, 0); - - } - - private long ketama(byte[] digest, int nTime) { - //0xff = 255 - long a = ((long) (digest[3 + nTime * 4] & 0xFF) << 24) - | ((long) (digest[2 + nTime * 4] & 0xFF) << 16) - | ((long) (digest[1 + nTime * 4] & 0xFF) << 8) - | (digest[0 + nTime * 4] & 0xFF); - - return a & 0xffffffffL; - } - - //输入任意长的信息,输出128位的信息,不可逆,唯一 - private byte[] md5(String key) { - MessageDigest md5 = null; - if (md5 == null) { - try { - md5 = MessageDigest.getInstance("MD5"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - } - - md5.reset(); - md5.update(key.getBytes()); - return md5.digest(); - } -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/PhysicalNode.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/PhysicalNode.java deleted file mode 100644 index 0c3a286494..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/PhysicalNode.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.lzb.other.algorithm.consistenthash; - -import java.util.HashMap; - -/** - * @author LZB - * @date 2017/5/10 - */ -public class PhysicalNode { - private String ip; - - private String port; - - private HashMap data = new HashMap<>(); - - public PhysicalNode(String ip, String port) { - this.ip = ip; - this.port = port; - } - - - public void put(String key, String value) { - data.put(key, value); - } - - public void remove(String key) { - data.remove(key); - } - - public String get(String key) { - return data.get(key); - } - - public String getAddr() { - return this.ip + ":" + this.port; - } - - public int size() { - return data.size(); - } - - public HashMap getDate(){ - return data; - } - -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/VirtualNode.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/VirtualNode.java deleted file mode 100644 index e409786389..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/algorithm/consistenthash/VirtualNode.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.lzb.other.algorithm.consistenthash; - -/** - * @author LZB - * @date 2017/5/10 - */ -public class VirtualNode { - private PhysicalNode physicalNode; - - private String id; - - private int size; - - public VirtualNode(PhysicalNode node, String id) { - this.physicalNode = node; - this.id = id; - } - - - public void put(String key, String value) { - physicalNode.put(key, value); - size++; - } - - public void remove(String key) { - physicalNode.remove(key); - size--; - } - - public String get(String key) { - return physicalNode.get(key); - } - - public String getAddr() { - return physicalNode.getAddr() + "-" + id; - } - - public int size() { - return size; - } - - -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/graph/Graph.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/graph/Graph.java deleted file mode 100644 index 5ef6aba81a..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/graph/Graph.java +++ /dev/null @@ -1,366 +0,0 @@ -package me.lzb.other.graph; - -import java.util.*; - -/** - * 遍历无向图的所有最长一笔画 - * 深度优先,达到最深时,后退,继续搜索另一条路径 - * Created by LZB on 2017/4/8. - */ -public class Graph { - /** - * 换行符 - */ - private static final String NEWLINE = System.getProperty("line.separator"); - /** - * 路径分割符号 - */ - private static final String PATH_SEPARATOR = "->"; - - /** - * 顶点数目 - */ - private int vertexCount; - - /** - * 边的数目 - */ - private int edgeCount; - - /** - * 出现过路径的最长变数 - * 如果等于总边数,说明存在欧拉路径 - */ - int maxEdge = 0; - - /** - * 顶点数组,每个list是与顶点关联的所有边 - */ - private LinkedList[] edgeList; - - /** - * 边 - */ - private class Edge { - /** - * 边的id - */ - int id; - - /** - * 是否被正向搜索 - */ - boolean isSearched; - - /** - * 顶点v - */ - int v; - - /** - * 顶点b - */ - int w; - - /** - * 保存回滚操作中,被回滚的的路径方向,以及,前提路径 - * 因为在不同级别的回滚中,可能会有多条临时路径,所以用list存放 - * 顶点->顶点:路径id->路径id->路径id - * 1->2:0->1->2 - */ - ArrayList to = new ArrayList<>(); - - /** - * 构造函数 - * @param v 顶点v - * @param w 顶点w - */ - public Edge(int v, int w) { - this.v = v; - this.w = w; - isSearched = false; - id = edgeCount; - } - - - /** - * 在当前前提路径下,是否有 - * @param v0 出发顶点 - * @param P 前提路径 - * @return true false - */ - public boolean isFrom(int v0, String P) { - return isTheSameTo(v0, getAnotherV(v0), P); - } - - /** - * 临时路径是否相同 - * @param v0 出发顶点 - * @param v1 到达顶点 - * @param p 前提路径 - * @return true false - */ - public boolean isTheSameTo(int v0, int v1, String p) { - if (to.size() == 0) { - return false; - } - String ss = v0 + PATH_SEPARATOR + v1 + ":" + p; - for (String s : to) { - if (ss.equals(s)) { - return true; - } - } - return false; - } - - /** - * 删除临时路径 - * @param v0 出发顶点 - * @param v1 到达顶点 - * @param p 前提路径 - */ - public void removeTo(int v0, int v1, String p) { - if (to.size() == 0) { - return; - } - String ss = v0 + PATH_SEPARATOR + v1 + ":" + p; - for (Iterator iterator = to.iterator(); iterator.hasNext(); ) { - String s = iterator.next(); - if (ss.equals(s)) { - iterator.remove(); - return; - } - } - } - - /** - * 增加临时路径 - * @param v0 出发顶点 - * @param v1 到达顶点 - * @param p 前提路径 - */ - public void addTo(int v0, int v1, String p) { - String ss = v0 + PATH_SEPARATOR + v1 + ":" + p; - for (String s : to) { - if (ss.equals(s)) { - return; - } - } - to.add(ss); - - } - - /** - * 获取边的另外一条顶点 - * @param vertex - * @return - */ - public int getAnotherV(int vertex) { - if (vertex == v) { - return w; - } else { - return v; - } - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null || getClass() != obj.getClass()) return false; - Edge c = (Edge) obj; - return this.id == c.id; - } - - @Override - public int hashCode() { - return id; - } - } - - /** - * 构造函数 - * @param vertexNum 顶点总数 - * @param edgeCount 边的总数 - */ - public Graph(int vertexNum, int edgeCount) { - this.vertexCount = vertexNum; - this.edgeCount = 0; - edgeList = new LinkedList[edgeCount]; - for (int i = 0; i < edgeCount; i++) { - edgeList[i] = new LinkedList<>(); - } - } - - public void addEdge(int v1, int v2) { - Edge c = new Edge(v2, v1); - edgeList[v1].add(c); - edgeList[v2].add(c); - edgeCount++; - } - - - public void addEdge(int[][] edgeArray) { - for (int i = 0; i < edgeArray.length; i++) { - addEdge(edgeArray[i][0], edgeArray[i][1]); - } - } - - public String toString() { - StringBuilder s = new StringBuilder(); - s.append(vertexCount + " vertices, " + edgeCount + " edges " + NEWLINE); - for (int v = 0; v < vertexCount; v++) { - s.append(v + ": "); - for (Edge w : edgeList[v]) { - s.append(w.getAnotherV(v) + " "); - } - s.append(NEWLINE); - } - return s.toString(); - } - - - /** - * 更新出现过路径的最长边数 - * @param a - */ - private void updateMax(int a) { - if (a > maxEdge) { - maxEdge = a; - } - } - - - public boolean isEuler() { - int start = 0; - Stack stack = new Stack<>(); - stack.push(start); - - //TODO 退出递归的条件 -// try { - search(start, start, stack, new Stack<>()); -// }catch (EmptyStackException e){ - -// } - - System.out.println("最长边数:" + maxEdge); - return maxEdge == edgeCount; - } - - - - - /** - * 正向搜索 - * 传进去一个节点,顺着一条没有搜索过的边找到下一个节点。当搜索到死路时,回滚 - * @param v 当前提点 - * @param stack 当前路径的节点顺序 - * @param sp 当前路径的路径顺序 - */ - public void search(int start, int v, Stack stack, Stack sp) { - - LinkedList list = edgeList[v]; - - boolean anotherWay = false; - for (Edge w : list) { - if (!w.isSearched && !w.isTheSameTo(v, w.getAnotherV(v), getPath(sp))) { - anotherWay = true; - w.isSearched = true; - stack.push(w.getAnotherV(v)); - updateMax(sp.size()); - sp.push(w); - search(start, w.getAnotherV(v), stack, sp); - } - } - - if (!anotherWay) { - System.out.println("最长:==============================="); - rollback(start, stack, sp); - } - - } - - - - /** - * 回滚,回滚当上一个节点,如果当前节点有可以使用的边,调用搜索,如果没有,递归继续回滚 - * 如果需要递归回滚,回滚到第二级之前,清空所有,当前路径下,从该点出发的方向 - * 被回滚的路径,需要保存路径方向,以及提前路径 - * @param stack 当前路径的节点顺序 - * @param sp 当前路径的路径顺序 - */ - public void rollback(int start, Stack stack, Stack sp) { - - String ss = getPath(sp); - String output = "顶点:" + stack.toString() - + NEWLINE + "路径:" + ss - + NEWLINE; - System.out.println(output); - -// if(stack.size() == 1){ -// return; -// } - - - Edge e = sp.pop(); //需要回滚的路径 - String pp = getPath(sp); //前提路径 - - int vz = stack.pop(); - int vy = stack.peek(); - - boolean rollbakc2 = true; - - LinkedList l = edgeList[vy]; - - //判断当前节点是否存在空闲路径,是否要回滚两级 - //空闲路径:没有被正向搜索,也没有被缓存当前前提路径下,从改节点出发的方向 - for (Edge w : l) { - if (!w.isSearched && !w.isTheSameTo(vy, w.getAnotherV(vy), pp)) { - rollbakc2 = false; - break; - } - } - - - //回滚当前路径,回滚一级 - int r = vy; - for (Edge w : l) { - if (w.equals(e)) { - w.addTo(vy, vz, pp); - w.isSearched = false; - break; - } - } - - if (rollbakc2) { - //回滚两级, 清空所有,当前路径下,从该点出发的方向 - - for (Edge w : l) { - if (!w.isSearched && w.isFrom(vy, pp)) { - w.removeTo(vy, w.getAnotherV(vy), pp); - } - } - rollback(start, stack, sp); - } - - search(start, r, stack, sp); - - } - - public String getPath(Stack stack) { - String s = ""; - for (Edge x : stack) { - s = s + x.id + PATH_SEPARATOR; - } - s = s.replaceAll(PATH_SEPARATOR + "$", ""); - return s; - } - - - public static void main(String[] args) { - int[][] aa = new int[][]{{0, 1}, {0, 1}, {0, 3}, {1, 3}, {1, 2}, {1, 2}, {2, 3}}; - Graph g = new Graph(4, aa.length); - g.addEdge(aa); - System.out.println(g.toString()); - System.out.println(g.isEuler()); - } -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/lock/ReentrantTest1.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/lock/ReentrantTest1.java deleted file mode 100644 index 4b8b3d4ce8..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/lock/ReentrantTest1.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.lzb.other.lock; - -/** - * Created by LZB on 2017/3/30. - */ -public class ReentrantTest1 implements Runnable{ - - public synchronized void get(){ - System.out.println(Thread.currentThread().getId()); - set(); - } - - public synchronized void set(){ - System.out.println(Thread.currentThread().getId()); - } - - @Override - public void run() { - get(); - } - public static void main(String[] args) { - ReentrantTest1 ss=new ReentrantTest1(); - new Thread(ss).start(); - new Thread(ss).start(); - new Thread(ss).start(); - } -} \ No newline at end of file diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/lock/ReentrantTest2.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/lock/ReentrantTest2.java deleted file mode 100644 index c630ea9e33..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/lock/ReentrantTest2.java +++ /dev/null @@ -1,35 +0,0 @@ -package me.lzb.other.lock; - -import java.util.concurrent.locks.ReentrantLock; - -/** - * Created by LZB on 2017/3/30. - */ -public class ReentrantTest2 implements Runnable { - ReentrantLock lock = new ReentrantLock(); - - public void get() { - lock.lock(); - System.out.println(Thread.currentThread().getId()); - set(); - lock.unlock(); - } - - public void set() { - lock.lock(); - System.out.println(Thread.currentThread().getId()); - lock.unlock(); - } - - @Override - public void run() { - get(); - } - - public static void main(String[] args) { - ReentrantTest2 ss = new ReentrantTest2(); - new Thread(ss).start(); - new Thread(ss).start(); - new Thread(ss).start(); - } -} \ No newline at end of file diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/MyInvocationHandler.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/MyInvocationHandler.java deleted file mode 100644 index d89298c786..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/MyInvocationHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.lzb.other.proxy; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * Created by LZB on 2017/3/29. - */ -public class MyInvocationHandler implements InvocationHandler { - - // 目标对象 - private Object target; - - /** - * 构造方法 - * - * @param target 目标对象 - */ - public MyInvocationHandler(Object target) { - super(); - this.target = target; - } - - - /** - * 执行目标对象的方法 - */ - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - - // 在目标对象的方法执行之前简单的打印一下 - System.out.println("------------------before------------------"); - - // 执行目标对象的方法 - Object result = method.invoke(target, args); - - // 在目标对象的方法执行之后简单的打印一下 - System.out.println("-------------------after------------------"); - - return result; - } - - /** - * 获取目标对象的代理对象 - * - * @return 代理对象 - */ - public Object getProxy() { - return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), - target.getClass().getInterfaces(), this); - } -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserService.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserService.java deleted file mode 100644 index d57431acab..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserService.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.lzb.other.proxy; - -/** - * Created by LZB on 2017/3/29. - */ -public interface UserService { - /** - * 目标方法 - */ - void add(); -} diff --git a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserServiceImpl.java b/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserServiceImpl.java deleted file mode 100644 index 147abda59b..0000000000 --- a/group24/1148285693/learning2017/other/src/main/java/me/lzb/other/proxy/UserServiceImpl.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.lzb.other.proxy; - -/** - * Created by LZB on 2017/3/29. - */ -public class UserServiceImpl implements UserService { - - public void add() { - System.out.println("--------------------addNode---------------"); - } -} \ No newline at end of file diff --git a/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/algorithm/ConsistentHashTest.java b/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/algorithm/ConsistentHashTest.java deleted file mode 100644 index 08902c756a..0000000000 --- a/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/algorithm/ConsistentHashTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package me.lzb.other.algorithm; - -import me.lzb.other.algorithm.consistenthash.ConsistentHash; -import me.lzb.other.algorithm.consistenthash.HashFunction; -import me.lzb.other.algorithm.consistenthash.PhysicalNode; -import org.junit.Test; - -import java.text.NumberFormat; -import java.util.HashMap; -import java.util.Map; - -/** - * @author LZB - * @date 2017/5/10 - */ -public class ConsistentHashTest { - - - @Test - public void hashFunctionTest() { - - HashFunction hashFunction = new HashFunction(); - - System.out.println(hashFunction.hash("192.168.1.100")); - System.out.println(hashFunction.hash("192.168.1.101")); - System.out.println(hashFunction.hash("192.168.1.102")); - System.out.println(hashFunction.hash("192.168.1.103")); - System.out.println(hashFunction.hash("192.168.1.104")); - } - - @Test - public void consistentHashTest() { - int all = 100000; - - ConsistentHash ch10 = new ConsistentHash(10, 5); - put(ch10, all); - - - ConsistentHash ch12 = new ConsistentHash(12, 5); - put(ch12, all); - - System.out.print("增加两台 "); - hitRate(ch10.getPNodes(), ch12.getPNodes(), all); - - System.out.print("减少两台 "); - ConsistentHash ch8 = new ConsistentHash(8, 5); - put(ch8, all); - - hitRate(ch10.getPNodes(), ch8.getPNodes(), all); - } - - - public static void put(ConsistentHash ch, int all) { - for (int i = 0; i < all; i++) { - ch.put(String.valueOf(i), "aaaaa" + i); - } - } - - public static void hitRate(Map m1, Map m2, int all) { - - Map s; - Map l; - - if (m1.size() < m2.size()) { - s = m1; - l = m2; - } else { - s = m2; - l = m1; - } - - int count = 0; - - for (String key : s.keySet()) { - - PhysicalNode sn = s.get(key); - PhysicalNode ln = l.get(key); - - HashMap sData = sn.getDate(); - - HashMap lData = ln.getDate(); - for (String k : sData.keySet()) { - if (lData.containsKey(k)) { - count++; - } - } - } - NumberFormat nf = NumberFormat.getPercentInstance(); - nf.setMinimumFractionDigits(2); - System.out.println("hit rate : " + (nf.format((double) count / (double) all))); - } - - -} diff --git a/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/proxy/ProxyTest.java b/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/proxy/ProxyTest.java deleted file mode 100644 index 0a01679ad3..0000000000 --- a/group24/1148285693/learning2017/other/src/test/java/me/lzb/other/proxy/ProxyTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package me.lzb.other.proxy; - -import org.junit.Test; - -/** - * Created by LZB on 2017/3/29. - */ -public class ProxyTest { - - @Test - public void testProxy() throws Throwable { - // 实例化目标对象 - UserService userService = new UserServiceImpl(); - - // 实例化InvocationHandler - MyInvocationHandler invocationHandler = new MyInvocationHandler(userService); - - // 根据目标对象生成代理对象 - UserService proxy = (UserService) invocationHandler.getProxy(); - - // 调用代理对象的方法 - proxy.add(); - - } -} diff --git a/group24/1148285693/learning2017/pom.xml b/group24/1148285693/learning2017/pom.xml index d1b38a50b4..5fd8108696 100644 --- a/group24/1148285693/learning2017/pom.xml +++ b/group24/1148285693/learning2017/pom.xml @@ -1,160 +1,161 @@ - - - 4.0.0 - - me.lzb - learning2017 - 1.0 - learning2017 - pom - - https://github.com/lzbferrari/coding2017 - 2017编程提高 - - - - lzb - https://github.com/lzbferrari - lzbferrari@gmail.com - - - - - common - learning-basic - mini-jvm - other - - - - 1.8 - 1.8 - UTF-8 - UTF-8 - UTF-8 - - - - - - aliyun - aliyun - http://maven.aliyun.com/nexus/content/groups/public - - true - never - - - false - - - - - - - aliyun - aliyun - http://maven.aliyun.com/nexus/content/groups/public - - true - - - false - - - - - - - - - junit - junit - 4.12 - - - - - dom4j - dom4j - 1.6.1 - - - - jaxen - jaxen - 1.1.6 - - - - - commons-io - commons-io - 2.5 - - - org.apache.commons - commons-lang3 - 3.5 - - - commons-codec - commons-codec - 1.10 - - - org.apache.commons - commons-collections4 - 4.1 - - - - - org.apache.httpcomponents - httpclient - 4.5.3 - - - org.apache.zookeeper - zookeeper - 3.4.10 - - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.6.1 - - ${java.version} - ${java.version} - UTF-8 - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - - org.apache.maven.surefire - surefire-junit47 - 2.19.1 - - - - false - - - - - + + + 4.0.0 + + me.lzb + learning2017 + 1.0 + learning2017 + pom + + https://github.com/lzbferrari/coding2017 + 2017编程提高 + + + + lzb + https://github.com/lzbferrari + lzbferrari@gmail.com + + + + + common + learning-basic + mini-jvm + + + + 1.8 + 1.8 + UTF-8 + UTF-8 + UTF-8 + + + + + + aliyun + aliyun + http://maven.aliyun.com/nexus/content/groups/public + + true + never + + + false + + + + + + + aliyun + aliyun + http://maven.aliyun.com/nexus/content/groups/public + + true + + + false + + + + + + + + + junit + junit + 4.12 + + + + + dom4j + dom4j + 1.6.1 + + + + jaxen + jaxen + 1.1.6 + + + + + commons-io + commons-io + 2.5 + + + org.apache.commons + commons-lang3 + 3.5 + + + commons-codec + commons-codec + 1.10 + + + org.apache.commons + commons-collections4 + 4.1 + + + + + org.apache.httpcomponents + httpclient + 4.5.3 + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + ${java.version} + ${java.version} + UTF-8 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + + + org.apache.maven.surefire + surefire-junit47 + 2.19.1 + + + + false + true + 1 + false + + ${java.io.tmpdir} + + + + + + \ No newline at end of file From c4c021ca9d3b472765af23ce7c3f06f67d741614 Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Fri, 12 May 2017 11:41:19 +0800 Subject: [PATCH 509/552] changes of infixExpr --- group19/1294642551/src/expr/InfixExpr.java | 5 +---- group19/1294642551/src/expr/InfixToPostfix.java | 9 ++------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/group19/1294642551/src/expr/InfixExpr.java b/group19/1294642551/src/expr/InfixExpr.java index 41593c9ea7..11970962bc 100644 --- a/group19/1294642551/src/expr/InfixExpr.java +++ b/group19/1294642551/src/expr/InfixExpr.java @@ -22,11 +22,8 @@ public float evaluate() { if(operatorStack.isEmpty()){ operatorStack.push(token); }else{ - while(!token.hasHigherPriority(operatorStack.peek())){ + while(!operatorStack.isEmpty() && !token.hasHigherPriority(operatorStack.peek())){ popCompute(operatorStack, valueStack); - if(operatorStack.isEmpty()){ - break; - } } operatorStack.push(token); } diff --git a/group19/1294642551/src/expr/InfixToPostfix.java b/group19/1294642551/src/expr/InfixToPostfix.java index 7645befd4b..24be56412c 100644 --- a/group19/1294642551/src/expr/InfixToPostfix.java +++ b/group19/1294642551/src/expr/InfixToPostfix.java @@ -13,13 +13,8 @@ public static List convert(String expr) { for(int i = 0; i < inList.size(); i++){ Token token = inList.get(i); if(token.isOperator()){ - if(!operatorStack.isEmpty()){ - while(!token.hasHigherPriority(operatorStack.peek())){ - postList.add(operatorStack.pop()); - if(operatorStack.isEmpty()){ - break; - } - } + while(!operatorStack.isEmpty() && !token.hasHigherPriority(operatorStack.peek())){ + postList.add(operatorStack.pop()); } operatorStack.add(token); From 7a6fd0d634ca089c50a53029085311f36cb5a7c2 Mon Sep 17 00:00:00 2001 From: Jane_Zhou <1294642551@qq.com> Date: Fri, 12 May 2017 11:42:17 +0800 Subject: [PATCH 510/552] changes of classFileParser --- .../src/jvm/loader/ClassFileParser.java | 2 +- .../1294642551/src/struts_Reflect/Struts.java | 142 ------------------ 2 files changed, 1 insertion(+), 143 deletions(-) delete mode 100644 group19/1294642551/src/struts_Reflect/Struts.java diff --git a/group19/1294642551/src/jvm/loader/ClassFileParser.java b/group19/1294642551/src/jvm/loader/ClassFileParser.java index 2eb1552c2e..3529f727bc 100644 --- a/group19/1294642551/src/jvm/loader/ClassFileParser.java +++ b/group19/1294642551/src/jvm/loader/ClassFileParser.java @@ -148,7 +148,7 @@ private void parseInterfaces(ByteCodeIterator iter) { private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { int fieldCount = iter.nextU2ToInt(); for(int i = 0; i < fieldCount; i++){ - Field field = Field.parse(constantPool, iter); + Field field = Field.parse(clzFile.getConstantPool(), iter); clzFile.addField(field); } diff --git a/group19/1294642551/src/struts_Reflect/Struts.java b/group19/1294642551/src/struts_Reflect/Struts.java deleted file mode 100644 index 1694cf369c..0000000000 --- a/group19/1294642551/src/struts_Reflect/Struts.java +++ /dev/null @@ -1,142 +0,0 @@ -package struts_Reflect; - -import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.dom4j.Attribute; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.io.SAXReader; - - - - -public class Struts { - - public static View runAction(String actionName, Map parameters) throws Exception { - - /* - - 0. ȡļstruts.xml - - 1. actionNameҵӦclass LoginAction, ͨʵ - parametersеݣösetter parametersе - ("name"="test" , "password"="1234") , - ǾӦõ setNamesetPassword - - 2. ͨöexectue ÷ֵ"success" - - 3. ͨҵgetter getMessage, - ͨã ֵγһHashMap , {"message": "¼ɹ"} , - ŵViewparameters - - 4. struts.xmlе ,Լexecuteķֵ ȷһjsp - ŵViewjspֶС - - * - */ - - //classNameַ - String className = null; - - //---------XMLļ--------------------------------------------------------------------------- - - // saxReader - SAXReader reader = new SAXReader(); - // ͨreadȡһļ תDocument - Document document = reader.read(new File("src/struts_Reflect/Struts.xml")); - //ȡڵԪض - Element root = document.getRootElement(); - //System.out.println("Root: " + root.getName()); - - // ȡԪnameֵΪloginclassԵֵ浽classNameС - for (Iterator iter = root.elementIterator(); iter.hasNext();) - { - Element e = (Element) iter.next(); - String name = e.attributeValue("name"); - - if(name.equals("login")) - { - className = e.attributeValue("class"); - } - - } - - //-----------ȡLoginActionʵ䷽--------------------------------------------------------- - - //ȡʵ - Class clazz = Class.forName("struts_Reflect.LoginAction"); - Object obj = clazz.newInstance(); - - //setName setPassword - Method mSetName = clazz.getMethod("setName", String.class); - Method mSetPassWord = clazz.getMethod("setPassword", String.class); - mSetName.invoke(obj, parameters.get("name")); - mSetPassWord.invoke(obj, parameters.get("password")); - - //excute - Method mExecute = clazz.getMethod("execute", null); - String result = (String) mExecute.invoke(obj, null); - System.out.println(result); - - //ҵgetterԺֵŵparameterMapС - Method[] methods = clazz.getDeclaredMethods(); -// HashMap paraMap = new HashMap(); - - ArrayList al = new ArrayList(); - al.add("name"); - al.add("password"); - al.add("message"); - String key = null; - String value = null; - Field field = null; - - for(int i = 0; i < al.size(); i++) - { - key = al.get(i); - field = clazz.getDeclaredField(key); - field.setAccessible(true); - value = (String) field.get(obj); - parameters.put(key, value); - System.out.println(key+"---"+value); - } - - - - View view = new View(); - view.setParameters(parameters); - - //----------JSPֶηŵView------------------------------------- - - //ȡΪactionԪؽڵ - Element actionE = root.element("action"); - - // ȡԪresultе - String rValue = null; - - for (Iterator iter = actionE.elementIterator(); iter.hasNext();) - { - Element e = (Element) iter.next(); - String name = e.attributeValue("name"); - - if(name.equals(result)) - { - rValue = e.getText(); - view.setJsp(rValue); - System.out.println(rValue); - } - - } - - return view; - - } - -} \ No newline at end of file From 6c2e02d0674270789cafbc2b8ff3ff31968e89e8 Mon Sep 17 00:00:00 2001 From: lzb Date: Fri, 12 May 2017 15:47:38 +0800 Subject: [PATCH 511/552] =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E6=AC=A1jvm?= =?UTF-8?q?=EF=BC=8C=E5=85=88=E6=8F=90=E4=BA=A4=E4=B8=80=E4=B8=8B=EF=BC=8C?= =?UTF-8?q?=E5=9B=9E=E4=B9=89=E4=B9=8C=E5=86=8D=E6=90=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/lzb/jvm/attr/ConstantValue.java | 27 +++++++ .../java/me/lzb/jvm/cmd/ComparisonCmd.java | 70 +++++++++++++++++++ .../java/me/lzb/jvm/cmd/TwoOperandCmd.java | 3 + .../src/main/java/me/lzb/jvm/field/Field.java | 14 ++++ .../me/lzb/jvm/loader/ClassFileParser.java | 21 +++++- .../java/me/lzb/jvm/loader/CommandParser.java | 6 ++ .../me/lzb/jvm/print/ExecutionFormat.java | 8 ++- .../me/lzb/jvm/print/ExecutionVisitor.java | 2 +- .../src/test/java/me/lzb/jvm/EmployeeV2.java | 56 +++++++++++++++ .../test/java/me/lzb/jvm/HourlyEmployee.java | 27 +++++++ 10 files changed, 229 insertions(+), 5 deletions(-) create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java create mode 100644 group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/HourlyEmployee.java diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java new file mode 100644 index 0000000000..ba87c028b9 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java @@ -0,0 +1,27 @@ +package me.lzb.jvm.attr; + +import me.lzb.jvm.constant.ConstantPool; + +/** + * @author LZB + * @date 2017/5/12 + */ +public class ConstantValue { + //U2 + private int attributeNameIndex; + //U4 + private int attributeLength; + + //U2 + private int constantvalueIndex; + + private ConstantPool pool; + + public ConstantValue(int attributeNameIndex, int attributeLength, int constantvalueIndex, ConstantPool pool){ + this.attributeNameIndex = attributeNameIndex; + this.attributeLength = attributeLength; + this.constantvalueIndex = constantvalueIndex; + this.pool = pool; + } + +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java new file mode 100644 index 0000000000..ba1b2341a1 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java @@ -0,0 +1,70 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; + +/** + * @author LZB + * @date 2017/5/12 + */ +public class ComparisonCmd extends TwoOperandCmd { + + private int goOffset; + + public ComparisonCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + if (ByteCodeCommand.if_icmp_ge.equals(this.getOpCode())) { + JavaObject jo2 = frame.getOprandStack().pop(); + JavaObject jo1 = frame.getOprandStack().pop(); + + if (jo1.getIntValue() >= jo2.getIntValue()) { + setJumpResult(result); + } + + } else if (ByteCodeCommand.if_icmple.equals(this.getOpCode())) { + + JavaObject jo2 = frame.getOprandStack().pop(); + JavaObject jo1 = frame.getOprandStack().pop(); + + if (jo1.getIntValue() <= jo2.getIntValue()) { + setJumpResult(result); + } + + } else if (ByteCodeCommand.goto_no_condition.equals(this.opCode)) { + setJumpResult(result); + } + } + + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitComparisonCmd(this); + } + + + private void setJumpResult(ExecutionResult result) { + int offsetFromStartCmd = getOffsetFromStartCmd(); + result.setNextAction(ExecutionResult.JUMP); + result.setNextCmdOffset(offsetFromStartCmd); + } + + private int getOffsetFromStartCmd() { + //TODO getOffsetFromStartCmd + return 0; + } + + public int getGoOffset() { + return goOffset; + } + + public void setGoOffset(int goOffset) { + this.goOffset = goOffset; + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java index b1c1ac7041..4edb97cab0 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java @@ -59,4 +59,7 @@ public String getOperandAsField() { public int getLength() { return 3; } + + + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/field/Field.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/field/Field.java index f388fd01bf..2c46cbec5e 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/field/Field.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/field/Field.java @@ -1,5 +1,6 @@ package me.lzb.jvm.field; +import me.lzb.jvm.attr.ConstantValue; import me.lzb.jvm.constant.ConstantPool; /** @@ -12,6 +13,8 @@ public class Field { private ConstantPool pool; + private ConstantValue constantValue; + public Field(int accessFlag, int nameIndex, int descriptorIndex ,ConstantPool pool) { this.accessFlag = accessFlag; @@ -21,10 +24,21 @@ public Field(int accessFlag, int nameIndex, int descriptorIndex ,ConstantPool po } + + + @Override public String toString() { String key = pool.getUTF8String(nameIndex); String value = pool.getUTF8String(descriptorIndex); return key + ":" + value; } + + public ConstantValue getConstantValue() { + return constantValue; + } + + public void setConstantValue(ConstantValue constantValue) { + this.constantValue = constantValue; + } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java index e265907158..44e572d0a0 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java @@ -190,11 +190,26 @@ private void parserField(ClassFile classFile) { int descriptorIndex = nextBytesToInt(2); int attributesCount = nextBytesToInt(2); - if (attributesCount > 0) { - throw new RuntimeException("Field Attribute has not been implement"); + Field field = new Field(accessFlags, nameIndex, descriptorIndex, classFile.getConstantPool()); + + + for (int j = 1; j < attributesCount; j++) { + + int attrNameIndex = nextBytesToInt(2); + String attrName = classFile.getConstantPool().getUTF8String(attrNameIndex); + + + if (AttributeInfo.CONST_VALUE.equals(attrName)) { + int attrLen = nextBytesToInt(4); + int attrValueIndex = nextBytesToInt(2); + ConstantValue constantValue = new ConstantValue(attrNameIndex, attrLen, attrValueIndex, classFile.getConstantPool()); + field.setConstantValue(constantValue); + } else { + throw new RuntimeException("The field attribute " + attrName + " has not been implement"); + } } - Field field = new Field(accessFlags, nameIndex, descriptorIndex, classFile.getConstantPool()); + classFile.addField(field); } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java index 285ff441c7..4e5566590b 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java @@ -104,6 +104,12 @@ public ByteCodeCommand[] parse(ClassFile clzFile) { BiPushCmd cmd = new BiPushCmd(clzFile, opCode); cmd.setOperand(next2CharAsInt()); cmds.add(cmd); + } else if (ByteCodeCommand.if_icmp_ge.equals(opCode) + || ByteCodeCommand.if_icmple.equals(opCode) + || ByteCodeCommand.goto_no_condition.equals(opCode)) { + + } else if (ByteCodeCommand.iinc.equals(opCode)) { + } else if (ByteCodeCommand.dup.equals(opCode) || ByteCodeCommand.aload_0.equals(opCode) || ByteCodeCommand.aload_1.equals(opCode) diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java index 2bcd612840..55d9145bb3 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java @@ -22,7 +22,7 @@ public static ExecutionFormat getInstance() { return format; } - private ExecutionFormat(){ + private ExecutionFormat() { } @@ -83,6 +83,12 @@ public void visitPutFieldCmd(PutFieldCmd cmd) { exFile(cmd); } + @Override + public void visitComparisonCmd(ComparisonCmd cmd) { + String codeTxt = cmd.getReadableCodeText(); + System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + StringUtils.appendSpace(one, codeTxt) + cmd.getGoOffset()); + } + private void exFile(TwoOperandCmd cmd) { int index = cmd.getIndex(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java index 427894a6ed..f383b10b5a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java @@ -25,5 +25,5 @@ public interface ExecutionVisitor { void visitPutFieldCmd(PutFieldCmd cmd); - + void visitComparisonCmd(ComparisonCmd cmd); } diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java new file mode 100644 index 0000000000..7a088e60da --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java @@ -0,0 +1,56 @@ +package me.lzb.jvm; + +/** + * @author LZB + * @date 2017/5/12 + */ +public class EmployeeV2 { + public static final String TEAM_NAME = "Dev Team"; + private String name; + private int age; + + public EmployeeV2(String name, int age) { + this.name = name; + this.age = age; + } + + public void sayHello() { + System.out.println("Hello , this is class Employee "); + System.out.println("Dev Team"); + System.out.println(this.name); + } + + public void setName(String name) { + this.name = name; + } + + public void setAge(int age) { + this.age = age; + } + + public void isYouth() { + if (this.age < 40) { + System.out.println("You're still young"); + } else { + System.out.println("You're old"); + } + + } + + public void testAdd() { + int sum = 0; + + for (int i = 1; i <= 100; ++i) { + sum += i; + } + + System.out.println(sum); + } + + public static void main(String[] args) { + EmployeeV2 p = new EmployeeV2("Andy", 35); + p.sayHello(); + p.isYouth(); + p.testAdd(); + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/HourlyEmployee.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/HourlyEmployee.java new file mode 100644 index 0000000000..bcb87af439 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/HourlyEmployee.java @@ -0,0 +1,27 @@ +package me.lzb.jvm; + +/** + * @author LZB + * @date 2017/5/12 + */ +public class HourlyEmployee extends EmployeeV2 { + int hourlySalary; + + public HourlyEmployee(String name, int age, int hourlySalary) { + super(name, age); + this.hourlySalary = hourlySalary; + } + + public void sayHello() { + System.out.println("Hello , this is Hourly Employee"); + } + + public static void main(String[] args) { + EmployeeV2 e = new HourlyEmployee("Lisa", 20, 40); + e.sayHello(); + } + + public int getHourlySalary() { + return this.hourlySalary; + } +} From 569fde0965a1f0a76ff1f33ecc559e98d0576a91 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Fri, 12 May 2017 17:16:53 +0800 Subject: [PATCH 512/552] =?UTF-8?q?JVM=E6=9C=80=E5=90=8E=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E8=AF=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/basic/stack/QuickMinStack.java | 3 + .../coderising/jvm/attr/ConstantValue.java | 21 +++++ .../coderising/jvm/cmd/ByteCodeCommand.java | 4 + .../com/coderising/jvm/cmd/CommandParser.java | 23 +++++- .../com/coderising/jvm/cmd/ComparisonCmd.java | 78 +++++++++++++++++++ .../com/coderising/jvm/cmd/IncrementCmd.java | 38 +++++++++ .../src/com/coderising/jvm/field/Field.java | 22 +++++- .../com/coderising/jvm/test/EmployeeV2.java | 54 +++++++++++++ .../src/com/coderising/jvm/test/Example.java | 16 ++++ .../coderising/jvm/test/HourlyEmployee.java | 27 +++++++ .../com/coderising/jvm/test/MiniJVMTest.java | 2 +- 11 files changed, 281 insertions(+), 7 deletions(-) create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/attr/ConstantValue.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/ComparisonCmd.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/IncrementCmd.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/test/EmployeeV2.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/test/Example.java create mode 100644 liuxin/mini-jvm/answer/src/com/coderising/jvm/test/HourlyEmployee.java diff --git a/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStack.java b/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStack.java index b55762e8af..faf2644ab1 100644 --- a/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStack.java +++ b/liuxin/data-structure/answer/src/com/coding/basic/stack/QuickMinStack.java @@ -36,6 +36,9 @@ public int pop(){ return value; } public int findMin(){ + if(minNumStack.isEmpty()){ + throw new RuntimeException("the stack is empty"); + } return minNumStack.peek(); } } \ No newline at end of file diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/attr/ConstantValue.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/attr/ConstantValue.java new file mode 100644 index 0000000000..9b23856bf4 --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/attr/ConstantValue.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.attr; + +public class ConstantValue extends AttributeInfo { + + private int constValueIndex; + + public ConstantValue(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + public int getConstValueIndex() { + return constValueIndex; + } + public void setConstValueIndex(int constValueIndex) { + this.constValueIndex = constValueIndex; + } + + + +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/ByteCodeCommand.java index 6b8f2e6348..e6af5b0a3f 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -55,6 +55,10 @@ public abstract class ByteCodeCommand { static{ codeMap.put("01", "aconst_null"); + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + codeMap.put("A7", "goto"); + codeMap.put("BB", "new"); codeMap.put("37", "lstore"); codeMap.put("B7", "invokespecial"); diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/CommandParser.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/CommandParser.java index f2ea2147fa..60fc52cc59 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/CommandParser.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/CommandParser.java @@ -66,7 +66,20 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { BiPushCmd cmd = new BiPushCmd(clzFile, opCode); cmd.setOperand(iter.next2CharAsInt()); cmds.add(cmd); - } else if (ByteCodeCommand.dup.equals(opCode) + }else if(ByteCodeCommand.if_icmp_ge.equals(opCode) + || ByteCodeCommand.if_icmple.equals(opCode) + || ByteCodeCommand.goto_no_condition.equals(opCode)){ + ComparisonCmd cmd = new ComparisonCmd(clzFile,opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if(ByteCodeCommand.iinc.equals(opCode)){ + IncrementCmd cmd = new IncrementCmd(clzFile,opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } + else if (ByteCodeCommand.dup.equals(opCode) || ByteCodeCommand.aload_0.equals(opCode) || ByteCodeCommand.aload_1.equals(opCode) || ByteCodeCommand.aload_2.equals(opCode) @@ -74,8 +87,14 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { || ByteCodeCommand.iload_2.equals(opCode) || ByteCodeCommand.iload_3.equals(opCode) || ByteCodeCommand.fload_3.equals(opCode) + || ByteCodeCommand.iconst_0.equals(opCode) + || ByteCodeCommand.iconst_1.equals(opCode) + || ByteCodeCommand.istore_1.equals(opCode) + || ByteCodeCommand.istore_2.equals(opCode) || ByteCodeCommand.voidreturn.equals(opCode) - || ByteCodeCommand.astore_1.equals(opCode)) { + || ByteCodeCommand.iadd.equals(opCode) + || ByteCodeCommand.astore_1.equals(opCode) + || ByteCodeCommand.ireturn.equals(opCode)) { NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); cmds.add(cmd); diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/ComparisonCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/ComparisonCmd.java new file mode 100644 index 0000000000..fd900ceaea --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/ComparisonCmd.java @@ -0,0 +1,78 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + +public class ComparisonCmd extends TwoOperandCmd { + + protected ComparisonCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + if(ByteCodeCommand.if_icmp_ge.equals(this.getOpCode())){ + //注意次序 + JavaObject jo2 = frame.getOprandStack().pop(); + JavaObject jo1 = frame.getOprandStack().pop(); + + if(jo1.getIntValue() >= jo2.getIntValue()){ + + this.setJumpResult(result); + + } + + } else if(ByteCodeCommand.if_icmple.equals(this.getOpCode())){ + //注意次序 + JavaObject jo2 = frame.getOprandStack().pop(); + JavaObject jo1 = frame.getOprandStack().pop(); + + if(jo1.getIntValue() <= jo2.getIntValue()){ + this.setJumpResult(result); + } + + } else if(ByteCodeCommand.goto_no_condition.equals(this.getOpCode())){ + this.setJumpResult(result); + + } else{ + throw new RuntimeException(this.getOpCode() + "has not been implemented"); + } + + + + + } + + private int getOffsetFromStartCmd(){ + //If the comparison succeeds, the unsigned branchbyte1 and branchbyte2 + //are used to construct a signed 16-bit offset, where the offset is calculated + //to be (branchbyte1 << 8) | branchbyte2. Execution then proceeds at that + //offset from the address of the opcode of this if_icmp instruction + + + int index1 = this.getOprand1(); + int index2 = this.getOprand2(); + short offsetFromCurrent = (short)(index1 << 8 | index2); + return this.getOffset() + offsetFromCurrent ; + } + private void setJumpResult(ExecutionResult result){ + + int offsetFromStartCmd = this.getOffsetFromStartCmd(); + + result.setNextAction(ExecutionResult.JUMP); + result.setNextCmdOffset(offsetFromStartCmd); + } + + @Override + public String toString() { + int index = this.getIndex(); + String text = this.getReadableCodeText(); + return this.getOffset()+":"+ this.getOpCode() + " "+text + " " + this.getOffsetFromStartCmd(); + } + +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/IncrementCmd.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/IncrementCmd.java new file mode 100644 index 0000000000..dda40bc74d --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/cmd/IncrementCmd.java @@ -0,0 +1,38 @@ +package com.coderising.jvm.cmd; + +import com.coderising.jvm.clz.ClassFile; +import com.coderising.jvm.engine.ExecutionResult; +import com.coderising.jvm.engine.Heap; +import com.coderising.jvm.engine.JavaObject; +import com.coderising.jvm.engine.StackFrame; + +public class IncrementCmd extends TwoOperandCmd { + + public IncrementCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString() { + + return this.getOffset()+":"+this.getOpCode()+ " " +this.getReadableCodeText(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + int index = this.getOprand1(); + + int constValue = this.getOprand2(); + + int currentValue = frame.getLocalVariableValue(index).getIntValue(); + + JavaObject jo = Heap.getInstance().newInt(constValue+currentValue); + + frame.setLocalVariableValue(index, jo); + + + } + +} \ No newline at end of file diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/field/Field.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/field/Field.java index c6eb0196f8..e1e4723aa0 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/field/Field.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/field/Field.java @@ -1,5 +1,7 @@ package com.coderising.jvm.field; +import com.coderising.jvm.attr.AttributeInfo; +import com.coderising.jvm.attr.ConstantValue; import com.coderising.jvm.constant.ConstantPool; import com.coderising.jvm.constant.UTF8Info; import com.coderising.jvm.loader.ByteCodeIterator; @@ -10,9 +12,8 @@ public class Field { private int nameIndex; private int descriptorIndex; - - private ConstantPool pool; + private ConstantValue constValue; public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { @@ -40,11 +41,24 @@ public static Field parse(ConstantPool pool,ByteCodeIterator iter){ Field f = new Field(accessFlag, nameIndex, descIndex,pool); - if(attribCount > 0){ - throw new RuntimeException("Field Attribute has not been implemented"); + for( int i=1; i<= attribCount; i++){ + int attrNameIndex = iter.nextU2ToInt(); + String attrName = pool.getUTF8String(attrNameIndex); + + if(AttributeInfo.CONST_VALUE.equals(attrName)){ + int attrLen = iter.nextU4ToInt(); + ConstantValue constValue = new ConstantValue(attrNameIndex, attrLen); + constValue.setConstValueIndex(iter.nextU2ToInt()); + f.setConstantValue(constValue); + } else{ + throw new RuntimeException("the attribute " + attrName + " has not been implemented yet."); + } } return f; } + public void setConstantValue(ConstantValue constValue) { + this.constValue = constValue; + } } diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/EmployeeV2.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/EmployeeV2.java new file mode 100644 index 0000000000..039800d2b1 --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/EmployeeV2.java @@ -0,0 +1,54 @@ +package com.coderising.jvm.test; + +public class EmployeeV2 { + + public final static String TEAM_NAME = "Dev Team"; + private String name; + private int age; + public EmployeeV2(String name, int age) { + this.name = name; + this.age = age; + } + + public void sayHello() { + System.out.println("Hello , this is class Employee "); + System.out.println(TEAM_NAME); + System.out.println(this.name); + } + + public void setName(String name) { + this.name = name; + } + + public void setAge(int age) { + this.age = age; + } + + + + public void isYouth() { + if (age < 40) { + System.out.println("You're still young"); + } else { + System.out.println("You're old"); + } + } + + + + public void testAdd() { + int sum = 0; + for (int i = 1; i <= 100; i++) { + sum += i; + } + System.out.println(sum); + } + + + public static void main(String[] args) { + EmployeeV2 p = new EmployeeV2("Andy", 35); + p.sayHello(); + p.isYouth(); + p.testAdd(); + } +} \ No newline at end of file diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/Example.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/Example.java new file mode 100644 index 0000000000..7763e38d1e --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/Example.java @@ -0,0 +1,16 @@ +package com.coderising.jvm.test; + +public class Example{ + public void disp(char c){ + System.out.println(c); + } + public void disp(int c){ + System.out.println(c ); + } + public static void main(String args[]){ + Example obj = new Example(); + obj.disp('a'); + obj.disp(5); + } +} + diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/HourlyEmployee.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/HourlyEmployee.java new file mode 100644 index 0000000000..d26e097a82 --- /dev/null +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/HourlyEmployee.java @@ -0,0 +1,27 @@ +package com.coderising.jvm.test; + +public class HourlyEmployee extends EmployeeV2 { + + int hourlySalary; + + public HourlyEmployee(String name, + int age, int hourlySalary) { + super(name, age); + this.hourlySalary = hourlySalary; + } + + public void sayHello(){ + System.out.println("Hello , this is Hourly Employee"); + } + public static void main(String[] args){ + EmployeeV2 e = new HourlyEmployee("Lisa", 20, 40); + e.sayHello(); + } + + public int getHourlySalary(){ + return this.hourlySalary; + } + + + +} diff --git a/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/MiniJVMTest.java b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/MiniJVMTest.java index 787c0d954d..48b1383c2a 100644 --- a/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/MiniJVMTest.java +++ b/liuxin/mini-jvm/answer/src/com/coderising/jvm/test/MiniJVMTest.java @@ -21,7 +21,7 @@ public void tearDown() throws Exception { public void testMain() throws Exception{ String[] classPaths = {PATH}; MiniJVM jvm = new MiniJVM(); - jvm.run(classPaths, "com.coderising.jvm.test.EmployeeV1"); + jvm.run(classPaths, "com.coderising.jvm.test.HourlyEmployee"); } From a02369f29ea33c72afd3c4e66624def8611b8bff Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Fri, 12 May 2017 17:18:11 +0800 Subject: [PATCH 513/552] refactor --- .../src/com/coding/basic/BinaryTreeNode.java | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 liuxin/data-structure/answer/src/com/coding/basic/BinaryTreeNode.java diff --git a/liuxin/data-structure/answer/src/com/coding/basic/BinaryTreeNode.java b/liuxin/data-structure/answer/src/com/coding/basic/BinaryTreeNode.java deleted file mode 100644 index d7ac820192..0000000000 --- a/liuxin/data-structure/answer/src/com/coding/basic/BinaryTreeNode.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.coding.basic; - -public class BinaryTreeNode { - - private Object data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public Object getData() { - return data; - } - public void setData(Object data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} From 6d4843269348791051ea4273ae65e3ebb7f7b8c6 Mon Sep 17 00:00:00 2001 From: lzbferrari Date: Sat, 13 May 2017 02:05:41 +0800 Subject: [PATCH 514/552] =?UTF-8?q?=E6=9C=80=E5=90=8EJVM=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/lzb/jvm/attr/ConstantValue.java | 27 +++++------ .../java/me/lzb/jvm/cmd/ByteCodeCommand.java | 7 +-- .../java/me/lzb/jvm/cmd/ComparisonCmd.java | 17 +++++-- .../java/me/lzb/jvm/cmd/IncrementCmd.java | 46 +++++++++++++++++++ .../java/me/lzb/jvm/cmd/InvokeVirtualCmd.java | 2 +- .../me/lzb/jvm/loader/ClassFileParser.java | 19 ++++---- .../java/me/lzb/jvm/loader/CommandParser.java | 21 +++++++-- .../me/lzb/jvm/print/ExecutionFormat.java | 9 ++++ .../me/lzb/jvm/print/ExecutionVisitor.java | 2 + .../src/main/java/me/lzb/jvm/print/Print.java | 2 +- .../java/me/lzb/jvm/ClassFileloaderTest.java | 2 +- .../src/test/java/me/lzb/jvm/EmployeeV2.java | 2 +- .../src/test/java/me/lzb/jvm/MiniJVMTest.java | 16 +++++++ 13 files changed, 132 insertions(+), 40 deletions(-) create mode 100644 group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/IncrementCmd.java diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java index ba87c028b9..a914a259ad 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java @@ -1,27 +1,24 @@ package me.lzb.jvm.attr; -import me.lzb.jvm.constant.ConstantPool; - /** * @author LZB * @date 2017/5/12 */ -public class ConstantValue { - //U2 - private int attributeNameIndex; - //U4 - private int attributeLength; +public class ConstantValue extends AttributeInfo { - //U2 - private int constantvalueIndex; + private int constValueIndex; - private ConstantPool pool; + public ConstantValue(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } - public ConstantValue(int attributeNameIndex, int attributeLength, int constantvalueIndex, ConstantPool pool){ - this.attributeNameIndex = attributeNameIndex; - this.attributeLength = attributeLength; - this.constantvalueIndex = constantvalueIndex; - this.pool = pool; + public int getConstValueIndex() { + return constValueIndex; } + public void setConstValueIndex(int constValueIndex) { + this.constValueIndex = constValueIndex; + } + + } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java index b79f7d7f2c..b2e4e4c0be 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java @@ -43,7 +43,8 @@ public abstract class ByteCodeCommand { public static final String freturn = "AE"; public static final String astore_1 = "4C"; - public static final String if_icmp_ge = "A2"; + public static final String if_icmpge = "A2"; + public static final String if_icmpgt = "A3"; public static final String if_icmple = "A4"; public static final String goto_no_condition = "A7"; public static final String iconst_0 = "03"; @@ -89,9 +90,9 @@ public abstract class ByteCodeCommand { codeMap.put(fload_2, "fload_2"); codeMap.put(astore_1, "astore_1"); - codeMap.put(if_icmp_ge, "if_icmp_ge"); + codeMap.put(if_icmpge, "if_icmpge"); codeMap.put(if_icmple, "if_icmple"); - + codeMap.put(if_icmpgt, "if_icmpgt"); codeMap.put("A7", "goto"); codeMap.put("B1", "return"); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java index ba1b2341a1..c7313afbef 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java @@ -21,7 +21,7 @@ public ComparisonCmd(ClassFile clzFile, String opCode) { @Override public void execute(StackFrame frame, ExecutionResult result) { - if (ByteCodeCommand.if_icmp_ge.equals(this.getOpCode())) { + if (ByteCodeCommand.if_icmpge.equals(this.getOpCode())) { JavaObject jo2 = frame.getOprandStack().pop(); JavaObject jo1 = frame.getOprandStack().pop(); @@ -38,6 +38,13 @@ public void execute(StackFrame frame, ExecutionResult result) { setJumpResult(result); } + } else if (ByteCodeCommand.if_icmpgt.equals(this.getOpCode())) { + JavaObject jo2 = frame.getOprandStack().pop(); + JavaObject jo1 = frame.getOprandStack().pop(); + + if (jo1.getIntValue() > jo2.getIntValue()) { + setJumpResult(result); + } } else if (ByteCodeCommand.goto_no_condition.equals(this.opCode)) { setJumpResult(result); } @@ -56,8 +63,12 @@ private void setJumpResult(ExecutionResult result) { } private int getOffsetFromStartCmd() { - //TODO getOffsetFromStartCmd - return 0; +// 如果比较结果为真,那无符号 byte 型数据 branchbyte1 和 branchbyte2 用于构建一个 16 位有符号的分支偏移量,构建方式为(branchbyte1 << 8)| branchbyte2。 +// 指令执行后,程序将会转到这个 if_acmp指令之后的,由上述偏移量确定的目标地址上继续执行。这个目标地址必须处于if_acmp指令所在的方法之中。 + int index1 = this.getOprand1(); + int index2 = this.getOprand2(); + short offsetFromCurrent = (short) (index1 << 8 | index2); + return this.getOffset() + offsetFromCurrent; } public int getGoOffset() { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/IncrementCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/IncrementCmd.java new file mode 100644 index 0000000000..a0e3636160 --- /dev/null +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/IncrementCmd.java @@ -0,0 +1,46 @@ +package me.lzb.jvm.cmd; + +import me.lzb.jvm.clz.ClassFile; +import me.lzb.jvm.engine.ExecutionResult; +import me.lzb.jvm.engine.Heap; +import me.lzb.jvm.engine.JavaObject; +import me.lzb.jvm.engine.StackFrame; +import me.lzb.jvm.print.ExecutionVisitor; + +/** + * Created by lzbfe on 2017/5/13. + */ +public class IncrementCmd extends TwoOperandCmd { + + public IncrementCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString() { + + return this.getOffset() + ":" + this.getOpCode() + " " + this.getReadableCodeText(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + int index = this.getOprand1(); + + int constValue = this.getOprand2(); + + int currentValue = frame.getLocalVariableValue(index).getIntValue(); + + JavaObject jo = Heap.getInstance().newInt(constValue + currentValue); + + frame.setLocalVariableValue(index, jo); + + + } + + @Override + public void printExecute(ExecutionVisitor visitor) { + visitor.visitIncrementCmd(this); + } +} diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java index caf195c206..ecf3ecd795 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java @@ -40,7 +40,7 @@ public void execute(StackFrame frame, ExecutionResult result) { return; } - //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + //多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 JavaObject jo = frame.getOprandStack().peek(); MethodArea ma = MethodArea.getInstance(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java index 44e572d0a0..2e99fb4357 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java @@ -185,32 +185,29 @@ private void parserInterface(ClassFile classFile) { private void parserField(ClassFile classFile) { int count = nextBytesToInt(2); for (int i = 1; i <= count; i++) { + int accessFlags = nextBytesToInt(2); int nameIndex = nextBytesToInt(2); int descriptorIndex = nextBytesToInt(2); int attributesCount = nextBytesToInt(2); - Field field = new Field(accessFlags, nameIndex, descriptorIndex, classFile.getConstantPool()); - - - for (int j = 1; j < attributesCount; j++) { + Field f = new Field(accessFlags, nameIndex, descriptorIndex, classFile.getConstantPool()); + for (int j = 1; j <= attributesCount; j++) { int attrNameIndex = nextBytesToInt(2); String attrName = classFile.getConstantPool().getUTF8String(attrNameIndex); - if (AttributeInfo.CONST_VALUE.equals(attrName)) { int attrLen = nextBytesToInt(4); - int attrValueIndex = nextBytesToInt(2); - ConstantValue constantValue = new ConstantValue(attrNameIndex, attrLen, attrValueIndex, classFile.getConstantPool()); - field.setConstantValue(constantValue); + ConstantValue constValue = new ConstantValue(attrNameIndex, attrLen); + constValue.setConstValueIndex(nextBytesToInt(2)); + f.setConstantValue(constValue); } else { - throw new RuntimeException("The field attribute " + attrName + " has not been implement"); + throw new RuntimeException("the attribute " + attrName + " has not been implemented yet."); } } - - classFile.addField(field); + classFile.addField(f); } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java index 4e5566590b..28a640f13a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java @@ -104,12 +104,19 @@ public ByteCodeCommand[] parse(ClassFile clzFile) { BiPushCmd cmd = new BiPushCmd(clzFile, opCode); cmd.setOperand(next2CharAsInt()); cmds.add(cmd); - } else if (ByteCodeCommand.if_icmp_ge.equals(opCode) + } else if (ByteCodeCommand.if_icmpge.equals(opCode) + || ByteCodeCommand.if_icmpgt.equals(opCode) || ByteCodeCommand.if_icmple.equals(opCode) || ByteCodeCommand.goto_no_condition.equals(opCode)) { - + ComparisonCmd cmd = new ComparisonCmd(clzFile, opCode); + cmd.setOprand1(next2CharAsInt()); + cmd.setOprand2(next2CharAsInt()); + cmds.add(cmd); } else if (ByteCodeCommand.iinc.equals(opCode)) { - + IncrementCmd cmd = new IncrementCmd(clzFile, opCode); + cmd.setOprand1(next2CharAsInt()); + cmd.setOprand2(next2CharAsInt()); + cmds.add(cmd); } else if (ByteCodeCommand.dup.equals(opCode) || ByteCodeCommand.aload_0.equals(opCode) || ByteCodeCommand.aload_1.equals(opCode) @@ -118,8 +125,14 @@ public ByteCodeCommand[] parse(ClassFile clzFile) { || ByteCodeCommand.iload_2.equals(opCode) || ByteCodeCommand.iload_3.equals(opCode) || ByteCodeCommand.fload_3.equals(opCode) + || ByteCodeCommand.iconst_0.equals(opCode) + || ByteCodeCommand.iconst_1.equals(opCode) + || ByteCodeCommand.istore_1.equals(opCode) + || ByteCodeCommand.istore_2.equals(opCode) || ByteCodeCommand.voidreturn.equals(opCode) - || ByteCodeCommand.astore_1.equals(opCode)) { + || ByteCodeCommand.iadd.equals(opCode) + || ByteCodeCommand.astore_1.equals(opCode) + || ByteCodeCommand.ireturn.equals(opCode)) { NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); cmds.add(cmd); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java index 55d9145bb3..88a55f6d5e 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java @@ -83,12 +83,21 @@ public void visitPutFieldCmd(PutFieldCmd cmd) { exFile(cmd); } + @Override public void visitComparisonCmd(ComparisonCmd cmd) { + //TODO 执行输出格式 String codeTxt = cmd.getReadableCodeText(); System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + StringUtils.appendSpace(one, codeTxt) + cmd.getGoOffset()); } + @Override + public void visitIncrementCmd(IncrementCmd cmd) { + //TODO 执行输出格式 + String codeTxt = cmd.getReadableCodeText(); + System.out.println(getOffset(cmd.getOffset()) + ":" + cmd.getOpCode() + " " + StringUtils.appendSpace(one, codeTxt)); + } + private void exFile(TwoOperandCmd cmd) { int index = cmd.getIndex(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java index f383b10b5a..4f6383799b 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java @@ -26,4 +26,6 @@ public interface ExecutionVisitor { void visitPutFieldCmd(PutFieldCmd cmd); void visitComparisonCmd(ComparisonCmd cmd); + + void visitIncrementCmd(IncrementCmd cmd); } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java index 1435d46814..e064011528 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java @@ -5,6 +5,6 @@ */ public interface Print { - public void print(PrintVisitor visitor); + void print(PrintVisitor visitor); } diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java index a9f20b23c1..8b7afe8c5a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java @@ -95,7 +95,7 @@ public void testMagicNumber() throws Exception { static { ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1); + loader.addClassPath(path1 ); clzFile = loader.loadClass(className); clzFile.print(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java index 7a088e60da..ccc6cc1182 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java @@ -40,7 +40,7 @@ public void isYouth() { public void testAdd() { int sum = 0; - for (int i = 1; i <= 100; ++i) { + for (int i = 1; i <= 10; ++i) { sum += i; } diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java index 0be0dea7c4..32254c6f74 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java @@ -25,4 +25,20 @@ public void testMain() throws Exception{ } + @Test + public void testMainV2() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "me.lzb.jvm.EmployeeV2"); + + } + + @Test + public void testMainHE() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "me.lzb.jvm.HourlyEmployee"); + + } + } From fb595861c298cf4f64c787043bd6c9ef51bf599d Mon Sep 17 00:00:00 2001 From: liangduoduo666666 <798277403@qq.com> Date: Sat, 13 May 2017 12:39:45 +0800 Subject: [PATCH 515/552] =?UTF-8?q?zl=E7=9A=84=E7=AC=AC=E5=85=AD=E4=B8=83?= =?UTF-8?q?=E5=91=A8=E4=BD=9C=E4=B8=9A=E8=A1=A5=E4=BA=A4=EF=BC=8Cjvm?= =?UTF-8?q?=E5=AF=B9=E5=AD=97=E6=AE=B5=E6=96=B9=E6=B3=95=EF=BC=8C=E5=AD=97?= =?UTF-8?q?=E8=8A=82=E7=A0=81=E7=9A=84=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhouliang/litestruts/struts.xml | 11 ++ .../src/basic/stack/expr/InfixExpr.java | 70 ++++++++ .../src/basic/stack/expr/InfixExprTest.java | 51 ++++++ .../src/basic/stack/expr/InfixToPostfix.java | 75 ++++++++ .../basic/stack/expr/InfixToPostfixTest.java | 41 +++++ .../src/basic/stack/expr/PostfixExpr.java | 60 +++++++ .../src/basic/stack/expr/PostfixExprTest.java | 41 +++++ .../src/basic/stack/expr/PrefixExpr.java | 83 +++++++++ .../src/basic/stack/expr/PrefixExprTest.java | 45 +++++ .../798277403/src/basic/stack/expr/Token.java | 52 ++++++ .../src/basic/stack/expr/TokenParser.java | 57 ++++++ .../src/basic/stack/expr/TokenParserTest.java | 41 +++++ group24/798277403/src/litestruts/struts.xml | 11 ++ .../src/mini_jvm/attr/AttributeInfo.java | 22 +++ .../798277403/src/mini_jvm/attr/CodeAttr.java | 106 ++++++++++++ .../src/mini_jvm/attr/LineNumberTable.java | 69 ++++++++ .../src/mini_jvm/attr/LocalVariableItem.java | 39 +++++ .../src/mini_jvm/attr/LocalVariableTable.java | 59 +++++++ .../src/mini_jvm/attr/StackMapTable.java | 30 ++++ .../798277403/src/mini_jvm/clz/ClassFile.java | 57 +++++- .../798277403/src/mini_jvm/cmd/BiPushCmd.java | 30 ++++ .../src/mini_jvm/cmd/ByteCodeCommand.java | 153 +++++++++++++++++ .../src/mini_jvm/cmd/CommandParser.java | 162 ++++++++++++++++++ .../src/mini_jvm/cmd/GetFieldCmd.java | 29 ++++ .../src/mini_jvm/cmd/GetStaticFieldCmd.java | 28 +++ .../src/mini_jvm/cmd/InvokeSpecialCmd.java | 30 ++++ .../src/mini_jvm/cmd/InvokeVirtualCmd.java | 29 ++++ .../798277403/src/mini_jvm/cmd/LdcCmd.java | 38 ++++ .../src/mini_jvm/cmd/NewObjectCmd.java | 28 +++ .../src/mini_jvm/cmd/NoOperandCmd.java | 33 ++++ .../src/mini_jvm/cmd/OneOperandCmd.java | 30 ++++ .../src/mini_jvm/cmd/PutFieldCmd.java | 28 +++ .../src/mini_jvm/cmd/TwoOperandCmd.java | 67 ++++++++ .../src/mini_jvm/constant/ClassInfo.java | 5 + .../src/mini_jvm/constant/ConstantInfo.java | 14 +- .../src/mini_jvm/constant/ConstantPool.java | 2 +- .../src/mini_jvm/constant/FieldRefInfo.java | 5 + .../src/mini_jvm/constant/MethodRefInfo.java | 7 +- .../mini_jvm/constant/NameAndTypeInfo.java | 5 + .../mini_jvm/constant/NullConstantInfo.java | 8 +- .../src/mini_jvm/constant/StringInfo.java | 7 +- .../src/mini_jvm/constant/UTF8Info.java | 6 + .../src/mini_jvm/engine/ExecutionResult.java | 57 ++++++ .../src/mini_jvm/engine/ExecutorEngine.java | 31 ++++ .../798277403/src/mini_jvm/engine/Heap.java | 39 +++++ .../src/mini_jvm/engine/JavaObject.java | 71 ++++++++ .../src/mini_jvm/engine/MethodArea.java | 69 ++++++++ .../src/mini_jvm/engine/MiniJVM.java | 30 ++++ .../src/mini_jvm/engine/StackFrame.java | 96 +++++++++++ .../798277403/src/mini_jvm/field/Field.java | 48 ++++++ .../src/mini_jvm/loader/ClassFileParser.java | 35 ++++ .../798277403/src/mini_jvm/method/Method.java | 92 ++++++++++ .../src/mini_jvm/print/ClassFilePrinter.java | 45 +++++ .../mini_jvm/print/ConstantPoolPrinter.java | 79 +++++++++ .../print/ConstantPoolPrinterBad.java | 41 +++++ .../mini_jvm/test/ClassFileloaderTest.java | 159 ++++++++++++++++- 56 files changed, 2638 insertions(+), 18 deletions(-) create mode 100644 group24/798277403/out/production/zhouliang/litestruts/struts.xml create mode 100644 group24/798277403/src/basic/stack/expr/InfixExpr.java create mode 100644 group24/798277403/src/basic/stack/expr/InfixExprTest.java create mode 100644 group24/798277403/src/basic/stack/expr/InfixToPostfix.java create mode 100644 group24/798277403/src/basic/stack/expr/InfixToPostfixTest.java create mode 100644 group24/798277403/src/basic/stack/expr/PostfixExpr.java create mode 100644 group24/798277403/src/basic/stack/expr/PostfixExprTest.java create mode 100644 group24/798277403/src/basic/stack/expr/PrefixExpr.java create mode 100644 group24/798277403/src/basic/stack/expr/PrefixExprTest.java create mode 100644 group24/798277403/src/basic/stack/expr/Token.java create mode 100644 group24/798277403/src/basic/stack/expr/TokenParser.java create mode 100644 group24/798277403/src/basic/stack/expr/TokenParserTest.java create mode 100644 group24/798277403/src/litestruts/struts.xml create mode 100644 group24/798277403/src/mini_jvm/attr/AttributeInfo.java create mode 100644 group24/798277403/src/mini_jvm/attr/CodeAttr.java create mode 100644 group24/798277403/src/mini_jvm/attr/LineNumberTable.java create mode 100644 group24/798277403/src/mini_jvm/attr/LocalVariableItem.java create mode 100644 group24/798277403/src/mini_jvm/attr/LocalVariableTable.java create mode 100644 group24/798277403/src/mini_jvm/attr/StackMapTable.java create mode 100644 group24/798277403/src/mini_jvm/cmd/BiPushCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/ByteCodeCommand.java create mode 100644 group24/798277403/src/mini_jvm/cmd/CommandParser.java create mode 100644 group24/798277403/src/mini_jvm/cmd/GetFieldCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/GetStaticFieldCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/InvokeSpecialCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/InvokeVirtualCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/LdcCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/NewObjectCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/NoOperandCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/OneOperandCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/PutFieldCmd.java create mode 100644 group24/798277403/src/mini_jvm/cmd/TwoOperandCmd.java create mode 100644 group24/798277403/src/mini_jvm/engine/ExecutionResult.java create mode 100644 group24/798277403/src/mini_jvm/engine/ExecutorEngine.java create mode 100644 group24/798277403/src/mini_jvm/engine/Heap.java create mode 100644 group24/798277403/src/mini_jvm/engine/JavaObject.java create mode 100644 group24/798277403/src/mini_jvm/engine/MethodArea.java create mode 100644 group24/798277403/src/mini_jvm/engine/MiniJVM.java create mode 100644 group24/798277403/src/mini_jvm/engine/StackFrame.java create mode 100644 group24/798277403/src/mini_jvm/field/Field.java create mode 100644 group24/798277403/src/mini_jvm/method/Method.java create mode 100644 group24/798277403/src/mini_jvm/print/ClassFilePrinter.java create mode 100644 group24/798277403/src/mini_jvm/print/ConstantPoolPrinter.java create mode 100644 group24/798277403/src/mini_jvm/print/ConstantPoolPrinterBad.java diff --git a/group24/798277403/out/production/zhouliang/litestruts/struts.xml b/group24/798277403/out/production/zhouliang/litestruts/struts.xml new file mode 100644 index 0000000000..ba03a9d20d --- /dev/null +++ b/group24/798277403/out/production/zhouliang/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + diff --git a/group24/798277403/src/basic/stack/expr/InfixExpr.java b/group24/798277403/src/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..2b395d87f5 --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/InfixExpr.java @@ -0,0 +1,70 @@ +package basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +/** + * 中缀表达式求值 + */ +public class InfixExpr { + String expr = null; + + public InfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(Token token : tokens){ + + if (token.isOperator()){ + //当运算符栈不为空,并且当前的操作符优先级不比栈顶操作符优先级高时,弹出栈顶操作符进行运算 + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + Token prevOperator = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(prevOperator.toString(), f1,f2); + numStack.push(result); + } + opStack.push(token); + } + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + } + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + numStack.push(calculate(token.toString(), f1,f2)); + } + + + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } + +} diff --git a/group24/798277403/src/basic/stack/expr/InfixExprTest.java b/group24/798277403/src/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..67f6f08060 --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,51 @@ +package basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("10-2*3+50"); + Assert.assertEquals(54, expr.evaluate(), 0.001f); + } + + } + +} diff --git a/group24/798277403/src/basic/stack/expr/InfixToPostfix.java b/group24/798277403/src/basic/stack/expr/InfixToPostfix.java new file mode 100644 index 0000000000..438d8bb37b --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/InfixToPostfix.java @@ -0,0 +1,75 @@ +package basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class InfixToPostfix { + + public static List convert(String expr) { + List inFixTokens = new TokenParser().parse(expr); + List postFixTokens = new ArrayList<>(); + Stack opStack = new Stack(); + + for(Token token : inFixTokens){ + if(token.isNumber()){ + postFixTokens.add(token); + } + if(token.isOperator()){ + while(!opStack.isEmpty() && !token.hasHigherPriority(opStack.peek())){ + postFixTokens.add(opStack.pop()); + } + opStack.push(token); + } + if(token.toString().equals("(")){ + opStack.push(token); + } + if(token.toString().equals(")")){ + while(!opStack.peek().value.equals(")")){ + postFixTokens.add(opStack.pop()); + } + opStack.pop(); + } + } + while(!opStack.isEmpty()){ + postFixTokens.add(opStack.pop()); + } + return postFixTokens; + } + + + public static List convert1(String expr) { + List inFixTokens = new TokenParser().parse(expr); + + List postFixTokens = new ArrayList<>(); + + Stack opStack = new Stack(); + for(Token token : inFixTokens){ + + if(token.isOperator()){ + + while(!opStack.isEmpty() + && !token.hasHigherPriority(opStack.peek())){ + postFixTokens.add(opStack.pop()); + + } + opStack.push(token); + + } + if(token.isNumber()){ + + postFixTokens.add(token); + + } + } + + while(!opStack.isEmpty()){ + postFixTokens.add(opStack.pop()); + } + + return postFixTokens; + } + + + +} diff --git a/group24/798277403/src/basic/stack/expr/InfixToPostfixTest.java b/group24/798277403/src/basic/stack/expr/InfixToPostfixTest.java new file mode 100644 index 0000000000..b5584851de --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/InfixToPostfixTest.java @@ -0,0 +1,41 @@ +package basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + + + +public class InfixToPostfixTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testConvert() { + { + List tokens = InfixToPostfix.convert("2+3"); + Assert.assertEquals("[2, 3, +]", tokens.toString()); + } + { + + List tokens = InfixToPostfix.convert("2+3*4"); + Assert.assertEquals("[2, 3, 4, *, +]", tokens.toString()); + } + + { + + List tokens = InfixToPostfix.convert("2-3*4+5"); + Assert.assertEquals("[2, 3, 4, *, -, 5, +]", tokens.toString()); + } + } + +} diff --git a/group24/798277403/src/basic/stack/expr/PostfixExpr.java b/group24/798277403/src/basic/stack/expr/PostfixExpr.java new file mode 100644 index 0000000000..b9aab26059 --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/PostfixExpr.java @@ -0,0 +1,60 @@ +package basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PostfixExpr { +String expr = null; + + public PostfixExpr(String expr) { + this.expr = expr; + } + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + for(Token token : tokens){ + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + if(token.isOperator()){ + if(numStack.size()>=2){ + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(token.toString(), f1,f2); + numStack.push(result); + }else{ + opStack.push(token); + } + } + } + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f2 = numStack.pop(); + Float f1 = numStack.pop(); + Float result = calculate(token.toString(), f1,f2); + numStack.push(result); + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group24/798277403/src/basic/stack/expr/PostfixExprTest.java b/group24/798277403/src/basic/stack/expr/PostfixExprTest.java new file mode 100644 index 0000000000..641635398a --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/PostfixExprTest.java @@ -0,0 +1,41 @@ +package basic.stack.expr; + + + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class PostfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + PostfixExpr expr = new PostfixExpr("6 5 2 3 + 8 * + 3 + *"); + Assert.assertEquals(288, expr.evaluate(),0.0f); + } + { + //9+(3-1)*3+10/2 + PostfixExpr expr = new PostfixExpr("9 3 1-3*+ 10 2/+"); + Assert.assertEquals(20, expr.evaluate(),0.0f); + } + + { + //10-2*3+50 + PostfixExpr expr = new PostfixExpr("10 2 3 * - 50 +"); + Assert.assertEquals(54, expr.evaluate(),0.0f); + } + } + +} diff --git a/group24/798277403/src/basic/stack/expr/PrefixExpr.java b/group24/798277403/src/basic/stack/expr/PrefixExpr.java new file mode 100644 index 0000000000..740ce8b788 --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/PrefixExpr.java @@ -0,0 +1,83 @@ +package basic.stack.expr; + +import java.util.List; +import java.util.Stack; + +public class PrefixExpr { + String expr = null; + + public PrefixExpr(String expr) { + this.expr = expr; + } + +/* public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + Stack opStack = new Stack<>(); + Stack numStack = new Stack<>(); + + for(int i=tokens.size()-1; i>=0; i--){ + Token token = tokens.get(i); + if(token.isNumber()){ + numStack.push(new Float(token.getIntValue())); + } + if(token.isOperator()){ + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + Float result = calculate(token.toString(),f1,f2); + numStack.push(result); + } + } + + while(!opStack.isEmpty()){ + Token token = opStack.pop(); + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + Float result = calculate(token.toString(),f1,f2); + numStack.push(result); + } + System.out.println(numStack.peek()); + return numStack.pop().floatValue(); + }*/ + + + public float evaluate() { + TokenParser parser = new TokenParser(); + List tokens = parser.parse(this.expr); + + Stack exprStack = new Stack<>(); + Stack numStack = new Stack<>(); + for(Token token : tokens){ + exprStack.push(token); + } + + while(!exprStack.isEmpty()){ + Token t = exprStack.pop(); + if(t.isNumber()){ + numStack.push(new Float(t.getIntValue())); + }else{ + Float f1 = numStack.pop(); + Float f2 = numStack.pop(); + numStack.push(calculate(t.toString(),f1,f2)); + + } + } + return numStack.pop().floatValue(); + } + + private Float calculate(String op, Float f1, Float f2){ + if(op.equals("+")){ + return f1+f2; + } + if(op.equals("-")){ + return f1-f2; + } + if(op.equals("*")){ + return f1*f2; + } + if(op.equals("/")){ + return f1/f2; + } + throw new RuntimeException(op + " is not supported"); + } +} diff --git a/group24/798277403/src/basic/stack/expr/PrefixExprTest.java b/group24/798277403/src/basic/stack/expr/PrefixExprTest.java new file mode 100644 index 0000000000..4d4c42c368 --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/PrefixExprTest.java @@ -0,0 +1,45 @@ +package basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class PrefixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + { + // 2*3+4*5 + PrefixExpr expr = new PrefixExpr("+ * 2 3 * 4 5"); + Assert.assertEquals(26, expr.evaluate(),0.001f); + } + { + // 4*2 + 6+9*2/3 -8 + PrefixExpr expr = new PrefixExpr("- + + 6 / * 2 9 3 * 4 2 8"); + Assert.assertEquals(12, expr.evaluate(),0.001f); + } + { + //(3+4)*5-6 + PrefixExpr expr = new PrefixExpr("- * + 3 4 5 6"); + Assert.assertEquals(29, expr.evaluate(),0.001f); + } + { + //1+((2+3)*4)-5 + PrefixExpr expr = new PrefixExpr("- + 1 * + 2 3 4 5"); + Assert.assertEquals(16, expr.evaluate(),0.001f); + } + + + } + +} diff --git a/group24/798277403/src/basic/stack/expr/Token.java b/group24/798277403/src/basic/stack/expr/Token.java new file mode 100644 index 0000000000..459e44bc47 --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/Token.java @@ -0,0 +1,52 @@ +package basic.stack.expr; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +class Token { + public static final List OPERATORS = Arrays.asList("+", "-", "*", "/"); + private static final Map priorities = new HashMap<>(); + static { + priorities.put("+", 1); + priorities.put("-", 1); + priorities.put("*", 2); + priorities.put("/", 2); + } + static final int OPERATOR = 1; + static final int NUMBER = 2; + String value; + int type; + public Token(int type, String value){ + this.type = type; + this.value = value; + } + + public boolean isNumber() { + return type == NUMBER; + } + + public boolean isOperator() { + return type == OPERATOR; + } + + public int getIntValue() { + return Integer.valueOf(value).intValue(); + } + + + public String toString(){ + return value; + } + + public boolean hasHigherPriority(Token t){ + if(!this.isOperator() && !t.isOperator()){ + throw new RuntimeException("numbers can't compare priority"); + } + return priorities.get(this.value) - priorities.get(t.value) > 0; + } + + + +} \ No newline at end of file diff --git a/group24/798277403/src/basic/stack/expr/TokenParser.java b/group24/798277403/src/basic/stack/expr/TokenParser.java new file mode 100644 index 0000000000..2feb36520f --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/TokenParser.java @@ -0,0 +1,57 @@ +package basic.stack.expr; + +import java.util.ArrayList; +import java.util.List; + +public class TokenParser { + + + public List parse(String expr) { + List tokens = new ArrayList<>(); + + int i = 0; + + while (i < expr.length()) { + + char c = expr.charAt(i); + + if (isOperator(c)) { + + Token t = new Token(Token.OPERATOR, String.valueOf(c)); + tokens.add(t); + i++; + + } else if (Character.isDigit(c)) { + + int nextOperatorIndex = indexOfNextOperator(i, expr); + String value = expr.substring(i, nextOperatorIndex); + Token t = new Token(Token.NUMBER, value); + tokens.add(t); + i = nextOperatorIndex; + + } else{ + System.out.println("char :["+c+"] is not number or operator,ignore"); + i++; + } + + } + return tokens; + } + + private int indexOfNextOperator(int i, String expr) { + + while (Character.isDigit(expr.charAt(i))) { + i++; + if (i == expr.length()) { + break; + } + } + return i; + + } + + private boolean isOperator(char c) { + String sc = String.valueOf(c); + return Token.OPERATORS.contains(sc); + } +} diff --git a/group24/798277403/src/basic/stack/expr/TokenParserTest.java b/group24/798277403/src/basic/stack/expr/TokenParserTest.java new file mode 100644 index 0000000000..9f9feb447e --- /dev/null +++ b/group24/798277403/src/basic/stack/expr/TokenParserTest.java @@ -0,0 +1,41 @@ +package basic.stack.expr; + +import static org.junit.Assert.*; + +import java.util.List; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class TokenParserTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + + TokenParser parser = new TokenParser(); + List tokens = parser.parse("300*20+12*5-20/4"); + + Assert.assertEquals(300, tokens.get(0).getIntValue()); + Assert.assertEquals("*", tokens.get(1).toString()); + Assert.assertEquals(20, tokens.get(2).getIntValue()); + Assert.assertEquals("+", tokens.get(3).toString()); + Assert.assertEquals(12, tokens.get(4).getIntValue()); + Assert.assertEquals("*", tokens.get(5).toString()); + Assert.assertEquals(5, tokens.get(6).getIntValue()); + Assert.assertEquals("-", tokens.get(7).toString()); + Assert.assertEquals(20, tokens.get(8).getIntValue()); + Assert.assertEquals("/", tokens.get(9).toString()); + Assert.assertEquals(4, tokens.get(10).getIntValue()); + } + +} diff --git a/group24/798277403/src/litestruts/struts.xml b/group24/798277403/src/litestruts/struts.xml new file mode 100644 index 0000000000..ba03a9d20d --- /dev/null +++ b/group24/798277403/src/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + diff --git a/group24/798277403/src/mini_jvm/attr/AttributeInfo.java b/group24/798277403/src/mini_jvm/attr/AttributeInfo.java new file mode 100644 index 0000000000..796141c499 --- /dev/null +++ b/group24/798277403/src/mini_jvm/attr/AttributeInfo.java @@ -0,0 +1,22 @@ +package mini_jvm.attr; + +/** + * 属性表 + */ +public abstract class AttributeInfo { + public static final String CODE = "Code"; //Java代码编译成的字节码指令 + public static final String CONST_VALUE = "ConstantValue"; //final关键字定义的常量值 + public static final String EXCEPTIONS = "Exceptions"; //方法抛出的异常 + public static final String LINE_NUM_TABLE = "LineNumberTable"; //Java源码的行号和字节码指令的对应关系 + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; //方法的局部变量描述 + public static final String STACK_MAP_TABLE = "StackMapTable"; //给类型检查验证器使用 + int attrNameIndex; //属性值名称索引 + int attrLen ; //属性值长度 + public AttributeInfo(int attrNameIndex, int attrLen) { + + this.attrNameIndex = attrNameIndex; + this.attrLen = attrLen; + } + + +} diff --git a/group24/798277403/src/mini_jvm/attr/CodeAttr.java b/group24/798277403/src/mini_jvm/attr/CodeAttr.java new file mode 100644 index 0000000000..07df10d251 --- /dev/null +++ b/group24/798277403/src/mini_jvm/attr/CodeAttr.java @@ -0,0 +1,106 @@ +package mini_jvm.attr; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.cmd.ByteCodeCommand; +import mini_jvm.cmd.CommandParser; +import mini_jvm.constant.ConstantPool; +import mini_jvm.loader.ByteCodeIterator; + +public class CodeAttr extends AttributeInfo { + private int maxStack ; //操作数栈的最大深度 + private int maxLocals ; //局部变量表所需要的存储空间 + private int codeLen ; //字节码长度 + private String code; //字节码 + private ByteCodeCommand[] cmds ; //字节码指令 + private LineNumberTable lineNumTable; + private LocalVariableTable localVarTable; + private StackMapTable stackMapTable; + + public String getCode() { + return code; + } + public ByteCodeCommand[] getCmds() { + return cmds; + } + public CodeAttr(int attrNameIndex, int attrLen, int maxStack, int maxLocals, int codeLen,String code ,ByteCodeCommand[] cmds) { + super(attrNameIndex, attrLen); + this.maxStack = maxStack; + this.maxLocals = maxLocals; + this.codeLen = codeLen; + this.code = code; + this.cmds = cmds; + } + + public void setLineNumberTable(LineNumberTable t) { + this.lineNumTable = t; + } + + public void setLocalVariableTable(LocalVariableTable t) { + this.localVarTable = t; + } + + public static CodeAttr parse(ClassFile clzFile, ByteCodeIterator iter){ + int attrNameIndex = iter.nextU2ToInt(); + int attrLen = iter.nextU4ToInt(); + int maxStack = iter.nextU2ToInt(); + int maxLocals = iter.nextU2ToInt(); + int codeLen = iter.nextU4ToInt(); + String code = iter.nextUxToHexString(codeLen); + ByteCodeCommand[] cmds = CommandParser.parse(clzFile,code);//解析字节码指令 + + CodeAttr codeAttr = new CodeAttr(attrNameIndex,attrLen,maxStack,maxStack,codeLen,code,cmds); + int exceptionTableLen = iter.nextU2ToInt(); //异常表长度 + if(exceptionTableLen>0){ + String exTable = iter.nextUxToHexString(exceptionTableLen); + //这里对异常表不做处理 + System.out.println("Encountered exception table , just ignore it :" + exTable); + } + + int subAttrCount = iter.nextU2ToInt(); //Code属性的子属性总数 + for(int x=1; x<=subAttrCount; x++){ + int subAttrIndex = iter.nextU2ToInt(); //子属性的索引 + String subAttrName = clzFile.getConstantPool().getUTF8String(subAttrIndex); //得到子属性的名称 + + //已经向前移动了U2, 现在退回去。 + iter.back(2); + //根据子属性的名称,分别解析 + if(AttributeInfo.LINE_NUM_TABLE.equalsIgnoreCase(subAttrName)){ + LineNumberTable t = LineNumberTable.parse(iter); + codeAttr.setLineNumberTable(t); + } else if(AttributeInfo.LOCAL_VAR_TABLE.equalsIgnoreCase(subAttrName)){ + LocalVariableTable t = LocalVariableTable.parse(iter); + codeAttr.setLocalVariableTable(t); + } else if (AttributeInfo.STACK_MAP_TABLE.equalsIgnoreCase(subAttrName)){ + StackMapTable t = StackMapTable.parse(iter); + codeAttr.setStackMapTable(t); + } else{ + throw new RuntimeException("Need code to process " + subAttrName); + } + } + return codeAttr; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + //buffer.append("Code:").append(code).append("\n"); + for(int i=0;i items = new ArrayList(); + + private static class LineNumberItem{ + int startPC; //字节码行号 + int lineNum; //源码行号 + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLineNum() { + return lineNum; + } + public void setLineNum(int lineNum) { + this.lineNum = lineNum; + } + } + public void addLineNumberItem(LineNumberItem item){ + this.items.add(item); + } + public LineNumberTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + + } + + public static LineNumberTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LineNumberTable table = new LineNumberTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LineNumberItem item = new LineNumberItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLineNum(iter.nextU2ToInt()); + table.addLineNumberItem(item); + } + return table; + } + + public String toString(){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Line Number Table:\n"); + for(LineNumberItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("lineNum:"+item.getLineNum()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + + } + + + +} diff --git a/group24/798277403/src/mini_jvm/attr/LocalVariableItem.java b/group24/798277403/src/mini_jvm/attr/LocalVariableItem.java new file mode 100644 index 0000000000..d8b4385933 --- /dev/null +++ b/group24/798277403/src/mini_jvm/attr/LocalVariableItem.java @@ -0,0 +1,39 @@ +package mini_jvm.attr; + +public class LocalVariableItem { + private int startPC; + private int length; + private int nameIndex; + private int descIndex; + private int index; + public int getStartPC() { + return startPC; + } + public void setStartPC(int startPC) { + this.startPC = startPC; + } + public int getLength() { + return length; + } + public void setLength(int length) { + this.length = length; + } + public int getNameIndex() { + return nameIndex; + } + public void setNameIndex(int nameIndex) { + this.nameIndex = nameIndex; + } + public int getDescIndex() { + return descIndex; + } + public void setDescIndex(int descIndex) { + this.descIndex = descIndex; + } + public int getIndex() { + return index; + } + public void setIndex(int index) { + this.index = index; + } +} diff --git a/group24/798277403/src/mini_jvm/attr/LocalVariableTable.java b/group24/798277403/src/mini_jvm/attr/LocalVariableTable.java new file mode 100644 index 0000000000..dce26065fc --- /dev/null +++ b/group24/798277403/src/mini_jvm/attr/LocalVariableTable.java @@ -0,0 +1,59 @@ +package mini_jvm.attr; + + +import mini_jvm.constant.ConstantPool; +import mini_jvm.loader.ByteCodeIterator; + +import java.util.ArrayList; +import java.util.List; + + + +public class LocalVariableTable extends AttributeInfo{ + + List items = new ArrayList(); + + public LocalVariableTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + private void addLocalVariableItem(LocalVariableItem item) { + this.items.add(item); + } + + public static LocalVariableTable parse(ByteCodeIterator iter){ + + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + + LocalVariableTable table = new LocalVariableTable(index,len); + + int itemLen = iter.nextU2ToInt(); + + for(int i=1; i<=itemLen; i++){ + LocalVariableItem item = new LocalVariableItem(); + item.setStartPC(iter.nextU2ToInt()); + item.setLength(iter.nextU2ToInt()); + item.setNameIndex(iter.nextU2ToInt()); + item.setDescIndex(iter.nextU2ToInt()); + item.setIndex(iter.nextU2ToInt()); + table.addLocalVariableItem(item); + } + return table; + } + + + public String toString(ConstantPool pool){ + StringBuilder buffer = new StringBuilder(); + buffer.append("Local Variable Table:\n"); + for(LocalVariableItem item : items){ + buffer.append("startPC:"+item.getStartPC()).append(","); + buffer.append("name:"+pool.getUTF8String(item.getNameIndex())).append(","); + buffer.append("desc:"+pool.getUTF8String(item.getDescIndex())).append(","); + buffer.append("slotIndex:"+ item.getIndex()).append("\n"); + } + buffer.append("\n"); + return buffer.toString(); + } +} diff --git a/group24/798277403/src/mini_jvm/attr/StackMapTable.java b/group24/798277403/src/mini_jvm/attr/StackMapTable.java new file mode 100644 index 0000000000..65b3b24c82 --- /dev/null +++ b/group24/798277403/src/mini_jvm/attr/StackMapTable.java @@ -0,0 +1,30 @@ +package mini_jvm.attr; + + +import mini_jvm.loader.ByteCodeIterator; + +public class StackMapTable extends AttributeInfo{ + + private String originalCode; + + public StackMapTable(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + public static StackMapTable parse(ByteCodeIterator iter){ + int index = iter.nextU2ToInt(); + int len = iter.nextU4ToInt(); + StackMapTable t = new StackMapTable(index,len); + + //后面的StackMapTable太过复杂, 不再处理, 只把原始的代码读进来保存 + String code = iter.nextUxToHexString(len); + t.setOriginalCode(code); + + return t; + } + + private void setOriginalCode(String code) { + this.originalCode = code; + + } +} diff --git a/group24/798277403/src/mini_jvm/clz/ClassFile.java b/group24/798277403/src/mini_jvm/clz/ClassFile.java index 4cf756c090..c641d1eefb 100644 --- a/group24/798277403/src/mini_jvm/clz/ClassFile.java +++ b/group24/798277403/src/mini_jvm/clz/ClassFile.java @@ -3,14 +3,22 @@ import mini_jvm.constant.ClassInfo; import mini_jvm.constant.ConstantPool; +import mini_jvm.field.Field; +import mini_jvm.method.Method; + +import java.util.ArrayList; +import java.util.List; public class ClassFile { - private int minorVersion; - private int majorVersion; - private AccessFlag accessFlag; - private ClassIndex clzIndex; - private ConstantPool pool; + private int minorVersion; //java次版本号 + private int majorVersion; //java主版本号 + private AccessFlag accessFlag; //访问标志,表示public等或者是接口等,包括类和父类的访问标志 + private ClassIndex clzIndex; //类索引和父类索引,用来确定类的继承关系 + private ConstantPool pool; //常量池,包括常量池总数和所有常量 + private List fields = new ArrayList(); //字段 + private List methods = new ArrayList(); //方法 + public ClassIndex getClzIndex() { return clzIndex; @@ -52,14 +60,47 @@ public void print(){ System.out.println("Class Name:"+ getClassName()); System.out.println("Super Class Name:"+ getSuperClassName()); } - - private String getClassName(){ + + public String getClassName(){ int thisClassIndex = this.clzIndex.getThisClassIndex(); ClassInfo thisClass = (ClassInfo)this.getConstantPool().getConstantInfo(thisClassIndex); return thisClass.getClassName(); } - private String getSuperClassName(){ + public String getSuperClassName(){ ClassInfo superClass = (ClassInfo)this.getConstantPool().getConstantInfo(this.clzIndex.getSuperClassIndex()); return superClass.getClassName(); } + + + public void addField(Field f){ + this.fields.add(f); + } + public List getFields(){ + return this.fields; + } + public void addMethod(Method m){ + this.methods.add(m); + } + public List getMethods() { + return methods; + } + + + //根据方法名和参数获取某个方法 + public Method getMethod(String methodName, String paramAndReturnType){ + for(Method m :methods){ + int nameIndex = m.getNameIndex(); + int descriptionIndex = m.getDescriptorIndex(); + + String name = this.getConstantPool().getUTF8String(nameIndex); + String desc = this.getConstantPool().getUTF8String(descriptionIndex); + if(name.equals(methodName) && desc.equals(paramAndReturnType)){ + return m; + } + } + return null; + } + public Method getMainMethod(){ + return getMethod("main","([Ljava/lang/String;)V"); + } } diff --git a/group24/798277403/src/mini_jvm/cmd/BiPushCmd.java b/group24/798277403/src/mini_jvm/cmd/BiPushCmd.java new file mode 100644 index 0000000000..f07275d3c8 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/BiPushCmd.java @@ -0,0 +1,30 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class BiPushCmd extends OneOperandCmd { + + public BiPushCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return this.getOffset()+": "+ this.getOpCode()+" " + this.getReadableCodeText() + " " + this.getOperand(); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group24/798277403/src/mini_jvm/cmd/ByteCodeCommand.java b/group24/798277403/src/mini_jvm/cmd/ByteCodeCommand.java new file mode 100644 index 0000000000..e9e3401010 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/ByteCodeCommand.java @@ -0,0 +1,153 @@ +package mini_jvm.cmd; + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantInfo; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +import java.util.HashMap; +import java.util.Map; + + + + +public abstract class ByteCodeCommand { + + String opCode; + ClassFile clzFile; + private int offset; + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; //创建一个对象 + public static final String lstore = "37"; + public static final String invokespecial = "B7"; //对一个对象进行初始化, 父类的初始化, 调用私有方法 + public static final String invokevirtual = "B6"; //指令调用对象的实例方法(多态) + public static final String getfield = "B4"; + public static final String putfield = "B5"; //给一个对象的字段赋值 + public static final String getstatic = "B2"; + public static final String ldc = "12"; //从运行时常量池中提取数据压入栈中 + public static final String dup = "59"; //复制操作数栈栈顶的值,并压入到栈顶 + public static final String bipush = "10"; //将 byte 带符号扩展为一个 int 类型的值 value,然后将 value 压入到操作数栈中。 + public static final String aload_0 = "2A"; //从局部变量表中把index为0的reference的值加载到到操作数栈中 + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; //从局部变量表中把index为2的int类型的值加载到到操作数栈中 + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; //方法返回,从当前函数栈帧退出, 返回int + public static final String freturn = "AE"; //方法返回,从当前函数栈帧退出, 返回float + + public static final String astore_1 = "4C"; //将栈顶的reference 类型数据保存到局部变量表中 + + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; //将一个数值从操作数栈存储到局部变量表 + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; //加法指令 + public static final String iinc = "84"; //局部变量自增指令 + private static Map codeMap = new HashMap(); + + static{ + codeMap.put("01", "aconst_null"); + + codeMap.put("BB", "new"); + codeMap.put("37", "lstore"); + codeMap.put("B7", "invokespecial"); + codeMap.put("B6", "invokevirtual"); + codeMap.put("B4", "getfield"); + codeMap.put("B5", "putfield"); + codeMap.put("B2", "getstatic"); + + codeMap.put("2A", "aload_0"); + codeMap.put("2B", "aload_1"); + codeMap.put("2C", "aload_2"); + + codeMap.put("10", "bipush"); + codeMap.put("15", "iload"); + codeMap.put("1A", "iload_0"); + codeMap.put("1B", "iload_1"); + codeMap.put("1C", "iload_2"); + codeMap.put("1D", "iload_3"); + + codeMap.put("25", "fload_3"); + + codeMap.put("1E", "lload_0"); + + codeMap.put("24", "fload_2"); + codeMap.put("4C", "astore_1"); + + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + + codeMap.put("A7", "goto"); + + codeMap.put("B1", "return"); + codeMap.put("AC", "ireturn"); + codeMap.put("AE", "freturn"); + + codeMap.put("03", "iconst_0"); + codeMap.put("04", "iconst_1"); + + codeMap.put("3C", "istore_1"); + codeMap.put("3D", "istore_2"); + + codeMap.put("59", "dup"); + + codeMap.put("60", "iadd"); + codeMap.put("84", "iinc"); + + codeMap.put("12", "ldc"); + } + + + protected ByteCodeCommand(ClassFile clzFile, String opCode){ + this.clzFile = clzFile; + this.opCode = opCode; + } + + protected ClassFile getClassFile() { + return clzFile; + } + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + protected ConstantInfo getConstantInfo(int index){ + return this.getClassFile().getConstantPool().getConstantInfo(index); + } + + protected ConstantPool getConstantPool(){ + return this.getClassFile().getConstantPool(); + } + + + + public String getOpCode() { + return opCode; + } + + public abstract int getLength(); + + public String getReadableCodeText(){ + String txt = codeMap.get(opCode); + if(txt == null){ + return opCode; + } + return txt; + } + public abstract String toString(ConstantPool pool); + + public abstract void execute(StackFrame frame,ExecutionResult result); +} diff --git a/group24/798277403/src/mini_jvm/cmd/CommandParser.java b/group24/798277403/src/mini_jvm/cmd/CommandParser.java new file mode 100644 index 0000000000..af57520f46 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/CommandParser.java @@ -0,0 +1,162 @@ +package mini_jvm.cmd; + +import mini_jvm.clz.ClassFile; + +import java.util.ArrayList; +import java.util.List; + + +public class CommandParser { + + public static final String aconst_null = "01"; + public static final String new_object = "BB"; + public static final String lstore = "37"; + public static final String invokespecial = "B7"; + public static final String invokevirtual = "B6"; + public static final String getfield = "B4"; + public static final String putfield = "B5"; + public static final String getstatic = "B2"; + public static final String ldc = "12"; + public static final String dup = "59"; + public static final String bipush = "10"; + public static final String aload_0 = "2A"; + public static final String aload_1 = "2B"; + public static final String aload_2 = "2C"; + public static final String iload = "15"; + public static final String iload_1 = "1B"; + public static final String iload_2 = "1C"; + public static final String iload_3 = "1D"; + public static final String fload_3 = "25"; + + public static final String voidreturn = "B1"; + public static final String ireturn = "AC"; + public static final String freturn = "AE"; + + public static final String astore_1 = "4C"; + public static final String if_icmp_ge = "A2"; + public static final String if_icmple = "A4"; + public static final String goto_no_condition = "A7"; + public static final String iconst_0 = "03"; + public static final String iconst_1 = "04"; + public static final String istore_1 = "3C"; + public static final String istore_2 = "3D"; + public static final String iadd = "60"; + public static final String iinc = "84"; + + /** + * 将codes字符串解析成字节码指令(指令有多种,操作数个数有1,2,3个) + * @param clzFile classFile引用 + * @param codes 方法字节码 + * @return 字节码指令 + */ + public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { + if ((codes == null) || (codes.length() == 0) || (codes.length() % 2) != 0) { + throw new RuntimeException("the orignal code is not correct"); + } + codes = codes.toUpperCase(); + + CommandIterator iter = new CommandIterator(codes); + List cmds = new ArrayList(); + + while (iter.hasNext()) { + String opCode = iter.next2CharAsString(); + if (ByteCodeCommand.new_object.equals(opCode)) { + NewObjectCmd cmd = new NewObjectCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.invokespecial.equals(opCode)) { + InvokeSpecialCmd cmd = new InvokeSpecialCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.invokevirtual.equals(opCode)) { + InvokeVirtualCmd cmd = new InvokeVirtualCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.getfield.equals(opCode)) { + GetFieldCmd cmd = new GetFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.getstatic.equals(opCode)) { + GetStaticFieldCmd cmd = new GetStaticFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.putfield.equals(opCode)) { + PutFieldCmd cmd = new PutFieldCmd(clzFile, opCode); + cmd.setOprand1(iter.next2CharAsInt()); + cmd.setOprand2(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.ldc.equals(opCode)) { + LdcCmd cmd = new LdcCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.bipush.equals(opCode)) { + BiPushCmd cmd = new BiPushCmd(clzFile, opCode); + cmd.setOperand(iter.next2CharAsInt()); + cmds.add(cmd); + } else if (ByteCodeCommand.dup.equals(opCode) + || ByteCodeCommand.aload_0.equals(opCode) + || ByteCodeCommand.aload_1.equals(opCode) + || ByteCodeCommand.aload_2.equals(opCode) + || ByteCodeCommand.iload_1.equals(opCode) + || ByteCodeCommand.iload_2.equals(opCode) + || ByteCodeCommand.iload_3.equals(opCode) + || ByteCodeCommand.fload_3.equals(opCode) + || ByteCodeCommand.voidreturn.equals(opCode) + || ByteCodeCommand.astore_1.equals(opCode)) { + + NoOperandCmd cmd = new NoOperandCmd(clzFile, opCode); + cmds.add(cmd); + } else { + throw new RuntimeException("Sorry, the java instruction " + opCode + " has not been implemented"); + } + + } + + calcuateOffset(cmds); + + ByteCodeCommand[] result = new ByteCodeCommand[cmds.size()]; + cmds.toArray(result); + return result; + } + + private static void calcuateOffset(List cmds) { + + int offset = 0; + for (ByteCodeCommand cmd : cmds) { + cmd.setOffset(offset); + offset += cmd.getLength(); + } + + } + + //每一个指令都是占两个字节,有的指令是对应常量池中的索引所以是int,有的是字符串 + private static class CommandIterator { + String codes = null; + int pos = 0; + + CommandIterator(String codes) { + this.codes = codes; + } + + public boolean hasNext() { + return pos < this.codes.length(); + } + + public String next2CharAsString() { + String result = codes.substring(pos, pos + 2); + pos += 2; + return result; + } + + public int next2CharAsInt() { + String s = this.next2CharAsString(); + return Integer.valueOf(s, 16).intValue(); + } + + } +} diff --git a/group24/798277403/src/mini_jvm/cmd/GetFieldCmd.java b/group24/798277403/src/mini_jvm/cmd/GetFieldCmd.java new file mode 100644 index 0000000000..743f892573 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/GetFieldCmd.java @@ -0,0 +1,29 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class GetFieldCmd extends TwoOperandCmd { + + public GetFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + + +} diff --git a/group24/798277403/src/mini_jvm/cmd/GetStaticFieldCmd.java b/group24/798277403/src/mini_jvm/cmd/GetStaticFieldCmd.java new file mode 100644 index 0000000000..80c407441c --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/GetStaticFieldCmd.java @@ -0,0 +1,28 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class GetStaticFieldCmd extends TwoOperandCmd { + + public GetStaticFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/798277403/src/mini_jvm/cmd/InvokeSpecialCmd.java b/group24/798277403/src/mini_jvm/cmd/InvokeSpecialCmd.java new file mode 100644 index 0000000000..ea9e33785d --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/InvokeSpecialCmd.java @@ -0,0 +1,30 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class InvokeSpecialCmd extends TwoOperandCmd { + + public InvokeSpecialCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + + +} diff --git a/group24/798277403/src/mini_jvm/cmd/InvokeVirtualCmd.java b/group24/798277403/src/mini_jvm/cmd/InvokeVirtualCmd.java new file mode 100644 index 0000000000..5057132d8e --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/InvokeVirtualCmd.java @@ -0,0 +1,29 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class InvokeVirtualCmd extends TwoOperandCmd { + + public InvokeVirtualCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsMethod(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + } + + + + +} diff --git a/group24/798277403/src/mini_jvm/cmd/LdcCmd.java b/group24/798277403/src/mini_jvm/cmd/LdcCmd.java new file mode 100644 index 0000000000..25a0ea5753 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/LdcCmd.java @@ -0,0 +1,38 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantInfo; +import mini_jvm.constant.ConstantPool; +import mini_jvm.constant.StringInfo; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class LdcCmd extends OneOperandCmd { + + public LdcCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + String value = "TBD"; + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + value = strInfo.toString(); + } + + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; + + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/798277403/src/mini_jvm/cmd/NewObjectCmd.java b/group24/798277403/src/mini_jvm/cmd/NewObjectCmd.java new file mode 100644 index 0000000000..56afe06698 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/NewObjectCmd.java @@ -0,0 +1,28 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class NewObjectCmd extends TwoOperandCmd{ + + public NewObjectCmd(ClassFile clzFile, String opCode){ + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsClassInfo(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group24/798277403/src/mini_jvm/cmd/NoOperandCmd.java b/group24/798277403/src/mini_jvm/cmd/NoOperandCmd.java new file mode 100644 index 0000000000..0a2f285b12 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/NoOperandCmd.java @@ -0,0 +1,33 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class NoOperandCmd extends ByteCodeCommand{ + + public NoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + @Override + public String toString(ConstantPool pool) { + return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); + } + + + + public int getLength(){ + return 1; + } + + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + +} diff --git a/group24/798277403/src/mini_jvm/cmd/OneOperandCmd.java b/group24/798277403/src/mini_jvm/cmd/OneOperandCmd.java new file mode 100644 index 0000000000..65ef9fe5e3 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/OneOperandCmd.java @@ -0,0 +1,30 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; + +public abstract class OneOperandCmd extends ByteCodeCommand { + + private int operand; + + public OneOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + public int getOperand() { + + return this.operand; + } + + public void setOperand(int oprand1) { + this.operand = oprand1; + + } + public int getLength(){ + return 2; + } + + + public abstract String toString(ConstantPool pool); +} diff --git a/group24/798277403/src/mini_jvm/cmd/PutFieldCmd.java b/group24/798277403/src/mini_jvm/cmd/PutFieldCmd.java new file mode 100644 index 0000000000..9e2d80a3c9 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/PutFieldCmd.java @@ -0,0 +1,28 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.ConstantPool; +import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.StackFrame; + +public class PutFieldCmd extends TwoOperandCmd { + + public PutFieldCmd(ClassFile clzFile, String opCode) { + super(clzFile,opCode); + } + + @Override + public String toString(ConstantPool pool) { + + return super.getOperandAsField(pool); + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + + } + + +} diff --git a/group24/798277403/src/mini_jvm/cmd/TwoOperandCmd.java b/group24/798277403/src/mini_jvm/cmd/TwoOperandCmd.java new file mode 100644 index 0000000000..7ec4f5ee38 --- /dev/null +++ b/group24/798277403/src/mini_jvm/cmd/TwoOperandCmd.java @@ -0,0 +1,67 @@ +package mini_jvm.cmd; + + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.*; + +public abstract class TwoOperandCmd extends ByteCodeCommand{ + + int oprand1 = -1; + int oprand2 = -1; + + public int getOprand1() { + return oprand1; + } + + public void setOprand1(int oprand1) { + this.oprand1 = oprand1; + } + + public void setOprand2(int oprand2) { + this.oprand2 = oprand2; + } + + public int getOprand2() { + return oprand2; + } + + public TwoOperandCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + } + + public int getIndex(){ + int oprand1 = this.getOprand1(); + int oprand2 = this.getOprand2(); + int index = oprand1 << 8 | oprand2; + return index; + } + + protected String getOperandAsClassInfo(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); + } + + protected String getOperandAsMethod(ConstantPool pool){ + int index = getIndex(); + String codeTxt = getReadableCodeText(); + ConstantInfo constInfo = this.getConstantInfo(index); + MethodRefInfo info = (MethodRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + + protected String getOperandAsField(ConstantPool pool){ + int index = getIndex(); + + String codeTxt = getReadableCodeText(); + FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); + return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); + } + public int getLength(){ + return 3; + } + + public abstract String toString(ConstantPool pool); + +} diff --git a/group24/798277403/src/mini_jvm/constant/ClassInfo.java b/group24/798277403/src/mini_jvm/constant/ClassInfo.java index ed39387440..0dfb4f790f 100644 --- a/group24/798277403/src/mini_jvm/constant/ClassInfo.java +++ b/group24/798277403/src/mini_jvm/constant/ClassInfo.java @@ -21,4 +21,9 @@ public String getClassName() { UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); return utf8Info.getValue(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitClassInfo(this); + } } diff --git a/group24/798277403/src/mini_jvm/constant/ConstantInfo.java b/group24/798277403/src/mini_jvm/constant/ConstantInfo.java index d488321043..a54e152573 100644 --- a/group24/798277403/src/mini_jvm/constant/ConstantInfo.java +++ b/group24/798277403/src/mini_jvm/constant/ConstantInfo.java @@ -25,5 +25,17 @@ public ConstantPool getConstantPool() { public ConstantInfo getConstantInfo(int index){ return this.constantPool.getConstantInfo(index); } - + + + public abstract void accept(Visitor visitor); + + public static interface Visitor{ + public void visitClassInfo(ClassInfo info); + public void visitFieldRef(FieldRefInfo info); + public void visitMethodRef(MethodRefInfo info); + public void visitNameAndType(NameAndTypeInfo info); + public void visitString(StringInfo info); + public void visistUTF8(UTF8Info info); + + } } diff --git a/group24/798277403/src/mini_jvm/constant/ConstantPool.java b/group24/798277403/src/mini_jvm/constant/ConstantPool.java index c8d30c78db..0ed02dc4ac 100644 --- a/group24/798277403/src/mini_jvm/constant/ConstantPool.java +++ b/group24/798277403/src/mini_jvm/constant/ConstantPool.java @@ -21,7 +21,7 @@ public ConstantInfo getConstantInfo(int index){ public String getUTF8String(int index){ return ((UTF8Info)this.constantInfos.get(index)).getValue(); } - public Object getSize() { + public int getSize() { return this.constantInfos.size() -1; } } diff --git a/group24/798277403/src/mini_jvm/constant/FieldRefInfo.java b/group24/798277403/src/mini_jvm/constant/FieldRefInfo.java index 3d74c4244f..a1408735a8 100644 --- a/group24/798277403/src/mini_jvm/constant/FieldRefInfo.java +++ b/group24/798277403/src/mini_jvm/constant/FieldRefInfo.java @@ -51,4 +51,9 @@ public String getFieldType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)this.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } + + @Override + public void accept(Visitor visitor) { + visitor.visitFieldRef(this); + } } diff --git a/group24/798277403/src/mini_jvm/constant/MethodRefInfo.java b/group24/798277403/src/mini_jvm/constant/MethodRefInfo.java index 4037881ad8..072378f568 100644 --- a/group24/798277403/src/mini_jvm/constant/MethodRefInfo.java +++ b/group24/798277403/src/mini_jvm/constant/MethodRefInfo.java @@ -49,7 +49,10 @@ public String getParamAndReturnType(){ NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - - + + @Override + public void accept(Visitor visitor) { + visitor.visitMethodRef(this); + } } diff --git a/group24/798277403/src/mini_jvm/constant/NameAndTypeInfo.java b/group24/798277403/src/mini_jvm/constant/NameAndTypeInfo.java index badba119df..deeef73aa5 100644 --- a/group24/798277403/src/mini_jvm/constant/NameAndTypeInfo.java +++ b/group24/798277403/src/mini_jvm/constant/NameAndTypeInfo.java @@ -42,4 +42,9 @@ public String getTypeInfo(){ public String toString(){ return "(" + getName() + "," + getTypeInfo()+")"; } + + @Override + public void accept(Visitor visitor) { + visitor.visitNameAndType(this); + } } diff --git a/group24/798277403/src/mini_jvm/constant/NullConstantInfo.java b/group24/798277403/src/mini_jvm/constant/NullConstantInfo.java index 28d102c997..eaed795011 100644 --- a/group24/798277403/src/mini_jvm/constant/NullConstantInfo.java +++ b/group24/798277403/src/mini_jvm/constant/NullConstantInfo.java @@ -9,5 +9,11 @@ public NullConstantInfo(){ public int getType() { return -1; } - + + @Override + public void accept(Visitor visitor) { + + } + + } diff --git a/group24/798277403/src/mini_jvm/constant/StringInfo.java b/group24/798277403/src/mini_jvm/constant/StringInfo.java index 2a9387d247..5736eef352 100644 --- a/group24/798277403/src/mini_jvm/constant/StringInfo.java +++ b/group24/798277403/src/mini_jvm/constant/StringInfo.java @@ -10,7 +10,12 @@ public StringInfo(ConstantPool pool) { public int getType() { return type; } - + + @Override + public void accept(Visitor visitor) { + visitor.visitString(this); + } + public int getIndex() { return index; } diff --git a/group24/798277403/src/mini_jvm/constant/UTF8Info.java b/group24/798277403/src/mini_jvm/constant/UTF8Info.java index 6fc44f5355..0ad0e7ff7b 100644 --- a/group24/798277403/src/mini_jvm/constant/UTF8Info.java +++ b/group24/798277403/src/mini_jvm/constant/UTF8Info.java @@ -16,6 +16,12 @@ public void setLength(int length) { public int getType() { return type; } + + @Override + public void accept(Visitor visitor) { + visitor.visistUTF8(this); + } + @Override public String toString() { return "UTF8Info [type=" + type + ", length=" + length + ", value=" + value +")]"; diff --git a/group24/798277403/src/mini_jvm/engine/ExecutionResult.java b/group24/798277403/src/mini_jvm/engine/ExecutionResult.java new file mode 100644 index 0000000000..58c9d26dca --- /dev/null +++ b/group24/798277403/src/mini_jvm/engine/ExecutionResult.java @@ -0,0 +1,57 @@ +package mini_jvm.engine; + + +import mini_jvm.method.Method; + +public class ExecutionResult { + public static final int RUN_NEXT_CMD = 1; + public static final int JUMP = 2; + public static final int EXIT_CURRENT_FRAME = 3; + public static final int PAUSE_AND_RUN_NEW_FRAME = 4; + + private int nextAction = RUN_NEXT_CMD; + + private int nextCmdOffset = 0; + + private Method nextMethod; + + public Method getNextMethod() { + return nextMethod; + } + public void setNextMethod(Method nextMethod) { + this.nextMethod = nextMethod; + } + + + + public void setNextAction(int action){ + this.nextAction = action; + } + public boolean isPauseAndRunNewFrame(){ + return this.nextAction == PAUSE_AND_RUN_NEW_FRAME; + } + public boolean isExitCurrentFrame(){ + return this.nextAction == EXIT_CURRENT_FRAME; + } + + public boolean isRunNextCmd(){ + return this.nextAction == RUN_NEXT_CMD; + } + + public boolean isJump(){ + return this.nextAction == JUMP; + } + + public int getNextCmdOffset() { + return nextCmdOffset; + } + + public void setNextCmdOffset(int nextCmdOffset) { + this.nextCmdOffset = nextCmdOffset; + } + + + + + +} diff --git a/group24/798277403/src/mini_jvm/engine/ExecutorEngine.java b/group24/798277403/src/mini_jvm/engine/ExecutorEngine.java new file mode 100644 index 0000000000..260211376c --- /dev/null +++ b/group24/798277403/src/mini_jvm/engine/ExecutorEngine.java @@ -0,0 +1,31 @@ +package mini_jvm.engine; + +import mini_jvm.method.Method; + +import java.util.Stack; + + + +public class ExecutorEngine { + + private Stack stack = new Stack(); + + public ExecutorEngine() { + + } + + public void execute(Method mainMethod){ + + + + } + + + + private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { + + + + } + +} diff --git a/group24/798277403/src/mini_jvm/engine/Heap.java b/group24/798277403/src/mini_jvm/engine/Heap.java new file mode 100644 index 0000000000..4a197b98f6 --- /dev/null +++ b/group24/798277403/src/mini_jvm/engine/Heap.java @@ -0,0 +1,39 @@ +package mini_jvm.engine; + +public class Heap { + + /** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + */ + + private static Heap instance = new Heap(); + private Heap() { + } + public static Heap getInstance(){ + return instance; + } + public JavaObject newObject(String clzName){ + + JavaObject jo = new JavaObject(JavaObject.OBJECT); + jo.setClassName(clzName); + return jo; + } + + public JavaObject newString(String value){ + JavaObject jo = new JavaObject(JavaObject.STRING); + jo.setStringValue(value); + return jo; + } + + public JavaObject newFloat(float value){ + JavaObject jo = new JavaObject(JavaObject.FLOAT); + jo.setFloatValue(value); + return jo; + } + public JavaObject newInt(int value){ + JavaObject jo = new JavaObject(JavaObject.INT); + jo.setIntValue(value); + return jo; + } + +} diff --git a/group24/798277403/src/mini_jvm/engine/JavaObject.java b/group24/798277403/src/mini_jvm/engine/JavaObject.java new file mode 100644 index 0000000000..51185b1056 --- /dev/null +++ b/group24/798277403/src/mini_jvm/engine/JavaObject.java @@ -0,0 +1,71 @@ +package mini_jvm.engine; + +import java.util.HashMap; +import java.util.Map; + +public class JavaObject { + public static final int OBJECT = 1; + public static final int STRING = 2; + public static final int INT = 3; + public static final int FLOAT = 4; + + int type; + private String className; + + private Map fieldValues = new HashMap(); + + private String stringValue; + + private int intValue; + + private float floatValue; + + public void setFieldValue(String fieldName, JavaObject fieldValue){ + fieldValues.put(fieldName, fieldValue); + } + public JavaObject(int type){ + this.type = type; + } + public void setClassName(String className){ + this.className = className; + } + public void setStringValue(String value){ + stringValue = value; + } + public String getStringValue(){ + return this.stringValue; + } + public void setIntValue(int value) { + this.intValue = value; + } + public int getIntValue(){ + return this.intValue; + } + public int getType(){ + return type; + } + public JavaObject getFieldValue(String fieldName){ + return this.fieldValues.get(fieldName); + } + public String toString(){ + switch(this.getType()){ + case INT: + return String.valueOf(this.intValue); + case STRING: + return this.stringValue; + case OBJECT: + return this.className +":"+ this.fieldValues; + case FLOAT : + return String.valueOf(this.floatValue); + default: + return null; + } + } + public String getClassName(){ + return this.className; + } + public void setFloatValue(float value) { + this.floatValue = value; + } + +} diff --git a/group24/798277403/src/mini_jvm/engine/MethodArea.java b/group24/798277403/src/mini_jvm/engine/MethodArea.java new file mode 100644 index 0000000000..fd43904312 --- /dev/null +++ b/group24/798277403/src/mini_jvm/engine/MethodArea.java @@ -0,0 +1,69 @@ +package mini_jvm.engine; + +import mini_jvm.clz.ClassFile; +import mini_jvm.constant.MethodRefInfo; +import mini_jvm.loader.ClassFileLoader; +import mini_jvm.method.Method; + +import java.util.HashMap; +import java.util.Map; + + +public class MethodArea { + + public static final MethodArea instance = new MethodArea(); + + /** + * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + */ + + private ClassFileLoader clzLoader = null; + + Map map = new HashMap(); + + private MethodArea(){ + } + + public static MethodArea getInstance(){ + return instance; + } + + public void setClassFileLoader(ClassFileLoader clzLoader){ + this.clzLoader = clzLoader; + } + + public Method getMainMethod(String className){ + + ClassFile clzFile = this.findClassFile(className); + + return clzFile.getMainMethod(); + } + + + public ClassFile findClassFile(String className){ + + if(map.get(className) != null){ + return map.get(className); + } + // 看来该class 文件还没有load过 + ClassFile clzFile = this.clzLoader.loadClass(className); + + map.put(className, clzFile); + + return clzFile; + + } + + + public Method getMethod(String className, String methodName, String paramAndReturnType){ + + return null; + } + + + public Method getMethod(MethodRefInfo methodRef){ + + return null; + + } +} diff --git a/group24/798277403/src/mini_jvm/engine/MiniJVM.java b/group24/798277403/src/mini_jvm/engine/MiniJVM.java new file mode 100644 index 0000000000..6781fed5ad --- /dev/null +++ b/group24/798277403/src/mini_jvm/engine/MiniJVM.java @@ -0,0 +1,30 @@ +package mini_jvm.engine; + +import mini_jvm.loader.ClassFileLoader; + +import java.io.FileNotFoundException; +import java.io.IOException; + + + +public class MiniJVM { + + public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ + + ClassFileLoader loader = new ClassFileLoader(); + for(int i=0;i localVariableTable = new ArrayList(); + private Stack oprandStack = new Stack(); + + int index = 0; + + private Method m = null; + + private StackFrame callerFrame = null; + + public StackFrame getCallerFrame() { + return callerFrame; + } + + public void setCallerFrame(StackFrame callerFrame) { + this.callerFrame = callerFrame; + } + + + + + public static StackFrame create(Method m){ + + StackFrame frame = new StackFrame( m ); + + return frame; + } + + + private StackFrame(Method m) { + this.m = m; + + } + + + + public JavaObject getLocalVariableValue(int index){ + return this.localVariableTable.get(index); + } + + public Stack getOprandStack(){ + return this.oprandStack; + } + + public int getNextCommandIndex(int offset){ + + ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); + for(int i=0;i values){ + this.localVariableTable = values; + } + + public void setLocalVariableValue(int index, JavaObject jo){ + //问题: 为什么要这么做?? + if(this.localVariableTable.size()-1 < index){ + for(int i=this.localVariableTable.size(); i<=index; i++){ + this.localVariableTable.add(null); + } + } + this.localVariableTable.set(index, jo); + + + } + + public Method getMethod(){ + return m; + } + + +} diff --git a/group24/798277403/src/mini_jvm/field/Field.java b/group24/798277403/src/mini_jvm/field/Field.java new file mode 100644 index 0000000000..1c12093269 --- /dev/null +++ b/group24/798277403/src/mini_jvm/field/Field.java @@ -0,0 +1,48 @@ +package mini_jvm.field; + + +import mini_jvm.constant.ConstantPool; +import mini_jvm.constant.UTF8Info; +import mini_jvm.loader.ByteCodeIterator; + +public class Field { + private int accessFlag; //字段的修饰符,u2类型 + private int nameIndex; //一个索引,对常量池的引用,代表字段的简单名称 + private int descriptorIndex; //一个索引,对常量池的引用,代表字段的描述符 + + private ConstantPool pool; + + public Field( int accessFlag, int nameIndex, int descriptorIndex,ConstantPool pool) { + + this.accessFlag = accessFlag; + this.nameIndex = nameIndex; + this.descriptorIndex = descriptorIndex; + this.pool = pool; + } + + public String toString() { + String name = ((UTF8Info)pool.getConstantInfo(this.nameIndex)).getValue(); + + String desc = ((UTF8Info)pool.getConstantInfo(this.descriptorIndex)).getValue(); + return name +":"+ desc; + } + + + public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + + int accessFlag = iter.nextU2ToInt(); + int nameIndex = iter.nextU2ToInt(); + int descIndex = iter.nextU2ToInt(); + int attribCount = iter.nextU2ToInt(); + //System.out.println("field attribute count:"+ attribCount); + + Field f = new Field(accessFlag, nameIndex, descIndex,pool); + + if(attribCount > 0){ + throw new RuntimeException("Field Attribute has not been implemented"); + } + + return f; + } + +} diff --git a/group24/798277403/src/mini_jvm/loader/ClassFileParser.java b/group24/798277403/src/mini_jvm/loader/ClassFileParser.java index ad2ca0cdf4..fad2e9583e 100644 --- a/group24/798277403/src/mini_jvm/loader/ClassFileParser.java +++ b/group24/798277403/src/mini_jvm/loader/ClassFileParser.java @@ -4,6 +4,8 @@ import mini_jvm.clz.ClassFile; import mini_jvm.clz.ClassIndex; import mini_jvm.constant.*; +import mini_jvm.field.Field; +import mini_jvm.method.Method; import java.io.UnsupportedEncodingException; @@ -35,6 +37,15 @@ public ClassFile parse(byte[] codes) { ClassIndex classIndex = parseClassInfex(iter); classFile.setClassIndex(classIndex); + //6 解析接口 + parseInterfaces(iter); + + //7 解析字段 + parseFileds(classFile, iter); + + //8 解析方法 + parseMethods(classFile, iter); + return classFile; } @@ -126,5 +137,29 @@ private ConstantPool parseConstantPool(ByteCodeIterator iter) { return constantPool; } + private void parseInterfaces(ByteCodeIterator iter) { + int interfaceCount = iter.nextU2ToInt(); + + System.out.println("interfaceCount:" + interfaceCount); + + // TODO : 如果实现了interface, 这里需要解析 + } + + private void parseFileds(ClassFile clzFile, ByteCodeIterator iter) { + int filedCount = iter.nextU2ToInt(); + for(int i=0; i fields = clzFile.getFields(); + Assert.assertEquals(2, fields.size()); + { + Field f = fields.get(0); + Assert.assertEquals("name:Ljava/lang/String;", f.toString()); + } + { + Field f = fields.get(1); + Assert.assertEquals("age:I", f.toString()); + } + } + @Test + public void testMethods(){ + + List methods = clzFile.getMethods(); + ConstantPool pool = clzFile.getConstantPool(); + + { + Method m = methods.get(0); + assertMethodEquals(pool,m, + "", + "(Ljava/lang/String;I)V", + "2ab7000c2a2bb5000f2a1cb50011b1"); + + } + { + Method m = methods.get(1); + assertMethodEquals(pool,m, + "setName", + "(Ljava/lang/String;)V", + "2a2bb5000fb1"); + + } + { + Method m = methods.get(2); + assertMethodEquals(pool,m, + "setAge", + "(I)V", + "2a1bb50011b1"); + } + { + Method m = methods.get(3); + assertMethodEquals(pool,m, + "sayHello", + "()V", + "b2001c1222b60024b1"); + + } + { + Method m = methods.get(4); + assertMethodEquals(pool,m, + "main", + "([Ljava/lang/String;)V", + "bb000159122b101db7002d4c2bb6002fb1"); + } + } + + private void assertMethodEquals(ConstantPool pool,Method m , String expectedName, String expectedDesc,String expectedCode){ + String methodName = pool.getUTF8String(m.getNameIndex()); + String methodDesc = pool.getUTF8String(m.getDescriptorIndex()); + String code = m.getCodeAttr().getCode(); + Assert.assertEquals(expectedName, methodName); + Assert.assertEquals(expectedDesc, methodDesc); + Assert.assertEquals(expectedCode, code); + } + + /** -----------------------下面是第五次jvm的测试------------------------ **/ + @Test + public void testByteCodeCommand(){ + { + Method initMethod = this.clzFile.getMethod("", "(Ljava/lang/String;I)V"); + ByteCodeCommand [] cmds = initMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: invokespecial #12", cmds[1]); + assertOpCodeEquals("4: aload_0", cmds[2]); + assertOpCodeEquals("5: aload_1", cmds[3]); + assertOpCodeEquals("6: putfield #15", cmds[4]); + assertOpCodeEquals("9: aload_0", cmds[5]); + assertOpCodeEquals("10: iload_2", cmds[6]); + assertOpCodeEquals("11: putfield #17", cmds[7]); + assertOpCodeEquals("14: return", cmds[8]); + } + + { + Method setNameMethod = this.clzFile.getMethod("setName", "(Ljava/lang/String;)V"); + ByteCodeCommand [] cmds = setNameMethod.getCmds(); + + assertOpCodeEquals("0: aload_0", cmds[0]); + assertOpCodeEquals("1: aload_1", cmds[1]); + assertOpCodeEquals("2: putfield #15", cmds[2]); + assertOpCodeEquals("5: return", cmds[3]); + + } + + { + Method sayHelloMethod = this.clzFile.getMethod("sayHello", "()V"); + ByteCodeCommand [] cmds = sayHelloMethod.getCmds(); + + assertOpCodeEquals("0: getstatic #28", cmds[0]); + assertOpCodeEquals("3: ldc #34", cmds[1]); + assertOpCodeEquals("5: invokevirtual #36", cmds[2]); + assertOpCodeEquals("8: return", cmds[3]); + + } + + { + Method mainMethod = this.clzFile.getMainMethod(); + + ByteCodeCommand [] cmds = mainMethod.getCmds(); + + assertOpCodeEquals("0: new #1", cmds[0]); + assertOpCodeEquals("3: dup", cmds[1]); + assertOpCodeEquals("4: ldc #43", cmds[2]); + assertOpCodeEquals("6: bipush 29", cmds[3]); + assertOpCodeEquals("8: invokespecial #45", cmds[4]); + assertOpCodeEquals("11: astore_1", cmds[5]); + assertOpCodeEquals("12: aload_1", cmds[6]); + assertOpCodeEquals("13: invokevirtual #47", cmds[7]); + assertOpCodeEquals("16: return", cmds[8]); + } + + } + + private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ + + String acctual = cmd.getOffset()+": "+cmd.getReadableCodeText(); + + if(cmd instanceof OneOperandCmd){ + if(cmd instanceof BiPushCmd){ + acctual += " " + ((OneOperandCmd)cmd).getOperand(); + } else{ + acctual += " #" + ((OneOperandCmd)cmd).getOperand(); + } + } + if(cmd instanceof TwoOperandCmd){ + acctual += " #" + ((TwoOperandCmd)cmd).getIndex(); + } + Assert.assertEquals(expected, acctual); + } + } From 457e0567c06deded14d510f237f4448f4b840dd0 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Sun, 14 May 2017 12:44:39 +0800 Subject: [PATCH 516/552] add missing files --- .../answer/src/com/coderising/litestruts/struts.xml | 11 +++++++++++ liuxin/data-structure/assignment/.gitignore | 1 + .../src/com/coderising/litestruts/struts.xml | 11 +++++++++++ 3 files changed, 23 insertions(+) create mode 100644 liuxin/data-structure/answer/src/com/coderising/litestruts/struts.xml create mode 100644 liuxin/data-structure/assignment/.gitignore create mode 100644 liuxin/data-structure/assignment/src/com/coderising/litestruts/struts.xml diff --git a/liuxin/data-structure/answer/src/com/coderising/litestruts/struts.xml b/liuxin/data-structure/answer/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..4c6eeabbd4 --- /dev/null +++ b/liuxin/data-structure/answer/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file diff --git a/liuxin/data-structure/assignment/.gitignore b/liuxin/data-structure/assignment/.gitignore new file mode 100644 index 0000000000..3e2fcc7171 --- /dev/null +++ b/liuxin/data-structure/assignment/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/liuxin/data-structure/assignment/src/com/coderising/litestruts/struts.xml b/liuxin/data-structure/assignment/src/com/coderising/litestruts/struts.xml new file mode 100644 index 0000000000..4c6eeabbd4 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coderising/litestruts/struts.xml @@ -0,0 +1,11 @@ + + + + /jsp/homepage.jsp + /jsp/showLogin.jsp + + + /jsp/welcome.jsp + /jsp/error.jsp + + \ No newline at end of file From d1548fb823b0fa07e188c6d329fec83efa9de031 Mon Sep 17 00:00:00 2001 From: liangduoduo666666 <798277403@qq.com> Date: Sun, 14 May 2017 21:46:44 +0800 Subject: [PATCH 517/552] =?UTF-8?q?zl=E7=9A=84=E5=85=AB=E4=B9=9D=E5=91=A8?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E8=A1=A5=E4=BA=A4=EF=BC=8C=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?jvm=E6=89=A7=E8=A1=8C=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/basic/queue/CircleQueue.java | 61 ++++++++ .../src/basic/queue/CircleQueueTest.java | 45 ++++++ .../798277403/src/basic/queue/Josephus.java | 35 +++++ .../src/basic/queue/JosephusTest.java | 27 ++++ group24/798277403/src/basic/queue/Queue.java | 61 ++++++++ .../src/basic/queue/QueueWithTwoStacks.java | 49 +++++++ .../src/basic/stack/QuickMinStack.java | 36 +++++ .../src/basic/stack/QuickMinStackTest.java | 39 +++++ .../src/basic/stack/StackWithTwoQueues.java | 41 ++++++ .../basic/stack/StackWithTwoQueuesTest.java | 36 +++++ .../src/basic/stack/TwoStackInOneArray.java | 116 +++++++++++++++ .../basic/stack/TwoStackInOneArrayTest.java | 65 +++++++++ .../798277403/src/mini_jvm/attr/CodeAttr.java | 2 +- .../798277403/src/mini_jvm/cmd/BiPushCmd.java | 18 ++- .../src/mini_jvm/cmd/ByteCodeCommand.java | 3 +- .../src/mini_jvm/cmd/GetFieldCmd.java | 18 ++- .../src/mini_jvm/cmd/GetStaticFieldCmd.java | 23 ++- .../src/mini_jvm/cmd/InvokeSpecialCmd.java | 23 ++- .../src/mini_jvm/cmd/InvokeVirtualCmd.java | 56 +++++++- .../798277403/src/mini_jvm/cmd/LdcCmd.java | 30 ++-- .../src/mini_jvm/cmd/NewObjectCmd.java | 20 ++- .../src/mini_jvm/cmd/NoOperandCmd.java | 136 ++++++++++++++++-- .../src/mini_jvm/cmd/OneOperandCmd.java | 3 - .../src/mini_jvm/cmd/PutFieldCmd.java | 26 +++- .../src/mini_jvm/cmd/TwoOperandCmd.java | 24 ++-- .../src/mini_jvm/constant/MethodRefInfo.java | 3 + .../src/mini_jvm/engine/ExecutorEngine.java | 59 +++++++- .../src/mini_jvm/engine/MethodArea.java | 30 ++-- .../src/mini_jvm/engine/MiniJVM.java | 10 +- .../src/mini_jvm/engine/StackFrame.java | 49 ++++++- .../src/mini_jvm/loader/ClassFileParser.java | 10 +- .../798277403/src/mini_jvm/method/Method.java | 61 ++++++++ .../mini_jvm/test/ClassFileloaderTest.java | 12 +- .../src/mini_jvm/test/MiniJVMTest.java | 28 ++++ 34 files changed, 1151 insertions(+), 104 deletions(-) create mode 100644 group24/798277403/src/basic/queue/CircleQueue.java create mode 100644 group24/798277403/src/basic/queue/CircleQueueTest.java create mode 100644 group24/798277403/src/basic/queue/Josephus.java create mode 100644 group24/798277403/src/basic/queue/JosephusTest.java create mode 100644 group24/798277403/src/basic/queue/Queue.java create mode 100644 group24/798277403/src/basic/queue/QueueWithTwoStacks.java create mode 100644 group24/798277403/src/basic/stack/QuickMinStack.java create mode 100644 group24/798277403/src/basic/stack/QuickMinStackTest.java create mode 100644 group24/798277403/src/basic/stack/StackWithTwoQueues.java create mode 100644 group24/798277403/src/basic/stack/StackWithTwoQueuesTest.java create mode 100644 group24/798277403/src/basic/stack/TwoStackInOneArray.java create mode 100644 group24/798277403/src/basic/stack/TwoStackInOneArrayTest.java create mode 100644 group24/798277403/src/mini_jvm/test/MiniJVMTest.java diff --git a/group24/798277403/src/basic/queue/CircleQueue.java b/group24/798277403/src/basic/queue/CircleQueue.java new file mode 100644 index 0000000000..179b75d201 --- /dev/null +++ b/group24/798277403/src/basic/queue/CircleQueue.java @@ -0,0 +1,61 @@ +package basic.queue; + +/** + * 用数组实现循环队列 + * @author liuxin + * @param + */ +public class CircleQueue { + + private final static int DEFAULT_SIZE = 10; + + private int size = 0; + + //用数组来保存循环队列的元素 + private Object[] elementData; + + //队头 + private int front = 0; + //队尾 + private int rear = 0; + + public CircleQueue(){ + elementData = new Object[DEFAULT_SIZE] ; + } + + public CircleQueue(int size){ + elementData = new Object[size]; + } + + public boolean isEmpty() { + return size==0; + } + + public int size() { + return size; + } + + public boolean isFull(){ + return size == elementData.length; + } + + public void enQueue(E data) { + if(isFull()){ + throw new RuntimeException("The queue is full"); + } + elementData[rear] = data; + rear = (rear+1)%elementData.length; + size++; + } + + public E deQueue() { + if(isEmpty()){ + throw new RuntimeException("The queue is empty"); + } + E data = (E)elementData[front]; + elementData[front] = null; + front = (front+1) % elementData.length; + size--; + return data; + } +} diff --git a/group24/798277403/src/basic/queue/CircleQueueTest.java b/group24/798277403/src/basic/queue/CircleQueueTest.java new file mode 100644 index 0000000000..d0181ecaf7 --- /dev/null +++ b/group24/798277403/src/basic/queue/CircleQueueTest.java @@ -0,0 +1,45 @@ +package basic.queue; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class CircleQueueTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + CircleQueue queue = new CircleQueue(5); + Assert.assertTrue(queue.isEmpty()); + Assert.assertFalse(queue.isFull()); + + queue.enQueue("a"); + queue.enQueue("b"); + queue.enQueue("c"); + queue.enQueue("d"); + queue.enQueue("e"); + + Assert.assertTrue(queue.isFull()); + Assert.assertFalse(queue.isEmpty()); + Assert.assertEquals(5, queue.size()); + + Assert.assertEquals("a", queue.deQueue()); + queue.enQueue("f"); + Assert.assertEquals("b", queue.deQueue()); + Assert.assertEquals("c", queue.deQueue()); + Assert.assertEquals("d", queue.deQueue()); + Assert.assertEquals("e", queue.deQueue()); + + } + +} diff --git a/group24/798277403/src/basic/queue/Josephus.java b/group24/798277403/src/basic/queue/Josephus.java new file mode 100644 index 0000000000..527e51517c --- /dev/null +++ b/group24/798277403/src/basic/queue/Josephus.java @@ -0,0 +1,35 @@ +package basic.queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用Queue来实现Josephus问题 + * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死,然后再由下一个重新报数, 直到最后一个人留下来 + * 该方法返回一个List, 包含了被杀死人的次序 + * @author liuxin + * + */ +public class Josephus { + + public static List execute(int n, int m){ + Queue queue = new Queue(); + List result = new ArrayList(); + + for(int i=0; i { + private Node first; + private Node last; + private int size; + + + private static class Node { + private E item; + private Node next; + } + + + public Queue() { + first = null; + last = null; + size = 0; + } + + + public boolean isEmpty() { + return first == null; + } + + public int size() { + return size; + } + + + + public void enQueue(E data) { + Node oldlast = last; + last = new Node(); + last.item = data; + last.next = null; + if (isEmpty()) { + first = last; + } + else{ + oldlast.next = last; + } + size++; + } + + public E deQueue() { + if (isEmpty()) { + throw new NoSuchElementException("Queue underflow"); + } + E item = first.item; + first = first.next; + size--; + if (isEmpty()) { + last = null; + } + return item; + } + +} diff --git a/group24/798277403/src/basic/queue/QueueWithTwoStacks.java b/group24/798277403/src/basic/queue/QueueWithTwoStacks.java new file mode 100644 index 0000000000..7795b94580 --- /dev/null +++ b/group24/798277403/src/basic/queue/QueueWithTwoStacks.java @@ -0,0 +1,49 @@ +package basic.queue; + +import java.util.Stack; + +/** + * 用两个栈来实现一个队列 + * @author liuxin + * + * @param + */ +public class QueueWithTwoStacks { + private Stack stack1; + private Stack stack2; + + public QueueWithTwoStacks() { + stack1 = new Stack(); + stack2 = new Stack(); + } + + public boolean isEmpty() { + return stack1.isEmpty() && stack2.isEmpty(); + } + + public int size() { + return stack1.size()+stack2.size(); + } + + public void enQueue(E item) { + stack1.push(item); + } + + public E deQueue() { + if(isEmpty()){ + throw new RuntimeException("The queue is empty"); + } + E date = null; + if(!stack2.isEmpty()){ + date = stack2.pop(); + }else{ + while(!stack1.isEmpty()){ + stack2.push(stack1.pop()); + } + date = stack2.pop(); + } + return date; + } + + } + diff --git a/group24/798277403/src/basic/stack/QuickMinStack.java b/group24/798277403/src/basic/stack/QuickMinStack.java new file mode 100644 index 0000000000..6124896e17 --- /dev/null +++ b/group24/798277403/src/basic/stack/QuickMinStack.java @@ -0,0 +1,36 @@ +package basic.stack; + +import java.util.Stack; + +/** + * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 + * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * @author liuxin + * + */ +public class QuickMinStack { + Stack stackNum = new Stack<>(); + Stack stackMin = new Stack<>(); + public void push(int data){ + stackNum.push(data); + if(stackMin.isEmpty() || stackMin.peek()>=data){ + stackMin.push(data); + } + } + + public int pop(){ + if(stackNum.size()<=0){ + throw new RuntimeException("The stack is empty!"); + } + int result = stackNum.pop(); + if(result==stackMin.peek()){ + stackMin.pop(); + } + return result; + } + + public int findMin(){ + return stackMin.peek(); + } + +} diff --git a/group24/798277403/src/basic/stack/QuickMinStackTest.java b/group24/798277403/src/basic/stack/QuickMinStackTest.java new file mode 100644 index 0000000000..b89e4fffa0 --- /dev/null +++ b/group24/798277403/src/basic/stack/QuickMinStackTest.java @@ -0,0 +1,39 @@ +package basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class QuickMinStackTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + QuickMinStack stack = new QuickMinStack(); + stack.push(5); + Assert.assertEquals(5, stack.findMin()); + stack.push(6); + Assert.assertEquals(5, stack.findMin()); + stack.push(4); + Assert.assertEquals(4, stack.findMin()); + stack.push(4); + Assert.assertEquals(4, stack.findMin()); + + stack.pop(); + Assert.assertEquals(4, stack.findMin()); + stack.pop(); + Assert.assertEquals(5, stack.findMin()); + stack.pop(); + Assert.assertEquals(5, stack.findMin()); + } + +} diff --git a/group24/798277403/src/basic/stack/StackWithTwoQueues.java b/group24/798277403/src/basic/stack/StackWithTwoQueues.java new file mode 100644 index 0000000000..8901836c34 --- /dev/null +++ b/group24/798277403/src/basic/stack/StackWithTwoQueues.java @@ -0,0 +1,41 @@ +package basic.stack; + + +import java.util.LinkedList; +import java.util.Queue; + +public class StackWithTwoQueues { + + private Queue queue1 = new LinkedList(); + private Queue queue2 = new LinkedList(); + + public void push(int data) { + if(queue1.isEmpty()){ + queue1.add(data); + while(!queue2.isEmpty()){ + queue1.add(queue2.poll()); + } + }else{ + queue2.add(data); + while(!queue1.isEmpty()){ + queue2.add(queue1.poll()); + } + } + } + + public int pop() { + if(queue1.isEmpty() && queue2.isEmpty()){ + throw new RuntimeException("The stack is empty!"); + } + int result = -1; + if(queue1.isEmpty()){ + result = queue2.poll(); + }else{ + result = queue1.poll(); + } + return result; + } + + + +} diff --git a/group24/798277403/src/basic/stack/StackWithTwoQueuesTest.java b/group24/798277403/src/basic/stack/StackWithTwoQueuesTest.java new file mode 100644 index 0000000000..63dcbfda59 --- /dev/null +++ b/group24/798277403/src/basic/stack/StackWithTwoQueuesTest.java @@ -0,0 +1,36 @@ +package basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class StackWithTwoQueuesTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + StackWithTwoQueues stack = new StackWithTwoQueues(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.push(4); + Assert.assertEquals(4, stack.pop()); + Assert.assertEquals(3, stack.pop()); + + stack.push(5); + Assert.assertEquals(5, stack.pop()); + Assert.assertEquals(2, stack.pop()); + Assert.assertEquals(1, stack.pop()); + } + +} diff --git a/group24/798277403/src/basic/stack/TwoStackInOneArray.java b/group24/798277403/src/basic/stack/TwoStackInOneArray.java new file mode 100644 index 0000000000..a5b8267cc1 --- /dev/null +++ b/group24/798277403/src/basic/stack/TwoStackInOneArray.java @@ -0,0 +1,116 @@ +package basic.stack; + +/** + * 用一个数组实现两个栈 + * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * @author liuxin + * + */ +public class TwoStackInOneArray { + private Object[] data ; + private int top1 ; //应该把下标对应数据 + private int top2 ; + + public TwoStackInOneArray(int size){ + data = new Object[size]; + top1 = -1; + top2 = data.length; + } + + public TwoStackInOneArray(){ + data = new Object[10]; + top1 = -1; + top2 = data.length; + } + + /** + * 向第一个栈中压入元素 + * @param o + */ + public void push1(Object o){ + capacity(); + data[++top1] = o; + } + /** + * 从第一个栈中弹出元素 + * @return + */ + public Object pop1(){ + if(top1==-1){ + throw new RuntimeException("The stack is empty!"); + } + Object o = data[top1]; + data[top1] = null; + top1--; + return o; + } + + /** + * 获取第一个栈的栈顶元素 + * @return + */ + public Object peek1(){ + if(top1==-1){ + throw new RuntimeException("The stack is empty!"); + } + return data[top1]; + } + /* + * 向第二个栈压入元素 + */ + public void push2(Object o){ + capacity(); + data[--top2] = o; + } + /** + * 从第二个栈弹出元素 + * @return + */ + public Object pop2(){ + if(top2==data.length){ + throw new RuntimeException("The stack is empty!"); + } + Object o = data[top2]; + data[top2] = null; + top1++; + return o; + } + + /** + * 获取第二个栈的栈顶元素 + * @return + */ + public Object peek2(){ + if(top2==data.length){ + throw new RuntimeException("The stack is empty!"); + } + return data[top2]; + } + + public Object[] stack1ToArray(){ + Object[] result = new Object[top1+1]; + System.arraycopy(data,0,result,0,top1+1); + return result; + } + public Object[] stack2ToArray(){ + int stack2Size = data.length-top2; + Object[] result = new Object[stack2Size]; + for(int i=data.length-1,j=0; i>=top2; i--,j++){ + result[j] = data[i]; + } + return result; + } + + //扩容函数 + private void capacity(){ + if(top2-top1<=1){ + int size = data.length*2+1; + Object[] newData = new Object[size]; + System.arraycopy(data,0,newData,0,top1+1); + int stack2Size = data.length-top2; + System.arraycopy(data,top2,newData,newData.length-stack2Size,stack2Size); + top2 = newData.length-stack2Size; + data = newData; + } + } +} diff --git a/group24/798277403/src/basic/stack/TwoStackInOneArrayTest.java b/group24/798277403/src/basic/stack/TwoStackInOneArrayTest.java new file mode 100644 index 0000000000..27d95352bb --- /dev/null +++ b/group24/798277403/src/basic/stack/TwoStackInOneArrayTest.java @@ -0,0 +1,65 @@ +package basic.stack; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; + + + +public class TwoStackInOneArrayTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void test1() { + TwoStackInOneArray stack = new TwoStackInOneArray(10); + stack.push1(1); + stack.push1(2); + stack.push1(3); + stack.push1(4); + stack.push1(5); + + stack.push2(1); + stack.push2(2); + stack.push2(3); + stack.push2(4); + stack.push2(5); + + for(int i=1;i<=5;i++){ + Assert.assertEquals(stack.peek1(), stack.peek2()); + Assert.assertEquals(stack.pop1(), stack.pop2()); + } + + + } + @Test + public void test2() { + TwoStackInOneArray stack = new TwoStackInOneArray(5); + stack.push1(1); + stack.push1(2); + stack.push1(3); + stack.push1(4); + stack.push1(5); + stack.push1(6); + stack.push1(7); + + stack.push2(1); + stack.push2(2); + stack.push2(3); + stack.push2(4); + + + Assert.assertEquals("[1, 2, 3, 4, 5, 6, 7]",Arrays.toString(stack.stack1ToArray())); + Assert.assertEquals("[1, 2, 3, 4]",Arrays.toString(stack.stack2ToArray())); + } + +} diff --git a/group24/798277403/src/mini_jvm/attr/CodeAttr.java b/group24/798277403/src/mini_jvm/attr/CodeAttr.java index 07df10d251..7d2aa4e760 100644 --- a/group24/798277403/src/mini_jvm/attr/CodeAttr.java +++ b/group24/798277403/src/mini_jvm/attr/CodeAttr.java @@ -86,7 +86,7 @@ public String toString(ConstantPool pool){ StringBuilder buffer = new StringBuilder(); //buffer.append("Code:").append(code).append("\n"); for(int i=0;i")){ + return ; + } + Method nextMethod = MethodArea.getInstance().getMethod(methodRefInfo); + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(nextMethod); } diff --git a/group24/798277403/src/mini_jvm/cmd/InvokeVirtualCmd.java b/group24/798277403/src/mini_jvm/cmd/InvokeVirtualCmd.java index 5057132d8e..a4d5b0d239 100644 --- a/group24/798277403/src/mini_jvm/cmd/InvokeVirtualCmd.java +++ b/group24/798277403/src/mini_jvm/cmd/InvokeVirtualCmd.java @@ -2,9 +2,12 @@ import mini_jvm.clz.ClassFile; -import mini_jvm.constant.ConstantPool; +import mini_jvm.constant.MethodRefInfo; import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.JavaObject; +import mini_jvm.engine.MethodArea; import mini_jvm.engine.StackFrame; +import mini_jvm.method.Method; public class InvokeVirtualCmd extends TwoOperandCmd { @@ -13,14 +16,57 @@ public InvokeVirtualCmd(ClassFile clzFile, String opCode) { } @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsMethod(pool); + public String toString() { + + return super.getOperandAsMethod(); + } + private boolean isSystemOutPrintlnMethod(String className, String methodName){ + return "java/io/PrintStream".equals(className) + && "println".equals(methodName); } + //调用对象的实例方法(多态) @Override public void execute(StackFrame frame, ExecutionResult result) { - + //先得到对该方法的描述 + MethodRefInfo methodRefInfo = (MethodRefInfo)this.getConstantInfo(this.getIndex()); + + String className = methodRefInfo.getClassName(); + String methodName = methodRefInfo.getMethodName(); + + // 我们没有实现System.out.println方法, 所以也不用建立新的栈帧, 直接调用Java的方法, 打印出来即可。 + if(isSystemOutPrintlnMethod(className,methodName)){ + JavaObject jo = (JavaObject)frame.getOprandStack().pop(); + String value = jo.toString(); + System.err.println("-------------------"+value+"----------------"); + // 这里就是那个out对象, 因为是个假的,直接pop出来 + frame.getOprandStack().pop(); + return; + } + + //注意:多态, 这才是真正的对象, 先从该对象的class 中去找对应的方法,找不到的话再去找父类的方法 + JavaObject jo = frame.getOprandStack().peek(); + MethodArea ma = MethodArea.getInstance(); + Method m = null; + String currentClassName = jo.getClassName(); + while(currentClassName != null){ + ClassFile currentClassFile = ma.findClassFile(currentClassName); + m = currentClassFile.getMethod(methodRefInfo.getMethodName(), + methodRefInfo.getParamAndReturnType()); + if(m != null){ + break; + } else{ + //查找父类 + currentClassName = currentClassFile.getSuperClassName(); + } + } + + if(m == null){ + throw new RuntimeException("Can't find method for :" + methodRefInfo.toString()); + } + + result.setNextAction(ExecutionResult.PAUSE_AND_RUN_NEW_FRAME); + result.setNextMethod(m); } diff --git a/group24/798277403/src/mini_jvm/cmd/LdcCmd.java b/group24/798277403/src/mini_jvm/cmd/LdcCmd.java index 25a0ea5753..c21732fcc5 100644 --- a/group24/798277403/src/mini_jvm/cmd/LdcCmd.java +++ b/group24/798277403/src/mini_jvm/cmd/LdcCmd.java @@ -6,6 +6,8 @@ import mini_jvm.constant.ConstantPool; import mini_jvm.constant.StringInfo; import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.Heap; +import mini_jvm.engine.JavaObject; import mini_jvm.engine.StackFrame; public class LdcCmd extends OneOperandCmd { @@ -13,25 +15,37 @@ public class LdcCmd extends OneOperandCmd { public LdcCmd(ClassFile clzFile, String opCode) { super(clzFile,opCode); } - + @Override - public String toString(ConstantPool pool) { - - ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); - + public String toString() { + + ConstantInfo info = getConstantInfo(this.getOperand()); + String value = "TBD"; if(info instanceof StringInfo){ StringInfo strInfo = (StringInfo)info; value = strInfo.toString(); } - + return this.getOffset()+":"+this.getOpCode()+" " + this.getReadableCodeText() + " "+ value; - + } @Override public void execute(StackFrame frame, ExecutionResult result) { - + ConstantPool pool = this.getConstantPool(); + ConstantInfo info = (ConstantInfo)pool.getConstantInfo(this.getOperand()); + + if(info instanceof StringInfo){ + StringInfo strInfo = (StringInfo)info; + String value = strInfo.toString(); + JavaObject jo = Heap.getInstance().newString(value); + frame.getOprandStack().push(jo); + } + else{ + //TBD 处理其他类型 + throw new RuntimeException("Only support StringInfo constant"); + } } diff --git a/group24/798277403/src/mini_jvm/cmd/NewObjectCmd.java b/group24/798277403/src/mini_jvm/cmd/NewObjectCmd.java index 56afe06698..3bdfa198ab 100644 --- a/group24/798277403/src/mini_jvm/cmd/NewObjectCmd.java +++ b/group24/798277403/src/mini_jvm/cmd/NewObjectCmd.java @@ -2,8 +2,10 @@ import mini_jvm.clz.ClassFile; -import mini_jvm.constant.ConstantPool; +import mini_jvm.constant.ClassInfo; import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.Heap; +import mini_jvm.engine.JavaObject; import mini_jvm.engine.StackFrame; public class NewObjectCmd extends TwoOperandCmd{ @@ -13,14 +15,22 @@ public NewObjectCmd(ClassFile clzFile, String opCode){ } @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsClassInfo(pool); + public String toString() { + + return super.getOperandAsClassInfo(); } @Override public void execute(StackFrame frame, ExecutionResult result) { - + //(indexbyte1 << 8)| indexbyte2 得到一个指向常量池的索引 + int index = this.getIndex(); + + ClassInfo info = (ClassInfo)this.getConstantInfo(index); + String clzName = info.getClassName(); + //在Java堆上创建一个实例 + JavaObject jo = Heap.getInstance().newObject(clzName); + + frame.getOprandStack().push(jo); } diff --git a/group24/798277403/src/mini_jvm/cmd/NoOperandCmd.java b/group24/798277403/src/mini_jvm/cmd/NoOperandCmd.java index 0a2f285b12..2c65e40346 100644 --- a/group24/798277403/src/mini_jvm/cmd/NoOperandCmd.java +++ b/group24/798277403/src/mini_jvm/cmd/NoOperandCmd.java @@ -2,32 +2,148 @@ import mini_jvm.clz.ClassFile; -import mini_jvm.constant.ConstantPool; import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.Heap; +import mini_jvm.engine.JavaObject; import mini_jvm.engine.StackFrame; -public class NoOperandCmd extends ByteCodeCommand{ +public class NoOperandCmd extends ByteCodeCommand { public NoOperandCmd(ClassFile clzFile, String opCode) { super(clzFile, opCode); } @Override - public String toString(ConstantPool pool) { + public String toString() { return this.getOffset()+":" +this.getOpCode() + " "+ this.getReadableCodeText(); } - - + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + String opCode = this.getOpCode(); + + if(ByteCodeCommand.aload_0.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.aload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + }else if(ByteCodeCommand.iload_1.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(1); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_2.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(2); + + frame.getOprandStack().push(jo); + + } else if (ByteCodeCommand.iload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + }else if (ByteCodeCommand.fload_3.equals(opCode)){ + + JavaObject jo = frame.getLocalVariableValue(3); + + frame.getOprandStack().push(jo); + + } + else if (ByteCodeCommand.voidreturn.equals(opCode)){ + + result.setNextAction(ExecutionResult.EXIT_CURRENT_FRAME); + + } else if(ByteCodeCommand.ireturn.equals(opCode)){ + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.freturn.equals(opCode)){ + + StackFrame callerFrame = frame.getCallerFrame(); + JavaObject jo = frame.getOprandStack().pop(); + callerFrame.getOprandStack().push(jo); + } + + else if(ByteCodeCommand.astore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.dup.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().peek(); + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_0.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(0); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.iconst_1.equals(opCode)){ + + JavaObject jo = Heap.getInstance().newInt(1); + + frame.getOprandStack().push(jo); + + } else if(ByteCodeCommand.istore_1.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(1, jo); + + } else if(ByteCodeCommand.istore_2.equals(opCode)){ + + JavaObject jo = frame.getOprandStack().pop(); + + frame.setLocalVariableValue(2, jo); + + } else if(ByteCodeCommand.iadd.equals(opCode)){ + + JavaObject jo1 = frame.getOprandStack().pop(); + JavaObject jo2 = frame.getOprandStack().pop(); + + JavaObject sum = Heap.getInstance().newInt(jo1.getIntValue()+jo2.getIntValue()); + + frame.getOprandStack().push(sum); + + } else if (ByteCodeCommand.aconst_null.equals(opCode)){ + + frame.getOprandStack().push(null); + + } + else{ + throw new RuntimeException("you must forget to implement the operation :" + opCode); + } + + + } + + public int getLength(){ return 1; } - @Override - public void execute(StackFrame frame, ExecutionResult result) { - - - } } diff --git a/group24/798277403/src/mini_jvm/cmd/OneOperandCmd.java b/group24/798277403/src/mini_jvm/cmd/OneOperandCmd.java index 65ef9fe5e3..01b4e680bd 100644 --- a/group24/798277403/src/mini_jvm/cmd/OneOperandCmd.java +++ b/group24/798277403/src/mini_jvm/cmd/OneOperandCmd.java @@ -2,7 +2,6 @@ import mini_jvm.clz.ClassFile; -import mini_jvm.constant.ConstantPool; public abstract class OneOperandCmd extends ByteCodeCommand { @@ -25,6 +24,4 @@ public int getLength(){ return 2; } - - public abstract String toString(ConstantPool pool); } diff --git a/group24/798277403/src/mini_jvm/cmd/PutFieldCmd.java b/group24/798277403/src/mini_jvm/cmd/PutFieldCmd.java index 9e2d80a3c9..fa2f21acd6 100644 --- a/group24/798277403/src/mini_jvm/cmd/PutFieldCmd.java +++ b/group24/798277403/src/mini_jvm/cmd/PutFieldCmd.java @@ -2,8 +2,11 @@ import mini_jvm.clz.ClassFile; -import mini_jvm.constant.ConstantPool; +import mini_jvm.constant.ClassInfo; +import mini_jvm.constant.FieldRefInfo; +import mini_jvm.constant.NameAndTypeInfo; import mini_jvm.engine.ExecutionResult; +import mini_jvm.engine.JavaObject; import mini_jvm.engine.StackFrame; public class PutFieldCmd extends TwoOperandCmd { @@ -13,15 +16,26 @@ public PutFieldCmd(ClassFile clzFile, String opCode) { } @Override - public String toString(ConstantPool pool) { - - return super.getOperandAsField(pool); + public String toString() { + return super.getOperandAsField(); } @Override public void execute(StackFrame frame, ExecutionResult result) { - - + + FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + + ClassInfo clzInfo = (ClassInfo)this.getConstantInfo(fieldRef.getClassInfoIndex()); + NameAndTypeInfo nameTypeInfo = (NameAndTypeInfo)this.getConstantInfo(fieldRef.getNameAndTypeIndex()); + // for example : name + String fieldName = nameTypeInfo.getName(); + // for example : Ljava/lang/String : 注意:我们不再检查类型 + String fieldType = nameTypeInfo.getTypeInfo(); + + JavaObject fieldValue = frame.getOprandStack().pop(); + JavaObject objectRef = frame.getOprandStack().pop(); + + objectRef.setFieldValue(fieldName, fieldValue); } diff --git a/group24/798277403/src/mini_jvm/cmd/TwoOperandCmd.java b/group24/798277403/src/mini_jvm/cmd/TwoOperandCmd.java index 7ec4f5ee38..c49e140b64 100644 --- a/group24/798277403/src/mini_jvm/cmd/TwoOperandCmd.java +++ b/group24/798277403/src/mini_jvm/cmd/TwoOperandCmd.java @@ -5,10 +5,10 @@ import mini_jvm.constant.*; public abstract class TwoOperandCmd extends ByteCodeCommand{ - + int oprand1 = -1; int oprand2 = -1; - + public int getOprand1() { return oprand1; } @@ -24,8 +24,8 @@ public void setOprand2(int oprand2) { public int getOprand2() { return oprand2; } - - public TwoOperandCmd(ClassFile clzFile, String opCode) { + + public TwoOperandCmd(ClassFile clzFile,String opCode) { super(clzFile, opCode); } @@ -35,15 +35,15 @@ public int getIndex(){ int index = oprand1 << 8 | oprand2; return index; } - - protected String getOperandAsClassInfo(ConstantPool pool){ + + protected String getOperandAsClassInfo(){ int index = getIndex(); String codeTxt = getReadableCodeText(); - ClassInfo info = (ClassInfo)pool.getConstantInfo(index); + ClassInfo info = (ClassInfo)getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" "+ codeTxt +" "+ info.getClassName(); } - - protected String getOperandAsMethod(ConstantPool pool){ + + protected String getOperandAsMethod(){ int index = getIndex(); String codeTxt = getReadableCodeText(); ConstantInfo constInfo = this.getConstantInfo(index); @@ -51,9 +51,9 @@ protected String getOperandAsMethod(ConstantPool pool){ return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); } - protected String getOperandAsField(ConstantPool pool){ + protected String getOperandAsField(){ int index = getIndex(); - + String codeTxt = getReadableCodeText(); FieldRefInfo info = (FieldRefInfo)this.getConstantInfo(index); return this.getOffset()+":"+this.getOpCode()+" " + codeTxt +" "+ info.toString(); @@ -62,6 +62,4 @@ public int getLength(){ return 3; } - public abstract String toString(ConstantPool pool); - } diff --git a/group24/798277403/src/mini_jvm/constant/MethodRefInfo.java b/group24/798277403/src/mini_jvm/constant/MethodRefInfo.java index 072378f568..6da55c543f 100644 --- a/group24/798277403/src/mini_jvm/constant/MethodRefInfo.java +++ b/group24/798277403/src/mini_jvm/constant/MethodRefInfo.java @@ -1,5 +1,8 @@ package mini_jvm.constant; +/** + * 常量池中 类中方法的符号引用 + */ public class MethodRefInfo extends ConstantInfo { private int type = ConstantInfo.METHOD_INFO; diff --git a/group24/798277403/src/mini_jvm/engine/ExecutorEngine.java b/group24/798277403/src/mini_jvm/engine/ExecutorEngine.java index 260211376c..379a6cc2cd 100644 --- a/group24/798277403/src/mini_jvm/engine/ExecutorEngine.java +++ b/group24/798277403/src/mini_jvm/engine/ExecutorEngine.java @@ -2,10 +2,14 @@ import mini_jvm.method.Method; +import java.util.ArrayList; +import java.util.List; import java.util.Stack; - +/** + * 维护一个函数帧栈 + */ public class ExecutorEngine { private Stack stack = new Stack(); @@ -15,16 +19,61 @@ public ExecutorEngine() { } public void execute(Method mainMethod){ - - + //为Main函数创建一个函数帧 + StackFrame mainFrame = StackFrame.create(mainMethod); + //将函数帧压入栈中 + stack.push(mainFrame); + + //不断的从函数帧栈中取帧来执行 + while(!stack.isEmpty()){ + StackFrame currentFrame = stack.peek(); + ExecutionResult executionResult = currentFrame.execute(); + + if(executionResult.isPauseAndRunNewFrame()){ + //如果函数帧在执行过程中调用了其他的方法,则开启一个新的函数帧,并压入栈中 + Method nextMethod = executionResult.getNextMethod(); + StackFrame nextFrame = StackFrame.create(nextMethod); + + //为新的函数帧设置回调 + nextFrame.setCallerFrame(currentFrame); + //将参数传递给新的函数 + setupFunctionCallParams(currentFrame,nextFrame); + + stack.push(nextFrame); + }else{ + //否则此函数帧执行完毕,弹出 + stack.pop(); + } + } } private void setupFunctionCallParams(StackFrame currentFrame,StackFrame nextFrame) { - - + + Method nextMethod = nextFrame.getMethod(); + + List paramList = nextMethod.getParameterList(); + + //加上1 是因为要把this也传递过去 + int paramNum = paramList.size() + 1; + + List values = new ArrayList(); + + //把当前函数帧操作数栈的前几个值复制给新的函数帧,相当于传递方法的参数 + //数据结构知识:从栈中取出栈顶的x个元素 + while(paramNum>0){ + values.add(currentFrame.getOprandStack().pop()); + paramNum --; + } + //数据结构知识: 把一个列表倒序排列 + List params = new ArrayList(); + + for(int i=values.size()-1; i>=0 ;i--){ + params.add(values.get(i)); + } + nextFrame.setLocalVariableTable(params); } diff --git a/group24/798277403/src/mini_jvm/engine/MethodArea.java b/group24/798277403/src/mini_jvm/engine/MethodArea.java index fd43904312..382394f965 100644 --- a/group24/798277403/src/mini_jvm/engine/MethodArea.java +++ b/group24/798277403/src/mini_jvm/engine/MethodArea.java @@ -9,6 +9,7 @@ import java.util.Map; + public class MethodArea { public static final MethodArea instance = new MethodArea(); @@ -46,6 +47,7 @@ public ClassFile findClassFile(String className){ return map.get(className); } // 看来该class 文件还没有load过 + System.out.println("load class"); ClassFile clzFile = this.clzLoader.loadClass(className); map.put(className, clzFile); @@ -53,17 +55,29 @@ public ClassFile findClassFile(String className){ return clzFile; } - - + + //根据方法的名称和描述符从方法区获取方法 public Method getMethod(String className, String methodName, String paramAndReturnType){ - - return null; + ClassFile classFile = this.findClassFile(className); + Method m = classFile.getMethod(methodName,paramAndReturnType); + if(m==null){ + throw new RuntimeException("method can't be found : \n" + + "class: " + className + + "method: " + methodName + + "paramAndReturnType: " + paramAndReturnType); + } + return m; } - + //根据类中方法的符号引用从方法区获取方法 public Method getMethod(MethodRefInfo methodRef){ - - return null; - + ClassFile clz = this.findClassFile(methodRef.getClassName()); + + Method m = clz.getMethod(methodRef.getMethodName(), methodRef.getParamAndReturnType()); + + if(m == null){ + throw new RuntimeException("method can't be found : " + methodRef.toString()); + } + return m; } } diff --git a/group24/798277403/src/mini_jvm/engine/MiniJVM.java b/group24/798277403/src/mini_jvm/engine/MiniJVM.java index 6781fed5ad..75a78207f4 100644 --- a/group24/798277403/src/mini_jvm/engine/MiniJVM.java +++ b/group24/798277403/src/mini_jvm/engine/MiniJVM.java @@ -10,20 +10,22 @@ public class MiniJVM { public void run(String[]classPaths , String className) throws FileNotFoundException, IOException{ - + + //装载类 ClassFileLoader loader = new ClassFileLoader(); for(int i=0;i localVariableTable = new ArrayList(); @@ -54,7 +58,6 @@ public Stack getOprandStack(){ } public int getNextCommandIndex(int offset){ - ByteCodeCommand[] cmds = m.getCodeAttr().getCmds(); for(int i=0;i getParameterList(){ + + // e.g. (Ljava/util/List;Ljava/lang/String;II)V + String paramAndType = getParamAndReturnType(); + + int first = paramAndType.indexOf("("); + int last = paramAndType.lastIndexOf(")"); + // e.g. Ljava/util/List;Ljava/lang/String;II + String param = paramAndType.substring(first+1, last); + + List paramList = new ArrayList(); + + if((null == param) || "".equals(param)){ + return paramList; + } + + while(!param.equals("")){ + + int pos = 0; + // 这是一个对象类型 + if(param.charAt(pos) == 'L'){ + + int end = param.indexOf(";"); + + if(end == -1){ + throw new RuntimeException("can't find the ; for a object type"); + } + paramList.add(param.substring(pos+1,end)); + + pos = end + 1; + + } + else if(param.charAt(pos) == 'I'){ + // int + paramList.add("I"); + pos ++; + + } + else if(param.charAt(pos) == 'F'){ + // float + paramList.add("F"); + pos ++; + + } else{ + throw new RuntimeException("the param has unsupported type:" + param); + } + + param = param.substring(pos); + + } + return paramList; + + } } diff --git a/group24/798277403/src/mini_jvm/test/ClassFileloaderTest.java b/group24/798277403/src/mini_jvm/test/ClassFileloaderTest.java index c80e6e5c50..89f20b6ded 100644 --- a/group24/798277403/src/mini_jvm/test/ClassFileloaderTest.java +++ b/group24/798277403/src/mini_jvm/test/ClassFileloaderTest.java @@ -31,7 +31,7 @@ public class ClassFileloaderTest { static { ClassFileLoader loader = new ClassFileLoader(); loader.addClassPath(path2); - String className = "EmployeeV1"; + String className = "com.coderising.jvm.test.EmployeeV1"; clzFile = loader.loadClass(className); //clzFile.print(); @@ -63,22 +63,22 @@ public void testClassPath(){ public void testClassFileLength() { ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path3); + loader.addClassPath(path2); - String className = "week4.test.EmployeeV1"; + String className = "com.coderising.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); // 注意:这个字节数可能和你的JVM版本有关系, 你可以看看编译好的类到底有多大 - Assert.assertEquals(1030, byteCodes.length); + Assert.assertEquals(1056, byteCodes.length); } @Test public void testMagicNumber(){ ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path3); - String className = "week4.test.EmployeeV1"; + loader.addClassPath(path2); + String className = "com.coderising.jvm.test.EmployeeV1"; byte[] byteCodes = loader.readBinaryCode(className); byte[] codes = new byte[]{byteCodes[0],byteCodes[1],byteCodes[2],byteCodes[3]}; diff --git a/group24/798277403/src/mini_jvm/test/MiniJVMTest.java b/group24/798277403/src/mini_jvm/test/MiniJVMTest.java new file mode 100644 index 0000000000..ab12618bd3 --- /dev/null +++ b/group24/798277403/src/mini_jvm/test/MiniJVMTest.java @@ -0,0 +1,28 @@ +package mini_jvm.test; + +import mini_jvm.engine.MiniJVM; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + + +public class MiniJVMTest { + + static final String PATH = "C:\\Users\\zhouliang\\Desktop\\mycoding\\"; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testMain() throws Exception{ + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "EmployeeV1"); + + } + +} From 027f7f259607529f40c4c752dac69f14d69060e0 Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 15 May 2017 10:09:05 +0800 Subject: [PATCH 518/552] =?UTF-8?q?JVM=20=E4=B8=BB=E9=A2=98=EF=BC=9A?= =?UTF-8?q?=E7=AC=AC8=E6=AC=A1=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/basic/tree/BinarySearchTree.java | 29 ++++++++ .../basic/tree/BinarySearchTreeTest.java | 67 ++++++++++++++++++ .../com/coding/basic/tree/BinaryTreeNode.java | 70 +++++++++---------- 3 files changed, 131 insertions(+), 35 deletions(-) create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java create mode 100644 liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTreeTest.java diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java new file mode 100644 index 0000000000..0c05564b15 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java @@ -0,0 +1,29 @@ +package com.coding.basic.tree; + +public class BinarySearchTree { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode getRoot(){ + return root; + } + public T findMin(){ + return null; + } + public T findMax(){ + return null; + } + public int height() { + return -1; + } + public int size() { + return -1; + } + public void remove(T e){ + + } + +} + diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTreeTest.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTreeTest.java new file mode 100644 index 0000000000..3f58b60bc9 --- /dev/null +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTreeTest.java @@ -0,0 +1,67 @@ +package com.coding.basic.tree; + +import static org.junit.Assert.fail; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinarySearchTreeTest { + + BinarySearchTree tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + + } + + @Test + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); + } + + @Test + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } +} diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeNode.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeNode.java index 467101a16f..e06edbd942 100644 --- a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeNode.java +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinaryTreeNode.java @@ -1,35 +1,35 @@ -package com.coding.basic.tree; - -public class BinaryTreeNode { - - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; - - public BinaryTreeNode(T data){ - this.data=data; - } - public T getData() { - return data; - } - public void setData(T data) { - this.data = data; - } - public BinaryTreeNode getLeft() { - return left; - } - public void setLeft(BinaryTreeNode left) { - this.left = left; - } - public BinaryTreeNode getRight() { - return right; - } - public void setRight(BinaryTreeNode right) { - this.right = right; - } - - public BinaryTreeNode insert(Object o){ - return null; - } - -} +package com.coding.basic.tree; + +public class BinaryTreeNode { + + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} From 09932d65ce54ff432dec29b8f34180c0f1216879 Mon Sep 17 00:00:00 2001 From: liangduoduo666666 <798277403@qq.com> Date: Mon, 15 May 2017 20:03:57 +0800 Subject: [PATCH 519/552] Tenth week homework---zl --- .../src/basic/tree/BinaryTreeNode.java | 35 ++++++ .../src/basic/tree/BinaryTreeUtil.java | 119 ++++++++++++++++++ .../src/basic/tree/BinaryTreeUtilTest.java | 73 +++++++++++ .../798277403/src/basic/tree/FileList.java | 27 ++++ 4 files changed, 254 insertions(+) create mode 100644 group24/798277403/src/basic/tree/BinaryTreeNode.java create mode 100644 group24/798277403/src/basic/tree/BinaryTreeUtil.java create mode 100644 group24/798277403/src/basic/tree/BinaryTreeUtilTest.java create mode 100644 group24/798277403/src/basic/tree/FileList.java diff --git a/group24/798277403/src/basic/tree/BinaryTreeNode.java b/group24/798277403/src/basic/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..af3f3c817f --- /dev/null +++ b/group24/798277403/src/basic/tree/BinaryTreeNode.java @@ -0,0 +1,35 @@ +package basic.tree; + +public class BinaryTreeNode { + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} diff --git a/group24/798277403/src/basic/tree/BinaryTreeUtil.java b/group24/798277403/src/basic/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..f4d666c335 --- /dev/null +++ b/group24/798277403/src/basic/tree/BinaryTreeUtil.java @@ -0,0 +1,119 @@ +package basic.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + prevAdd(root,result); + return result; + } + private static void prevAdd(BinaryTreeNode node,List result){ + if(node!=null){ + result.add(node.getData()); + if(node.getLeft()!=null){ + prevAdd(node.getLeft(),result); + } + if(node.getRight()!=null){ + prevAdd(node.getRight(),result); + } + } + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + inOrderAdd(root,result); + return result; + } + private static void inOrderAdd(BinaryTreeNode node,List result){ + if(node!=null){ + if(node.getLeft()!=null){ + inOrderAdd(node.getLeft(),result); + } + result.add(node.getData()); + if(node.getRight()!=null){ + inOrderAdd(node.getRight(),result); + } + } + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + postOrderAdd(root,result); + return result; + } + private static void postOrderAdd(BinaryTreeNode node,List result){ + if(node!=null){ + if(node.getLeft()!=null){ + postOrderAdd(node.getLeft(),result); + } + if(node.getRight()!=null){ + postOrderAdd(node.getRight(),result); + } + result.add(node.getData()); + } + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + List result = new ArrayList(); + Stack> stack = new Stack<>(); + while(!stack.isEmpty() || root!=null){ + //先压入所有左节点,在压入前访问 + while(root!=null){ + result.add(root.getData()); + stack.push(root); + root = root.getLeft(); + } + //左节点压入完后压入右节点 + if(!stack.isEmpty()){ + root = stack.pop(); + root = root.getRight(); + } + } + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + List result = new ArrayList(); + Stack> stack = new Stack<>(); + while(!stack.isEmpty() || root!=null){ + while(root!=null){ + stack.push(root); + root = root.getLeft(); + } + if(!stack.isEmpty()){ + root = stack.pop(); + result.add(root.getData()); + root = root.getRight(); + } + } + return result; + } + +} diff --git a/group24/798277403/src/basic/tree/BinaryTreeUtilTest.java b/group24/798277403/src/basic/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..daa057329c --- /dev/null +++ b/group24/798277403/src/basic/tree/BinaryTreeUtilTest.java @@ -0,0 +1,73 @@ +package basic.tree; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + + + +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} diff --git a/group24/798277403/src/basic/tree/FileList.java b/group24/798277403/src/basic/tree/FileList.java new file mode 100644 index 0000000000..bd0f8e1740 --- /dev/null +++ b/group24/798277403/src/basic/tree/FileList.java @@ -0,0 +1,27 @@ +package basic.tree; + +import java.io.File; + +/** + * 给定一个目录,递归的列出下面所有的子目录和文件 + */ +public class FileList { + public static void list(File f) { + if(f.isDirectory()){ + File[] files = f.listFiles(); + for(File file : files){ + if(file.isDirectory()){ + System.out.println(file.getName()); + list(file); + }else{ + System.out.println(file.getName()); + } + } + } + } + + public static void main(String[] args) { + File f = new File("C:\\Users\\zhouliang\\Desktop\\其他"); + list(f); + } +} From 6772a8c0887134bd32bb94ab34b08c275701f861 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Mon, 15 May 2017 20:53:42 +0800 Subject: [PATCH 520/552] datastructure finished --- .../donaldy/basic/tree/BinarySearchTree.java | 138 ++++++++++++++++++ .../basic/tree/BinarySearchTreeTest.java | 67 +++++++++ 2 files changed, 205 insertions(+) create mode 100644 group24/448641125/src/com/donaldy/basic/tree/BinarySearchTree.java create mode 100644 group24/448641125/src/com/donaldy/basic/tree/BinarySearchTreeTest.java diff --git a/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTree.java b/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTree.java new file mode 100644 index 0000000000..639db1c01d --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTree.java @@ -0,0 +1,138 @@ +package com.donaldy.basic.tree; + +import java.util.List; + +public class BinarySearchTree { + + BinaryTreeNode root; + + public BinarySearchTree(BinaryTreeNode root){ + + this.root = root; + + } + + public BinaryTreeNode getRoot(){ + + return root; + + } + + public T findMin(){ + + if (this.root == null) { + throw new NullPointerException(); + } + + T minx = this.root.getData(); + + List list = BinaryTreeUtil.inOrderVisit(this.root); + + for (T data : list) { + if (data.compareTo(minx) < 0) { + minx = data; + } + } + + return minx; + } + + public T findMax(){ + if (this.root == null) { + throw new NullPointerException(); + } + + T maxn = this.root.getData(); + + List list = BinaryTreeUtil.inOrderVisit(this.root); + + for (T data : list) { + if (data.compareTo(maxn) > 0) { + maxn = data; + } + } + + return maxn; + + } + + public int height() { + if (this.root == null) { + throw new NullPointerException(); + } + + int height = treeHeight(this.root); + + return height; + } + + private int treeHeight(BinaryTreeNode node) { + + if (node == null) + return 0; + + return Math.max(treeHeight(node.getLeft()), treeHeight(node.getRight())) + 1; + + } + + public int size() { + + List list = BinaryTreeUtil.inOrderVisit(this.root); + + return list.size(); + } + + public void remove(T e){ + + removeNode(e, this.root); + + } + + private BinaryTreeNode removeNode(T e, BinaryTreeNode node) { + if (this.root == null) { + throw new NullPointerException(); + } + + //找子树 + if (e.compareTo(node.getData()) < 0) { + node.setLeft(removeNode(e, node.getLeft())); + } + else if (e.compareTo(node.getData()) > 0) { + node.setRight(removeNode(e, node.getRight())); + } + else { + //删除 + if (node.getLeft() != null && node.getRight() != null) { + BinaryTreeNode n = findMinNode(node.getRight()); + node.setData(n.getData()); + node.setRight(removeNode((T) node.getData(), node.getRight())); + } + else { + BinaryTreeNode n = node; + if (node.getLeft() == null) { + node = node.getRight(); + } + else if (node.getRight() == null) { + node = node.getLeft(); + } + } + } + return node; + + } + + private BinaryTreeNode findMinNode(BinaryTreeNode node) { + + if (node == null) { + return null; + } + + if (node.getLeft() == null) { + return node; + } + + return findMinNode(node.getLeft()); + } + +} + diff --git a/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTreeTest.java b/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTreeTest.java new file mode 100644 index 0000000000..fc8ff1092c --- /dev/null +++ b/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTreeTest.java @@ -0,0 +1,67 @@ +package com.donaldy.basic.tree; + +import static org.junit.Assert.fail; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinarySearchTreeTest { + + BinarySearchTree tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(8)); + root.getLeft().setLeft(new BinaryTreeNode(1)); + root.getLeft().setRight(new BinaryTreeNode(4)); + root.getLeft().getRight().setLeft(new BinaryTreeNode(3)); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + + } + + @Test + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); + } + + @Test + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.getLeft().getRight().getData().intValue()); + + } + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.getLeft().getData().intValue()); + Assert.assertEquals(4, root.getLeft().getRight().getData().intValue()); + } +} From 6e674194ca3f23567f254f6be94c5c127658facc Mon Sep 17 00:00:00 2001 From: lzb Date: Tue, 16 May 2017 00:55:55 +0800 Subject: [PATCH 521/552] =?UTF-8?q?11=E5=91=A8=E4=BD=9C=E4=B8=9A=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/lzb/basic/tree/BinarySearchTree.java | 31 +++++++++ .../me/lzb/basic/tree/BinaryTreeNode.java | 6 +- .../lzb/basic/tree/BinarySearchTreeTest.java | 67 +++++++++++++++++++ 3 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java new file mode 100644 index 0000000000..a235cf0c5e --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java @@ -0,0 +1,31 @@ +package me.lzb.basic.tree; + +/** + * @author LZB + * @date 2017/5/16 + */ +public class BinarySearchTree { + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode getRoot(){ + return root; + } + public T findMin(){ + return null; + } + public T findMax(){ + return null; + } + public int height() { + return -1; + } + public int size() { + return -1; + } + public void remove(T e){ + + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java index fc56ca100f..92a043d6c4 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java @@ -4,9 +4,9 @@ * @author LZB */ public class BinaryTreeNode { - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; public BinaryTreeNode(T data) { this.data = data; diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java new file mode 100644 index 0000000000..854901bd0a --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java @@ -0,0 +1,67 @@ +package me.lzb.basic.tree; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author LZB + * @date 2017/5/16 + */ +public class BinarySearchTreeTest { + BinarySearchTree tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode<>(6); + root.left = new BinaryTreeNode<>(2); + root.right = new BinaryTreeNode<>(8); + root.left.left = new BinaryTreeNode<>(1); + root.left.right = new BinaryTreeNode<>(4); + root.left.right.left = new BinaryTreeNode<>(3); + tree = new BinarySearchTree<>(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + + } + + @Test + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); + } + + @Test + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root = tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); + + } + + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root = tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } +} From bbecd6eddc44d2868d9f5c2648942d92e003b608 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 16 May 2017 13:28:22 +0800 Subject: [PATCH 522/552] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4=E8=87=B3=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chainResponsePattern/ConcreteHandler.java | 16 ++++ .../chainResponsePattern/ConsumeHandler.java | 77 +++++++++++++++++++ .../chainResponsePattern/Handler.java | 19 +++++ .../miniJVM/print/ConstantPoolPrinter.java | 36 --------- .../src/main/java/multiThread/Main.java | 17 ++++ .../src/main/java/multiThread/MyThread.java | 36 +++++++++ 6 files changed, 165 insertions(+), 36 deletions(-) create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConcreteHandler.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConsumeHandler.java create mode 100644 group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/Handler.java create mode 100644 group24/75939388/learning2017/src/main/java/multiThread/Main.java create mode 100644 group24/75939388/learning2017/src/main/java/multiThread/MyThread.java diff --git a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConcreteHandler.java b/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConcreteHandler.java new file mode 100644 index 0000000000..ad29446e99 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConcreteHandler.java @@ -0,0 +1,16 @@ +package designPattern.chainResponsePattern; + +/** + * @author : 温友朝 + * @date : 2017/5/10 + */ +public class ConcreteHandler extends Handler { + public void doHandler() { + if(getNextHandler() != null){ + System.out.println("还有责任链"); + getNextHandler().doHandler(); + }else{ + System.out.println("自己处理"); + } + } +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConsumeHandler.java b/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConsumeHandler.java new file mode 100644 index 0000000000..df234d2a9e --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConsumeHandler.java @@ -0,0 +1,77 @@ +package designPattern.chainResponsePattern; + +/** + * @author : 温友朝 + * @date : 2017/5/10 + */ +public abstract class ConsumeHandler { + private ConsumeHandler nextHandler; + + public ConsumeHandler getNextHandler() { + return nextHandler; + } + + public void setNextHandler(ConsumeHandler nextHandler) { + this.nextHandler = nextHandler; + } + + /** user申请人 free报销费用 */ + public abstract void doHandler(String user, double free); + + public static void main(String[] args){ +// ConcreteHandler handler1 = new ConcreteHandler(); +// ConcreteHandler handler2 = new ConcreteHandler(); +// handler1.setNextHandler(handler2); +// handler1.doHandler(); + + ProjectHandler projectHandler =new ProjectHandler(); + DeptHandler deptHandler =new DeptHandler(); + GeneralHandler generalHandler =new GeneralHandler(); + projectHandler.setNextHandler(deptHandler); + deptHandler.setNextHandler(generalHandler); + +// projectHandler.doHandler("lwx", 450); +// projectHandler.doHandler("lwx", 600); +// projectHandler.doHandler("zy", 600); + projectHandler.doHandler("zy", 1500); +// projectHandler.doHandler("lwxzy", 1500); + } +} + +//项目经理 +class ProjectHandler extends ConsumeHandler { + + @Override + public void doHandler(String user, double free) { + if (free < 500) { + System.out.println("lwx给予报销:" + free); + } else if (getNextHandler() != null) { + getNextHandler().doHandler(user, free); + } + } +} +//部门经理 +class DeptHandler extends ConsumeHandler { + + @Override + public void doHandler(String user, double free) { + System.out.println("getNextHandler -> " + getNextHandler() == null); + if (free < 1000) { + System.out.println("zy给予报销:" + free); + } else if (getNextHandler() != null) { + getNextHandler().doHandler(user, free); + } + } + } + //总经理 +class GeneralHandler extends ConsumeHandler { + + @Override + public void doHandler(String user, double free) { + if (free >=1000) { + System.out.println("lwxzy给予报销:" + free); + } else if (getNextHandler() != null) { + getNextHandler().doHandler(user, free); + } + } +} diff --git a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/Handler.java b/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/Handler.java new file mode 100644 index 0000000000..07da5aa89d --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/Handler.java @@ -0,0 +1,19 @@ +package designPattern.chainResponsePattern; + +/** + * @author : 温友朝 + * @date : 2017/5/10 + */ +public abstract class Handler { + private Handler nextHandler; + + public Handler getNextHandler() { + return nextHandler; + } + + public void setNextHandler(Handler nextHandler) { + this.nextHandler = nextHandler; + } + + public abstract void doHandler(); +} diff --git a/group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java b/group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java index c776f49f01..c0f5d7d3de 100644 --- a/group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java +++ b/group24/75939388/learning2017/src/main/java/miniJVM/print/ConstantPoolPrinter.java @@ -73,42 +73,6 @@ public void visitUTF8(UTF8Info info) { System.out.print(i + "# = "); ConstantInfo cnst = pool.getConstantInfo(i); cnst.accept(visitor); -// if(cnst instanceof ClassInfo){ -// sb.append("Class "); -// sb.append("#" + ((ClassInfo) cnst).getUtf8Index()); -// sb.append(" //" + ((ClassInfo) cnst).getClassName()); -// }else if(cnst instanceof UTF8Info){ -// sb.append("Utf8 "); -// sb.append(((UTF8Info) cnst).getValue()); -// }else if(cnst instanceof MethodRefInfo){ -// sb.append("MethodRef "); -// sb.append("#" + ((MethodRefInfo) cnst).getClassInfoIndex()); -// sb.append(".").append("#" + ((MethodRefInfo) cnst).getNameAndTypeIndex()); -// sb.append(" //" + ((MethodRefInfo) cnst).getClassName()); -// sb.append("." + ((MethodRefInfo) cnst).getMethodName()); -// sb.append(":" + ((MethodRefInfo) cnst).getParamAndReturnType()); -// }else if(cnst instanceof NameAndTypeInfo){ -// sb.append("NameAndType "); -// sb.append("#" + ((NameAndTypeInfo) cnst).getIndex1()); -// sb.append(":#" + ((NameAndTypeInfo) cnst).getIndex2()); -// sb.append(" //" + ((NameAndTypeInfo) cnst).getName()); -// sb.append(":" + ((NameAndTypeInfo) cnst).getTypeInfo()); -// }else if(cnst instanceof FieldRefInfo){ -// sb.append("Fieldref "); -// sb.append("#" + ((FieldRefInfo) cnst).getClassInfoIndex()); -// sb.append("." + ((FieldRefInfo) cnst).getNameAndTypeIndex()); -// sb.append(" //" + ((FieldRefInfo) cnst).getClassName()); -// sb.append("." + ((FieldRefInfo) cnst).getFieldName()); -// sb.append(":" + ((FieldRefInfo) cnst).getFieldType()); -// }else if(cnst instanceof StringInfo){ -// sb.append("String "); -// sb.append("#" + ((StringInfo) cnst).getIndex()); -// sb.append(" //" + cnst.toString()); -// }else{ -// throw new RuntimeException(cnst.getType() + "not processed"); -// } - -// System.out.println(sb.toString()); } } } diff --git a/group24/75939388/learning2017/src/main/java/multiThread/Main.java b/group24/75939388/learning2017/src/main/java/multiThread/Main.java new file mode 100644 index 0000000000..a4b5f2a0e1 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/multiThread/Main.java @@ -0,0 +1,17 @@ +package multiThread; + +/** + * @author : 温友朝 + * @date : 2017/5/15 + */ +public class Main{ + + public static void main(String[] args){ + MyThread t1 = new MyThread(1); + MyThread t2 = new MyThread(2); + + new Thread(t1).start(); + new Thread(t2).start(); + } + +} diff --git a/group24/75939388/learning2017/src/main/java/multiThread/MyThread.java b/group24/75939388/learning2017/src/main/java/multiThread/MyThread.java new file mode 100644 index 0000000000..60b260b016 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/multiThread/MyThread.java @@ -0,0 +1,36 @@ +package multiThread; + +/** + * @author : 温友朝 + * @date : 2017/5/15 + */ +public class MyThread implements Runnable { + + private volatile int no = 0; + + public MyThread(int no){ + this.no = no; + } + + public void run() { + synchronized (this){ + try{ + /** + * wait和notify方法均可释放对象的锁,但wait同时释放CPU控制权, + * 即它后面的代码停止执行,线程进入阻塞状态,而notify方法不立刻 + * 释放CPU控制权,而是在相应的synchronized(){}语句块执行结束, + * 再自动释放锁。 + */ + //唤醒正在等待的线程,将锁交给JVM + notify(); + for(int i = 0; i < 10; i++){ + System.out.println(no + " = " + i); + } + //执行完毕之后将线程置为等待状态,线程被阻塞 + wait(); + }catch(Exception e){ + e.printStackTrace(); + } + } + } +} From 780e5c0da658810dd6ec9a605eee5699383789a1 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 16 May 2017 13:39:49 +0800 Subject: [PATCH 523/552] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E3=80=82=E4=B8=AA=E4=BA=BA=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=B8=8E=E4=BD=9C=E4=B8=9A=E4=BB=A3=E7=A0=81=E5=88=86=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binaryTree/BinarySearchTree.java | 29 ++++++++ .../binaryTree/BinaryTreeNode.java | 6 +- .../chainResponsePattern/ConcreteHandler.java | 2 +- .../chainResponsePattern/ConsumeHandler.java | 2 +- .../chainResponsePattern/Handler.java | 2 +- .../designPattern/decorator/Beverage.java | 2 +- .../decorator/CondimentDecorator.java | 2 +- .../decorator/beverages/DarkRoast.java | 4 +- .../decorator/beverages/Decaf.java | 4 +- .../decorator/beverages/Espresso.java | 4 +- .../decorator/beverages/HouseBlend.java | 4 +- .../decorator/condiments/Mocha.java | 6 +- .../decorator/condiments/Soy.java | 6 +- .../decorator/condiments/Whip.java | 6 +- .../{ => teePrivate}/multiThread/Main.java | 2 +- .../multiThread/MyThread.java | 2 +- .../binaryTree/BinarySearchTreeTest.java | 67 +++++++++++++++++++ .../designPattern/StarBuzzCoffeeTest.java | 16 ++--- 18 files changed, 131 insertions(+), 35 deletions(-) create mode 100644 group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/chainResponsePattern/ConcreteHandler.java (86%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/chainResponsePattern/ConsumeHandler.java (97%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/chainResponsePattern/Handler.java (85%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/Beverage.java (90%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/CondimentDecorator.java (78%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/beverages/DarkRoast.java (73%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/beverages/Decaf.java (72%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/beverages/Espresso.java (72%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/beverages/HouseBlend.java (72%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/condiments/Mocha.java (74%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/condiments/Soy.java (73%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/designPattern/decorator/condiments/Whip.java (73%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/multiThread/Main.java (89%) rename group24/75939388/learning2017/src/main/java/{ => teePrivate}/multiThread/MyThread.java (97%) create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinarySearchTreeTest.java rename group24/75939388/learning2017/src/test/java/{ => teePrivate}/designPattern/StarBuzzCoffeeTest.java (64%) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java new file mode 100644 index 0000000000..899a824cb4 --- /dev/null +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java @@ -0,0 +1,29 @@ +package basic.dataStructure.binaryTree; + +public class BinarySearchTree { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode getRoot(){ + return root; + } + public T findMin(){ + return null; + } + public T findMax(){ + return null; + } + public int height() { + return -1; + } + public int size() { + return -1; + } + public void remove(T e){ + + } + +} + diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeNode.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeNode.java index b2b96c0349..60783a166b 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeNode.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinaryTreeNode.java @@ -72,9 +72,9 @@ public class BinaryTreeNode { //// //// return dataStr.toString(); //// } - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; public BinaryTreeNode(T data){ this.data=data; diff --git a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConcreteHandler.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConcreteHandler.java similarity index 86% rename from group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConcreteHandler.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConcreteHandler.java index ad29446e99..e7bff87508 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConcreteHandler.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConcreteHandler.java @@ -1,4 +1,4 @@ -package designPattern.chainResponsePattern; +package teePrivate.designPattern.chainResponsePattern; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConsumeHandler.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConsumeHandler.java similarity index 97% rename from group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConsumeHandler.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConsumeHandler.java index df234d2a9e..caed59d020 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/ConsumeHandler.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConsumeHandler.java @@ -1,4 +1,4 @@ -package designPattern.chainResponsePattern; +package teePrivate.designPattern.chainResponsePattern; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/Handler.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/Handler.java similarity index 85% rename from group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/Handler.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/Handler.java index 07da5aa89d..cd71626d95 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/chainResponsePattern/Handler.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/Handler.java @@ -1,4 +1,4 @@ -package designPattern.chainResponsePattern; +package teePrivate.designPattern.chainResponsePattern; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/Beverage.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/Beverage.java similarity index 90% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/Beverage.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/Beverage.java index e68e2e7b82..670c43976e 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/Beverage.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/Beverage.java @@ -1,4 +1,4 @@ -package designPattern.decorator; +package teePrivate.designPattern.decorator; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/CondimentDecorator.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/CondimentDecorator.java similarity index 78% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/CondimentDecorator.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/CondimentDecorator.java index dca6ade059..b2aca74e44 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/CondimentDecorator.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/CondimentDecorator.java @@ -1,4 +1,4 @@ -package designPattern.decorator; +package teePrivate.designPattern.decorator; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/DarkRoast.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/DarkRoast.java similarity index 73% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/DarkRoast.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/DarkRoast.java index 2c39efecf9..0cc4e865f1 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/DarkRoast.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/DarkRoast.java @@ -1,6 +1,6 @@ -package designPattern.decorator.beverages; +package teePrivate.designPattern.decorator.beverages; -import designPattern.decorator.Beverage; +import teePrivate.designPattern.decorator.Beverage; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Decaf.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Decaf.java similarity index 72% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Decaf.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Decaf.java index bb4f757ad4..3d3e341acc 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Decaf.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Decaf.java @@ -1,6 +1,6 @@ -package designPattern.decorator.beverages; +package teePrivate.designPattern.decorator.beverages; -import designPattern.decorator.Beverage; +import teePrivate.designPattern.decorator.Beverage; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Espresso.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Espresso.java similarity index 72% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Espresso.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Espresso.java index dca41cc66c..ef1e8655ec 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/Espresso.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Espresso.java @@ -1,6 +1,6 @@ -package designPattern.decorator.beverages; +package teePrivate.designPattern.decorator.beverages; -import designPattern.decorator.Beverage; +import teePrivate.designPattern.decorator.Beverage; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/HouseBlend.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/HouseBlend.java similarity index 72% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/HouseBlend.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/HouseBlend.java index 8b296aa3cf..894af33db9 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/beverages/HouseBlend.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/HouseBlend.java @@ -1,6 +1,6 @@ -package designPattern.decorator.beverages; +package teePrivate.designPattern.decorator.beverages; -import designPattern.decorator.Beverage; +import teePrivate.designPattern.decorator.Beverage; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Mocha.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Mocha.java similarity index 74% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Mocha.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Mocha.java index 799399332f..e6ded7a0d2 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Mocha.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Mocha.java @@ -1,7 +1,7 @@ -package designPattern.decorator.condiments; +package teePrivate.designPattern.decorator.condiments; -import designPattern.decorator.Beverage; -import designPattern.decorator.CondimentDecorator; +import teePrivate.designPattern.decorator.Beverage; +import teePrivate.designPattern.decorator.CondimentDecorator; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Soy.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Soy.java similarity index 73% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Soy.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Soy.java index ec4873c914..d70934538a 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Soy.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Soy.java @@ -1,7 +1,7 @@ -package designPattern.decorator.condiments; +package teePrivate.designPattern.decorator.condiments; -import designPattern.decorator.Beverage; -import designPattern.decorator.CondimentDecorator; +import teePrivate.designPattern.decorator.Beverage; +import teePrivate.designPattern.decorator.CondimentDecorator; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Whip.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Whip.java similarity index 73% rename from group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Whip.java rename to group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Whip.java index 7b8cce87af..8c04862765 100644 --- a/group24/75939388/learning2017/src/main/java/designPattern/decorator/condiments/Whip.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Whip.java @@ -1,7 +1,7 @@ -package designPattern.decorator.condiments; +package teePrivate.designPattern.decorator.condiments; -import designPattern.decorator.Beverage; -import designPattern.decorator.CondimentDecorator; +import teePrivate.designPattern.decorator.Beverage; +import teePrivate.designPattern.decorator.CondimentDecorator; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/multiThread/Main.java b/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/Main.java similarity index 89% rename from group24/75939388/learning2017/src/main/java/multiThread/Main.java rename to group24/75939388/learning2017/src/main/java/teePrivate/multiThread/Main.java index a4b5f2a0e1..d118318214 100644 --- a/group24/75939388/learning2017/src/main/java/multiThread/Main.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/Main.java @@ -1,4 +1,4 @@ -package multiThread; +package teePrivate.multiThread; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/main/java/multiThread/MyThread.java b/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/MyThread.java similarity index 97% rename from group24/75939388/learning2017/src/main/java/multiThread/MyThread.java rename to group24/75939388/learning2017/src/main/java/teePrivate/multiThread/MyThread.java index 60b260b016..946cf693b6 100644 --- a/group24/75939388/learning2017/src/main/java/multiThread/MyThread.java +++ b/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/MyThread.java @@ -1,4 +1,4 @@ -package multiThread; +package teePrivate.multiThread; /** * @author : 温友朝 diff --git a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinarySearchTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinarySearchTreeTest.java new file mode 100644 index 0000000000..a1cc46e007 --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinarySearchTreeTest.java @@ -0,0 +1,67 @@ +package data_structure.binaryTree; + +import basic.dataStructure.binaryTree.BinarySearchTree; +import basic.dataStructure.binaryTree.BinaryTreeNode; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinarySearchTreeTest { + + BinarySearchTree tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + + } + + @Test + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); + } + + @Test + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } +} diff --git a/group24/75939388/learning2017/src/test/java/designPattern/StarBuzzCoffeeTest.java b/group24/75939388/learning2017/src/test/java/teePrivate/designPattern/StarBuzzCoffeeTest.java similarity index 64% rename from group24/75939388/learning2017/src/test/java/designPattern/StarBuzzCoffeeTest.java rename to group24/75939388/learning2017/src/test/java/teePrivate/designPattern/StarBuzzCoffeeTest.java index 8f04ce4ff1..b8d20f7ce8 100644 --- a/group24/75939388/learning2017/src/test/java/designPattern/StarBuzzCoffeeTest.java +++ b/group24/75939388/learning2017/src/test/java/teePrivate/designPattern/StarBuzzCoffeeTest.java @@ -1,12 +1,12 @@ -package designPattern; +package teePrivate.designPattern; -import designPattern.decorator.Beverage; -import designPattern.decorator.beverages.DarkRoast; -import designPattern.decorator.beverages.Espresso; -import designPattern.decorator.beverages.HouseBlend; -import designPattern.decorator.condiments.Mocha; -import designPattern.decorator.condiments.Soy; -import designPattern.decorator.condiments.Whip; +import teePrivate.designPattern.decorator.Beverage; +import teePrivate.designPattern.decorator.beverages.DarkRoast; +import teePrivate.designPattern.decorator.beverages.Espresso; +import teePrivate.designPattern.decorator.beverages.HouseBlend; +import teePrivate.designPattern.decorator.condiments.Mocha; +import teePrivate.designPattern.decorator.condiments.Soy; +import teePrivate.designPattern.decorator.condiments.Whip; import org.junit.Test; /** From 133b38968273e1bda7c4b1efdc646303043b7181 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 16 May 2017 17:35:33 +0800 Subject: [PATCH 524/552] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chainResponsePattern/ConcreteHandler.java | 16 ---- .../chainResponsePattern/ConsumeHandler.java | 77 ------------------- .../chainResponsePattern/Handler.java | 19 ----- .../designPattern/decorator/Beverage.java | 23 ------ .../decorator/CondimentDecorator.java | 9 --- .../decorator/beverages/DarkRoast.java | 24 ------ .../decorator/beverages/Decaf.java | 24 ------ .../decorator/beverages/Espresso.java | 24 ------ .../decorator/beverages/HouseBlend.java | 23 ------ .../decorator/condiments/Mocha.java | 31 -------- .../decorator/condiments/Soy.java | 31 -------- .../decorator/condiments/Whip.java | 31 -------- .../java/teePrivate/multiThread/Main.java | 17 ---- .../java/teePrivate/multiThread/MyThread.java | 36 --------- .../designPattern/StarBuzzCoffeeTest.java | 35 --------- 15 files changed, 420 deletions(-) delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConcreteHandler.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConsumeHandler.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/Handler.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/Beverage.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/CondimentDecorator.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/DarkRoast.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Decaf.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Espresso.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/HouseBlend.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Mocha.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Soy.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Whip.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/multiThread/Main.java delete mode 100644 group24/75939388/learning2017/src/main/java/teePrivate/multiThread/MyThread.java delete mode 100644 group24/75939388/learning2017/src/test/java/teePrivate/designPattern/StarBuzzCoffeeTest.java diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConcreteHandler.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConcreteHandler.java deleted file mode 100644 index e7bff87508..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConcreteHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package teePrivate.designPattern.chainResponsePattern; - -/** - * @author : 温友朝 - * @date : 2017/5/10 - */ -public class ConcreteHandler extends Handler { - public void doHandler() { - if(getNextHandler() != null){ - System.out.println("还有责任链"); - getNextHandler().doHandler(); - }else{ - System.out.println("自己处理"); - } - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConsumeHandler.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConsumeHandler.java deleted file mode 100644 index caed59d020..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/ConsumeHandler.java +++ /dev/null @@ -1,77 +0,0 @@ -package teePrivate.designPattern.chainResponsePattern; - -/** - * @author : 温友朝 - * @date : 2017/5/10 - */ -public abstract class ConsumeHandler { - private ConsumeHandler nextHandler; - - public ConsumeHandler getNextHandler() { - return nextHandler; - } - - public void setNextHandler(ConsumeHandler nextHandler) { - this.nextHandler = nextHandler; - } - - /** user申请人 free报销费用 */ - public abstract void doHandler(String user, double free); - - public static void main(String[] args){ -// ConcreteHandler handler1 = new ConcreteHandler(); -// ConcreteHandler handler2 = new ConcreteHandler(); -// handler1.setNextHandler(handler2); -// handler1.doHandler(); - - ProjectHandler projectHandler =new ProjectHandler(); - DeptHandler deptHandler =new DeptHandler(); - GeneralHandler generalHandler =new GeneralHandler(); - projectHandler.setNextHandler(deptHandler); - deptHandler.setNextHandler(generalHandler); - -// projectHandler.doHandler("lwx", 450); -// projectHandler.doHandler("lwx", 600); -// projectHandler.doHandler("zy", 600); - projectHandler.doHandler("zy", 1500); -// projectHandler.doHandler("lwxzy", 1500); - } -} - -//项目经理 -class ProjectHandler extends ConsumeHandler { - - @Override - public void doHandler(String user, double free) { - if (free < 500) { - System.out.println("lwx给予报销:" + free); - } else if (getNextHandler() != null) { - getNextHandler().doHandler(user, free); - } - } -} -//部门经理 -class DeptHandler extends ConsumeHandler { - - @Override - public void doHandler(String user, double free) { - System.out.println("getNextHandler -> " + getNextHandler() == null); - if (free < 1000) { - System.out.println("zy给予报销:" + free); - } else if (getNextHandler() != null) { - getNextHandler().doHandler(user, free); - } - } - } - //总经理 -class GeneralHandler extends ConsumeHandler { - - @Override - public void doHandler(String user, double free) { - if (free >=1000) { - System.out.println("lwxzy给予报销:" + free); - } else if (getNextHandler() != null) { - getNextHandler().doHandler(user, free); - } - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/Handler.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/Handler.java deleted file mode 100644 index cd71626d95..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/chainResponsePattern/Handler.java +++ /dev/null @@ -1,19 +0,0 @@ -package teePrivate.designPattern.chainResponsePattern; - -/** - * @author : 温友朝 - * @date : 2017/5/10 - */ -public abstract class Handler { - private Handler nextHandler; - - public Handler getNextHandler() { - return nextHandler; - } - - public void setNextHandler(Handler nextHandler) { - this.nextHandler = nextHandler; - } - - public abstract void doHandler(); -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/Beverage.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/Beverage.java deleted file mode 100644 index 670c43976e..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/Beverage.java +++ /dev/null @@ -1,23 +0,0 @@ -package teePrivate.designPattern.decorator; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public abstract class Beverage { - public static final int TALL = 0; - public static final int GRANDE = 1; - public static final int VENTI = 2; - - - public String description = ""; - public static int size = TALL; - - public String getDescription(){ - return description; - } - - public abstract double cost(); - - public abstract int size(); -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/CondimentDecorator.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/CondimentDecorator.java deleted file mode 100644 index b2aca74e44..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/CondimentDecorator.java +++ /dev/null @@ -1,9 +0,0 @@ -package teePrivate.designPattern.decorator; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public abstract class CondimentDecorator extends Beverage { - public abstract String getDescription(); -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/DarkRoast.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/DarkRoast.java deleted file mode 100644 index 0cc4e865f1..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/DarkRoast.java +++ /dev/null @@ -1,24 +0,0 @@ -package teePrivate.designPattern.decorator.beverages; - -import teePrivate.designPattern.decorator.Beverage; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public class DarkRoast extends Beverage { - - public DarkRoast(){ - description = "Dark Roast"; - } - - @Override - public double cost() { - return 0.99; - } - - @Override - public int size() { - return 0; - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Decaf.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Decaf.java deleted file mode 100644 index 3d3e341acc..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Decaf.java +++ /dev/null @@ -1,24 +0,0 @@ -package teePrivate.designPattern.decorator.beverages; - -import teePrivate.designPattern.decorator.Beverage; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public class Decaf extends Beverage { - - public Decaf(){ - description = "Decaf"; - } - - @Override - public double cost() { - return 1.99; - } - - @Override - public int size() { - return 0; - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Espresso.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Espresso.java deleted file mode 100644 index ef1e8655ec..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/Espresso.java +++ /dev/null @@ -1,24 +0,0 @@ -package teePrivate.designPattern.decorator.beverages; - -import teePrivate.designPattern.decorator.Beverage; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public class Espresso extends Beverage { - - public Espresso(){ - description = "Espresso"; - } - - public double cost() { - return 1.99d; - } - - - @Override - public int size() { - return 0; - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/HouseBlend.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/HouseBlend.java deleted file mode 100644 index 894af33db9..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/beverages/HouseBlend.java +++ /dev/null @@ -1,23 +0,0 @@ -package teePrivate.designPattern.decorator.beverages; - -import teePrivate.designPattern.decorator.Beverage; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public class HouseBlend extends Beverage { - - public HouseBlend(){ - description = "House Blend"; - } - - public double cost() { - return 0.89; - } - - @Override - public int size() { - return 0; - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Mocha.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Mocha.java deleted file mode 100644 index e6ded7a0d2..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Mocha.java +++ /dev/null @@ -1,31 +0,0 @@ -package teePrivate.designPattern.decorator.condiments; - -import teePrivate.designPattern.decorator.Beverage; -import teePrivate.designPattern.decorator.CondimentDecorator; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public class Mocha extends CondimentDecorator { - Beverage beverage; - - public Mocha(Beverage beverage){ - this.beverage = beverage; - - this.description += this.beverage.description + ", Mocha"; - } - - public String getDescription() { - return this.description; - } - - public double cost() { - return 0.2 + beverage.cost(); - } - - @Override - public int size() { - return 0; - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Soy.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Soy.java deleted file mode 100644 index d70934538a..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Soy.java +++ /dev/null @@ -1,31 +0,0 @@ -package teePrivate.designPattern.decorator.condiments; - -import teePrivate.designPattern.decorator.Beverage; -import teePrivate.designPattern.decorator.CondimentDecorator; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public class Soy extends CondimentDecorator { - Beverage beverage; - - public Soy(Beverage beverage){ - this.beverage = beverage; - - this.description += this.beverage.description + ", Soy"; - } - - public String getDescription() { - return this.description; - } - - public double cost() { - return 0.15 + beverage.cost(); - } - - @Override - public int size() { - return 0; - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Whip.java b/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Whip.java deleted file mode 100644 index 8c04862765..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/designPattern/decorator/condiments/Whip.java +++ /dev/null @@ -1,31 +0,0 @@ -package teePrivate.designPattern.decorator.condiments; - -import teePrivate.designPattern.decorator.Beverage; -import teePrivate.designPattern.decorator.CondimentDecorator; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public class Whip extends CondimentDecorator { - Beverage beverage; - - public Whip(Beverage beverage){ - this.beverage = beverage; - - this.description += beverage.description + ", "; - } - - public String getDescription() { - return this.description; - } - - public double cost() { - return 0.1 + beverage.cost(); - } - - @Override - public int size() { - return 0; - } -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/Main.java b/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/Main.java deleted file mode 100644 index d118318214..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/Main.java +++ /dev/null @@ -1,17 +0,0 @@ -package teePrivate.multiThread; - -/** - * @author : 温友朝 - * @date : 2017/5/15 - */ -public class Main{ - - public static void main(String[] args){ - MyThread t1 = new MyThread(1); - MyThread t2 = new MyThread(2); - - new Thread(t1).start(); - new Thread(t2).start(); - } - -} diff --git a/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/MyThread.java b/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/MyThread.java deleted file mode 100644 index 946cf693b6..0000000000 --- a/group24/75939388/learning2017/src/main/java/teePrivate/multiThread/MyThread.java +++ /dev/null @@ -1,36 +0,0 @@ -package teePrivate.multiThread; - -/** - * @author : 温友朝 - * @date : 2017/5/15 - */ -public class MyThread implements Runnable { - - private volatile int no = 0; - - public MyThread(int no){ - this.no = no; - } - - public void run() { - synchronized (this){ - try{ - /** - * wait和notify方法均可释放对象的锁,但wait同时释放CPU控制权, - * 即它后面的代码停止执行,线程进入阻塞状态,而notify方法不立刻 - * 释放CPU控制权,而是在相应的synchronized(){}语句块执行结束, - * 再自动释放锁。 - */ - //唤醒正在等待的线程,将锁交给JVM - notify(); - for(int i = 0; i < 10; i++){ - System.out.println(no + " = " + i); - } - //执行完毕之后将线程置为等待状态,线程被阻塞 - wait(); - }catch(Exception e){ - e.printStackTrace(); - } - } - } -} diff --git a/group24/75939388/learning2017/src/test/java/teePrivate/designPattern/StarBuzzCoffeeTest.java b/group24/75939388/learning2017/src/test/java/teePrivate/designPattern/StarBuzzCoffeeTest.java deleted file mode 100644 index b8d20f7ce8..0000000000 --- a/group24/75939388/learning2017/src/test/java/teePrivate/designPattern/StarBuzzCoffeeTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package teePrivate.designPattern; - -import teePrivate.designPattern.decorator.Beverage; -import teePrivate.designPattern.decorator.beverages.DarkRoast; -import teePrivate.designPattern.decorator.beverages.Espresso; -import teePrivate.designPattern.decorator.beverages.HouseBlend; -import teePrivate.designPattern.decorator.condiments.Mocha; -import teePrivate.designPattern.decorator.condiments.Soy; -import teePrivate.designPattern.decorator.condiments.Whip; -import org.junit.Test; - -/** - * @author : 温友朝 - * @date : 2017/5/5 - */ -public class StarBuzzCoffeeTest { - - @Test - public void test1(){ - Beverage espresso = new Espresso(); - System.out.println(espresso.getDescription() + " cost $" + espresso.cost()); - - Beverage darkRoast = new DarkRoast(); - darkRoast = new Mocha(darkRoast); - darkRoast = new Mocha(darkRoast); - darkRoast = new Whip(darkRoast); - System.out.println(darkRoast.getDescription() + " cost $" + darkRoast.cost()); - - Beverage houseBlend = new HouseBlend(); - houseBlend = new Soy(houseBlend); - houseBlend = new Mocha(houseBlend); - houseBlend = new Whip(houseBlend); - System.out.println(houseBlend.getDescription() + " cost $" + houseBlend.cost()); - } -} From fe7be150fd3bda4606b1fab5193b3cea75bd1e9c Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Tue, 16 May 2017 23:04:31 +0800 Subject: [PATCH 525/552] =?UTF-8?q?FileList=E4=BD=9C=E4=B8=9A=E8=A1=A5?= =?UTF-8?q?=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataStructure/binaryTree/FileList.java | 51 ++++++++++++++++++- .../dataStructure/stack/expr/Calculator.java | 1 + .../binaryTree/FileListTest.java | 28 ++++++++++ .../src/test/java/thread/ThreadTest.java | 27 ++++++++++ 4 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 group24/75939388/learning2017/src/test/java/data_structure/binaryTree/FileListTest.java create mode 100644 group24/75939388/learning2017/src/test/java/thread/ThreadTest.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/FileList.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/FileList.java index 7d7af85490..8beb22f031 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/FileList.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/FileList.java @@ -2,9 +2,56 @@ import java.io.File; +/** + * 给定一个目录,递归的列出下面所有的子目录和文件 + * + */ public class FileList { - public void list(File f) { + + public void list(File f, int level) { + if(!f.exists()){ + throw new RuntimeException("file " + f.getAbsolutePath() + " not existed"); + } + + StringBuilder head = new StringBuilder(); + head.append("|--").append(f.getName()); + System.out.println(head.toString()); + + File[] files = f.listFiles(); + for(File file : files){ + if(file.isDirectory()){ + printDirectory(file, level + 1); + }else{ + printFile(file, level); + } + } + } - + private void printDirectory(File f, int level){ + StringBuilder builder = new StringBuilder(); + for(int i = 0; i < level; i++){ + builder.append(" "); + } + builder.append("|--").append(f.getName()); + System.out.println(builder.toString()); + + File[] files = f.listFiles(); + for(File file : files){ + if(file.isDirectory()){ + printDirectory(file, level + 1); + }else{ + printFile(file, level); + } + } + } + + private void printFile(File f, int level){ + StringBuilder builder = new StringBuilder(); + for(int i = 0; i < level + 1; i++){ + builder.append(" "); + } + builder.append("|->").append(f.getName()); + System.out.println(builder.toString()); + } } diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Calculator.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Calculator.java index fe6510b532..236751360b 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Calculator.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/stack/expr/Calculator.java @@ -17,6 +17,7 @@ public static float getFloat(float val1, float val2, String oper) { if (val2 == 0) throw new RuntimeException("cannot divide 0, calculation canceled"); res = val1 / val2; } + // System.out.println("计算结果: " + val1 + oper + val2 + "=" + res); return res; } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/FileListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/FileListTest.java new file mode 100644 index 0000000000..56e7da0eaf --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/FileListTest.java @@ -0,0 +1,28 @@ +package data_structure.binaryTree; + +import basic.dataStructure.binaryTree.FileList; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; + +/** + * Created by macvi on 2017/5/16. + */ +public class FileListTest { + + FileList fl = null; + + @Before + public void init(){ + fl = new FileList(); + } + + @Test + public void test(){ + String path1 = "E:\\Downloads"; + String path2 = "E:\\系统ISO"; + + fl.list(new File(path2), 0); + } +} diff --git a/group24/75939388/learning2017/src/test/java/thread/ThreadTest.java b/group24/75939388/learning2017/src/test/java/thread/ThreadTest.java new file mode 100644 index 0000000000..8463d6e4ab --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/thread/ThreadTest.java @@ -0,0 +1,27 @@ +package thread; + +/** + * Created by macvi on 2017/5/3. + */ +public class ThreadTest extends Thread { + boolean stop = false; + int value = 0; + public void run() { + while (!stop) { + value++; + } + } + public static void main(String[] args) + throws Exception { + + ThreadTest t = new ThreadTest(); + t.start(); + Thread.sleep(2000); + t.stop = true; + System.out.println("value = " + t.value); + Thread.sleep(2000); + System.out.println("value = " + t.value); + + } +} + From 573bfe6f88b42546fba9965930b308aaabbd9f29 Mon Sep 17 00:00:00 2001 From: lzb Date: Wed, 17 May 2017 00:47:06 +0800 Subject: [PATCH 526/552] =?UTF-8?q?=E6=95=B4=E7=90=86=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group24/1148285693/learning2017/.gitignore | 3 - .../java/me/lzb/common/utils/AppUtils.java | 3 +- .../java/me/lzb/common/utils/ByteUtils.java | 10 +- .../java/me/lzb/common/utils/FileUtils.java | 5 +- .../java/me/lzb/common/utils/StringUtils.java | 2 +- .../main/java/me/lzb/basic/LRUPageFrame.java | 117 +++++++++--------- .../main/java/me/lzb/basic/expr/CalUtil.java | 2 +- .../java/me/lzb/basic/expr/InfixExpr.java | 3 +- .../me/lzb/basic/expr/InfixToPostfix.java | 3 +- .../src/main/java/me/lzb/basic/expr/Node.java | 4 +- .../java/me/lzb/basic/expr/PostfixExpr.java | 3 +- .../java/me/lzb/basic/expr/PrefixExpr.java | 3 +- .../java/me/lzb/basic/list/ArrayList.java | 3 +- .../java/me/lzb/basic/list/ArrayUtil.java | 72 +++++------ .../main/java/me/lzb/basic/list/Iterator.java | 7 +- .../java/me/lzb/basic/list/LinkedList.java | 86 ++++++------- .../src/main/java/me/lzb/basic/list/List.java | 17 ++- .../java/me/lzb/basic/queue/CircleQueue.java | 10 +- .../java/me/lzb/basic/queue/Josephus.java | 3 +- .../main/java/me/lzb/basic/queue/Queue.java | 41 +++--- .../lzb/basic/queue/QueueWithTwoStacks.java | 3 +- .../me/lzb/basic/stack/QuickMinStack.java | 2 + .../main/java/me/lzb/basic/stack/Stack.java | 3 +- .../java/me/lzb/basic/stack/StackUtil.java | 3 + .../lzb/basic/stack/TwoStackInOneArray.java | 2 + .../main/java/me/lzb/basic/tree/BTNode.java | 53 -------- .../me/lzb/basic/tree/BinarySearchTree.java | 40 ++++-- .../me/lzb/basic/tree/BinaryTreeNode.java | 52 ++++++-- .../me/lzb/basic/tree/BinaryTreeUtil.java | 12 +- .../java/me/lzb/download/DownloadThread.java | 3 + .../java/me/lzb/download/api/Connection.java | 38 +++--- .../lzb/download/api/ConnectionManager.java | 16 ++- .../me/lzb/download/impl/ConnectionImpl.java | 32 +++-- .../download/impl/ConnectionManagerImpl.java | 3 + .../java/me/lzb/litestruts/LoginAction.java | 27 ++-- .../main/java/me/lzb/litestruts/Struts.java | 26 ++-- .../src/main/java/me/lzb/litestruts/View.java | 38 +++--- .../main/java/me/lzb/litestruts/XmlUtil.java | 3 +- .../test/java/me/lzb/basic/FileListTest.java | 3 +- .../java/me/lzb/basic/LRUPageFrameTest.java | 41 +++--- .../java/me/lzb/basic/expr/InfixExprTest.java | 76 ++++++------ .../me/lzb/basic/expr/InfixToPostfixTest.java | 2 +- .../me/lzb/basic/expr/PostfixExprTest.java | 55 ++++---- .../me/lzb/basic/expr/PrefixExprTest.java | 68 +++++----- .../java/me/lzb/basic/list/ArrayListTest.java | 7 +- .../me/lzb/basic/list/LinkedListTest.java | 5 +- .../java/me/lzb/basic/queue/JosephusTest.java | 4 +- .../java/me/lzb/basic/queue/QueueTest.java | 2 +- .../java/me/lzb/basic/stack/StackTest.java | 2 +- .../me/lzb/basic/stack/StackUtilTest.java | 116 ++++++++--------- .../lzb/basic/tree/BinarySearchTreeTest.java | 17 ++- .../me/lzb/basic/tree/BinaryTreeUtilTest.java | 1 - .../java/me/lzb/download/ConnectionTest.java | 6 +- .../me/lzb/download/FileDownloaderTest.java | 3 + .../java/me/lzb/litestruts/StrutsTest.java | 36 +++--- .../src/test/resources/litestruts/struts.xml | 4 +- .../java/me/lzb/jvm/attr/AttributeInfo.java | 2 +- .../main/java/me/lzb/jvm/attr/CodeAttr.java | 2 +- .../java/me/lzb/jvm/attr/ConstantValue.java | 1 - .../java/me/lzb/jvm/attr/LineNumberItem.java | 2 +- .../java/me/lzb/jvm/attr/LineNumberTable.java | 2 +- .../me/lzb/jvm/attr/LocalVariableItem.java | 4 +- .../me/lzb/jvm/attr/LocalVariableTable.java | 2 +- .../java/me/lzb/jvm/attr/StackMapTable.java | 2 +- .../main/java/me/lzb/jvm/clz/AccessFlag.java | 8 +- .../main/java/me/lzb/jvm/clz/ClassFile.java | 4 +- .../main/java/me/lzb/jvm/clz/ClassIndex.java | 2 +- .../main/java/me/lzb/jvm/cmd/BiPushCmd.java | 3 + .../java/me/lzb/jvm/cmd/ByteCodeCommand.java | 4 +- .../java/me/lzb/jvm/cmd/ComparisonCmd.java | 1 - .../main/java/me/lzb/jvm/cmd/GetFieldCmd.java | 5 +- .../me/lzb/jvm/cmd/GetStaticFieldCmd.java | 3 + .../java/me/lzb/jvm/cmd/IncrementCmd.java | 2 +- .../java/me/lzb/jvm/cmd/InvokeSpecialCmd.java | 4 +- .../java/me/lzb/jvm/cmd/InvokeVirtualCmd.java | 3 + .../src/main/java/me/lzb/jvm/cmd/LdcCmd.java | 3 + .../java/me/lzb/jvm/cmd/NewObjectCmd.java | 3 + .../java/me/lzb/jvm/cmd/NoOperandCmd.java | 3 + .../java/me/lzb/jvm/cmd/OneOperandCmd.java | 3 + .../main/java/me/lzb/jvm/cmd/PutFieldCmd.java | 4 +- .../java/me/lzb/jvm/cmd/TwoOperandCmd.java | 4 +- .../java/me/lzb/jvm/constant/ClassInfo.java | 6 +- .../me/lzb/jvm/constant/ConstantInfo.java | 2 +- .../me/lzb/jvm/constant/ConstantPool.java | 13 +- .../me/lzb/jvm/constant/FieldRefInfo.java | 2 +- .../me/lzb/jvm/constant/MethodRefInfo.java | 18 +-- .../me/lzb/jvm/constant/NameAndTypeInfo.java | 2 +- .../me/lzb/jvm/constant/NullConstantInfo.java | 4 +- .../java/me/lzb/jvm/constant/StringInfo.java | 5 +- .../java/me/lzb/jvm/constant/UTF8Info.java | 2 +- .../me/lzb/jvm/engine/ExecutionResult.java | 3 + .../me/lzb/jvm/engine/ExecutorEngine.java | 4 +- .../src/main/java/me/lzb/jvm/engine/Heap.java | 9 +- .../java/me/lzb/jvm/engine/JavaObject.java | 3 + .../java/me/lzb/jvm/engine/MethodArea.java | 3 + .../main/java/me/lzb/jvm/engine/MiniJVM.java | 4 +- .../java/me/lzb/jvm/engine/StackFrame.java | 4 +- .../src/main/java/me/lzb/jvm/field/Field.java | 7 +- .../me/lzb/jvm/loader/ClassFileLoader.java | 4 +- .../me/lzb/jvm/loader/ClassFileParser.java | 3 +- .../java/me/lzb/jvm/loader/CommandParser.java | 2 +- .../main/java/me/lzb/jvm/method/Method.java | 2 +- .../java/me/lzb/jvm/print/ClassPrinter.java | 2 +- .../me/lzb/jvm/print/ExecutionFormat.java | 2 +- .../me/lzb/jvm/print/ExecutionVisitor.java | 2 +- .../src/main/java/me/lzb/jvm/print/Print.java | 2 +- .../java/me/lzb/jvm/print/PrintFormat.java | 3 +- .../java/me/lzb/jvm/print/PrintVisitor.java | 2 +- .../java/me/lzb/jvm/ClassFileloaderTest.java | 6 +- .../src/test/java/me/lzb/jvm/EmployeeV1.java | 20 +-- .../src/test/java/me/lzb/jvm/EmployeeV2.java | 1 - .../test/java/me/lzb/jvm/HourlyEmployee.java | 1 - .../src/test/java/me/lzb/jvm/MiniJVMTest.java | 33 ++--- 113 files changed, 780 insertions(+), 673 deletions(-) delete mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BTNode.java diff --git a/group24/1148285693/learning2017/.gitignore b/group24/1148285693/learning2017/.gitignore index 556caf3bbd..d0a68ed136 100644 --- a/group24/1148285693/learning2017/.gitignore +++ b/group24/1148285693/learning2017/.gitignore @@ -34,6 +34,3 @@ logs *.bak .directory .DS_Store - - -Test.java diff --git a/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/AppUtils.java b/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/AppUtils.java index 906c88e747..cb9a6bce28 100644 --- a/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/AppUtils.java +++ b/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/AppUtils.java @@ -1,12 +1,13 @@ package me.lzb.common.utils; /** - * Created by lzbfe on 2017/4/29. + * @author LZB */ public class AppUtils { /** * 获取一个数的位数 + * * @param i * @return */ diff --git a/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/ByteUtils.java b/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/ByteUtils.java index f6586ce761..b001584850 100644 --- a/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/ByteUtils.java +++ b/group24/1148285693/learning2017/common/src/main/java/me/lzb/common/utils/ByteUtils.java @@ -1,17 +1,17 @@ package me.lzb.common.utils; /** - * Created by LZB on 2017/4/14. + * @author LZB */ public class ByteUtils { - public static String byteToHexString(byte[] codes ){ + public static String byteToHexString(byte[] codes) { StringBuffer buffer = new StringBuffer(); - for(int i=0;i= capacity){ + if (size >= capacity) { removeLastOne(); } - } + } /** * 删除最后一个节点 */ - private void removeLastOne(){ + private void removeLastOne() { last = last.prev; //使GC ROOT 不可达 last.next.prev = null; @@ -98,17 +98,18 @@ private void removeLastOne(){ /** * 把某节点移动到最顶部 + * * @param tmp 在链表中的任意节点 */ - private void moveToFirst(Node tmp){ - if(tmp == first){ - return; + private void moveToFirst(Node tmp) { + if (tmp == first) { + return; } - if (tmp.next != null){ + if (tmp.next != null) { tmp.next.prev = tmp.prev; tmp.prev.next = tmp.next; - }else { + } else { tmp.prev.next = null; //当这个节点是last的时候,更新last last = tmp.prev; @@ -123,47 +124,49 @@ private void moveToFirst(Node tmp){ /** * 在顶部增加一个节点 + * * @param node node */ - private void addAsFirst(Node node){ + private void addAsFirst(Node node) { first.prev = node; first = node; } - /** * ASC + * * @return */ - public String toString(){ - StringBuilder buffer = new StringBuilder(); - Node node = first; - while(node != null){ - buffer.append(node.pageNum); + 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(); - } + node = node.next; + if (node != null) { + buffer.append(","); + } + } + return buffer.toString(); + } /** * DESC + * * @return */ - public String toStringDESC(){ + public String toStringDESC() { StringBuilder buffer = new StringBuilder(); Node node = last; - while(node != null){ + while (node != null) { buffer.append(node.pageNum); node = node.prev; - if(node != null){ + if (node != null) { buffer.append(","); } } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java index 5b52ab0863..426e0c50ba 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/CalUtil.java @@ -7,7 +7,7 @@ import java.util.Stack; /** - * Created by LZB on 2017/4/20. + * @author LZB */ public class CalUtil { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java index 833ee8cfda..e2618c5b19 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixExpr.java @@ -5,7 +5,8 @@ /** * 中序表达式 - * Created by LZB on 2017/4/15. + * + * @author LZB */ public class InfixExpr { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java index d9b1d3e5a6..1e177ee3bc 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/InfixToPostfix.java @@ -5,7 +5,8 @@ /** * 中序转后序 - * Created by LZB on 2017/4/20. + * + * @author LZB */ public class InfixToPostfix { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java index 1c698f1101..371688ac84 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/Node.java @@ -1,7 +1,7 @@ package me.lzb.basic.expr; /** - * Created by LZB on 2017/4/20. + * @author LZB */ public class Node { float number; @@ -22,7 +22,7 @@ public boolean isLevel3() { return calLevel == 3; } - public boolean isNumber(){ + public boolean isNumber() { return calLevel == -1; } } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java index 22a0db2ee0..c1e844820c 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PostfixExpr.java @@ -6,7 +6,8 @@ /** * 后缀表达式 - * Created by LZB on 2017/4/20. + * + * @author LZB */ public class PostfixExpr { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java index 27b7b2f52d..392d9b5b3d 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/expr/PrefixExpr.java @@ -6,7 +6,8 @@ /** * 前缀表达式 - * Created by LZB on 2017/4/20. + * + * @author LZB */ public class PrefixExpr { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayList.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayList.java index a999b662f1..f56eae6ec7 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayList.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayList.java @@ -2,7 +2,8 @@ /** * 简易ArrayList - * Created by LZB on 2017/3/11. + * + * @author LZB */ public class ArrayList implements List { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayUtil.java index dcfa9c39f6..5d0b617698 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayUtil.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/ArrayUtil.java @@ -1,5 +1,8 @@ package me.lzb.basic.list; +/** + * @author LZB + */ public class ArrayUtil { /** @@ -68,9 +71,9 @@ public int[] merge(int[] array1, int[] array2) { int a1 = array1[0]; int a2 = array2[0]; - if(a1 < a2){ + if (a1 < a2) { mini = a1; - }else { + } else { mini = a2; } @@ -88,11 +91,10 @@ public int[] merge(int[] array1, int[] array2) { int oldMin = mini; - int aa1 = mini; - if(mini < array1[array1.length - 1] ){ + if (mini < array1[array1.length - 1]) { for (int j = 0; j < array1.length; j++) { - if(array1[j] > mini){ + if (array1[j] > mini) { aa1 = array1[j]; break; } @@ -101,9 +103,9 @@ public int[] merge(int[] array1, int[] array2) { } int aa2 = mini; - if(mini < array2[array2.length - 1] ){ + if (mini < array2[array2.length - 1]) { for (int j = 0; j < array2.length; j++) { - if(array2[j] > mini){ + if (array2[j] > mini) { aa2 = array2[j]; break; } @@ -111,20 +113,20 @@ public int[] merge(int[] array1, int[] array2) { } - if(aa1 != oldMin && aa2 != oldMin){ - if(aa1 < aa2){ + if (aa1 != oldMin && aa2 != oldMin) { + if (aa1 < aa2) { mini = aa1; - }else { + } else { mini = aa2; } - }else if(aa1 != oldMin){ + } else if (aa1 != oldMin) { mini = aa1; - }else { + } else { mini = aa2; } - if(oldMin == mini){ + if (oldMin == mini) { l3 = i; break; } @@ -137,13 +139,10 @@ public int[] merge(int[] array1, int[] array2) { System.arraycopy(tmp, 0, result, 0, l3); - return result; } - - /** * 把一个已经存满数据的数组 oldArray的容量进行扩展, 扩展后的新数据大小为oldArray.length + size * 注意,老数组的元素在新数组中需要保持 @@ -170,7 +169,7 @@ public int[] grow(int[] oldArray, int size) { * @return */ public int[] fibonacci(int max) { - if (max <= 1){ + if (max <= 1) { return new int[0]; } @@ -181,12 +180,12 @@ public int[] fibonacci(int max) { int n = 0; - while (n < max){ + while (n < max) { int[] t = new int[result.length + 1]; System.arraycopy(result, 0, t, 0, result.length); - n = t[i-1] + t[i - 2]; + n = t[i - 1] + t[i - 2]; - if(n >= max){ + if (n >= max) { return result; } @@ -208,29 +207,29 @@ public int[] fibonacci(int max) { * @return */ public int[] getPrimes(int max) { - if (max <= 2){ + if (max <= 2) { return new int[0]; } - if (max == 3){ + if (max == 3) { return new int[]{2}; } - int[] primes = new int[max+1]; + int[] primes = new int[max + 1]; primes[0] = 2; int count = 1; for (int i = 3; i < max; i = i + 2) { boolean isPrime = true; for (int j = 3; j < i; j++) { - if(i % j == 0){ + if (i % j == 0) { isPrime = false; break; } } - if(isPrime){ + if (isPrime) { primes[count] = i; count = count + 1; } @@ -243,7 +242,7 @@ public int[] getPrimes(int max) { } - private boolean isPrime(int a){ + private boolean isPrime(int a) { if (a < 2) { return false; } @@ -252,13 +251,13 @@ private boolean isPrime(int a){ return true; } - if(a % 2 == 0){ + if (a % 2 == 0) { return false; } for (int i = 3; i < a; i = i + 2) { - if(a % i == 0){ + if (a % i == 0) { return false; } } @@ -267,7 +266,6 @@ private boolean isPrime(int a){ } - /** * 所谓“完数”, 是指这个数恰好等于它的真因子之和,例如6=1+2+3 * 给定一个最大值max, 返回一个数组, 数组中是小于max 的所有完数 @@ -276,7 +274,7 @@ private boolean isPrime(int a){ * @return */ public int[] getPerfectNumbers(int max) { - if (max < 6){ + if (max < 6) { return new int[0]; } @@ -285,28 +283,27 @@ public int[] getPerfectNumbers(int max) { int count = 0; for (int i = 6; i < max; i++) { - if (isPerfectNumber(i)){ + if (isPerfectNumber(i)) { pns[count] = i; count = count + 1; } } - int[] result = new int[count]; System.arraycopy(pns, 0, result, 0, count); return result; } - private boolean isPerfectNumber(int a){ - if(a < 6){ + private boolean isPerfectNumber(int a) { + if (a < 6) { return false; } int sum = 0; for (int i = 1; i < a; i++) { - if(a % i == 0){ + if (a % i == 0) { sum = sum + i; } } @@ -315,7 +312,6 @@ private boolean isPerfectNumber(int a){ } - /** * 用seperator 把数组 array给连接起来 * 例如array= [3,8,9], seperator = "-" @@ -324,10 +320,10 @@ private boolean isPerfectNumber(int a){ * @param array * @return */ - public static String join(int[] array, String seperator) { + public static String join(int[] array, String seperator) { String result = ""; for (int i = 0; i < array.length; i++) { - result = result + array[i] + seperator ; + result = result + array[i] + seperator; } result = result.substring(0, result.length() - 1); diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/Iterator.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/Iterator.java index d6122132cc..40a7323be0 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/Iterator.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/Iterator.java @@ -1,10 +1,11 @@ package me.lzb.basic.list; /** - * Created by LZB on 2017/3/11. + * @author LZB */ public interface Iterator { - public boolean hasNext(); - public Object next(); + boolean hasNext(); + + Object next(); } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/LinkedList.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/LinkedList.java index f55c92cdc6..02fcbb05ee 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/LinkedList.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/list/LinkedList.java @@ -3,7 +3,8 @@ /** * 简易LinkedList - * Created by LZB on 2017/3/11. + * + * @author LZB */ public class LinkedList implements List { @@ -32,7 +33,7 @@ public Node(Object data, Node next) { } -// public void add(int i) { + // public void add(int i) { // if (first == null) { // first = new Node(null, null, i); // last = first; @@ -100,7 +101,7 @@ public void add(int index, Object o) throws IndexOutOfBoundsException { } - private Node getNode(int index){ + private Node getNode(int index) { if (size == 0 || index < 0 || index >= size) { throw new IndexOutOfBoundsException("index boom"); } @@ -159,12 +160,6 @@ public Object remove(int index) { } - - - - - - public int size() { return size; } @@ -231,7 +226,7 @@ public void reverse() { //还可以用堆栈 先进后出 - if(size() <= 1){ + if (size() <= 1) { return; } Object[] array = new Object[size]; @@ -242,7 +237,7 @@ public void reverse() { } this.first = null; this.last = null; - for (int i = array.length - 1; i >= 0 ; i--) { + for (int i = array.length - 1; i >= 0; i--) { add(array[i]); } @@ -255,10 +250,10 @@ public void reverse() { */ public void removeFirstHalf() { - if (size <= 1){ + if (size <= 1) { return; } - int b = size/ 2; + int b = size / 2; Node n = getNode(b); this.first = n; size = (size % 2) + b; @@ -271,21 +266,21 @@ public void removeFirstHalf() { * @param length */ public void remove(int i, int length) { - if (size == 0 || i < 0 || i >= size){ + if (size == 0 || i < 0 || i >= size) { return; } length = size - i >= length ? length : size - i; - if(i + length == size){ + if (i + length == size) { this.first = null; this.last = null; size = 0; return; } - if(i == 0){ + if (i == 0) { Node n = getNode(length); first = n; size = size - length; @@ -310,24 +305,23 @@ public void remove(int i, int length) { */ public int[] getElements(LinkedList list) { - if(size <= 0 || list.size() <= 0){ + if (size <= 0 || list.size() <= 0) { return new int[0]; } - int[] result = new int[list.size()]; Node tmp = list.first; int index = 0; Node tmp2 = first; for (int i = 0; i < list.size(); i++) { - int newIndex = (int)tmp.data; + int newIndex = (int) tmp.data; int maxJ = newIndex - index; for (int j = 0; j <= maxJ; j++) { - if(j == maxJ){ - result[i] = (int)tmp2.data; + if (j == maxJ) { + result[i] = (int) tmp2.data; break; } tmp2 = tmp2.next; @@ -356,19 +350,19 @@ public void subtract(LinkedList list) { } - public void remove(Object obj){ - if(size <= 0){ + public void remove(Object obj) { + if (size <= 0) { return; } - if(first.data.equals(obj)){ - first=first.next; + if (first.data.equals(obj)) { + first = first.next; size = size - 1; return; } Node tmp = first; Node tmp2 = first.next; for (int i = 1; i < size; i++) { - if(tmp2.data.equals(obj)){ + if (tmp2.data.equals(obj)) { tmp.next = tmp2.next; size = size - 1; return; @@ -385,16 +379,16 @@ public void remove(Object obj){ * 删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同) */ public void removeDuplicateValues() { - if(size <= 1){ + if (size <= 1) { return; } Node tmp = first; for (int i = 1; i < size; i++) { - if(tmp.next == null){ + if (tmp.next == null) { break; } - if (tmp.data.equals(tmp.next.data)){ + if (tmp.data.equals(tmp.next.data)) { tmp.next = tmp.next.next; } tmp = tmp.next; @@ -410,7 +404,7 @@ public void removeDuplicateValues() { * @param max */ public void removeRange(int min, int max) { - if(size <= 0){ + if (size <= 0) { return; } @@ -418,11 +412,11 @@ public void removeRange(int min, int max) { int a = -1; int b = -1; for (int i = 0; i < size; i++) { - if((int)tmp.data > min && a == -1){ + if ((int) tmp.data > min && a == -1) { a = i; } - if((int)tmp.data >= max && b == -1){ + if ((int) tmp.data >= max && b == -1) { b = i; } @@ -430,24 +424,23 @@ public void removeRange(int min, int max) { } - if(min < max){ + if (min < max) { remove(a, b - a); return; } - if(min == max){ + if (min == max) { } - if(min > max){ + if (min > max) { } - return; } @@ -460,27 +453,27 @@ public void removeRange(int min, int max) { public LinkedList intersection(LinkedList list) { LinkedList result = new LinkedList(); - if(list == null || list.size <= 0 || size <= 0){ + if (list == null || list.size <= 0 || size <= 0) { return result; } int i1 = 0; int i2 = 0; - while( i1 < this.size && i2 - * Created by LZB on 2017/4/27. + * + * @author LZB */ public class CircleQueue { - public CircleQueue(){ + public CircleQueue() { DEFAULT_SIZE = 10; } - public CircleQueue(int size){ - if(size <= 0){ + public CircleQueue(int size) { + if (size <= 0) { size = 10; } DEFAULT_SIZE = size; diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Josephus.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Josephus.java index 8fcddcfb2c..0b2278e652 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Josephus.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Josephus.java @@ -6,7 +6,8 @@ * 用Queue来实现Josephus问题 * 在这个古老的问题当中, N个深陷绝境的人一致同意用这种方式减少生存人数: N个人围成一圈(位置记为0到N-1), 并且从第一个人报数, 报到M的人会被杀死, 直到最后一个人留下来 * 该方法返回一个List, 包含了被杀死人的次序 - * Created by LZB on 2017/4/27. + * + * @author LZB */ public class Josephus { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java index b1ef522855..cacdc8e028 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/Queue.java @@ -4,30 +4,31 @@ /** * 先进先出 - * Created by LZB on 2017/3/11. + * + * @author LZB */ public class Queue { - LinkedList elementData = new LinkedList(); + LinkedList elementData = new LinkedList(); - public void enQueue(Object o){ - elementData.add(o); - } + public void enQueue(Object o) { + elementData.add(o); + } - public Object deQueue() throws IndexOutOfBoundsException{ - if(isEmpty()){ - throw new IndexOutOfBoundsException("index boom"); - } - return elementData.remove(elementData.size() - 1); - } + public Object deQueue() throws IndexOutOfBoundsException { + if (isEmpty()) { + throw new IndexOutOfBoundsException("index boom"); + } + return elementData.remove(elementData.size() - 1); + } - public boolean isEmpty(){ - if(elementData.size() <= 0){ - return true; - } - return false; - } + public boolean isEmpty() { + if (elementData.size() <= 0) { + return true; + } + return false; + } - public int size(){ - return elementData.size(); - } + public int size() { + return elementData.size(); + } } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/QueueWithTwoStacks.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/QueueWithTwoStacks.java index 65c3b45fae..dcb8b52701 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/QueueWithTwoStacks.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/queue/QueueWithTwoStacks.java @@ -4,7 +4,8 @@ /** * 用两个栈来实现一个队列 - * Created by LZB on 2017/4/27. + * + * @author LZB */ public class QueueWithTwoStacks { private Stack stack1;//ASC diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/QuickMinStack.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/QuickMinStack.java index d6250bae89..7bf7dcb833 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/QuickMinStack.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/QuickMinStack.java @@ -5,6 +5,8 @@ /** * 设计一个栈,支持栈的push和pop操作,以及第三种操作findMin, 它返回改数据结构中的最小元素 * finMin操作最坏的情形下时间复杂度应该是O(1) , 简单来讲,操作一次就可以得到最小值 + * + * @author LZB */ public class QuickMinStack { private int mini; diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java index a5469ff8ce..d76eabc3c4 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/Stack.java @@ -4,7 +4,8 @@ /** * 先进后出 - * Created by LZB on 2017/3/11. + * + * @author LZB */ public class Stack { private ArrayList elementData = new ArrayList(); diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackUtil.java index f728f54630..3563871cea 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackUtil.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/StackUtil.java @@ -2,6 +2,9 @@ import java.util.Stack; +/** + * @author LZB + */ public class StackUtil { public static void bad_reverse(Stack s) { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/TwoStackInOneArray.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/TwoStackInOneArray.java index 4e76b55a7b..1dbc04dbb2 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/TwoStackInOneArray.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/stack/TwoStackInOneArray.java @@ -3,6 +3,8 @@ /** * 用一个数组实现两个栈 * 将数组的起始位置看作是第一个栈的栈底,将数组的尾部看作第二个栈的栈底,压栈时,栈顶指针分别向中间移动,直到两栈顶指针相遇,则扩容。 + * + * @author LZB */ public class TwoStackInOneArray { private final int growsize = 10; diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BTNode.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BTNode.java deleted file mode 100644 index ee0b9d6e33..0000000000 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BTNode.java +++ /dev/null @@ -1,53 +0,0 @@ -package me.lzb.basic.tree; - -/** - * 左边比父节点小,右边比父节点大 - * Created by LZB on 2017/3/11. - */ -public class BTNode { - - private int data; - private BTNode left; - private BTNode right; - - public BTNode(int data){ - this.data = data; - } - - public int getData() { - return data; - } - - - //这层满了就下一层继续add,直到找到空位 - public void add(int d){ - BTNode b = new BTNode(d); - if(compareTo(b)){ - //比父节点小,左边 - if(this.left == null){ - this.left = b; - }else { - this.left.add(d); - } - - }else {//相等不考虑 - //比父节点大,右边 - if(this.right == null){ - this.right = b; - }else { - this.right.add(d); - } - - } - } - - - public boolean compareTo(BTNode node){ - if(this.data > node.getData()){ - return true; - } - return false; - } - - -} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java index a235cf0c5e..c14e741219 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java @@ -2,29 +2,51 @@ /** * @author LZB - * @date 2017/5/16 */ -public class BinarySearchTree { +public class BinarySearchTree> { BinaryTreeNode root; - public BinarySearchTree(BinaryTreeNode root){ + + public BinarySearchTree(BinaryTreeNode root) { this.root = root; } - public BinaryTreeNode getRoot(){ + + public BinaryTreeNode getRoot() { return root; } - public T findMin(){ - return null; + + public T findMin() { + if (this.root == null) { + throw new RuntimeException("empty tree"); + } + BinaryTreeNode result = this.root; + while (result.getLeft() != null) { + result = result.getLeft(); + } + return result.getData(); } - public T findMax(){ - return null; + + public T findMax() { + if (this.root == null) { + throw new RuntimeException("empty tree"); + } + BinaryTreeNode result = this.root; + while (result.getRight() != null) { + result = result.getRight(); + } + return result.getData(); } + public int height() { + + return -1; } + public int size() { return -1; } - public void remove(T e){ + + public void remove(T e) { } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java index 92a043d6c4..2815246b0c 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java @@ -3,10 +3,10 @@ /** * @author LZB */ -public class BinaryTreeNode { - public T data; - public BinaryTreeNode left; - public BinaryTreeNode right; +public class BinaryTreeNode> { + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; public BinaryTreeNode(T data) { this.data = data; @@ -16,9 +16,9 @@ public T getData() { return data; } - public void setData(T data) { - this.data = data; - } +// public void setData(T data) { +// this.data = data; +// } public BinaryTreeNode getLeft() { return left; @@ -36,8 +36,42 @@ public void setRight(BinaryTreeNode right) { this.right = right; } - public BinaryTreeNode insert(Object o) { - return null; + + /** + * 左边比父节点小,右边比父节点大 + * 这层满了就下一层继续add,直到找到空位 + * + * @param d data + */ + public void insert(T d) { + BinaryTreeNode b = new BinaryTreeNode(d); + if (isSmaller(d)) { + //比父节点小,左边 + if (this.left == null) { + this.left = b; + } else { + this.left.insert(d); + } + + } else {//相等不考虑 + //比父节点大,右边 + if (this.right == null) { + this.right = b; + } else { + this.right.insert(d); + } + + } + } + + /** + * 是否比当前节点的data小 + * + * @param d data + * @return true false + */ + private boolean isSmaller(T d) { + return this.data.compareTo(d) > 0; } } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeUtil.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeUtil.java index c5543271ad..95e5fb64fe 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeUtil.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeUtil.java @@ -18,7 +18,7 @@ public class BinaryTreeUtil { * @param root * @return */ - public static List preOrderVisit(BinaryTreeNode root) { + public static > List preOrderVisit(BinaryTreeNode root) { List result = new ArrayList<>(); preOrderVisit(root, result); return result; @@ -43,7 +43,7 @@ private static void preOrderVisit(BinaryTreeNode root, List result) { * @param root * @return */ - public static List inOrderVisit(BinaryTreeNode root) { + public static > List inOrderVisit(BinaryTreeNode root) { List result = new ArrayList<>(); inOrderVisit(root, result); return result; @@ -67,7 +67,7 @@ private static void inOrderVisit(BinaryTreeNode root, List result) { * @param root * @return */ - public static List postOrderVisit(BinaryTreeNode root) { + public static > List postOrderVisit(BinaryTreeNode root) { List result = new ArrayList<>(); postOrderVisit(root, result); return result; @@ -90,7 +90,7 @@ private static void postOrderVisit(BinaryTreeNode root, List result) { * @param root * @return */ - public static List preOrderWithoutRecursion(BinaryTreeNode root) { + public static > List preOrderWithoutRecursion(BinaryTreeNode root) { List result = new ArrayList<>(); Stack> stack = new Stack<>(); @@ -118,7 +118,7 @@ public static List preOrderWithoutRecursion(BinaryTreeNode root) { * @param root * @return */ - public static List inOrderWithoutRecursion(BinaryTreeNode root) { + public static > List inOrderWithoutRecursion(BinaryTreeNode root) { List result = new ArrayList<>(); Stack> stack = new Stack<>(); @@ -143,7 +143,7 @@ public static List inOrderWithoutRecursion(BinaryTreeNode root) { * @param root * @return */ - public static List postOrderWithoutRecursion(BinaryTreeNode root) { + public static > List postOrderWithoutRecursion(BinaryTreeNode root) { List result = new ArrayList<>(); Stack> stack = new Stack<>(); diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/DownloadThread.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/DownloadThread.java index 9db5e9fc86..163d5d72e5 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/DownloadThread.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/DownloadThread.java @@ -5,6 +5,9 @@ import java.io.RandomAccessFile; import java.util.concurrent.CyclicBarrier; +/** + * @author LZB + */ public class DownloadThread extends Thread { Connection conn; diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/api/Connection.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/api/Connection.java index 17413ca23b..d66e3c71af 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/api/Connection.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/api/Connection.java @@ -2,22 +2,28 @@ import java.io.IOException; +/** + * @author LZB + */ public interface Connection { - /** - * 给定开始和结束位置, 读取数据, 返回值是字节数组 - * @param startPos 开始位置, 从0开始 - * @param endPos 结束位置 - * @return - */ - byte[] read(int startPos, int endPos) throws IOException; - /** - * 得到数据内容的长度 - * @return - */ - int getContentLength(); + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + byte[] read(int startPos, int endPos) throws IOException; - /** - * 关闭连接 - */ - void close(); + /** + * 得到数据内容的长度 + * + * @return + */ + int getContentLength(); + + /** + * 关闭连接 + */ + void close(); } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/api/ConnectionManager.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/api/ConnectionManager.java index abec231748..0afdc179f7 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/api/ConnectionManager.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/api/ConnectionManager.java @@ -1,10 +1,14 @@ package me.lzb.download.api; +/** + * @author LZB + */ public interface ConnectionManager { - /** - * 给定一个url , 打开一个连接 - * @param url - * @return - */ - Connection open(String url) throws ConnectionException; + /** + * 给定一个url , 打开一个连接 + * + * @param url + * @return + */ + Connection open(String url) throws ConnectionException; } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/impl/ConnectionImpl.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/impl/ConnectionImpl.java index 6fc42341db..566263d6df 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/impl/ConnectionImpl.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/impl/ConnectionImpl.java @@ -13,7 +13,9 @@ import java.io.InputStream; import java.util.Arrays; - +/** + * @author LZB + */ class ConnectionImpl implements Connection { @@ -24,22 +26,21 @@ class ConnectionImpl implements Connection { CloseableHttpClient httpClient; - - public ConnectionImpl(String url) throws ConnectionException{ + public ConnectionImpl(String url) throws ConnectionException { httpget = new HttpGet(url); httpget.setHeader("Accept-Encoding", "identity"); httpClient = HttpClients.createDefault(); } - @Override - public byte[] read(int startPos, int endPos) throws IOException { + @Override + public byte[] read(int startPos, int endPos) throws IOException { httpget.removeHeaders("Range"); httpget.addHeader("Range", "bytes=" + startPos + "-" + endPos); CloseableHttpResponse response = httpClient.execute(httpget); - InputStream inputStream = response.getEntity().getContent(); + InputStream inputStream = response.getEntity().getContent(); byte[] buff = new byte[BUFFER_SIZE]; @@ -47,25 +48,25 @@ public byte[] read(int startPos, int endPos) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - while(baos.size() < lenth){ + while (baos.size() < lenth) { int len = inputStream.read(buff); if (len < 0) { break; } - baos.write(buff,0, len); + baos.write(buff, 0, len); } - if(baos.size() > lenth){ + if (baos.size() > lenth) { byte[] data = baos.toByteArray(); return Arrays.copyOf(data, lenth); } return baos.toByteArray(); - } + } - @Override - public int getContentLength() { + @Override + public int getContentLength() { CloseableHttpResponse response; try { @@ -80,13 +81,10 @@ public int getContentLength() { return (int) httpEntity.getContentLength(); } - @Override - public void close() { + @Override + public void close() { } - - - } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/impl/ConnectionManagerImpl.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/impl/ConnectionManagerImpl.java index d450f5aa92..9a16b49e93 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/impl/ConnectionManagerImpl.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/download/impl/ConnectionManagerImpl.java @@ -5,6 +5,9 @@ import me.lzb.download.api.ConnectionException; import me.lzb.download.api.ConnectionManager; +/** + * @author LZB + */ public class ConnectionManagerImpl implements ConnectionManager { diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/LoginAction.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/LoginAction.java index 4f89670db2..daea435a20 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/LoginAction.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/LoginAction.java @@ -3,9 +3,10 @@ /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码 * + * @author LZB */ -public class LoginAction{ - private String name ; +public class LoginAction { + private String name; private String password; private String message; @@ -17,22 +18,24 @@ public String getPassword() { return password; } - public String execute(){ - if("test".equals(name) && "1234".equals(password)){ - this.message = "login successful"; - return "success"; - } - this.message = "login failed,please check your user/pwd"; - return "fail"; + public String execute() { + if ("test".equals(name) && "1234".equals(password)) { + this.message = "login successful"; + return "success"; + } + this.message = "login failed,please check your user/pwd"; + return "fail"; } - public void setName(String name){ + public void setName(String name) { this.name = name; } - public void setPassword(String password){ + + public void setPassword(String password) { this.password = password; } - public String getMessage(){ + + public String getMessage() { return this.message; } } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/Struts.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/Struts.java index 7841100872..dc6ce3f1a5 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/Struts.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/litestruts/Struts.java @@ -29,14 +29,16 @@ */ - +/** + * @author LZB + */ public class Struts { private static final String XML = "struts.xml"; private static final XmlUtil resource = createResource(XML); - private static XmlUtil createResource(String xml){ + private static XmlUtil createResource(String xml) { try { return new XmlUtil(xml); } catch (DocumentException e) { @@ -46,7 +48,7 @@ private static XmlUtil createResource(String xml){ } - public static View runAction(String actionName, Map parameters) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException { + public static View runAction(String actionName, Map parameters) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException { Object loginAction = getAuctionByName(actionName); @@ -58,7 +60,7 @@ public static View runAction(String actionName, Map parameters) t view.setJsp(resource.getResultJsp(actionName, resultName)); view.setParameters(invokeGetMethods(loginAction)); - return view; + return view; } private static Object getAuctionByName(String auctionName) throws ClassNotFoundException, IllegalAccessException, InstantiationException { @@ -74,14 +76,14 @@ private static Object invokeExecute(Object o) throws NoSuchMethodException, Invo } - private static void invokeSetMethods(Object o, Map parameteMap) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + private static void invokeSetMethods(Object o, Map parameteMap) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { Class c = o.getClass(); - Method[] methods = c.getDeclaredMethods(); - for (int i = 0; i< methods.length; i++) { + Method[] methods = c.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { String name = methods[i].getName(); - if(StringUtils.startsWith(name, "set")){ + if (StringUtils.startsWith(name, "set")) { String key = name.replaceAll("^set", "").toLowerCase(); - if(parameteMap.containsKey(key)){ + if (parameteMap.containsKey(key)) { methods[i].invoke(o, parameteMap.get(key)); } } @@ -99,12 +101,12 @@ private static Map invokeGetMethods(Object o) throws InvocationTargetException, Map resultMap = new HashMap(); Class c = o.getClass(); Method[] methods = c.getDeclaredMethods(); - for(int i =0 ;i s = new Stack(); - s.push(1); - s.push(2); - s.push(3); + @Test + public void testAddToBottom() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); - StackUtil.addToBottom(s, 0); + StackUtil.addToBottom(s, 0); - Assert.assertEquals("[0, 1, 2, 3]", s.toString()); + Assert.assertEquals("[0, 1, 2, 3]", s.toString()); - } - @Test - public void testReverse() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - StackUtil.reverse(s); - Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); - } + } - @Test - public void testRemove() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - StackUtil.remove(s, 2); - Assert.assertEquals("[1, 3]", s.toString()); - } + @Test + public void testReverse() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); + StackUtil.reverse(s); + Assert.assertEquals("[5, 4, 3, 2, 1]", s.toString()); + } + + @Test + public void testRemove() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + StackUtil.remove(s, 2); + Assert.assertEquals("[1, 3]", s.toString()); + } - @Test - public void testGetTop() { - Stack s = new Stack(); - s.push(1); - s.push(2); - s.push(3); - s.push(4); - s.push(5); - { - Object[] values = StackUtil.getTop(s, 3); - Assert.assertEquals(5, values[0]); - Assert.assertEquals(4, values[1]); - Assert.assertEquals(3, values[2]); - } + @Test + public void testGetTop() { + Stack s = new Stack(); + s.push(1); + s.push(2); + s.push(3); + s.push(4); + s.push(5); + { + Object[] values = StackUtil.getTop(s, 3); + Assert.assertEquals(5, values[0]); + Assert.assertEquals(4, values[1]); + Assert.assertEquals(3, values[2]); + } Assert.assertEquals("[1, 2, 3, 4, 5]", s.toString()); - } + } - @Test - public void testIsValidPairs() { - Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); - Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); - } + @Test + public void testIsValidPairs() { + Assert.assertTrue(StackUtil.isValidPairs("([e{d}f])")); + Assert.assertFalse(StackUtil.isValidPairs("([b{x]y})")); + } } diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java index 854901bd0a..0744eecd67 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java @@ -7,7 +7,6 @@ /** * @author LZB - * @date 2017/5/16 */ public class BinarySearchTreeTest { BinarySearchTree tree = null; @@ -15,11 +14,11 @@ public class BinarySearchTreeTest { @Before public void setUp() throws Exception { BinaryTreeNode root = new BinaryTreeNode<>(6); - root.left = new BinaryTreeNode<>(2); - root.right = new BinaryTreeNode<>(8); - root.left.left = new BinaryTreeNode<>(1); - root.left.right = new BinaryTreeNode<>(4); - root.left.right.left = new BinaryTreeNode<>(3); + root.insert(2); + root.insert(8); + root.insert(1); + root.insert(4); + root.insert(3); tree = new BinarySearchTree<>(root); } @@ -53,7 +52,7 @@ public void testSize() { public void testRemoveLeaf() { tree.remove(4); BinaryTreeNode root = tree.getRoot(); - Assert.assertEquals(3, root.left.right.data.intValue()); + Assert.assertEquals(3, root.getLeft().getRight().getData().intValue()); } @@ -61,7 +60,7 @@ public void testRemoveLeaf() { public void testRemoveMiddleNode() { tree.remove(2); BinaryTreeNode root = tree.getRoot(); - Assert.assertEquals(3, root.left.data.intValue()); - Assert.assertEquals(4, root.left.right.data.intValue()); + Assert.assertEquals(3, root.getLeft().getData().intValue()); + Assert.assertEquals(4, root.getLeft().getRight().getData().intValue()); } } diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinaryTreeUtilTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinaryTreeUtilTest.java index 6656fdfc4a..298072f91c 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinaryTreeUtilTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinaryTreeUtilTest.java @@ -54,7 +54,6 @@ public void testPostOrderVisit() { } - @Test public void testPreOrderVisitWithoutRecursion() { BinaryTreeNode node = root.getLeft().getRight(); diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/download/ConnectionTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/download/ConnectionTest.java index 884c309765..0fdd6d4a9d 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/download/ConnectionTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/download/ConnectionTest.java @@ -9,7 +9,7 @@ import org.junit.Test; /** - * Created by LZB on 2017/3/27. + * @author LZB */ public class ConnectionTest { @@ -25,7 +25,7 @@ public void tearDown() throws Exception { } @Test - public void testContentLength() throws Exception{ + public void testContentLength() throws Exception { ConnectionManager connMan = new ConnectionManagerImpl(); Connection conn = connMan.open(imageUrl); Assert.assertEquals(3440179, conn.getContentLength()); @@ -33,7 +33,7 @@ public void testContentLength() throws Exception{ } @Test - public void testRead() throws Exception{ + public void testRead() throws Exception { ConnectionManager connMan = new ConnectionManagerImpl(); Connection conn = connMan.open(imageUrl); diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/download/FileDownloaderTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/download/FileDownloaderTest.java index 76c3edf432..1093ea8a88 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/download/FileDownloaderTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/download/FileDownloaderTest.java @@ -7,6 +7,9 @@ import org.junit.Before; import org.junit.Test; +/** + * @author LZB + */ public class FileDownloaderTest { private static final String imageUrl = "https://wallpapers.wallhaven.cc/wallpapers/full/wallhaven-499994.png"; diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/litestruts/StrutsTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/litestruts/StrutsTest.java index a970d742b4..ea0079e841 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/litestruts/StrutsTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/litestruts/StrutsTest.java @@ -7,35 +7,37 @@ import java.util.Map; - +/** + * @author LZB + */ public class StrutsTest { - @Test - public void testLoginActionSuccess() throws Exception{ + @Test + public void testLoginActionSuccess() throws Exception { - String actionName = "login"; + String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","1234"); + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "1234"); - View view = Struts.runAction(actionName,params); + View view = Struts.runAction(actionName, params); Assert.assertEquals("/jsp/homepage.jsp", view.getJsp()); Assert.assertEquals("login successful", view.getParameters().get("message")); - } + } - @Test - public void testLoginActionFailed() throws Exception{ - String actionName = "login"; - Map params = new HashMap(); - params.put("name","test"); - params.put("password","123456"); //密码和预设的不一致 + @Test + public void testLoginActionFailed() throws Exception { + String actionName = "login"; + Map params = new HashMap(); + params.put("name", "test"); + params.put("password", "123456"); //密码和预设的不一致 - View view = Struts.runAction(actionName,params); + View view = Struts.runAction(actionName, params); Assert.assertEquals("/jsp/showLogin.jsp", view.getJsp()); Assert.assertEquals("login failed,please check your user/pwd", view.getParameters().get("message")); - } + } } diff --git a/group24/1148285693/learning2017/learning-basic/src/test/resources/litestruts/struts.xml b/group24/1148285693/learning2017/learning-basic/src/test/resources/litestruts/struts.xml index a4859a04b2..f1d2ecf51a 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/resources/litestruts/struts.xml +++ b/group24/1148285693/learning2017/learning-basic/src/test/resources/litestruts/struts.xml @@ -5,7 +5,7 @@ /jsp/showLogin.jsp
    - /jsp/welcome.jsp - /jsp/error.jsp + /jsp/welcome.jsp + /jsp/error.jsp diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/AttributeInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/AttributeInfo.java index fd000bdcb3..4e6637d897 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/AttributeInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/AttributeInfo.java @@ -1,7 +1,7 @@ package me.lzb.jvm.attr; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public abstract class AttributeInfo { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java index f2f30f004f..ae7bf5e0dd 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/CodeAttr.java @@ -3,7 +3,7 @@ import me.lzb.jvm.cmd.ByteCodeCommand; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class CodeAttr extends AttributeInfo { private int maxStack; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java index a914a259ad..07b1b9ea77 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/ConstantValue.java @@ -2,7 +2,6 @@ /** * @author LZB - * @date 2017/5/12 */ public class ConstantValue extends AttributeInfo { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LineNumberItem.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LineNumberItem.java index e621cf925a..75e12e914c 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LineNumberItem.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LineNumberItem.java @@ -1,7 +1,7 @@ package me.lzb.jvm.attr; /** - * Created by LZB on 2017/4/16. + * @author LZB */ public class LineNumberItem { int startPC; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LineNumberTable.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LineNumberTable.java index 5bf7b4759b..fdf248ec12 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LineNumberTable.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LineNumberTable.java @@ -4,7 +4,7 @@ import java.util.List; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class LineNumberTable extends AttributeInfo { List items = new ArrayList<>(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LocalVariableItem.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LocalVariableItem.java index decef772a3..9e2007d466 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LocalVariableItem.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LocalVariableItem.java @@ -1,7 +1,7 @@ package me.lzb.jvm.attr; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class LocalVariableItem { private int startPC; @@ -11,7 +11,7 @@ public class LocalVariableItem { private int index; - public LocalVariableItem(int startPC, int length, int nameIndex, int descIndex, int index){ + public LocalVariableItem(int startPC, int length, int nameIndex, int descIndex, int index) { this.startPC = startPC; this.length = length; this.nameIndex = nameIndex; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LocalVariableTable.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LocalVariableTable.java index 9dca129d71..866c56b891 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LocalVariableTable.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/LocalVariableTable.java @@ -4,7 +4,7 @@ import java.util.List; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class LocalVariableTable extends AttributeInfo { List items = new ArrayList<>(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/StackMapTable.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/StackMapTable.java index 0b8947bdf8..dca8db3ef5 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/StackMapTable.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/attr/StackMapTable.java @@ -1,7 +1,7 @@ package me.lzb.jvm.attr; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class StackMapTable extends AttributeInfo { private String originalCode; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java index cfb4f067e8..60be506bd3 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/AccessFlag.java @@ -1,7 +1,7 @@ package me.lzb.jvm.clz; /** - * Created by LZB on 2017/4/14. + * @author LZB */ public class AccessFlag { private int flagValue; @@ -26,10 +26,10 @@ public boolean isFinalClass() { return (this.flagValue & 0x0010) != 0; } - public String getFlagString(){ - if (isPublicClass()){ + public String getFlagString() { + if (isPublicClass()) { return "public"; - }else { + } else { return "not public"; } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java index 32e0c24bdf..a1ec8604fb 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java @@ -11,9 +11,9 @@ import java.util.List; /** - * Created by LZB on 2017/4/14. + * @author LZB */ -public class ClassFile implements Print{ +public class ClassFile implements Print { private String magicNumber; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassIndex.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassIndex.java index 8916290057..df9b69fcba 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassIndex.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassIndex.java @@ -1,7 +1,7 @@ package me.lzb.jvm.clz; /** - * Created by LZB on 2017/4/14. + * @author LZB */ public class ClassIndex { private int thisClassIndex; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java index a662e9a6ff..77d5057870 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/BiPushCmd.java @@ -8,6 +8,9 @@ import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.print.ExecutionVisitor; +/** + * @author LZB + */ public class BiPushCmd extends OneOperandCmd { public BiPushCmd(ClassFile clzFile, String opCode) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java index b2e4e4c0be..dd088d7dd7 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ByteCodeCommand.java @@ -10,7 +10,9 @@ import java.util.HashMap; import java.util.Map; - +/** + * @author LZB + */ public abstract class ByteCodeCommand { String opCode; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java index c7313afbef..735ad2b275 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/ComparisonCmd.java @@ -8,7 +8,6 @@ /** * @author LZB - * @date 2017/5/12 */ public class ComparisonCmd extends TwoOperandCmd { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java index 27429d0695..bec2f7444a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetFieldCmd.java @@ -8,6 +8,9 @@ import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.print.ExecutionVisitor; +/** + * @author LZB + */ public class GetFieldCmd extends TwoOperandCmd { public GetFieldCmd(ClassFile clzFile, String opCode) { @@ -22,7 +25,7 @@ public String toString() { @Override public void execute(StackFrame frame, ExecutionResult result) { - FieldRefInfo fieldRef = (FieldRefInfo)this.getConstantInfo(this.getIndex()); + FieldRefInfo fieldRef = (FieldRefInfo) this.getConstantInfo(this.getIndex()); String fieldName = fieldRef.getFieldName(); JavaObject jo = frame.getOprandStack().pop(); JavaObject fieldValue = jo.getFieldValue(fieldName); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java index 4144b0dae8..e3a2fb0c18 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/GetStaticFieldCmd.java @@ -8,6 +8,9 @@ import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.print.ExecutionVisitor; +/** + * @author LZB + */ public class GetStaticFieldCmd extends TwoOperandCmd { public GetStaticFieldCmd(ClassFile clzFile, String opCode) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/IncrementCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/IncrementCmd.java index a0e3636160..b76267fd18 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/IncrementCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/IncrementCmd.java @@ -8,7 +8,7 @@ import me.lzb.jvm.print.ExecutionVisitor; /** - * Created by lzbfe on 2017/5/13. + * @author LZB */ public class IncrementCmd extends TwoOperandCmd { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java index de1b9d3493..e3e0ddc1fe 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeSpecialCmd.java @@ -8,7 +8,9 @@ import me.lzb.jvm.method.Method; import me.lzb.jvm.print.ExecutionVisitor; - +/** + * @author LZB + */ public class InvokeSpecialCmd extends TwoOperandCmd { public InvokeSpecialCmd(ClassFile clzFile, String opCode) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java index ecf3ecd795..051e9b513e 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/InvokeVirtualCmd.java @@ -9,6 +9,9 @@ import me.lzb.jvm.method.Method; import me.lzb.jvm.print.ExecutionVisitor; +/** + * @author LZB + */ public class InvokeVirtualCmd extends TwoOperandCmd { public InvokeVirtualCmd(ClassFile clzFile, String opCode) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java index 8a8278fcb7..a05814ce4a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/LdcCmd.java @@ -10,6 +10,9 @@ import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.print.ExecutionVisitor; +/** + * @author LZB + */ public class LdcCmd extends OneOperandCmd { public LdcCmd(ClassFile clzFile, String opCode) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java index 4b6544b2ce..2fe1af00d8 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NewObjectCmd.java @@ -8,6 +8,9 @@ import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.print.ExecutionVisitor; +/** + * @author LZB + */ public class NewObjectCmd extends TwoOperandCmd { public NewObjectCmd(ClassFile clzFile, String opCode) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java index 2657181e94..8c185bd3b9 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/NoOperandCmd.java @@ -7,6 +7,9 @@ import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.print.ExecutionVisitor; +/** + * @author LZB + */ public class NoOperandCmd extends ByteCodeCommand { public NoOperandCmd(ClassFile clzFile, String opCode) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java index de9391fb56..950137d7b9 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/OneOperandCmd.java @@ -2,6 +2,9 @@ import me.lzb.jvm.clz.ClassFile; +/** + * @author LZB + */ public abstract class OneOperandCmd extends ByteCodeCommand { private int operand; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java index 6d6efcc7fe..b8325ea5ab 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/PutFieldCmd.java @@ -9,7 +9,9 @@ import me.lzb.jvm.engine.StackFrame; import me.lzb.jvm.print.ExecutionVisitor; - +/** + * @author LZB + */ public class PutFieldCmd extends TwoOperandCmd { public PutFieldCmd(ClassFile clzFile, String opCode) { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java index 4edb97cab0..c6effe5988 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/cmd/TwoOperandCmd.java @@ -3,6 +3,9 @@ import me.lzb.jvm.clz.ClassFile; import me.lzb.jvm.constant.*; +/** + * @author LZB + */ public abstract class TwoOperandCmd extends ByteCodeCommand { int oprand1 = -1; @@ -61,5 +64,4 @@ public int getLength() { } - } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java index 16ea736db1..daebec4881 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ClassInfo.java @@ -3,9 +3,9 @@ import me.lzb.jvm.print.PrintVisitor; /** - * Created by LZB on 2017/4/14. + * @author LZB */ -public class ClassInfo extends ConstantInfo{ +public class ClassInfo extends ConstantInfo { private int type = ConstantInfo.Class_info; private int utf8Index; @@ -34,7 +34,7 @@ public void setUtf8Index(int utf8Index) { public String getClassName() { int index = getUtf8Index(); - UTF8Info utf8Info = (UTF8Info)constantPool.getConstantInfo(index); + UTF8Info utf8Info = (UTF8Info) constantPool.getConstantInfo(index); return utf8Info.getValue(); } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java index e1952a7a3e..9295e4eaf2 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantInfo.java @@ -4,7 +4,7 @@ import me.lzb.jvm.print.PrintVisitor; /** - * Created by LZB on 2017/4/14. + * @author LZB */ public abstract class ConstantInfo implements Print { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantPool.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantPool.java index d78f0a71f4..3855ab5f6f 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantPool.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/ConstantPool.java @@ -4,29 +4,28 @@ import java.util.List; /** - * Created by LZB on 2017/4/14. + * @author LZB */ public class ConstantPool { private List constantInfoList = new ArrayList<>(); - - public void addConstantInfo(ConstantInfo constantInfo){ + public void addConstantInfo(ConstantInfo constantInfo) { constantInfoList.add(constantInfo); } - public int getSize(){ + public int getSize() { return constantInfoList.size() > 1 ? constantInfoList.size() - 1 : 0; } - public ConstantInfo getConstantInfo(int index){ + public ConstantInfo getConstantInfo(int index) { return constantInfoList.get(index); } - public String getUTF8String(int index){ - return ((UTF8Info)this.constantInfoList.get(index)).getValue(); + public String getUTF8String(int index) { + return ((UTF8Info) this.constantInfoList.get(index)).getValue(); } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java index 6ceebd96aa..59a40abaf3 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/FieldRefInfo.java @@ -3,7 +3,7 @@ import me.lzb.jvm.print.PrintVisitor; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class FieldRefInfo extends ConstantInfo { private int type = ConstantInfo.Fieldref_info; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java index 0755af98ed..a3ee799cc7 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/MethodRefInfo.java @@ -3,7 +3,7 @@ import me.lzb.jvm.print.PrintVisitor; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class MethodRefInfo extends ConstantInfo { private int type = ConstantInfo.Methodref_info; @@ -41,25 +41,25 @@ public void setNameAndTypeIndex(int nameAndTypeIndex) { this.nameAndTypeIndex = nameAndTypeIndex; } - public String getClassName(){ + public String getClassName() { ConstantPool pool = this.getConstantPool(); - ClassInfo clzInfo = (ClassInfo)pool.getConstantInfo(this.getClassInfoIndex()); + ClassInfo clzInfo = (ClassInfo) pool.getConstantInfo(this.getClassInfoIndex()); return clzInfo.getClassName(); } - public String getMethodName(){ + public String getMethodName() { ConstantPool pool = this.getConstantPool(); - NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getName(); } - public String getParamAndReturnType(){ + public String getParamAndReturnType() { ConstantPool pool = this.getConstantPool(); - NameAndTypeInfo typeInfo = (NameAndTypeInfo)pool.getConstantInfo(this.getNameAndTypeIndex()); + NameAndTypeInfo typeInfo = (NameAndTypeInfo) pool.getConstantInfo(this.getNameAndTypeIndex()); return typeInfo.getTypeInfo(); } - public String toString(){ - return this.getMethodName() + ":" + this.getParamAndReturnType() ; + public String toString() { + return this.getMethodName() + ":" + this.getParamAndReturnType(); } } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java index 7d14bf3bdc..52df87a19f 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NameAndTypeInfo.java @@ -3,7 +3,7 @@ import me.lzb.jvm.print.PrintVisitor; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class NameAndTypeInfo extends ConstantInfo { private int type = ConstantInfo.NameAndType_info; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java index 88b90ca6c1..24f13c4fb8 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/NullConstantInfo.java @@ -3,9 +3,9 @@ import me.lzb.jvm.print.PrintVisitor; /** - * Created by LZB on 2017/4/14. + * @author LZB */ -public class NullConstantInfo extends ConstantInfo{ +public class NullConstantInfo extends ConstantInfo { @Override public int getType() { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java index 0af04e46bb..1b1ec316ee 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/StringInfo.java @@ -3,7 +3,7 @@ import me.lzb.jvm.print.PrintVisitor; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class StringInfo extends ConstantInfo { private int type = ConstantInfo.String_info; @@ -13,6 +13,7 @@ public class StringInfo extends ConstantInfo { public StringInfo(ConstantPool pool) { super(pool); } + @Override public int getType() { return type; @@ -31,7 +32,7 @@ public void setIndex(int index) { this.index = index; } - public String toString(){ + public String toString() { return getConstantPool().getUTF8String(index); } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java index 9a27b3c716..78c66929e1 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/constant/UTF8Info.java @@ -3,7 +3,7 @@ import me.lzb.jvm.print.PrintVisitor; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class UTF8Info extends ConstantInfo { private int type = ConstantInfo.Class_info; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java index 9afe234cfa..983c8006ff 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java @@ -3,6 +3,9 @@ import me.lzb.jvm.method.Method; +/** + * @author LZB + */ public class ExecutionResult { public static final int RUN_NEXT_CMD = 1; public static final int JUMP = 2; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java index ff1840ab38..1ccd6b90b9 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java @@ -7,7 +7,9 @@ import java.util.List; import java.util.Stack; - +/** + * @author LZB + */ public class ExecutorEngine { private Stack stack = new Stack<>(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java index 6d53f86871..b8cc8b7ffb 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java @@ -1,11 +1,12 @@ package me.lzb.jvm.engine; +/** + * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 + * + * @author LZB + */ public class Heap { - /** - * 没有实现垃圾回收, 所以对于下面新创建的对象, 并没有记录到一个数据结构当中 - */ - private static Heap instance = new Heap(); private Heap() { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java index 186d8be67d..61b2285953 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java @@ -3,6 +3,9 @@ import java.util.HashMap; import java.util.Map; +/** + * @author LZB + */ public class JavaObject { public static final int OBJECT = 1; public static final int STRING = 2; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java index ffc3c641fc..562809de3c 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java @@ -9,6 +9,9 @@ import java.util.HashMap; import java.util.Map; +/** + * @author LZB + */ public class MethodArea { public static final MethodArea instance = new MethodArea(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java index fac0c1bb34..2e76d70d66 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java @@ -4,7 +4,9 @@ import java.io.IOException; - +/** + * @author LZB + */ public class MiniJVM { public void run(String[] classPaths, String className) throws IOException { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java index ed641cd931..8b266c5981 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java @@ -9,7 +9,9 @@ import java.util.List; import java.util.Stack; - +/** + * @author LZB + */ public class StackFrame { private List localVariableTable = new ArrayList<>(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/field/Field.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/field/Field.java index 2c46cbec5e..23896d936b 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/field/Field.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/field/Field.java @@ -4,7 +4,7 @@ import me.lzb.jvm.constant.ConstantPool; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class Field { private int accessFlag; @@ -15,7 +15,7 @@ public class Field { private ConstantValue constantValue; - public Field(int accessFlag, int nameIndex, int descriptorIndex ,ConstantPool pool) { + public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { this.accessFlag = accessFlag; this.nameIndex = nameIndex; @@ -24,9 +24,6 @@ public Field(int accessFlag, int nameIndex, int descriptorIndex ,ConstantPool po } - - - @Override public String toString() { String key = pool.getUTF8String(nameIndex); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileLoader.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileLoader.java index d8912cb1bb..9d853530c9 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileLoader.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileLoader.java @@ -10,7 +10,9 @@ import java.util.Iterator; import java.util.List; - +/** + * @author LZB + */ public class ClassFileLoader { private List clzPaths = new ArrayList<>(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java index 2e99fb4357..a7396bb7d4 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java @@ -14,7 +14,8 @@ /** * 处理字class文件字节流 - * Created by LZB on 2017/4/14. + * + * @author LZB */ public class ClassFileParser { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java index 28a640f13a..3e7976a484 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java @@ -8,7 +8,7 @@ import java.util.List; /** - * Created by LZB on 2017/4/22. + * @author LZB */ public class CommandParser { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java index 43acd00549..5cb174fecd 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/method/Method.java @@ -10,7 +10,7 @@ import java.util.List; /** - * Created by LZB on 2017/4/15. + * @author LZB */ public class Method { private int accessFlag; diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java index f5b008a41b..b65ffb7795 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ClassPrinter.java @@ -6,7 +6,7 @@ import me.lzb.jvm.constant.ConstantPool; /** - * Created by LZB on 2017/4/23. + * @author LZB */ public class ClassPrinter { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java index 88a55f6d5e..f1cce96f77 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionFormat.java @@ -5,7 +5,7 @@ import me.lzb.jvm.constant.*; /** - * Created by LZB on 2017/5/1. + * @author LZB */ public class ExecutionFormat implements ExecutionVisitor { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java index 4f6383799b..565f5e8713 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/ExecutionVisitor.java @@ -3,7 +3,7 @@ import me.lzb.jvm.cmd.*; /** - * Created by LZB on 2017/5/1. + * @author LZB */ public interface ExecutionVisitor { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java index e064011528..03baccb81e 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/Print.java @@ -1,7 +1,7 @@ package me.lzb.jvm.print; /** - * Created by LZB on 2017/4/23. + * @author LZB */ public interface Print { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java index bf62883c21..059a19cc09 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintFormat.java @@ -5,7 +5,7 @@ import me.lzb.jvm.constant.*; /** - * Created by LZB on 2017/4/23. + * @author LZB */ public class PrintFormat implements PrintVisitor { @@ -59,5 +59,4 @@ public void visitString(StringInfo info) { } - } diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java index 350d424cd1..aac81ecd8a 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/print/PrintVisitor.java @@ -4,7 +4,7 @@ import me.lzb.jvm.constant.*; /** - * Created by LZB on 2017/4/23. + * @author LZB */ public interface PrintVisitor { void visitBasicMsg(ClassFile info); diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java index 8b7afe8c5a..26255a8daa 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/ClassFileloaderTest.java @@ -19,7 +19,9 @@ import java.util.List; - +/** + * @author LZB + */ public class ClassFileloaderTest { @@ -95,7 +97,7 @@ public void testMagicNumber() throws Exception { static { ClassFileLoader loader = new ClassFileLoader(); - loader.addClassPath(path1 ); + loader.addClassPath(path1); clzFile = loader.loadClass(className); clzFile.print(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV1.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV1.java index 3fa9b0fc85..c4f8fd4d41 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV1.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV1.java @@ -1,8 +1,11 @@ package me.lzb.jvm; +/** + * @author LZB + */ public class EmployeeV1 { - private String name; + private String name; private int age; public EmployeeV1(String name, int age) { @@ -13,15 +16,18 @@ public EmployeeV1(String name, int age) { public void setName(String name) { this.name = name; } - public void setAge(int age){ - this.age = age; + + public void setAge(int age) { + this.age = age; } + public void sayHello() { - System.out.println("Hello , this is class Employee "); + System.out.println("Hello , this is class Employee "); } - public static void main(String[] args){ - EmployeeV1 p = new EmployeeV1("Andy",29); - p.sayHello(); + + public static void main(String[] args) { + EmployeeV1 p = new EmployeeV1("Andy", 29); + p.sayHello(); } } \ No newline at end of file diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java index ccc6cc1182..c71c700932 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/EmployeeV2.java @@ -2,7 +2,6 @@ /** * @author LZB - * @date 2017/5/12 */ public class EmployeeV2 { public static final String TEAM_NAME = "Dev Team"; diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/HourlyEmployee.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/HourlyEmployee.java index bcb87af439..37d7e8a756 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/HourlyEmployee.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/HourlyEmployee.java @@ -2,7 +2,6 @@ /** * @author LZB - * @date 2017/5/12 */ public class HourlyEmployee extends EmployeeV2 { int hourlySalary; diff --git a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java index 32254c6f74..17c23d0391 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java +++ b/group24/1148285693/learning2017/mini-jvm/src/test/java/me/lzb/jvm/MiniJVMTest.java @@ -5,28 +5,31 @@ import org.junit.Before; import org.junit.Test; - +/** + * @author LZB + */ public class MiniJVMTest { static String PATH = EmployeeV1.class.getResource("/").getPath(); - @Before - public void setUp() throws Exception { - } - @After - public void tearDown() throws Exception { - } + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } - @Test - public void testMain() throws Exception{ - String[] classPaths = {PATH}; - MiniJVM jvm = new MiniJVM(); - jvm.run(classPaths, "me.lzb.jvm.EmployeeV1"); + @Test + public void testMain() throws Exception { + String[] classPaths = {PATH}; + MiniJVM jvm = new MiniJVM(); + jvm.run(classPaths, "me.lzb.jvm.EmployeeV1"); - } + } @Test - public void testMainV2() throws Exception{ + public void testMainV2() throws Exception { String[] classPaths = {PATH}; MiniJVM jvm = new MiniJVM(); jvm.run(classPaths, "me.lzb.jvm.EmployeeV2"); @@ -34,7 +37,7 @@ public void testMainV2() throws Exception{ } @Test - public void testMainHE() throws Exception{ + public void testMainHE() throws Exception { String[] classPaths = {PATH}; MiniJVM jvm = new MiniJVM(); jvm.run(classPaths, "me.lzb.jvm.HourlyEmployee"); From 0f604560229cc858e56df9588a66a816427f03ba Mon Sep 17 00:00:00 2001 From: lzb Date: Wed, 17 May 2017 03:02:57 +0800 Subject: [PATCH 527/552] =?UTF-8?q?11=E5=91=A8=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/lzb/basic/tree/BinarySearchTree.java | 180 ++++++++++++++++-- .../me/lzb/basic/tree/BinaryTreeNode.java | 13 +- 2 files changed, 178 insertions(+), 15 deletions(-) diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java index c14e741219..88922462a7 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java @@ -18,36 +18,192 @@ public T findMin() { if (this.root == null) { throw new RuntimeException("empty tree"); } - BinaryTreeNode result = this.root; - while (result.getLeft() != null) { - result = result.getLeft(); - } - return result.getData(); + return getMinNode(this.root).getData(); } public T findMax() { if (this.root == null) { throw new RuntimeException("empty tree"); } - BinaryTreeNode result = this.root; - while (result.getRight() != null) { - result = result.getRight(); + return getMaxNode(this.root).getData(); + } + + private BinaryTreeNode getMinNode(BinaryTreeNode node) { + if (node == null) { + return node; + } + + if (node.getLeft() == null) { + return node; + } + return getMinNode(node.getLeft()); + } + + private BinaryTreeNode getMaxNode(BinaryTreeNode node) { + if (node == null) { + return node; + } + + if (node.getRight() == null) { + return node; } - return result.getData(); + + return getMaxNode(node.getRight()); } + public int height() { + return getHeight(root, 0); + } + + private int getHeight(BinaryTreeNode node, int h) { + if (node == null) { + return h; + } + int lh = getHeight(node.getLeft(), h + 1); + int rh = getHeight(node.getRight(), h + 1); - return -1; + return lh > rh ? lh : rh; } + public int size() { - return -1; + return getSize(root, 1); } - public void remove(T e) { + private int getSize(BinaryTreeNode node, int s) { + if (node == null) { + return s - 1; + } + + s = getSize(node.getLeft(), s + 1); + s = getSize(node.getRight(), s + 1); + + return s; + } + public void remove(T t) { + BinaryTreeNode node = getFatherNode(root, t); + removeNode(node, t); } + + private void removeNode(BinaryTreeNode father, T t) { + if (father == null) { + return; + } + + //移除左子节点 + if (father.getLeft() != null && father.getLeft().getData().equals(t)) { + BinaryTreeNode remove = father.getLeft(); + BinaryTreeNode l = remove.getLeft(); + BinaryTreeNode r = remove.getRight(); + + //被删除节点没有子节点,直接删除 + if (l == null && r == null) { + father.setLeft(null); + return; + } + + //被删除节点有一个子节点,用非空子节点顶替被删除节点 + if (l == null) { + father.setLeft(r); + return; + } + + if (r == null) { + father.setLeft(l); + return; + } + + + //被删除节点有两个子节点 + //右子树的最小节点,顶替被删除位置 + BinaryTreeNode rm = getMinNode(r); + BinaryTreeNode rmf = getFatherNode(r, rm.getData()); + rmf.setLeft(null); + father.setLeft(rm); + rm.setLeft(l); + rm.setRight(r); + + + return; + + } + + + //移除右子节点 + if (father.getRight() != null && father.getRight().getData().equals(t)) { + BinaryTreeNode remove = father.getRight(); + BinaryTreeNode l = remove.getLeft(); + BinaryTreeNode r = remove.getRight(); + + if (l == null && r == null) { + father.setRight(null); + return; + } + + if (l == null) { + father.setRight(r); + return; + } + + + if (r == null) { + father.setRight(l); + return; + } + + + BinaryTreeNode rm = getMinNode(r); + BinaryTreeNode rmf = getFatherNode(r, rm.getData()); + rmf.setLeft(null); + father.setRight(rm); + rm.setLeft(l); + rm.setRight(r); + return; + } + + + } + + + private BinaryTreeNode getFatherNode(BinaryTreeNode node, T t) { + if (node == null) { + return node; + } + if (node.getLeft() != null && node.getLeft().getData().equals(t)) { + return node; + } + + if (node.getRight() != null && node.getRight().getData().equals(t)) { + return node; + } + if (t.compareTo(node.getData()) > 0) { + return getFatherNode(node.getRight(), t); + } else { + return getFatherNode(node.getLeft(), t); + } + } + + private BinaryTreeNode getNode(BinaryTreeNode node, T t) { + if (node == null) { + return node; + } + + + if (node.getData().equals(t)) { + return node; + } + + if (t.compareTo(node.getData()) > 0) { + return getNode(node.getRight(), t); + } else { + return getNode(node.getLeft(), t); + } + + } + + } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java index 2815246b0c..add0443e9a 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java @@ -16,9 +16,9 @@ public T getData() { return data; } -// public void setData(T data) { -// this.data = data; -// } + public void setData(T data) { + this.data = data; + } public BinaryTreeNode getLeft() { return left; @@ -74,4 +74,11 @@ private boolean isSmaller(T d) { return this.data.compareTo(d) > 0; } + @Override + public String toString() { +// return getLeft() != null ? getLeft().getData().toString() : "" + ":" + getData().toString() + ":" + getRight() != null ? getRight().getData().toString() : ""; + return getData().toString(); + } + + } From eb2f6f1e7b7655c82422d3647b41f2b6837680b1 Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Wed, 17 May 2017 17:42:49 +0800 Subject: [PATCH 528/552] =?UTF-8?q?=E7=AC=AC=E5=8D=81=E5=91=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A=EF=BC=8C=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binaryTree/BinarySearchTree.java | 56 +++++++++++++++++-- .../BinarySearchTreeTest.java | 13 ++--- .../BinaryTreeUtilTest.java | 2 +- .../{binaryTree => tree}/FileListTest.java | 2 +- .../MemoryLeakSimulation.java | 25 +++++++++ 5 files changed, 81 insertions(+), 17 deletions(-) rename group24/75939388/learning2017/src/test/java/data_structure/{binaryTree => tree}/BinarySearchTreeTest.java (86%) rename group24/75939388/learning2017/src/test/java/data_structure/{binaryTree => tree}/BinaryTreeUtilTest.java (98%) rename group24/75939388/learning2017/src/test/java/data_structure/{binaryTree => tree}/FileListTest.java (92%) create mode 100644 group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java index 899a824cb4..7f2f4bdd1a 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java @@ -1,29 +1,73 @@ package basic.dataStructure.binaryTree; +import java.util.List; + public class BinarySearchTree { BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ this.root = root; } + public BinaryTreeNode getRoot(){ return root; } + public T findMin(){ - return null; + List list = BinaryTreeUtil.preOrderVisit(root); + T min = list.get(0); + for(T t : list){ + min = min.compareTo(t) == -1 ? min : t; + } + return min; } public T findMax(){ - return null; + List list = BinaryTreeUtil.preOrderVisit(root); + T max = list.get(0); + for(T t : list){ + max = max.compareTo(t) == 1 ? max : t; + } + return max; } + public int height() { - return -1; + return calHeight(root); } + + private int calHeight(BinaryTreeNode root){ + if(root == null) return 0; + + int left = calHeight(root.left); + int right = calHeight(root.right); + + return (left > right ? left : right) + 1; + + } + public int size() { - return -1; + List list = BinaryTreeUtil.preOrderVisit(root); + return list.size(); } + public void remove(T e){ - + find(root, (Integer) e); + } + + private BinaryTreeNode find(BinaryTreeNode node, int value){ + if(node.getData().compareTo(value) == 0){ + return node; + } + + return null; + } + + private void noLeafRemove(){ + + } + + private void oneChildRemove(){ + } - } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinarySearchTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java similarity index 86% rename from group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinarySearchTreeTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java index a1cc46e007..13ddb13c4f 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinarySearchTreeTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java @@ -1,4 +1,4 @@ -package data_structure.binaryTree; +package data_structure.tree; import basic.dataStructure.binaryTree.BinarySearchTree; import basic.dataStructure.binaryTree.BinaryTreeNode; @@ -30,13 +30,8 @@ public void tearDown() throws Exception { } @Test - public void testFindMin() { + public void testFind() { Assert.assertEquals(1, tree.findMin().intValue()); - - } - - @Test - public void testFindMax() { Assert.assertEquals(8, tree.findMax().intValue()); } @@ -53,8 +48,8 @@ public void testSize() { @Test public void testRemoveLeaf() { tree.remove(4); - BinaryTreeNode root= tree.getRoot(); - Assert.assertEquals(3, root.left.right.data.intValue()); +// BinaryTreeNode root= tree.getRoot(); +// Assert.assertEquals(3, root.left.right.data.intValue()); } @Test diff --git a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinaryTreeUtilTest.java b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinaryTreeUtilTest.java similarity index 98% rename from group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinaryTreeUtilTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/tree/BinaryTreeUtilTest.java index 09b50a1148..b3657aece4 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/BinaryTreeUtilTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinaryTreeUtilTest.java @@ -1,4 +1,4 @@ -package data_structure.binaryTree; +package data_structure.tree; import basic.dataStructure.binaryTree.BinaryTreeNode; import basic.dataStructure.binaryTree.BinaryTreeUtil; diff --git a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/FileListTest.java b/group24/75939388/learning2017/src/test/java/data_structure/tree/FileListTest.java similarity index 92% rename from group24/75939388/learning2017/src/test/java/data_structure/binaryTree/FileListTest.java rename to group24/75939388/learning2017/src/test/java/data_structure/tree/FileListTest.java index 56e7da0eaf..18f3bddc0a 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/binaryTree/FileListTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/tree/FileListTest.java @@ -1,4 +1,4 @@ -package data_structure.binaryTree; +package data_structure.tree; import basic.dataStructure.binaryTree.FileList; import org.junit.Before; diff --git a/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java b/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java new file mode 100644 index 0000000000..ad8284dcbc --- /dev/null +++ b/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java @@ -0,0 +1,25 @@ +package gabageCollection; + +import org.junit.Test; + +/** + * @author : 温友朝 + * @date : 2017/5/17 + */ +public class MemoryLeakSimulation { + + @Test + public void testOutOfMemory(){ + + } + + @Test + public void testStackOverFlowError(){ + + } + + @Test + public void testOutOfMemoryPermGenSpace(){ + + } +} From 0751b68cd4b088a9fb1670a4d8bab6ce6e2733fa Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Thu, 18 May 2017 14:01:23 +0800 Subject: [PATCH 529/552] =?UTF-8?q?=E7=AC=AC=E5=8D=81=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binaryTree/BinarySearchTree.java | 147 ++++++++++-------- .../tree/BinarySearchTreeTest.java | 4 +- .../MemoryLeakSimulation.java | 26 ++-- 3 files changed, 102 insertions(+), 75 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java index 7f2f4bdd1a..acbb5c7083 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java @@ -3,71 +3,90 @@ import java.util.List; public class BinarySearchTree { - - BinaryTreeNode root; - public BinarySearchTree(BinaryTreeNode root){ - this.root = root; - } + BinaryTreeNode root; + + public BinarySearchTree(BinaryTreeNode root) { + this.root = root; + } + + public BinaryTreeNode getRoot() { + return root; + } + + public T findMin() { + return findMin(root); + } + + private T findMin(BinaryTreeNode root){ + List list = BinaryTreeUtil.preOrderVisit(root); + T min = list.get(0); + for (T t : list) { + min = min.compareTo(t) == -1 ? min : t; + } + return min; + } + + public T findMax() { + return findMax(root); + } + + private T findMax(BinaryTreeNode root){ + List list = BinaryTreeUtil.preOrderVisit(root); + T max = list.get(0); + for (T t : list) { + max = max.compareTo(t) == 1 ? max : t; + } + return max; + } + + public int height() { + return calHeight(root); + } + + private int calHeight(BinaryTreeNode root) { + if (root == null) return 0; + + int left = calHeight(root.left); + int right = calHeight(root.right); + + return (left > right ? left : right) + 1; + + } + + public int size() { + List list = BinaryTreeUtil.preOrderVisit(root); + return list.size(); + } + + public void remove(T e) { + remove(root, (Integer) e); + } + + private void remove(BinaryTreeNode node, int value) { + if (node == null) throw new RuntimeException("no such node has value = " + value); + + T data = node.getData(); + if (data.compareTo(value) == 0) { + if (node.left == null && node.right == null) { + node = null; + } else if (node.left != null && node.right == null) { + node.data = node.left.data; + node.left = null; + } else if (node.left == null && node.right != null) { + node.data = node.right.data; + node.right = null; + } else { + T replace = findMin(node.right); + node.data = replace; + remove(node.right, (Integer)replace); + } + } else if (data.compareTo(value) == -1) { + remove(node.right, value); + } else { + remove(node.left, value); + } + } - public BinaryTreeNode getRoot(){ - return root; - } - - public T findMin(){ - List list = BinaryTreeUtil.preOrderVisit(root); - T min = list.get(0); - for(T t : list){ - min = min.compareTo(t) == -1 ? min : t; - } - return min; - } - public T findMax(){ - List list = BinaryTreeUtil.preOrderVisit(root); - T max = list.get(0); - for(T t : list){ - max = max.compareTo(t) == 1 ? max : t; - } - return max; - } - - public int height() { - return calHeight(root); - } - - private int calHeight(BinaryTreeNode root){ - if(root == null) return 0; - - int left = calHeight(root.left); - int right = calHeight(root.right); - - return (left > right ? left : right) + 1; - - } - - public int size() { - List list = BinaryTreeUtil.preOrderVisit(root); - return list.size(); - } - - public void remove(T e){ - find(root, (Integer) e); - } - - private BinaryTreeNode find(BinaryTreeNode node, int value){ - if(node.getData().compareTo(value) == 0){ - return node; - } - - return null; - } - - private void noLeafRemove(){ - - } - - private void oneChildRemove(){ - - } } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java index 13ddb13c4f..6dbef3a2bc 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java @@ -48,8 +48,8 @@ public void testSize() { @Test public void testRemoveLeaf() { tree.remove(4); -// BinaryTreeNode root= tree.getRoot(); -// Assert.assertEquals(3, root.left.right.data.intValue()); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); } @Test diff --git a/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java b/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java index ad8284dcbc..483efec77d 100644 --- a/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java +++ b/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java @@ -1,6 +1,7 @@ package gabageCollection; -import org.junit.Test; +import java.util.ArrayList; +import java.util.List; /** * @author : 温友朝 @@ -8,18 +9,25 @@ */ public class MemoryLeakSimulation { - @Test - public void testOutOfMemory(){ - + public static void testOutOfMemory(){ +// List list = new ArrayList(); + List list = new ArrayList(); + for(;;){ + list.add(new byte[10*1024*1024]); + } } - @Test - public void testStackOverFlowError(){ - + public static void testStackOverFlowError(){ + testStackOverFlowError(); } - @Test - public void testOutOfMemoryPermGenSpace(){ + public static void testOutOfMemoryPermGenSpace(){ + //出现在热部署时最多 + } + public static void main(String[] args){ +// testOutOfMemory(); +// testStackOverFlowError(); + testOutOfMemoryPermGenSpace(); } } From 2968d25b1c6a072cac863560c61162c91f16719e Mon Sep 17 00:00:00 2001 From: lzb Date: Fri, 19 May 2017 01:36:28 +0800 Subject: [PATCH 530/552] =?UTF-8?q?11=E5=91=A8=E4=BD=9C=E4=B8=9A=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/lzb/boom/BoomClassLoader.java | 41 +++++++++++++++++ .../src/main/java/me/lzb/boom/MemoryBoom.java | 44 +++++++++++++++++++ .../src/test/java/me/lzb/boom/Boom.java | 7 +++ .../src/test/java/me/lzb/boom/BoomTest.java | 41 +++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/BoomClassLoader.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/boom/Boom.java create mode 100644 group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/boom/BoomTest.java diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/BoomClassLoader.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/BoomClassLoader.java new file mode 100644 index 0000000000..e72388e169 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/BoomClassLoader.java @@ -0,0 +1,41 @@ +package me.lzb.boom; + +import me.lzb.common.utils.FileUtils; + +import java.io.File; +import java.io.IOException; + +/** + * @author LZB + */ +public class BoomClassLoader extends ClassLoader { + + + //类加载器的名称 + private String name; + private String path; + + BoomClassLoader(String name, String path) { + this.name = name; + this.path = path; + } + + BoomClassLoader(ClassLoader parent, String name) { + super(parent); + this.name = name; + } + + /** + * 重写findClass方法 + */ + @Override + public Class findClass(String name) { + byte[] data = new byte[0]; + try { + data = FileUtils.readByteCodes(path + name.replace('.', File.separatorChar) + ".class"); + } catch (IOException e) { + } + return this.defineClass(name, data, 0, data.length); + } + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java new file mode 100644 index 0000000000..99681c6dba --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java @@ -0,0 +1,44 @@ +package me.lzb.boom; + + +import java.util.ArrayList; +import java.util.List; + +/** + * @author LZB + */ +public class MemoryBoom { + + + public void metaspaceBoom() { + String path = MemoryBoom.class.getResource("/").getPath(); + String className = "me.lzb.boom.Boom"; + List list = new ArrayList(); + while (true) { + BoomClassLoader classLoader = new BoomClassLoader("boom", path); + Class cls = classLoader.findClass(className); +// try { +// list.add(cls.newInstance()); +// } catch (InstantiationException e) { +// e.printStackTrace(); +// } catch (IllegalAccessException e) { +// e.printStackTrace(); +// } + } + + } + + + public void outOfMemoryBoom() { + List list = new ArrayList(); + while (true) { + list.add(new MemoryBoom()); + } + } + + public void stackOverflowBoom() { + stackOverflowBoom(); + } + + +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/boom/Boom.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/boom/Boom.java new file mode 100644 index 0000000000..5bf215797d --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/boom/Boom.java @@ -0,0 +1,7 @@ +package me.lzb.boom; + +/** + * @author LZB + */ +public class Boom { +} diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/boom/BoomTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/boom/BoomTest.java new file mode 100644 index 0000000000..92fba0e250 --- /dev/null +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/boom/BoomTest.java @@ -0,0 +1,41 @@ +package me.lzb.boom; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +/** + * @author LZB + */ +public class BoomTest { + + private MemoryBoom boom; + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Before + public void instantiate() throws Exception { + boom = new MemoryBoom(); + } + + @Test + public void metaspaceBoomTest() { + boom.metaspaceBoom(); + } + + @Test + public void outOfMemoryBoomTest() { + thrown.expect(OutOfMemoryError.class); + thrown.expectMessage("Java heap space"); + boom.outOfMemoryBoom(); + } + + + @Test + public void stackOverflowBoomTest() { + thrown.expect(StackOverflowError.class); + boom.stackOverflowBoom(); + } +} From ee314308ee167d8eae6cc831723c9b6e369c71c0 Mon Sep 17 00:00:00 2001 From: lzb Date: Fri, 19 May 2017 01:44:53 +0800 Subject: [PATCH 531/552] =?UTF-8?q?=E5=8A=A0=E7=82=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java index 99681c6dba..7988d27c7c 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/boom/MemoryBoom.java @@ -9,7 +9,10 @@ */ public class MemoryBoom { - + //-XX:MaxMetaspaceSize,最大空间,默认没有限制 + //-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整。如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。 + //-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集 + //-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集 public void metaspaceBoom() { String path = MemoryBoom.class.getResource("/").getPath(); String className = "me.lzb.boom.Boom"; From 821d3207e3c8485b38ec2689fa14fb1105decb1e Mon Sep 17 00:00:00 2001 From: sdnb Date: Fri, 19 May 2017 07:01:41 +0800 Subject: [PATCH 532/552] =?UTF-8?q?=E7=AC=AC10=E5=91=A8=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/coding/week10/BinaryTreeNode.java | 63 +++++++++ .../com/coding/week10/BinaryTreeUtil.java | 130 ++++++++++++++++++ .../main/java/com/coding/week10/FileList.java | 47 +++++++ .../com/coding/week9/StackWithTwoQueues.java | 5 +- .../com/coding/week10/BinaryTreeUtilTest.java | 75 ++++++++++ 5 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 group24/494800949/src/main/java/com/coding/week10/BinaryTreeNode.java create mode 100644 group24/494800949/src/main/java/com/coding/week10/BinaryTreeUtil.java create mode 100644 group24/494800949/src/main/java/com/coding/week10/FileList.java create mode 100644 group24/494800949/src/test/java/com/coding/week10/BinaryTreeUtilTest.java diff --git a/group24/494800949/src/main/java/com/coding/week10/BinaryTreeNode.java b/group24/494800949/src/main/java/com/coding/week10/BinaryTreeNode.java new file mode 100644 index 0000000000..c7fdd2b665 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week10/BinaryTreeNode.java @@ -0,0 +1,63 @@ +package com.coding.week10; + + +public class BinaryTreeNode>{ + + private T data; + private BinaryTreeNode left; + private BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + @SuppressWarnings("unchecked") + T o1 = (T)o; + BinaryTreeNode newNode = new BinaryTreeNode<>(o1); + if (data.compareTo(o1) > 0 ) { + if (left == null) { + left = newNode; + } else { + left.insert(o); + } + } else { + if (right == null) { + right = newNode; + } else { + right.insert(o); + } + } + return newNode; + } + + public static void main(String[] args) { + BinaryTreeNode b = new BinaryTreeNode<>(2); + b.insert(3).insert(5).insert(1); + b.insert(6); + b.insert(8); + b.insert(1); + System.out.println(BinaryTreeUtil.preOrderVisit(b)); + +// BinaryTreeNode b1 = new BinaryTreeNode<>(new AtomicInteger(3)); +// b1.insert(new AtomicInteger(4)); + } +} diff --git a/group24/494800949/src/main/java/com/coding/week10/BinaryTreeUtil.java b/group24/494800949/src/main/java/com/coding/week10/BinaryTreeUtil.java new file mode 100644 index 0000000000..24e74d546a --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week10/BinaryTreeUtil.java @@ -0,0 +1,130 @@ +package com.coding.week10; + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + BinaryTreeNode left = root.getLeft(); + BinaryTreeNode right = root.getRight(); + result.add(root.getData()); + if (left != null) { + List leftList = preOrderVisit(left); + result.addAll(leftList); + } + if (right != null) { + List rightList = preOrderVisit(right); + result.addAll(rightList); + } + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + BinaryTreeNode left = root.getLeft(); + BinaryTreeNode right = root.getRight(); + + if (left != null) { + List leftList = inOrderVisit(left); + result.addAll(leftList); + } + result.add(root.getData()); + if (right != null) { + List rightList = inOrderVisit(right); + result.addAll(rightList); + } + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList(); + BinaryTreeNode left = root.getLeft(); + BinaryTreeNode right = root.getRight(); + + if (left != null) { + List leftList = postOrderVisit(left); + result.addAll(leftList); + } + + if (right != null) { + List rightList = postOrderVisit(right); + result.addAll(rightList); + } + result.add(root.getData()); + return result; + } + /** + * 用非递归的方式实现对二叉树的前序遍历 + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + + List result = new ArrayList(); + Stack> stack = new Stack<>(); + stack.push(root); + while (!stack.isEmpty()){ + BinaryTreeNode node = stack.pop(); + result.add(node.getData()); + if (node.getRight() != null) { + stack.push(node.getRight()); + } + if (node.getLeft() != null) { + stack.push(node.getLeft()); + } + + } + + return result; + } + /** + * 用非递归的方式实现对二叉树的中序遍历 + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + List result = new ArrayList(); + Stack> stack = new Stack>(); + BinaryTreeNode p = root; + while (p != null) { + while (p != null) { + if (p.getRight() != null) + stack.push(p.getRight());// 当前节点右子入栈 + stack.push(p);// 当前节点入栈 + p = p.getLeft(); + } + p = stack.pop(); + while (!stack.empty() && p.getRight() == null) { + result.add(p.getData()); + p = stack.pop(); + } + result.add(p.getData()); + if (!stack.empty()) + p = stack.pop(); + else + p = null; + } + return result; + } + +} diff --git a/group24/494800949/src/main/java/com/coding/week10/FileList.java b/group24/494800949/src/main/java/com/coding/week10/FileList.java new file mode 100644 index 0000000000..578c036ba5 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week10/FileList.java @@ -0,0 +1,47 @@ +package com.coding.week10; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class FileList { + + private List fileList = new ArrayList<>(); + + public void list(File f) { + + /* + 1 如果f为空或不存在返回 + 2 如果f是文件,则直接add并返回 + 3 如果f是文件夹,则递归调用list + */ + if (f == null || !f.exists()) { + return; + } + if (f.isFile()) { + fileList.add(f); + return; + } + if (f.isDirectory()) { + File[] files = f.listFiles(); + if (files != null) { + for (File file : files) { + list(file); + } + } + } + } + + public static void main(String[] args) { + FileList list = new FileList(); + File f = new File("H:\\sourceCode\\coding2017\\group24\\494800949"); + + list.list(f); + + System.out.println(list.fileList.size()); + for (File file : list.fileList) { + System.out.println(file.getName()); + } + } + +} diff --git a/group24/494800949/src/main/java/com/coding/week9/StackWithTwoQueues.java b/group24/494800949/src/main/java/com/coding/week9/StackWithTwoQueues.java index f55bad77ca..76494e20df 100644 --- a/group24/494800949/src/main/java/com/coding/week9/StackWithTwoQueues.java +++ b/group24/494800949/src/main/java/com/coding/week9/StackWithTwoQueues.java @@ -24,13 +24,14 @@ public int pop() { queue2.enQueue(queue1.deQueue()); } return queue1.deQueue(); - } else { + } + if (queue1.isEmpty()){ while (queue2.size() > 1) { queue1.enQueue(queue2.deQueue()); } return queue2.deQueue(); } - + throw new UnsupportedOperationException(); } diff --git a/group24/494800949/src/test/java/com/coding/week10/BinaryTreeUtilTest.java b/group24/494800949/src/test/java/com/coding/week10/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..3f9127679a --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week10/BinaryTreeUtilTest.java @@ -0,0 +1,75 @@ +package com.coding.week10; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + + + +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} From 36158e1ffa166123bdaedc2057f4630001af8bde Mon Sep 17 00:00:00 2001 From: sdnb Date: Fri, 19 May 2017 07:09:31 +0800 Subject: [PATCH 533/552] modify binaryTreeUtil --- .../java/com/coding/week10/BinaryTreeUtil.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/group24/494800949/src/main/java/com/coding/week10/BinaryTreeUtil.java b/group24/494800949/src/main/java/com/coding/week10/BinaryTreeUtil.java index 24e74d546a..6855d2cbc2 100644 --- a/group24/494800949/src/main/java/com/coding/week10/BinaryTreeUtil.java +++ b/group24/494800949/src/main/java/com/coding/week10/BinaryTreeUtil.java @@ -4,14 +4,14 @@ import java.util.List; import java.util.Stack; -public class BinaryTreeUtil { +public class BinaryTreeUtil { /** * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 * * @param root * @return */ - public static List preOrderVisit(BinaryTreeNode root) { + public static > List preOrderVisit(BinaryTreeNode root) { List result = new ArrayList(); BinaryTreeNode left = root.getLeft(); BinaryTreeNode right = root.getRight(); @@ -33,8 +33,8 @@ public static List preOrderVisit(BinaryTreeNode root) { * @param root * @return */ - public static List inOrderVisit(BinaryTreeNode root) { - List result = new ArrayList(); + public static > List inOrderVisit(BinaryTreeNode root) { + List result = new ArrayList<>(); BinaryTreeNode left = root.getLeft(); BinaryTreeNode right = root.getRight(); @@ -56,8 +56,8 @@ public static List inOrderVisit(BinaryTreeNode root) { * @param root * @return */ - public static List postOrderVisit(BinaryTreeNode root) { - List result = new ArrayList(); + public static > List postOrderVisit(BinaryTreeNode root) { + List result = new ArrayList<>(); BinaryTreeNode left = root.getLeft(); BinaryTreeNode right = root.getRight(); @@ -78,7 +78,7 @@ public static List postOrderVisit(BinaryTreeNode root) { * @param root * @return */ - public static List preOrderWithoutRecursion(BinaryTreeNode root) { + public static > List preOrderWithoutRecursion(BinaryTreeNode root) { List result = new ArrayList(); Stack> stack = new Stack<>(); @@ -102,7 +102,7 @@ public static List preOrderWithoutRecursion(BinaryTreeNode root) { * @param root * @return */ - public static List inOrderWithoutRecursion(BinaryTreeNode root) { + public static > List inOrderWithoutRecursion(BinaryTreeNode root) { List result = new ArrayList(); Stack> stack = new Stack>(); BinaryTreeNode p = root; From 13f65e6664b7250884d683b52f42928ec3c4ec96 Mon Sep 17 00:00:00 2001 From: sdnb Date: Fri, 19 May 2017 08:03:27 +0800 Subject: [PATCH 534/552] =?UTF-8?q?jvm=E6=9C=80=E5=90=8E=E4=B8=80=E8=AF=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coderising/jvm/attr/ConstantValue.java | 21 +++++ .../coderising/jvm/cmd/ByteCodeCommand.java | 4 +- .../com/coderising/jvm/cmd/CommandParser.java | 22 +++++ .../com/coderising/jvm/cmd/ComparisonCmd.java | 85 +++++++++++++++++++ .../com/coderising/jvm/cmd/IncrementCmd.java | 45 ++++++++++ .../com/coderising/jvm/cmd/NoOperandCmd.java | 3 + .../src/com/coderising/jvm/field/Field.java | 36 ++++++-- .../coderising/jvm/{ => test}/EmployeeV1.java | 2 +- .../com/coderising/jvm/test/EmployeeV2.java | 54 ++++++++++++ .../src/com/coderising/jvm/test/Example.java | 16 ++++ .../coderising/jvm/test/HourlyEmployee.java | 27 ++++++ .../com/coding/week11/BinarySearchTree.java | 33 +++++++ .../com/coding/mini_jvm/test/EmployeeV2.java | 54 ++++++++++++ .../com/coding/mini_jvm/test/Example.java | 16 ++++ .../coding/mini_jvm/test/HourlyEmployee.java | 27 ++++++ .../com/coding/mini_jvm/test/MiniJVMTest.java | 17 ++-- .../coding/week11/BinarySearchTreeTest.java | 66 ++++++++++++++ .../coderising/jvm/attr/ConstantValue.java | 21 +++++ 18 files changed, 534 insertions(+), 15 deletions(-) create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/ConstantValue.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ComparisonCmd.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/IncrementCmd.java rename group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/{ => test}/EmployeeV1.java (90%) create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/EmployeeV2.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/Example.java create mode 100644 group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/HourlyEmployee.java create mode 100644 group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java create mode 100644 group24/494800949/src/test/java/com/coding/mini_jvm/test/EmployeeV2.java create mode 100644 group24/494800949/src/test/java/com/coding/mini_jvm/test/Example.java create mode 100644 group24/494800949/src/test/java/com/coding/mini_jvm/test/HourlyEmployee.java create mode 100644 group24/494800949/src/test/java/com/coding/week11/BinarySearchTreeTest.java create mode 100644 liuxin/mini-jvm/assignment/src/com/coderising/jvm/attr/ConstantValue.java diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/ConstantValue.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/ConstantValue.java new file mode 100644 index 0000000000..2dce853e5e --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/attr/ConstantValue.java @@ -0,0 +1,21 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.attr; + +public class ConstantValue extends AttributeInfo { + + private int constValueIndex; + + public ConstantValue(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + public int getConstValueIndex() { + return constValueIndex; + } + public void setConstValueIndex(int constValueIndex) { + this.constValueIndex = constValueIndex; + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java index d22bd332ba..33db2d02a3 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ByteCodeCommand.java @@ -19,7 +19,9 @@ public abstract class ByteCodeCommand { static { codeMap.put("01", "aconst_null"); - + codeMap.put("A2", "if_icmp_ge"); + codeMap.put("A4", "if_icmple"); + codeMap.put("A7", "goto"); codeMap.put("BB", "new"); codeMap.put("37", "lstore"); codeMap.put("B7", "invokespecial"); diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java index dd01d38872..28976cd26b 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/CommandParser.java @@ -32,6 +32,7 @@ public class CommandParser { public static final String astore_1 = "4C"; public static final String if_icmp_ge = "A2"; + public static final String if_icmp_gt = "A3"; public static final String if_icmple = "A4"; public static final String goto_no_condition = "A7"; public static final String iconst_0 = "03"; @@ -99,12 +100,33 @@ public static ByteCodeCommand[] parse(ClassFile clzFile, String codes) { case aload_1: case iload_1: case iload_2: + case iload_3: case istore_1: case voidreturn: + case iconst_0: + case iconst_1: + case istore_2: + case iadd: + case ireturn: case dup: NoOperandCmd noOperandCmd = new NoOperandCmd(clzFile, operCode); cmds.add(noOperandCmd); break; + case if_icmp_ge: + case if_icmple: + case if_icmp_gt: + case goto_no_condition: + ComparisonCmd cmd1 = new ComparisonCmd(clzFile,operCode); + cmd1.setOprand1(cmdIter.next2CharAsInt()); + cmd1.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(cmd1); + break; + case iinc: + IncrementCmd incrementCmd = new IncrementCmd(clzFile,operCode); + incrementCmd.setOprand1(cmdIter.next2CharAsInt()); + incrementCmd.setOprand2(cmdIter.next2CharAsInt()); + cmds.add(incrementCmd); + break; default: throw new RuntimeException("this oper [ " +operCode+ " ]not impl yet"); } diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ComparisonCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ComparisonCmd.java new file mode 100644 index 0000000000..78af7a4dbe --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/ComparisonCmd.java @@ -0,0 +1,85 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; + +public class ComparisonCmd extends TwoOperandCmd { + + protected ComparisonCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + + @Override + public void execute(StackFrame frame,ExecutionResult result) { + + if(CommandParser.if_icmp_ge.equals(this.getOpCode())){ + //注意次序 + JavaObject jo2 = frame.getOprandStack().pop(); + JavaObject jo1 = frame.getOprandStack().pop(); + + if(jo1.getIntValue() >= jo2.getIntValue()){ + + this.setJumpResult(result); + + } + + } else if(CommandParser.if_icmple.equals(this.getOpCode())){ + //注意次序 + JavaObject jo2 = frame.getOprandStack().pop(); + JavaObject jo1 = frame.getOprandStack().pop(); + + if(jo1.getIntValue() <= jo2.getIntValue()){ + this.setJumpResult(result); + } + + } else if(CommandParser.goto_no_condition.equals(this.getOpCode())){ + this.setJumpResult(result); + + } else{ + throw new RuntimeException(this.getOpCode() + "has not been implemented"); + } + + + + + } + + private int getOffsetFromStartCmd(){ + //If the comparison succeeds, the unsigned branchbyte1 and branchbyte2 + //are used to construct a signed 16-bit offset, where the offset is calculated + //to be (branchbyte1 << 8) | branchbyte2. Execution then proceeds at that + //offset from the address of the opcode of this if_icmp instruction + + + int index1 = this.getOprand1(); + int index2 = this.getOprand2(); + short offsetFromCurrent = (short)(index1 << 8 | index2); + return this.getOffset() + offsetFromCurrent ; + } + private void setJumpResult(ExecutionResult result){ + + int offsetFromStartCmd = this.getOffsetFromStartCmd(); + + result.setNextAction(ExecutionResult.JUMP); + result.setNextCmdOffset(offsetFromStartCmd); + } + + @Override + public String toString() { + int index = this.getIndex(); + String text = this.getReadableCodeText(); + return this.getOffset()+":"+ this.getOpCode() + " "+text + " " + this.getOffsetFromStartCmd(); + } + + @Override + public String toString(ConstantPool pool) { + return null; + } + +} diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/IncrementCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/IncrementCmd.java new file mode 100644 index 0000000000..c11e04ea15 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/IncrementCmd.java @@ -0,0 +1,45 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.cmd; + + +import com.coding.mini_jvm.src.com.coderising.jvm.clz.ClassFile; +import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.ExecutionResult; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.Heap; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.JavaObject; +import com.coding.mini_jvm.src.com.coderising.jvm.engine.StackFrame; + +public class IncrementCmd extends TwoOperandCmd { + + public IncrementCmd(ClassFile clzFile, String opCode) { + super(clzFile, opCode); + + } + + @Override + public String toString() { + + return this.getOffset()+":"+this.getOpCode()+ " " +this.getReadableCodeText(); + } + + @Override + public String toString(ConstantPool pool) { + return null; + } + + @Override + public void execute(StackFrame frame, ExecutionResult result) { + + int index = this.getOprand1(); + + int constValue = this.getOprand2(); + + int currentValue = frame.getLocalVariableValue(index).getIntValue(); + + JavaObject jo = Heap.getInstance().newInt(constValue+currentValue); + + frame.setLocalVariableValue(index, jo); + + + } + +} \ No newline at end of file diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java index afbbd6248e..0ae1536043 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/cmd/NoOperandCmd.java @@ -35,6 +35,9 @@ public void execute(StackFrame frame, ExecutionResult result) { } else if (CommandParser.iload_2.equals(this.getOpCode())) { JavaObject jo = frame.getLocalVariableValue(2); frame.getOprandStack().push(jo); + } else if (CommandParser.iload_3.equals(this.getOpCode())) { + JavaObject jo = frame.getLocalVariableValue(3); + frame.getOprandStack().push(jo); } else if (CommandParser.istore_1.equals(this.getOpCode())) { JavaObject jo = frame.getOprandStack().pop(); frame.setLocalVariableValue(1, jo); diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java index 18bcdb2851..280f67d640 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/field/Field.java @@ -1,15 +1,19 @@ package com.coding.mini_jvm.src.com.coderising.jvm.field; +import com.coding.mini_jvm.src.com.coderising.jvm.attr.AttributeInfo; +import com.coding.mini_jvm.src.com.coderising.jvm.attr.ConstantValue; import com.coding.mini_jvm.src.com.coderising.jvm.constant.ConstantPool; import com.coding.mini_jvm.src.com.coderising.jvm.loader.ByteCodeIterator; -public class Field { - private int accessFlag; - private int nameIndex; - private int descriptorIndex; +public class Field { + private int accessFlag; + private int nameIndex; + private int descriptorIndex; + private ConstantValue constValue; + private ConstantPool pool; public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool pool) { @@ -20,17 +24,33 @@ public Field(int accessFlag, int nameIndex, int descriptorIndex, ConstantPool po } - public static Field parse(ConstantPool pool,ByteCodeIterator iter){ + public static Field parse(ConstantPool pool, ByteCodeIterator iter) { int accessFlag = iter.readTwoBytesToInt(); int nameIndex = iter.readTwoBytesToInt(); int descIndex = iter.readTwoBytesToInt(); int attributesCount = iter.readTwoBytesToInt(); - if (attributesCount > 0) - throw new RuntimeException("attributeCount of field not impl"); - return new Field(accessFlag, nameIndex, descIndex, pool); + Field f = new Field(accessFlag, nameIndex, descIndex, pool); + for( int i=1; i<= attributesCount; i++){ + int attrNameIndex = iter.readTwoBytesToInt(); + String attrName = pool.getUTF8String(attrNameIndex); + + if(AttributeInfo.CONST_VALUE.equals(attrName)){ + int attrLen = iter.readFourBytesToInt(); + ConstantValue constValue = new ConstantValue(attrNameIndex, attrLen); + constValue.setConstValueIndex(iter.readTwoBytesToInt()); + f.setConstValue(constValue); + } else{ + throw new RuntimeException("the attribute " + attrName + " has not been implemented yet."); + } + } + return f; } + public void setConstValue(ConstantValue constValue) { + this.constValue = constValue; + } + @Override public String toString() { return pool.getUTF8String(nameIndex)+":"+pool.getUTF8String(descriptorIndex); diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/EmployeeV1.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/EmployeeV1.java similarity index 90% rename from group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/EmployeeV1.java rename to group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/EmployeeV1.java index e6bc33f6b0..cda835cf9f 100644 --- a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/EmployeeV1.java +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/EmployeeV1.java @@ -1,4 +1,4 @@ -package com.coding.mini_jvm.src.com.coderising.jvm; +package com.coding.mini_jvm.src.com.coderising.jvm.test; public class EmployeeV1 { diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/EmployeeV2.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/EmployeeV2.java new file mode 100644 index 0000000000..5dbdba24f8 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/EmployeeV2.java @@ -0,0 +1,54 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.test; + +public class EmployeeV2 { + + public final static String TEAM_NAME = "Dev Team"; + private String name; + private int age; + public EmployeeV2(String name, int age) { + this.name = name; + this.age = age; + } + + public void sayHello() { + System.out.println("Hello , this is class Employee "); + System.out.println(TEAM_NAME); + System.out.println(this.name); + } + + public void setName(String name) { + this.name = name; + } + + public void setAge(int age) { + this.age = age; + } + + + + public void isYouth() { + if (age < 40) { + System.out.println("You're still young"); + } else { + System.out.println("You're old"); + } + } + + + + public void testAdd() { + int sum = 0; + for (int i = 1; i <= 100; i++) { + sum += i; + } + System.out.println(sum); + } + + + public static void main(String[] args) { + EmployeeV2 p = new EmployeeV2("Andy", 35); + p.sayHello(); + p.isYouth(); + p.testAdd(); + } +} \ No newline at end of file diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/Example.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/Example.java new file mode 100644 index 0000000000..afb71ca6d1 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/Example.java @@ -0,0 +1,16 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.test; + +public class Example { + public void disp(char c){ + System.out.println(c); + } + public void disp(int c){ + System.out.println(c ); + } + public static void main(String args[]){ + Example obj = new Example(); + obj.disp('a'); + obj.disp(5); + } +} + diff --git a/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/HourlyEmployee.java b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/HourlyEmployee.java new file mode 100644 index 0000000000..371f281bf4 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/mini_jvm/src/com/coderising/jvm/test/HourlyEmployee.java @@ -0,0 +1,27 @@ +package com.coding.mini_jvm.src.com.coderising.jvm.test; + +public class HourlyEmployee extends EmployeeV2 { + + int hourlySalary; + + public HourlyEmployee(String name, + int age, int hourlySalary) { + super(name, age); + this.hourlySalary = hourlySalary; + } + + public void sayHello(){ + System.out.println("Hello , this is Hourly Employee"); + } + public static void main(String[] args){ + EmployeeV2 e = new HourlyEmployee("Lisa", 20, 40); + e.sayHello(); + } + + public int getHourlySalary(){ + return this.hourlySalary; + } + + + +} diff --git a/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java b/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java new file mode 100644 index 0000000000..2a8bccee81 --- /dev/null +++ b/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java @@ -0,0 +1,33 @@ +package com.coding.week11; + +import com.coding.week10.BinaryTreeNode; + +public class BinarySearchTree> { + + BinaryTreeNode root; + + public BinarySearchTree(BinaryTreeNode root) { + this.root = root; + } + + public BinaryTreeNode getRoot() { + return root; + } + public T findMin(){ + return null; + } + public T findMax(){ + return null; + } + public int height() { + return -1; + } + public int size() { + return -1; + } + public void remove(T e){ + + } + +} + diff --git a/group24/494800949/src/test/java/com/coding/mini_jvm/test/EmployeeV2.java b/group24/494800949/src/test/java/com/coding/mini_jvm/test/EmployeeV2.java new file mode 100644 index 0000000000..4cee388114 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/mini_jvm/test/EmployeeV2.java @@ -0,0 +1,54 @@ +package com.coding.mini_jvm.test; + +public class EmployeeV2 { + + public final static String TEAM_NAME = "Dev Team"; + private String name; + private int age; + public EmployeeV2(String name, int age) { + this.name = name; + this.age = age; + } + + public void sayHello() { + System.out.println("Hello , this is class Employee "); + System.out.println(TEAM_NAME); + System.out.println(this.name); + } + + public void setName(String name) { + this.name = name; + } + + public void setAge(int age) { + this.age = age; + } + + + + public void isYouth() { + if (age < 40) { + System.out.println("You're still young"); + } else { + System.out.println("You're old"); + } + } + + + + public void testAdd() { + int sum = 0; + for (int i = 1; i <= 100; i++) { + sum += i; + } + System.out.println(sum); + } + + + public static void main(String[] args) { + EmployeeV2 p = new EmployeeV2("Andy", 35); + p.sayHello(); + p.isYouth(); + p.testAdd(); + } +} \ No newline at end of file diff --git a/group24/494800949/src/test/java/com/coding/mini_jvm/test/Example.java b/group24/494800949/src/test/java/com/coding/mini_jvm/test/Example.java new file mode 100644 index 0000000000..4fe1db46fb --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/mini_jvm/test/Example.java @@ -0,0 +1,16 @@ +package com.coding.mini_jvm.test; + +public class Example{ + public void disp(char c){ + System.out.println(c); + } + public void disp(int c){ + System.out.println(c ); + } + public static void main(String args[]){ + Example obj = new Example(); + obj.disp('a'); + obj.disp(5); + } +} + diff --git a/group24/494800949/src/test/java/com/coding/mini_jvm/test/HourlyEmployee.java b/group24/494800949/src/test/java/com/coding/mini_jvm/test/HourlyEmployee.java new file mode 100644 index 0000000000..3d428a8a2c --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/mini_jvm/test/HourlyEmployee.java @@ -0,0 +1,27 @@ +package com.coding.mini_jvm.test; + +public class HourlyEmployee extends EmployeeV2 { + + int hourlySalary; + + public HourlyEmployee(String name, + int age, int hourlySalary) { + super(name, age); + this.hourlySalary = hourlySalary; + } + + public void sayHello(){ + System.out.println("Hello , this is Hourly Employee"); + } + public static void main(String[] args){ + EmployeeV2 e = new HourlyEmployee("Lisa", 20, 40); + e.sayHello(); + } + + public int getHourlySalary(){ + return this.hourlySalary; + } + + + +} diff --git a/group24/494800949/src/test/java/com/coding/mini_jvm/test/MiniJVMTest.java b/group24/494800949/src/test/java/com/coding/mini_jvm/test/MiniJVMTest.java index 53694f30a4..614c2daff6 100644 --- a/group24/494800949/src/test/java/com/coding/mini_jvm/test/MiniJVMTest.java +++ b/group24/494800949/src/test/java/com/coding/mini_jvm/test/MiniJVMTest.java @@ -20,13 +20,20 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { } +// +// @Test +// public void testMain() throws Exception { +// String[] classPaths = {PATH, PATH1, PATH2}; +// MiniJVM jvm = new MiniJVM(); +// jvm.run(classPaths, "com.coding.mini_jvm.src.com.coderising.jvm.test.EmployeeV1"); +// +// } @Test - public void testMain() throws Exception { - String[] classPaths = {PATH, PATH1, PATH2}; + public void testMain() throws Exception{ + String[] classPaths = {PATH}; MiniJVM jvm = new MiniJVM(); - jvm.run(classPaths, "com.coding.mini_jvm.src.com.coderising.jvm.EmployeeV1"); - - } + jvm.run(classPaths, "com.coding.mini_jvm.src.com.coderising.jvm.test.HourlyEmployee"); + } } diff --git a/group24/494800949/src/test/java/com/coding/week11/BinarySearchTreeTest.java b/group24/494800949/src/test/java/com/coding/week11/BinarySearchTreeTest.java new file mode 100644 index 0000000000..433d3dba55 --- /dev/null +++ b/group24/494800949/src/test/java/com/coding/week11/BinarySearchTreeTest.java @@ -0,0 +1,66 @@ +package com.coding.week11; + +import com.coding.week10.BinaryTreeNode; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinarySearchTreeTest { + + BinarySearchTree tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.setLeft(new BinaryTreeNode(2)); + root.setRight( new BinaryTreeNode(8)); + root.getLeft().setLeft(new BinaryTreeNode(1)); + root.getLeft().setRight(new BinaryTreeNode(4)); + root.getLeft().getRight().setLeft(new BinaryTreeNode(3)); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + + } + + @Test + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); + } + + @Test + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.getLeft().getRight().getData().intValue()); + + } + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.getLeft().getData().intValue()); + Assert.assertEquals(4, root.getLeft().getRight().getData().intValue()); + } +} diff --git a/liuxin/mini-jvm/assignment/src/com/coderising/jvm/attr/ConstantValue.java b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/attr/ConstantValue.java new file mode 100644 index 0000000000..9b23856bf4 --- /dev/null +++ b/liuxin/mini-jvm/assignment/src/com/coderising/jvm/attr/ConstantValue.java @@ -0,0 +1,21 @@ +package com.coderising.jvm.attr; + +public class ConstantValue extends AttributeInfo { + + private int constValueIndex; + + public ConstantValue(int attrNameIndex, int attrLen) { + super(attrNameIndex, attrLen); + } + + + public int getConstValueIndex() { + return constValueIndex; + } + public void setConstValueIndex(int constValueIndex) { + this.constValueIndex = constValueIndex; + } + + + +} From f481229293b685a7b05c3dd41ef09fbeafeed188 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Sat, 20 May 2017 13:21:21 +0800 Subject: [PATCH 535/552] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/{ => array}/ArrayList.java | 4 +- .../basic}/array/ArrayUtil.java | 3 +- .../coding2017/basic/queue/Josephus.java | 2 +- .../coding2017/basic/queue/Queue.java | 6 +- .../basic/stack/expr/InfixToPostfix.java | 2 +- .../basic/stack/expr/TokenParser.java | 2 +- .../basic/{ => tree}/BinarySearchTree.java | 2 +- .../coding2017/basic/tree/BinaryTreeNode.java | 44 ++++++ .../coding2017/basic/tree/BinaryTreeUtil.java | 145 ++++++++++++++++++ .../coding2017/basic/tree/FileList.java | 37 +++++ .../basic/{ => array}/ArrayListTest.java | 3 +- .../basic}/array/ArrayUtilTest.java | 2 +- .../basic/linklist/LRUPageFrameTest.java | 0 .../basic/{ => linklist}/LinkedListTest.java | 2 +- .../coding2017/basic/queue/JosephusTest.java | 0 .../basic/{ => queue}/QueueTest.java | 2 +- .../basic/{ => stack}/StackTest.java | 2 +- .../{ => tree}/BinarySearchTreeTest.java | 3 +- .../basic/tree/BinaryTreeUtilTest.java | 79 ++++++++++ .../coding2017/basic/tree/FileListTest.java | 14 ++ 20 files changed, 338 insertions(+), 16 deletions(-) rename group24/315863321/src/main/java/com/johnChnia/coding2017/basic/{ => array}/ArrayList.java (98%) rename group24/315863321/src/main/java/com/johnChnia/{coderising2017 => coding2017/basic}/array/ArrayUtil.java (98%) rename group24/315863321/src/main/java/com/johnChnia/coding2017/basic/{ => tree}/BinarySearchTree.java (98%) create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinaryTreeNode.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinaryTreeUtil.java create mode 100644 group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/FileList.java rename group24/315863321/src/test/java/com/johnChnia/coding2017/basic/{ => array}/ArrayListTest.java (94%) rename group24/315863321/src/test/java/com/johnChnia/{coderising2017 => coding2017/basic}/array/ArrayUtilTest.java (98%) rename group24/315863321/src/{main => test}/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java (100%) rename group24/315863321/src/test/java/com/johnChnia/coding2017/basic/{ => linklist}/LinkedListTest.java (99%) rename group24/315863321/src/{main => test}/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java (100%) rename group24/315863321/src/test/java/com/johnChnia/coding2017/basic/{ => queue}/QueueTest.java (96%) rename group24/315863321/src/test/java/com/johnChnia/coding2017/basic/{ => stack}/StackTest.java (97%) rename group24/315863321/src/test/java/com/johnChnia/coding2017/basic/{ => tree}/BinarySearchTreeTest.java (88%) create mode 100644 group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinaryTreeUtilTest.java create mode 100644 group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/FileListTest.java diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/array/ArrayList.java similarity index 98% rename from group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java rename to group24/315863321/src/main/java/com/johnChnia/coding2017/basic/array/ArrayList.java index 1d48b259f8..02376c76cc 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/ArrayList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/array/ArrayList.java @@ -1,4 +1,6 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.array; + +import com.johnChnia.coding2017.basic.List; import java.util.Arrays; import java.util.Iterator; diff --git a/group24/315863321/src/main/java/com/johnChnia/coderising2017/array/ArrayUtil.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/array/ArrayUtil.java similarity index 98% rename from group24/315863321/src/main/java/com/johnChnia/coderising2017/array/ArrayUtil.java rename to group24/315863321/src/main/java/com/johnChnia/coding2017/basic/array/ArrayUtil.java index 53a0305753..25e18ad875 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coderising2017/array/ArrayUtil.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/array/ArrayUtil.java @@ -1,7 +1,6 @@ -package com.johnChnia.coderising2017.array; +package com.johnChnia.coding2017.basic.array; import com.johnChnia.coding2017.basic.queue.Queue; -import com.johnChnia.coding2017.basic.ArrayList; public class ArrayUtil { diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Josephus.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Josephus.java index 942b11cf68..6e06ee9d8f 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Josephus.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Josephus.java @@ -1,7 +1,7 @@ package com.johnChnia.coding2017.basic.queue; -import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.array.ArrayList; import com.johnChnia.coding2017.basic.List; /** diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Queue.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Queue.java index 4d82ad0c92..ab9381e4c8 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Queue.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/Queue.java @@ -1,6 +1,6 @@ package com.johnChnia.coding2017.basic.queue; -import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.array.ArrayList; import java.util.NoSuchElementException; @@ -54,9 +54,9 @@ public E remove() { * * @return the head of this queue, or {@code 0} if this queue is empty */ - public Object peek() { + public E peek() { if (arrayList.empty()) - return 0; + return null; return arrayList.get(0); } diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java index 1efa28721f..be6c04a036 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/InfixToPostfix.java @@ -1,7 +1,7 @@ package com.johnChnia.coding2017.basic.stack.expr; -import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.array.ArrayList; import com.johnChnia.coding2017.basic.List; import com.johnChnia.coding2017.basic.stack.Stack; diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java index e66e4ff8c0..5072f9c281 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/stack/expr/TokenParser.java @@ -1,7 +1,7 @@ package com.johnChnia.coding2017.basic.stack.expr; -import com.johnChnia.coding2017.basic.ArrayList; +import com.johnChnia.coding2017.basic.array.ArrayList; import com.johnChnia.coding2017.basic.List; public class TokenParser { diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/BinarySearchTree.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java similarity index 98% rename from group24/315863321/src/main/java/com/johnChnia/coding2017/basic/BinarySearchTree.java rename to group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java index a574b04794..a362c78734 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/BinarySearchTree.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java @@ -1,4 +1,4 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.tree; import com.johnChnia.coding2017.basic.queue.Queue; diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinaryTreeNode.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinaryTreeNode.java new file mode 100644 index 0000000000..f276c16631 --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinaryTreeNode.java @@ -0,0 +1,44 @@ +package com.johnChnia.coding2017.basic.tree; + +/** + * Created by john on 2017/5/18. + */ +public class BinaryTreeNode { + + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; + + public BinaryTreeNode(T data) { + this.data = data; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public BinaryTreeNode getLeft() { + return left; + } + + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + + public BinaryTreeNode getRight() { + return right; + } + + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o) { + return null; + } + +} diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinaryTreeUtil.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinaryTreeUtil.java new file mode 100644 index 0000000000..0a5ba11e2e --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinaryTreeUtil.java @@ -0,0 +1,145 @@ +package com.johnChnia.coding2017.basic.tree; + + +import com.johnChnia.coding2017.basic.stack.Stack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * Created by john on 2017/5/18. + * 前序遍历:. + * 中序遍历: . + * 后序遍历: . + */ +public class BinaryTreeUtil { + /** + * 用递归的方式实现对二叉树的前序遍历, 需要通过BinaryTreeUtilTest测试 + * + * @param root + * @return + */ + public static List preOrderVisit(BinaryTreeNode root) { + if (root == null) { + return null; + } + List result = new ArrayList<>(); + result.add(root.data); + List temp1 = preOrderVisit(root.left); + if (temp1 != null) { + result.addAll(temp1); + } + List temp2 = preOrderVisit(root.right); + if (temp2 != null) { + result.addAll(temp2); + } + return result; + } + + /** + * 用递归的方式实现对二叉树的中遍历 + * + * @param root + * @return + */ + public static List inOrderVisit(BinaryTreeNode root) { + if (root == null) { + return null; + } + List result = new ArrayList<>(); + List temp1 = inOrderVisit(root.left); + if (temp1 != null) { + result.addAll(temp1); + } + result.add(root.data); + List temp2 = inOrderVisit(root.right); + if (temp2 != null) { + result.addAll(temp2); + } + return result; + } + + /** + * 用递归的方式实现对二叉树的后遍历 + * + * @param root + * @return + */ + public static List postOrderVisit(BinaryTreeNode root) { + if (root == null) { + return null; + } + List result = new ArrayList<>(); + + List temp1 = postOrderVisit(root.left); + if (temp1 != null) { + result.addAll(temp1); + } + List temp2 = postOrderVisit(root.right); + if (temp2 != null) { + result.addAll(temp2); + } + result.add(root.data); + return result; + } + + /** + * 用非递归的方式实现对二叉树的前序遍历 + * + * @param root + * @return + */ + public static List preOrderWithoutRecursion(BinaryTreeNode root) { + if (Objects.isNull(root)) { + return null; + } + Stack> stack = new Stack<>(); + List result = new ArrayList<>(); + stack.push(root); + while (!stack.empty()) { + BinaryTreeNode top = stack.pop(); + if (Objects.nonNull(top.getRight())) { + stack.push(top.getRight()); + } + if (Objects.nonNull(top.getLeft())) { + stack.push(top.getLeft()); + } + result.add(top.data); + } + return result; + } + + /** + * 用非递归的方式实现对二叉树的中序遍历 + * 参考:http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion/ + * + * @param root + * @return + */ + public static List inOrderWithoutRecursion(BinaryTreeNode root) { + if (Objects.isNull(root)) { + return null; + } + Stack> stack = new Stack<>(); + List result = new ArrayList<>(); + BinaryTreeNode node = root; + while (Objects.nonNull(node)) { + stack.push(node); + node = node.getLeft(); + } + while (!stack.empty()) { + node = stack.pop(); + result.add(node.data); + if (Objects.nonNull(node.getRight())) { + node = node.right; + while (Objects.nonNull(node)) { + stack.push(node); + node = node.getLeft(); + } + } + } + return result; + } + +} \ No newline at end of file diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/FileList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/FileList.java new file mode 100644 index 0000000000..83d35549cc --- /dev/null +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/FileList.java @@ -0,0 +1,37 @@ +package com.johnChnia.coding2017.basic.tree; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Created by john on 2017/5/18. + */ +public class FileList { + public void list(File f) { + + } + + public static class TreeInfo implements Iterable { + public List files = new ArrayList<>(); + public List dirs = new ArrayList<>(); + + @Override + public Iterator iterator() { + return files.iterator(); + } + + public void addAll(TreeInfo other) { + files.addAll(other.files); + dirs.addAll(other.dirs); + } + + @Override + public String toString() { + return "dirs: " + dirs + + "\n\nfiles: " + files; + } + } + +} diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/array/ArrayListTest.java similarity index 94% rename from group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java rename to group24/315863321/src/test/java/com/johnChnia/coding2017/basic/array/ArrayListTest.java index 5109ea69ad..b2aeafdd44 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/ArrayListTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/array/ArrayListTest.java @@ -1,5 +1,6 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.array; +import com.johnChnia.coding2017.basic.array.ArrayList; import org.junit.Before; import org.junit.Test; diff --git a/group24/315863321/src/test/java/com/johnChnia/coderising2017/array/ArrayUtilTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/array/ArrayUtilTest.java similarity index 98% rename from group24/315863321/src/test/java/com/johnChnia/coderising2017/array/ArrayUtilTest.java rename to group24/315863321/src/test/java/com/johnChnia/coding2017/basic/array/ArrayUtilTest.java index 9b730c19e5..76bb8340e0 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coderising2017/array/ArrayUtilTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/array/ArrayUtilTest.java @@ -1,4 +1,4 @@ -package com.johnChnia.coderising2017.array; +package com.johnChnia.coding2017.basic.array; import org.junit.Before; import org.junit.Test; diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java similarity index 100% rename from group24/315863321/src/main/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java rename to group24/315863321/src/test/java/com/johnChnia/coding2017/basic/linklist/LRUPageFrameTest.java diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/LinkedListTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/linklist/LinkedListTest.java similarity index 99% rename from group24/315863321/src/test/java/com/johnChnia/coding2017/basic/LinkedListTest.java rename to group24/315863321/src/test/java/com/johnChnia/coding2017/basic/linklist/LinkedListTest.java index 941d524987..4f65a8fce7 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/LinkedListTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/linklist/LinkedListTest.java @@ -1,4 +1,4 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.linklist; import org.junit.Before; import org.junit.Test; diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java similarity index 100% rename from group24/315863321/src/main/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java rename to group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/JosephusTest.java diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/QueueTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/QueueTest.java similarity index 96% rename from group24/315863321/src/test/java/com/johnChnia/coding2017/basic/QueueTest.java rename to group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/QueueTest.java index 22f17c4327..9fdc7930d5 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/QueueTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/queue/QueueTest.java @@ -1,4 +1,4 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.queue; import com.johnChnia.coding2017.basic.queue.Queue; import org.junit.Before; diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/StackTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/StackTest.java similarity index 97% rename from group24/315863321/src/test/java/com/johnChnia/coding2017/basic/StackTest.java rename to group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/StackTest.java index c6f4ec1b2c..c55ee9944b 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/StackTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/stack/StackTest.java @@ -1,4 +1,4 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.stack; import com.johnChnia.coding2017.basic.stack.Stack; import org.junit.Before; diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/BinarySearchTreeTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java similarity index 88% rename from group24/315863321/src/test/java/com/johnChnia/coding2017/basic/BinarySearchTreeTest.java rename to group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java index d756c31198..968d386717 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/BinarySearchTreeTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java @@ -1,5 +1,6 @@ -package com.johnChnia.coding2017.basic; +package com.johnChnia.coding2017.basic.tree; +import com.johnChnia.coding2017.basic.tree.BinarySearchTree; import org.junit.Before; import org.junit.Test; diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinaryTreeUtilTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinaryTreeUtilTest.java new file mode 100644 index 0000000000..0d636a85a9 --- /dev/null +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinaryTreeUtilTest.java @@ -0,0 +1,79 @@ +package com.johnChnia.coding2017.basic.tree; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; + +/** + * Created by john on 2017/5/18. + */ +public class BinaryTreeUtilTest { + + BinaryTreeNode root = null; + + @Before + public void setUp() throws Exception { + root = new BinaryTreeNode(1); + root.setLeft(new BinaryTreeNode(2)); + root.setRight(new BinaryTreeNode(5)); + root.getLeft().setLeft(new BinaryTreeNode(3)); + root.getLeft().setRight(new BinaryTreeNode(4)); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testPreOrderVisit() { + + List result = BinaryTreeUtil.preOrderVisit(root); + Assert.assertEquals("[1, 2, 3, 4, 5]", result.toString()); + + + } + + @Test + public void testInOrderVisit() { + + + List result = BinaryTreeUtil.inOrderVisit(root); + Assert.assertEquals("[3, 2, 4, 1, 5]", result.toString()); + + } + + @Test + public void testPostOrderVisit() { + + + List result = BinaryTreeUtil.postOrderVisit(root); + Assert.assertEquals("[3, 4, 2, 5, 1]", result.toString()); + + } + + + @Test + public void testInOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.inOrderWithoutRecursion(root); + Assert.assertEquals("[3, 2, 6, 4, 7, 1, 5]", result.toString()); + + } + + @Test + public void testPreOrderVisitWithoutRecursion() { + BinaryTreeNode node = root.getLeft().getRight(); + node.setLeft(new BinaryTreeNode(6)); + node.setRight(new BinaryTreeNode(7)); + + List result = BinaryTreeUtil.preOrderWithoutRecursion(root); + Assert.assertEquals("[1, 2, 3, 4, 6, 7, 5]", result.toString()); + + } +} \ No newline at end of file diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/FileListTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/FileListTest.java new file mode 100644 index 0000000000..0319604afd --- /dev/null +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/FileListTest.java @@ -0,0 +1,14 @@ +package com.johnChnia.coding2017.basic.tree; + +import org.junit.Test; + +/** + * Created by john on 2017/5/20. + */ +public class FileListTest { + @Test + public void list() throws Exception { + + } + +} \ No newline at end of file From 825aa4a76abef199c4cf70df2d7c065deeaf9dc0 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Sat, 20 May 2017 14:48:43 +0800 Subject: [PATCH 536/552] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=AC=AC=E4=B9=9D?= =?UTF-8?q?=E5=91=A8=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding2017/basic/tree/FileList.java | 18 +++++++++++++++++- .../coding2017/basic/tree/FileListTest.java | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/FileList.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/FileList.java index 83d35549cc..470a80224a 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/FileList.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/FileList.java @@ -4,13 +4,29 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Objects; /** * Created by john on 2017/5/18. */ public class FileList { - public void list(File f) { + public TreeInfo list(File f) { + if (Objects.isNull(f)) { + return null; + } + TreeInfo treeInfo = new TreeInfo(); + if (f.isDirectory()) { + treeInfo.dirs.add(f); + for (File lf : + f.listFiles()) { + treeInfo.addAll(list(lf)); + } + } else { + if (!f.getName().matches(".*\\.DS_Store")) + treeInfo.files.add(f); + } + return treeInfo; } public static class TreeInfo implements Iterable { diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/FileListTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/FileListTest.java index 0319604afd..b47fe538d2 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/FileListTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/FileListTest.java @@ -1,13 +1,28 @@ package com.johnChnia.coding2017.basic.tree; +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import java.io.File; + /** * Created by john on 2017/5/20. */ public class FileListTest { + private FileList fileList; + private static final String PATH = "/Users/john/Desktop/zst"; + + @Before + public void setUp() throws Exception { + fileList = new FileList(); + } + @Test public void list() throws Exception { + FileList.TreeInfo treeInfo = fileList.list(new File(PATH)); + Assert.assertEquals(3, treeInfo.dirs.size()); + Assert.assertEquals(8, treeInfo.files.size()); } From 1cf36772250e5686a51a1cf49afb0af898deb87d Mon Sep 17 00:00:00 2001 From: onlyliuxin <14703250@qq.com> Date: Mon, 22 May 2017 09:31:06 +0800 Subject: [PATCH 537/552] =?UTF-8?q?JVM=E4=B8=BB=E9=A2=98=E7=AC=AC9?= =?UTF-8?q?=E6=AC=A1=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coding/basic/tree/BinarySearchTree.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java index 0c05564b15..f01cbe358b 100644 --- a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java @@ -1,5 +1,10 @@ package com.coding.basic.tree; +import java.util.ArrayList; +import java.util.List; + +import com.coding.basic.queue.Queue; + public class BinarySearchTree { BinaryTreeNode root; @@ -24,6 +29,20 @@ public int size() { public void remove(T e){ } + public List levelVisit(){ + + return null; + } + public boolean isValid(){ + return false; + } + public T getLowestCommonAncestor(T n1, T n2){ + return null; + + } + public List getNodesBetween(T n1, T n2){ + return null; + } } From 0b15833faf745c96ed1ffd05005590831f16352b Mon Sep 17 00:00:00 2001 From: macvis_qq75939388 Date: Mon, 22 May 2017 14:11:57 +0800 Subject: [PATCH 538/552] file stage --- .../src/test/java/gabageCollection/MemoryLeakSimulation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java b/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java index 483efec77d..4b1d1b9e13 100644 --- a/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java +++ b/group24/75939388/learning2017/src/test/java/gabageCollection/MemoryLeakSimulation.java @@ -17,6 +17,7 @@ public static void testOutOfMemory(){ } } + //死循环的递归会引起stackOverFlow public static void testStackOverFlowError(){ testStackOverFlowError(); } From 99f58cd0e8b4e9006689e5a8349f4cbef5eb82e9 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Mon, 22 May 2017 14:43:03 +0800 Subject: [PATCH 539/552] eleventh week homework --- .../11-EleventhWeek/BinarySearchTree.java | 29 ++++++++ .../11-EleventhWeek/BinarySearchTreeTest.java | 67 +++++++++++++++++++ .../11-EleventhWeek/BinaryTreeNode.java | 35 ++++++++++ 3 files changed, 131 insertions(+) create mode 100644 group24/Homework/11-EleventhWeek/BinarySearchTree.java create mode 100644 group24/Homework/11-EleventhWeek/BinarySearchTreeTest.java create mode 100644 group24/Homework/11-EleventhWeek/BinaryTreeNode.java diff --git a/group24/Homework/11-EleventhWeek/BinarySearchTree.java b/group24/Homework/11-EleventhWeek/BinarySearchTree.java new file mode 100644 index 0000000000..ab8abbfe9f --- /dev/null +++ b/group24/Homework/11-EleventhWeek/BinarySearchTree.java @@ -0,0 +1,29 @@ +package com.coding.basic.tree; + +public class BinarySearchTree { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode getRoot(){ + return root; + } + public T findMin(){ + return null; + } + public T findMax(){ + return null; + } + public int height() { + return -1; + } + public int size() { + return -1; + } + public void remove(T e){ + + } + +} + diff --git a/group24/Homework/11-EleventhWeek/BinarySearchTreeTest.java b/group24/Homework/11-EleventhWeek/BinarySearchTreeTest.java new file mode 100644 index 0000000000..8772089710 --- /dev/null +++ b/group24/Homework/11-EleventhWeek/BinarySearchTreeTest.java @@ -0,0 +1,67 @@ +package com.coding.basic.tree; + +import static org.junit.Assert.fail; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinarySearchTreeTest { + + BinarySearchTree tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + + } + + @Test + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); + } + + @Test + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } +} diff --git a/group24/Homework/11-EleventhWeek/BinaryTreeNode.java b/group24/Homework/11-EleventhWeek/BinaryTreeNode.java new file mode 100644 index 0000000000..c1421cd398 --- /dev/null +++ b/group24/Homework/11-EleventhWeek/BinaryTreeNode.java @@ -0,0 +1,35 @@ +package com.coding.basic.tree; + +public class BinaryTreeNode { + + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; + + public BinaryTreeNode(T data){ + this.data=data; + } + public T getData() { + return data; + } + public void setData(T data) { + this.data = data; + } + public BinaryTreeNode getLeft() { + return left; + } + public void setLeft(BinaryTreeNode left) { + this.left = left; + } + public BinaryTreeNode getRight() { + return right; + } + public void setRight(BinaryTreeNode right) { + this.right = right; + } + + public BinaryTreeNode insert(Object o){ + return null; + } + +} From 84a4b0e2a909d430263812701b082e7c98a282c2 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Mon, 22 May 2017 14:51:56 +0800 Subject: [PATCH 540/552] twelfth week homework --- .../12-TwelfthWeek/BinarySearchTree.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 group24/Homework/12-TwelfthWeek/BinarySearchTree.java diff --git a/group24/Homework/12-TwelfthWeek/BinarySearchTree.java b/group24/Homework/12-TwelfthWeek/BinarySearchTree.java new file mode 100644 index 0000000000..aea8affc09 --- /dev/null +++ b/group24/Homework/12-TwelfthWeek/BinarySearchTree.java @@ -0,0 +1,48 @@ +package com.coding.basic.tree; + +import java.util.ArrayList; +import java.util.List; + +import com.coding.basic.queue.Queue; + +public class BinarySearchTree { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode getRoot(){ + return root; + } + public T findMin(){ + return null; + } + public T findMax(){ + return null; + } + public int height() { + return -1; + } + public int size() { + return -1; + } + public void remove(T e){ + + } + public List levelVisit(){ + + return null; + } + public boolean isValid(){ + return false; + } + public T getLowestCommonAncestor(T n1, T n2){ + return null; + + } + public List getNodesBetween(T n1, T n2){ + return null; + } + +} + From 87b8ad69b6469747a06c83ea0d195f34206137f7 Mon Sep 17 00:00:00 2001 From: Patrick Date: Tue, 23 May 2017 00:16:56 +0800 Subject: [PATCH 541/552] =?UTF-8?q?tree=E7=BB=83=E4=B9=A0=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/tree/BinarySearchTree.java | 205 ++++++++++++++++++ .../basic/tree/BinarySearchTreeTest.java | 77 +++++++ .../coding2017/basic/tree/BinaryTreeNode.java | 6 +- 3 files changed, 285 insertions(+), 3 deletions(-) create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTree.java create mode 100644 group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTreeTest.java diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTree.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTree.java new file mode 100644 index 0000000000..175711100b --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTree.java @@ -0,0 +1,205 @@ +package com.github.ipk2015.coding2017.basic.tree; + +import java.util.ArrayList; +import java.util.List; + +public class BinarySearchTree { + + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root){ + this.root = root; + } + public BinaryTreeNode getRoot(){ + return root; + } + public T findMin(){ + T min = findMinInOneNode(root,root.getData()); + return min; + } + + private T findMinInOneNode(BinaryTreeNode node,T result){ + BinaryTreeNode rightNode = node.getRight(); + if(null != rightNode){ + T right = findMinInOneNode(rightNode,result); + result = compareMin(right,result); + } + + BinaryTreeNode leftNode = node.getLeft(); + if(null != leftNode){ + T left = findMinInOneNode(leftNode,result); + result = compareMin(left,result); + }else{ + result = compareMin(node.getData(),result); + } + return result; + } + private T compareMin(T data,T min){ + int compareTo = min.compareTo(data); + return compareTo > 0 ? data : min; + } + public T findMax(){ + T result = findMaxInOneNode(root,root.getData()); + return result; + } + private T findMaxInOneNode(BinaryTreeNode node,T result){ + BinaryTreeNode leftNode = node.getLeft(); + if(null != leftNode){ + T left = findMaxInOneNode(leftNode,result); + result = compareMax(left,result); + } + + BinaryTreeNode rightNode = node.getRight(); + if(null != rightNode){ + T right = findMaxInOneNode(rightNode,result); + result = compareMax(right,result); + }else{ + result = compareMax(node.getData(),result); + } + return result; + } + private T compareMax(T data,T min){ + int compareTo = min.compareTo(data); + return compareTo < 0 ? data : min; + } + + public int height() { + return findHeightInOneNode(root); + } + + private int findHeightInOneNode(BinaryTreeNode node){ + BinaryTreeNode left = node.getLeft(); + BinaryTreeNode right = node.getRight(); + if(null == left && null == right){ + return 1; + } + int leftHeight = 0; + if(null != left){ + leftHeight = findHeightInOneNode(left); + } + + int rightHeight = 0; + if(null != right){ + rightHeight = findHeightInOneNode(right); + } + + return leftHeight > rightHeight ? leftHeight+1: rightHeight+1; + } + + public int size() { + List list = BinaryTreeUtil.inOrderVisit(root); + return list.size(); + } + /* + * 首先我们找到待删除的节点Z,如果节点Z的两个孩子均为空,那么将其父节点中对应指向Z的指针置为空,然后删除节点Z。 + * 如果节点Z仅有一个孩子,那么将Z节点的父节点中指向Z的指针指向Z仅有的孩子,然后删除节点Z。 + * 如果节点Z有两个非空的子节点,那么找到节点Z的中序后继节点Y(即右子树的最左节点),将节点Y的Key值覆盖节点Z的Key值, + * 此时节点Y的两个孩子均为空或者只有一个右孩子,将节点Y的右指针里的值覆盖其父节点中指向Y的指针,然后删除节点Y。 + * 注意:不可按节点数据是按左小右大来查找,因为删除后会发生错乱。 + * */ + public void remove(T e){ + List> list; + boolean isRoot = e.compareTo(root.getData()) == 0; + if(isRoot){ + BinaryTreeNode virtualNode = new BinaryTreeNode(); + virtualNode.right = root; + list = new ArrayList>(); + list.add(virtualNode); + list.add(root); + }else{ + list = findOneNodeAndParentNode(e); + } + if(list.isEmpty()){ + return; + } + BinaryTreeNode parentNode = list.get(0); + BinaryTreeNode rmNode = list.get(1); + + boolean isLeft = null != parentNode.getLeft() && rmNode.getData().compareTo(parentNode.getLeft().getData()) == 0; + BinaryTreeNode leftNode = rmNode.getLeft(); + BinaryTreeNode rightNode = rmNode.getRight(); + if(null == leftNode && null == rightNode){ + if(isLeft){ + parentNode.left = null; + }else{ + parentNode.right = null; + } + }else if(null == leftNode && null != rightNode){ + if(isLeft){ + parentNode.left = rightNode; + }else{ + parentNode.right = rightNode; + } + rmNode.right = null; + }else if(null == rightNode && null != leftNode){ + if(isLeft){ + parentNode.left = leftNode; + }else{ + parentNode.right = leftNode; + } + rmNode.left = null; + }else if(null != rightNode && null != leftNode){ + BinaryTreeNode leftParentInOrder = rightNode; + BinaryTreeNode leftNodeInOrder = leftParentInOrder.getLeft(); + if(null == leftNodeInOrder){ + rmNode.data = rightNode.getData(); + rmNode.right = rightNode.getRight(); + rightNode.right = null; + }else{ + while(null != leftNodeInOrder.getLeft()){ + leftParentInOrder = leftNodeInOrder; + leftNodeInOrder = leftParentInOrder.getLeft(); + } + rmNode.data = leftNodeInOrder.getData(); + leftParentInOrder.left = leftNodeInOrder.right; + leftNodeInOrder.right = null; + } + } + if(isRoot){ + BinaryTreeNode virtualParent = list.get(0); + root = virtualParent.right; + virtualParent.right = null; + } + + } + + private List> findOneNodeAndParentNode(T e){ + List> list = new ArrayList>(); + + findNodeAParentByData(list,root,e); + + return list; + } + + private boolean findNodeAParentByData(List> list,BinaryTreeNode node,T e){ + BinaryTreeNode leftNode = node.getLeft(); + if(null !=leftNode){ + if(e.compareTo(leftNode.getData()) == 0){ + list.add(node); + list.add(leftNode); + return true; + }else{ + boolean isFind1 = findNodeAParentByData(list,leftNode,e); + if(isFind1){ + return true; + } + } + } + + BinaryTreeNode rightNode = node.getRight(); + if(null !=rightNode){ + if(e.compareTo(rightNode.getData()) == 0){ + list.add(node); + list.add(rightNode); + return true; + }else{ + boolean isFind2 = findNodeAParentByData(list,rightNode,e); + if(isFind2){ + return true; + } + } + } + return false; + } + +} + diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTreeTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTreeTest.java new file mode 100644 index 0000000000..42d3b6c721 --- /dev/null +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTreeTest.java @@ -0,0 +1,77 @@ +package com.github.ipk2015.coding2017.basic.tree; + + + +import static org.junit.Assert.fail; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinarySearchTreeTest { + + BinarySearchTree tree = null; + + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + + } + + @Test + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); + } + + @Test + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } + @Test + public void testRemoveRootNode() { + tree.remove(6); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(8, root.data.intValue()); + Assert.assertEquals(2, root.left.data.intValue()); + + } +} diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode.java index 7da18fa204..3ac7bcb965 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinaryTreeNode.java @@ -4,9 +4,9 @@ public class BinaryTreeNode { - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; public BinaryTreeNode(T data){ this.data=data; From 474b282f98ff0817997d863bae7fedcfb440a7ea Mon Sep 17 00:00:00 2001 From: sdnb Date: Tue, 23 May 2017 08:02:36 +0800 Subject: [PATCH 542/552] week11 finished --- .../com/coding/week11/BinarySearchTree.java | 78 +++++++++++++++++-- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java b/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java index 2a8bccee81..c49d57586a 100644 --- a/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java +++ b/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java @@ -14,20 +14,86 @@ public BinaryTreeNode getRoot() { return root; } public T findMin(){ - return null; + BinaryTreeNode min = findMin(root); + return min == null ? null : min.getData(); + } + + private BinaryTreeNode findMin(BinaryTreeNode node) { + if (node == null) { + return null; + } + BinaryTreeNode left = node.getLeft(); + if (left == null) { + return node; + } else { + return findMin(left); + } } public T findMax(){ - return null; + if (root == null) { + throw new RuntimeException("has no data"); + } + BinaryTreeNode t = root.getRight(); + T data = null; + while (t != null) { + data = t.getData(); + t = t.getRight(); + } + + return data; } public int height() { - return -1; + return height(root); } + + private int height(BinaryTreeNode temp) { + if (temp == null) { + return 0; + } + return 1 + Math.max(height(temp.getRight()), height(temp.getLeft())); + } + public int size() { - return -1; + return size(root); + } + + public int size(BinaryTreeNode node) { + if (node == null) { + return 0; + } + return 1 + size(node.getLeft()) + size(node.getRight()); } + + public void remove(T e){ - + remove(root, e); + } + + private BinaryTreeNode remove(BinaryTreeNode node, T e) { + if (node == null) { + return node; + } + int compareRes = node.getData().compareTo(e); + if (compareRes < 0) { + node.setRight(remove(node.getRight(), e)); + } else if (compareRes > 0) { + node.setLeft(remove(node.getLeft(), e)); + } else { + BinaryTreeNode left = node.getLeft(); + BinaryTreeNode right = node.getRight(); + if (left != null && right != null) { + T data = findMin(right).getData(); + node.setData(data); + node.setRight(remove(right, data)); + } else { + node = left != null ? left : right; + } + } + return node; + } + + public static void main(String[] args) { + System.out.println(Math.max(0,0)); } - } From a2dab54da48e2495fc2a306297683cd5b09ec2fe Mon Sep 17 00:00:00 2001 From: macvis Date: Tue, 23 May 2017 16:14:22 +0800 Subject: [PATCH 543/552] filestage --- .../binaryTree/BinarySearchTree.java | 30 +++++++++++++++++++ .../coding/basic/tree/BinarySearchTree.java | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java index acbb5c7083..df73f92bda 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java @@ -88,5 +88,35 @@ private void remove(BinaryTreeNode node, int value) { } } + /** + * 逐层遍历 + */ + public List levelVisit(){ + + return null; + } + + /** + * 判断一个二叉树是不是二叉查找树 + */ + public boolean isValid(){ + return false; + } + + /** + * 获取两个节点的最小公共祖先 + */ + public T getLowestCommonAncestor(T n1, T n2){ + return null; + + } + + /** + * 给定两个值, 获得处于这两个值中间的节点 + */ + public List getNodesBetween(T n1, T n2){ + return null; + } + } diff --git a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java index f01cbe358b..5bc7d11016 100644 --- a/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java +++ b/liuxin/data-structure/assignment/src/com/coding/basic/tree/BinarySearchTree.java @@ -29,7 +29,7 @@ public int size() { public void remove(T e){ } - public List levelVisit(){ + public List c(){ return null; } From 3383591b0c199923b09beb2b79d52b8dbe758b7a Mon Sep 17 00:00:00 2001 From: lzb Date: Tue, 23 May 2017 21:52:08 +0800 Subject: [PATCH 544/552] =?UTF-8?q?=E5=A2=9E=E5=8A=A0jvm=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/me/lzb/jvm/clz/ClassFile.java | 1 + .../me/lzb/jvm/engine/ExecutionResult.java | 1 + .../me/lzb/jvm/engine/ExecutorEngine.java | 10 ++ .../src/main/java/me/lzb/jvm/engine/Heap.java | 2 +- .../java/me/lzb/jvm/engine/JavaObject.java | 1 + .../java/me/lzb/jvm/engine/MethodArea.java | 24 +--- .../main/java/me/lzb/jvm/engine/MiniJVM.java | 3 +- .../java/me/lzb/jvm/engine/StackFrame.java | 24 ++-- .../me/lzb/jvm/loader/ClassFileParser.java | 111 ++++++++++++++++-- .../java/me/lzb/jvm/loader/CommandParser.java | 3 + 10 files changed, 141 insertions(+), 39 deletions(-) diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java index a1ec8604fb..3a7241eb56 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/clz/ClassFile.java @@ -135,6 +135,7 @@ public void addMethod(Method m) { this.methods.add(m); } + //函数的 方法名+参数类型+返回值,构成函数的唯一标识 public Method getMethod(String methodName, String paramAndReturnType) { for (Method m : methods) { int nameIndex = m.getNameIndex(); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java index 983c8006ff..42f06377c9 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutionResult.java @@ -4,6 +4,7 @@ import me.lzb.jvm.method.Method; /** + * 定义了返回结果,有时候执行结束了是返回,或者,执行下一个方法,等等 * @author LZB */ public class ExecutionResult { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java index 1ccd6b90b9..b8bf5be24c 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/ExecutorEngine.java @@ -12,24 +12,34 @@ */ public class ExecutorEngine { + //虚拟机栈,用一个stack表示 private Stack stack = new Stack<>(); public ExecutorEngine() { } + //开始执行的时候,传入main方法 public void execute(Method mainMethod) { + //执行一个函数,就要new一个函数栈帧 StackFrame stackFrame = StackFrame.create(mainMethod); + //把栈帧放入虚拟机栈 stack.push(stackFrame); + //当statck不为空时,开始循环执行 while (!stack.isEmpty()) { + //取出顶部栈帧 StackFrame frame = stack.peek(); + //执行栈帧 ExecutionResult result = frame.execute(); + //如果执行结果是,暂停当前栈帧,执行一个新的函数,就new一个新栈帧,(函数调用别的函数的情况) if (result.isPauseAndRunNewFrame()) { Method nextMethod = result.getNextMethod(); StackFrame nextFrame = StackFrame.create(nextMethod); + //设置调用他的函数栈帧 nextFrame.setCallerFrame(frame); + //设置传过去的参数,第一个参数都是this setupFunctionCallParams(frame, nextFrame); stack.push(nextFrame); } else { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java index b8cc8b7ffb..76031559af 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/Heap.java @@ -6,7 +6,7 @@ * @author LZB */ public class Heap { - + //堆,存放new出来的对象 private static Heap instance = new Heap(); private Heap() { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java index 61b2285953..51234026dd 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/JavaObject.java @@ -4,6 +4,7 @@ import java.util.Map; /** + * 自己定义一个Object代替java的Object * @author LZB */ public class JavaObject { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java index 562809de3c..9bac56f0b6 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MethodArea.java @@ -17,11 +17,13 @@ public class MethodArea { public static final MethodArea instance = new MethodArea(); /** - * 注意:我们做了极大的简化, ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型 + * 这里ClassLoader 只有一个, 实际JVM中的ClassLoader,是一个双亲委托的模型,类装载器有命名空间,和被装载的类是关联的 */ - private ClassFileLoader clzLoader = null; + /** + * 保存load过的class,key:me/lzb/jvm/HourlyEmployee, value:ClassFile对象 + */ Map map = new HashMap<>(); private MethodArea() { @@ -58,24 +60,6 @@ public ClassFile findClassFile(String className) { } - public Method getMethod(String className, String methodName, String paramAndReturnType) { - - ClassFile clz = this.findClassFile(className); - - Method m = clz.getMethod(methodName, paramAndReturnType); - - if (m == null) { - - throw new RuntimeException("method can't be found : \n" - + "class: " + className - + "method: " + methodName - + "paramAndReturnType: " + paramAndReturnType); - } - - return m; - } - - public Method getMethod(MethodRefInfo methodRef) { ClassFile clz = this.findClassFile(methodRef.getClassName()); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java index 2e76d70d66..6ee8f92d23 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/MiniJVM.java @@ -16,12 +16,13 @@ public void run(String[] classPaths, String className) throws IOException { loader.addClassPath(classPaths[i]); } + //方法区,存放class文件,常量池 MethodArea methodArea = MethodArea.getInstance(); methodArea.setClassFileLoader(loader); ExecutorEngine engine = new ExecutorEngine(); - + //获取构造函数名 className = className.replace(".", "/"); engine.execute(methodArea.getMainMethod(className)); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java index 8b266c5981..936341e209 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/engine/StackFrame.java @@ -17,6 +17,9 @@ public class StackFrame { private List localVariableTable = new ArrayList<>(); private Stack oprandStack = new Stack<>(); + /** + * 用来记录当前栈帧帧,已经执行到哪一步,以便恢复的时候,继续执行 + */ int index = 0; private Method m = null; @@ -65,8 +68,12 @@ public int getNextCommandIndex(int offset) { throw new RuntimeException("Can't find next command"); } + /** + * 执行栈帧 + * @return + */ public ExecutionResult execute() { - + //取出所有jvm指令 ByteCodeCommand[] commands = m.getCmds(); @@ -76,22 +83,23 @@ public ExecutionResult execute() { //缺省值是执行下一条命令 result.setNextAction(ExecutionResult.RUN_NEXT_CMD); - //输出执行的命令 + //在控制台打印,执行的命令,这里用了visitor设计模式 ExecutionVisitor format = ExecutionFormat.getInstance(); commands[index].printExecute(format); -// System.out.println(commands[index].toString()); - + //执行指令,这里是一个多态,具体执行的内容在各个指令的内部 commands[index].execute(this, result); - if (result.isRunNextCmd()) { + + if (result.isRunNextCmd()) { //当前指令结果是执行下一条指令,就++,继续循环 index++; - } else if (result.isExitCurrentFrame()) { + } else if (result.isExitCurrentFrame()) { //退出当前栈帧,就是return return result; - } else if (result.isPauseAndRunNewFrame()) { + } else if (result.isPauseAndRunNewFrame()) { //暂停当前栈帧的执行,创建新的栈帧 index++; return result; - } else if (result.isJump()) { + + } else if (result.isJump()) { //跳转,要注意偏移量 int offset = result.getNextCmdOffset(); this.index = getNextCommandIndex(offset); } else { diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java index a7396bb7d4..87add57f61 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/ClassFileParser.java @@ -31,24 +31,31 @@ public ClassFileParser(byte[] data) { public ClassFile parse() { ClassFile classFile = new ClassFile(); + //class文件的开头四个字节一定是“cafebabe”,叫做magic number parserMagicNumber(classFile); if (!StringUtils.equals(classFile.getMagicNumber(), ConstantInfo.MAGIC_NUMBER)) { throw new RuntimeException("It is not a java class file."); } - + //两个字节的小版本号,两个字节的主版本号 parserVersion(classFile); + //常量池,进去看 parserConstantPool(classFile); + //两个字节的类的访问权限 parserAccessFlag(classFile); + //本class和父类的常量池索引 parserClassIndex(classFile); + //接口部分没有实现 parserInterface(classFile); + //成员变量 parserField(classFile); + //函数 parserMethod(classFile); return classFile; @@ -82,16 +89,37 @@ private void parserVersion(ClassFile classFile) { } private void parserConstantPool(ClassFile classFile) { + //开头两个字节,常量池常量总个数,包括这两个字节(这两字节算一个常量) int count = nextBytesToInt(2); ConstantPool pool = new ConstantPool(); pool.addConstantInfo(new NullConstantInfo()); - for (int i = 1; i < count; i++) { + //i=1开始,遍历剩下的常量 + for (int i = 1; i < count; i++) { + //每次循环,第一个字节,根据jvm规范,确定常量类型, + //CONSTANT_Class 7 + //CONSTANT_Fieldref 9 + //CONSTANT_Methodref 10 + //CONSTANT_InterfaceMethodref 11 + //CONSTANT_String 8 + //CONSTANT_Integer 3 + //CONSTANT_Float 4 + //CONSTANT_Long 5 + //CONSTANT_Double 6 + //CONSTANT_NameAndType 12 + //CONSTANT_Utf8 1 + //CONSTANT_MethodHandle 15 + //CONSTANT_MethodType 16 + //CONSTANT_InvokeDynamic 18 int tag = nextBytesToInt(1); if (tag == ConstantInfo.Class_info) { + //CONSTANT_Class_info { + // u1 tag; //07 + // u2 name_index; //是一个UTF8类型的常量池的索引 + // } ClassInfo classInfo = new ClassInfo(pool); classInfo.setUtf8Index(nextBytesToInt(2)); @@ -100,6 +128,12 @@ private void parserConstantPool(ClassFile classFile) { } if (tag == ConstantInfo.Fieldref_info) { + + //CONSTANT_Fieldref_info { + // u1 tag; // 9 + // u2 class_index; //CONSTANT_Class类型的索引,表示这个成员变量是这个类,或者接口的 + // u2 name_and_type_index; //CONSTANT_NameAndType_info类型的索引,表示字段的名字和描述符 + // } FieldRefInfo fieldRefInfo = new FieldRefInfo(pool); fieldRefInfo.setClassInfoIndex(nextBytesToInt(2)); fieldRefInfo.setNameAndTypeIndex(nextBytesToInt(2)); @@ -109,6 +143,11 @@ private void parserConstantPool(ClassFile classFile) { } if (tag == ConstantInfo.Methodref_info) { + //CONSTANT_Methodref_info { + // u1 tag; //10 + // u2 class_index; //CONSTANT_Class类型的索引,表示这个成员变量是这个类的(不能是接口) + // u2 name_and_type_index; //CONSTANT_NameAndType_info类型的索引, 方法名&(参数)返回值 println&(Ljava/lang/String;I)V ,类型参数有;结尾L开头,基础数据类型没有;和L + // } MethodRefInfo methodRefInfo = new MethodRefInfo(pool); methodRefInfo.setClassInfoIndex(nextBytesToInt(2)); methodRefInfo.setNameAndTypeIndex(nextBytesToInt(2)); @@ -118,6 +157,12 @@ private void parserConstantPool(ClassFile classFile) { } if (tag == ConstantInfo.NameAndType_info) { + + //CONSTANT_NameAndType_info { + // u1 tag; //12 + // u2 name_index; //utf8类型索引,方法名或者字段名 + // u2 descriptor_index; //utf8类型索引,字段类型,或者方法的(参数)返回值 + // } NameAndTypeInfo nameAndTypeInfo = new NameAndTypeInfo(pool); nameAndTypeInfo.setIndex1(nextBytesToInt(2)); nameAndTypeInfo.setIndex2(nextBytesToInt(2)); @@ -127,6 +172,10 @@ private void parserConstantPool(ClassFile classFile) { } if (tag == ConstantInfo.String_info) { + //CONSTANT_String_info { + // u1 tag; //8 + // u2 string_index; //utf8类型常量池索引 + //} StringInfo stringInfo = new StringInfo(pool); stringInfo.setIndex(nextBytesToInt(2)); @@ -135,6 +184,11 @@ private void parserConstantPool(ClassFile classFile) { } if (tag == ConstantInfo.Utf8_info) { + //CONSTANT_Utf8_info { + // u1 tag; //1 + // u2 length; //bytes[]数组的长度 + // u1 bytes[length]; //字符串常量采用改进过的UTF-8编码表示 + // } UTF8Info utf8Info = new UTF8Info(pool); int len = nextBytesToInt(2); byte[] data = nextBytes(len); @@ -168,8 +222,9 @@ private void parserAccessFlag(ClassFile classFile) { private void parserClassIndex(ClassFile classFile) { ClassIndex clzIndex = new ClassIndex(); - + //本class 常量池class类型索引 int thisClassIndex = nextBytesToInt(2); + //父类 常量池class类型索引 int superClassIndex = nextBytesToInt(2); clzIndex.setThisClassIndex(thisClassIndex); clzIndex.setSuperClassIndex(superClassIndex); @@ -184,40 +239,57 @@ private void parserInterface(ClassFile classFile) { private void parserField(ClassFile classFile) { + //成员变量个数 int count = nextBytesToInt(2); for (int i = 1; i <= count; i++) { - + //访问权限 int accessFlags = nextBytesToInt(2); + //常量池UTF8类型索引,变量名 int nameIndex = nextBytesToInt(2); + //常量池utf8类型索引,变量类型 int descriptorIndex = nextBytesToInt(2); + //当前字段附加属性的个数 int attributesCount = nextBytesToInt(2); - Field f = new Field(accessFlags, nameIndex, descriptorIndex, classFile.getConstantPool()); + Field field = new Field(accessFlags, nameIndex, descriptorIndex, classFile.getConstantPool()); for (int j = 1; j <= attributesCount; j++) { + //属性类型,utf8类型的索引 int attrNameIndex = nextBytesToInt(2); + //获取类型值 String attrName = classFile.getConstantPool().getUTF8String(attrNameIndex); if (AttributeInfo.CONST_VALUE.equals(attrName)) { + //ConstantValue_attribute { + // u2 attribute_name_index; //就是if前面的两个字节,utf8类型索引,表面名字 + // u4 attribute_length; //ConstantValue的attribute_length固定值为2 + // u2 constantvalue_index; // 常量池索引,可以引用基础数据类型和String + // } int attrLen = nextBytesToInt(4); ConstantValue constValue = new ConstantValue(attrNameIndex, attrLen); constValue.setConstValueIndex(nextBytesToInt(2)); - f.setConstantValue(constValue); + field.setConstantValue(constValue); } else { throw new RuntimeException("the attribute " + attrName + " has not been implemented yet."); } } - classFile.addField(f); + classFile.addField(field); } } private void parserMethod(ClassFile classFile) { + //函数个数 int count = nextBytesToInt(2); + for (int i = 1; i <= count; i++) { + //函数访问权限 int accessFlags = nextBytesToInt(2); + //常量池utf8类型索引,函数名 int nameIndex = nextBytesToInt(2); + //常量池utf8类型索引,参数和返回值()V int descriptorIndex = nextBytesToInt(2); + //附加属性数量 int attributesCount = nextBytesToInt(2); @@ -226,11 +298,13 @@ private void parserMethod(ClassFile classFile) { for (int j = 1; j <= attributesCount; j++) { + //附加属性名索引,utf8类型常量池索引 int attributeNameIndex = nextBytesToInt(2); - + //获取属性名 String attributeName = classFile.getConstantPool().getUTF8String(attributeNameIndex); if (StringUtils.equalsIgnoreCase(attributeName, AttributeInfo.CODE)) { + //处理code类型附加属性 parserCodeAttr(attributeNameIndex, method, classFile); continue; } @@ -246,6 +320,25 @@ private void parserMethod(ClassFile classFile) { private void parserCodeAttr(int attributeNameIndex, Method method, ClassFile classFile) { + //Code_attribute { + // u2 attribute_name_index; + // u4 attribute_length; //项的值表示当前属性的长度,不包括开始的6个字节。 + // u2 max_stack; //栈的最大深度 + // u2 max_locals; //分配在当前方法引用的局部变量表中的局部变量个数,包括调用此方法时用于传递参数的局部变量。 + // u4 code_length; //code[]数组的字节数长度(真正要执行的指令都在这里面) + // u1 code[code_length]; //方法的指令集 + // u2 exception_table_length; { + // u2 start_pc; + // u2 end_pc; + // u2 handler_pc; + // u2 catch_type; + // } + // exception_table[exception_table_length]; + // u2 attributes_count; + // attribute_info attributes[attributes_count]; + // } + + // int attributeLength = nextBytesToInt(4); int maxStack = nextBytesToInt(2); int maxLocals = nextBytesToInt(2); @@ -253,7 +346,7 @@ private void parserCodeAttr(int attributeNameIndex, Method method, ClassFile cla String code = nextBytesToString(codeLength); - //处理cmd + //处理cmd,解析需要执行的各种指令 CommandParser commandParser = new CommandParser(code); CodeAttr codeAttr = new CodeAttr(attributeNameIndex, attributeLength, maxStack, maxLocals, codeLength, code, commandParser.parse(classFile)); diff --git a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java index 3e7976a484..e91d70bb06 100644 --- a/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java +++ b/group24/1148285693/learning2017/mini-jvm/src/main/java/me/lzb/jvm/loader/CommandParser.java @@ -59,6 +59,9 @@ public ByteCodeCommand[] parse(ClassFile clzFile) { List cmds = new ArrayList<>(); + //这里用到的指令分为3种,没有操作数的(2个字节),一个操作数(4个字节),两个操作数(6个字节) + + while (hasNext()) { String opCode = next2CharAsString(); From 4c3c34adf1ee528d9061797d2adb4ce751422038 Mon Sep 17 00:00:00 2001 From: DonaldY <448641125@qq.com> Date: Wed, 24 May 2017 09:33:05 +0800 Subject: [PATCH 545/552] twelfthweek homework finished --- .../donaldy/basic/tree/BinarySearchTree.java | 163 ++++++++++++++++++ .../basic/tree/BinarySearchTreeTest.java | 36 +++- .../donaldy/jvm/test/ClassFileloaderTest.java | 8 + .../src/com/donaldy/jvm/test/EmployeeV2.java | 54 ++++++ .../src/com/donaldy/jvm/test/Example.java | 16 ++ .../com/donaldy/jvm/test/HourlyEmployee.java | 25 +++ 6 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 group24/448641125/src/com/donaldy/jvm/test/EmployeeV2.java create mode 100644 group24/448641125/src/com/donaldy/jvm/test/Example.java create mode 100644 group24/448641125/src/com/donaldy/jvm/test/HourlyEmployee.java diff --git a/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTree.java b/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTree.java index 639db1c01d..aef794d276 100644 --- a/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTree.java +++ b/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTree.java @@ -1,5 +1,8 @@ package com.donaldy.basic.tree; +import com.donaldy.basic.queue.Queue; + +import java.util.ArrayList; import java.util.List; public class BinarySearchTree { @@ -80,6 +83,7 @@ public int size() { List list = BinaryTreeUtil.inOrderVisit(this.root); return list.size(); + } public void remove(T e){ @@ -134,5 +138,164 @@ private BinaryTreeNode findMinNode(BinaryTreeNode node) { return findMinNode(node.getLeft()); } + public List levelVisit(){ + + List list = new ArrayList(); + + Queue queue = new Queue(); + + queue.enQueue(this.root); + + while (!queue.isEmpty()) { + + BinaryTreeNode node = queue.deQueue(); + + list.add((T)node.getData()); + + if (node.getLeft() != null) { + queue.enQueue(node.getLeft()); + } + + if (node.getRight() != null) { + queue.enQueue(node.getRight()); + } + + } + + return list; + } + + /** + * 是否为二叉树 + * @return + */ + public boolean isValid(){ + + Queue queue = new Queue(); + + queue.enQueue(this.root); + + while (!queue.isEmpty()) { + + BinaryTreeNode node = queue.deQueue(); + + T t = (T)node.getData(); + + if (node.getLeft() != null) { + + if (t.compareTo(node.getLeft().getData()) <= 0) { + return false; + } + + queue.enQueue(node.getLeft()); + } + + if (node.getRight() != null) { + + if (t.compareTo(node.getRight().getData()) >= 0) { + return false; + } + + queue.enQueue(node.getRight()); + } + + } + + return true; + + } + + /** + * 获取两个节点的最小公共祖先 + * 同层算同一级别? + * @param n1 + * @param n2 + * @return + */ + public T getLowestCommonAncestor(T n1, T n2){ + + if (n1.compareTo(n2) > 0) { + T t = n1; + n1 = n2; + n2 = t; + } + + BinaryTreeNode ancestor = null; + + Queue queue = new Queue(); + + queue.enQueue(this.root); + + while (!queue.isEmpty()) { + + BinaryTreeNode node = queue.deQueue(); + + T t = (T)node.getData(); + + if (t.compareTo(n1) > 0 && t.compareTo(n2) < 0) { + ancestor = node; + } + + if (node.getLeft() != null) { + + queue.enQueue(node.getLeft()); + } + + if (node.getRight() != null) { + + queue.enQueue(node.getRight()); + } + + } + + + return (T)ancestor.getData(); + + } + + /** + * 给定两个值, 获得处于这两个值中间的节点 + * @param n1 + * @param n2 + * @return + */ + public List getNodesBetween(T n1, T n2) { + + if (n1.compareTo(n2) > 0) { + T t = n1; + n1 = n2; + n2 = t; + } + + List list = new ArrayList(); + + Queue queue = new Queue(); + + queue.enQueue(this.root); + + while (!queue.isEmpty()) { + + BinaryTreeNode node = queue.deQueue(); + + T t = (T)node.getData(); + + if (t.compareTo(n1) > 0 && t.compareTo(n2) < 0) { + list.add(t); + } + + if (node.getLeft() != null) { + queue.enQueue(node.getLeft()); + } + + if (node.getRight() != null) { + queue.enQueue(node.getRight()); + } + + } + + return list; + + } + } diff --git a/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTreeTest.java b/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTreeTest.java index fc8ff1092c..6163dc5ac3 100644 --- a/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTreeTest.java +++ b/group24/448641125/src/com/donaldy/basic/tree/BinarySearchTreeTest.java @@ -1,12 +1,12 @@ package com.donaldy.basic.tree; -import static org.junit.Assert.fail; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.List; public class BinarySearchTreeTest { @@ -57,6 +57,7 @@ public void testRemoveLeaf() { Assert.assertEquals(3, root.getLeft().getRight().getData().intValue()); } + @Test public void testRemoveMiddleNode() { tree.remove(2); @@ -64,4 +65,37 @@ public void testRemoveMiddleNode() { Assert.assertEquals(3, root.getLeft().getData().intValue()); Assert.assertEquals(4, root.getLeft().getRight().getData().intValue()); } + + @Test + public void testLevelVisit() { + String str = tree.levelVisit().toString(); + + Assert.assertEquals("[6, 2, 8, 1, 4, 3]", str); + + } + + @Test + public void testIsValid() { + + Assert.assertEquals(true, tree.isValid()); + + } + + @Test + public void testGetLowestCommonAncestor() { + + Assert.assertEquals(3, (int)tree.getLowestCommonAncestor(2, 8)); + + } + + @Test + public void testGetNodesBetween() { + String str = tree.getNodesBetween(1, 4).toString(); + Assert.assertEquals("[2, 3]", str); + + str = tree.getNodesBetween(0, 9).toString(); + Assert.assertEquals("[6, 2, 8, 1, 4, 3]", str); + + + } } diff --git a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java index 7c30dedb17..d47e2cc772 100644 --- a/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java +++ b/group24/448641125/src/com/donaldy/jvm/test/ClassFileloaderTest.java @@ -363,5 +363,13 @@ private void assertOpCodeEquals(String expected, ByteCodeCommand cmd){ Assert.assertEquals(expected, acctual); } + /** + * 最后一次作业 + */ + @Test + public void testEmployeeV2() { + + } + } diff --git a/group24/448641125/src/com/donaldy/jvm/test/EmployeeV2.java b/group24/448641125/src/com/donaldy/jvm/test/EmployeeV2.java new file mode 100644 index 0000000000..c5e0d89041 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/test/EmployeeV2.java @@ -0,0 +1,54 @@ +package com.donaldy.jvm.test; + +public class EmployeeV2 { + + public final static String TEAM_NAME = "Dev Team"; + private String name; + private int age; + public EmployeeV2(String name, int age) { + this.name = name; + this.age = age; + } + + public void sayHello() { + System.out.println("Hello , this is class Employee "); + System.out.println(TEAM_NAME); + System.out.println(this.name); + } + + public void setName(String name) { + this.name = name; + } + + public void setAge(int age) { + this.age = age; + } + + + + public void isYouth() { + if (age < 40) { + System.out.println("You're still young"); + } else { + System.out.println("You're old"); + } + } + + + + public void testAdd() { + int sum = 0; + for (int i = 1; i <= 100; i++) { + sum += i; + } + System.out.println(sum); + } + + + public static void main(String[] args) { + EmployeeV2 p = new EmployeeV2("Andy", 35); + p.sayHello(); + p.isYouth(); + p.testAdd(); + } +} \ No newline at end of file diff --git a/group24/448641125/src/com/donaldy/jvm/test/Example.java b/group24/448641125/src/com/donaldy/jvm/test/Example.java new file mode 100644 index 0000000000..c8b9c52bd4 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/test/Example.java @@ -0,0 +1,16 @@ +package com.donaldy.jvm.test; + +public class Example{ + public void disp(char c){ + System.out.println(c); + } + public void disp(int c){ + System.out.println(c ); + } + public static void main(String args[]){ + Example obj = new Example(); + obj.disp('a'); + obj.disp(5); + } +} + diff --git a/group24/448641125/src/com/donaldy/jvm/test/HourlyEmployee.java b/group24/448641125/src/com/donaldy/jvm/test/HourlyEmployee.java new file mode 100644 index 0000000000..4a5682e912 --- /dev/null +++ b/group24/448641125/src/com/donaldy/jvm/test/HourlyEmployee.java @@ -0,0 +1,25 @@ +package com.donaldy.jvm.test; + +public class HourlyEmployee extends EmployeeV2 { + + int hourlySalary; + + public HourlyEmployee(String name, + int age, int hourlySalary) { + super(name, age); + this.hourlySalary = hourlySalary; + } + + public void sayHello(){ + System.out.println("Hello , this is Hourly Employee"); + } + public static void main(String[] args){ + EmployeeV2 e = new HourlyEmployee("Lisa", 20, 40); + e.sayHello(); + } + + public int getHourlySalary(){ + return this.hourlySalary; + } + +} From 53ee7f9372fe87cadbab98a11ba187d2cb5ed050 Mon Sep 17 00:00:00 2001 From: macvis Date: Wed, 24 May 2017 17:47:48 +0800 Subject: [PATCH 546/552] fileStage --- .../binaryTree/BinarySearchTree.java | 74 ++++++++++++++++++- .../tree/BinarySearchTreeTest.java | 20 +++++ 2 files changed, 90 insertions(+), 4 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java index df73f92bda..92d2e1c993 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java @@ -1,6 +1,6 @@ package basic.dataStructure.binaryTree; -import java.util.List; +import java.util.*; public class BinarySearchTree { @@ -92,25 +92,91 @@ private void remove(BinaryTreeNode node, int value) { * 逐层遍历 */ public List levelVisit(){ + Queue buffer = new LinkedList(); + List result = new ArrayList(); - return null; + result = level(root, result, buffer); + + return result; + } + + private List level(BinaryTreeNode node, List result, Queue buffer){ + result.add(node.getData()); + if(node.getLeft() != null){ + buffer.offer(node.left); + } + + if(node.getRight() != null){ + buffer.offer(node.right); + } + + while(!buffer.isEmpty()){ + result = level(buffer.poll(), result, buffer); + } + + return result; } /** * 判断一个二叉树是不是二叉查找树 */ public boolean isValid(){ - return false; + if(root.left == null || root.right == null){ + return false; + } + + return root.left.getData().compareTo(root.getData()) == -1 && + root.right.getData().compareTo(root.getData()) == 1; } /** * 获取两个节点的最小公共祖先 */ public T getLowestCommonAncestor(T n1, T n2){ - return null; + if(!isValid()){ + throw new RuntimeException("this tree is not binary search tree"); + } + + return getLowestCommonAncestor(root, n1, n2).data; + } + + private BinaryTreeNode getLowestCommonAncestor(BinaryTreeNode node, T n1, T n2){ +// if(node == null || node.data.compareTo(n1) == 0 || node.data.compareTo(n2) == 0){ +// return node; +// } +// +// BinaryTreeNode left = getLowestCommonAncestor(node.left, n1, n2); +// BinaryTreeNode right = getLowestCommonAncestor(node.right, n1, n2); +// +// if (left != null && right != null) { +// return node; +// } +// if (left != null) { +// return left; +// } +// if (right != null) { +// return right; +// } +// return null; + if(node == null){ + return null; + } + int cmp1 = n1.compareTo(node.data); + int cmp2 = n2.compareTo(node.data); + + if(cmp1 > 0 && cmp2 > 0){ + return getLowestCommonAncestor(node.right, n1, n2); + } + + if(cmp1 < 0 && cmp2 < 0){ + return getLowestCommonAncestor(node.left, n1, n2); + } + + return node; } + /** * 给定两个值, 获得处于这两个值中间的节点 */ diff --git a/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java index 6dbef3a2bc..4eaa4351e0 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java @@ -7,6 +7,7 @@ import org.junit.Before; import org.junit.Test; +import java.util.List; public class BinarySearchTreeTest { @@ -52,6 +53,7 @@ public void testRemoveLeaf() { Assert.assertEquals(3, root.left.right.data.intValue()); } + @Test public void testRemoveMiddleNode() { tree.remove(2); @@ -59,4 +61,22 @@ public void testRemoveMiddleNode() { Assert.assertEquals(3, root.left.data.intValue()); Assert.assertEquals(4, root.left.right.data.intValue()); } + + @Test + public void testLevelVisit(){ + List list = tree.levelVisit(); + Assert.assertEquals("[6, 2, 8, 1, 4, 3]", list.toString()); + } + + @Test + public void testGetLowestCommonAncestor(){ + int num = tree.getLowestCommonAncestor(3, 8); + Assert.assertEquals(6, num); + } + + @Test + public void testGetNodesBetween(){ + List list = tree.getNodesBetween(1, 8); + Assert.assertEquals("[2, 6]", list); + } } From fca8481cc9f38e5d0f1b431ff740e2ad8b5a8e17 Mon Sep 17 00:00:00 2001 From: macvis Date: Thu, 25 May 2017 15:31:05 +0800 Subject: [PATCH 547/552] =?UTF-8?q?=E7=AC=AC=E5=8D=81=E4=BA=8C=E5=91=A8?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../binaryTree/BinarySearchTree.java | 17 ++++++++++++++++- .../tree/BinarySearchTreeTest.java | 11 +++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java index 92d2e1c993..cf0286e788 100644 --- a/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java +++ b/group24/75939388/learning2017/src/main/java/basic/dataStructure/binaryTree/BinarySearchTree.java @@ -181,8 +181,23 @@ private BinaryTreeNode getLowestCommonAncestor(BinaryTreeNode node, T n1, * 给定两个值, 获得处于这两个值中间的节点 */ public List getNodesBetween(T n1, T n2){ - return null; + if(!isValid()) throw new RuntimeException("this is not binary search tree"); + List list = new ArrayList(); + getNodesBetween(root, n1, n2, list); + return list; } + private void getNodesBetween(BinaryTreeNode node, T n1, T n2, List list){ + int cmp1 = n1.compareTo(node.data); + int cmp2 = n2.compareTo(node.data); + + if(cmp1 == -1 && node.left != null){ + if(cmp2 != 0) list.add(node.data); + getNodesBetween(node.left, n1, n2, list); + }else if(cmp2 == 1 && node.right != null){ + if(cmp1 != 0) list.add(node.data); + getNodesBetween(node.right, n1, n2, list); + } + } } diff --git a/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java index 4eaa4351e0..5825a9fc95 100644 --- a/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java +++ b/group24/75939388/learning2017/src/test/java/data_structure/tree/BinarySearchTreeTest.java @@ -76,7 +76,14 @@ public void testGetLowestCommonAncestor(){ @Test public void testGetNodesBetween(){ - List list = tree.getNodesBetween(1, 8); - Assert.assertEquals("[2, 6]", list); + { + List list = tree.getNodesBetween(3, 8); + Assert.assertEquals("[6, 2, 4]", list.toString()); + } + { + List list = tree.getNodesBetween(3, 6); + Assert.assertEquals("[2, 4]", list.toString()); + } + } } From f1e9d6ea697b8796e37e537c4ade9d64bdd6e3ae Mon Sep 17 00:00:00 2001 From: Patrick Date: Fri, 26 May 2017 23:28:30 +0800 Subject: [PATCH 548/552] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=A0=91=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/linkedlist/LinkedList.java | 2 +- .../basic/tree/BinarySearchTree.java | 136 +++++++++++++++++- .../basic/tree/BinarySearchTreeTest.java | 35 +++++ 3 files changed, 171 insertions(+), 2 deletions(-) diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/linkedlist/LinkedList.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/linkedlist/LinkedList.java index 9bd545ef4f..a62faa3898 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/linkedlist/LinkedList.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/linkedlist/LinkedList.java @@ -117,7 +117,7 @@ public Object removeFirst(){ } Node node=head; head=node.next; - return node; + return node.data; } public Object removeLast(){ if(null==head){ diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTree.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTree.java index 175711100b..6126080259 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTree.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTree.java @@ -1,8 +1,12 @@ -package com.github.ipk2015.coding2017.basic.tree; + package com.github.ipk2015.coding2017.basic.tree; import java.util.ArrayList; import java.util.List; +import com.github.ipk2015.coding2017.basic.queue.Queue; + + + public class BinarySearchTree { BinaryTreeNode root; @@ -201,5 +205,135 @@ private boolean findNodeAParentByData(List> list,BinaryTreeNod return false; } + public List levelVisit(){ + List list = new ArrayList(); + if(null == root){ + return list; + } + Queue queue = new Queue(); + queue.enQueue(root); + + while(!queue.isEmpty()){ + BinaryTreeNode node = (BinaryTreeNode)queue.deQueue(); + list.add(node.getData()); + BinaryTreeNode left = node.getLeft(); + if(null != left){ + queue.enQueue(left); + } + + BinaryTreeNode right = node.getRight(); + if(null != right){ + queue.enQueue(right); + } + } + return list; + } + /* + * 每一个节点的值都大于左节点的所有值,小于右节点的所有值 + * */ + public boolean isValid(){ + return isNodeValid(root); + } + private boolean isNodeValid(BinaryTreeNode node){ + if(null == node){ + return true; + } + BinaryTreeNode left = node.getLeft(); + if(null != left){ + boolean isLeftNodeValid = isNodeValid(left); + if(!isLeftNodeValid){ + return false; + } + if(node.getData().compareTo(findMaxInOneNode(left,left.getData())) <= 0){ + return false; + } + } + BinaryTreeNode right = node.getRight(); + if(null != right){ + boolean isRightNodeValid = isNodeValid(right); + if(!isRightNodeValid){ + return false; + } + if(node.getData().compareTo(findMaxInOneNode(right,right.getData())) >= 0){ + return false; + } + } + return true; + } + + public T getLowestCommonAncestor(T n1, T n2){ + if(null == root){ + return null; + } + List> list1 = getNodeAllAncestor(n1); + List> list2 = getNodeAllAncestor(n2); + int size1 = list1.size(); + int size2 = list2.size(); + int minSize = size1 < size2? size1 :size2; + T result = null; + for(int i = 0;i < minSize; i++){ + T data1 = list1.get(size1-1-i).getData(); + if(data1.compareTo(list2.get(size2-1-i).getData()) != 0){ + break; + } + result = data1; + } + return result; + } + private List> getNodeAllAncestor(T data){ + List> list = new ArrayList(); + isAncestor(list,root,data); + return list; + } + private boolean isAncestor(List> list,BinaryTreeNode node,T data){ + if(null == node){ + return false; + } + if(data.compareTo(node.getData()) == 0){ + list.add(node); + return true; + } + BinaryTreeNode left = node.getLeft(); + if(null != left){ + boolean isLeftAncetor = isAncestor(list,left,data); + if(isLeftAncetor){ + list.add(node); + return true; + } + } + BinaryTreeNode right = node.getRight(); + if(null != right){ + boolean isRightAncetor = isAncestor(list,right,data); + if(isRightAncetor){ + list.add(node); + return true; + } + } + return false; + } + + public List getNodesBetween(T n1, T n2){ + List list = new ArrayList(); + getNodesBetween(root,list,n1,n2); + return list; + } + private void getNodesBetween(BinaryTreeNode node,List list,T n1,T n2){ + if(null == node){ + return; + } + T data = node.getData(); + if(data.compareTo(n2) >= 0){ + getNodesBetween(node.getLeft(),list,n1,n2); + return; + } + if(data.compareTo(n1) <= 0){ + getNodesBetween(node.getRight(),list,n1,n2); + return; + } + list.add(data); + getNodesBetween(node.getLeft(),list,n1,n2); + getNodesBetween(node.getRight(),list,n1,n2); + } + } diff --git a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTreeTest.java b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTreeTest.java index 42d3b6c721..44c49f824d 100644 --- a/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTreeTest.java +++ b/group24/121111914/src/com/github/ipk2015/coding2017/basic/tree/BinarySearchTreeTest.java @@ -4,6 +4,8 @@ import static org.junit.Assert.fail; +import java.util.List; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -74,4 +76,37 @@ public void testRemoveRootNode() { Assert.assertEquals(2, root.left.data.intValue()); } + + @Test + public void testLevelVisit() { + List list = tree.levelVisit(); + System.out.println(list.toString()); + Assert.assertEquals("[6, 2, 8, 1, 4, 3]", list.toString()); + } + + @Test + public void testIsValid() { + Assert.assertEquals(true, tree.isValid()); + BinarySearchTree tree2; + BinaryTreeNode root2 = new BinaryTreeNode(6); + root2.left = new BinaryTreeNode(2); + root2.right = new BinaryTreeNode(8); + root2.left.left = new BinaryTreeNode(1); + root2.left.right = new BinaryTreeNode(7); + root2.left.right.left = new BinaryTreeNode(3); + tree2 = new BinarySearchTree(root2); + Assert.assertEquals(false, tree2.isValid()); + } + @Test + public void testGetLowestCommonAncestor() { + Assert.assertEquals(2, tree.getLowestCommonAncestor(1, 3).intValue()); + Assert.assertEquals(6, tree.getLowestCommonAncestor(3, 8).intValue()); + } + @Test + public void testGetNodesBetween() { + List list = tree.getNodesBetween(0, 9); + Assert.assertEquals("[6, 2, 1, 4, 3, 8]", list.toString()); + list = tree.getNodesBetween(1, 7); + Assert.assertEquals("[6, 2, 4, 3]", list.toString()); + } } From 74d69b53bcc9fd13a222efdd3691a4fda8bd9b90 Mon Sep 17 00:00:00 2001 From: sdnb Date: Sun, 28 May 2017 20:23:48 +0800 Subject: [PATCH 549/552] week11 finished --- .../com/coding/week10/BinaryTreeNode.java | 9 ++ .../com/coding/week11/BinarySearchTree.java | 145 ++++++++++++++++++ .../coding/week11/BinarySearchTreeTest.java | 51 ++++++ 3 files changed, 205 insertions(+) diff --git a/group24/494800949/src/main/java/com/coding/week10/BinaryTreeNode.java b/group24/494800949/src/main/java/com/coding/week10/BinaryTreeNode.java index c7fdd2b665..39fcd355d7 100644 --- a/group24/494800949/src/main/java/com/coding/week10/BinaryTreeNode.java +++ b/group24/494800949/src/main/java/com/coding/week10/BinaryTreeNode.java @@ -49,6 +49,15 @@ public BinaryTreeNode insert(Object o){ return newNode; } + @Override + public String toString() { + return "{" + + "data:" + data + + ", left:" + left + + ", right:" + right + + '}'; + } + public static void main(String[] args) { BinaryTreeNode b = new BinaryTreeNode<>(2); b.insert(3).insert(5).insert(1); diff --git a/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java b/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java index c49d57586a..45558ff69f 100644 --- a/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java +++ b/group24/494800949/src/main/java/com/coding/week11/BinarySearchTree.java @@ -1,11 +1,19 @@ package com.coding.week11; +import com.coding.weak1.Queue; import com.coding.week10.BinaryTreeNode; +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + public class BinarySearchTree> { BinaryTreeNode root; + public BinarySearchTree() { + } + public BinarySearchTree(BinaryTreeNode root) { this.root = root; } @@ -92,6 +100,143 @@ private BinaryTreeNode remove(BinaryTreeNode node, T e) { return node; } + //按层次遍历: levelVisit + @SuppressWarnings("unchecked") + public List levelVisit(){ + List list = new ArrayList<>(); + if (root == null) { + return list; + } + Queue q = new Queue(); + q.enQueue(root); + while (!q.isEmpty()) { + BinaryTreeNode n = (BinaryTreeNode)q.deQueue(); + list.add(n.getData()); + if (n.getLeft() != null) { + q.enQueue(n.getLeft()); + } + if (n.getRight() != null) { + q.enQueue(n.getRight()); + } + } + return list; + } + + public static > List levelVisit(BinaryTreeNode root) { + List result = new ArrayList<>(); + BinaryTreeNode left = root.getLeft(); + BinaryTreeNode right = root.getRight(); + + if (right != null) { + List rightList = levelVisit(right); + result.addAll(rightList); + } + if (left != null) { + List leftList = levelVisit(left); + result.addAll(leftList); + } + result.add(root.getData()); + return result; + } + + //判断一个二叉树是不是二叉查找树 + public boolean isValid(){ + + return isValid(root); + } + + private boolean isValid(BinaryTreeNode node) { + boolean valid = true; + if (node != null) { + T d = node.getData(); + + BinaryTreeNode l = node.getLeft(); + BinaryTreeNode r = node.getRight(); + if (l != null) { + if (d.compareTo(l.getData()) < 0) { + return false; + } + } + if (r != null) { + if (d.compareTo(r.getData()) >= 0) { + return false; + } + } + valid = isValid(l) && isValid(r); + } + return valid; + } + + + //获取两个节点的最小公共祖先 + public T getLowestCommonAncestor(T n1, T n2){ + return betweenNode(n1, n2, root).getData(); + } + + private BinaryTreeNode betweenNode(T n1, T n2, BinaryTreeNode node) { + if (node == null) { + return null; + } else { + T max = n1.compareTo(n2) >= 0 ? n1 : n2; + T min = max.compareTo(n1) == 0 ? n2 : n1; + if (max.compareTo(node.getData()) < 0) { + node = betweenNode(n1, n2, node.getLeft()); + } else if (min.compareTo(node.getData()) > 0) { + node = betweenNode(n1, n2, node.getRight()); + } + return node; + } + + } + + + + public void insert(List l) { + for (T data : l) { + if (data == null) { + continue; + } + if (root == null) { + root = new BinaryTreeNode<>(data); + } else { + root.insert(data); + } + } + } + + //给定两个值, 获得处于这两个值中间的节点 + public List getNodesBetween(T n1, T n2){ + List result = new ArrayList(); + Stack> stack = new Stack<>(); + stack.push(root); + while (!stack.isEmpty()){ + BinaryTreeNode node = stack.pop(); + if (isBetween(n1, n2, node.getData())) { + result.add(node.getData()); + } + if (node.getRight() != null) { + stack.push(node.getRight()); + } + if (node.getLeft() != null) { + stack.push(node.getLeft()); + } + + } + + return result; + } + + private boolean isBetween(T n1, T n2, T data) { + T max = n1.compareTo(n2) >= 0 ? n1 : n2; + T min = max.compareTo(n1) == 0 ? n2 : n1; + if (max.compareTo(data) < 0 || min.compareTo(data) > 0) { + return false; + } else { + return true; + } + } + + public static void main(String[] args) { System.out.println(Math.max(0,0)); } diff --git a/group24/494800949/src/test/java/com/coding/week11/BinarySearchTreeTest.java b/group24/494800949/src/test/java/com/coding/week11/BinarySearchTreeTest.java index 433d3dba55..1ae98c349b 100644 --- a/group24/494800949/src/test/java/com/coding/week11/BinarySearchTreeTest.java +++ b/group24/494800949/src/test/java/com/coding/week11/BinarySearchTreeTest.java @@ -1,11 +1,14 @@ package com.coding.week11; import com.coding.week10.BinaryTreeNode; +import com.coding.week10.BinaryTreeUtil; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import java.util.Arrays; +import java.util.List; public class BinarySearchTreeTest { @@ -63,4 +66,52 @@ public void testRemoveMiddleNode() { Assert.assertEquals(3, root.getLeft().getData().intValue()); Assert.assertEquals(4, root.getLeft().getRight().getData().intValue()); } + + @Test + public void testLevelVisit() { + List li = tree.levelVisit(); + Assert.assertEquals("[6, 2, 8, 1, 4, 3]", li.toString()); + } + + @Test + public void testIsValid() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.setLeft(new BinaryTreeNode(3)); + root.setRight( new BinaryTreeNode(8)); + root.getLeft().setLeft(new BinaryTreeNode(1)); + root.getLeft().setRight(new BinaryTreeNode(4)); + root.getLeft().getRight().setLeft(new BinaryTreeNode(3)); + BinarySearchTree t = new BinarySearchTree(root); + boolean valid = t.isValid(); + Assert.assertTrue(valid); + } + + @Test + public void testInsert() { + BinarySearchTree tree1 = new BinarySearchTree<>(); + tree1.insert(Arrays.asList(6, 8, 8, 1, 4, 9, 2)); + List t = BinaryTreeUtil.inOrderVisit(tree1.root); + Assert.assertEquals("[1, 2, 4, 6, 8, 8, 9]", t.toString()); + } + + @Test + public void getLowestCommonAncestor() { + + Assert.assertTrue(tree.getLowestCommonAncestor(1,5)==2); + Assert.assertTrue(tree.getLowestCommonAncestor(1,9)==6); + Assert.assertTrue(tree.getLowestCommonAncestor(4,5)==4); + Assert.assertTrue(tree.getLowestCommonAncestor(4,9)==6); + } + + + @Test + public void getNodesBetween(){ + List ret = tree.getNodesBetween(3, 10); + Assert.assertTrue(ret.contains(4)); + Assert.assertTrue(ret.contains(6)); + Assert.assertTrue(ret.contains(8)); + Assert.assertTrue(ret.contains(3)); + } + + } From 292d8f1b7bbf8d369aec0d892b64cf3e39911108 Mon Sep 17 00:00:00 2001 From: lzbferrari Date: Sun, 28 May 2017 20:38:00 +0800 Subject: [PATCH 550/552] =?UTF-8?q?12=E5=91=A8=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/lzb/basic/tree/BinarySearchTree.java | 147 +++++++++++++++++- .../me/lzb/basic/tree/BinaryTreeNode.java | 16 +- .../lzb/basic/tree/BinarySearchTreeTest.java | 33 ++++ 3 files changed, 186 insertions(+), 10 deletions(-) diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java index 88922462a7..300d302d56 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinarySearchTree.java @@ -1,5 +1,10 @@ package me.lzb.basic.tree; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + /** * @author LZB */ @@ -180,30 +185,156 @@ private BinaryTreeNode getFatherNode(BinaryTreeNode node, T t) { if (node.getRight() != null && node.getRight().getData().equals(t)) { return node; } - if (t.compareTo(node.getData()) > 0) { + if (node.isSmallerThanParam(t)) { return getFatherNode(node.getRight(), t); } else { return getFatherNode(node.getLeft(), t); } } - private BinaryTreeNode getNode(BinaryTreeNode node, T t) { + + /** + * 按层次遍历: levelVisit + * + * @return + */ + public List levelVisit() { + List result = new ArrayList<>(); + levelVisit(result, root); + return result; + } + + + private void levelVisit(List list, BinaryTreeNode node) { if (node == null) { - return node; + return; + } + //先放入根节点 + Queue> queue = new LinkedList<>(); + queue.add(node); + while (!queue.isEmpty()) { + //上一层的节点个数 + int l = queue.size(); + //循环取出上一层这些节点 + for (int i = 0; i < l; i++) { + BinaryTreeNode temp = queue.poll(); + list.add(temp.getData()); + //把下一层的节点放入队列 + if (temp.getLeft() != null) { + queue.add(temp.getLeft()); + } + if (temp.getRight() != null) { + queue.add(temp.getRight()); + } + } } + } - if (node.getData().equals(t)) { - return node; + /** + * 判断一个二叉树是不是二叉查找树 + * + * @return + */ + public boolean isValid() { + return isValid(true, root); + } + + private boolean isValid(boolean b, BinaryTreeNode node) { + if (!b || node == null) { + return b; + } + + if (node.getLeft() == null && node.getRight() == null) { + return b; + } + + if (node.getLeft() != null) { + if (node.isSmallerThanParam(node.getLeft())) { + b = false; + } } - if (t.compareTo(node.getData()) > 0) { - return getNode(node.getRight(), t); + if (node.getRight() != null) { + if (node.isBiggerThanParam(node.getRight())) { + b = false; + } + } + + boolean bl = isValid(b, node.getLeft()); + boolean br = isValid(b, node.getRight()); + + return bl && br; + } + + + /** + * 获取两个节点的最小公共祖先 + * + * @param n1 + * @param n2 + * @return + */ + public T getLowestCommonAncestor(T n1, T n2) { + return getLowestCommonAncestor(root, n1, n2); + } + + + private T getLowestCommonAncestor(BinaryTreeNode node, T n1, T n2) { + if (node == null) { + return null; + } + + //找到一个位于两者之间的节点,就是公共祖先。 + if ((node.isSmallerThanParam(n1) && node.isBiggerThanParam(n2)) || (node.isSmallerThanParam(n2) && node.isBiggerThanParam(n1))) { + return node.getData(); + } + + //当前节点比n1和n2都小,最小公共祖先在右子树。 + if (node.isSmallerThanParam(n1) && node.isSmallerThanParam(n2)) { + return getLowestCommonAncestor(node.getRight(), n1, n2); + } + + //当前节点比n1和n2都大,最小公共祖先在左子树。 + if (node.isBiggerThanParam(n1) && node.isBiggerThanParam(n2)) { + return getLowestCommonAncestor(node.getLeft(), n1, n2); + } + return null; + } + + + /** + * 给定两个值, 获得处于这两个值中间的节点 + * + * @param n1 + * @param n2 + * @return + */ + public List getNodesBetween(T n1, T n2) { + List result = new ArrayList<>(); + T s, b; + if (n1.compareTo(n2) < 0) { + s = n1; + b = n2; } else { - return getNode(node.getLeft(), t); + s = n2; + b = n1; } + getNodesBetween(result, root, s, b); + return result; } + private void getNodesBetween(List list, BinaryTreeNode node, T small, T bigger) { + if (node == null) { + return; + } + if (node.isBiggerThanParam(small) && node.isSmallerThanParam(bigger)) { + list.add(node.getData()); + } + + getNodesBetween(list, node.getLeft(), small, bigger); + getNodesBetween(list, node.getRight(), small, bigger); + } } diff --git a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java index add0443e9a..597e5a554e 100644 --- a/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java +++ b/group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/tree/BinaryTreeNode.java @@ -45,7 +45,7 @@ public void setRight(BinaryTreeNode right) { */ public void insert(T d) { BinaryTreeNode b = new BinaryTreeNode(d); - if (isSmaller(d)) { + if (isBiggerThanParam(d)) { //比父节点小,左边 if (this.left == null) { this.left = b; @@ -70,10 +70,22 @@ public void insert(T d) { * @param d data * @return true false */ - private boolean isSmaller(T d) { + public boolean isBiggerThanParam(T d) { return this.data.compareTo(d) > 0; } + public boolean isBiggerThanParam(BinaryTreeNode node) { + return isBiggerThanParam(node.getData()); + } + + public boolean isSmallerThanParam(T d) { + return this.data.compareTo(d) < 0; + } + + public boolean isSmallerThanParam(BinaryTreeNode node) { + return isSmallerThanParam(node.getData()); + } + @Override public String toString() { // return getLeft() != null ? getLeft().getData().toString() : "" + ":" + getData().toString() + ":" + getRight() != null ? getRight().getData().toString() : ""; diff --git a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java index 0744eecd67..ef33320d00 100644 --- a/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java +++ b/group24/1148285693/learning2017/learning-basic/src/test/java/me/lzb/basic/tree/BinarySearchTreeTest.java @@ -63,4 +63,37 @@ public void testRemoveMiddleNode() { Assert.assertEquals(3, root.getLeft().getData().intValue()); Assert.assertEquals(4, root.getLeft().getRight().getData().intValue()); } + + @Test + public void testLevelVisit() { + Assert.assertEquals("[6, 2, 8, 1, 4, 3]", tree.levelVisit().toString()); + } + + @Test + public void testIsValid() { + Assert.assertTrue(tree.isValid()); + tree.getRoot().getRight().setData(5); + Assert.assertFalse(tree.isValid()); + tree.getRoot().getRight().setData(8); + tree.getRoot().getLeft().getLeft().setData(5); + Assert.assertFalse(tree.isValid()); + } + + @Test + public void testGetLowestCommonAncestor() { + Assert.assertEquals(2l, tree.getLowestCommonAncestor(1, 4).longValue()); + Assert.assertEquals(6l, tree.getLowestCommonAncestor(1, 8).longValue()); + } + + + @Test + public void testGetNodesBetween() { + Assert.assertEquals("[6, 2, 4, 3]", tree.getNodesBetween(1, 8).toString()); + + Assert.assertEquals("[6]", tree.getNodesBetween(7, 4).toString()); + + Assert.assertEquals("[6, 2, 1, 4, 3, 8]", tree.getNodesBetween(20, 0).toString()); + } + + } From 40a7e2f5eee694b2e1665cb91271c4be8a9d9169 Mon Sep 17 00:00:00 2001 From: liangduoduo666666 <798277403@qq.com> Date: Mon, 29 May 2017 20:21:20 +0800 Subject: [PATCH 551/552] =?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=A4=E6=AC=A1?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/basic/tree/BinarySearchTree.java | 359 ++++++++++++++++++ .../src/basic/tree/BinarySearchTreeTest.java | 113 ++++++ .../src/basic/tree/BinaryTreeNode.java | 6 +- .../src/memory_exception/OomHeap.java | 25 ++ .../src/memory_exception/OomPermGen.java | 46 +++ .../memory_exception/StackOverflowError.java | 15 + .../798277403/src/memory_exception/Test.java | 13 + .../org.eclipse.core.resources.prefs | 2 - 8 files changed, 574 insertions(+), 5 deletions(-) create mode 100644 group24/798277403/src/basic/tree/BinarySearchTree.java create mode 100644 group24/798277403/src/basic/tree/BinarySearchTreeTest.java create mode 100644 group24/798277403/src/memory_exception/OomHeap.java create mode 100644 group24/798277403/src/memory_exception/OomPermGen.java create mode 100644 group24/798277403/src/memory_exception/StackOverflowError.java create mode 100644 group24/798277403/src/memory_exception/Test.java delete mode 100644 liuxin/.settings/org.eclipse.core.resources.prefs diff --git a/group24/798277403/src/basic/tree/BinarySearchTree.java b/group24/798277403/src/basic/tree/BinarySearchTree.java new file mode 100644 index 0000000000..0dff39c51f --- /dev/null +++ b/group24/798277403/src/basic/tree/BinarySearchTree.java @@ -0,0 +1,359 @@ +package basic.tree; + + +import basic.queue.Queue; + +import java.util.ArrayList; +import java.util.List; + +/** + * 二叉查找树,左子树小于右子树 + */ +public class BinarySearchTree { + + BinaryTreeNode root; + + public BinarySearchTree(BinaryTreeNode root) { + this.root = root; + } + + + public BinaryTreeNode getRoot() { + return root; + } + + public T findMin() { + BinaryTreeNode head = root; + T min = null; + while (head != null) { + min = (T) head.getData(); + head = head.left; + } + return min; + } + + public T findMax() { + BinaryTreeNode head = root; + T max = null; + while (head != null) { + max = (T) head.getData(); + head = head.right; + } + return max; + } + + public int height() { + return getHeight(root); + } + + private int getHeight(BinaryTreeNode node) { + if (node == null) { + return 0; + } + int leftH = getHeight(node.left); + int rightH = getHeight(node.right); + return leftH > rightH ? leftH + 1 : rightH + 1; + } + + public int size() { + BinaryTreeNode temp = root; + int size = 0; + return BinaryTreeUtil.inOrderVisit(root).size(); + } + + /** + * 删除中间的结点,树要做调整 + * + * @param e 要删除的结点值 + */ + public void remove(T e) { + BinaryTreeNode node = root; + BinaryTreeNode father = null; + //找到要删除的结点 + while (node != null) { + if (node.getData().equals(e)) { + break; + } + if (node.getData().compareTo(e) > 0) { + father = node; + node = node.getLeft(); + } else { + father = node; + node = node.getRight(); + } + } + + //删除的结点是root结点 + if (father == null) { + //TODO + } + + //待删除结点为叶子结点 + if (node.getLeft() == null && node.getRight() == null) { + if (father.left == node) { + father.left = null; + } else { + father.right = null; + } + } + + //待删除结点左结点为null,右结点不为null + if (node.getLeft() == null && node.getRight() != null) { + BinaryTreeNode right = node.getRight(); + if (father.left == node) { + father.left = right; + } else { + father.right = right; + } + } + + + //待删除结点右结点为null,左结点不为null + if (node.getLeft() != null && node.getRight() == null) { + BinaryTreeNode left = node.getLeft(); + if (father.left == node) { + father.left = left; + } else { + father.right = left; + } + } + + //待删除结点左右结点都不为null + if (node.getLeft() != null && node.getRight() != null) { + //从右子树中选择最小的一个结点替换当前结点 + BinaryTreeNode min = node.getRight(); + BinaryTreeNode temp = node.getRight(); + BinaryTreeNode minFather = node.getRight(); + while (temp.left != null) { + min = temp.getLeft(); + temp = temp.left; + if (temp.left != null) { + minFather = temp; + } + } + minFather.left = null; + min.left = node.getLeft(); + min.right = node.getRight(); + if (father.left == node) { + father.left = min; + } else { + father.right = min; + } + } + + } + + + public void remove1(T e) { + removeNode(e, this.root); + } + + private BinaryTreeNode removeNode(T e, BinaryTreeNode node) { + if (this.root == null) { + throw new NullPointerException(); + } + + //找子树 + if (e.compareTo(node.getData()) < 0) { + node.setLeft(removeNode(e, node.getLeft())); + } else if (e.compareTo(node.getData()) > 0) { + node.setRight(removeNode(e, node.getRight())); + } else { + //删除 + if (node.getLeft() != null && node.getRight() != null) { + BinaryTreeNode n = findMinNode(node.getRight()); + node.setData(n.getData()); + node.setRight(removeNode((T) node.getData(), node.getRight())); + } else { + BinaryTreeNode n = node; + if (node.getLeft() == null) { + node = node.getRight(); + } else if (node.getRight() == null) { + node = node.getLeft(); + } + } + } + return node; + + } + + private BinaryTreeNode findMinNode(BinaryTreeNode node) { + + if (node == null) { + return null; + } + + if (node.getLeft() == null) { + return node; + } + + return findMinNode(node.getLeft()); + } + + /** + * 按层遍历 + * @return + */ + public List levelVisit() { + + List list = new ArrayList(); + + Queue queue = new Queue(); + + queue.enQueue(this.root); + + while (!queue.isEmpty()) { + + BinaryTreeNode node = queue.deQueue(); + + list.add((T) node.getData()); + + if (node.getLeft() != null) { + queue.enQueue(node.getLeft()); + } + + if (node.getRight() != null) { + queue.enQueue(node.getRight()); + } + + } + + return list; + } + + /** + * 是否为二叉树 + * + * @return + */ + public boolean isValid() { + + Queue queue = new Queue(); + + queue.enQueue(this.root); + + while (!queue.isEmpty()) { + + BinaryTreeNode node = queue.deQueue(); + + T t = (T) node.getData(); + + if (node.getLeft() != null) { + + if (t.compareTo(node.getLeft().getData()) <= 0) { + return false; + } + + queue.enQueue(node.getLeft()); + } + + if (node.getRight() != null) { + + if (t.compareTo(node.getRight().getData()) >= 0) { + return false; + } + + queue.enQueue(node.getRight()); + } + + } + + return true; + + } + + /** + * 获取两个节点的最小公共祖先 + * 同层算同一级别? + * + * @param n1 + * @param n2 + * @return + */ + public T getLowestCommonAncestor(T n1, T n2) { + + if (n1.compareTo(n2) > 0) { + T t = n1; + n1 = n2; + n2 = t; + } + + BinaryTreeNode ancestor = null; + + Queue queue = new Queue(); + + queue.enQueue(this.root); + + while (!queue.isEmpty()) { + + BinaryTreeNode node = queue.deQueue(); + + T t = (T) node.getData(); + + if (t.compareTo(n1) > 0 && t.compareTo(n2) < 0) { + ancestor = node; + } + + if (node.getLeft() != null) { + + queue.enQueue(node.getLeft()); + } + + if (node.getRight() != null) { + + queue.enQueue(node.getRight()); + } + + } + + + return (T) ancestor.getData(); + + } + + /** + * 给定两个值, 获得处于这两个值中间的节点 + * + * @param n1 + * @param n2 + * @return + */ + public List getNodesBetween(T n1, T n2) { + + if (n1.compareTo(n2) > 0) { + T t = n1; + n1 = n2; + n2 = t; + } + + List list = new ArrayList(); + + Queue queue = new Queue(); + + queue.enQueue(this.root); + + while (!queue.isEmpty()) { + + BinaryTreeNode node = queue.deQueue(); + + T t = (T) node.getData(); + + if (t.compareTo(n1) > 0 && t.compareTo(n2) < 0) { + list.add(t); + } + + if (node.getLeft() != null) { + queue.enQueue(node.getLeft()); + } + + if (node.getRight() != null) { + queue.enQueue(node.getRight()); + } + + } + + return list; + + } +} + diff --git a/group24/798277403/src/basic/tree/BinarySearchTreeTest.java b/group24/798277403/src/basic/tree/BinarySearchTreeTest.java new file mode 100644 index 0000000000..6c4071fc7e --- /dev/null +++ b/group24/798277403/src/basic/tree/BinarySearchTreeTest.java @@ -0,0 +1,113 @@ +package basic.tree; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + + +public class BinarySearchTreeTest { + + BinarySearchTree tree = null; + + /** 6 + * 2 8 + * 1 4 + * 3 + * @throws Exception + */ + @Before + public void setUp() throws Exception { + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + + } + + @Test + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); + } + + @Test + public void testRemoveLeaf() { + tree.remove1(4); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); + + } + @Test + public void testRemoveMiddleNode() { + tree.remove1(2); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } + + @Test + public void testRemove() { + tree.remove1(6); + BinaryTreeNode root= tree.getRoot(); + Assert.assertEquals(2, root.left.data.intValue()); + Assert.assertEquals(8, root.data.intValue()); + //Assert.assertEquals(null, root.left); + } + + @Test + public void testLevelVisit() { + String str = tree.levelVisit().toString(); + + Assert.assertEquals("[6, 2, 8, 1, 4, 3]", str); + + } + + @Test + public void testIsValid() { + + Assert.assertEquals(true, tree.isValid()); + + } + + @Test + public void testGetLowestCommonAncestor() { + + Assert.assertEquals(3, (int)tree.getLowestCommonAncestor(2, 8)); + + } + + @Test + public void testGetNodesBetween() { + String str = tree.getNodesBetween(1, 4).toString(); + Assert.assertEquals("[2, 3]", str); + + str = tree.getNodesBetween(0, 9).toString(); + Assert.assertEquals("[6, 2, 8, 1, 4, 3]", str); + + + } +} diff --git a/group24/798277403/src/basic/tree/BinaryTreeNode.java b/group24/798277403/src/basic/tree/BinaryTreeNode.java index af3f3c817f..f7a8e2db95 100644 --- a/group24/798277403/src/basic/tree/BinaryTreeNode.java +++ b/group24/798277403/src/basic/tree/BinaryTreeNode.java @@ -2,9 +2,9 @@ public class BinaryTreeNode { - private T data; - private BinaryTreeNode left; - private BinaryTreeNode right; + public T data; + public BinaryTreeNode left; + public BinaryTreeNode right; public BinaryTreeNode(T data){ this.data=data; diff --git a/group24/798277403/src/memory_exception/OomHeap.java b/group24/798277403/src/memory_exception/OomHeap.java new file mode 100644 index 0000000000..835348786e --- /dev/null +++ b/group24/798277403/src/memory_exception/OomHeap.java @@ -0,0 +1,25 @@ +package memory_exception; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by zhouliang on 2017-05-27. + */ +public class OomHeap { + public static void main(String[] args) { + List list = new ArrayList(); + int i = 0; + boolean flag = true; + while (flag){ + try { + i++; + list.add(new byte[1024 * 1024]);//每次增加一个1M大小的数组对象 + }catch (Throwable e){ + e.printStackTrace(); + flag = false; + System.out.println("count="+i);//记录运行的次数 + } + } + } +} diff --git a/group24/798277403/src/memory_exception/OomPermGen.java b/group24/798277403/src/memory_exception/OomPermGen.java new file mode 100644 index 0000000000..cfbc82c480 --- /dev/null +++ b/group24/798277403/src/memory_exception/OomPermGen.java @@ -0,0 +1,46 @@ +package memory_exception; + + +import java.io.File; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.List; + +/** + * JDK1.6才能模拟出这个异常 + * Created by zhouliang on 2017-05-27. + */ +public class OomPermGen { +/* public static void main(String[] args) { + // 使用List保持着常量池引用,避免Full GC 回收常量池行为 + List list = new ArrayList(); + //10MB的PermSize在int范围内足够产生OOM了 + int i = 0; + while (true) { + //调用intern方法,将字符串全部放在常量池中 + list.add(String.valueOf(i++).intern()); + } + }*/ + static String path3 = "C:\\Users\\zhouliang\\Desktop\\mycoding\\coding2017\\group24\\798277403\\out\\production\\zhouliang"; + static String path2 = "C:\\Users\\zhouliang\\Desktop\\mycoding\\"; + + public static void main(String[] args) { + URL url = null; + List classLoaderList = new ArrayList(); + int count = 0; + try { + url = new File(path2).toURI().toURL(); + System.out.println(url); + URL[] urls = {url}; + while (true){ + ClassLoader loader = new URLClassLoader(urls); + classLoaderList.add(loader); + loader.loadClass("EmployeeV1"); + System.out.println(++count); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/group24/798277403/src/memory_exception/StackOverflowError.java b/group24/798277403/src/memory_exception/StackOverflowError.java new file mode 100644 index 0000000000..03bf52d925 --- /dev/null +++ b/group24/798277403/src/memory_exception/StackOverflowError.java @@ -0,0 +1,15 @@ +package memory_exception; + +/** + * Created by zhouliang on 2017-05-27. + */ +public class StackOverflowError { + public static int count = 0; + public static void StackOverflowErrorTest(){ + System.out.println(++count); + StackOverflowErrorTest(); + } + public static void main(String[] args) { + StackOverflowErrorTest(); + } +} diff --git a/group24/798277403/src/memory_exception/Test.java b/group24/798277403/src/memory_exception/Test.java new file mode 100644 index 0000000000..189ce3ac7d --- /dev/null +++ b/group24/798277403/src/memory_exception/Test.java @@ -0,0 +1,13 @@ +package memory_exception; + +/** + * Created by zhouliang on 2017-05-27. + */ +public class Test { + public static final String CODE = "Code"; //Java代码编译成的字节码指令 + public static final String CONST_VALUE = "ConstantValue"; //final关键字定义的常量值 + public static final String EXCEPTIONS = "Exceptions"; //方法抛出的异常 + public static final String LINE_NUM_TABLE = "LineNumberTable"; //Java源码的行号和字节码指令的对应关系 + public static final String LOCAL_VAR_TABLE = "LocalVariableTable"; //方法的局部变量描述 + public static final String STACK_MAP_TABLE = "StackMapTable"; //给类型检查验证器使用 +} diff --git a/liuxin/.settings/org.eclipse.core.resources.prefs b/liuxin/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203..0000000000 --- a/liuxin/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 From 5c9effa510d2aa7e1ba8bf6bdd21e81c4235cc87 Mon Sep 17 00:00:00 2001 From: johnChnia Date: Wed, 31 May 2017 22:14:11 +0800 Subject: [PATCH 552/552] =?UTF-8?q?jvm=E7=AC=AC=E5=85=AB=E5=91=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=93=E6=9E=84=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/tree/BinarySearchTree.java | 199 ++++++++++-------- .../basic/tree/BinarySearchTreeTest.java | 64 ++++-- 2 files changed, 160 insertions(+), 103 deletions(-) diff --git a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java index a362c78734..aaf8ea4dca 100644 --- a/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java +++ b/group24/315863321/src/main/java/com/johnChnia/coding2017/basic/tree/BinarySearchTree.java @@ -1,126 +1,155 @@ package com.johnChnia.coding2017.basic.tree; -import com.johnChnia.coding2017.basic.queue.Queue; +import java.util.List; +import java.util.Objects; + +import static org.apache.commons.lang3.ObjectUtils.compare; +import static org.apache.commons.lang3.ObjectUtils.max; /** - * Created by john on 2017/3/13. + * Created by john on 2017/5/27. + *

    + * 二叉树:每个节点最多只有两个分支--https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91 + * 二叉搜索树:https://zh.wikipedia.org/wiki/%E4%BA%8C%E5%85%83%E6%90%9C%E5%B0%8B%E6%A8%B9 */ -public class BinarySearchTree { - - - /** - * The root node of tree. - */ - public BstNode root; +public class BinarySearchTree { - private Queue q = new Queue(); + BinaryTreeNode root; + public BinarySearchTree(BinaryTreeNode root) { + this.root = root; + } - private static class BstNode { - private int data; - private BstNode left; - private BstNode right; + public BinaryTreeNode getRoot() { + return root; + } - @Override - public String toString() { - return String.valueOf(data); + public T findMin() { + if (Objects.nonNull(root)) { + BinaryTreeNode node = root; + while (Objects.nonNull(node.getLeft())) { + node = node.getLeft(); + } + return node.getData(); } + return null; } - /** - * create an BinarySearchTree. - * - * @param root root node of tree - * @param data stored element - * @return binarySearchTree - */ - public BstNode insert(BstNode root, int data) { - if (root == null) { - root = getNewBstNode(data); - if (this.root == null) { - this.root = root; + public T findMax() { + if (Objects.nonNull(root)) { + BinaryTreeNode node = root; + while (Objects.nonNull(node.getRight())) { + node = node.getRight(); } - return root; - } - if (data <= root.data) { - root.left = insert(root.left, data); - } else { - root.right = insert(root.right, data); + return node.getData(); } - return root; + return null; } - private BstNode getNewBstNode(int data) { - BstNode node = new BstNode(); - node.data = data; - node.left = null; - node.right = null; - return node; + + public int height() { + if (Objects.nonNull(root)) { + return height(root); + } + return -1; } /** - * Returns the minimum value in the tree. + * Height of a node: Number of edges in longest path from the node to a leaf node + * Height of tree: Height of root + * Height of tree with 1 node: 0 + * Depth of a node: Number of edges in path from root to that node + * 树的高度:max(leftTree,rightTree)+ 1 * - * @param root root node of the tree。 - * @return the minimum value in the tree - * @throws IllegalArgumentException if root is null. + * @return 树的高度。 */ - public int findMin(BstNode root) { - int min; - if (root == null) { - throw new IllegalArgumentException("tree is empty"); - } else if (root.left == null) { - min = root.data; - } else { - min = findMin(root.left); + private int height(BinaryTreeNode root) { + if (Objects.isNull(root)) { + return 0; + } + int lheight = height(root.getLeft()); + int rheight = height(root.getRight()); + + return max(lheight, rheight) + 1; + } + + public int size() { + if (Objects.nonNull(root)) { + return size(root); } - return min; + return -1; } /** - * Returns the maximum value in the tree. + * 参考:http://www.geeksforgeeks.org/write-a-c-program-to-calculate-size-of-a-tree/ + * Size of a tree is the number of elements present in the tree. + * Size of a tree = Size of left subtree + 1 + Size of right subtree. * - * @param root root node of the tree。 - * @return the maximum value in the tree - * @throws IllegalArgumentException if root is null. + * @return 树的节点个数。 */ - public int findMax(BstNode root) { - int max; - if (root == null) { - throw new IllegalArgumentException("tree is empty"); - } else if (root.right == null) { - max = root.data; - } else { - max = findMax(root.right); + private int size(BinaryTreeNode root) { + if (Objects.isNull(root)) { + return 0; } - return max; + + return 1 + size(root.getLeft()) + size(root.getRight()); } + public void remove(T e) { + if (Objects.nonNull(e)) { + remove(root, e); + } + } + /** - * Traverse each node from left to right. + * http://www.geeksforgeeks.org/binary-search-tree-set-2-delete/ * - * @param root root node of the tree + * @param root 根节点 + * @param e 删除节点 */ - public void LevelOrder(BstNode root) { - if (root == null) { - return; - } - q.add(root); - while (!q.empty()) { - BstNode current = (BstNode) q.peek(); - if (current.left != null) { - q.add(current.left); - } - if (current.right != null) { - q.add(current.right); + private BinaryTreeNode remove(BinaryTreeNode root, T e) { + int flag = compare(e, root.data); + if (flag > 0) { + root.right = remove(root.getRight(), e); + } else if (flag < 0) { + root.left = remove(root.getLeft(), e); + } else { + // 叶子节点 + if (Objects.isNull(root.getLeft()) && Objects.isNull(root.getRight())) { + return null; + } else if (Objects.isNull(root.getLeft())) { // 只有一个子节点 + return root.getRight(); + } else if (Objects.isNull(root.getRight())) { + return root.getLeft(); } - q.remove(); + //两个子节点 + BinarySearchTree temp = new BinarySearchTree<>(root.getRight()); + T data = temp.findMin(); + remove(root, data); + root.data = data; } + return root; } - public BstNode getRoot() { - return root; + public List levelVisit() { + + return null; + } + + public boolean isValid() { + return false; + } + + public T getLowestCommonAncestor(T n1, T n2) { + return null; + + } + + public List getNodesBetween(T n1, T n2) { + return null; } } + + diff --git a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java index 968d386717..1383a1e5c9 100644 --- a/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java +++ b/group24/315863321/src/test/java/com/johnChnia/coding2017/basic/tree/BinarySearchTreeTest.java @@ -1,38 +1,66 @@ package com.johnChnia.coding2017.basic.tree; -import com.johnChnia.coding2017.basic.tree.BinarySearchTree; +import org.junit.After; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.junit.MatcherAssert.assertThat; - /** - * Created by john on 2017/3/14. + * Created by john on 2017/5/27. */ public class BinarySearchTreeTest { - - private BinarySearchTree bst; + BinarySearchTree tree = null; @Before public void setUp() throws Exception { - bst = new BinarySearchTree(); - bst.insert(bst.getRoot(), 10); - bst.insert(bst.getRoot(), 20); - bst.insert(bst.getRoot(), 9); - bst.insert(bst.getRoot(), 11); - bst.insert(bst.getRoot(), 12); + BinaryTreeNode root = new BinaryTreeNode(6); + root.left = new BinaryTreeNode(2); + root.right = new BinaryTreeNode(8); + root.left.left = new BinaryTreeNode(1); + root.left.right = new BinaryTreeNode(4); + root.left.right.left = new BinaryTreeNode(3); + tree = new BinarySearchTree(root); + } + + @After + public void tearDown() throws Exception { + tree = null; + } + + @Test + public void testFindMin() { + Assert.assertEquals(1, tree.findMin().intValue()); + } @Test - public void testFindMin() throws Exception { - assertThat(bst.findMin(bst.getRoot()), equalTo(9)); + public void testFindMax() { + Assert.assertEquals(8, tree.findMax().intValue()); + } + + @Test + public void testHeight() { + Assert.assertEquals(4, tree.height()); + } + @Test + public void testSize() { + Assert.assertEquals(6, tree.size()); } @Test - public void testFindMax() throws Exception { - assertThat(bst.findMax(bst.getRoot()), equalTo(20)); + public void testRemoveLeaf() { + tree.remove(4); + BinaryTreeNode root = tree.getRoot(); + Assert.assertEquals(3, root.left.right.data.intValue()); + } -} \ No newline at end of file + @Test + public void testRemoveMiddleNode() { + tree.remove(2); + BinaryTreeNode root = tree.getRoot(); + Assert.assertEquals(3, root.left.data.intValue()); + Assert.assertEquals(4, root.left.right.data.intValue()); + } +}